@lpdjs/firestore-repo-service 2.2.0 → 2.2.2

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.
Files changed (38) hide show
  1. package/README.md +111 -529
  2. package/dist/{index-BJQXYHTC.d.ts → index-BnXFmcVp.d.ts} +4 -3
  3. package/dist/{index-BjH87AI4.d.cts → index-KbSSRIWJ.d.cts} +4 -3
  4. package/dist/index.cjs +3 -3
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.cts +4 -3
  7. package/dist/index.d.ts +4 -3
  8. package/dist/index.js +3 -3
  9. package/dist/index.js.map +1 -1
  10. package/dist/servers/admin/index.cjs +2 -2
  11. package/dist/servers/admin/index.cjs.map +1 -1
  12. package/dist/servers/admin/index.d.cts +3 -2
  13. package/dist/servers/admin/index.d.ts +3 -2
  14. package/dist/servers/admin/index.js +2 -2
  15. package/dist/servers/admin/index.js.map +1 -1
  16. package/dist/servers/crud/index.cjs +2 -2
  17. package/dist/servers/crud/index.cjs.map +1 -1
  18. package/dist/servers/crud/index.d.cts +4 -3
  19. package/dist/servers/crud/index.d.ts +4 -3
  20. package/dist/servers/crud/index.js +2 -2
  21. package/dist/servers/crud/index.js.map +1 -1
  22. package/dist/servers/index.cjs +6 -6
  23. package/dist/servers/index.cjs.map +1 -1
  24. package/dist/servers/index.d.cts +4 -3
  25. package/dist/servers/index.d.ts +4 -3
  26. package/dist/servers/index.js +6 -6
  27. package/dist/servers/index.js.map +1 -1
  28. package/dist/sync/bigquery.d.cts +3 -1
  29. package/dist/sync/bigquery.d.ts +3 -1
  30. package/dist/sync/index.cjs +5 -5
  31. package/dist/sync/index.d.cts +7 -12
  32. package/dist/sync/index.d.ts +7 -12
  33. package/dist/sync/index.js +5 -5
  34. package/dist/{types-CYVwoOQx.d.cts → types-B5NdBY1Z.d.cts} +2 -1
  35. package/dist/{types-CYVwoOQx.d.ts → types-B5NdBY1Z.d.ts} +2 -1
  36. package/dist/{types-Vvdx263s.d.cts → types-BbCdscqh.d.cts} +17 -9
  37. package/dist/{types-Vvdx263s.d.ts → types-BbCdscqh.d.ts} +17 -9
  38. package/package.json +9 -9
@@ -1,4 +1,5 @@
1
1
  import 'zod';
2
- import '../../types-CYVwoOQx.cjs';
3
- export { A as AdminRepoConfig, a as AdminRepoEntry, b as AdminServerOptions, B as BasicAuthConfig, d as Middleware, M as MiniRouter, e as RepoRegistry, f as RouteHandler, c as createAdminServer } from '../../index-BjH87AI4.cjs';
2
+ import 'firebase-functions/v2/https';
3
+ import '../../types-B5NdBY1Z.cjs';
4
+ export { A as AdminRepoConfig, a as AdminRepoEntry, b as AdminServerOptions, B as BasicAuthConfig, d as Middleware, M as MiniRouter, e as RepoRegistry, f as RouteHandler, c as createAdminServer } from '../../index-KbSSRIWJ.cjs';
4
5
  import 'firebase-admin/firestore';
@@ -1,4 +1,5 @@
1
1
  import 'zod';
2
- import '../../types-CYVwoOQx.js';
3
- export { A as AdminRepoConfig, a as AdminRepoEntry, b as AdminServerOptions, B as BasicAuthConfig, d as Middleware, M as MiniRouter, e as RepoRegistry, f as RouteHandler, c as createAdminServer } from '../../index-BJQXYHTC.js';
2
+ import 'firebase-functions/v2/https';
3
+ import '../../types-B5NdBY1Z.js';
4
+ export { A as AdminRepoConfig, a as AdminRepoEntry, b as AdminServerOptions, B as BasicAuthConfig, d as Middleware, M as MiniRouter, e as RepoRegistry, f as RouteHandler, c as createAdminServer } from '../../index-BnXFmcVp.js';
4
5
  import 'firebase-admin/firestore';
@@ -1,4 +1,4 @@
1
- import {z}from'zod';import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {renderToString}from'hono/jsx/dom/server';var dt={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 A(e){let t=e,a=t._zod?.def?.type;if(a)return dt[a]??`Zod${a.charAt(0).toUpperCase()}${a.slice(1)}`;let n=t._def?.typeName;return n||""}function Z(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function Oe(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function Ze(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let a=t._def?.defaultValue;return typeof a=="function"?a():a}function Y(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 oe(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function Ne(e){let t=e,a=[],n=t._zod?.def?.checks;if(Array.isArray(n)){for(let o of n)o.format&&a.push(o.format);if(a.length>0)return a}let r=t._def?.checks;if(Array.isArray(r))for(let o of r)o.kind&&a.push(o.kind);return a}function ct(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Ie(e){let t=e,a=true,n=false,r;for(;;){let o=A(t);if(o==="ZodOptional")a=false,t=Z(t);else if(o==="ZodNullable")a=false,n=true,t=Z(t);else if(o==="ZodDefault")a=false,r=Ze(t),t=Z(t);else break}return {inner:t,required:a,nullable:n,defaultValue:r}}function F(e,t=""){if(A(e)==="ZodObject"){let n=Y(e);return Object.entries(n).map(([r,o])=>De(t?`${t}.${r}`:r,r,o))}return [De(t||"value",t||"value",e)]}function De(e,t,a){let{inner:n,required:r,nullable:o,defaultValue:s}=Ie(a),p=A(n),d=ct(t.split(".").pop()??t);switch(p){case "ZodString":{let l=Ne(n),c=l.includes("email"),f=l.includes("url");return {name:e,label:d,type:"text",required:r,nullable:o,defaultValue:s,hint:c?"email":f?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:d,type:"number",required:r,nullable:o,defaultValue:s};case "ZodBoolean":return {name:e,label:d,type:"checkbox",required:r,nullable:o,defaultValue:s};case "ZodDate":case "ZodCoerce":return {name:e,label:d,type:"datetime-local",required:r,nullable:o,defaultValue:s};case "ZodEnum":{let l=ee(n);return {name:e,label:d,type:"select",required:r,nullable:o,defaultValue:s,options:l}}case "ZodNativeEnum":{let l=te(n),c=Object.values(l).filter(f=>typeof f=="string");return {name:e,label:d,type:"select",required:r,nullable:o,defaultValue:s,options:c}}case "ZodLiteral":{let l=String(oe(n)??"");return {name:e,label:d,type:"select",required:r,nullable:o,defaultValue:s,options:[l]}}case "ZodObject":{let l=F(n,e);return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,nested:l,hint:"JSON object"}}case "ZodArray":{let l=Oe(n);if(!l)return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,hint:"JSON array"};let{inner:c}=Ie(l),f=A(c),i,u,m;switch(f){case "ZodString":i="text";break;case "ZodNumber":case "ZodBigInt":i="number";break;case "ZodBoolean":i="checkbox";break;case "ZodDate":i="datetime-local";break;case "ZodEnum":i="select",u=ee(c);break;case "ZodNativeEnum":i="select",u=Object.values(te(c)).filter(g=>typeof g=="string");break;case "ZodObject":i="object",m=F(c);break;default:return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,hint:"JSON array"}}return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,arrayElementType:i,arrayElementOptions:u,arrayElementFields:m}}default:return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,hint:"JSON"}}}function je(e,t=0){let a=t>0?`ml-${t*4}`:"",n=`field_${e.name.replace(/\./g,"__")}`,r=e.name,o=e.required?" required":"",s=e.defaultValue==="__null__",p=!s&&e.defaultValue!=null?String(e.defaultValue):"",d=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
1
+ import {z}from'zod';import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {renderToString}from'hono/jsx/dom/server';var dt={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,a=t._zod?.def?.type;if(a)return dt[a]??`Zod${a.charAt(0).toUpperCase()}${a.slice(1)}`;let n=t._def?.typeName;return n||""}function Z(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function Ae(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function Ze(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let a=t._def?.defaultValue;return typeof a=="function"?a():a}function Y(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 oe(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function Ne(e){let t=e,a=[],n=t._zod?.def?.checks;if(Array.isArray(n)){for(let o of n)o.format&&a.push(o.format);if(a.length>0)return a}let r=t._def?.checks;if(Array.isArray(r))for(let o of r)o.kind&&a.push(o.kind);return a}function ct(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function Ie(e){let t=e,a=true,n=false,r;for(;;){let o=O(t);if(o==="ZodOptional")a=false,t=Z(t);else if(o==="ZodNullable")a=false,n=true,t=Z(t);else if(o==="ZodDefault")a=false,r=Ze(t),t=Z(t);else break}return {inner:t,required:a,nullable:n,defaultValue:r}}function F(e,t=""){if(O(e)==="ZodObject"){let n=Y(e);return Object.entries(n).map(([r,o])=>De(t?`${t}.${r}`:r,r,o))}return [De(t||"value",t||"value",e)]}function De(e,t,a){let{inner:n,required:r,nullable:o,defaultValue:s}=Ie(a),p=O(n),d=ct(t.split(".").pop()??t);switch(p){case "ZodString":{let l=Ne(n),c=l.includes("email"),f=l.includes("url");return {name:e,label:d,type:"text",required:r,nullable:o,defaultValue:s,hint:c?"email":f?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:d,type:"number",required:r,nullable:o,defaultValue:s};case "ZodBoolean":return {name:e,label:d,type:"checkbox",required:r,nullable:o,defaultValue:s};case "ZodDate":case "ZodCoerce":return {name:e,label:d,type:"datetime-local",required:r,nullable:o,defaultValue:s};case "ZodEnum":{let l=ee(n);return {name:e,label:d,type:"select",required:r,nullable:o,defaultValue:s,options:l}}case "ZodNativeEnum":{let l=te(n),c=Object.values(l).filter(f=>typeof f=="string");return {name:e,label:d,type:"select",required:r,nullable:o,defaultValue:s,options:c}}case "ZodLiteral":{let l=String(oe(n)??"");return {name:e,label:d,type:"select",required:r,nullable:o,defaultValue:s,options:[l]}}case "ZodObject":{let l=F(n,e);return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,nested:l,hint:"JSON object"}}case "ZodArray":{let l=Ae(n);if(!l)return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,hint:"JSON array"};let{inner:c}=Ie(l),f=O(c),i,u,m;switch(f){case "ZodString":i="text";break;case "ZodNumber":case "ZodBigInt":i="number";break;case "ZodBoolean":i="checkbox";break;case "ZodDate":i="datetime-local";break;case "ZodEnum":i="select",u=ee(c);break;case "ZodNativeEnum":i="select",u=Object.values(te(c)).filter(g=>typeof g=="string");break;case "ZodObject":i="object",m=F(c);break;default:return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,hint:"JSON array"}}return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,arrayElementType:i,arrayElementOptions:u,arrayElementFields:m}}default:return {name:e,label:d,type:"textarea",required:r,nullable:o,defaultValue:s,hint:"JSON"}}}function je(e,t=0){let a=t>0?`ml-${t*4}`:"",n=`field_${e.name.replace(/\./g,"__")}`,r=e.name,o=e.required?" required":"",s=e.defaultValue==="__null__",p=!s&&e.defaultValue!=null?String(e.defaultValue):"",d=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
2
2
  <input type="hidden" id="${n}__isnull" name="${r}__isnull" value="${s?"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" ${s?"checked":""}
@@ -552,6 +552,6 @@ function initColumnReorder(table) {
552
552
  });
553
553
  });
554
554
  }
555
- `;function se(){return jsx("script",{dangerouslySetInnerHTML:{__html:Me}})}function P(e){return "<!DOCTYPE html>"+renderToString(e)}var M=({opts:e,children:t})=>{let{title:a,breadcrumb:n,flash:r,basePath:o="/"}=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:[a," \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:o,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:[n&&n.length>0&&jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsx("ul",{children:n.map((s,p)=>s.href?jsx("li",{children:jsx("a",{href:s.href,children:s.label})},p):jsx("li",{class:"text-base-content/60",children:s.label},p))})}),jsx("h1",{class:"text-2xl font-bold mb-6",children:a}),r&&jsxs("div",{role:"alert",class:`alert ${r.type==="success"?"alert-success":r.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsx("span",{class:"flex-1",children:r.message}),r.action&&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]}),jsx(se,{})]})]})};function ue(e,t){return P(jsx(M,{opts:t,children:jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function pe(e,t){return P(jsx(M,{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(a=>jsx("a",{href:`${t}/${a.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:a.name}),jsx("p",{class:"text-xs text-base-content/50 font-mono",children:a.path})]})},a.name))})}))}var qe=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],bt=[{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"}],gt=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function ht(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return bt;case "ZodBoolean":return qe;case "ZodArray":return gt;default:return qe}}var B="__null__";function vt(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="${B}"]');if(!o){o=document.createElement('option');o.value='${B}';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='${B}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${B}"][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!=='${B}')?i.dataset._prev:'';}}})(this)`}function xt(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 re({inputId:e,active:t}){return 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:[jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:vt(e)}),jsx("span",{children:"\u2205"})]})}function wt({col:e,active:t}){let a=t?.value??"",n=a===B,r=`fv_input_${e.name.replace(/\./g,"__")}`,o=t?.op,s=o==="in"||o==="not-in";if(e.enumValues&&e.enumValues.length>0){if(s){let p=new Set(a.split(",").map(l=>l.trim()).filter(Boolean)),d=`eg_${e.name.replace(/\./g,"__")}`;return jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsx("input",{type:"hidden",id:r,name:`fv_${e.name}`,value:a}),e.enumValues.map(l=>jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:l,checked:p.has(l),"data-enum-group":d,onchange:xt(r,d)}),jsx("span",{children:l})]},l))]})}return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:r,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:n?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:a===""&&!n,children:"\u2014"}),e.enumValues.map(p=>jsx("option",{value:p,selected:a===p,children:p},p)),e.nullable&&jsx("option",{value:B,"data-_auto":"1",selected:n,children:"\u2205 null"})]}),e.nullable&&jsx(re,{inputId:r,active:n})]})}if(e.zodType==="ZodBoolean")return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:r,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:n?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:a===""&&!n,children:"\u2014"}),jsx("option",{value:"true",selected:a==="true",children:"true"}),jsx("option",{value:"false",selected:a==="false",children:"false"}),e.nullable&&jsx("option",{value:B,"data-_auto":"1",selected:n,children:"\u2205 null"})]}),e.nullable&&jsx(re,{inputId:r,active:n})]});if(e.zodType==="ZodArray"){let p=t?.op==="array-contains-any";return jsx("input",{id:r,type:"text",name:`fv_${e.name}`,value:a,placeholder:p?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:r,type:n?"text":"number",name:`fv_${e.name}`,value:a,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:n,style:n?"opacity:0.55":void 0,"data-_type":n?"number":void 0}),e.nullable&&jsx(re,{inputId:r,active:n})]}):e.zodType==="ZodDate"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:r,type:n?"text":"datetime-local",name:`fv_${e.name}`,value:a,class:"input input-sm input-bordered w-full",readOnly:n,style:n?"opacity:0.55":void 0,"data-_type":n?"datetime-local":void 0}),e.nullable&&jsx(re,{inputId:r,active:n})]}):jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:r,type:"text",name:`fv_${e.name}`,value:a,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:n,style:n?"opacity:0.55":void 0}),e.nullable&&jsx(re,{inputId:r,active:n})]})}function fe({action:e,columnMeta:t,activeFilters:a,isGroup:n}){let r=Object.fromEntries(a.map(d=>[d.field,d])),o=a.length>0,s=a.length>=2||n&&o,p=t.filter(d=>d.zodType!=="ZodObject"&&d.zodType!=="ZodRecord");return 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:[jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",o&&jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[a.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:p.map(d=>{let l=ht(d.zodType),c=r[d.name],f=c?.op??l[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:d.name}),jsxs("div",{class:"flex gap-1.5",children:[l.length>1?jsx("select",{name:`fo_${d.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:l.map(i=>jsx("option",{value:i.value,selected:i.value===f,children:i.label},i.value))}):jsx("input",{type:"hidden",name:`fo_${d.name}`,value:l[0].value}),jsx(wt,{col:d,active:c})]})]},d.name)})}),jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),o&&jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),s&&jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children: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"})}),n?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function me(e,t,a,n,r,o){let s=a==="create"?`Create ${e}`:`Edit ${e} / ${n??""}`,p=a==="create"?[{label:"Repositories",href:r},{label:e,href:`${r}/${e}`},{label:"New document"}]:[{label:"Repositories",href:r},{label:e,href:`${r}/${e}`},{label:`Edit ${n??""}`}];return P(jsx(M,{opts:{title:s,breadcrumb:p,basePath:r,flash:o},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 ye(e,t,a){let n=new URLSearchParams;for(let r of e)n.set(`fv_${r.field}`,r.value),n.set(`fo_${r.field}`,r.op);return t&&(n.set("ob",t.field),n.set("od",t.dir)),a&&n.set("ps",String(a)),n}function Le(e,t,a,n,r){let o=ye(e,n,r);return o.set("cursor",t),o.set("dir",a),`?${o.toString()}`}function St(e,t,a,n){let r=ye(a,void 0,n);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 Rt(e,t,a){return `?${ye(t,a,e).toString()}`}function be(e,t,a,n,r,o,s=[],p=[],d=false,l=[],c,f,i,u){let m=`${n}/${e}`,g=`${m}/create`;return P(jsxs(M,{opts:{title:e,breadcrumb:[{label:"Repositories",href:n},{label:e}],basePath:n,flash:o},children:[s.length>0&&jsx(fe,{action:m,columnMeta:s,activeFilters:p,isGroup:u}),i&&jsxs("div",{role:"alert",class:`alert ${i.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[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:i.type==="index"?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"}):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"})}),jsxs("div",{class:"flex-1",children:[jsx("h3",{class:"font-bold",children:i.type==="index"?"Composite index required":"Query failed"}),jsx("div",{class:"text-sm",children:i.message})]}),i.indexUrl&&jsx("a",{href:i.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),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(y=>jsx("a",{href:Rt(y,p,c),class:`join-item btn btn-xs ${f===y?"btn-active btn-primary":"btn-outline"}`,children:y},y))})]})]}),jsx("a",{href:g,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":a.length,children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[[...a].map((y,h)=>{let k=c?.field===y,C=k?c.dir==="asc"?" \u25B2":" \u25BC":"";return jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxs("a",{href:St(y,c,p,f),class:`hover:text-base-content inline-flex items-center gap-0.5${k?" text-primary font-bold":""}`,children:[y,C]})},h)}),l.map((y,h)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y.column},`rel-${h}`)),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:a.length+l.length+1,class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((y,h)=>{let k=String(y.docId??y.id??""),C=`${n}/${e}/${encodeURIComponent(k)}/edit`,v=`${n}/${e}/${encodeURIComponent(k)}/delete`;return jsxs("tr",{class:"hover",children:[a.map((x,R)=>jsx("td",{class:"align-top py-2",children:jsx(ce,{val:y[x]})},R)),l.map((x,R)=>{let $=y[x.key];if($==null||$==="")return jsx("td",{class:"py-2"},`rel-${R}`);let q=`${n}/${x.targetRepo}?fv_${x.targetKey}=${encodeURIComponent(String($))}`;return jsx("td",{class:"align-middle py-2",children:jsx("a",{href:q,class:"btn btn-xs btn-ghost btn-outline",children:x.column})},`rel-${R}`)}),jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxs("div",{class:"flex gap-1 justify-end",children:[jsx("a",{href:C,class:"btn btn-xs btn-outline",children:"Edit"}),d&&jsx("form",{method:"post",action:v,onsubmit:"return confirm('Delete this document?')",children:jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},h)})})]})}),(r.hasPrev||r.hasNext)&&jsxs("div",{class:"flex justify-center items-center mt-6 gap-2",children:[r.hasPrev?jsx("a",{href:Le(p,r.prevCursor,"prev",c,f),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:Le(p,r.nextCursor,"next",c,f),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]})]}))}function ge(e,t){return ue(e,t)}function Ue(e,t){return pe(e,t)}function Ve(e,t,a,n,r,o,s,p,d,l,c,f,i,u){return be(e,t,a,n,r,o,s,p,d,l,c,f,i,u)}function H(e,t,a,n,r,o){return me(e,t,a,n,r,o)}var $t=new Set(["<","<=",">",">=","!="]),kt=new Set(["array-contains","array-contains-any"]);function he(e){return e==="desc"?"DESCENDING":"ASCENDING"}function Ct(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function _t(e,t,a,n,r){let o=[],s=new Set;for(let d of n)if(d.op==="=="||d.op==="in"||d.op==="not-in"){if(s.has(d.field))continue;s.add(d.field),o.push({fieldPath:d.field,order:"ASCENDING"});}for(let d of n)if(kt.has(d.op)){if(s.has(d.field))continue;s.add(d.field),o.push({fieldPath:d.field,arrayConfig:"CONTAINS"});}for(let d of n)if($t.has(d.op)){if(s.has(d.field))continue;s.add(d.field);let l=r?.field===d.field?he(r.dir):"ASCENDING";o.push({fieldPath:d.field,order:l});}if(r&&!s.has(r.field)&&o.push({fieldPath:r.field,order:he(r.dir)}),o.length===1&&a)return At(e,t,o[0]);let p=r&&o.some(d=>d.fieldPath===r.field)?he(r.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:p}),Et(e,t,a,o)}function Et(e,t,a,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/indexes/_`,s=[...we(1,o),...le(2,a?2:1)];for(let l of n)s.push(...He(3,Ke(l)));let p=r==="(default)"?"-default-":r,d=encodeURIComponent(Je(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${p}/indexes?create_composite=${d}`}function Tt(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function ve(e){let t=[],a=e>>>0;for(;a>=128;)t.push(a&127|128),a>>>=7;return t.push(a&127),t}function xe(e,t){return e<<3|t}function we(e,t){let a=Array.from(new TextEncoder().encode(t));return [xe(e,2),...ve(a.length),...a]}function le(e,t){return [xe(e,0),...ve(t)]}function He(e,t){return [xe(e,2),...ve(t.length),...t]}function Ke(e){let t=[...we(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...le(3,1)):t.push(...le(2,e.order==="DESCENDING"?2:1)),t}function Je(e){let t=String.fromCharCode(...e),a;if(typeof Buffer<"u")a=Buffer.from(e).toString("base64");else if(typeof btoa<"u")a=btoa(t);else throw new Error("No base64 encoder available");return a.replace(/=+$/,"")}function At(e,t,a,n="(default)"){let r=`projects/${e}/databases/${n}/collectionGroups/${t}/fields/${a.fieldPath}`,o=[...we(1,r),...le(2,2),...He(3,Ke(a))],s=n==="(default)"?"-default-":n,p=encodeURIComponent(Je(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${s}/indexes/automatic?create_exemption=${p}`}function Ot(e){let t=e,a=[t?.firestore?.projectId,t?.firestore?.app?.options?.projectId,t?.firestore?._settings?.projectId,t?.firestore?.databaseId?.projectId,t?._firestore?.projectId];for(let r of a)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 K(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Se(e,t){let a=e??{},n=K(e),r;if(n&&(r=a.message?Tt(a.message):void 0,!r)){let o=Ot(t.ref);if(o){let s=Ct(t.path);r=_t(o,s,t.isGroup,t.filters,t.sort);}}return {type:n?"index":"error",message:n?"This query requires a composite index that does not exist yet.":a.message??"Query failed",indexUrl:r}}var Ge="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Nt(){let e="";for(let t=0;t<20;t++)e+=Ge.charAt(Math.floor(Math.random()*Ge.length));return e}function We(e,t){if(!t)return;let a=e[t];if(typeof a!="string"||!a)return;let n=a.split("/").filter(Boolean),r=[];for(let o=1;o<n.length;o+=2)r.push(n[o]);return r.length>0?r:void 0}async function Re(e,t){let a=e.documentKey??"docId",n=`by${a.charAt(0).toUpperCase()}${a.slice(1)}`;if(typeof e.repo.get[n]=="function")try{let o=await e.repo.get[n](t);if(o)return o}catch{}return (await e.repo.query.by({where:[[a,"==",t]],limit:1}))[0]??null}function $e(e,t,a){let n=e.documentKey??"docId",r=Se(a,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:n,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 _(e,t,a=200){e.status(a).set("Content-Type","text/html; charset=utf-8").send(t);}function ke(e,t){e.status(302).set("Location",t).send("");}function Ce(e,t){let a=t.shape,n={};for(let[r,o]of Object.entries(a)){let s=Ee(o);if(s==="ZodObject"){if(e[r+"__isnull"]==="1"){n[r]=null;continue}let l={},c=false;for(let[u,m]of Object.entries(e))u.startsWith(`${r}.`)&&(l[u.slice(r.length+1)]=m,c=true);if(c){let u=o;for(;;){let m=A(u);if(m==="ZodOptional"||m==="ZodNullable"||m==="ZodDefault")u=Z(u);else break}n[r]=Ce(l,u);continue}let f=e[r],i=Array.isArray(f)?f[f.length-1]:f;if(i)try{n[r]=JSON.parse(i);}catch{n[r]=i;}continue}let p=e[r],d=Array.isArray(p)?p[p.length-1]:p;if(e[r+"__isnull"]==="1"){n[r]=null;continue}if(d===void 0||d===""){s==="ZodBoolean"&&(n[r]=false);continue}switch(s){case "ZodBoolean":d==="__null__"?n[r]=null:n[r]=d==="true"||d==="on"||d==="1";break;case "ZodNumber":case "ZodBigInt":n[r]=Number(d);break;case "ZodDate":n[r]=new Date(d);break;case "ZodArray":try{n[r]=JSON.parse(d);}catch{n[r]=d;}break;default:if(d.startsWith("{")||d.startsWith("["))try{n[r]=JSON.parse(d);break}catch{}n[r]=d;}}return n}function Qe(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 n=new Date(e);isNaN(n.getTime())||(t=n);}if(!t||isNaN(t.getTime()))return null;let a=n=>String(n).padStart(2,"0");return `${t.getFullYear()}-${a(t.getMonth()+1)}-${a(t.getDate())}T${a(t.getHours())}:${a(t.getMinutes())}`}function Ee(e){let t=e;for(;;){let a=A(t);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")t=Z(t);else return a}}function It(e){let t=e;for(;;){let a=A(t);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")t=Z(t);else return t}}function Xe(e){let t=e;for(;;){let a=A(t);if(a==="ZodOptional"||a==="ZodNullable")return true;if(a==="ZodDefault"){t=Z(t);continue}return false}}function Ye(e){let t=It(e),a=A(t);if(a==="ZodEnum"){let n=ee(t);return n.length>0?n:void 0}if(a==="ZodNativeEnum"){let n=te(t),r=Object.values(n).filter(o=>typeof o=="string");return r.length>0?r:void 0}if(a==="ZodLiteral"){let n=oe(t);return typeof n=="string"?[n]:void 0}}function et(e,t,a=""){let n={};for(let r of Object.keys(t.shape)){let o=a?`${a}.${r}`:r,s=e[r];if(s===null){n[o]="__null__";continue}if(s===void 0)continue;let p=t.shape[r];for(;;){let l=A(p);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")p=Z(p);else break}let d=A(p);if(d==="ZodObject"&&typeof s=="object"&&s!==null&&!Array.isArray(s)){let l=et(s,p,o);Object.assign(n,l);}else if(d==="ZodDate"){let l=Qe(s);l!==null&&(n[o]=l);}else if(typeof s=="object"&&s!==null&&!Array.isArray(s)&&("_seconds"in s||typeof s.toDate=="function")){let l=Qe(s);n[o]=l??JSON.stringify(s,null,2);}else typeof s=="object"?n[o]=JSON.stringify(s,null,2):n[o]=String(s);}return n}function _e(e,t){return e.map(a=>({...a,defaultValue:t[a.name]??a.defaultValue,nested:a.nested?_e(a.nested,t):void 0}))}function Dt(e,t){let a=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),n=[];for(let[r,o]of Object.entries(e)){if(!r.startsWith("fv_"))continue;let s=r.slice(3);if(!t.has(s))continue;let p=(o??"").trim();if(!p)continue;let d=e[`fo_${s}`]??"==",l=a.has(d)?d:"==";n.push({field:s,op:l,value:p});}return n}function Ft(e){let t="__null__",a=n=>n===t?null: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 r=n.value.split(",").map(o=>o.trim()).filter(o=>o!==""&&o!==t).map(o=>a(o));return [n.field,n.op,r]}return [n.field,n.op,a(n.value)]})}function tt(e,t,a=""){let n=[];for(let r of e){let o=a?`${a}.${r}`:r,s=t.shape[r];if(!s){n.push({name:o,zodType:"ZodString"});continue}let p=Ee(s);if(p==="ZodObject"){let d=s;for(;;){let c=A(d);if(c==="ZodOptional"||c==="ZodNullable"||c==="ZodDefault")d=Z(d);else break}let l=Y(d);n.push(...tt(Object.keys(l),d,o));}else n.push({name:o,zodType:p,nullable:Xe(s),enumValues:Ye(s)});}return n}function zt(e,t){let a=t.split("."),n=e;for(let r of a){for(;;){let s=A(n);if(s==="ZodOptional"||s==="ZodNullable"||s==="ZodDefault")n=Z(n);else break}let o=Y(n);if(!(r in o))return null;n=o[r];}return n}function G(e,t){if(!t||t.length===0)return e;let a=[],n=new Map;for(let o of t){let s=o.indexOf(".");if(s===-1)a.push(o);else {let p=o.slice(0,s),d=o.slice(s+1);n.has(p)||n.set(p,[]),n.get(p).push(d);}}let r={};for(let o of a)o in e.shape&&(r[o]=e.shape[o]);for(let[o,s]of n){if(!(o in e.shape))continue;let p=e.shape[o];for(;;){let d=A(p);if(d==="ZodOptional"||d==="ZodNullable"||d==="ZodDefault")p=Z(p);else break}if(A(p)!=="ZodObject"){r[o]=e.shape[o];continue}r[o]=G(p,s);}return z.object(r)}function J(e,t){let a=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",s=process.env.FUNCTION_REGION??"us-central1",p=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${o}/${s}/${p}${a}`}let n=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return n&&r.includes("cloudfunctions.net")?`/${n.toLowerCase()}${a}`:a}function nt(e,t){return {handleDashboard:(l,c)=>{let f=J(l,t),i=Object.values(e).map(u=>({name:u.name,path:u.path}));_(c,Ue(i,f));},handleList:async(l,c)=>{let f=l.params.repoName;if(!f){_(c,"Bad request",400);return}let i=e[f];if(!i){_(c,"Repository not found",404);return}let u=i.pageSize??25,m=l.query??{},g=m.cursor,y=m.dir==="prev"?"prev":"next",h=m.ob??"",k=m.od==="desc"?"desc":"asc",C=h?{field:h,dir:k}:void 0,v=parseInt(m.ps??""),x=Number.isFinite(v)&&v>0?Math.min(v,200):u,R=i.listColumns??Object.keys(i.schema.shape),$=i.documentKey??"docId",q=[$,...R.filter(O=>O!==$)],z=i.filterableFields?(()=>{let O=[];for(let D of i.filterableFields)(D.includes(".")||R.includes(D))&&O.push(D);return O})():R,j=(()=>{let O=[];for(let D of z)if(D.includes(".")){let Q=zt(i.schema,D);O.push({name:D,zodType:Q?Ee(Q):"ZodString",nullable:Q?Xe(Q):false,enumValues:Q?Ye(Q):void 0});}else O.push(...tt([D],i.schema));return O})(),rt=new Set(j.map(O=>O.name)),de=Dt(m,rt),Te=Ft(de),Ae;if(g)try{let O=i.repo.ref;typeof O.doc=="function"&&(Ae=await O.doc(g).get());}catch{}let L=await i.repo.query.paginate({pageSize:x,cursor:Ae,direction:y,...Te.length>0?{where:Te}:{},...C?{orderBy:[{field:C.field,direction:C.dir}]}:{}}).catch(O=>({queryError:Se(O,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:de,sort:C})})),W="queryError"in L,at=W?[]:L.data,ot=W?"":L.nextCursor?.id??"",st=W?"":L.prevCursor?.id??"",it=W?L.queryError:void 0,lt=J(l,t);_(c,Ve(i.name,at,q,lt,{hasPrev:W?false:L.hasPrevPage,hasNext:W?false:L.hasNextPage,prevCursor:st,nextCursor:ot},void 0,j,de,i.allowDelete??false,i.relationalMeta,C,x,it,i.isGroup));},handleCreateForm:(l,c)=>{let f=l.params.repoName;if(!f){_(c,"Bad request",400);return}let i=e[f];if(!i){_(c,"Repository not found",404);return}let u=J(l,t),m=G(i.schema,i.createFields),g=F(m),y=`${u}/${i.name}/create`,h=U(g,y,"POST","Create document");_(c,H(i.name,h,"create",null,u));},handleCreateSubmit:async(l,c)=>{let f=l.params.repoName;if(!f){_(c,"Bad request",400);return}let i=e[f];if(!i){_(c,"Repository not found",404);return}let u=J(l,t),m=l.body??{},g=Ce(m,i.schema),y=G(i.schema,i.createFields),h=y.safeParse(g);if(!h.success){let k=F(y),C=`${u}/${i.name}/create`,v=U(k,C,"POST","Create document"),x=h.error.issues.map(R=>`${R.path.join(".")}: ${R.message}`).join(", ");_(c,H(i.name,v,"create",null,u,{type:"error",message:`Validation error: ${x}`}),422);return}try{if(i.isGroup&&i.parentKeys&&i.parentKeys.length>0){let k={...h.data};i.createdKey&&(k[i.createdKey]=new Date);let C=i.parentKeys.filter($=>!k[$]);if(C.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${C.join(", ")}`);let v=i.parentKeys.map($=>k[$]),x=i.documentKey??"docId",R=k[x]||Nt();await i.repo.set(...v,R,k);}else await i.repo.create(h.data);ke(c,`${u}/${i.name}?flash=created`);}catch(k){let C=G(i.schema,i.createFields),v=F(C),x=`${u}/${i.name}/create`,R=U(v,x,"POST","Create document");_(c,H(i.name,R,"create",null,u,{type:"error",message:`Save error: ${k.message}`}),500);}},handleEditForm:async(l,c)=>{let f=l.params.repoName,i=l.params.id;if(!f||!i){_(c,"Bad request",400);return}let u=e[f];if(!u){_(c,"Repository not found",404);return}let m=J(l,t),g=null;try{g=await Re(u,i);}catch(x){let R=$e(u,i,x),$=K(x)?424:500;_(c,ge("",{title:`Edit ${u.name} / ${i}`,basePath:m,breadcrumb:[{label:"Repositories",href:m},{label:u.name,href:`${m}/${u.name}`},{label:`Edit ${i}`}],flash:R}),$);return}if(!g){_(c,"Document not found",404);return}let y=et(g,u.schema),h=G(u.schema,u.mutableFields),k=_e(F(h),y),C=`${m}/${u.name}/${encodeURIComponent(i)}/edit`,v=U(k,C,"POST","Save changes");_(c,H(u.name,v,"edit",i,m));},handleEditSubmit:async(l,c)=>{let f=l.params.repoName,i=l.params.id;if(!f||!i){_(c,"Bad request",400);return}let u=e[f];if(!u){_(c,"Repository not found",404);return}let m=J(l,t),g=l.body??{},y=Ce(g,u.schema),h=G(u.schema,u.mutableFields),C=h.partial().safeParse(y);if(!C.success){let v=Object.fromEntries(Object.entries(g).map(([z,j])=>[z,Array.isArray(j)?j.join(","):j??""])),x=_e(F(h),v),R=`${m}/${u.name}/${encodeURIComponent(i)}/edit`,$=U(x,R,"POST","Save changes"),q=C.error.issues.map(z=>`${z.path.join(".")}: ${z.message}`).join(", ");_(c,H(u.name,$,"edit",i,m,{type:"error",message:`Validation error: ${q}`}),422);return}try{let v=await Re(u,i),x=(v&&We(v,u.pathKey))??[i];await u.repo.update(...x,C.data),ke(c,`${m}/${u.name}?flash=updated`);}catch(v){let x=G(u.schema,u.mutableFields),R=F(x),$=`${m}/${u.name}/${encodeURIComponent(i)}/edit`,q=U(R,$,"POST","Save changes"),z=K(v)?$e(u,i,v):{type:"error",message:`Save error: ${v.message}`},j=K(v)?424:500;_(c,H(u.name,q,"edit",i,m,z),j);}},handleDelete:async(l,c)=>{let f=l.params.repoName,i=l.params.id;if(!f||!i){_(c,"Bad request",400);return}let u=e[f];if(!u){_(c,"Repository not found",404);return}if(!u.allowDelete){_(c,"Delete is not allowed for this repository",403);return}let m=J(l,t);try{let g=await Re(u,i),y=(g&&We(g,u.pathKey))??[i];await u.repo.delete(...y),ke(c,`${m}/${u.name}?flash=deleted`);}catch(g){let y=K(g)?$e(u,i,g):{type:"error",message:`Delete error: ${g.message}`},h=K(g)?424:500;_(c,ge("",{title:`Delete ${u.name} / ${i}`,basePath:m,breadcrumb:[{label:"Repositories",href:m},{label:u.name,href:`${m}/${u.name}`},{label:`Delete ${i}`}],flash:y}),h);}}}}function jt(e){let t=[],a=e.replace(/[.*+?^${}()|[\]\\]/g,n=>n===":"?n:`\\${n}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(n,r)=>(t.push(r),"([^/]+)"));return {pattern:new RegExp(`^${a}$`),paramNames:t}}function Pt(e){let t=e.path??e.url??"/",a=t.indexOf("?");return a===-1?t:t.slice(0,a)}var ae=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,a)=>{a.status(404).send("Not Found");};this.errorHandler=(t,a,n)=>{console.error("[MiniRouter]",t),n.status(500).send("Internal Server Error");};}use(t){return this.middlewares.push(t),this}get(t,a){return this.addRoute("GET",t,a)}post(t,a){return this.addRoute("POST",t,a)}put(t,a){return this.addRoute("PUT",t,a)}patch(t,a){return this.addRoute("PATCH",t,a)}delete(t,a){return this.addRoute("DELETE",t,a)}onNotFound(t){return this.notFoundHandler=t,this}onError(t){return this.errorHandler=t,this}addRoute(t,a,n){let{pattern:r,paramNames:o}=jt(a);return this.routes.push({method:t.toUpperCase(),pattern:r,paramNames:o,handler:n}),this}async handle(t,a){let n=(t.method??"GET").toUpperCase(),r=Pt(t),o=null,s={};for(let l of this.routes){if(l.method!==n)continue;let c=r.match(l.pattern);if(c){o=l,s={},l.paramNames.forEach((f,i)=>{s[f]=decodeURIComponent(c[i+1]??"");});break}}let p=Object.assign(t,{params:s}),d=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(p,a,d);}catch(l){this.errorHandler(l,t,a);}}async runMiddlewareChain(t,a,n){let r=0,o=async()=>{if(r<this.middlewares.length){let s=this.middlewares[r++];await s(t,a,o);}else await n(t,a);};await o();}};async function Mt(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Bt(e){let t={};if(!e)return t;for(let a of e.split("&")){let n=a.indexOf("=");if(n===-1)continue;let r=decodeURIComponent(a.slice(0,n).replace(/\+/g," ")),o=decodeURIComponent(a.slice(n+1).replace(/\+/g," ")),s=t[r];s===void 0?t[r]=o:Array.isArray(s)?s.push(o):t[r]=[s,o];}return t}function Fn(e){let{basePath:t="/",repos:a,parseBody:n=true,auth:r,middleware:o=[],httpsOptions:s}=e,p=t==="/"?"":t.replace(/\/$/,""),d={};for(let[i,u]of Object.entries(a)){let m=u.schema??u.repo.schema??null;if(!m)throw new Error(`[createAdminServer] Repository "${i}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let g,y,h;if(u.fieldsConfig){let v=u.fieldsConfig;g=[],y=[],h=[];for(let[x,R]of Object.entries(v))for(let $ of R)$==="filterable"?g.push(x):$==="mutable"?y.push(x):$==="create"&&h.push(x);g.length===0&&(g=void 0),y.length===0&&(y=void 0),h.length===0&&(h=void 0);}let k=(()=>{let v=u.repo._parentKeys;return v&&v.length>0?v:void 0})();if(k&&h)for(let v of k)h.includes(v)||h.push(v);let C={name:i,path:u.path,repo:u.repo,schema:m,documentKey:u.documentKey??"docId",pathKey:u.repo._pathKey??void 0,isGroup:!!u.repo._isGroup,parentKeys:k,createdKey:u.repo._createdKey??void 0,listColumns:u.listColumns,pageSize:u.pageSize,filterableFields:g,mutableFields:y,createFields:h,allowDelete:u.allowDelete??false,relationalMeta:(()=>{if(!u.relationalFields||u.relationalFields.length===0)return;let v=u.repo.relationalKeys??{},x=[];for(let R of u.relationalFields){let $=v[R.key];$&&x.push({key:R.key,column:R.column,targetRepo:String($.repo),targetKey:String($.key),type:$.type});}return x.length>0?x:void 0})()};d[i]=C;}let l=nt(d,p),c=new ae;if(n&&c.use(async(i,u,m)=>{let g=i,y=String(g.headers?.["content-type"]??"");if(y.includes("application/x-www-form-urlencoded")){let h=await Mt(g);i.body=Bt(h);}else if(y.includes("application/json")&&typeof g.body=="string")try{i.body=JSON.parse(g.body);}catch{}await m();}),r)if(typeof r=="function")c.use(r);else {let i=r.realm??"Admin",u="Basic "+Buffer.from(`${r.username}:${r.password}`).toString("base64");c.use((m,g,y)=>{if((m.headers?.authorization??"")!==u){g.status(401).set("WWW-Authenticate",`Basic realm="${i}"`).set("Content-Type","text/plain").send("Unauthorized");return}y();});}for(let i of o)c.use(i);c.get(`${p}/`,l.handleDashboard),c.get(`${p}`,l.handleDashboard),c.get(`${p}/:repoName`,l.handleList),c.get(`${p}/:repoName/create`,l.handleCreateForm),c.post(`${p}/:repoName/create`,l.handleCreateSubmit),c.get(`${p}/:repoName/:id/edit`,l.handleEditForm),c.post(`${p}/:repoName/:id/edit`,l.handleEditSubmit),c.post(`${p}/:repoName/:id/delete`,l.handleDelete);let f=async(i,u)=>{await c.handle(i,u);};return s&&(f.httpsOptions=s),f}
555
+ `;function se(){return jsx("script",{dangerouslySetInnerHTML:{__html:Me}})}function P(e){return "<!DOCTYPE html>"+renderToString(e)}var M=({opts:e,children:t})=>{let{title:a,breadcrumb:n,flash:r,basePath:o="/"}=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:[a," \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:o,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:[n&&n.length>0&&jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsx("ul",{children:n.map((s,p)=>s.href?jsx("li",{children:jsx("a",{href:s.href,children:s.label})},p):jsx("li",{class:"text-base-content/60",children:s.label},p))})}),jsx("h1",{class:"text-2xl font-bold mb-6",children:a}),r&&jsxs("div",{role:"alert",class:`alert ${r.type==="success"?"alert-success":r.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsx("span",{class:"flex-1",children:r.message}),r.action&&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]}),jsx(se,{})]})]})};function ue(e,t){return P(jsx(M,{opts:t,children:jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function pe(e,t){return P(jsx(M,{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(a=>jsx("a",{href:`${t}/${a.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:a.name}),jsx("p",{class:"text-xs text-base-content/50 font-mono",children:a.path})]})},a.name))})}))}var qe=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],bt=[{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"}],gt=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function ht(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return bt;case "ZodBoolean":return qe;case "ZodArray":return gt;default:return qe}}var B="__null__";function vt(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="${B}"]');if(!o){o=document.createElement('option');o.value='${B}';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='${B}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${B}"][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!=='${B}')?i.dataset._prev:'';}}})(this)`}function xt(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 re({inputId:e,active:t}){return 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:[jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:vt(e)}),jsx("span",{children:"\u2205"})]})}function wt({col:e,active:t}){let a=t?.value??"",n=a===B,r=`fv_input_${e.name.replace(/\./g,"__")}`,o=t?.op,s=o==="in"||o==="not-in";if(e.enumValues&&e.enumValues.length>0){if(s){let p=new Set(a.split(",").map(l=>l.trim()).filter(Boolean)),d=`eg_${e.name.replace(/\./g,"__")}`;return jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsx("input",{type:"hidden",id:r,name:`fv_${e.name}`,value:a}),e.enumValues.map(l=>jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:l,checked:p.has(l),"data-enum-group":d,onchange:xt(r,d)}),jsx("span",{children:l})]},l))]})}return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:r,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:n?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:a===""&&!n,children:"\u2014"}),e.enumValues.map(p=>jsx("option",{value:p,selected:a===p,children:p},p)),e.nullable&&jsx("option",{value:B,"data-_auto":"1",selected:n,children:"\u2205 null"})]}),e.nullable&&jsx(re,{inputId:r,active:n})]})}if(e.zodType==="ZodBoolean")return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:r,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:n?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:a===""&&!n,children:"\u2014"}),jsx("option",{value:"true",selected:a==="true",children:"true"}),jsx("option",{value:"false",selected:a==="false",children:"false"}),e.nullable&&jsx("option",{value:B,"data-_auto":"1",selected:n,children:"\u2205 null"})]}),e.nullable&&jsx(re,{inputId:r,active:n})]});if(e.zodType==="ZodArray"){let p=t?.op==="array-contains-any";return jsx("input",{id:r,type:"text",name:`fv_${e.name}`,value:a,placeholder:p?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:r,type:n?"text":"number",name:`fv_${e.name}`,value:a,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:n,style:n?"opacity:0.55":void 0,"data-_type":n?"number":void 0}),e.nullable&&jsx(re,{inputId:r,active:n})]}):e.zodType==="ZodDate"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:r,type:n?"text":"datetime-local",name:`fv_${e.name}`,value:a,class:"input input-sm input-bordered w-full",readOnly:n,style:n?"opacity:0.55":void 0,"data-_type":n?"datetime-local":void 0}),e.nullable&&jsx(re,{inputId:r,active:n})]}):jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:r,type:"text",name:`fv_${e.name}`,value:a,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:n,style:n?"opacity:0.55":void 0}),e.nullable&&jsx(re,{inputId:r,active:n})]})}function fe({action:e,columnMeta:t,activeFilters:a,isGroup:n}){let r=Object.fromEntries(a.map(d=>[d.field,d])),o=a.length>0,s=a.length>=2||n&&o,p=t.filter(d=>d.zodType!=="ZodObject"&&d.zodType!=="ZodRecord");return 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:[jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",o&&jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[a.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:p.map(d=>{let l=ht(d.zodType),c=r[d.name],f=c?.op??l[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:d.name}),jsxs("div",{class:"flex gap-1.5",children:[l.length>1?jsx("select",{name:`fo_${d.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:l.map(i=>jsx("option",{value:i.value,selected:i.value===f,children:i.label},i.value))}):jsx("input",{type:"hidden",name:`fo_${d.name}`,value:l[0].value}),jsx(wt,{col:d,active:c})]})]},d.name)})}),jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),o&&jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),s&&jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children: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"})}),n?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function me(e,t,a,n,r,o){let s=a==="create"?`Create ${e}`:`Edit ${e} / ${n??""}`,p=a==="create"?[{label:"Repositories",href:r},{label:e,href:`${r}/${e}`},{label:"New document"}]:[{label:"Repositories",href:r},{label:e,href:`${r}/${e}`},{label:`Edit ${n??""}`}];return P(jsx(M,{opts:{title:s,breadcrumb:p,basePath:r,flash:o},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 ye(e,t,a){let n=new URLSearchParams;for(let r of e)n.set(`fv_${r.field}`,r.value),n.set(`fo_${r.field}`,r.op);return t&&(n.set("ob",t.field),n.set("od",t.dir)),a&&n.set("ps",String(a)),n}function Le(e,t,a,n,r){let o=ye(e,n,r);return o.set("cursor",t),o.set("dir",a),`?${o.toString()}`}function St(e,t,a,n){let r=ye(a,void 0,n);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 $t(e,t,a){return `?${ye(t,a,e).toString()}`}function be(e,t,a,n,r,o,s=[],p=[],d=false,l=[],c,f,i,u){let m=`${n}/${e}`,g=`${m}/create`;return P(jsxs(M,{opts:{title:e,breadcrumb:[{label:"Repositories",href:n},{label:e}],basePath:n,flash:o},children:[s.length>0&&jsx(fe,{action:m,columnMeta:s,activeFilters:p,isGroup:u}),i&&jsxs("div",{role:"alert",class:`alert ${i.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[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:i.type==="index"?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"}):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"})}),jsxs("div",{class:"flex-1",children:[jsx("h3",{class:"font-bold",children:i.type==="index"?"Composite index required":"Query failed"}),jsx("div",{class:"text-sm",children:i.message})]}),i.indexUrl&&jsx("a",{href:i.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),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(y=>jsx("a",{href:$t(y,p,c),class:`join-item btn btn-xs ${f===y?"btn-active btn-primary":"btn-outline"}`,children:y},y))})]})]}),jsx("a",{href:g,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":a.length,children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[[...a].map((y,h)=>{let k=c?.field===y,C=k?c.dir==="asc"?" \u25B2":" \u25BC":"";return jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxs("a",{href:St(y,c,p,f),class:`hover:text-base-content inline-flex items-center gap-0.5${k?" text-primary font-bold":""}`,children:[y,C]})},h)}),l.map((y,h)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y.column},`rel-${h}`)),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:a.length+l.length+1,class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((y,h)=>{let k=String(y.docId??y.id??""),C=`${n}/${e}/${encodeURIComponent(k)}/edit`,v=`${n}/${e}/${encodeURIComponent(k)}/delete`;return jsxs("tr",{class:"hover",children:[a.map((x,$)=>jsx("td",{class:"align-top py-2",children:jsx(ce,{val:y[x]})},$)),l.map((x,$)=>{let R=y[x.key];if(R==null||R==="")return jsx("td",{class:"py-2"},`rel-${$}`);let q=`${n}/${x.targetRepo}?fv_${x.targetKey}=${encodeURIComponent(String(R))}`;return jsx("td",{class:"align-middle py-2",children:jsx("a",{href:q,class:"btn btn-xs btn-ghost btn-outline",children:x.column})},`rel-${$}`)}),jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxs("div",{class:"flex gap-1 justify-end",children:[jsx("a",{href:C,class:"btn btn-xs btn-outline",children:"Edit"}),d&&jsx("form",{method:"post",action:v,onsubmit:"return confirm('Delete this document?')",children:jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},h)})})]})}),(r.hasPrev||r.hasNext)&&jsxs("div",{class:"flex justify-center items-center mt-6 gap-2",children:[r.hasPrev?jsx("a",{href:Le(p,r.prevCursor,"prev",c,f),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:Le(p,r.nextCursor,"next",c,f),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]})]}))}function ge(e,t){return ue(e,t)}function Ue(e,t){return pe(e,t)}function Ve(e,t,a,n,r,o,s,p,d,l,c,f,i,u){return be(e,t,a,n,r,o,s,p,d,l,c,f,i,u)}function H(e,t,a,n,r,o){return me(e,t,a,n,r,o)}var Rt=new Set(["<","<=",">",">=","!="]),kt=new Set(["array-contains","array-contains-any"]);function he(e){return e==="desc"?"DESCENDING":"ASCENDING"}function Ct(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function _t(e,t,a,n,r){let o=[],s=new Set;for(let d of n)if(d.op==="=="||d.op==="in"||d.op==="not-in"){if(s.has(d.field))continue;s.add(d.field),o.push({fieldPath:d.field,order:"ASCENDING"});}for(let d of n)if(kt.has(d.op)){if(s.has(d.field))continue;s.add(d.field),o.push({fieldPath:d.field,arrayConfig:"CONTAINS"});}for(let d of n)if(Rt.has(d.op)){if(s.has(d.field))continue;s.add(d.field);let l=r?.field===d.field?he(r.dir):"ASCENDING";o.push({fieldPath:d.field,order:l});}if(r&&!s.has(r.field)&&o.push({fieldPath:r.field,order:he(r.dir)}),o.length===1&&a)return Ot(e,t,o[0]);let p=r&&o.some(d=>d.fieldPath===r.field)?he(r.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:p}),Et(e,t,a,o)}function Et(e,t,a,n,r="(default)"){let o=`projects/${e}/databases/${r}/collectionGroups/${t}/indexes/_`,s=[...we(1,o),...le(2,a?2:1)];for(let l of n)s.push(...He(3,Ke(l)));let p=r==="(default)"?"-default-":r,d=encodeURIComponent(Je(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${p}/indexes?create_composite=${d}`}function Tt(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function ve(e){let t=[],a=e>>>0;for(;a>=128;)t.push(a&127|128),a>>>=7;return t.push(a&127),t}function xe(e,t){return e<<3|t}function we(e,t){let a=Array.from(new TextEncoder().encode(t));return [xe(e,2),...ve(a.length),...a]}function le(e,t){return [xe(e,0),...ve(t)]}function He(e,t){return [xe(e,2),...ve(t.length),...t]}function Ke(e){let t=[...we(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...le(3,1)):t.push(...le(2,e.order==="DESCENDING"?2:1)),t}function Je(e){let t=String.fromCharCode(...e),a;if(typeof Buffer<"u")a=Buffer.from(e).toString("base64");else if(typeof btoa<"u")a=btoa(t);else throw new Error("No base64 encoder available");return a.replace(/=+$/,"")}function Ot(e,t,a,n="(default)"){let r=`projects/${e}/databases/${n}/collectionGroups/${t}/fields/${a.fieldPath}`,o=[...we(1,r),...le(2,2),...He(3,Ke(a))],s=n==="(default)"?"-default-":n,p=encodeURIComponent(Je(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${s}/indexes/automatic?create_exemption=${p}`}function At(e){let t=e,a=[t?.firestore?.projectId,t?.firestore?.app?.options?.projectId,t?.firestore?._settings?.projectId,t?.firestore?.databaseId?.projectId,t?._firestore?.projectId];for(let r of a)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 K(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Se(e,t){let a=e??{},n=K(e),r;if(n&&(r=a.message?Tt(a.message):void 0,!r)){let o=At(t.ref);if(o){let s=Ct(t.path);r=_t(o,s,t.isGroup,t.filters,t.sort);}}return {type:n?"index":"error",message:n?"This query requires a composite index that does not exist yet.":a.message??"Query failed",indexUrl:r}}var Ge="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Nt(){let e="";for(let t=0;t<20;t++)e+=Ge.charAt(Math.floor(Math.random()*Ge.length));return e}function We(e,t){if(!t)return;let a=e[t];if(typeof a!="string"||!a)return;let n=a.split("/").filter(Boolean),r=[];for(let o=1;o<n.length;o+=2)r.push(n[o]);return r.length>0?r:void 0}async function $e(e,t){let a=e.documentKey??"docId",n=`by${a.charAt(0).toUpperCase()}${a.slice(1)}`;if(typeof e.repo.get[n]=="function")try{let o=await e.repo.get[n](t);if(o)return o}catch{}return (await e.repo.query.by({where:[[a,"==",t]],limit:1}))[0]??null}function Re(e,t,a){let n=e.documentKey??"docId",r=Se(a,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:n,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 _(e,t,a=200){e.status(a).set("Content-Type","text/html; charset=utf-8").send(t);}function ke(e,t){e.status(302).set("Location",t).send("");}function Ce(e,t){let a=t.shape,n={};for(let[r,o]of Object.entries(a)){let s=Ee(o);if(s==="ZodObject"){if(e[r+"__isnull"]==="1"){n[r]=null;continue}let l={},c=false;for(let[u,m]of Object.entries(e))u.startsWith(`${r}.`)&&(l[u.slice(r.length+1)]=m,c=true);if(c){let u=o;for(;;){let m=O(u);if(m==="ZodOptional"||m==="ZodNullable"||m==="ZodDefault")u=Z(u);else break}n[r]=Ce(l,u);continue}let f=e[r],i=Array.isArray(f)?f[f.length-1]:f;if(i)try{n[r]=JSON.parse(i);}catch{n[r]=i;}continue}let p=e[r],d=Array.isArray(p)?p[p.length-1]:p;if(e[r+"__isnull"]==="1"){n[r]=null;continue}if(d===void 0||d===""){s==="ZodBoolean"&&(n[r]=false);continue}switch(s){case "ZodBoolean":d==="__null__"?n[r]=null:n[r]=d==="true"||d==="on"||d==="1";break;case "ZodNumber":case "ZodBigInt":n[r]=Number(d);break;case "ZodDate":n[r]=new Date(d);break;case "ZodArray":try{n[r]=JSON.parse(d);}catch{n[r]=d;}break;default:if(d.startsWith("{")||d.startsWith("["))try{n[r]=JSON.parse(d);break}catch{}n[r]=d;}}return n}function Qe(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 n=new Date(e);isNaN(n.getTime())||(t=n);}if(!t||isNaN(t.getTime()))return null;let a=n=>String(n).padStart(2,"0");return `${t.getFullYear()}-${a(t.getMonth()+1)}-${a(t.getDate())}T${a(t.getHours())}:${a(t.getMinutes())}`}function Ee(e){let t=e;for(;;){let a=O(t);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")t=Z(t);else return a}}function It(e){let t=e;for(;;){let a=O(t);if(a==="ZodOptional"||a==="ZodNullable"||a==="ZodDefault")t=Z(t);else return t}}function Xe(e){let t=e;for(;;){let a=O(t);if(a==="ZodOptional"||a==="ZodNullable")return true;if(a==="ZodDefault"){t=Z(t);continue}return false}}function Ye(e){let t=It(e),a=O(t);if(a==="ZodEnum"){let n=ee(t);return n.length>0?n:void 0}if(a==="ZodNativeEnum"){let n=te(t),r=Object.values(n).filter(o=>typeof o=="string");return r.length>0?r:void 0}if(a==="ZodLiteral"){let n=oe(t);return typeof n=="string"?[n]:void 0}}function et(e,t,a=""){let n={};for(let r of Object.keys(t.shape)){let o=a?`${a}.${r}`:r,s=e[r];if(s===null){n[o]="__null__";continue}if(s===void 0)continue;let p=t.shape[r];for(;;){let l=O(p);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")p=Z(p);else break}let d=O(p);if(d==="ZodObject"&&typeof s=="object"&&s!==null&&!Array.isArray(s)){let l=et(s,p,o);Object.assign(n,l);}else if(d==="ZodDate"){let l=Qe(s);l!==null&&(n[o]=l);}else if(typeof s=="object"&&s!==null&&!Array.isArray(s)&&("_seconds"in s||typeof s.toDate=="function")){let l=Qe(s);n[o]=l??JSON.stringify(s,null,2);}else typeof s=="object"?n[o]=JSON.stringify(s,null,2):n[o]=String(s);}return n}function _e(e,t){return e.map(a=>({...a,defaultValue:t[a.name]??a.defaultValue,nested:a.nested?_e(a.nested,t):void 0}))}function Dt(e,t){let a=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),n=[];for(let[r,o]of Object.entries(e)){if(!r.startsWith("fv_"))continue;let s=r.slice(3);if(!t.has(s))continue;let p=(o??"").trim();if(!p)continue;let d=e[`fo_${s}`]??"==",l=a.has(d)?d:"==";n.push({field:s,op:l,value:p});}return n}function Ft(e){let t="__null__",a=n=>n===t?null: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 r=n.value.split(",").map(o=>o.trim()).filter(o=>o!==""&&o!==t).map(o=>a(o));return [n.field,n.op,r]}return [n.field,n.op,a(n.value)]})}function tt(e,t,a=""){let n=[];for(let r of e){let o=a?`${a}.${r}`:r,s=t.shape[r];if(!s){n.push({name:o,zodType:"ZodString"});continue}let p=Ee(s);if(p==="ZodObject"){let d=s;for(;;){let c=O(d);if(c==="ZodOptional"||c==="ZodNullable"||c==="ZodDefault")d=Z(d);else break}let l=Y(d);n.push(...tt(Object.keys(l),d,o));}else n.push({name:o,zodType:p,nullable:Xe(s),enumValues:Ye(s)});}return n}function zt(e,t){let a=t.split("."),n=e;for(let r of a){for(;;){let s=O(n);if(s==="ZodOptional"||s==="ZodNullable"||s==="ZodDefault")n=Z(n);else break}let o=Y(n);if(!(r in o))return null;n=o[r];}return n}function G(e,t){if(!t||t.length===0)return e;let a=[],n=new Map;for(let o of t){let s=o.indexOf(".");if(s===-1)a.push(o);else {let p=o.slice(0,s),d=o.slice(s+1);n.has(p)||n.set(p,[]),n.get(p).push(d);}}let r={};for(let o of a)o in e.shape&&(r[o]=e.shape[o]);for(let[o,s]of n){if(!(o in e.shape))continue;let p=e.shape[o];for(;;){let d=O(p);if(d==="ZodOptional"||d==="ZodNullable"||d==="ZodDefault")p=Z(p);else break}if(O(p)!=="ZodObject"){r[o]=e.shape[o];continue}r[o]=G(p,s);}return z.object(r)}function J(e,t){let a=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",s=process.env.FUNCTION_REGION??"us-central1",p=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${o}/${s}/${p}${a}`}let n=process.env.K_SERVICE,r=e.hostname??e.headers?.host??"";return n&&r.includes("cloudfunctions.net")?`/${n.toLowerCase()}${a}`:a}function nt(e,t){return {handleDashboard:(l,c)=>{let f=J(l,t),i=Object.values(e).map(u=>({name:u.name,path:u.path}));_(c,Ue(i,f));},handleList:async(l,c)=>{let f=l.params.repoName;if(!f){_(c,"Bad request",400);return}let i=e[f];if(!i){_(c,"Repository not found",404);return}let u=i.pageSize??25,m=l.query??{},g=m.cursor,y=m.dir==="prev"?"prev":"next",h=m.ob??"",k=m.od==="desc"?"desc":"asc",C=h?{field:h,dir:k}:void 0,v=parseInt(m.ps??""),x=Number.isFinite(v)&&v>0?Math.min(v,200):u,$=i.listColumns??Object.keys(i.schema.shape),R=i.documentKey??"docId",q=[R,...$.filter(A=>A!==R)],z=i.filterableFields?(()=>{let A=[];for(let D of i.filterableFields)(D.includes(".")||$.includes(D))&&A.push(D);return A})():$,j=(()=>{let A=[];for(let D of z)if(D.includes(".")){let Q=zt(i.schema,D);A.push({name:D,zodType:Q?Ee(Q):"ZodString",nullable:Q?Xe(Q):false,enumValues:Q?Ye(Q):void 0});}else A.push(...tt([D],i.schema));return A})(),rt=new Set(j.map(A=>A.name)),de=Dt(m,rt),Te=Ft(de),Oe;if(g)try{let A=i.repo.ref;typeof A.doc=="function"&&(Oe=await A.doc(g).get());}catch{}let L=await i.repo.query.paginate({pageSize:x,cursor:Oe,direction:y,...Te.length>0?{where:Te}:{},...C?{orderBy:[{field:C.field,direction:C.dir}]}:{}}).catch(A=>({queryError:Se(A,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:de,sort:C})})),W="queryError"in L,at=W?[]:L.data,ot=W?"":L.nextCursor?.id??"",st=W?"":L.prevCursor?.id??"",it=W?L.queryError:void 0,lt=J(l,t);_(c,Ve(i.name,at,q,lt,{hasPrev:W?false:L.hasPrevPage,hasNext:W?false:L.hasNextPage,prevCursor:st,nextCursor:ot},void 0,j,de,i.allowDelete??false,i.relationalMeta,C,x,it,i.isGroup));},handleCreateForm:(l,c)=>{let f=l.params.repoName;if(!f){_(c,"Bad request",400);return}let i=e[f];if(!i){_(c,"Repository not found",404);return}let u=J(l,t),m=G(i.schema,i.createFields),g=F(m),y=`${u}/${i.name}/create`,h=U(g,y,"POST","Create document");_(c,H(i.name,h,"create",null,u));},handleCreateSubmit:async(l,c)=>{let f=l.params.repoName;if(!f){_(c,"Bad request",400);return}let i=e[f];if(!i){_(c,"Repository not found",404);return}let u=J(l,t),m=l.body??{},g=Ce(m,i.schema),y=G(i.schema,i.createFields),h=y.safeParse(g);if(!h.success){let k=F(y),C=`${u}/${i.name}/create`,v=U(k,C,"POST","Create document"),x=h.error.issues.map($=>`${$.path.join(".")}: ${$.message}`).join(", ");_(c,H(i.name,v,"create",null,u,{type:"error",message:`Validation error: ${x}`}),422);return}try{if(i.isGroup&&i.parentKeys&&i.parentKeys.length>0){let k={...h.data};i.createdKey&&(k[i.createdKey]=new Date);let C=i.parentKeys.filter(R=>!k[R]);if(C.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${C.join(", ")}`);let v=i.parentKeys.map(R=>k[R]),x=i.documentKey??"docId",$=k[x]||Nt();await i.repo.set(...v,$,k);}else await i.repo.create(h.data);ke(c,`${u}/${i.name}?flash=created`);}catch(k){let C=G(i.schema,i.createFields),v=F(C),x=`${u}/${i.name}/create`,$=U(v,x,"POST","Create document");_(c,H(i.name,$,"create",null,u,{type:"error",message:`Save error: ${k.message}`}),500);}},handleEditForm:async(l,c)=>{let f=l.params.repoName,i=l.params.id;if(!f||!i){_(c,"Bad request",400);return}let u=e[f];if(!u){_(c,"Repository not found",404);return}let m=J(l,t),g=null;try{g=await $e(u,i);}catch(x){let $=Re(u,i,x),R=K(x)?424:500;_(c,ge("",{title:`Edit ${u.name} / ${i}`,basePath:m,breadcrumb:[{label:"Repositories",href:m},{label:u.name,href:`${m}/${u.name}`},{label:`Edit ${i}`}],flash:$}),R);return}if(!g){_(c,"Document not found",404);return}let y=et(g,u.schema),h=G(u.schema,u.mutableFields),k=_e(F(h),y),C=`${m}/${u.name}/${encodeURIComponent(i)}/edit`,v=U(k,C,"POST","Save changes");_(c,H(u.name,v,"edit",i,m));},handleEditSubmit:async(l,c)=>{let f=l.params.repoName,i=l.params.id;if(!f||!i){_(c,"Bad request",400);return}let u=e[f];if(!u){_(c,"Repository not found",404);return}let m=J(l,t),g=l.body??{},y=Ce(g,u.schema),h=G(u.schema,u.mutableFields),C=h.partial().safeParse(y);if(!C.success){let v=Object.fromEntries(Object.entries(g).map(([z,j])=>[z,Array.isArray(j)?j.join(","):j??""])),x=_e(F(h),v),$=`${m}/${u.name}/${encodeURIComponent(i)}/edit`,R=U(x,$,"POST","Save changes"),q=C.error.issues.map(z=>`${z.path.join(".")}: ${z.message}`).join(", ");_(c,H(u.name,R,"edit",i,m,{type:"error",message:`Validation error: ${q}`}),422);return}try{let v=await $e(u,i),x=(v&&We(v,u.pathKey))??[i];await u.repo.update(...x,C.data),ke(c,`${m}/${u.name}?flash=updated`);}catch(v){let x=G(u.schema,u.mutableFields),$=F(x),R=`${m}/${u.name}/${encodeURIComponent(i)}/edit`,q=U($,R,"POST","Save changes"),z=K(v)?Re(u,i,v):{type:"error",message:`Save error: ${v.message}`},j=K(v)?424:500;_(c,H(u.name,q,"edit",i,m,z),j);}},handleDelete:async(l,c)=>{let f=l.params.repoName,i=l.params.id;if(!f||!i){_(c,"Bad request",400);return}let u=e[f];if(!u){_(c,"Repository not found",404);return}if(!u.allowDelete){_(c,"Delete is not allowed for this repository",403);return}let m=J(l,t);try{let g=await $e(u,i),y=(g&&We(g,u.pathKey))??[i];await u.repo.delete(...y),ke(c,`${m}/${u.name}?flash=deleted`);}catch(g){let y=K(g)?Re(u,i,g):{type:"error",message:`Delete error: ${g.message}`},h=K(g)?424:500;_(c,ge("",{title:`Delete ${u.name} / ${i}`,basePath:m,breadcrumb:[{label:"Repositories",href:m},{label:u.name,href:`${m}/${u.name}`},{label:`Delete ${i}`}],flash:y}),h);}}}}function jt(e){let t=[],a=e.replace(/[.*+?^${}()|[\]\\]/g,n=>n===":"?n:`\\${n}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(n,r)=>(t.push(r),"([^/]+)"));return {pattern:new RegExp(`^${a}$`),paramNames:t}}function Pt(e){let t=e.path??e.url??"/",a=t.indexOf("?");return a===-1?t:t.slice(0,a)}var ae=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,a)=>{a.status(404).send("Not Found");};this.errorHandler=(t,a,n)=>{console.error("[MiniRouter]",t),n.status(500).send("Internal Server Error");};}use(t){return this.middlewares.push(t),this}get(t,a){return this.addRoute("GET",t,a)}post(t,a){return this.addRoute("POST",t,a)}put(t,a){return this.addRoute("PUT",t,a)}patch(t,a){return this.addRoute("PATCH",t,a)}delete(t,a){return this.addRoute("DELETE",t,a)}onNotFound(t){return this.notFoundHandler=t,this}onError(t){return this.errorHandler=t,this}addRoute(t,a,n){let{pattern:r,paramNames:o}=jt(a);return this.routes.push({method:t.toUpperCase(),pattern:r,paramNames:o,handler:n}),this}async handle(t,a){let n=(t.method??"GET").toUpperCase(),r=Pt(t),o=null,s={};for(let l of this.routes){if(l.method!==n)continue;let c=r.match(l.pattern);if(c){o=l,s={},l.paramNames.forEach((f,i)=>{s[f]=decodeURIComponent(c[i+1]??"");});break}}let p=Object.assign(t,{params:s}),d=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(p,a,d);}catch(l){this.errorHandler(l,t,a);}}async runMiddlewareChain(t,a,n){let r=0,o=async()=>{if(r<this.middlewares.length){let s=this.middlewares[r++];await s(t,a,o);}else await n(t,a);};await o();}};async function Mt(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Bt(e){let t={};if(!e)return t;for(let a of e.split("&")){let n=a.indexOf("=");if(n===-1)continue;let r=decodeURIComponent(a.slice(0,n).replace(/\+/g," ")),o=decodeURIComponent(a.slice(n+1).replace(/\+/g," ")),s=t[r];s===void 0?t[r]=o:Array.isArray(s)?s.push(o):t[r]=[s,o];}return t}function Fn(e){let{basePath:t="/",repos:a,parseBody:n=true,auth:r,middleware:o=[],httpsOptions:s}=e,p=t==="/"?"":t.replace(/\/$/,""),d={};for(let[i,u]of Object.entries(a)){let m=u.schema??u.repo.schema??null;if(!m)throw new Error(`[createAdminServer] Repository "${i}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let g,y,h;if(u.fieldsConfig){let v=u.fieldsConfig;g=[],y=[],h=[];for(let[x,$]of Object.entries(v))for(let R of $)R==="filterable"?g.push(x):R==="mutable"?y.push(x):R==="create"&&h.push(x);g.length===0&&(g=void 0),y.length===0&&(y=void 0),h.length===0&&(h=void 0);}let k=(()=>{let v=u.repo._parentKeys;return v&&v.length>0?v:void 0})();if(k&&h)for(let v of k)h.includes(v)||h.push(v);let C={name:i,path:u.path,repo:u.repo,schema:m,documentKey:u.documentKey??"docId",pathKey:u.repo._pathKey??void 0,isGroup:!!u.repo._isGroup,parentKeys:k,createdKey:u.repo._createdKey??void 0,listColumns:u.listColumns,pageSize:u.pageSize,filterableFields:g,mutableFields:y,createFields:h,allowDelete:u.allowDelete??false,relationalMeta:(()=>{if(!u.relationalFields||u.relationalFields.length===0)return;let v=u.repo.relationalKeys??{},x=[];for(let $ of u.relationalFields){let R=v[$.key];R&&x.push({key:$.key,column:$.column,targetRepo:String(R.repo),targetKey:String(R.key),type:R.type});}return x.length>0?x:void 0})()};d[i]=C;}let l=nt(d,p),c=new ae;if(n&&c.use(async(i,u,m)=>{let g=i,y=String(g.headers?.["content-type"]??"");if(y.includes("application/x-www-form-urlencoded")){let h=await Mt(g);i.body=Bt(h);}else if(y.includes("application/json")&&typeof g.body=="string")try{i.body=JSON.parse(g.body);}catch{}await m();}),r)if(typeof r=="function")c.use(r);else {let i=r.realm??"Admin",u="Basic "+Buffer.from(`${r.username}:${r.password}`).toString("base64");c.use((m,g,y)=>{if((m.headers?.authorization??"")!==u){g.status(401).set("WWW-Authenticate",`Basic realm="${i}"`).set("Content-Type","text/plain").send("Unauthorized");return}y();});}for(let i of o)c.use(i);c.get(`${p}/`,l.handleDashboard),c.get(`${p}`,l.handleDashboard),c.get(`${p}/:repoName`,l.handleList),c.get(`${p}/:repoName/create`,l.handleCreateForm),c.post(`${p}/:repoName/create`,l.handleCreateSubmit),c.get(`${p}/:repoName/:id/edit`,l.handleEditForm),c.post(`${p}/:repoName/:id/edit`,l.handleEditSubmit),c.post(`${p}/:repoName/:id/delete`,l.handleDelete);let f=async(i,u)=>{await c.handle(i,u);};return s&&(f.httpsOptions=s),f}
556
556
  export{ae as MiniRouter,Fn as createAdminServer};//# sourceMappingURL=index.js.map
557
557
  //# sourceMappingURL=index.js.map