@lpdjs/firestore-repo-service 2.1.11 → 2.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,24 +1,24 @@
1
- 'use strict';var zod=require('zod'),jsxRuntime=require('hono/jsx/jsx-runtime'),server=require('hono/jsx/dom/server');function Ht(e,t){let n=[];for(let s=0;s<e.length;s+=t)n.push(e.slice(s,s+t));return n}function pe(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 Se(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function rt(e){let[t,n,s]=e;return Se(e)?Ht(s,30).map(o=>[t,n,o]):[e]}function be(e,t){let n=e;for(let[s,r,o]of t)n=n.where(String(s),r,o);return n}async function st(e){let t=await Promise.all(e.map(r=>r.get())),n=new Map;t.forEach(r=>{r.docs.forEach(o=>{n.has(o.id)||n.set(o.id,o);});});let s=t[0];if(!s)throw new Error("No snapshots returned");return {...s,docs:Array.from(n.values()),size:n.size,empty:n.size===0}}async function se(e,t){let n=t.orWhere&&t.orWhere.length>0,s=t.orWhereGroups&&t.orWhereGroups.length>0;if(!n&&!s){if(!t.where||t.where.length===0)return pe(e,t).get();if(!t.where.some(Se)){let m=be(e,t.where);return m=pe(m,t),m.get()}let i=t.where.map(rt),u=Ce(i).map(m=>{let l=be(e,m);return l=pe(l,t),l});return st(u)}let r=t.where??[],o=[...t.orWhere?.map(d=>[d])??[],...t.orWhereGroups??[]],a=[];for(let d of o){let i=[...r,...d];if(i.some(Se)){let u=i.map(rt),l=Ce(u).map(p=>{let y=be(e,p);return y=pe(y,t),y});a.push(...l);}else {let u=be(e,i);u=pe(u,t),a.push(u);}}return st(a)}function Ce(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),s=Ce(n),r=[];for(let o of t)for(let a of s)r.push([o,...a]);return r}function ot(e,t){let n=[];for(let s=0;s<e.length;s+=t)n.push(e.slice(s,s+t));return n}function H(e){return e.charAt(0).toUpperCase()+e.slice(1)}function X(e,t){return t.where&&t.where.forEach(([n,s,r])=>{e=e.where(String(n),s,r);}),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 xe(e,t){let n={...t,limit:t.pageSize+1};t.cursor&&(t.direction==="prev"?n.endBefore=t.cursor:n.startAfter=t.cursor);let r=(await se(e,n)).docs,o=r.length>t.pageSize,a=o?r.slice(0,t.pageSize):r,d=a.map(c=>({...c.data(),docId:c.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*Ae(e,t){let n,s=true;for(;s;){let r=await xe(e,{...t,cursor:n,direction:"next"});yield r,s=r.hasNextPage,n=r.nextCursor;}}function at(e){return {count:async(t={})=>{let n=e;return n=X(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let s=e;s=X(s,n);let r=await s.get(),o=0;return r.forEach(a=>{let d=a.data()[t];typeof d=="number"&&(o+=d);}),o},average:async(t,n={})=>{let s=e;s=X(s,n);let r=await s.get();if(r.empty)return null;let o=0,a=0;return r.forEach(d=>{let i=d.data()[t];typeof i=="number"&&(o+=i,a++);}),a>0?o/a:null}}}function it(e,t,n,s,r,o){let a=()=>new Date;return {create:()=>{let d=e.batch();return {batch:d,set:(...i)=>{let c=i[i.length-1],u=typeof c=="object"&&c!==null&&"merge"in c,m=u?i[i.length-2]:i[i.length-1],l=u?i.slice(0,-2):i.slice(0,-1),p=u?c:{merge:true},y=t(...l),h={...m},f=l[l.length-1];n&&f&&(h[n]=f),s&&(h[s]=y.path),r&&(h[r]=a()),o&&(h[o]=a()),d.set(y,h,p);},update:(...i)=>{let c=i.pop(),m=t(...i),l={...c};o&&(l[o]=a()),d.update(m,l);},delete:(...i)=>{let c=t(...i);d.delete(c);},commit:async()=>{await d.commit();}}}}}function lt(e,t,n){let s=()=>new Date;return {set:async r=>{let o=e.bulkWriter(),a=0;for(let d of r){if(!d)continue;let{docRef:i,data:c,merge:u=true}=d,m={...c};t&&(m[t]=s()),n&&(m[n]=s()),o.set(i,m,{merge:u}),a++,a>=500&&(await o.flush(),a=0);}await o.close();},update:async r=>{let o=e.bulkWriter(),a=0;for(let d of r){if(!d)continue;let{docRef:i,data:c}=d,u={...c};n&&(u[n]=s()),o.update(i,u),a++,a>=500&&(await o.flush(),a=0);}await o.close();},delete:async r=>{let o=e.bulkWriter(),a=0;for(let d of r)d&&(o.delete(d),a++,a>=500&&(await o.flush(),a=0));await o.close();}}}function ct(e,t,n,s,r,o){let a=()=>new Date;return {create:async m=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let l,p,y={...m};if(r&&(y[r]=a()),o&&(y[o]=a()),m[n]){p=m[n],l=e.doc(p);let f=s?{...y,[s]:l.path}:y;await l.set(f);}else {l=await e.add(y),p=l.id;let f={[n]:p};s&&(f[s]=l.path),await l.update(f);}return (await l.get()).data()},set:async(...m)=>{let l=m[m.length-1],p=typeof l=="object"&&l!==null&&"merge"in l,y=p?m[m.length-2]:m[m.length-1],h=p?m.slice(0,-2):m.slice(0,-1),f=p?l:{merge:true},b={...y};o&&(b[o]=a());let x=t(...h),g=h[h.length-1];return n&&g!=null&&(b[n]=g),s&&(b[s]=x.path),await x.set(b,f),(await x.get()).data()},update:async(...m)=>{let l=m.pop(),p=m,y={...l};o&&(y[o]=a());let h=t(...p);return await h.update(y),(await h.get()).data()},delete:async(...m)=>{await t(...m).delete();}}}function dt(e,t,n,s,r){let o={};return o.byList=async(a,d,i="in",c={})=>{if(d.length===0)return [];let u=[],m=ot(d,30);for(let l of m){let p=e;p=p.where(a,i,l),c.select&&c.select.length>0&&(p=p.select(...c.select.map(h=>String(h)))),(await p.get()).forEach(h=>{let f=h.data();u.push(c.returnDoc?{data:f,doc:h}:f);});}return u},t.forEach(a=>{let d=`by${H(String(a))}`;o[d]=async(i,c={})=>{let u=typeof c=="boolean"?{returnDoc:c}:c;if(String(a)===r){let f=await s(i).get();if(!f.exists)return null;let b=f.data();return u.returnDoc?{data:b,doc:f}:b}let m=e;m=m.where(String(a),"==",i).limit(1),u.select&&u.select.length>0&&(m=m.select(...u.select.map(h=>String(h))));let l=await m.get();if(l.empty)return null;let p=l.docs[0];if(!p)return null;let y=p.data();return u.returnDoc?{data:y,doc:p}:y};}),o}function ut(e,t,n,s){let r={},o=async(a,d)=>{if(!n||!s||d.length===0)return a;let i=d.map(c=>typeof c=="string"?{key:c}:{key:c.relation,select:c.select});return Promise.all(a.map(async c=>{let u=await Promise.all(i.map(async({key:l,select:p})=>{let y=n[l];if(!y)return [l,void 0];let h=s[y.repo];if(!h)return [l,void 0];let f=c[l];if(f==null)return [l,y.type==="one"?null:[]];let b=p?{select:p}:void 0;try{if(y.type==="one"){let x=`by${H(y.key)}`,g=typeof h.get?.[x]=="function"?await h.get[x](f,b):null;return [l,g]}else {let x=`by${H(y.key)}`,g=typeof h.query?.[x]=="function"?await h.query[x](f,b):[];return [l,g]}}catch(x){return console.error(`[include] Error populating "${l}":`,x),[l,y.type==="one"?null:[]]}})),m={};for(let[l,p]of u)l!==void 0&&(m[l]=p);return {...c,populated:m}}))};return t.forEach(a=>{let d=`by${H(a)}`;r[d]=async(i,c={})=>{let u={...c,where:[[a,"==",i],...c.where??[]]};return (await se(e,u)).docs.map(l=>l.data())};}),r.by=async a=>(await se(e,a)).docs.map(i=>i.data()),r.getAll=async(a={})=>(await se(e,a)).docs.map(i=>i.data()),r.onSnapshot=(a,d,i)=>X(e,a).onSnapshot(u=>{d(u.docs.map(m=>m.data()));},i),r.paginate=async a=>{let{include:d,...i}=a,c=await xe(e,i);if(d&&d.length>0){let u=await o(c.data,d);return {...c,data:u}}return c},r.paginateAll=async function*(a){let{include:d,...i}=a;for await(let c of Ae(e,i))if(d&&d.length>0){let u=await o(c.data,d);yield {...c,data:u};}else yield c;},r}function pt(e,t){return {populate:async(n,s)=>{if(!e.relationalKeys)return {...n,populated:{}};let r,o={};if(typeof s=="object"&&!Array.isArray(s))if("relation"in s){let i=s;r=[i.relation],i.select&&(o[i.relation]=i.select);}else if("relations"in s){let i=s;r=Array.isArray(i.relations)?i.relations:[i.relations],o=i.select??{};}else r=[];else r=Array.isArray(s)?s:[s];let a=await Promise.all(r.map(async i=>{let c=e.relationalKeys?.[i];if(!c)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let u=t[c.repo];if(!u)return console.warn(`[populate] Repository "${c.repo}" not found in mapping`),[i,void 0];let m=n[i];if(m==null)return [i,c.type==="one"?null:[]];let l=o[i],p=l?{select:l}:void 0;try{if(c.type==="one"){let y=`by${H(c.key)}`,h=typeof u.get?.[y]=="function"?await u.get[y](m,p):null;return [i,h]}else {let y=`by${H(c.key)}`,h=typeof u.query?.[y]=="function"?await u.query[y](m,p):[];return [i,h]}}catch(y){return console.error(`[populate] Error populating "${i}":`,y),[i,c.type==="one"?null:[]]}})),d={};for(let[i,c]of a)c!==void 0&&(d[i]=c);return {...n,populated:d}}}}function ft(e,t){return {run:async n=>e.runTransaction(async s=>n({get:async(...o)=>{let a=t(...o),d=await s.get(a);return d.exists?{...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],c=d?o.slice(0,-2):o.slice(0,-1),u=d?a:{merge:true},m=t(...c);s.set(m,i,u);},update:(...o)=>{let a=o[o.length-1],d=o.slice(0,-1),i=t(...d);s.update(i,a);},delete:(...o)=>{let a=t(...o);s.delete(a);},raw:s}))}}function Vt(e){if(typeof e!="function")return [];let n=e.toString().match(/^\s*(?:function\s*\w*\s*)?\(([^)]*)\)/);if(!n?.[1])return [];let s=n[1].split(",").map(r=>r.trim().replace(/\s*[:=].*$/,"").trim()).filter(Boolean);return s.length<=2?[]:s.slice(1,-1)}function Oe(e,t,n={}){let s=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),r=t.isGroup?null:e.collection(t.path),o=(...y)=>t.refCb(e,...y),a=dt(s,t.foreignKeys,r,o,t.documentKey),d=ut(s,t.queryKeys,t.relationalKeys,n),i=at(s),c=ct(r,o,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),u=it(e,o,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),m=ft(e,o),l=lt(e,t.createdKey,t.updatedKey),p=pt(t,n);return {ref:s,documentRef:o,get:a,query:d,aggregate:i,...c,batch:u,transaction:m,bulk:l,...p,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(y=>typeof y=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?Vt(t.refCb):[],_createdKey:t.createdKey??null}}var Jt={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 Z(e){let t=e,n=t._zod?.def?.type;if(n)return Jt[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let s=t._def?.typeName;return s||""}function Q(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function yt(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function mt(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 fe(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 ke(e){let t=e;return t._zod?.def?.entries?t._zod.def.entries:t.enum&&typeof t.enum=="object"?t.enum:t._def?.values&&typeof t._def.values=="object"?t._def.values:{}}function gt(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function ht(e){let t=e,n=[],s=t._zod?.def?.checks;if(Array.isArray(s)){for(let o of s)o.format&&n.push(o.format);if(n.length>0)return n}let r=t._def?.checks;if(Array.isArray(r))for(let o of r)o.kind&&n.push(o.kind);return n}function Xt(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function bt(e){let t=e,n=true,s=false,r;for(;;){let o=Z(t);if(o==="ZodOptional")n=false,t=Q(t);else if(o==="ZodNullable")n=false,s=true,t=Q(t);else if(o==="ZodDefault")n=false,r=mt(t),t=Q(t);else break}return {inner:t,required:n,nullable:s,defaultValue:r}}function U(e,t=""){if(Z(e)==="ZodObject"){let s=fe(e);return Object.entries(s).map(([r,o])=>xt(t?`${t}.${r}`:r,r,o))}return [xt(t||"value",t||"value",e)]}function xt(e,t,n){let{inner:s,required:r,nullable:o,defaultValue:a}=bt(n),d=Z(s),i=Xt(t.split(".").pop()??t);switch(d){case "ZodString":{let c=ht(s),u=c.includes("email"),m=c.includes("url");return {name:e,label:i,type:"text",required:r,nullable:o,defaultValue:a,hint:u?"email":m?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:i,type:"number",required:r,nullable:o,defaultValue:a};case "ZodBoolean":return {name:e,label:i,type:"checkbox",required:r,nullable:o,defaultValue:a};case "ZodDate":case "ZodCoerce":return {name:e,label:i,type:"datetime-local",required:r,nullable:o,defaultValue:a};case "ZodEnum":{let c=$e(s);return {name:e,label:i,type:"select",required:r,nullable:o,defaultValue:a,options:c}}case "ZodNativeEnum":{let c=ke(s),u=Object.values(c).filter(m=>typeof m=="string");return {name:e,label:i,type:"select",required:r,nullable:o,defaultValue:a,options:u}}case "ZodLiteral":{let c=String(gt(s)??"");return {name:e,label:i,type:"select",required:r,nullable:o,defaultValue:a,options:[c]}}case "ZodObject":{let c=U(s,e);return {name:e,label:i,type:"textarea",required:r,nullable:o,defaultValue:a,nested:c,hint:"JSON object"}}case "ZodArray":{let c=yt(s);if(!c)return {name:e,label:i,type:"textarea",required:r,nullable:o,defaultValue:a,hint:"JSON array"};let{inner:u}=bt(c),m=Z(u),l,p,y;switch(m){case "ZodString":l="text";break;case "ZodNumber":case "ZodBigInt":l="number";break;case "ZodBoolean":l="checkbox";break;case "ZodDate":l="datetime-local";break;case "ZodEnum":l="select",p=$e(u);break;case "ZodNativeEnum":l="select",p=Object.values(ke(u)).filter(h=>typeof h=="string");break;case "ZodObject":l="object",y=U(u);break;default:return {name:e,label:i,type:"textarea",required:r,nullable:o,defaultValue:a,hint:"JSON array"}}return {name:e,label:i,type:"textarea",required:r,nullable:o,defaultValue:a,arrayElementType:l,arrayElementOptions:p,arrayElementFields:y}}default:return {name:e,label:i,type:"textarea",required:r,nullable:o,defaultValue:a,hint:"JSON"}}}function Pe(e,t=0){let n=t>0?`ml-${t*4}`:"",s=`field_${e.name.replace(/\./g,"__")}`,r=e.name,o=e.required?" required":"",a=e.defaultValue==="__null__",d=!a&&e.defaultValue!=null?String(e.defaultValue):"",i=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
2
- <input type="hidden" id="${s}__isnull" name="${r}__isnull" value="${a?"1":""}">
1
+ 'use strict';var firestore=require('firebase-admin/firestore'),zod=require('zod'),jsxRuntime=require('hono/jsx/jsx-runtime'),server=require('hono/jsx/dom/server');function an(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function ge(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 Ie(e){let[,t,n]=e;return (t==="in"||t==="array-contains-any")&&Array.isArray(n)&&n.length>30}function ft(e){let[t,n,r]=e;return Ie(e)?an(r,30).map(s=>[t,n,s]):[e]}function Oe(e,t){let n=e;for(let[r,o,s]of t)n=n.where(String(r),o,s);return n}async function yt(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 ae(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 ge(e,t).get();if(!t.where.some(Ie)){let m=Oe(e,t.where);return m=ge(m,t),m.get()}let i=t.where.map(ft),u=Ne(i).map(m=>{let c=Oe(e,m);return c=ge(c,t),c});return yt(u)}let o=t.where??[],s=[...t.orWhere?.map(d=>[d])??[],...t.orWhereGroups??[]],a=[];for(let d of s){let i=[...o,...d];if(i.some(Ie)){let u=i.map(ft),c=Ne(u).map(p=>{let y=Oe(e,p);return y=ge(y,t),y});a.push(...c);}else {let u=Oe(e,i);u=ge(u,t),a.push(u);}}return yt(a)}function Ne(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=Ne(n),o=[];for(let s of t)for(let a of r)o.push([s,...a]);return o}var Fe="preserve";function ln(e){Fe=e;}function Ze(){return Fe}function cn(e){return typeof e=="object"&&e!==null&&typeof e._seconds=="number"&&typeof e._nanoseconds=="number"}function ze(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(cn(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 dn(e){if(typeof e!="object"||e===null)return false;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Ae(e){if(e instanceof firestore.Timestamp)return e.toDate();if(Array.isArray(e))return e.map(t=>Ae(t));if(dn(e)){let t={};for(let[n,r]of Object.entries(e))t[n]=Ae(r);return t}return e}function _(e){return Fe==="normalize"?Ae(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 J(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Y(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 ke(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 ae(e,n)).docs,s=o.length>t.pageSize,a=s?o.slice(0,t.pageSize):o,d=a.map(l=>_({...l.data(),docId:l.id})),i=t.direction==="prev";return {data:d,nextCursor:i?a.length>0?a[a.length-1]:void 0:s?a[a.length-1]:void 0,prevCursor:i?s?a[0]:void 0:a[0],hasNextPage:i?!!t.cursor:s,hasPrevPage:i?s:!!t.cursor,pageSize:d.length}}async function*je(e,t){let n,r=true;for(;r;){let o=await ke(e,{...t,cursor:n,direction:"next"});yield o,r=o.hasNextPage,n=o.nextCursor;}}function ht(e){return {count:async(t={})=>{let n=e;return n=Y(n,t),(await n.count().get()).data().count},sum:async(t,n={})=>{let r=e;r=Y(r,n);let o=await r.get(),s=0;return o.forEach(a=>{let d=a.data()[t];typeof d=="number"&&(s+=d);}),s},average:async(t,n={})=>{let r=e;r=Y(r,n);let o=await r.get();if(o.empty)return null;let s=0,a=0;return o.forEach(d=>{let i=d.data()[t];typeof i=="number"&&(s+=i,a++);}),a>0?s/a:null}}}function bt(e,t,n,r,o,s){let a=()=>new Date;return {create:()=>{let d=e.batch();return {batch:d,set:(...i)=>{let l=i[i.length-1],u=typeof l=="object"&&l!==null&&"merge"in l,m=u?i[i.length-2]:i[i.length-1],c=u?i.slice(0,-2):i.slice(0,-1),p=u?l:{merge:true},y=t(...c),g={...m},f=c[c.length-1];n&&f&&(g[n]=f),r&&(g[r]=y.path),o&&(g[o]=a()),s&&(g[s]=a()),d.set(y,g,p);},update:(...i)=>{let l=i.pop(),m=t(...i),c={...l};s&&(c[s]=a()),d.update(m,c);},delete:(...i)=>{let l=t(...i);d.delete(l);},commit:async()=>{await d.commit();}}}}}function xt(e,t,n){let r=()=>new Date;return {set:async o=>{let s=e.bulkWriter(),a=0;for(let d of o){if(!d)continue;let{docRef:i,data:l,merge:u=true}=d,m={...l};t&&(m[t]=r()),n&&(m[n]=r()),s.set(i,m,{merge:u}),a++,a>=500&&(await s.flush(),a=0);}await s.close();},update:async o=>{let s=e.bulkWriter(),a=0;for(let d of o){if(!d)continue;let{docRef:i,data:l}=d,u={...l};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 d of o)d&&(s.delete(d),a++,a>=500&&(await s.flush(),a=0));await s.close();}}}function vt(e,t,n,r,o,s){let a=()=>new Date;return {create:async m=>{if(!e)throw new Error("Cannot use create() on collection groups. Use set() with a specific document ID instead.");let c,p,y={...m};if(o&&(y[o]=a()),s&&(y[s]=a()),m[n]){p=m[n],c=e.doc(p);let f=r?{...y,[r]:c.path}:y;await c.set(f);}else {c=await e.add(y),p=c.id;let f={[n]:p};r&&(f[r]=c.path),await c.update(f);}let g=await c.get();return _(g.data())},set:async(...m)=>{let c=m[m.length-1],p=typeof c=="object"&&c!==null&&"merge"in c,y=p?m[m.length-2]:m[m.length-1],g=p?m.slice(0,-2):m.slice(0,-1),f=p?c:{merge:true},b={...y};s&&(b[s]=a());let x=t(...g),h=g[g.length-1];n&&h!=null&&(b[n]=h),r&&(b[r]=x.path),await x.set(b,f);let v=await x.get();return _(v.data())},update:async(...m)=>{let c=m.pop(),p=m,y={...c};s&&(y[s]=a());let g=t(...p);await g.update(y);let f=await g.get();return _(f.data())},delete:async(...m)=>{await t(...m).delete();}}}function Rt(e,t,n,r,o){let s={};return s.byList=async(a,d,i="in",l={})=>{if(d.length===0)return [];let u=[],m=gt(d,30);for(let c of m){let p=e;p=p.where(a,i,c),l.select&&l.select.length>0&&(p=p.select(...l.select.map(g=>String(g)))),(await p.get()).forEach(g=>{let f=_(g.data());u.push(l.returnDoc?{data:f,doc:g}:f);});}return u},t.forEach(a=>{let d=`by${J(String(a))}`;s[d]=async(i,l={})=>{let u=typeof l=="boolean"?{returnDoc:l}:l;if(String(a)===o){let f=await r(i).get();if(!f.exists)return null;let b=_(f.data());return u.returnDoc?{data:b,doc:f}:b}let m=e;m=m.where(String(a),"==",i).limit(1),u.select&&u.select.length>0&&(m=m.select(...u.select.map(g=>String(g))));let c=await m.get();if(c.empty)return null;let p=c.docs[0];if(!p)return null;let y=_(p.data());return u.returnDoc?{data:y,doc:p}:y};}),s}function wt(e,t,n,r){let o={},s=async(a,d)=>{if(!n||!r||d.length===0)return a;let i=d.map(l=>typeof l=="string"?{key:l}:{key:l.relation,select:l.select});return Promise.all(a.map(async l=>{let u=await Promise.all(i.map(async({key:c,select:p})=>{let y=n[c];if(!y)return [c,void 0];let g=r[y.repo];if(!g)return [c,void 0];let f=l[c];if(f==null)return [c,y.type==="one"?null:[]];let b=p?{select:p}:void 0;try{if(y.type==="one"){let x=`by${J(y.key)}`,h=typeof g.get?.[x]=="function"?await g.get[x](f,b):null;return [c,h]}else {let x=`by${J(y.key)}`,h=typeof g.query?.[x]=="function"?await g.query[x](f,b):[];return [c,h]}}catch(x){return console.error(`[include] Error populating "${c}":`,x),[c,y.type==="one"?null:[]]}})),m={};for(let[c,p]of u)c!==void 0&&(m[c]=p);return {...l,populated:m}}))};return t.forEach(a=>{let d=`by${J(a)}`;o[d]=async(i,l={})=>{let u={...l,where:[[a,"==",i],...l.where??[]]};return (await ae(e,u)).docs.map(c=>_(c.data()))};}),o.by=async a=>(await ae(e,a)).docs.map(i=>_(i.data())),o.getAll=async(a={})=>(await ae(e,a)).docs.map(i=>_(i.data())),o.onSnapshot=(a,d,i)=>Y(e,a).onSnapshot(u=>{d(u.docs.map(m=>_(m.data())));},i),o.paginate=async a=>{let{include:d,...i}=a,l=await ke(e,i);if(d&&d.length>0){let u=await s(l.data,d);return {...l,data:u}}return l},o.paginateAll=async function*(a){let{include:d,...i}=a;for await(let l of je(e,i))if(d&&d.length>0){let u=await s(l.data,d);yield {...l,data:u};}else yield l;},o}function Tt(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 l=e.relationalKeys?.[i];if(!l)return console.warn(`[populate] Relation "${i}" not found in config`),[i,void 0];let u=t[l.repo];if(!u)return console.warn(`[populate] Repository "${l.repo}" not found in mapping`),[i,void 0];let m=n[i];if(m==null)return [i,l.type==="one"?null:[]];let c=s[i],p=c?{select:c}:void 0;try{if(l.type==="one"){let y=`by${J(l.key)}`,g=typeof u.get?.[y]=="function"?await u.get[y](m,p):null;return [i,g]}else {let y=`by${J(l.key)}`,g=typeof u.query?.[y]=="function"?await u.query[y](m,p):[];return [i,g]}}catch(y){return console.error(`[populate] Error populating "${i}":`,y),[i,l.type==="one"?null:[]]}})),d={};for(let[i,l]of a)l!==void 0&&(d[i]=l);return {...n,populated:d}}}}function St(e,t){return {run:async n=>e.runTransaction(async r=>n({get:async(...s)=>{let a=t(...s),d=await r.get(a);return d.exists?_({...d.data(),docId:d.id}):null},set:(...s)=>{let a=s[s.length-1],d=typeof a=="object"&&a!==null&&"merge"in a,i=d?s[s.length-2]:s[s.length-1],l=d?s.slice(0,-2):s.slice(0,-1),u=d?a:{merge:true},m=t(...l);r.set(m,i,u);},update:(...s)=>{let a=s[s.length-1],d=s.slice(0,-1),i=t(...d);r.update(i,a);},delete:(...s)=>{let a=t(...s);r.delete(a);},raw:r}))}}function un(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 Me(e,t,n={}){let r=t.isGroup?e.collectionGroup(t.path):e.collection(t.path),o=t.isGroup?null:e.collection(t.path),s=(...y)=>t.refCb(e,...y),a=Rt(r,t.foreignKeys,o,s,t.documentKey),d=wt(r,t.queryKeys,t.relationalKeys,n),i=ht(r),l=vt(o,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),u=bt(e,s,t.documentKey,t.pathKey,t.createdKey,t.updatedKey),m=St(e,s),c=xt(e,t.createdKey,t.updatedKey),p=Tt(t,n);return {ref:r,documentRef:s,get:a,query:d,aggregate:i,...l,batch:u,transaction:m,bulk:c,...p,schema:t.schema,relationalKeys:t.relationalKeys,_systemKeys:[t.documentKey,t.pathKey,t.createdKey,t.updatedKey].filter(y=>typeof y=="string"),_pathKey:t.pathKey??null,_isGroup:!!t.isGroup,_parentKeys:t.isGroup?un(t.refCb):[],_createdKey:t.createdKey??null}}var pn={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 Z(e){let t=e,n=t._zod?.def?.type;if(n)return pn[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 Ct(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function Ot(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 he(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 be(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 xe(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 $e(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function At(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}function fn(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function kt(e){let t=e,n=true,r=false,o;for(;;){let s=Z(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=Ot(t),t=K(t);else break}return {inner:t,required:n,nullable:r,defaultValue:o}}function W(e,t=""){if(Z(e)==="ZodObject"){let r=he(e);return Object.entries(r).map(([o,s])=>$t(t?`${t}.${o}`:o,o,s))}return [$t(t||"value",t||"value",e)]}function $t(e,t,n){let{inner:r,required:o,nullable:s,defaultValue:a}=kt(n),d=Z(r),i=fn(t.split(".").pop()??t);switch(d){case "ZodString":{let l=At(r),u=l.includes("email"),m=l.includes("url");return {name:e,label:i,type:"text",required:o,nullable:s,defaultValue:a,hint:u?"email":m?"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 l=be(r);return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:l}}case "ZodNativeEnum":{let l=xe(r),u=Object.values(l).filter(m=>typeof m=="string");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:u}}case "ZodLiteral":{let l=String($e(r)??"");return {name:e,label:i,type:"select",required:o,nullable:s,defaultValue:a,options:[l]}}case "ZodObject":{let l=W(r,e);return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,nested:l,hint:"JSON object"}}case "ZodArray":{let l=Ct(r);if(!l)return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON array"};let{inner:u}=kt(l),m=Z(u),c,p,y;switch(m){case "ZodString":c="text";break;case "ZodNumber":case "ZodBigInt":c="number";break;case "ZodBoolean":c="checkbox";break;case "ZodDate":c="datetime-local";break;case "ZodEnum":c="select",p=be(u);break;case "ZodNativeEnum":c="select",p=Object.values(xe(u)).filter(g=>typeof g=="string");break;case "ZodObject":c="object",y=W(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:c,arrayElementOptions:p,arrayElementFields:y}}default:return {name:e,label:i,type:"textarea",required:o,nullable:s,defaultValue:a,hint:"JSON"}}}function Be(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.name,s=e.required?" required":"",a=e.defaultValue==="__null__",d=!a&&e.defaultValue!=null?String(e.defaultValue):"",i=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
2
+ <input type="hidden" id="${r}__isnull" name="${o}__isnull" value="${a?"1":""}">
3
3
  <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">
4
4
  <input type="checkbox" class="checkbox checkbox-xs" ${a?"checked":""}
5
5
  onchange="(function(cb){
6
- var inp = document.getElementById('${s}');
7
- var h = document.getElementById('${s}__isnull');
6
+ var inp = document.getElementById('${r}');
7
+ var h = document.getElementById('${r}__isnull');
8
8
  if (cb.checked) { inp.disabled=true; inp.style.opacity='0.35'; h.value='1'; }
9
9
  else { inp.disabled=false; inp.style.opacity=''; h.value=''; }
10
10
  })(this)">
11
11
  <span>null</span>
12
12
  </label>
13
- </span>`:"",c;switch(e.type){case "checkbox":if(e.nullable){let u=a?"__null__":d==="true"?"true":d==="false"?"false":"__null__";return `
13
+ </span>`:"",l;switch(e.type){case "checkbox":if(e.nullable){let u=a?"__null__":d==="true"?"true":d==="false"?"false":"__null__";return `
14
14
  <div class="form-control mb-3 ${n}">
15
- <label for="${s}" class="label pb-1">
15
+ <label for="${r}" class="label pb-1">
16
16
  <span class="label-text font-medium">
17
17
  ${S(e.label)}
18
18
  <span class="text-base-content/40 text-xs ml-1">(nullable)</span>
19
19
  </span>
20
20
  </label>
21
- <select id="${s}" name="${r}" class="select select-bordered select-sm w-full">
21
+ <select id="${r}" name="${o}" class="select select-bordered select-sm w-full">
22
22
  <option value="__null__"${u==="__null__"?" selected":""}>\u2014 null \u2014</option>
23
23
  <option value="true"${u==="true"?" selected":""}>\u2713 true</option>
24
24
  <option value="false"${u==="false"?" selected":""}>\u2717 false</option>
@@ -26,49 +26,49 @@
26
26
  </div>`}return `
27
27
  <div class="form-control ${n}">
28
28
  <label class="label cursor-pointer justify-start gap-3">
29
- <input type="checkbox" id="${s}" name="${r}" value="true"${d==="true"?" checked":""} class="checkbox checkbox-primary checkbox-sm">
29
+ <input type="checkbox" id="${r}" name="${o}" value="true"${d==="true"?" checked":""} class="checkbox checkbox-primary checkbox-sm">
30
30
  <span class="label-text font-medium">
31
31
  ${S(e.label)}${e.required?' <span class="text-error">*</span>':""}
32
32
  </span>
33
33
  </label>
34
- </div>`;case "select":c=`<select id="${s}" name="${r}"${o}${a?' disabled style="opacity:0.35"':""} class="select select-bordered select-sm w-full">
34
+ </div>`;case "select":l=`<select id="${r}" name="${o}"${s}${a?' disabled style="opacity:0.35"':""} class="select select-bordered select-sm w-full">
35
35
  ${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
36
36
  ${(e.options??[]).map(u=>`<option value="${S(u)}"${d===u?" selected":""}>${S(u)}</option>`).join(`
37
37
  `)}
38
- </select>`;break;case "textarea":if(e.arrayElementType)return Yt(e,t);if(e.nested&&e.nested.length>0){let u=e.nested.map(m=>Pe(m,t+1)).join(`
38
+ </select>`;break;case "textarea":if(e.arrayElementType)return yn(e,t);if(e.nested&&e.nested.length>0){let u=e.nested.map(m=>Be(m,t+1)).join(`
39
39
  `);return `
40
40
  <fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}">
41
41
  <legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
42
42
  ${S(e.label)}${e.required?' <span class="text-error">*</span>':""}
43
43
  </legend>
44
44
  ${u}
45
- </fieldset>`}c=`<textarea id="${s}" name="${r}"${o} rows="3"${a?' disabled style="opacity:0.35"':""}
45
+ </fieldset>`}l=`<textarea id="${r}" name="${o}"${s} rows="3"${a?' disabled style="opacity:0.35"':""}
46
46
  data-json
47
47
  class="textarea textarea-bordered textarea-sm w-full font-mono text-xs"
48
- placeholder="${S(e.hint??"JSON")}">${S(d)}</textarea>`;break;default:c=`<input type="${e.type}" id="${s}" name="${r}"${o}${a?' disabled style="opacity:0.35"':""}
48
+ placeholder="${S(e.hint??"JSON")}">${S(d)}</textarea>`;break;default:l=`<input type="${e.type}" id="${r}" name="${o}"${s}${a?' disabled style="opacity:0.35"':""}
49
49
  value="${S(d)}"
50
50
  class="input input-bordered input-sm w-full"${e.hint==="email"?' autocomplete="email"':e.hint==="url"?' autocomplete="url"':""}>`;}return `
51
51
  <div class="form-control mb-3 ${n}">
52
- <label for="${s}" class="label pb-1">
52
+ <label for="${r}" class="label pb-1">
53
53
  <span class="label-text font-medium">
54
54
  ${S(e.label)}${e.required?' <span class="text-error">*</span>':""}
55
55
  ${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${S(e.hint)})</span>`:""}
56
56
  </span>
57
57
  </label>
58
58
  <div class="flex items-center gap-2">
59
- <div class="flex-1 min-w-0">${c}</div>
59
+ <div class="flex-1 min-w-0">${l}</div>
60
60
  ${i}
61
61
  </div>
62
- </div>`}function S(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Yt(e,t){let n=t>0?`ml-${t*4}`:"",s=`field_${e.name.replace(/\./g,"__")}`,r=e.defaultValue==="__null__",o=e.arrayElementType==="object",a=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{a=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(a)||(a=[]);let d=o?a.map(u=>Rt(e,u??{})).join(`
63
- `):a.map(u=>vt(e,u)).join(`
64
- `),i=o?Rt(e,{}):vt(e,""),c=e.nullable?`<span class="flex items-center gap-1 mt-2">
65
- <input type="hidden" id="${s}__isnull" name="${S(e.name)}__isnull" value="${r?"1":""}">
62
+ </div>`}function S(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function yn(e,t){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,o=e.defaultValue==="__null__",s=e.arrayElementType==="object",a=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{a=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(a)||(a=[]);let d=s?a.map(u=>Dt(e,u??{})).join(`
63
+ `):a.map(u=>Pt(e,u)).join(`
64
+ `),i=s?Dt(e,{}):Pt(e,""),l=e.nullable?`<span class="flex items-center gap-1 mt-2">
65
+ <input type="hidden" id="${r}__isnull" name="${S(e.name)}__isnull" value="${o?"1":""}">
66
66
  <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">
67
- <input type="checkbox" class="checkbox checkbox-xs" ${r?"checked":""}
67
+ <input type="checkbox" class="checkbox checkbox-xs" ${o?"checked":""}
68
68
  onchange="(function(cb){
69
69
  var fs = cb.closest('[data-frs-array]');
70
- var h = document.getElementById('${s}__isnull');
71
- var hidden = document.getElementById('${s}');
70
+ var h = document.getElementById('${r}__isnull');
71
+ var hidden = document.getElementById('${r}');
72
72
  if (cb.checked) { fs.querySelector('[data-frs-array-items]').style.opacity='0.35'; h.value='1'; hidden.disabled=true; }
73
73
  else { fs.querySelector('[data-frs-array-items]').style.opacity=''; h.value=''; hidden.disabled=false; }
74
74
  })(this)">
@@ -80,60 +80,60 @@
80
80
  <legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
81
81
  ${S(e.label)}${e.required?' <span class="text-error">*</span>':""}
82
82
  </legend>
83
- <input type="hidden" id="${s}" name="${S(e.name)}" value="${S(JSON.stringify(a))}"${r?" disabled":""}>
84
- <div data-frs-array-items${r?' style="opacity:0.35"':""}>
83
+ <input type="hidden" id="${r}" name="${S(e.name)}" value="${S(JSON.stringify(a))}"${o?" disabled":""}>
84
+ <div data-frs-array-items${o?' style="opacity:0.35"':""}>
85
85
  ${d}
86
86
  </div>
87
87
  <template data-frs-array-tpl>${i}</template>
88
88
  <button type="button" class="btn btn-xs btn-outline mt-1" data-frs-array-add>+ Add</button>
89
- ${c}
90
- </fieldset>`}function vt(e,t){let n=t!=null?String(t):"",s;switch(e.arrayElementType){case "select":s=`<select data-frs-val class="select select-bordered select-sm flex-1">
89
+ ${l}
90
+ </fieldset>`}function Pt(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">
91
91
  <option value="">\u2014</option>
92
- ${(e.arrayElementOptions??[]).map(r=>`<option value="${S(r)}"${n===r?" selected":""}>${S(r)}</option>`).join("")}
93
- </select>`;break;case "checkbox":s=`<label class="flex items-center gap-2 flex-1 cursor-pointer">
92
+ ${(e.arrayElementOptions??[]).map(o=>`<option value="${S(o)}"${n===o?" selected":""}>${S(o)}</option>`).join("")}
93
+ </select>`;break;case "checkbox":r=`<label class="flex items-center gap-2 flex-1 cursor-pointer">
94
94
  <input type="checkbox" data-frs-val class="checkbox checkbox-sm checkbox-primary"${n==="true"?" checked":""}>
95
95
  <span class="text-sm">true</span>
96
- </label>`;break;case "number":s=`<input type="number" data-frs-val value="${S(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":s=`<input type="datetime-local" data-frs-val value="${S(n)}" class="input input-bordered input-sm flex-1">`;break;default:s=`<input type="text" data-frs-val value="${S(n)}" class="input input-bordered input-sm flex-1">`;}return `<div class="flex items-center gap-2 mb-2" data-frs-array-item>
97
- ${s}
96
+ </label>`;break;case "number":r=`<input type="number" data-frs-val value="${S(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":r=`<input type="datetime-local" data-frs-val value="${S(n)}" class="input input-bordered input-sm flex-1">`;break;default:r=`<input type="text" data-frs-val value="${S(n)}" class="input input-bordered input-sm flex-1">`;}return `<div class="flex items-center gap-2 mb-2" data-frs-array-item>
97
+ ${r}
98
98
  <button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>&times;</button>
99
- </div>`}function Rt(e,t){return `<div class="border border-base-200 rounded p-3 mb-2" data-frs-array-item>
99
+ </div>`}function Dt(e,t){return `<div class="border border-base-200 rounded p-3 mb-2" data-frs-array-item>
100
100
  <div class="flex justify-end mb-1">
101
101
  <button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>&times;</button>
102
102
  </div>
103
- ${(e.arrayElementFields??[]).map(r=>{let o=t[r.name],a=o==null?"":typeof o=="object"?JSON.stringify(o):String(o);switch(r.type){case "checkbox":return `<div class="form-control mb-2">
103
+ ${(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">
104
104
  <label class="label cursor-pointer justify-start gap-3">
105
- <input type="checkbox" data-frs-key="${S(r.name)}" class="checkbox checkbox-sm checkbox-primary"${a==="true"?" checked":""}>
106
- <span class="label-text text-sm">${S(r.label)}</span>
105
+ <input type="checkbox" data-frs-key="${S(o.name)}" class="checkbox checkbox-sm checkbox-primary"${a==="true"?" checked":""}>
106
+ <span class="label-text text-sm">${S(o.label)}</span>
107
107
  </label>
108
108
  </div>`;case "select":return `<div class="form-control mb-2">
109
- <label class="label pb-1"><span class="label-text text-sm">${S(r.label)}</span></label>
110
- <select data-frs-key="${S(r.name)}" class="select select-bordered select-sm w-full">
111
- ${r.required?"":'<option value="">\u2014</option>'}
112
- ${(r.options??[]).map(d=>`<option value="${S(d)}"${a===d?" selected":""}>${S(d)}</option>`).join("")}
109
+ <label class="label pb-1"><span class="label-text text-sm">${S(o.label)}</span></label>
110
+ <select data-frs-key="${S(o.name)}" class="select select-bordered select-sm w-full">
111
+ ${o.required?"":'<option value="">\u2014</option>'}
112
+ ${(o.options??[]).map(d=>`<option value="${S(d)}"${a===d?" selected":""}>${S(d)}</option>`).join("")}
113
113
  </select>
114
114
  </div>`;case "number":return `<div class="form-control mb-2">
115
- <label class="label pb-1"><span class="label-text text-sm">${S(r.label)}</span></label>
116
- <input type="number" data-frs-key="${S(r.name)}" value="${S(a)}" class="input input-bordered input-sm w-full">
115
+ <label class="label pb-1"><span class="label-text text-sm">${S(o.label)}</span></label>
116
+ <input type="number" data-frs-key="${S(o.name)}" value="${S(a)}" class="input input-bordered input-sm w-full">
117
117
  </div>`;case "datetime-local":return `<div class="form-control mb-2">
118
- <label class="label pb-1"><span class="label-text text-sm">${S(r.label)}</span></label>
119
- <input type="datetime-local" data-frs-key="${S(r.name)}" value="${S(a)}" class="input input-bordered input-sm w-full">
118
+ <label class="label pb-1"><span class="label-text text-sm">${S(o.label)}</span></label>
119
+ <input type="datetime-local" data-frs-key="${S(o.name)}" value="${S(a)}" class="input input-bordered input-sm w-full">
120
120
  </div>`;case "textarea":return `<div class="form-control mb-2">
121
- <label class="label pb-1"><span class="label-text text-sm">${S(r.label)}</span></label>
122
- <textarea data-frs-key="${S(r.name)}" rows="2" class="textarea textarea-bordered textarea-sm w-full font-mono text-xs" placeholder="JSON">${S(a)}</textarea>
121
+ <label class="label pb-1"><span class="label-text text-sm">${S(o.label)}</span></label>
122
+ <textarea data-frs-key="${S(o.name)}" rows="2" class="textarea textarea-bordered textarea-sm w-full font-mono text-xs" placeholder="JSON">${S(a)}</textarea>
123
123
  </div>`;default:return `<div class="form-control mb-2">
124
- <label class="label pb-1"><span class="label-text text-sm">${S(r.label)}</span></label>
125
- <input type="text" data-frs-key="${S(r.name)}" value="${S(a)}" class="input input-bordered input-sm w-full">
124
+ <label class="label pb-1"><span class="label-text text-sm">${S(o.label)}</span></label>
125
+ <input type="text" data-frs-key="${S(o.name)}" value="${S(a)}" class="input input-bordered input-sm w-full">
126
126
  </div>`}}).join(`
127
127
  `)}
128
- </div>`}function Y(e,t,n,s="Save"){let r=e.map(o=>Pe(o)).join(`
128
+ </div>`}function ee(e,t,n,r="Save"){let o=e.map(s=>Be(s)).join(`
129
129
  `);return `
130
130
  <form action="${S(t)}" method="${n}" novalidate data-frs-form>
131
- ${r}
131
+ ${o}
132
132
  <div class="flex gap-2 mt-4 pt-4 border-t border-base-200">
133
- <button type="submit" class="btn btn-primary btn-sm">${S(s)}</button>
133
+ <button type="submit" class="btn btn-primary btn-sm">${S(r)}</button>
134
134
  <button type="button" class="btn btn-ghost btn-sm" onclick="history.back()">Cancel</button>
135
135
  </div>
136
- </form>`}function wt({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function De({val: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(wt,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(wt,{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,s)=>jsxRuntime.jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},s)),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(([s,r])=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:s}),jsxRuntime.jsx("dd",{class:"break-all",children:String(r??"")})]})),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 Tt=`// \u2500\u2500 Form validation + array serialization \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
136
+ </form>`}function Et({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function Ke({val: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(Et,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(Et,{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 _t=`// \u2500\u2500 Form validation + array serialization \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
137
137
  document.addEventListener("submit", function (e) {
138
138
  var form = e.target;
139
139
  if (!form.hasAttribute("data-frs-form")) return;
@@ -552,7 +552,7 @@ function initColumnReorder(table) {
552
552
  });
553
553
  });
554
554
  }
555
- `;function me(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:Tt}})}function ee(e){return "<!DOCTYPE html>"+server.renderToString(e)}var te=({opts:e,children:t})=>{let{title:n,breadcrumb:s,flash:r,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("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.jsx("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.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[s&&s.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:s.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}),r&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${r.type==="success"?"alert-success":r.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:r.message}),r.action&&jsxRuntime.jsx("a",{href:r.action.href,...r.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:r.action.label})]}),t]}),jsxRuntime.jsx(me,{})]})]})};function Ee(e,t){return ee(jsxRuntime.jsx(te,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Ie(e,t){return ee(jsxRuntime.jsx(te,{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 Ct=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],sn=[{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"}],on=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function an(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return sn;case "ZodBoolean":return Ct;case "ZodArray":return on;default:return Ct}}function ln({col:e,active:t}){let n=t?.value??"";if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("select",{name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",children:[jsxRuntime.jsx("option",{value:"",selected:n==="",children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"})]});if(e.zodType==="ZodArray"){let s=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{type:"text",name:`fv_${e.name}`,value:n,placeholder:s?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxRuntime.jsx("input",{type:"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full"}):e.zodType==="ZodDate"?jsxRuntime.jsx("input",{type:"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full"}):jsxRuntime.jsx("input",{type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full"})}function Fe({action:e,columnMeta:t,activeFilters:n,isGroup:s}){let r=Object.fromEntries(n.map(i=>[i.field,i])),o=n.length>0,a=n.length>=2||s&&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 c=an(i.zodType),u=r[i.name],m=u?.op??c[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:[c.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:c.map(l=>jsxRuntime.jsx("option",{value:l.value,selected:l.value===m,children:l.label},l.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:c[0].value}),jsxRuntime.jsx(ln,{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"}),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"})}),s?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function _e(e,t,n,s,r,o){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${s??""}`,d=n==="create"?[{label:"Repositories",href:r},{label:e,href:`${r}/${e}`},{label:"New document"}]:[{label:"Repositories",href:r},{label:e,href:`${r}/${e}`},{label:`Edit ${s??""}`}];return ee(jsxRuntime.jsx(te,{opts:{title:a,breadcrumb:d,basePath:r,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}})})})}))}function Ne(e,t,n){let s=new URLSearchParams;for(let r of e)s.set(`fv_${r.field}`,r.value),s.set(`fo_${r.field}`,r.op);return t&&(s.set("ob",t.field),s.set("od",t.dir)),n&&s.set("ps",String(n)),s}function At(e,t,n,s,r){let o=Ne(e,s,r);return o.set("cursor",t),o.set("dir",n),`?${o.toString()}`}function cn(e,t,n,s){let r=Ne(n,void 0,s);return t?.field===e?t.dir==="asc"&&(r.set("ob",e),r.set("od","desc")):(r.set("ob",e),r.set("od","asc")),`?${r.toString()}`}function dn(e,t,n){return `?${Ne(t,n,e).toString()}`}function je(e,t,n,s,r,o,a=[],d=[],i=false,c=[],u,m,l,p){let y=`${s}/${e}`,h=`${y}/create`;return ee(jsxRuntime.jsxs(te,{opts:{title:e,breadcrumb:[{label:"Repositories",href:s},{label:e}],basePath:s,flash:o},children:[a.length>0&&jsxRuntime.jsx(Fe,{action:y,columnMeta:a,activeFilters:d,isGroup:p}),l&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${l.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:l.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:l.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:l.message})]}),l.indexUrl&&jsxRuntime.jsx("a",{href:l.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," document",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(f=>jsxRuntime.jsx("a",{href:dn(f,d,u),class:`join-item btn btn-xs ${m===f?"btn-active btn-primary":"btn-outline"}`,children:f},f))})]})]}),jsxRuntime.jsx("a",{href:h,class:"btn btn-primary btn-sm",children:"+ New"})]}),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:[[...n].map((f,b)=>{let x=u?.field===f,g=x?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:cn(f,u,d,m),class:`hover:text-base-content inline-flex items-center gap-0.5${x?" text-primary font-bold":""}`,children:[f,g]})},b)}),c.map((f,b)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:f.column},`rel-${b}`)),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+c.length+1,class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((f,b)=>{let x=String(f.docId??f.id??""),g=`${s}/${e}/${encodeURIComponent(x)}/edit`,v=`${s}/${e}/${encodeURIComponent(x)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover",children:[n.map((R,w)=>jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(De,{val:f[R]})},w)),c.map((R,w)=>{let T=f[R.key];if(T==null||T==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${w}`);let $=`${s}/${R.targetRepo}?fv_${R.targetKey}=${encodeURIComponent(String(T))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:$,class:"btn btn-xs btn-ghost btn-outline",children:R.column})},`rel-${w}`)}),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:g,class:"btn btn-xs btn-outline",children:"Edit"}),i&&jsxRuntime.jsx("form",{method:"post",action:v,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},b)})})]})}),(r.hasPrev||r.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center mt-6 gap-2",children:[r.hasPrev?jsxRuntime.jsx("a",{href:At(d,r.prevCursor,"prev",u,m),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),r.hasNext?jsxRuntime.jsx("a",{href:At(d,r.nextCursor,"next",u,m),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]})]}))}function Re(e,t){return Ee(e,t)}function ze(e,t){return Ie(e,t)}function Ze(e,t,n,s,r,o,a,d,i,c,u,m,l,p){return je(e,t,n,s,r,o,a,d,i,c,u,m,l,p)}function ne(e,t,n,s,r,o){return _e(e,t,n,s,r,o)}var un=new Set(["<","<=",">",">=","!="]),pn=new Set(["array-contains","array-contains-any"]);function Me(e){return e==="desc"?"DESCENDING":"ASCENDING"}function fn(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function yn(e,t,n,s,r){let o=[],a=new Set;for(let i of s)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 s)if(pn.has(i.op)){if(a.has(i.field))continue;a.add(i.field),o.push({fieldPath:i.field,arrayConfig:"CONTAINS"});}for(let i of s)if(un.has(i.op)){if(a.has(i.field))continue;a.add(i.field);let c=r?.field===i.field?Me(r.dir):"ASCENDING";o.push({fieldPath:i.field,order:c});}if(r&&!a.has(r.field)&&o.push({fieldPath:r.field,order:Me(r.dir)}),o.length===1&&n)return hn(e,t,o[0]);let d=r&&o.some(i=>i.fieldPath===r.field)?Me(r.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:d}),mn(e,t,n,o)}function mn(e,t,n,s,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/indexes/_`,a=[...Qe(1,o),...we(2,n?2:1)];for(let c of s)a.push(...Ot(3,$t(c)));let d=r==="(default)"?"-default-":r,i=encodeURIComponent(kt(a));return `https://console.firebase.google.com/project/${e}/firestore/databases/${d}/indexes?create_composite=${i}`}function gn(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function Ke(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function Be(e,t){return e<<3|t}function Qe(e,t){let n=Array.from(new TextEncoder().encode(t));return [Be(e,2),...Ke(n.length),...n]}function we(e,t){return [Be(e,0),...Ke(t)]}function Ot(e,t){return [Be(e,2),...Ke(t.length),...t]}function $t(e){let t=[...Qe(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...we(3,1)):t.push(...we(2,e.order==="DESCENDING"?2:1)),t}function kt(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 hn(e,t,n,s="(default)"){let r=`projects/${e}/databases/${s}/collectionGroups/${t}/fields/${n.fieldPath}`,o=[...Qe(1,r),...we(2,2),...Ot(3,$t(n))],a=s==="(default)"?"-default-":s,d=encodeURIComponent(kt(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${a}/indexes/automatic?create_exemption=${d}`}function bn(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 r of n)if(typeof r=="string"&&r.length>0)return r;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function ae(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function ge(e,t){let n=e??{},s=ae(e),r;if(s&&(r=n.message?gn(n.message):void 0,!r)){let o=bn(t.ref);if(o){let a=fn(t.path);r=yn(o,a,t.isGroup,t.filters,t.sort);}}return {type:s?"index":"error",message:s?"This query requires a composite index that does not exist yet.":n.message??"Query failed",indexUrl:r}}var Pt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function vn(){let e="";for(let t=0;t<20;t++)e+=Pt.charAt(Math.floor(Math.random()*Pt.length));return e}function Dt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let s=n.split("/").filter(Boolean),r=[];for(let o=1;o<s.length;o+=2)r.push(s[o]);return r.length>0?r:void 0}async function qe(e,t){let n=e.documentKey??"docId",s=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[s]=="function")try{let o=await e.repo.get[s](t);if(o)return o}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Ue(e,t,n){let s=e.documentKey??"docId",r=ge(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:s,op:"==",value:t}]});return r.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...r.indexUrl?{action:{href:r.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:r.message}}function k(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function Ge(e,t){e.status(302).set("Location",t).send("");}function We(e,t){let n=t.shape,s={};for(let[r,o]of Object.entries(n)){let a=He(o);if(a==="ZodObject"){if(e[r+"__isnull"]==="1"){s[r]=null;continue}let c={},u=false;for(let[p,y]of Object.entries(e))p.startsWith(`${r}.`)&&(c[p.slice(r.length+1)]=y,u=true);if(u){let p=o;for(;;){let y=Z(p);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")p=Q(p);else break}s[r]=We(c,p);continue}let m=e[r],l=Array.isArray(m)?m[m.length-1]:m;if(l)try{s[r]=JSON.parse(l);}catch{s[r]=l;}continue}let d=e[r],i=Array.isArray(d)?d[d.length-1]:d;if(e[r+"__isnull"]==="1"){s[r]=null;continue}if(i===void 0||i===""){a==="ZodBoolean"&&(s[r]=false);continue}switch(a){case "ZodBoolean":i==="__null__"?s[r]=null:s[r]=i==="true"||i==="on"||i==="1";break;case "ZodNumber":case "ZodBigInt":s[r]=Number(i);break;case "ZodDate":s[r]=new Date(i);break;case "ZodArray":try{s[r]=JSON.parse(i);}catch{s[r]=i;}break;default:if(i.startsWith("{")||i.startsWith("["))try{s[r]=JSON.parse(i);break}catch{}s[r]=i;}}return s}function Et(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 s=new Date(e);isNaN(s.getTime())||(t=s);}if(!t||isNaN(t.getTime()))return null;let n=s=>String(s).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function He(e){let t=e;for(;;){let n=Z(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=Q(t);else return n}}function It(e,t,n=""){let s={};for(let r of Object.keys(t.shape)){let o=n?`${n}.${r}`:r,a=e[r];if(a===null){s[o]="__null__";continue}if(a===void 0)continue;let d=t.shape[r];for(;;){let c=Z(d);if(c==="ZodOptional"||c==="ZodNullable"||c==="ZodDefault")d=Q(d);else break}let i=Z(d);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let c=It(a,d,o);Object.assign(s,c);}else if(i==="ZodDate"){let c=Et(a);c!==null&&(s[o]=c);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let c=Et(a);s[o]=c??JSON.stringify(a,null,2);}else typeof a=="object"?s[o]=JSON.stringify(a,null,2):s[o]=String(a);}return s}function Le(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?Le(n.nested,t):void 0}))}function Rn(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),s=[];for(let[r,o]of Object.entries(e)){if(!r.startsWith("fv_"))continue;let a=r.slice(3);if(!t.has(a))continue;let d=(o??"").trim();if(!d)continue;let i=e[`fo_${a}`]??"==",c=n.has(i)?i:"==";s.push({field:a,op:c,value:d});}return s}function wn(e){let t=n=>n==="true"?true:n==="false"?false:n!==""&&!isNaN(Number(n))?Number(n):n;return e.map(n=>{if(n.op==="array-contains-any"||n.op==="in"||n.op==="not-in"){let s=n.value.split(",").map(r=>t(r.trim())).filter(r=>r!=="");return [n.field,n.op,s]}return [n.field,n.op,t(n.value)]})}function Ft(e,t,n=""){let s=[];for(let r of e){let o=n?`${n}.${r}`:r,a=t.shape[r];if(!a){s.push({name:o,zodType:"ZodString"});continue}let d=He(a);if(d==="ZodObject"){let i=a;for(;;){let u=Z(i);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")i=Q(i);else break}let c=fe(i);s.push(...Ft(Object.keys(c),i,o));}else s.push({name:o,zodType:d});}return s}function Tn(e,t){let n=t.split("."),s=e;for(let r of n){for(;;){let a=Z(s);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")s=Q(s);else break}let o=fe(s);if(!(r in o))return null;s=o[r];}return s}function le(e,t){if(!t||t.length===0)return e;let n=[],s=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);s.has(d)||s.set(d,[]),s.get(d).push(i);}}let r={};for(let o of n)o in e.shape&&(r[o]=e.shape[o]);for(let[o,a]of s){if(!(o in e.shape))continue;let d=e.shape[o];for(;;){let i=Z(d);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")d=Q(d);else break}if(Z(d)!=="ZodObject"){r[o]=e.shape[o];continue}r[o]=le(d,a);}return zod.z.object(r)}function ie(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 s=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return s&&r.includes("cloudfunctions.net")?`/${s.toLowerCase()}${n}`:n}function _t(e,t){return {handleDashboard:(c,u)=>{let m=ie(c,t),l=Object.values(e).map(p=>({name:p.name,path:p.path}));k(u,ze(l,m));},handleList:async(c,u)=>{let m=c.params.repoName;if(!m){k(u,"Bad request",400);return}let l=e[m];if(!l){k(u,"Repository not found",404);return}let p=l.pageSize??25,y=c.query??{},h=y.cursor,f=y.dir==="prev"?"prev":"next",b=y.ob??"",x=y.od==="desc"?"desc":"asc",g=b?{field:b,dir:x}:void 0,v=parseInt(y.ps??""),R=Number.isFinite(v)&&v>0?Math.min(v,200):p,w=l.listColumns??Object.keys(l.schema.shape),T=l.documentKey??"docId",$=[T,...w.filter(N=>N!==T)],C=l.filterableFields?(()=>{let N=[];for(let L of l.filterableFields)(L.includes(".")||w.includes(L))&&N.push(L);return N})():w,A=(()=>{let N=[];for(let L of C)if(L.includes(".")){let nt=Tn(l.schema,L);N.push({name:L,zodType:nt?He(nt):"ZodString"});}else N.push(...Ft([L],l.schema));return N})(),P=new Set(A.map(N=>N.name)),I=Rn(y,P),B=wn(I),j;if(h)try{let N=l.repo.ref;typeof N.doc=="function"&&(j=await N.doc(h).get());}catch{}let W=await l.repo.query.paginate({pageSize:R,cursor:j,direction:f,...B.length>0?{where:B}:{},...g?{orderBy:[{field:g.field,direction:g.dir}]}:{}}).catch(N=>({queryError:ge(N,{ref:l.repo.ref,path:l.path,isGroup:!!l.isGroup,filters:I,sort:g})})),D="queryError"in W,ce=D?[]:W.data,Ut=D?"":W.nextCursor?.id??"",Gt=D?"":W.prevCursor?.id??"",Wt=D?W.queryError:void 0,Lt=ie(c,t);k(u,Ze(l.name,ce,$,Lt,{hasPrev:D?false:W.hasPrevPage,hasNext:D?false:W.hasNextPage,prevCursor:Gt,nextCursor:Ut},void 0,A,I,l.allowDelete??false,l.relationalMeta,g,R,Wt,l.isGroup));},handleCreateForm:(c,u)=>{let m=c.params.repoName;if(!m){k(u,"Bad request",400);return}let l=e[m];if(!l){k(u,"Repository not found",404);return}let p=ie(c,t),y=le(l.schema,l.createFields),h=U(y),f=`${p}/${l.name}/create`,b=Y(h,f,"POST","Create document");k(u,ne(l.name,b,"create",null,p));},handleCreateSubmit:async(c,u)=>{let m=c.params.repoName;if(!m){k(u,"Bad request",400);return}let l=e[m];if(!l){k(u,"Repository not found",404);return}let p=ie(c,t),y=c.body??{},h=We(y,l.schema),f=le(l.schema,l.createFields),b=f.safeParse(h);if(!b.success){let x=U(f),g=`${p}/${l.name}/create`,v=Y(x,g,"POST","Create document"),R=b.error.issues.map(w=>`${w.path.join(".")}: ${w.message}`).join(", ");k(u,ne(l.name,v,"create",null,p,{type:"error",message:`Validation error: ${R}`}),422);return}try{if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let x={...b.data};l.createdKey&&(x[l.createdKey]=new Date);let g=l.parentKeys.filter(T=>!x[T]);if(g.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${g.join(", ")}`);let v=l.parentKeys.map(T=>x[T]),R=l.documentKey??"docId",w=x[R]||vn();await l.repo.set(...v,w,x);}else await l.repo.create(b.data);Ge(u,`${p}/${l.name}?flash=created`);}catch(x){let g=le(l.schema,l.createFields),v=U(g),R=`${p}/${l.name}/create`,w=Y(v,R,"POST","Create document");k(u,ne(l.name,w,"create",null,p,{type:"error",message:`Save error: ${x.message}`}),500);}},handleEditForm:async(c,u)=>{let m=c.params.repoName,l=c.params.id;if(!m||!l){k(u,"Bad request",400);return}let p=e[m];if(!p){k(u,"Repository not found",404);return}let y=ie(c,t),h=null;try{h=await qe(p,l);}catch(R){let w=Ue(p,l,R),T=ae(R)?424:500;k(u,Re("",{title:`Edit ${p.name} / ${l}`,basePath:y,breadcrumb:[{label:"Repositories",href:y},{label:p.name,href:`${y}/${p.name}`},{label:`Edit ${l}`}],flash:w}),T);return}if(!h){k(u,"Document not found",404);return}let f=It(h,p.schema),b=le(p.schema,p.mutableFields),x=Le(U(b),f),g=`${y}/${p.name}/${encodeURIComponent(l)}/edit`,v=Y(x,g,"POST","Save changes");k(u,ne(p.name,v,"edit",l,y));},handleEditSubmit:async(c,u)=>{let m=c.params.repoName,l=c.params.id;if(!m||!l){k(u,"Bad request",400);return}let p=e[m];if(!p){k(u,"Repository not found",404);return}let y=ie(c,t),h=c.body??{},f=We(h,p.schema),b=le(p.schema,p.mutableFields),g=b.partial().safeParse(f);if(!g.success){let v=Object.fromEntries(Object.entries(h).map(([C,A])=>[C,Array.isArray(A)?A.join(","):A??""])),R=Le(U(b),v),w=`${y}/${p.name}/${encodeURIComponent(l)}/edit`,T=Y(R,w,"POST","Save changes"),$=g.error.issues.map(C=>`${C.path.join(".")}: ${C.message}`).join(", ");k(u,ne(p.name,T,"edit",l,y,{type:"error",message:`Validation error: ${$}`}),422);return}try{let v=await qe(p,l),R=(v&&Dt(v,p.pathKey))??[l];await p.repo.update(...R,g.data),Ge(u,`${y}/${p.name}?flash=updated`);}catch(v){let R=le(p.schema,p.mutableFields),w=U(R),T=`${y}/${p.name}/${encodeURIComponent(l)}/edit`,$=Y(w,T,"POST","Save changes"),C=ae(v)?Ue(p,l,v):{type:"error",message:`Save error: ${v.message}`},A=ae(v)?424:500;k(u,ne(p.name,$,"edit",l,y,C),A);}},handleDelete:async(c,u)=>{let m=c.params.repoName,l=c.params.id;if(!m||!l){k(u,"Bad request",400);return}let p=e[m];if(!p){k(u,"Repository not found",404);return}if(!p.allowDelete){k(u,"Delete is not allowed for this repository",403);return}let y=ie(c,t);try{let h=await qe(p,l),f=(h&&Dt(h,p.pathKey))??[l];await p.repo.delete(...f),Ge(u,`${y}/${p.name}?flash=deleted`);}catch(h){let f=ae(h)?Ue(p,l,h):{type:"error",message:`Delete error: ${h.message}`},b=ae(h)?424:500;k(u,Re("",{title:`Delete ${p.name} / ${l}`,basePath:y,breadcrumb:[{label:"Repositories",href:y},{label:p.name,href:`${y}/${p.name}`},{label:`Delete ${l}`}],flash:f}),b);}}}}function Sn(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,s=>s===":"?s:`\\${s}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(s,r)=>(t.push(r),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function Cn(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var J=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,s)=>{console.error("[MiniRouter]",t),s.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,s){let{pattern:r,paramNames:o}=Sn(n);return this.routes.push({method:t.toUpperCase(),pattern:r,paramNames:o,handler:s}),this}async handle(t,n){let s=(t.method??"GET").toUpperCase(),r=Cn(t),o=null,a={};for(let c of this.routes){if(c.method!==s)continue;let u=r.match(c.pattern);if(u){o=c,a={},c.paramNames.forEach((m,l)=>{a[m]=decodeURIComponent(u[l+1]??"");});break}}let d=Object.assign(t,{params:a}),i=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,i);}catch(c){this.errorHandler(c,t,n);}}async runMiddlewareChain(t,n,s){let r=0,o=async()=>{if(r<this.middlewares.length){let a=this.middlewares[r++];await a(t,n,o);}else await s(t,n);};await o();}};async function An(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function On(e){let t={};if(!e)return t;for(let n of e.split("&")){let s=n.indexOf("=");if(s===-1)continue;let r=decodeURIComponent(n.slice(0,s).replace(/\+/g," ")),o=decodeURIComponent(n.slice(s+1).replace(/\+/g," ")),a=t[r];a===void 0?t[r]=o:Array.isArray(a)?a.push(o):t[r]=[a,o];}return t}function Nt(e){let{basePath:t="/",repos:n,parseBody:s=true,auth:r,middleware:o=[],httpsOptions:a}=e,d=t==="/"?"":t.replace(/\/$/,""),i={};for(let[l,p]of Object.entries(n)){let y=p.schema??p.repo.schema??null;if(!y)throw new Error(`[createAdminServer] Repository "${l}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let h,f,b;if(p.fieldsConfig){let v=p.fieldsConfig;h=[],f=[],b=[];for(let[R,w]of Object.entries(v))for(let T of w)T==="filterable"?h.push(R):T==="mutable"?f.push(R):T==="create"&&b.push(R);h.length===0&&(h=void 0),f.length===0&&(f=void 0),b.length===0&&(b=void 0);}let x=(()=>{let v=p.repo._parentKeys;return v&&v.length>0?v:void 0})();if(x&&b)for(let v of x)b.includes(v)||b.push(v);let g={name:l,path:p.path,repo:p.repo,schema:y,documentKey:p.documentKey??"docId",pathKey:p.repo._pathKey??void 0,isGroup:!!p.repo._isGroup,parentKeys:x,createdKey:p.repo._createdKey??void 0,listColumns:p.listColumns,pageSize:p.pageSize,filterableFields:h,mutableFields:f,createFields:b,allowDelete:p.allowDelete??false,relationalMeta:(()=>{if(!p.relationalFields||p.relationalFields.length===0)return;let v=p.repo.relationalKeys??{},R=[];for(let w of p.relationalFields){let T=v[w.key];T&&R.push({key:w.key,column:w.column,targetRepo:String(T.repo),targetKey:String(T.key),type:T.type});}return R.length>0?R:void 0})()};i[l]=g;}let c=_t(i,d),u=new J;if(s&&u.use(async(l,p,y)=>{let h=l,f=String(h.headers?.["content-type"]??"");if(f.includes("application/x-www-form-urlencoded")){let b=await An(h);l.body=On(b);}else if(f.includes("application/json")&&typeof h.body=="string")try{l.body=JSON.parse(h.body);}catch{}await y();}),r)if(typeof r=="function")u.use(r);else {let l=r.realm??"Admin",p="Basic "+Buffer.from(`${r.username}:${r.password}`).toString("base64");u.use((y,h,f)=>{if((y.headers?.authorization??"")!==p){h.status(401).set("WWW-Authenticate",`Basic realm="${l}"`).set("Content-Type","text/plain").send("Unauthorized");return}f();});}for(let l of o)u.use(l);u.get(`${d}/`,c.handleDashboard),u.get(`${d}`,c.handleDashboard),u.get(`${d}/:repoName`,c.handleList),u.get(`${d}/:repoName/create`,c.handleCreateForm),u.post(`${d}/:repoName/create`,c.handleCreateSubmit),u.get(`${d}/:repoName/:id/edit`,c.handleEditForm),u.post(`${d}/:repoName/:id/edit`,c.handleEditSubmit),u.post(`${d}/:repoName/:id/delete`,c.handleDelete);let m=async(l,p)=>{await u.handle(l,p);};return a&&(m.httpsOptions=a),m}function Je(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function ue(e,t,n,s=200){Je(e,{success:true,data:t,meta:n},s);}function _(e,t,n=400){Je(e,{success:false,error:t},n);}function Ve(e,t,n,s,r){let o=ge(t,n),a=o.type==="index",d=a?424:500,c={success:false,error:a?o.message:r&&t instanceof Error?t.message:s};a&&(c.errorType="index",o.indexUrl&&(c.indexUrl=o.indexUrl)),Je(e,c,d);}var jt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function $n(){let e="";for(let t=0;t<20;t++)e+=jt.charAt(Math.floor(Math.random()*jt.length));return e}function kn(e,t,n=[]){let s=e.shape,r={},o=t&&t.length>0?t:Object.keys(s);for(let a of o){if(n.includes(a))continue;let d=a.split(".")[0];d&&s[d]&&(r[d]=s[d]);}return zod.z.object(r)}function zt(e,t,n,s=false,r=[]){try{let o=kn(e,n,r);return {success:!0,data:(s?o.partial():o).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 Pn(e,t){let n=[],s=t?new Set(t):null,r={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+)$/),c,u="==";if(i&&i[1]&&i[2]){c=i[1];let l=i[2];if(r[l])u=r[l];else continue}else if(!i)c=o;else continue;if(s&&!s.has(c))continue;let m=d;u==="in"||u==="not-in"||u==="array-contains-any"?m=d.split(",").map(l=>Zt(l.trim())):m=Zt(d),n.push({field:c,op:u,value:m});}return n}function Zt(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 Te(e){return e?{docId:e.id}:null}async function Mt(e,t){if(!t||typeof t!="object")return;let n=t.docId;if(typeof n=="string")try{let s=e.repo.ref;if(typeof s.doc!="function")return;let r=await s.doc(n).get();return r.exists?r:void 0}catch{return}}function Bt(e,t,n){function s(p,y){return !p||!e[p]?(_(y,`Repository "${p}" not found`,404),null):e[p]}function r(p,y){if(!y)return;let h=p[y];if(typeof h!="string"||!h)return;let f=h.split("/").filter(Boolean),b=[];for(let x=1;x<f.length;x+=2)b.push(f[x]);return b.length>0?b:void 0}async function o(p,y){let h=`by${p.documentKey.charAt(0).toUpperCase()}${p.documentKey.slice(1)}`,f=p.repo.get[h];if(typeof f=="function")try{let x=await f(y);if(x)return x}catch{}return (await p.repo.query.by({where:[[p.documentKey,"==",y]],limit:1}))[0]??null}async function a(p,y){let h=p.params||{},f=s(h.repoName,y);if(!f)return;let b=[],x;try{let g=p.query??{},v=Math.min(Number(g.pageSize)||f.pageSize,100),R=g.cursor,w=g.direction?.toLowerCase()==="prev"?"prev":"next",T=g.orderBy,$=g.orderDir?.toLowerCase()==="desc"?"desc":"asc",C=g.select,A=C?C.split(",").map(D=>D.trim()):void 0,P;f.allowedIncludes&&g.includes&&(P=(typeof g.includes=="string"?g.includes.split(",").map(ce=>ce.trim()):Array.isArray(g.includes)?g.includes:[]).filter(ce=>typeof ce=="string"&&f.allowedIncludes.includes(ce)),P?.length===0&&(P=void 0));let I=Pn(g,f.filterableFields);b=I.map(D=>({field:D.field,op:D.op,value:String(D.value??"")})),T&&(x={field:T,dir:$});let B={pageSize:v,direction:w};if(R)try{let D=typeof R=="string"?JSON.parse(R):R;B.cursor=await Mt(f,D);}catch{}T&&(B.orderBy=[{field:T,direction:$}]),I.length>0&&(B.where=I.map(D=>[D.field,D.op,D.value])),A&&(B.select=A),P&&(B.include=P);let j=await f.repo.query.paginate(B),W={items:j.data,hasNextPage:j.hasNextPage,hasPrevPage:j.hasPrevPage,nextCursor:Te(j.nextCursor),prevCursor:Te(j.prevCursor)};ue(y,W,{pageSize:v,hasMore:j.hasNextPage});}catch(g){Ve(y,g,{ref:f.repo.ref,path:f.path,isGroup:!!f.isGroup,filters:b,sort:x},"Failed to fetch documents",n);}}async function d(p,y){let h=p.params||{},f=s(h.repoName,y);if(!f)return;let b=[],x;try{let g=p.body??{},v=Math.min(g.pageSize||f.pageSize,100),R=g.direction==="prev"?"prev":"next";g.where&&(b=g.where.map(C=>({field:String(C[0]),op:C[1],value:String(C[2]??"")}))),g.orderBy&&g.orderBy[0]&&(x={field:g.orderBy[0].field,dir:g.orderBy[0].direction==="desc"?"desc":"asc"});let w={pageSize:v,direction:R};if(g.cursor)try{let C=typeof g.cursor=="string"?JSON.parse(g.cursor):g.cursor;w.cursor=await Mt(f,C);}catch{}if(f.allowedIncludes&&g.includes&&g.includes.length>0){let C=g.includes.filter(A=>typeof A=="string"?f.allowedIncludes.includes(A):typeof A=="object"&&A!==null&&"relation"in A&&typeof A.relation=="string"?f.allowedIncludes.includes(A.relation):!1);C.length>0&&(w.include=C);}if(g.where&&g.where.length>0){if(f.filterableFields){let C=new Set(f.filterableFields),A=g.where.filter(P=>!C.has(P[0]));if(A.length>0){_(y,`Fields not filterable: ${A.map(P=>P[0]).join(", ")}`,400);return}}w.where=g.where;}if(g.orWhere&&g.orWhere.length>0){if(f.filterableFields){let C=new Set(f.filterableFields),A=g.orWhere.filter(P=>!C.has(P[0]));if(A.length>0){_(y,`Fields not filterable: ${A.map(P=>P[0]).join(", ")}`,400);return}}w.orWhere=g.orWhere;}if(g.orWhereGroups&&g.orWhereGroups.length>0){if(f.filterableFields){let C=new Set(f.filterableFields);for(let A of g.orWhereGroups){let P=A.filter(I=>!C.has(I[0]));if(P.length>0){_(y,`Fields not filterable: ${P.map(I=>I[0]).join(", ")}`,400);return}}}w.orWhereGroups=g.orWhereGroups;}g.orderBy&&g.orderBy.length>0&&(w.orderBy=g.orderBy),g.select&&g.select.length>0&&(w.select=g.select);let T=await f.repo.query.paginate(w),$={items:T.data,hasNextPage:T.hasNextPage,hasPrevPage:T.hasPrevPage,nextCursor:Te(T.nextCursor),prevCursor:Te(T.prevCursor)};ue(y,$,{pageSize:v,hasMore:T.hasNextPage});}catch(g){Ve(y,g,{ref:f.repo.ref,path:f.path,isGroup:!!f.isGroup,filters:b,sort:x},"Failed to query documents",n);}}async function i(p,y){let h=p.params||{},f=s(h.repoName,y);if(!f)return;let b=h.id;if(!b){_(y,"Document ID required",400);return}try{let x=await o(f,b);if(!x){_(y,"Document not found",404);return}ue(y,x);}catch(x){Ve(y,x,{ref:f.repo.ref,path:f.path,isGroup:!!f.isGroup,filters:[{field:f.documentKey,op:"==",value:b}]},"Failed to fetch document",n);}}async function c(p,y){let h=p.params||{},f=s(h.repoName,y);if(f)try{let b=p.body??{},x=zt(f.schema,b,f.createFields,!1,f.systemKeys);if(!x.success){_(y,x.error,400);return}if(f.validate){let v=await f.validate(x.data,"create");if(v){_(y,v,400);return}}let g;if(f.isGroup&&f.parentKeys&&f.parentKeys.length>0){let v={...x.data};f.createdKey&&(v[f.createdKey]=new Date);let R=f.parentKeys.filter($=>!v[$]);if(R.length>0){_(y,`Missing parent key(s) for subcollection create: ${R.join(", ")}`,400);return}let w=f.parentKeys.map($=>v[$]),T=v[f.documentKey]||$n();g=await f.repo.set(...w,T,v);}else g=await f.repo.create(x.data);ue(y,g,void 0,201);}catch(b){let x=n&&b instanceof Error?b.message:"Failed to create document";_(y,x,500);}}async function u(p,y,h){let f=p.params||{},b=s(f.repoName,y);if(!b)return;let x=f.id;if(!x){_(y,"Document ID required",400);return}try{let g=p.body??{},v=zt(b.schema,g,b.mutableFields,h,b.systemKeys);if(!v.success){_(y,v.error,400);return}if(b.validate){let $=await b.validate(v.data,"update");if($){_(y,$,400);return}}let R=await o(b,x),w=(R&&r(R,b.pathKey))??[x],T=await b.repo.update(...w,v.data);ue(y,T);}catch(g){let v=n&&g instanceof Error?g.message:"Failed to update document";_(y,v,500);}}async function m(p,y){let h=p.params||{},f=s(h.repoName,y);if(!f)return;if(!f.allowDelete){_(y,"Delete not allowed for this repository",403);return}let b=h.id;if(!b){_(y,"Document ID required",400);return}try{let x=await o(f,b),g=(x&&r(x,f.pathKey))??[b];await f.repo.delete(...g),ue(y,{deleted:!0});}catch(x){let g=n&&x instanceof Error?x.message:"Failed to delete document";_(y,g,500);}}function l(p,y){y.status(204).set("Access-Control-Allow-Methods","GET, POST, PUT, PATCH, DELETE, OPTIONS").set("Access-Control-Allow-Headers","Content-Type, Authorization").set("Access-Control-Max-Age","86400").send("");}return {handleList:a,handleQuery:d,handleGet:i,handleCreate:c,handleUpdate:u,handleDelete:m,handleOptions:l}}function Xe(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 q(e){return {$ref:`#/components/schemas/${e}`}}function z(e){return {description:e,content:{"application/json":{schema:q("ErrorResponse")}}}}function he(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function Qt(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 Dn(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 En(e){let t=e.filterableFields??Object.keys(e.schema.shape),n=["eq","ne","lt","lte","gt","gte","in","nin","contains"],s=[];for(let r of t){s.push({name:r,in:"query",schema:{type:"string"},description:`Filter by ${r} (equality)`});for(let o of n)s.push({name:`${r}__${o}`,in:"query",schema:{type:"string"},description:`Filter ${r} with operator ${o}`});}return s}function In(){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 Fn(e,t,n,s,r){let o={},a=e.name,d=`${t}/${e.name}`,i=`${d}/{${e.documentKey}}`,c={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};o[d]={get:{operationId:`list${re(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...Dn(e),...En(e)],responses:{200:Qt(q(n)),500:z("Internal server error")}},post:{operationId:`create${re(e.name)}`,summary:`Create a ${G(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:q(s??n)}}},responses:{201:he("Document created",q(n)),400:z("Validation error"),500:z("Internal server error")}}},o[`${d}/query`]={post:{operationId:`query${re(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:q("QueryRequestBody")}}},responses:{200:Qt(q(n)),400:z("Invalid query"),500:z("Internal server error")}}};let u={};return u.get={operationId:`get${re(G(e.name))}`,summary:`Get a single ${G(e.name)}`,tags:[a],parameters:[c],responses:{200:he("Document found",q(n)),404:z("Document not found"),500:z("Internal server error")}},u.put={operationId:`update${re(G(e.name))}`,summary:`Update a ${G(e.name)} (full replace)`,tags:[a],parameters:[c],requestBody:{required:true,content:{"application/json":{schema:q(r??n)}}},responses:{200:he("Document updated",q(n)),400:z("Validation error"),404:z("Document not found"),500:z("Internal server error")}},u.patch={operationId:`patch${re(G(e.name))}`,summary:`Partially update a ${G(e.name)}`,tags:[a],parameters:[c],requestBody:{required:true,content:{"application/json":{schema:{allOf:[q(r??n)],description:"All fields are optional for partial updates"}}}},responses:{200:he("Document patched",q(n)),400:z("Validation error"),404:z("Document not found"),500:z("Internal server error")}},e.allowDelete&&(u.delete={operationId:`delete${re(G(e.name))}`,summary:`Delete a ${G(e.name)}`,tags:[a],parameters:[c],responses:{200:he("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:z("Document not found"),500:z("Internal server error")}}),o[i]=u,o}function et(e,t,n={}){let{title:s="CRUD API",version:r="1.0.0",description:o,servers:a,auth:d=false}=n,i=t==="/"?"":t.replace(/\/$/,""),c={},u={},m=[];c.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},c.QueryRequestBody=In();for(let[h,f]of Object.entries(e)){let b=re(G(h)),x=`${b}Create`,g=`${b}Update`;c[b]=Xe(f.schema);let v=A=>{let P=A&&A.length>0?A:Object.keys(f.schema.shape),I={};for(let B of P){let j=B.split(".")[0];j&&f.schema.shape[j]&&!f.systemKeys.includes(j)&&(I[j]=f.schema.shape[j]);}return I},R=null,w=v(f.createFields);Object.keys(w).length>0&&(c[x]=Xe(zod.z.object(w)),R=x);let T=null,$=v(f.mutableFields);Object.keys($).length>0&&(c[g]=Xe(zod.z.object($)),T=g);let C=Fn(f,i,b,R,T);Object.assign(u,C),m.push({name:h,description:`Operations on ${h} (collection: ${f.path})`});}let l={},p;return d==="basic"?(l.basicAuth={type:"http",scheme:"basic"},p=[{basicAuth:[]}]):d==="bearer"&&(l.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},p=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:s,version:r,...o?{description:o}:{}},...a&&a.length>0?{servers:a}:{},paths:u,components:{schemas:c,...Object.keys(l).length>0?{securitySchemes:l}:{}},...p?{security:p}:{},tags:m}}function re(e){return e.charAt(0).toUpperCase()+e.slice(1)}function G(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 _n(e,t){return `<!DOCTYPE html>
555
+ `;function Re(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:_t}})}function te(e){return "<!DOCTYPE html>"+server.renderToString(e)}var ne=({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("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.jsx("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.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((a,d)=>a.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:a.href,children:a.label})},d):jsxRuntime.jsx("li",{class:"text-base-content/60",children:a.label},d))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),o&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${o.type==="success"?"alert-success":o.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:o.message}),o.action&&jsxRuntime.jsx("a",{href:o.action.href,...o.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:o.action.label})]}),t]}),jsxRuntime.jsx(Re,{})]})]})};function Qe(e,t){return te(jsxRuntime.jsx(ne,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function qe(e,t){return te(jsxRuntime.jsx(ne,{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 Nt=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],xn=[{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"}],vn=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function Rn(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return xn;case "ZodBoolean":return Nt;case "ZodArray":return vn;default:return Nt}}var re="__null__";function wn(e){return `(function(cb){var i=document.getElementById('${e}');if(!i)return;if(cb.checked){i.dataset._prev=i.value;if(i.tagName==='SELECT'){var o=i.querySelector('option[value="${re}"]');if(!o){o=document.createElement('option');o.value='${re}';o.textContent='\u2205 null';o.dataset._auto='1';i.appendChild(o);}o.selected=true;}else{if(i.type==='number'||i.type==='datetime-local'){i.dataset._type=i.type;i.type='text';}i.value='${re}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${re}"][data-_auto="1"]');if(o2)o2.remove();var prev=i.dataset._prev||'';for(var k=0;k<i.options.length;k++)i.options[k].selected=(i.options[k].value===prev);}else{if(i.dataset._type){i.type=i.dataset._type;delete i.dataset._type;}i.readOnly=false;i.value=(i.dataset._prev&&i.dataset._prev!=='${re}')?i.dataset._prev:'';}}})(this)`}function Tn(e,t){return `(function(){var h=document.getElementById('${e}');var boxes=document.querySelectorAll('input[data-enum-group="${t}"]');h.value=Array.from(boxes).filter(function(b){return b.checked;}).map(function(b){return b.value;}).join(',');})()`}function we({inputId:e,active:t}){return jsxRuntime.jsxs("label",{class:"flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/60 hover:text-base-content border border-base-300 rounded-md px-1.5 py-1 shrink-0 leading-none h-8",title:"Filter where field IS NULL",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:wn(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function Sn({col:e,active:t}){let n=t?.value??"",r=n===re,o=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,a=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(a){let d=new Set(n.split(",").map(l=>l.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(l=>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:l,checked:d.has(l),"data-enum-group":i,onchange:Tn(o,i)}),jsxRuntime.jsx("span",{children:l})]},l))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(d=>jsxRuntime.jsx("option",{value:d,selected:n===d,children:d},d)),e.nullable&&jsxRuntime.jsx("option",{value:re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(we,{inputId:o,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:o,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsxRuntime.jsx("option",{value:re,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(we,{inputId:o,active:r})]});if(e.zodType==="ZodArray"){let d=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:d?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsxRuntime.jsx(we,{inputId:o,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsxRuntime.jsx(we,{inputId:o,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id:o,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r,style:r?"opacity:0.55":void 0}),e.nullable&&jsxRuntime.jsx(we,{inputId:o,active:r})]})}function Ue({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let o=Object.fromEntries(n.map(i=>[i.field,i])),s=n.length>0,a=n.length>=2||r&&s,d=t.filter(i=>i.zodType!=="ZodObject"&&i.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:d.map(i=>{let l=Rn(i.zodType),u=o[i.name],m=u?.op??l[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:[l.length>1?jsxRuntime.jsx("select",{name:`fo_${i.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:l.map(c=>jsxRuntime.jsx("option",{value:c.value,selected:c.value===m,children:c.label},c.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${i.name}`,value:l[0].value}),jsxRuntime.jsx(Sn,{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 Ge(e,t,n,r,o,s){let a=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,d=n==="create"?[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:"New document"}]:[{label:"Repositories",href:o},{label:e,href:`${o}/${e}`},{label:`Edit ${r??""}`}];return te(jsxRuntime.jsx(ne,{opts:{title:a,breadcrumb:d,basePath:o,flash:s},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}function We(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 Ft(e,t,n,r,o){let s=We(e,r,o);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function Cn(e,t,n,r){let o=We(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 On(e,t,n){return `?${We(t,n,e).toString()}`}function Le(e,t,n,r,o,s,a=[],d=[],i=false,l=[],u,m,c,p){let y=`${r}/${e}`,g=`${y}/create`;return te(jsxRuntime.jsxs(ne,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[a.length>0&&jsxRuntime.jsx(Ue,{action:y,columnMeta:a,activeFilters:d,isGroup:p}),c&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${c.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:c.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:c.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:c.message})]}),c.indexUrl&&jsxRuntime.jsx("a",{href:c.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," document",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(f=>jsxRuntime.jsx("a",{href:On(f,d,u),class:`join-item btn btn-xs ${m===f?"btn-active btn-primary":"btn-outline"}`,children:f},f))})]})]}),jsxRuntime.jsx("a",{href:g,class:"btn btn-primary btn-sm",children:"+ New"})]}),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:[[...n].map((f,b)=>{let x=u?.field===f,h=x?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:Cn(f,u,d,m),class:`hover:text-base-content inline-flex items-center gap-0.5${x?" text-primary font-bold":""}`,children:[f,h]})},b)}),l.map((f,b)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:f.column},`rel-${b}`)),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+l.length+1,class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((f,b)=>{let x=String(f.docId??f.id??""),h=`${r}/${e}/${encodeURIComponent(x)}/edit`,v=`${r}/${e}/${encodeURIComponent(x)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover",children:[n.map((R,w)=>jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(Ke,{val:f[R]})},w)),l.map((R,w)=>{let T=f[R.key];if(T==null||T==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${w}`);let $=`${r}/${R.targetRepo}?fv_${R.targetKey}=${encodeURIComponent(String(T))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:$,class:"btn btn-xs btn-ghost btn-outline",children:R.column})},`rel-${w}`)}),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:h,class:"btn btn-xs btn-outline",children:"Edit"}),i&&jsxRuntime.jsx("form",{method:"post",action:v,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},b)})})]})}),(o.hasPrev||o.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center mt-6 gap-2",children:[o.hasPrev?jsxRuntime.jsx("a",{href:Ft(d,o.prevCursor,"prev",u,m),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:Ft(d,o.nextCursor,"next",u,m),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]})]}))}function De(e,t){return Qe(e,t)}function He(e,t){return qe(e,t)}function Ve(e,t,n,r,o,s,a,d,i,l,u,m,c,p){return Le(e,t,n,r,o,s,a,d,i,l,u,m,c,p)}function oe(e,t,n,r,o,s){return Ge(e,t,n,r,o,s)}var An=new Set(["<","<=",">",">=","!="]),kn=new Set(["array-contains","array-contains-any"]);function Je(e){return e==="desc"?"DESCENDING":"ASCENDING"}function $n(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function Pn(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(kn.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(An.has(i.op)){if(a.has(i.field))continue;a.add(i.field);let l=o?.field===i.field?Je(o.dir):"ASCENDING";s.push({fieldPath:i.field,order:l});}if(o&&!a.has(o.field)&&s.push({fieldPath:o.field,order:Je(o.dir)}),s.length===1&&n)return _n(e,t,s[0]);let d=o&&s.some(i=>i.fieldPath===o.field)?Je(o.dir):"ASCENDING";return s.push({fieldPath:"__name__",order:d}),Dn(e,t,n,s)}function Dn(e,t,n,r,o="(default)"){let s=`projects/${e}/databases/${o}/collectionGroups/${t}/indexes/_`,a=[...et(1,s),...Ee(2,n?2:1)];for(let l of r)a.push(...Zt(3,zt(l)));let d=o==="(default)"?"-default-":o,i=encodeURIComponent(jt(a));return `https://console.firebase.google.com/project/${e}/firestore/databases/${d}/indexes?create_composite=${i}`}function En(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function Xe(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function Ye(e,t){return e<<3|t}function et(e,t){let n=Array.from(new TextEncoder().encode(t));return [Ye(e,2),...Xe(n.length),...n]}function Ee(e,t){return [Ye(e,0),...Xe(t)]}function Zt(e,t){return [Ye(e,2),...Xe(t.length),...t]}function zt(e){let t=[...et(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...Ee(3,1)):t.push(...Ee(2,e.order==="DESCENDING"?2:1)),t}function jt(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 _n(e,t,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,s=[...et(1,o),...Ee(2,2),...Zt(3,zt(n))],a=r==="(default)"?"-default-":r,d=encodeURIComponent(jt(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${a}/indexes/automatic?create_exemption=${d}`}function In(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 le(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Te(e,t){let n=e??{},r=le(e),o;if(r&&(o=n.message?En(n.message):void 0,!o)){let s=In(t.ref);if(s){let a=$n(t.path);o=Pn(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 Mt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Fn(){let e="";for(let t=0;t<20;t++)e+=Mt.charAt(Math.floor(Math.random()*Mt.length));return e}function Bt(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),o=[];for(let s=1;s<r.length;s+=2)o.push(r[s]);return o.length>0?o:void 0}async function tt(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=Te(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 P(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function rt(e,t){e.status(302).set("Location",t).send("");}function ot(e,t){let n=t.shape,r={};for(let[o,s]of Object.entries(n)){let a=at(s);if(a==="ZodObject"){if(e[o+"__isnull"]==="1"){r[o]=null;continue}let l={},u=false;for(let[p,y]of Object.entries(e))p.startsWith(`${o}.`)&&(l[p.slice(o.length+1)]=y,u=true);if(u){let p=s;for(;;){let y=Z(p);if(y==="ZodOptional"||y==="ZodNullable"||y==="ZodDefault")p=K(p);else break}r[o]=ot(l,p);continue}let m=e[o],c=Array.isArray(m)?m[m.length-1]:m;if(c)try{r[o]=JSON.parse(c);}catch{r[o]=c;}continue}let d=e[o],i=Array.isArray(d)?d[d.length-1]:d;if(e[o+"__isnull"]==="1"){r[o]=null;continue}if(i===void 0||i===""){a==="ZodBoolean"&&(r[o]=false);continue}switch(a){case "ZodBoolean":i==="__null__"?r[o]=null:r[o]=i==="true"||i==="on"||i==="1";break;case "ZodNumber":case "ZodBigInt":r[o]=Number(i);break;case "ZodDate":r[o]=new Date(i);break;case "ZodArray":try{r[o]=JSON.parse(i);}catch{r[o]=i;}break;default:if(i.startsWith("{")||i.startsWith("["))try{r[o]=JSON.parse(i);break}catch{}r[o]=i;}}return r}function Kt(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 at(e){let t=e;for(;;){let n=Z(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=K(t);else return n}}function Zn(e){let t=e;for(;;){let n=Z(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=K(t);else return t}}function Qt(e){let t=e;for(;;){let n=Z(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=K(t);continue}return false}}function qt(e){let t=Zn(e),n=Z(t);if(n==="ZodEnum"){let r=be(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=xe(t),o=Object.values(r).filter(s=>typeof s=="string");return o.length>0?o:void 0}if(n==="ZodLiteral"){let r=$e(t);return typeof r=="string"?[r]:void 0}}function Ut(e,t,n=""){let r={};for(let o of Object.keys(t.shape)){let s=n?`${n}.${o}`:o,a=e[o];if(a===null){r[s]="__null__";continue}if(a===void 0)continue;let d=t.shape[o];for(;;){let l=Z(d);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")d=K(d);else break}let i=Z(d);if(i==="ZodObject"&&typeof a=="object"&&a!==null&&!Array.isArray(a)){let l=Ut(a,d,s);Object.assign(r,l);}else if(i==="ZodDate"){let l=Kt(a);l!==null&&(r[s]=l);}else if(typeof a=="object"&&a!==null&&!Array.isArray(a)&&("_seconds"in a||typeof a.toDate=="function")){let l=Kt(a);r[s]=l??JSON.stringify(a,null,2);}else typeof a=="object"?r[s]=JSON.stringify(a,null,2):r[s]=String(a);}return r}function st(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?st(n.nested,t):void 0}))}function zn(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[o,s]of Object.entries(e)){if(!o.startsWith("fv_"))continue;let a=o.slice(3);if(!t.has(a))continue;let d=(s??"").trim();if(!d)continue;let i=e[`fo_${a}`]??"==",l=n.has(i)?i:"==";r.push({field:a,op:l,value:d});}return r}function jn(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 Gt(e,t,n=""){let r=[];for(let o of e){let s=n?`${n}.${o}`:o,a=t.shape[o];if(!a){r.push({name:s,zodType:"ZodString"});continue}let d=at(a);if(d==="ZodObject"){let i=a;for(;;){let u=Z(i);if(u==="ZodOptional"||u==="ZodNullable"||u==="ZodDefault")i=K(i);else break}let l=he(i);r.push(...Gt(Object.keys(l),i,s));}else r.push({name:s,zodType:d,nullable:Qt(a),enumValues:qt(a)});}return r}function Mn(e,t){let n=t.split("."),r=e;for(let o of n){for(;;){let a=Z(r);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")r=K(r);else break}let s=he(r);if(!(o in s))return null;r=s[o];}return r}function de(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let a=s.indexOf(".");if(a===-1)n.push(s);else {let d=s.slice(0,a),i=s.slice(a+1);r.has(d)||r.set(d,[]),r.get(d).push(i);}}let o={};for(let s of n)s in e.shape&&(o[s]=e.shape[s]);for(let[s,a]of r){if(!(s in e.shape))continue;let d=e.shape[s];for(;;){let i=Z(d);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")d=K(d);else break}if(Z(d)!=="ZodObject"){o[s]=e.shape[s];continue}o[s]=de(d,a);}return zod.z.object(o)}function ce(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",a=process.env.FUNCTION_REGION??"us-central1",d=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${a}/${d}${n}`}let r=process.env.K_SERVICE,o=e.hostname??e.headers?.host??"";return r&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function Wt(e,t){return {handleDashboard:(l,u)=>{let m=ce(l,t),c=Object.values(e).map(p=>({name:p.name,path:p.path}));P(u,He(c,m));},handleList:async(l,u)=>{let m=l.params.repoName;if(!m){P(u,"Bad request",400);return}let c=e[m];if(!c){P(u,"Repository not found",404);return}let p=c.pageSize??25,y=l.query??{},g=y.cursor,f=y.dir==="prev"?"prev":"next",b=y.ob??"",x=y.od==="desc"?"desc":"asc",h=b?{field:b,dir:x}:void 0,v=parseInt(y.ps??""),R=Number.isFinite(v)&&v>0?Math.min(v,200):p,w=c.listColumns??Object.keys(c.schema.shape),T=c.documentKey??"docId",$=[T,...w.filter(j=>j!==T)],C=c.filterableFields?(()=>{let j=[];for(let V of c.filterableFields)(V.includes(".")||w.includes(V))&&j.push(V);return j})():w,O=(()=>{let j=[];for(let V of C)if(V.includes(".")){let pe=Mn(c.schema,V);j.push({name:V,zodType:pe?at(pe):"ZodString",nullable:pe?Qt(pe):false,enumValues:pe?qt(pe):void 0});}else j.push(...Gt([V],c.schema));return j})(),D=new Set(O.map(j=>j.name)),N=zn(y,D),U=jn(N),M;if(g)try{let j=c.repo.ref;typeof j.doc=="function"&&(M=await j.doc(g).get());}catch{}let H=await c.repo.query.paginate({pageSize:R,cursor:M,direction:f,...U.length>0?{where:U}:{},...h?{orderBy:[{field:h.field,direction:h.dir}]}:{}}).catch(j=>({queryError:Te(j,{ref:c.repo.ref,path:c.path,isGroup:!!c.isGroup,filters:N,sort:h})})),E="queryError"in H,ue=E?[]:H.data,nn=E?"":H.nextCursor?.id??"",rn=E?"":H.prevCursor?.id??"",on=E?H.queryError:void 0,sn=ce(l,t);P(u,Ve(c.name,ue,$,sn,{hasPrev:E?false:H.hasPrevPage,hasNext:E?false:H.hasNextPage,prevCursor:rn,nextCursor:nn},void 0,O,N,c.allowDelete??false,c.relationalMeta,h,R,on,c.isGroup));},handleCreateForm:(l,u)=>{let m=l.params.repoName;if(!m){P(u,"Bad request",400);return}let c=e[m];if(!c){P(u,"Repository not found",404);return}let p=ce(l,t),y=de(c.schema,c.createFields),g=W(y),f=`${p}/${c.name}/create`,b=ee(g,f,"POST","Create document");P(u,oe(c.name,b,"create",null,p));},handleCreateSubmit:async(l,u)=>{let m=l.params.repoName;if(!m){P(u,"Bad request",400);return}let c=e[m];if(!c){P(u,"Repository not found",404);return}let p=ce(l,t),y=l.body??{},g=ot(y,c.schema),f=de(c.schema,c.createFields),b=f.safeParse(g);if(!b.success){let x=W(f),h=`${p}/${c.name}/create`,v=ee(x,h,"POST","Create document"),R=b.error.issues.map(w=>`${w.path.join(".")}: ${w.message}`).join(", ");P(u,oe(c.name,v,"create",null,p,{type:"error",message:`Validation error: ${R}`}),422);return}try{if(c.isGroup&&c.parentKeys&&c.parentKeys.length>0){let x={...b.data};c.createdKey&&(x[c.createdKey]=new Date);let h=c.parentKeys.filter(T=>!x[T]);if(h.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${h.join(", ")}`);let v=c.parentKeys.map(T=>x[T]),R=c.documentKey??"docId",w=x[R]||Fn();await c.repo.set(...v,w,x);}else await c.repo.create(b.data);rt(u,`${p}/${c.name}?flash=created`);}catch(x){let h=de(c.schema,c.createFields),v=W(h),R=`${p}/${c.name}/create`,w=ee(v,R,"POST","Create document");P(u,oe(c.name,w,"create",null,p,{type:"error",message:`Save error: ${x.message}`}),500);}},handleEditForm:async(l,u)=>{let m=l.params.repoName,c=l.params.id;if(!m||!c){P(u,"Bad request",400);return}let p=e[m];if(!p){P(u,"Repository not found",404);return}let y=ce(l,t),g=null;try{g=await tt(p,c);}catch(R){let w=nt(p,c,R),T=le(R)?424:500;P(u,De("",{title:`Edit ${p.name} / ${c}`,basePath:y,breadcrumb:[{label:"Repositories",href:y},{label:p.name,href:`${y}/${p.name}`},{label:`Edit ${c}`}],flash:w}),T);return}if(!g){P(u,"Document not found",404);return}let f=Ut(g,p.schema),b=de(p.schema,p.mutableFields),x=st(W(b),f),h=`${y}/${p.name}/${encodeURIComponent(c)}/edit`,v=ee(x,h,"POST","Save changes");P(u,oe(p.name,v,"edit",c,y));},handleEditSubmit:async(l,u)=>{let m=l.params.repoName,c=l.params.id;if(!m||!c){P(u,"Bad request",400);return}let p=e[m];if(!p){P(u,"Repository not found",404);return}let y=ce(l,t),g=l.body??{},f=ot(g,p.schema),b=de(p.schema,p.mutableFields),h=b.partial().safeParse(f);if(!h.success){let v=Object.fromEntries(Object.entries(g).map(([C,O])=>[C,Array.isArray(O)?O.join(","):O??""])),R=st(W(b),v),w=`${y}/${p.name}/${encodeURIComponent(c)}/edit`,T=ee(R,w,"POST","Save changes"),$=h.error.issues.map(C=>`${C.path.join(".")}: ${C.message}`).join(", ");P(u,oe(p.name,T,"edit",c,y,{type:"error",message:`Validation error: ${$}`}),422);return}try{let v=await tt(p,c),R=(v&&Bt(v,p.pathKey))??[c];await p.repo.update(...R,h.data),rt(u,`${y}/${p.name}?flash=updated`);}catch(v){let R=de(p.schema,p.mutableFields),w=W(R),T=`${y}/${p.name}/${encodeURIComponent(c)}/edit`,$=ee(w,T,"POST","Save changes"),C=le(v)?nt(p,c,v):{type:"error",message:`Save error: ${v.message}`},O=le(v)?424:500;P(u,oe(p.name,$,"edit",c,y,C),O);}},handleDelete:async(l,u)=>{let m=l.params.repoName,c=l.params.id;if(!m||!c){P(u,"Bad request",400);return}let p=e[m];if(!p){P(u,"Repository not found",404);return}if(!p.allowDelete){P(u,"Delete is not allowed for this repository",403);return}let y=ce(l,t);try{let g=await tt(p,c),f=(g&&Bt(g,p.pathKey))??[c];await p.repo.delete(...f),rt(u,`${y}/${p.name}?flash=deleted`);}catch(g){let f=le(g)?nt(p,c,g):{type:"error",message:`Delete error: ${g.message}`},b=le(g)?424:500;P(u,De("",{title:`Delete ${p.name} / ${c}`,basePath:y,breadcrumb:[{label:"Repositories",href:y},{label:p.name,href:`${y}/${p.name}`},{label:`Delete ${c}`}],flash:f}),b);}}}}function Bn(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 Kn(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}=Bn(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=Kn(t),s=null,a={};for(let l of this.routes){if(l.method!==r)continue;let u=o.match(l.pattern);if(u){s=l,a={},l.paramNames.forEach((m,c)=>{a[m]=decodeURIComponent(u[c+1]??"");});break}}let d=Object.assign(t,{params:a}),i=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,i);}catch(l){this.errorHandler(l,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();}};async function Qn(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function qn(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 Lt(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:o,middleware:s=[],httpsOptions:a}=e,d=t==="/"?"":t.replace(/\/$/,""),i={};for(let[c,p]of Object.entries(n)){let y=p.schema??p.repo.schema??null;if(!y)throw new Error(`[createAdminServer] Repository "${c}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let g,f,b;if(p.fieldsConfig){let v=p.fieldsConfig;g=[],f=[],b=[];for(let[R,w]of Object.entries(v))for(let T of w)T==="filterable"?g.push(R):T==="mutable"?f.push(R):T==="create"&&b.push(R);g.length===0&&(g=void 0),f.length===0&&(f=void 0),b.length===0&&(b=void 0);}let x=(()=>{let v=p.repo._parentKeys;return v&&v.length>0?v:void 0})();if(x&&b)for(let v of x)b.includes(v)||b.push(v);let h={name:c,path:p.path,repo:p.repo,schema:y,documentKey:p.documentKey??"docId",pathKey:p.repo._pathKey??void 0,isGroup:!!p.repo._isGroup,parentKeys:x,createdKey:p.repo._createdKey??void 0,listColumns:p.listColumns,pageSize:p.pageSize,filterableFields:g,mutableFields:f,createFields:b,allowDelete:p.allowDelete??false,relationalMeta:(()=>{if(!p.relationalFields||p.relationalFields.length===0)return;let v=p.repo.relationalKeys??{},R=[];for(let w of p.relationalFields){let T=v[w.key];T&&R.push({key:w.key,column:w.column,targetRepo:String(T.repo),targetKey:String(T.key),type:T.type});}return R.length>0?R:void 0})()};i[c]=h;}let l=Wt(i,d),u=new X;if(r&&u.use(async(c,p,y)=>{let g=c,f=String(g.headers?.["content-type"]??"");if(f.includes("application/x-www-form-urlencoded")){let b=await Qn(g);c.body=qn(b);}else if(f.includes("application/json")&&typeof g.body=="string")try{c.body=JSON.parse(g.body);}catch{}await y();}),o)if(typeof o=="function")u.use(o);else {let c=o.realm??"Admin",p="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");u.use((y,g,f)=>{if((y.headers?.authorization??"")!==p){g.status(401).set("WWW-Authenticate",`Basic realm="${c}"`).set("Content-Type","text/plain").send("Unauthorized");return}f();});}for(let c of s)u.use(c);u.get(`${d}/`,l.handleDashboard),u.get(`${d}`,l.handleDashboard),u.get(`${d}/:repoName`,l.handleList),u.get(`${d}/:repoName/create`,l.handleCreateForm),u.post(`${d}/:repoName/create`,l.handleCreateSubmit),u.get(`${d}/:repoName/:id/edit`,l.handleEditForm),u.post(`${d}/:repoName/:id/edit`,l.handleEditSubmit),u.post(`${d}/:repoName/:id/delete`,l.handleDelete);let m=async(c,p)=>{await u.handle(c,p);};return a&&(m.httpsOptions=a),m}function lt(e,t,n=200){let r=_(t);e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(r));}function ye(e,t,n,r=200){lt(e,{success:true,data:t,meta:n},r);}function z(e,t,n=400){lt(e,{success:false,error:t},n);}function it(e,t,n,r,o){let s=Te(t,n),a=s.type==="index",d=a?424:500,l={success:false,error:a?s.message:o&&t instanceof Error?t.message:r};a&&(l.errorType="index",s.indexUrl&&(l.indexUrl=s.indexUrl)),lt(e,l,d);}var Ht="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Un(){let e="";for(let t=0;t<20;t++)e+=Ht.charAt(Math.floor(Math.random()*Ht.length));return e}function me(e){let t=e._def??e.def;if(!t)return e;let n=t.typeName??t.type;if(n==="ZodDate"||n==="date")return zod.z.preprocess(r=>ze(r)??r,e);if(n==="ZodObject"||n==="object"){let r=e.shape,o={};for(let[s,a]of Object.entries(r))o[s]=me(a);return zod.z.object(o)}if(n==="ZodArray"||n==="array"){let r=t.element??t.type;if(r)return zod.z.array(me(r))}if(n==="ZodOptional"||n==="optional"){let r=t.innerType;if(r)return me(r).optional()}if(n==="ZodNullable"||n==="nullable"){let r=t.innerType;if(r)return me(r).nullable()}if(n==="ZodDefault"||n==="default"){let r=t.innerType,o=t.defaultValue;if(r){let s=me(r);return typeof o=="function"?s.default(o()):s.default(o)}}return e}function Gn(e,t,n=[]){let r=e.shape,o={},s=t&&t.length>0?t:Object.keys(r);for(let a of s){if(n.includes(a))continue;let d=a.split(".")[0];d&&r[d]&&(o[d]=r[d]);}return zod.z.object(o)}function Vt(e,t,n,r=false,o=[]){try{let s=Gn(e,n,o),a=r?s.partial():s;return {success:!0,data:(Ze()==="normalize"?me(a):a).parse(t)}}catch(s){return s instanceof zod.z.ZodError?{success:false,error:`Validation failed: ${s.issues.map(d=>`${d.path.join(".")}: ${d.message}`).join(", ")}`}:{success:false,error:"Validation failed"}}}function Wn(e,t){let n=[],r=t?new Set(t):null,o={eq:"==",ne:"!=",lt:"<",lte:"<=",gt:">",gte:">=",in:"in",nin:"not-in",contains:"array-contains",containsAny:"array-contains-any"};for(let[s,a]of Object.entries(e)){if(a===void 0||["cursor","limit","pageSize","orderBy","orderDir","select"].includes(s))continue;let d=Array.isArray(a)?a[0]:a;if(d===void 0||d==="")continue;let i=s.match(/^(\w+)__(\w+)$/),l,u="==";if(i&&i[1]&&i[2]){l=i[1];let c=i[2];if(o[c])u=o[c];else continue}else if(!i)l=s;else continue;if(r&&!r.has(l))continue;let m=d;u==="in"||u==="not-in"||u==="array-contains-any"?m=d.split(",").map(c=>Jt(c.trim())):m=Jt(d),n.push({field:l,op:u,value:m});}return n}function Jt(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 _e(e){return e?{docId:e.id}:null}async function Xt(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 Yt(e,t,n){function r(p,y){return !p||!e[p]?(z(y,`Repository "${p}" not found`,404),null):e[p]}function o(p,y){if(!y)return;let g=p[y];if(typeof g!="string"||!g)return;let f=g.split("/").filter(Boolean),b=[];for(let x=1;x<f.length;x+=2)b.push(f[x]);return b.length>0?b:void 0}async function s(p,y){let g=`by${p.documentKey.charAt(0).toUpperCase()}${p.documentKey.slice(1)}`,f=p.repo.get[g];if(typeof f=="function")try{let x=await f(y);if(x)return x}catch{}return (await p.repo.query.by({where:[[p.documentKey,"==",y]],limit:1}))[0]??null}async function a(p,y){let g=p.params||{},f=r(g.repoName,y);if(!f)return;let b=[],x;try{let h=p.query??{},v=Math.min(Number(h.pageSize)||f.pageSize,100),R=h.cursor,w=h.direction?.toLowerCase()==="prev"?"prev":"next",T=h.orderBy,$=h.orderDir?.toLowerCase()==="desc"?"desc":"asc",C=h.select,O=C?C.split(",").map(E=>E.trim()):void 0,D;f.allowedIncludes&&h.includes&&(D=(typeof h.includes=="string"?h.includes.split(",").map(ue=>ue.trim()):Array.isArray(h.includes)?h.includes:[]).filter(ue=>typeof ue=="string"&&f.allowedIncludes.includes(ue)),D?.length===0&&(D=void 0));let N=Wn(h,f.filterableFields);b=N.map(E=>({field:E.field,op:E.op,value:String(E.value??"")})),T&&(x={field:T,dir:$});let U={pageSize:v,direction:w};if(R)try{let E=typeof R=="string"?JSON.parse(R):R;U.cursor=await Xt(f,E);}catch{}T&&(U.orderBy=[{field:T,direction:$}]),N.length>0&&(U.where=N.map(E=>[E.field,E.op,E.value])),O&&(U.select=O),D&&(U.include=D);let M=await f.repo.query.paginate(U),H={items:M.data,hasNextPage:M.hasNextPage,hasPrevPage:M.hasPrevPage,nextCursor:_e(M.nextCursor),prevCursor:_e(M.prevCursor)};ye(y,H,{pageSize:v,hasMore:M.hasNextPage});}catch(h){it(y,h,{ref:f.repo.ref,path:f.path,isGroup:!!f.isGroup,filters:b,sort:x},"Failed to fetch documents",n);}}async function d(p,y){let g=p.params||{},f=r(g.repoName,y);if(!f)return;let b=[],x;try{let h=p.body??{},v=Math.min(h.pageSize||f.pageSize,100),R=h.direction==="prev"?"prev":"next";h.where&&(b=h.where.map(C=>({field:String(C[0]),op:C[1],value:String(C[2]??"")}))),h.orderBy&&h.orderBy[0]&&(x={field:h.orderBy[0].field,dir:h.orderBy[0].direction==="desc"?"desc":"asc"});let w={pageSize:v,direction:R};if(h.cursor)try{let C=typeof h.cursor=="string"?JSON.parse(h.cursor):h.cursor;w.cursor=await Xt(f,C);}catch{}if(f.allowedIncludes&&h.includes&&h.includes.length>0){let C=h.includes.filter(O=>typeof O=="string"?f.allowedIncludes.includes(O):typeof O=="object"&&O!==null&&"relation"in O&&typeof O.relation=="string"?f.allowedIncludes.includes(O.relation):!1);C.length>0&&(w.include=C);}if(h.where&&h.where.length>0){if(f.filterableFields){let C=new Set(f.filterableFields),O=h.where.filter(D=>!C.has(D[0]));if(O.length>0){z(y,`Fields not filterable: ${O.map(D=>D[0]).join(", ")}`,400);return}}w.where=h.where;}if(h.orWhere&&h.orWhere.length>0){if(f.filterableFields){let C=new Set(f.filterableFields),O=h.orWhere.filter(D=>!C.has(D[0]));if(O.length>0){z(y,`Fields not filterable: ${O.map(D=>D[0]).join(", ")}`,400);return}}w.orWhere=h.orWhere;}if(h.orWhereGroups&&h.orWhereGroups.length>0){if(f.filterableFields){let C=new Set(f.filterableFields);for(let O of h.orWhereGroups){let D=O.filter(N=>!C.has(N[0]));if(D.length>0){z(y,`Fields not filterable: ${D.map(N=>N[0]).join(", ")}`,400);return}}}w.orWhereGroups=h.orWhereGroups;}h.orderBy&&h.orderBy.length>0&&(w.orderBy=h.orderBy),h.select&&h.select.length>0&&(w.select=h.select);let T=await f.repo.query.paginate(w),$={items:T.data,hasNextPage:T.hasNextPage,hasPrevPage:T.hasPrevPage,nextCursor:_e(T.nextCursor),prevCursor:_e(T.prevCursor)};ye(y,$,{pageSize:v,hasMore:T.hasNextPage});}catch(h){it(y,h,{ref:f.repo.ref,path:f.path,isGroup:!!f.isGroup,filters:b,sort:x},"Failed to query documents",n);}}async function i(p,y){let g=p.params||{},f=r(g.repoName,y);if(!f)return;let b=g.id;if(!b){z(y,"Document ID required",400);return}try{let x=await s(f,b);if(!x){z(y,"Document not found",404);return}ye(y,x);}catch(x){it(y,x,{ref:f.repo.ref,path:f.path,isGroup:!!f.isGroup,filters:[{field:f.documentKey,op:"==",value:b}]},"Failed to fetch document",n);}}async function l(p,y){let g=p.params||{},f=r(g.repoName,y);if(f)try{let b=p.body??{},x=Vt(f.schema,b,f.createFields,!1,f.systemKeys);if(!x.success){z(y,x.error,400);return}if(f.validate){let v=await f.validate(x.data,"create");if(v){z(y,v,400);return}}let h;if(f.isGroup&&f.parentKeys&&f.parentKeys.length>0){let v={...x.data};f.createdKey&&(v[f.createdKey]=new Date);let R=f.parentKeys.filter($=>!v[$]);if(R.length>0){z(y,`Missing parent key(s) for subcollection create: ${R.join(", ")}`,400);return}let w=f.parentKeys.map($=>v[$]),T=v[f.documentKey]||Un();h=await f.repo.set(...w,T,v);}else h=await f.repo.create(x.data);ye(y,h,void 0,201);}catch(b){let x=n&&b instanceof Error?b.message:"Failed to create document";z(y,x,500);}}async function u(p,y,g){let f=p.params||{},b=r(f.repoName,y);if(!b)return;let x=f.id;if(!x){z(y,"Document ID required",400);return}try{let h=p.body??{},v=Vt(b.schema,h,b.mutableFields,g,b.systemKeys);if(!v.success){z(y,v.error,400);return}if(b.validate){let $=await b.validate(v.data,"update");if($){z(y,$,400);return}}let R=await s(b,x),w=(R&&o(R,b.pathKey))??[x],T=await b.repo.update(...w,v.data);ye(y,T);}catch(h){let v=n&&h instanceof Error?h.message:"Failed to update document";z(y,v,500);}}async function m(p,y){let g=p.params||{},f=r(g.repoName,y);if(!f)return;if(!f.allowDelete){z(y,"Delete not allowed for this repository",403);return}let b=g.id;if(!b){z(y,"Document ID required",400);return}try{let x=await s(f,b),h=(x&&o(x,f.pathKey))??[b];await f.repo.delete(...h),ye(y,{deleted:!0});}catch(x){let h=n&&x instanceof Error?x.message:"Failed to delete document";z(y,h,500);}}function c(p,y){y.status(204).set("Access-Control-Allow-Methods","GET, POST, PUT, PATCH, DELETE, OPTIONS").set("Access-Control-Allow-Headers","Content-Type, Authorization").set("Access-Control-Max-Age","86400").send("");}return {handleList:a,handleQuery:d,handleGet:i,handleCreate:l,handleUpdate:u,handleDelete:m,handleOptions:c}}function ct(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 G(e){return {$ref:`#/components/schemas/${e}`}}function B(e){return {description:e,content:{"application/json":{schema:G("ErrorResponse")}}}}function Ce(e,t){return {description:e,content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",enum:[true]},data:t},required:["success","data"]}}}}}function en(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 Ln(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 Hn(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 Vn(){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 Jn(e,t,n,r,o){let s={},a=e.name,d=`${t}/${e.name}`,i=`${d}/{${e.documentKey}}`,l={name:e.documentKey,in:"path",required:true,schema:{type:"string"},description:"Unique document identifier"};s[d]={get:{operationId:`list${se(e.name)}`,summary:`List ${e.name} (paginated)`,tags:[a],parameters:[...Ln(e),...Hn(e)],responses:{200:en(G(n)),500:B("Internal server error")}},post:{operationId:`create${se(e.name)}`,summary:`Create a ${L(e.name)}`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:G(r??n)}}},responses:{201:Ce("Document created",G(n)),400:B("Validation error"),500:B("Internal server error")}}},s[`${d}/query`]={post:{operationId:`query${se(e.name)}`,summary:`Query ${e.name} with advanced filters`,tags:[a],requestBody:{required:true,content:{"application/json":{schema:G("QueryRequestBody")}}},responses:{200:en(G(n)),400:B("Invalid query"),500:B("Internal server error")}}};let u={};return u.get={operationId:`get${se(L(e.name))}`,summary:`Get a single ${L(e.name)}`,tags:[a],parameters:[l],responses:{200:Ce("Document found",G(n)),404:B("Document not found"),500:B("Internal server error")}},u.put={operationId:`update${se(L(e.name))}`,summary:`Update a ${L(e.name)} (full replace)`,tags:[a],parameters:[l],requestBody:{required:true,content:{"application/json":{schema:G(o??n)}}},responses:{200:Ce("Document updated",G(n)),400:B("Validation error"),404:B("Document not found"),500:B("Internal server error")}},u.patch={operationId:`patch${se(L(e.name))}`,summary:`Partially update a ${L(e.name)}`,tags:[a],parameters:[l],requestBody:{required:true,content:{"application/json":{schema:{allOf:[G(o??n)],description:"All fields are optional for partial updates"}}}},responses:{200:Ce("Document patched",G(n)),400:B("Validation error"),404:B("Document not found"),500:B("Internal server error")}},e.allowDelete&&(u.delete={operationId:`delete${se(L(e.name))}`,summary:`Delete a ${L(e.name)}`,tags:[a],parameters:[l],responses:{200:Ce("Document deleted",{type:"object",properties:{id:{type:"string"}}}),404:B("Document not found"),500:B("Internal server error")}}),s[i]=u,s}function ut(e,t,n={}){let{title:r="CRUD API",version:o="1.0.0",description:s,servers:a,auth:d=false}=n,i=t==="/"?"":t.replace(/\/$/,""),l={},u={},m=[];l.ErrorResponse={type:"object",properties:{success:{type:"boolean",enum:[false]},error:{type:"string"}},required:["success","error"]},l.QueryRequestBody=Vn();for(let[g,f]of Object.entries(e)){let b=se(L(g)),x=`${b}Create`,h=`${b}Update`;l[b]=ct(f.schema);let v=O=>{let D=O&&O.length>0?O:Object.keys(f.schema.shape),N={};for(let U of D){let M=U.split(".")[0];M&&f.schema.shape[M]&&!f.systemKeys.includes(M)&&(N[M]=f.schema.shape[M]);}return N},R=null,w=v(f.createFields);Object.keys(w).length>0&&(l[x]=ct(zod.z.object(w)),R=x);let T=null,$=v(f.mutableFields);Object.keys($).length>0&&(l[h]=ct(zod.z.object($)),T=h);let C=Jn(f,i,b,R,T);Object.assign(u,C),m.push({name:g,description:`Operations on ${g} (collection: ${f.path})`});}let c={},p;return d==="basic"?(c.basicAuth={type:"http",scheme:"basic"},p=[{basicAuth:[]}]):d==="bearer"&&(c.bearerAuth={type:"http",scheme:"bearer",bearerFormat:"JWT"},p=[{bearerAuth:[]}]),{openapi:"3.1.0",info:{title:r,version:o,...s?{description:s}:{}},...a&&a.length>0?{servers:a}:{},paths:u,components:{schemas:l,...Object.keys(c).length>0?{securitySchemes:c}:{}},...p?{security:p}:{},tags:m}}function se(e){return e.charAt(0).toUpperCase()+e.slice(1)}function L(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 Xn(e,t){return `<!DOCTYPE html>
556
556
  <html lang="en">
557
557
  <head>
558
558
  <meta charset="utf-8" />
@@ -563,5 +563,5 @@ function initColumnReorder(table) {
563
563
  <script id="api-reference" data-url="${t}"></script>
564
564
  <script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
565
565
  </body>
566
- </html>`}function Nn(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??"";return `/${o}/${a}/${d}${n}`}let s=process.env.K_SERVICE,r=e?.hostname??e?.headers?.host??"";return s&&r.includes("cloudfunctions.net")?`/${s.toLowerCase()}${n}`:n}async function jn(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function qt(e){let{basePath:t="/",repos:n,parseBody:s=true,auth:r,middleware:o=[],verbose:a=false,httpsOptions:d}=e,i=t==="/"?"":t.replace(/\/$/,""),c={};for(let[b,x]of Object.entries(n)){let g=x.schema??x.repo.schema??null;if(!g)throw new Error(`[createCrudServer] Repository "${b}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let v,R,w;if(x.fieldsConfig){let C=x.fieldsConfig;v=[],R=[],w=[];for(let[A,P]of Object.entries(C))for(let I of P)I==="filterable"?v.push(A):I==="mutable"?R.push(A):I==="create"&&w.push(A);v.length===0&&(v=void 0),R.length===0&&(R=void 0),w.length===0&&(w=void 0);}let T=(()=>{let C=x.repo._parentKeys;return C&&C.length>0?C:void 0})();if(T&&w)for(let C of T)w.includes(C)||w.push(C);let $={name:b,path:x.path,repo:x.repo,schema:g,systemKeys:x.repo._systemKeys??[x.documentKey??"docId"],documentKey:x.documentKey??"docId",pathKey:x.repo._pathKey??void 0,isGroup:!!x.repo._isGroup,parentKeys:T,createdKey:x.repo._createdKey??void 0,pageSize:x.pageSize??25,filterableFields:v,mutableFields:R,createFields:w,allowDelete:x.allowDelete??false,allowedIncludes:x.allowedIncludes,validate:x.validate};c[b]=$;}let u=Bt(c,i,a),m=e.openapi,l=m&&typeof m=="object"?m:{},p=null;function y(){if(!p){let b=r&&typeof r!="function"?"basic":r?"bearer":false;p=et(c,i,{...l,auth:l.auth??b});}return p}let h=new J;if(h.use((b,x,g)=>{x.set("Access-Control-Allow-Origin","*"),x.set("Access-Control-Allow-Credentials","true"),g();}),s&&h.use(async(b,x,g)=>{let v=b;if(String(v.headers?.["content-type"]??"").includes("application/json")){if(typeof v.body=="string")try{b.body=JSON.parse(v.body);}catch{}else if(Buffer.isBuffer(b.rawBody))try{let w=await jn(v);b.body=JSON.parse(w);}catch{}}await g();}),r)if(typeof r=="function")h.use(r);else {let b=r.realm??"API",x="Basic "+Buffer.from(`${r.username}:${r.password}`).toString("base64");h.use((g,v,R)=>{if((g.headers?.authorization??"")!==x){v.status(401).set("WWW-Authenticate",`Basic realm="${b}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}R();});}for(let b of o)h.use(b);if(m!==false){let b=`${i}/__spec.json`,x=`${i}/__docs`;h.get(b,(g,v)=>{let R=y();v.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(R,null,2));}),h.get(x,(g,v)=>{let R=Nn(g,i)+"/__spec.json",w=_n(l.title??"CRUD API",R);v.status(200).set("Content-Type","text/html; charset=utf-8").send(w);});}h.use((b,x,g)=>{if(b.method==="OPTIONS"){u.handleOptions(b,x);return}g();}),h.get(`${i}/:repoName`,u.handleList),h.post(`${i}/:repoName/query`,u.handleQuery),h.get(`${i}/:repoName/:id`,u.handleGet),h.post(`${i}/:repoName`,u.handleCreate),h.put(`${i}/:repoName/:id`,(b,x)=>u.handleUpdate(b,x,false)),h.patch(`${i}/:repoName/:id`,(b,x)=>u.handleUpdate(b,x,true)),h.delete(`${i}/:repoName/:id`,u.handleDelete);let f=async(b,x)=>{await h.handle(b,x);};return f.spec=y,d&&(f.httpsOptions=d),f}function Cs(e){return t=>({...t,schema:e,type:null,documentRef:null,update:null})}function As(e,t){let n={...e};for(let s in t)t[s]&&(n[s]={...e[s],relationalKeys:t[s]});return n}var tt=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]=Oe(this.db,this.mapping[t],{});for(let t of Object.keys(this.mapping))this.allRepositories[t]=Oe(this.db,this.mapping[t],this.allRepositories);}getRepository(t){return this.allRepositories[t]}};function Os(e,t){let n=new tt(e,t),s=Object.keys(t);return new Proxy(n,{get(r,o){return typeof o=="string"&&o in t?r.getRepository(o):r[o]},ownKeys(){return s},getOwnPropertyDescriptor(r,o){if(typeof o=="string"&&o in t)return {configurable:true,enumerable:true,writable:false}}})}exports.MiniRouter=J;exports.RepositoryMapping=tt;exports.applyPaginationQueryOptions=X;exports.buildAndExecuteQuery=se;exports.buildRepositoryRelations=As;exports.createAdminServer=Nt;exports.createCrudServer=qt;exports.createPaginationIterator=Ae;exports.createRepositoryConfig=Cs;exports.createRepositoryMapping=Os;exports.executePaginatedQuery=xe;//# sourceMappingURL=index.cjs.map
566
+ </html>`}function Yn(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",a=process.env.FUNCTION_REGION??"us-central1",d=process.env.FUNCTION_TARGET??"";return `/${s}/${a}/${d}${n}`}let r=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return r&&o.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}async function er(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function tn(e){let{basePath:t="/",repos:n,parseBody:r=true,auth:o,middleware:s=[],verbose:a=false,httpsOptions:d}=e,i=t==="/"?"":t.replace(/\/$/,""),l={};for(let[b,x]of Object.entries(n)){let h=x.schema??x.repo.schema??null;if(!h)throw new Error(`[createCrudServer] Repository "${b}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let v,R,w;if(x.fieldsConfig){let C=x.fieldsConfig;v=[],R=[],w=[];for(let[O,D]of Object.entries(C))for(let N of D)N==="filterable"?v.push(O):N==="mutable"?R.push(O):N==="create"&&w.push(O);v.length===0&&(v=void 0),R.length===0&&(R=void 0),w.length===0&&(w=void 0);}let T=(()=>{let C=x.repo._parentKeys;return C&&C.length>0?C:void 0})();if(T&&w)for(let C of T)w.includes(C)||w.push(C);let $={name:b,path:x.path,repo:x.repo,schema:h,systemKeys:x.repo._systemKeys??[x.documentKey??"docId"],documentKey:x.documentKey??"docId",pathKey:x.repo._pathKey??void 0,isGroup:!!x.repo._isGroup,parentKeys:T,createdKey:x.repo._createdKey??void 0,pageSize:x.pageSize??25,filterableFields:v,mutableFields:R,createFields:w,allowDelete:x.allowDelete??false,allowedIncludes:x.allowedIncludes,validate:x.validate};l[b]=$;}let u=Yt(l,i,a),m=e.openapi,c=m&&typeof m=="object"?m:{},p=null;function y(){if(!p){let b=o&&typeof o!="function"?"basic":o?"bearer":false;p=ut(l,i,{...c,auth:c.auth??b});}return p}let g=new X;if(g.use((b,x,h)=>{x.set("Access-Control-Allow-Origin","*"),x.set("Access-Control-Allow-Credentials","true"),h();}),r&&g.use(async(b,x,h)=>{let v=b;if(String(v.headers?.["content-type"]??"").includes("application/json")){if(typeof v.body=="string")try{b.body=JSON.parse(v.body);}catch{}else if(Buffer.isBuffer(b.rawBody))try{let w=await er(v);b.body=JSON.parse(w);}catch{}}await h();}),o)if(typeof o=="function")g.use(o);else {let b=o.realm??"API",x="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");g.use((h,v,R)=>{if((h.headers?.authorization??"")!==x){v.status(401).set("WWW-Authenticate",`Basic realm="${b}"`).set("Content-Type","application/json").send(JSON.stringify({success:false,error:"Unauthorized"}));return}R();});}for(let b of s)g.use(b);if(m!==false){let b=`${i}/__spec.json`,x=`${i}/__docs`;g.get(b,(h,v)=>{let R=y();v.status(200).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(R,null,2));}),g.get(x,(h,v)=>{let R=Yn(h,i)+"/__spec.json",w=Xn(c.title??"CRUD API",R);v.status(200).set("Content-Type","text/html; charset=utf-8").send(w);});}g.use((b,x,h)=>{if(b.method==="OPTIONS"){u.handleOptions(b,x);return}h();}),g.get(`${i}/:repoName`,u.handleList),g.post(`${i}/:repoName/query`,u.handleQuery),g.get(`${i}/:repoName/:id`,u.handleGet),g.post(`${i}/:repoName`,u.handleCreate),g.put(`${i}/:repoName/:id`,(b,x)=>u.handleUpdate(b,x,false)),g.patch(`${i}/:repoName/:id`,(b,x)=>u.handleUpdate(b,x,true)),g.delete(`${i}/:repoName/:id`,u.handleDelete);let f=async(b,x)=>{await g.handle(b,x);};return f.spec=y,d&&(f.httpsOptions=d),f}function Jo(e){return t=>({...t,schema:e,type:null,documentRef:null,update:null})}function Xo(e,t){let n={...e};for(let r in t)t[r]&&(n[r]={...e[r],relationalKeys:t[r]});return n}var pt=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]=Me(this.db,this.mapping[t],{});for(let t of Object.keys(this.mapping))this.allRepositories[t]=Me(this.db,this.mapping[t],this.allRepositories);}getRepository(t){return this.allRepositories[t]}};function Yo(e,t){let n=new pt(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=pt;exports.applyPaginationQueryOptions=Y;exports.buildAndExecuteQuery=ae;exports.buildRepositoryRelations=Xo;exports.coerceToDate=ze;exports.createAdminServer=Lt;exports.createCrudServer=tn;exports.createPaginationIterator=je;exports.createRepositoryConfig=Jo;exports.createRepositoryMapping=Yo;exports.executePaginatedQuery=ke;exports.getDateHandling=Ze;exports.normalizeTimestamps=Ae;exports.setDateHandling=ln;//# sourceMappingURL=index.cjs.map
567
567
  //# sourceMappingURL=index.cjs.map