@lpdjs/firestore-repo-service 2.2.9-beta.3 → 2.2.9-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +28 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +28 -28
- package/dist/index.js.map +1 -1
- package/dist/servers/admin/index.cjs +11 -11
- package/dist/servers/admin/index.cjs.map +1 -1
- package/dist/servers/admin/index.js +11 -11
- package/dist/servers/admin/index.js.map +1 -1
- package/dist/servers/auth/index.cjs +11 -11
- package/dist/servers/auth/index.cjs.map +1 -1
- package/dist/servers/auth/index.js +11 -11
- package/dist/servers/auth/index.js.map +1 -1
- package/dist/servers/crud/index.cjs +2 -2
- package/dist/servers/crud/index.cjs.map +1 -1
- package/dist/servers/crud/index.js +2 -2
- package/dist/servers/crud/index.js.map +1 -1
- package/dist/servers/index.cjs +39 -39
- package/dist/servers/index.cjs.map +1 -1
- package/dist/servers/index.js +39 -39
- package/dist/servers/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var jsxRuntime=require('hono/jsx/jsx-runtime'),firestore=require('firebase-admin/firestore'),crypto=require('crypto'),zod=require('zod'),server=require('hono/jsx/dom/server');var mr=Object.defineProperty;var Ye=(e,t)=>()=>(e&&(t=e(e=0)),t);var gr=(e,t)=>{for(var n in t)mr(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return zr[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 xn(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function vn(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function te(e){let t=e;return t.shape&&typeof t.shape=="object"?t.shape:t._zod?.def?.shape&&typeof t._zod.def.shape=="object"?t._zod.def.shape:t._def?.shape?typeof t._def.shape=="function"?t._def.shape():t._def.shape:{}}function He(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 Be(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 ct(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function wn(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 zr,Ze=Ye(()=>{zr={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 Mn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function so({message:e}){return jsxRuntime.jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsxRuntime.jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function De({val:e,mismatch:t}){let n=ao(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(so,{message:t})]}):n}function ao(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(Mn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(Mn,{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 ft=Ye(()=>{});function Ie(e){if(!e)return "unknown";let t=Pt(e);switch(L(t)){case "ZodString":return "string";case "ZodNumber":return "number";case "ZodBigInt":return "bigint";case "ZodBoolean":return "boolean";case "ZodDate":return "date";case "ZodArray":return "array";case "ZodObject":case "ZodRecord":return "object";case "ZodEnum":case "ZodNativeEnum":return "enum";case "ZodLiteral":return "literal";default:return "unknown"}}function Pt(e){let t=L(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?Pt(n):e}return e}function Ne(e,t){if(!e)return;let n=t.split("."),r=e;for(let o of n){if(!r)return;let s=Pt(r);if(L(s)!=="ZodObject")return;r=te(s)[o];}return r}function uo(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function Ve(e,t){if(e==="unknown")return null;let n=uo(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 Dt=Ye(()=>{Ze();});var Bn={};gr(Bn,{PanelMany:()=>fo,PanelOne:()=>po,RightPanel:()=>It});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`,d=Hn(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(l=>{let u=e[l],p=d[l],f=p?Ve(p,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:l}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(De,{val:u,mismatch:f})})]})})})]})}function fo({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:d}){let l=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,u=Hn(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:l,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((p,f)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:p},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((p,f)=>{let y=String(p.docId??p.id??""),b=`${n}/${t}/${encodeURIComponent(y)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((x,v)=>{let R=p[x],m=u[x],i=m?Ve(m,R):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(De,{val:R,mismatch:i})},v)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:b,class:"btn btn-xs btn-ghost",children:"Edit"})})]},f)})})]})}),(d.hasPrev||d.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[d.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":d.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),d.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":d.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Hn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Ie(Ne(e,r));return n}var It,Nt=Ye(()=>{ft();Dt();It=({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 hr(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function Me(e,t){return t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}function ht(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function en(e){let[t,n,r]=e;return ht(e)?hr(r,30).map(s=>[t,n,s]):[e]}function et(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function tn(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 Re(e,t){let n=t.orWhere&&t.orWhere.length>0,r=t.orWhereGroups&&t.orWhereGroups.length>0;if(!n&&!r){if(!t.where||t.where.length===0)return Me(e,t).get();if(!t.where.some(ht)){let f=et(e,t.where);return f=Me(f,t),f.get()}let l=t.where.map(en),p=bt(l).map(f=>{let y=et(e,f);return y=Me(y,t),y});return tn(p)}let o=t.where??[],s=[...t.orWhere?.map(d=>[d])??[],...t.orWhereGroups??[]],a=[];for(let d of s){let l=[...o,...d];if(l.some(ht)){let p=l.map(en),y=bt(p).map(b=>{let x=et(e,b);return x=Me(x,t),x});a.push(...y);}else {let p=et(e,l);p=Me(p,t),a.push(p);}}return tn(a)}function bt(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=bt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var xt="preserve";function br(e){xt=e;}function vt(){return xt}function xr(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function wt(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(xr(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 vr(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function tt(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>tt(t));if(vr(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=tt(r);return t}return e}function U(e){return xt==="normalize"?tt(e):e}function rn(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function ue(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ye(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 nt(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 Re(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,d=a.map(u=>U({...u.data(),docId:u.id})),l=t.direction==="prev";return {data:d,nextCursor:l?a.length>0?a[a.length-1]:void 0:s?a[a.length-1]:void 0,prevCursor:l?s?a[0]:void 0:a[0],hasNextPage:l?!!t.cursor:s,hasPrevPage:l?s:!!t.cursor,pageSize:d.length}}async function*Rt(e,t){let n,r=true;for(;r;){let o=await nt(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 on(e,t){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(e.length!==t.length)return false;for(let n=0;n<e.length;n++)if(!on(e[n],t[n]))return false;return true}if(typeof e=="object"&&typeof t=="object")try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}return false}function rt(e,t,n={}){let r=new Set([...n.exclude??[],...n.metaFields??[],...n.systemKeys??[]]),o=n.include?new Set(n.include):null,s=e??{},a=t??{},d=new Set([...Object.keys(s),...Object.keys(a)]),l={};for(let u of d){if(r.has(u)||o&&!o.has(u))continue;let p=s[u],f=a[u];on(p,f)||(l[u]={oldValue:p===void 0?null:p,newValue:f===void 0?null:f,type:{old:ze(p),new:ze(f)}});}return l}var wr=5;function Rr(e){return e.schemaVersion===2}function sn(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 Sr(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function Tr(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 kr(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?sn(r):ze(t),new:o?sn(o):ze(n)}}}function Cr(e){let t=kr(e),n=Tr(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function Ar(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function Or(e,t){return (e.userId??null)===(t.userId??null)}function an(e,t={}){let n=t.groupToleranceMs??wr,r=[];for(let o of e){if(Rr(o)){r.push(Sr(o));continue}let a=Cr(o),d=r[r.length-1];d&&d.schemaVersion===1&&Ar(d.historySetAt,a.historySetAt,n)&&Or(d.meta,a.meta)?Object.assign(d.changes,a.changes):r.push(a);}return r}var Er=7e5;function ot(e){let t=e.ttlOverride??e.config.ttl,r={schemaVersion:2,historyDocId:crypto.randomUUID(),historyToObjectId:e.entityId,historySetAt:firestore.Timestamp.now(),operation:e.operation,meta:e.meta,changes:e.changes};t&&(r.expiresAt=firestore.Timestamp.fromMillis(Date.now()+t.days*24*60*60*1e3));let o=s=>{try{return Buffer.byteLength(JSON.stringify(s,(a,d)=>d instanceof firestore.Timestamp?d.toMillis():d),"utf8")}catch{return 0}};if(o(r.changes)>Er){let s={};for(let[a,d]of Object.entries(r.changes)){let l=o(d.oldValue),u=o(d.newValue);s[a]={oldValue:l>5e4?"[truncated]":d.oldValue,newValue:u>5e4?"[truncated]":d.newValue,type:d.type};}r.changes=s,r._truncated=true;}return r}async function st(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 at(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=p=>{if(!p)return;let f=n[p];return f===void 0||f===null?null:String(f)},a=s(o.userId);a!==void 0&&(r.userId=a);let d=s(o.userEmail);d!==void 0&&(r.userEmail=d);let l=s(o.reason);l!==void 0&&(r.reason=l);let u=s(o.comment);if(u!==void 0&&(r.comment=u),o.extras&&o.extras.length>0){let p={},f=false;for(let y of o.extras)y in n&&(p[y]=n[y],f=true);f&&(r.extras=p);}return r}function it(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 Pr="history",Dr=50;function ln(e,t,n){return e(...n).collection(t)}function Ir(e){return String(e[e.length-1]??"")}function cn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??Pr;async function s(...p){let f={},y=p,b=p[p.length-1];b!==null&&typeof b=="object"&&!(b instanceof firestore.Timestamp)&&("limit"in b||"cursor"in b||"direction"in b)&&(f=b,y=p.slice(0,-1));let x=ln(e,o,y),v=f.direction??"desc",R=x.orderBy("historySetAt",v);return f.cursor&&(R=R.startAfter(f.cursor)),f.limit&&f.limit>0&&(R=R.limit(f.limit)),(await R.get()).docs.map(i=>({id:i.id,data:i.data()}))}async function a(...p){let f={},y=p,b=p[p.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,y=p.slice(0,-1));let x=f.limit??Dr,v=Math.max(x,Math.min(x*8,500)),R=await s(...y,{limit:v,cursor:f.cursor,direction:f.direction??"desc"}),m=an(R.map(i=>i.data));if(f.fields&&f.fields.length>0){let i=new Set(f.fields);m=m.filter(g=>Object.keys(g.changes).some(c=>i.has(c)));}if(f.operations&&f.operations.length>0){let i=new Set(f.operations);m=m.filter(g=>i.has(g.operation));}return m.slice(0,x)}async function d(...p){let f=p[p.length-1],y={},b,x;return f!==null&&typeof f=="object"&&!(f instanceof firestore.Timestamp)?(y=f,b=p[p.length-2],x=p.slice(0,-2)):(b=f,x=p.slice(0,-1)),a(...x,{...y,fields:[b]})}async function l(...p){let f=p[p.length-1],y={},b,x;return f!==null&&typeof f=="object"&&!(f instanceof firestore.Timestamp)?(y=f,b=p[p.length-2],x=p.slice(0,-2)):(b=f,x=p.slice(0,-1)),a(...x,{...y,operations:[b]})}async function u(...p){let f=p[p.length-1],y=p.slice(0,-1),b=Ir(y),x=rt(f.before??{},f.after??{},{include:r.include,exclude:r.exclude,metaFields:it(r),systemKeys:t});if(f.operation==="update"&&Object.keys(x).length===0)return null;let R={...at(f.after??f.before??null,r),...f.meta??{}},m=ot({entityId:b,operation:f.operation,changes:x,meta:R,config:r}),i=ln(e,o,y),g=await st(i,m,r,{repoName:n,docId:b,before:f.before??null,after:f.after??null});return !g.written||!g.entry?null:{historyDocId:g.entry.historyDocId,historyToObjectId:g.entry.historyToObjectId,historySetAt:g.entry.historySetAt,schemaVersion:2,operation:g.entry.operation,meta:g.entry.meta,changes:g.entry.changes}}return {list:a,raw:s,byField:d,byOperation:l,recordManual:u}}function dn(e){return {count:async(t={})=>{let n=e;return n=ye(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=ye(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let d=a.data()[t];typeof d=="number"&&(s+=d);}),s},average:async(t,n={})=>{let r=e;r=ye(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(d=>{let l=d.data()[t];typeof l=="number"&&(s+=l,a++);}),a>0?s/a:null}}}function un(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let d=e.batch();return {batch:d,set:(...l)=>{let u=l[l.length-1],p=typeof u=="object"&&u!==null&&"merge"in u,f=p?l[l.length-2]:l[l.length-1],y=p?l.slice(0,-2):l.slice(0,-1),b=p?u:{merge:true},x=t(...y),v={...f},R=y[y.length-1];n&&R&&(v[n]=R),r&&(v[r]=x.path),o&&(v[o]=a()),s&&(v[s]=a()),d.set(x,v,b);},update:(...l)=>{let u=l.pop(),f=t(...l),y={...u};s&&(y[s]=a()),d.update(f,y);},delete:(...l)=>{let u=t(...l);d.delete(u);},commit:async()=>{await d.commit();}}}}}function pn(e,t,n){let r=()=>new Date;return {set:async o=>{let s=e.bulkWriter(),a=0;for(let d of o){if(!d)continue;let{docRef:l,data:u,merge:p=true}=d,f={...u};t&&(f[t]=r()),n&&(f[n]=r()),s.set(l,f,{merge:p}),a++,a>=500&&(await s.flush(),a=0);}await s.close();},update:async o=>{let s=e.bulkWriter(),a=0;for(let d of o){if(!d)continue;let{docRef:l,data:u}=d,p={...u};n&&(p[n]=r()),s.update(l,p),a++,a>=500&&(await s.flush(),a=0);}await s.close();},delete:async o=>{let s=e.bulkWriter(),a=0;for(let d of o)d&&(s.delete(d),a++,a>=500&&(await s.flush(),a=0));await s.close();}}}function fn(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 y,b,x={...f};if(o&&(x[o]=a()),s&&(x[s]=a()),f[n]){b=f[n],y=e.doc(b);let R=r?{...x,[r]:y.path}:x;await y.set(R);}else {y=await e.add(x),b=y.id;let R={[n]:b};r&&(R[r]=y.path),await y.update(R);}let v=await y.get();return U(v.data())},set:async(...f)=>{let y=f[f.length-1],b=typeof y=="object"&&y!==null&&"merge"in y,x=b?f[f.length-2]:f[f.length-1],v=b?f.slice(0,-2):f.slice(0,-1),R=b?y:{merge:true},m={...x};s&&(m[s]=a());let i=t(...v),g=v[v.length-1];n&&g!=null&&(m[n]=g),r&&(m[r]=i.path),await i.set(m,R);let c=await i.get();return U(c.data())},update:async(...f)=>{let y=f.pop(),b=f,x={...y};s&&(x[s]=a());let v=t(...b);await v.update(x);let R=await v.get();return U(R.data())},delete:async(...f)=>{await t(...f).delete();}}}function yn(e,t,n,r,o){let s={};return s.byList=async(a,d,l="in",u={})=>{if(d.length===0)return [];let p=[],f=rn(d,30);for(let y of f){let b=e;b=b.where(a,l,y),u.select&&u.select.length>0&&(b=b.select(...u.select.map(v=>String(v)))),(await b.get()).forEach(v=>{let R=U(v.data());p.push(u.returnDoc?{data:R,doc:v}:R);});}return p},t.forEach(a=>{let d=`by${ue(String(a))}`;s[d]=async(l,u={})=>{let p=typeof u=="boolean"?{returnDoc:u}:u;if(String(a)===o){let R=await r(l).get();if(!R.exists)return null;let m=U(R.data());return p.returnDoc?{data:m,doc:R}:m}let f=e;f=f.where(String(a),"==",l).limit(1),p.select&&p.select.length>0&&(f=f.select(...p.select.map(v=>String(v))));let y=await f.get();if(y.empty)return null;let b=y.docs[0];if(!b)return null;let x=U(b.data());return p.returnDoc?{data:x,doc:b}:x};}),s}function mn(e,t,n,r){let o={},s=async(a,d)=>{if(!n||!r||d.length===0)return a;let l=d.map(u=>typeof u=="string"?{key:u}:{key:u.relation,select:u.select});return Promise.all(a.map(async u=>{let p=await Promise.all(l.map(async({key:y,select:b})=>{let x=n[y];if(!x)return [y,void 0];let v=r[x.repo];if(!v)return [y,void 0];let R=u[y];if(R==null)return [y,x.type==="one"?null:[]];let m=b?{select:b}:void 0;try{if(x.type==="one"){let i=`by${ue(x.key)}`,g=typeof v.get?.[i]=="function"?await v.get[i](R,m):null;return [y,g]}else {let i=`by${ue(x.key)}`,g=typeof v.query?.[i]=="function"?await v.query[i](R,m):[];return [y,g]}}catch(i){return console.error(`[include] Error populating "${y}":`,i),[y,x.type==="one"?null:[]]}})),f={};for(let[y,b]of p)y!==void 0&&(f[y]=b);return {...u,populated:f}}))};return t.forEach(a=>{let d=`by${ue(a)}`;o[d]=async(l,u={})=>{let p={...u,where:[[a,"==",l],...u.where??[]]};return (await Re(e,p)).docs.map(y=>U(y.data()))};}),o.by=async a=>(await Re(e,a)).docs.map(l=>U(l.data())),o.getAll=async(a={})=>(await Re(e,a)).docs.map(l=>U(l.data())),o.onSnapshot=(a,d,l)=>ye(e,a).onSnapshot(p=>{d(p.docs.map(f=>U(f.data())));},l),o.paginate=async a=>{let{include:d,...l}=a,u=await nt(e,l);if(d&&d.length>0){let p=await s(u.data,d);return {...u,data:p}}return u},o.paginateAll=async function*(a){let{include:d,...l}=a;for await(let u of Rt(e,l))if(d&&d.length>0){let p=await s(u.data,d);yield {...u,data:p};}else yield u;},o}function gn(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 l=r;o=[l.relation],l.select&&(s[l.relation]=l.select);}else if("relations"in r){let l=r;o=Array.isArray(l.relations)?l.relations:[l.relations],s=l.select??{};}else o=[];else o=Array.isArray(r)?r:[r];let a=await Promise.all(o.map(async l=>{let u=e.relationalKeys?.[l];if(!u)return console.warn(`[populate] Relation "${l}" not found in config`),[l,void 0];let p=t[u.repo];if(!p)return console.warn(`[populate] Repository "${u.repo}" not found in mapping`),[l,void 0];let f=n[l];if(f==null)return [l,u.type==="one"?null:[]];let y=s[l],b=y?{select:y}:void 0;try{if(u.type==="one"){let x=`by${ue(u.key)}`,v=typeof p.get?.[x]=="function"?await p.get[x](f,b):null;return [l,v]}else {let x=`by${ue(u.key)}`,v=typeof p.query?.[x]=="function"?await p.query[x](f,b):[];return [l,v]}}catch(x){return console.error(`[populate] Error populating "${l}":`,x),[l,u.type==="one"?null:[]]}})),d={};for(let[l,u]of a)u!==void 0&&(d[l]=u);return {...n,populated:d}}}}function hn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),d=await r.get(a);return d.exists?U({...d.data(),docId:d.id}):null},set:(...s)=>{let a=s[s.length-1],d=typeof a=="object"&&a!==null&&"merge"in a,l=d?s[s.length-2]:s[s.length-1],u=d?s.slice(0,-2):s.slice(0,-1),p=d?a:{merge:true},f=t(...u);r.set(f,l,p);},update:(...s)=>{let a=s[s.length-1],d=s.slice(0,-1),l=t(...d);r.update(l,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function Nr(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 kt(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...R)=>t.refCb(e,...R),a=yn(r,t.foreignKeys,o,s,t.documentKey),d=mn(r,t.queryKeys,t.relationalKeys,n),l=dn(r),u=fn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),p=un(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),f=hn(e,s),y=pn(e,t.createdKey,t.updatedKey),b=gn(t,n),x=t.history,v=x?.enabled?cn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(R=>typeof R=="string"),t.path??"(unknown)",x):null;return {ref:r,documentRef:s,get:a,query:d,aggregate:l,...u,batch:p,transaction:f,bulk:y,...b,...v?{history:v}:{},_historySubcollection:v?x?.subcollection??"history":void 0,_historyConfig:x,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(R=>typeof R=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?Nr(t.refCb):[],_createdKey:t.createdKey??null}}var _r="history";function jr(e,t){let n=t.ref?.path??void 0;return n?`${n}/{docId}`:(console.warn(`[HistoryTriggers] Cannot determine collection path for "${e}". Skipping.`),null)}function bn(e,t){let{onDocumentWritten:n}=t.deps,r={};for(let[o,s]of Object.entries(e)){let a=s._historyConfig??(typeof s.history=="object"&&s.history!==null&&"enabled"in s.history?s.history:void 0);if(!a?.enabled)continue;let d=a.subcollection??_r,l=a.ttl??t.defaults?.ttl,u=t.repos?.[o],p;if(s._isGroup){if(!u?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}p=u.triggerPath;}else p=u?.triggerPath??jr(o,s);if(!p)continue;let f=s._systemKeys??[],y=f[0]??"docId",b=it(a);r[`${o}_onHistory`]=n(p,async x=>{try{let v=x.data?.before?.data(),R=x.data?.after?.data(),m;if(!v&&R)m="create";else if(v&&!R)m="delete";else if(v&&R)m="update";else return;let i=String(R?.[y]??v?.[y]??x.params?.docId??x.data?.after?.id??x.data?.before?.id??"");if(!i)return;let g=rt(v??{},R??{},{include:a.include,exclude:a.exclude,metaFields:b,systemKeys:f});if(m==="update"&&Object.keys(g).length===0)return;let c=at(R??v??null,a),h=ot({entityId:i,operation:m,changes:g,meta:c,config:a,ttlOverride:l}),w=x.data?.after?.ref??x.data?.before?.ref;if(!w)return;let T=w.collection(d);await st(T,h,a,{repoName:o,docId:i,before:v??null,after:R??null});}catch(v){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,v);}});}return r}function Fr(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 Mr(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var ne=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}=Fr(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=Mr(t),s=null,a={};for(let u of this.routes){if(u.method!==r)continue;let p=o.match(u.pattern);if(p){s=u,a={},u.paramNames.forEach((f,y)=>{a[f]=decodeURIComponent(p[y+1]??"");});break}}let d=Object.assign(t,{params:a}),l=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,l);}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();}};Ze();var me="__sync_version";var Hr=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function Br(e){let t=e,n=false;for(;;){let r=L(t);if(!Hr.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var Zr={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Rn(e,t,n,r,o,s,a,d){for(let[l,u]of Object.entries(e)){let p=n?`${n}__${l}`:l;if(o.has(l)||o.has(p))continue;let{inner:f,nullable:y}=Br(u),b=L(f),x=r||y;if(b==="ZodObject"){let i=te(f);Rn(i,t,p,x,o,s,a,d);continue}let v=Zr[b]??"json",R=p===a||l===a,m=s[p]??s[l]??p;d.push({name:m,sqlType:t.mapType(v),nullable:R?false:x,isPrimaryKey:R});}}function dt(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),d=te(e),l=[];return Rn(d,t,"",false,a,s,r,l),l.some(u=>u.name===me)||l.push({name:me,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),l}function Sn(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(Sn)):e}function Tn(e,t,n){for(let[r,o]of Object.entries(e)){let s=t?`${t}__${r}`:r;o!=null&&typeof o=="object"&&!Array.isArray(o)&&!(o instanceof Date)&&!Buffer.isBuffer(o)&&!(o instanceof Uint8Array)&&typeof o.toDate!="function"&&!("latitude"in o&&"longitude"in o)?Tn(o,s,n):n[s]=Sn(o);}}function Le(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};Tn(e,"",o);let s={};for(let[a,d]of Object.entries(o)){if(n.has(a))continue;let l=a.split("__")[0];if(l!==a&&n.has(l))continue;let u=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[u]=d;}return s}function Se(e,t){if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",s=process.env.FUNCTION_REGION??"us-central1",a=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${o}/${s}/${a}${t}`}let n=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return n&&r.includes("cloudfunctions.net")?`/${n.toLowerCase()}${t}`:t}function ae(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 gr=Object.defineProperty;var et=(e,t)=>()=>(e&&(t=e(e=0)),t);var hr=(e,t)=>{for(var n in t)gr(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return Hr[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 vn(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function wn(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function te(e){let t=e;return t.shape&&typeof t.shape=="object"?t.shape:t._zod?.def?.shape&&typeof t._zod.def.shape=="object"?t._zod.def.shape:t._def?.shape?typeof t._def.shape=="function"?t._def.shape():t._def.shape:{}}function He(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 Be(e){let t=e;return t._zod?.def?.entries?t._zod.def.entries:t.enum&&typeof t.enum=="object"?t.enum:t._def?.values&&typeof t._def.values=="object"?t._def.values:{}}function dt(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function Rn(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 Hr,Ze=et(()=>{Hr={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 zn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function ao({message:e}){return jsxRuntime.jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsxRuntime.jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function De({val:e,mismatch:t}){let n=io(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(ao,{message:t})]}):n}function io(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(zn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(zn,{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 yt=et(()=>{});function Ie(e){if(!e)return "unknown";let t=Dt(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 Dt(e){let t=L(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?Dt(n):e}return e}function Ne(e,t){if(!e)return;let n=t.split("."),r=e;for(let o of n){if(!r)return;let s=Dt(r);if(L(s)!=="ZodObject")return;r=te(s)[o];}return r}function po(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function Qe(e,t){if(e==="unknown")return null;let n=po(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 It=et(()=>{Ze();});var Zn={};hr(Zn,{PanelMany:()=>yo,PanelOne:()=>fo,RightPanel:()=>Nt});function fo({doc:e,repoName:t,basePath:n,schema:r,columns:o}){if(!e)return jsxRuntime.jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let s=String(e.docId??e.id??""),a=`${n}/${t}/${encodeURIComponent(s)}/edit`,d=Bn(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(l=>{let u=e[l],p=d[l],f=p?Qe(p,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:l}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(De,{val:u,mismatch:f})})]})})})]})}function yo({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:d}){let l=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,u=Bn(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:l,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((p,f)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:p},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((p,f)=>{let y=String(p.docId??p.id??""),b=`${n}/${t}/${encodeURIComponent(y)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((x,v)=>{let R=p[x],m=u[x],i=m?Qe(m,R):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(De,{val:R,mismatch:i})},v)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:b,class:"btn btn-xs btn-ghost",children:"Edit"})})]},f)})})]})}),(d.hasPrev||d.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[d.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":d.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),d.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":d.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function Bn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Ie(Ne(e,r));return n}var Nt,_t=et(()=>{yt();It();Nt=({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 br(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function Me(e,t){return t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}function bt(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function tn(e){let[t,n,r]=e;return bt(e)?br(r,30).map(s=>[t,n,s]):[e]}function tt(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function nn(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 Re(e,t){let n=t.orWhere&&t.orWhere.length>0,r=t.orWhereGroups&&t.orWhereGroups.length>0;if(!n&&!r){if(!t.where||t.where.length===0)return Me(e,t).get();if(!t.where.some(bt)){let f=tt(e,t.where);return f=Me(f,t),f.get()}let l=t.where.map(tn),p=xt(l).map(f=>{let y=tt(e,f);return y=Me(y,t),y});return nn(p)}let o=t.where??[],s=[...t.orWhere?.map(d=>[d])??[],...t.orWhereGroups??[]],a=[];for(let d of s){let l=[...o,...d];if(l.some(bt)){let p=l.map(tn),y=xt(p).map(b=>{let x=tt(e,b);return x=Me(x,t),x});a.push(...y);}else {let p=tt(e,l);p=Me(p,t),a.push(p);}}return nn(a)}function xt(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=xt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var vt="preserve";function xr(e){vt=e;}function wt(){return vt}function vr(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function Rt(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(vr(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 wr(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function nt(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>nt(t));if(wr(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=nt(r);return t}return e}function U(e){return vt==="normalize"?nt(e):e}function on(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function ue(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ye(e,t){return t.where&&t.where.forEach(([n,r,o])=>{e=e.where(String(n),r,o);}),t.orderBy&&t.orderBy.forEach(n=>{e=e.orderBy(String(n.field),n.direction??"asc");}),t.limit&&(e=e.limit(t.limit)),t.offset&&(e=e.offset(t.offset)),t.select&&t.select.length>0&&(e=e.select(...t.select.map(n=>String(n)))),t.startAt&&(e=Array.isArray(t.startAt)?e.startAt(...t.startAt):e.startAt(t.startAt)),t.startAfter&&(e=Array.isArray(t.startAfter)?e.startAfter(...t.startAfter):e.startAfter(t.startAfter)),t.endAt&&(e=Array.isArray(t.endAt)?e.endAt(...t.endAt):e.endAt(t.endAt)),t.endBefore&&(e=Array.isArray(t.endBefore)?e.endBefore(...t.endBefore):e.endBefore(t.endBefore)),e}async function rt(e,t){let n={...t,limit:t.pageSize+1};t.cursor&&(t.direction==="prev"?n.endBefore=t.cursor:n.startAfter=t.cursor);let o=(await Re(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,d=a.map(u=>U({...u.data(),docId:u.id})),l=t.direction==="prev";return {data:d,nextCursor:l?a.length>0?a[a.length-1]:void 0:s?a[a.length-1]:void 0,prevCursor:l?s?a[0]:void 0:a[0],hasNextPage:l?!!t.cursor:s,hasPrevPage:l?s:!!t.cursor,pageSize:d.length}}async function*St(e,t){let n,r=true;for(;r;){let o=await rt(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function 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 sn(e,t){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(e.length!==t.length)return false;for(let n=0;n<e.length;n++)if(!sn(e[n],t[n]))return false;return true}if(typeof e=="object"&&typeof t=="object")try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}return false}function ot(e,t,n={}){let r=new Set([...n.exclude??[],...n.metaFields??[],...n.systemKeys??[]]),o=n.include?new Set(n.include):null,s=e??{},a=t??{},d=new Set([...Object.keys(s),...Object.keys(a)]),l={};for(let u of d){if(r.has(u)||o&&!o.has(u))continue;let p=s[u],f=a[u];sn(p,f)||(l[u]={oldValue:p===void 0?null:p,newValue:f===void 0?null:f,type:{old:ze(p),new:ze(f)}});}return l}var Rr=5;function Sr(e){return e.schemaVersion===2}function an(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 kr(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function Tr(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 Cr(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?an(r):ze(t),new:o?an(o):ze(n)}}}function Ar(e){let t=Cr(e),n=Tr(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function Or(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function $r(e,t){return (e.userId??null)===(t.userId??null)}function ln(e,t={}){let n=t.groupToleranceMs??Rr,r=[];for(let o of e){if(Sr(o)){r.push(kr(o));continue}let a=Ar(o),d=r[r.length-1];d&&d.schemaVersion===1&&Or(d.historySetAt,a.historySetAt,n)&&$r(d.meta,a.meta)?Object.assign(d.changes,a.changes):r.push(a);}return r}var Er=7e5;function st(e){let t=e.ttlOverride??e.config.ttl,r={schemaVersion:2,historyDocId:crypto.randomUUID(),historyToObjectId:e.entityId,historySetAt:firestore.Timestamp.now(),operation:e.operation,meta:e.meta,changes:e.changes};t&&(r.expiresAt=firestore.Timestamp.fromMillis(Date.now()+t.days*24*60*60*1e3));let o=s=>{try{return Buffer.byteLength(JSON.stringify(s,(a,d)=>d instanceof firestore.Timestamp?d.toMillis():d),"utf8")}catch{return 0}};if(o(r.changes)>Er){let s={};for(let[a,d]of Object.entries(r.changes)){let l=o(d.oldValue),u=o(d.newValue);s[a]={oldValue:l>5e4?"[truncated]":d.oldValue,newValue:u>5e4?"[truncated]":d.newValue,type:d.type};}r.changes=s,r._truncated=true;}return r}async function at(e,t,n,r){let o=t;return n.onBeforeWrite&&(o=await n.onBeforeWrite(t,r)),o?(await e.doc(o.historyDocId).set(o),{written:true,entry:o}):{written:false,reason:"dropped-by-onBeforeWrite"}}function it(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=p=>{if(!p)return;let f=n[p];return f===void 0||f===null?null:String(f)},a=s(o.userId);a!==void 0&&(r.userId=a);let d=s(o.userEmail);d!==void 0&&(r.userEmail=d);let l=s(o.reason);l!==void 0&&(r.reason=l);let u=s(o.comment);if(u!==void 0&&(r.comment=u),o.extras&&o.extras.length>0){let p={},f=false;for(let y of o.extras)y in n&&(p[y]=n[y],f=true);f&&(r.extras=p);}return r}function lt(e){let t=e.meta;if(!t)return [];let n=[];return t.userId&&n.push(t.userId),t.userEmail&&n.push(t.userEmail),t.reason&&n.push(t.reason),t.comment&&n.push(t.comment),t.extras&&n.push(...t.extras),n}var Dr="history",Ir=50;function cn(e,t,n){return e(...n).collection(t)}function Nr(e){return String(e[e.length-1]??"")}function dn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??Dr;async function s(...p){let f={},y=p,b=p[p.length-1];b!==null&&typeof b=="object"&&!(b instanceof firestore.Timestamp)&&("limit"in b||"cursor"in b||"direction"in b)&&(f=b,y=p.slice(0,-1));let x=cn(e,o,y),v=f.direction??"desc",R=x.orderBy("historySetAt",v);return f.cursor&&(R=R.startAfter(f.cursor)),f.limit&&f.limit>0&&(R=R.limit(f.limit)),(await R.get()).docs.map(i=>({id:i.id,data:i.data()}))}async function a(...p){let f={},y=p,b=p[p.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,y=p.slice(0,-1));let x=f.limit??Ir,v=Math.max(x,Math.min(x*8,500)),R=await s(...y,{limit:v,cursor:f.cursor,direction:f.direction??"desc"}),m=ln(R.map(i=>i.data));if(f.fields&&f.fields.length>0){let i=new Set(f.fields);m=m.filter(g=>Object.keys(g.changes).some(c=>i.has(c)));}if(f.operations&&f.operations.length>0){let i=new Set(f.operations);m=m.filter(g=>i.has(g.operation));}return m.slice(0,x)}async function d(...p){let f=p[p.length-1],y={},b,x;return f!==null&&typeof f=="object"&&!(f instanceof firestore.Timestamp)?(y=f,b=p[p.length-2],x=p.slice(0,-2)):(b=f,x=p.slice(0,-1)),a(...x,{...y,fields:[b]})}async function l(...p){let f=p[p.length-1],y={},b,x;return f!==null&&typeof f=="object"&&!(f instanceof firestore.Timestamp)?(y=f,b=p[p.length-2],x=p.slice(0,-2)):(b=f,x=p.slice(0,-1)),a(...x,{...y,operations:[b]})}async function u(...p){let f=p[p.length-1],y=p.slice(0,-1),b=Nr(y),x=ot(f.before??{},f.after??{},{include:r.include,exclude:r.exclude,metaFields:lt(r),systemKeys:t});if(f.operation==="update"&&Object.keys(x).length===0)return null;let R={...it(f.after??f.before??null,r),...f.meta??{}},m=st({entityId:b,operation:f.operation,changes:x,meta:R,config:r}),i=cn(e,o,y),g=await at(i,m,r,{repoName:n,docId:b,before:f.before??null,after:f.after??null});return !g.written||!g.entry?null:{historyDocId:g.entry.historyDocId,historyToObjectId:g.entry.historyToObjectId,historySetAt:g.entry.historySetAt,schemaVersion:2,operation:g.entry.operation,meta:g.entry.meta,changes:g.entry.changes}}return {list:a,raw:s,byField:d,byOperation:l,recordManual:u}}function un(e){return {count:async(t={})=>{let n=e;return n=ye(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=ye(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let d=a.data()[t];typeof d=="number"&&(s+=d);}),s},average:async(t,n={})=>{let r=e;r=ye(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(d=>{let l=d.data()[t];typeof l=="number"&&(s+=l,a++);}),a>0?s/a:null}}}function pn(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let d=e.batch();return {batch:d,set:(...l)=>{let u=l[l.length-1],p=typeof u=="object"&&u!==null&&"merge"in u,f=p?l[l.length-2]:l[l.length-1],y=p?l.slice(0,-2):l.slice(0,-1),b=p?u:{merge:true},x=t(...y),v={...f},R=y[y.length-1];n&&R&&(v[n]=R),r&&(v[r]=x.path),o&&(v[o]=a()),s&&(v[s]=a()),d.set(x,v,b);},update:(...l)=>{let u=l.pop(),f=t(...l),y={...u};s&&(y[s]=a()),d.update(f,y);},delete:(...l)=>{let u=t(...l);d.delete(u);},commit:async()=>{await d.commit();}}}}}function fn(e,t,n){let r=()=>new Date;return {set:async o=>{let s=e.bulkWriter(),a=0;for(let d of o){if(!d)continue;let{docRef:l,data:u,merge:p=true}=d,f={...u};t&&(f[t]=r()),n&&(f[n]=r()),s.set(l,f,{merge:p}),a++,a>=500&&(await s.flush(),a=0);}await s.close();},update:async o=>{let s=e.bulkWriter(),a=0;for(let d of o){if(!d)continue;let{docRef:l,data:u}=d,p={...u};n&&(p[n]=r()),s.update(l,p),a++,a>=500&&(await s.flush(),a=0);}await s.close();},delete:async o=>{let s=e.bulkWriter(),a=0;for(let d of o)d&&(s.delete(d),a++,a>=500&&(await s.flush(),a=0));await s.close();}}}function yn(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 y,b,x={...f};if(o&&(x[o]=a()),s&&(x[s]=a()),f[n]){b=f[n],y=e.doc(b);let R=r?{...x,[r]:y.path}:x;await y.set(R);}else {y=await e.add(x),b=y.id;let R={[n]:b};r&&(R[r]=y.path),await y.update(R);}let v=await y.get();return U(v.data())},set:async(...f)=>{let y=f[f.length-1],b=typeof y=="object"&&y!==null&&"merge"in y,x=b?f[f.length-2]:f[f.length-1],v=b?f.slice(0,-2):f.slice(0,-1),R=b?y:{merge:true},m={...x};s&&(m[s]=a());let i=t(...v),g=v[v.length-1];n&&g!=null&&(m[n]=g),r&&(m[r]=i.path),await i.set(m,R);let c=await i.get();return U(c.data())},update:async(...f)=>{let y=f.pop(),b=f,x={...y};s&&(x[s]=a());let v=t(...b);await v.update(x);let R=await v.get();return U(R.data())},delete:async(...f)=>{await t(...f).delete();}}}function mn(e,t,n,r,o){let s={};return s.byList=async(a,d,l="in",u={})=>{if(d.length===0)return [];let p=[],f=on(d,30);for(let y of f){let b=e;b=b.where(a,l,y),u.select&&u.select.length>0&&(b=b.select(...u.select.map(v=>String(v)))),(await b.get()).forEach(v=>{let R=U(v.data());p.push(u.returnDoc?{data:R,doc:v}:R);});}return p},t.forEach(a=>{let d=`by${ue(String(a))}`;s[d]=async(l,u={})=>{let p=typeof u=="boolean"?{returnDoc:u}:u;if(String(a)===o){let R=await r(l).get();if(!R.exists)return null;let m=U(R.data());return p.returnDoc?{data:m,doc:R}:m}let f=e;f=f.where(String(a),"==",l).limit(1),p.select&&p.select.length>0&&(f=f.select(...p.select.map(v=>String(v))));let y=await f.get();if(y.empty)return null;let b=y.docs[0];if(!b)return null;let x=U(b.data());return p.returnDoc?{data:x,doc:b}:x};}),s}function gn(e,t,n,r){let o={},s=async(a,d)=>{if(!n||!r||d.length===0)return a;let l=d.map(u=>typeof u=="string"?{key:u}:{key:u.relation,select:u.select});return Promise.all(a.map(async u=>{let p=await Promise.all(l.map(async({key:y,select:b})=>{let x=n[y];if(!x)return [y,void 0];let v=r[x.repo];if(!v)return [y,void 0];let R=u[y];if(R==null)return [y,x.type==="one"?null:[]];let m=b?{select:b}:void 0;try{if(x.type==="one"){let i=`by${ue(x.key)}`,g=typeof v.get?.[i]=="function"?await v.get[i](R,m):null;return [y,g]}else {let i=`by${ue(x.key)}`,g=typeof v.query?.[i]=="function"?await v.query[i](R,m):[];return [y,g]}}catch(i){return console.error(`[include] Error populating "${y}":`,i),[y,x.type==="one"?null:[]]}})),f={};for(let[y,b]of p)y!==void 0&&(f[y]=b);return {...u,populated:f}}))};return t.forEach(a=>{let d=`by${ue(a)}`;o[d]=async(l,u={})=>{let p={...u,where:[[a,"==",l],...u.where??[]]};return (await Re(e,p)).docs.map(y=>U(y.data()))};}),o.by=async a=>(await Re(e,a)).docs.map(l=>U(l.data())),o.getAll=async(a={})=>(await Re(e,a)).docs.map(l=>U(l.data())),o.onSnapshot=(a,d,l)=>ye(e,a).onSnapshot(p=>{d(p.docs.map(f=>U(f.data())));},l),o.paginate=async a=>{let{include:d,...l}=a,u=await rt(e,l);if(d&&d.length>0){let p=await s(u.data,d);return {...u,data:p}}return u},o.paginateAll=async function*(a){let{include:d,...l}=a;for await(let u of St(e,l))if(d&&d.length>0){let p=await s(u.data,d);yield {...u,data:p};}else yield u;},o}function hn(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 l=r;o=[l.relation],l.select&&(s[l.relation]=l.select);}else if("relations"in r){let l=r;o=Array.isArray(l.relations)?l.relations:[l.relations],s=l.select??{};}else o=[];else o=Array.isArray(r)?r:[r];let a=await Promise.all(o.map(async l=>{let u=e.relationalKeys?.[l];if(!u)return console.warn(`[populate] Relation "${l}" not found in config`),[l,void 0];let p=t[u.repo];if(!p)return console.warn(`[populate] Repository "${u.repo}" not found in mapping`),[l,void 0];let f=n[l];if(f==null)return [l,u.type==="one"?null:[]];let y=s[l],b=y?{select:y}:void 0;try{if(u.type==="one"){let x=`by${ue(u.key)}`,v=typeof p.get?.[x]=="function"?await p.get[x](f,b):null;return [l,v]}else {let x=`by${ue(u.key)}`,v=typeof p.query?.[x]=="function"?await p.query[x](f,b):[];return [l,v]}}catch(x){return console.error(`[populate] Error populating "${l}":`,x),[l,u.type==="one"?null:[]]}})),d={};for(let[l,u]of a)u!==void 0&&(d[l]=u);return {...n,populated:d}}}}function bn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),d=await r.get(a);return d.exists?U({...d.data(),docId:d.id}):null},set:(...s)=>{let a=s[s.length-1],d=typeof a=="object"&&a!==null&&"merge"in a,l=d?s[s.length-2]:s[s.length-1],u=d?s.slice(0,-2):s.slice(0,-1),p=d?a:{merge:true},f=t(...u);r.set(f,l,p);},update:(...s)=>{let a=s[s.length-1],d=s.slice(0,-1),l=t(...d);r.update(l,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function _r(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 Ct(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...R)=>t.refCb(e,...R),a=mn(r,t.foreignKeys,o,s,t.documentKey),d=gn(r,t.queryKeys,t.relationalKeys,n),l=un(r),u=yn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),p=pn(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),f=bn(e,s),y=fn(e,t.createdKey,t.updatedKey),b=hn(t,n),x=t.history,v=x?.enabled?dn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(R=>typeof R=="string"),t.path??"(unknown)",x):null;return {ref:r,documentRef:s,get:a,query:d,aggregate:l,...u,batch:p,transaction:f,bulk:y,...b,...v?{history:v}:{},_historySubcollection:v?x?.subcollection??"history":void 0,_historyConfig:x,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(R=>typeof R=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?_r(t.refCb):[],_createdKey:t.createdKey??null}}var jr="history";function Fr(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 xn(e,t){let{onDocumentWritten:n}=t.deps,r={};for(let[o,s]of Object.entries(e)){let a=s._historyConfig??(typeof s.history=="object"&&s.history!==null&&"enabled"in s.history?s.history:void 0);if(!a?.enabled)continue;let d=a.subcollection??jr,l=a.ttl??t.defaults?.ttl,u=t.repos?.[o],p;if(s._isGroup){if(!u?.triggerPath){console.warn(`[HistoryTriggers] Skipping collection-group repo "${o}". Provide a triggerPath in the history triggers repos override.`);continue}p=u.triggerPath;}else p=u?.triggerPath??Fr(o,s);if(!p)continue;let f=s._systemKeys??[],y=f[0]??"docId",b=lt(a);r[`${o}_onHistory`]=n(p,async x=>{try{let v=x.data?.before?.data(),R=x.data?.after?.data(),m;if(!v&&R)m="create";else if(v&&!R)m="delete";else if(v&&R)m="update";else return;let i=String(R?.[y]??v?.[y]??x.params?.docId??x.data?.after?.id??x.data?.before?.id??"");if(!i)return;let g=ot(v??{},R??{},{include:a.include,exclude:a.exclude,metaFields:b,systemKeys:f});if(m==="update"&&Object.keys(g).length===0)return;let c=it(R??v??null,a),h=st({entityId:i,operation:m,changes:g,meta:c,config:a,ttlOverride:l}),w=x.data?.after?.ref??x.data?.before?.ref;if(!w)return;let k=w.collection(d);await at(k,h,a,{repoName:o,docId:i,before:v??null,after:R??null});}catch(v){console.error(`[HistoryTriggers] Failed to record history for "${o}":`,v);}});}return r}function Mr(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 zr(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var ne=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}=Mr(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=zr(t),s=null,a={};for(let u of this.routes){if(u.method!==r)continue;let p=o.match(u.pattern);if(p){s=u,a={},u.paramNames.forEach((f,y)=>{a[f]=decodeURIComponent(p[y+1]??"");});break}}let d=Object.assign(t,{params:a}),l=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,l);}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();}};Ze();var me="__sync_version";var Br=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function Zr(e){let t=e,n=false;for(;;){let r=L(t);if(!Br.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=G(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var Lr={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function Sn(e,t,n,r,o,s,a,d){for(let[l,u]of Object.entries(e)){let p=n?`${n}__${l}`:l;if(o.has(l)||o.has(p))continue;let{inner:f,nullable:y}=Zr(u),b=L(f),x=r||y;if(b==="ZodObject"){let i=te(f);Sn(i,t,p,x,o,s,a,d);continue}let v=Lr[b]??"json",R=p===a||l===a,m=s[p]??s[l]??p;d.push({name:m,sqlType:t.mapType(v),nullable:R?false:x,isPrimaryKey:R});}}function ut(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),d=te(e),l=[];return Sn(d,t,"",false,a,s,r,l),l.some(u=>u.name===me)||l.push({name:me,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),l}function kn(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(kn)):e}function Tn(e,t,n){for(let[r,o]of Object.entries(e)){let s=t?`${t}__${r}`:r;o!=null&&typeof o=="object"&&!Array.isArray(o)&&!(o instanceof Date)&&!Buffer.isBuffer(o)&&!(o instanceof Uint8Array)&&typeof o.toDate!="function"&&!("latitude"in o&&"longitude"in o)?Tn(o,s,n):n[s]=kn(o);}}function Le(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};Tn(e,"",o);let s={};for(let[a,d]of Object.entries(o)){if(n.has(a))continue;let l=a.split("__")[0];if(l!==a&&n.has(l))continue;let u=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[u]=d;}return s}function Se(e,t){if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",s=process.env.FUNCTION_REGION??"us-central1",a=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${o}/${s}/${a}${t}`}let n=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return n&&r.includes("cloudfunctions.net")?`/${n.toLowerCase()}${t}`:t}function ae(e,t,n){return `<!DOCTYPE html>
|
|
2
2
|
<html lang="en"><head>
|
|
3
3
|
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
4
4
|
<title>${e} \u2014 Sync Admin</title>
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
<nav><a href="${t}/">\u2190 Dashboard</a></nav>
|
|
29
29
|
<h1>${e}</h1>
|
|
30
30
|
${n}
|
|
31
|
-
</body></html>`}function ie(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function
|
|
31
|
+
</body></html>`}function ie(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function ke(e,t,n=200){e.status(n).set("Content-Type","application/json").send(JSON.stringify(t,null,2));}function Ke(e){return (e.headers?.accept??"").includes("application/json")}function Cn(e,t,n,r,o,s,a,d){let l=(o.basePath??"/").replace(/\/$/,"")||"",u=o.featuresFlag??{},p=[];for(let[y,b]of Object.entries(e)){let x=s[y];p.push({name:y,schema:b.schema??null,documentKey:b._systemKeys?.[0]??b.documentKey??"docId",tableName:x?.tableName??y,isGroup:!!b._isGroup,repoCfg:x,repo:b});}let f=new ne;if(o.auth)if(typeof o.auth=="function")f.use(o.auth);else {let y=o.auth.realm??"Sync Admin",b="Basic "+Buffer.from(`${o.auth.username}:${o.auth.password}`).toString("base64");f.use((x,v,R)=>{if((x.headers?.authorization??"")!==b){v.status(401).set("WWW-Authenticate",`Basic realm="${y}"`).set("Content-Type","text/plain").send("Unauthorized");return}R();});}return f.get(`${l}/`,(y,b)=>{let x=Se(y,l),v=p.map(g=>{let c=[];return u.healthCheck&&c.push(`<a class="btn" href="${x}/${g.name}/health">Health</a>`),u.manualSync&&c.push(`<a class="btn btn-primary" href="${x}/${g.name}/force-sync">Force Sync</a>`),`<tr>
|
|
32
32
|
<td><strong>${g.name}</strong></td>
|
|
33
33
|
<td>${g.tableName}</td>
|
|
34
34
|
<td>${g.isGroup?'<span class="badge badge-warn">group</span>':'<span class="badge badge-ok">collection</span>'}</td>
|
|
@@ -42,53 +42,53 @@ ${n}
|
|
|
42
42
|
</table>
|
|
43
43
|
${R}
|
|
44
44
|
${m}
|
|
45
|
-
</div>`);ie(b,i);}),f.get(`${l}`,(y,b)=>{let x=Se(y,l);b.status(302).set("Location",`${x}/`).send("");}),u.healthCheck&&f.get(`${l}/:repoName/health`,async(y,b)=>{let x=Se(y,l),v=p.find($=>$.name===y.params.repoName);if(!v){ie(b,ae("Not Found",x,`<p>Unknown repo: ${y.params.repoName}</p>`),404);return}if(!v.schema){ie(b,ae("Health Check",x,`<p class="badge badge-warn">No Zod schema attached to "${v.name}"</p>`));return}let R=
|
|
46
|
-
`),A=
|
|
47
|
-
`),
|
|
48
|
-
<p>Table: <code>${v.tableName}</code> ${i?
|
|
45
|
+
</div>`);ie(b,i);}),f.get(`${l}`,(y,b)=>{let x=Se(y,l);b.status(302).set("Location",`${x}/`).send("");}),u.healthCheck&&f.get(`${l}/:repoName/health`,async(y,b)=>{let x=Se(y,l),v=p.find($=>$.name===y.params.repoName);if(!v){ie(b,ae("Not Found",x,`<p>Unknown repo: ${y.params.repoName}</p>`),404);return}if(!v.schema){ie(b,ae("Health Check",x,`<p class="badge badge-warn">No Zod schema attached to "${v.name}"</p>`));return}let R=ut(v.schema,t.dialect,{primaryKey:v.documentKey,exclude:v.repoCfg?.exclude,columnMap:v.repoCfg?.columnMap}),m=[],i=false,g=null;try{i=await t.tableExists(v.tableName),i&&(m=await t.getTableColumns(v.tableName));}catch($){g=$?.message??String($);}let c=new Set(m),h=new Set(R.map($=>$.name)),w=R.filter($=>!c.has($.name)),k=m.filter($=>!h.has($)),S=R.filter($=>c.has($.name)),C=i&&w.length===0&&!g;if(Ke(y)){ke(b,{repo:v.name,table:v.tableName,tableExists:i,healthy:C,error:g,columns:{expected:R.map($=>({name:$.name,type:$.sqlType,nullable:$.nullable,isPrimaryKey:$.isPrimaryKey})),actual:m,matched:S.map($=>$.name),missing:w.map($=>({name:$.name,type:$.sqlType})),extra:k}});return}let T=C?'<span class="badge badge-ok">Healthy</span>':'<span class="badge badge-err">Unhealthy</span>',O=R.map($=>{let I=c.has($.name)?'<span class="badge badge-ok">OK</span>':'<span class="badge badge-err">MISSING</span>';return `<tr><td>${$.name}</td><td>${$.sqlType}</td><td>${$.nullable?"Yes":"No"}</td><td>${$.isPrimaryKey?"\u2713":""}</td><td>${I}</td></tr>`}).join(`
|
|
46
|
+
`),A=k.map($=>`<tr><td>${$}</td><td colspan="3" class="muted">not in schema</td><td><span class="badge badge-warn">EXTRA</span></td></tr>`).join(`
|
|
47
|
+
`),P=ae(`Health: ${v.name}`,x,`<div class="card">
|
|
48
|
+
<p>Table: <code>${v.tableName}</code> ${i?T:'<span class="badge badge-err">NOT FOUND</span>'}</p>
|
|
49
49
|
${g?`<p class="badge badge-err">Error: ${g}</p>`:""}
|
|
50
50
|
<h2>Columns</h2>
|
|
51
51
|
<table>
|
|
52
52
|
<thead><tr><th>Column</th><th>SQL Type</th><th>Nullable</th><th>PK</th><th>Status</th></tr></thead>
|
|
53
53
|
<tbody>${O}${A}</tbody>
|
|
54
54
|
</table>
|
|
55
|
-
</div>`);ie(b,
|
|
55
|
+
</div>`);ie(b,P);}),u.manualSync&&(f.get(`${l}/:repoName/force-sync`,(y,b)=>{let x=Se(y,l),v=p.find(m=>m.name===y.params.repoName);if(!v){ie(b,ae("Not Found",x,`<p>Unknown repo: ${y.params.repoName}</p>`),404);return}let R=ae(`Force Sync: ${v.name}`,x,`<div class="card">
|
|
56
56
|
<p>This will read <strong>all</strong> documents from the <code>${v.name}</code> Firestore collection
|
|
57
57
|
and upsert them into the <code>${v.tableName}</code> SQL table.</p>
|
|
58
58
|
<p class="muted" style="margin:.75rem 0">This may take a while for large collections.</p>
|
|
59
59
|
<form method="POST" action="${x}/${v.name}/force-sync">
|
|
60
60
|
<button type="submit" class="btn btn-primary">Start Force Sync</button>
|
|
61
61
|
</form>
|
|
62
|
-
</div>`);ie(b,R);}),f.post(`${l}/:repoName/force-sync`,async(y,b)=>{let x=Se(y,l),v=p.find(C=>C.name===y.params.repoName);if(!v){
|
|
62
|
+
</div>`);ie(b,R);}),f.post(`${l}/:repoName/force-sync`,async(y,b)=>{let x=Se(y,l),v=p.find(C=>C.name===y.params.repoName);if(!v){ke(b,{error:`Unknown repo: ${y.params.repoName}`},404);return}let R=v.repo.ref;if(!R){ke(b,{error:`No collection reference for "${v.name}"`},400);return}let m=0,i=0,g=[],c=500,h=R.limit(c),w=null;try{for(;;){let O=await(w?h.startAfter(w):h).get();if(O.empty)break;for(let A of O.docs){let P=A.data(),$=String(P[v.documentKey]??A.id),I=Le(P,{exclude:v.repoCfg?.exclude,columnMap:v.repoCfg?.columnMap});try{await r({operation:"UPSERT",repoName:v.name,docId:$,data:I,timestamp:new Date().toISOString()}),m++;}catch(j){i++;let D=j?.message??String(j);console.error(`[ForceSync:${v.name}] doc=${$} failed:`,j),g.length<5&&g.push(`${$}: ${D}`);}}if(w=O.docs[O.docs.length-1],O.docs.length<c)break}let C=n.get(v.name);C&&await C.flush();}catch(C){if(Ke(y)){ke(b,{error:C?.message??String(C),synced:m,errors:i},500);return}ie(b,ae(`Force Sync: ${v.name}`,x,`<div class="card">
|
|
63
63
|
<p class="badge badge-err">Error: ${C?.message??String(C)}</p>
|
|
64
64
|
<p>Synced ${m} docs before failure (${i} errors).</p>
|
|
65
|
-
</div>`),500);return}if(Ke(y)){
|
|
66
|
-
<pre style="white-space:pre-wrap">${g.map(C=>C.replace(/[<>&]/g,
|
|
65
|
+
</div>`),500);return}if(Ke(y)){ke(b,{repo:v.name,table:v.tableName,synced:m,errors:i,...g.length>0&&{errorSamples:g}});return}let k=g.length>0?`<details style="margin-top:1rem"><summary>First ${g.length} error(s)</summary>
|
|
66
|
+
<pre style="white-space:pre-wrap">${g.map(C=>C.replace(/[<>&]/g,T=>`&#${T.charCodeAt(0)};`)).join(`
|
|
67
67
|
|
|
68
68
|
`)}</pre></details>`:"",S=ae(`Force Sync: ${v.name}`,x,`<div class="card">
|
|
69
69
|
<p class="badge ${i>0?"badge-warn":"badge-ok"}">${i>0?"Completed with errors":"Complete"}</p>
|
|
70
70
|
<p>Synced <strong>${m}</strong> documents to <code>${v.tableName}</code>.</p>
|
|
71
71
|
${i>0?`<p class="badge badge-warn">${i} error(s)</p>`:""}
|
|
72
|
-
${
|
|
73
|
-
</div>`);ie(b,S);})),u.viewQueue&&f.get(`${l}/queues`,(y,b)=>{let x=Se(y,l),v=[];for(let i of p){let g=n.get(i.name);v.push({repo:i.name,table:i.tableName,pending:g?g.size:0});}if(Ke(y)){
|
|
72
|
+
${k}
|
|
73
|
+
</div>`);ie(b,S);})),u.viewQueue&&f.get(`${l}/queues`,(y,b)=>{let x=Se(y,l),v=[];for(let i of p){let g=n.get(i.name);v.push({repo:i.name,table:i.tableName,pending:g?g.size:0});}if(Ke(y)){ke(b,{queues:v});return}let R=v.map(i=>`<tr><td>${i.repo}</td><td>${i.table}</td><td>${i.pending===0?'<span class="badge badge-ok">0</span>':`<span class="badge badge-warn">${i.pending}</span>`}</td></tr>`).join(`
|
|
74
74
|
`),m=ae("Sync Queues",x,`<div class="card">
|
|
75
75
|
<table>
|
|
76
76
|
<thead><tr><th>Repository</th><th>Table</th><th>Pending</th></tr></thead>
|
|
77
77
|
<tbody>${R}</tbody>
|
|
78
78
|
</table>
|
|
79
|
-
</div>`);ie(b,m);}),u.configCheck&&f.get(`${l}/config-check`,async(y,b)=>{let x=Se(y,l),v=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??process.env.GCP_PROJECT??"unknown",R="https://console.cloud.google.com",m=d??"firestore-sync",i=[];try{await t.tableExists("__nonexistent_health_check__"),i.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable"});}catch(C){let
|
|
80
|
-
`),console:`${R}/iam-admin/iam?project=${v}`}}):I?i.push({name:"BigQuery Dataset",category:"bigquery",status:"error",message:`Dataset not found: ${
|
|
79
|
+
</div>`);ie(b,m);}),u.configCheck&&f.get(`${l}/config-check`,async(y,b)=>{let x=Se(y,l),v=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??process.env.GCP_PROJECT??"unknown",R="https://console.cloud.google.com",m=d??"firestore-sync",i=[];try{await t.tableExists("__nonexistent_health_check__"),i.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable"});}catch(C){let T=C?.message??String(C),O=T.toLowerCase(),A=O.includes("disabled")||O.includes("has not been used")||O.includes("accessnotconfigured"),P=O.includes("permission")||T.includes("403")||O.includes("access denied"),$=O.includes("project")&&O.includes("not found"),I=O.includes("not found")||T.includes("404");A?i.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:`${R}/apis/library/bigquery.googleapis.com?project=${v}`}}):$?i.push({name:"BigQuery Project",category:"bigquery",status:"error",message:T,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:`${R}/home/dashboard`}}):P?i.push({name:"BigQuery API",category:"bigquery",status:"error",message:`Permission denied: ${T}`,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(`
|
|
80
|
+
`),console:`${R}/iam-admin/iam?project=${v}`}}):I?i.push({name:"BigQuery Dataset",category:"bigquery",status:"error",message:`Dataset not found: ${T}`,fix:{hint:"Create the dataset first",gcloud:`bq mk --dataset ${v}:YOUR_DATASET_ID`,console:`${R}/bigquery?project=${v}`}}):i.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable (table lookup returned expected error)"});}for(let C of p)try{let T=await t.tableExists(C.tableName);i.push({name:`Table: ${C.tableName}`,category:"bigquery",status:T?"ok":"warn",message:T?`Table \`${C.tableName}\` exists`:`Table \`${C.tableName}\` does not exist yet`,...!T&&{fix:{hint:"Table will be auto-created on first sync if autoMigrate is enabled. Or create it manually."}}});}catch(T){i.push({name:`Table: ${C.tableName}`,category:"bigquery",status:"error",message:T?.message??String(T)});}if(a)for(let C of p){let T=`${m}-${C.name}`;try{let O=a.topic(T);if(typeof O.exists=="function"){let[A]=await O.exists();i.push({name:`Topic: ${T}`,category:"pubsub",status:A?"ok":"error",message:A?`Topic \`${T}\` exists`:`Topic \`${T}\` does not exist`,...!A&&{fix:{gcloud:`gcloud pubsub topics create ${T} --project=${v}`,console:`${R}/cloudpubsub/topic/list?project=${v}`}}});}else i.push({name:`Topic: ${T}`,category:"pubsub",status:"warn",message:"Cannot verify topic existence (PubSub client doesn't expose .exists())",fix:{gcloud:`gcloud pubsub topics create ${T} --project=${v}`,console:`${R}/cloudpubsub/topic/list?project=${v}`,hint:"Ensure the topic exists. It is auto-created by the Firebase emulator but must exist in production."}});}catch(O){let A=O?.message??String(O),P=A.includes("disabled")||A.includes("has not been used");if(i.push({name:P?"Pub/Sub API":`Topic: ${T}`,category:"pubsub",status:"error",message:P?"Pub/Sub API is not enabled":A,fix:P?{gcloud:`gcloud services enable pubsub.googleapis.com --project=${v}`,console:`${R}/apis/library/pubsub.googleapis.com?project=${v}`}:{gcloud:`gcloud pubsub topics create ${T} --project=${v}`,console:`${R}/cloudpubsub/topic/list?project=${v}`}}),P)break}}else i.push({name:"Pub/Sub Client",category:"pubsub",status:"warn",message:"PubSub client not available for config check"});if(Ke(y)){let C=i.every(T=>T.status==="ok");ke(b,{project:v,healthy:C,checks:i});return}let g=C=>C==="ok"?'<span class="badge badge-ok">OK</span>':C==="warn"?'<span class="badge badge-warn">WARN</span>':'<span class="badge badge-err">ERROR</span>',c={bigquery:i.filter(C=>C.category==="bigquery"),pubsub:i.filter(C=>C.category==="pubsub"),firestore:i.filter(C=>C.category==="firestore")},h=(C,T)=>{if(T.length===0)return "";let O=T.map(A=>{let P="";if(A.fix){let $=[];A.fix.hint&&$.push(`<p class="muted">${A.fix.hint}</p>`),A.fix.gcloud&&$.push(`<pre>$ ${A.fix.gcloud}</pre>`),A.fix.console&&$.push(`<p><a href="${A.fix.console}" target="_blank">Open GCP Console \u2192</a></p>`),P=`<div style="margin-top:.5rem">${$.join("")}</div>`;}return `<tr>
|
|
81
81
|
<td>${g(A.status)}</td>
|
|
82
|
-
<td><strong>${A.name}</strong><br><span class="muted">${A.message}</span>${
|
|
82
|
+
<td><strong>${A.name}</strong><br><span class="muted">${A.message}</span>${P}</td>
|
|
83
83
|
</tr>`}).join(`
|
|
84
84
|
`);return `<h2>${C}</h2>
|
|
85
85
|
<table><thead><tr><th style="width:80px">Status</th><th>Check</th></tr></thead>
|
|
86
|
-
<tbody>${O}</tbody></table>`},
|
|
87
|
-
<p>Project: <code>${v}</code> ${
|
|
86
|
+
<tbody>${O}</tbody></table>`},k=i.every(C=>C.status==="ok")?'<span class="badge badge-ok">All checks passed</span>':'<span class="badge badge-warn">Some issues found</span>',S=ae("Config Check",x,`<div class="card">
|
|
87
|
+
<p>Project: <code>${v}</code> ${k}</p>
|
|
88
88
|
${h("BigQuery",c.bigquery)}
|
|
89
89
|
${h("Pub/Sub",c.pubsub)}
|
|
90
90
|
${h("Firestore",c.firestore)}
|
|
91
|
-
</div>`);ie(b,S);}),async(y,b)=>{await f.handle(y,b);}}var
|
|
91
|
+
</div>`);ie(b,S);}),async(y,b)=>{await f.handle(y,b);}}var Kr="firestore-sync";function qr(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 An(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,a=t?.topicPrefix??Kr,d={},l=new Map;function u(f){let y=l.get(f);return y||(y=s.topic(f),l.set(f,y),y)}async function p(f,y){await u(f).publishMessage({json:y});}for(let[f,y]of Object.entries(e)){let b=t?.repos?.[f],x;if(y._isGroup){if(!b?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${f}". Provide a triggerPath in the sync repos config for group collections.`);continue}x=b.triggerPath;}else x=b?.triggerPath??qr(f,y);if(!x)continue;let v=y._systemKeys?.[0]??"docId",R=`${a}-${f}`;d[`${f}_onCreate`]=n(x,async m=>{let i=m.data;if(!i)return;let g=i.data();if(!g)return;let c=String(g[v]??i.id),h=Le(g,{exclude:b?.exclude,columnMap:b?.columnMap}),w={operation:"INSERT",repoName:f,docId:c,data:h,timestamp:new Date().toISOString(),version:Date.now()};await p(R,w);}),d[`${f}_onUpdate`]=r(x,async m=>{let i=m.data?.after;if(!i)return;let g=i.data();if(!g)return;let c=String(g[v]??i.id),h=Le(g,{exclude:b?.exclude,columnMap:b?.columnMap}),w={operation:"UPSERT",repoName:f,docId:c,data:h,timestamp:new Date().toISOString(),version:Date.now()};await p(R,w);}),d[`${f}_onDelete`]=o(x,async m=>{let i=m.data;if(!i)return;let g=i.data(),c=String(g?.[v]??i.id),h={operation:"DELETE",repoName:f,docId:c,data:null,timestamp:new Date().toISOString(),version:Date.now()};await p(R,h);});}return d}var pt=class{constructor(t){this.buffer=[];this.flushing=false;this.timer=null;this.adapter=t.adapter,this.tableName=t.tableName,this.primaryKey=t.primaryKey,this.batchSize=t.batchSize??100,this.onFlushError=t.onFlushError;let n=t.flushIntervalMs??5e3;n>0&&(this.timer=setInterval(()=>{this.flush();},n),typeof this.timer=="object"&&"unref"in this.timer&&this.timer.unref());}get size(){return this.buffer.length}enqueue(...t){this.buffer.push(...t),this.buffer.length>=this.batchSize&&this.flush();}async flush(){if(this.flushing||this.buffer.length===0)return;this.flushing=true;let t=this.buffer.splice(0,this.batchSize);try{let n=new Map,r=[];for(let s of t)if(s.operation==="DELETE")r.push(s.docId),n.delete(s.docId);else if(s.data){let a=n.get(s.docId);if(!a)n.set(s.docId,s.data);else {let d=Number(a[me]??0);Number(s.data[me]??0)>=d&&n.set(s.docId,s.data);}}let o=Array.from(n.values());o.length>0&&await this.adapter.upsertRows(this.tableName,o,this.primaryKey),r.length>0&&await this.adapter.deleteRows(this.tableName,this.primaryKey,r);}catch(n){this.onFlushError?await this.onFlushError(t,n).catch(r=>{console.error(`[SyncQueue] Flush error for ${this.tableName}:`,n),console.error("[SyncQueue] Error handler also failed:",r);}):(this.buffer.unshift(...t),console.error(`[SyncQueue] Flush failed for ${this.tableName}:`,n));}finally{this.flushing=false;}}async shutdown(){this.timer&&(clearInterval(this.timer),this.timer=null),await this.flush();}};var On=new Set;async function Ur(e,t,n,r,o,s,a){if(On.has(e))return;let d=ut(n,t.dialect,{primaryKey:o,exclude:s,columnMap:a});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:d});else {let u=new Set(await t.getTableColumns(r)),p=d.filter(f=>!u.has(f.name));p.length>0&&await t.addColumns(r,p);}On.add(e);}function $n(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:a=false,topicPrefix:d="firestore-sync",workerOptions:l,repos:u={}}=t,p=new Map;function f(x,v){let R=p.get(x);if(R)return R;let i=u[x]?.tableName??x,g=async(c,h)=>{console.error(`[SyncWorker] Flush failed for "${x}" (${c.length} events):`,h);try{let w=`${d}-${x}-dlq`,k=n.pubsub.topic(w),[S]=await k.exists();S||(await k.create(),console.info(`[SyncWorker] Created DLQ topic "${w}"`));for(let C of c)await k.publishMessage({json:C});}catch(w){console.error(`[SyncWorker] Dead-letter publish also failed for ${x}:`,w);}};return R=new pt({adapter:r,tableName:i,primaryKey:v,batchSize:o,flushIntervalMs:s,onFlushError:g}),p.set(x,R),R}async function y(x){let{repoName:v}=x,R=e[v];if(!R){console.warn(`[SyncWorker] Unknown repo "${v}", skipping event`);return}let m=R._systemKeys?.[0]??R.documentKey??"docId",i=u[v],g=i?.columnMap,c=g?.[m]??m;if(a){let w=R.schema??void 0;if(w){let k=i?.tableName??v;await Ur(v,r,w,k,m,i?.exclude,g);}}let h=f(v,c);x.data&&(x.data[me]=x.version??Date.now()),h.enqueue(x);}function b(x){let v=async R=>{let m=R.data?.message?.json??R.data?.json;if(!m){console.warn("[SyncWorker] Received empty PubSub message");return}await y(m);let i=p.get(m.repoName);i&&await i.flush();};return l?n.pubsubHandler.onMessagePublished({topic:x,...l},v):n.pubsubHandler.onMessagePublished(x,v)}return {handleMessage:y,createHandler:b,queues:p,async shutdown(){let x=[];for(let v of p.values())x.push(v.shutdown());await Promise.all(x);}}}var Vr="firestore-sync";function Pn(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 En(e,t){let{deps:n,adapter:r,topicPrefix:o=Vr,batchSize:s,flushIntervalMs:a,autoMigrate:d,admin:l,workerOptions:u,repos:p}=t,f=Pn(n.pubsub),y=Pn(r),b=An(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:f},topicPrefix:o,repos:p}),x=$n(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:f},adapter:y,batchSize:s,flushIntervalMs:a,autoMigrate:d,topicPrefix:o,workerOptions:u,repos:p}),v={};for(let i of Object.keys(e))v[`sync_${i}`]=x.createHandler(`${o}-${i}`);let R=null;l&&(R=Cn(e,y,x.queues,x.handleMessage,l,p??{},f,o),v.adminsync=l.onRequest?l.httpsOptions?l.onRequest(l.httpsOptions,R):l.onRequest(R):R);let m={functions:{...b,...v},adminHandler:R,handleMessage:x.handleMessage,queues:x.queues,shutdown:x.shutdown};for(let i of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(m,i,{enumerable:false});return m}function qe(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",a=process.env.FUNCTION_REGION??"us-central1",d=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${a}/${d}${n}`}let r=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return r&&typeof o=="string"&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function Pe(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Ze();Ze();function Wr(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Dn(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=wn(t),t=G(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function le(e,t=""){if(L(e)==="ZodObject"){let r=te(e);return Object.entries(r).map(([o,s])=>In(t?`${t}.${o}`:o,o,s))}return [In(t||"value",t||"value",e)]}function In(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=Dn(n),d=L(r),l=Wr(t.split(".").pop()??t);switch(d){case "ZodString":{let u=Rn(r),p=u.includes("email"),f=u.includes("url");return {name:e,label:l,type:"text",required:o,nullable:s,defaultValue:a,hint:p?"email":f?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:l,type:"number",required:o,nullable:s,defaultValue:a};case "ZodBoolean":return {name:e,label:l,type:"checkbox",required:o,nullable:s,defaultValue:a};case "ZodDate":case "ZodCoerce":return {name:e,label:l,type:"datetime-local",required:o,nullable:s,defaultValue:a};case "ZodEnum":{let u=He(r);return {name:e,label:l,type:"select",required:o,nullable:s,defaultValue:a,options:u}}case "ZodNativeEnum":{let u=Be(r),p=Object.values(u).filter(f=>typeof f=="string");return {name:e,label:l,type:"select",required:o,nullable:s,defaultValue:a,options:p}}case "ZodLiteral":{let u=String(dt(r)??"");return {name:e,label:l,type:"select",required:o,nullable:s,defaultValue:a,options:[u]}}case "ZodObject":{let u=le(r,e);return {name:e,label:l,type:"textarea",required:o,nullable:s,defaultValue:a,nested:u,hint:"JSON object"}}case "ZodArray":{let u=vn(r);if(!u)return {name:e,label:l,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:p}=Dn(u),f=L(p),y,b,x;switch(f){case "ZodString":y="text";break;case "ZodNumber":case "ZodBigInt":y="number";break;case "ZodBoolean":y="checkbox";break;case "ZodDate":y="datetime-local";break;case "ZodEnum":y="select",b=He(p);break;case "ZodNativeEnum":y="select",b=Object.values(Be(p)).filter(v=>typeof v=="string");break;case "ZodObject":y="object",x=le(p);break;default:return {name:e,label:l,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"}}return {name:e,label:l,type:"textarea",required:o,nullable:s,defaultValue:a,arrayElementType:y,arrayElementOptions:b,arrayElementFields:x}}default:return {name:e,label:l,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function At(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.name,s=e.required?" required":"",a=e.defaultValue==="__null__",d=!a&&e.defaultValue!=null?String(e.defaultValue):"",l=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
|
|
92
92
|
<input type="hidden" id="${r}__isnull" name="${o}__isnull" value="${a?"1":""}">
|
|
93
93
|
<label class="flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/40 hover:text-base-content/70 border border-base-300 rounded px-2 py-1">
|
|
94
94
|
<input type="checkbox" class="checkbox checkbox-xs" ${a?"checked":""}
|
|
@@ -125,7 +125,7 @@ ${n}
|
|
|
125
125
|
${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
|
|
126
126
|
${(e.options??[]).map(p=>`<option value="${_(p)}"${d===p?" selected":""}>${_(p)}</option>`).join(`
|
|
127
127
|
`)}
|
|
128
|
-
</select>`;break;case "textarea":if(e.arrayElementType)return
|
|
128
|
+
</select>`;break;case "textarea":if(e.arrayElementType)return Jr(e,t);if(e.nested&&e.nested.length>0){let p=e.nested.map(f=>At(f,t+1)).join(`
|
|
129
129
|
`);return `
|
|
130
130
|
<fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}">
|
|
131
131
|
<legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
|
|
@@ -149,9 +149,9 @@ ${n}
|
|
|
149
149
|
<div class="flex-1 min-w-0">${u}</div>
|
|
150
150
|
${l}
|
|
151
151
|
</div>
|
|
152
|
-
</div>`}function _(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function
|
|
153
|
-
`):a.map(p=>
|
|
154
|
-
`),l=s?
|
|
152
|
+
</div>`}function _(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Jr(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 d=s?a.map(p=>_n(e,p??{})).join(`
|
|
153
|
+
`):a.map(p=>Nn(e,p)).join(`
|
|
154
|
+
`),l=s?_n(e,{}):Nn(e,""),u=e.nullable?`<span class="flex items-center gap-1 mt-2">
|
|
155
155
|
<input type="hidden" id="${r}__isnull" name="${_(e.name)}__isnull" value="${o?"1":""}">
|
|
156
156
|
<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">
|
|
157
157
|
<input type="checkbox" class="checkbox checkbox-xs" ${o?"checked":""}
|
|
@@ -177,7 +177,7 @@ ${n}
|
|
|
177
177
|
<template data-frs-array-tpl>${l}</template>
|
|
178
178
|
<button type="button" class="btn btn-xs btn-outline mt-1" data-frs-array-add>+ Add</button>
|
|
179
179
|
${u}
|
|
180
|
-
</fieldset>`}function
|
|
180
|
+
</fieldset>`}function Nn(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">
|
|
181
181
|
<option value="">\u2014</option>
|
|
182
182
|
${(e.arrayElementOptions??[]).map(o=>`<option value="${_(o)}"${n===o?" selected":""}>${_(o)}</option>`).join("")}
|
|
183
183
|
</select>`;break;case "checkbox":r=`<label class="flex items-center gap-2 flex-1 cursor-pointer">
|
|
@@ -186,7 +186,7 @@ ${n}
|
|
|
186
186
|
</label>`;break;case "number":r=`<input type="number" data-frs-val value="${_(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":r=`<input type="datetime-local" data-frs-val value="${_(n)}" class="input input-bordered input-sm flex-1">`;break;default:r=`<input type="text" data-frs-val value="${_(n)}" class="input input-bordered input-sm flex-1">`;}return `<div class="flex items-center gap-2 mb-2" data-frs-array-item>
|
|
187
187
|
${r}
|
|
188
188
|
<button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>×</button>
|
|
189
|
-
</div>`}function
|
|
189
|
+
</div>`}function _n(e,t){return `<div class="border border-base-200 rounded p-3 mb-2" data-frs-array-item>
|
|
190
190
|
<div class="flex justify-end mb-1">
|
|
191
191
|
<button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>×</button>
|
|
192
192
|
</div>
|
|
@@ -215,7 +215,7 @@ ${n}
|
|
|
215
215
|
<input type="text" data-frs-key="${_(o.name)}" value="${_(a)}" class="input input-bordered input-sm w-full">
|
|
216
216
|
</div>`}}).join(`
|
|
217
217
|
`)}
|
|
218
|
-
</div>`}function ge(e,t,n,r="Save"){let o=e.map(s=>
|
|
218
|
+
</div>`}function ge(e,t,n,r="Save"){let o=e.map(s=>At(s)).join(`
|
|
219
219
|
`);return `
|
|
220
220
|
<form action="${_(t)}" method="${n}" novalidate data-frs-form>
|
|
221
221
|
${o}
|
|
@@ -223,7 +223,7 @@ ${n}
|
|
|
223
223
|
<button type="submit" class="btn btn-primary btn-sm">${_(r)}</button>
|
|
224
224
|
<button type="button" class="btn btn-ghost btn-sm" onclick="history.back()">Cancel</button>
|
|
225
225
|
</div>
|
|
226
|
-
</form>`}var
|
|
226
|
+
</form>`}var Xr=new Set(["<","<=",">",">=","!="]),Yr=new Set(["array-contains","array-contains-any"]);function Ot(e){return e==="desc"?"DESCENDING":"ASCENDING"}function eo(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function to(e,t,n,r,o){let s=[],a=new Set;for(let l of r)if(l.op==="=="||l.op==="in"||l.op==="not-in"){if(a.has(l.field))continue;a.add(l.field),s.push({fieldPath:l.field,order:"ASCENDING"});}for(let l of r)if(Yr.has(l.op)){if(a.has(l.field))continue;a.add(l.field),s.push({fieldPath:l.field,arrayConfig:"CONTAINS"});}for(let l of r)if(Xr.has(l.op)){if(a.has(l.field))continue;a.add(l.field);let u=o?.field===l.field?Ot(o.dir):"ASCENDING";s.push({fieldPath:l.field,order:u});}if(o&&!a.has(o.field)&&s.push({fieldPath:o.field,order:Ot(o.dir)}),s.length===1&&n)return oo(e,t,s[0]);let d=o&&s.some(l=>l.fieldPath===o.field)?Ot(o.dir):"ASCENDING";return s.push({fieldPath:"__name__",order:d}),no(e,t,n,s)}function no(e,t,n,r,o="(default)"){let s=`projects/${e}/databases/${o}/collectionGroups/${t}/indexes/_`,a=[...Et(1,s),...ft(2,n?2:1)];for(let u of r)a.push(...jn(3,Fn(u)));let d=o==="(default)"?"-default-":o,l=encodeURIComponent(Mn(a));return `https://console.firebase.google.com/project/${e}/firestore/databases/${d}/indexes?create_composite=${l}`}function ro(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function $t(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function Pt(e,t){return e<<3|t}function Et(e,t){let n=Array.from(new TextEncoder().encode(t));return [Pt(e,2),...$t(n.length),...n]}function ft(e,t){return [Pt(e,0),...$t(t)]}function jn(e,t){return [Pt(e,2),...$t(t.length),...t]}function Fn(e){let t=[...Et(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...ft(3,1)):t.push(...ft(2,e.order==="DESCENDING"?2:1)),t}function Mn(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 oo(e,t,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,s=[...Et(1,o),...ft(2,2),...jn(3,Fn(n))],a=r==="(default)"?"-default-":r,d=encodeURIComponent(Mn(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${a}/indexes/automatic?create_exemption=${d}`}function so(e){let t=e,n=[t?.firestore?.projectId,t?.firestore?.app?.options?.projectId,t?.firestore?._settings?.projectId,t?.firestore?.databaseId?.projectId,t?._firestore?.projectId];for(let o of n)if(typeof o=="string"&&o.length>0)return o;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function Te(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Ue(e,t){let n=e??{},r=Te(e),o;if(r&&(o=n.message?ro(n.message):void 0,!o)){let s=so(t.ref);if(s){let a=eo(t.path);o=to(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}}yt();var Hn=`// \u2500\u2500 Shared helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
227
227
|
function frsGetBasePath() {
|
|
228
228
|
var root = document.querySelector("[data-frs-panel-root]");
|
|
229
229
|
var bp = root && root.getAttribute("data-frs-base-path");
|
|
@@ -1132,7 +1132,7 @@ function initColumnReorder(table) {
|
|
|
1132
1132
|
});
|
|
1133
1133
|
});
|
|
1134
1134
|
}
|
|
1135
|
-
`;function Ue(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:zn}})}Nt();function he(e){return "<!DOCTYPE html>"+server.renderToString(e)}var go=["corporate","silk","dark"],ho=()=>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:go.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))})]}),be=({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(ho,{})})]}),jsxRuntime.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((a,d)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},d):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},d))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(It,{basePath:s}),jsxRuntime.jsx(Ue,{})]})]})};function _t(e,t){return he(jsxRuntime.jsx(be,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function jt(e,t){return he(jsxRuntime.jsx(be,{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 Ln=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],bo=[{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"}],xo=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function vo(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return bo;case "ZodBoolean":return Ln;case "ZodArray":return xo;default:return Ln}}var xe="__null__";function wo(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="${xe}"]');if(!o){o=document.createElement('option');o.value='${xe}';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='${xe}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${xe}"][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!=='${xe}')?i.dataset._prev:'';}}})(this)`}function Ro(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 Qe({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:wo(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function So({col:e,active:t}){let n=t?.value??"",r=n===xe,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,a=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(a){let d=new Set(n.split(",").map(u=>u.trim()).filter(Boolean)),l=`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:d.has(u),"data-enum-group":l,onchange:Ro(o,l)}),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(d=>jsxRuntime.jsx("option",{value:d,selected:n===d,children:d},d)),e.nullable&&jsxRuntime.jsx("option",{value:xe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Qe,{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:xe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Qe,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let d=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:d?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(Qe,{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(Qe,{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(Qe,{inputId:o,active:r})]})}function Ft({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(l=>[l.field,l])),s=n.length>0,a=n.length>=2||r&&s,d=t.filter(l=>l.zodType!=="ZodObject"&&l.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:d.map(l=>{let u=vo(l.zodType),p=o[l.name],f=p?.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:l.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[u.length>1?jsxRuntime.jsx("select",{name:`fo_${l.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:u.map(y=>jsxRuntime.jsx("option",{value:y.value,selected:y.value===f,children:y.label},y.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${l.name}`,value:u[0].value}),jsxRuntime.jsx(So,{col:l,active:p})]})]},l.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 Mt(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,d=n==="create"?[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:"New document"}]:[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:`Edit ${r??""}`}];return he(jsxRuntime.jsx(be,{opts:{title:a,breadcrumb:d,basePath:o,flash:s},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}ft();Dt();function zt(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 Kn(e,t,n,r,o){let s=zt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function To(e,t,n,r){let o=zt(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 ko(e,t,n){return `?${zt(t,n,e).toString()}`}function Ht(e,t,n,r,o,s,a=[],d=[],l=false,u=[],p,f,y,b,x,v,R,m=false){let i=`${r}/${e}`,g=`${i}/create`,c={};if(R)for(let k of n)c[k]=Ie(Ne(R,k));let h=(v??[]).filter(k=>{let O=c[k]??Ie(Ne(R,k));return O==="string"||O==="number"||O==="bigint"||O==="boolean"||O==="enum"||O==="literal"}),w=h.length>0,T=l,S=T||w,C=h.map(k=>{let O=Ne(R,k),A=Ie(O),E=a.find($=>$.name===k);return {name:k,type:A,enumValues:E?.enumValues??null,nullable:E?.nullable??false}});return he(jsxRuntime.jsxs(be,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Ft,{action:i,columnMeta:a,activeFilters:d,isGroup:b}),y&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${y.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:y.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:y.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:y.message})]}),y.indexUrl&&jsxRuntime.jsx("a",{href:y.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxRuntime.jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxRuntime.jsxs("div",{class:"flex items-center gap-3",children:[jsxRuntime.jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof x=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:x})]})," ","document",(typeof x=="number"?x:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(k=>jsxRuntime.jsx("a",{href:ko(k,d,p),class:`join-item btn btn-xs ${f===k?"btn-active btn-primary":"btn-outline"}`,children:k},k))})]})]}),jsxRuntime.jsx("a",{href:g,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 x=="number"?String(x):"","data-frs-page-size":String(f??t.length),"data-frs-allow-delete":T?"1":"0","data-frs-allow-update":w?"1":"0","data-frs-fields":JSON.stringify(C),"data-frs-filters":JSON.stringify(d),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof x=="number"&&x>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link link-primary text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",x," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",x??"?"," matching documents are selected."," ",jsxRuntime.jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxRuntime.jsxs("div",{class:"flex gap-2",children:[w&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),T&&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((k,O)=>{let A=p?.field===k,E=A?p.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:To(k,p,d,f),class:`hover:text-base-content inline-flex items-center gap-0.5${A?" text-primary font-bold":""}`,children:[k,E]})},O)}),u.map((k,O)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:k.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((k,O)=>{let A=String(k.docId??k.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((I,j)=>{let D=k[I],P=c[I],Z=P?Ve(P,D):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(De,{val:D,mismatch:Z})},j)}),u.map((I,j)=>{let D=k[I.key];if(D==null||D==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${j}`);let P=I.type==="one"?`${r}/${I.targetRepo}/${encodeURIComponent(String(D))}/edit`:`${r}/${I.targetRepo}?fv_${I.targetKey}=${encodeURIComponent(String(D))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:P,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":I.type,"data-frs-rel-repo":I.targetRepo,"data-frs-rel-fk":I.targetKey,"data-frs-rel-val":String(D),"data-frs-rel-label":I.column,children:I.column})},`rel-${j}`)}),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"}),m&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(A)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),l&&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:Kn(d,o.prevCursor,"prev",p,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:Kn(d,o.nextCursor,"next",p,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 x=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[x," total document",x!==1?"s":"",d.length>0?" matching filters":""]})]}),S&&w&&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"}),h.map(k=>jsxRuntime.jsx("option",{value:k,children:k},k))]})]}),jsxRuntime.jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxRuntime.jsxs("div",{class:"modal-action",children:[jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsxRuntime.jsx("form",{method:"dialog",class:"modal-backdrop",children:jsxRuntime.jsx("button",{children:"close"})})]})]}))}function Ge(e,t){return _t(e,t)}function Bt(e,t){return jt(e,t)}function Zt(e,t,n,r,o,s,a,d,l,u,p,f,y,b,x,v,R,m){return Ht(e,t,n,r,o,s,a,d,l,u,p,f,y,b,x,v,R,m)}function ve(e,t,n,r,o,s){return Mt(e,t,n,r,o,s)}var qn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Oo(){let e="";for(let t=0;t<20;t++)e+=qn.charAt(Math.floor(Math.random()*qn.length));return e}function mt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),o=[];for(let s=1;s<r.length;s+=2)o.push(r[s]);return o.length>0?o:void 0}async function _e(e,t){let n=e.documentKey??"docId",r=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[r]=="function")try{let s=await e.repo.get[r](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Lt(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 M(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Kt(e,t){e.status(302).set("Location",t).send("");}function qt(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=Vt(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let u={},p=false;for(let[b,x]of Object.entries(e))b.startsWith(`${o}.`)&&(u[b.slice(o.length+1)]=x,p=true);if(p){let b=s;for(;;){let x=L(b);if(x==="ZodOptional"||x==="ZodNullable"||x==="ZodDefault")b=G(b);else break}r[o]=qt(u,b);continue}let f=e[o],y=Array.isArray(f)?f[f.length-1]:f;if(y)try{r[o]=JSON.parse(y);}catch{r[o]=y;}continue}let d=e[o],l=Array.isArray(d)?d[d.length-1]:d;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(l===void 0||l===""){a==="ZodBoolean"&&(r[o]=false);continue}switch(a){case "ZodBoolean":l==="__null__"?r[o]=null:r[o]=l==="true"||l==="on"||l==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(l);break;case "ZodDate":r[o]=new Date(l);break;case "ZodArray":try{r[o]=JSON.parse(l);}catch{r[o]=l;}break;default:if(l.startsWith("{")||l.startsWith("["))try{r[o]=JSON.parse(l);break}catch{}r[o]=l;}}return r}function Un(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let r=new Date(e);isNaN(r.getTime())||(t=r);}if(!t||isNaN(t.getTime()))return null;let n=r=>String(r).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function Vt(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function $o(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function Qn(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 Gn(e){let t=$o(e),n=L(t);if(n==="ZodEnum"){let r=He(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Be(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=ct(t);return typeof r=="string"?[r]:void 0}}function Wn(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,a=e[o];if(a===null){r[s]="__null__";continue}if(a===void 0)continue;let d=t.shape[o];for(;;){let u=L(d);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")d=G(d);else break}let l=L(d);if(l==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let u=Wn(a,d,s);Object.assign(r,u);}else if(l==="ZodDate"){let u=Un(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=Un(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 Ut(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Ut(n.nested,t):void 0}))}function Eo(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[o,s]of Object.entries(e)){if(!o.startsWith("fv_"))continue;let a=o.slice(3);if(!t.has(a))continue;let d=(s??"").trim();if(!d)continue;let l=e[`fo_${a}`]??"==",u=n.has(l)?l:"==";r.push({field:a,op:u,value:d});}return r}function Vn(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 Jn(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,a=t.shape[o];if(!a){r.push({name:s,zodType:"ZodString"});continue}let d=Vt(a);if(d==="ZodObject"){let l=a;for(;;){let p=L(l);if(p==="ZodOptional"||p==="ZodNullable"||p==="ZodDefault")l=G(l);else break}let u=te(l);r.push(...Jn(Object.keys(u),l,s));}else r.push({name:s,zodType:d,nullable:Qn(a),enumValues:Gn(a)});}return r}function Po(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=te(r);if(!(o in s))return null;r=s[o];}return r}function Ae(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let a=s.indexOf(".");if(a===-1)n.push(s);else {let d=s.slice(0,a),l=s.slice(a+1);r.has(d)||r.set(d,[]),r.get(d).push(l);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,a]of r){if(!(s in e.shape))continue;let d=e.shape[s];for(;;){let l=L(d);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")d=G(d);else break}if(L(d)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Ae(d,a);}return zod.z.object(o)}function pe(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",a=process.env.FUNCTION_REGION??"us-central1",d=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${a}/${d}${n}`}let r=process.env.K_SERVICE,o=e.hostname??e.headers?.host??"";return r&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function Xn(e,t){let n=(m,i)=>{let g=pe(m,t),c=Object.values(e).map(h=>({name:h.name,path:h.path}));M(i,Bt(c,g));},r=async(m,i)=>{let g=m.params.repoName;if(!g){M(i,"Bad request",400);return}let c=e[g];if(!c){M(i,"Repository not found",404);return}let h=c.pageSize??25,w=m.query??{},T=w.cursor,S=w.dir==="prev"?"prev":"next",C=w.ob??"",k=w.od==="desc"?"desc":"asc",O=C?{field:C,dir:k}:void 0,A=parseInt(w.ps??""),E=Number.isFinite(A)&&A>0?Math.min(A,200):h,$=c.listColumns??Object.keys(c.schema.shape),I=c.documentKey??"docId",j=[I,...$.filter(J=>J!==I)],D=c.filterableFields?(()=>{let J=[];for(let de of c.filterableFields)(de.includes(".")||$.includes(de))&&J.push(de);return J})():$,P=(()=>{let J=[];for(let de of D)if(de.includes(".")){let $e=Po(c.schema,de);J.push({name:de,zodType:$e?Vt($e):"ZodString",nullable:$e?Qn($e):false,enumValues:$e?Gn($e):void 0});}else J.push(...Jn([de],c.schema));return J})(),Z=new Set(P.map(J=>J.name)),fe=Eo(w,Z),se=Vn(fe),V;if(T)try{let J=c.repo.ref;typeof J.doc=="function"&&(V=await J.doc(T).get());}catch{}let[q,Xe]=await Promise.all([c.repo.query.paginate({pageSize:E,cursor:V,direction:S,...se.length>0?{where:se}:{},...O?{orderBy:[{field:O.field,direction:O.dir}]}:{}}).catch(J=>({queryError:qe(J,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:fe,sort:O})})),c.repo.aggregate.count(se.length>0?{where:se}:{}).catch(()=>{})]),Oe="queryError"in q,dr=Oe?[]:q.data,ur=Oe?"":q.nextCursor?.id??"",pr=Oe?"":q.prevCursor?.id??"",fr=Oe?q.queryError:void 0,yr=pe(m,t);M(i,Zt(c.name,dr,j,yr,{hasPrev:Oe?false:q.hasPrevPage,hasNext:Oe?false:q.hasNextPage,prevCursor:pr,nextCursor:ur},void 0,P,fe,c.allowDelete??false,c.relationalMeta,O,E,fr,c.isGroup,Xe,c.mutableFields,c.schema,c.historyEnabled));},o=(m,i)=>{let g=m.params.repoName;if(!g){M(i,"Bad request",400);return}let c=e[g];if(!c){M(i,"Repository not found",404);return}let h=pe(m,t),w=Ae(c.schema,c.createFields),T=le(w),S=`${h}/${c.name}/create`,C=ge(T,S,"POST","Create document");M(i,ve(c.name,C,"create",null,h));},s=async(m,i)=>{let g=m.params.repoName;if(!g){M(i,"Bad request",400);return}let c=e[g];if(!c){M(i,"Repository not found",404);return}let h=pe(m,t),w=m.body??{},T=qt(w,c.schema),S=Ae(c.schema,c.createFields),C=S.safeParse(T);if(!C.success){let k=le(S),O=`${h}/${c.name}/create`,A=ge(k,O,"POST","Create document"),E=C.error.issues.map($=>`${$.path.join(".")}: ${$.message}`).join(", ");M(i,ve(c.name,A,"create",null,h,{type:"error",message:`Validation error: ${E}`}),422);return}try{if(c.isGroup&&c.parentKeys&&c.parentKeys.length>0){let k={...C.data};c.createdKey&&(k[c.createdKey]=new Date);let O=c.parentKeys.filter(I=>!k[I]);if(O.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${O.join(", ")}`);let A=c.parentKeys.map(I=>k[I]),E=c.documentKey??"docId",$=k[E]||Oo();await c.repo.set(...A,$,k);}else await c.repo.create(C.data);Kt(i,`${h}/${c.name}?flash=created`);}catch(k){let O=Ae(c.schema,c.createFields),A=le(O),E=`${h}/${c.name}/create`,$=ge(A,E,"POST","Create document");M(i,ve(c.name,$,"create",null,h,{type:"error",message:`Save error: ${k.message}`}),500);}},a=async(m,i)=>{let g=m.params.repoName,c=m.params.id;if(!g||!c){M(i,"Bad request",400);return}let h=e[g];if(!h){M(i,"Repository not found",404);return}let w=pe(m,t),T=null;try{T=await _e(h,c);}catch(E){let $=Lt(h,c,E),I=ke(E)?424:500;M(i,Ge("",{title:`Edit ${h.name} / ${c}`,basePath:w,breadcrumb:[{label:"Repositories",href:w},{label:h.name,href:`${w}/${h.name}`},{label:`Edit ${c}`}],flash:$}),I);return}if(!T){M(i,"Document not found",404);return}let S=Wn(T,h.schema),C=Ae(h.schema,h.mutableFields),k=Ut(le(C),S),O=`${w}/${h.name}/${encodeURIComponent(c)}/edit`,A=ge(k,O,"POST","Save changes");M(i,ve(h.name,A,"edit",c,w));},d=async(m,i)=>{let g=m.params.repoName,c=m.params.id;if(!g||!c){M(i,"Bad request",400);return}let h=e[g];if(!h){M(i,"Repository not found",404);return}let w=pe(m,t),T=m.body??{},S=qt(T,h.schema),C=Ae(h.schema,h.mutableFields),O=C.partial().safeParse(S);if(!O.success){let A=Object.fromEntries(Object.entries(T).map(([D,P])=>[D,Array.isArray(P)?P.join(","):P??""])),E=Ut(le(C),A),$=`${w}/${h.name}/${encodeURIComponent(c)}/edit`,I=ge(E,$,"POST","Save changes"),j=O.error.issues.map(D=>`${D.path.join(".")}: ${D.message}`).join(", ");M(i,ve(h.name,I,"edit",c,w,{type:"error",message:`Validation error: ${j}`}),422);return}try{let A=await _e(h,c),E=(A&&mt(A,h.pathKey))??[c];await h.repo.update(...E,O.data),Kt(i,`${w}/${h.name}?flash=updated`);}catch(A){let E=Ae(h.schema,h.mutableFields),$=le(E),I=`${w}/${h.name}/${encodeURIComponent(c)}/edit`,j=ge($,I,"POST","Save changes"),D=ke(A)?Lt(h,c,A):{type:"error",message:`Save error: ${A.message}`},P=ke(A)?424:500;M(i,ve(h.name,j,"edit",c,w,D),P);}},l=async(m,i)=>{let g=m.params.repoName,c=m.params.id;if(!g||!c){M(i,"Bad request",400);return}let h=e[g];if(!h){M(i,"Repository not found",404);return}if(!h.allowDelete){M(i,"Delete is not allowed for this repository",403);return}let w=pe(m,t);try{let T=await _e(h,c),S=(T&&mt(T,h.pathKey))??[c];await h.repo.delete(...S),Kt(i,`${w}/${h.name}?flash=deleted`);}catch(T){let S=ke(T)?Lt(h,c,T):{type:"error",message:`Delete error: ${T.message}`},C=ke(T)?424:500;M(i,Ge("",{title:`Delete ${h.name} / ${c}`,basePath:w,breadcrumb:[{label:"Repositories",href:w},{label:h.name,href:`${w}/${h.name}`},{label:`Delete ${c}`}],flash:S}),C);}},u=async(m,i)=>{let g=m.params.repoName;if(!g){M(i,"Bad request",400);return}let c=e[g];if(!c){M(i,"Repository not found",404);return}let h=pe(m,t),w=m.query,T=w?.type==="many"?"many":"one",S=Math.max(1,Math.min(100,Number(w?.ps??25)||25)),C=c.listColumns??Object.keys(te(c.schema)),{PanelOne:k,PanelMany:O}=await Promise.resolve().then(()=>(Nt(),Bn)),{renderToString:A}=await import('hono/jsx/dom/server');if(T==="one"){let P=String(w?.id??"");if(!P){M(i,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let Z=await _e(c,P),fe=A(k({doc:Z,repoName:c.name,basePath:h,schema:c.schema,columns:C}));M(i,fe);}catch(Z){M(i,`<div class='p-6 text-error text-sm'>Error: ${Z.message}</div>`,500);}return}let E=String(w?.fk??""),$=String(w?.fv??"");if(!E||!$){M(i,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let I=w?.cursor??"",j=w?.dir==="prev"?"prev":"next",D;if(I)try{let P=c.repo.ref;typeof P.doc=="function"&&(D=await P.doc(I).get());}catch{}try{let P=await c.repo.query.paginate({pageSize:S,cursor:D,direction:j,where:[[E,"==",Do($)]]}),Z=A(O({docs:P.data,repoName:c.name,basePath:h,fk:E,fv:$,columns:C,schema:c.schema,pagination:{hasPrev:P.hasPrevPage,hasNext:P.hasNextPage,prevCursor:P.prevCursor?.id??"",nextCursor:P.nextCursor?.id??"",pageSize:S}}));M(i,Z);}catch(P){M(i,`<div class='p-6 text-error text-sm'>Error: ${P.message}</div>`,500);}},p=async(m,i)=>{let g=[];for(let c of i){let h;if(m.isGroup||m.parentKeys?.length){let w=await _e(m,c);h=w?mt(w,m.pathKey):void 0;}h||(h=[c]);try{let w=m.repo.documentRef(...h);w&&g.push(w);}catch{}}return g},f=async(m,i)=>{let g=Vn(i),c=m.documentKey??"docId",h=[],w;for(;;){let T=await m.repo.query.paginate({pageSize:500,cursor:w,direction:"next",...g.length>0?{where:g}:{}});for(let S of T.data){let C=String(S[c]??S.id??"");C&&h.push(C);}if(!T.hasNextPage||!T.nextCursor)break;w=T.nextCursor;}return h},y=async(m,i)=>{let g=m.params.repoName;if(!g){ee(i,{error:"Bad request"},400);return}let c=e[g];if(!c){ee(i,{error:"Repository not found"},404);return}if(!c.allowDelete){ee(i,{error:"Delete is not allowed for this repository"},403);return}let h=m.body??{};try{let w=await x(c,h);if(w.length===0){ee(i,{deleted:0});return}let T=await p(c,w);for(let S=0;S<T.length;S+=500)await c.repo.bulk.delete(T.slice(S,S+500));ee(i,{deleted:T.length});}catch(w){ee(i,{error:w.message},500);}},b=async(m,i)=>{let g=m.params.repoName;if(!g){ee(i,{error:"Bad request"},400);return}let c=e[g];if(!c){ee(i,{error:"Repository not found"},404);return}let h=m.body??{},w=String(h.field??"");if(!w){ee(i,{error:"Missing 'field'"},400);return}if(!c.mutableFields||!c.mutableFields.includes(w)){ee(i,{error:`Field '${w}' is not bulk-updatable`},403);return}let T=c.schema.shape?.[w],S=h.value;if(T){let C=T.safeParse(h.value);if(!C.success){ee(i,{error:`Invalid value for '${w}': ${C.error.message}`},400);return}S=C.data;}try{let C=await x(c,h);if(C.length===0){ee(i,{updated:0});return}let O=(await p(c,C)).map(A=>({docRef:A,data:{[w]:S}}));for(let A=0;A<O.length;A+=500)await c.repo.bulk.update(O.slice(A,A+500));ee(i,{updated:O.length});}catch(C){ee(i,{error:C.message},500);}};async function x(m,i){if(i.selectAll){let g=v(i.filters,m);return await f(m,g)}return Array.isArray(i.ids)?i.ids.filter(g=>typeof g=="string"&&!!g):[]}function v(m,i){if(!Array.isArray(m))return [];let g=new Set((i.filterableFields??Object.keys(te(i.schema))).map(w=>String(w))),c=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),h=[];for(let w of m)w&&typeof w=="object"&&typeof w.field=="string"&&g.has(w.field)&&typeof w.value=="string"&&c.has(String(w.op))&&h.push({field:w.field,op:w.op,value:w.value});return h}return {handleDashboard:n,handleList:r,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:a,handleEditSubmit:d,handleDelete:l,handlePanel:u,handleBulkDelete:y,handleBulkUpdate:b,handleHistory:async(m,i)=>{let g=m.params.repoName,c=m.params.id;if(!g||!c){M(i,"Bad request",400);return}let h=e[g];if(!h){M(i,"Repository not found",404);return}if(!h.historyEnabled||!h.repo.history){M(i,"History not enabled for this repository",404);return}let w=pe(m,t),T=h.historySubcollection??"history",S=[c];try{let P=await _e(h,c),Z=P?mt(P,h.pathKey):void 0;Z&&Z.length>0&&(S=Z);}catch{}let C=parseInt(String(m.query?.limit??"")),k=Number.isFinite(C)&&C>0?Math.min(C,500):100,O=[],A;try{O=await h.repo.history.list(...S,{limit:k});}catch(P){A=P.message;}let E=P=>String(P??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),$=P=>{if(P===void 0)return '<span class="opacity-40">undefined</span>';if(P===null)return '<span class="opacity-40">null</span>';if(typeof P=="object")try{return `<code class="text-xs">${E(JSON.stringify(P))}</code>`}catch{return E(String(P))}return E(String(P))},I=P=>P?typeof P.toDate=="function"?P.toDate().toISOString():P instanceof Date?P.toISOString():E(String(P)):"",j=P=>`<span class="badge badge-sm ${P==="create"?"badge-success":P==="delete"?"badge-error":"badge-info"}">${E(P)}</span>`,D="";if(D+='<div class="flex items-center justify-between mb-4">',D+=`<a href="${w}/${h.name}/${encodeURIComponent(c)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,D+=`<a href="${w}/${h.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,D+="</div>",D+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${E(T)}</code> \xB7 Showing up to ${k} entries.</p>`,A)D+=`<div class="alert alert-error mb-4">${E(A)}</div>`;else if(O.length===0)D+='<div class="alert">No history entries found.</div>';else {D+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',D+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let P of O){let Z=P.meta??{},fe=[Z.reason,Z.comment].filter(q=>q!=null&&q!=="").map(q=>E(String(q))).join(" \u2014 "),se="",V=Object.keys(P.changes??{});V.length===0?se='<span class="opacity-40">\u2014</span>':se='<ul class="space-y-1">'+V.map(q=>{let Xe=P.changes[q];return `<li><strong>${E(q)}</strong>: ${$(Xe.oldValue)} \u2192 ${$(Xe.newValue)}</li>`}).join("")+"</ul>",D+="<tr>",D+=`<td class="whitespace-nowrap text-xs font-mono">${E(I(P.historySetAt))}</td>`,D+=`<td>${j(P.operation??"update")}</td>`,D+=`<td class="text-xs">${E(Z.userEmail??Z.userId??"")}</td>`,D+=`<td class="text-xs">${fe}</td>`,D+=`<td>${se}</td>`,D+="</tr>";}D+="</tbody></table></div>";}M(i,Ge(D,{title:`History \u2014 ${h.name} / ${c}`,basePath:w,breadcrumb:[{label:"Repositories",href:w},{label:h.name,href:`${w}/${h.name}`},{label:`History ${c}`}]}));}}}function ee(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Do(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}async function Io(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function No(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 Yn(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:o,middleware:s=[],httpsOptions:a}=e,d=t==="/"?"":t.replace(/\/$/,""),l={};for(let[y,b]of Object.entries(n)){let x=b.schema??b.repo.schema??null;if(!x)throw new Error(`[createAdminServer] Repository "${y}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let v,R,m;if(b.fieldsConfig){let c=b.fieldsConfig;v=[],R=[],m=[];for(let[h,w]of Object.entries(c))for(let T of w)T==="filterable"?v.push(h):T==="mutable"?R.push(h):T==="create"&&m.push(h);v.length===0&&(v=void 0),R.length===0&&(R=void 0),m.length===0&&(m=void 0);}let i=(()=>{let c=b.repo._parentKeys;return c&&c.length>0?c:void 0})();if(i&&m)for(let c of i)m.includes(c)||m.push(c);let g={name:y,path:b.path,repo:b.repo,schema:x,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:i,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:v,mutableFields:R,createFields:m,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 c=b.repo.relationalKeys??{},h=[];for(let w of b.relationalFields){let T=c[w.key];T&&h.push({key:w.key,column:w.column,targetRepo:String(T.repo),targetKey:String(T.key),type:T.type});}return h.length>0?h:void 0})()};l[y]=g;}let u=Xn(l,d),p=new ne;if(r&&p.use(async(y,b,x)=>{let v=y,R=String(v.headers?.["content-type"]??"");if(R.includes("application/x-www-form-urlencoded")){let m=await Io(v);y.body=No(m);}else if(R.includes("application/json")&&typeof v.body=="string")try{y.body=JSON.parse(v.body);}catch{}await x();}),o)if(Ee(o)){for(let y of o.routes){let b=`${d}${y.path}`;y.method==="GET"?p.get(b,y.handler):p.post(b,y.handler);}p.use(o.middleware);}else if(typeof o=="function")p.use(o);else {let y=o.realm??"Admin",b="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");p.use((x,v,R)=>{if((x.headers?.authorization??"")!==b){v.status(401).set("WWW-Authenticate",`Basic realm="${y}"`).set("Content-Type","text/plain").send("Unauthorized");return}R();});}for(let y of s)p.use(y);p.get(`${d}/`,u.handleDashboard),p.get(`${d}`,u.handleDashboard),p.get(`${d}/:repoName/_panel`,u.handlePanel),p.post(`${d}/:repoName/_bulk/delete`,u.handleBulkDelete),p.post(`${d}/:repoName/_bulk/update`,u.handleBulkUpdate),p.get(`${d}/:repoName`,u.handleList),p.get(`${d}/:repoName/create`,u.handleCreateForm),p.post(`${d}/:repoName/create`,u.handleCreateSubmit),p.get(`${d}/:repoName/:id/edit`,u.handleEditForm),p.post(`${d}/:repoName/:id/edit`,u.handleEditSubmit),p.get(`${d}/:repoName/:id/history`,u.handleHistory),p.post(`${d}/:repoName/:id/delete`,u.handleDelete);let f=async(y,b)=>{await p.handle(y,b);};return a&&(f.httpsOptions=a),f}function Gt(e,t,n=200){let r=U(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function je(e,t,n,r=200){Gt(e,{success:true,data:t,meta:n},r);}function K(e,t,n=400){Gt(e,{success:false,error:t},n);}function Qt(e,t,n,r,o){let s=qe(t,n),a=s.type==="index",d=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)),Gt(e,u,d);}var er="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function _o(){let e="";for(let t=0;t<20;t++)e+=er.charAt(Math.floor(Math.random()*er.length));return e}function Fe(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=>wt(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=Fe(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(Fe(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Fe(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Fe(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=Fe(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function jo(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let a of s){if(n.includes(a))continue;let d=a.split(".")[0];d&&r[d]&&(o[d]=r[d]);}return zod.z.object(o)}function tr(e,t,n,r=false,o=[]){try{let s=jo(e,n,o),a=r?s.partial():s;return {success:!0,data:(vt()==="normalize"?Fe(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(d=>`${d.path.join(".")}: ${d.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function Fo(e,t){let n=[],r=t?new Set(t):null,o={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[s,a]of Object.entries(e)){if(a===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let d=Array.isArray(a)?a[0]:a;if(d===void 0||d==="")continue;let l=s.match(/^(\w+)__(\w+)$/),u,p="==";if(l&&l[1]&&l[2]){u=l[1];let y=l[2];if(o[y])p=o[y];else continue}else if(!l)u=s;else continue;if(r&&!r.has(u))continue;let f=d;p==="in"||p==="not-in"||p==="array-contains-any"?f=d.split(",").map(y=>nr(y.trim())):f=nr(d),n.push({field:u,op:p,value:f});}return n}function nr(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 gt(e){return e?{docId:e.id}:null}async function rr(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 or(e,t,n,r=false){async function o(m,i,g,c){if(!r)return true;let h=i.rules?.[g];if(!h)return K(m,`Operation "${g}" is not allowed for this repository`,403),false;try{return await h(c)?!0:(K(m,"Forbidden",403),!1)}catch(w){let T=n&&w instanceof Error?w.message:"Forbidden";return K(m,T,403),false}}async function s(m,i,g,c){if(!r)return c;let h=m.rules?.filter;if(!h)return c;let w=[];for(let T of c)try{await h({user:i,doc:T,params:g})&&w.push(T);}catch{}return w}function a(m){return m?.user??null}function d(m,i){return !m||!e[m]?(K(i,`Repository "${m}" not found`,404),null):e[m]}function l(m,i){if(!i)return;let g=m[i];if(typeof g!="string"||!g)return;let c=g.split("/").filter(Boolean),h=[];for(let w=1;w<c.length;w+=2)h.push(c[w]);return h.length>0?h:void 0}async function u(m,i){let g=`by${m.documentKey.charAt(0).toUpperCase()}${m.documentKey.slice(1)}`,c=m.repo.get[g];if(typeof c=="function")try{let w=await c(i);if(w)return w}catch{}return (await m.repo.query.by({where:[[m.documentKey,"==",i]],limit:1}))[0]??null}async function p(m,i){let g=m.params||{},c=d(g.repoName,i);if(!c)return;let h=a(m);if(!await o(i,c,"list",{user:h,query:m.query??{},params:g}))return;let w=[],T;try{let S=m.query??{},C=Math.min(Number(S.pageSize)||c.pageSize,100),k=S.cursor,O=S.direction?.toLowerCase()==="prev"?"prev":"next",A=S.orderBy,E=S.orderDir?.toLowerCase()==="desc"?"desc":"asc",$=S.select,I=$?$.split(",").map(V=>V.trim()):void 0,j;c.allowedIncludes&&S.includes&&(j=(typeof S.includes=="string"?S.includes.split(",").map(q=>q.trim()):Array.isArray(S.includes)?S.includes:[]).filter(q=>typeof q=="string"&&c.allowedIncludes.includes(q)),j?.length===0&&(j=void 0));let D=Fo(S,c.filterableFields);w=D.map(V=>({field:V.field,op:V.op,value:String(V.value??"")})),A&&(T={field:A,dir:E});let P={pageSize:C,direction:O};if(k)try{let V=typeof k=="string"?JSON.parse(k):k;P.cursor=await rr(c,V);}catch{}A&&(P.orderBy=[{field:A,direction:E}]),D.length>0&&(P.where=D.map(V=>[V.field,V.op,V.value])),I&&(P.select=I),j&&(P.include=j);let Z=await c.repo.query.paginate(P),se={items:await s(c,a(m),g,Z.data),hasNextPage:Z.hasNextPage,hasPrevPage:Z.hasPrevPage,nextCursor:gt(Z.nextCursor),prevCursor:gt(Z.prevCursor)};je(i,se,{pageSize:C,hasMore:Z.hasNextPage});}catch(S){Qt(i,S,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:w,sort:T},"Failed to fetch documents",n);}}async function f(m,i){let g=m.params||{},c=d(g.repoName,i);if(!c)return;let h=a(m);if(!await o(i,c,"list",{user:h,query:m.body??{},params:g}))return;let w=[],T;try{let S=m.body??{},C=Math.min(S.pageSize||c.pageSize,100),k=S.direction==="prev"?"prev":"next";S.where&&(w=S.where.map(I=>({field:String(I[0]),op:I[1],value:String(I[2]??"")}))),S.orderBy&&S.orderBy[0]&&(T={field:S.orderBy[0].field,dir:S.orderBy[0].direction==="desc"?"desc":"asc"});let O={pageSize:C,direction:k};if(S.cursor)try{let I=typeof S.cursor=="string"?JSON.parse(S.cursor):S.cursor;O.cursor=await rr(c,I);}catch{}if(c.allowedIncludes&&S.includes&&S.includes.length>0){let I=S.includes.filter(j=>typeof j=="string"?c.allowedIncludes.includes(j):typeof j=="object"&&j!==null&&"relation"in j&&typeof j.relation=="string"?c.allowedIncludes.includes(j.relation):!1);I.length>0&&(O.include=I);}if(S.where&&S.where.length>0){if(c.filterableFields){let I=new Set(c.filterableFields),j=S.where.filter(D=>!I.has(D[0]));if(j.length>0){K(i,`Fields not filterable: ${j.map(D=>D[0]).join(", ")}`,400);return}}O.where=S.where;}if(S.orWhere&&S.orWhere.length>0){if(c.filterableFields){let I=new Set(c.filterableFields),j=S.orWhere.filter(D=>!I.has(D[0]));if(j.length>0){K(i,`Fields not filterable: ${j.map(D=>D[0]).join(", ")}`,400);return}}O.orWhere=S.orWhere;}if(S.orWhereGroups&&S.orWhereGroups.length>0){if(c.filterableFields){let I=new Set(c.filterableFields);for(let j of S.orWhereGroups){let D=j.filter(P=>!I.has(P[0]));if(D.length>0){K(i,`Fields not filterable: ${D.map(P=>P[0]).join(", ")}`,400);return}}}O.orWhereGroups=S.orWhereGroups;}S.orderBy&&S.orderBy.length>0&&(O.orderBy=S.orderBy),S.select&&S.select.length>0&&(O.select=S.select);let A=await c.repo.query.paginate(O),$={items:await s(c,a(m),g,A.data),hasNextPage:A.hasNextPage,hasPrevPage:A.hasPrevPage,nextCursor:gt(A.nextCursor),prevCursor:gt(A.prevCursor)};je(i,$,{pageSize:C,hasMore:A.hasNextPage});}catch(S){Qt(i,S,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:w,sort:T},"Failed to query documents",n);}}async function y(m,i){let g=m.params||{},c=d(g.repoName,i);if(!c)return;let h=g.id;if(!h){K(i,"Document ID required",400);return}try{let w=await u(c,h);if(!w){K(i,"Document not found",404);return}let T=a(m);if(!await o(i,c,"get",{user:T,doc:w,params:g}))return;if(r&&c.rules?.filter)try{if(!await c.rules.filter({user:T,doc:w,params:g})){K(i,"Document not found",404);return}}catch{K(i,"Document not found",404);return}je(i,w);}catch(w){Qt(i,w,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:[{field:c.documentKey,op:"==",value:h}]},"Failed to fetch document",n);}}async function b(m,i){let g=m.params||{},c=d(g.repoName,i);if(c)try{let h=m.body??{},w=a(m);if(!await o(i,c,"create",{user:w,body:h,params:g}))return;let T=tr(c.schema,h,c.createFields,!1,c.systemKeys);if(!T.success){K(i,T.error,400);return}if(c.validate){let C=await c.validate(T.data,"create");if(C){K(i,C,400);return}}let S;if(c.isGroup&&c.parentKeys&&c.parentKeys.length>0){let C={...T.data};c.createdKey&&(C[c.createdKey]=new Date);let k=c.parentKeys.filter(E=>!C[E]);if(k.length>0){K(i,`Missing parent key(s) for subcollection create: ${k.join(", ")}`,400);return}let O=c.parentKeys.map(E=>C[E]),A=C[c.documentKey]||_o();S=await c.repo.set(...O,A,C);}else S=await c.repo.create(T.data);je(i,S,void 0,201);}catch(h){let w=n&&h instanceof Error?h.message:"Failed to create document";K(i,w,500);}}async function x(m,i,g){let c=m.params||{},h=d(c.repoName,i);if(!h)return;let w=c.id;if(!w){K(i,"Document ID required",400);return}try{let T=m.body??{},S=await u(h,w);if(!S){K(i,"Document not found",404);return}let C=a(m);if(!await o(i,h,"update",{user:C,doc:S,body:T,params:c}))return;let k=tr(h.schema,T,h.mutableFields,g,h.systemKeys);if(!k.success){K(i,k.error,400);return}if(h.validate){let E=await h.validate(k.data,"update");if(E){K(i,E,400);return}}let O=l(S,h.pathKey)??[w],A=await h.repo.update(...O,k.data);je(i,A);}catch(T){let S=n&&T instanceof Error?T.message:"Failed to update document";K(i,S,500);}}async function v(m,i){let g=m.params||{},c=d(g.repoName,i);if(!c)return;if(!c.allowDelete){K(i,"Delete not allowed for this repository",403);return}let h=g.id;if(!h){K(i,"Document ID required",400);return}try{let w=await u(c,h);if(!w){K(i,"Document not found",404);return}let T=a(m);if(!await o(i,c,"delete",{user:T,doc:w,params:g}))return;let S=l(w,c.pathKey)??[h];await c.repo.delete(...S),je(i,{deleted:!0});}catch(w){let T=n&&w instanceof Error?w.message:"Failed to delete document";K(i,T,500);}}function R(m,i){i.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:p,handleQuery:f,handleGet:y,handleCreate:b,handleUpdate:x,handleDelete:v,handleOptions:R}}function Wt(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 oe(e){return {$ref:`#/components/schemas/${e}`}}function Y(e){return {description:e,content:{"application/json":{schema:oe("ErrorResponse")}}}}function Je(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function sr(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 Mo(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 zo(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 Ho(){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 Bo(e,t,n,r,o){let s={},a=e.name,d=`${t}/${e.name}`,l=`${d}/{${e.documentKey}}`,u={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[d]={get:{operationId:`list${we(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...Mo(e),...zo(e)],responses:{200:sr(oe(n)),500:Y("Internal server error")}},post:{operationId:`create${we(e.name)}`,summary:`Create a ${ce(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:oe(r??n)}}},responses:{201:Je("Document created",oe(n)),400:Y("Validation error"),500:Y("Internal server error")}}},s[`${d}/query`]={post:{operationId:`query${we(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:oe("QueryRequestBody")}}},responses:{200:sr(oe(n)),400:Y("Invalid query"),500:Y("Internal server error")}}};let p={};return p.get={operationId:`get${we(ce(e.name))}`,summary:`Get a single ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:Je("Document found",oe(n)),404:Y("Document not found"),500:Y("Internal server error")}},p.put={operationId:`update${we(ce(e.name))}`,summary:`Update a ${ce(e.name)} (full replace)`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:oe(o??n)}}},responses:{200:Je("Document updated",oe(n)),400:Y("Validation error"),404:Y("Document not found"),500:Y("Internal server error")}},p.patch={operationId:`patch${we(ce(e.name))}`,summary:`Partially update a ${ce(e.name)}`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:{allOf:[oe(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Je("Document patched",oe(n)),400:Y("Validation error"),404:Y("Document not found"),500:Y("Internal server error")}},e.allowDelete&&(p.delete={operationId:`delete${we(ce(e.name))}`,summary:`Delete a ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:Je("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:Y("Document not found"),500:Y("Internal server error")}}),s[l]=p,s}function Xt(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:d=false}=n,l=t==="/"?"":t.replace(/\/$/,""),u={},p={},f=[];u.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},u.QueryRequestBody=Ho();for(let[v,R]of Object.entries(e)){let m=we(ce(v)),i=`${m}Create`,g=`${m}Update`;u[m]=Wt(R.schema);let c=k=>{let O=k&&k.length>0?k:Object.keys(R.schema.shape),A={};for(let E of O){let $=E.split(".")[0];$&&R.schema.shape[$]&&!R.systemKeys.includes($)&&(A[$]=R.schema.shape[$]);}return A},h=null,w=c(R.createFields);Object.keys(w).length>0&&(u[i]=Wt(zod.z.object(w)),h=i);let T=null,S=c(R.mutableFields);Object.keys(S).length>0&&(u[g]=Wt(zod.z.object(S)),T=g);let C=Bo(R,l,m,h,T);Object.assign(p,C),f.push({name:v,description:`Operations on ${v} (collection: ${R.path})`});}let y={},b;return d==="basic"?(y.basicAuth={type:"http",scheme:"basic"},b=[{basicAuth:[]}]):d==="bearer"&&(y.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:p,components:{schemas:u,...Object.keys(y).length>0?{securitySchemes:y}:{}},...b?{security:b}:{},tags:f}}function we(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 Zo(e,t){return `<!DOCTYPE html>
|
|
1135
|
+
`;function Ve(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:Hn}})}_t();function he(e){return "<!DOCTYPE html>"+server.renderToString(e)}var ho=["corporate","silk","dark"],bo=()=>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:ho.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))})]}),be=({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(bo,{})})]}),jsxRuntime.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((a,d)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},d):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},d))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(Nt,{basePath:s}),jsxRuntime.jsx(Ve,{})]})]})};function jt(e,t){return he(jsxRuntime.jsx(be,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Ft(e,t){return he(jsxRuntime.jsx(be,{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 Kn=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],xo=[{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"}],vo=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function wo(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return xo;case "ZodBoolean":return Kn;case "ZodArray":return vo;default:return Kn}}var xe="__null__";function Ro(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="${xe}"]');if(!o){o=document.createElement('option');o.value='${xe}';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='${xe}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${xe}"][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!=='${xe}')?i.dataset._prev:'';}}})(this)`}function So(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:Ro(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function ko({col:e,active:t}){let n=t?.value??"",r=n===xe,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,a=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(a){let d=new Set(n.split(",").map(u=>u.trim()).filter(Boolean)),l=`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:d.has(u),"data-enum-group":l,onchange:So(o,l)}),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(d=>jsxRuntime.jsx("option",{value:d,selected:n===d,children:d},d)),e.nullable&&jsxRuntime.jsx("option",{value:xe,"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:xe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Ge,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let d=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:d?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(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 Mt({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(l=>[l.field,l])),s=n.length>0,a=n.length>=2||r&&s,d=t.filter(l=>l.zodType!=="ZodObject"&&l.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:d.map(l=>{let u=wo(l.zodType),p=o[l.name],f=p?.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:l.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[u.length>1?jsxRuntime.jsx("select",{name:`fo_${l.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:u.map(y=>jsxRuntime.jsx("option",{value:y.value,selected:y.value===f,children:y.label},y.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${l.name}`,value:u[0].value}),jsxRuntime.jsx(ko,{col:l,active:p})]})]},l.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 zt(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,d=n==="create"?[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:"New document"}]:[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:`Edit ${r??""}`}];return he(jsxRuntime.jsx(be,{opts:{title:a,breadcrumb:d,basePath:o,flash:s},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}yt();It();function Ht(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 qn(e,t,n,r,o){let s=Ht(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function To(e,t,n,r){let o=Ht(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 Co(e,t,n){return `?${Ht(t,n,e).toString()}`}function Bt(e,t,n,r,o,s,a=[],d=[],l=false,u=[],p,f,y,b,x,v,R,m=false){let i=`${r}/${e}`,g=`${i}/create`,c={};if(R)for(let T of n)c[T]=Ie(Ne(R,T));let h=(v??[]).filter(T=>{let O=c[T]??Ie(Ne(R,T));return O==="string"||O==="number"||O==="bigint"||O==="boolean"||O==="enum"||O==="literal"}),w=h.length>0,k=l,S=k||w,C=h.map(T=>{let O=Ne(R,T),A=Ie(O),P=a.find($=>$.name===T);return {name:T,type:A,enumValues:P?.enumValues??null,nullable:P?.nullable??false}});return he(jsxRuntime.jsxs(be,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Mt,{action:i,columnMeta:a,activeFilters:d,isGroup:b}),y&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${y.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:y.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:y.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:y.message})]}),y.indexUrl&&jsxRuntime.jsx("a",{href:y.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxRuntime.jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxRuntime.jsxs("div",{class:"flex items-center gap-3",children:[jsxRuntime.jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof x=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:x})]})," ","document",(typeof x=="number"?x:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(T=>jsxRuntime.jsx("a",{href:Co(T,d,p),class:`join-item btn btn-xs ${f===T?"btn-active btn-primary":"btn-outline"}`,children:T},T))})]})]}),jsxRuntime.jsx("a",{href:g,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 x=="number"?String(x):"","data-frs-page-size":String(f??t.length),"data-frs-allow-delete":k?"1":"0","data-frs-allow-update":w?"1":"0","data-frs-fields":JSON.stringify(C),"data-frs-filters":JSON.stringify(d),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof x=="number"&&x>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link link-primary text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",x," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",x??"?"," matching documents are selected."," ",jsxRuntime.jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxRuntime.jsxs("div",{class:"flex gap-2",children:[w&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),k&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[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=p?.field===T,P=A?p.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:To(T,p,d,f),class:`hover:text-base-content inline-flex items-center gap-0.5${A?" text-primary font-bold":""}`,children:[T,P]})},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??""),P=`${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((I,j)=>{let D=T[I],E=c[I],Z=E?Qe(E,D):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(De,{val:D,mismatch:Z})},j)}),u.map((I,j)=>{let D=T[I.key];if(D==null||D==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${j}`);let E=I.type==="one"?`${r}/${I.targetRepo}/${encodeURIComponent(String(D))}/edit`:`${r}/${I.targetRepo}?fv_${I.targetKey}=${encodeURIComponent(String(D))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:E,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":I.type,"data-frs-rel-repo":I.targetRepo,"data-frs-rel-fk":I.targetKey,"data-frs-rel-val":String(D),"data-frs-rel-label":I.column,children:I.column})},`rel-${j}`)}),jsxRuntime.jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxRuntime.jsxs("div",{class:"flex gap-1 justify-end",children:[jsxRuntime.jsx("a",{href:P,class:"btn btn-xs btn-outline",children:"Edit"}),m&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(A)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),l&&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:qn(d,o.prevCursor,"prev",p,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:qn(d,o.nextCursor,"next",p,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 x=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[x," total document",x!==1?"s":"",d.length>0?" matching filters":""]})]}),S&&w&&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"}),h.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 We(e,t){return jt(e,t)}function Zt(e,t){return Ft(e,t)}function Lt(e,t,n,r,o,s,a,d,l,u,p,f,y,b,x,v,R,m){return Bt(e,t,n,r,o,s,a,d,l,u,p,f,y,b,x,v,R,m)}function ve(e,t,n,r,o,s){return zt(e,t,n,r,o,s)}var Un="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function $o(){let e="";for(let t=0;t<20;t++)e+=Un.charAt(Math.floor(Math.random()*Un.length));return e}function gt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),o=[];for(let s=1;s<r.length;s+=2)o.push(r[s]);return o.length>0?o:void 0}async function _e(e,t){let n=e.documentKey??"docId",r=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[r]=="function")try{let s=await e.repo.get[r](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Kt(e,t,n){let r=e.documentKey??"docId",o=Ue(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return o.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...o.indexUrl?{action:{href:o.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:o.message}}function M(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function qt(e,t){e.status(302).set("Location",t).send("");}function Ut(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=Qt(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let u={},p=false;for(let[b,x]of Object.entries(e))b.startsWith(`${o}.`)&&(u[b.slice(o.length+1)]=x,p=true);if(p){let b=s;for(;;){let x=L(b);if(x==="ZodOptional"||x==="ZodNullable"||x==="ZodDefault")b=G(b);else break}r[o]=Ut(u,b);continue}let f=e[o],y=Array.isArray(f)?f[f.length-1]:f;if(y)try{r[o]=JSON.parse(y);}catch{r[o]=y;}continue}let d=e[o],l=Array.isArray(d)?d[d.length-1]:d;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(l===void 0||l===""){a==="ZodBoolean"&&(r[o]=false);continue}switch(a){case "ZodBoolean":l==="__null__"?r[o]=null:r[o]=l==="true"||l==="on"||l==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(l);break;case "ZodDate":r[o]=new Date(l);break;case "ZodArray":try{r[o]=JSON.parse(l);}catch{r[o]=l;}break;default:if(l.startsWith("{")||l.startsWith("["))try{r[o]=JSON.parse(l);break}catch{}r[o]=l;}}return r}function Vn(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let r=new Date(e);isNaN(r.getTime())||(t=r);}if(!t||isNaN(t.getTime()))return null;let n=r=>String(r).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function Qt(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Po(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function Gn(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 Wn(e){let t=Po(e),n=L(t);if(n==="ZodEnum"){let r=He(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=Be(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=dt(t);return typeof r=="string"?[r]:void 0}}function Jn(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,a=e[o];if(a===null){r[s]="__null__";continue}if(a===void 0)continue;let d=t.shape[o];for(;;){let u=L(d);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")d=G(d);else break}let l=L(d);if(l==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let u=Jn(a,d,s);Object.assign(r,u);}else if(l==="ZodDate"){let u=Vn(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=Vn(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 Vt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Vt(n.nested,t):void 0}))}function Eo(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[o,s]of Object.entries(e)){if(!o.startsWith("fv_"))continue;let a=o.slice(3);if(!t.has(a))continue;let d=(s??"").trim();if(!d)continue;let l=e[`fo_${a}`]??"==",u=n.has(l)?l:"==";r.push({field:a,op:u,value:d});}return r}function Qn(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 Xn(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,a=t.shape[o];if(!a){r.push({name:s,zodType:"ZodString"});continue}let d=Qt(a);if(d==="ZodObject"){let l=a;for(;;){let p=L(l);if(p==="ZodOptional"||p==="ZodNullable"||p==="ZodDefault")l=G(l);else break}let u=te(l);r.push(...Xn(Object.keys(u),l,s));}else r.push({name:s,zodType:d,nullable:Gn(a),enumValues:Wn(a)});}return r}function Do(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=te(r);if(!(o in s))return null;r=s[o];}return r}function Ae(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let a=s.indexOf(".");if(a===-1)n.push(s);else {let d=s.slice(0,a),l=s.slice(a+1);r.has(d)||r.set(d,[]),r.get(d).push(l);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,a]of r){if(!(s in e.shape))continue;let d=e.shape[s];for(;;){let l=L(d);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")d=G(d);else break}if(L(d)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Ae(d,a);}return zod.z.object(o)}function pe(e,t){return qe(e,t)}function Yn(e,t){let n=(m,i)=>{let g=pe(m,t),c=Object.values(e).map(h=>({name:h.name,path:h.path}));M(i,Zt(c,g));},r=async(m,i)=>{let g=m.params.repoName;if(!g){M(i,"Bad request",400);return}let c=e[g];if(!c){M(i,"Repository not found",404);return}let h=c.pageSize??25,w=m.query??{},k=w.cursor,S=w.dir==="prev"?"prev":"next",C=w.ob??"",T=w.od==="desc"?"desc":"asc",O=C?{field:C,dir:T}:void 0,A=parseInt(w.ps??""),P=Number.isFinite(A)&&A>0?Math.min(A,200):h,$=c.listColumns??Object.keys(c.schema.shape),I=c.documentKey??"docId",j=[I,...$.filter(J=>J!==I)],D=c.filterableFields?(()=>{let J=[];for(let de of c.filterableFields)(de.includes(".")||$.includes(de))&&J.push(de);return J})():$,E=(()=>{let J=[];for(let de of D)if(de.includes(".")){let $e=Do(c.schema,de);J.push({name:de,zodType:$e?Qt($e):"ZodString",nullable:$e?Gn($e):false,enumValues:$e?Wn($e):void 0});}else J.push(...Xn([de],c.schema));return J})(),Z=new Set(E.map(J=>J.name)),fe=Eo(w,Z),se=Qn(fe),V;if(k)try{let J=c.repo.ref;typeof J.doc=="function"&&(V=await J.doc(k).get());}catch{}let[q,Ye]=await Promise.all([c.repo.query.paginate({pageSize:P,cursor:V,direction:S,...se.length>0?{where:se}:{},...O?{orderBy:[{field:O.field,direction:O.dir}]}:{}}).catch(J=>({queryError:Ue(J,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:fe,sort:O})})),c.repo.aggregate.count(se.length>0?{where:se}:{}).catch(()=>{})]),Oe="queryError"in q,ur=Oe?[]:q.data,pr=Oe?"":q.nextCursor?.id??"",fr=Oe?"":q.prevCursor?.id??"",yr=Oe?q.queryError:void 0,mr=pe(m,t);M(i,Lt(c.name,ur,j,mr,{hasPrev:Oe?false:q.hasPrevPage,hasNext:Oe?false:q.hasNextPage,prevCursor:fr,nextCursor:pr},void 0,E,fe,c.allowDelete??false,c.relationalMeta,O,P,yr,c.isGroup,Ye,c.mutableFields,c.schema,c.historyEnabled));},o=(m,i)=>{let g=m.params.repoName;if(!g){M(i,"Bad request",400);return}let c=e[g];if(!c){M(i,"Repository not found",404);return}let h=pe(m,t),w=Ae(c.schema,c.createFields),k=le(w),S=`${h}/${c.name}/create`,C=ge(k,S,"POST","Create document");M(i,ve(c.name,C,"create",null,h));},s=async(m,i)=>{let g=m.params.repoName;if(!g){M(i,"Bad request",400);return}let c=e[g];if(!c){M(i,"Repository not found",404);return}let h=pe(m,t),w=m.body??{},k=Ut(w,c.schema),S=Ae(c.schema,c.createFields),C=S.safeParse(k);if(!C.success){let T=le(S),O=`${h}/${c.name}/create`,A=ge(T,O,"POST","Create document"),P=C.error.issues.map($=>`${$.path.join(".")}: ${$.message}`).join(", ");M(i,ve(c.name,A,"create",null,h,{type:"error",message:`Validation error: ${P}`}),422);return}try{if(c.isGroup&&c.parentKeys&&c.parentKeys.length>0){let T={...C.data};c.createdKey&&(T[c.createdKey]=new Date);let O=c.parentKeys.filter(I=>!T[I]);if(O.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${O.join(", ")}`);let A=c.parentKeys.map(I=>T[I]),P=c.documentKey??"docId",$=T[P]||$o();await c.repo.set(...A,$,T);}else await c.repo.create(C.data);qt(i,`${h}/${c.name}?flash=created`);}catch(T){let O=Ae(c.schema,c.createFields),A=le(O),P=`${h}/${c.name}/create`,$=ge(A,P,"POST","Create document");M(i,ve(c.name,$,"create",null,h,{type:"error",message:`Save error: ${T.message}`}),500);}},a=async(m,i)=>{let g=m.params.repoName,c=m.params.id;if(!g||!c){M(i,"Bad request",400);return}let h=e[g];if(!h){M(i,"Repository not found",404);return}let w=pe(m,t),k=null;try{k=await _e(h,c);}catch(P){let $=Kt(h,c,P),I=Te(P)?424:500;M(i,We("",{title:`Edit ${h.name} / ${c}`,basePath:w,breadcrumb:[{label:"Repositories",href:w},{label:h.name,href:`${w}/${h.name}`},{label:`Edit ${c}`}],flash:$}),I);return}if(!k){M(i,"Document not found",404);return}let S=Jn(k,h.schema),C=Ae(h.schema,h.mutableFields),T=Vt(le(C),S),O=`${w}/${h.name}/${encodeURIComponent(c)}/edit`,A=ge(T,O,"POST","Save changes");M(i,ve(h.name,A,"edit",c,w));},d=async(m,i)=>{let g=m.params.repoName,c=m.params.id;if(!g||!c){M(i,"Bad request",400);return}let h=e[g];if(!h){M(i,"Repository not found",404);return}let w=pe(m,t),k=m.body??{},S=Ut(k,h.schema),C=Ae(h.schema,h.mutableFields),O=C.partial().safeParse(S);if(!O.success){let A=Object.fromEntries(Object.entries(k).map(([D,E])=>[D,Array.isArray(E)?E.join(","):E??""])),P=Vt(le(C),A),$=`${w}/${h.name}/${encodeURIComponent(c)}/edit`,I=ge(P,$,"POST","Save changes"),j=O.error.issues.map(D=>`${D.path.join(".")}: ${D.message}`).join(", ");M(i,ve(h.name,I,"edit",c,w,{type:"error",message:`Validation error: ${j}`}),422);return}try{let A=await _e(h,c),P=(A&>(A,h.pathKey))??[c];await h.repo.update(...P,O.data),qt(i,`${w}/${h.name}?flash=updated`);}catch(A){let P=Ae(h.schema,h.mutableFields),$=le(P),I=`${w}/${h.name}/${encodeURIComponent(c)}/edit`,j=ge($,I,"POST","Save changes"),D=Te(A)?Kt(h,c,A):{type:"error",message:`Save error: ${A.message}`},E=Te(A)?424:500;M(i,ve(h.name,j,"edit",c,w,D),E);}},l=async(m,i)=>{let g=m.params.repoName,c=m.params.id;if(!g||!c){M(i,"Bad request",400);return}let h=e[g];if(!h){M(i,"Repository not found",404);return}if(!h.allowDelete){M(i,"Delete is not allowed for this repository",403);return}let w=pe(m,t);try{let k=await _e(h,c),S=(k&>(k,h.pathKey))??[c];await h.repo.delete(...S),qt(i,`${w}/${h.name}?flash=deleted`);}catch(k){let S=Te(k)?Kt(h,c,k):{type:"error",message:`Delete error: ${k.message}`},C=Te(k)?424:500;M(i,We("",{title:`Delete ${h.name} / ${c}`,basePath:w,breadcrumb:[{label:"Repositories",href:w},{label:h.name,href:`${w}/${h.name}`},{label:`Delete ${c}`}],flash:S}),C);}},u=async(m,i)=>{let g=m.params.repoName;if(!g){M(i,"Bad request",400);return}let c=e[g];if(!c){M(i,"Repository not found",404);return}let h=pe(m,t),w=m.query,k=w?.type==="many"?"many":"one",S=Math.max(1,Math.min(100,Number(w?.ps??25)||25)),C=c.listColumns??Object.keys(te(c.schema)),{PanelOne:T,PanelMany:O}=await Promise.resolve().then(()=>(_t(),Zn)),{renderToString:A}=await import('hono/jsx/dom/server');if(k==="one"){let E=String(w?.id??"");if(!E){M(i,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let Z=await _e(c,E),fe=A(T({doc:Z,repoName:c.name,basePath:h,schema:c.schema,columns:C}));M(i,fe);}catch(Z){M(i,`<div class='p-6 text-error text-sm'>Error: ${Z.message}</div>`,500);}return}let P=String(w?.fk??""),$=String(w?.fv??"");if(!P||!$){M(i,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let I=w?.cursor??"",j=w?.dir==="prev"?"prev":"next",D;if(I)try{let E=c.repo.ref;typeof E.doc=="function"&&(D=await E.doc(I).get());}catch{}try{let E=await c.repo.query.paginate({pageSize:S,cursor:D,direction:j,where:[[P,"==",Io($)]]}),Z=A(O({docs:E.data,repoName:c.name,basePath:h,fk:P,fv:$,columns:C,schema:c.schema,pagination:{hasPrev:E.hasPrevPage,hasNext:E.hasNextPage,prevCursor:E.prevCursor?.id??"",nextCursor:E.nextCursor?.id??"",pageSize:S}}));M(i,Z);}catch(E){M(i,`<div class='p-6 text-error text-sm'>Error: ${E.message}</div>`,500);}},p=async(m,i)=>{let g=[];for(let c of i){let h;if(m.isGroup||m.parentKeys?.length){let w=await _e(m,c);h=w?gt(w,m.pathKey):void 0;}h||(h=[c]);try{let w=m.repo.documentRef(...h);w&&g.push(w);}catch{}}return g},f=async(m,i)=>{let g=Qn(i),c=m.documentKey??"docId",h=[],w;for(;;){let k=await m.repo.query.paginate({pageSize:500,cursor:w,direction:"next",...g.length>0?{where:g}:{}});for(let S of k.data){let C=String(S[c]??S.id??"");C&&h.push(C);}if(!k.hasNextPage||!k.nextCursor)break;w=k.nextCursor;}return h},y=async(m,i)=>{let g=m.params.repoName;if(!g){ee(i,{error:"Bad request"},400);return}let c=e[g];if(!c){ee(i,{error:"Repository not found"},404);return}if(!c.allowDelete){ee(i,{error:"Delete is not allowed for this repository"},403);return}let h=m.body??{};try{let w=await x(c,h);if(w.length===0){ee(i,{deleted:0});return}let k=await p(c,w);for(let S=0;S<k.length;S+=500)await c.repo.bulk.delete(k.slice(S,S+500));ee(i,{deleted:k.length});}catch(w){ee(i,{error:w.message},500);}},b=async(m,i)=>{let g=m.params.repoName;if(!g){ee(i,{error:"Bad request"},400);return}let c=e[g];if(!c){ee(i,{error:"Repository not found"},404);return}let h=m.body??{},w=String(h.field??"");if(!w){ee(i,{error:"Missing 'field'"},400);return}if(!c.mutableFields||!c.mutableFields.includes(w)){ee(i,{error:`Field '${w}' is not bulk-updatable`},403);return}let k=c.schema.shape?.[w],S=h.value;if(k){let C=k.safeParse(h.value);if(!C.success){ee(i,{error:`Invalid value for '${w}': ${C.error.message}`},400);return}S=C.data;}try{let C=await x(c,h);if(C.length===0){ee(i,{updated:0});return}let O=(await p(c,C)).map(A=>({docRef:A,data:{[w]:S}}));for(let A=0;A<O.length;A+=500)await c.repo.bulk.update(O.slice(A,A+500));ee(i,{updated:O.length});}catch(C){ee(i,{error:C.message},500);}};async function x(m,i){if(i.selectAll){let g=v(i.filters,m);return await f(m,g)}return Array.isArray(i.ids)?i.ids.filter(g=>typeof g=="string"&&!!g):[]}function v(m,i){if(!Array.isArray(m))return [];let g=new Set((i.filterableFields??Object.keys(te(i.schema))).map(w=>String(w))),c=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),h=[];for(let w of m)w&&typeof w=="object"&&typeof w.field=="string"&&g.has(w.field)&&typeof w.value=="string"&&c.has(String(w.op))&&h.push({field:w.field,op:w.op,value:w.value});return h}return {handleDashboard:n,handleList:r,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:a,handleEditSubmit:d,handleDelete:l,handlePanel:u,handleBulkDelete:y,handleBulkUpdate:b,handleHistory:async(m,i)=>{let g=m.params.repoName,c=m.params.id;if(!g||!c){M(i,"Bad request",400);return}let h=e[g];if(!h){M(i,"Repository not found",404);return}if(!h.historyEnabled||!h.repo.history){M(i,"History not enabled for this repository",404);return}let w=pe(m,t),k=h.historySubcollection??"history",S=[c];try{let E=await _e(h,c),Z=E?gt(E,h.pathKey):void 0;Z&&Z.length>0&&(S=Z);}catch{}let C=parseInt(String(m.query?.limit??"")),T=Number.isFinite(C)&&C>0?Math.min(C,500):100,O=[],A;try{O=await h.repo.history.list(...S,{limit:T});}catch(E){A=E.message;}let P=E=>String(E??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),$=E=>{if(E===void 0)return '<span class="opacity-40">undefined</span>';if(E===null)return '<span class="opacity-40">null</span>';if(typeof E=="object")try{return `<code class="text-xs">${P(JSON.stringify(E))}</code>`}catch{return P(String(E))}return P(String(E))},I=E=>E?typeof E.toDate=="function"?E.toDate().toISOString():E instanceof Date?E.toISOString():P(String(E)):"",j=E=>`<span class="badge badge-sm ${E==="create"?"badge-success":E==="delete"?"badge-error":"badge-info"}">${P(E)}</span>`,D="";if(D+='<div class="flex items-center justify-between mb-4">',D+=`<a href="${w}/${h.name}/${encodeURIComponent(c)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,D+=`<a href="${w}/${h.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,D+="</div>",D+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${P(k)}</code> \xB7 Showing up to ${T} entries.</p>`,A)D+=`<div class="alert alert-error mb-4">${P(A)}</div>`;else if(O.length===0)D+='<div class="alert">No history entries found.</div>';else {D+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',D+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let E of O){let Z=E.meta??{},fe=[Z.reason,Z.comment].filter(q=>q!=null&&q!=="").map(q=>P(String(q))).join(" \u2014 "),se="",V=Object.keys(E.changes??{});V.length===0?se='<span class="opacity-40">\u2014</span>':se='<ul class="space-y-1">'+V.map(q=>{let Ye=E.changes[q];return `<li><strong>${P(q)}</strong>: ${$(Ye.oldValue)} \u2192 ${$(Ye.newValue)}</li>`}).join("")+"</ul>",D+="<tr>",D+=`<td class="whitespace-nowrap text-xs font-mono">${P(I(E.historySetAt))}</td>`,D+=`<td>${j(E.operation??"update")}</td>`,D+=`<td class="text-xs">${P(Z.userEmail??Z.userId??"")}</td>`,D+=`<td class="text-xs">${fe}</td>`,D+=`<td>${se}</td>`,D+="</tr>";}D+="</tbody></table></div>";}M(i,We(D,{title:`History \u2014 ${h.name} / ${c}`,basePath:w,breadcrumb:[{label:"Repositories",href:w},{label:h.name,href:`${w}/${h.name}`},{label:`History ${c}`}]}));}}}function ee(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Io(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}async function No(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function _o(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 er(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:o,middleware:s=[],httpsOptions:a}=e,d=t==="/"?"":t.replace(/\/$/,""),l={};for(let[y,b]of Object.entries(n)){let x=b.schema??b.repo.schema??null;if(!x)throw new Error(`[createAdminServer] Repository "${y}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let v,R,m;if(b.fieldsConfig){let c=b.fieldsConfig;v=[],R=[],m=[];for(let[h,w]of Object.entries(c))for(let k of w)k==="filterable"?v.push(h):k==="mutable"?R.push(h):k==="create"&&m.push(h);v.length===0&&(v=void 0),R.length===0&&(R=void 0),m.length===0&&(m=void 0);}let i=(()=>{let c=b.repo._parentKeys;return c&&c.length>0?c:void 0})();if(i&&m)for(let c of i)m.includes(c)||m.push(c);let g={name:y,path:b.path,repo:b.repo,schema:x,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:i,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:v,mutableFields:R,createFields:m,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 c=b.repo.relationalKeys??{},h=[];for(let w of b.relationalFields){let k=c[w.key];k&&h.push({key:w.key,column:w.column,targetRepo:String(k.repo),targetKey:String(k.key),type:k.type});}return h.length>0?h:void 0})()};l[y]=g;}let u=Yn(l,d),p=new ne;if(r&&p.use(async(y,b,x)=>{let v=y,R=String(v.headers?.["content-type"]??"");if(R.includes("application/x-www-form-urlencoded")){let m=await No(v);y.body=_o(m);}else if(R.includes("application/json")&&typeof v.body=="string")try{y.body=JSON.parse(v.body);}catch{}await x();}),o)if(Pe(o)){for(let y of o.routes){let b=`${d}${y.path}`;y.method==="GET"?p.get(b,y.handler):p.post(b,y.handler);}p.use(o.middleware);}else if(typeof o=="function")p.use(o);else {let y=o.realm??"Admin",b="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");p.use((x,v,R)=>{if((x.headers?.authorization??"")!==b){v.status(401).set("WWW-Authenticate",`Basic realm="${y}"`).set("Content-Type","text/plain").send("Unauthorized");return}R();});}for(let y of s)p.use(y);p.get(`${d}/`,u.handleDashboard),p.get(`${d}`,u.handleDashboard),p.get(`${d}/:repoName/_panel`,u.handlePanel),p.post(`${d}/:repoName/_bulk/delete`,u.handleBulkDelete),p.post(`${d}/:repoName/_bulk/update`,u.handleBulkUpdate),p.get(`${d}/:repoName`,u.handleList),p.get(`${d}/:repoName/create`,u.handleCreateForm),p.post(`${d}/:repoName/create`,u.handleCreateSubmit),p.get(`${d}/:repoName/:id/edit`,u.handleEditForm),p.post(`${d}/:repoName/:id/edit`,u.handleEditSubmit),p.get(`${d}/:repoName/:id/history`,u.handleHistory),p.post(`${d}/:repoName/:id/delete`,u.handleDelete);let f=async(y,b)=>{await p.handle(y,b);};return a&&(f.httpsOptions=a),f}function Wt(e,t,n=200){let r=U(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function je(e,t,n,r=200){Wt(e,{success:true,data:t,meta:n},r);}function K(e,t,n=400){Wt(e,{success:false,error:t},n);}function Gt(e,t,n,r,o){let s=Ue(t,n),a=s.type==="index",d=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)),Wt(e,u,d);}var tr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function jo(){let e="";for(let t=0;t<20;t++)e+=tr.charAt(Math.floor(Math.random()*tr.length));return e}function Fe(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=>Rt(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=Fe(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(Fe(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Fe(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Fe(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=Fe(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function Fo(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let a of s){if(n.includes(a))continue;let d=a.split(".")[0];d&&r[d]&&(o[d]=r[d]);}return zod.z.object(o)}function nr(e,t,n,r=false,o=[]){try{let s=Fo(e,n,o),a=r?s.partial():s;return {success:!0,data:(wt()==="normalize"?Fe(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(d=>`${d.path.join(".")}: ${d.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function Mo(e,t){let n=[],r=t?new Set(t):null,o={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[s,a]of Object.entries(e)){if(a===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let d=Array.isArray(a)?a[0]:a;if(d===void 0||d==="")continue;let l=s.match(/^(\w+)__(\w+)$/),u,p="==";if(l&&l[1]&&l[2]){u=l[1];let y=l[2];if(o[y])p=o[y];else continue}else if(!l)u=s;else continue;if(r&&!r.has(u))continue;let f=d;p==="in"||p==="not-in"||p==="array-contains-any"?f=d.split(",").map(y=>rr(y.trim())):f=rr(d),n.push({field:u,op:p,value:f});}return n}function rr(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 ht(e){return e?{docId:e.id}:null}async function or(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 sr(e,t,n,r=false){async function o(m,i,g,c){if(!r)return true;let h=i.rules?.[g];if(!h)return K(m,`Operation "${g}" is not allowed for this repository`,403),false;try{return await h(c)?!0:(K(m,"Forbidden",403),!1)}catch(w){let k=n&&w instanceof Error?w.message:"Forbidden";return K(m,k,403),false}}async function s(m,i,g,c){if(!r)return c;let h=m.rules?.filter;if(!h)return c;let w=[];for(let k of c)try{await h({user:i,doc:k,params:g})&&w.push(k);}catch{}return w}function a(m){return m?.user??null}function d(m,i){return !m||!e[m]?(K(i,`Repository "${m}" not found`,404),null):e[m]}function l(m,i){if(!i)return;let g=m[i];if(typeof g!="string"||!g)return;let c=g.split("/").filter(Boolean),h=[];for(let w=1;w<c.length;w+=2)h.push(c[w]);return h.length>0?h:void 0}async function u(m,i){let g=`by${m.documentKey.charAt(0).toUpperCase()}${m.documentKey.slice(1)}`,c=m.repo.get[g];if(typeof c=="function")try{let w=await c(i);if(w)return w}catch{}return (await m.repo.query.by({where:[[m.documentKey,"==",i]],limit:1}))[0]??null}async function p(m,i){let g=m.params||{},c=d(g.repoName,i);if(!c)return;let h=a(m);if(!await o(i,c,"list",{user:h,query:m.query??{},params:g}))return;let w=[],k;try{let S=m.query??{},C=Math.min(Number(S.pageSize)||c.pageSize,100),T=S.cursor,O=S.direction?.toLowerCase()==="prev"?"prev":"next",A=S.orderBy,P=S.orderDir?.toLowerCase()==="desc"?"desc":"asc",$=S.select,I=$?$.split(",").map(V=>V.trim()):void 0,j;c.allowedIncludes&&S.includes&&(j=(typeof S.includes=="string"?S.includes.split(",").map(q=>q.trim()):Array.isArray(S.includes)?S.includes:[]).filter(q=>typeof q=="string"&&c.allowedIncludes.includes(q)),j?.length===0&&(j=void 0));let D=Mo(S,c.filterableFields);w=D.map(V=>({field:V.field,op:V.op,value:String(V.value??"")})),A&&(k={field:A,dir:P});let E={pageSize:C,direction:O};if(T)try{let V=typeof T=="string"?JSON.parse(T):T;E.cursor=await or(c,V);}catch{}A&&(E.orderBy=[{field:A,direction:P}]),D.length>0&&(E.where=D.map(V=>[V.field,V.op,V.value])),I&&(E.select=I),j&&(E.include=j);let Z=await c.repo.query.paginate(E),se={items:await s(c,a(m),g,Z.data),hasNextPage:Z.hasNextPage,hasPrevPage:Z.hasPrevPage,nextCursor:ht(Z.nextCursor),prevCursor:ht(Z.prevCursor)};je(i,se,{pageSize:C,hasMore:Z.hasNextPage});}catch(S){Gt(i,S,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:w,sort:k},"Failed to fetch documents",n);}}async function f(m,i){let g=m.params||{},c=d(g.repoName,i);if(!c)return;let h=a(m);if(!await o(i,c,"list",{user:h,query:m.body??{},params:g}))return;let w=[],k;try{let S=m.body??{},C=Math.min(S.pageSize||c.pageSize,100),T=S.direction==="prev"?"prev":"next";S.where&&(w=S.where.map(I=>({field:String(I[0]),op:I[1],value:String(I[2]??"")}))),S.orderBy&&S.orderBy[0]&&(k={field:S.orderBy[0].field,dir:S.orderBy[0].direction==="desc"?"desc":"asc"});let O={pageSize:C,direction:T};if(S.cursor)try{let I=typeof S.cursor=="string"?JSON.parse(S.cursor):S.cursor;O.cursor=await or(c,I);}catch{}if(c.allowedIncludes&&S.includes&&S.includes.length>0){let I=S.includes.filter(j=>typeof j=="string"?c.allowedIncludes.includes(j):typeof j=="object"&&j!==null&&"relation"in j&&typeof j.relation=="string"?c.allowedIncludes.includes(j.relation):!1);I.length>0&&(O.include=I);}if(S.where&&S.where.length>0){if(c.filterableFields){let I=new Set(c.filterableFields),j=S.where.filter(D=>!I.has(D[0]));if(j.length>0){K(i,`Fields not filterable: ${j.map(D=>D[0]).join(", ")}`,400);return}}O.where=S.where;}if(S.orWhere&&S.orWhere.length>0){if(c.filterableFields){let I=new Set(c.filterableFields),j=S.orWhere.filter(D=>!I.has(D[0]));if(j.length>0){K(i,`Fields not filterable: ${j.map(D=>D[0]).join(", ")}`,400);return}}O.orWhere=S.orWhere;}if(S.orWhereGroups&&S.orWhereGroups.length>0){if(c.filterableFields){let I=new Set(c.filterableFields);for(let j of S.orWhereGroups){let D=j.filter(E=>!I.has(E[0]));if(D.length>0){K(i,`Fields not filterable: ${D.map(E=>E[0]).join(", ")}`,400);return}}}O.orWhereGroups=S.orWhereGroups;}S.orderBy&&S.orderBy.length>0&&(O.orderBy=S.orderBy),S.select&&S.select.length>0&&(O.select=S.select);let A=await c.repo.query.paginate(O),$={items:await s(c,a(m),g,A.data),hasNextPage:A.hasNextPage,hasPrevPage:A.hasPrevPage,nextCursor:ht(A.nextCursor),prevCursor:ht(A.prevCursor)};je(i,$,{pageSize:C,hasMore:A.hasNextPage});}catch(S){Gt(i,S,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:w,sort:k},"Failed to query documents",n);}}async function y(m,i){let g=m.params||{},c=d(g.repoName,i);if(!c)return;let h=g.id;if(!h){K(i,"Document ID required",400);return}try{let w=await u(c,h);if(!w){K(i,"Document not found",404);return}let k=a(m);if(!await o(i,c,"get",{user:k,doc:w,params:g}))return;if(r&&c.rules?.filter)try{if(!await c.rules.filter({user:k,doc:w,params:g})){K(i,"Document not found",404);return}}catch{K(i,"Document not found",404);return}je(i,w);}catch(w){Gt(i,w,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:[{field:c.documentKey,op:"==",value:h}]},"Failed to fetch document",n);}}async function b(m,i){let g=m.params||{},c=d(g.repoName,i);if(c)try{let h=m.body??{},w=a(m);if(!await o(i,c,"create",{user:w,body:h,params:g}))return;let k=nr(c.schema,h,c.createFields,!1,c.systemKeys);if(!k.success){K(i,k.error,400);return}if(c.validate){let C=await c.validate(k.data,"create");if(C){K(i,C,400);return}}let S;if(c.isGroup&&c.parentKeys&&c.parentKeys.length>0){let C={...k.data};c.createdKey&&(C[c.createdKey]=new Date);let T=c.parentKeys.filter(P=>!C[P]);if(T.length>0){K(i,`Missing parent key(s) for subcollection create: ${T.join(", ")}`,400);return}let O=c.parentKeys.map(P=>C[P]),A=C[c.documentKey]||jo();S=await c.repo.set(...O,A,C);}else S=await c.repo.create(k.data);je(i,S,void 0,201);}catch(h){let w=n&&h instanceof Error?h.message:"Failed to create document";K(i,w,500);}}async function x(m,i,g){let c=m.params||{},h=d(c.repoName,i);if(!h)return;let w=c.id;if(!w){K(i,"Document ID required",400);return}try{let k=m.body??{},S=await u(h,w);if(!S){K(i,"Document not found",404);return}let C=a(m);if(!await o(i,h,"update",{user:C,doc:S,body:k,params:c}))return;let T=nr(h.schema,k,h.mutableFields,g,h.systemKeys);if(!T.success){K(i,T.error,400);return}if(h.validate){let P=await h.validate(T.data,"update");if(P){K(i,P,400);return}}let O=l(S,h.pathKey)??[w],A=await h.repo.update(...O,T.data);je(i,A);}catch(k){let S=n&&k instanceof Error?k.message:"Failed to update document";K(i,S,500);}}async function v(m,i){let g=m.params||{},c=d(g.repoName,i);if(!c)return;if(!c.allowDelete){K(i,"Delete not allowed for this repository",403);return}let h=g.id;if(!h){K(i,"Document ID required",400);return}try{let w=await u(c,h);if(!w){K(i,"Document not found",404);return}let k=a(m);if(!await o(i,c,"delete",{user:k,doc:w,params:g}))return;let S=l(w,c.pathKey)??[h];await c.repo.delete(...S),je(i,{deleted:!0});}catch(w){let k=n&&w instanceof Error?w.message:"Failed to delete document";K(i,k,500);}}function R(m,i){i.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:p,handleQuery:f,handleGet:y,handleCreate:b,handleUpdate:x,handleDelete:v,handleOptions:R}}function Jt(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 oe(e){return {$ref:`#/components/schemas/${e}`}}function Y(e){return {description:e,content:{"application/json":{schema:oe("ErrorResponse")}}}}function Xe(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function ar(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 zo(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 Ho(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 Bo(){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 Zo(e,t,n,r,o){let s={},a=e.name,d=`${t}/${e.name}`,l=`${d}/{${e.documentKey}}`,u={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[d]={get:{operationId:`list${we(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...zo(e),...Ho(e)],responses:{200:ar(oe(n)),500:Y("Internal server error")}},post:{operationId:`create${we(e.name)}`,summary:`Create a ${ce(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:oe(r??n)}}},responses:{201:Xe("Document created",oe(n)),400:Y("Validation error"),500:Y("Internal server error")}}},s[`${d}/query`]={post:{operationId:`query${we(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:oe("QueryRequestBody")}}},responses:{200:ar(oe(n)),400:Y("Invalid query"),500:Y("Internal server error")}}};let p={};return p.get={operationId:`get${we(ce(e.name))}`,summary:`Get a single ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:Xe("Document found",oe(n)),404:Y("Document not found"),500:Y("Internal server error")}},p.put={operationId:`update${we(ce(e.name))}`,summary:`Update a ${ce(e.name)} (full replace)`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:oe(o??n)}}},responses:{200:Xe("Document updated",oe(n)),400:Y("Validation error"),404:Y("Document not found"),500:Y("Internal server error")}},p.patch={operationId:`patch${we(ce(e.name))}`,summary:`Partially update a ${ce(e.name)}`,tags:[a],parameters:[u],requestBody:{required:true,content:{"application/json":{schema:{allOf:[oe(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Xe("Document patched",oe(n)),400:Y("Validation error"),404:Y("Document not found"),500:Y("Internal server error")}},e.allowDelete&&(p.delete={operationId:`delete${we(ce(e.name))}`,summary:`Delete a ${ce(e.name)}`,tags:[a],parameters:[u],responses:{200:Xe("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:Y("Document not found"),500:Y("Internal server error")}}),s[l]=p,s}function Yt(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:d=false}=n,l=t==="/"?"":t.replace(/\/$/,""),u={},p={},f=[];u.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},u.QueryRequestBody=Bo();for(let[v,R]of Object.entries(e)){let m=we(ce(v)),i=`${m}Create`,g=`${m}Update`;u[m]=Jt(R.schema);let c=T=>{let O=T&&T.length>0?T:Object.keys(R.schema.shape),A={};for(let P of O){let $=P.split(".")[0];$&&R.schema.shape[$]&&!R.systemKeys.includes($)&&(A[$]=R.schema.shape[$]);}return A},h=null,w=c(R.createFields);Object.keys(w).length>0&&(u[i]=Jt(zod.z.object(w)),h=i);let k=null,S=c(R.mutableFields);Object.keys(S).length>0&&(u[g]=Jt(zod.z.object(S)),k=g);let C=Zo(R,l,m,h,k);Object.assign(p,C),f.push({name:v,description:`Operations on ${v} (collection: ${R.path})`});}let y={},b;return d==="basic"?(y.basicAuth={type:"http",scheme:"basic"},b=[{basicAuth:[]}]):d==="bearer"&&(y.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:p,components:{schemas:u,...Object.keys(y).length>0?{securitySchemes:y}:{}},...b?{security:b}:{},tags:f}}function we(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 Lo(e,t){return `<!DOCTYPE html>
|
|
1136
1136
|
<html lang="en">
|
|
1137
1137
|
<head>
|
|
1138
1138
|
<meta charset="utf-8" />
|
|
@@ -1143,5 +1143,5 @@ function initColumnReorder(table) {
|
|
|
1143
1143
|
<script id="api-reference" data-url="${t}"></script>
|
|
1144
1144
|
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
|
|
1145
1145
|
</body>
|
|
1146
|
-
</html>`}
|
|
1146
|
+
</html>`}async function Ko(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function ir(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:o,middleware:s=[],verbose:a=false,httpsOptions:d}=e,l=t==="/"?"":t.replace(/\/$/,""),u={};for(let[i,g]of Object.entries(n)){let c=g.schema??g.repo.schema??null;if(!c)throw new Error(`[createCrudServer] Repository "${i}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let h,w,k;if(g.fieldsConfig){let T=g.fieldsConfig;h=[],w=[],k=[];for(let[O,A]of Object.entries(T))for(let P of A)P==="filterable"?h.push(O):P==="mutable"?w.push(O):P==="create"&&k.push(O);h.length===0&&(h=void 0),w.length===0&&(w=void 0),k.length===0&&(k=void 0);}let S=(()=>{let T=g.repo._parentKeys;return T&&T.length>0?T:void 0})();if(S&&k)for(let T of S)k.includes(T)||k.push(T);let C={name:i,path:g.path,repo:g.repo,schema:c,systemKeys:g.repo._systemKeys??[g.documentKey??"docId"],documentKey:g.documentKey??"docId",pathKey:g.repo._pathKey??void 0,isGroup:!!g.repo._isGroup,parentKeys:S,createdKey:g.repo._createdKey??void 0,pageSize:g.pageSize??25,filterableFields:h,mutableFields:w,createFields:k,allowDelete:g.allowDelete??false,allowedIncludes:g.allowedIncludes,validate:g.validate,rules:g.rules};u[i]=C;}let f=sr(u,l,a,!!o),y=e.openapi,b=y&&typeof y=="object"?y:{},x=null;function v(){if(!x){let i=o?Pe(o)||typeof o=="function"?"bearer":"basic":false;x=Yt(u,l,{...b,auth:b.auth??i});}return x}let R=new ne;if(R.use((i,g,c)=>{g.set("Access-Control-Allow-Origin","*"),g.set("Access-Control-Allow-Credentials","true"),c();}),r&&R.use(async(i,g,c)=>{let h=i;if(String(h.headers?.["content-type"]??"").includes("application/json")){if(typeof h.body=="string")try{i.body=JSON.parse(h.body);}catch{}else if(Buffer.isBuffer(i.rawBody))try{let k=await Ko(h);i.body=JSON.parse(k);}catch{}}await c();}),o)if(Pe(o)){for(let i of o.routes){let g=`${l}${i.path}`;i.method==="GET"?R.get(g,i.handler):R.post(g,i.handler);}R.use(o.middleware);}else if(typeof o=="function")R.use(o);else {let i=o.realm??"API",g="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");R.use((c,h,w)=>{if((c.headers?.authorization??"")!==g){h.status(401).set("WWW-Authenticate",`Basic realm="${i}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}w();});}for(let i of s)R.use(i);if(y!==false){let i=`${l}/__spec.json`,g=`${l}/__docs`;R.get(i,(c,h)=>{let w=v();h.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(w,null,2));}),R.get(g,(c,h)=>{let w=qe(c,l)+"/__spec.json",k=Lo(b.title??"CRUD API",w);h.status(200).set("Content-Type","text/html; charset=utf-8").send(k);});}R.use((i,g,c)=>{if(i.method==="OPTIONS"){f.handleOptions(i,g);return}c();}),R.get(`${l}/:repoName`,f.handleList),R.post(`${l}/:repoName/query`,f.handleQuery),R.get(`${l}/:repoName/:id`,f.handleGet),R.post(`${l}/:repoName`,f.handleCreate),R.put(`${l}/:repoName/:id`,(i,g)=>f.handleUpdate(i,g,false)),R.patch(`${l}/:repoName/:id`,(i,g)=>f.handleUpdate(i,g,true)),R.delete(`${l}/:repoName/:id`,f.handleDelete);let m=async(i,g)=>{await R.handle(i,g);};return m.spec=v,d&&(m.httpsOptions=d),m}function lr(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function cr(e,t,n){let r={};for(let[o,s]of Object.entries(t)){if(!s)continue;let a=e[o];if(!a)throw new Error(`[createServers.${n}] Unknown repo "${o}" \u2014 not present in the registry passed to createServers().`);r[o]={...s,repo:a};}return r}function dr(e,t={}){return {admin(n){let r=cr(e,n.repos,"admin"),o=er({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return lr(o,t)},crud(n){let r=cr(e,n.repos,"crud"),o=ir({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return lr(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}),En(e,r)},history(n){return xn(e,n)}}}function tl(e){return t=>({...t,schema:e,type:null,documentRef:null,update:null})}function nl(e,t){let n={...e};for(let r in t)t[r]&&(n[r]={...e[r],relationalKeys:t[r]});return n}var en=class{constructor(t,n){this.repositoryCache=new Map;this.allRepositories={};this.db=t,this.mapping=n,this.initializeRepositories();}initializeRepositories(){for(let t of Object.keys(this.mapping))this.allRepositories[t]=Ct(this.db,this.mapping[t],{});for(let t of Object.keys(this.mapping))this.allRepositories[t]=Ct(this.db,this.mapping[t],this.allRepositories);}getRepository(t){return this.allRepositories[t]}};function rl(e,t){let n=new en(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=ne;exports.RepositoryMapping=en;exports.applyPaginationQueryOptions=ye;exports.buildAndExecuteQuery=Re;exports.buildRepositoryRelations=nl;exports.coerceToDate=Rt;exports.createPaginationIterator=St;exports.createRepositoryConfig=tl;exports.createRepositoryMapping=rl;exports.createServers=dr;exports.executePaginatedQuery=rt;exports.getDateHandling=wt;exports.normalizeTimestamps=nt;exports.setDateHandling=xr;//# sourceMappingURL=index.cjs.map
|
|
1147
1147
|
//# sourceMappingURL=index.cjs.map
|