@lpdjs/firestore-repo-service 2.6.16 → 2.6.18
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/history/index.cjs +1 -1
- package/dist/history/index.cjs.map +1 -1
- package/dist/history/index.js +1 -1
- package/dist/history/index.js.map +1 -1
- package/dist/index.cjs +76 -76
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +76 -76
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +2737 -0
- package/dist/llms.txt +120 -0
- package/dist/servers/admin/index.cjs +4 -4
- package/dist/servers/admin/index.cjs.map +1 -1
- package/dist/servers/admin/index.js +4 -4
- package/dist/servers/admin/index.js.map +1 -1
- package/dist/servers/hono/cli.cjs +171 -49
- package/dist/servers/hono/cli.cjs.map +1 -1
- package/dist/servers/hono/cli.js +171 -49
- package/dist/servers/hono/cli.js.map +1 -1
- package/dist/servers/hono/index.cjs +6 -6
- package/dist/servers/hono/index.cjs.map +1 -1
- package/dist/servers/hono/index.d.cts +17 -2
- package/dist/servers/hono/index.d.ts +17 -2
- package/dist/servers/hono/index.js +6 -6
- package/dist/servers/hono/index.js.map +1 -1
- package/dist/servers/index.cjs +85 -85
- package/dist/servers/index.cjs.map +1 -1
- package/dist/servers/index.js +85 -85
- package/dist/servers/index.js.map +1 -1
- package/dist/sync/index.cjs +46 -46
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.js +46 -46
- package/dist/sync/index.js.map +1 -1
- package/package.json +4 -3
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 $r=Object.defineProperty;var nt=(e,t)=>()=>(e&&(t=e(e=0)),t);var Er=(e,t)=>{for(var n in t)$r(e,n,{get:t[n],enumerable:true});};function U(e){let t=e,n=t._zod?.def?.type;if(n)return oo[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function G(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function On(e){let t=e,n=t._zod?.def?.in;if(n)return n;if(t._def?.schema)return t._def.schema}function $n(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function En(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function re(e){let t=e;return t.shape&&typeof t.shape=="object"?t.shape:t._zod?.def?.shape&&typeof t._zod.def.shape=="object"?t._zod.def.shape:t._def?.shape?typeof t._def.shape=="function"?t._def.shape():t._def.shape:{}}function Ze(e){let t=e;return Array.isArray(t.options)?t.options:t._zod?.def?.entries?Object.values(t._zod.def.entries):Array.isArray(t._def?.values)?t._def.values:[]}function Le(e){let t=e;return t._zod?.def?.entries?t._zod.def.entries:t.enum&&typeof t.enum=="object"?t.enum:t._def?.values&&typeof t._def.values=="object"?t._def.values:{}}function Ue(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function Pn(e){let t=e;return Array.isArray(t.options)?t.options:Array.isArray(t._zod?.def?.options)?t._zod.def.options:Array.isArray(t._def?.options)?t._def.options:[]}function Dn(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 oo,qe=nt(()=>{oo={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 Jn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function To({message:e}){return jsxRuntime.jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsxRuntime.jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function Ie({val:e,mismatch:t}){let n=Co(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(To,{message:t})]}):n}function Co(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(Jn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(Jn,{val:e.toDate()});if(typeof e=="number")return jsxRuntime.jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxRuntime.jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsxRuntime.jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxRuntime.jsxs("li",{class:"text-base-content/40 italic",children:["+",e.length-8," more\u2026"]})]});if(typeof e=="object"&&e!==null){let n=Object.entries(e);return n.length===0?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxRuntime.jsxs("dl",{class:"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5 text-xs m-0",children:[n.slice(0,8).map(([r,o])=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsxRuntime.jsx("dd",{class:"break-all",children:String(o??"")})]})),n.length>8&&jsxRuntime.jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsxRuntime.jsx("span",{class:"text-sm break-all",children:t})}var gt=nt(()=>{});function _e(e){if(!e)return "unknown";let t=jt(e);switch(U(t)){case "ZodString":return "string";case "ZodNumber":return "number";case "ZodBigInt":return "bigint";case "ZodBoolean":return "boolean";case "ZodDate":return "date";case "ZodArray":return "array";case "ZodObject":case "ZodRecord":return "object";case "ZodEnum":case "ZodNativeEnum":return "enum";case "ZodLiteral":return "literal";default:return "unknown"}}function jt(e){let t=U(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?jt(n):e}return e}function Fe(e,t){if(!e)return;let n=t.split("."),r=e;for(let o of n){if(!r)return;let s=jt(r);if(U(s)!=="ZodObject")return;r=re(s)[o];}return r}function Eo(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function We(e,t){if(e==="unknown")return null;let n=Eo(t);return n==="null"?null:e==="enum"||e==="literal"?n==="string"||n==="number"?null:`Expected ${e} (string/number), got ${n}`:e===n||e==="number"&&n==="bigint"||e==="bigint"&&n==="number"?null:`Expected ${e}, got ${n}`}var Mt=nt(()=>{qe();});var er={};Er(er,{PanelMany:()=>Do,PanelOne:()=>Po,RightPanel:()=>Ht});function Po({doc:e,repoName:t,basePath:n,schema:r,columns:o}){if(!e)return jsxRuntime.jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let s=String(e.docId??e.id??""),a=`${n}/${t}/${encodeURIComponent(s)}/edit`,l=Yn(r,o);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:s})]}),jsxRuntime.jsx("a",{href:a,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsxRuntime.jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:o.map(i=>{let u=e[i],y=l[i],d=y?We(y,u):null;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:i}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(Ie,{val:u,mismatch:d})})]})})})]})}function Do({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:l}){let i=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,u=Yn(a,s);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" where "}),jsxRuntime.jsx("span",{class:"font-mono",children:r}),jsxRuntime.jsx("span",{class:"opacity-50",children:" = "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:o}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsxRuntime.jsx("a",{href:i,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxRuntime.jsxs("table",{class:"table table-xs w-full",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[s.map((y,d)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y},d)),jsxRuntime.jsx("th",{})]})}),jsxRuntime.jsx("tbody",{children:e.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:s.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((y,d)=>{let g=String(y.docId??y.id??""),x=`${n}/${t}/${encodeURIComponent(g)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((b,v)=>{let k=y[b],w=u[b],c=w?We(w,k):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(Ie,{val:k,mismatch:c})},v)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:x,class:"btn btn-xs btn-ghost",children:"Edit"})})]},d)})})]})}),(l.hasPrev||l.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[l.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":l.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),l.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":l.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Yn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=_e(Fe(e,r));return n}var Ht,Bt=nt(()=>{gt();Mt();Ht=({basePath:e=""})=>jsxRuntime.jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"data-frs-base-path":e,"aria-hidden":"true",children:[jsxRuntime.jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxRuntime.jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxRuntime.jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsxRuntime.jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsxRuntime.jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsxRuntime.jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsxRuntime.jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function Pr(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function He(e,t){return t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}function vt(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function cn(e){let[t,n,r]=e;return vt(e)?Pr(r,30).map(s=>[t,n,s]):[e]}function rt(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function dn(e){let t=await Promise.all(e.map(o=>o.get())),n=new Map;t.forEach(o=>{o.docs.forEach(s=>{n.has(s.id)||n.set(s.id,s);});});let r=t[0];if(!r)throw new Error("No snapshots returned");return {...r,docs:Array.from(n.values()),size:n.size,empty:n.size===0}}async function Te(e,t){let n=t.orWhere&&t.orWhere.length>0,r=t.orWhereGroups&&t.orWhereGroups.length>0;if(!n&&!r){if(!t.where||t.where.length===0)return He(e,t).get();if(!t.where.some(vt)){let d=rt(e,t.where);return d=He(d,t),d.get()}let i=t.where.map(cn),y=wt(i).map(d=>{let g=rt(e,d);return g=He(g,t),g});return dn(y)}let o=t.where??[],s=[...t.orWhere?.map(l=>[l])??[],...t.orWhereGroups??[]],a=[];for(let l of s){let i=[...o,...l];if(i.some(vt)){let y=i.map(cn),g=wt(y).map(x=>{let b=rt(e,x);return b=He(b,t),b});a.push(...g);}else {let y=rt(e,i);y=He(y,t),a.push(y);}}return dn(a)}function wt(e){if(e.length===0)return [[]];let t=e[0];if(e.length===1&&t)return t.map(s=>[s]);if(!t)return [[]];let n=e.slice(1),r=wt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var Rt="preserve";function Dr(e){Rt=e;}function St(){return Rt}function Ir(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function kt(e){if(e==null)return null;if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(e instanceof firestore.Timestamp)return e.toDate();if(Ir(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 _r(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ot(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>ot(t));if(_r(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=ot(r);return t}return e}function K(e){return Rt==="normalize"?ot(e):e}function pn(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function pe(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ge(e,t){return t.where&&t.where.forEach(([n,r,o])=>{e=e.where(String(n),r,o);}),t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}async function st(e,t){let n={...t,limit:t.pageSize+1};t.cursor&&(t.direction==="prev"?n.endBefore=t.cursor:n.startAfter=t.cursor);let o=(await Te(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,l=a.map(u=>K({...u.data(),docId:u.id})),i=t.direction==="prev";return {data:l,nextCursor:i?a.length>0?a[a.length-1]:void 0:s?a[a.length-1]:void 0,prevCursor:i?s?a[0]:void 0:a[0],hasNextPage:i?!!t.cursor:s,hasPrevPage:i?s:!!t.cursor,pageSize:l.length}}async function*Tt(e,t){let n,r=true;for(;r;){let o=await st(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function ze(e){if(e===null)return "null";if(e===void 0)return "undefined";if(e instanceof firestore.Timestamp)return "timestamp";if(e instanceof Date)return "date";if(Array.isArray(e))return "array";let t=typeof e;return t==="string"||t==="number"||t==="boolean"?t:"object"}function Ct(e,t,n=new WeakMap){if(e===t)return true;if(e===null||t===null||e===void 0||t===void 0)return e===t;if(e instanceof firestore.Timestamp&&t instanceof firestore.Timestamp)return e.isEqual(t);if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)||Array.isArray(t)){if(!Array.isArray(e)||!Array.isArray(t)||e.length!==t.length)return false;if(n.get(e)===t)return true;n.set(e,t);for(let r=0;r<e.length;r++)if(!Ct(e[r],t[r],n))return false;return true}if(typeof e=="object"&&typeof t=="object"){if(e instanceof Date||t instanceof Date||e instanceof firestore.Timestamp||t instanceof firestore.Timestamp)return false;if(n.get(e)===t)return true;n.set(e,t);let r=Object.keys(e),o=Object.keys(t);if(r.length!==o.length)return false;for(let s of r)if(!Object.prototype.hasOwnProperty.call(t,s)||!Ct(e[s],t[s],n))return false;return true}return false}function at(e,t,n={}){let r=new Set([...n.exclude??[],...n.metaFields??[],...n.systemKeys??[]]),o=n.include?new Set(n.include):null,s=e??{},a=t??{},l=new Set([...Object.keys(s),...Object.keys(a)]),i={};for(let u of l){if(r.has(u)||o&&!o.has(u))continue;let y=s[u],d=a[u];Ct(y,d)||(i[u]={oldValue:y===void 0?null:y,newValue:d===void 0?null:d,type:{old:ze(y),new:ze(d)}});}return i}var Fr=5;function Nr(e){return e.schemaVersion===2}function fn(e){if(typeof e!="string")return "object";switch(e){case "string":case "number":case "boolean":case "object":case "array":case "timestamp":case "date":case "null":case "undefined":return e;default:return "object"}}function jr(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function Mr(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 Hr(e){let t=e.changes?.oldValue??null,n=e.changes?.newValue??null,r=e.types?.oldValue,o=e.types?.newValue;return {oldValue:t,newValue:n,type:{old:r?fn(r):ze(t),new:o?fn(o):ze(n)}}}function Br(e){let t=Hr(e),n=Mr(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function zr(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function Zr(e,t){return (e.userId??null)===(t.userId??null)}function yn(e,t={}){let n=t.groupToleranceMs??Fr,r=[];for(let o of e){if(Nr(o)){r.push(jr(o));continue}let a=Br(o),l=r[r.length-1];l&&l.schemaVersion===1&&zr(l.historySetAt,a.historySetAt,n)&&Zr(l.meta,a.meta)?Object.assign(l.changes,a.changes):r.push(a);}return r}var Ur=7e5;function it(e){let t=e.ttlOverride??e.config.ttl,r={schemaVersion:2,historyDocId:crypto.randomUUID(),historyToObjectId:e.entityId,historySetAt:firestore.Timestamp.now(),operation:e.operation,meta:e.meta,changes:e.changes};t&&(r.expiresAt=firestore.Timestamp.fromMillis(Date.now()+t.days*24*60*60*1e3));let o=s=>{try{return Buffer.byteLength(JSON.stringify(s,(a,l)=>l instanceof firestore.Timestamp?l.toMillis():l),"utf8")}catch{return 0}};if(o(r.changes)>Ur){let s={};for(let[a,l]of Object.entries(r.changes)){let i=o(l.oldValue),u=o(l.newValue);s[a]={oldValue:i>5e4?"[truncated]":l.oldValue,newValue:u>5e4?"[truncated]":l.newValue,type:l.type};}r.changes=s,r._truncated=true;}return r}async function lt(e,t,n,r){let o=t;return n.onBeforeWrite&&(o=await n.onBeforeWrite(t,r)),o?(await e.doc(o.historyDocId).set(o),{written:true,entry:o}):{written:false,reason:"dropped-by-onBeforeWrite"}}function ct(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=y=>{if(!y)return;let d=n[y];return d===void 0||d===null?null:String(d)},a=s(o.userId);a!==void 0&&(r.userId=a);let l=s(o.userEmail);l!==void 0&&(r.userEmail=l);let i=s(o.reason);i!==void 0&&(r.reason=i);let u=s(o.comment);if(u!==void 0&&(r.comment=u),o.extras&&o.extras.length>0){let y={},d=false;for(let g of o.extras)g in n&&(y[g]=n[g],d=true);d&&(r.extras=y);}return r}function dt(e){let t=e.meta;if(!t)return [];let n=[];return t.userId&&n.push(t.userId),t.userEmail&&n.push(t.userEmail),t.reason&&n.push(t.reason),t.comment&&n.push(t.comment),t.extras&&n.push(...t.extras),n}var qr="history",Kr=50;function mn(e,t,n){return e(...n).collection(t)}function Qr(e){return String(e[e.length-1]??"")}function gn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??qr;async function s(...y){let d={},g=y,x=y[y.length-1];x!==null&&typeof x=="object"&&!(x instanceof firestore.Timestamp)&&("limit"in x||"cursor"in x||"direction"in x)&&(d=x,g=y.slice(0,-1));let b=mn(e,o,g),v=d.direction??"desc",k=b.orderBy("historySetAt",v);return d.cursor&&(k=k.startAfter(d.cursor)),d.limit&&d.limit>0&&(k=k.limit(d.limit)),(await k.get()).docs.map(c=>({id:c.id,data:c.data()}))}async function a(...y){let d={},g=y,x=y[y.length-1];x!==null&&typeof x=="object"&&!(x instanceof firestore.Timestamp)&&("limit"in x||"cursor"in x||"direction"in x||"fields"in x||"operations"in x)&&(d=x,g=y.slice(0,-1));let b=d.limit??Kr,v=Math.max(b,Math.min(b*8,500)),k=await s(...g,{limit:v,cursor:d.cursor,direction:d.direction??"desc"}),w=yn(k.map(c=>c.data));if(d.fields&&d.fields.length>0){let c=new Set(d.fields);w=w.filter(f=>Object.keys(f.changes).some(m=>c.has(m)));}if(d.operations&&d.operations.length>0){let c=new Set(d.operations);w=w.filter(f=>c.has(f.operation));}return w.slice(0,b)}async function l(...y){let d=y[y.length-1],g={},x,b;return d!==null&&typeof d=="object"&&!(d instanceof firestore.Timestamp)?(g=d,x=y[y.length-2],b=y.slice(0,-2)):(x=d,b=y.slice(0,-1)),a(...b,{...g,fields:[x]})}async function i(...y){let d=y[y.length-1],g={},x,b;return d!==null&&typeof d=="object"&&!(d instanceof firestore.Timestamp)?(g=d,x=y[y.length-2],b=y.slice(0,-2)):(x=d,b=y.slice(0,-1)),a(...b,{...g,operations:[x]})}async function u(...y){let d=y[y.length-1],g=y.slice(0,-1),x=Qr(g),b=at(d.before??{},d.after??{},{include:r.include,exclude:r.exclude,metaFields:dt(r),systemKeys:t});if(d.operation==="update"&&Object.keys(b).length===0)return null;let k={...ct(d.after??d.before??null,r),...d.meta??{}},w=it({entityId:x,operation:d.operation,changes:b,meta:k,config:r}),c=mn(e,o,g),f=await lt(c,w,r,{repoName:n,docId:x,before:d.before??null,after:d.after??null});return !f.written||!f.entry?null:{historyDocId:f.entry.historyDocId,historyToObjectId:f.entry.historyToObjectId,historySetAt:f.entry.historySetAt,schemaVersion:2,operation:f.entry.operation,meta:f.entry.meta,changes:f.entry.changes}}return {list:a,raw:s,byField:l,byOperation:i,recordManual:u}}function hn(e){return {count:async(t={})=>{let n=e;return n=ge(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=ge(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let l=a.data()[t];typeof l=="number"&&(s+=l);}),s},average:async(t,n={})=>{let r=e;r=ge(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(l=>{let i=l.data()[t];typeof i=="number"&&(s+=i,a++);}),a>0?s/a:null}}}function bn(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let l=e.batch();return {batch:l,set:(...i)=>{let u=i[i.length-1],y=typeof u=="object"&&u!==null&&"merge"in u,d=y?i[i.length-2]:i[i.length-1],g=y?i.slice(0,-2):i.slice(0,-1),x=y?u:{merge:true},b=t(...g),v={...d},k=g[g.length-1];n&&k&&(v[n]=k),r&&(v[r]=b.path),o&&(v[o]=a()),s&&(v[s]=a()),l.set(b,v,x);},update:(...i)=>{let u=i.pop(),d=t(...i),g={...u};s&&(g[s]=a()),l.update(d,g);},delete:(...i)=>{let u=t(...i);l.delete(u);},commit:async()=>{await l.commit();}}}}}var Vr=new Set([4,8,10,13,14]);function Ot(e,t){let n=[],r=t.maxAttempts??5;return e.onWriteError(o=>{let s=o?.code;if(o.failedAttempts<r&&s!==void 0&&Vr.has(s))return true;let a={ref:o.documentRef,error:o};return n.push(a),t.onError?.(a),false}),t.onSuccess&&e.onWriteResult(o=>t.onSuccess(o)),n}function $t(e,t){if(e.length>0&&!t.onError){let n=new Error(`bulk operation failed for ${e.length} document(s): `+e.slice(0,5).map(r=>`${r.ref.path} (${r.error.message})`).join("; "));throw n.failures=e,n}return {failures:e}}function xn(e,t,n){let r=()=>new Date;return {set:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o){if(!i)continue;let{docRef:u,data:y,merge:d=true}=i,g={...y};t&&(g[t]=r()),n&&(g[n]=r()),a.set(u,g,{merge:d});}return await a.close(),$t(l,s)},update:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o){if(!i)continue;let{docRef:u,data:y}=i,d={...y};n&&(d[n]=r()),a.update(u,d);}return await a.close(),$t(l,s)},delete:async(o,s={})=>{let a=e.bulkWriter(),l=Ot(a,s);for(let i of o)i&&a.delete(i);return await a.close(),$t(l,s)}}}function vn(e,t,n,r,o,s){let a=()=>new Date;return {create:async d=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let g,x,b={...d};if(o&&(b[o]=a()),s&&(b[s]=a()),d[n]){x=d[n],g=e.doc(x);let k=r?{...b,[r]:g.path}:b;await g.set(k);}else {g=await e.add(b),x=g.id;let k={[n]:x};r&&(k[r]=g.path),await g.update(k);}let v=await g.get();return K(v.data())},set:async(...d)=>{let g=d[d.length-1],x=typeof g=="object"&&g!==null&&"merge"in g,b=x?d[d.length-2]:d[d.length-1],v=x?d.slice(0,-2):d.slice(0,-1),k=x?g:{merge:true},w={...b};s&&(w[s]=a());let c=t(...v),f=v[v.length-1];n&&f!=null&&(w[n]=f),r&&(w[r]=c.path),await c.set(w,k);let m=await c.get();return K(m.data())},update:async(...d)=>{let g=d.pop(),x=d,b={...g};s&&(b[s]=a());let v=t(...x);await v.update(b);let k=await v.get();return K(k.data())},delete:async(...d)=>{await t(...d).delete();}}}function wn(e,t,n,r,o){let s={};return s.byList=async(a,l,i="in",u={})=>{if(l.length===0)return [];let y=[],d=pn(l,30);for(let g of d){let x=e;x=x.where(a,i,g),u.select&&u.select.length>0&&(x=x.select(...u.select.map(v=>String(v)))),(await x.get()).forEach(v=>{let k=K(v.data());y.push(u.returnDoc?{data:k,doc:v}:k);});}return y},t.forEach(a=>{let l=`by${pe(String(a))}`;s[l]=async(i,u={})=>{let y=typeof u=="boolean"?{returnDoc:u}:u;if(String(a)===o){let k=await r(i).get();if(!k.exists)return null;let w=K(k.data());return y.returnDoc?{data:w,doc:k}:w}let d=e;d=d.where(String(a),"==",i).limit(1),y.select&&y.select.length>0&&(d=d.select(...y.select.map(v=>String(v))));let g=await d.get();if(g.empty)return null;let x=g.docs[0];if(!x)return null;let b=K(x.data());return y.returnDoc?{data:b,doc:x}:b};}),s}function Rn(e,t,n,r){let o={},s=async(a,l)=>{if(!n||!r||l.length===0)return a;let i=l.map(u=>typeof u=="string"?{key:u}:{key:u.relation,select:u.select});return Promise.all(a.map(async u=>{let y=await Promise.all(i.map(async({key:g,select:x})=>{let b=n[g];if(!b)return [g,void 0];let v=r[b.repo];if(!v)return [g,void 0];let k=u[g];if(k==null)return [g,b.type==="one"?null:[]];let w=x?{select:x}:void 0;try{if(b.type==="one"){let c=`by${pe(b.key)}`,f=typeof v.get?.[c]=="function"?await v.get[c](k,w):null;return [g,f]}else {let c=`by${pe(b.key)}`,f=typeof v.query?.[c]=="function"?await v.query[c](k,w):[];return [g,f]}}catch(c){return console.error(`[include] Error populating "${g}":`,c),[g,b.type==="one"?null:[]]}})),d={};for(let[g,x]of y)g!==void 0&&(d[g]=x);return {...u,populated:d}}))};return t.forEach(a=>{let l=`by${pe(a)}`;o[l]=async(i,u={})=>{let y={...u,where:[[a,"==",i],...u.where??[]]};return (await Te(e,y)).docs.map(g=>K(g.data()))};}),o.by=async a=>(await Te(e,a)).docs.map(i=>K(i.data())),o.getAll=async(a={})=>(await Te(e,a)).docs.map(i=>K(i.data())),o.onSnapshot=(a,l,i)=>ge(e,a).onSnapshot(y=>{l(y.docs.map(d=>K(d.data())));},i),o.paginate=async a=>{let{include:l,...i}=a,u=await st(e,i);if(l&&l.length>0){let y=await s(u.data,l);return {...u,data:y}}return u},o.paginateAll=async function*(a){let{include:l,...i}=a;for await(let u of Tt(e,i))if(l&&l.length>0){let y=await s(u.data,l);yield {...u,data:y};}else yield u;},o}function Sn(e,t){return {populate:async(n,r)=>{if(!e.relationalKeys)return {...n,populated:{}};let o,s={};if(typeof r=="object"&&!Array.isArray(r))if("relation"in r){let i=r;o=[i.relation],i.select&&(s[i.relation]=i.select);}else if("relations"in r){let i=r;o=Array.isArray(i.relations)?i.relations:[i.relations],s=i.select??{};}else o=[];else o=Array.isArray(r)?r:[r];let a=await Promise.all(o.map(async i=>{let u=e.relationalKeys?.[i];if(!u)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let y=t[u.repo];if(!y)return console.warn(`[populate] Repository "${u.repo}" not found in mapping`),[i,void 0];let d=n[i];if(d==null)return [i,u.type==="one"?null:[]];let g=s[i],x=g?{select:g}:void 0;try{if(u.type==="one"){let b=`by${pe(u.key)}`,v=typeof y.get?.[b]=="function"?await y.get[b](d,x):null;return [i,v]}else {let b=`by${pe(u.key)}`,v=typeof y.query?.[b]=="function"?await y.query[b](d,x):[];return [i,v]}}catch(b){return console.error(`[populate] Error populating "${i}":`,b),[i,u.type==="one"?null:[]]}})),l={};for(let[i,u]of a)u!==void 0&&(l[i]=u);return {...n,populated:l}}}}var Gr=new Set([4,8,10,13,14]);function kn(e,t,n,r,o,s){let a=()=>new Date;return {backfillKeys:async(i={})=>{let{overwriteCreated:u=false,touchUpdated:y=true,overwritePath:d=false,pageSize:g=300,dryRun:x=false,maxAttempts:b=5,onError:v,onSuccess:k}=i,w=[],c=0,f=0,m=0,p=x?null:e.bulkWriter();p&&(p.onWriteError(R=>{let S=R?.code;if(R.failedAttempts<b&&S!==void 0&&Gr.has(S))return true;let C={path:R?.documentRef?.path??"(unknown)",error:R};return w.push(C),v?.(C),false}),k&&p.onWriteResult(R=>k(R.path)));let h;for(;;){let R=t.orderBy(firestore.FieldPath.documentId());h&&(R=R.startAfter(h)),R=R.limit(g);let S=await R.get();if(S.empty)break;for(let C of S.docs){c++;let T=C.data(),O={};if(n&&T[n]==null&&(O[n]=C.id),r&&(d||T[r]==null)&&T[r]!==C.ref.path&&(O[r]=C.ref.path),o&&(u||T[o]==null)&&(O[o]=a()),y&&s&&T[s]==null&&(O[s]=a()),Object.keys(O).length===0){m++;continue}f++,p&&p.set(C.ref,O,{merge:true});}if(S.size<g)break;h=S.docs[S.docs.length-1];}return p&&await p.close(),{scanned:c,written:f,skipped:m,failures:w}}}}function Tn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),l=await r.get(a);return l.exists?K({...l.data(),docId:l.id}):null},set:(...s)=>{let a=s[s.length-1],l=typeof a=="object"&&a!==null&&"merge"in a,i=l?s[s.length-2]:s[s.length-1],u=l?s.slice(0,-2):s.slice(0,-1),y=l?a:{merge:true},d=t(...u);r.set(d,i,y);},update:(...s)=>{let a=s[s.length-1],l=s.slice(0,-1),i=t(...l);r.update(i,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function Jr(e){if(typeof e!="function")return [];let n=e.toString().match(/^\s*(?:function\s*\w*\s*)?\(([^)]*)\)/);if(!n?.[1])return [];let r=n[1].split(",").map(o=>o.trim().replace(/\s*[:=].*$/,"").trim()).filter(Boolean);return r.length<=2?[]:r.slice(1,-1)}function Et(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...w)=>t.refCb(e,...w),a=wn(r,t.foreignKeys,o,s,t.documentKey),l=Rn(r,t.queryKeys,t.relationalKeys,n),i=hn(r),u=vn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),y=bn(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),d=Tn(e,s),g=xn(e,t.createdKey,t.updatedKey),x=kn(e,r,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),b=Sn(t,n),v=t.history,k=v?.enabled?gn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(w=>typeof w=="string"),t.path??"(unknown)",v):null;return {ref:r,documentRef:s,get:a,query:l,aggregate:i,...u,batch:y,transaction:d,bulk:g,system:x,...b,...k?{history:k}:{},_historySubcollection:k?v?.subcollection??"history":void 0,_historyConfig:v,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(w=>typeof w=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?Jr(t.refCb):[],_createdKey:t.createdKey??null}}var Xr="history";function Yr(e,t){let n=t.ref?.path??void 0;return n?`${n}/{docId}`:(console.warn(`[HistoryTriggers] Cannot determine collection path for "${e}". Skipping.`),null)}function Cn(e,t){let{onDocumentWritten:n}=t.deps,r={};for(let[o,s]of Object.entries(e)){let a=s._historyConfig??(typeof s.history=="object"&&s.history!==null&&"enabled"in s.history?s.history:void 0);if(!a?.enabled)continue;let l=a.subcollection??Xr,i=a.ttl??t.defaults?.ttl,u=t.repos?.[o],y;if(s._isGroup){if(!u?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}y=u.triggerPath;}else y=u?.triggerPath??Yr(o,s);if(!y)continue;let d=s._systemKeys??[],g=d[0]??"docId",x=dt(a);r[`${o}_onHistory`]=n(y,async b=>{try{let v=b.data?.before?.data(),k=b.data?.after?.data(),w;if(!v&&k)w="create";else if(v&&!k)w="delete";else if(v&&k)w="update";else return;let c=String(k?.[g]??v?.[g]??b.params?.docId??b.data?.after?.id??b.data?.before?.id??"");if(!c)return;let f=at(v??{},k??{},{include:a.include,exclude:a.exclude,metaFields:x,systemKeys:d});if(w==="update"&&Object.keys(f).length===0)return;let m=ct(k??v??null,a),p=it({entityId:c,operation:w,changes:f,meta:m,config:a,ttlOverride:i}),h=b.data?.after?.ref??b.data?.before?.ref;if(!h)return;let R=h.collection(l);await lt(R,p,a,{repoName:o,docId:c,before:v??null,after:k??null});}catch(v){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,v);}});}return r}function eo(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 to(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var oe=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,r)=>{console.error("[MiniRouter]",t),r.status(500).send("Internal Server Error");};}use(t){return this.middlewares.push(t),this}get(t,n){return this.addRoute("GET",t,n)}post(t,n){return this.addRoute("POST",t,n)}put(t,n){return this.addRoute("PUT",t,n)}patch(t,n){return this.addRoute("PATCH",t,n)}delete(t,n){return this.addRoute("DELETE",t,n)}onNotFound(t){return this.notFoundHandler=t,this}onError(t){return this.errorHandler=t,this}addRoute(t,n,r){let{pattern:o,paramNames:s}=eo(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=to(t),s=null,a={};for(let u of this.routes){if(u.method!==r)continue;let y=o.match(u.pattern);if(y){s=u,a={},u.paramNames.forEach((d,g)=>{a[d]=decodeURIComponent(y[g+1]??"");});break}}let l=Object.assign(t,{params:a}),i=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(l,n,i);}catch(u){this.errorHandler(u,t,n);}}async runMiddlewareChain(t,n,r){let o=0,s=async()=>{if(o<this.middlewares.length){let a=this.middlewares[o++];await a(t,n,s);}else await r(t,n);};await s();}};function ne(e,t,n){let r=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let a=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",l=n??process.env.FUNCTION_REGION??"us-central1",i=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${a}/${l}/${i}${r}`}let o=process.env.K_SERVICE,s=e?.hostname??e?.headers?.host??"";return o&&typeof s=="string"&&s.includes("cloudfunctions.net")?`/${o.toLowerCase()}${r}`:r}function An(e){if(typeof e=="string")return e;if(Array.isArray(e)){let t=e[0];return typeof t=="string"?t:void 0}}function he(e){return !!e&&typeof e=="object"&&e.__authExtension===true}qe();var be="__sync_version";var so=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function ao(e){let t=e,n=false;for(;;){let r=U(t);if(!so.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var io={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function In(e,t,n,r,o,s,a,l){for(let[i,u]of Object.entries(e)){let y=n?`${n}__${i}`:i;if(o.has(i)||o.has(y))continue;let{inner:d,nullable:g}=ao(u),x=U(d),b=r||g;if(x==="ZodObject"){let c=re(d);In(c,t,y,b,o,s,a,l);continue}let v=io[x]??"json",k=y===a||i===a,w=s[y]??s[i]??y;l.push({name:w,sqlType:t.mapType(v),nullable:k?false:b,isPrimaryKey:k});}}function pt(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),l=re(e),i=[];return In(l,t,"",false,a,s,r,i),i.some(u=>u.name===be)||i.push({name:be,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),i}function _n(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(_n)):e}var lo=32,co=5e3;function Fn(e,t,n,r=new WeakSet,o=0){if(o>lo){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>=co)break;let l=t?`${t}__${s}`:s;a!=null&&typeof a=="object"&&!Array.isArray(a)&&!(a instanceof Date)&&!Buffer.isBuffer(a)&&!(a instanceof Uint8Array)&&typeof a.toDate!="function"&&!("latitude"in a&&"longitude"in a)?Fn(a,l,n,r,o+1):n[l]=_n(a);}r.delete(e);}function Ke(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};Fn(e,"",o);let s={};for(let[a,l]of Object.entries(o)){if(n.has(a))continue;let i=a.split("__")[0];if(i!==a&&n.has(i))continue;let u=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[u]=l;}return s}function fe(e,t,n){return `<!DOCTYPE html>
|
|
1
|
+
'use strict';var jsxRuntime=require('hono/jsx/jsx-runtime'),firestore=require('firebase-admin/firestore'),crypto=require('crypto'),zod=require('zod'),server=require('hono/jsx/dom/server');var Pr=Object.defineProperty;var nt=(e,t)=>()=>(e&&(t=e(e=0)),t);var Dr=(e,t)=>{for(var n in t)Pr(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return lo[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 En(e){let t=e,n=t._zod?.def?.in;if(n)return n;if(t._def?.schema)return t._def.schema}function Pn(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function Dn(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function re(e){let t=e;return t.shape&&typeof t.shape=="object"?t.shape:t._zod?.def?.shape&&typeof t._zod.def.shape=="object"?t._zod.def.shape:t._def?.shape?typeof t._def.shape=="function"?t._def.shape():t._def.shape:{}}function Ze(e){let t=e;return Array.isArray(t.options)?t.options:t._zod?.def?.entries?Object.values(t._zod.def.entries):Array.isArray(t._def?.values)?t._def.values:[]}function Ke(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 Le(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function In(e){let t=e;return Array.isArray(t.options)?t.options:Array.isArray(t._zod?.def?.options)?t._zod.def.options:Array.isArray(t._def?.options)?t._def.options:[]}function _n(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 lo,Ue=nt(()=>{lo={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 Yn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function Po({message:e}){return jsxRuntime.jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsxRuntime.jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function Ie({val:e,mismatch:t}){let n=Do(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(Po,{message:t})]}):n}function Do(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(Yn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(Yn,{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 ht=nt(()=>{});function _e(e){if(!e)return "unknown";let t=Mt(e);switch(L(t)){case "ZodString":return "string";case "ZodNumber":return "number";case "ZodBigInt":return "bigint";case "ZodBoolean":return "boolean";case "ZodDate":return "date";case "ZodArray":return "array";case "ZodObject":case "ZodRecord":return "object";case "ZodEnum":case "ZodNativeEnum":return "enum";case "ZodLiteral":return "literal";default:return "unknown"}}function Mt(e){let t=L(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?Mt(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=Mt(r);if(L(s)!=="ZodObject")return;r=re(s)[o];}return r}function No(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function We(e,t){if(e==="unknown")return null;let n=No(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 Ht=nt(()=>{Ue();});var nr={};Dr(nr,{PanelMany:()=>Mo,PanelOne:()=>jo,RightPanel:()=>Bt});function jo({doc:e,repoName:t,basePath:n,schema:r,columns:o}){if(!e)return jsxRuntime.jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let s=String(e.docId??e.id??""),a=`${n}/${t}/${encodeURIComponent(s)}/edit`,l=tr(r,o);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:s})]}),jsxRuntime.jsx("a",{href:a,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsxRuntime.jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:o.map(i=>{let u=e[i],m=l[i],f=m?We(m,u):null;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:i}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(Ie,{val:u,mismatch:f})})]})})})]})}function Mo({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:l}){let i=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,u=tr(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((m,f)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:m},f)),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((m,f)=>{let w=String(m.docId??m.id??""),b=`${n}/${t}/${encodeURIComponent(w)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((g,k)=>{let v=m[g],x=u[g],y=x?We(x,v):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(Ie,{val:v,mismatch:y})},k)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:b,class:"btn btn-xs btn-ghost",children:"Edit"})})]},f)})})]})}),(l.hasPrev||l.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[l.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":l.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),l.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":l.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function tr(e,t){if(!e)return {};let n={};for(let r of t)n[r]=_e(Fe(e,r));return n}var Bt,zt=nt(()=>{ht();Ht();Bt=({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 Ir(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function He(e,t){return t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}function wt(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function dn(e){let[t,n,r]=e;return wt(e)?Ir(r,30).map(s=>[t,n,s]):[e]}function rt(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function un(e){let t=await Promise.all(e.map(o=>o.get())),n=new Map;t.forEach(o=>{o.docs.forEach(s=>{n.has(s.id)||n.set(s.id,s);});});let r=t[0];if(!r)throw new Error("No snapshots returned");return {...r,docs:Array.from(n.values()),size:n.size,empty:n.size===0}}async function Te(e,t){let n=t.orWhere&&t.orWhere.length>0,r=t.orWhereGroups&&t.orWhereGroups.length>0;if(!n&&!r){if(!t.where||t.where.length===0)return He(e,t).get();if(!t.where.some(wt)){let f=rt(e,t.where);return f=He(f,t),f.get()}let i=t.where.map(dn),m=Rt(i).map(f=>{let w=rt(e,f);return w=He(w,t),w});return un(m)}let o=t.where??[],s=[...t.orWhere?.map(l=>[l])??[],...t.orWhereGroups??[]],a=[];for(let l of s){let i=[...o,...l];if(i.some(wt)){let m=i.map(dn),w=Rt(m).map(b=>{let g=rt(e,b);return g=He(g,t),g});a.push(...w);}else {let m=rt(e,i);m=He(m,t),a.push(m);}}return un(a)}function Rt(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=Rt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var St="preserve";function _r(e){St=e;}function kt(){return St}function Fr(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function Tt(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(Fr(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 Nr(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ot(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>ot(t));if(Nr(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=ot(r);return t}return e}function q(e){return St==="normalize"?ot(e):e}function fn(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function pe(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ge(e,t){return t.where&&t.where.forEach(([n,r,o])=>{e=e.where(String(n),r,o);}),t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}async function st(e,t){let n={...t,limit:t.pageSize+1};t.cursor&&(t.direction==="prev"?n.endBefore=t.cursor:n.startAfter=t.cursor);let o=(await Te(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,l=a.map(u=>q({...u.data(),docId:u.id})),i=t.direction==="prev";return {data:l,nextCursor:i?a.length>0?a[a.length-1]:void 0:s?a[a.length-1]:void 0,prevCursor:i?s?a[0]:void 0:a[0],hasNextPage:i?!!t.cursor:s,hasPrevPage:i?s:!!t.cursor,pageSize:l.length}}async function*Ct(e,t){let n,r=true;for(;r;){let o=await st(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function ze(e){if(e===null)return "null";if(e===void 0)return "undefined";if(e instanceof firestore.Timestamp)return "timestamp";if(e instanceof Date)return "date";if(Array.isArray(e))return "array";let t=typeof e;return t==="string"||t==="number"||t==="boolean"?t:"object"}function At(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(!At(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)||!At(e[s],t[s],n))return false;return true}return false}function at(e,t,n={}){let r=new Set([...n.exclude??[],...n.metaFields??[],...n.systemKeys??[]]),o=n.include?new Set(n.include):null,s=e??{},a=t??{},l=new Set([...Object.keys(s),...Object.keys(a)]),i={};for(let u of l){if(r.has(u)||o&&!o.has(u))continue;let m=s[u],f=a[u];At(m,f)||(i[u]={oldValue:m===void 0?null:m,newValue:f===void 0?null:f,type:{old:ze(m),new:ze(f)}});}return i}var jr=5;function Mr(e){return e.schemaVersion===2}function yn(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 Hr(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function Br(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 zr(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?yn(r):ze(t),new:o?yn(o):ze(n)}}}function Zr(e){let t=zr(e),n=Br(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function Kr(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function Lr(e,t){return (e.userId??null)===(t.userId??null)}function mn(e,t={}){let n=t.groupToleranceMs??jr,r=[];for(let o of e){if(Mr(o)){r.push(Hr(o));continue}let a=Zr(o),l=r[r.length-1];l&&l.schemaVersion===1&&Kr(l.historySetAt,a.historySetAt,n)&&Lr(l.meta,a.meta)?Object.assign(l.changes,a.changes):r.push(a);}return r}var qr=7e5;function it(e){let t=e.ttlOverride??e.config.ttl,r={schemaVersion:2,historyDocId:crypto.randomUUID(),historyToObjectId:e.entityId,historySetAt:firestore.Timestamp.now(),operation:e.operation,meta:e.meta,changes:e.changes};t&&(r.expiresAt=firestore.Timestamp.fromMillis(Date.now()+t.days*24*60*60*1e3));let o=s=>{try{return Buffer.byteLength(JSON.stringify(s,(a,l)=>l instanceof firestore.Timestamp?l.toMillis():l),"utf8")}catch{return 0}};if(o(r.changes)>qr){let s={};for(let[a,l]of Object.entries(r.changes)){let i=o(l.oldValue),u=o(l.newValue);s[a]={oldValue:i>5e4?"[truncated]":l.oldValue,newValue:u>5e4?"[truncated]":l.newValue,type:l.type};}r.changes=s,r._truncated=true;}return r}async function lt(e,t,n,r){let o=t;return n.onBeforeWrite&&(o=await n.onBeforeWrite(t,r)),o?(await e.doc(o.historyDocId).set(o),{written:true,entry:o}):{written:false,reason:"dropped-by-onBeforeWrite"}}function ct(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=m=>{if(!m)return;let f=n[m];return f===void 0||f===null?null:String(f)},a=s(o.userId);a!==void 0&&(r.userId=a);let l=s(o.userEmail);l!==void 0&&(r.userEmail=l);let i=s(o.reason);i!==void 0&&(r.reason=i);let u=s(o.comment);if(u!==void 0&&(r.comment=u),o.extras&&o.extras.length>0){let m={},f=false;for(let w of o.extras)w in n&&(m[w]=n[w],f=true);f&&(r.extras=m);}return r}function dt(e){let t=e.meta;if(!t)return [];let n=[];return t.userId&&n.push(t.userId),t.userEmail&&n.push(t.userEmail),t.reason&&n.push(t.reason),t.comment&&n.push(t.comment),t.extras&&n.push(...t.extras),n}var Qr="history",Vr=50;function gn(e,t,n){return e(...n).collection(t)}function Wr(e){return String(e[e.length-1]??"")}function hn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??Qr;async function s(...m){let f={},w=m,b=m[m.length-1];b!==null&&typeof b=="object"&&!(b instanceof firestore.Timestamp)&&("limit"in b||"cursor"in b||"direction"in b)&&(f=b,w=m.slice(0,-1));let g=gn(e,o,w),k=f.direction??"desc",v=g.orderBy("historySetAt",k);return f.cursor&&(v=v.startAfter(f.cursor)),f.limit&&f.limit>0&&(v=v.limit(f.limit)),(await v.get()).docs.map(y=>({id:y.id,data:y.data()}))}async function a(...m){let f={},w=m,b=m[m.length-1];b!==null&&typeof b=="object"&&!(b instanceof firestore.Timestamp)&&("limit"in b||"cursor"in b||"direction"in b||"fields"in b||"operations"in b)&&(f=b,w=m.slice(0,-1));let g=f.limit??Vr,k=Math.max(g,Math.min(g*8,500)),v=await s(...w,{limit:k,cursor:f.cursor,direction:f.direction??"desc"}),x=mn(v.map(y=>y.data));if(f.fields&&f.fields.length>0){let y=new Set(f.fields);x=x.filter(c=>Object.keys(c.changes).some(d=>y.has(d)));}if(f.operations&&f.operations.length>0){let y=new Set(f.operations);x=x.filter(c=>y.has(c.operation));}return x.slice(0,g)}async function l(...m){let f=m[m.length-1],w={},b,g;return f!==null&&typeof f=="object"&&!(f instanceof firestore.Timestamp)?(w=f,b=m[m.length-2],g=m.slice(0,-2)):(b=f,g=m.slice(0,-1)),a(...g,{...w,fields:[b]})}async function i(...m){let f=m[m.length-1],w={},b,g;return f!==null&&typeof f=="object"&&!(f instanceof firestore.Timestamp)?(w=f,b=m[m.length-2],g=m.slice(0,-2)):(b=f,g=m.slice(0,-1)),a(...g,{...w,operations:[b]})}async function u(...m){let f=m[m.length-1],w=m.slice(0,-1),b=Wr(w),g=at(f.before??{},f.after??{},{include:r.include,exclude:r.exclude,metaFields:dt(r),systemKeys:t});if(f.operation==="update"&&Object.keys(g).length===0)return null;let v={...ct(f.after??f.before??null,r),...f.meta??{}},x=it({entityId:b,operation:f.operation,changes:g,meta:v,config:r}),y=gn(e,o,w),c=await lt(y,x,r,{repoName:n,docId:b,before:f.before??null,after:f.after??null});return !c.written||!c.entry?null:{historyDocId:c.entry.historyDocId,historyToObjectId:c.entry.historyToObjectId,historySetAt:c.entry.historySetAt,schemaVersion:2,operation:c.entry.operation,meta:c.entry.meta,changes:c.entry.changes}}return {list:a,raw:s,byField:l,byOperation:i,recordManual:u}}function bn(e){return {count:async(t={})=>{let n=e;return n=ge(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=ge(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let l=a.data()[t];typeof l=="number"&&(s+=l);}),s},average:async(t,n={})=>{let r=e;r=ge(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(l=>{let i=l.data()[t];typeof i=="number"&&(s+=i,a++);}),a>0?s/a:null}}}function xn(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let l=e.batch();return {batch:l,set:(...i)=>{let u=i[i.length-1],m=typeof u=="object"&&u!==null&&"merge"in u,f=m?i[i.length-2]:i[i.length-1],w=m?i.slice(0,-2):i.slice(0,-1),b=m?u:{merge:true},g=t(...w),k={...f},v=w[w.length-1];n&&v&&(k[n]=v),r&&(k[r]=g.path),o&&(k[o]=a()),s&&(k[s]=a()),l.set(g,k,b);},update:(...i)=>{let u=i.pop(),f=t(...i),w={...u};s&&(w[s]=a()),l.update(f,w);},delete:(...i)=>{let u=t(...i);l.delete(u);},commit:async()=>{await l.commit();}}}}}var Gr=new Set([4,8,10,13,14]);function $t(e,t){let n=[],r=t.maxAttempts??5;return e.onWriteError(o=>{let s=o?.code;if(o.failedAttempts<r&&s!==void 0&&Gr.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 Et(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 vn(e,t,n){let r=()=>new Date;return {set:async(o,s={})=>{let a=e.bulkWriter(),l=$t(a,s);for(let i of o){if(!i)continue;let{docRef:u,data:m,merge:f=true}=i,w={...m};t&&(w[t]=r()),n&&(w[n]=r()),a.set(u,w,{merge:f});}return await a.close(),Et(l,s)},update:async(o,s={})=>{let a=e.bulkWriter(),l=$t(a,s);for(let i of o){if(!i)continue;let{docRef:u,data:m}=i,f={...m};n&&(f[n]=r()),a.update(u,f);}return await a.close(),Et(l,s)},delete:async(o,s={})=>{let a=e.bulkWriter(),l=$t(a,s);for(let i of o)i&&a.delete(i);return await a.close(),Et(l,s)}}}function wn(e,t,n,r,o,s){let a=()=>new Date;return {create:async f=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let w,b,g={...f};if(o&&(g[o]=a()),s&&(g[s]=a()),f[n]){b=f[n],w=e.doc(b);let v=r?{...g,[r]:w.path}:g;await w.set(v);}else {w=await e.add(g),b=w.id;let v={[n]:b};r&&(v[r]=w.path),await w.update(v);}let k=await w.get();return q(k.data())},set:async(...f)=>{let w=f[f.length-1],b=typeof w=="object"&&w!==null&&"merge"in w,g=b?f[f.length-2]:f[f.length-1],k=b?f.slice(0,-2):f.slice(0,-1),v=b?w:{merge:true},x={...g};s&&(x[s]=a());let y=t(...k),c=k[k.length-1];n&&c!=null&&(x[n]=c),r&&(x[r]=y.path),await y.set(x,v);let d=await y.get();return q(d.data())},update:async(...f)=>{let w=f.pop(),b=f,g={...w};s&&(g[s]=a());let k=t(...b);await k.update(g);let v=await k.get();return q(v.data())},delete:async(...f)=>{await t(...f).delete();}}}function Rn(e,t,n,r,o){let s={};return s.byList=async(a,l,i="in",u={})=>{if(l.length===0)return [];let m=[],f=fn(l,30);for(let w of f){let b=e;b=b.where(a,i,w),u.select&&u.select.length>0&&(b=b.select(...u.select.map(k=>String(k)))),(await b.get()).forEach(k=>{let v=q(k.data());m.push(u.returnDoc?{data:v,doc:k}:v);});}return m},t.forEach(a=>{let l=`by${pe(String(a))}`;s[l]=async(i,u={})=>{let m=typeof u=="boolean"?{returnDoc:u}:u;if(String(a)===o){let v=await r(i).get();if(!v.exists)return null;let x=q(v.data());return m.returnDoc?{data:x,doc:v}:x}let f=e;f=f.where(String(a),"==",i).limit(1),m.select&&m.select.length>0&&(f=f.select(...m.select.map(k=>String(k))));let w=await f.get();if(w.empty)return null;let b=w.docs[0];if(!b)return null;let g=q(b.data());return m.returnDoc?{data:g,doc:b}:g};}),s}function Sn(e,t,n,r){let o={},s=async(a,l)=>{if(!n||!r||l.length===0)return a;let i=l.map(u=>typeof u=="string"?{key:u}:{key:u.relation,select:u.select});return Promise.all(a.map(async u=>{let m=await Promise.all(i.map(async({key:w,select:b})=>{let g=n[w];if(!g)return [w,void 0];let k=r[g.repo];if(!k)return [w,void 0];let v=u[w];if(v==null)return [w,g.type==="one"?null:[]];let x=b?{select:b}:void 0;try{if(g.type==="one"){let y=`by${pe(g.key)}`,c=typeof k.get?.[y]=="function"?await k.get[y](v,x):null;return [w,c]}else {let y=`by${pe(g.key)}`,c=typeof k.query?.[y]=="function"?await k.query[y](v,x):[];return [w,c]}}catch(y){return console.error(`[include] Error populating "${w}":`,y),[w,g.type==="one"?null:[]]}})),f={};for(let[w,b]of m)w!==void 0&&(f[w]=b);return {...u,populated:f}}))};return t.forEach(a=>{let l=`by${pe(a)}`;o[l]=async(i,u={})=>{let m={...u,where:[[a,"==",i],...u.where??[]]};return (await Te(e,m)).docs.map(w=>q(w.data()))};}),o.by=async a=>(await Te(e,a)).docs.map(i=>q(i.data())),o.getAll=async(a={})=>(await Te(e,a)).docs.map(i=>q(i.data())),o.onSnapshot=(a,l,i)=>ge(e,a).onSnapshot(m=>{l(m.docs.map(f=>q(f.data())));},i),o.paginate=async a=>{let{include:l,...i}=a,u=await st(e,i);if(l&&l.length>0){let m=await s(u.data,l);return {...u,data:m}}return u},o.paginateAll=async function*(a){let{include:l,...i}=a;for await(let u of Ct(e,i))if(l&&l.length>0){let m=await s(u.data,l);yield {...u,data:m};}else yield u;},o}function kn(e,t){return {populate:async(n,r)=>{if(!e.relationalKeys)return {...n,populated:{}};let o,s={};if(typeof r=="object"&&!Array.isArray(r))if("relation"in r){let i=r;o=[i.relation],i.select&&(s[i.relation]=i.select);}else if("relations"in r){let i=r;o=Array.isArray(i.relations)?i.relations:[i.relations],s=i.select??{};}else o=[];else o=Array.isArray(r)?r:[r];let a=await Promise.all(o.map(async i=>{let u=e.relationalKeys?.[i];if(!u)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let m=t[u.repo];if(!m)return console.warn(`[populate] Repository "${u.repo}" not found in mapping`),[i,void 0];let f=n[i];if(f==null)return [i,u.type==="one"?null:[]];let w=s[i],b=w?{select:w}:void 0;try{if(u.type==="one"){let g=`by${pe(u.key)}`,k=typeof m.get?.[g]=="function"?await m.get[g](f,b):null;return [i,k]}else {let g=`by${pe(u.key)}`,k=typeof m.query?.[g]=="function"?await m.query[g](f,b):[];return [i,k]}}catch(g){return console.error(`[populate] Error populating "${i}":`,g),[i,u.type==="one"?null:[]]}})),l={};for(let[i,u]of a)u!==void 0&&(l[i]=u);return {...n,populated:l}}}}var Xr=new Set([4,8,10,13,14]);function Tn(e,t,n,r,o,s){let a=()=>new Date;return {backfillKeys:async(i={})=>{let{overwriteCreated:u=false,touchUpdated:m=true,overwritePath:f=false,pageSize:w=300,dryRun:b=false,maxAttempts:g=5,onError:k,onSuccess:v}=i,x=[],y=0,c=0,d=0,p=b?null:e.bulkWriter();p&&(p.onWriteError(R=>{let S=R?.code;if(R.failedAttempts<g&&S!==void 0&&Xr.has(S))return true;let E={path:R?.documentRef?.path??"(unknown)",error:R};return x.push(E),k?.(E),false}),v&&p.onWriteResult(R=>v(R.path)));let h;for(;;){let R=t.orderBy(firestore.FieldPath.documentId());h&&(R=R.startAfter(h)),R=R.limit(w);let S=await R.get();if(S.empty)break;for(let E of S.docs){y++;let T=E.data(),O={};if(n&&T[n]==null&&(O[n]=E.id),r&&(f||T[r]==null)&&T[r]!==E.ref.path&&(O[r]=E.ref.path),o&&(u||T[o]==null)&&(O[o]=a()),m&&s&&T[s]==null&&(O[s]=a()),Object.keys(O).length===0){d++;continue}c++,p&&p.set(E.ref,O,{merge:true});}if(S.size<w)break;h=S.docs[S.docs.length-1];}return p&&await p.close(),{scanned:y,written:c,skipped:d,failures:x}}}}function Cn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),l=await r.get(a);return l.exists?q({...l.data(),docId:l.id}):null},set:(...s)=>{let a=s[s.length-1],l=typeof a=="object"&&a!==null&&"merge"in a,i=l?s[s.length-2]:s[s.length-1],u=l?s.slice(0,-2):s.slice(0,-1),m=l?a:{merge:true},f=t(...u);r.set(f,i,m);},update:(...s)=>{let a=s[s.length-1],l=s.slice(0,-1),i=t(...l);r.update(i,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function An(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 Yr(e){let t=[e?.documentKey,e?.pathKey,e?.createdKey,e?.updatedKey].filter(r=>typeof r=="string"),n=e?.history&&typeof e.history=="object"?e.history:void 0;return {schema:e?.schema,_systemKeys:t,_pathKey:e?.pathKey??null,_isGroup:!!e?.isGroup,_createdKey:e?.createdKey??null,_parentKeys:e?.isGroup?An(e?.refCb):[],relationalKeys:e?.relationalKeys,_historyConfig:n,_historySubcollection:n?.enabled?n.subcollection??"history":void 0,_collectionPath:typeof e?.path=="string"?e.path:null}}function pt(e,t){let n=Yr(e),r,o=()=>r??(r=t());return new Proxy(n,{get(s,a){return typeof a=="string"&&a in n?n[a]:o()[a]},has(s,a){return typeof a=="string"&&a in n?true:a in o()}})}function Pt(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...x)=>t.refCb(e,...x),a=Rn(r,t.foreignKeys,o,s,t.documentKey),l=Sn(r,t.queryKeys,t.relationalKeys,n),i=bn(r),u=wn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),m=xn(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),f=Cn(e,s),w=vn(e,t.createdKey,t.updatedKey),b=Tn(e,r,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),g=kn(t,n),k=t.history,v=k?.enabled?hn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(x=>typeof x=="string"),t.path??"(unknown)",k):null;return {ref:r,documentRef:s,get:a,query:l,aggregate:i,...u,batch:m,transaction:f,bulk:w,system:b,...g,...v?{history:v}:{},_historySubcollection:v?k?.subcollection??"history":void 0,_historyConfig:k,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(x=>typeof x=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?An(t.refCb):[],_createdKey:t.createdKey??null}}var eo="history";function to(e){let t=e&&typeof e.history=="object"&&e.history!==null?e.history:void 0,n=[e?.documentKey,e?.pathKey,e?.createdKey,e?.updatedKey].filter(r=>typeof r=="string");return {historyConfig:t,systemKeys:n,isGroup:!!e?.isGroup,collectionPath:typeof e?.path=="string"?e.path:null}}function no(e){return {historyConfig:e._historyConfig??(typeof e.history=="object"&&e.history!==null&&"enabled"in e.history?e.history:void 0),systemKeys:e._systemKeys??[],isGroup:!!e._isGroup,collectionPath:e.ref?.path??null}}function ro(e,t){return t?`${t}/{docId}`:(console.warn(`[HistoryTriggers] Cannot determine collection path for "${e}". Skipping.`),null)}function On(e,t){let{onDocumentWritten:n}=t.deps,r={},o=e?.rawMapping,s=o?Object.entries(o).map(([a,l])=>[a,to(l)]):Object.entries(e).map(([a,l])=>[a,no(l)]);for(let[a,l]of s){let i=l.historyConfig;if(!i?.enabled)continue;let u=i.subcollection??eo,m=i.ttl??t.defaults?.ttl,f=t.repos?.[a],w;if(l.isGroup){if(!f?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${a}". Provide a triggerPath in the history triggers repos override.`);continue}w=f.triggerPath;}else w=f?.triggerPath??ro(a,l.collectionPath);if(!w)continue;let b=l.systemKeys,g=b[0]??"docId",k=dt(i);r[`${a}_onHistory`]=n(w,async v=>{try{let x=v.data?.before?.data(),y=v.data?.after?.data(),c;if(!x&&y)c="create";else if(x&&!y)c="delete";else if(x&&y)c="update";else return;let d=String(y?.[g]??x?.[g]??v.params?.docId??v.data?.after?.id??v.data?.before?.id??"");if(!d)return;let p=at(x??{},y??{},{include:i.include,exclude:i.exclude,metaFields:k,systemKeys:b});if(c==="update"&&Object.keys(p).length===0)return;let h=ct(y??x??null,i),R=it({entityId:d,operation:c,changes:p,meta:h,config:i,ttlOverride:m}),S=v.data?.after?.ref??v.data?.before?.ref;if(!S)return;let E=S.collection(u);await lt(E,R,i,{repoName:a,docId:d,before:x??null,after:y??null});}catch(x){console.error(`[HistoryTriggers] Failed to record history for "${a}":`,x);}});}return r}function oo(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 so(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var oe=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,r)=>{console.error("[MiniRouter]",t),r.status(500).send("Internal Server Error");};}use(t){return this.middlewares.push(t),this}get(t,n){return this.addRoute("GET",t,n)}post(t,n){return this.addRoute("POST",t,n)}put(t,n){return this.addRoute("PUT",t,n)}patch(t,n){return this.addRoute("PATCH",t,n)}delete(t,n){return this.addRoute("DELETE",t,n)}onNotFound(t){return this.notFoundHandler=t,this}onError(t){return this.errorHandler=t,this}addRoute(t,n,r){let{pattern:o,paramNames:s}=oo(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=so(t),s=null,a={};for(let u of this.routes){if(u.method!==r)continue;let m=o.match(u.pattern);if(m){s=u,a={},u.paramNames.forEach((f,w)=>{a[f]=decodeURIComponent(m[w+1]??"");});break}}let l=Object.assign(t,{params:a}),i=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(l,n,i);}catch(u){this.errorHandler(u,t,n);}}async runMiddlewareChain(t,n,r){let o=0,s=async()=>{if(o<this.middlewares.length){let a=this.middlewares[o++];await a(t,n,s);}else await r(t,n);};await s();}};function ne(e,t,n){let r=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let a=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",l=n??process.env.FUNCTION_REGION??"us-central1",i=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${a}/${l}/${i}${r}`}let o=process.env.K_SERVICE,s=e?.hostname??e?.headers?.host??"";return o&&typeof s=="string"&&s.includes("cloudfunctions.net")?`/${o.toLowerCase()}${r}`:r}function $n(e){if(typeof e=="string")return e;if(Array.isArray(e)){let t=e[0];return typeof t=="string"?t:void 0}}function he(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Ue();var be="__sync_version";var co=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function uo(e){let t=e,n=false;for(;;){let r=L(t);if(!co.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var po={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Fn(e,t,n,r,o,s,a,l){for(let[i,u]of Object.entries(e)){let m=n?`${n}__${i}`:i;if(o.has(i)||o.has(m))continue;let{inner:f,nullable:w}=uo(u),b=L(f),g=r||w;if(b==="ZodObject"){let y=re(f);Fn(y,t,m,g,o,s,a,l);continue}let k=po[b]??"json",v=m===a||i===a,x=s[m]??s[i]??m;l.push({name:x,sqlType:t.mapType(k),nullable:v?false:g,isPrimaryKey:v});}}function ft(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),l=re(e),i=[];return Fn(l,t,"",false,a,s,r,i),i.some(u=>u.name===be)||i.push({name:be,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),i}function Nn(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(Nn)):e}var fo=32,yo=5e3;function jn(e,t,n,r=new WeakSet,o=0){if(o>fo){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>=yo)break;let l=t?`${t}__${s}`:s;a!=null&&typeof a=="object"&&!Array.isArray(a)&&!(a instanceof Date)&&!Buffer.isBuffer(a)&&!(a instanceof Uint8Array)&&typeof a.toDate!="function"&&!("latitude"in a&&"longitude"in a)?jn(a,l,n,r,o+1):n[l]=Nn(a);}r.delete(e);}function qe(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};jn(e,"",o);let s={};for(let[a,l]of Object.entries(o)){if(n.has(a))continue;let i=a.split("__")[0];if(i!==a&&n.has(i))continue;let u=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[u]=l;}return s}function fe(e,t,n){return `<!DOCTYPE html>
|
|
2
2
|
<html lang="en"><head>
|
|
3
3
|
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
4
4
|
<title>${e} \u2014 Sync Admin</title>
|
|
@@ -28,60 +28,60 @@
|
|
|
28
28
|
<nav><a href="${t}/">\u2190 Dashboard</a></nav>
|
|
29
29
|
<h1>${e}</h1>
|
|
30
30
|
${n}
|
|
31
|
-
</body></html>`}function ye(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Pe(e,t,n=200){e.status(n).set("Content-Type","application/json").send(JSON.stringify(t,null,2));}function
|
|
31
|
+
</body></html>`}function ye(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Pe(e,t,n=200){e.status(n).set("Content-Type","application/json").send(JSON.stringify(t,null,2));}function yt(e){return (e.headers?.accept??"").includes("application/json")}function Mn(e,t,n,r,o,s,a,l){let i=(o.basePath??"/").replace(/\/$/,"")||"",u=o.featuresFlag??{},m=e?.rawMapping,f=[];for(let b of Object.keys(e)){let g=s[b],k=m?pt(m[b],()=>e[b]):e[b];f.push({name:b,schema:k.schema??null,documentKey:k._systemKeys?.[0]??k.documentKey??"docId",tableName:g?.tableName??b,isGroup:!!k._isGroup,repoCfg:g,repo:k});}let w=new oe;if(o.auth)if(he(o.auth)){let b=o.auth;for(let g of b.routes){let k=`${i}${g.path}`;g.method==="GET"?w.get(k,g.handler):w.post(k,g.handler);}w.use(b.middleware);}else if(typeof o.auth=="function")w.use(o.auth);else {let b=o.auth.realm??"Sync Admin",g="Basic "+Buffer.from(`${o.auth.username}:${o.auth.password}`).toString("base64");w.use((k,v,x)=>{if((k.headers?.authorization??"")!==g){v.status(401).set("WWW-Authenticate",`Basic realm="${b}"`).set("Content-Type","text/plain").send("Unauthorized");return}x();});}return w.get(`${i}/`,(b,g)=>{let k=ne(b,i),v=f.map(c=>{let d=[];return u.healthCheck&&d.push(`<a class="btn" href="${k}/${c.name}/health">Health</a>`),u.manualSync&&d.push(`<a class="btn btn-primary" href="${k}/${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>
|
|
35
35
|
<td>${c.schema?"\u2713":"\u2717"}</td>
|
|
36
|
-
<td>${
|
|
36
|
+
<td>${d.join(" ")}</td>
|
|
37
37
|
</tr>`}).join(`
|
|
38
|
-
`),
|
|
38
|
+
`),x=u.configCheck?`<p style="margin-top:.5rem"><a class="btn" href="${k}/config-check">\u2699 Config Check</a></p>`:"",y=fe("Sync Dashboard",k,`<div class="card">
|
|
39
39
|
<table>
|
|
40
40
|
<thead><tr><th>Repository</th><th>Table</th><th>Type</th><th>Schema</th><th>Actions</th></tr></thead>
|
|
41
41
|
<tbody>${v}</tbody>
|
|
42
42
|
</table>
|
|
43
|
-
${
|
|
44
|
-
</div>`);ye(
|
|
45
|
-
`)
|
|
46
|
-
`),
|
|
47
|
-
<p>Table: <code>${v.tableName}</code> ${c?
|
|
48
|
-
${
|
|
43
|
+
${x}
|
|
44
|
+
</div>`);ye(g,y);}),w.get(`${i}`,(b,g)=>{let k=ne(b,i);g.status(302).set("Location",`${k}/`).send("");}),u.healthCheck&&w.get(`${i}/:repoName/health`,async(b,g)=>{let k=ne(b,i),v=f.find(C=>C.name===b.params.repoName);if(!v){ye(g,fe("Not Found",k,`<p>Unknown repo: ${b.params.repoName}</p>`),404);return}if(!v.schema){ye(g,fe("Health Check",k,`<p class="badge badge-warn">No Zod schema attached to "${v.name}"</p>`));return}let x=ft(v.schema,t.dialect,{primaryKey:v.documentKey,exclude:v.repoCfg?.exclude,columnMap:v.repoCfg?.columnMap}),y=[],c=false,d=null;try{c=await t.tableExists(v.tableName),c&&(y=await t.getTableColumns(v.tableName));}catch(C){d=C?.message??String(C);}let p=new Set(y),h=new Set(x.map(C=>C.name)),R=x.filter(C=>!p.has(C.name)),S=y.filter(C=>!h.has(C)),E=x.filter(C=>p.has(C.name)),T=c&&R.length===0&&!d;if(yt(b)){Pe(g,{repo:v.name,table:v.tableName,tableExists:c,healthy:T,error:d,columns:{expected:x.map(C=>({name:C.name,type:C.sqlType,nullable:C.nullable,isPrimaryKey:C.isPrimaryKey})),actual:y,matched:E.map(C=>C.name),missing:R.map(C=>({name:C.name,type:C.sqlType})),extra:S}});return}let O=T?'<span class="badge badge-ok">Healthy</span>':'<span class="badge badge-err">Unhealthy</span>',A=x.map(C=>{let I=p.has(C.name)?'<span class="badge badge-ok">OK</span>':'<span class="badge badge-err">MISSING</span>';return `<tr><td>${C.name}</td><td>${C.sqlType}</td><td>${C.nullable?"Yes":"No"}</td><td>${C.isPrimaryKey?"\u2713":""}</td><td>${I}</td></tr>`}).join(`
|
|
45
|
+
`),$=S.map(C=>`<tr><td>${C}</td><td colspan="3" class="muted">not in schema</td><td><span class="badge badge-warn">EXTRA</span></td></tr>`).join(`
|
|
46
|
+
`),P=fe(`Health: ${v.name}`,k,`<div class="card">
|
|
47
|
+
<p>Table: <code>${v.tableName}</code> ${c?O:'<span class="badge badge-err">NOT FOUND</span>'}</p>
|
|
48
|
+
${d?`<p class="badge badge-err">Error: ${d}</p>`:""}
|
|
49
49
|
<h2>Columns</h2>
|
|
50
50
|
<table>
|
|
51
51
|
<thead><tr><th>Column</th><th>SQL Type</th><th>Nullable</th><th>PK</th><th>Status</th></tr></thead>
|
|
52
|
-
<tbody>${
|
|
52
|
+
<tbody>${A}${$}</tbody>
|
|
53
53
|
</table>
|
|
54
|
-
</div>`);ye(
|
|
54
|
+
</div>`);ye(g,P);}),u.manualSync&&(w.get(`${i}/:repoName/force-sync`,(b,g)=>{let k=ne(b,i),v=f.find(y=>y.name===b.params.repoName);if(!v){ye(g,fe("Not Found",k,`<p>Unknown repo: ${b.params.repoName}</p>`),404);return}let x=fe(`Force Sync: ${v.name}`,k,`<div class="card">
|
|
55
55
|
<p>This will read <strong>all</strong> documents from the <code>${v.name}</code> Firestore collection
|
|
56
56
|
and upsert them into the <code>${v.tableName}</code> SQL table.</p>
|
|
57
57
|
<p class="muted" style="margin:.75rem 0">This may take a while for large collections.</p>
|
|
58
|
-
<form method="POST" action="${
|
|
58
|
+
<form method="POST" action="${k}/${v.name}/force-sync">
|
|
59
59
|
<button type="submit" class="btn btn-primary">Start Force Sync</button>
|
|
60
60
|
</form>
|
|
61
|
-
</div>`);ye(x
|
|
62
|
-
<p class="badge badge-err">Error: ${
|
|
63
|
-
<p>Synced ${
|
|
64
|
-
</div>`),500);return}if(
|
|
65
|
-
<pre style="white-space:pre-wrap">${
|
|
61
|
+
</div>`);ye(g,x);}),w.post(`${i}/:repoName/force-sync`,async(b,g)=>{let k=ne(b,i),v=f.find(T=>T.name===b.params.repoName);if(!v){Pe(g,{error:`Unknown repo: ${b.params.repoName}`},404);return}let x=v.repo.ref;if(!x){Pe(g,{error:`No collection reference for "${v.name}"`},400);return}let y=0,c=0,d=[],p=500,h=x.limit(p),R=null;try{for(;;){let A=await(R?h.startAfter(R):h).get();if(A.empty)break;for(let $ of A.docs){let P=$.data(),C=String(P[v.documentKey]??$.id),I=qe(P,{exclude:v.repoCfg?.exclude,columnMap:v.repoCfg?.columnMap});try{await r({operation:"UPSERT",repoName:v.name,docId:C,data:I,timestamp:new Date().toISOString()}),y++;}catch(N){c++;let F=N?.message??String(N);console.error(`[ForceSync:${v.name}] doc=${C} failed:`,N),d.length<5&&d.push(`${C}: ${F}`);}}if(R=A.docs[A.docs.length-1],A.docs.length<p)break}let T=n.get(v.name);T&&await T.flush();}catch(T){if(yt(b)){Pe(g,{error:T?.message??String(T),synced:y,errors:c},500);return}ye(g,fe(`Force Sync: ${v.name}`,k,`<div class="card">
|
|
62
|
+
<p class="badge badge-err">Error: ${T?.message??String(T)}</p>
|
|
63
|
+
<p>Synced ${y} docs before failure (${c} errors).</p>
|
|
64
|
+
</div>`),500);return}if(yt(b)){Pe(g,{repo:v.name,table:v.tableName,synced:y,errors:c,...d.length>0&&{errorSamples:d}});return}let S=d.length>0?`<details style="margin-top:1rem"><summary>First ${d.length} error(s)</summary>
|
|
65
|
+
<pre style="white-space:pre-wrap">${d.map(T=>T.replace(/[<>&]/g,O=>`&#${O.charCodeAt(0)};`)).join(`
|
|
66
66
|
|
|
67
|
-
`)}</pre></details>`:"",
|
|
67
|
+
`)}</pre></details>`:"",E=fe(`Force Sync: ${v.name}`,k,`<div class="card">
|
|
68
68
|
<p class="badge ${c>0?"badge-warn":"badge-ok"}">${c>0?"Completed with errors":"Complete"}</p>
|
|
69
|
-
<p>Synced <strong>${
|
|
69
|
+
<p>Synced <strong>${y}</strong> documents to <code>${v.tableName}</code>.</p>
|
|
70
70
|
${c>0?`<p class="badge badge-warn">${c} error(s)</p>`:""}
|
|
71
|
-
${
|
|
72
|
-
</div>`);ye(
|
|
73
|
-
`),console:`${
|
|
74
|
-
<td>${
|
|
75
|
-
<td><strong>${
|
|
71
|
+
${S}
|
|
72
|
+
</div>`);ye(g,E);})),u.configCheck&&w.get(`${i}/config-check`,async(b,g)=>{let k=ne(b,i),v=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??process.env.GCP_PROJECT??"unknown",x="https://console.cloud.google.com",y=l??"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 O=T?.message??String(T),A=O.toLowerCase(),$=A.includes("disabled")||A.includes("has not been used")||A.includes("accessnotconfigured"),P=A.includes("permission")||O.includes("403")||A.includes("access denied"),C=A.includes("project")&&A.includes("not found"),I=A.includes("not found")||O.includes("404");$?c.push({name:"BigQuery API",category:"bigquery",status:"error",message:"BigQuery API is not enabled",fix:{gcloud:`gcloud services enable bigquery.googleapis.com --project=${v}`,console:`${x}/apis/library/bigquery.googleapis.com?project=${v}`}}):C?c.push({name:"BigQuery Project",category:"bigquery",status:"error",message:O,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:`${x}/home/dashboard`}}):P?c.push({name:"BigQuery API",category:"bigquery",status:"error",message:`Permission denied: ${O}`,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=${v})`,`gcloud projects add-iam-policy-binding ${v} --member="serviceAccount:$SA" --role="roles/bigquery.dataEditor"`,`gcloud projects add-iam-policy-binding ${v} --member="serviceAccount:$SA" --role="roles/bigquery.jobUser"`].join(`
|
|
73
|
+
`),console:`${x}/iam-admin/iam?project=${v}`}}):I?c.push({name:"BigQuery Dataset",category:"bigquery",status:"error",message:`Dataset not found: ${O}`,fix:{hint:"Create the dataset first",gcloud:`bq mk --dataset ${v}:YOUR_DATASET_ID`,console:`${x}/bigquery?project=${v}`}}):c.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable (table lookup returned expected error)"});}for(let T of f)try{let O=await t.tableExists(T.tableName);c.push({name:`Table: ${T.tableName}`,category:"bigquery",status:O?"ok":"warn",message:O?`Table \`${T.tableName}\` exists`:`Table \`${T.tableName}\` does not exist yet`,...!O&&{fix:{hint:"Table will be auto-created on first sync if autoMigrate is enabled. Or create it manually."}}});}catch(O){c.push({name:`Table: ${T.tableName}`,category:"bigquery",status:"error",message:O?.message??String(O)});}if(a)for(let T of f){let O=`${y}-${T.name}`;try{let A=a.topic(O);if(typeof A.exists=="function"){let[$]=await A.exists();c.push({name:`Topic: ${O}`,category:"pubsub",status:$?"ok":"error",message:$?`Topic \`${O}\` exists`:`Topic \`${O}\` does not exist`,...!$&&{fix:{gcloud:`gcloud pubsub topics create ${O} --project=${v}`,console:`${x}/cloudpubsub/topic/list?project=${v}`}}});}else c.push({name:`Topic: ${O}`,category:"pubsub",status:"warn",message:"Cannot verify topic existence (PubSub client doesn't expose .exists())",fix:{gcloud:`gcloud pubsub topics create ${O} --project=${v}`,console:`${x}/cloudpubsub/topic/list?project=${v}`,hint:"Ensure the topic exists. It is auto-created by the Firebase emulator but must exist in production."}});}catch(A){let $=A?.message??String(A),P=$.includes("disabled")||$.includes("has not been used");if(c.push({name:P?"Pub/Sub API":`Topic: ${O}`,category:"pubsub",status:"error",message:P?"Pub/Sub API is not enabled":$,fix:P?{gcloud:`gcloud services enable pubsub.googleapis.com --project=${v}`,console:`${x}/apis/library/pubsub.googleapis.com?project=${v}`}:{gcloud:`gcloud pubsub topics create ${O} --project=${v}`,console:`${x}/cloudpubsub/topic/list?project=${v}`}}),P)break}}else c.push({name:"Pub/Sub Client",category:"pubsub",status:"warn",message:"PubSub client not available for config check"});if(yt(b)){let T=c.every(O=>O.status==="ok");Pe(g,{project:v,healthy:T,checks:c});return}let d=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>',p={bigquery:c.filter(T=>T.category==="bigquery"),pubsub:c.filter(T=>T.category==="pubsub"),firestore:c.filter(T=>T.category==="firestore")},h=(T,O)=>{if(O.length===0)return "";let A=O.map($=>{let P="";if($.fix){let C=[];$.fix.hint&&C.push(`<p class="muted">${$.fix.hint}</p>`),$.fix.gcloud&&C.push(`<pre>$ ${$.fix.gcloud}</pre>`),$.fix.console&&C.push(`<p><a href="${$.fix.console}" target="_blank">Open GCP Console \u2192</a></p>`),P=`<div style="margin-top:.5rem">${C.join("")}</div>`;}return `<tr>
|
|
74
|
+
<td>${d($.status)}</td>
|
|
75
|
+
<td><strong>${$.name}</strong><br><span class="muted">${$.message}</span>${P}</td>
|
|
76
76
|
</tr>`}).join(`
|
|
77
|
-
`);return `<h2>${
|
|
77
|
+
`);return `<h2>${T}</h2>
|
|
78
78
|
<table><thead><tr><th style="width:80px">Status</th><th>Check</th></tr></thead>
|
|
79
|
-
<tbody>${
|
|
80
|
-
<p>Project: <code>${v}</code> ${
|
|
81
|
-
${
|
|
82
|
-
${
|
|
83
|
-
${
|
|
84
|
-
</div>`);ye(x,S);}),async(g,x)=>{await d.handle(g,x);}}var uo="firestore-sync";function po(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 jn(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,a=t?.topicPrefix??uo,l={},i=new Map;function u(d){let g=i.get(d);return g||(g=s.topic(d),i.set(d,g),g)}async function y(d,g){await u(d).publishMessage({json:g});}for(let[d,g]of Object.entries(e)){let x=t?.repos?.[d],b;if(g._isGroup){if(!x?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${d}". Provide a triggerPath in the sync repos config for group collections.`);continue}b=x.triggerPath;}else b=x?.triggerPath??po(d,g);if(!b)continue;let v=g._systemKeys?.[0]??"docId",k=`${a}-${d}`;l[`${d}_onCreate`]=n(b,async w=>{let c=w.data;if(!c)return;let f=c.data();if(!f)return;let m=String(f[v]??c.id),p=Ke(f,{exclude:x?.exclude,columnMap:x?.columnMap}),h={operation:"INSERT",repoName:d,docId:m,data:p,timestamp:new Date().toISOString(),version:Date.now()};await y(k,h);}),l[`${d}_onUpdate`]=r(b,async w=>{let c=w.data?.after;if(!c)return;let f=c.data();if(!f)return;let m=String(f[v]??c.id),p=Ke(f,{exclude:x?.exclude,columnMap:x?.columnMap}),h={operation:"UPSERT",repoName:d,docId:m,data:p,timestamp:new Date().toISOString(),version:Date.now()};await y(k,h);}),l[`${d}_onDelete`]=o(b,async w=>{let c=w.data;if(!c)return;let f=c.data(),m=String(f?.[v]??c.id),p={operation:"DELETE",repoName:d,docId:m,data:null,timestamp:new Date().toISOString(),version:Date.now()};await y(k,p);});}return l}function Mn(e){let t=e.toUpperCase();switch(t){case "INTEGER":return "INT64";case "FLOAT":return "FLOAT64";case "BOOLEAN":return "BOOL";default:return t}}function Hn(e,t){let n=Mn(e),r=Mn(t);return n===r?true:{INT64:["NUMERIC","BIGNUMERIC","FLOAT64"],NUMERIC:["BIGNUMERIC","FLOAT64"],DATE:["DATETIME","TIMESTAMP"],DATETIME:["TIMESTAMP"]}[n]?.includes(r)??false}var yt=class{constructor(t){this.buffer=[];this.flushing=false;this.flushPromise=null;this.timer=null;this.adapter=t.adapter,this.tableName=t.tableName,this.primaryKey=t.primaryKey,this.batchSize=t.batchSize??100,this.onFlushError=t.onFlushError;let n=t.flushIntervalMs??5e3;n>0&&(this.timer=setInterval(()=>{this.flush();},n),typeof this.timer=="object"&&"unref"in this.timer&&this.timer.unref());}get size(){return this.buffer.length}enqueue(...t){this.buffer.push(...t),this.buffer.length>=this.batchSize&&this.flush();}async flush(){for(;this.flushPromise;)await this.flushPromise;this.buffer.length!==0&&(this.flushing=true,this.flushPromise=this._drain().finally(()=>{this.flushing=false,this.flushPromise=null;}),await this.flushPromise);}async _drain(){for(;this.buffer.length>0&&await this._doFlush(););}async _doFlush(){let t=this.buffer.splice(0,this.batchSize);try{let n=new Map,r=[];for(let s of t)if(s.operation==="DELETE")r.push(s.docId),n.delete(s.docId);else if(s.data){let a=n.get(s.docId);if(!a)n.set(s.docId,s.data);else {let l=Number(a[be]??0);Number(s.data[be]??0)>=l&&n.set(s.docId,s.data);}}let o=Array.from(n.values());o.length>0&&await this.adapter.upsertRows(this.tableName,o,this.primaryKey),r.length>0&&await this.adapter.deleteRows(this.tableName,this.primaryKey,r);}catch(n){if(this.onFlushError)await this.onFlushError(t,n);else return this.buffer.unshift(...t),console.error(`[SyncQueue] Flush failed for ${this.tableName}:`,n),false}return true}async shutdown(){this.timer&&(clearInterval(this.timer),this.timer=null),await this.flush();}};var Bn=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 fo(e,t,n,r,o,s,a){if(Bn.has(e))return;let l=pt(n,t.dialect,{primaryKey:o,exclude:s,columnMap:a});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:l});else if(t.getTableColumnsWithTypes){let u=await t.getTableColumnsWithTypes(r),y=[];for(let d of l){let g=u.get(d.name);if(g===void 0){y.push(d);continue}if(t.dialect.name==="bigquery"&&!Hn(g,d.sqlType))throw new Pt(r,d.name,g,d.sqlType)}y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}else {let u=new Set(await t.getTableColumns(r)),y=l.filter(d=>!u.has(d.name));y.length>0&&(await t.addColumns(r,y),await t.onSchemaChange?.(r));}Bn.add(e);}function zn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:a=false,topicPrefix:l="firestore-sync",maxDlqAttempts:i=5,workerOptions:u,repos:y={}}=t,d=new Map;function g(v,k){let w=d.get(v);if(w)return w;let f=y[v]?.tableName??v,m=`${l}-${v}-dlq`,p=n.pubsub.topic(m),h=false,R=async()=>{if(!h){try{await p.create(),console.info(`[SyncWorker] Created DLQ topic "${m}"`);}catch(C){if(C?.code!==6)throw C}h=true;}},S=async(C,T)=>{console.error(`[SyncWorker] Flush failed for "${v}" (${C.length} events):`,T),await R(),await Promise.all(C.map(O=>{let A=(O.attempts??0)+1;if(i>0&&A>i)return console.error(`[SyncWorker] Dropping event for "${v}" after ${A-1} DLQ attempts:`,{docId:O.docId,operation:O.operation}),Promise.resolve();let E={...O,attempts:A,firstFailedAt:O.firstFailedAt??Date.now()};return p.publishMessage({json:E})}));};return w=new yt({adapter:r,tableName:f,primaryKey:k,batchSize:o,flushIntervalMs:s,onFlushError:S}),d.set(v,w),w}async function x(v){let{repoName:k}=v,w=e[k];if(!w){console.warn(`[SyncWorker] Unknown repo "${k}", skipping event`);return}let c=w._systemKeys?.[0]??w.documentKey??"docId",f=y[k],m=f?.columnMap,p=m?.[c]??c;if(a){let R=w.schema??void 0;if(R){let S=f?.tableName??k;await fo(k,r,R,S,c,f?.exclude,m);}}let h=g(k,p);v.data&&(v.data[be]=v.version??Date.now()),h.enqueue(v);}function b(v){let k=async w=>{let c=w.data?.message?.json??w.data?.json;if(!c){console.warn("[SyncWorker] Received empty PubSub message");return}await x(c);let f=d.get(c.repoName);f&&await f.flush();};return u?n.pubsubHandler.onMessagePublished({topic:v,...u},k):n.pubsubHandler.onMessagePublished(v,k)}return {handleMessage:x,createHandler:b,queues:d,async shutdown(){let v=[];for(let k of d.values())v.push(k.shutdown());await Promise.all(v);}}}var yo="firestore-sync";function Zn(e){if(typeof e!="function")return e;let t=e,n;return new Proxy({},{get(r,o){return n||(n=t()),n[o]},has(r,o){return n||(n=t()),o in n}})}function Ln(e,t){let{deps:n,adapter:r,topicPrefix:o=yo,batchSize:s,flushIntervalMs:a,autoMigrate:l,admin:i,workerOptions:u,repos:y}=t,d=Zn(n.pubsub),g=Zn(r),x=jn(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:d},topicPrefix:o,repos:y}),b=zn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:d},adapter:g,batchSize:s,flushIntervalMs:a,autoMigrate:l,topicPrefix:o,workerOptions:u,repos:y}),v={};for(let c of Object.keys(e))v[`sync_${c}`]=b.createHandler(`${o}-${c}`);let k=null;i&&(k=Nn(e,g,b.queues,b.handleMessage,i,y??{},d,o),v.adminsync=i.onRequest?i.httpsOptions?i.onRequest(i.httpsOptions,k):i.onRequest(k):k);let w={functions:{...x,...v},adminHandler:k,handleMessage:b.handleMessage,queues:b.queues,shutdown:b.shutdown};for(let c of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(w,c,{enumerable:false});return w}qe();qe();function mo(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Un(e){let t=e,n=true,r=false,o;for(;;){let s=U(t);if(s==="ZodOptional")n=false,t=G(t);else if(s==="ZodNullable")n=false,r=true,t=G(t);else if(s==="ZodDefault")n=false,o=En(t),t=G(t);else if(s==="ZodEffects"||s==="ZodPipe"||s==="ZodTransform"){let a=On(t);if(!a)break;t=a;}else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function le(e,t=""){if(U(e)==="ZodObject"){let r=re(e);return Object.entries(r).map(([o,s])=>qn(t?`${t}.${o}`:o,o,s))}return [qn(t||"value",t||"value",e)]}function qn(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=Un(n),l=U(r),i=mo(t.split(".").pop()??t);switch(l){case "ZodString":{let u=Dn(r),y=u.includes("email"),d=u.includes("url");return {name:e,label:i,type:"text",required:o,nullable:s,defaultValue:a,hint:y?"email":d?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:i,type:"number",required:o,nullable:s,defaultValue:a};case "ZodBoolean":return {name:e,label:i,type:"checkbox",required:o,nullable:s,defaultValue:a};case "ZodDate":case "ZodCoerce":return {name:e,label:i,type:"datetime-local",required:o,nullable:s,defaultValue:a};case "ZodEnum":{let u=Ze(r);return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:u}}case "ZodNativeEnum":{let u=Le(r),y=Object.values(u).filter(d=>typeof d=="string");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:y}}case "ZodLiteral":{let u=String(Ue(r)??"");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:[u]}}case "ZodUnion":{let u=Pn(r);if(u.length>0&&u.every(d=>U(d)==="ZodLiteral")){let d=u.map(g=>String(Ue(g)??""));return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:d}}return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}case "ZodObject":{let u=le(r,e);return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,nested:u,hint:"JSON object"}}case "ZodArray":{let u=$n(r);if(!u)return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:y}=Un(u),d=U(y),g,x,b;switch(d){case "ZodString":g="text";break;case "ZodNumber":case "ZodBigInt":g="number";break;case "ZodBoolean":g="checkbox";break;case "ZodDate":g="datetime-local";break;case "ZodEnum":g="select",x=Ze(y);break;case "ZodNativeEnum":g="select",x=Object.values(Le(y)).filter(v=>typeof v=="string");break;case "ZodObject":g="object",b=le(y);break;default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"}}return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,arrayElementType:g,arrayElementOptions:x,arrayElementFields:b}}default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function Dt(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.name,s=e.required?" required":"",a=e.defaultValue==="__null__",l=!a&&e.defaultValue!=null?String(e.defaultValue):"",i=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
|
|
79
|
+
<tbody>${A}</tbody></table>`},S=c.every(T=>T.status==="ok")?'<span class="badge badge-ok">All checks passed</span>':'<span class="badge badge-warn">Some issues found</span>',E=fe("Config Check",k,`<div class="card">
|
|
80
|
+
<p>Project: <code>${v}</code> ${S}</p>
|
|
81
|
+
${h("BigQuery",p.bigquery)}
|
|
82
|
+
${h("Pub/Sub",p.pubsub)}
|
|
83
|
+
${h("Firestore",p.firestore)}
|
|
84
|
+
</div>`);ye(g,E);}),async(b,g)=>{await w.handle(b,g);}}var mo="firestore-sync";function go(e,t){return t?`${t}/{docId}`:(console.warn(`[SyncTriggers] Cannot determine collection path for "${e}". Skipping.`),null)}function ho(e){let t=[e?.documentKey,e?.pathKey,e?.createdKey,e?.updatedKey].filter(n=>typeof n=="string");return {isGroup:!!e?.isGroup,documentKey:t[0]??"docId",collectionPath:typeof e?.path=="string"?e.path:null}}function bo(e){return {isGroup:!!e?._isGroup,documentKey:e?._systemKeys?.[0]??"docId",collectionPath:e?.ref?.path??null}}function Hn(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,a=t?.topicPrefix??mo,l={},i=new Map;function u(b){let g=i.get(b);return g||(g=s.topic(b),i.set(b,g),g)}async function m(b,g){await u(b).publishMessage({json:g});}let f=e?.rawMapping,w=f?Object.entries(f).map(([b,g])=>[b,ho(g)]):Object.entries(e).map(([b,g])=>[b,bo(g)]);for(let[b,g]of w){let k=t?.repos?.[b],v;if(g.isGroup){if(!k?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${b}". Provide a triggerPath in the sync repos config for group collections.`);continue}v=k.triggerPath;}else v=k?.triggerPath??go(b,g.collectionPath);if(!v)continue;let x=g.documentKey,y=`${a}-${b}`;l[`${b}_onCreate`]=n(v,async c=>{let d=c.data;if(!d)return;let p=d.data();if(!p)return;let h=String(p[x]??d.id),R=qe(p,{exclude:k?.exclude,columnMap:k?.columnMap}),S={operation:"INSERT",repoName:b,docId:h,data:R,timestamp:new Date().toISOString(),version:Date.now()};await m(y,S);}),l[`${b}_onUpdate`]=r(v,async c=>{let d=c.data?.after;if(!d)return;let p=d.data();if(!p)return;let h=String(p[x]??d.id),R=qe(p,{exclude:k?.exclude,columnMap:k?.columnMap}),S={operation:"UPSERT",repoName:b,docId:h,data:R,timestamp:new Date().toISOString(),version:Date.now()};await m(y,S);}),l[`${b}_onDelete`]=o(v,async c=>{let d=c.data;if(!d)return;let p=d.data(),h=String(p?.[x]??d.id),R={operation:"DELETE",repoName:b,docId:h,data:null,timestamp:new Date().toISOString(),version:Date.now()};await m(y,R);});}return l}function Bn(e){let t=e.toUpperCase();switch(t){case "INTEGER":return "INT64";case "FLOAT":return "FLOAT64";case "BOOLEAN":return "BOOL";default:return t}}function zn(e,t){let n=Bn(e),r=Bn(t);return n===r?true:{INT64:["NUMERIC","BIGNUMERIC","FLOAT64"],NUMERIC:["BIGNUMERIC","FLOAT64"],DATE:["DATETIME","TIMESTAMP"],DATETIME:["TIMESTAMP"]}[n]?.includes(r)??false}var mt=class{constructor(t){this.buffer=[];this.flushing=false;this.flushPromise=null;this.timer=null;this.adapter=t.adapter,this.tableName=t.tableName,this.primaryKey=t.primaryKey,this.batchSize=t.batchSize??100,this.onFlushError=t.onFlushError;let n=t.flushIntervalMs??5e3;n>0&&(this.timer=setInterval(()=>{this.flush();},n),typeof this.timer=="object"&&"unref"in this.timer&&this.timer.unref());}get size(){return this.buffer.length}enqueue(...t){this.buffer.push(...t),this.buffer.length>=this.batchSize&&this.flush();}async flush(){for(;this.flushPromise;)await this.flushPromise;this.buffer.length!==0&&(this.flushing=true,this.flushPromise=this._drain().finally(()=>{this.flushing=false,this.flushPromise=null;}),await this.flushPromise);}async _drain(){for(;this.buffer.length>0&&await this._doFlush(););}async _doFlush(){let t=this.buffer.splice(0,this.batchSize);try{let n=new Map,r=[];for(let s of t)if(s.operation==="DELETE")r.push(s.docId),n.delete(s.docId);else if(s.data){let a=n.get(s.docId);if(!a)n.set(s.docId,s.data);else {let l=Number(a[be]??0);Number(s.data[be]??0)>=l&&n.set(s.docId,s.data);}}let o=Array.from(n.values());o.length>0&&await this.adapter.upsertRows(this.tableName,o,this.primaryKey),r.length>0&&await this.adapter.deleteRows(this.tableName,this.primaryKey,r);}catch(n){if(this.onFlushError)await this.onFlushError(t,n);else return this.buffer.unshift(...t),console.error(`[SyncQueue] Flush failed for ${this.tableName}:`,n),false}return true}async shutdown(){this.timer&&(clearInterval(this.timer),this.timer=null),await this.flush();}};var Zn=new Set,Dt=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 xo(e,t,n,r,o,s,a){if(Zn.has(e))return;let l=ft(n,t.dialect,{primaryKey:o,exclude:s,columnMap:a});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:l});else if(t.getTableColumnsWithTypes){let u=await t.getTableColumnsWithTypes(r),m=[];for(let f of l){let w=u.get(f.name);if(w===void 0){m.push(f);continue}if(t.dialect.name==="bigquery"&&!zn(w,f.sqlType))throw new Dt(r,f.name,w,f.sqlType)}m.length>0&&(await t.addColumns(r,m),await t.onSchemaChange?.(r));}else {let u=new Set(await t.getTableColumns(r)),m=l.filter(f=>!u.has(f.name));m.length>0&&(await t.addColumns(r,m),await t.onSchemaChange?.(r));}Zn.add(e);}function Kn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:a=false,topicPrefix:l="firestore-sync",maxDlqAttempts:i=5,workerOptions:u,repos:m={}}=t,f=new Map;function w(k,v){let x=f.get(k);if(x)return x;let c=m[k]?.tableName??k,d=`${l}-${k}-dlq`,p=n.pubsub.topic(d),h=false,R=async()=>{if(!h){try{await p.create(),console.info(`[SyncWorker] Created DLQ topic "${d}"`);}catch(E){if(E?.code!==6)throw E}h=true;}},S=async(E,T)=>{console.error(`[SyncWorker] Flush failed for "${k}" (${E.length} events):`,T),await R(),await Promise.all(E.map(O=>{let A=(O.attempts??0)+1;if(i>0&&A>i)return console.error(`[SyncWorker] Dropping event for "${k}" after ${A-1} DLQ attempts:`,{docId:O.docId,operation:O.operation}),Promise.resolve();let $={...O,attempts:A,firstFailedAt:O.firstFailedAt??Date.now()};return p.publishMessage({json:$})}));};return x=new mt({adapter:r,tableName:c,primaryKey:v,batchSize:o,flushIntervalMs:s,onFlushError:S}),f.set(k,x),x}async function b(k){let{repoName:v}=k,x=e[v];if(!x){console.warn(`[SyncWorker] Unknown repo "${v}", skipping event`);return}let y=x._systemKeys?.[0]??x.documentKey??"docId",c=m[v],d=c?.columnMap,p=d?.[y]??y;if(a){let R=x.schema??void 0;if(R){let S=c?.tableName??v;await xo(v,r,R,S,y,c?.exclude,d);}}let h=w(v,p);k.data&&(k.data[be]=k.version??Date.now()),h.enqueue(k);}function g(k){let v=async x=>{let y=x.data?.message?.json??x.data?.json;if(!y){console.warn("[SyncWorker] Received empty PubSub message");return}await b(y);let c=f.get(y.repoName);c&&await c.flush();};return u?n.pubsubHandler.onMessagePublished({topic:k,...u},v):n.pubsubHandler.onMessagePublished(k,v)}return {handleMessage:b,createHandler:g,queues:f,async shutdown(){let k=[];for(let v of f.values())k.push(v.shutdown());await Promise.all(k);}}}var vo="firestore-sync";function Ln(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 Un(e,t){let{deps:n,adapter:r,topicPrefix:o=vo,batchSize:s,flushIntervalMs:a,autoMigrate:l,admin:i,workerOptions:u,repos:m}=t,f=Ln(n.pubsub),w=Ln(r),b=Hn(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:f},topicPrefix:o,repos:m}),g=Kn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:f},adapter:w,batchSize:s,flushIntervalMs:a,autoMigrate:l,topicPrefix:o,workerOptions:u,repos:m}),k={};for(let y of Object.keys(e))k[`sync_${y}`]=g.createHandler(`${o}-${y}`);let v=null;i&&(v=Mn(e,w,g.queues,g.handleMessage,i,m??{},f,o),k.adminsync=i.onRequest?i.httpsOptions?i.onRequest(i.httpsOptions,v):i.onRequest(v):v);let x={functions:{...b,...k},adminHandler:v,handleMessage:g.handleMessage,queues:g.queues,shutdown:g.shutdown};for(let y of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(x,y,{enumerable:false});return x}Ue();Ue();function wo(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function qn(e){let t=e,n=true,r=false,o;for(;;){let s=L(t);if(s==="ZodOptional")n=false,t=G(t);else if(s==="ZodNullable")n=false,r=true,t=G(t);else if(s==="ZodDefault")n=false,o=Dn(t),t=G(t);else if(s==="ZodEffects"||s==="ZodPipe"||s==="ZodTransform"){let a=En(t);if(!a)break;t=a;}else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function le(e,t=""){if(L(e)==="ZodObject"){let r=re(e);return Object.entries(r).map(([o,s])=>Qn(t?`${t}.${o}`:o,o,s))}return [Qn(t||"value",t||"value",e)]}function Qn(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=qn(n),l=L(r),i=wo(t.split(".").pop()??t);switch(l){case "ZodString":{let u=_n(r),m=u.includes("email"),f=u.includes("url");return {name:e,label:i,type:"text",required:o,nullable:s,defaultValue:a,hint:m?"email":f?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:i,type:"number",required:o,nullable:s,defaultValue:a};case "ZodBoolean":return {name:e,label:i,type:"checkbox",required:o,nullable:s,defaultValue:a};case "ZodDate":case "ZodCoerce":return {name:e,label:i,type:"datetime-local",required:o,nullable:s,defaultValue:a};case "ZodEnum":{let u=Ze(r);return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:u}}case "ZodNativeEnum":{let u=Ke(r),m=Object.values(u).filter(f=>typeof f=="string");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:m}}case "ZodLiteral":{let u=String(Le(r)??"");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:[u]}}case "ZodUnion":{let u=In(r);if(u.length>0&&u.every(f=>L(f)==="ZodLiteral")){let f=u.map(w=>String(Le(w)??""));return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:f}}return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}case "ZodObject":{let u=le(r,e);return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,nested:u,hint:"JSON object"}}case "ZodArray":{let u=Pn(r);if(!u)return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:m}=qn(u),f=L(m),w,b,g;switch(f){case "ZodString":w="text";break;case "ZodNumber":case "ZodBigInt":w="number";break;case "ZodBoolean":w="checkbox";break;case "ZodDate":w="datetime-local";break;case "ZodEnum":w="select",b=Ze(m);break;case "ZodNativeEnum":w="select",b=Object.values(Ke(m)).filter(k=>typeof k=="string");break;case "ZodObject":w="object",g=le(m);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:w,arrayElementOptions:b,arrayElementFields:g}}default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function It(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.name,s=e.required?" required":"",a=e.defaultValue==="__null__",l=!a&&e.defaultValue!=null?String(e.defaultValue):"",i=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
|
|
85
85
|
<input type="hidden" id="${r}__isnull" name="${o}__isnull" value="${a?"1":""}">
|
|
86
86
|
<label class="flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/40 hover:text-base-content/70 border border-base-300 rounded px-2 py-1">
|
|
87
87
|
<input type="checkbox" class="checkbox checkbox-xs" ${a?"checked":""}
|
|
@@ -93,59 +93,59 @@ ${n}
|
|
|
93
93
|
})(this)">
|
|
94
94
|
<span>null</span>
|
|
95
95
|
</label>
|
|
96
|
-
</span>`:"",u;switch(e.type){case "checkbox":if(e.nullable){let
|
|
96
|
+
</span>`:"",u;switch(e.type){case "checkbox":if(e.nullable){let m=a?"__null__":l==="true"?"true":l==="false"?"false":"__null__";return `
|
|
97
97
|
<div class="form-control mb-3 ${n}">
|
|
98
98
|
<label for="${r}" class="label pb-1">
|
|
99
99
|
<span class="label-text font-medium">
|
|
100
|
-
${
|
|
100
|
+
${j(e.label)}
|
|
101
101
|
<span class="text-base-content/40 text-xs ml-1">(nullable)</span>
|
|
102
102
|
</span>
|
|
103
103
|
</label>
|
|
104
104
|
<select id="${r}" name="${o}" class="select select-bordered select-sm w-full">
|
|
105
|
-
<option value="__null__"${
|
|
106
|
-
<option value="true"${
|
|
107
|
-
<option value="false"${
|
|
105
|
+
<option value="__null__"${m==="__null__"?" selected":""}>\u2014 null \u2014</option>
|
|
106
|
+
<option value="true"${m==="true"?" selected":""}>\u2713 true</option>
|
|
107
|
+
<option value="false"${m==="false"?" selected":""}>\u2717 false</option>
|
|
108
108
|
</select>
|
|
109
109
|
</div>`}return `
|
|
110
110
|
<div class="form-control ${n}">
|
|
111
111
|
<label class="label cursor-pointer justify-start gap-3">
|
|
112
112
|
<input type="checkbox" id="${r}" name="${o}" value="true"${l==="true"?" checked":""} class="checkbox checkbox-primary checkbox-sm">
|
|
113
113
|
<span class="label-text font-medium">
|
|
114
|
-
${
|
|
114
|
+
${j(e.label)}${e.required?' <span class="text-error">*</span>':""}
|
|
115
115
|
</span>
|
|
116
116
|
</label>
|
|
117
117
|
</div>`;case "select":u=`<select id="${r}" name="${o}"${s}${a?' disabled style="opacity:0.35"':""} class="select select-bordered select-sm w-full">
|
|
118
118
|
${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
|
|
119
|
-
${(e.options??[]).map(
|
|
119
|
+
${(e.options??[]).map(m=>`<option value="${j(m)}"${l===m?" selected":""}>${j(m)}</option>`).join(`
|
|
120
120
|
`)}
|
|
121
|
-
</select>`;break;case "textarea":if(e.arrayElementType)return
|
|
121
|
+
</select>`;break;case "textarea":if(e.arrayElementType)return Ro(e,t);if(e.nested&&e.nested.length>0){let m=e.nested.map(f=>It(f,t+1)).join(`
|
|
122
122
|
`);return `
|
|
123
123
|
<fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}">
|
|
124
124
|
<legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
|
|
125
|
-
${
|
|
125
|
+
${j(e.label)}${e.required?' <span class="text-error">*</span>':""}
|
|
126
126
|
</legend>
|
|
127
|
-
${
|
|
127
|
+
${m}
|
|
128
128
|
</fieldset>`}u=`<textarea id="${r}" name="${o}"${s} rows="3"${a?' disabled style="opacity:0.35"':""}
|
|
129
129
|
data-json
|
|
130
130
|
class="textarea textarea-bordered textarea-sm w-full font-mono text-xs"
|
|
131
|
-
placeholder="${
|
|
132
|
-
value="${
|
|
131
|
+
placeholder="${j(e.hint??"JSON")}">${j(l)}</textarea>`;break;default:u=`<input type="${e.type}" id="${r}" name="${o}"${s}${a?' disabled style="opacity:0.35"':""}
|
|
132
|
+
value="${j(l)}"
|
|
133
133
|
class="input input-bordered input-sm w-full"${e.hint==="email"?' autocomplete="email"':e.hint==="url"?' autocomplete="url"':""}>`;}return `
|
|
134
134
|
<div class="form-control mb-3 ${n}">
|
|
135
135
|
<label for="${r}" class="label pb-1">
|
|
136
136
|
<span class="label-text font-medium">
|
|
137
|
-
${
|
|
138
|
-
${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${
|
|
137
|
+
${j(e.label)}${e.required?' <span class="text-error">*</span>':""}
|
|
138
|
+
${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${j(e.hint)})</span>`:""}
|
|
139
139
|
</span>
|
|
140
140
|
</label>
|
|
141
141
|
<div class="flex items-center gap-2">
|
|
142
142
|
<div class="flex-1 min-w-0">${u}</div>
|
|
143
143
|
${i}
|
|
144
144
|
</div>
|
|
145
|
-
</div>`}function
|
|
146
|
-
`):a.map(
|
|
147
|
-
`),i=s?
|
|
148
|
-
<input type="hidden" id="${r}__isnull" name="${
|
|
145
|
+
</div>`}function j(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Ro(e,t){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.defaultValue==="__null__",s=e.arrayElementType==="object",a=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{a=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(a)||(a=[]);let l=s?a.map(m=>Wn(e,m??{})).join(`
|
|
146
|
+
`):a.map(m=>Vn(e,m)).join(`
|
|
147
|
+
`),i=s?Wn(e,{}):Vn(e,""),u=e.nullable?`<span class="flex items-center gap-1 mt-2">
|
|
148
|
+
<input type="hidden" id="${r}__isnull" name="${j(e.name)}__isnull" value="${o?"1":""}">
|
|
149
149
|
<label class="flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/40 hover:text-base-content/70 border border-base-300 rounded px-2 py-1">
|
|
150
150
|
<input type="checkbox" class="checkbox checkbox-xs" ${o?"checked":""}
|
|
151
151
|
onchange="(function(cb){
|
|
@@ -159,64 +159,64 @@ ${n}
|
|
|
159
159
|
</label>
|
|
160
160
|
</span>`:"";return `
|
|
161
161
|
<fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}"
|
|
162
|
-
data-frs-array="${
|
|
162
|
+
data-frs-array="${j(e.name)}" data-frs-array-type="${j(e.arrayElementType??"text")}">
|
|
163
163
|
<legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
|
|
164
|
-
${
|
|
164
|
+
${j(e.label)}${e.required?' <span class="text-error">*</span>':""}
|
|
165
165
|
</legend>
|
|
166
|
-
<input type="hidden" id="${r}" name="${
|
|
166
|
+
<input type="hidden" id="${r}" name="${j(e.name)}" value="${j(JSON.stringify(a))}"${o?" disabled":""}>
|
|
167
167
|
<div data-frs-array-items${o?' style="opacity:0.35"':""}>
|
|
168
168
|
${l}
|
|
169
169
|
</div>
|
|
170
170
|
<template data-frs-array-tpl>${i}</template>
|
|
171
171
|
<button type="button" class="btn btn-xs btn-outline mt-1" data-frs-array-add>+ Add</button>
|
|
172
172
|
${u}
|
|
173
|
-
</fieldset>`}function
|
|
173
|
+
</fieldset>`}function Vn(e,t){let n=t!=null?String(t):"",r;switch(e.arrayElementType){case "select":r=`<select data-frs-val class="select select-bordered select-sm flex-1">
|
|
174
174
|
<option value="">\u2014</option>
|
|
175
|
-
${(e.arrayElementOptions??[]).map(o=>`<option value="${
|
|
175
|
+
${(e.arrayElementOptions??[]).map(o=>`<option value="${j(o)}"${n===o?" selected":""}>${j(o)}</option>`).join("")}
|
|
176
176
|
</select>`;break;case "checkbox":r=`<label class="flex items-center gap-2 flex-1 cursor-pointer">
|
|
177
177
|
<input type="checkbox" data-frs-val class="checkbox checkbox-sm checkbox-primary"${n==="true"?" checked":""}>
|
|
178
178
|
<span class="text-sm">true</span>
|
|
179
|
-
</label>`;break;case "number":r=`<input type="number" data-frs-val value="${
|
|
179
|
+
</label>`;break;case "number":r=`<input type="number" data-frs-val value="${j(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":r=`<input type="datetime-local" data-frs-val value="${j(n)}" class="input input-bordered input-sm flex-1">`;break;default:r=`<input type="text" data-frs-val value="${j(n)}" class="input input-bordered input-sm flex-1">`;}return `<div class="flex items-center gap-2 mb-2" data-frs-array-item>
|
|
180
180
|
${r}
|
|
181
181
|
<button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>×</button>
|
|
182
|
-
</div>`}function
|
|
182
|
+
</div>`}function Wn(e,t){return `<div class="border border-base-200 rounded p-3 mb-2" data-frs-array-item>
|
|
183
183
|
<div class="flex justify-end mb-1">
|
|
184
184
|
<button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>×</button>
|
|
185
185
|
</div>
|
|
186
186
|
${(e.arrayElementFields??[]).map(o=>{let s=t[o.name],a=s==null?"":typeof s=="object"?JSON.stringify(s):String(s);switch(o.type){case "checkbox":return `<div class="form-control mb-2">
|
|
187
187
|
<label class="label cursor-pointer justify-start gap-3">
|
|
188
|
-
<input type="checkbox" data-frs-key="${
|
|
189
|
-
<span class="label-text text-sm">${
|
|
188
|
+
<input type="checkbox" data-frs-key="${j(o.name)}" class="checkbox checkbox-sm checkbox-primary"${a==="true"?" checked":""}>
|
|
189
|
+
<span class="label-text text-sm">${j(o.label)}</span>
|
|
190
190
|
</label>
|
|
191
191
|
</div>`;case "select":return `<div class="form-control mb-2">
|
|
192
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
193
|
-
<select data-frs-key="${
|
|
192
|
+
<label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
|
|
193
|
+
<select data-frs-key="${j(o.name)}" class="select select-bordered select-sm w-full">
|
|
194
194
|
${o.required?"":'<option value="">\u2014</option>'}
|
|
195
|
-
${(o.options??[]).map(l=>`<option value="${
|
|
195
|
+
${(o.options??[]).map(l=>`<option value="${j(l)}"${a===l?" selected":""}>${j(l)}</option>`).join("")}
|
|
196
196
|
</select>
|
|
197
197
|
</div>`;case "number":return `<div class="form-control mb-2">
|
|
198
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
199
|
-
<input type="number" data-frs-key="${
|
|
198
|
+
<label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
|
|
199
|
+
<input type="number" data-frs-key="${j(o.name)}" value="${j(a)}" class="input input-bordered input-sm w-full">
|
|
200
200
|
</div>`;case "datetime-local":return `<div class="form-control mb-2">
|
|
201
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
202
|
-
<input type="datetime-local" data-frs-key="${
|
|
201
|
+
<label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
|
|
202
|
+
<input type="datetime-local" data-frs-key="${j(o.name)}" value="${j(a)}" class="input input-bordered input-sm w-full">
|
|
203
203
|
</div>`;case "textarea":return `<div class="form-control mb-2">
|
|
204
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
205
|
-
<textarea data-frs-key="${
|
|
204
|
+
<label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
|
|
205
|
+
<textarea data-frs-key="${j(o.name)}" rows="2" class="textarea textarea-bordered textarea-sm w-full font-mono text-xs" placeholder="JSON">${j(a)}</textarea>
|
|
206
206
|
</div>`;default:return `<div class="form-control mb-2">
|
|
207
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
208
|
-
<input type="text" data-frs-key="${
|
|
207
|
+
<label class="label pb-1"><span class="label-text text-sm">${j(o.label)}</span></label>
|
|
208
|
+
<input type="text" data-frs-key="${j(o.name)}" value="${j(a)}" class="input input-bordered input-sm w-full">
|
|
209
209
|
</div>`}}).join(`
|
|
210
210
|
`)}
|
|
211
|
-
</div>`}function xe(e,t,n,r="Save"){let o=e.map(s=>
|
|
211
|
+
</div>`}function xe(e,t,n,r="Save"){let o=e.map(s=>It(s)).join(`
|
|
212
212
|
`);return `
|
|
213
|
-
<form action="${
|
|
213
|
+
<form action="${j(t)}" method="${n}" novalidate data-frs-form>
|
|
214
214
|
${o}
|
|
215
215
|
<div class="flex gap-2 mt-4 pt-4 border-t border-base-200">
|
|
216
|
-
<button type="submit" class="btn btn-primary btn-sm">${
|
|
216
|
+
<button type="submit" class="btn btn-primary btn-sm">${j(r)}</button>
|
|
217
217
|
<button type="button" class="btn btn-ghost btn-sm" onclick="history.back()">Cancel</button>
|
|
218
218
|
</div>
|
|
219
|
-
</form>`}var
|
|
219
|
+
</form>`}var So=new Set(["<","<=",">",">=","!="]),ko=new Set(["array-contains","array-contains-any"]);function _t(e){return e==="desc"?"DESCENDING":"ASCENDING"}function To(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function Co(e,t,n,r,o){let s=[],a=new Set;for(let i of r)if(i.op==="=="||i.op==="in"||i.op==="not-in"){if(a.has(i.field))continue;a.add(i.field),s.push({fieldPath:i.field,order:"ASCENDING"});}for(let i of r)if(ko.has(i.op)){if(a.has(i.field))continue;a.add(i.field),s.push({fieldPath:i.field,arrayConfig:"CONTAINS"});}for(let i of r)if(So.has(i.op)){if(a.has(i.field))continue;a.add(i.field);let u=o?.field===i.field?_t(o.dir):"ASCENDING";s.push({fieldPath:i.field,order:u});}if(o&&!a.has(o.field)&&s.push({fieldPath:o.field,order:_t(o.dir)}),s.length===1&&n)return $o(e,t,s[0]);let l=o&&s.some(i=>i.fieldPath===o.field)?_t(o.dir):"ASCENDING";return s.push({fieldPath:"__name__",order:l}),Ao(e,t,n,s)}function Ao(e,t,n,r,o="(default)"){let s=`projects/${e}/databases/${o}/collectionGroups/${t}/indexes/_`,a=[...jt(1,s),...gt(2,n?2:1)];for(let u of r)a.push(...Gn(3,Jn(u)));let l=o==="(default)"?"-default-":o,i=encodeURIComponent(Xn(a));return `https://console.firebase.google.com/project/${e}/firestore/databases/${l}/indexes?create_composite=${i}`}function Oo(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function Ft(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function Nt(e,t){return e<<3|t}function jt(e,t){let n=Array.from(new TextEncoder().encode(t));return [Nt(e,2),...Ft(n.length),...n]}function gt(e,t){return [Nt(e,0),...Ft(t)]}function Gn(e,t){return [Nt(e,2),...Ft(t.length),...t]}function Jn(e){let t=[...jt(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...gt(3,1)):t.push(...gt(2,e.order==="DESCENDING"?2:1)),t}function Xn(e){let t=String.fromCharCode(...e),n;if(typeof Buffer<"u")n=Buffer.from(e).toString("base64");else if(typeof btoa<"u")n=btoa(t);else throw new Error("No base64 encoder available");return n.replace(/=+$/,"")}function $o(e,t,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,s=[...jt(1,o),...gt(2,2),...Gn(3,Jn(n))],a=r==="(default)"?"-default-":r,l=encodeURIComponent(Xn(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${a}/indexes/automatic?create_exemption=${l}`}function Eo(e){let t=e,n=[t?.firestore?.projectId,t?.firestore?.app?.options?.projectId,t?.firestore?._settings?.projectId,t?.firestore?.databaseId?.projectId,t?._firestore?.projectId];for(let o of n)if(typeof o=="string"&&o.length>0)return o;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function Ce(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Qe(e,t){let n=e??{},r=Ce(e),o;if(r&&(o=n.message?Oo(n.message):void 0,!o)){let s=Eo(t.ref);if(s){let a=To(t.path);o=Co(s,a,t.isGroup,t.filters,t.sort);}}return {type:r?"index":"error",message:r?"This query requires a composite index that does not exist yet.":n.message??"Query failed",indexUrl:o}}ht();var er=`// \u2500\u2500 Shared helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
220
220
|
function frsGetBasePath() {
|
|
221
221
|
var root = document.querySelector("[data-frs-panel-root]");
|
|
222
222
|
var bp = root && root.getAttribute("data-frs-base-path");
|
|
@@ -1143,7 +1143,7 @@ function initColumnReorder(table) {
|
|
|
1143
1143
|
});
|
|
1144
1144
|
});
|
|
1145
1145
|
}
|
|
1146
|
-
`;function Ve(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:Xn}})}Bt();function ve(e){return "<!DOCTYPE html>"+server.renderToString(e)}var Fo=["corporate","silk","dark"],No=()=>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:Fo.map(e=>jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsxRuntime.jsx("span",{children:e}),jsxRuntime.jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),we=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:o,basePath:s="/"}=e;return jsxRuntime.jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxRuntime.jsxs("head",{children:[jsxRuntime.jsx("meta",{charset:"UTF-8"}),jsxRuntime.jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxRuntime.jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxRuntime.jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsxRuntime.jsxs("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:[jsxRuntime.jsx("div",{class:"flex-1",children:jsxRuntime.jsx("a",{href:s,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsxRuntime.jsx("div",{class:"flex-none",children:jsxRuntime.jsx(No,{})})]}),jsxRuntime.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((a,l)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},l):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},l))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(Ht,{basePath:s}),jsxRuntime.jsx(Ve,{})]})]})};function zt(e,t){return ve(jsxRuntime.jsx(we,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Zt(e,t){return ve(jsxRuntime.jsx(we,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxRuntime.jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsxRuntime.jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsxRuntime.jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:e.map(n=>jsxRuntime.jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxRuntime.jsxs("div",{class:"card-body p-5",children:[jsxRuntime.jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsxRuntime.jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var nr=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],jo=[{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"}],Mo=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function Ho(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return jo;case "ZodBoolean":return nr;case "ZodArray":return Mo;default:return nr}}var Re="__null__";function Bo(e){return `(function(cb){var i=document.getElementById('${e}');if(!i)return;if(cb.checked){i.dataset._prev=i.value;if(i.tagName==='SELECT'){var o=i.querySelector('option[value="${Re}"]');if(!o){o=document.createElement('option');o.value='${Re}';o.textContent='\u2205 null';o.dataset._auto='1';i.appendChild(o);}o.selected=true;}else{if(i.type==='number'||i.type==='datetime-local'){i.dataset._type=i.type;i.type='text';}i.value='${Re}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${Re}"][data-_auto="1"]');if(o2)o2.remove();var prev=i.dataset._prev||'';for(var k=0;k<i.options.length;k++)i.options[k].selected=(i.options[k].value===prev);}else{if(i.dataset._type){i.type=i.dataset._type;delete i.dataset._type;}i.readOnly=false;i.value=(i.dataset._prev&&i.dataset._prev!=='${Re}')?i.dataset._prev:'';}}})(this)`}function zo(e,t){return `(function(){var h=document.getElementById('${e}');var boxes=document.querySelectorAll('input[data-enum-group="${t}"]');h.value=Array.from(boxes).filter(function(b){return b.checked;}).map(function(b){return b.value;}).join(',');})()`}function Ge({inputId:e,active:t}){return jsxRuntime.jsxs("label",{class:"flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/60 hover:text-base-content border border-base-300 rounded-md px-1.5 py-1 shrink-0 leading-none h-8",title:"Filter where field IS NULL",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:Bo(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Zo({col:e,active:t}){let n=t?.value??"",r=n===Re,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,a=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(a){let l=new Set(n.split(",").map(u=>u.trim()).filter(Boolean)),i=`eg_${e.name.replace(/\./g,"__")}`;return jsxRuntime.jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{type:"hidden",id:o,name:`fv_${e.name}`,value:n}),e.enumValues.map(u=>jsxRuntime.jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:u,checked:l.has(u),"data-enum-group":i,onchange:zo(o,i)}),jsxRuntime.jsx("span",{children:u})]},u))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(l=>jsxRuntime.jsx("option",{value:l,selected:n===l,children:l},l)),e.nullable&&jsxRuntime.jsx("option",{value:Re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsxRuntime.jsx("option",{value:Re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let l=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:l?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]})}function Lt({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(i=>[i.field,i])),s=n.length>0,a=n.length>=2||r&&s,l=t.filter(i=>i.zodType!=="ZodObject"&&i.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:l.map(i=>{let u=Ho(i.zodType),y=o[i.name],d=y?.op??u[0].value;return jsxRuntime.jsxs("div",{class:"flex flex-col gap-1.5",children:[jsxRuntime.jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:i.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[u.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:u.map(g=>jsxRuntime.jsx("option",{value:g.value,selected:g.value===d,children:g.label},g.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:u[0].value}),jsxRuntime.jsx(Zo,{col:i,active:y})]})]},i.name)})}),jsxRuntime.jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),s&&jsxRuntime.jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),a&&jsxRuntime.jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function Ut(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,l=n==="create"?[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:"New document"}]:[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:`Edit ${r??""}`}];return ve(jsxRuntime.jsx(we,{opts:{title:a,breadcrumb:l,basePath:o,flash:s},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}gt();Mt();function qt(e,t,n){let r=new URLSearchParams;for(let o of e)r.set(`fv_${o.field}`,o.value),r.set(`fo_${o.field}`,o.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function rr(e,t,n,r,o){let s=qt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function Lo(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 Uo(e,t,n){return `?${qt(t,n,e).toString()}`}function Kt(e,t,n,r,o,s,a=[],l=[],i=false,u=[],y,d,g,x,b,v,k,w=false){let c=`${r}/${e}`,f=`${c}/create`,m={};if(k)for(let T of n)m[T]=_e(Fe(k,T));let p=(v??[]).filter(T=>{let O=m[T]??_e(Fe(k,T));return O==="string"||O==="number"||O==="bigint"||O==="boolean"||O==="enum"||O==="literal"}),h=p.length>0,R=i,S=R||h,C=p.map(T=>{let O=Fe(k,T),A=_e(O),E=a.find($=>$.name===T);return {name:T,type:A,enumValues:E?.enumValues??null,nullable:E?.nullable??false}});return ve(jsxRuntime.jsxs(we,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Lt,{action:c,columnMeta:a,activeFilters:l,isGroup:x}),g&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${g.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-6 w-6 shrink-0 stroke-current",fill:"none",viewBox:"0 0 24 24",children:g.type==="index"?jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}):jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"})}),jsxRuntime.jsxs("div",{class:"flex-1",children:[jsxRuntime.jsx("h3",{class:"font-bold",children:g.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:g.message})]}),g.indexUrl&&jsxRuntime.jsx("a",{href:g.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxRuntime.jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxRuntime.jsxs("div",{class:"flex items-center gap-3",children:[jsxRuntime.jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof b=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of"," ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:b})]})," ","document",(typeof b=="number"?b:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(T=>jsxRuntime.jsx("a",{href:Uo(T,l,y),class:`join-item btn btn-xs ${d===T?"btn-active btn-primary":"btn-outline"}`,children:T},T))})]})]}),jsxRuntime.jsx("a",{href:f,class:"btn btn-primary btn-sm",children:"+ New"})]}),S&&jsxRuntime.jsxs("div",{class:"hidden mb-3 alert alert-info py-2 px-3","data-frs-bulk-bar":true,"data-frs-repo":e,"data-frs-total":typeof b=="number"?String(b):"","data-frs-page-size":String(d??t.length),"data-frs-allow-delete":R?"1":"0","data-frs-allow-update":h?"1":"0","data-frs-fields":JSON.stringify(C),"data-frs-filters":JSON.stringify(l),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof b=="number"&&b>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",b," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",b??"?"," matching documents are selected."," ",jsxRuntime.jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxRuntime.jsxs("div",{class:"flex gap-2",children:[h&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),R&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[S&&jsxRuntime.jsx("th",{class:"w-8",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((T,O)=>{let A=y?.field===T,E=A?y.dir==="asc"?" \u25B2":" \u25BC":"";return jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxRuntime.jsxs("a",{href:Lo(T,y,l,d),class:`hover:text-base-content inline-flex items-center gap-0.5${A?" text-primary font-bold":""}`,children:[T,E]})},O)}),u.map((T,O)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:T.column},`rel-${O}`)),jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsxRuntime.jsx("tbody",{children:t.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:n.length+u.length+1+(S?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((T,O)=>{let A=String(T.docId??T.id??""),E=`${r}/${e}/${encodeURIComponent(A)}/edit`,$=`${r}/${e}/${encodeURIComponent(A)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":A,children:[S&&jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:A,"aria-label":`Select ${A}`})}),n.map((P,_)=>{let j=T[P],F=m[P],D=F?We(F,j):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(Ie,{val:j,mismatch:D})},_)}),u.map((P,_)=>{let j=T[P.key];if(j==null||j==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${_}`);let F=P.type==="one"?`${r}/${P.targetRepo}/${encodeURIComponent(String(j))}/edit`:`${r}/${P.targetRepo}?fv_${P.targetKey}=${encodeURIComponent(String(j))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:F,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":P.type,"data-frs-rel-repo":P.targetRepo,"data-frs-rel-fk":P.targetKey,"data-frs-rel-val":String(j),"data-frs-rel-label":P.column,children:P.column})},`rel-${_}`)}),jsxRuntime.jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxRuntime.jsxs("div",{class:"flex gap-1 justify-end",children:[jsxRuntime.jsx("a",{href:E,class:"btn btn-xs btn-outline",children:"Edit"}),w&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(A)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),i&&jsxRuntime.jsx("form",{method:"post",action:$,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},O)})})]})}),(o.hasPrev||o.hasNext)&&jsxRuntime.jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[o.hasPrev?jsxRuntime.jsx("a",{href:rr(l,o.prevCursor,"prev",y,d),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),o.hasNext?jsxRuntime.jsx("a",{href:rr(l,o.nextCursor,"next",y,d),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof b=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[b," total document",b!==1?"s":"",l.length>0?" matching filters":""]})]}),S&&h&&jsxRuntime.jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxRuntime.jsxs("div",{class:"modal-box",children:[jsxRuntime.jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsxRuntime.jsx("p",{class:"text-sm text-base-content/60 mb-4","data-frs-bulk-update-summary":true,children:"Update one field on the selected documents."}),jsxRuntime.jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxRuntime.jsxs("label",{class:"form-control w-full mb-3",children:[jsxRuntime.jsx("div",{class:"label",children:jsxRuntime.jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxRuntime.jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsxRuntime.jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),p.map(T=>jsxRuntime.jsx("option",{value:T,children:T},T))]})]}),jsxRuntime.jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxRuntime.jsxs("div",{class:"modal-action",children:[jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsxRuntime.jsx("form",{method:"dialog",class:"modal-backdrop",children:jsxRuntime.jsx("button",{children:"close"})})]})]}))}function Je(e,t){return zt(e,t)}function Qt(e,t){return Zt(e,t)}function Vt(e,t,n,r,o,s,a,l,i,u,y,d,g,x,b,v,k,w){return Kt(e,t,n,r,o,s,a,l,i,u,y,d,g,x,b,v,k,w)}function Se(e,t,n,r,o,s){return Ut(e,t,n,r,o,s)}var Wt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Vo(){let e="";for(;e.length<20;){let t=crypto.randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=Wt.length*4||(e+=Wt.charAt(r%Wt.length));}}return e}function bt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),o=[];for(let s=1;s<r.length;s+=2)o.push(r[s]);return o.length>0?o:void 0}async function Ne(e,t){let n=e.documentKey??"docId",r=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[r]=="function")try{let s=await e.repo.get[r](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Gt(e,t,n){let r=e.documentKey??"docId",o=Qe(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return o.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...o.indexUrl?{action:{href:o.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:o.message}}function H(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Jt(e,t){e.status(302).set("Location",t).send("");}function Xt(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=en(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let u={},y=false;for(let[x,b]of Object.entries(e))x.startsWith(`${o}.`)&&(u[x.slice(o.length+1)]=b,y=true);if(y){let x=s;for(;;){let b=U(x);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")x=G(x);else break}r[o]=Xt(u,x);continue}let d=e[o],g=Array.isArray(d)?d[d.length-1]:d;if(g)try{r[o]=JSON.parse(g);}catch{r[o]=g;}continue}let l=e[o],i=Array.isArray(l)?l[l.length-1]:l;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(i===void 0||i===""){a==="ZodBoolean"&&(r[o]=false);continue}switch(a){case "ZodBoolean":i==="__null__"?r[o]=null:r[o]=i==="true"||i==="on"||i==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(i);break;case "ZodDate":r[o]=new Date(i);break;case "ZodArray":try{r[o]=JSON.parse(i);}catch{r[o]=i;}break;default:if(i.startsWith("{")||i.startsWith("["))try{r[o]=JSON.parse(i);break}catch{}r[o]=i;}}return r}function or(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let r=new Date(e);isNaN(r.getTime())||(t=r);}if(!t||isNaN(t.getTime()))return null;let n=r=>String(r).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function en(e){let t=e;for(;;){let n=U(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Wo(e){let t=e;for(;;){let n=U(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function ar(e){let t=e;for(;;){let n=U(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=G(t);continue}return false}}function ir(e){let t=Wo(e),n=U(t);if(n==="ZodEnum"){let r=Ze(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Le(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=Ue(t);return typeof r=="string"?[r]:void 0}}function lr(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,a=e[o];if(a===null){r[s]="__null__";continue}if(a===void 0)continue;let l=t.shape[o];for(;;){let u=U(l);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")l=G(l);else break}let i=U(l);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let u=lr(a,l,s);Object.assign(r,u);}else if(i==="ZodDate"){let u=or(a);u!==null&&(r[s]=u);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let u=or(a);r[s]=u??JSON.stringify(a,null,2);}else typeof a=="object"?r[s]=JSON.stringify(a,null,2):r[s]=String(a);}return r}function Yt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Yt(n.nested,t):void 0}))}function Go(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[o,s]of Object.entries(e)){if(!o.startsWith("fv_"))continue;let a=o.slice(3);if(!t.has(a))continue;let l=(s??"").trim();if(!l)continue;let i=e[`fo_${a}`]??"==",u=n.has(i)?i:"==";r.push({field:a,op:u,value:l});}return r}function sr(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 cr(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,a=t.shape[o];if(!a){r.push({name:s,zodType:"ZodString"});continue}let l=en(a);if(l==="ZodObject"){let i=a;for(;;){let y=U(i);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")i=G(i);else break}let u=re(i);r.push(...cr(Object.keys(u),i,s));}else r.push({name:s,zodType:l,nullable:ar(a),enumValues:ir(a)});}return r}function Jo(e,t){let n=t.split("."),r=e;for(let o of n){for(;;){let a=U(r);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")r=G(r);else break}let s=re(r);if(!(o in s))return null;r=s[o];}return r}function Oe(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let a=s.indexOf(".");if(a===-1)n.push(s);else {let l=s.slice(0,a),i=s.slice(a+1);r.has(l)||r.set(l,[]),r.get(l).push(i);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,a]of r){if(!(s in e.shape))continue;let l=e.shape[s];for(;;){let i=U(l);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")l=G(l);else break}if(U(l)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Oe(l,a);}return zod.z.object(o)}function me(e,t,n){return ne(e,t,n)}function dr(e,t,n){let r=(c,f)=>{let m=me(c,t,n),p=Object.values(e).map(h=>({name:h.name,path:h.path}));H(f,Qt(p,m));},o=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=p.pageSize??25,R=c.query??{},S=R.cursor,C=R.dir==="prev"?"prev":"next",T=R.ob??"",O=R.od==="desc"?"desc":"asc",A=T?{field:T,dir:O}:void 0,E=parseInt(R.ps??""),$=Number.isFinite(E)&&E>0?Math.min(E,200):h,P=p.listColumns??Object.keys(p.schema.shape),_=p.documentKey??"docId",j=[_,...P.filter(W=>W!==_)];A&&(new Set([_,...P]).has(A.field)||(A=void 0));let F=p.filterableFields?(()=>{let W=[];for(let ue of p.filterableFields)(ue.includes(".")||P.includes(ue))&&W.push(ue);return W})():P,D=(()=>{let W=[];for(let ue of F)if(ue.includes(".")){let Ee=Jo(p.schema,ue);W.push({name:ue,zodType:Ee?en(Ee):"ZodString",nullable:Ee?ar(Ee):false,enumValues:Ee?ir(Ee):void 0});}else W.push(...cr([ue],p.schema));return W})(),Q=new Set(D.map(W=>W.name)),de=Go(R,Q),q=sr(de),ie;if(S)try{let W=p.repo.ref;typeof W.doc=="function"&&(ie=await W.doc(S).get());}catch{}let[X,tt]=await Promise.all([p.repo.query.paginate({pageSize:$,cursor:ie,direction:C,...q.length>0?{where:q}:{},...A?{orderBy:[{field:A.field,direction:A.dir}]}:{}}).catch(W=>({queryError:Qe(W,{ref:p.repo.ref,path:p.path,isGroup:!!p.isGroup,filters:de,sort:A})})),p.repo.aggregate.count(q.length>0?{where:q}:{}).catch(()=>{})]),$e="queryError"in X,kr=$e?[]:X.data,Tr=$e?"":X.nextCursor?.id??"",Cr=$e?"":X.prevCursor?.id??"",Ar=$e?X.queryError:void 0,Or=me(c,t,n);H(f,Vt(p.name,kr,j,Or,{hasPrev:$e?false:X.hasPrevPage,hasNext:$e?false:X.hasNextPage,prevCursor:Cr,nextCursor:Tr},void 0,D,de,p.allowDelete??false,p.relationalMeta,A,$,Ar,p.isGroup,tt,p.mutableFields,p.schema,p.historyEnabled));},s=(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=Oe(p.schema,p.createFields),S=le(R),C=`${h}/${p.name}/create`,T=xe(S,C,"POST","Create document");H(f,Se(p.name,T,"create",null,h));},a=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=c.body??{},S=Xt(R,p.schema),C=Oe(p.schema,p.createFields),T=C.safeParse(S);if(!T.success){let O=le(C),A=`${h}/${p.name}/create`,E=xe(O,A,"POST","Create document"),$=T.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`).join(", ");H(f,Se(p.name,E,"create",null,h,{type:"error",message:`Validation error: ${$}`}),422);return}try{if(p.isGroup&&p.parentKeys&&p.parentKeys.length>0){let O={...T.data};p.createdKey&&(O[p.createdKey]=new Date);let A=p.parentKeys.filter(_=>!O[_]);if(A.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${A.join(", ")}`);let E=p.parentKeys.map(_=>O[_]),$=p.documentKey??"docId",P=O[$]||Vo();await p.repo.set(...E,P,O);}else await p.repo.create(T.data);Jt(f,`${h}/${p.name}?flash=created`);}catch(O){let A=Oe(p.schema,p.createFields),E=le(A),$=`${h}/${p.name}/create`,P=xe(E,$,"POST","Create document");H(f,Se(p.name,P,"create",null,h,{type:"error",message:`Save error: ${O.message}`}),500);}},l=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}let R=me(c,t,n),S=null;try{S=await Ne(h,p);}catch($){let P=Gt(h,p,$),_=Ce($)?424:500;H(f,Je("",{title:`Edit ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`Edit ${p}`}],flash:P}),_);return}if(!S){H(f,"Document not found",404);return}let C=lr(S,h.schema),T=Oe(h.schema,h.mutableFields),O=Yt(le(T),C),A=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,E=xe(O,A,"POST","Save changes");H(f,Se(h.name,E,"edit",p,R));},i=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}let R=me(c,t,n),S=c.body??{},C=Xt(S,h.schema),T=Oe(h.schema,h.mutableFields),A=T.partial().safeParse(C);if(!A.success){let E=Object.fromEntries(Object.entries(S).map(([F,D])=>[F,Array.isArray(D)?D.join(","):D??""])),$=Yt(le(T),E),P=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,_=xe($,P,"POST","Save changes"),j=A.error.issues.map(F=>`${F.path.join(".")}: ${F.message}`).join(", ");H(f,Se(h.name,_,"edit",p,R,{type:"error",message:`Validation error: ${j}`}),422);return}try{let E=await Ne(h,p),$=(E&&bt(E,h.pathKey))??[p];await h.repo.update(...$,A.data),Jt(f,`${R}/${h.name}?flash=updated`);}catch(E){let $=Oe(h.schema,h.mutableFields),P=le($),_=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,j=xe(P,_,"POST","Save changes"),F=Ce(E)?Gt(h,p,E):{type:"error",message:`Save error: ${E.message}`},D=Ce(E)?424:500;H(f,Se(h.name,j,"edit",p,R,F),D);}},u=async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}if(!h.allowDelete){H(f,"Delete is not allowed for this repository",403);return}let R=me(c,t,n);try{let S=await Ne(h,p),C=(S&&bt(S,h.pathKey))??[p];await h.repo.delete(...C),Jt(f,`${R}/${h.name}?flash=deleted`);}catch(S){let C=Ce(S)?Gt(h,p,S):{type:"error",message:`Delete error: ${S.message}`},T=Ce(S)?424:500;H(f,Je("",{title:`Delete ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`Delete ${p}`}],flash:C}),T);}},y=async(c,f)=>{let m=c.params.repoName;if(!m){H(f,"Bad request",400);return}let p=e[m];if(!p){H(f,"Repository not found",404);return}let h=me(c,t,n),R=c.query,S=R?.type==="many"?"many":"one",C=Math.max(1,Math.min(100,Number(R?.ps??25)||25)),T=p.listColumns??Object.keys(re(p.schema)),{PanelOne:O,PanelMany:A}=await Promise.resolve().then(()=>(Bt(),er)),{renderToString:E}=await import('hono/jsx/dom/server');if(S==="one"){let D=String(R?.id??"");if(!D){H(f,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let Q=await Ne(p,D),de=E(O({doc:Q,repoName:p.name,basePath:h,schema:p.schema,columns:T}));H(f,de);}catch(Q){H(f,`<div class='p-6 text-error text-sm'>Error: ${Q.message}</div>`,500);}return}let $=String(R?.fk??""),P=String(R?.fv??"");if(!$||!P){H(f,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let _=R?.cursor??"",j=R?.dir==="prev"?"prev":"next",F;if(_)try{let D=p.repo.ref;typeof D.doc=="function"&&(F=await D.doc(_).get());}catch{}try{let D=await p.repo.query.paginate({pageSize:C,cursor:F,direction:j,where:[[$,"==",Xo(P)]]}),Q=E(A({docs:D.data,repoName:p.name,basePath:h,fk:$,fv:P,columns:T,schema:p.schema,pagination:{hasPrev:D.hasPrevPage,hasNext:D.hasNextPage,prevCursor:D.prevCursor?.id??"",nextCursor:D.nextCursor?.id??"",pageSize:C}}));H(f,Q);}catch(D){H(f,`<div class='p-6 text-error text-sm'>Error: ${D.message}</div>`,500);}},d=async(c,f)=>{let m=[];for(let p of f){let h;if(c.isGroup||c.parentKeys?.length){let R=await Ne(c,p);h=R?bt(R,c.pathKey):void 0;}h||(h=[p]);try{let R=c.repo.documentRef(...h);R&&m.push(R);}catch{}}return m},g=async(c,f)=>{let m=sr(f),p=c.documentKey??"docId",h=[],R;for(;;){let S=await c.repo.query.paginate({pageSize:500,cursor:R,direction:"next",...m.length>0?{where:m}:{}});for(let C of S.data){let T=String(C[p]??C.id??"");T&&h.push(T);}if(!S.hasNextPage||!S.nextCursor)break;R=S.nextCursor;}return h},x=async(c,f)=>{let m=c.params.repoName;if(!m){te(f,{error:"Bad request"},400);return}let p=e[m];if(!p){te(f,{error:"Repository not found"},404);return}if(!p.allowDelete){te(f,{error:"Delete is not allowed for this repository"},403);return}let h=c.body??{};try{let R=await v(p,h);if(R.length===0){te(f,{deleted:0});return}let S=await d(p,R);for(let C=0;C<S.length;C+=500)await p.repo.bulk.delete(S.slice(C,C+500));te(f,{deleted:S.length});}catch(R){te(f,{error:R.message},500);}},b=async(c,f)=>{let m=c.params.repoName;if(!m){te(f,{error:"Bad request"},400);return}let p=e[m];if(!p){te(f,{error:"Repository not found"},404);return}let h=c.body??{},R=String(h.field??"");if(!R){te(f,{error:"Missing 'field'"},400);return}if(!p.mutableFields||!p.mutableFields.includes(R)){te(f,{error:`Field '${R}' is not bulk-updatable`},403);return}let S=p.schema.shape?.[R],C=h.value;if(S){let T=S.safeParse(h.value);if(!T.success){te(f,{error:`Invalid value for '${R}': ${T.error.message}`},400);return}C=T.data;}try{let T=await v(p,h);if(T.length===0){te(f,{updated:0});return}let A=(await d(p,T)).map(E=>({docRef:E,data:{[R]:C}}));for(let E=0;E<A.length;E+=500)await p.repo.bulk.update(A.slice(E,E+500));te(f,{updated:A.length});}catch(T){te(f,{error:T.message},500);}};async function v(c,f){if(f.selectAll){let m=k(f.filters,c);return await g(c,m)}return Array.isArray(f.ids)?f.ids.filter(m=>typeof m=="string"&&!!m):[]}function k(c,f){if(!Array.isArray(c))return [];let m=new Set((f.filterableFields??Object.keys(re(f.schema))).map(R=>String(R))),p=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),h=[];for(let R of c)R&&typeof R=="object"&&typeof R.field=="string"&&m.has(R.field)&&typeof R.value=="string"&&p.has(String(R.op))&&h.push({field:R.field,op:R.op,value:R.value});return h}return {handleDashboard:r,handleList:o,handleCreateForm:s,handleCreateSubmit:a,handleEditForm:l,handleEditSubmit:i,handleDelete:u,handlePanel:y,handleBulkDelete:x,handleBulkUpdate:b,handleHistory:async(c,f)=>{let m=c.params.repoName,p=c.params.id;if(!m||!p){H(f,"Bad request",400);return}let h=e[m];if(!h){H(f,"Repository not found",404);return}if(!h.historyEnabled||!h.repo.history){H(f,"History not enabled for this repository",404);return}let R=me(c,t,n),S=h.historySubcollection??"history",C=[p];try{let D=await Ne(h,p),Q=D?bt(D,h.pathKey):void 0;Q&&Q.length>0&&(C=Q);}catch{}let T=parseInt(String(c.query?.limit??"")),O=Number.isFinite(T)&&T>0?Math.min(T,500):100,A=[],E;try{A=await h.repo.history.list(...C,{limit:O});}catch(D){E=D.message;}let $=D=>String(D??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),P=D=>{if(D===void 0)return '<span class="opacity-40">undefined</span>';if(D===null)return '<span class="opacity-40">null</span>';if(typeof D=="object")try{return `<code class="text-xs">${$(JSON.stringify(D))}</code>`}catch{return $(String(D))}return $(String(D))},_=D=>D?typeof D.toDate=="function"?D.toDate().toISOString():D instanceof Date?D.toISOString():$(String(D)):"",j=D=>`<span class="badge badge-sm ${D==="create"?"badge-success":D==="delete"?"badge-error":"badge-info"}">${$(D)}</span>`,F="";if(F+='<div class="flex items-center justify-between mb-4">',F+=`<a href="${R}/${h.name}/${encodeURIComponent(p)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,F+=`<a href="${R}/${h.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,F+="</div>",F+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${$(S)}</code> \xB7 Showing up to ${O} entries.</p>`,E)F+=`<div class="alert alert-error mb-4">${$(E)}</div>`;else if(A.length===0)F+='<div class="alert">No history entries found.</div>';else {F+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',F+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let D of A){let Q=D.meta??{},de=[Q.reason,Q.comment].filter(X=>X!=null&&X!=="").map(X=>$(String(X))).join(" \u2014 "),q="",ie=Object.keys(D.changes??{});ie.length===0?q='<span class="opacity-40">\u2014</span>':q='<ul class="space-y-1">'+ie.map(X=>{let tt=D.changes[X];return `<li><strong>${$(X)}</strong>: ${P(tt.oldValue)} \u2192 ${P(tt.newValue)}</li>`}).join("")+"</ul>",F+="<tr>",F+=`<td class="whitespace-nowrap text-xs font-mono">${$(_(D.historySetAt))}</td>`,F+=`<td>${j(D.operation??"update")}</td>`,F+=`<td class="text-xs">${$(Q.userEmail??Q.userId??"")}</td>`,F+=`<td class="text-xs">${de}</td>`,F+=`<td>${q}</td>`,F+="</tr>";}F+="</tbody></table></div>";}H(f,Je(F,{title:`History \u2014 ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`History ${p}`}]}));}}}function te(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Xo(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}var ur="https://cdn.jsdelivr.net",pr="https://www.gstatic.com",fr=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${ur} ${pr}`,`style-src 'self' 'unsafe-inline' ${ur}`,`connect-src 'self' ${pr} https://*.googleapis.com https://*.firebaseio.com https://identitytoolkit.googleapis.com`,"img-src 'self' data:","font-src 'self' data:","frame-ancestors 'none'","base-uri 'self'","form-action 'self'"].join("; ");function Xe(e={}){let t=e.csp===void 0?fr:e.csp,n=e.frameOptions===void 0?"DENY":e.frameOptions,r=e.referrerPolicy===void 0?"no-referrer":e.referrerPolicy,o=e.cacheControl===void 0?"private, no-store":e.cacheControl;return async(s,a,l)=>{typeof a?.setHeader=="function"&&(a.setHeader("X-Content-Type-Options","nosniff"),n&&a.setHeader("X-Frame-Options",n),r&&a.setHeader("Referrer-Policy",r),o&&a.setHeader("Cache-Control",o),t&&a.setHeader("Content-Security-Policy",t)),await l();}}async function Yo(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function es(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 yr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],httpsOptions:l}=e,i=t==="/"?"":t.replace(/\/$/,""),u={};for(let[x,b]of Object.entries(n)){let v=b.schema??b.repo.schema??null;if(!v)throw new Error(`[createAdminServer] Repository "${x}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let k,w,c;if(b.fieldsConfig){let p=b.fieldsConfig;k=[],w=[],c=[];for(let[h,R]of Object.entries(p))for(let S of R)S==="filterable"?k.push(h):S==="mutable"?w.push(h):S==="create"&&c.push(h);k.length===0&&(k=void 0),w.length===0&&(w=void 0),c.length===0&&(c=void 0);}let f=(()=>{let p=b.repo._parentKeys;return p&&p.length>0?p:void 0})();if(f&&c)for(let p of f)c.includes(p)||c.push(p);let m={name:x,path:b.path,repo:b.repo,schema:v,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:f,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:k,mutableFields:w,createFields:c,allowDelete:b.allowDelete??false,historyEnabled:!!b.repo.history,historySubcollection:(b.repo.history&&b.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!b.relationalFields||b.relationalFields.length===0)return;let p=b.repo.relationalKeys??{},h=[];for(let R of b.relationalFields){let S=p[R.key];S&&h.push({key:R.key,column:R.column,targetRepo:String(S.repo),targetKey:String(S.key),type:S.type});}return h.length>0?h:void 0})()};u[x]=m;}let y=dr(u,i,An(l?.region)),d=new oe;if(o!==false&&d.use(Xe(o===void 0?{}:o)),r&&d.use(async(x,b,v)=>{let k=x,w=String(k.headers?.["content-type"]??"");if(w.includes("application/x-www-form-urlencoded")){let c=await Yo(k);x.body=es(c);}else if(w.includes("application/json")&&typeof k.body=="string")try{x.body=JSON.parse(k.body);}catch{}await v();}),s)if(he(s)){for(let x of s.routes){let b=`${i}${x.path}`;x.method==="GET"?d.get(b,x.handler):d.post(b,x.handler);}d.use(s.middleware);}else if(typeof s=="function")d.use(s);else {let x=s.realm??"Admin",b="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");d.use((v,k,w)=>{if((v.headers?.authorization??"")!==b){k.status(401).set("WWW-Authenticate",`Basic realm="${x}"`).set("Content-Type","text/plain").send("Unauthorized");return}w();});}for(let x of a)d.use(x);d.get(`${i}/`,y.handleDashboard),d.get(`${i}`,y.handleDashboard),d.get(`${i}/:repoName/_panel`,y.handlePanel),d.post(`${i}/:repoName/_bulk/delete`,y.handleBulkDelete),d.post(`${i}/:repoName/_bulk/update`,y.handleBulkUpdate),d.get(`${i}/:repoName`,y.handleList),d.get(`${i}/:repoName/create`,y.handleCreateForm),d.post(`${i}/:repoName/create`,y.handleCreateSubmit),d.get(`${i}/:repoName/:id/edit`,y.handleEditForm),d.post(`${i}/:repoName/:id/edit`,y.handleEditSubmit),d.get(`${i}/:repoName/:id/history`,y.handleHistory),d.post(`${i}/:repoName/:id/delete`,y.handleDelete);let g=async(x,b)=>{await d.handle(x,b);};return l&&(g.httpsOptions=l),g}function rn(e,t,n=200){let r=K(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function je(e,t,n,r=200){rn(e,{success:true,data:t,meta:n},r);}function L(e,t,n=400){rn(e,{success:false,error:t},n);}function tn(e,t,n,r,o){let s=Qe(t,n),a=s.type==="index",l=a?424:500,u={success:false,error:a?s.message:o&&t instanceof Error?t.message:r};a&&(u.errorType="index",s.indexUrl&&(u.indexUrl=s.indexUrl)),rn(e,u,l);}var nn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function ns(){let e="";for(;e.length<20;){let t=crypto.randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=nn.length*4||(e+=nn.charAt(r%nn.length));}}return e}function Me(e){let t=e._def??e.def;if(!t)return e;let n=t.typeName??t.type;if(n==="ZodDate"||n==="date")return zod.z.preprocess(r=>kt(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=Me(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(Me(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Me(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Me(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=Me(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function rs(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let a of s){if(n.includes(a))continue;let l=a.split(".")[0];l&&r[l]&&(o[l]=r[l]);}return zod.z.object(o)}function mr(e,t,n,r=false,o=[]){try{let s=rs(e,n,o),a=r?s.partial():s;return {success:!0,data:(St()==="normalize"?Me(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(l=>`${l.path.join(".")}: ${l.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function os(e,t){let n=[],r=t?new Set(t):null,o={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[s,a]of Object.entries(e)){if(a===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let l=Array.isArray(a)?a[0]:a;if(l===void 0||l==="")continue;let i=s.match(/^(\w+)__(\w+)$/),u,y="==";if(i&&i[1]&&i[2]){u=i[1];let g=i[2];if(o[g])y=o[g];else continue}else if(!i)u=s;else continue;if(r&&!r.has(u))continue;let d=l;y==="in"||y==="not-in"||y==="array-contains-any"?d=l.split(",").map(g=>gr(g.trim())):d=gr(l),n.push({field:u,op:y,value:d});}return n}function gr(e){if(e==="true")return true;if(e==="false")return false;if(e==="null")return null;let t=Number(e);return !isNaN(t)&&e!==""?t:e}function xt(e){return e?{docId:e.id}:null}async function hr(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 br(e,t,n,r=false){async function o(w,c,f,m){if(!r)return true;let p=c.rules?.[f];if(!p)return L(w,`Operation "${f}" is not allowed for this repository`,403),false;try{return await p(m)?!0:(L(w,"Forbidden",403),!1)}catch(h){let R=n&&h instanceof Error?h.message:"Forbidden";return L(w,R,403),false}}async function s(w,c,f,m){if(!r)return m;let p=w.rules?.filter;if(!p)return m;let h=[];for(let R of m)try{await p({user:c,doc:R,params:f})&&h.push(R);}catch{}return h}function a(w){return w?.user??null}function l(w,c){return !w||!e[w]?(L(c,`Repository "${w}" not found`,404),null):e[w]}function i(w,c){if(!c)return;let f=w[c];if(typeof f!="string"||!f)return;let m=f.split("/").filter(Boolean),p=[];for(let h=1;h<m.length;h+=2)p.push(m[h]);return p.length>0?p:void 0}async function u(w,c){let f=`by${w.documentKey.charAt(0).toUpperCase()}${w.documentKey.slice(1)}`,m=w.repo.get[f];if(typeof m=="function")try{let h=await m(c);if(h)return h}catch{}return (await w.repo.query.by({where:[[w.documentKey,"==",c]],limit:1}))[0]??null}async function y(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=a(w);if(!await o(c,m,"list",{user:p,query:w.query??{},params:f}))return;let h=[],R;try{let S=w.query??{},C=Math.min(Number(S.pageSize)||m.pageSize,100),T=S.cursor,O=S.direction?.toLowerCase()==="prev"?"prev":"next",A=S.orderBy,E=S.orderDir?.toLowerCase()==="desc"?"desc":"asc",$=S.select,P=$?$.split(",").map(q=>q.trim()):void 0,_;m.allowedIncludes&&S.includes&&(_=(typeof S.includes=="string"?S.includes.split(",").map(ie=>ie.trim()):Array.isArray(S.includes)?S.includes:[]).filter(ie=>typeof ie=="string"&&m.allowedIncludes.includes(ie)),_?.length===0&&(_=void 0));let j=os(S,m.filterableFields);h=j.map(q=>({field:q.field,op:q.op,value:String(q.value??"")})),A&&(R={field:A,dir:E});let F={pageSize:C,direction:O};if(T)try{let q=typeof T=="string"?JSON.parse(T):T;F.cursor=await hr(m,q);}catch{}if(A){if(m.orderableFields&&!m.orderableFields.includes(A)){L(c,`Field not orderable: ${A}`,400);return}F.orderBy=[{field:A,direction:E}];}j.length>0&&(F.where=j.map(q=>[q.field,q.op,q.value])),P&&(F.select=P),_&&(F.include=_);let D=await m.repo.query.paginate(F),de={items:await s(m,a(w),f,D.data),hasNextPage:D.hasNextPage,hasPrevPage:D.hasPrevPage,nextCursor:xt(D.nextCursor),prevCursor:xt(D.prevCursor)};je(c,de,{pageSize:C,hasMore:D.hasNextPage});}catch(S){tn(c,S,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:h,sort:R},"Failed to fetch documents",n);}}async function d(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=a(w);if(!await o(c,m,"list",{user:p,query:w.body??{},params:f}))return;let h=[],R;try{let S=w.body??{},C=Math.min(S.pageSize||m.pageSize,100),T=S.direction==="prev"?"prev":"next";S.where&&(h=S.where.map(P=>({field:String(P[0]),op:P[1],value:String(P[2]??"")}))),S.orderBy&&S.orderBy[0]&&(R={field:S.orderBy[0].field,dir:S.orderBy[0].direction==="desc"?"desc":"asc"});let O={pageSize:C,direction:T};if(S.cursor)try{let P=typeof S.cursor=="string"?JSON.parse(S.cursor):S.cursor;O.cursor=await hr(m,P);}catch{}if(m.allowedIncludes&&S.includes&&S.includes.length>0){let P=S.includes.filter(_=>typeof _=="string"?m.allowedIncludes.includes(_):typeof _=="object"&&_!==null&&"relation"in _&&typeof _.relation=="string"?m.allowedIncludes.includes(_.relation):!1);P.length>0&&(O.include=P);}if(S.where&&S.where.length>0){if(m.filterableFields){let P=new Set(m.filterableFields),_=S.where.filter(j=>!P.has(j[0]));if(_.length>0){L(c,`Fields not filterable: ${_.map(j=>j[0]).join(", ")}`,400);return}}O.where=S.where;}if(S.orWhere&&S.orWhere.length>0){if(m.filterableFields){let P=new Set(m.filterableFields),_=S.orWhere.filter(j=>!P.has(j[0]));if(_.length>0){L(c,`Fields not filterable: ${_.map(j=>j[0]).join(", ")}`,400);return}}O.orWhere=S.orWhere;}if(S.orWhereGroups&&S.orWhereGroups.length>0){if(m.filterableFields){let P=new Set(m.filterableFields);for(let _ of S.orWhereGroups){let j=_.filter(F=>!P.has(F[0]));if(j.length>0){L(c,`Fields not filterable: ${j.map(F=>F[0]).join(", ")}`,400);return}}}O.orWhereGroups=S.orWhereGroups;}if(S.orderBy&&S.orderBy.length>0){if(m.orderableFields){let P=new Set(m.orderableFields),_=S.orderBy.filter(j=>!P.has(j.field));if(_.length>0){L(c,`Fields not orderable: ${_.map(j=>j.field).join(", ")}`,400);return}}O.orderBy=S.orderBy;}S.select&&S.select.length>0&&(O.select=S.select);let A=await m.repo.query.paginate(O),$={items:await s(m,a(w),f,A.data),hasNextPage:A.hasNextPage,hasPrevPage:A.hasPrevPage,nextCursor:xt(A.nextCursor),prevCursor:xt(A.prevCursor)};je(c,$,{pageSize:C,hasMore:A.hasNextPage});}catch(S){tn(c,S,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:h,sort:R},"Failed to query documents",n);}}async function g(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;let p=f.id;if(!p){L(c,"Document ID required",400);return}try{let h=await u(m,p);if(!h){L(c,"Document not found",404);return}let R=a(w);if(!await o(c,m,"get",{user:R,doc:h,params:f}))return;if(r&&m.rules?.filter)try{if(!await m.rules.filter({user:R,doc:h,params:f})){L(c,"Document not found",404);return}}catch{L(c,"Document not found",404);return}je(c,h);}catch(h){tn(c,h,{ref:m.repo.ref,path:m.path,isGroup:!!m.isGroup,filters:[{field:m.documentKey,op:"==",value:p}]},"Failed to fetch document",n);}}async function x(w,c){let f=w.params||{},m=l(f.repoName,c);if(m)try{let p=w.body??{},h=a(w);if(!await o(c,m,"create",{user:h,body:p,params:f}))return;let R=mr(m.schema,p,m.createFields,!1,m.systemKeys);if(!R.success){L(c,R.error,400);return}if(m.validate){let C=await m.validate(R.data,"create");if(C){L(c,C,400);return}}let S;if(m.isGroup&&m.parentKeys&&m.parentKeys.length>0){let C={...R.data};m.createdKey&&(C[m.createdKey]=new Date);let T=m.parentKeys.filter(E=>!C[E]);if(T.length>0){L(c,`Missing parent key(s) for subcollection create: ${T.join(", ")}`,400);return}let O=m.parentKeys.map(E=>C[E]),A=C[m.documentKey]||ns();S=await m.repo.set(...O,A,C);}else S=await m.repo.create(R.data);je(c,S,void 0,201);}catch(p){let h=n&&p instanceof Error?p.message:"Failed to create document";L(c,h,500);}}async function b(w,c,f){let m=w.params||{},p=l(m.repoName,c);if(!p)return;let h=m.id;if(!h){L(c,"Document ID required",400);return}try{let R=w.body??{},S=await u(p,h);if(!S){L(c,"Document not found",404);return}let C=a(w);if(!await o(c,p,"update",{user:C,doc:S,body:R,params:m}))return;let T=mr(p.schema,R,p.mutableFields,f,p.systemKeys);if(!T.success){L(c,T.error,400);return}if(p.validate){let E=await p.validate(T.data,"update");if(E){L(c,E,400);return}}let O=i(S,p.pathKey)??[h],A=await p.repo.update(...O,T.data);je(c,A);}catch(R){let S=n&&R instanceof Error?R.message:"Failed to update document";L(c,S,500);}}async function v(w,c){let f=w.params||{},m=l(f.repoName,c);if(!m)return;if(!m.allowDelete){L(c,"Delete not allowed for this repository",403);return}let p=f.id;if(!p){L(c,"Document ID required",400);return}try{let h=await u(m,p);if(!h){L(c,"Document not found",404);return}let R=a(w);if(!await o(c,m,"delete",{user:R,doc:h,params:f}))return;let S=i(h,m.pathKey)??[p];await m.repo.delete(...S),je(c,{deleted:!0});}catch(h){let R=n&&h instanceof Error?h.message:"Failed to delete document";L(c,R,500);}}function k(w,c){c.status(204).set("Access-Control-Allow-Methods","GET, POST, PUT, PATCH, DELETE, OPTIONS").set("Access-Control-Allow-Headers","Content-Type, Authorization").set("Access-Control-Max-Age","86400").send("");}return {handleList:y,handleQuery:d,handleGet:g,handleCreate:x,handleUpdate:b,handleDelete:v,handleOptions:k}}function on(e){try{return zod.z.toJSONSchema(e,{target:"openapi-3.1",unrepresentable:"any",override:t=>{let n=t.zodSchema?._zod?.def;n&&(n.type==="date"?(t.jsonSchema.type="string",t.jsonSchema.format="date-time"):n.type==="bigint"&&(t.jsonSchema.type="string",t.jsonSchema.format="int64"));}})}catch(t){return typeof console<"u"&&console.warn&&console.warn("[generateOpenAPISpec] Failed to convert Zod schema to JSON Schema; falling back to {type:object}.",t),{type:"object"}}}function ae(e){return {$ref:`#/components/schemas/${e}`}}function ee(e){return {description:e,content:{"application/json":{schema:ae("ErrorResponse")}}}}function et(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function xr(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 ss(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 as(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 is(){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 ls(e,t,n,r,o){let s={},a=e.name,l=`${t}/${e.name}`,i=`${l}/{${e.documentKey}}`,u={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[l]={get:{operationId:`list${ke(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...ss(e),...as(e)],responses:{200:xr(ae(n)),500:ee("Internal server error")}},post:{operationId:`create${ke(e.name)}`,summary:`Create a ${ce(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ae(r??n)}}},responses:{201:et("Document created",ae(n)),400:ee("Validation error"),500:ee("Internal server error")}}},s[`${l}/query`]={post:{operationId:`query${ke(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ae("QueryRequestBody")}}},responses:{200:xr(ae(n)),400:ee("Invalid query"),500:ee("Internal server error")}}};let y={};return y.get={operationId:`get${ke(ce(e.name))}`,summary:`Get a single ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:et("Document found",ae(n)),404:ee("Document not found"),500:ee("Internal server error")}},y.put={operationId:`update${ke(ce(e.name))}`,summary:`Update a ${ce(e.name)} (full replace)`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:ae(o??n)}}},responses:{200:et("Document updated",ae(n)),400:ee("Validation error"),404:ee("Document not found"),500:ee("Internal server error")}},y.patch={operationId:`patch${ke(ce(e.name))}`,summary:`Partially update a ${ce(e.name)}`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:{allOf:[ae(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:et("Document patched",ae(n)),400:ee("Validation error"),404:ee("Document not found"),500:ee("Internal server error")}},e.allowDelete&&(y.delete={operationId:`delete${ke(ce(e.name))}`,summary:`Delete a ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:et("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:ee("Document not found"),500:ee("Internal server error")}}),s[i]=y,s}function an(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:l=false}=n,i=t==="/"?"":t.replace(/\/$/,""),u={},y={},d=[];u.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},u.QueryRequestBody=is();for(let[v,k]of Object.entries(e)){let w=ke(ce(v)),c=`${w}Create`,f=`${w}Update`;u[w]=on(k.schema);let m=T=>{let O=T&&T.length>0?T:Object.keys(k.schema.shape),A={};for(let E of O){let $=E.split(".")[0];$&&k.schema.shape[$]&&!k.systemKeys.includes($)&&(A[$]=k.schema.shape[$]);}return A},p=null,h=m(k.createFields);Object.keys(h).length>0&&(u[c]=on(zod.z.object(h)),p=c);let R=null,S=m(k.mutableFields);Object.keys(S).length>0&&(u[f]=on(zod.z.object(S)),R=f);let C=ls(k,i,w,p,R);Object.assign(y,C),d.push({name:v,description:`Operations on ${v} (collection: ${k.path})`});}let g={},x;return l==="basic"?(g.basicAuth={type:"http",scheme:"basic"},x=[{basicAuth:[]}]):l==="bearer"&&(g.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},x=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...a&&a.length>0?{servers:a}:{},paths:y,components:{schemas:u,...Object.keys(g).length>0?{securitySchemes:g}:{}},...x?{security:x}:{},tags:d}}function ke(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ce(e){return e.endsWith("ies")?e.slice(0,-3)+"y":e.endsWith("ses")||e.endsWith("xes")||e.endsWith("zes")?e.slice(0,-2):e.endsWith("s")&&!e.endsWith("ss")?e.slice(0,-1):e}function cs(e,t){return `<!DOCTYPE html>
|
|
1146
|
+
`;function Ve(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:er}})}zt();function ve(e){return "<!DOCTYPE html>"+server.renderToString(e)}var zo=["corporate","silk","dark"],Zo=()=>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:zo.map(e=>jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsxRuntime.jsx("span",{children:e}),jsxRuntime.jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),we=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:o,basePath:s="/"}=e;return jsxRuntime.jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxRuntime.jsxs("head",{children:[jsxRuntime.jsx("meta",{charset:"UTF-8"}),jsxRuntime.jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxRuntime.jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxRuntime.jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsxRuntime.jsxs("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:[jsxRuntime.jsx("div",{class:"flex-1",children:jsxRuntime.jsx("a",{href:s,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsxRuntime.jsx("div",{class:"flex-none",children:jsxRuntime.jsx(Zo,{})})]}),jsxRuntime.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((a,l)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},l):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},l))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(Bt,{basePath:s}),jsxRuntime.jsx(Ve,{})]})]})};function Zt(e,t){return ve(jsxRuntime.jsx(we,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Kt(e,t){return ve(jsxRuntime.jsx(we,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxRuntime.jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsxRuntime.jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsxRuntime.jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:e.map(n=>jsxRuntime.jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxRuntime.jsxs("div",{class:"card-body p-5",children:[jsxRuntime.jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsxRuntime.jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var or=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],Ko=[{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"}],Lo=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function Uo(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return Ko;case "ZodBoolean":return or;case "ZodArray":return Lo;default:return or}}var Re="__null__";function qo(e){return `(function(cb){var i=document.getElementById('${e}');if(!i)return;if(cb.checked){i.dataset._prev=i.value;if(i.tagName==='SELECT'){var o=i.querySelector('option[value="${Re}"]');if(!o){o=document.createElement('option');o.value='${Re}';o.textContent='\u2205 null';o.dataset._auto='1';i.appendChild(o);}o.selected=true;}else{if(i.type==='number'||i.type==='datetime-local'){i.dataset._type=i.type;i.type='text';}i.value='${Re}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${Re}"][data-_auto="1"]');if(o2)o2.remove();var prev=i.dataset._prev||'';for(var k=0;k<i.options.length;k++)i.options[k].selected=(i.options[k].value===prev);}else{if(i.dataset._type){i.type=i.dataset._type;delete i.dataset._type;}i.readOnly=false;i.value=(i.dataset._prev&&i.dataset._prev!=='${Re}')?i.dataset._prev:'';}}})(this)`}function Qo(e,t){return `(function(){var h=document.getElementById('${e}');var boxes=document.querySelectorAll('input[data-enum-group="${t}"]');h.value=Array.from(boxes).filter(function(b){return b.checked;}).map(function(b){return b.value;}).join(',');})()`}function Ge({inputId:e,active:t}){return jsxRuntime.jsxs("label",{class:"flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/60 hover:text-base-content border border-base-300 rounded-md px-1.5 py-1 shrink-0 leading-none h-8",title:"Filter where field IS NULL",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:qo(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Vo({col:e,active:t}){let n=t?.value??"",r=n===Re,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,a=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(a){let l=new Set(n.split(",").map(u=>u.trim()).filter(Boolean)),i=`eg_${e.name.replace(/\./g,"__")}`;return jsxRuntime.jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{type:"hidden",id:o,name:`fv_${e.name}`,value:n}),e.enumValues.map(u=>jsxRuntime.jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:u,checked:l.has(u),"data-enum-group":i,onchange:Qo(o,i)}),jsxRuntime.jsx("span",{children:u})]},u))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(l=>jsxRuntime.jsx("option",{value:l,selected:n===l,children:l},l)),e.nullable&&jsxRuntime.jsx("option",{value:Re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsxRuntime.jsx("option",{value:Re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let l=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:l?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]})}function Lt({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(i=>[i.field,i])),s=n.length>0,a=n.length>=2||r&&s,l=t.filter(i=>i.zodType!=="ZodObject"&&i.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:l.map(i=>{let u=Uo(i.zodType),m=o[i.name],f=m?.op??u[0].value;return jsxRuntime.jsxs("div",{class:"flex flex-col gap-1.5",children:[jsxRuntime.jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:i.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[u.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:u.map(w=>jsxRuntime.jsx("option",{value:w.value,selected:w.value===f,children:w.label},w.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:u[0].value}),jsxRuntime.jsx(Vo,{col:i,active:m})]})]},i.name)})}),jsxRuntime.jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),s&&jsxRuntime.jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),a&&jsxRuntime.jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function Ut(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,l=n==="create"?[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:"New document"}]:[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:`Edit ${r??""}`}];return ve(jsxRuntime.jsx(we,{opts:{title:a,breadcrumb:l,basePath:o,flash:s},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}ht();Ht();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 sr(e,t,n,r,o){let s=qt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function Wo(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 Go(e,t,n){return `?${qt(t,n,e).toString()}`}function Qt(e,t,n,r,o,s,a=[],l=[],i=false,u=[],m,f,w,b,g,k,v,x=false){let y=`${r}/${e}`,c=`${y}/create`,d={};if(v)for(let T of n)d[T]=_e(Fe(v,T));let p=(k??[]).filter(T=>{let O=d[T]??_e(Fe(v,T));return O==="string"||O==="number"||O==="bigint"||O==="boolean"||O==="enum"||O==="literal"}),h=p.length>0,R=i,S=R||h,E=p.map(T=>{let O=Fe(v,T),A=_e(O),$=a.find(P=>P.name===T);return {name:T,type:A,enumValues:$?.enumValues??null,nullable:$?.nullable??false}});return ve(jsxRuntime.jsxs(we,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Lt,{action:y,columnMeta:a,activeFilters:l,isGroup:b}),w&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${w.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-6 w-6 shrink-0 stroke-current",fill:"none",viewBox:"0 0 24 24",children:w.type==="index"?jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}):jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"})}),jsxRuntime.jsxs("div",{class:"flex-1",children:[jsxRuntime.jsx("h3",{class:"font-bold",children:w.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:w.message})]}),w.indexUrl&&jsxRuntime.jsx("a",{href:w.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxRuntime.jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxRuntime.jsxs("div",{class:"flex items-center gap-3",children:[jsxRuntime.jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof g=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of"," ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:g})]})," ","document",(typeof g=="number"?g:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(T=>jsxRuntime.jsx("a",{href:Go(T,l,m),class:`join-item btn btn-xs ${f===T?"btn-active btn-primary":"btn-outline"}`,children:T},T))})]})]}),jsxRuntime.jsx("a",{href:c,class:"btn btn-primary btn-sm",children:"+ New"})]}),S&&jsxRuntime.jsxs("div",{class:"hidden mb-3 alert alert-info py-2 px-3","data-frs-bulk-bar":true,"data-frs-repo":e,"data-frs-total":typeof g=="number"?String(g):"","data-frs-page-size":String(f??t.length),"data-frs-allow-delete":R?"1":"0","data-frs-allow-update":h?"1":"0","data-frs-fields":JSON.stringify(E),"data-frs-filters":JSON.stringify(l),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof g=="number"&&g>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",g," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",g??"?"," matching documents are selected."," ",jsxRuntime.jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxRuntime.jsxs("div",{class:"flex gap-2",children:[h&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),R&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[S&&jsxRuntime.jsx("th",{class:"w-8",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((T,O)=>{let A=m?.field===T,$=A?m.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:Wo(T,m,l,f),class:`hover:text-base-content inline-flex items-center gap-0.5${A?" text-primary font-bold":""}`,children:[T,$]})},O)}),u.map((T,O)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:T.column},`rel-${O}`)),jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsxRuntime.jsx("tbody",{children:t.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:n.length+u.length+1+(S?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((T,O)=>{let A=String(T.docId??T.id??""),$=`${r}/${e}/${encodeURIComponent(A)}/edit`,P=`${r}/${e}/${encodeURIComponent(A)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":A,children:[S&&jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:A,"aria-label":`Select ${A}`})}),n.map((C,I)=>{let N=T[C],F=d[C],D=F?We(F,N):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(Ie,{val:N,mismatch:D})},I)}),u.map((C,I)=>{let N=T[C.key];if(N==null||N==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${I}`);let F=C.type==="one"?`${r}/${C.targetRepo}/${encodeURIComponent(String(N))}/edit`:`${r}/${C.targetRepo}?fv_${C.targetKey}=${encodeURIComponent(String(N))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:F,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":C.type,"data-frs-rel-repo":C.targetRepo,"data-frs-rel-fk":C.targetKey,"data-frs-rel-val":String(N),"data-frs-rel-label":C.column,children:C.column})},`rel-${I}`)}),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:$,class:"btn btn-xs btn-outline",children:"Edit"}),x&&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:P,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:sr(l,o.prevCursor,"prev",m,f),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:sr(l,o.nextCursor,"next",m,f),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof g=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[g," total document",g!==1?"s":"",l.length>0?" matching filters":""]})]}),S&&h&&jsxRuntime.jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxRuntime.jsxs("div",{class:"modal-box",children:[jsxRuntime.jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsxRuntime.jsx("p",{class:"text-sm text-base-content/60 mb-4","data-frs-bulk-update-summary":true,children:"Update one field on the selected documents."}),jsxRuntime.jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxRuntime.jsxs("label",{class:"form-control w-full mb-3",children:[jsxRuntime.jsx("div",{class:"label",children:jsxRuntime.jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxRuntime.jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsxRuntime.jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),p.map(T=>jsxRuntime.jsx("option",{value:T,children:T},T))]})]}),jsxRuntime.jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxRuntime.jsxs("div",{class:"modal-action",children:[jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsxRuntime.jsx("form",{method:"dialog",class:"modal-backdrop",children:jsxRuntime.jsx("button",{children:"close"})})]})]}))}function Je(e,t){return Zt(e,t)}function Vt(e,t){return Kt(e,t)}function Wt(e,t,n,r,o,s,a,l,i,u,m,f,w,b,g,k,v,x){return Qt(e,t,n,r,o,s,a,l,i,u,m,f,w,b,g,k,v,x)}function Se(e,t,n,r,o,s){return Ut(e,t,n,r,o,s)}var Gt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function es(){let e="";for(;e.length<20;){let t=crypto.randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=Gt.length*4||(e+=Gt.charAt(r%Gt.length));}}return e}function xt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),o=[];for(let s=1;s<r.length;s+=2)o.push(r[s]);return o.length>0?o:void 0}async function Ne(e,t){let n=e.documentKey??"docId",r=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[r]=="function")try{let s=await e.repo.get[r](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Jt(e,t,n){let r=e.documentKey??"docId",o=Qe(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return o.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...o.indexUrl?{action:{href:o.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:o.message}}function H(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Xt(e,t){e.status(302).set("Location",t).send("");}function Yt(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=tn(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let u={},m=false;for(let[b,g]of Object.entries(e))b.startsWith(`${o}.`)&&(u[b.slice(o.length+1)]=g,m=true);if(m){let b=s;for(;;){let g=L(b);if(g==="ZodOptional"||g==="ZodNullable"||g==="ZodDefault")b=G(b);else break}r[o]=Yt(u,b);continue}let f=e[o],w=Array.isArray(f)?f[f.length-1]:f;if(w)try{r[o]=JSON.parse(w);}catch{r[o]=w;}continue}let l=e[o],i=Array.isArray(l)?l[l.length-1]:l;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(i===void 0||i===""){a==="ZodBoolean"&&(r[o]=false);continue}switch(a){case "ZodBoolean":i==="__null__"?r[o]=null:r[o]=i==="true"||i==="on"||i==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(i);break;case "ZodDate":r[o]=new Date(i);break;case "ZodArray":try{r[o]=JSON.parse(i);}catch{r[o]=i;}break;default:if(i.startsWith("{")||i.startsWith("["))try{r[o]=JSON.parse(i);break}catch{}r[o]=i;}}return r}function ar(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 tn(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function ts(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function lr(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=G(t);continue}return false}}function cr(e){let t=ts(e),n=L(t);if(n==="ZodEnum"){let r=Ze(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Ke(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=Le(t);return typeof r=="string"?[r]:void 0}}function dr(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,a=e[o];if(a===null){r[s]="__null__";continue}if(a===void 0)continue;let l=t.shape[o];for(;;){let u=L(l);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")l=G(l);else break}let i=L(l);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let u=dr(a,l,s);Object.assign(r,u);}else if(i==="ZodDate"){let u=ar(a);u!==null&&(r[s]=u);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let u=ar(a);r[s]=u??JSON.stringify(a,null,2);}else typeof a=="object"?r[s]=JSON.stringify(a,null,2):r[s]=String(a);}return r}function en(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?en(n.nested,t):void 0}))}function ns(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[o,s]of Object.entries(e)){if(!o.startsWith("fv_"))continue;let a=o.slice(3);if(!t.has(a))continue;let l=(s??"").trim();if(!l)continue;let i=e[`fo_${a}`]??"==",u=n.has(i)?i:"==";r.push({field:a,op:u,value:l});}return r}function ir(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 ur(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,a=t.shape[o];if(!a){r.push({name:s,zodType:"ZodString"});continue}let l=tn(a);if(l==="ZodObject"){let i=a;for(;;){let m=L(i);if(m==="ZodOptional"||m==="ZodNullable"||m==="ZodDefault")i=G(i);else break}let u=re(i);r.push(...ur(Object.keys(u),i,s));}else r.push({name:s,zodType:l,nullable:lr(a),enumValues:cr(a)});}return r}function rs(e,t){let n=t.split("."),r=e;for(let o of n){for(;;){let a=L(r);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")r=G(r);else break}let s=re(r);if(!(o in s))return null;r=s[o];}return r}function Oe(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let a=s.indexOf(".");if(a===-1)n.push(s);else {let l=s.slice(0,a),i=s.slice(a+1);r.has(l)||r.set(l,[]),r.get(l).push(i);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,a]of r){if(!(s in e.shape))continue;let l=e.shape[s];for(;;){let i=L(l);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")l=G(l);else break}if(L(l)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Oe(l,a);}return zod.z.object(o)}function me(e,t,n){return ne(e,t,n)}function pr(e,t,n){let r=(y,c)=>{let d=me(y,t,n),p=Object.values(e).map(h=>({name:h.name,path:h.path}));H(c,Vt(p,d));},o=async(y,c)=>{let d=y.params.repoName;if(!d){H(c,"Bad request",400);return}let p=e[d];if(!p){H(c,"Repository not found",404);return}let h=p.pageSize??25,R=y.query??{},S=R.cursor,E=R.dir==="prev"?"prev":"next",T=R.ob??"",O=R.od==="desc"?"desc":"asc",A=T?{field:T,dir:O}:void 0,$=parseInt(R.ps??""),P=Number.isFinite($)&&$>0?Math.min($,200):h,C=p.listColumns??Object.keys(p.schema.shape),I=p.documentKey??"docId",N=[I,...C.filter(W=>W!==I)];A&&(new Set([I,...C]).has(A.field)||(A=void 0));let F=p.filterableFields?(()=>{let W=[];for(let ue of p.filterableFields)(ue.includes(".")||C.includes(ue))&&W.push(ue);return W})():C,D=(()=>{let W=[];for(let ue of F)if(ue.includes(".")){let Ee=rs(p.schema,ue);W.push({name:ue,zodType:Ee?tn(Ee):"ZodString",nullable:Ee?lr(Ee):false,enumValues:Ee?cr(Ee):void 0});}else W.push(...ur([ue],p.schema));return W})(),Q=new Set(D.map(W=>W.name)),de=ns(R,Q),U=ir(de),ie;if(S)try{let W=p.repo.ref;typeof W.doc=="function"&&(ie=await W.doc(S).get());}catch{}let[X,tt]=await Promise.all([p.repo.query.paginate({pageSize:P,cursor:ie,direction:E,...U.length>0?{where:U}:{},...A?{orderBy:[{field:A.field,direction:A.dir}]}:{}}).catch(W=>({queryError:Qe(W,{ref:p.repo.ref,path:p.path,isGroup:!!p.isGroup,filters:de,sort:A})})),p.repo.aggregate.count(U.length>0?{where:U}:{}).catch(()=>{})]),$e="queryError"in X,Cr=$e?[]:X.data,Ar=$e?"":X.nextCursor?.id??"",Or=$e?"":X.prevCursor?.id??"",$r=$e?X.queryError:void 0,Er=me(y,t,n);H(c,Wt(p.name,Cr,N,Er,{hasPrev:$e?false:X.hasPrevPage,hasNext:$e?false:X.hasNextPage,prevCursor:Or,nextCursor:Ar},void 0,D,de,p.allowDelete??false,p.relationalMeta,A,P,$r,p.isGroup,tt,p.mutableFields,p.schema,p.historyEnabled));},s=(y,c)=>{let d=y.params.repoName;if(!d){H(c,"Bad request",400);return}let p=e[d];if(!p){H(c,"Repository not found",404);return}let h=me(y,t,n),R=Oe(p.schema,p.createFields),S=le(R),E=`${h}/${p.name}/create`,T=xe(S,E,"POST","Create document");H(c,Se(p.name,T,"create",null,h));},a=async(y,c)=>{let d=y.params.repoName;if(!d){H(c,"Bad request",400);return}let p=e[d];if(!p){H(c,"Repository not found",404);return}let h=me(y,t,n),R=y.body??{},S=Yt(R,p.schema),E=Oe(p.schema,p.createFields),T=E.safeParse(S);if(!T.success){let O=le(E),A=`${h}/${p.name}/create`,$=xe(O,A,"POST","Create document"),P=T.error.issues.map(C=>`${C.path.join(".")}: ${C.message}`).join(", ");H(c,Se(p.name,$,"create",null,h,{type:"error",message:`Validation error: ${P}`}),422);return}try{if(p.isGroup&&p.parentKeys&&p.parentKeys.length>0){let O={...T.data};p.createdKey&&(O[p.createdKey]=new Date);let A=p.parentKeys.filter(I=>!O[I]);if(A.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${A.join(", ")}`);let $=p.parentKeys.map(I=>O[I]),P=p.documentKey??"docId",C=O[P]||es();await p.repo.set(...$,C,O);}else await p.repo.create(T.data);Xt(c,`${h}/${p.name}?flash=created`);}catch(O){let A=Oe(p.schema,p.createFields),$=le(A),P=`${h}/${p.name}/create`,C=xe($,P,"POST","Create document");H(c,Se(p.name,C,"create",null,h,{type:"error",message:`Save error: ${O.message}`}),500);}},l=async(y,c)=>{let d=y.params.repoName,p=y.params.id;if(!d||!p){H(c,"Bad request",400);return}let h=e[d];if(!h){H(c,"Repository not found",404);return}let R=me(y,t,n),S=null;try{S=await Ne(h,p);}catch(P){let C=Jt(h,p,P),I=Ce(P)?424:500;H(c,Je("",{title:`Edit ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`Edit ${p}`}],flash:C}),I);return}if(!S){H(c,"Document not found",404);return}let E=dr(S,h.schema),T=Oe(h.schema,h.mutableFields),O=en(le(T),E),A=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,$=xe(O,A,"POST","Save changes");H(c,Se(h.name,$,"edit",p,R));},i=async(y,c)=>{let d=y.params.repoName,p=y.params.id;if(!d||!p){H(c,"Bad request",400);return}let h=e[d];if(!h){H(c,"Repository not found",404);return}let R=me(y,t,n),S=y.body??{},E=Yt(S,h.schema),T=Oe(h.schema,h.mutableFields),A=T.partial().safeParse(E);if(!A.success){let $=Object.fromEntries(Object.entries(S).map(([F,D])=>[F,Array.isArray(D)?D.join(","):D??""])),P=en(le(T),$),C=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,I=xe(P,C,"POST","Save changes"),N=A.error.issues.map(F=>`${F.path.join(".")}: ${F.message}`).join(", ");H(c,Se(h.name,I,"edit",p,R,{type:"error",message:`Validation error: ${N}`}),422);return}try{let $=await Ne(h,p),P=($&&xt($,h.pathKey))??[p];await h.repo.update(...P,A.data),Xt(c,`${R}/${h.name}?flash=updated`);}catch($){let P=Oe(h.schema,h.mutableFields),C=le(P),I=`${R}/${h.name}/${encodeURIComponent(p)}/edit`,N=xe(C,I,"POST","Save changes"),F=Ce($)?Jt(h,p,$):{type:"error",message:`Save error: ${$.message}`},D=Ce($)?424:500;H(c,Se(h.name,N,"edit",p,R,F),D);}},u=async(y,c)=>{let d=y.params.repoName,p=y.params.id;if(!d||!p){H(c,"Bad request",400);return}let h=e[d];if(!h){H(c,"Repository not found",404);return}if(!h.allowDelete){H(c,"Delete is not allowed for this repository",403);return}let R=me(y,t,n);try{let S=await Ne(h,p),E=(S&&xt(S,h.pathKey))??[p];await h.repo.delete(...E),Xt(c,`${R}/${h.name}?flash=deleted`);}catch(S){let E=Ce(S)?Jt(h,p,S):{type:"error",message:`Delete error: ${S.message}`},T=Ce(S)?424:500;H(c,Je("",{title:`Delete ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`Delete ${p}`}],flash:E}),T);}},m=async(y,c)=>{let d=y.params.repoName;if(!d){H(c,"Bad request",400);return}let p=e[d];if(!p){H(c,"Repository not found",404);return}let h=me(y,t,n),R=y.query,S=R?.type==="many"?"many":"one",E=Math.max(1,Math.min(100,Number(R?.ps??25)||25)),T=p.listColumns??Object.keys(re(p.schema)),{PanelOne:O,PanelMany:A}=await Promise.resolve().then(()=>(zt(),nr)),{renderToString:$}=await import('hono/jsx/dom/server');if(S==="one"){let D=String(R?.id??"");if(!D){H(c,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let Q=await Ne(p,D),de=$(O({doc:Q,repoName:p.name,basePath:h,schema:p.schema,columns:T}));H(c,de);}catch(Q){H(c,`<div class='p-6 text-error text-sm'>Error: ${Q.message}</div>`,500);}return}let P=String(R?.fk??""),C=String(R?.fv??"");if(!P||!C){H(c,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let I=R?.cursor??"",N=R?.dir==="prev"?"prev":"next",F;if(I)try{let D=p.repo.ref;typeof D.doc=="function"&&(F=await D.doc(I).get());}catch{}try{let D=await p.repo.query.paginate({pageSize:E,cursor:F,direction:N,where:[[P,"==",os(C)]]}),Q=$(A({docs:D.data,repoName:p.name,basePath:h,fk:P,fv:C,columns:T,schema:p.schema,pagination:{hasPrev:D.hasPrevPage,hasNext:D.hasNextPage,prevCursor:D.prevCursor?.id??"",nextCursor:D.nextCursor?.id??"",pageSize:E}}));H(c,Q);}catch(D){H(c,`<div class='p-6 text-error text-sm'>Error: ${D.message}</div>`,500);}},f=async(y,c)=>{let d=[];for(let p of c){let h;if(y.isGroup||y.parentKeys?.length){let R=await Ne(y,p);h=R?xt(R,y.pathKey):void 0;}h||(h=[p]);try{let R=y.repo.documentRef(...h);R&&d.push(R);}catch{}}return d},w=async(y,c)=>{let d=ir(c),p=y.documentKey??"docId",h=[],R;for(;;){let S=await y.repo.query.paginate({pageSize:500,cursor:R,direction:"next",...d.length>0?{where:d}:{}});for(let E of S.data){let T=String(E[p]??E.id??"");T&&h.push(T);}if(!S.hasNextPage||!S.nextCursor)break;R=S.nextCursor;}return h},b=async(y,c)=>{let d=y.params.repoName;if(!d){te(c,{error:"Bad request"},400);return}let p=e[d];if(!p){te(c,{error:"Repository not found"},404);return}if(!p.allowDelete){te(c,{error:"Delete is not allowed for this repository"},403);return}let h=y.body??{};try{let R=await k(p,h);if(R.length===0){te(c,{deleted:0});return}let S=await f(p,R);for(let E=0;E<S.length;E+=500)await p.repo.bulk.delete(S.slice(E,E+500));te(c,{deleted:S.length});}catch(R){te(c,{error:R.message},500);}},g=async(y,c)=>{let d=y.params.repoName;if(!d){te(c,{error:"Bad request"},400);return}let p=e[d];if(!p){te(c,{error:"Repository not found"},404);return}let h=y.body??{},R=String(h.field??"");if(!R){te(c,{error:"Missing 'field'"},400);return}if(!p.mutableFields||!p.mutableFields.includes(R)){te(c,{error:`Field '${R}' is not bulk-updatable`},403);return}let S=p.schema.shape?.[R],E=h.value;if(S){let T=S.safeParse(h.value);if(!T.success){te(c,{error:`Invalid value for '${R}': ${T.error.message}`},400);return}E=T.data;}try{let T=await k(p,h);if(T.length===0){te(c,{updated:0});return}let A=(await f(p,T)).map($=>({docRef:$,data:{[R]:E}}));for(let $=0;$<A.length;$+=500)await p.repo.bulk.update(A.slice($,$+500));te(c,{updated:A.length});}catch(T){te(c,{error:T.message},500);}};async function k(y,c){if(c.selectAll){let d=v(c.filters,y);return await w(y,d)}return Array.isArray(c.ids)?c.ids.filter(d=>typeof d=="string"&&!!d):[]}function v(y,c){if(!Array.isArray(y))return [];let d=new Set((c.filterableFields??Object.keys(re(c.schema))).map(R=>String(R))),p=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),h=[];for(let R of y)R&&typeof R=="object"&&typeof R.field=="string"&&d.has(R.field)&&typeof R.value=="string"&&p.has(String(R.op))&&h.push({field:R.field,op:R.op,value:R.value});return h}return {handleDashboard:r,handleList:o,handleCreateForm:s,handleCreateSubmit:a,handleEditForm:l,handleEditSubmit:i,handleDelete:u,handlePanel:m,handleBulkDelete:b,handleBulkUpdate:g,handleHistory:async(y,c)=>{let d=y.params.repoName,p=y.params.id;if(!d||!p){H(c,"Bad request",400);return}let h=e[d];if(!h){H(c,"Repository not found",404);return}if(!h.historyEnabled||!h.repo.history){H(c,"History not enabled for this repository",404);return}let R=me(y,t,n),S=h.historySubcollection??"history",E=[p];try{let D=await Ne(h,p),Q=D?xt(D,h.pathKey):void 0;Q&&Q.length>0&&(E=Q);}catch{}let T=parseInt(String(y.query?.limit??"")),O=Number.isFinite(T)&&T>0?Math.min(T,500):100,A=[],$;try{A=await h.repo.history.list(...E,{limit:O});}catch(D){$=D.message;}let P=D=>String(D??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),C=D=>{if(D===void 0)return '<span class="opacity-40">undefined</span>';if(D===null)return '<span class="opacity-40">null</span>';if(typeof D=="object")try{return `<code class="text-xs">${P(JSON.stringify(D))}</code>`}catch{return P(String(D))}return P(String(D))},I=D=>D?typeof D.toDate=="function"?D.toDate().toISOString():D instanceof Date?D.toISOString():P(String(D)):"",N=D=>`<span class="badge badge-sm ${D==="create"?"badge-success":D==="delete"?"badge-error":"badge-info"}">${P(D)}</span>`,F="";if(F+='<div class="flex items-center justify-between mb-4">',F+=`<a href="${R}/${h.name}/${encodeURIComponent(p)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,F+=`<a href="${R}/${h.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,F+="</div>",F+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${P(S)}</code> \xB7 Showing up to ${O} entries.</p>`,$)F+=`<div class="alert alert-error mb-4">${P($)}</div>`;else if(A.length===0)F+='<div class="alert">No history entries found.</div>';else {F+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',F+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let D of A){let Q=D.meta??{},de=[Q.reason,Q.comment].filter(X=>X!=null&&X!=="").map(X=>P(String(X))).join(" \u2014 "),U="",ie=Object.keys(D.changes??{});ie.length===0?U='<span class="opacity-40">\u2014</span>':U='<ul class="space-y-1">'+ie.map(X=>{let tt=D.changes[X];return `<li><strong>${P(X)}</strong>: ${C(tt.oldValue)} \u2192 ${C(tt.newValue)}</li>`}).join("")+"</ul>",F+="<tr>",F+=`<td class="whitespace-nowrap text-xs font-mono">${P(I(D.historySetAt))}</td>`,F+=`<td>${N(D.operation??"update")}</td>`,F+=`<td class="text-xs">${P(Q.userEmail??Q.userId??"")}</td>`,F+=`<td class="text-xs">${de}</td>`,F+=`<td>${U}</td>`,F+="</tr>";}F+="</tbody></table></div>";}H(c,Je(F,{title:`History \u2014 ${h.name} / ${p}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:h.name,href:`${R}/${h.name}`},{label:`History ${p}`}]}));}}}function te(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function os(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}var fr="https://cdn.jsdelivr.net",yr="https://www.gstatic.com",mr=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${fr} ${yr}`,`style-src 'self' 'unsafe-inline' ${fr}`,`connect-src 'self' ${yr} https://*.googleapis.com https://*.firebaseio.com https://identitytoolkit.googleapis.com`,"img-src 'self' data:","font-src 'self' data:","frame-ancestors 'none'","base-uri 'self'","form-action 'self'"].join("; ");function Xe(e={}){let t=e.csp===void 0?mr:e.csp,n=e.frameOptions===void 0?"DENY":e.frameOptions,r=e.referrerPolicy===void 0?"no-referrer":e.referrerPolicy,o=e.cacheControl===void 0?"private, no-store":e.cacheControl;return async(s,a,l)=>{typeof a?.setHeader=="function"&&(a.setHeader("X-Content-Type-Options","nosniff"),n&&a.setHeader("X-Frame-Options",n),r&&a.setHeader("Referrer-Policy",r),o&&a.setHeader("Cache-Control",o),t&&a.setHeader("Content-Security-Policy",t)),await l();}}async function ss(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function as(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 gr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],httpsOptions:l}=e,i=t==="/"?"":t.replace(/\/$/,""),u={};for(let[b,g]of Object.entries(n)){let k=g.schema??g.repo.schema??null;if(!k)throw new Error(`[createAdminServer] Repository "${b}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let v,x,y;if(g.fieldsConfig){let p=g.fieldsConfig;v=[],x=[],y=[];for(let[h,R]of Object.entries(p))for(let S of R)S==="filterable"?v.push(h):S==="mutable"?x.push(h):S==="create"&&y.push(h);v.length===0&&(v=void 0),x.length===0&&(x=void 0),y.length===0&&(y=void 0);}let c=(()=>{let p=g.repo._parentKeys;return p&&p.length>0?p:void 0})();if(c&&y)for(let p of c)y.includes(p)||y.push(p);let d={name:b,path:g.path,repo:g.repo,schema:k,documentKey:g.documentKey??"docId",pathKey:g.repo._pathKey??void 0,isGroup:!!g.repo._isGroup,parentKeys:c,createdKey:g.repo._createdKey??void 0,listColumns:g.listColumns,pageSize:g.pageSize,filterableFields:v,mutableFields:x,createFields:y,allowDelete:g.allowDelete??false,historyEnabled:!!g.repo._historyConfig?.enabled,historySubcollection:(g.repo._historyConfig?.enabled&&g.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!g.relationalFields||g.relationalFields.length===0)return;let p=g.repo.relationalKeys??{},h=[];for(let R of g.relationalFields){let S=p[R.key];S&&h.push({key:R.key,column:R.column,targetRepo:String(S.repo),targetKey:String(S.key),type:S.type});}return h.length>0?h:void 0})()};u[b]=d;}let m=pr(u,i,$n(l?.region)),f=new oe;if(o!==false&&f.use(Xe(o===void 0?{}:o)),r&&f.use(async(b,g,k)=>{let v=b,x=String(v.headers?.["content-type"]??"");if(x.includes("application/x-www-form-urlencoded")){let y=await ss(v);b.body=as(y);}else if(x.includes("application/json")&&typeof v.body=="string")try{b.body=JSON.parse(v.body);}catch{}await k();}),s)if(he(s)){for(let b of s.routes){let g=`${i}${b.path}`;b.method==="GET"?f.get(g,b.handler):f.post(g,b.handler);}f.use(s.middleware);}else if(typeof s=="function")f.use(s);else {let b=s.realm??"Admin",g="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");f.use((k,v,x)=>{if((k.headers?.authorization??"")!==g){v.status(401).set("WWW-Authenticate",`Basic realm="${b}"`).set("Content-Type","text/plain").send("Unauthorized");return}x();});}for(let b of a)f.use(b);f.get(`${i}/`,m.handleDashboard),f.get(`${i}`,m.handleDashboard),f.get(`${i}/:repoName/_panel`,m.handlePanel),f.post(`${i}/:repoName/_bulk/delete`,m.handleBulkDelete),f.post(`${i}/:repoName/_bulk/update`,m.handleBulkUpdate),f.get(`${i}/:repoName`,m.handleList),f.get(`${i}/:repoName/create`,m.handleCreateForm),f.post(`${i}/:repoName/create`,m.handleCreateSubmit),f.get(`${i}/:repoName/:id/edit`,m.handleEditForm),f.post(`${i}/:repoName/:id/edit`,m.handleEditSubmit),f.get(`${i}/:repoName/:id/history`,m.handleHistory),f.post(`${i}/:repoName/:id/delete`,m.handleDelete);let w=async(b,g)=>{await f.handle(b,g);};return l&&(w.httpsOptions=l),w}function on(e,t,n=200){let r=q(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function je(e,t,n,r=200){on(e,{success:true,data:t,meta:n},r);}function K(e,t,n=400){on(e,{success:false,error:t},n);}function nn(e,t,n,r,o){let s=Qe(t,n),a=s.type==="index",l=a?424:500,u={success:false,error:a?s.message:o&&t instanceof Error?t.message:r};a&&(u.errorType="index",s.indexUrl&&(u.indexUrl=s.indexUrl)),on(e,u,l);}var rn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function ls(){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>=rn.length*4||(e+=rn.charAt(r%rn.length));}}return e}function Me(e){let t=e._def??e.def;if(!t)return e;let n=t.typeName??t.type;if(n==="ZodDate"||n==="date")return zod.z.preprocess(r=>Tt(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=Me(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(Me(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Me(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Me(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=Me(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function cs(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let a of s){if(n.includes(a))continue;let l=a.split(".")[0];l&&r[l]&&(o[l]=r[l]);}return zod.z.object(o)}function hr(e,t,n,r=false,o=[]){try{let s=cs(e,n,o),a=r?s.partial():s;return {success:!0,data:(kt()==="normalize"?Me(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(l=>`${l.path.join(".")}: ${l.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function ds(e,t){let n=[],r=t?new Set(t):null,o={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[s,a]of Object.entries(e)){if(a===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let l=Array.isArray(a)?a[0]:a;if(l===void 0||l==="")continue;let i=s.match(/^(\w+)__(\w+)$/),u,m="==";if(i&&i[1]&&i[2]){u=i[1];let w=i[2];if(o[w])m=o[w];else continue}else if(!i)u=s;else continue;if(r&&!r.has(u))continue;let f=l;m==="in"||m==="not-in"||m==="array-contains-any"?f=l.split(",").map(w=>br(w.trim())):f=br(l),n.push({field:u,op:m,value:f});}return n}function br(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 vt(e){return e?{docId:e.id}:null}async function xr(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 vr(e,t,n,r=false){async function o(x,y,c,d){if(!r)return true;let p=y.rules?.[c];if(!p)return K(x,`Operation "${c}" is not allowed for this repository`,403),false;try{return await p(d)?!0:(K(x,"Forbidden",403),!1)}catch(h){let R=n&&h instanceof Error?h.message:"Forbidden";return K(x,R,403),false}}async function s(x,y,c,d){if(!r)return d;let p=x.rules?.filter;if(!p)return d;let h=[];for(let R of d)try{await p({user:y,doc:R,params:c})&&h.push(R);}catch{}return h}function a(x){return x?.user??null}function l(x,y){return !x||!e[x]?(K(y,`Repository "${x}" not found`,404),null):e[x]}function i(x,y){if(!y)return;let c=x[y];if(typeof c!="string"||!c)return;let d=c.split("/").filter(Boolean),p=[];for(let h=1;h<d.length;h+=2)p.push(d[h]);return p.length>0?p:void 0}async function u(x,y){let c=`by${x.documentKey.charAt(0).toUpperCase()}${x.documentKey.slice(1)}`,d=x.repo.get[c];if(typeof d=="function")try{let h=await d(y);if(h)return h}catch{}return (await x.repo.query.by({where:[[x.documentKey,"==",y]],limit:1}))[0]??null}async function m(x,y){let c=x.params||{},d=l(c.repoName,y);if(!d)return;let p=a(x);if(!await o(y,d,"list",{user:p,query:x.query??{},params:c}))return;let h=[],R;try{let S=x.query??{},E=Math.min(Number(S.pageSize)||d.pageSize,100),T=S.cursor,O=S.direction?.toLowerCase()==="prev"?"prev":"next",A=S.orderBy,$=S.orderDir?.toLowerCase()==="desc"?"desc":"asc",P=S.select,C=P?P.split(",").map(U=>U.trim()):void 0,I;d.allowedIncludes&&S.includes&&(I=(typeof S.includes=="string"?S.includes.split(",").map(ie=>ie.trim()):Array.isArray(S.includes)?S.includes:[]).filter(ie=>typeof ie=="string"&&d.allowedIncludes.includes(ie)),I?.length===0&&(I=void 0));let N=ds(S,d.filterableFields);h=N.map(U=>({field:U.field,op:U.op,value:String(U.value??"")})),A&&(R={field:A,dir:$});let F={pageSize:E,direction:O};if(T)try{let U=typeof T=="string"?JSON.parse(T):T;F.cursor=await xr(d,U);}catch{}if(A){if(d.orderableFields&&!d.orderableFields.includes(A)){K(y,`Field not orderable: ${A}`,400);return}F.orderBy=[{field:A,direction:$}];}N.length>0&&(F.where=N.map(U=>[U.field,U.op,U.value])),C&&(F.select=C),I&&(F.include=I);let D=await d.repo.query.paginate(F),de={items:await s(d,a(x),c,D.data),hasNextPage:D.hasNextPage,hasPrevPage:D.hasPrevPage,nextCursor:vt(D.nextCursor),prevCursor:vt(D.prevCursor)};je(y,de,{pageSize:E,hasMore:D.hasNextPage});}catch(S){nn(y,S,{ref:d.repo.ref,path:d.path,isGroup:!!d.isGroup,filters:h,sort:R},"Failed to fetch documents",n);}}async function f(x,y){let c=x.params||{},d=l(c.repoName,y);if(!d)return;let p=a(x);if(!await o(y,d,"list",{user:p,query:x.body??{},params:c}))return;let h=[],R;try{let S=x.body??{},E=Math.min(S.pageSize||d.pageSize,100),T=S.direction==="prev"?"prev":"next";S.where&&(h=S.where.map(C=>({field:String(C[0]),op:C[1],value:String(C[2]??"")}))),S.orderBy&&S.orderBy[0]&&(R={field:S.orderBy[0].field,dir:S.orderBy[0].direction==="desc"?"desc":"asc"});let O={pageSize:E,direction:T};if(S.cursor)try{let C=typeof S.cursor=="string"?JSON.parse(S.cursor):S.cursor;O.cursor=await xr(d,C);}catch{}if(d.allowedIncludes&&S.includes&&S.includes.length>0){let C=S.includes.filter(I=>typeof I=="string"?d.allowedIncludes.includes(I):typeof I=="object"&&I!==null&&"relation"in I&&typeof I.relation=="string"?d.allowedIncludes.includes(I.relation):!1);C.length>0&&(O.include=C);}if(S.where&&S.where.length>0){if(d.filterableFields){let C=new Set(d.filterableFields),I=S.where.filter(N=>!C.has(N[0]));if(I.length>0){K(y,`Fields not filterable: ${I.map(N=>N[0]).join(", ")}`,400);return}}O.where=S.where;}if(S.orWhere&&S.orWhere.length>0){if(d.filterableFields){let C=new Set(d.filterableFields),I=S.orWhere.filter(N=>!C.has(N[0]));if(I.length>0){K(y,`Fields not filterable: ${I.map(N=>N[0]).join(", ")}`,400);return}}O.orWhere=S.orWhere;}if(S.orWhereGroups&&S.orWhereGroups.length>0){if(d.filterableFields){let C=new Set(d.filterableFields);for(let I of S.orWhereGroups){let N=I.filter(F=>!C.has(F[0]));if(N.length>0){K(y,`Fields not filterable: ${N.map(F=>F[0]).join(", ")}`,400);return}}}O.orWhereGroups=S.orWhereGroups;}if(S.orderBy&&S.orderBy.length>0){if(d.orderableFields){let C=new Set(d.orderableFields),I=S.orderBy.filter(N=>!C.has(N.field));if(I.length>0){K(y,`Fields not orderable: ${I.map(N=>N.field).join(", ")}`,400);return}}O.orderBy=S.orderBy;}S.select&&S.select.length>0&&(O.select=S.select);let A=await d.repo.query.paginate(O),P={items:await s(d,a(x),c,A.data),hasNextPage:A.hasNextPage,hasPrevPage:A.hasPrevPage,nextCursor:vt(A.nextCursor),prevCursor:vt(A.prevCursor)};je(y,P,{pageSize:E,hasMore:A.hasNextPage});}catch(S){nn(y,S,{ref:d.repo.ref,path:d.path,isGroup:!!d.isGroup,filters:h,sort:R},"Failed to query documents",n);}}async function w(x,y){let c=x.params||{},d=l(c.repoName,y);if(!d)return;let p=c.id;if(!p){K(y,"Document ID required",400);return}try{let h=await u(d,p);if(!h){K(y,"Document not found",404);return}let R=a(x);if(!await o(y,d,"get",{user:R,doc:h,params:c}))return;if(r&&d.rules?.filter)try{if(!await d.rules.filter({user:R,doc:h,params:c})){K(y,"Document not found",404);return}}catch{K(y,"Document not found",404);return}je(y,h);}catch(h){nn(y,h,{ref:d.repo.ref,path:d.path,isGroup:!!d.isGroup,filters:[{field:d.documentKey,op:"==",value:p}]},"Failed to fetch document",n);}}async function b(x,y){let c=x.params||{},d=l(c.repoName,y);if(d)try{let p=x.body??{},h=a(x);if(!await o(y,d,"create",{user:h,body:p,params:c}))return;let R=hr(d.schema,p,d.createFields,!1,d.systemKeys);if(!R.success){K(y,R.error,400);return}if(d.validate){let E=await d.validate(R.data,"create");if(E){K(y,E,400);return}}let S;if(d.isGroup&&d.parentKeys&&d.parentKeys.length>0){let E={...R.data};d.createdKey&&(E[d.createdKey]=new Date);let T=d.parentKeys.filter($=>!E[$]);if(T.length>0){K(y,`Missing parent key(s) for subcollection create: ${T.join(", ")}`,400);return}let O=d.parentKeys.map($=>E[$]),A=E[d.documentKey]||ls();S=await d.repo.set(...O,A,E);}else S=await d.repo.create(R.data);je(y,S,void 0,201);}catch(p){let h=n&&p instanceof Error?p.message:"Failed to create document";K(y,h,500);}}async function g(x,y,c){let d=x.params||{},p=l(d.repoName,y);if(!p)return;let h=d.id;if(!h){K(y,"Document ID required",400);return}try{let R=x.body??{},S=await u(p,h);if(!S){K(y,"Document not found",404);return}let E=a(x);if(!await o(y,p,"update",{user:E,doc:S,body:R,params:d}))return;let T=hr(p.schema,R,p.mutableFields,c,p.systemKeys);if(!T.success){K(y,T.error,400);return}if(p.validate){let $=await p.validate(T.data,"update");if($){K(y,$,400);return}}let O=i(S,p.pathKey)??[h],A=await p.repo.update(...O,T.data);je(y,A);}catch(R){let S=n&&R instanceof Error?R.message:"Failed to update document";K(y,S,500);}}async function k(x,y){let c=x.params||{},d=l(c.repoName,y);if(!d)return;if(!d.allowDelete){K(y,"Delete not allowed for this repository",403);return}let p=c.id;if(!p){K(y,"Document ID required",400);return}try{let h=await u(d,p);if(!h){K(y,"Document not found",404);return}let R=a(x);if(!await o(y,d,"delete",{user:R,doc:h,params:c}))return;let S=i(h,d.pathKey)??[p];await d.repo.delete(...S),je(y,{deleted:!0});}catch(h){let R=n&&h instanceof Error?h.message:"Failed to delete document";K(y,R,500);}}function v(x,y){y.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:m,handleQuery:f,handleGet:w,handleCreate:b,handleUpdate:g,handleDelete:k,handleOptions:v}}function sn(e){try{return zod.z.toJSONSchema(e,{target:"openapi-3.1",unrepresentable:"any",override:t=>{let n=t.zodSchema?._zod?.def;n&&(n.type==="date"?(t.jsonSchema.type="string",t.jsonSchema.format="date-time"):n.type==="bigint"&&(t.jsonSchema.type="string",t.jsonSchema.format="int64"));}})}catch(t){return typeof console<"u"&&console.warn&&console.warn("[generateOpenAPISpec] Failed to convert Zod schema to JSON Schema; falling back to {type:object}.",t),{type:"object"}}}function ae(e){return {$ref:`#/components/schemas/${e}`}}function ee(e){return {description:e,content:{"application/json":{schema:ae("ErrorResponse")}}}}function et(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function wr(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 us(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 ps(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 fs(){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 ys(e,t,n,r,o){let s={},a=e.name,l=`${t}/${e.name}`,i=`${l}/{${e.documentKey}}`,u={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[l]={get:{operationId:`list${ke(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...us(e),...ps(e)],responses:{200:wr(ae(n)),500:ee("Internal server error")}},post:{operationId:`create${ke(e.name)}`,summary:`Create a ${ce(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ae(r??n)}}},responses:{201:et("Document created",ae(n)),400:ee("Validation error"),500:ee("Internal server error")}}},s[`${l}/query`]={post:{operationId:`query${ke(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ae("QueryRequestBody")}}},responses:{200:wr(ae(n)),400:ee("Invalid query"),500:ee("Internal server error")}}};let m={};return m.get={operationId:`get${ke(ce(e.name))}`,summary:`Get a single ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:et("Document found",ae(n)),404:ee("Document not found"),500:ee("Internal server error")}},m.put={operationId:`update${ke(ce(e.name))}`,summary:`Update a ${ce(e.name)} (full replace)`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:ae(o??n)}}},responses:{200:et("Document updated",ae(n)),400:ee("Validation error"),404:ee("Document not found"),500:ee("Internal server error")}},m.patch={operationId:`patch${ke(ce(e.name))}`,summary:`Partially update a ${ce(e.name)}`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:{allOf:[ae(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:et("Document patched",ae(n)),400:ee("Validation error"),404:ee("Document not found"),500:ee("Internal server error")}},e.allowDelete&&(m.delete={operationId:`delete${ke(ce(e.name))}`,summary:`Delete a ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:et("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:ee("Document not found"),500:ee("Internal server error")}}),s[i]=m,s}function ln(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:l=false}=n,i=t==="/"?"":t.replace(/\/$/,""),u={},m={},f=[];u.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},u.QueryRequestBody=fs();for(let[k,v]of Object.entries(e)){let x=ke(ce(k)),y=`${x}Create`,c=`${x}Update`;u[x]=sn(v.schema);let d=T=>{let O=T&&T.length>0?T:Object.keys(v.schema.shape),A={};for(let $ of O){let P=$.split(".")[0];P&&v.schema.shape[P]&&!v.systemKeys.includes(P)&&(A[P]=v.schema.shape[P]);}return A},p=null,h=d(v.createFields);Object.keys(h).length>0&&(u[y]=sn(zod.z.object(h)),p=y);let R=null,S=d(v.mutableFields);Object.keys(S).length>0&&(u[c]=sn(zod.z.object(S)),R=c);let E=ys(v,i,x,p,R);Object.assign(m,E),f.push({name:k,description:`Operations on ${k} (collection: ${v.path})`});}let w={},b;return l==="basic"?(w.basicAuth={type:"http",scheme:"basic"},b=[{basicAuth:[]}]):l==="bearer"&&(w.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},b=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...a&&a.length>0?{servers:a}:{},paths:m,components:{schemas:u,...Object.keys(w).length>0?{securitySchemes:w}:{}},...b?{security:b}:{},tags:f}}function ke(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ce(e){return e.endsWith("ies")?e.slice(0,-3)+"y":e.endsWith("ses")||e.endsWith("xes")||e.endsWith("zes")?e.slice(0,-2):e.endsWith("s")&&!e.endsWith("ss")?e.slice(0,-1):e}function ms(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
|
|
1157
|
+
</html>`}async function gs(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Rr(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:o,auth:s,middleware:a=[],verbose:l=false,httpsOptions:i}=e,u=t==="/"?"":t.replace(/\/$/,""),m={};for(let[c,d]of Object.entries(n)){let p=d.schema??d.repo.schema??null;if(!p)throw new Error(`[createCrudServer] Repository "${c}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let h,R,S,E;if(d.fieldsConfig){let A=d.fieldsConfig;h=[],R=[],S=[],E=[];for(let[$,P]of Object.entries(A))for(let C of P)C==="filterable"?h.push($):C==="orderable"?R.push($):C==="mutable"?S.push($):C==="create"&&E.push($);R.length===0&&(R=h),h.length===0&&(h=void 0),R&&R.length===0&&(R=void 0),S.length===0&&(S=void 0),E.length===0&&(E=void 0);}let T=(()=>{let A=d.repo._parentKeys;return A&&A.length>0?A:void 0})();if(T&&E)for(let A of T)E.includes(A)||E.push(A);let O={name:c,path:d.path,repo:d.repo,schema:p,systemKeys:d.repo._systemKeys??[d.documentKey??"docId"],documentKey:d.documentKey??"docId",pathKey:d.repo._pathKey??void 0,isGroup:!!d.repo._isGroup,parentKeys:T,createdKey:d.repo._createdKey??void 0,pageSize:d.pageSize??25,filterableFields:h,orderableFields:R,mutableFields:S,createFields:E,allowDelete:d.allowDelete??false,allowedIncludes:d.allowedIncludes,validate:d.validate,rules:d.rules};m[c]=O;}let w=vr(m,u,l,!!s),b=e.openapi,g=b&&typeof b=="object"?b:{},k=null;function v(){if(!k){let c=s?he(s)||typeof s=="function"?"bearer":"basic":false;k=ln(m,u,{...g,auth:g.auth??c});}return k}let x=new oe;if(o!==false){let c=o===void 0?{csp:false}:o;x.use(Xe(c));}if(x.use((c,d,p)=>{d.set("Access-Control-Allow-Origin","*"),d.set("Access-Control-Allow-Credentials","true"),p();}),r&&x.use(async(c,d,p)=>{let h=c;if(String(h.headers?.["content-type"]??"").includes("application/json")){if(typeof h.body=="string")try{c.body=JSON.parse(h.body);}catch{}else if(Buffer.isBuffer(c.rawBody))try{let S=await gs(h);c.body=JSON.parse(S);}catch{}}await p();}),s)if(he(s)){for(let c of s.routes){let d=`${u}${c.path}`;c.method==="GET"?x.get(d,c.handler):x.post(d,c.handler);}x.use(s.middleware);}else if(typeof s=="function")x.use(s);else {let c=s.realm??"API",d="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");x.use((p,h,R)=>{if((p.headers?.authorization??"")!==d){h.status(401).set("WWW-Authenticate",`Basic realm="${c}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}R();});}for(let c of a)x.use(c);if(b!==false){let c=`${u}/__spec.json`,d=`${u}/__docs`;x.get(c,(p,h)=>{let R=v();h.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(R,null,2));}),x.get(d,(p,h)=>{let R=ne(p,u)+"/__spec.json",S=ms(g.title??"CRUD API",R);h.status(200).set("Content-Type","text/html; charset=utf-8").send(S);});}x.use((c,d,p)=>{if(c.method==="OPTIONS"){w.handleOptions(c,d);return}p();}),x.get(`${u}/:repoName`,w.handleList),x.post(`${u}/:repoName/query`,w.handleQuery),x.get(`${u}/:repoName/:id`,w.handleGet),x.post(`${u}/:repoName`,w.handleCreate),x.put(`${u}/:repoName/:id`,(c,d)=>w.handleUpdate(c,d,false)),x.patch(`${u}/:repoName/:id`,(c,d)=>w.handleUpdate(c,d,true)),x.delete(`${u}/:repoName/:id`,w.handleDelete);let y=async(c,d)=>{await x.handle(c,d);};return y.spec=v,i&&(y.httpsOptions=i),y}function Sr(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions,r=n?t.onRequest(n,e):t.onRequest(e),o=e.spec;return typeof o=="function"&&(r.spec=o),r}function kr(e,t,n){let r={},o=e?.rawMapping;for(let[s,a]of Object.entries(t)){if(!a)continue;if(!(o?s in o:!!e[s]))throw new Error(`[createServers.${n}] Unknown repo "${s}" \u2014 not present in the registry passed to createServers().`);let i=o?pt(o[s],()=>e[s]):e[s];r[s]={...a,repo:i};}return r}function Tr(e,t={}){return {admin(n){let r=kr(e,n.repos,"admin"),o=gr({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return Sr(o,t)},crud(n){let r=kr(e,n.repos,"crud"),o=Rr({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return Sr(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}),Un(e,r)},history(n){return On(e,n)}}}function Kl(e){return t=>({...t,schema:e,type:null,documentRef:null,update:null})}function Ll(e,t){let n={...e};for(let r in t)t[r]&&(n[r]={...e[r],relationalKeys:t[r]});return n}var cn=class{constructor(t,n){this.allRepositories={};this.initialized=false;this.dbFactory=t,this.mapping=n;}get db(){return this._db??(this._db=this.dbFactory())}get rawMapping(){return this.mapping}ensureInitialized(){this.initialized||(this.initializeRepositories(),this.initialized=true);}initializeRepositories(){let t=this.db;for(let n of Object.keys(this.mapping))this.allRepositories[n]=Pt(t,this.mapping[n],{});for(let n of Object.keys(this.mapping))this.allRepositories[n]=Pt(t,this.mapping[n],this.allRepositories);}getRepository(t){return this.ensureInitialized(),this.allRepositories[t]}};function Ul(e,t){let n=new cn(e,t),r=Object.keys(t);return new Proxy(n,{get(o,s){return typeof s=="string"&&s in t?o.getRepository(s):o[s]},ownKeys(){return r},getOwnPropertyDescriptor(o,s){if(typeof s=="string"&&s in t)return {configurable:true,enumerable:true,writable:false}}})}exports.MiniRouter=oe;exports.RepositoryMapping=cn;exports.applyPaginationQueryOptions=ge;exports.buildAndExecuteQuery=Te;exports.buildRepositoryRelations=Ll;exports.coerceToDate=Tt;exports.createPaginationIterator=Ct;exports.createRepositoryConfig=Kl;exports.createRepositoryMapping=Ul;exports.createServers=Tr;exports.executePaginatedQuery=st;exports.getDateHandling=kt;exports.normalizeTimestamps=ot;exports.setDateHandling=_r;//# sourceMappingURL=index.cjs.map
|
|
1158
1158
|
//# sourceMappingURL=index.cjs.map
|