@lpdjs/firestore-repo-service 2.2.6 → 2.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{create-servers-DmggzSb3.d.cts → create-servers-B3Ls46bx.d.cts} +3 -3
- package/dist/{create-servers-D4-NGpKm.d.ts → create-servers-CvVZnihM.d.ts} +3 -3
- package/dist/history/index.cjs +2 -0
- package/dist/history/index.cjs.map +1 -0
- package/dist/history/index.d.cts +127 -0
- package/dist/history/index.d.ts +127 -0
- package/dist/history/index.js +2 -0
- package/dist/history/index.js.map +1 -0
- package/dist/{index-DpD4DEqH.d.cts → index-Cw9b1crP.d.cts} +1 -1
- package/dist/{index-Cvip2Sgt.d.ts → index-DGB3Oemk.d.ts} +1 -1
- package/dist/index.cjs +120 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -10
- package/dist/index.d.ts +19 -10
- package/dist/index.js +120 -102
- package/dist/index.js.map +1 -1
- package/dist/{openapi-B3P2F8op.d.ts → openapi-BEf4OuG9.d.ts} +1 -1
- package/dist/{openapi-UJJ1aCFk.d.cts → openapi-D8UTm0lu.d.cts} +1 -1
- package/dist/read-DMvxeFCg.d.cts +232 -0
- package/dist/read-DMvxeFCg.d.ts +232 -0
- package/dist/servers/admin/index.cjs +31 -13
- package/dist/servers/admin/index.cjs.map +1 -1
- package/dist/servers/admin/index.d.cts +4 -2
- package/dist/servers/admin/index.d.ts +4 -2
- package/dist/servers/admin/index.js +31 -13
- package/dist/servers/admin/index.js.map +1 -1
- package/dist/servers/crud/index.d.cts +6 -4
- package/dist/servers/crud/index.d.ts +6 -4
- package/dist/servers/index.cjs +33 -15
- package/dist/servers/index.cjs.map +1 -1
- package/dist/servers/index.d.cts +6 -5
- package/dist/servers/index.d.ts +6 -5
- package/dist/servers/index.js +33 -15
- package/dist/servers/index.js.map +1 -1
- package/dist/{types-Z9Qy8Xmx.d.ts → types-CE1dws32.d.cts} +20 -3
- package/dist/{types-Z9Qy8Xmx.d.cts → types-CjexXskS.d.ts} +20 -3
- package/package.json +14 -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'),zod=require('zod'),server=require('hono/jsx/dom/server');var Xn=Object.defineProperty;var He=(e,t)=>()=>(e&&(t=e(e=0)),t);var Yn=(e,t)=>{for(var n in t)Xn(e,n,{get:t[n],enumerable:true});};function M(e){let t=e,n=t._zod?.def?.type;if(n)return ir[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function U(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function en(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function tn(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 J(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 Ne(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 _e(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 Je(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function nn(e){let t=e,n=[],r=t._zod?.def?.checks;if(Array.isArray(r)){for(let o of r)o.format&&n.push(o.format);if(n.length>0)return n}let s=t._def?.checks;if(Array.isArray(s))for(let o of s)o.kind&&n.push(o.kind);return n}var ir,je=He(()=>{ir={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 hn({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function hr({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 $e({val:e,mismatch:t}){let n=br(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(hr,{message:t})]}):n}function br(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(hn,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(hn,{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,s])=>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(s??"")})]})),n.length>8&&jsxRuntime.jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsxRuntime.jsx("span",{class:"text-sm break-all",children:t})}var et=He(()=>{});function Ae(e){if(!e)return "unknown";let t=ft(e);switch(M(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 ft(e){let t=M(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=U(e);return n?ft(n):e}return e}function Oe(e,t){if(!e)return;let n=t.split("."),r=e;for(let s of n){if(!r)return;let o=ft(r);if(M(o)!=="ZodObject")return;r=J(o)[s];}return r}function wr(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function Me(e,t){if(e==="unknown")return null;let n=wr(t);return n==="null"?null:e==="enum"||e==="literal"?n==="string"||n==="number"?null:`Expected ${e} (string/number), got ${n}`:e===n||e==="number"&&n==="bigint"||e==="bigint"&&n==="number"?null:`Expected ${e}, got ${n}`}var mt=He(()=>{je();});var xn={};Yn(xn,{PanelMany:()=>Tr,PanelOne:()=>Sr,RightPanel:()=>yt});function Sr({doc:e,repoName:t,basePath:n,schema:r,columns:s}){if(!e)return jsxRuntime.jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let o=String(e.docId??e.id??""),a=`${n}/${t}/${encodeURIComponent(o)}/edit`,d=vn(r,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:" \xB7 "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:o})]}),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:s.map(i=>{let f=e[i],g=d[i],x=g?Me(g,f):null;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:i}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx($e,{val:f,mismatch:x})})]})})})]})}function Tr({docs:e,repoName:t,basePath:n,fk:r,fv:s,columns:o,schema:a,pagination:d}){let i=`${n}/${t}?fv_${r}=${encodeURIComponent(s)}`,f=vn(a,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:" 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:s}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsxRuntime.jsx("a",{href:i,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxRuntime.jsxs("table",{class:"table table-xs w-full",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[o.map((g,x)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:g},x)),jsxRuntime.jsx("th",{})]})}),jsxRuntime.jsx("tbody",{children:e.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:o.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((g,x)=>{let h=String(g.docId??g.id??""),b=`${n}/${t}/${encodeURIComponent(h)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[o.map((m,y)=>{let c=g[m],p=f[m],u=p?Me(p,c):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx($e,{val:c,mismatch:u})},y)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:b,class:"btn btn-xs btn-ghost",children:"Edit"})})]},x)})})]})}),(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 vn(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Ae(Oe(e,r));return n}var yt,gt=He(()=>{et();mt();yt=()=>jsxRuntime.jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"aria-hidden":"true",children:[jsxRuntime.jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxRuntime.jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxRuntime.jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsxRuntime.jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsxRuntime.jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsxRuntime.jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsxRuntime.jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function er(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function De(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 ot(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function qt(e){let[t,n,r]=e;return ot(e)?er(r,30).map(o=>[t,n,o]):[e]}function Ge(e,t){let n=e;for(let[r,s,o]of t)n=n.where(String(r),s,o);return n}async function Kt(e){let t=await Promise.all(e.map(s=>s.get())),n=new Map;t.forEach(s=>{s.docs.forEach(o=>{n.has(o.id)||n.set(o.id,o);});});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 be(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 De(e,t).get();if(!t.where.some(ot)){let x=Ge(e,t.where);return x=De(x,t),x.get()}let i=t.where.map(qt),g=at(i).map(x=>{let h=Ge(e,x);return h=De(h,t),h});return Kt(g)}let s=t.where??[],o=[...t.orWhere?.map(d=>[d])??[],...t.orWhereGroups??[]],a=[];for(let d of o){let i=[...s,...d];if(i.some(ot)){let g=i.map(qt),h=at(g).map(b=>{let m=Ge(e,b);return m=De(m,t),m});a.push(...h);}else {let g=Ge(e,i);g=De(g,t),a.push(g);}}return Kt(a)}function at(e){if(e.length===0)return [[]];let t=e[0];if(e.length===1&&t)return t.map(o=>[o]);if(!t)return [[]];let n=e.slice(1),r=at(n),s=[];for(let o of t)for(let a of r)s.push([o,...a]);return s}var it="preserve";function tr(e){it=e;}function lt(){return it}function nr(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function ct(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(nr(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 rr(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function We(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>We(t));if(rr(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=We(r);return t}return e}function q(e){return it==="normalize"?We(e):e}function Lt(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function ie(e){return e.charAt(0).toUpperCase()+e.slice(1)}function le(e,t){return t.where&&t.where.forEach(([n,r,s])=>{e=e.where(String(n),r,s);}),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 Ve(e,t){let n={...t,limit:t.pageSize+1};t.cursor&&(t.direction==="prev"?n.endBefore=t.cursor:n.startAfter=t.cursor);let s=(await be(e,n)).docs,o=s.length>t.pageSize,a=o?s.slice(0,t.pageSize):s,d=a.map(f=>q({...f.data(),docId:f.id})),i=t.direction==="prev";return {data:d,nextCursor:i?a.length>0?a[a.length-1]:void 0:o?a[a.length-1]:void 0,prevCursor:i?o?a[0]:void 0:a[0],hasNextPage:i?!!t.cursor:o,hasPrevPage:i?o:!!t.cursor,pageSize:d.length}}async function*dt(e,t){let n,r=true;for(;r;){let s=await Ve(e,{...t,cursor:n,direction:"next"});yield s,r=s.hasNextPage,n=s.nextCursor;}}function Qt(e){return {count:async(t={})=>{let n=e;return n=le(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=le(r,n);let s=await r.get(),o=0;return s.forEach(a=>{let d=a.data()[t];typeof d=="number"&&(o+=d);}),o},average:async(t,n={})=>{let r=e;r=le(r,n);let s=await r.get();if(s.empty)return null;let o=0,a=0;return s.forEach(d=>{let i=d.data()[t];typeof i=="number"&&(o+=i,a++);}),a>0?o/a:null}}}function Ht(e,t,n,r,s,o){let a=()=>new Date;return {create:()=>{let d=e.batch();return {batch:d,set:(...i)=>{let f=i[i.length-1],g=typeof f=="object"&&f!==null&&"merge"in f,x=g?i[i.length-2]:i[i.length-1],h=g?i.slice(0,-2):i.slice(0,-1),b=g?f:{merge:true},m=t(...h),y={...x},c=h[h.length-1];n&&c&&(y[n]=c),r&&(y[r]=m.path),s&&(y[s]=a()),o&&(y[o]=a()),d.set(m,y,b);},update:(...i)=>{let f=i.pop(),x=t(...i),h={...f};o&&(h[o]=a()),d.update(x,h);},delete:(...i)=>{let f=t(...i);d.delete(f);},commit:async()=>{await d.commit();}}}}}function Gt(e,t,n){let r=()=>new Date;return {set:async s=>{let o=e.bulkWriter(),a=0;for(let d of s){if(!d)continue;let{docRef:i,data:f,merge:g=true}=d,x={...f};t&&(x[t]=r()),n&&(x[n]=r()),o.set(i,x,{merge:g}),a++,a>=500&&(await o.flush(),a=0);}await o.close();},update:async s=>{let o=e.bulkWriter(),a=0;for(let d of s){if(!d)continue;let{docRef:i,data:f}=d,g={...f};n&&(g[n]=r()),o.update(i,g),a++,a>=500&&(await o.flush(),a=0);}await o.close();},delete:async s=>{let o=e.bulkWriter(),a=0;for(let d of s)d&&(o.delete(d),a++,a>=500&&(await o.flush(),a=0));await o.close();}}}function Wt(e,t,n,r,s,o){let a=()=>new Date;return {create:async x=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let h,b,m={...x};if(s&&(m[s]=a()),o&&(m[o]=a()),x[n]){b=x[n],h=e.doc(b);let c=r?{...m,[r]:h.path}:m;await h.set(c);}else {h=await e.add(m),b=h.id;let c={[n]:b};r&&(c[r]=h.path),await h.update(c);}let y=await h.get();return q(y.data())},set:async(...x)=>{let h=x[x.length-1],b=typeof h=="object"&&h!==null&&"merge"in h,m=b?x[x.length-2]:x[x.length-1],y=b?x.slice(0,-2):x.slice(0,-1),c=b?h:{merge:true},p={...m};o&&(p[o]=a());let u=t(...y),l=y[y.length-1];n&&l!=null&&(p[n]=l),r&&(p[r]=u.path),await u.set(p,c);let v=await u.get();return q(v.data())},update:async(...x)=>{let h=x.pop(),b=x,m={...h};o&&(m[o]=a());let y=t(...b);await y.update(m);let c=await y.get();return q(c.data())},delete:async(...x)=>{await t(...x).delete();}}}function Vt(e,t,n,r,s){let o={};return o.byList=async(a,d,i="in",f={})=>{if(d.length===0)return [];let g=[],x=Lt(d,30);for(let h of x){let b=e;b=b.where(a,i,h),f.select&&f.select.length>0&&(b=b.select(...f.select.map(y=>String(y)))),(await b.get()).forEach(y=>{let c=q(y.data());g.push(f.returnDoc?{data:c,doc:y}:c);});}return g},t.forEach(a=>{let d=`by${ie(String(a))}`;o[d]=async(i,f={})=>{let g=typeof f=="boolean"?{returnDoc:f}:f;if(String(a)===s){let c=await r(i).get();if(!c.exists)return null;let p=q(c.data());return g.returnDoc?{data:p,doc:c}:p}let x=e;x=x.where(String(a),"==",i).limit(1),g.select&&g.select.length>0&&(x=x.select(...g.select.map(y=>String(y))));let h=await x.get();if(h.empty)return null;let b=h.docs[0];if(!b)return null;let m=q(b.data());return g.returnDoc?{data:m,doc:b}:m};}),o}function Jt(e,t,n,r){let s={},o=async(a,d)=>{if(!n||!r||d.length===0)return a;let i=d.map(f=>typeof f=="string"?{key:f}:{key:f.relation,select:f.select});return Promise.all(a.map(async f=>{let g=await Promise.all(i.map(async({key:h,select:b})=>{let m=n[h];if(!m)return [h,void 0];let y=r[m.repo];if(!y)return [h,void 0];let c=f[h];if(c==null)return [h,m.type==="one"?null:[]];let p=b?{select:b}:void 0;try{if(m.type==="one"){let u=`by${ie(m.key)}`,l=typeof y.get?.[u]=="function"?await y.get[u](c,p):null;return [h,l]}else {let u=`by${ie(m.key)}`,l=typeof y.query?.[u]=="function"?await y.query[u](c,p):[];return [h,l]}}catch(u){return console.error(`[include] Error populating "${h}":`,u),[h,m.type==="one"?null:[]]}})),x={};for(let[h,b]of g)h!==void 0&&(x[h]=b);return {...f,populated:x}}))};return t.forEach(a=>{let d=`by${ie(a)}`;s[d]=async(i,f={})=>{let g={...f,where:[[a,"==",i],...f.where??[]]};return (await be(e,g)).docs.map(h=>q(h.data()))};}),s.by=async a=>(await be(e,a)).docs.map(i=>q(i.data())),s.getAll=async(a={})=>(await be(e,a)).docs.map(i=>q(i.data())),s.onSnapshot=(a,d,i)=>le(e,a).onSnapshot(g=>{d(g.docs.map(x=>q(x.data())));},i),s.paginate=async a=>{let{include:d,...i}=a,f=await Ve(e,i);if(d&&d.length>0){let g=await o(f.data,d);return {...f,data:g}}return f},s.paginateAll=async function*(a){let{include:d,...i}=a;for await(let f of dt(e,i))if(d&&d.length>0){let g=await o(f.data,d);yield {...f,data:g};}else yield f;},s}function Xt(e,t){return {populate:async(n,r)=>{if(!e.relationalKeys)return {...n,populated:{}};let s,o={};if(typeof r=="object"&&!Array.isArray(r))if("relation"in r){let i=r;s=[i.relation],i.select&&(o[i.relation]=i.select);}else if("relations"in r){let i=r;s=Array.isArray(i.relations)?i.relations:[i.relations],o=i.select??{};}else s=[];else s=Array.isArray(r)?r:[r];let a=await Promise.all(s.map(async i=>{let f=e.relationalKeys?.[i];if(!f)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let g=t[f.repo];if(!g)return console.warn(`[populate] Repository "${f.repo}" not found in mapping`),[i,void 0];let x=n[i];if(x==null)return [i,f.type==="one"?null:[]];let h=o[i],b=h?{select:h}:void 0;try{if(f.type==="one"){let m=`by${ie(f.key)}`,y=typeof g.get?.[m]=="function"?await g.get[m](x,b):null;return [i,y]}else {let m=`by${ie(f.key)}`,y=typeof g.query?.[m]=="function"?await g.query[m](x,b):[];return [i,y]}}catch(m){return console.error(`[populate] Error populating "${i}":`,m),[i,f.type==="one"?null:[]]}})),d={};for(let[i,f]of a)f!==void 0&&(d[i]=f);return {...n,populated:d}}}}function Yt(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...o)=>{let a=t(...o),d=await r.get(a);return d.exists?q({...d.data(),docId:d.id}):null},set:(...o)=>{let a=o[o.length-1],d=typeof a=="object"&&a!==null&&"merge"in a,i=d?o[o.length-2]:o[o.length-1],f=d?o.slice(0,-2):o.slice(0,-1),g=d?a:{merge:true},x=t(...f);r.set(x,i,g);},update:(...o)=>{let a=o[o.length-1],d=o.slice(0,-1),i=t(...d);r.update(i,a);},delete:(...o)=>{let a=t(...o);r.delete(a);},raw:r}))}}function sr(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(s=>s.trim().replace(/\s*[:=].*$/,"").trim()).filter(Boolean);return r.length<=2?[]:r.slice(1,-1)}function ut(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),s=t.isGroup?null:e.collection(t.path),o=(...m)=>t.refCb(e,...m),a=Vt(r,t.foreignKeys,s,o,t.documentKey),d=Jt(r,t.queryKeys,t.relationalKeys,n),i=Qt(r),f=Wt(s,o,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),g=Ht(e,o,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),x=Yt(e,o),h=Gt(e,t.createdKey,t.updatedKey),b=Xt(t,n);return {ref:r,documentRef:o,get:a,query:d,aggregate:i,...f,batch:g,transaction:x,bulk:h,...b,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(m=>typeof m=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?sr(t.refCb):[],_createdKey:t.createdKey??null}}function or(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,r=>r===":"?r:`\\${r}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(r,s)=>(t.push(s),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function ar(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var X=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:s,paramNames:o}=or(n);return this.routes.push({method:t.toUpperCase(),pattern:s,paramNames:o,handler:r}),this}async handle(t,n){let r=(t.method??"GET").toUpperCase(),s=ar(t),o=null,a={};for(let f of this.routes){if(f.method!==r)continue;let g=s.match(f.pattern);if(g){o=f,a={},f.paramNames.forEach((x,h)=>{a[x]=decodeURIComponent(g[h+1]??"");});break}}let d=Object.assign(t,{params:a}),i=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,i);}catch(f){this.errorHandler(f,t,n);}}async runMiddlewareChain(t,n,r){let s=0,o=async()=>{if(s<this.middlewares.length){let a=this.middlewares[s++];await a(t,n,o);}else await r(t,n);};await o();}};je();var ce="__sync_version";var lr=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function cr(e){let t=e,n=false;for(;;){let r=M(t);if(!lr.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let s=U(t);if(!s)break;t=s;}return {inner:t,nullable:n}}var dr={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function rn(e,t,n,r,s,o,a,d){for(let[i,f]of Object.entries(e)){let g=n?`${n}__${i}`:i;if(s.has(i)||s.has(g))continue;let{inner:x,nullable:h}=cr(f),b=M(x),m=r||h;if(b==="ZodObject"){let u=J(x);rn(u,t,g,m,s,o,a,d);continue}let y=dr[b]??"json",c=g===a||i===a,p=o[g]??o[i]??g;d.push({name:p,sqlType:t.mapType(y),nullable:c?false:m,isPrimaryKey:c});}}function Xe(e,t,n={}){let{primaryKey:r,exclude:s=[],columnMap:o={}}=n,a=new Set(s),d=J(e),i=[];return rn(d,t,"",false,a,o,r,i),i.some(f=>f.name===ce)||i.push({name:ce,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),i}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 on(e,t,n){for(let[r,s]of Object.entries(e)){let o=t?`${t}__${r}`:r;s!=null&&typeof s=="object"&&!Array.isArray(s)&&!(s instanceof Date)&&!Buffer.isBuffer(s)&&!(s instanceof Uint8Array)&&typeof s.toDate!="function"&&!("latitude"in s&&"longitude"in s)?on(s,o,n):n[o]=sn(s);}}function ze(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},s={};on(e,"",s);let o={};for(let[a,d]of Object.entries(s)){if(n.has(a))continue;let i=a.split("__")[0];if(i!==a&&n.has(i))continue;let f=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;o[f]=d;}return o}function ve(e,t){if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",o=process.env.FUNCTION_REGION??"us-central1",a=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${o}/${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 te(e,t,n){return `<!DOCTYPE html>
|
|
1
|
+
'use strict';var jsxRuntime=require('hono/jsx/jsx-runtime'),firestore=require('firebase-admin/firestore'),crypto=require('crypto'),zod=require('zod'),server=require('hono/jsx/dom/server');var pr=Object.defineProperty;var Qe=(e,t)=>()=>(e&&(t=e(e=0)),t);var fr=(e,t)=>{for(var n in t)pr(e,n,{get:t[n],enumerable:true});};function B(e){let t=e,n=t._zod?.def?.type;if(n)return Nr[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function K(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function mn(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function gn(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 J(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 _e(e){let t=e;return Array.isArray(t.options)?t.options:t._zod?.def?.entries?Object.values(t._zod.def.entries):Array.isArray(t._def?.values)?t._def.values:[]}function je(e){let t=e;return t._zod?.def?.entries?t._zod.def.entries:t.enum&&typeof t.enum=="object"?t.enum:t._def?.values&&typeof t._def.values=="object"?t._def.values:{}}function Ye(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function hn(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 Nr,Fe=Qe(()=>{Nr={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 En({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function Kr({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 Oe({val:e,mismatch:t}){let n=Ur(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(Kr,{message:t})]}):n}function Ur(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(En,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(En,{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 nt=Qe(()=>{});function Ae(e){if(!e)return "unknown";let t=ht(e);switch(B(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 ht(e){let t=B(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=K(e);return n?ht(n):e}return e}function $e(e,t){if(!e)return;let n=t.split("."),r=e;for(let o of n){if(!r)return;let s=ht(r);if(B(s)!=="ZodObject")return;r=J(s)[o];}return r}function Gr(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 Ze(e,t){if(e==="unknown")return null;let n=Gr(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 bt=Qe(()=>{Fe();});var Nn={};fr(Nn,{PanelMany:()=>Jr,PanelOne:()=>Wr,RightPanel:()=>vt});function Wr({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`,c=In(r,o);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:s})]}),jsxRuntime.jsx("a",{href:a,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsxRuntime.jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:o.map(i=>{let f=e[i],u=c[i],g=u?Ze(u,f):null;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:i}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(Oe,{val:f,mismatch:g})})]})})})]})}function Jr({docs:e,repoName:t,basePath:n,fk:r,fv:o,columns:s,schema:a,pagination:c}){let i=`${n}/${t}?fv_${r}=${encodeURIComponent(o)}`,f=In(a,s);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" where "}),jsxRuntime.jsx("span",{class:"font-mono",children:r}),jsxRuntime.jsx("span",{class:"opacity-50",children:" = "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:o}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsxRuntime.jsx("a",{href:i,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxRuntime.jsxs("table",{class:"table table-xs w-full",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[s.map((u,g)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:u},g)),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((u,g)=>{let b=String(u.docId??u.id??""),h=`${n}/${t}/${encodeURIComponent(b)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[s.map((m,v)=>{let d=u[m],y=f[m],p=y?Ze(y,d):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(Oe,{val:d,mismatch:p})},v)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:h,class:"btn btn-xs btn-ghost",children:"Edit"})})]},g)})})]})}),(c.hasPrev||c.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[c.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":c.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),c.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":c.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function In(e,t){if(!e)return {};let n={};for(let r of t)n[r]=Ae($e(e,r));return n}var vt,xt=Qe(()=>{nt();bt();vt=({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 yr(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function Ie(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 it(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function Lt(e){let[t,n,r]=e;return it(e)?yr(r,30).map(s=>[t,n,s]):[e]}function Ge(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function Vt(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 be(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 Ie(e,t).get();if(!t.where.some(it)){let g=Ge(e,t.where);return g=Ie(g,t),g.get()}let i=t.where.map(Lt),u=lt(i).map(g=>{let b=Ge(e,g);return b=Ie(b,t),b});return Vt(u)}let o=t.where??[],s=[...t.orWhere?.map(c=>[c])??[],...t.orWhereGroups??[]],a=[];for(let c of s){let i=[...o,...c];if(i.some(it)){let u=i.map(Lt),b=lt(u).map(h=>{let m=Ge(e,h);return m=Ie(m,t),m});a.push(...b);}else {let u=Ge(e,i);u=Ie(u,t),a.push(u);}}return Vt(a)}function lt(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=lt(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var ct="preserve";function mr(e){ct=e;}function dt(){return ct}function gr(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function ut(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(gr(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 hr(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function We(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>We(t));if(hr(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=We(r);return t}return e}function H(e){return ct==="normalize"?We(e):e}function Gt(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function ie(e){return e.charAt(0).toUpperCase()+e.slice(1)}function le(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 Je(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 be(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,c=a.map(f=>H({...f.data(),docId:f.id})),i=t.direction==="prev";return {data:c,nextCursor:i?a.length>0?a[a.length-1]:void 0:s?a[a.length-1]:void 0,prevCursor:i?s?a[0]:void 0:a[0],hasNextPage:i?!!t.cursor:s,hasPrevPage:i?s:!!t.cursor,pageSize:c.length}}async function*pt(e,t){let n,r=true;for(;r;){let o=await Je(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function Ne(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 Wt(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(!Wt(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 Jt(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??{},c=new Set([...Object.keys(s),...Object.keys(a)]),i={};for(let f of c){if(r.has(f)||o&&!o.has(f))continue;let u=s[f],g=a[f];Wt(u,g)||(i[f]={oldValue:u===void 0?null:u,newValue:g===void 0?null:g,type:{old:Ne(u),new:Ne(g)}});}return i}var br=5;function vr(e){return e.schemaVersion===2}function Xt(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 xr(e){return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:2,operation:e.operation,meta:e.meta??{},changes:e.changes??{}}}function wr(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 Rr(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?Xt(r):Ne(t),new:o?Xt(o):Ne(n)}}}function Sr(e){let t=Rr(e),n=wr(e);return {historyDocId:e.historyDocId,historyToObjectId:e.historyToObjectId,historySetAt:e.historySetAt,schemaVersion:1,operation:"update",meta:n,changes:{[e.field]:t}}}function Tr(e,t,n){return Math.abs(e.toMillis()-t.toMillis())<=n}function kr(e,t){return (e.userId??null)===(t.userId??null)}function Yt(e,t={}){let n=t.groupToleranceMs??br,r=[];for(let o of e){if(vr(o)){r.push(xr(o));continue}let a=Sr(o),c=r[r.length-1];c&&c.schemaVersion===1&&Tr(c.historySetAt,a.historySetAt,n)&&kr(c.meta,a.meta)?Object.assign(c.changes,a.changes):r.push(a);}return r}var Or=7e5;function en(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};if(t){let s=t.field??"expiresAt",a=firestore.Timestamp.fromMillis(Date.now()+t.days*24*60*60*1e3);r[s]=a,s==="expiresAt"&&(r.expiresAt=a);}let o=s=>{try{return Buffer.byteLength(JSON.stringify(s,(a,c)=>c instanceof firestore.Timestamp?c.toMillis():c),"utf8")}catch{return 0}};if(o(r.changes)>Or){let s={};for(let[a,c]of Object.entries(r.changes)){let i=o(c.oldValue),f=o(c.newValue);s[a]={oldValue:i>5e4?"[truncated]":c.oldValue,newValue:f>5e4?"[truncated]":c.newValue,type:c.type};}r.changes=s,r._truncated=true;}return r}async function tn(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 nn(e,t){let n=e??{},r={},o=t.meta;if(!o)return r;let s=u=>{if(!u)return;let g=n[u];return g===void 0||g===null?null:String(g)},a=s(o.userId);a!==void 0&&(r.userId=a);let c=s(o.userEmail);c!==void 0&&(r.userEmail=c);let i=s(o.reason);i!==void 0&&(r.reason=i);let f=s(o.comment);if(f!==void 0&&(r.comment=f),o.extras&&o.extras.length>0){let u={},g=false;for(let b of o.extras)b in n&&(u[b]=n[b],g=true);g&&(r.extras=u);}return r}function rn(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 Ar="history",$r=50;function on(e,t,n){return e(...n).collection(t)}function Pr(e){return String(e[e.length-1]??"")}function sn(e,t,n,r){if(!r?.enabled)return null;let o=r.subcollection??Ar;async function s(...u){let g={},b=u,h=u[u.length-1];h!==null&&typeof h=="object"&&!(h instanceof firestore.Timestamp)&&("limit"in h||"cursor"in h||"direction"in h)&&(g=h,b=u.slice(0,-1));let m=on(e,o,b),v=g.direction??"desc",d=m.orderBy("historySetAt",v);return g.cursor&&(d=d.startAfter(g.cursor)),g.limit&&g.limit>0&&(d=d.limit(g.limit)),(await d.get()).docs.map(p=>({id:p.id,data:p.data()}))}async function a(...u){let g={},b=u,h=u[u.length-1];h!==null&&typeof h=="object"&&!(h instanceof firestore.Timestamp)&&("limit"in h||"cursor"in h||"direction"in h||"fields"in h||"operations"in h)&&(g=h,b=u.slice(0,-1));let m=g.limit??$r,v=Math.max(m,Math.min(m*8,500)),d=await s(...b,{limit:v,cursor:g.cursor,direction:g.direction??"desc"}),y=Yt(d.map(p=>p.data));if(g.fields&&g.fields.length>0){let p=new Set(g.fields);y=y.filter(l=>Object.keys(l.changes).some(x=>p.has(x)));}if(g.operations&&g.operations.length>0){let p=new Set(g.operations);y=y.filter(l=>p.has(l.operation));}return y.slice(0,m)}async function c(...u){let g=u[u.length-1],b={},h,m;return g!==null&&typeof g=="object"&&!(g instanceof firestore.Timestamp)?(b=g,h=u[u.length-2],m=u.slice(0,-2)):(h=g,m=u.slice(0,-1)),a(...m,{...b,fields:[h]})}async function i(...u){let g=u[u.length-1],b={},h,m;return g!==null&&typeof g=="object"&&!(g instanceof firestore.Timestamp)?(b=g,h=u[u.length-2],m=u.slice(0,-2)):(h=g,m=u.slice(0,-1)),a(...m,{...b,operations:[h]})}async function f(...u){let g=u[u.length-1],b=u.slice(0,-1),h=Pr(b),m=Jt(g.before??{},g.after??{},{include:r.include,exclude:r.exclude,metaFields:rn(r),systemKeys:t});if(g.operation==="update"&&Object.keys(m).length===0)return null;let d={...nn(g.after??g.before??null,r),...g.meta??{}},y=en({entityId:h,operation:g.operation,changes:m,meta:d,config:r}),p=on(e,o,b),l=await tn(p,y,r,{repoName:n,docId:h,before:g.before??null,after:g.after??null});return !l.written||!l.entry?null:{historyDocId:l.entry.historyDocId,historyToObjectId:l.entry.historyToObjectId,historySetAt:l.entry.historySetAt,schemaVersion:2,operation:l.entry.operation,meta:l.entry.meta,changes:l.entry.changes}}return {list:a,raw:s,byField:c,byOperation:i,recordManual:f}}function an(e){return {count:async(t={})=>{let n=e;return n=le(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=le(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let c=a.data()[t];typeof c=="number"&&(s+=c);}),s},average:async(t,n={})=>{let r=e;r=le(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(c=>{let i=c.data()[t];typeof i=="number"&&(s+=i,a++);}),a>0?s/a:null}}}function ln(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let c=e.batch();return {batch:c,set:(...i)=>{let f=i[i.length-1],u=typeof f=="object"&&f!==null&&"merge"in f,g=u?i[i.length-2]:i[i.length-1],b=u?i.slice(0,-2):i.slice(0,-1),h=u?f:{merge:true},m=t(...b),v={...g},d=b[b.length-1];n&&d&&(v[n]=d),r&&(v[r]=m.path),o&&(v[o]=a()),s&&(v[s]=a()),c.set(m,v,h);},update:(...i)=>{let f=i.pop(),g=t(...i),b={...f};s&&(b[s]=a()),c.update(g,b);},delete:(...i)=>{let f=t(...i);c.delete(f);},commit:async()=>{await c.commit();}}}}}function cn(e,t,n){let r=()=>new Date;return {set:async o=>{let s=e.bulkWriter(),a=0;for(let c of o){if(!c)continue;let{docRef:i,data:f,merge:u=true}=c,g={...f};t&&(g[t]=r()),n&&(g[n]=r()),s.set(i,g,{merge:u}),a++,a>=500&&(await s.flush(),a=0);}await s.close();},update:async o=>{let s=e.bulkWriter(),a=0;for(let c of o){if(!c)continue;let{docRef:i,data:f}=c,u={...f};n&&(u[n]=r()),s.update(i,u),a++,a>=500&&(await s.flush(),a=0);}await s.close();},delete:async o=>{let s=e.bulkWriter(),a=0;for(let c of o)c&&(s.delete(c),a++,a>=500&&(await s.flush(),a=0));await s.close();}}}function dn(e,t,n,r,o,s){let a=()=>new Date;return {create:async g=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let b,h,m={...g};if(o&&(m[o]=a()),s&&(m[s]=a()),g[n]){h=g[n],b=e.doc(h);let d=r?{...m,[r]:b.path}:m;await b.set(d);}else {b=await e.add(m),h=b.id;let d={[n]:h};r&&(d[r]=b.path),await b.update(d);}let v=await b.get();return H(v.data())},set:async(...g)=>{let b=g[g.length-1],h=typeof b=="object"&&b!==null&&"merge"in b,m=h?g[g.length-2]:g[g.length-1],v=h?g.slice(0,-2):g.slice(0,-1),d=h?b:{merge:true},y={...m};s&&(y[s]=a());let p=t(...v),l=v[v.length-1];n&&l!=null&&(y[n]=l),r&&(y[r]=p.path),await p.set(y,d);let x=await p.get();return H(x.data())},update:async(...g)=>{let b=g.pop(),h=g,m={...b};s&&(m[s]=a());let v=t(...h);await v.update(m);let d=await v.get();return H(d.data())},delete:async(...g)=>{await t(...g).delete();}}}function un(e,t,n,r,o){let s={};return s.byList=async(a,c,i="in",f={})=>{if(c.length===0)return [];let u=[],g=Gt(c,30);for(let b of g){let h=e;h=h.where(a,i,b),f.select&&f.select.length>0&&(h=h.select(...f.select.map(v=>String(v)))),(await h.get()).forEach(v=>{let d=H(v.data());u.push(f.returnDoc?{data:d,doc:v}:d);});}return u},t.forEach(a=>{let c=`by${ie(String(a))}`;s[c]=async(i,f={})=>{let u=typeof f=="boolean"?{returnDoc:f}:f;if(String(a)===o){let d=await r(i).get();if(!d.exists)return null;let y=H(d.data());return u.returnDoc?{data:y,doc:d}:y}let g=e;g=g.where(String(a),"==",i).limit(1),u.select&&u.select.length>0&&(g=g.select(...u.select.map(v=>String(v))));let b=await g.get();if(b.empty)return null;let h=b.docs[0];if(!h)return null;let m=H(h.data());return u.returnDoc?{data:m,doc:h}:m};}),s}function pn(e,t,n,r){let o={},s=async(a,c)=>{if(!n||!r||c.length===0)return a;let i=c.map(f=>typeof f=="string"?{key:f}:{key:f.relation,select:f.select});return Promise.all(a.map(async f=>{let u=await Promise.all(i.map(async({key:b,select:h})=>{let m=n[b];if(!m)return [b,void 0];let v=r[m.repo];if(!v)return [b,void 0];let d=f[b];if(d==null)return [b,m.type==="one"?null:[]];let y=h?{select:h}:void 0;try{if(m.type==="one"){let p=`by${ie(m.key)}`,l=typeof v.get?.[p]=="function"?await v.get[p](d,y):null;return [b,l]}else {let p=`by${ie(m.key)}`,l=typeof v.query?.[p]=="function"?await v.query[p](d,y):[];return [b,l]}}catch(p){return console.error(`[include] Error populating "${b}":`,p),[b,m.type==="one"?null:[]]}})),g={};for(let[b,h]of u)b!==void 0&&(g[b]=h);return {...f,populated:g}}))};return t.forEach(a=>{let c=`by${ie(a)}`;o[c]=async(i,f={})=>{let u={...f,where:[[a,"==",i],...f.where??[]]};return (await be(e,u)).docs.map(b=>H(b.data()))};}),o.by=async a=>(await be(e,a)).docs.map(i=>H(i.data())),o.getAll=async(a={})=>(await be(e,a)).docs.map(i=>H(i.data())),o.onSnapshot=(a,c,i)=>le(e,a).onSnapshot(u=>{c(u.docs.map(g=>H(g.data())));},i),o.paginate=async a=>{let{include:c,...i}=a,f=await Je(e,i);if(c&&c.length>0){let u=await s(f.data,c);return {...f,data:u}}return f},o.paginateAll=async function*(a){let{include:c,...i}=a;for await(let f of pt(e,i))if(c&&c.length>0){let u=await s(f.data,c);yield {...f,data:u};}else yield f;},o}function fn(e,t){return {populate:async(n,r)=>{if(!e.relationalKeys)return {...n,populated:{}};let o,s={};if(typeof r=="object"&&!Array.isArray(r))if("relation"in r){let i=r;o=[i.relation],i.select&&(s[i.relation]=i.select);}else if("relations"in r){let i=r;o=Array.isArray(i.relations)?i.relations:[i.relations],s=i.select??{};}else o=[];else o=Array.isArray(r)?r:[r];let a=await Promise.all(o.map(async i=>{let f=e.relationalKeys?.[i];if(!f)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let u=t[f.repo];if(!u)return console.warn(`[populate] Repository "${f.repo}" not found in mapping`),[i,void 0];let g=n[i];if(g==null)return [i,f.type==="one"?null:[]];let b=s[i],h=b?{select:b}:void 0;try{if(f.type==="one"){let m=`by${ie(f.key)}`,v=typeof u.get?.[m]=="function"?await u.get[m](g,h):null;return [i,v]}else {let m=`by${ie(f.key)}`,v=typeof u.query?.[m]=="function"?await u.query[m](g,h):[];return [i,v]}}catch(m){return console.error(`[populate] Error populating "${i}":`,m),[i,f.type==="one"?null:[]]}})),c={};for(let[i,f]of a)f!==void 0&&(c[i]=f);return {...n,populated:c}}}}function yn(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),c=await r.get(a);return c.exists?H({...c.data(),docId:c.id}):null},set:(...s)=>{let a=s[s.length-1],c=typeof a=="object"&&a!==null&&"merge"in a,i=c?s[s.length-2]:s[s.length-1],f=c?s.slice(0,-2):s.slice(0,-1),u=c?a:{merge:true},g=t(...f);r.set(g,i,u);},update:(...s)=>{let a=s[s.length-1],c=s.slice(0,-1),i=t(...c);r.update(i,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function Er(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 mt(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...d)=>t.refCb(e,...d),a=un(r,t.foreignKeys,o,s,t.documentKey),c=pn(r,t.queryKeys,t.relationalKeys,n),i=an(r),f=dn(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),u=ln(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),g=yn(e,s),b=cn(e,t.createdKey,t.updatedKey),h=fn(t,n),m=t.history,v=m?.enabled?sn(s,[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(d=>typeof d=="string"),t.path??"(unknown)",m):null;return {ref:r,documentRef:s,get:a,query:c,aggregate:i,...f,batch:u,transaction:g,bulk:b,...h,...v?{history:v}:{},schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(d=>typeof d=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?Er(t.refCb):[],_createdKey:t.createdKey??null}}function Dr(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 Ir(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var X=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}=Dr(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=Ir(t),s=null,a={};for(let f of this.routes){if(f.method!==r)continue;let u=o.match(f.pattern);if(u){s=f,a={},f.paramNames.forEach((g,b)=>{a[g]=decodeURIComponent(u[b+1]??"");});break}}let c=Object.assign(t,{params:a}),i=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(c,n,i);}catch(f){this.errorHandler(f,t,n);}}async runMiddlewareChain(t,n,r){let o=0,s=async()=>{if(o<this.middlewares.length){let a=this.middlewares[o++];await a(t,n,s);}else await r(t,n);};await s();}};Fe();var ce="__sync_version";var _r=new Set(["ZodOptional","ZodNullable","ZodDefault"]);function jr(e){let t=e,n=false;for(;;){let r=B(t);if(!_r.has(r))break;(r==="ZodOptional"||r==="ZodNullable")&&(n=true);let o=K(t);if(!o)break;t=o;}return {inner:t,nullable:n}}var Fr={ZodString:"string",ZodNumber:"number",ZodBigInt:"bigint",ZodBoolean:"boolean",ZodDate:"timestamp",ZodEnum:"string",ZodNativeEnum:"string",ZodLiteral:"string"};function bn(e,t,n,r,o,s,a,c){for(let[i,f]of Object.entries(e)){let u=n?`${n}__${i}`:i;if(o.has(i)||o.has(u))continue;let{inner:g,nullable:b}=jr(f),h=B(g),m=r||b;if(h==="ZodObject"){let p=J(g);bn(p,t,u,m,o,s,a,c);continue}let v=Fr[h]??"json",d=u===a||i===a,y=s[u]??s[i]??u;c.push({name:y,sqlType:t.mapType(v),nullable:d?false:m,isPrimaryKey:d});}}function et(e,t,n={}){let{primaryKey:r,exclude:o=[],columnMap:s={}}=n,a=new Set(o),c=J(e),i=[];return bn(c,t,"",false,a,s,r,i),i.some(f=>f.name===ce)||i.push({name:ce,sqlType:t.mapType("bigint"),nullable:true,isPrimaryKey:false,description:"Monotonic publish version (Date.now() ms). Internal."}),i}function vn(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(vn)):e}function xn(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)?xn(o,s,n):n[s]=vn(o);}}function Me(e,t){let n=new Set(t?.exclude),r=t?.columnMap??{},o={};xn(e,"",o);let s={};for(let[a,c]of Object.entries(o)){if(n.has(a))continue;let i=a.split("__")[0];if(i!==a&&n.has(i))continue;let f=r[a]??(a.includes("__")?r[a.split("__").pop()]:void 0)??a;s[f]=c;}return s}function ve(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 te(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,68 +28,68 @@
|
|
|
28
28
|
<nav><a href="${t}/">\u2190 Dashboard</a></nav>
|
|
29
29
|
<h1>${e}</h1>
|
|
30
30
|
${n}
|
|
31
|
-
</body></html>`}function ne(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function xe(e,t,n=200){e.status(n).set("Content-Type","application/json").send(JSON.stringify(t,null,2));}function
|
|
31
|
+
</body></html>`}function ne(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function xe(e,t,n=200){e.status(n).set("Content-Type","application/json").send(JSON.stringify(t,null,2));}function ze(e){return (e.headers?.accept??"").includes("application/json")}function wn(e,t,n,r,o,s,a,c){let i=(o.basePath??"/").replace(/\/$/,"")||"",f=o.featuresFlag??{},u=[];for(let[b,h]of Object.entries(e)){let m=s[b];u.push({name:b,schema:h.schema??null,documentKey:h._systemKeys?.[0]??h.documentKey??"docId",tableName:m?.tableName??b,isGroup:!!h._isGroup,repoCfg:m,repo:h});}let g=new X;if(o.auth)if(typeof o.auth=="function")g.use(o.auth);else {let b=o.auth.realm??"Sync Admin",h="Basic "+Buffer.from(`${o.auth.username}:${o.auth.password}`).toString("base64");g.use((m,v,d)=>{if((m.headers?.authorization??"")!==h){v.status(401).set("WWW-Authenticate",`Basic realm="${b}"`).set("Content-Type","text/plain").send("Unauthorized");return}d();});}return g.get(`${i}/`,(b,h)=>{let m=ve(b,i),v=u.map(l=>{let x=[];return f.healthCheck&&x.push(`<a class="btn" href="${m}/${l.name}/health">Health</a>`),f.manualSync&&x.push(`<a class="btn btn-primary" href="${m}/${l.name}/force-sync">Force Sync</a>`),`<tr>
|
|
32
32
|
<td><strong>${l.name}</strong></td>
|
|
33
33
|
<td>${l.tableName}</td>
|
|
34
34
|
<td>${l.isGroup?'<span class="badge badge-warn">group</span>':'<span class="badge badge-ok">collection</span>'}</td>
|
|
35
35
|
<td>${l.schema?"\u2713":"\u2717"}</td>
|
|
36
|
-
<td>${
|
|
36
|
+
<td>${x.join(" ")}</td>
|
|
37
37
|
</tr>`}).join(`
|
|
38
|
-
`),
|
|
38
|
+
`),d=f.viewQueue?`<p><a class="btn" href="${m}/queues">View Queues</a></p>`:"",y=f.configCheck?`<p style="margin-top:.5rem"><a class="btn" href="${m}/config-check">\u2699 Config Check</a></p>`:"",p=te("Sync Dashboard",m,`<div class="card">
|
|
39
39
|
<table>
|
|
40
40
|
<thead><tr><th>Repository</th><th>Table</th><th>Type</th><th>Schema</th><th>Actions</th></tr></thead>
|
|
41
|
-
<tbody>${
|
|
41
|
+
<tbody>${v}</tbody>
|
|
42
42
|
</table>
|
|
43
|
-
${
|
|
44
|
-
${
|
|
45
|
-
</div>`);ne(
|
|
46
|
-
`),A
|
|
47
|
-
`),E=te(`Health: ${
|
|
48
|
-
<p>Table: <code>${
|
|
43
|
+
${d}
|
|
44
|
+
${y}
|
|
45
|
+
</div>`);ne(h,p);}),g.get(`${i}`,(b,h)=>{let m=ve(b,i);h.status(302).set("Location",`${m}/`).send("");}),f.healthCheck&&g.get(`${i}/:repoName/health`,async(b,h)=>{let m=ve(b,i),v=u.find(C=>C.name===b.params.repoName);if(!v){ne(h,te("Not Found",m,`<p>Unknown repo: ${b.params.repoName}</p>`),404);return}if(!v.schema){ne(h,te("Health Check",m,`<p class="badge badge-warn">No Zod schema attached to "${v.name}"</p>`));return}let d=et(v.schema,t.dialect,{primaryKey:v.documentKey,exclude:v.repoCfg?.exclude,columnMap:v.repoCfg?.columnMap}),y=[],p=false,l=null;try{p=await t.tableExists(v.tableName),p&&(y=await t.getTableColumns(v.tableName));}catch(C){l=C?.message??String(C);}let x=new Set(y),w=new Set(d.map(C=>C.name)),T=d.filter(C=>!x.has(C.name)),O=y.filter(C=>!w.has(C)),$=d.filter(C=>x.has(C.name)),R=p&&T.length===0&&!l;if(ze(b)){xe(h,{repo:v.name,table:v.tableName,tableExists:p,healthy:R,error:l,columns:{expected:d.map(C=>({name:C.name,type:C.sqlType,nullable:C.nullable,isPrimaryKey:C.isPrimaryKey})),actual:y,matched:$.map(C=>C.name),missing:T.map(C=>({name:C.name,type:C.sqlType})),extra:O}});return}let S=R?'<span class="badge badge-ok">Healthy</span>':'<span class="badge badge-err">Unhealthy</span>',k=d.map(C=>{let Z=x.has(C.name)?'<span class="badge badge-ok">OK</span>':'<span class="badge badge-err">MISSING</span>';return `<tr><td>${C.name}</td><td>${C.sqlType}</td><td>${C.nullable?"Yes":"No"}</td><td>${C.isPrimaryKey?"\u2713":""}</td><td>${Z}</td></tr>`}).join(`
|
|
46
|
+
`),A=O.map(C=>`<tr><td>${C}</td><td colspan="3" class="muted">not in schema</td><td><span class="badge badge-warn">EXTRA</span></td></tr>`).join(`
|
|
47
|
+
`),E=te(`Health: ${v.name}`,m,`<div class="card">
|
|
48
|
+
<p>Table: <code>${v.tableName}</code> ${p?S:'<span class="badge badge-err">NOT FOUND</span>'}</p>
|
|
49
49
|
${l?`<p class="badge badge-err">Error: ${l}</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>${k}${A}</tbody>
|
|
54
54
|
</table>
|
|
55
|
-
</div>`);ne(
|
|
56
|
-
<p>This will read <strong>all</strong> documents from the <code>${
|
|
57
|
-
and upsert them into the <code>${
|
|
55
|
+
</div>`);ne(h,E);}),f.manualSync&&(g.get(`${i}/:repoName/force-sync`,(b,h)=>{let m=ve(b,i),v=u.find(y=>y.name===b.params.repoName);if(!v){ne(h,te("Not Found",m,`<p>Unknown repo: ${b.params.repoName}</p>`),404);return}let d=te(`Force Sync: ${v.name}`,m,`<div class="card">
|
|
56
|
+
<p>This will read <strong>all</strong> documents from the <code>${v.name}</code> Firestore collection
|
|
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
|
-
<form method="POST" action="${m}/${
|
|
59
|
+
<form method="POST" action="${m}/${v.name}/force-sync">
|
|
60
60
|
<button type="submit" class="btn btn-primary">Start Force Sync</button>
|
|
61
61
|
</form>
|
|
62
|
-
</div>`);ne(
|
|
63
|
-
<p class="badge badge-err">Error: ${
|
|
64
|
-
<p>Synced ${
|
|
65
|
-
</div>`),500);return}if(
|
|
66
|
-
<pre style="white-space:pre-wrap">${l.map(
|
|
62
|
+
</div>`);ne(h,d);}),g.post(`${i}/:repoName/force-sync`,async(b,h)=>{let m=ve(b,i),v=u.find(R=>R.name===b.params.repoName);if(!v){xe(h,{error:`Unknown repo: ${b.params.repoName}`},404);return}let d=v.repo.ref;if(!d){xe(h,{error:`No collection reference for "${v.name}"`},400);return}let y=0,p=0,l=[],x=500,w=d.limit(x),T=null;try{for(;;){let k=await(T?w.startAfter(T):w).get();if(k.empty)break;for(let A of k.docs){let E=A.data(),C=String(E[v.documentKey]??A.id),Z=Me(E,{exclude:v.repoCfg?.exclude,columnMap:v.repoCfg?.columnMap});try{await r({operation:"UPSERT",repoName:v.name,docId:C,data:Z,timestamp:new Date().toISOString()}),y++;}catch(I){p++;let _=I?.message??String(I);console.error(`[ForceSync:${v.name}] doc=${C} failed:`,I),l.length<5&&l.push(`${C}: ${_}`);}}if(T=k.docs[k.docs.length-1],k.docs.length<x)break}let R=n.get(v.name);R&&await R.flush();}catch(R){if(ze(b)){xe(h,{error:R?.message??String(R),synced:y,errors:p},500);return}ne(h,te(`Force Sync: ${v.name}`,m,`<div class="card">
|
|
63
|
+
<p class="badge badge-err">Error: ${R?.message??String(R)}</p>
|
|
64
|
+
<p>Synced ${y} docs before failure (${p} errors).</p>
|
|
65
|
+
</div>`),500);return}if(ze(b)){xe(h,{repo:v.name,table:v.tableName,synced:y,errors:p,...l.length>0&&{errorSamples:l}});return}let O=l.length>0?`<details style="margin-top:1rem"><summary>First ${l.length} error(s)</summary>
|
|
66
|
+
<pre style="white-space:pre-wrap">${l.map(R=>R.replace(/[<>&]/g,S=>`&#${S.charCodeAt(0)};`)).join(`
|
|
67
67
|
|
|
68
|
-
`)}</pre></details>`:""
|
|
69
|
-
<p class="badge ${
|
|
70
|
-
<p>Synced <strong>${
|
|
71
|
-
${
|
|
72
|
-
${
|
|
73
|
-
</div>`);ne(
|
|
74
|
-
`),
|
|
68
|
+
`)}</pre></details>`:"",$=te(`Force Sync: ${v.name}`,m,`<div class="card">
|
|
69
|
+
<p class="badge ${p>0?"badge-warn":"badge-ok"}">${p>0?"Completed with errors":"Complete"}</p>
|
|
70
|
+
<p>Synced <strong>${y}</strong> documents to <code>${v.tableName}</code>.</p>
|
|
71
|
+
${p>0?`<p class="badge badge-warn">${p} error(s)</p>`:""}
|
|
72
|
+
${O}
|
|
73
|
+
</div>`);ne(h,$);})),f.viewQueue&&g.get(`${i}/queues`,(b,h)=>{let m=ve(b,i),v=[];for(let p of u){let l=n.get(p.name);v.push({repo:p.name,table:p.tableName,pending:l?l.size:0});}if(ze(b)){xe(h,{queues:v});return}let d=v.map(p=>`<tr><td>${p.repo}</td><td>${p.table}</td><td>${p.pending===0?'<span class="badge badge-ok">0</span>':`<span class="badge badge-warn">${p.pending}</span>`}</td></tr>`).join(`
|
|
74
|
+
`),y=te("Sync Queues",m,`<div class="card">
|
|
75
75
|
<table>
|
|
76
76
|
<thead><tr><th>Repository</th><th>Table</th><th>Pending</th></tr></thead>
|
|
77
|
-
<tbody>${
|
|
77
|
+
<tbody>${d}</tbody>
|
|
78
78
|
</table>
|
|
79
|
-
</div>`);ne(
|
|
80
|
-
`),console:`${
|
|
79
|
+
</div>`);ne(h,y);}),f.configCheck&&g.get(`${i}/config-check`,async(b,h)=>{let m=ve(b,i),v=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??process.env.GCP_PROJECT??"unknown",d="https://console.cloud.google.com",y=c??"firestore-sync",p=[];try{await t.tableExists("__nonexistent_health_check__"),p.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable"});}catch(R){let S=R?.message??String(R),k=S.toLowerCase(),A=k.includes("disabled")||k.includes("has not been used")||k.includes("accessnotconfigured"),E=k.includes("permission")||S.includes("403")||k.includes("access denied"),C=k.includes("project")&&k.includes("not found"),Z=k.includes("not found")||S.includes("404");A?p.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:`${d}/apis/library/bigquery.googleapis.com?project=${v}`}}):C?p.push({name:"BigQuery Project",category:"bigquery",status:"error",message:S,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:`${d}/home/dashboard`}}):E?p.push({name:"BigQuery API",category:"bigquery",status:"error",message:`Permission denied: ${S}`,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:`${d}/iam-admin/iam?project=${v}`}}):Z?p.push({name:"BigQuery Dataset",category:"bigquery",status:"error",message:`Dataset not found: ${S}`,fix:{hint:"Create the dataset first",gcloud:`bq mk --dataset ${v}:YOUR_DATASET_ID`,console:`${d}/bigquery?project=${v}`}}):p.push({name:"BigQuery API",category:"bigquery",status:"ok",message:"BigQuery API is reachable (table lookup returned expected error)"});}for(let R of u)try{let S=await t.tableExists(R.tableName);p.push({name:`Table: ${R.tableName}`,category:"bigquery",status:S?"ok":"warn",message:S?`Table \`${R.tableName}\` exists`:`Table \`${R.tableName}\` does not exist yet`,...!S&&{fix:{hint:"Table will be auto-created on first sync if autoMigrate is enabled. Or create it manually."}}});}catch(S){p.push({name:`Table: ${R.tableName}`,category:"bigquery",status:"error",message:S?.message??String(S)});}if(a)for(let R of u){let S=`${y}-${R.name}`;try{let k=a.topic(S);if(typeof k.exists=="function"){let[A]=await k.exists();p.push({name:`Topic: ${S}`,category:"pubsub",status:A?"ok":"error",message:A?`Topic \`${S}\` exists`:`Topic \`${S}\` does not exist`,...!A&&{fix:{gcloud:`gcloud pubsub topics create ${S} --project=${v}`,console:`${d}/cloudpubsub/topic/list?project=${v}`}}});}else p.push({name:`Topic: ${S}`,category:"pubsub",status:"warn",message:"Cannot verify topic existence (PubSub client doesn't expose .exists())",fix:{gcloud:`gcloud pubsub topics create ${S} --project=${v}`,console:`${d}/cloudpubsub/topic/list?project=${v}`,hint:"Ensure the topic exists. It is auto-created by the Firebase emulator but must exist in production."}});}catch(k){let A=k?.message??String(k),E=A.includes("disabled")||A.includes("has not been used");if(p.push({name:E?"Pub/Sub API":`Topic: ${S}`,category:"pubsub",status:"error",message:E?"Pub/Sub API is not enabled":A,fix:E?{gcloud:`gcloud services enable pubsub.googleapis.com --project=${v}`,console:`${d}/apis/library/pubsub.googleapis.com?project=${v}`}:{gcloud:`gcloud pubsub topics create ${S} --project=${v}`,console:`${d}/cloudpubsub/topic/list?project=${v}`}}),E)break}}else p.push({name:"Pub/Sub Client",category:"pubsub",status:"warn",message:"PubSub client not available for config check"});if(ze(b)){let R=p.every(S=>S.status==="ok");xe(h,{project:v,healthy:R,checks:p});return}let l=R=>R==="ok"?'<span class="badge badge-ok">OK</span>':R==="warn"?'<span class="badge badge-warn">WARN</span>':'<span class="badge badge-err">ERROR</span>',x={bigquery:p.filter(R=>R.category==="bigquery"),pubsub:p.filter(R=>R.category==="pubsub"),firestore:p.filter(R=>R.category==="firestore")},w=(R,S)=>{if(S.length===0)return "";let k=S.map(A=>{let E="";if(A.fix){let C=[];A.fix.hint&&C.push(`<p class="muted">${A.fix.hint}</p>`),A.fix.gcloud&&C.push(`<pre>$ ${A.fix.gcloud}</pre>`),A.fix.console&&C.push(`<p><a href="${A.fix.console}" target="_blank">Open GCP Console \u2192</a></p>`),E=`<div style="margin-top:.5rem">${C.join("")}</div>`;}return `<tr>
|
|
81
81
|
<td>${l(A.status)}</td>
|
|
82
82
|
<td><strong>${A.name}</strong><br><span class="muted">${A.message}</span>${E}</td>
|
|
83
83
|
</tr>`}).join(`
|
|
84
|
-
`);return `<h2>${
|
|
84
|
+
`);return `<h2>${R}</h2>
|
|
85
85
|
<table><thead><tr><th style="width:80px">Status</th><th>Check</th></tr></thead>
|
|
86
|
-
<tbody>${k}</tbody></table>`}
|
|
87
|
-
<p>Project: <code>${
|
|
88
|
-
${
|
|
89
|
-
${
|
|
90
|
-
${
|
|
91
|
-
</div>`);ne(
|
|
92
|
-
<input type="hidden" id="${r}__isnull" name="${
|
|
86
|
+
<tbody>${k}</tbody></table>`},O=p.every(R=>R.status==="ok")?'<span class="badge badge-ok">All checks passed</span>':'<span class="badge badge-warn">Some issues found</span>',$=te("Config Check",m,`<div class="card">
|
|
87
|
+
<p>Project: <code>${v}</code> ${O}</p>
|
|
88
|
+
${w("BigQuery",x.bigquery)}
|
|
89
|
+
${w("Pub/Sub",x.pubsub)}
|
|
90
|
+
${w("Firestore",x.firestore)}
|
|
91
|
+
</div>`);ne(h,$);}),async(b,h)=>{await g.handle(b,h);}}var Mr="firestore-sync";function zr(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 Rn(e,t){let{onDocumentCreated:n,onDocumentUpdated:r,onDocumentDeleted:o}=t.deps.firestoreTriggers,s=t.deps.pubsub,a=t?.topicPrefix??Mr,c={},i=new Map;function f(g){let b=i.get(g);return b||(b=s.topic(g),i.set(g,b),b)}async function u(g,b){await f(g).publishMessage({json:b});}for(let[g,b]of Object.entries(e)){let h=t?.repos?.[g],m;if(b._isGroup){if(!h?.triggerPath){console.warn(`[SyncTriggers] Skipping collection-group repo "${g}". Provide a triggerPath in the sync repos config for group collections.`);continue}m=h.triggerPath;}else m=h?.triggerPath??zr(g,b);if(!m)continue;let v=b._systemKeys?.[0]??"docId",d=`${a}-${g}`;c[`${g}_onCreate`]=n(m,async y=>{let p=y.data;if(!p)return;let l=p.data();if(!l)return;let x=String(l[v]??p.id),w=Me(l,{exclude:h?.exclude,columnMap:h?.columnMap}),T={operation:"INSERT",repoName:g,docId:x,data:w,timestamp:new Date().toISOString(),version:Date.now()};await u(d,T);}),c[`${g}_onUpdate`]=r(m,async y=>{let p=y.data?.after;if(!p)return;let l=p.data();if(!l)return;let x=String(l[v]??p.id),w=Me(l,{exclude:h?.exclude,columnMap:h?.columnMap}),T={operation:"UPSERT",repoName:g,docId:x,data:w,timestamp:new Date().toISOString(),version:Date.now()};await u(d,T);}),c[`${g}_onDelete`]=o(m,async y=>{let p=y.data;if(!p)return;let l=p.data(),x=String(l?.[v]??p.id),w={operation:"DELETE",repoName:g,docId:x,data:null,timestamp:new Date().toISOString(),version:Date.now()};await u(d,w);});}return c}var tt=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 c=Number(a[ce]??0);Number(s.data[ce]??0)>=c&&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 Sn=new Set;async function Br(e,t,n,r,o,s,a){if(Sn.has(e))return;let c=et(n,t.dialect,{primaryKey:o,exclude:s,columnMap:a});if(!await t.tableExists(r))await t.createTable({tableName:r,columns:c});else {let f=new Set(await t.getTableColumns(r)),u=c.filter(g=>!f.has(g.name));u.length>0&&await t.addColumns(r,u);}Sn.add(e);}function Tn(e,t){let{deps:n,adapter:r,batchSize:o=100,flushIntervalMs:s=5e3,autoMigrate:a=false,topicPrefix:c="firestore-sync",workerOptions:i,repos:f={}}=t,u=new Map;function g(m,v){let d=u.get(m);if(d)return d;let p=f[m]?.tableName??m,l=async(x,w)=>{console.error(`[SyncWorker] Flush failed for "${m}" (${x.length} events):`,w);try{let T=`${c}-${m}-dlq`,O=n.pubsub.topic(T),[$]=await O.exists();$||(await O.create(),console.info(`[SyncWorker] Created DLQ topic "${T}"`));for(let R of x)await O.publishMessage({json:R});}catch(T){console.error(`[SyncWorker] Dead-letter publish also failed for ${m}:`,T);}};return d=new tt({adapter:r,tableName:p,primaryKey:v,batchSize:o,flushIntervalMs:s,onFlushError:l}),u.set(m,d),d}async function b(m){let{repoName:v}=m,d=e[v];if(!d){console.warn(`[SyncWorker] Unknown repo "${v}", skipping event`);return}let y=d._systemKeys?.[0]??d.documentKey??"docId",p=f[v],l=p?.columnMap,x=l?.[y]??y;if(a){let T=d.schema??void 0;if(T){let O=p?.tableName??v;await Br(v,r,T,O,y,p?.exclude,l);}}let w=g(v,x);m.data&&(m.data[ce]=m.version??Date.now()),w.enqueue(m);}function h(m){let v=async d=>{let y=d.data?.message?.json??d.data?.json;if(!y){console.warn("[SyncWorker] Received empty PubSub message");return}await b(y);let p=u.get(y.repoName);p&&await p.flush();};return i?n.pubsubHandler.onMessagePublished({topic:m,...i},v):n.pubsubHandler.onMessagePublished(m,v)}return {handleMessage:b,createHandler:h,queues:u,async shutdown(){let m=[];for(let v of u.values())m.push(v.shutdown());await Promise.all(m);}}}var Zr="firestore-sync";function kn(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 Cn(e,t){let{deps:n,adapter:r,topicPrefix:o=Zr,batchSize:s,flushIntervalMs:a,autoMigrate:c,admin:i,workerOptions:f,repos:u}=t,g=kn(n.pubsub),b=kn(r),h=Rn(e,{deps:{firestoreTriggers:n.firestoreTriggers,pubsub:g},topicPrefix:o,repos:u}),m=Tn(e,{deps:{pubsubHandler:n.pubsubHandler,pubsub:g},adapter:b,batchSize:s,flushIntervalMs:a,autoMigrate:c,topicPrefix:o,workerOptions:f,repos:u}),v={};for(let p of Object.keys(e))v[`sync_${p}`]=m.createHandler(`${o}-${p}`);let d=null;i&&(d=wn(e,b,m.queues,m.handleMessage,i,u??{},g,o),v.adminsync=i.onRequest?i.httpsOptions?i.onRequest(i.httpsOptions,d):i.onRequest(d):d);let y={functions:{...h,...v},adminHandler:d,handleMessage:m.handleMessage,queues:m.queues,shutdown:m.shutdown};for(let p of ["adminHandler","handleMessage","queues","shutdown"])Object.defineProperty(y,p,{enumerable:false});return y}Fe();Fe();function Hr(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function On(e){let t=e,n=true,r=false,o;for(;;){let s=B(t);if(s==="ZodOptional")n=false,t=K(t);else if(s==="ZodNullable")n=false,r=true,t=K(t);else if(s==="ZodDefault")n=false,o=gn(t),t=K(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function re(e,t=""){if(B(e)==="ZodObject"){let r=J(e);return Object.entries(r).map(([o,s])=>An(t?`${t}.${o}`:o,o,s))}return [An(t||"value",t||"value",e)]}function An(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=On(n),c=B(r),i=Hr(t.split(".").pop()??t);switch(c){case "ZodString":{let f=hn(r),u=f.includes("email"),g=f.includes("url");return {name:e,label:i,type:"text",required:o,nullable:s,defaultValue:a,hint:u?"email":g?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:i,type:"number",required:o,nullable:s,defaultValue:a};case "ZodBoolean":return {name:e,label:i,type:"checkbox",required:o,nullable:s,defaultValue:a};case "ZodDate":case "ZodCoerce":return {name:e,label:i,type:"datetime-local",required:o,nullable:s,defaultValue:a};case "ZodEnum":{let f=_e(r);return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:f}}case "ZodNativeEnum":{let f=je(r),u=Object.values(f).filter(g=>typeof g=="string");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:u}}case "ZodLiteral":{let f=String(Ye(r)??"");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:[f]}}case "ZodObject":{let f=re(r,e);return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,nested:f,hint:"JSON object"}}case "ZodArray":{let f=mn(r);if(!f)return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:u}=On(f),g=B(u),b,h,m;switch(g){case "ZodString":b="text";break;case "ZodNumber":case "ZodBigInt":b="number";break;case "ZodBoolean":b="checkbox";break;case "ZodDate":b="datetime-local";break;case "ZodEnum":b="select",h=_e(u);break;case "ZodNativeEnum":b="select",h=Object.values(je(u)).filter(v=>typeof v=="string");break;case "ZodObject":b="object",m=re(u);break;default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"}}return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,arrayElementType:b,arrayElementOptions:h,arrayElementFields:m}}default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function gt(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__",c=!a&&e.defaultValue!=null?String(e.defaultValue):"",i=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
|
|
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":""}
|
|
95
95
|
onchange="(function(cb){
|
|
@@ -100,61 +100,61 @@ ${n}
|
|
|
100
100
|
})(this)">
|
|
101
101
|
<span>null</span>
|
|
102
102
|
</label>
|
|
103
|
-
</span>`:"",f;switch(e.type){case "checkbox":if(e.nullable){let
|
|
103
|
+
</span>`:"",f;switch(e.type){case "checkbox":if(e.nullable){let u=a?"__null__":c==="true"?"true":c==="false"?"false":"__null__";return `
|
|
104
104
|
<div class="form-control mb-3 ${n}">
|
|
105
105
|
<label for="${r}" class="label pb-1">
|
|
106
106
|
<span class="label-text font-medium">
|
|
107
|
-
${
|
|
107
|
+
${D(e.label)}
|
|
108
108
|
<span class="text-base-content/40 text-xs ml-1">(nullable)</span>
|
|
109
109
|
</span>
|
|
110
110
|
</label>
|
|
111
|
-
<select id="${r}" name="${
|
|
112
|
-
<option value="__null__"${
|
|
113
|
-
<option value="true"${
|
|
114
|
-
<option value="false"${
|
|
111
|
+
<select id="${r}" name="${o}" class="select select-bordered select-sm w-full">
|
|
112
|
+
<option value="__null__"${u==="__null__"?" selected":""}>\u2014 null \u2014</option>
|
|
113
|
+
<option value="true"${u==="true"?" selected":""}>\u2713 true</option>
|
|
114
|
+
<option value="false"${u==="false"?" selected":""}>\u2717 false</option>
|
|
115
115
|
</select>
|
|
116
116
|
</div>`}return `
|
|
117
117
|
<div class="form-control ${n}">
|
|
118
118
|
<label class="label cursor-pointer justify-start gap-3">
|
|
119
|
-
<input type="checkbox" id="${r}" name="${
|
|
119
|
+
<input type="checkbox" id="${r}" name="${o}" value="true"${c==="true"?" checked":""} class="checkbox checkbox-primary checkbox-sm">
|
|
120
120
|
<span class="label-text font-medium">
|
|
121
|
-
${
|
|
121
|
+
${D(e.label)}${e.required?' <span class="text-error">*</span>':""}
|
|
122
122
|
</span>
|
|
123
123
|
</label>
|
|
124
|
-
</div>`;case "select":f=`<select id="${r}" name="${
|
|
124
|
+
</div>`;case "select":f=`<select id="${r}" name="${o}"${s}${a?' disabled style="opacity:0.35"':""} class="select select-bordered select-sm w-full">
|
|
125
125
|
${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
|
|
126
|
-
${(e.options??[]).map(
|
|
126
|
+
${(e.options??[]).map(u=>`<option value="${D(u)}"${c===u?" selected":""}>${D(u)}</option>`).join(`
|
|
127
127
|
`)}
|
|
128
|
-
</select>`;break;case "textarea":if(e.arrayElementType)return
|
|
128
|
+
</select>`;break;case "textarea":if(e.arrayElementType)return qr(e,t);if(e.nested&&e.nested.length>0){let u=e.nested.map(g=>gt(g,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">
|
|
132
|
-
${
|
|
132
|
+
${D(e.label)}${e.required?' <span class="text-error">*</span>':""}
|
|
133
133
|
</legend>
|
|
134
|
-
${
|
|
135
|
-
</fieldset>`}f=`<textarea id="${r}" name="${
|
|
134
|
+
${u}
|
|
135
|
+
</fieldset>`}f=`<textarea id="${r}" name="${o}"${s} rows="3"${a?' disabled style="opacity:0.35"':""}
|
|
136
136
|
data-json
|
|
137
137
|
class="textarea textarea-bordered textarea-sm w-full font-mono text-xs"
|
|
138
|
-
placeholder="${
|
|
139
|
-
value="${
|
|
138
|
+
placeholder="${D(e.hint??"JSON")}">${D(c)}</textarea>`;break;default:f=`<input type="${e.type}" id="${r}" name="${o}"${s}${a?' disabled style="opacity:0.35"':""}
|
|
139
|
+
value="${D(c)}"
|
|
140
140
|
class="input input-bordered input-sm w-full"${e.hint==="email"?' autocomplete="email"':e.hint==="url"?' autocomplete="url"':""}>`;}return `
|
|
141
141
|
<div class="form-control mb-3 ${n}">
|
|
142
142
|
<label for="${r}" class="label pb-1">
|
|
143
143
|
<span class="label-text font-medium">
|
|
144
|
-
${
|
|
145
|
-
${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${
|
|
144
|
+
${D(e.label)}${e.required?' <span class="text-error">*</span>':""}
|
|
145
|
+
${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${D(e.hint)})</span>`:""}
|
|
146
146
|
</span>
|
|
147
147
|
</label>
|
|
148
148
|
<div class="flex items-center gap-2">
|
|
149
149
|
<div class="flex-1 min-w-0">${f}</div>
|
|
150
150
|
${i}
|
|
151
151
|
</div>
|
|
152
|
-
</div>`}function
|
|
153
|
-
`):a.map(
|
|
154
|
-
`),i=
|
|
155
|
-
<input type="hidden" id="${r}__isnull" name="${
|
|
152
|
+
</div>`}function D(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function qr(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 c=s?a.map(u=>Pn(e,u??{})).join(`
|
|
153
|
+
`):a.map(u=>$n(e,u)).join(`
|
|
154
|
+
`),i=s?Pn(e,{}):$n(e,""),f=e.nullable?`<span class="flex items-center gap-1 mt-2">
|
|
155
|
+
<input type="hidden" id="${r}__isnull" name="${D(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
|
-
<input type="checkbox" class="checkbox checkbox-xs" ${
|
|
157
|
+
<input type="checkbox" class="checkbox checkbox-xs" ${o?"checked":""}
|
|
158
158
|
onchange="(function(cb){
|
|
159
159
|
var fs = cb.closest('[data-frs-array]');
|
|
160
160
|
var h = document.getElementById('${r}__isnull');
|
|
@@ -166,64 +166,72 @@ ${n}
|
|
|
166
166
|
</label>
|
|
167
167
|
</span>`:"";return `
|
|
168
168
|
<fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}"
|
|
169
|
-
data-frs-array="${
|
|
169
|
+
data-frs-array="${D(e.name)}" data-frs-array-type="${D(e.arrayElementType??"text")}">
|
|
170
170
|
<legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
|
|
171
|
-
${
|
|
171
|
+
${D(e.label)}${e.required?' <span class="text-error">*</span>':""}
|
|
172
172
|
</legend>
|
|
173
|
-
<input type="hidden" id="${r}" name="${
|
|
174
|
-
<div data-frs-array-items${
|
|
175
|
-
${
|
|
173
|
+
<input type="hidden" id="${r}" name="${D(e.name)}" value="${D(JSON.stringify(a))}"${o?" disabled":""}>
|
|
174
|
+
<div data-frs-array-items${o?' style="opacity:0.35"':""}>
|
|
175
|
+
${c}
|
|
176
176
|
</div>
|
|
177
177
|
<template data-frs-array-tpl>${i}</template>
|
|
178
178
|
<button type="button" class="btn btn-xs btn-outline mt-1" data-frs-array-add>+ Add</button>
|
|
179
179
|
${f}
|
|
180
|
-
</fieldset>`}function
|
|
180
|
+
</fieldset>`}function $n(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
|
-
${(e.arrayElementOptions??[]).map(
|
|
182
|
+
${(e.arrayElementOptions??[]).map(o=>`<option value="${D(o)}"${n===o?" selected":""}>${D(o)}</option>`).join("")}
|
|
183
183
|
</select>`;break;case "checkbox":r=`<label class="flex items-center gap-2 flex-1 cursor-pointer">
|
|
184
184
|
<input type="checkbox" data-frs-val class="checkbox checkbox-sm checkbox-primary"${n==="true"?" checked":""}>
|
|
185
185
|
<span class="text-sm">true</span>
|
|
186
|
-
</label>`;break;case "number":r=`<input type="number" data-frs-val value="${
|
|
186
|
+
</label>`;break;case "number":r=`<input type="number" data-frs-val value="${D(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":r=`<input type="datetime-local" data-frs-val value="${D(n)}" class="input input-bordered input-sm flex-1">`;break;default:r=`<input type="text" data-frs-val value="${D(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 Pn(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>
|
|
193
|
-
${(e.arrayElementFields??[]).map(
|
|
193
|
+
${(e.arrayElementFields??[]).map(o=>{let s=t[o.name],a=s==null?"":typeof s=="object"?JSON.stringify(s):String(s);switch(o.type){case "checkbox":return `<div class="form-control mb-2">
|
|
194
194
|
<label class="label cursor-pointer justify-start gap-3">
|
|
195
|
-
<input type="checkbox" data-frs-key="${
|
|
196
|
-
<span class="label-text text-sm">${
|
|
195
|
+
<input type="checkbox" data-frs-key="${D(o.name)}" class="checkbox checkbox-sm checkbox-primary"${a==="true"?" checked":""}>
|
|
196
|
+
<span class="label-text text-sm">${D(o.label)}</span>
|
|
197
197
|
</label>
|
|
198
198
|
</div>`;case "select":return `<div class="form-control mb-2">
|
|
199
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
200
|
-
<select data-frs-key="${
|
|
201
|
-
${
|
|
202
|
-
${(
|
|
199
|
+
<label class="label pb-1"><span class="label-text text-sm">${D(o.label)}</span></label>
|
|
200
|
+
<select data-frs-key="${D(o.name)}" class="select select-bordered select-sm w-full">
|
|
201
|
+
${o.required?"":'<option value="">\u2014</option>'}
|
|
202
|
+
${(o.options??[]).map(c=>`<option value="${D(c)}"${a===c?" selected":""}>${D(c)}</option>`).join("")}
|
|
203
203
|
</select>
|
|
204
204
|
</div>`;case "number":return `<div class="form-control mb-2">
|
|
205
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
206
|
-
<input type="number" data-frs-key="${
|
|
205
|
+
<label class="label pb-1"><span class="label-text text-sm">${D(o.label)}</span></label>
|
|
206
|
+
<input type="number" data-frs-key="${D(o.name)}" value="${D(a)}" class="input input-bordered input-sm w-full">
|
|
207
207
|
</div>`;case "datetime-local":return `<div class="form-control mb-2">
|
|
208
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
209
|
-
<input type="datetime-local" data-frs-key="${
|
|
208
|
+
<label class="label pb-1"><span class="label-text text-sm">${D(o.label)}</span></label>
|
|
209
|
+
<input type="datetime-local" data-frs-key="${D(o.name)}" value="${D(a)}" class="input input-bordered input-sm w-full">
|
|
210
210
|
</div>`;case "textarea":return `<div class="form-control mb-2">
|
|
211
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
212
|
-
<textarea data-frs-key="${
|
|
211
|
+
<label class="label pb-1"><span class="label-text text-sm">${D(o.label)}</span></label>
|
|
212
|
+
<textarea data-frs-key="${D(o.name)}" rows="2" class="textarea textarea-bordered textarea-sm w-full font-mono text-xs" placeholder="JSON">${D(a)}</textarea>
|
|
213
213
|
</div>`;default:return `<div class="form-control mb-2">
|
|
214
|
-
<label class="label pb-1"><span class="label-text text-sm">${
|
|
215
|
-
<input type="text" data-frs-key="${
|
|
214
|
+
<label class="label pb-1"><span class="label-text text-sm">${D(o.label)}</span></label>
|
|
215
|
+
<input type="text" data-frs-key="${D(o.name)}" value="${D(a)}" class="input input-bordered input-sm w-full">
|
|
216
216
|
</div>`}}).join(`
|
|
217
217
|
`)}
|
|
218
|
-
</div>`}function de(e,t,n,r="Save"){let
|
|
218
|
+
</div>`}function de(e,t,n,r="Save"){let o=e.map(s=>gt(s)).join(`
|
|
219
219
|
`);return `
|
|
220
|
-
<form action="${
|
|
221
|
-
${
|
|
220
|
+
<form action="${D(t)}" method="${n}" novalidate data-frs-form>
|
|
221
|
+
${o}
|
|
222
222
|
<div class="flex gap-2 mt-4 pt-4 border-t border-base-200">
|
|
223
|
-
<button type="submit" class="btn btn-primary btn-sm">${
|
|
223
|
+
<button type="submit" class="btn btn-primary btn-sm">${D(r)}</button>
|
|
224
224
|
<button type="button" class="btn btn-ghost btn-sm" onclick="history.back()">Cancel</button>
|
|
225
225
|
</div>
|
|
226
|
-
</form>`}
|
|
226
|
+
</form>`}nt();var Dn=`// \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
|
+
function frsGetBasePath() {
|
|
228
|
+
var root = document.querySelector("[data-frs-panel-root]");
|
|
229
|
+
var bp = root && root.getAttribute("data-frs-base-path");
|
|
230
|
+
if (typeof bp === "string") return bp.replace(/\\/$/, "");
|
|
231
|
+
return window.location.pathname.replace(/\\/[^/]*\\/?$/, "");
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// \u2500\u2500 Right panel (relations preview) \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
235
|
(function () {
|
|
228
236
|
function panelEls() {
|
|
229
237
|
return {
|
|
@@ -241,7 +249,11 @@ ${n}
|
|
|
241
249
|
els.root.setAttribute("aria-hidden", "false");
|
|
242
250
|
requestAnimationFrame(function () {
|
|
243
251
|
if (els.backdrop) els.backdrop.style.opacity = "1";
|
|
244
|
-
if (els.panel)
|
|
252
|
+
if (els.panel) {
|
|
253
|
+
els.panel.classList.remove("translate-x-full");
|
|
254
|
+
els.panel.style.transform = "translateX(0)";
|
|
255
|
+
els.panel.style.translate = "0 0";
|
|
256
|
+
}
|
|
245
257
|
});
|
|
246
258
|
if (els.title) els.title.textContent = label || "Relation";
|
|
247
259
|
if (els.body) {
|
|
@@ -253,17 +265,18 @@ ${n}
|
|
|
253
265
|
var els = panelEls();
|
|
254
266
|
if (!els.root || !els.panel) return;
|
|
255
267
|
if (els.backdrop) els.backdrop.style.opacity = "0";
|
|
256
|
-
if (els.panel)
|
|
268
|
+
if (els.panel) {
|
|
269
|
+
els.panel.style.transform = "translateX(100%)";
|
|
270
|
+
els.panel.style.translate = "100% 0";
|
|
271
|
+
els.panel.classList.add("translate-x-full");
|
|
272
|
+
}
|
|
257
273
|
setTimeout(function () {
|
|
258
274
|
els.root.classList.add("hidden");
|
|
259
275
|
els.root.setAttribute("aria-hidden", "true");
|
|
260
276
|
}, 200);
|
|
261
277
|
}
|
|
262
|
-
function
|
|
263
|
-
|
|
264
|
-
// We can't know basePath without context, so we derive it from the current URL up to the repoName segment.
|
|
265
|
-
// Caller passes the absolute fragment URL via data attribute; we just need the prefix here.
|
|
266
|
-
return window.location.pathname.replace(/\\/[^/]*\\/?$/, "");
|
|
278
|
+
function getBasePath() {
|
|
279
|
+
return frsGetBasePath();
|
|
267
280
|
}
|
|
268
281
|
function fetchPanel(url, label) {
|
|
269
282
|
openPanel(label);
|
|
@@ -294,7 +307,7 @@ ${n}
|
|
|
294
307
|
var fk = trigger.getAttribute("data-frs-rel-fk");
|
|
295
308
|
var val = trigger.getAttribute("data-frs-rel-val");
|
|
296
309
|
var label = trigger.getAttribute("data-frs-rel-label") || "Relation";
|
|
297
|
-
var bp =
|
|
310
|
+
var bp = getBasePath();
|
|
298
311
|
var url;
|
|
299
312
|
if (type === "one") {
|
|
300
313
|
url =
|
|
@@ -485,7 +498,7 @@ ${n}
|
|
|
485
498
|
var b = bar();
|
|
486
499
|
if (!b) return null;
|
|
487
500
|
var repo = b.getAttribute("data-frs-repo");
|
|
488
|
-
var bp =
|
|
501
|
+
var bp = frsGetBasePath();
|
|
489
502
|
return bp + "/" + encodeURIComponent(repo) + "/_bulk/" + action;
|
|
490
503
|
}
|
|
491
504
|
|
|
@@ -925,7 +938,12 @@ function initColumnVisibility(table) {
|
|
|
925
938
|
if (dataThs.length === 0) return;
|
|
926
939
|
|
|
927
940
|
var wrap = table.closest("[data-frs-table-wrap]");
|
|
928
|
-
var toolbar =
|
|
941
|
+
var toolbar =
|
|
942
|
+
(wrap &&
|
|
943
|
+
(wrap.parentElement
|
|
944
|
+
? wrap.parentElement.querySelector("[data-frs-toolbar]")
|
|
945
|
+
: null)) ||
|
|
946
|
+
(wrap && wrap.previousElementSibling);
|
|
929
947
|
if (!toolbar) return;
|
|
930
948
|
|
|
931
949
|
var repo = table.getAttribute("data-frs-repo") || "default";
|
|
@@ -1114,7 +1132,7 @@ function initColumnReorder(table) {
|
|
|
1114
1132
|
});
|
|
1115
1133
|
});
|
|
1116
1134
|
}
|
|
1117
|
-
`;function Ze(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:bn}})}gt();function ue(e){return "<!DOCTYPE html>"+server.renderToString(e)}var $r=["corporate","silk","dark"],Ar=()=>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:$r.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))})]}),pe=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:s,basePath:o="/"}=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:o,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsxRuntime.jsx("div",{class:"flex-none",children:jsxRuntime.jsx(Ar,{})})]}),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}),s&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${s.type==="success"?"alert-success":s.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:s.message}),s.action&&jsxRuntime.jsx("a",{href:s.action.href,...s.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:s.action.label})]}),t]}),jsxRuntime.jsx(yt,{}),jsxRuntime.jsx(Ze,{})]})]})};function ht(e,t){return ue(jsxRuntime.jsx(pe,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function bt(e,t){return ue(jsxRuntime.jsx(pe,{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 wn=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],Or=[{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"}],Pr=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function Er(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return Or;case "ZodBoolean":return wn;case "ZodArray":return Pr;default:return wn}}var fe="__null__";function Ir(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="${fe}"]');if(!o){o=document.createElement('option');o.value='${fe}';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='${fe}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${fe}"][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!=='${fe}')?i.dataset._prev:'';}}})(this)`}function Dr(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 Be({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:Ir(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Nr({col:e,active:t}){let n=t?.value??"",r=n===fe,s=`fv_input_${e.name.replace(/\./g,"__")}`,o=t?.op,a=o==="in"||o==="not-in";if(e.enumValues&&e.enumValues.length>0){if(a){let d=new Set(n.split(",").map(f=>f.trim()).filter(Boolean)),i=`eg_${e.name.replace(/\./g,"__")}`;return jsxRuntime.jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{type:"hidden",id:s,name:`fv_${e.name}`,value:n}),e.enumValues.map(f=>jsxRuntime.jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:f,checked:d.has(f),"data-enum-group":i,onchange:Dr(s,i)}),jsxRuntime.jsx("span",{children:f})]},f))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:s,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:fe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Be,{inputId:s,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:s,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:fe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Be,{inputId:s,active:r})]});if(e.zodType==="ZodArray"){let d=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:s,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:s,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(Be,{inputId:s,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:s,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsxRuntime.jsx(Be,{inputId:s,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:s,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0}),e.nullable&&jsxRuntime.jsx(Be,{inputId:s,active:r})]})}function vt({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let s=Object.fromEntries(n.map(i=>[i.field,i])),o=n.length>0,a=n.length>=2||r&&o,d=t.filter(i=>i.zodType!=="ZodObject"&&i.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:o?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",o&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:d.map(i=>{let f=Er(i.zodType),g=s[i.name],x=g?.op??f[0].value;return jsxRuntime.jsxs("div",{class:"flex flex-col gap-1.5",children:[jsxRuntime.jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:i.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[f.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:f.map(h=>jsxRuntime.jsx("option",{value:h.value,selected:h.value===x,children:h.label},h.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:f[0].value}),jsxRuntime.jsx(Nr,{col:i,active:g})]})]},i.name)})}),jsxRuntime.jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),o&&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 xt(e,t,n,r,s,o){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,d=n==="create"?[{label:"Repositories",href:s},{label:e,href:`${s}/${e}`},{label:"New document"}]:[{label:"Repositories",href:s},{label:e,href:`${s}/${e}`},{label:`Edit ${r??""}`}];return ue(jsxRuntime.jsx(pe,{opts:{title:a,breadcrumb:d,basePath:s,flash:o},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}et();mt();function Rt(e,t,n){let r=new URLSearchParams;for(let s of e)r.set(`fv_${s.field}`,s.value),r.set(`fo_${s.field}`,s.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function Sn(e,t,n,r,s){let o=Rt(e,r,s);return o.set("cursor",t),o.set("dir",n),`?${o.toString()}`}function _r(e,t,n,r){let s=Rt(n,void 0,r);return t?.field===e?t.dir==="asc"&&(s.set("ob",e),s.set("od","desc")):(s.set("ob",e),s.set("od","asc")),`?${s.toString()}`}function jr(e,t,n){return `?${Rt(t,n,e).toString()}`}function wt(e,t,n,r,s,o,a=[],d=[],i=false,f=[],g,x,h,b,m,y,c){let p=`${r}/${e}`,u=`${p}/create`,l={};if(c)for(let w of n)l[w]=Ae(Oe(c,w));let v=(y??[]).filter(w=>{let S=l[w]??Ae(Oe(c,w));return S==="string"||S==="number"||S==="bigint"||S==="boolean"||S==="enum"||S==="literal"}),R=v.length>0,T=i,$=T||R,O=v.map(w=>{let S=Oe(c,w),k=Ae(S),A=a.find(E=>E.name===w);return {name:w,type:k,enumValues:A?.enumValues??null,nullable:A?.nullable??false}});return ue(jsxRuntime.jsxs(pe,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:o},children:[a.length>0&&jsxRuntime.jsx(vt,{action:p,columnMeta:a,activeFilters:d,isGroup:b}),h&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${h.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:h.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:h.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:h.message})]}),h.indexUrl&&jsxRuntime.jsx("a",{href:h.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",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 m=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:m})]})," ","document",(typeof m=="number"?m: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(w=>jsxRuntime.jsx("a",{href:jr(w,d,g),class:`join-item btn btn-xs ${x===w?"btn-active btn-primary":"btn-outline"}`,children:w},w))})]})]}),jsxRuntime.jsx("a",{href:u,class:"btn btn-primary btn-sm",children:"+ New"})]}),$&&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 m=="number"?String(m):"","data-frs-page-size":String(x??t.length),"data-frs-allow-delete":T?"1":"0","data-frs-allow-update":R?"1":"0","data-frs-fields":JSON.stringify(O),"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 m=="number"&&m>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 ",m," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",m??"?"," 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:[R&&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:[$&&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((w,S)=>{let k=g?.field===w,A=k?g.dir==="asc"?" \u25B2":" \u25BC":"";return jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxRuntime.jsxs("a",{href:_r(w,g,d,x),class:`hover:text-base-content inline-flex items-center gap-0.5${k?" text-primary font-bold":""}`,children:[w,A]})},S)}),f.map((w,S)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:w.column},`rel-${S}`)),jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsxRuntime.jsx("tbody",{children:t.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:n.length+f.length+1+($?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((w,S)=>{let k=String(w.docId??w.id??""),A=`${r}/${e}/${encodeURIComponent(k)}/edit`,E=`${r}/${e}/${encodeURIComponent(k)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":k,children:[$&&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:k,"aria-label":`Select ${k}`})}),n.map((C,B)=>{let D=w[C],_=l[C],oe=_?Me(_,D):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx($e,{val:D,mismatch:oe})},B)}),f.map((C,B)=>{let D=w[C.key];if(D==null||D==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${B}`);let _=C.type==="one"?`${r}/${C.targetRepo}/${encodeURIComponent(String(D))}/edit`:`${r}/${C.targetRepo}?fv_${C.targetKey}=${encodeURIComponent(String(D))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:_,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":C.type,"data-frs-rel-repo":C.targetRepo,"data-frs-rel-fk":C.targetKey,"data-frs-rel-val":String(D),"data-frs-rel-label":C.column,children:C.column})},`rel-${B}`)}),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:A,class:"btn btn-xs btn-outline",children:"Edit"}),i&&jsxRuntime.jsx("form",{method:"post",action:E,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},S)})})]})}),(s.hasPrev||s.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:[s.hasPrev?jsxRuntime.jsx("a",{href:Sn(d,s.prevCursor,"prev",g,x),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),s.hasNext?jsxRuntime.jsx("a",{href:Sn(d,s.nextCursor,"next",g,x),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof m=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[m," total document",m!==1?"s":"",d.length>0?" matching filters":""]})]}),$&&R&&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"}),v.map(w=>jsxRuntime.jsx("option",{value:w,children:w},w))]})]}),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 nt(e,t){return ht(e,t)}function St(e,t){return bt(e,t)}function Tt(e,t,n,r,s,o,a,d,i,f,g,x,h,b,m,y,c){return wt(e,t,n,r,s,o,a,d,i,f,g,x,h,b,m,y,c)}function me(e,t,n,r,s,o){return xt(e,t,n,r,s,o)}var Fr=new Set(["<","<=",">",">=","!="]),Zr=new Set(["array-contains","array-contains-any"]);function kt(e){return e==="desc"?"DESCENDING":"ASCENDING"}function Mr(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function Br(e,t,n,r,s){let o=[],a=new Set;for(let i of r)if(i.op==="=="||i.op==="in"||i.op==="not-in"){if(a.has(i.field))continue;a.add(i.field),o.push({fieldPath:i.field,order:"ASCENDING"});}for(let i of r)if(Zr.has(i.op)){if(a.has(i.field))continue;a.add(i.field),o.push({fieldPath:i.field,arrayConfig:"CONTAINS"});}for(let i of r)if(Fr.has(i.op)){if(a.has(i.field))continue;a.add(i.field);let f=s?.field===i.field?kt(s.dir):"ASCENDING";o.push({fieldPath:i.field,order:f});}if(s&&!a.has(s.field)&&o.push({fieldPath:s.field,order:kt(s.dir)}),o.length===1&&n)return Ur(e,t,o[0]);let d=s&&o.some(i=>i.fieldPath===s.field)?kt(s.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:d}),qr(e,t,n,o)}function qr(e,t,n,r,s="(default)"){let o=`projects/${e}/databases/${s}/collectionGroups/${t}/indexes/_`,a=[...At(1,o),...rt(2,n?2:1)];for(let f of r)a.push(...Tn(3,kn(f)));let d=s==="(default)"?"-default-":s,i=encodeURIComponent(Cn(a));return `https://console.firebase.google.com/project/${e}/firestore/databases/${d}/indexes?create_composite=${i}`}function Kr(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function Ct(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function $t(e,t){return e<<3|t}function At(e,t){let n=Array.from(new TextEncoder().encode(t));return [$t(e,2),...Ct(n.length),...n]}function rt(e,t){return [$t(e,0),...Ct(t)]}function Tn(e,t){return [$t(e,2),...Ct(t.length),...t]}function kn(e){let t=[...At(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...rt(3,1)):t.push(...rt(2,e.order==="DESCENDING"?2:1)),t}function Cn(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 Ur(e,t,n,r="(default)"){let s=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,o=[...At(1,s),...rt(2,2),...Tn(3,kn(n))],a=r==="(default)"?"-default-":r,d=encodeURIComponent(Cn(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${a}/indexes/automatic?create_exemption=${d}`}function Lr(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 s of n)if(typeof s=="string"&&s.length>0)return s;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function we(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function qe(e,t){let n=e??{},r=we(e),s;if(r&&(s=n.message?Kr(n.message):void 0,!s)){let o=Lr(t.ref);if(o){let a=Mr(t.path);s=Br(o,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:s}}var $n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Hr(){let e="";for(let t=0;t<20;t++)e+=$n.charAt(Math.floor(Math.random()*$n.length));return e}function Ot(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),s=[];for(let o=1;o<r.length;o+=2)s.push(r[o]);return s.length>0?s:void 0}async function Ke(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 o=await e.repo.get[r](t);if(o)return o}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Pt(e,t,n){let r=e.documentKey??"docId",s=qe(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return s.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...s.indexUrl?{action:{href:s.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:s.message}}function z(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Et(e,t){e.status(302).set("Location",t).send("");}function It(e,t){let n=t.shape,r={};for(let[s,o]of Object.entries(n)){let a=Nt(o);if(a==="ZodObject"){if(e[s+"__isnull"]==="1"){r[s]=null;continue}let f={},g=false;for(let[b,m]of Object.entries(e))b.startsWith(`${s}.`)&&(f[b.slice(s.length+1)]=m,g=true);if(g){let b=o;for(;;){let m=M(b);if(m==="ZodOptional"||m==="ZodNullable"||m==="ZodDefault")b=U(b);else break}r[s]=It(f,b);continue}let x=e[s],h=Array.isArray(x)?x[x.length-1]:x;if(h)try{r[s]=JSON.parse(h);}catch{r[s]=h;}continue}let d=e[s],i=Array.isArray(d)?d[d.length-1]:d;if(e[s+"__isnull"]==="1"){r[s]=null;continue}if(i===void 0||i===""){a==="ZodBoolean"&&(r[s]=false);continue}switch(a){case "ZodBoolean":i==="__null__"?r[s]=null:r[s]=i==="true"||i==="on"||i==="1";break;case "ZodNumber":case "ZodBigInt":r[s]=Number(i);break;case "ZodDate":r[s]=new Date(i);break;case "ZodArray":try{r[s]=JSON.parse(i);}catch{r[s]=i;}break;default:if(i.startsWith("{")||i.startsWith("["))try{r[s]=JSON.parse(i);break}catch{}r[s]=i;}}return r}function An(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 Nt(e){let t=e;for(;;){let n=M(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=U(t);else return n}}function Gr(e){let t=e;for(;;){let n=M(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=U(t);else return t}}function Pn(e){let t=e;for(;;){let n=M(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=U(t);continue}return false}}function En(e){let t=Gr(e),n=M(t);if(n==="ZodEnum"){let r=Ne(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=_e(t),s=Object.values(r).filter(o=>typeof o=="string");return s.length>0?s:void 0}if(n==="ZodLiteral"){let r=Je(t);return typeof r=="string"?[r]:void 0}}function In(e,t,n=""){let r={};for(let s of Object.keys(t.shape)){let o=n?`${n}.${s}`:s,a=e[s];if(a===null){r[o]="__null__";continue}if(a===void 0)continue;let d=t.shape[s];for(;;){let f=M(d);if(f==="ZodOptional"||f==="ZodNullable"||f==="ZodDefault")d=U(d);else break}let i=M(d);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let f=In(a,d,o);Object.assign(r,f);}else if(i==="ZodDate"){let f=An(a);f!==null&&(r[o]=f);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let f=An(a);r[o]=f??JSON.stringify(a,null,2);}else typeof a=="object"?r[o]=JSON.stringify(a,null,2):r[o]=String(a);}return r}function Dt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Dt(n.nested,t):void 0}))}function Wr(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[s,o]of Object.entries(e)){if(!s.startsWith("fv_"))continue;let a=s.slice(3);if(!t.has(a))continue;let d=(o??"").trim();if(!d)continue;let i=e[`fo_${a}`]??"==",f=n.has(i)?i:"==";r.push({field:a,op:f,value:d});}return r}function On(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 s=r.value.split(",").map(o=>o.trim()).filter(o=>o!==""&&o!==t).map(o=>n(o));return [r.field,r.op,s]}return [r.field,r.op,n(r.value)]})}function Dn(e,t,n=""){let r=[];for(let s of e){let o=n?`${n}.${s}`:s,a=t.shape[s];if(!a){r.push({name:o,zodType:"ZodString"});continue}let d=Nt(a);if(d==="ZodObject"){let i=a;for(;;){let g=M(i);if(g==="ZodOptional"||g==="ZodNullable"||g==="ZodDefault")i=U(i);else break}let f=J(i);r.push(...Dn(Object.keys(f),i,o));}else r.push({name:o,zodType:d,nullable:Pn(a),enumValues:En(a)});}return r}function Vr(e,t){let n=t.split("."),r=e;for(let s of n){for(;;){let a=M(r);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")r=U(r);else break}let o=J(r);if(!(s in o))return null;r=o[s];}return r}function Se(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let o of t){let a=o.indexOf(".");if(a===-1)n.push(o);else {let d=o.slice(0,a),i=o.slice(a+1);r.has(d)||r.set(d,[]),r.get(d).push(i);}}let s={};for(let o of n)o in e.shape&&(s[o]=e.shape[o]);for(let[o,a]of r){if(!(o in e.shape))continue;let d=e.shape[o];for(;;){let i=M(d);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")d=U(d);else break}if(M(d)!=="ZodObject"){s[o]=e.shape[o];continue}s[o]=Se(d,a);}return zod.z.object(s)}function ye(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=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 `/${o}/${a}/${d}${n}`}let r=process.env.K_SERVICE,s=e.hostname??e.headers?.host??"";return r&&s.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function Nn(e,t){let n=(c,p)=>{let u=ye(c,t),l=Object.values(e).map(v=>({name:v.name,path:v.path}));z(p,St(l,u));},r=async(c,p)=>{let u=c.params.repoName;if(!u){z(p,"Bad request",400);return}let l=e[u];if(!l){z(p,"Repository not found",404);return}let v=l.pageSize??25,R=c.query??{},T=R.cursor,$=R.dir==="prev"?"prev":"next",O=R.ob??"",w=R.od==="desc"?"desc":"asc",S=O?{field:O,dir:w}:void 0,k=parseInt(R.ps??""),A=Number.isFinite(k)&&k>0?Math.min(k,200):v,E=l.listColumns??Object.keys(l.schema.shape),C=l.documentKey??"docId",B=[C,...E.filter(H=>H!==C)],D=l.filterableFields?(()=>{let H=[];for(let ae of l.filterableFields)(ae.includes(".")||E.includes(ae))&&H.push(ae);return H})():E,_=(()=>{let H=[];for(let ae of D)if(ae.includes(".")){let ke=Vr(l.schema,ae);H.push({name:ae,zodType:ke?Nt(ke):"ZodString",nullable:ke?Pn(ke):false,enumValues:ke?En(ke):void 0});}else H.push(...Dn([ae],l.schema));return H})(),oe=new Set(_.map(H=>H.name)),Ie=Wr(R,oe),Qe=On(Ie),Bt;if(T)try{let H=l.repo.ref;typeof H.doc=="function"&&(Bt=await H.doc(T).get());}catch{}let[he,Qn]=await Promise.all([l.repo.query.paginate({pageSize:A,cursor:Bt,direction:$,...Qe.length>0?{where:Qe}:{},...S?{orderBy:[{field:S.field,direction:S.dir}]}:{}}).catch(H=>({queryError:qe(H,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:Ie,sort:S})})),l.repo.aggregate.count(Qe.length>0?{where:Qe}:{}).catch(()=>{})]),Te="queryError"in he,Hn=Te?[]:he.data,Gn=Te?"":he.nextCursor?.id??"",Wn=Te?"":he.prevCursor?.id??"",Vn=Te?he.queryError:void 0,Jn=ye(c,t);z(p,Tt(l.name,Hn,B,Jn,{hasPrev:Te?false:he.hasPrevPage,hasNext:Te?false:he.hasNextPage,prevCursor:Wn,nextCursor:Gn},void 0,_,Ie,l.allowDelete??false,l.relationalMeta,S,A,Vn,l.isGroup,Qn,l.mutableFields,l.schema));},s=(c,p)=>{let u=c.params.repoName;if(!u){z(p,"Bad request",400);return}let l=e[u];if(!l){z(p,"Repository not found",404);return}let v=ye(c,t),R=Se(l.schema,l.createFields),T=re(R),$=`${v}/${l.name}/create`,O=de(T,$,"POST","Create document");z(p,me(l.name,O,"create",null,v));},o=async(c,p)=>{let u=c.params.repoName;if(!u){z(p,"Bad request",400);return}let l=e[u];if(!l){z(p,"Repository not found",404);return}let v=ye(c,t),R=c.body??{},T=It(R,l.schema),$=Se(l.schema,l.createFields),O=$.safeParse(T);if(!O.success){let w=re($),S=`${v}/${l.name}/create`,k=de(w,S,"POST","Create document"),A=O.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`).join(", ");z(p,me(l.name,k,"create",null,v,{type:"error",message:`Validation error: ${A}`}),422);return}try{if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let w={...O.data};l.createdKey&&(w[l.createdKey]=new Date);let S=l.parentKeys.filter(C=>!w[C]);if(S.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${S.join(", ")}`);let k=l.parentKeys.map(C=>w[C]),A=l.documentKey??"docId",E=w[A]||Hr();await l.repo.set(...k,E,w);}else await l.repo.create(O.data);Et(p,`${v}/${l.name}?flash=created`);}catch(w){let S=Se(l.schema,l.createFields),k=re(S),A=`${v}/${l.name}/create`,E=de(k,A,"POST","Create document");z(p,me(l.name,E,"create",null,v,{type:"error",message:`Save error: ${w.message}`}),500);}},a=async(c,p)=>{let u=c.params.repoName,l=c.params.id;if(!u||!l){z(p,"Bad request",400);return}let v=e[u];if(!v){z(p,"Repository not found",404);return}let R=ye(c,t),T=null;try{T=await Ke(v,l);}catch(A){let E=Pt(v,l,A),C=we(A)?424:500;z(p,nt("",{title:`Edit ${v.name} / ${l}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:v.name,href:`${R}/${v.name}`},{label:`Edit ${l}`}],flash:E}),C);return}if(!T){z(p,"Document not found",404);return}let $=In(T,v.schema),O=Se(v.schema,v.mutableFields),w=Dt(re(O),$),S=`${R}/${v.name}/${encodeURIComponent(l)}/edit`,k=de(w,S,"POST","Save changes");z(p,me(v.name,k,"edit",l,R));},d=async(c,p)=>{let u=c.params.repoName,l=c.params.id;if(!u||!l){z(p,"Bad request",400);return}let v=e[u];if(!v){z(p,"Repository not found",404);return}let R=ye(c,t),T=c.body??{},$=It(T,v.schema),O=Se(v.schema,v.mutableFields),S=O.partial().safeParse($);if(!S.success){let k=Object.fromEntries(Object.entries(T).map(([D,_])=>[D,Array.isArray(_)?_.join(","):_??""])),A=Dt(re(O),k),E=`${R}/${v.name}/${encodeURIComponent(l)}/edit`,C=de(A,E,"POST","Save changes"),B=S.error.issues.map(D=>`${D.path.join(".")}: ${D.message}`).join(", ");z(p,me(v.name,C,"edit",l,R,{type:"error",message:`Validation error: ${B}`}),422);return}try{let k=await Ke(v,l),A=(k&&Ot(k,v.pathKey))??[l];await v.repo.update(...A,S.data),Et(p,`${R}/${v.name}?flash=updated`);}catch(k){let A=Se(v.schema,v.mutableFields),E=re(A),C=`${R}/${v.name}/${encodeURIComponent(l)}/edit`,B=de(E,C,"POST","Save changes"),D=we(k)?Pt(v,l,k):{type:"error",message:`Save error: ${k.message}`},_=we(k)?424:500;z(p,me(v.name,B,"edit",l,R,D),_);}},i=async(c,p)=>{let u=c.params.repoName,l=c.params.id;if(!u||!l){z(p,"Bad request",400);return}let v=e[u];if(!v){z(p,"Repository not found",404);return}if(!v.allowDelete){z(p,"Delete is not allowed for this repository",403);return}let R=ye(c,t);try{let T=await Ke(v,l),$=(T&&Ot(T,v.pathKey))??[l];await v.repo.delete(...$),Et(p,`${R}/${v.name}?flash=deleted`);}catch(T){let $=we(T)?Pt(v,l,T):{type:"error",message:`Delete error: ${T.message}`},O=we(T)?424:500;z(p,nt("",{title:`Delete ${v.name} / ${l}`,basePath:R,breadcrumb:[{label:"Repositories",href:R},{label:v.name,href:`${R}/${v.name}`},{label:`Delete ${l}`}],flash:$}),O);}},f=async(c,p)=>{let u=c.params.repoName;if(!u){z(p,"Bad request",400);return}let l=e[u];if(!l){z(p,"Repository not found",404);return}let v=ye(c,t),R=c.query,T=R?.type==="many"?"many":"one",$=Math.max(1,Math.min(100,Number(R?.ps??25)||25)),O=l.listColumns??Object.keys(J(l.schema)),{PanelOne:w,PanelMany:S}=await Promise.resolve().then(()=>(gt(),xn)),{renderToString:k}=await import('hono/jsx/dom/server');if(T==="one"){let _=String(R?.id??"");if(!_){z(p,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let oe=await Ke(l,_),Ie=k(w({doc:oe,repoName:l.name,basePath:v,schema:l.schema,columns:O}));z(p,Ie);}catch(oe){z(p,`<div class='p-6 text-error text-sm'>Error: ${oe.message}</div>`,500);}return}let A=String(R?.fk??""),E=String(R?.fv??"");if(!A||!E){z(p,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let C=R?.cursor??"",B=R?.dir==="prev"?"prev":"next",D;if(C)try{let _=l.repo.ref;typeof _.doc=="function"&&(D=await _.doc(C).get());}catch{}try{let _=await l.repo.query.paginate({pageSize:$,cursor:D,direction:B,where:[[A,"==",Jr(E)]]}),oe=k(S({docs:_.data,repoName:l.name,basePath:v,fk:A,fv:E,columns:O,schema:l.schema,pagination:{hasPrev:_.hasPrevPage,hasNext:_.hasNextPage,prevCursor:_.prevCursor?.id??"",nextCursor:_.nextCursor?.id??"",pageSize:$}}));z(p,oe);}catch(_){z(p,`<div class='p-6 text-error text-sm'>Error: ${_.message}</div>`,500);}},g=async(c,p)=>{let u=[];for(let l of p){let v;if(c.isGroup||c.parentKeys?.length){let R=await Ke(c,l);v=R?Ot(R,c.pathKey):void 0;}v||(v=[l]);try{let R=c.repo.documentRef(...v);R&&u.push(R);}catch{}}return u},x=async(c,p)=>{let u=On(p),l=c.documentKey??"docId",v=[],R;for(;;){let T=await c.repo.query.paginate({pageSize:500,cursor:R,direction:"next",...u.length>0?{where:u}:{}});for(let $ of T.data){let O=String($[l]??$.id??"");O&&v.push(O);}if(!T.hasNextPage||!T.nextCursor)break;R=T.nextCursor;}return v},h=async(c,p)=>{let u=c.params.repoName;if(!u){V(p,{error:"Bad request"},400);return}let l=e[u];if(!l){V(p,{error:"Repository not found"},404);return}if(!l.allowDelete){V(p,{error:"Delete is not allowed for this repository"},403);return}let v=c.body??{};try{let R=await m(l,v);if(R.length===0){V(p,{deleted:0});return}let T=await g(l,R);for(let $=0;$<T.length;$+=500)await l.repo.bulk.delete(T.slice($,$+500));V(p,{deleted:T.length});}catch(R){V(p,{error:R.message},500);}},b=async(c,p)=>{let u=c.params.repoName;if(!u){V(p,{error:"Bad request"},400);return}let l=e[u];if(!l){V(p,{error:"Repository not found"},404);return}let v=c.body??{},R=String(v.field??"");if(!R){V(p,{error:"Missing 'field'"},400);return}if(!l.mutableFields||!l.mutableFields.includes(R)){V(p,{error:`Field '${R}' is not bulk-updatable`},403);return}let T=l.schema.shape?.[R],$=v.value;if(T){let O=T.safeParse(v.value);if(!O.success){V(p,{error:`Invalid value for '${R}': ${O.error.message}`},400);return}$=O.data;}try{let O=await m(l,v);if(O.length===0){V(p,{updated:0});return}let S=(await g(l,O)).map(k=>({docRef:k,data:{[R]:$}}));for(let k=0;k<S.length;k+=500)await l.repo.bulk.update(S.slice(k,k+500));V(p,{updated:S.length});}catch(O){V(p,{error:O.message},500);}};async function m(c,p){if(p.selectAll){let u=y(p.filters,c);return await x(c,u)}return Array.isArray(p.ids)?p.ids.filter(u=>typeof u=="string"&&!!u):[]}function y(c,p){if(!Array.isArray(c))return [];let u=new Set((p.filterableFields??Object.keys(J(p.schema))).map(R=>String(R))),l=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),v=[];for(let R of c)R&&typeof R=="object"&&typeof R.field=="string"&&u.has(R.field)&&typeof R.value=="string"&&l.has(String(R.op))&&v.push({field:R.field,op:R.op,value:R.value});return v}return {handleDashboard:n,handleList:r,handleCreateForm:s,handleCreateSubmit:o,handleEditForm:a,handleEditSubmit:d,handleDelete:i,handlePanel:f,handleBulkDelete:h,handleBulkUpdate:b}}function V(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function Jr(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}async function Xr(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Yr(e){let t={};if(!e)return t;for(let n of e.split("&")){let r=n.indexOf("=");if(r===-1)continue;let s=decodeURIComponent(n.slice(0,r).replace(/\+/g," ")),o=decodeURIComponent(n.slice(r+1).replace(/\+/g," ")),a=t[s];a===void 0?t[s]=o:Array.isArray(a)?a.push(o):t[s]=[a,o];}return t}function _n(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:s,middleware:o=[],httpsOptions:a}=e,d=t==="/"?"":t.replace(/\/$/,""),i={};for(let[h,b]of Object.entries(n)){let m=b.schema??b.repo.schema??null;if(!m)throw new Error(`[createAdminServer] Repository "${h}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let y,c,p;if(b.fieldsConfig){let v=b.fieldsConfig;y=[],c=[],p=[];for(let[R,T]of Object.entries(v))for(let $ of T)$==="filterable"?y.push(R):$==="mutable"?c.push(R):$==="create"&&p.push(R);y.length===0&&(y=void 0),c.length===0&&(c=void 0),p.length===0&&(p=void 0);}let u=(()=>{let v=b.repo._parentKeys;return v&&v.length>0?v:void 0})();if(u&&p)for(let v of u)p.includes(v)||p.push(v);let l={name:h,path:b.path,repo:b.repo,schema:m,documentKey:b.documentKey??"docId",pathKey:b.repo._pathKey??void 0,isGroup:!!b.repo._isGroup,parentKeys:u,createdKey:b.repo._createdKey??void 0,listColumns:b.listColumns,pageSize:b.pageSize,filterableFields:y,mutableFields:c,createFields:p,allowDelete:b.allowDelete??false,relationalMeta:(()=>{if(!b.relationalFields||b.relationalFields.length===0)return;let v=b.repo.relationalKeys??{},R=[];for(let T of b.relationalFields){let $=v[T.key];$&&R.push({key:T.key,column:T.column,targetRepo:String($.repo),targetKey:String($.key),type:$.type});}return R.length>0?R:void 0})()};i[h]=l;}let f=Nn(i,d),g=new X;if(r&&g.use(async(h,b,m)=>{let y=h,c=String(y.headers?.["content-type"]??"");if(c.includes("application/x-www-form-urlencoded")){let p=await Xr(y);h.body=Yr(p);}else if(c.includes("application/json")&&typeof y.body=="string")try{h.body=JSON.parse(y.body);}catch{}await m();}),s)if(typeof s=="function")g.use(s);else {let h=s.realm??"Admin",b="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");g.use((m,y,c)=>{if((m.headers?.authorization??"")!==b){y.status(401).set("WWW-Authenticate",`Basic realm="${h}"`).set("Content-Type","text/plain").send("Unauthorized");return}c();});}for(let h of o)g.use(h);g.get(`${d}/`,f.handleDashboard),g.get(`${d}`,f.handleDashboard),g.get(`${d}/:repoName/_panel`,f.handlePanel),g.post(`${d}/:repoName/_bulk/delete`,f.handleBulkDelete),g.post(`${d}/:repoName/_bulk/update`,f.handleBulkUpdate),g.get(`${d}/:repoName`,f.handleList),g.get(`${d}/:repoName/create`,f.handleCreateForm),g.post(`${d}/:repoName/create`,f.handleCreateSubmit),g.get(`${d}/:repoName/:id/edit`,f.handleEditForm),g.post(`${d}/:repoName/:id/edit`,f.handleEditSubmit),g.post(`${d}/:repoName/:id/delete`,f.handleDelete);let x=async(h,b)=>{await g.handle(h,b);};return a&&(x.httpsOptions=a),x}function jt(e,t,n=200){let r=q(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function Pe(e,t,n,r=200){jt(e,{success:true,data:t,meta:n},r);}function Q(e,t,n=400){jt(e,{success:false,error:t},n);}function _t(e,t,n,r,s){let o=qe(t,n),a=o.type==="index",d=a?424:500,f={success:false,error:a?o.message:s&&t instanceof Error?t.message:r};a&&(f.errorType="index",o.indexUrl&&(f.indexUrl=o.indexUrl)),jt(e,f,d);}var jn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function es(){let e="";for(let t=0;t<20;t++)e+=jn.charAt(Math.floor(Math.random()*jn.length));return e}function Ee(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=>ct(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,s={};for(let[o,a]of Object.entries(r))s[o]=Ee(a);return zod.z.object(s)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(Ee(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Ee(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Ee(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,s=t.defaultValue;if(r){let o=Ee(r);return typeof s=="function"?o.default(s()):o.default(s)}}return e}function ts(e,t,n=[]){let r=e.shape,s={},o=t&&t.length>0?t:Object.keys(r);for(let a of o){if(n.includes(a))continue;let d=a.split(".")[0];d&&r[d]&&(s[d]=r[d]);}return zod.z.object(s)}function zn(e,t,n,r=false,s=[]){try{let o=ts(e,n,s),a=r?o.partial():o;return {success:!0,data:(lt()==="normalize"?Ee(a):a).parse(t)}}catch(o){return o instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${o.issues.map(d=>`${d.path.join(".")}: ${d.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function ns(e,t){let n=[],r=t?new Set(t):null,s={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[o,a]of Object.entries(e)){if(a===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(o))continue;let d=Array.isArray(a)?a[0]:a;if(d===void 0||d==="")continue;let i=o.match(/^(\w+)__(\w+)$/),f,g="==";if(i&&i[1]&&i[2]){f=i[1];let h=i[2];if(s[h])g=s[h];else continue}else if(!i)f=o;else continue;if(r&&!r.has(f))continue;let x=d;g==="in"||g==="not-in"||g==="array-contains-any"?x=d.split(",").map(h=>Fn(h.trim())):x=Fn(d),n.push({field:f,op:g,value:x});}return n}function Fn(e){if(e==="true")return true;if(e==="false")return false;if(e==="null")return null;let t=Number(e);return !isNaN(t)&&e!==""?t:e}function st(e){return e?{docId:e.id}:null}async function Zn(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 s=await r.doc(n).get();return s.exists?s:void 0}catch{return}}function Mn(e,t,n){function r(b,m){return !b||!e[b]?(Q(m,`Repository "${b}" not found`,404),null):e[b]}function s(b,m){if(!m)return;let y=b[m];if(typeof y!="string"||!y)return;let c=y.split("/").filter(Boolean),p=[];for(let u=1;u<c.length;u+=2)p.push(c[u]);return p.length>0?p:void 0}async function o(b,m){let y=`by${b.documentKey.charAt(0).toUpperCase()}${b.documentKey.slice(1)}`,c=b.repo.get[y];if(typeof c=="function")try{let u=await c(m);if(u)return u}catch{}return (await b.repo.query.by({where:[[b.documentKey,"==",m]],limit:1}))[0]??null}async function a(b,m){let y=b.params||{},c=r(y.repoName,m);if(!c)return;let p=[],u;try{let l=b.query??{},v=Math.min(Number(l.pageSize)||c.pageSize,100),R=l.cursor,T=l.direction?.toLowerCase()==="prev"?"prev":"next",$=l.orderBy,O=l.orderDir?.toLowerCase()==="desc"?"desc":"asc",w=l.select,S=w?w.split(",").map(D=>D.trim()):void 0,k;c.allowedIncludes&&l.includes&&(k=(typeof l.includes=="string"?l.includes.split(",").map(_=>_.trim()):Array.isArray(l.includes)?l.includes:[]).filter(_=>typeof _=="string"&&c.allowedIncludes.includes(_)),k?.length===0&&(k=void 0));let A=ns(l,c.filterableFields);p=A.map(D=>({field:D.field,op:D.op,value:String(D.value??"")})),$&&(u={field:$,dir:O});let E={pageSize:v,direction:T};if(R)try{let D=typeof R=="string"?JSON.parse(R):R;E.cursor=await Zn(c,D);}catch{}$&&(E.orderBy=[{field:$,direction:O}]),A.length>0&&(E.where=A.map(D=>[D.field,D.op,D.value])),S&&(E.select=S),k&&(E.include=k);let C=await c.repo.query.paginate(E),B={items:C.data,hasNextPage:C.hasNextPage,hasPrevPage:C.hasPrevPage,nextCursor:st(C.nextCursor),prevCursor:st(C.prevCursor)};Pe(m,B,{pageSize:v,hasMore:C.hasNextPage});}catch(l){_t(m,l,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:p,sort:u},"Failed to fetch documents",n);}}async function d(b,m){let y=b.params||{},c=r(y.repoName,m);if(!c)return;let p=[],u;try{let l=b.body??{},v=Math.min(l.pageSize||c.pageSize,100),R=l.direction==="prev"?"prev":"next";l.where&&(p=l.where.map(w=>({field:String(w[0]),op:w[1],value:String(w[2]??"")}))),l.orderBy&&l.orderBy[0]&&(u={field:l.orderBy[0].field,dir:l.orderBy[0].direction==="desc"?"desc":"asc"});let T={pageSize:v,direction:R};if(l.cursor)try{let w=typeof l.cursor=="string"?JSON.parse(l.cursor):l.cursor;T.cursor=await Zn(c,w);}catch{}if(c.allowedIncludes&&l.includes&&l.includes.length>0){let w=l.includes.filter(S=>typeof S=="string"?c.allowedIncludes.includes(S):typeof S=="object"&&S!==null&&"relation"in S&&typeof S.relation=="string"?c.allowedIncludes.includes(S.relation):!1);w.length>0&&(T.include=w);}if(l.where&&l.where.length>0){if(c.filterableFields){let w=new Set(c.filterableFields),S=l.where.filter(k=>!w.has(k[0]));if(S.length>0){Q(m,`Fields not filterable: ${S.map(k=>k[0]).join(", ")}`,400);return}}T.where=l.where;}if(l.orWhere&&l.orWhere.length>0){if(c.filterableFields){let w=new Set(c.filterableFields),S=l.orWhere.filter(k=>!w.has(k[0]));if(S.length>0){Q(m,`Fields not filterable: ${S.map(k=>k[0]).join(", ")}`,400);return}}T.orWhere=l.orWhere;}if(l.orWhereGroups&&l.orWhereGroups.length>0){if(c.filterableFields){let w=new Set(c.filterableFields);for(let S of l.orWhereGroups){let k=S.filter(A=>!w.has(A[0]));if(k.length>0){Q(m,`Fields not filterable: ${k.map(A=>A[0]).join(", ")}`,400);return}}}T.orWhereGroups=l.orWhereGroups;}l.orderBy&&l.orderBy.length>0&&(T.orderBy=l.orderBy),l.select&&l.select.length>0&&(T.select=l.select);let $=await c.repo.query.paginate(T),O={items:$.data,hasNextPage:$.hasNextPage,hasPrevPage:$.hasPrevPage,nextCursor:st($.nextCursor),prevCursor:st($.prevCursor)};Pe(m,O,{pageSize:v,hasMore:$.hasNextPage});}catch(l){_t(m,l,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:p,sort:u},"Failed to query documents",n);}}async function i(b,m){let y=b.params||{},c=r(y.repoName,m);if(!c)return;let p=y.id;if(!p){Q(m,"Document ID required",400);return}try{let u=await o(c,p);if(!u){Q(m,"Document not found",404);return}Pe(m,u);}catch(u){_t(m,u,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:[{field:c.documentKey,op:"==",value:p}]},"Failed to fetch document",n);}}async function f(b,m){let y=b.params||{},c=r(y.repoName,m);if(c)try{let p=b.body??{},u=zn(c.schema,p,c.createFields,!1,c.systemKeys);if(!u.success){Q(m,u.error,400);return}if(c.validate){let v=await c.validate(u.data,"create");if(v){Q(m,v,400);return}}let l;if(c.isGroup&&c.parentKeys&&c.parentKeys.length>0){let v={...u.data};c.createdKey&&(v[c.createdKey]=new Date);let R=c.parentKeys.filter(O=>!v[O]);if(R.length>0){Q(m,`Missing parent key(s) for subcollection create: ${R.join(", ")}`,400);return}let T=c.parentKeys.map(O=>v[O]),$=v[c.documentKey]||es();l=await c.repo.set(...T,$,v);}else l=await c.repo.create(u.data);Pe(m,l,void 0,201);}catch(p){let u=n&&p instanceof Error?p.message:"Failed to create document";Q(m,u,500);}}async function g(b,m,y){let c=b.params||{},p=r(c.repoName,m);if(!p)return;let u=c.id;if(!u){Q(m,"Document ID required",400);return}try{let l=b.body??{},v=zn(p.schema,l,p.mutableFields,y,p.systemKeys);if(!v.success){Q(m,v.error,400);return}if(p.validate){let O=await p.validate(v.data,"update");if(O){Q(m,O,400);return}}let R=await o(p,u),T=(R&&s(R,p.pathKey))??[u],$=await p.repo.update(...T,v.data);Pe(m,$);}catch(l){let v=n&&l instanceof Error?l.message:"Failed to update document";Q(m,v,500);}}async function x(b,m){let y=b.params||{},c=r(y.repoName,m);if(!c)return;if(!c.allowDelete){Q(m,"Delete not allowed for this repository",403);return}let p=y.id;if(!p){Q(m,"Document ID required",400);return}try{let u=await o(c,p),l=(u&&s(u,c.pathKey))??[p];await c.repo.delete(...l),Pe(m,{deleted:!0});}catch(u){let l=n&&u instanceof Error?u.message:"Failed to delete document";Q(m,l,500);}}function h(b,m){m.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:a,handleQuery:d,handleGet:i,handleCreate:f,handleUpdate:g,handleDelete:x,handleOptions:h}}function zt(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 ee(e){return {$ref:`#/components/schemas/${e}`}}function W(e){return {description:e,content:{"application/json":{schema:ee("ErrorResponse")}}}}function Le(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function Bn(e){return {description:"Paginated list of documents",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:{type:"object",properties:{items:{type:"array",items:e},nextCursor:{oneOf:[{type:"object"},{type:"null"}]},prevCursor:{oneOf:[{type:"object"},{type:"null"}]},hasNextPage:{type:"boolean"},hasPrevPage:{type:"boolean"}},required:["items","hasNextPage","hasPrevPage"]},meta:{type:"object",properties:{pageSize:{type:"integer"},hasMore:{type:"boolean"},cursor:{oneOf:[{type:"string"},{type:"null"}]}}}},required:["success","data"]}}}}}function rs(e){return [{name:"pageSize",in:"query",schema:{type:"integer",default:e.pageSize,maximum:100},description:"Number of items per page"},{name:"cursor",in:"query",schema:{type:"string"},description:"Base64 pagination cursor"},{name:"orderBy",in:"query",schema:{type:"string"},description:"Field name to order by"},{name:"orderDir",in:"query",schema:{type:"string",enum:["asc","desc"]},description:"Order direction"},{name:"select",in:"query",schema:{type:"string"},description:"Comma-separated list of fields to return"}]}function ss(e){let t=e.filterableFields??Object.keys(e.schema.shape),n=["eq","ne","lt","lte","gt","gte","in","nin","contains"],r=[];for(let s of t){r.push({name:s,in:"query",schema:{type:"string"},description:`Filter by ${s} (equality)`});for(let o of n)r.push({name:`${s}__${o}`,in:"query",schema:{type:"string"},description:`Filter ${s} with operator ${o}`});}return r}function os(){return {type:"object",properties:{where:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3},description:"AND conditions: [field, operator, value][]"},orWhere:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3},description:"Simple OR conditions (each independently OR'd)"},orWhereGroups:{type:"array",items:{type:"array",items:{type:"array",items:{},minItems:3,maxItems:3}},description:"Advanced OR groups (AND within, OR across groups)"},orderBy:{type:"array",items:{type:"object",properties:{field:{type:"string"},direction:{type:"string",enum:["asc","desc"]}},required:["field"]}},select:{type:"array",items:{type:"string"},description:"Fields to select (projection)"},pageSize:{type:"integer",maximum:100,description:"Number of items per page"},cursor:{oneOf:[{type:"string"},{type:"object"}],description:"Pagination cursor"},direction:{type:"string",enum:["next","prev"],description:"Pagination direction"},includes:{type:"array",items:{oneOf:[{type:"string"},{type:"object",properties:{relation:{type:"string"},select:{type:"array",items:{type:"string"}}},required:["relation"]}]},description:"Relations to include (populate)"}}}}function as(e,t,n,r,s){let o={},a=e.name,d=`${t}/${e.name}`,i=`${d}/{${e.documentKey}}`,f={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};o[d]={get:{operationId:`list${ge(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...rs(e),...ss(e)],responses:{200:Bn(ee(n)),500:W("Internal server error")}},post:{operationId:`create${ge(e.name)}`,summary:`Create a ${se(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ee(r??n)}}},responses:{201:Le("Document created",ee(n)),400:W("Validation error"),500:W("Internal server error")}}},o[`${d}/query`]={post:{operationId:`query${ge(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ee("QueryRequestBody")}}},responses:{200:Bn(ee(n)),400:W("Invalid query"),500:W("Internal server error")}}};let g={};return g.get={operationId:`get${ge(se(e.name))}`,summary:`Get a single ${se(e.name)}`,tags:[a],parameters:[f],responses:{200:Le("Document found",ee(n)),404:W("Document not found"),500:W("Internal server error")}},g.put={operationId:`update${ge(se(e.name))}`,summary:`Update a ${se(e.name)} (full replace)`,tags:[a],parameters:[f],requestBody:{required:true,content:{"application/json":{schema:ee(s??n)}}},responses:{200:Le("Document updated",ee(n)),400:W("Validation error"),404:W("Document not found"),500:W("Internal server error")}},g.patch={operationId:`patch${ge(se(e.name))}`,summary:`Partially update a ${se(e.name)}`,tags:[a],parameters:[f],requestBody:{required:true,content:{"application/json":{schema:{allOf:[ee(s??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Le("Document patched",ee(n)),400:W("Validation error"),404:W("Document not found"),500:W("Internal server error")}},e.allowDelete&&(g.delete={operationId:`delete${ge(se(e.name))}`,summary:`Delete a ${se(e.name)}`,tags:[a],parameters:[f],responses:{200:Le("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:W("Document not found"),500:W("Internal server error")}}),o[i]=g,o}function Zt(e,t,n={}){let{title:r="CRUD API",version:s="1.0.0",description:o,servers:a,auth:d=false}=n,i=t==="/"?"":t.replace(/\/$/,""),f={},g={},x=[];f.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},f.QueryRequestBody=os();for(let[y,c]of Object.entries(e)){let p=ge(se(y)),u=`${p}Create`,l=`${p}Update`;f[p]=zt(c.schema);let v=S=>{let k=S&&S.length>0?S:Object.keys(c.schema.shape),A={};for(let E of k){let C=E.split(".")[0];C&&c.schema.shape[C]&&!c.systemKeys.includes(C)&&(A[C]=c.schema.shape[C]);}return A},R=null,T=v(c.createFields);Object.keys(T).length>0&&(f[u]=zt(zod.z.object(T)),R=u);let $=null,O=v(c.mutableFields);Object.keys(O).length>0&&(f[l]=zt(zod.z.object(O)),$=l);let w=as(c,i,p,R,$);Object.assign(g,w),x.push({name:y,description:`Operations on ${y} (collection: ${c.path})`});}let h={},b;return d==="basic"?(h.basicAuth={type:"http",scheme:"basic"},b=[{basicAuth:[]}]):d==="bearer"&&(h.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},b=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:s,...o?{description:o}:{}},...a&&a.length>0?{servers:a}:{},paths:g,components:{schemas:f,...Object.keys(h).length>0?{securitySchemes:h}:{}},...b?{security:b}:{},tags:x}}function ge(e){return e.charAt(0).toUpperCase()+e.slice(1)}function se(e){return e.endsWith("ies")?e.slice(0,-3)+"y":e.endsWith("ses")||e.endsWith("xes")||e.endsWith("zes")?e.slice(0,-2):e.endsWith("s")&&!e.endsWith("ss")?e.slice(0,-1):e}function is(e,t){return `<!DOCTYPE html>
|
|
1135
|
+
`;function Be(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:Dn}})}xt();function ue(e){return "<!DOCTYPE html>"+server.renderToString(e)}var eo=["corporate","silk","dark"],to=()=>jsxRuntime.jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxRuntime.jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxRuntime.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:"size-4",children:[jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"}),jsxRuntime.jsx("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),jsxRuntime.jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsxRuntime.jsx("ul",{tabIndex:0,class:"dropdown-content menu menu-sm bg-base-100 text-base-content rounded-box z-50 mt-2 w-40 p-1 shadow-lg border border-base-300",children:eo.map(e=>jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsxRuntime.jsx("span",{children:e}),jsxRuntime.jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),pe=({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(to,{})})]}),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,c)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},c):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},c))})}),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(vt,{basePath:s}),jsxRuntime.jsx(Be,{})]})]})};function wt(e,t){return ue(jsxRuntime.jsx(pe,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Rt(e,t){return ue(jsxRuntime.jsx(pe,{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 jn=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],no=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"<",label:"<"},{value:"<=",label:"\u2264"},{value:">",label:">"},{value:">=",label:"\u2265"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],ro=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function oo(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return no;case "ZodBoolean":return jn;case "ZodArray":return ro;default:return jn}}var fe="__null__";function so(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="${fe}"]');if(!o){o=document.createElement('option');o.value='${fe}';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='${fe}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${fe}"][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!=='${fe}')?i.dataset._prev:'';}}})(this)`}function ao(e,t){return `(function(){var h=document.getElementById('${e}');var boxes=document.querySelectorAll('input[data-enum-group="${t}"]');h.value=Array.from(boxes).filter(function(b){return b.checked;}).map(function(b){return b.value;}).join(',');})()`}function He({inputId:e,active:t}){return jsxRuntime.jsxs("label",{class:"flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/60 hover:text-base-content border border-base-300 rounded-md px-1.5 py-1 shrink-0 leading-none h-8",title:"Filter where field IS NULL",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:so(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function io({col:e,active:t}){let n=t?.value??"",r=n===fe,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 c=new Set(n.split(",").map(f=>f.trim()).filter(Boolean)),i=`eg_${e.name.replace(/\./g,"__")}`;return jsxRuntime.jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{type:"hidden",id:o,name:`fv_${e.name}`,value:n}),e.enumValues.map(f=>jsxRuntime.jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:f,checked:c.has(f),"data-enum-group":i,onchange:ao(o,i)}),jsxRuntime.jsx("span",{children:f})]},f))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(c=>jsxRuntime.jsx("option",{value:c,selected:n===c,children:c},c)),e.nullable&&jsxRuntime.jsx("option",{value:fe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsxRuntime.jsx("option",{value:fe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let c=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:c?"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,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0}),e.nullable&&jsxRuntime.jsx(He,{inputId:o,active:r})]})}function St({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(i=>[i.field,i])),s=n.length>0,a=n.length>=2||r&&s,c=t.filter(i=>i.zodType!=="ZodObject"&&i.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:c.map(i=>{let f=oo(i.zodType),u=o[i.name],g=u?.op??f[0].value;return jsxRuntime.jsxs("div",{class:"flex flex-col gap-1.5",children:[jsxRuntime.jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:i.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[f.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:f.map(b=>jsxRuntime.jsx("option",{value:b.value,selected:b.value===g,children:b.label},b.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:f[0].value}),jsxRuntime.jsx(io,{col:i,active:u})]})]},i.name)})}),jsxRuntime.jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),s&&jsxRuntime.jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),a&&jsxRuntime.jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function Tt(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,c=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 ue(jsxRuntime.jsx(pe,{opts:{title:a,breadcrumb:c,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}})})})}))}nt();bt();function kt(e,t,n){let r=new URLSearchParams;for(let o of e)r.set(`fv_${o.field}`,o.value),r.set(`fo_${o.field}`,o.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function Fn(e,t,n,r,o){let s=kt(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function lo(e,t,n,r){let o=kt(n,void 0,r);return t?.field===e?t.dir==="asc"&&(o.set("ob",e),o.set("od","desc")):(o.set("ob",e),o.set("od","asc")),`?${o.toString()}`}function co(e,t,n){return `?${kt(t,n,e).toString()}`}function Ct(e,t,n,r,o,s,a=[],c=[],i=false,f=[],u,g,b,h,m,v,d){let y=`${r}/${e}`,p=`${y}/create`,l={};if(d)for(let R of n)l[R]=Ae($e(d,R));let x=(v??[]).filter(R=>{let S=l[R]??Ae($e(d,R));return S==="string"||S==="number"||S==="bigint"||S==="boolean"||S==="enum"||S==="literal"}),w=x.length>0,T=i,O=T||w,$=x.map(R=>{let S=$e(d,R),k=Ae(S),A=a.find(E=>E.name===R);return {name:R,type:k,enumValues:A?.enumValues??null,nullable:A?.nullable??false}});return ue(jsxRuntime.jsxs(pe,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(St,{action:y,columnMeta:a,activeFilters:c,isGroup:h}),b&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${b.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:b.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:b.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:b.message})]}),b.indexUrl&&jsxRuntime.jsx("a",{href:b.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 m=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:m})]})," ","document",(typeof m=="number"?m:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(R=>jsxRuntime.jsx("a",{href:co(R,c,u),class:`join-item btn btn-xs ${g===R?"btn-active btn-primary":"btn-outline"}`,children:R},R))})]})]}),jsxRuntime.jsx("a",{href:p,class:"btn btn-primary btn-sm",children:"+ New"})]}),O&&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 m=="number"?String(m):"","data-frs-page-size":String(g??t.length),"data-frs-allow-delete":T?"1":"0","data-frs-allow-update":w?"1":"0","data-frs-fields":JSON.stringify($),"data-frs-filters":JSON.stringify(c),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof m=="number"&&m>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 ",m," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",m??"?"," 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:[O&&jsxRuntime.jsx("th",{class:"w-8",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((R,S)=>{let k=u?.field===R,A=k?u.dir==="asc"?" \u25B2":" \u25BC":"";return jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxRuntime.jsxs("a",{href:lo(R,u,c,g),class:`hover:text-base-content inline-flex items-center gap-0.5${k?" text-primary font-bold":""}`,children:[R,A]})},S)}),f.map((R,S)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:R.column},`rel-${S}`)),jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsxRuntime.jsx("tbody",{children:t.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:n.length+f.length+1+(O?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((R,S)=>{let k=String(R.docId??R.id??""),A=`${r}/${e}/${encodeURIComponent(k)}/edit`,E=`${r}/${e}/${encodeURIComponent(k)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":k,children:[O&&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:k,"aria-label":`Select ${k}`})}),n.map((C,Z)=>{let I=R[C],_=l[C],se=_?Ze(_,I):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(Oe,{val:I,mismatch:se})},Z)}),f.map((C,Z)=>{let I=R[C.key];if(I==null||I==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${Z}`);let _=C.type==="one"?`${r}/${C.targetRepo}/${encodeURIComponent(String(I))}/edit`:`${r}/${C.targetRepo}?fv_${C.targetKey}=${encodeURIComponent(String(I))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:_,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":C.type,"data-frs-rel-repo":C.targetRepo,"data-frs-rel-fk":C.targetKey,"data-frs-rel-val":String(I),"data-frs-rel-label":C.column,children:C.column})},`rel-${Z}`)}),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:A,class:"btn btn-xs btn-outline",children:"Edit"}),i&&jsxRuntime.jsx("form",{method:"post",action:E,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},S)})})]})}),(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:Fn(c,o.prevCursor,"prev",u,g),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:Fn(c,o.nextCursor,"next",u,g),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof m=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[m," total document",m!==1?"s":"",c.length>0?" matching filters":""]})]}),O&&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"}),x.map(R=>jsxRuntime.jsx("option",{value:R,children:R},R))]})]}),jsxRuntime.jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxRuntime.jsxs("div",{class:"modal-action",children:[jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsxRuntime.jsx("form",{method:"dialog",class:"modal-backdrop",children:jsxRuntime.jsx("button",{children:"close"})})]})]}))}function ot(e,t){return wt(e,t)}function Ot(e,t){return Rt(e,t)}function At(e,t,n,r,o,s,a,c,i,f,u,g,b,h,m,v,d){return Ct(e,t,n,r,o,s,a,c,i,f,u,g,b,h,m,v,d)}function ye(e,t,n,r,o,s){return Tt(e,t,n,r,o,s)}var po=new Set(["<","<=",">",">=","!="]),fo=new Set(["array-contains","array-contains-any"]);function $t(e){return e==="desc"?"DESCENDING":"ASCENDING"}function yo(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function mo(e,t,n,r,o){let s=[],a=new Set;for(let i of r)if(i.op==="=="||i.op==="in"||i.op==="not-in"){if(a.has(i.field))continue;a.add(i.field),s.push({fieldPath:i.field,order:"ASCENDING"});}for(let i of r)if(fo.has(i.op)){if(a.has(i.field))continue;a.add(i.field),s.push({fieldPath:i.field,arrayConfig:"CONTAINS"});}for(let i of r)if(po.has(i.op)){if(a.has(i.field))continue;a.add(i.field);let f=o?.field===i.field?$t(o.dir):"ASCENDING";s.push({fieldPath:i.field,order:f});}if(o&&!a.has(o.field)&&s.push({fieldPath:o.field,order:$t(o.dir)}),s.length===1&&n)return bo(e,t,s[0]);let c=o&&s.some(i=>i.fieldPath===o.field)?$t(o.dir):"ASCENDING";return s.push({fieldPath:"__name__",order:c}),go(e,t,n,s)}function go(e,t,n,r,o="(default)"){let s=`projects/${e}/databases/${o}/collectionGroups/${t}/indexes/_`,a=[...Dt(1,s),...st(2,n?2:1)];for(let f of r)a.push(...Mn(3,zn(f)));let c=o==="(default)"?"-default-":o,i=encodeURIComponent(Bn(a));return `https://console.firebase.google.com/project/${e}/firestore/databases/${c}/indexes?create_composite=${i}`}function ho(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function Pt(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function Et(e,t){return e<<3|t}function Dt(e,t){let n=Array.from(new TextEncoder().encode(t));return [Et(e,2),...Pt(n.length),...n]}function st(e,t){return [Et(e,0),...Pt(t)]}function Mn(e,t){return [Et(e,2),...Pt(t.length),...t]}function zn(e){let t=[...Dt(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...st(3,1)):t.push(...st(2,e.order==="DESCENDING"?2:1)),t}function Bn(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 bo(e,t,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,s=[...Dt(1,o),...st(2,2),...Mn(3,zn(n))],a=r==="(default)"?"-default-":r,c=encodeURIComponent(Bn(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${a}/indexes/automatic?create_exemption=${c}`}function vo(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 Re(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function qe(e,t){let n=e??{},r=Re(e),o;if(r&&(o=n.message?ho(n.message):void 0,!o)){let s=vo(t.ref);if(s){let a=yo(t.path);o=mo(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}}var Zn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function wo(){let e="";for(let t=0;t<20;t++)e+=Zn.charAt(Math.floor(Math.random()*Zn.length));return e}function It(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 Ke(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 Nt(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 F(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function _t(e,t){e.status(302).set("Location",t).send("");}function jt(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=Mt(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let f={},u=false;for(let[h,m]of Object.entries(e))h.startsWith(`${o}.`)&&(f[h.slice(o.length+1)]=m,u=true);if(u){let h=s;for(;;){let m=B(h);if(m==="ZodOptional"||m==="ZodNullable"||m==="ZodDefault")h=K(h);else break}r[o]=jt(f,h);continue}let g=e[o],b=Array.isArray(g)?g[g.length-1]:g;if(b)try{r[o]=JSON.parse(b);}catch{r[o]=b;}continue}let c=e[o],i=Array.isArray(c)?c[c.length-1]:c;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(i===void 0||i===""){a==="ZodBoolean"&&(r[o]=false);continue}switch(a){case "ZodBoolean":i==="__null__"?r[o]=null:r[o]=i==="true"||i==="on"||i==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(i);break;case "ZodDate":r[o]=new Date(i);break;case "ZodArray":try{r[o]=JSON.parse(i);}catch{r[o]=i;}break;default:if(i.startsWith("{")||i.startsWith("["))try{r[o]=JSON.parse(i);break}catch{}r[o]=i;}}return r}function Hn(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 Mt(e){let t=e;for(;;){let n=B(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=K(t);else return n}}function Ro(e){let t=e;for(;;){let n=B(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=K(t);else return t}}function Kn(e){let t=e;for(;;){let n=B(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=K(t);continue}return false}}function Un(e){let t=Ro(e),n=B(t);if(n==="ZodEnum"){let r=_e(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=je(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=Ye(t);return typeof r=="string"?[r]:void 0}}function Ln(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 c=t.shape[o];for(;;){let f=B(c);if(f==="ZodOptional"||f==="ZodNullable"||f==="ZodDefault")c=K(c);else break}let i=B(c);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let f=Ln(a,c,s);Object.assign(r,f);}else if(i==="ZodDate"){let f=Hn(a);f!==null&&(r[s]=f);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let f=Hn(a);r[s]=f??JSON.stringify(a,null,2);}else typeof a=="object"?r[s]=JSON.stringify(a,null,2):r[s]=String(a);}return r}function Ft(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Ft(n.nested,t):void 0}))}function So(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 c=(s??"").trim();if(!c)continue;let i=e[`fo_${a}`]??"==",f=n.has(i)?i:"==";r.push({field:a,op:f,value:c});}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 Vn(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 c=Mt(a);if(c==="ZodObject"){let i=a;for(;;){let u=B(i);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")i=K(i);else break}let f=J(i);r.push(...Vn(Object.keys(f),i,s));}else r.push({name:s,zodType:c,nullable:Kn(a),enumValues:Un(a)});}return r}function To(e,t){let n=t.split("."),r=e;for(let o of n){for(;;){let a=B(r);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")r=K(r);else break}let s=J(r);if(!(o in s))return null;r=s[o];}return r}function Se(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 c=s.slice(0,a),i=s.slice(a+1);r.has(c)||r.set(c,[]),r.get(c).push(i);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,a]of r){if(!(s in e.shape))continue;let c=e.shape[s];for(;;){let i=B(c);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")c=K(c);else break}if(B(c)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=Se(c,a);}return zod.z.object(o)}function me(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",c=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${a}/${c}${n}`}let r=process.env.K_SERVICE,o=e.hostname??e.headers?.host??"";return r&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function Qn(e,t){let n=(d,y)=>{let p=me(d,t),l=Object.values(e).map(x=>({name:x.name,path:x.path}));F(y,Ot(l,p));},r=async(d,y)=>{let p=d.params.repoName;if(!p){F(y,"Bad request",400);return}let l=e[p];if(!l){F(y,"Repository not found",404);return}let x=l.pageSize??25,w=d.query??{},T=w.cursor,O=w.dir==="prev"?"prev":"next",$=w.ob??"",R=w.od==="desc"?"desc":"asc",S=$?{field:$,dir:R}:void 0,k=parseInt(w.ps??""),A=Number.isFinite(k)&&k>0?Math.min(k,200):x,E=l.listColumns??Object.keys(l.schema.shape),C=l.documentKey??"docId",Z=[C,...E.filter(V=>V!==C)],I=l.filterableFields?(()=>{let V=[];for(let ae of l.filterableFields)(ae.includes(".")||E.includes(ae))&&V.push(ae);return V})():E,_=(()=>{let V=[];for(let ae of I)if(ae.includes(".")){let ke=To(l.schema,ae);V.push({name:ae,zodType:ke?Mt(ke):"ZodString",nullable:ke?Kn(ke):false,enumValues:ke?Un(ke):void 0});}else V.push(...Vn([ae],l.schema));return V})(),se=new Set(_.map(V=>V.name)),De=So(w,se),Ve=qn(De),Ut;if(T)try{let V=l.repo.ref;typeof V.doc=="function"&&(Ut=await V.doc(T).get());}catch{}let[he,ar]=await Promise.all([l.repo.query.paginate({pageSize:A,cursor:Ut,direction:O,...Ve.length>0?{where:Ve}:{},...S?{orderBy:[{field:S.field,direction:S.dir}]}:{}}).catch(V=>({queryError:qe(V,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:De,sort:S})})),l.repo.aggregate.count(Ve.length>0?{where:Ve}:{}).catch(()=>{})]),Te="queryError"in he,ir=Te?[]:he.data,lr=Te?"":he.nextCursor?.id??"",cr=Te?"":he.prevCursor?.id??"",dr=Te?he.queryError:void 0,ur=me(d,t);F(y,At(l.name,ir,Z,ur,{hasPrev:Te?false:he.hasPrevPage,hasNext:Te?false:he.hasNextPage,prevCursor:cr,nextCursor:lr},void 0,_,De,l.allowDelete??false,l.relationalMeta,S,A,dr,l.isGroup,ar,l.mutableFields,l.schema));},o=(d,y)=>{let p=d.params.repoName;if(!p){F(y,"Bad request",400);return}let l=e[p];if(!l){F(y,"Repository not found",404);return}let x=me(d,t),w=Se(l.schema,l.createFields),T=re(w),O=`${x}/${l.name}/create`,$=de(T,O,"POST","Create document");F(y,ye(l.name,$,"create",null,x));},s=async(d,y)=>{let p=d.params.repoName;if(!p){F(y,"Bad request",400);return}let l=e[p];if(!l){F(y,"Repository not found",404);return}let x=me(d,t),w=d.body??{},T=jt(w,l.schema),O=Se(l.schema,l.createFields),$=O.safeParse(T);if(!$.success){let R=re(O),S=`${x}/${l.name}/create`,k=de(R,S,"POST","Create document"),A=$.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`).join(", ");F(y,ye(l.name,k,"create",null,x,{type:"error",message:`Validation error: ${A}`}),422);return}try{if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let R={...$.data};l.createdKey&&(R[l.createdKey]=new Date);let S=l.parentKeys.filter(C=>!R[C]);if(S.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${S.join(", ")}`);let k=l.parentKeys.map(C=>R[C]),A=l.documentKey??"docId",E=R[A]||wo();await l.repo.set(...k,E,R);}else await l.repo.create($.data);_t(y,`${x}/${l.name}?flash=created`);}catch(R){let S=Se(l.schema,l.createFields),k=re(S),A=`${x}/${l.name}/create`,E=de(k,A,"POST","Create document");F(y,ye(l.name,E,"create",null,x,{type:"error",message:`Save error: ${R.message}`}),500);}},a=async(d,y)=>{let p=d.params.repoName,l=d.params.id;if(!p||!l){F(y,"Bad request",400);return}let x=e[p];if(!x){F(y,"Repository not found",404);return}let w=me(d,t),T=null;try{T=await Ke(x,l);}catch(A){let E=Nt(x,l,A),C=Re(A)?424:500;F(y,ot("",{title:`Edit ${x.name} / ${l}`,basePath:w,breadcrumb:[{label:"Repositories",href:w},{label:x.name,href:`${w}/${x.name}`},{label:`Edit ${l}`}],flash:E}),C);return}if(!T){F(y,"Document not found",404);return}let O=Ln(T,x.schema),$=Se(x.schema,x.mutableFields),R=Ft(re($),O),S=`${w}/${x.name}/${encodeURIComponent(l)}/edit`,k=de(R,S,"POST","Save changes");F(y,ye(x.name,k,"edit",l,w));},c=async(d,y)=>{let p=d.params.repoName,l=d.params.id;if(!p||!l){F(y,"Bad request",400);return}let x=e[p];if(!x){F(y,"Repository not found",404);return}let w=me(d,t),T=d.body??{},O=jt(T,x.schema),$=Se(x.schema,x.mutableFields),S=$.partial().safeParse(O);if(!S.success){let k=Object.fromEntries(Object.entries(T).map(([I,_])=>[I,Array.isArray(_)?_.join(","):_??""])),A=Ft(re($),k),E=`${w}/${x.name}/${encodeURIComponent(l)}/edit`,C=de(A,E,"POST","Save changes"),Z=S.error.issues.map(I=>`${I.path.join(".")}: ${I.message}`).join(", ");F(y,ye(x.name,C,"edit",l,w,{type:"error",message:`Validation error: ${Z}`}),422);return}try{let k=await Ke(x,l),A=(k&&It(k,x.pathKey))??[l];await x.repo.update(...A,S.data),_t(y,`${w}/${x.name}?flash=updated`);}catch(k){let A=Se(x.schema,x.mutableFields),E=re(A),C=`${w}/${x.name}/${encodeURIComponent(l)}/edit`,Z=de(E,C,"POST","Save changes"),I=Re(k)?Nt(x,l,k):{type:"error",message:`Save error: ${k.message}`},_=Re(k)?424:500;F(y,ye(x.name,Z,"edit",l,w,I),_);}},i=async(d,y)=>{let p=d.params.repoName,l=d.params.id;if(!p||!l){F(y,"Bad request",400);return}let x=e[p];if(!x){F(y,"Repository not found",404);return}if(!x.allowDelete){F(y,"Delete is not allowed for this repository",403);return}let w=me(d,t);try{let T=await Ke(x,l),O=(T&&It(T,x.pathKey))??[l];await x.repo.delete(...O),_t(y,`${w}/${x.name}?flash=deleted`);}catch(T){let O=Re(T)?Nt(x,l,T):{type:"error",message:`Delete error: ${T.message}`},$=Re(T)?424:500;F(y,ot("",{title:`Delete ${x.name} / ${l}`,basePath:w,breadcrumb:[{label:"Repositories",href:w},{label:x.name,href:`${w}/${x.name}`},{label:`Delete ${l}`}],flash:O}),$);}},f=async(d,y)=>{let p=d.params.repoName;if(!p){F(y,"Bad request",400);return}let l=e[p];if(!l){F(y,"Repository not found",404);return}let x=me(d,t),w=d.query,T=w?.type==="many"?"many":"one",O=Math.max(1,Math.min(100,Number(w?.ps??25)||25)),$=l.listColumns??Object.keys(J(l.schema)),{PanelOne:R,PanelMany:S}=await Promise.resolve().then(()=>(xt(),Nn)),{renderToString:k}=await import('hono/jsx/dom/server');if(T==="one"){let _=String(w?.id??"");if(!_){F(y,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let se=await Ke(l,_),De=k(R({doc:se,repoName:l.name,basePath:x,schema:l.schema,columns:$}));F(y,De);}catch(se){F(y,`<div class='p-6 text-error text-sm'>Error: ${se.message}</div>`,500);}return}let A=String(w?.fk??""),E=String(w?.fv??"");if(!A||!E){F(y,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let C=w?.cursor??"",Z=w?.dir==="prev"?"prev":"next",I;if(C)try{let _=l.repo.ref;typeof _.doc=="function"&&(I=await _.doc(C).get());}catch{}try{let _=await l.repo.query.paginate({pageSize:O,cursor:I,direction:Z,where:[[A,"==",ko(E)]]}),se=k(S({docs:_.data,repoName:l.name,basePath:x,fk:A,fv:E,columns:$,schema:l.schema,pagination:{hasPrev:_.hasPrevPage,hasNext:_.hasNextPage,prevCursor:_.prevCursor?.id??"",nextCursor:_.nextCursor?.id??"",pageSize:O}}));F(y,se);}catch(_){F(y,`<div class='p-6 text-error text-sm'>Error: ${_.message}</div>`,500);}},u=async(d,y)=>{let p=[];for(let l of y){let x;if(d.isGroup||d.parentKeys?.length){let w=await Ke(d,l);x=w?It(w,d.pathKey):void 0;}x||(x=[l]);try{let w=d.repo.documentRef(...x);w&&p.push(w);}catch{}}return p},g=async(d,y)=>{let p=qn(y),l=d.documentKey??"docId",x=[],w;for(;;){let T=await d.repo.query.paginate({pageSize:500,cursor:w,direction:"next",...p.length>0?{where:p}:{}});for(let O of T.data){let $=String(O[l]??O.id??"");$&&x.push($);}if(!T.hasNextPage||!T.nextCursor)break;w=T.nextCursor;}return x},b=async(d,y)=>{let p=d.params.repoName;if(!p){W(y,{error:"Bad request"},400);return}let l=e[p];if(!l){W(y,{error:"Repository not found"},404);return}if(!l.allowDelete){W(y,{error:"Delete is not allowed for this repository"},403);return}let x=d.body??{};try{let w=await m(l,x);if(w.length===0){W(y,{deleted:0});return}let T=await u(l,w);for(let O=0;O<T.length;O+=500)await l.repo.bulk.delete(T.slice(O,O+500));W(y,{deleted:T.length});}catch(w){W(y,{error:w.message},500);}},h=async(d,y)=>{let p=d.params.repoName;if(!p){W(y,{error:"Bad request"},400);return}let l=e[p];if(!l){W(y,{error:"Repository not found"},404);return}let x=d.body??{},w=String(x.field??"");if(!w){W(y,{error:"Missing 'field'"},400);return}if(!l.mutableFields||!l.mutableFields.includes(w)){W(y,{error:`Field '${w}' is not bulk-updatable`},403);return}let T=l.schema.shape?.[w],O=x.value;if(T){let $=T.safeParse(x.value);if(!$.success){W(y,{error:`Invalid value for '${w}': ${$.error.message}`},400);return}O=$.data;}try{let $=await m(l,x);if($.length===0){W(y,{updated:0});return}let S=(await u(l,$)).map(k=>({docRef:k,data:{[w]:O}}));for(let k=0;k<S.length;k+=500)await l.repo.bulk.update(S.slice(k,k+500));W(y,{updated:S.length});}catch($){W(y,{error:$.message},500);}};async function m(d,y){if(y.selectAll){let p=v(y.filters,d);return await g(d,p)}return Array.isArray(y.ids)?y.ids.filter(p=>typeof p=="string"&&!!p):[]}function v(d,y){if(!Array.isArray(d))return [];let p=new Set((y.filterableFields??Object.keys(J(y.schema))).map(w=>String(w))),l=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),x=[];for(let w of d)w&&typeof w=="object"&&typeof w.field=="string"&&p.has(w.field)&&typeof w.value=="string"&&l.has(String(w.op))&&x.push({field:w.field,op:w.op,value:w.value});return x}return {handleDashboard:n,handleList:r,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:a,handleEditSubmit:c,handleDelete:i,handlePanel:f,handleBulkDelete:b,handleBulkUpdate:h}}function W(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function ko(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}async function Co(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Oo(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 Gn(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:o,middleware:s=[],httpsOptions:a}=e,c=t==="/"?"":t.replace(/\/$/,""),i={};for(let[b,h]of Object.entries(n)){let m=h.schema??h.repo.schema??null;if(!m)throw new Error(`[createAdminServer] Repository "${b}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let v,d,y;if(h.fieldsConfig){let x=h.fieldsConfig;v=[],d=[],y=[];for(let[w,T]of Object.entries(x))for(let O of T)O==="filterable"?v.push(w):O==="mutable"?d.push(w):O==="create"&&y.push(w);v.length===0&&(v=void 0),d.length===0&&(d=void 0),y.length===0&&(y=void 0);}let p=(()=>{let x=h.repo._parentKeys;return x&&x.length>0?x:void 0})();if(p&&y)for(let x of p)y.includes(x)||y.push(x);let l={name:b,path:h.path,repo:h.repo,schema:m,documentKey:h.documentKey??"docId",pathKey:h.repo._pathKey??void 0,isGroup:!!h.repo._isGroup,parentKeys:p,createdKey:h.repo._createdKey??void 0,listColumns:h.listColumns,pageSize:h.pageSize,filterableFields:v,mutableFields:d,createFields:y,allowDelete:h.allowDelete??false,relationalMeta:(()=>{if(!h.relationalFields||h.relationalFields.length===0)return;let x=h.repo.relationalKeys??{},w=[];for(let T of h.relationalFields){let O=x[T.key];O&&w.push({key:T.key,column:T.column,targetRepo:String(O.repo),targetKey:String(O.key),type:O.type});}return w.length>0?w:void 0})()};i[b]=l;}let f=Qn(i,c),u=new X;if(r&&u.use(async(b,h,m)=>{let v=b,d=String(v.headers?.["content-type"]??"");if(d.includes("application/x-www-form-urlencoded")){let y=await Co(v);b.body=Oo(y);}else if(d.includes("application/json")&&typeof v.body=="string")try{b.body=JSON.parse(v.body);}catch{}await m();}),o)if(typeof o=="function")u.use(o);else {let b=o.realm??"Admin",h="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");u.use((m,v,d)=>{if((m.headers?.authorization??"")!==h){v.status(401).set("WWW-Authenticate",`Basic realm="${b}"`).set("Content-Type","text/plain").send("Unauthorized");return}d();});}for(let b of s)u.use(b);u.get(`${c}/`,f.handleDashboard),u.get(`${c}`,f.handleDashboard),u.get(`${c}/:repoName/_panel`,f.handlePanel),u.post(`${c}/:repoName/_bulk/delete`,f.handleBulkDelete),u.post(`${c}/:repoName/_bulk/update`,f.handleBulkUpdate),u.get(`${c}/:repoName`,f.handleList),u.get(`${c}/:repoName/create`,f.handleCreateForm),u.post(`${c}/:repoName/create`,f.handleCreateSubmit),u.get(`${c}/:repoName/:id/edit`,f.handleEditForm),u.post(`${c}/:repoName/:id/edit`,f.handleEditSubmit),u.post(`${c}/:repoName/:id/delete`,f.handleDelete);let g=async(b,h)=>{await u.handle(b,h);};return a&&(g.httpsOptions=a),g}function Bt(e,t,n=200){let r=H(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function Pe(e,t,n,r=200){Bt(e,{success:true,data:t,meta:n},r);}function L(e,t,n=400){Bt(e,{success:false,error:t},n);}function zt(e,t,n,r,o){let s=qe(t,n),a=s.type==="index",c=a?424:500,f={success:false,error:a?s.message:o&&t instanceof Error?t.message:r};a&&(f.errorType="index",s.indexUrl&&(f.indexUrl=s.indexUrl)),Bt(e,f,c);}var Wn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Ao(){let e="";for(let t=0;t<20;t++)e+=Wn.charAt(Math.floor(Math.random()*Wn.length));return e}function Ee(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=>ut(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=Ee(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(Ee(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return Ee(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return Ee(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=Ee(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function $o(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 c=a.split(".")[0];c&&r[c]&&(o[c]=r[c]);}return zod.z.object(o)}function Jn(e,t,n,r=false,o=[]){try{let s=$o(e,n,o),a=r?s.partial():s;return {success:!0,data:(dt()==="normalize"?Ee(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(c=>`${c.path.join(".")}: ${c.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function Po(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 c=Array.isArray(a)?a[0]:a;if(c===void 0||c==="")continue;let i=s.match(/^(\w+)__(\w+)$/),f,u="==";if(i&&i[1]&&i[2]){f=i[1];let b=i[2];if(o[b])u=o[b];else continue}else if(!i)f=s;else continue;if(r&&!r.has(f))continue;let g=c;u==="in"||u==="not-in"||u==="array-contains-any"?g=c.split(",").map(b=>Xn(b.trim())):g=Xn(c),n.push({field:f,op:u,value:g});}return n}function Xn(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 at(e){return e?{docId:e.id}:null}async function Yn(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 er(e,t,n){function r(h,m){return !h||!e[h]?(L(m,`Repository "${h}" not found`,404),null):e[h]}function o(h,m){if(!m)return;let v=h[m];if(typeof v!="string"||!v)return;let d=v.split("/").filter(Boolean),y=[];for(let p=1;p<d.length;p+=2)y.push(d[p]);return y.length>0?y:void 0}async function s(h,m){let v=`by${h.documentKey.charAt(0).toUpperCase()}${h.documentKey.slice(1)}`,d=h.repo.get[v];if(typeof d=="function")try{let p=await d(m);if(p)return p}catch{}return (await h.repo.query.by({where:[[h.documentKey,"==",m]],limit:1}))[0]??null}async function a(h,m){let v=h.params||{},d=r(v.repoName,m);if(!d)return;let y=[],p;try{let l=h.query??{},x=Math.min(Number(l.pageSize)||d.pageSize,100),w=l.cursor,T=l.direction?.toLowerCase()==="prev"?"prev":"next",O=l.orderBy,$=l.orderDir?.toLowerCase()==="desc"?"desc":"asc",R=l.select,S=R?R.split(",").map(I=>I.trim()):void 0,k;d.allowedIncludes&&l.includes&&(k=(typeof l.includes=="string"?l.includes.split(",").map(_=>_.trim()):Array.isArray(l.includes)?l.includes:[]).filter(_=>typeof _=="string"&&d.allowedIncludes.includes(_)),k?.length===0&&(k=void 0));let A=Po(l,d.filterableFields);y=A.map(I=>({field:I.field,op:I.op,value:String(I.value??"")})),O&&(p={field:O,dir:$});let E={pageSize:x,direction:T};if(w)try{let I=typeof w=="string"?JSON.parse(w):w;E.cursor=await Yn(d,I);}catch{}O&&(E.orderBy=[{field:O,direction:$}]),A.length>0&&(E.where=A.map(I=>[I.field,I.op,I.value])),S&&(E.select=S),k&&(E.include=k);let C=await d.repo.query.paginate(E),Z={items:C.data,hasNextPage:C.hasNextPage,hasPrevPage:C.hasPrevPage,nextCursor:at(C.nextCursor),prevCursor:at(C.prevCursor)};Pe(m,Z,{pageSize:x,hasMore:C.hasNextPage});}catch(l){zt(m,l,{ref:d.repo.ref,path:d.path,isGroup:!!d.isGroup,filters:y,sort:p},"Failed to fetch documents",n);}}async function c(h,m){let v=h.params||{},d=r(v.repoName,m);if(!d)return;let y=[],p;try{let l=h.body??{},x=Math.min(l.pageSize||d.pageSize,100),w=l.direction==="prev"?"prev":"next";l.where&&(y=l.where.map(R=>({field:String(R[0]),op:R[1],value:String(R[2]??"")}))),l.orderBy&&l.orderBy[0]&&(p={field:l.orderBy[0].field,dir:l.orderBy[0].direction==="desc"?"desc":"asc"});let T={pageSize:x,direction:w};if(l.cursor)try{let R=typeof l.cursor=="string"?JSON.parse(l.cursor):l.cursor;T.cursor=await Yn(d,R);}catch{}if(d.allowedIncludes&&l.includes&&l.includes.length>0){let R=l.includes.filter(S=>typeof S=="string"?d.allowedIncludes.includes(S):typeof S=="object"&&S!==null&&"relation"in S&&typeof S.relation=="string"?d.allowedIncludes.includes(S.relation):!1);R.length>0&&(T.include=R);}if(l.where&&l.where.length>0){if(d.filterableFields){let R=new Set(d.filterableFields),S=l.where.filter(k=>!R.has(k[0]));if(S.length>0){L(m,`Fields not filterable: ${S.map(k=>k[0]).join(", ")}`,400);return}}T.where=l.where;}if(l.orWhere&&l.orWhere.length>0){if(d.filterableFields){let R=new Set(d.filterableFields),S=l.orWhere.filter(k=>!R.has(k[0]));if(S.length>0){L(m,`Fields not filterable: ${S.map(k=>k[0]).join(", ")}`,400);return}}T.orWhere=l.orWhere;}if(l.orWhereGroups&&l.orWhereGroups.length>0){if(d.filterableFields){let R=new Set(d.filterableFields);for(let S of l.orWhereGroups){let k=S.filter(A=>!R.has(A[0]));if(k.length>0){L(m,`Fields not filterable: ${k.map(A=>A[0]).join(", ")}`,400);return}}}T.orWhereGroups=l.orWhereGroups;}l.orderBy&&l.orderBy.length>0&&(T.orderBy=l.orderBy),l.select&&l.select.length>0&&(T.select=l.select);let O=await d.repo.query.paginate(T),$={items:O.data,hasNextPage:O.hasNextPage,hasPrevPage:O.hasPrevPage,nextCursor:at(O.nextCursor),prevCursor:at(O.prevCursor)};Pe(m,$,{pageSize:x,hasMore:O.hasNextPage});}catch(l){zt(m,l,{ref:d.repo.ref,path:d.path,isGroup:!!d.isGroup,filters:y,sort:p},"Failed to query documents",n);}}async function i(h,m){let v=h.params||{},d=r(v.repoName,m);if(!d)return;let y=v.id;if(!y){L(m,"Document ID required",400);return}try{let p=await s(d,y);if(!p){L(m,"Document not found",404);return}Pe(m,p);}catch(p){zt(m,p,{ref:d.repo.ref,path:d.path,isGroup:!!d.isGroup,filters:[{field:d.documentKey,op:"==",value:y}]},"Failed to fetch document",n);}}async function f(h,m){let v=h.params||{},d=r(v.repoName,m);if(d)try{let y=h.body??{},p=Jn(d.schema,y,d.createFields,!1,d.systemKeys);if(!p.success){L(m,p.error,400);return}if(d.validate){let x=await d.validate(p.data,"create");if(x){L(m,x,400);return}}let l;if(d.isGroup&&d.parentKeys&&d.parentKeys.length>0){let x={...p.data};d.createdKey&&(x[d.createdKey]=new Date);let w=d.parentKeys.filter($=>!x[$]);if(w.length>0){L(m,`Missing parent key(s) for subcollection create: ${w.join(", ")}`,400);return}let T=d.parentKeys.map($=>x[$]),O=x[d.documentKey]||Ao();l=await d.repo.set(...T,O,x);}else l=await d.repo.create(p.data);Pe(m,l,void 0,201);}catch(y){let p=n&&y instanceof Error?y.message:"Failed to create document";L(m,p,500);}}async function u(h,m,v){let d=h.params||{},y=r(d.repoName,m);if(!y)return;let p=d.id;if(!p){L(m,"Document ID required",400);return}try{let l=h.body??{},x=Jn(y.schema,l,y.mutableFields,v,y.systemKeys);if(!x.success){L(m,x.error,400);return}if(y.validate){let $=await y.validate(x.data,"update");if($){L(m,$,400);return}}let w=await s(y,p),T=(w&&o(w,y.pathKey))??[p],O=await y.repo.update(...T,x.data);Pe(m,O);}catch(l){let x=n&&l instanceof Error?l.message:"Failed to update document";L(m,x,500);}}async function g(h,m){let v=h.params||{},d=r(v.repoName,m);if(!d)return;if(!d.allowDelete){L(m,"Delete not allowed for this repository",403);return}let y=v.id;if(!y){L(m,"Document ID required",400);return}try{let p=await s(d,y),l=(p&&o(p,d.pathKey))??[y];await d.repo.delete(...l),Pe(m,{deleted:!0});}catch(p){let l=n&&p instanceof Error?p.message:"Failed to delete document";L(m,l,500);}}function b(h,m){m.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:a,handleQuery:c,handleGet:i,handleCreate:f,handleUpdate:u,handleDelete:g,handleOptions:b}}function Zt(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 ee(e){return {$ref:`#/components/schemas/${e}`}}function G(e){return {description:e,content:{"application/json":{schema:ee("ErrorResponse")}}}}function Le(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function tr(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 Eo(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 Do(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 Io(){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 No(e,t,n,r,o){let s={},a=e.name,c=`${t}/${e.name}`,i=`${c}/{${e.documentKey}}`,f={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[c]={get:{operationId:`list${ge(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...Eo(e),...Do(e)],responses:{200:tr(ee(n)),500:G("Internal server error")}},post:{operationId:`create${ge(e.name)}`,summary:`Create a ${oe(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ee(r??n)}}},responses:{201:Le("Document created",ee(n)),400:G("Validation error"),500:G("Internal server error")}}},s[`${c}/query`]={post:{operationId:`query${ge(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:ee("QueryRequestBody")}}},responses:{200:tr(ee(n)),400:G("Invalid query"),500:G("Internal server error")}}};let u={};return u.get={operationId:`get${ge(oe(e.name))}`,summary:`Get a single ${oe(e.name)}`,tags:[a],parameters:[f],responses:{200:Le("Document found",ee(n)),404:G("Document not found"),500:G("Internal server error")}},u.put={operationId:`update${ge(oe(e.name))}`,summary:`Update a ${oe(e.name)} (full replace)`,tags:[a],parameters:[f],requestBody:{required:true,content:{"application/json":{schema:ee(o??n)}}},responses:{200:Le("Document updated",ee(n)),400:G("Validation error"),404:G("Document not found"),500:G("Internal server error")}},u.patch={operationId:`patch${ge(oe(e.name))}`,summary:`Partially update a ${oe(e.name)}`,tags:[a],parameters:[f],requestBody:{required:true,content:{"application/json":{schema:{allOf:[ee(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Le("Document patched",ee(n)),400:G("Validation error"),404:G("Document not found"),500:G("Internal server error")}},e.allowDelete&&(u.delete={operationId:`delete${ge(oe(e.name))}`,summary:`Delete a ${oe(e.name)}`,tags:[a],parameters:[f],responses:{200:Le("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:G("Document not found"),500:G("Internal server error")}}),s[i]=u,s}function qt(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:c=false}=n,i=t==="/"?"":t.replace(/\/$/,""),f={},u={},g=[];f.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},f.QueryRequestBody=Io();for(let[v,d]of Object.entries(e)){let y=ge(oe(v)),p=`${y}Create`,l=`${y}Update`;f[y]=Zt(d.schema);let x=S=>{let k=S&&S.length>0?S:Object.keys(d.schema.shape),A={};for(let E of k){let C=E.split(".")[0];C&&d.schema.shape[C]&&!d.systemKeys.includes(C)&&(A[C]=d.schema.shape[C]);}return A},w=null,T=x(d.createFields);Object.keys(T).length>0&&(f[p]=Zt(zod.z.object(T)),w=p);let O=null,$=x(d.mutableFields);Object.keys($).length>0&&(f[l]=Zt(zod.z.object($)),O=l);let R=No(d,i,y,w,O);Object.assign(u,R),g.push({name:v,description:`Operations on ${v} (collection: ${d.path})`});}let b={},h;return c==="basic"?(b.basicAuth={type:"http",scheme:"basic"},h=[{basicAuth:[]}]):c==="bearer"&&(b.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},h=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...a&&a.length>0?{servers:a}:{},paths:u,components:{schemas:f,...Object.keys(b).length>0?{securitySchemes:b}:{}},...h?{security:h}:{},tags:g}}function ge(e){return e.charAt(0).toUpperCase()+e.slice(1)}function oe(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 _o(e,t){return `<!DOCTYPE html>
|
|
1118
1136
|
<html lang="en">
|
|
1119
1137
|
<head>
|
|
1120
1138
|
<meta charset="utf-8" />
|
|
@@ -1125,5 +1143,5 @@ function initColumnReorder(table) {
|
|
|
1125
1143
|
<script id="api-reference" data-url="${t}"></script>
|
|
1126
1144
|
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
|
|
1127
1145
|
</body>
|
|
1128
|
-
</html>`}function
|
|
1146
|
+
</html>`}function jo(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",c=process.env.FUNCTION_TARGET??"";return `/${s}/${a}/${c}${n}`}let r=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return r&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}async function Fo(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function nr(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:o,middleware:s=[],verbose:a=false,httpsOptions:c}=e,i=t==="/"?"":t.replace(/\/$/,""),f={};for(let[y,p]of Object.entries(n)){let l=p.schema??p.repo.schema??null;if(!l)throw new Error(`[createCrudServer] Repository "${y}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let x,w,T;if(p.fieldsConfig){let R=p.fieldsConfig;x=[],w=[],T=[];for(let[S,k]of Object.entries(R))for(let A of k)A==="filterable"?x.push(S):A==="mutable"?w.push(S):A==="create"&&T.push(S);x.length===0&&(x=void 0),w.length===0&&(w=void 0),T.length===0&&(T=void 0);}let O=(()=>{let R=p.repo._parentKeys;return R&&R.length>0?R:void 0})();if(O&&T)for(let R of O)T.includes(R)||T.push(R);let $={name:y,path:p.path,repo:p.repo,schema:l,systemKeys:p.repo._systemKeys??[p.documentKey??"docId"],documentKey:p.documentKey??"docId",pathKey:p.repo._pathKey??void 0,isGroup:!!p.repo._isGroup,parentKeys:O,createdKey:p.repo._createdKey??void 0,pageSize:p.pageSize??25,filterableFields:x,mutableFields:w,createFields:T,allowDelete:p.allowDelete??false,allowedIncludes:p.allowedIncludes,validate:p.validate};f[y]=$;}let u=er(f,i,a),g=e.openapi,b=g&&typeof g=="object"?g:{},h=null;function m(){if(!h){let y=o&&typeof o!="function"?"basic":o?"bearer":false;h=qt(f,i,{...b,auth:b.auth??y});}return h}let v=new X;if(v.use((y,p,l)=>{p.set("Access-Control-Allow-Origin","*"),p.set("Access-Control-Allow-Credentials","true"),l();}),r&&v.use(async(y,p,l)=>{let x=y;if(String(x.headers?.["content-type"]??"").includes("application/json")){if(typeof x.body=="string")try{y.body=JSON.parse(x.body);}catch{}else if(Buffer.isBuffer(y.rawBody))try{let T=await Fo(x);y.body=JSON.parse(T);}catch{}}await l();}),o)if(typeof o=="function")v.use(o);else {let y=o.realm??"API",p="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");v.use((l,x,w)=>{if((l.headers?.authorization??"")!==p){x.status(401).set("WWW-Authenticate",`Basic realm="${y}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}w();});}for(let y of s)v.use(y);if(g!==false){let y=`${i}/__spec.json`,p=`${i}/__docs`;v.get(y,(l,x)=>{let w=m();x.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(w,null,2));}),v.get(p,(l,x)=>{let w=jo(l,i)+"/__spec.json",T=_o(b.title??"CRUD API",w);x.status(200).set("Content-Type","text/html; charset=utf-8").send(T);});}v.use((y,p,l)=>{if(y.method==="OPTIONS"){u.handleOptions(y,p);return}l();}),v.get(`${i}/:repoName`,u.handleList),v.post(`${i}/:repoName/query`,u.handleQuery),v.get(`${i}/:repoName/:id`,u.handleGet),v.post(`${i}/:repoName`,u.handleCreate),v.put(`${i}/:repoName/:id`,(y,p)=>u.handleUpdate(y,p,false)),v.patch(`${i}/:repoName/:id`,(y,p)=>u.handleUpdate(y,p,true)),v.delete(`${i}/:repoName/:id`,u.handleDelete);let d=async(y,p)=>{await v.handle(y,p);};return d.spec=m,c&&(d.httpsOptions=c),d}function rr(e,t){if(!t.onRequest)return e;let n=e.httpsOptions??t.httpsOptions;return n?t.onRequest(n,e):t.onRequest(e)}function or(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 sr(e,t={}){return {admin(n){let r=or(e,n.repos,"admin"),o=Gn({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return rr(o,t)},crud(n){let r=or(e,n.repos,"crud"),o=nr({...n,repos:r,httpsOptions:n.httpsOptions??t.httpsOptions});return rr(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}),Cn(e,r)}}}function ki(e){return t=>({...t,schema:e,type:null,documentRef:null,update:null})}function Ci(e,t){let n={...e};for(let r in t)t[r]&&(n[r]={...e[r],relationalKeys:t[r]});return n}var Kt=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]=mt(this.db,this.mapping[t],{});for(let t of Object.keys(this.mapping))this.allRepositories[t]=mt(this.db,this.mapping[t],this.allRepositories);}getRepository(t){return this.allRepositories[t]}};function Oi(e,t){let n=new Kt(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=X;exports.RepositoryMapping=Kt;exports.applyPaginationQueryOptions=le;exports.buildAndExecuteQuery=be;exports.buildRepositoryRelations=Ci;exports.coerceToDate=ut;exports.createPaginationIterator=pt;exports.createRepositoryConfig=ki;exports.createRepositoryMapping=Oi;exports.createServers=sr;exports.executePaginatedQuery=Je;exports.getDateHandling=dt;exports.normalizeTimestamps=We;exports.setDateHandling=mr;//# sourceMappingURL=index.cjs.map
|
|
1129
1147
|
//# sourceMappingURL=index.cjs.map
|