@lpdjs/firestore-repo-service 2.1.2 → 2.1.3

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.
@@ -1,4 +1,4 @@
1
- import {z as z$1}from'zod';import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {renderToString}from'hono/jsx/dom/server';var He={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 O(e){let t=e,n=t._zod?.def?.type;if(n)return He[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let a=t._def?.typeName;return a||""}function E(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function he(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function ge(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function J(e){let t=e;return t.shape&&typeof t.shape=="object"?t.shape:t._zod?.def?.shape&&typeof t._zod.def.shape=="object"?t._zod.def.shape:t._def?.shape?typeof t._def.shape=="function"?t._def.shape():t._def.shape:{}}function ee(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 te(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 ve(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function xe(e){let t=e,n=[],a=t._zod?.def?.checks;if(Array.isArray(a)){for(let s of a)s.format&&n.push(s.format);if(n.length>0)return n}let r=t._def?.checks;if(Array.isArray(r))for(let s of r)s.kind&&n.push(s.kind);return n}function Ve(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Re(e){let t=e,n=true,a=false,r;for(;;){let s=O(t);if(s==="ZodOptional")n=false,t=E(t);else if(s==="ZodNullable")n=false,a=true,t=E(t);else if(s==="ZodDefault")n=false,r=ge(t),t=E(t);else break}return {inner:t,required:n,nullable:a,defaultValue:r}}function z(e,t=""){if(O(e)==="ZodObject"){let a=J(e);return Object.entries(a).map(([r,s])=>we(t?`${t}.${r}`:r,r,s))}return [we(t||"value",t||"value",e)]}function we(e,t,n){let{inner:a,required:r,nullable:s,defaultValue:o}=Re(n),u=O(a),p=Ve(t.split(".").pop()??t);switch(u){case "ZodString":{let d=xe(a),i=d.includes("email"),m=d.includes("url");return {name:e,label:p,type:"text",required:r,nullable:s,defaultValue:o,hint:i?"email":m?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:p,type:"number",required:r,nullable:s,defaultValue:o};case "ZodBoolean":return {name:e,label:p,type:"checkbox",required:r,nullable:s,defaultValue:o};case "ZodDate":case "ZodCoerce":return {name:e,label:p,type:"datetime-local",required:r,nullable:s,defaultValue:o};case "ZodEnum":{let d=ee(a);return {name:e,label:p,type:"select",required:r,nullable:s,defaultValue:o,options:d}}case "ZodNativeEnum":{let d=te(a),i=Object.values(d).filter(m=>typeof m=="string");return {name:e,label:p,type:"select",required:r,nullable:s,defaultValue:o,options:i}}case "ZodLiteral":{let d=String(ve(a)??"");return {name:e,label:p,type:"select",required:r,nullable:s,defaultValue:o,options:[d]}}case "ZodObject":{let d=z(a,e);return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,nested:d,hint:"JSON object"}}case "ZodArray":{let d=he(a);if(!d)return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,hint:"JSON array"};let{inner:i}=Re(d),m=O(i),l,c,f;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",c=ee(i);break;case "ZodNativeEnum":l="select",c=Object.values(te(i)).filter(b=>typeof b=="string");break;case "ZodObject":l="object",f=z(i);break;default:return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,hint:"JSON array"}}return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,arrayElementType:l,arrayElementOptions:c,arrayElementFields:f}}default:return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,hint:"JSON"}}}function ke(e,t=0){let n=t>0?`ml-${t*4}`:"",a=`field_${e.name.replace(/\./g,"__")}`,r=e.name,s=e.required?" required":"",o=e.defaultValue==="__null__",u=!o&&e.defaultValue!=null?String(e.defaultValue):"",p=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
1
+ import {z as z$1}from'zod';import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {renderToString}from'hono/jsx/dom/server';var He={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 O(e){let t=e,n=t._zod?.def?.type;if(n)return He[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let a=t._def?.typeName;return a||""}function E(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function he(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function ge(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function J(e){let t=e;return t.shape&&typeof t.shape=="object"?t.shape:t._zod?.def?.shape&&typeof t._zod.def.shape=="object"?t._zod.def.shape:t._def?.shape?typeof t._def.shape=="function"?t._def.shape():t._def.shape:{}}function ee(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 te(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 ve(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function xe(e){let t=e,n=[],a=t._zod?.def?.checks;if(Array.isArray(a)){for(let s of a)s.format&&n.push(s.format);if(n.length>0)return n}let r=t._def?.checks;if(Array.isArray(r))for(let s of r)s.kind&&n.push(s.kind);return n}function Le(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Re(e){let t=e,n=true,a=false,r;for(;;){let s=O(t);if(s==="ZodOptional")n=false,t=E(t);else if(s==="ZodNullable")n=false,a=true,t=E(t);else if(s==="ZodDefault")n=false,r=ge(t),t=E(t);else break}return {inner:t,required:n,nullable:a,defaultValue:r}}function z(e,t=""){if(O(e)==="ZodObject"){let a=J(e);return Object.entries(a).map(([r,s])=>we(t?`${t}.${r}`:r,r,s))}return [we(t||"value",t||"value",e)]}function we(e,t,n){let{inner:a,required:r,nullable:s,defaultValue:o}=Re(n),u=O(a),p=Le(t.split(".").pop()??t);switch(u){case "ZodString":{let d=xe(a),i=d.includes("email"),m=d.includes("url");return {name:e,label:p,type:"text",required:r,nullable:s,defaultValue:o,hint:i?"email":m?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:p,type:"number",required:r,nullable:s,defaultValue:o};case "ZodBoolean":return {name:e,label:p,type:"checkbox",required:r,nullable:s,defaultValue:o};case "ZodDate":case "ZodCoerce":return {name:e,label:p,type:"datetime-local",required:r,nullable:s,defaultValue:o};case "ZodEnum":{let d=ee(a);return {name:e,label:p,type:"select",required:r,nullable:s,defaultValue:o,options:d}}case "ZodNativeEnum":{let d=te(a),i=Object.values(d).filter(m=>typeof m=="string");return {name:e,label:p,type:"select",required:r,nullable:s,defaultValue:o,options:i}}case "ZodLiteral":{let d=String(ve(a)??"");return {name:e,label:p,type:"select",required:r,nullable:s,defaultValue:o,options:[d]}}case "ZodObject":{let d=z(a,e);return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,nested:d,hint:"JSON object"}}case "ZodArray":{let d=he(a);if(!d)return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,hint:"JSON array"};let{inner:i}=Re(d),m=O(i),l,c,f;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",c=ee(i);break;case "ZodNativeEnum":l="select",c=Object.values(te(i)).filter(b=>typeof b=="string");break;case "ZodObject":l="object",f=z(i);break;default:return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,hint:"JSON array"}}return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,arrayElementType:l,arrayElementOptions:c,arrayElementFields:f}}default:return {name:e,label:p,type:"textarea",required:r,nullable:s,defaultValue:o,hint:"JSON"}}}function ke(e,t=0){let n=t>0?`ml-${t*4}`:"",a=`field_${e.name.replace(/\./g,"__")}`,r=e.name,s=e.required?" required":"",o=e.defaultValue==="__null__",u=!o&&e.defaultValue!=null?String(e.defaultValue):"",p=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
2
2
  <input type="hidden" id="${a}__isnull" name="${r}__isnull" value="${o?"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" ${o?"checked":""}
@@ -35,7 +35,7 @@ import {z as z$1}from'zod';import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';
35
35
  ${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
36
36
  ${(e.options??[]).map(i=>`<option value="${y(i)}"${u===i?" selected":""}>${y(i)}</option>`).join(`
37
37
  `)}
38
- </select>`;break;case "textarea":if(e.arrayElementType)return Le(e,t);if(e.nested&&e.nested.length>0){let i=e.nested.map(m=>ke(m,t+1)).join(`
38
+ </select>`;break;case "textarea":if(e.arrayElementType)return Ve(e,t);if(e.nested&&e.nested.length>0){let i=e.nested.map(m=>ke(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">
@@ -59,7 +59,7 @@ import {z as z$1}from'zod';import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';
59
59
  <div class="flex-1 min-w-0">${d}</div>
60
60
  ${p}
61
61
  </div>
62
- </div>`}function y(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Le(e,t){let n=t>0?`ml-${t*4}`:"",a=`field_${e.name.replace(/\./g,"__")}`,r=e.defaultValue==="__null__",s=e.arrayElementType==="object",o=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{o=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(o)||(o=[]);let u=s?o.map(i=>$e(e,i??{})).join(`
62
+ </div>`}function y(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Ve(e,t){let n=t>0?`ml-${t*4}`:"",a=`field_${e.name.replace(/\./g,"__")}`,r=e.defaultValue==="__null__",s=e.arrayElementType==="object",o=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{o=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(o)||(o=[]);let u=s?o.map(i=>$e(e,i??{})).join(`
63
63
  `):o.map(i=>Se(e,i)).join(`
64
64
  `),p=s?$e(e,{}):Se(e,""),d=e.nullable?`<span class="flex items-center gap-1 mt-2">
65
65
  <input type="hidden" id="${a}__isnull" name="${y(e.name)}__isnull" value="${r?"1":""}">
@@ -552,6 +552,6 @@ function initColumnReorder(table) {
552
552
  });
553
553
  });
554
554
  }
555
- `;function Y(){return jsx("script",{dangerouslySetInnerHTML:{__html:Te}})}function P(e){return "<!DOCTYPE html>"+renderToString(e)}var I=({opts:e,children:t})=>{let{title:n,breadcrumb:a,flash:r,basePath:s="/"}=e;return jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxs("head",{children:[jsx("meta",{charset:"UTF-8"}),jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsx("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:jsx("div",{class:"flex-1",children:jsx("a",{href:s,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})})}),jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[a&&a.length>0&&jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsx("ul",{children:a.map((o,u)=>o.href?jsx("li",{children:jsx("a",{href:o.href,children:o.label})},u):jsx("li",{class:"text-base-content/60",children:o.label},u))})}),jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),r&&jsx("div",{role:"alert",class:`alert ${r.type==="success"?"alert-success":"alert-error"} mb-6`,children:jsx("span",{children:r.message})}),t]}),jsx(Y,{})]})]})};function re(e,t){return P(jsx(I,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):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=>jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxs("div",{class:"card-body p-5",children:[jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var Ze=[{value:"==",label:"="},{value:"!=",label:"\u2260"}],Xe=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"<",label:"<"},{value:"<=",label:"\u2264"},{value:">",label:">"},{value:">=",label:"\u2265"}],Ge=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function Ye(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return Xe;case "ZodBoolean":return Ze;case "ZodArray":return Ge;default:return Ze}}function Qe({col:e,active:t}){let n=t?.value??"";if(e.zodType==="ZodBoolean")return jsxs("select",{name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",children:[jsx("option",{value:"",selected:n==="",children:"\u2014"}),jsx("option",{value:"true",selected:n==="true",children:"true"}),jsx("option",{value:"false",selected:n==="false",children:"false"})]});if(e.zodType==="ZodArray"){let a=t?.op==="array-contains-any";return jsx("input",{type:"text",name:`fv_${e.name}`,value:n,placeholder:a?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsx("input",{type:"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full"}):e.zodType==="ZodDate"?jsx("input",{type:"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full"}):jsx("input",{type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full"})}function ae({action:e,columnMeta:t,activeFilters:n}){let a=Object.fromEntries(n.map(o=>[o.field,o])),r=n.length>0,s=t.filter(o=>o.zodType!=="ZodObject"&&o.zodType!=="ZodRecord");return jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:r?true:void 0,children:[jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",r&&jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxs("form",{method:"get",action:e,children:[jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:s.map(o=>{let u=Ye(o.zodType),p=a[o.name],d=p?.op??u[0].value;return jsxs("div",{class:"flex flex-col gap-1.5",children:[jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:o.name}),jsxs("div",{class:"flex gap-1.5",children:[u.length>1?jsx("select",{name:`fo_${o.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:u.map(i=>jsx("option",{value:i.value,selected:i.value===d,children:i.label},i.value))}):jsx("input",{type:"hidden",name:`fo_${o.name}`,value:u[0].value}),jsx(Qe,{col:o,active:p})]})]},o.name)})}),jsxs("div",{class:"flex gap-2 mt-4 pt-3 border-t border-base-200",children:[jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),r&&jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"})]})]})})]})}function oe(e,t,n,a,r,s){let o=n==="create"?`Create ${e}`:`Edit ${e} / ${a??""}`,u=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 ${a??""}`}];return P(jsx(I,{opts:{title:o,breadcrumb:u,basePath:r,flash:s},children:jsx("div",{class:"card bg-base-100 border border-base-300",children:jsx("div",{class:"card-body p-6",children:jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}function se(e,t,n){let a=new URLSearchParams;for(let r of e)a.set(`fv_${r.field}`,r.value),a.set(`fo_${r.field}`,r.op);return t&&(a.set("ob",t.field),a.set("od",t.dir)),n&&a.set("ps",String(n)),a}function Oe(e,t,n,a,r){let s=se(e,a,r);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function et(e,t,n,a){let r=se(n,void 0,a);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 tt(e,t,n){return `?${se(t,n,e).toString()}`}function ie(e,t,n,a,r,s,o=[],u=[],p=false,d=[],i,m){let l=`${a}/${e}`,c=`${l}/create`;return P(jsxs(I,{opts:{title:e,breadcrumb:[{label:"Repositories",href:a},{label:e}],basePath:a,flash:s},children:[o.length>0&&jsx(ae,{action:l,columnMeta:o,activeFilters:u}),jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3",children:[jsxs("div",{class:"flex items-center gap-3",children:[jsxs("span",{class:"text-sm text-base-content/60",children:[t.length," document",t.length!==1&&"s"]}),jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsx("span",{children:"Rows"}),jsx("div",{class:"join",children:[10,25,50,100].map(f=>jsx("a",{href:tt(f,u,i),class:`join-item btn btn-xs ${m===f?"btn-active btn-primary":"btn-outline"}`,children:f},f))})]})]}),jsx("a",{href:c,class:"btn btn-primary btn-sm",children:"+ New"})]}),jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[[...n].map((f,b)=>{let v=i?.field===f,g=v?i.dir==="asc"?" \u25B2":" \u25BC":"";return jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxs("a",{href:et(f,i,u,m),class:`hover:text-base-content inline-flex items-center gap-0.5${v?" text-primary font-bold":""}`,children:[f,g]})},b)}),d.map((f,b)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:f.column},`rel-${b}`)),jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsx("tbody",{children:t.length===0?jsx("tr",{children:jsx("td",{colspan:n.length+d.length+1,class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((f,b)=>{let v=String(f.docId??f.id??""),g=`${a}/${e}/${encodeURIComponent(v)}/edit`,k=`${a}/${e}/${encodeURIComponent(v)}/delete`;return jsxs("tr",{class:"hover",children:[n.map((R,h)=>jsx("td",{class:"align-top py-2",children:jsx(ne,{val:f[R]})},h)),d.map((R,h)=>{let x=f[R.key];if(x==null||x==="")return jsx("td",{class:"py-2"},`rel-${h}`);let $=`${a}/${R.targetRepo}?fv_${R.targetKey}=${encodeURIComponent(String(x))}`;return jsx("td",{class:"align-middle py-2",children:jsx("a",{href:$,class:"btn btn-xs btn-ghost btn-outline",children:R.column})},`rel-${h}`)}),jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxs("div",{class:"flex gap-1 justify-end",children:[jsx("a",{href:g,class:"btn btn-xs btn-outline",children:"Edit"}),p&&jsx("form",{method:"post",action:k,onsubmit:"return confirm('Delete this document?')",children:jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},b)})})]})}),(r.hasPrev||r.hasNext)&&jsxs("div",{class:"flex justify-center items-center mt-6 gap-2",children:[r.hasPrev?jsx("a",{href:Oe(u,r.prevCursor,"prev",i,m),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),r.hasNext?jsx("a",{href:Oe(u,r.nextCursor,"next",i,m),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]})]}))}function _e(e,t){return re(e,t)}function Ee(e,t,n,a,r,s,o,u,p,d,i,m){return ie(e,t,n,a,r,s,o,u,p,d,i,m)}function B(e,t,n,a,r,s){return oe(e,t,n,a,r,s)}var Fe="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function at(){let e="";for(let t=0;t<20;t++)e+=Fe.charAt(Math.floor(Math.random()*Fe.length));return e}function Ne(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let a=n.split("/").filter(Boolean),r=[];for(let s=1;s<a.length;s+=2)r.push(a[s]);return r.length>0?r:void 0}async function le(e,t){let n=e.documentKey??"docId",a=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[a]=="function")try{let s=await e.repo.get[a](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function S(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function de(e,t){e.status(302).set("Location",t).send("");}function ce(e,t){let n=t.shape,a={};for(let[r,s]of Object.entries(n)){let o=pe(s);if(o==="ZodObject"){if(e[r+"__isnull"]==="1"){a[r]=null;continue}let d={},i=false;for(let[c,f]of Object.entries(e))c.startsWith(`${r}.`)&&(d[c.slice(r.length+1)]=f,i=true);if(i){let c=s;for(;;){let f=O(c);if(f==="ZodOptional"||f==="ZodNullable"||f==="ZodDefault")c=E(c);else break}a[r]=ce(d,c);continue}let m=e[r],l=Array.isArray(m)?m[m.length-1]:m;if(l)try{a[r]=JSON.parse(l);}catch{a[r]=l;}continue}let u=e[r],p=Array.isArray(u)?u[u.length-1]:u;if(e[r+"__isnull"]==="1"){a[r]=null;continue}if(p===void 0||p===""){o==="ZodBoolean"&&(a[r]=false);continue}switch(o){case "ZodBoolean":p==="__null__"?a[r]=null:a[r]=p==="true"||p==="on"||p==="1";break;case "ZodNumber":case "ZodBigInt":a[r]=Number(p);break;case "ZodDate":a[r]=new Date(p);break;case "ZodArray":try{a[r]=JSON.parse(p);}catch{a[r]=p;}break;default:if(p.startsWith("{")||p.startsWith("["))try{a[r]=JSON.parse(p);break}catch{}a[r]=p;}}return a}function ze(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 a=new Date(e);isNaN(a.getTime())||(t=a);}if(!t||isNaN(t.getTime()))return null;let n=a=>String(a).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function pe(e){let t=e;for(;;){let n=O(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=E(t);else return n}}function De(e,t,n=""){let a={};for(let r of Object.keys(t.shape)){let s=n?`${n}.${r}`:r,o=e[r];if(o===null){a[s]="__null__";continue}if(o===void 0)continue;let u=t.shape[r];for(;;){let d=O(u);if(d==="ZodOptional"||d==="ZodNullable"||d==="ZodDefault")u=E(u);else break}let p=O(u);if(p==="ZodObject"&&typeof o=="object"&&o!==null&&!Array.isArray(o)){let d=De(o,u,s);Object.assign(a,d);}else if(p==="ZodDate"){let d=ze(o);d!==null&&(a[s]=d);}else if(typeof o=="object"&&o!==null&&!Array.isArray(o)&&("_seconds"in o||typeof o.toDate=="function")){let d=ze(o);a[s]=d??JSON.stringify(o,null,2);}else typeof o=="object"?a[s]=JSON.stringify(o,null,2):a[s]=String(o);}return a}function ue(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?ue(n.nested,t):void 0}))}function ot(e,t){let n=new Set(["==","!=","<","<=",">",">=","array-contains","array-contains-any"]),a=[];for(let[r,s]of Object.entries(e)){if(!r.startsWith("fv_"))continue;let o=r.slice(3);if(!t.has(o))continue;let u=(s??"").trim();if(!u)continue;let p=e[`fo_${o}`]??"==",d=n.has(p)?p:"==";a.push({field:o,op:d,value:u});}return a}function st(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"){let a=n.value.split(",").map(r=>t(r.trim())).filter(r=>r!=="");return [n.field,n.op,a]}return [n.field,n.op,t(n.value)]})}function je(e,t,n=""){let a=[];for(let r of e){let s=n?`${n}.${r}`:r,o=t.shape[r];if(!o){a.push({name:s,zodType:"ZodString"});continue}let u=pe(o);if(u==="ZodObject"){let p=o;for(;;){let i=O(p);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")p=E(p);else break}let d=J(p);a.push(...je(Object.keys(d),p,s));}else a.push({name:s,zodType:u});}return a}function it(e,t){let n=t.split("."),a=e;for(let r of n){for(;;){let o=O(a);if(o==="ZodOptional"||o==="ZodNullable"||o==="ZodDefault")a=E(a);else break}let s=J(a);if(!(r in s))return null;a=s[r];}return a}function H(e,t){if(!t||t.length===0)return e;let n=[],a=new Map;for(let s of t){let o=s.indexOf(".");if(o===-1)n.push(s);else {let u=s.slice(0,o),p=s.slice(o+1);a.has(u)||a.set(u,[]),a.get(u).push(p);}}let r={};for(let s of n)s in e.shape&&(r[s]=e.shape[s]);for(let[s,o]of a){if(!(s in e.shape))continue;let u=e.shape[s];for(;;){let p=O(u);if(p==="ZodOptional"||p==="ZodNullable"||p==="ZodDefault")u=E(u);else break}if(O(u)!=="ZodObject"){r[s]=e.shape[s];continue}r[s]=H(u,o);}return z$1.object(r)}function q(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",o=process.env.FUNCTION_REGION??"us-central1",u=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${o}/${u}${n}`}let a=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return a&&r.includes("cloudfunctions.net")?`/${a}${n}`:n}function Pe(e,t){return {handleDashboard:(d,i)=>{let m=q(d,t),l=Object.values(e).map(c=>({name:c.name,path:c.path}));S(i,_e(l,m));},handleList:async(d,i)=>{let m=d.params.repoName;if(!m){S(i,"Bad request",400);return}let l=e[m];if(!l){S(i,"Repository not found",404);return}let c=l.pageSize??25,f=d.query??{},b=f.cursor,v=f.dir==="prev"?"prev":"next",g=f.ob??"",k=f.od==="desc"?"desc":"asc",R=g?{field:g,dir:k}:void 0,h=parseInt(f.ps??""),x=Number.isFinite(h)&&h>0?Math.min(h,200):c,$=l.listColumns??Object.keys(l.schema.shape),C=l.documentKey??"docId",U=[C,...$.filter(Z=>Z!==C)],V=l.filterableFields?(()=>{let Z=[];for(let N of l.filterableFields)(N.includes(".")||$.includes(N))&&Z.push(N);return Z})():$,L=(()=>{let Z=[];for(let N of V)if(N.includes(".")){let be=it(l.schema,N);Z.push({name:N,zodType:be?pe(be):"ZodString"});}else Z.push(...je([N],l.schema));return Z})(),Ie=new Set(L.map(Z=>Z.name)),fe=ot(f,Ie),me=st(fe),ye;if(b)try{let Z=l.repo.ref;typeof Z.doc=="function"&&(ye=await Z.doc(b).get());}catch{}let K=await l.repo.query.paginate({pageSize:x,cursor:ye,direction:v,...me.length>0?{where:me}:{},...R?{orderBy:[{field:R.field,direction:R.dir}]}:{}}),Me=K.nextCursor?.id??"",Be=K.prevCursor?.id??"",qe=q(d,t);S(i,Ee(l.name,K.data,U,qe,{hasPrev:K.hasPrevPage,hasNext:K.hasNextPage,prevCursor:Be,nextCursor:Me},void 0,L,fe,l.allowDelete??false,l.relationalMeta,R,x));},handleCreateForm:(d,i)=>{let m=d.params.repoName;if(!m){S(i,"Bad request",400);return}let l=e[m];if(!l){S(i,"Repository not found",404);return}let c=q(d,t),f=H(l.schema,l.createFields),b=z(f),v=`${c}/${l.name}/create`,g=j(b,v,"POST","Create document");S(i,B(l.name,g,"create",null,c));},handleCreateSubmit:async(d,i)=>{let m=d.params.repoName;if(!m){S(i,"Bad request",400);return}let l=e[m];if(!l){S(i,"Repository not found",404);return}let c=q(d,t),f=d.body??{},b=ce(f,l.schema),v=H(l.schema,l.createFields),g=v.safeParse(b);if(!g.success){let k=z(v),R=`${c}/${l.name}/create`,h=j(k,R,"POST","Create document"),x=g.error.issues.map($=>`${$.path.join(".")}: ${$.message}`).join(", ");S(i,B(l.name,h,"create",null,c,{type:"error",message:`Validation error: ${x}`}),422);return}try{if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let k={...g.data};l.createdKey&&(k[l.createdKey]=new Date);let R=l.parentKeys.filter(C=>!k[C]);if(R.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${R.join(", ")}`);let h=l.parentKeys.map(C=>k[C]),x=l.documentKey??"docId",$=k[x]||at();await l.repo.set(...h,$,k);}else await l.repo.create(g.data);de(i,`${c}/${l.name}?flash=created`);}catch(k){let R=H(l.schema,l.createFields),h=z(R),x=`${c}/${l.name}/create`,$=j(h,x,"POST","Create document");S(i,B(l.name,$,"create",null,c,{type:"error",message:`Save error: ${k.message}`}),500);}},handleEditForm:async(d,i)=>{let m=d.params.repoName,l=d.params.id;if(!m||!l){S(i,"Bad request",400);return}let c=e[m];if(!c){S(i,"Repository not found",404);return}let f=null;try{f=await le(c,l);}catch(x){S(i,`Error fetching document: ${x.message}`,500);return}if(!f){S(i,"Document not found",404);return}let b=De(f,c.schema),v=H(c.schema,c.mutableFields),g=ue(z(v),b),k=q(d,t),R=`${k}/${c.name}/${encodeURIComponent(l)}/edit`,h=j(g,R,"POST","Save changes");S(i,B(c.name,h,"edit",l,k));},handleEditSubmit:async(d,i)=>{let m=d.params.repoName,l=d.params.id;if(!m||!l){S(i,"Bad request",400);return}let c=e[m];if(!c){S(i,"Repository not found",404);return}let f=q(d,t),b=d.body??{},v=ce(b,c.schema),g=H(c.schema,c.mutableFields),R=g.partial().safeParse(v);if(!R.success){let h=Object.fromEntries(Object.entries(b).map(([V,L])=>[V,Array.isArray(L)?L.join(","):L??""])),x=ue(z(g),h),$=`${f}/${c.name}/${encodeURIComponent(l)}/edit`,C=j(x,$,"POST","Save changes"),U=R.error.issues.map(V=>`${V.path.join(".")}: ${V.message}`).join(", ");S(i,B(c.name,C,"edit",l,f,{type:"error",message:`Validation error: ${U}`}),422);return}try{let h=await le(c,l),x=(h&&Ne(h,c.pathKey))??[l];await c.repo.update(...x,R.data),de(i,`${f}/${c.name}?flash=updated`);}catch(h){let x=H(c.schema,c.mutableFields),$=z(x),C=`${f}/${c.name}/${encodeURIComponent(l)}/edit`,U=j($,C,"POST","Save changes");S(i,B(c.name,U,"edit",l,f,{type:"error",message:`Save error: ${h.message}`}),500);}},handleDelete:async(d,i)=>{let m=d.params.repoName,l=d.params.id;if(!m||!l){S(i,"Bad request",400);return}let c=e[m];if(!c){S(i,"Repository not found",404);return}if(!c.allowDelete){S(i,"Delete is not allowed for this repository",403);return}let f=q(d,t);try{let b=await le(c,l),v=(b&&Ne(b,c.pathKey))??[l];await c.repo.delete(...v),de(i,`${f}/${c.name}?flash=deleted`);}catch(b){S(i,`Delete error: ${b.message}`,500);}}}}function lt(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,a=>a===":"?a:`\\${a}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(a,r)=>(t.push(r),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function dt(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var G=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,a)=>{console.error("[MiniRouter]",t),a.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,a){let{pattern:r,paramNames:s}=lt(n);return this.routes.push({method:t.toUpperCase(),pattern:r,paramNames:s,handler:a}),this}async handle(t,n){let a=(t.method??"GET").toUpperCase(),r=dt(t),s=null,o={};for(let d of this.routes){if(d.method!==a)continue;let i=r.match(d.pattern);if(i){s=d,o={},d.paramNames.forEach((m,l)=>{o[m]=decodeURIComponent(i[l+1]??"");});break}}let u=Object.assign(t,{params:o}),p=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(u,n,p);}catch(d){this.errorHandler(d,t,n);}}async runMiddlewareChain(t,n,a){let r=0,s=async()=>{if(r<this.middlewares.length){let o=this.middlewares[r++];await o(t,n,s);}else await a(t,n);};await s();}};async function ct(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function ut(e){let t={};if(!e)return t;for(let n of e.split("&")){let a=n.indexOf("=");if(a===-1)continue;let r=decodeURIComponent(n.slice(0,a).replace(/\+/g," ")),s=decodeURIComponent(n.slice(a+1).replace(/\+/g," ")),o=t[r];o===void 0?t[r]=s:Array.isArray(o)?o.push(s):t[r]=[o,s];}return t}function rn(e){let{basePath:t="/",repos:n,parseBody:a=true,auth:r,middleware:s=[],httpsOptions:o}=e,u=t==="/"?"":t.replace(/\/$/,""),p={};for(let[l,c]of Object.entries(n)){let f=c.schema??c.repo.schema??null;if(!f)throw new Error(`[createAdminServer] Repository "${l}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let b,v,g;if(c.fieldsConfig){let h=c.fieldsConfig;b=[],v=[],g=[];for(let[x,$]of Object.entries(h))for(let C of $)C==="filterable"?b.push(x):C==="mutable"?v.push(x):C==="create"&&g.push(x);b.length===0&&(b=void 0),v.length===0&&(v=void 0),g.length===0&&(g=void 0);}let k=(()=>{let h=c.repo._parentKeys;return h&&h.length>0?h:void 0})();if(k&&g)for(let h of k)g.includes(h)||g.push(h);let R={name:l,path:c.path,repo:c.repo,schema:f,documentKey:c.documentKey??"docId",pathKey:c.repo._pathKey??void 0,isGroup:!!c.repo._isGroup,parentKeys:k,createdKey:c.repo._createdKey??void 0,listColumns:c.listColumns,pageSize:c.pageSize,filterableFields:b,mutableFields:v,createFields:g,allowDelete:c.allowDelete??false,relationalMeta:(()=>{if(!c.relationalFields||c.relationalFields.length===0)return;let h=c.repo.relationalKeys??{},x=[];for(let $ of c.relationalFields){let C=h[$.key];C&&x.push({key:$.key,column:$.column,targetRepo:String(C.repo),targetKey:String(C.key),type:C.type});}return x.length>0?x:void 0})()};p[l]=R;}let d=Pe(p,u),i=new G;if(a&&i.use(async(l,c,f)=>{let b=l,v=String(b.headers?.["content-type"]??"");if(v.includes("application/x-www-form-urlencoded")){let g=await ct(b);l.body=ut(g);}else if(v.includes("application/json")&&typeof b.body=="string")try{l.body=JSON.parse(b.body);}catch{}await f();}),r)if(typeof r=="function")i.use(r);else {let l=r.realm??"Admin",c="Basic "+Buffer.from(`${r.username}:${r.password}`).toString("base64");i.use((f,b,v)=>{if((f.headers?.authorization??"")!==c){b.status(401).set("WWW-Authenticate",`Basic realm="${l}"`).set("Content-Type","text/plain").send("Unauthorized");return}v();});}for(let l of s)i.use(l);i.get(`${u}/`,d.handleDashboard),i.get(`${u}`,d.handleDashboard),i.get(`${u}/:repoName`,d.handleList),i.get(`${u}/:repoName/create`,d.handleCreateForm),i.post(`${u}/:repoName/create`,d.handleCreateSubmit),i.get(`${u}/:repoName/:id/edit`,d.handleEditForm),i.post(`${u}/:repoName/:id/edit`,d.handleEditSubmit),i.post(`${u}/:repoName/:id/delete`,d.handleDelete);let m=async(l,c)=>{await i.handle(l,c);};return o&&(m.httpsOptions=o),m}
555
+ `;function Y(){return jsx("script",{dangerouslySetInnerHTML:{__html:Te}})}function P(e){return "<!DOCTYPE html>"+renderToString(e)}var I=({opts:e,children:t})=>{let{title:n,breadcrumb:a,flash:r,basePath:s="/"}=e;return jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxs("head",{children:[jsx("meta",{charset:"UTF-8"}),jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsx("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:jsx("div",{class:"flex-1",children:jsx("a",{href:s,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})})}),jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[a&&a.length>0&&jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsx("ul",{children:a.map((o,u)=>o.href?jsx("li",{children:jsx("a",{href:o.href,children:o.label})},u):jsx("li",{class:"text-base-content/60",children:o.label},u))})}),jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),r&&jsx("div",{role:"alert",class:`alert ${r.type==="success"?"alert-success":"alert-error"} mb-6`,children:jsx("span",{children:r.message})}),t]}),jsx(Y,{})]})]})};function re(e,t){return P(jsx(I,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):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=>jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxs("div",{class:"card-body p-5",children:[jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var Ze=[{value:"==",label:"="},{value:"!=",label:"\u2260"}],Xe=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"<",label:"<"},{value:"<=",label:"\u2264"},{value:">",label:">"},{value:">=",label:"\u2265"}],Ge=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function Ye(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return Xe;case "ZodBoolean":return Ze;case "ZodArray":return Ge;default:return Ze}}function Qe({col:e,active:t}){let n=t?.value??"";if(e.zodType==="ZodBoolean")return jsxs("select",{name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",children:[jsx("option",{value:"",selected:n==="",children:"\u2014"}),jsx("option",{value:"true",selected:n==="true",children:"true"}),jsx("option",{value:"false",selected:n==="false",children:"false"})]});if(e.zodType==="ZodArray"){let a=t?.op==="array-contains-any";return jsx("input",{type:"text",name:`fv_${e.name}`,value:n,placeholder:a?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsx("input",{type:"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full"}):e.zodType==="ZodDate"?jsx("input",{type:"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full"}):jsx("input",{type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full"})}function ae({action:e,columnMeta:t,activeFilters:n}){let a=Object.fromEntries(n.map(o=>[o.field,o])),r=n.length>0,s=t.filter(o=>o.zodType!=="ZodObject"&&o.zodType!=="ZodRecord");return jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:r?true:void 0,children:[jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",r&&jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxs("form",{method:"get",action:e,children:[jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:s.map(o=>{let u=Ye(o.zodType),p=a[o.name],d=p?.op??u[0].value;return jsxs("div",{class:"flex flex-col gap-1.5",children:[jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:o.name}),jsxs("div",{class:"flex gap-1.5",children:[u.length>1?jsx("select",{name:`fo_${o.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:u.map(i=>jsx("option",{value:i.value,selected:i.value===d,children:i.label},i.value))}):jsx("input",{type:"hidden",name:`fo_${o.name}`,value:u[0].value}),jsx(Qe,{col:o,active:p})]})]},o.name)})}),jsxs("div",{class:"flex gap-2 mt-4 pt-3 border-t border-base-200",children:[jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),r&&jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"})]})]})})]})}function oe(e,t,n,a,r,s){let o=n==="create"?`Create ${e}`:`Edit ${e} / ${a??""}`,u=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 ${a??""}`}];return P(jsx(I,{opts:{title:o,breadcrumb:u,basePath:r,flash:s},children:jsx("div",{class:"card bg-base-100 border border-base-300",children:jsx("div",{class:"card-body p-6",children:jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}function se(e,t,n){let a=new URLSearchParams;for(let r of e)a.set(`fv_${r.field}`,r.value),a.set(`fo_${r.field}`,r.op);return t&&(a.set("ob",t.field),a.set("od",t.dir)),n&&a.set("ps",String(n)),a}function Oe(e,t,n,a,r){let s=se(e,a,r);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function et(e,t,n,a){let r=se(n,void 0,a);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 tt(e,t,n){return `?${se(t,n,e).toString()}`}function ie(e,t,n,a,r,s,o=[],u=[],p=false,d=[],i,m){let l=`${a}/${e}`,c=`${l}/create`;return P(jsxs(I,{opts:{title:e,breadcrumb:[{label:"Repositories",href:a},{label:e}],basePath:a,flash:s},children:[o.length>0&&jsx(ae,{action:l,columnMeta:o,activeFilters:u}),jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3",children:[jsxs("div",{class:"flex items-center gap-3",children:[jsxs("span",{class:"text-sm text-base-content/60",children:[t.length," document",t.length!==1&&"s"]}),jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsx("span",{children:"Rows"}),jsx("div",{class:"join",children:[10,25,50,100].map(f=>jsx("a",{href:tt(f,u,i),class:`join-item btn btn-xs ${m===f?"btn-active btn-primary":"btn-outline"}`,children:f},f))})]})]}),jsx("a",{href:c,class:"btn btn-primary btn-sm",children:"+ New"})]}),jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[[...n].map((f,b)=>{let v=i?.field===f,g=v?i.dir==="asc"?" \u25B2":" \u25BC":"";return jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxs("a",{href:et(f,i,u,m),class:`hover:text-base-content inline-flex items-center gap-0.5${v?" text-primary font-bold":""}`,children:[f,g]})},b)}),d.map((f,b)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:f.column},`rel-${b}`)),jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsx("tbody",{children:t.length===0?jsx("tr",{children:jsx("td",{colspan:n.length+d.length+1,class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((f,b)=>{let v=String(f.docId??f.id??""),g=`${a}/${e}/${encodeURIComponent(v)}/edit`,k=`${a}/${e}/${encodeURIComponent(v)}/delete`;return jsxs("tr",{class:"hover",children:[n.map((R,h)=>jsx("td",{class:"align-top py-2",children:jsx(ne,{val:f[R]})},h)),d.map((R,h)=>{let x=f[R.key];if(x==null||x==="")return jsx("td",{class:"py-2"},`rel-${h}`);let $=`${a}/${R.targetRepo}?fv_${R.targetKey}=${encodeURIComponent(String(x))}`;return jsx("td",{class:"align-middle py-2",children:jsx("a",{href:$,class:"btn btn-xs btn-ghost btn-outline",children:R.column})},`rel-${h}`)}),jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxs("div",{class:"flex gap-1 justify-end",children:[jsx("a",{href:g,class:"btn btn-xs btn-outline",children:"Edit"}),p&&jsx("form",{method:"post",action:k,onsubmit:"return confirm('Delete this document?')",children:jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},b)})})]})}),(r.hasPrev||r.hasNext)&&jsxs("div",{class:"flex justify-center items-center mt-6 gap-2",children:[r.hasPrev?jsx("a",{href:Oe(u,r.prevCursor,"prev",i,m),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),r.hasNext?jsx("a",{href:Oe(u,r.nextCursor,"next",i,m),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]})]}))}function _e(e,t){return re(e,t)}function Ee(e,t,n,a,r,s,o,u,p,d,i,m){return ie(e,t,n,a,r,s,o,u,p,d,i,m)}function B(e,t,n,a,r,s){return oe(e,t,n,a,r,s)}var Fe="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function at(){let e="";for(let t=0;t<20;t++)e+=Fe.charAt(Math.floor(Math.random()*Fe.length));return e}function Ne(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let a=n.split("/").filter(Boolean),r=[];for(let s=1;s<a.length;s+=2)r.push(a[s]);return r.length>0?r:void 0}async function le(e,t){let n=e.documentKey??"docId",a=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[a]=="function")try{let s=await e.repo.get[a](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function S(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function de(e,t){e.status(302).set("Location",t).send("");}function ce(e,t){let n=t.shape,a={};for(let[r,s]of Object.entries(n)){let o=pe(s);if(o==="ZodObject"){if(e[r+"__isnull"]==="1"){a[r]=null;continue}let d={},i=false;for(let[c,f]of Object.entries(e))c.startsWith(`${r}.`)&&(d[c.slice(r.length+1)]=f,i=true);if(i){let c=s;for(;;){let f=O(c);if(f==="ZodOptional"||f==="ZodNullable"||f==="ZodDefault")c=E(c);else break}a[r]=ce(d,c);continue}let m=e[r],l=Array.isArray(m)?m[m.length-1]:m;if(l)try{a[r]=JSON.parse(l);}catch{a[r]=l;}continue}let u=e[r],p=Array.isArray(u)?u[u.length-1]:u;if(e[r+"__isnull"]==="1"){a[r]=null;continue}if(p===void 0||p===""){o==="ZodBoolean"&&(a[r]=false);continue}switch(o){case "ZodBoolean":p==="__null__"?a[r]=null:a[r]=p==="true"||p==="on"||p==="1";break;case "ZodNumber":case "ZodBigInt":a[r]=Number(p);break;case "ZodDate":a[r]=new Date(p);break;case "ZodArray":try{a[r]=JSON.parse(p);}catch{a[r]=p;}break;default:if(p.startsWith("{")||p.startsWith("["))try{a[r]=JSON.parse(p);break}catch{}a[r]=p;}}return a}function ze(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 a=new Date(e);isNaN(a.getTime())||(t=a);}if(!t||isNaN(t.getTime()))return null;let n=a=>String(a).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function pe(e){let t=e;for(;;){let n=O(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=E(t);else return n}}function De(e,t,n=""){let a={};for(let r of Object.keys(t.shape)){let s=n?`${n}.${r}`:r,o=e[r];if(o===null){a[s]="__null__";continue}if(o===void 0)continue;let u=t.shape[r];for(;;){let d=O(u);if(d==="ZodOptional"||d==="ZodNullable"||d==="ZodDefault")u=E(u);else break}let p=O(u);if(p==="ZodObject"&&typeof o=="object"&&o!==null&&!Array.isArray(o)){let d=De(o,u,s);Object.assign(a,d);}else if(p==="ZodDate"){let d=ze(o);d!==null&&(a[s]=d);}else if(typeof o=="object"&&o!==null&&!Array.isArray(o)&&("_seconds"in o||typeof o.toDate=="function")){let d=ze(o);a[s]=d??JSON.stringify(o,null,2);}else typeof o=="object"?a[s]=JSON.stringify(o,null,2):a[s]=String(o);}return a}function ue(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?ue(n.nested,t):void 0}))}function ot(e,t){let n=new Set(["==","!=","<","<=",">",">=","array-contains","array-contains-any"]),a=[];for(let[r,s]of Object.entries(e)){if(!r.startsWith("fv_"))continue;let o=r.slice(3);if(!t.has(o))continue;let u=(s??"").trim();if(!u)continue;let p=e[`fo_${o}`]??"==",d=n.has(p)?p:"==";a.push({field:o,op:d,value:u});}return a}function st(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"){let a=n.value.split(",").map(r=>t(r.trim())).filter(r=>r!=="");return [n.field,n.op,a]}return [n.field,n.op,t(n.value)]})}function je(e,t,n=""){let a=[];for(let r of e){let s=n?`${n}.${r}`:r,o=t.shape[r];if(!o){a.push({name:s,zodType:"ZodString"});continue}let u=pe(o);if(u==="ZodObject"){let p=o;for(;;){let i=O(p);if(i==="ZodOptional"||i==="ZodNullable"||i==="ZodDefault")p=E(p);else break}let d=J(p);a.push(...je(Object.keys(d),p,s));}else a.push({name:s,zodType:u});}return a}function it(e,t){let n=t.split("."),a=e;for(let r of n){for(;;){let o=O(a);if(o==="ZodOptional"||o==="ZodNullable"||o==="ZodDefault")a=E(a);else break}let s=J(a);if(!(r in s))return null;a=s[r];}return a}function H(e,t){if(!t||t.length===0)return e;let n=[],a=new Map;for(let s of t){let o=s.indexOf(".");if(o===-1)n.push(s);else {let u=s.slice(0,o),p=s.slice(o+1);a.has(u)||a.set(u,[]),a.get(u).push(p);}}let r={};for(let s of n)s in e.shape&&(r[s]=e.shape[s]);for(let[s,o]of a){if(!(s in e.shape))continue;let u=e.shape[s];for(;;){let p=O(u);if(p==="ZodOptional"||p==="ZodNullable"||p==="ZodDefault")u=E(u);else break}if(O(u)!=="ZodObject"){r[s]=e.shape[s];continue}r[s]=H(u,o);}return z$1.object(r)}function q(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",o=process.env.FUNCTION_REGION??"us-central1",u=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${o}/${u}${n}`}let a=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return a&&r.includes("cloudfunctions.net")?`/${a.toLowerCase()}${n}`:n}function Pe(e,t){return {handleDashboard:(d,i)=>{let m=q(d,t),l=Object.values(e).map(c=>({name:c.name,path:c.path}));S(i,_e(l,m));},handleList:async(d,i)=>{let m=d.params.repoName;if(!m){S(i,"Bad request",400);return}let l=e[m];if(!l){S(i,"Repository not found",404);return}let c=l.pageSize??25,f=d.query??{},b=f.cursor,v=f.dir==="prev"?"prev":"next",g=f.ob??"",k=f.od==="desc"?"desc":"asc",R=g?{field:g,dir:k}:void 0,h=parseInt(f.ps??""),x=Number.isFinite(h)&&h>0?Math.min(h,200):c,$=l.listColumns??Object.keys(l.schema.shape),C=l.documentKey??"docId",U=[C,...$.filter(Z=>Z!==C)],L=l.filterableFields?(()=>{let Z=[];for(let N of l.filterableFields)(N.includes(".")||$.includes(N))&&Z.push(N);return Z})():$,V=(()=>{let Z=[];for(let N of L)if(N.includes(".")){let be=it(l.schema,N);Z.push({name:N,zodType:be?pe(be):"ZodString"});}else Z.push(...je([N],l.schema));return Z})(),Ie=new Set(V.map(Z=>Z.name)),fe=ot(f,Ie),me=st(fe),ye;if(b)try{let Z=l.repo.ref;typeof Z.doc=="function"&&(ye=await Z.doc(b).get());}catch{}let K=await l.repo.query.paginate({pageSize:x,cursor:ye,direction:v,...me.length>0?{where:me}:{},...R?{orderBy:[{field:R.field,direction:R.dir}]}:{}}),Me=K.nextCursor?.id??"",Be=K.prevCursor?.id??"",qe=q(d,t);S(i,Ee(l.name,K.data,U,qe,{hasPrev:K.hasPrevPage,hasNext:K.hasNextPage,prevCursor:Be,nextCursor:Me},void 0,V,fe,l.allowDelete??false,l.relationalMeta,R,x));},handleCreateForm:(d,i)=>{let m=d.params.repoName;if(!m){S(i,"Bad request",400);return}let l=e[m];if(!l){S(i,"Repository not found",404);return}let c=q(d,t),f=H(l.schema,l.createFields),b=z(f),v=`${c}/${l.name}/create`,g=j(b,v,"POST","Create document");S(i,B(l.name,g,"create",null,c));},handleCreateSubmit:async(d,i)=>{let m=d.params.repoName;if(!m){S(i,"Bad request",400);return}let l=e[m];if(!l){S(i,"Repository not found",404);return}let c=q(d,t),f=d.body??{},b=ce(f,l.schema),v=H(l.schema,l.createFields),g=v.safeParse(b);if(!g.success){let k=z(v),R=`${c}/${l.name}/create`,h=j(k,R,"POST","Create document"),x=g.error.issues.map($=>`${$.path.join(".")}: ${$.message}`).join(", ");S(i,B(l.name,h,"create",null,c,{type:"error",message:`Validation error: ${x}`}),422);return}try{if(l.isGroup&&l.parentKeys&&l.parentKeys.length>0){let k={...g.data};l.createdKey&&(k[l.createdKey]=new Date);let R=l.parentKeys.filter(C=>!k[C]);if(R.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${R.join(", ")}`);let h=l.parentKeys.map(C=>k[C]),x=l.documentKey??"docId",$=k[x]||at();await l.repo.set(...h,$,k);}else await l.repo.create(g.data);de(i,`${c}/${l.name}?flash=created`);}catch(k){let R=H(l.schema,l.createFields),h=z(R),x=`${c}/${l.name}/create`,$=j(h,x,"POST","Create document");S(i,B(l.name,$,"create",null,c,{type:"error",message:`Save error: ${k.message}`}),500);}},handleEditForm:async(d,i)=>{let m=d.params.repoName,l=d.params.id;if(!m||!l){S(i,"Bad request",400);return}let c=e[m];if(!c){S(i,"Repository not found",404);return}let f=null;try{f=await le(c,l);}catch(x){S(i,`Error fetching document: ${x.message}`,500);return}if(!f){S(i,"Document not found",404);return}let b=De(f,c.schema),v=H(c.schema,c.mutableFields),g=ue(z(v),b),k=q(d,t),R=`${k}/${c.name}/${encodeURIComponent(l)}/edit`,h=j(g,R,"POST","Save changes");S(i,B(c.name,h,"edit",l,k));},handleEditSubmit:async(d,i)=>{let m=d.params.repoName,l=d.params.id;if(!m||!l){S(i,"Bad request",400);return}let c=e[m];if(!c){S(i,"Repository not found",404);return}let f=q(d,t),b=d.body??{},v=ce(b,c.schema),g=H(c.schema,c.mutableFields),R=g.partial().safeParse(v);if(!R.success){let h=Object.fromEntries(Object.entries(b).map(([L,V])=>[L,Array.isArray(V)?V.join(","):V??""])),x=ue(z(g),h),$=`${f}/${c.name}/${encodeURIComponent(l)}/edit`,C=j(x,$,"POST","Save changes"),U=R.error.issues.map(L=>`${L.path.join(".")}: ${L.message}`).join(", ");S(i,B(c.name,C,"edit",l,f,{type:"error",message:`Validation error: ${U}`}),422);return}try{let h=await le(c,l),x=(h&&Ne(h,c.pathKey))??[l];await c.repo.update(...x,R.data),de(i,`${f}/${c.name}?flash=updated`);}catch(h){let x=H(c.schema,c.mutableFields),$=z(x),C=`${f}/${c.name}/${encodeURIComponent(l)}/edit`,U=j($,C,"POST","Save changes");S(i,B(c.name,U,"edit",l,f,{type:"error",message:`Save error: ${h.message}`}),500);}},handleDelete:async(d,i)=>{let m=d.params.repoName,l=d.params.id;if(!m||!l){S(i,"Bad request",400);return}let c=e[m];if(!c){S(i,"Repository not found",404);return}if(!c.allowDelete){S(i,"Delete is not allowed for this repository",403);return}let f=q(d,t);try{let b=await le(c,l),v=(b&&Ne(b,c.pathKey))??[l];await c.repo.delete(...v),de(i,`${f}/${c.name}?flash=deleted`);}catch(b){S(i,`Delete error: ${b.message}`,500);}}}}function lt(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,a=>a===":"?a:`\\${a}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(a,r)=>(t.push(r),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function dt(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var G=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,a)=>{console.error("[MiniRouter]",t),a.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,a){let{pattern:r,paramNames:s}=lt(n);return this.routes.push({method:t.toUpperCase(),pattern:r,paramNames:s,handler:a}),this}async handle(t,n){let a=(t.method??"GET").toUpperCase(),r=dt(t),s=null,o={};for(let d of this.routes){if(d.method!==a)continue;let i=r.match(d.pattern);if(i){s=d,o={},d.paramNames.forEach((m,l)=>{o[m]=decodeURIComponent(i[l+1]??"");});break}}let u=Object.assign(t,{params:o}),p=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(u,n,p);}catch(d){this.errorHandler(d,t,n);}}async runMiddlewareChain(t,n,a){let r=0,s=async()=>{if(r<this.middlewares.length){let o=this.middlewares[r++];await o(t,n,s);}else await a(t,n);};await s();}};async function ct(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function ut(e){let t={};if(!e)return t;for(let n of e.split("&")){let a=n.indexOf("=");if(a===-1)continue;let r=decodeURIComponent(n.slice(0,a).replace(/\+/g," ")),s=decodeURIComponent(n.slice(a+1).replace(/\+/g," ")),o=t[r];o===void 0?t[r]=s:Array.isArray(o)?o.push(s):t[r]=[o,s];}return t}function rn(e){let{basePath:t="/",repos:n,parseBody:a=true,auth:r,middleware:s=[],httpsOptions:o}=e,u=t==="/"?"":t.replace(/\/$/,""),p={};for(let[l,c]of Object.entries(n)){let f=c.schema??c.repo.schema??null;if(!f)throw new Error(`[createAdminServer] Repository "${l}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let b,v,g;if(c.fieldsConfig){let h=c.fieldsConfig;b=[],v=[],g=[];for(let[x,$]of Object.entries(h))for(let C of $)C==="filterable"?b.push(x):C==="mutable"?v.push(x):C==="create"&&g.push(x);b.length===0&&(b=void 0),v.length===0&&(v=void 0),g.length===0&&(g=void 0);}let k=(()=>{let h=c.repo._parentKeys;return h&&h.length>0?h:void 0})();if(k&&g)for(let h of k)g.includes(h)||g.push(h);let R={name:l,path:c.path,repo:c.repo,schema:f,documentKey:c.documentKey??"docId",pathKey:c.repo._pathKey??void 0,isGroup:!!c.repo._isGroup,parentKeys:k,createdKey:c.repo._createdKey??void 0,listColumns:c.listColumns,pageSize:c.pageSize,filterableFields:b,mutableFields:v,createFields:g,allowDelete:c.allowDelete??false,relationalMeta:(()=>{if(!c.relationalFields||c.relationalFields.length===0)return;let h=c.repo.relationalKeys??{},x=[];for(let $ of c.relationalFields){let C=h[$.key];C&&x.push({key:$.key,column:$.column,targetRepo:String(C.repo),targetKey:String(C.key),type:C.type});}return x.length>0?x:void 0})()};p[l]=R;}let d=Pe(p,u),i=new G;if(a&&i.use(async(l,c,f)=>{let b=l,v=String(b.headers?.["content-type"]??"");if(v.includes("application/x-www-form-urlencoded")){let g=await ct(b);l.body=ut(g);}else if(v.includes("application/json")&&typeof b.body=="string")try{l.body=JSON.parse(b.body);}catch{}await f();}),r)if(typeof r=="function")i.use(r);else {let l=r.realm??"Admin",c="Basic "+Buffer.from(`${r.username}:${r.password}`).toString("base64");i.use((f,b,v)=>{if((f.headers?.authorization??"")!==c){b.status(401).set("WWW-Authenticate",`Basic realm="${l}"`).set("Content-Type","text/plain").send("Unauthorized");return}v();});}for(let l of s)i.use(l);i.get(`${u}/`,d.handleDashboard),i.get(`${u}`,d.handleDashboard),i.get(`${u}/:repoName`,d.handleList),i.get(`${u}/:repoName/create`,d.handleCreateForm),i.post(`${u}/:repoName/create`,d.handleCreateSubmit),i.get(`${u}/:repoName/:id/edit`,d.handleEditForm),i.post(`${u}/:repoName/:id/edit`,d.handleEditSubmit),i.post(`${u}/:repoName/:id/delete`,d.handleDelete);let m=async(l,c)=>{await i.handle(l,c);};return o&&(m.httpsOptions=o),m}
556
556
  export{G as MiniRouter,rn as createAdminServer};//# sourceMappingURL=index.js.map
557
557
  //# sourceMappingURL=index.js.map