@lpdjs/firestore-repo-service 2.6.13 → 2.6.14

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 (55) hide show
  1. package/dist/{create-servers-BV-E4Rp-.d.cts → create-servers-C3CIViuc.d.cts} +5 -5
  2. package/dist/{create-servers-BhUavex0.d.ts → create-servers-O2stZ-yF.d.ts} +5 -5
  3. package/dist/{firebase-auth-t1CAR-lp.d.cts → firebase-auth-DZ8lb2Ec.d.cts} +9 -0
  4. package/dist/{firebase-auth-t1CAR-lp.d.ts → firebase-auth-DZ8lb2Ec.d.ts} +9 -0
  5. package/dist/{index-CXWiqnFs.d.cts → index-D0KRndyL.d.cts} +2 -2
  6. package/dist/{index-4gzZw5m_.d.ts → index-TTSjUi4p.d.ts} +2 -2
  7. package/dist/index.cjs +54 -54
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +8 -8
  10. package/dist/index.d.ts +8 -8
  11. package/dist/index.js +54 -54
  12. package/dist/index.js.map +1 -1
  13. package/dist/{openapi-D71F-INl.d.cts → openapi-BdatGOqK.d.cts} +1 -1
  14. package/dist/{openapi-Bq6KTWCR.d.ts → openapi-uTAic4s0.d.ts} +1 -1
  15. package/dist/{queue-DP7t5Jp7.d.ts → queue-B4uwef6c.d.ts} +1 -1
  16. package/dist/{queue-Bl-S-I-7.d.cts → queue-CQyWCQBk.d.cts} +1 -1
  17. package/dist/servers/admin/index.cjs +46 -46
  18. package/dist/servers/admin/index.cjs.map +1 -1
  19. package/dist/servers/admin/index.d.cts +3 -3
  20. package/dist/servers/admin/index.d.ts +3 -3
  21. package/dist/servers/admin/index.js +46 -46
  22. package/dist/servers/admin/index.js.map +1 -1
  23. package/dist/servers/auth/index.cjs +3 -3
  24. package/dist/servers/auth/index.cjs.map +1 -1
  25. package/dist/servers/auth/index.d.cts +1 -1
  26. package/dist/servers/auth/index.d.ts +1 -1
  27. package/dist/servers/auth/index.js +3 -3
  28. package/dist/servers/auth/index.js.map +1 -1
  29. package/dist/servers/crud/index.cjs +1 -1
  30. package/dist/servers/crud/index.cjs.map +1 -1
  31. package/dist/servers/crud/index.d.cts +5 -5
  32. package/dist/servers/crud/index.d.ts +5 -5
  33. package/dist/servers/crud/index.js +1 -1
  34. package/dist/servers/crud/index.js.map +1 -1
  35. package/dist/servers/hono/index.d.cts +1 -1
  36. package/dist/servers/hono/index.d.ts +1 -1
  37. package/dist/servers/index.cjs +74 -74
  38. package/dist/servers/index.cjs.map +1 -1
  39. package/dist/servers/index.d.cts +8 -8
  40. package/dist/servers/index.d.ts +8 -8
  41. package/dist/servers/index.js +74 -74
  42. package/dist/servers/index.js.map +1 -1
  43. package/dist/sync/bigquery.d.cts +2 -2
  44. package/dist/sync/bigquery.d.ts +2 -2
  45. package/dist/sync/index.cjs +11 -11
  46. package/dist/sync/index.cjs.map +1 -1
  47. package/dist/sync/index.d.cts +5 -5
  48. package/dist/sync/index.d.ts +5 -5
  49. package/dist/sync/index.js +11 -11
  50. package/dist/sync/index.js.map +1 -1
  51. package/dist/{types-BxsdnGDM.d.cts → types-BwH1C-wi.d.cts} +1 -1
  52. package/dist/{types-CmSUreTx.d.ts → types-DT7Nypd_.d.ts} +1 -1
  53. package/dist/{types-C_alF2Xe.d.cts → types-Qd4tuEq9.d.cts} +1 -1
  54. package/dist/{types-C6I3WtJS.d.ts → types-wzqw45jH.d.ts} +1 -1
  55. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  import 'zod';
2
2
  import 'firebase-functions/v2/https';
3
- import '../../types-C_alF2Xe.cjs';
4
- export { h as Middleware, M as MiniRouter, R as RouteHandler } from '../../firebase-auth-t1CAR-lp.cjs';
5
- export { a as AdminRepoConfig, b as AdminRepoEntry, A as AdminServerOptions, B as BasicAuthConfig, c as RepoRegistry, d as createAdminServer } from '../../index-CXWiqnFs.cjs';
3
+ import '../../types-Qd4tuEq9.cjs';
4
+ export { h as Middleware, M as MiniRouter, R as RouteHandler } from '../../firebase-auth-DZ8lb2Ec.cjs';
5
+ export { a as AdminRepoConfig, b as AdminRepoEntry, A as AdminServerOptions, B as BasicAuthConfig, c as RepoRegistry, d as createAdminServer } from '../../index-D0KRndyL.cjs';
6
6
  import '../../read-CTWZjxyh.cjs';
7
7
  import 'firebase-admin/firestore';
8
8
  import 'firebase-functions/v2/firestore';
@@ -1,8 +1,8 @@
1
1
  import 'zod';
2
2
  import 'firebase-functions/v2/https';
3
- import '../../types-C6I3WtJS.js';
4
- export { h as Middleware, M as MiniRouter, R as RouteHandler } from '../../firebase-auth-t1CAR-lp.js';
5
- export { a as AdminRepoConfig, b as AdminRepoEntry, A as AdminServerOptions, B as BasicAuthConfig, c as RepoRegistry, d as createAdminServer } from '../../index-4gzZw5m_.js';
3
+ import '../../types-wzqw45jH.js';
4
+ export { h as Middleware, M as MiniRouter, R as RouteHandler } from '../../firebase-auth-DZ8lb2Ec.js';
5
+ export { a as AdminRepoConfig, b as AdminRepoEntry, A as AdminServerOptions, B as BasicAuthConfig, c as RepoRegistry, d as createAdminServer } from '../../index-TTSjUi4p.js';
6
6
  import '../../read-CTWZjxyh.js';
7
7
  import 'firebase-admin/firestore';
8
8
  import 'firebase-functions/v2/firestore';
@@ -1,7 +1,7 @@
1
- import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {randomBytes}from'crypto';import {z}from'zod';import {renderToString}from'hono/jsx/dom/server';var jt=Object.defineProperty;var $e=(e,t)=>()=>(e&&(t=e(e=0)),t);var Lt=(e,t)=>{for(var n in t)jt(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return Ht[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function J(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function at(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function ot(e){let t=e;if(t._zod?.def?.defaultValue!==void 0)return t._zod.def.defaultValue;let n=t._def?.defaultValue;return typeof n=="function"?n():n}function 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 xe(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 we(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 Ce(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function st(e){let t=e,n=[],r=t._zod?.def?.checks;if(Array.isArray(r)){for(let o of r)o.format&&n.push(o.format);if(n.length>0)return n}let a=t._def?.checks;if(Array.isArray(a))for(let o of a)o.kind&&n.push(o.kind);return n}var Ht,Ee=$e(()=>{Ht={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 bt({val:e}){return jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function en({message:e}){return jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function be({val:e,mismatch:t}){let n=tn(e);return t?jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsx(en,{message:t})]}):n}function tn(e){if(e==null)return jsx("span",{class:"opacity-30 italic text-xs",children:"\u2014"});if(typeof e=="boolean")return e?jsx("span",{class:"badge badge-success badge-sm",children:"true"}):jsx("span",{class:"badge badge-error badge-sm",children:"false"});if(e instanceof Date)return jsx(bt,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsx(bt,{val:e.toDate()});if(typeof e=="number")return jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxs("li",{class:"text-base-content/40 italic",children:["+",e.length-8," more\u2026"]})]});if(typeof e=="object"&&e!==null){let n=Object.entries(e);return n.length===0?jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxs("dl",{class:"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5 text-xs m-0",children:[n.slice(0,8).map(([r,a])=>jsxs(Fragment,{children:[jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsx("dd",{class:"break-all",children:String(a??"")})]})),n.length>8&&jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsx("span",{class:"text-sm break-all",children:t})}var Oe=$e(()=>{});function he(e){if(!e)return "unknown";let t=Me(e);switch(L(t)){case "ZodString":return "string";case "ZodNumber":return "number";case "ZodBigInt":return "bigint";case "ZodBoolean":return "boolean";case "ZodDate":return "date";case "ZodArray":return "array";case "ZodObject":case "ZodRecord":return "object";case "ZodEnum":case "ZodNativeEnum":return "enum";case "ZodLiteral":return "literal";default:return "unknown"}}function Me(e){let t=L(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=J(e);return n?Me(n):e}return e}function ge(e,t){if(!e)return;let n=t.split("."),r=e;for(let a of n){if(!r)return;let o=Me(r);if(L(o)!=="ZodObject")return;r=Y(o)[a];}return r}function on(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function ke(e,t){if(e==="unknown")return null;let n=on(t);return n==="null"?null:e==="enum"||e==="literal"?n==="string"||n==="number"?null:`Expected ${e} (string/number), got ${n}`:e===n||e==="number"&&n==="bigint"||e==="bigint"&&n==="number"?null:`Expected ${e}, got ${n}`}var He=$e(()=>{Ee();});var yt={};Lt(yt,{PanelMany:()=>ln,PanelOne:()=>sn,RightPanel:()=>Ue});function sn({doc:e,repoName:t,basePath:n,schema:r,columns:a}){if(!e)return jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let o=String(e.docId??e.id??""),s=`${n}/${t}/${encodeURIComponent(o)}/edit`,d=gt(r,a);return jsxs("div",{class:"space-y-4",children:[jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxs("div",{class:"text-xs text-base-content/60",children:[jsx("span",{class:"font-mono",children:t}),jsx("span",{class:"opacity-50",children:" \xB7 "}),jsx("span",{class:"font-mono break-all",children:o})]}),jsx("a",{href:s,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:a.map(l=>{let f=e[l],b=d[l],y=b?ke(b,f):null;return jsxs(Fragment,{children:[jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:l}),jsx("dd",{class:"min-w-0",children:jsx(be,{val:f,mismatch:y})})]})})})]})}function ln({docs:e,repoName:t,basePath:n,fk:r,fv:a,columns:o,schema:s,pagination:d}){let l=`${n}/${t}?fv_${r}=${encodeURIComponent(a)}`,f=gt(s,o);return jsxs("div",{class:"space-y-4",children:[jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxs("div",{class:"text-xs text-base-content/60",children:[jsx("span",{class:"font-mono",children:t}),jsx("span",{class:"opacity-50",children:" where "}),jsx("span",{class:"font-mono",children:r}),jsx("span",{class:"opacity-50",children:" = "}),jsx("span",{class:"font-mono break-all",children:a}),jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsx("a",{href:l,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxs("table",{class:"table table-xs w-full",children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[o.map((b,y)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:b},y)),jsx("th",{})]})}),jsx("tbody",{children:e.length===0?jsx("tr",{children:jsx("td",{colspan:o.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((b,y)=>{let N=String(b.docId??b.id??""),T=`${n}/${t}/${encodeURIComponent(N)}/edit`;return jsxs("tr",{class:"hover",children:[o.map((h,q)=>{let j=b[h],m=f[h],u=m?ke(m,j):null;return jsx("td",{class:"align-top py-1.5",children:jsx(be,{val:j,mismatch:u})},q)}),jsx("td",{class:"text-right py-1.5",children:jsx("a",{href:T,class:"btn btn-xs btn-ghost",children:"Edit"})})]},y)})})]})}),(d.hasPrev||d.hasNext)&&jsxs("div",{class:"flex justify-center items-center gap-2",children:[d.hasPrev?jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":d.prevCursor,children:"\u2190 Previous"}):jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),d.hasNext?jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":d.nextCursor,children:"Next \u2192"}):jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function gt(e,t){if(!e)return {};let n={};for(let r of t)n[r]=he(ge(e,r));return n}var Ue,qe=$e(()=>{Oe();He();Ue=({basePath:e=""})=>jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"data-frs-base-path":e,"aria-hidden":"true",children:[jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function Ze(e,t){let n=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",s=process.env.FUNCTION_REGION??"us-central1",d=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${o}/${s}/${d}${n}`}let r=process.env.K_SERVICE,a=e?.hostname??e?.headers?.host??"";return r&&typeof a=="string"&&a.includes("cloudfunctions.net")?`/${r.toLowerCase()}${n}`:n}function Fe(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Ee();Ee();function Ut(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function it(e){let t=e,n=true,r=false,a;for(;;){let o=L(t);if(o==="ZodOptional")n=false,t=J(t);else if(o==="ZodNullable")n=false,r=true,t=J(t);else if(o==="ZodDefault")n=false,a=ot(t),t=J(t);else break}return {inner:t,required:n,nullable:r,defaultValue:a}}function ee(e,t=""){if(L(e)==="ZodObject"){let r=Y(e);return Object.entries(r).map(([a,o])=>lt(t?`${t}.${a}`:a,a,o))}return [lt(t||"value",t||"value",e)]}function lt(e,t,n){let{inner:r,required:a,nullable:o,defaultValue:s}=it(n),d=L(r),l=Ut(t.split(".").pop()??t);switch(d){case "ZodString":{let f=st(r),b=f.includes("email"),y=f.includes("url");return {name:e,label:l,type:"text",required:a,nullable:o,defaultValue:s,hint:b?"email":y?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:l,type:"number",required:a,nullable:o,defaultValue:s};case "ZodBoolean":return {name:e,label:l,type:"checkbox",required:a,nullable:o,defaultValue:s};case "ZodDate":case "ZodCoerce":return {name:e,label:l,type:"datetime-local",required:a,nullable:o,defaultValue:s};case "ZodEnum":{let f=xe(r);return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:f}}case "ZodNativeEnum":{let f=we(r),b=Object.values(f).filter(y=>typeof y=="string");return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:b}}case "ZodLiteral":{let f=String(Ce(r)??"");return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:[f]}}case "ZodObject":{let f=ee(r,e);return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,nested:f,hint:"JSON object"}}case "ZodArray":{let f=at(r);if(!f)return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON array"};let{inner:b}=it(f),y=L(b),N,T,h;switch(y){case "ZodString":N="text";break;case "ZodNumber":case "ZodBigInt":N="number";break;case "ZodBoolean":N="checkbox";break;case "ZodDate":N="datetime-local";break;case "ZodEnum":N="select",T=xe(b);break;case "ZodNativeEnum":N="select",T=Object.values(we(b)).filter(q=>typeof q=="string");break;case "ZodObject":N="object",h=ee(b);break;default:return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON array"}}return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,arrayElementType:N,arrayElementOptions:T,arrayElementFields:h}}default:return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON"}}}function ut(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,a=e.name,o=e.required?" required":"",s=e.defaultValue==="__null__",d=!s&&e.defaultValue!=null?String(e.defaultValue):"",l=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
2
- <input type="hidden" id="${r}__isnull" name="${a}__isnull" value="${s?"1":""}">
1
+ import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {randomBytes}from'crypto';import {z}from'zod';import {renderToString}from'hono/jsx/dom/server';var Bt=Object.defineProperty;var Ce=(e,t)=>()=>(e&&(t=e(e=0)),t);var Mt=(e,t)=>{for(var n in t)Bt(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return qt[n]??`Zod${n.charAt(0).toUpperCase()}${n.slice(1)}`;let r=t._def?.typeName;return r||""}function G(e){let t=e;if(t._zod?.def?.innerType)return t._zod.def.innerType;if(t._def?.innerType)return t._def.innerType}function ot(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function it(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 ee(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 we(e){let t=e;return Array.isArray(t.options)?t.options:t._zod?.def?.entries?Object.values(t._zod.def.entries):Array.isArray(t._def?.values)?t._def.values:[]}function ke(e){let t=e;return t._zod?.def?.entries?t._zod.def.entries:t.enum&&typeof t.enum=="object"?t.enum:t._def?.values&&typeof t._def.values=="object"?t._def.values:{}}function Ee(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function lt(e){let t=e,n=[],r=t._zod?.def?.checks;if(Array.isArray(r)){for(let s of r)s.format&&n.push(s.format);if(n.length>0)return n}let a=t._def?.checks;if(Array.isArray(a))for(let s of a)s.kind&&n.push(s.kind);return n}var qt,Te=Ce(()=>{qt={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 gt({val:e}){return jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function nn({message:e}){return jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function he({val:e,mismatch:t}){let n=rn(e);return t?jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsx(nn,{message:t})]}):n}function rn(e){if(e==null)return jsx("span",{class:"opacity-30 italic text-xs",children:"\u2014"});if(typeof e=="boolean")return e?jsx("span",{class:"badge badge-success badge-sm",children:"true"}):jsx("span",{class:"badge badge-error badge-sm",children:"false"});if(e instanceof Date)return jsx(gt,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsx(gt,{val:e.toDate()});if(typeof e=="number")return jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxs("li",{class:"text-base-content/40 italic",children:["+",e.length-8," more\u2026"]})]});if(typeof e=="object"&&e!==null){let n=Object.entries(e);return n.length===0?jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxs("dl",{class:"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5 text-xs m-0",children:[n.slice(0,8).map(([r,a])=>jsxs(Fragment,{children:[jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsx("dd",{class:"break-all",children:String(a??"")})]})),n.length>8&&jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsx("span",{class:"text-sm break-all",children:t})}var _e=Ce(()=>{});function ge(e){if(!e)return "unknown";let t=He(e);switch(L(t)){case "ZodString":return "string";case "ZodNumber":return "number";case "ZodBigInt":return "bigint";case "ZodBoolean":return "boolean";case "ZodDate":return "date";case "ZodArray":return "array";case "ZodObject":case "ZodRecord":return "object";case "ZodEnum":case "ZodNativeEnum":return "enum";case "ZodLiteral":return "literal";default:return "unknown"}}function He(e){let t=L(e);if(t==="ZodOptional"||t==="ZodNullable"||t==="ZodDefault"){let n=G(e);return n?He(n):e}return e}function ye(e,t){if(!e)return;let n=t.split("."),r=e;for(let a of n){if(!r)return;let s=He(r);if(L(s)!=="ZodObject")return;r=ee(s)[a];}return r}function ln(e){return e==null?"null":e instanceof Date?"date":Array.isArray(e)?"array":typeof e=="string"?"string":typeof e=="boolean"?"boolean":typeof e=="bigint"?"bigint":typeof e=="number"?"number":typeof e=="object"?typeof e.toDate=="function"?"date":"object":"unknown"}function Se(e,t){if(e==="unknown")return null;let n=ln(t);return n==="null"?null:e==="enum"||e==="literal"?n==="string"||n==="number"?null:`Expected ${e} (string/number), got ${n}`:e===n||e==="number"&&n==="bigint"||e==="bigint"&&n==="number"?null:`Expected ${e}, got ${n}`}var Ue=Ce(()=>{Te();});var xt={};Mt(xt,{PanelMany:()=>dn,PanelOne:()=>cn,RightPanel:()=>qe});function cn({doc:e,repoName:t,basePath:n,schema:r,columns:a}){if(!e)return jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let s=String(e.docId??e.id??""),o=`${n}/${t}/${encodeURIComponent(s)}/edit`,d=vt(r,a);return jsxs("div",{class:"space-y-4",children:[jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxs("div",{class:"text-xs text-base-content/60",children:[jsx("span",{class:"font-mono",children:t}),jsx("span",{class:"opacity-50",children:" \xB7 "}),jsx("span",{class:"font-mono break-all",children:s})]}),jsx("a",{href:o,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:a.map(l=>{let f=e[l],b=d[l],y=b?Se(b,f):null;return jsxs(Fragment,{children:[jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:l}),jsx("dd",{class:"min-w-0",children:jsx(he,{val:f,mismatch:y})})]})})})]})}function dn({docs:e,repoName:t,basePath:n,fk:r,fv:a,columns:s,schema:o,pagination:d}){let l=`${n}/${t}?fv_${r}=${encodeURIComponent(a)}`,f=vt(o,s);return jsxs("div",{class:"space-y-4",children:[jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxs("div",{class:"text-xs text-base-content/60",children:[jsx("span",{class:"font-mono",children:t}),jsx("span",{class:"opacity-50",children:" where "}),jsx("span",{class:"font-mono",children:r}),jsx("span",{class:"opacity-50",children:" = "}),jsx("span",{class:"font-mono break-all",children:a}),jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsx("a",{href:l,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxs("table",{class:"table table-xs w-full",children:[jsx("thead",{children:jsxs("tr",{class:"bg-base-200/50",children:[s.map((b,y)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:b},y)),jsx("th",{})]})}),jsx("tbody",{children:e.length===0?jsx("tr",{children:jsx("td",{colspan:s.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((b,y)=>{let O=String(b.docId??b.id??""),$=`${n}/${t}/${encodeURIComponent(O)}/edit`;return jsxs("tr",{class:"hover",children:[s.map((g,U)=>{let z=b[g],B=f[g],m=B?Se(B,z):null;return jsx("td",{class:"align-top py-1.5",children:jsx(he,{val:z,mismatch:m})},U)}),jsx("td",{class:"text-right py-1.5",children:jsx("a",{href:$,class:"btn btn-xs btn-ghost",children:"Edit"})})]},y)})})]})}),(d.hasPrev||d.hasNext)&&jsxs("div",{class:"flex justify-center items-center gap-2",children:[d.hasPrev?jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":d.prevCursor,children:"\u2190 Previous"}):jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),d.hasNext?jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":d.nextCursor,children:"Next \u2192"}):jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function vt(e,t){if(!e)return {};let n={};for(let r of t)n[r]=ge(ye(e,r));return n}var qe,Ve=Ce(()=>{_e();Ue();qe=({basePath:e=""})=>jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"data-frs-base-path":e,"aria-hidden":"true",children:[jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function Fe(e,t,n){let r=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let o=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",d=n??process.env.FUNCTION_REGION??"us-central1",l=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${o}/${d}/${l}${r}`}let a=process.env.K_SERVICE,s=e?.hostname??e?.headers?.host??"";return a&&typeof s=="string"&&s.includes("cloudfunctions.net")?`/${a.toLowerCase()}${r}`:r}function st(e){if(typeof e=="string")return e;if(Array.isArray(e)){let t=e[0];return typeof t=="string"?t:void 0}}function De(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Te();Te();function Vt(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function ct(e){let t=e,n=true,r=false,a;for(;;){let s=L(t);if(s==="ZodOptional")n=false,t=G(t);else if(s==="ZodNullable")n=false,r=true,t=G(t);else if(s==="ZodDefault")n=false,a=it(t),t=G(t);else break}return {inner:t,required:n,nullable:r,defaultValue:a}}function te(e,t=""){if(L(e)==="ZodObject"){let r=ee(e);return Object.entries(r).map(([a,s])=>dt(t?`${t}.${a}`:a,a,s))}return [dt(t||"value",t||"value",e)]}function dt(e,t,n){let{inner:r,required:a,nullable:s,defaultValue:o}=ct(n),d=L(r),l=Vt(t.split(".").pop()??t);switch(d){case "ZodString":{let f=lt(r),b=f.includes("email"),y=f.includes("url");return {name:e,label:l,type:"text",required:a,nullable:s,defaultValue:o,hint:b?"email":y?"url":void 0}}case "ZodNumber":case "ZodBigInt":return {name:e,label:l,type:"number",required:a,nullable:s,defaultValue:o};case "ZodBoolean":return {name:e,label:l,type:"checkbox",required:a,nullable:s,defaultValue:o};case "ZodDate":case "ZodCoerce":return {name:e,label:l,type:"datetime-local",required:a,nullable:s,defaultValue:o};case "ZodEnum":{let f=we(r);return {name:e,label:l,type:"select",required:a,nullable:s,defaultValue:o,options:f}}case "ZodNativeEnum":{let f=ke(r),b=Object.values(f).filter(y=>typeof y=="string");return {name:e,label:l,type:"select",required:a,nullable:s,defaultValue:o,options:b}}case "ZodLiteral":{let f=String(Ee(r)??"");return {name:e,label:l,type:"select",required:a,nullable:s,defaultValue:o,options:[f]}}case "ZodObject":{let f=te(r,e);return {name:e,label:l,type:"textarea",required:a,nullable:s,defaultValue:o,nested:f,hint:"JSON object"}}case "ZodArray":{let f=ot(r);if(!f)return {name:e,label:l,type:"textarea",required:a,nullable:s,defaultValue:o,hint:"JSON array"};let{inner:b}=ct(f),y=L(b),O,$,g;switch(y){case "ZodString":O="text";break;case "ZodNumber":case "ZodBigInt":O="number";break;case "ZodBoolean":O="checkbox";break;case "ZodDate":O="datetime-local";break;case "ZodEnum":O="select",$=we(b);break;case "ZodNativeEnum":O="select",$=Object.values(ke(b)).filter(U=>typeof U=="string");break;case "ZodObject":O="object",g=te(b);break;default:return {name:e,label:l,type:"textarea",required:a,nullable:s,defaultValue:o,hint:"JSON array"}}return {name:e,label:l,type:"textarea",required:a,nullable:s,defaultValue:o,arrayElementType:O,arrayElementOptions:$,arrayElementFields:g}}default:return {name:e,label:l,type:"textarea",required:a,nullable:s,defaultValue:o,hint:"JSON"}}}function ft(e,t=0){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,a=e.name,s=e.required?" required":"",o=e.defaultValue==="__null__",d=!o&&e.defaultValue!=null?String(e.defaultValue):"",l=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
2
+ <input type="hidden" id="${r}__isnull" name="${a}__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
- <input type="checkbox" class="checkbox checkbox-xs" ${s?"checked":""}
4
+ <input type="checkbox" class="checkbox checkbox-xs" ${o?"checked":""}
5
5
  onchange="(function(cb){
6
6
  var inp = document.getElementById('${r}');
7
7
  var h = document.getElementById('${r}__isnull');
@@ -10,11 +10,11 @@ import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {randomBytes}from'cr
10
10
  })(this)">
11
11
  <span>null</span>
12
12
  </label>
13
- </span>`:"",f;switch(e.type){case "checkbox":if(e.nullable){let b=s?"__null__":d==="true"?"true":d==="false"?"false":"__null__";return `
13
+ </span>`:"",f;switch(e.type){case "checkbox":if(e.nullable){let b=o?"__null__":d==="true"?"true":d==="false"?"false":"__null__";return `
14
14
  <div class="form-control mb-3 ${n}">
15
15
  <label for="${r}" class="label pb-1">
16
16
  <span class="label-text font-medium">
17
- ${$(e.label)}
17
+ ${R(e.label)}
18
18
  <span class="text-base-content/40 text-xs ml-1">(nullable)</span>
19
19
  </span>
20
20
  </label>
@@ -28,41 +28,41 @@ import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {randomBytes}from'cr
28
28
  <label class="label cursor-pointer justify-start gap-3">
29
29
  <input type="checkbox" id="${r}" name="${a}" value="true"${d==="true"?" checked":""} class="checkbox checkbox-primary checkbox-sm">
30
30
  <span class="label-text font-medium">
31
- ${$(e.label)}${e.required?' <span class="text-error">*</span>':""}
31
+ ${R(e.label)}${e.required?' <span class="text-error">*</span>':""}
32
32
  </span>
33
33
  </label>
34
- </div>`;case "select":f=`<select id="${r}" name="${a}"${o}${s?' disabled style="opacity:0.35"':""} class="select select-bordered select-sm w-full">
34
+ </div>`;case "select":f=`<select id="${r}" name="${a}"${s}${o?' disabled style="opacity:0.35"':""} class="select select-bordered select-sm w-full">
35
35
  ${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
36
- ${(e.options??[]).map(b=>`<option value="${$(b)}"${d===b?" selected":""}>${$(b)}</option>`).join(`
36
+ ${(e.options??[]).map(b=>`<option value="${R(b)}"${d===b?" selected":""}>${R(b)}</option>`).join(`
37
37
  `)}
38
- </select>`;break;case "textarea":if(e.arrayElementType)return qt(e,t);if(e.nested&&e.nested.length>0){let b=e.nested.map(y=>ut(y,t+1)).join(`
38
+ </select>`;break;case "textarea":if(e.arrayElementType)return Jt(e,t);if(e.nested&&e.nested.length>0){let b=e.nested.map(y=>ft(y,t+1)).join(`
39
39
  `);return `
40
40
  <fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}">
41
41
  <legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
42
- ${$(e.label)}${e.required?' <span class="text-error">*</span>':""}
42
+ ${R(e.label)}${e.required?' <span class="text-error">*</span>':""}
43
43
  </legend>
44
44
  ${b}
45
- </fieldset>`}f=`<textarea id="${r}" name="${a}"${o} rows="3"${s?' disabled style="opacity:0.35"':""}
45
+ </fieldset>`}f=`<textarea id="${r}" name="${a}"${s} rows="3"${o?' disabled style="opacity:0.35"':""}
46
46
  data-json
47
47
  class="textarea textarea-bordered textarea-sm w-full font-mono text-xs"
48
- placeholder="${$(e.hint??"JSON")}">${$(d)}</textarea>`;break;default:f=`<input type="${e.type}" id="${r}" name="${a}"${o}${s?' disabled style="opacity:0.35"':""}
49
- value="${$(d)}"
48
+ placeholder="${R(e.hint??"JSON")}">${R(d)}</textarea>`;break;default:f=`<input type="${e.type}" id="${r}" name="${a}"${s}${o?' disabled style="opacity:0.35"':""}
49
+ value="${R(d)}"
50
50
  class="input input-bordered input-sm w-full"${e.hint==="email"?' autocomplete="email"':e.hint==="url"?' autocomplete="url"':""}>`;}return `
51
51
  <div class="form-control mb-3 ${n}">
52
52
  <label for="${r}" class="label pb-1">
53
53
  <span class="label-text font-medium">
54
- ${$(e.label)}${e.required?' <span class="text-error">*</span>':""}
55
- ${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${$(e.hint)})</span>`:""}
54
+ ${R(e.label)}${e.required?' <span class="text-error">*</span>':""}
55
+ ${e.hint?`<span class="text-base-content/40 text-xs ml-1">(${R(e.hint)})</span>`:""}
56
56
  </span>
57
57
  </label>
58
58
  <div class="flex items-center gap-2">
59
59
  <div class="flex-1 min-w-0">${f}</div>
60
60
  ${l}
61
61
  </div>
62
- </div>`}function $(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function qt(e,t){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,a=e.defaultValue==="__null__",o=e.arrayElementType==="object",s=[];if(e.defaultValue!=null&&e.defaultValue!==""&&e.defaultValue!=="__null__")try{s=JSON.parse(String(e.defaultValue));}catch{}Array.isArray(s)||(s=[]);let d=o?s.map(b=>dt(e,b??{})).join(`
63
- `):s.map(b=>ct(e,b)).join(`
64
- `),l=o?dt(e,{}):ct(e,""),f=e.nullable?`<span class="flex items-center gap-1 mt-2">
65
- <input type="hidden" id="${r}__isnull" name="${$(e.name)}__isnull" value="${a?"1":""}">
62
+ </div>`}function R(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Jt(e,t){let n=t>0?`ml-${t*4}`:"",r=`field_${e.name.replace(/\./g,"__")}`,a=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 d=s?o.map(b=>pt(e,b??{})).join(`
63
+ `):o.map(b=>ut(e,b)).join(`
64
+ `),l=s?pt(e,{}):ut(e,""),f=e.nullable?`<span class="flex items-center gap-1 mt-2">
65
+ <input type="hidden" id="${r}__isnull" name="${R(e.name)}__isnull" value="${a?"1":""}">
66
66
  <label class="flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/40 hover:text-base-content/70 border border-base-300 rounded px-2 py-1">
67
67
  <input type="checkbox" class="checkbox checkbox-xs" ${a?"checked":""}
68
68
  onchange="(function(cb){
@@ -76,64 +76,64 @@ import {jsx,jsxs,Fragment}from'hono/jsx/jsx-runtime';import {randomBytes}from'cr
76
76
  </label>
77
77
  </span>`:"";return `
78
78
  <fieldset class="fieldset border border-base-300 rounded-box p-3 mb-3 ${n}"
79
- data-frs-array="${$(e.name)}" data-frs-array-type="${$(e.arrayElementType??"text")}">
79
+ data-frs-array="${R(e.name)}" data-frs-array-type="${R(e.arrayElementType??"text")}">
80
80
  <legend class="fieldset-legend text-xs font-semibold text-base-content/60 px-1">
81
- ${$(e.label)}${e.required?' <span class="text-error">*</span>':""}
81
+ ${R(e.label)}${e.required?' <span class="text-error">*</span>':""}
82
82
  </legend>
83
- <input type="hidden" id="${r}" name="${$(e.name)}" value="${$(JSON.stringify(s))}"${a?" disabled":""}>
83
+ <input type="hidden" id="${r}" name="${R(e.name)}" value="${R(JSON.stringify(o))}"${a?" disabled":""}>
84
84
  <div data-frs-array-items${a?' style="opacity:0.35"':""}>
85
85
  ${d}
86
86
  </div>
87
87
  <template data-frs-array-tpl>${l}</template>
88
88
  <button type="button" class="btn btn-xs btn-outline mt-1" data-frs-array-add>+ Add</button>
89
89
  ${f}
90
- </fieldset>`}function ct(e,t){let n=t!=null?String(t):"",r;switch(e.arrayElementType){case "select":r=`<select data-frs-val class="select select-bordered select-sm flex-1">
90
+ </fieldset>`}function ut(e,t){let n=t!=null?String(t):"",r;switch(e.arrayElementType){case "select":r=`<select data-frs-val class="select select-bordered select-sm flex-1">
91
91
  <option value="">\u2014</option>
92
- ${(e.arrayElementOptions??[]).map(a=>`<option value="${$(a)}"${n===a?" selected":""}>${$(a)}</option>`).join("")}
92
+ ${(e.arrayElementOptions??[]).map(a=>`<option value="${R(a)}"${n===a?" selected":""}>${R(a)}</option>`).join("")}
93
93
  </select>`;break;case "checkbox":r=`<label class="flex items-center gap-2 flex-1 cursor-pointer">
94
94
  <input type="checkbox" data-frs-val class="checkbox checkbox-sm checkbox-primary"${n==="true"?" checked":""}>
95
95
  <span class="text-sm">true</span>
96
- </label>`;break;case "number":r=`<input type="number" data-frs-val value="${$(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":r=`<input type="datetime-local" data-frs-val value="${$(n)}" class="input input-bordered input-sm flex-1">`;break;default:r=`<input type="text" data-frs-val value="${$(n)}" class="input input-bordered input-sm flex-1">`;}return `<div class="flex items-center gap-2 mb-2" data-frs-array-item>
96
+ </label>`;break;case "number":r=`<input type="number" data-frs-val value="${R(n)}" class="input input-bordered input-sm flex-1">`;break;case "datetime-local":r=`<input type="datetime-local" data-frs-val value="${R(n)}" class="input input-bordered input-sm flex-1">`;break;default:r=`<input type="text" data-frs-val value="${R(n)}" class="input input-bordered input-sm flex-1">`;}return `<div class="flex items-center gap-2 mb-2" data-frs-array-item>
97
97
  ${r}
98
98
  <button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>&times;</button>
99
- </div>`}function dt(e,t){return `<div class="border border-base-200 rounded p-3 mb-2" data-frs-array-item>
99
+ </div>`}function pt(e,t){return `<div class="border border-base-200 rounded p-3 mb-2" data-frs-array-item>
100
100
  <div class="flex justify-end mb-1">
101
101
  <button type="button" class="btn btn-xs btn-ghost text-error" data-frs-array-rm>&times;</button>
102
102
  </div>
103
- ${(e.arrayElementFields??[]).map(a=>{let o=t[a.name],s=o==null?"":typeof o=="object"?JSON.stringify(o):String(o);switch(a.type){case "checkbox":return `<div class="form-control mb-2">
103
+ ${(e.arrayElementFields??[]).map(a=>{let s=t[a.name],o=s==null?"":typeof s=="object"?JSON.stringify(s):String(s);switch(a.type){case "checkbox":return `<div class="form-control mb-2">
104
104
  <label class="label cursor-pointer justify-start gap-3">
105
- <input type="checkbox" data-frs-key="${$(a.name)}" class="checkbox checkbox-sm checkbox-primary"${s==="true"?" checked":""}>
106
- <span class="label-text text-sm">${$(a.label)}</span>
105
+ <input type="checkbox" data-frs-key="${R(a.name)}" class="checkbox checkbox-sm checkbox-primary"${o==="true"?" checked":""}>
106
+ <span class="label-text text-sm">${R(a.label)}</span>
107
107
  </label>
108
108
  </div>`;case "select":return `<div class="form-control mb-2">
109
- <label class="label pb-1"><span class="label-text text-sm">${$(a.label)}</span></label>
110
- <select data-frs-key="${$(a.name)}" class="select select-bordered select-sm w-full">
109
+ <label class="label pb-1"><span class="label-text text-sm">${R(a.label)}</span></label>
110
+ <select data-frs-key="${R(a.name)}" class="select select-bordered select-sm w-full">
111
111
  ${a.required?"":'<option value="">\u2014</option>'}
112
- ${(a.options??[]).map(d=>`<option value="${$(d)}"${s===d?" selected":""}>${$(d)}</option>`).join("")}
112
+ ${(a.options??[]).map(d=>`<option value="${R(d)}"${o===d?" selected":""}>${R(d)}</option>`).join("")}
113
113
  </select>
114
114
  </div>`;case "number":return `<div class="form-control mb-2">
115
- <label class="label pb-1"><span class="label-text text-sm">${$(a.label)}</span></label>
116
- <input type="number" data-frs-key="${$(a.name)}" value="${$(s)}" class="input input-bordered input-sm w-full">
115
+ <label class="label pb-1"><span class="label-text text-sm">${R(a.label)}</span></label>
116
+ <input type="number" data-frs-key="${R(a.name)}" value="${R(o)}" class="input input-bordered input-sm w-full">
117
117
  </div>`;case "datetime-local":return `<div class="form-control mb-2">
118
- <label class="label pb-1"><span class="label-text text-sm">${$(a.label)}</span></label>
119
- <input type="datetime-local" data-frs-key="${$(a.name)}" value="${$(s)}" class="input input-bordered input-sm w-full">
118
+ <label class="label pb-1"><span class="label-text text-sm">${R(a.label)}</span></label>
119
+ <input type="datetime-local" data-frs-key="${R(a.name)}" value="${R(o)}" class="input input-bordered input-sm w-full">
120
120
  </div>`;case "textarea":return `<div class="form-control mb-2">
121
- <label class="label pb-1"><span class="label-text text-sm">${$(a.label)}</span></label>
122
- <textarea data-frs-key="${$(a.name)}" rows="2" class="textarea textarea-bordered textarea-sm w-full font-mono text-xs" placeholder="JSON">${$(s)}</textarea>
121
+ <label class="label pb-1"><span class="label-text text-sm">${R(a.label)}</span></label>
122
+ <textarea data-frs-key="${R(a.name)}" rows="2" class="textarea textarea-bordered textarea-sm w-full font-mono text-xs" placeholder="JSON">${R(o)}</textarea>
123
123
  </div>`;default:return `<div class="form-control mb-2">
124
- <label class="label pb-1"><span class="label-text text-sm">${$(a.label)}</span></label>
125
- <input type="text" data-frs-key="${$(a.name)}" value="${$(s)}" class="input input-bordered input-sm w-full">
124
+ <label class="label pb-1"><span class="label-text text-sm">${R(a.label)}</span></label>
125
+ <input type="text" data-frs-key="${R(a.name)}" value="${R(o)}" class="input input-bordered input-sm w-full">
126
126
  </div>`}}).join(`
127
127
  `)}
128
- </div>`}function ie(e,t,n,r="Save"){let a=e.map(o=>ut(o)).join(`
128
+ </div>`}function le(e,t,n,r="Save"){let a=e.map(s=>ft(s)).join(`
129
129
  `);return `
130
- <form action="${$(t)}" method="${n}" novalidate data-frs-form>
130
+ <form action="${R(t)}" method="${n}" novalidate data-frs-form>
131
131
  ${a}
132
132
  <div class="flex gap-2 mt-4 pt-4 border-t border-base-200">
133
- <button type="submit" class="btn btn-primary btn-sm">${$(r)}</button>
133
+ <button type="submit" class="btn btn-primary btn-sm">${R(r)}</button>
134
134
  <button type="button" class="btn btn-ghost btn-sm" onclick="history.back()">Cancel</button>
135
135
  </div>
136
- </form>`}var Vt=new Set(["<","<=",">",">=","!="]),Jt=new Set(["array-contains","array-contains-any"]);function De(e){return e==="desc"?"DESCENDING":"ASCENDING"}function Kt(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function Gt(e,t,n,r,a){let o=[],s=new Set;for(let l of r)if(l.op==="=="||l.op==="in"||l.op==="not-in"){if(s.has(l.field))continue;s.add(l.field),o.push({fieldPath:l.field,order:"ASCENDING"});}for(let l of r)if(Jt.has(l.op)){if(s.has(l.field))continue;s.add(l.field),o.push({fieldPath:l.field,arrayConfig:"CONTAINS"});}for(let l of r)if(Vt.has(l.op)){if(s.has(l.field))continue;s.add(l.field);let f=a?.field===l.field?De(a.dir):"ASCENDING";o.push({fieldPath:l.field,order:f});}if(a&&!s.has(a.field)&&o.push({fieldPath:a.field,order:De(a.dir)}),o.length===1&&n)return Xt(e,t,o[0]);let d=a&&o.some(l=>l.fieldPath===a.field)?De(a.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:d}),Wt(e,t,n,o)}function Wt(e,t,n,r,a="(default)"){let o=`projects/${e}/databases/${a}/collectionGroups/${t}/indexes/_`,s=[...Le(1,o),...Te(2,n?2:1)];for(let f of r)s.push(...pt(3,ft(f)));let d=a==="(default)"?"-default-":a,l=encodeURIComponent(mt(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${d}/indexes?create_composite=${l}`}function Qt(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function ze(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function je(e,t){return e<<3|t}function Le(e,t){let n=Array.from(new TextEncoder().encode(t));return [je(e,2),...ze(n.length),...n]}function Te(e,t){return [je(e,0),...ze(t)]}function pt(e,t){return [je(e,2),...ze(t.length),...t]}function ft(e){let t=[...Le(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...Te(3,1)):t.push(...Te(2,e.order==="DESCENDING"?2:1)),t}function mt(e){let t=String.fromCharCode(...e),n;if(typeof Buffer<"u")n=Buffer.from(e).toString("base64");else if(typeof btoa<"u")n=btoa(t);else throw new Error("No base64 encoder available");return n.replace(/=+$/,"")}function Xt(e,t,n,r="(default)"){let a=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,o=[...Le(1,a),...Te(2,2),...pt(3,ft(n))],s=r==="(default)"?"-default-":r,d=encodeURIComponent(mt(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${s}/indexes/automatic?create_exemption=${d}`}function Yt(e){let t=e,n=[t?.firestore?.projectId,t?.firestore?.app?.options?.projectId,t?.firestore?._settings?.projectId,t?.firestore?.databaseId?.projectId,t?._firestore?.projectId];for(let a of n)if(typeof a=="string"&&a.length>0)return a;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function le(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Be(e,t){let n=e??{},r=le(e),a;if(r&&(a=n.message?Qt(n.message):void 0,!a)){let o=Yt(t.ref);if(o){let s=Kt(t.path);a=Gt(o,s,t.isGroup,t.filters,t.sort);}}return {type:r?"index":"error",message:r?"This query requires a composite index that does not exist yet.":n.message??"Query failed",indexUrl:a}}Oe();var ht=`// \u2500\u2500 Shared helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
136
+ </form>`}var Kt=new Set(["<","<=",">",">=","!="]),Gt=new Set(["array-contains","array-contains-any"]);function ze(e){return e==="desc"?"DESCENDING":"ASCENDING"}function Wt(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function Qt(e,t,n,r,a){let s=[],o=new Set;for(let l of r)if(l.op==="=="||l.op==="in"||l.op==="not-in"){if(o.has(l.field))continue;o.add(l.field),s.push({fieldPath:l.field,order:"ASCENDING"});}for(let l of r)if(Gt.has(l.op)){if(o.has(l.field))continue;o.add(l.field),s.push({fieldPath:l.field,arrayConfig:"CONTAINS"});}for(let l of r)if(Kt.has(l.op)){if(o.has(l.field))continue;o.add(l.field);let f=a?.field===l.field?ze(a.dir):"ASCENDING";s.push({fieldPath:l.field,order:f});}if(a&&!o.has(a.field)&&s.push({fieldPath:a.field,order:ze(a.dir)}),s.length===1&&n)return en(e,t,s[0]);let d=a&&s.some(l=>l.fieldPath===a.field)?ze(a.dir):"ASCENDING";return s.push({fieldPath:"__name__",order:d}),Xt(e,t,n,s)}function Xt(e,t,n,r,a="(default)"){let s=`projects/${e}/databases/${a}/collectionGroups/${t}/indexes/_`,o=[...Be(1,s),...Oe(2,n?2:1)];for(let f of r)o.push(...mt(3,bt(f)));let d=a==="(default)"?"-default-":a,l=encodeURIComponent(ht(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${d}/indexes?create_composite=${l}`}function Yt(e){return e.match(/https:\/\/console\.firebase\.google\.com[^\s)"]*/)?.[0]}function je(e){let t=[],n=e>>>0;for(;n>=128;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function Le(e,t){return e<<3|t}function Be(e,t){let n=Array.from(new TextEncoder().encode(t));return [Le(e,2),...je(n.length),...n]}function Oe(e,t){return [Le(e,0),...je(t)]}function mt(e,t){return [Le(e,2),...je(t.length),...t]}function bt(e){let t=[...Be(1,e.fieldPath)];return e.arrayConfig==="CONTAINS"?t.push(...Oe(3,1)):t.push(...Oe(2,e.order==="DESCENDING"?2:1)),t}function ht(e){let t=String.fromCharCode(...e),n;if(typeof Buffer<"u")n=Buffer.from(e).toString("base64");else if(typeof btoa<"u")n=btoa(t);else throw new Error("No base64 encoder available");return n.replace(/=+$/,"")}function en(e,t,n,r="(default)"){let a=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,s=[...Be(1,a),...Oe(2,2),...mt(3,bt(n))],o=r==="(default)"?"-default-":r,d=encodeURIComponent(ht(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${o}/indexes/automatic?create_exemption=${d}`}function tn(e){let t=e,n=[t?.firestore?.projectId,t?.firestore?.app?.options?.projectId,t?.firestore?._settings?.projectId,t?.firestore?.databaseId?.projectId,t?._firestore?.projectId];for(let a of n)if(typeof a=="string"&&a.length>0)return a;return process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT||process.env.FIREBASE_PROJECT_ID||void 0}function ce(e){let t=e;return t?t.code===9?true:typeof t.message=="string"?t.message.includes("requires an index"):false:false}function Me(e,t){let n=e??{},r=ce(e),a;if(r&&(a=n.message?Yt(n.message):void 0,!a)){let s=tn(t.ref);if(s){let o=Wt(t.path);a=Qt(s,o,t.isGroup,t.filters,t.sort);}}return {type:r?"index":"error",message:r?"This query requires a composite index that does not exist yet.":n.message??"Query failed",indexUrl:a}}_e();var yt=`// \u2500\u2500 Shared helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
137
137
  function frsGetBasePath() {
138
138
  var root = document.querySelector("[data-frs-panel-root]");
139
139
  var bp = root && root.getAttribute("data-frs-base-path");
@@ -1060,6 +1060,6 @@ function initColumnReorder(table) {
1060
1060
  });
1061
1061
  });
1062
1062
  }
1063
- `;function _e(){return jsx("script",{dangerouslySetInnerHTML:{__html:ht}})}qe();function re(e){return "<!DOCTYPE html>"+renderToString(e)}var un=["corporate","silk","dark"],pn=()=>jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:"size-4",children:[jsx("circle",{cx:"12",cy:"12",r:"4"}),jsx("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsx("ul",{tabIndex:0,class:"dropdown-content menu menu-sm bg-base-100 text-base-content rounded-box z-50 mt-2 w-40 p-1 shadow-lg border border-base-300",children:un.map(e=>jsx("li",{children:jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsx("span",{children:e}),jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),ae=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:a,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:[n," \u2014 FRS Admin"]}),jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),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:[jsxs("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"})}),jsx("div",{class:"flex-none",children:jsx(pn,{})})]}),jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsx("ul",{children:r.map((s,d)=>s.href?jsx("li",{children:jsx("a",{href:s.href,children:s.label})},d):jsx("li",{class:"text-base-content/60",children:s.label},d))})}),jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),a&&jsxs("div",{role:"alert",class:`alert ${a.type==="success"?"alert-success":a.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsx("span",{class:"flex-1",children:a.message}),a.action&&jsx("a",{href:a.action.href,...a.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:a.action.label})]}),t]}),jsx(Ue,{basePath:o}),jsx(_e,{})]})]})};function Ve(e,t){return re(jsx(ae,{opts:t,children:jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Je(e,t){return re(jsx(ae,{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 xt=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],fn=[{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"}],mn=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function bn(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return fn;case "ZodBoolean":return xt;case "ZodArray":return mn;default:return xt}}var oe="__null__";function hn(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="${oe}"]');if(!o){o=document.createElement('option');o.value='${oe}';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='${oe}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${oe}"][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!=='${oe}')?i.dataset._prev:'';}}})(this)`}function gn(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 Se({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:hn(e)}),jsx("span",{children:"\u2205"})]})}function yn({col:e,active:t}){let n=t?.value??"",r=n===oe,a=`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 d=new Set(n.split(",").map(f=>f.trim()).filter(Boolean)),l=`eg_${e.name.replace(/\./g,"__")}`;return jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsx("input",{type:"hidden",id:a,name:`fv_${e.name}`,value:n}),e.enumValues.map(f=>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:f,checked:d.has(f),"data-enum-group":l,onchange:gn(a,l)}),jsx("span",{children:f})]},f))]})}return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:a,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(d=>jsx("option",{value:d,selected:n===d,children:d},d)),e.nullable&&jsx("option",{value:oe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsx(Se,{inputId:a,active:r})]})}if(e.zodType==="ZodBoolean")return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:a,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsx("option",{value:"true",selected:n==="true",children:"true"}),jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsx("option",{value:oe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsx(Se,{inputId:a,active:r})]});if(e.zodType==="ZodArray"){let d=t?.op==="array-contains-any";return jsx("input",{id:a,type:"text",name:`fv_${e.name}`,value:n,placeholder:d?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:a,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsx(Se,{inputId:a,active:r})]}):e.zodType==="ZodDate"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:a,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsx(Se,{inputId:a,active:r})]}):jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:a,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0}),e.nullable&&jsx(Se,{inputId:a,active:r})]})}function Ke({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let a=Object.fromEntries(n.map(l=>[l.field,l])),o=n.length>0,s=n.length>=2||r&&o,d=t.filter(l=>l.zodType!=="ZodObject"&&l.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:[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:d.map(l=>{let f=bn(l.zodType),b=a[l.name],y=b?.op??f[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:l.name}),jsxs("div",{class:"flex gap-1.5",children:[f.length>1?jsx("select",{name:`fo_${l.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:f.map(N=>jsx("option",{value:N.value,selected:N.value===y,children:N.label},N.value))}):jsx("input",{type:"hidden",name:`fo_${l.name}`,value:f[0].value}),jsx(yn,{col:l,active:b})]})]},l.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"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function Ge(e,t,n,r,a,o){let s=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,d=n==="create"?[{label:"Repositories",href:a},{label:e,href:`${a}/${e}`},{label:"New document"}]:[{label:"Repositories",href:a},{label:e,href:`${a}/${e}`},{label:`Edit ${r??""}`}];return re(jsx(ae,{opts:{title:s,breadcrumb:d,basePath:a,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}})})})}))}Oe();He();function We(e,t,n){let r=new URLSearchParams;for(let a of e)r.set(`fv_${a.field}`,a.value),r.set(`fo_${a.field}`,a.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function wt(e,t,n,r,a){let o=We(e,r,a);return o.set("cursor",t),o.set("dir",n),`?${o.toString()}`}function vn(e,t,n,r){let a=We(n,void 0,r);return t?.field===e?t.dir==="asc"&&(a.set("ob",e),a.set("od","desc")):(a.set("ob",e),a.set("od","asc")),`?${a.toString()}`}function xn(e,t,n){return `?${We(t,n,e).toString()}`}function Qe(e,t,n,r,a,o,s=[],d=[],l=false,f=[],b,y,N,T,h,q,j,m=false){let u=`${r}/${e}`,x=`${u}/create`,i={};if(j)for(let w of n)i[w]=he(ge(j,w));let c=(q??[]).filter(w=>{let R=i[w]??he(ge(j,w));return R==="string"||R==="number"||R==="bigint"||R==="boolean"||R==="enum"||R==="literal"}),p=c.length>0,k=l,A=k||p,O=c.map(w=>{let R=ge(j,w),S=he(R),C=s.find(D=>D.name===w);return {name:w,type:S,enumValues:C?.enumValues??null,nullable:C?.nullable??false}});return re(jsxs(ae,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:o},children:[s.length>0&&jsx(Ke,{action:u,columnMeta:s,activeFilters:d,isGroup:T}),N&&jsxs("div",{role:"alert",class:`alert ${N.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:N.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:N.type==="index"?"Composite index required":"Query failed"}),jsx("div",{class:"text-sm",children:N.message})]}),N.indexUrl&&jsx("a",{href:N.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","data-frs-toolbar":true,children:[jsxs("div",{class:"flex items-center gap-3",children:[jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof h=="number"&&jsxs(Fragment,{children:[" ","of"," ",jsx("span",{class:"font-semibold text-base-content/80",children:h})]})," ","document",(typeof h=="number"?h: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(w=>jsx("a",{href:xn(w,d,b),class:`join-item btn btn-xs ${y===w?"btn-active btn-primary":"btn-outline"}`,children:w},w))})]})]}),jsx("a",{href:x,class:"btn btn-primary btn-sm",children:"+ New"})]}),A&&jsxs("div",{class:"hidden mb-3 alert alert-info py-2 px-3","data-frs-bulk-bar":true,"data-frs-repo":e,"data-frs-total":typeof h=="number"?String(h):"","data-frs-page-size":String(y??t.length),"data-frs-allow-delete":k?"1":"0","data-frs-allow-update":p?"1":"0","data-frs-fields":JSON.stringify(O),"data-frs-filters":JSON.stringify(d),children:[jsxs("div",{class:"flex-1 text-sm",children:[jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof h=="number"&&h>t.length&&jsxs("button",{type:"button",class:"ml-3 link text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",h," matching documents"]}),jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",h??"?"," matching documents are selected."," ",jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxs("div",{class:"flex gap-2",children:[p&&jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),k&&jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),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:[A&&jsx("th",{class:"w-8",children:jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((w,R)=>{let S=b?.field===w,C=S?b.dir==="asc"?" \u25B2":" \u25BC":"";return jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxs("a",{href:vn(w,b,d,y),class:`hover:text-base-content inline-flex items-center gap-0.5${S?" text-primary font-bold":""}`,children:[w,C]})},R)}),f.map((w,R)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:w.column},`rel-${R}`)),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+f.length+1+(A?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((w,R)=>{let S=String(w.docId??w.id??""),C=`${r}/${e}/${encodeURIComponent(S)}/edit`,D=`${r}/${e}/${encodeURIComponent(S)}/delete`;return jsxs("tr",{class:"hover","data-frs-row-id":S,children:[A&&jsx("td",{class:"align-middle py-2",children:jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:S,"aria-label":`Select ${S}`})}),n.map((I,G)=>{let E=w[I],g=i[I],B=g?ke(g,E):null;return jsx("td",{class:"align-top py-2",children:jsx(be,{val:E,mismatch:B})},G)}),f.map((I,G)=>{let E=w[I.key];if(E==null||E==="")return jsx("td",{class:"py-2"},`rel-${G}`);let g=I.type==="one"?`${r}/${I.targetRepo}/${encodeURIComponent(String(E))}/edit`:`${r}/${I.targetRepo}?fv_${I.targetKey}=${encodeURIComponent(String(E))}`;return jsx("td",{class:"align-middle py-2",children:jsx("a",{href:g,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":I.type,"data-frs-rel-repo":I.targetRepo,"data-frs-rel-fk":I.targetKey,"data-frs-rel-val":String(E),"data-frs-rel-label":I.column,children:I.column})},`rel-${G}`)}),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"}),m&&jsx("a",{href:`${r}/${e}/${encodeURIComponent(S)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),l&&jsx("form",{method:"post",action:D,onsubmit:"return confirm('Delete this document?')",children:jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},R)})})]})}),(a.hasPrev||a.hasNext)&&jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxs("div",{class:"flex justify-center items-center gap-2",children:[a.hasPrev?jsx("a",{href:wt(d,a.prevCursor,"prev",b,y),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),a.hasNext?jsx("a",{href:wt(d,a.nextCursor,"next",b,y),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof h=="number"&&jsxs("div",{class:"text-xs text-base-content/50",children:[h," total document",h!==1?"s":"",d.length>0?" matching filters":""]})]}),A&&p&&jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxs("div",{class:"modal-box",children:[jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsx("p",{class:"text-sm text-base-content/60 mb-4","data-frs-bulk-update-summary":true,children:"Update one field on the selected documents."}),jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxs("label",{class:"form-control w-full mb-3",children:[jsx("div",{class:"label",children:jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),c.map(w=>jsx("option",{value:w,children:w},w))]})]}),jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxs("div",{class:"modal-action",children:[jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsx("form",{method:"dialog",class:"modal-backdrop",children:jsx("button",{children:"close"})})]})]}))}function Pe(e,t){return Ve(e,t)}function kt(e,t){return Je(e,t)}function St(e,t,n,r,a,o,s,d,l,f,b,y,N,T,h,q,j,m){return Qe(e,t,n,r,a,o,s,d,l,f,b,y,N,T,h,q,j,m)}function de(e,t,n,r,a,o){return Ge(e,t,n,r,a,o)}var Xe="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function An(){let e="";for(;e.length<20;){let t=randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=Xe.length*4||(e+=Xe.charAt(r%Xe.length));}}return e}function Ie(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),a=[];for(let o=1;o<r.length;o+=2)a.push(r[o]);return a.length>0?a:void 0}async function ye(e,t){let n=e.documentKey??"docId",r=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[r]=="function")try{let o=await e.repo.get[r](t);if(o)return o}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function Ye(e,t,n){let r=e.documentKey??"docId",a=Be(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return a.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...a.indexUrl?{action:{href:a.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:a.message}}function P(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function et(e,t){e.status(302).set("Location",t).send("");}function tt(e,t){let n=t.shape,r={};for(let[a,o]of Object.entries(n)){let s=rt(o);if(s==="ZodObject"){if(e[a+"__isnull"]==="1"){r[a]=null;continue}let f={},b=false;for(let[T,h]of Object.entries(e))T.startsWith(`${a}.`)&&(f[T.slice(a.length+1)]=h,b=true);if(b){let T=o;for(;;){let h=L(T);if(h==="ZodOptional"||h==="ZodNullable"||h==="ZodDefault")T=J(T);else break}r[a]=tt(f,T);continue}let y=e[a],N=Array.isArray(y)?y[y.length-1]:y;if(N)try{r[a]=JSON.parse(N);}catch{r[a]=N;}continue}let d=e[a],l=Array.isArray(d)?d[d.length-1]:d;if(e[a+"__isnull"]==="1"){r[a]=null;continue}if(l===void 0||l===""){s==="ZodBoolean"&&(r[a]=false);continue}switch(s){case "ZodBoolean":l==="__null__"?r[a]=null:r[a]=l==="true"||l==="on"||l==="1";break;case "ZodNumber":case "ZodBigInt":r[a]=Number(l);break;case "ZodDate":r[a]=new Date(l);break;case "ZodArray":try{r[a]=JSON.parse(l);}catch{r[a]=l;}break;default:if(l.startsWith("{")||l.startsWith("["))try{r[a]=JSON.parse(l);break}catch{}r[a]=l;}}return r}function At(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let r=new Date(e);isNaN(r.getTime())||(t=r);}if(!t||isNaN(t.getTime()))return null;let n=r=>String(r).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function rt(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=J(t);else return n}}function Rn(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=J(t);else return t}}function $t(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=J(t);continue}return false}}function Ct(e){let t=Rn(e),n=L(t);if(n==="ZodEnum"){let r=xe(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=we(t),a=Object.values(r).filter(o=>typeof o=="string");return a.length>0?a:void 0}if(n==="ZodLiteral"){let r=Ce(t);return typeof r=="string"?[r]:void 0}}function Et(e,t,n=""){let r={};for(let a of Object.keys(t.shape)){let o=n?`${n}.${a}`:a,s=e[a];if(s===null){r[o]="__null__";continue}if(s===void 0)continue;let d=t.shape[a];for(;;){let f=L(d);if(f==="ZodOptional"||f==="ZodNullable"||f==="ZodDefault")d=J(d);else break}let l=L(d);if(l==="ZodObject"&&typeof s=="object"&&s!==null&&!Array.isArray(s)){let f=Et(s,d,o);Object.assign(r,f);}else if(l==="ZodDate"){let f=At(s);f!==null&&(r[o]=f);}else if(typeof s=="object"&&s!==null&&!Array.isArray(s)&&("_seconds"in s||typeof s.toDate=="function")){let f=At(s);r[o]=f??JSON.stringify(s,null,2);}else typeof s=="object"?r[o]=JSON.stringify(s,null,2):r[o]=String(s);}return r}function nt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?nt(n.nested,t):void 0}))}function $n(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[a,o]of Object.entries(e)){if(!a.startsWith("fv_"))continue;let s=a.slice(3);if(!t.has(s))continue;let d=(o??"").trim();if(!d)continue;let l=e[`fo_${s}`]??"==",f=n.has(l)?l:"==";r.push({field:s,op:f,value:d});}return r}function Rt(e){let t="__null__",n=r=>r===t?null:r==="true"?true:r==="false"?false:r!==""&&!isNaN(Number(r))?Number(r):r;return e.map(r=>{if(r.op==="array-contains-any"||r.op==="in"||r.op==="not-in"){let a=r.value.split(",").map(o=>o.trim()).filter(o=>o!==""&&o!==t).map(o=>n(o));return [r.field,r.op,a]}return [r.field,r.op,n(r.value)]})}function Tt(e,t,n=""){let r=[];for(let a of e){let o=n?`${n}.${a}`:a,s=t.shape[a];if(!s){r.push({name:o,zodType:"ZodString"});continue}let d=rt(s);if(d==="ZodObject"){let l=s;for(;;){let b=L(l);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")l=J(l);else break}let f=Y(l);r.push(...Tt(Object.keys(f),l,o));}else r.push({name:o,zodType:d,nullable:$t(s),enumValues:Ct(s)});}return r}function Cn(e,t){let n=t.split("."),r=e;for(let a of n){for(;;){let s=L(r);if(s==="ZodOptional"||s==="ZodNullable"||s==="ZodDefault")r=J(r);else break}let o=Y(r);if(!(a in o))return null;r=o[a];}return r}function ue(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let o of t){let s=o.indexOf(".");if(s===-1)n.push(o);else {let d=o.slice(0,s),l=o.slice(s+1);r.has(d)||r.set(d,[]),r.get(d).push(l);}}let a={};for(let o of n)o in e.shape&&(a[o]=e.shape[o]);for(let[o,s]of r){if(!(o in e.shape))continue;let d=e.shape[o];for(;;){let l=L(d);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")d=J(d);else break}if(L(d)!=="ZodObject"){a[o]=e.shape[o];continue}a[o]=ue(d,s);}return z.object(a)}function te(e,t){return Ze(e,t)}function Ot(e,t){let n=(m,u)=>{let x=te(m,t),i=Object.values(e).map(c=>({name:c.name,path:c.path}));P(u,kt(i,x));},r=async(m,u)=>{let x=m.params.repoName;if(!x){P(u,"Bad request",400);return}let i=e[x];if(!i){P(u,"Repository not found",404);return}let c=i.pageSize??25,p=m.query??{},k=p.cursor,A=p.dir==="prev"?"prev":"next",O=p.ob??"",w=p.od==="desc"?"desc":"asc",R=O?{field:O,dir:w}:void 0,S=parseInt(p.ps??""),C=Number.isFinite(S)&&S>0?Math.min(S,200):c,D=i.listColumns??Object.keys(i.schema.shape),I=i.documentKey??"docId",G=[I,...D.filter(H=>H!==I)];R&&(new Set([I,...D]).has(R.field)||(R=void 0));let E=i.filterableFields?(()=>{let H=[];for(let X of i.filterableFields)(X.includes(".")||D.includes(X))&&H.push(X);return H})():D,g=(()=>{let H=[];for(let X of E)if(X.includes(".")){let fe=Cn(i.schema,X);H.push({name:X,zodType:fe?rt(fe):"ZodString",nullable:fe?$t(fe):false,enumValues:fe?Ct(fe):void 0});}else H.push(...Tt([X],i.schema));return H})(),B=new Set(g.map(H=>H.name)),se=$n(p,B),ne=Rt(se),ve;if(k)try{let H=i.repo.ref;typeof H.doc=="function"&&(ve=await H.doc(k).get());}catch{}let[V,Re]=await Promise.all([i.repo.query.paginate({pageSize:C,cursor:ve,direction:A,...ne.length>0?{where:ne}:{},...R?{orderBy:[{field:R.field,direction:R.dir}]}:{}}).catch(H=>({queryError:Be(H,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:se,sort:R})})),i.repo.aggregate.count(ne.length>0?{where:ne}:{}).catch(()=>{})]),pe="queryError"in V,It=pe?[]:V.data,Zt=pe?"":V.nextCursor?.id??"",Ft=pe?"":V.prevCursor?.id??"",Dt=pe?V.queryError:void 0,zt=te(m,t);P(u,St(i.name,It,G,zt,{hasPrev:pe?false:V.hasPrevPage,hasNext:pe?false:V.hasNextPage,prevCursor:Ft,nextCursor:Zt},void 0,g,se,i.allowDelete??false,i.relationalMeta,R,C,Dt,i.isGroup,Re,i.mutableFields,i.schema,i.historyEnabled));},a=(m,u)=>{let x=m.params.repoName;if(!x){P(u,"Bad request",400);return}let i=e[x];if(!i){P(u,"Repository not found",404);return}let c=te(m,t),p=ue(i.schema,i.createFields),k=ee(p),A=`${c}/${i.name}/create`,O=ie(k,A,"POST","Create document");P(u,de(i.name,O,"create",null,c));},o=async(m,u)=>{let x=m.params.repoName;if(!x){P(u,"Bad request",400);return}let i=e[x];if(!i){P(u,"Repository not found",404);return}let c=te(m,t),p=m.body??{},k=tt(p,i.schema),A=ue(i.schema,i.createFields),O=A.safeParse(k);if(!O.success){let w=ee(A),R=`${c}/${i.name}/create`,S=ie(w,R,"POST","Create document"),C=O.error.issues.map(D=>`${D.path.join(".")}: ${D.message}`).join(", ");P(u,de(i.name,S,"create",null,c,{type:"error",message:`Validation error: ${C}`}),422);return}try{if(i.isGroup&&i.parentKeys&&i.parentKeys.length>0){let w={...O.data};i.createdKey&&(w[i.createdKey]=new Date);let R=i.parentKeys.filter(I=>!w[I]);if(R.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${R.join(", ")}`);let S=i.parentKeys.map(I=>w[I]),C=i.documentKey??"docId",D=w[C]||An();await i.repo.set(...S,D,w);}else await i.repo.create(O.data);et(u,`${c}/${i.name}?flash=created`);}catch(w){let R=ue(i.schema,i.createFields),S=ee(R),C=`${c}/${i.name}/create`,D=ie(S,C,"POST","Create document");P(u,de(i.name,D,"create",null,c,{type:"error",message:`Save error: ${w.message}`}),500);}},s=async(m,u)=>{let x=m.params.repoName,i=m.params.id;if(!x||!i){P(u,"Bad request",400);return}let c=e[x];if(!c){P(u,"Repository not found",404);return}let p=te(m,t),k=null;try{k=await ye(c,i);}catch(C){let D=Ye(c,i,C),I=le(C)?424:500;P(u,Pe("",{title:`Edit ${c.name} / ${i}`,basePath:p,breadcrumb:[{label:"Repositories",href:p},{label:c.name,href:`${p}/${c.name}`},{label:`Edit ${i}`}],flash:D}),I);return}if(!k){P(u,"Document not found",404);return}let A=Et(k,c.schema),O=ue(c.schema,c.mutableFields),w=nt(ee(O),A),R=`${p}/${c.name}/${encodeURIComponent(i)}/edit`,S=ie(w,R,"POST","Save changes");P(u,de(c.name,S,"edit",i,p));},d=async(m,u)=>{let x=m.params.repoName,i=m.params.id;if(!x||!i){P(u,"Bad request",400);return}let c=e[x];if(!c){P(u,"Repository not found",404);return}let p=te(m,t),k=m.body??{},A=tt(k,c.schema),O=ue(c.schema,c.mutableFields),R=O.partial().safeParse(A);if(!R.success){let S=Object.fromEntries(Object.entries(k).map(([E,g])=>[E,Array.isArray(g)?g.join(","):g??""])),C=nt(ee(O),S),D=`${p}/${c.name}/${encodeURIComponent(i)}/edit`,I=ie(C,D,"POST","Save changes"),G=R.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`).join(", ");P(u,de(c.name,I,"edit",i,p,{type:"error",message:`Validation error: ${G}`}),422);return}try{let S=await ye(c,i),C=(S&&Ie(S,c.pathKey))??[i];await c.repo.update(...C,R.data),et(u,`${p}/${c.name}?flash=updated`);}catch(S){let C=ue(c.schema,c.mutableFields),D=ee(C),I=`${p}/${c.name}/${encodeURIComponent(i)}/edit`,G=ie(D,I,"POST","Save changes"),E=le(S)?Ye(c,i,S):{type:"error",message:`Save error: ${S.message}`},g=le(S)?424:500;P(u,de(c.name,G,"edit",i,p,E),g);}},l=async(m,u)=>{let x=m.params.repoName,i=m.params.id;if(!x||!i){P(u,"Bad request",400);return}let c=e[x];if(!c){P(u,"Repository not found",404);return}if(!c.allowDelete){P(u,"Delete is not allowed for this repository",403);return}let p=te(m,t);try{let k=await ye(c,i),A=(k&&Ie(k,c.pathKey))??[i];await c.repo.delete(...A),et(u,`${p}/${c.name}?flash=deleted`);}catch(k){let A=le(k)?Ye(c,i,k):{type:"error",message:`Delete error: ${k.message}`},O=le(k)?424:500;P(u,Pe("",{title:`Delete ${c.name} / ${i}`,basePath:p,breadcrumb:[{label:"Repositories",href:p},{label:c.name,href:`${p}/${c.name}`},{label:`Delete ${i}`}],flash:A}),O);}},f=async(m,u)=>{let x=m.params.repoName;if(!x){P(u,"Bad request",400);return}let i=e[x];if(!i){P(u,"Repository not found",404);return}let c=te(m,t),p=m.query,k=p?.type==="many"?"many":"one",A=Math.max(1,Math.min(100,Number(p?.ps??25)||25)),O=i.listColumns??Object.keys(Y(i.schema)),{PanelOne:w,PanelMany:R}=await Promise.resolve().then(()=>(qe(),yt)),{renderToString:S}=await import('hono/jsx/dom/server');if(k==="one"){let g=String(p?.id??"");if(!g){P(u,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let B=await ye(i,g),se=S(w({doc:B,repoName:i.name,basePath:c,schema:i.schema,columns:O}));P(u,se);}catch(B){P(u,`<div class='p-6 text-error text-sm'>Error: ${B.message}</div>`,500);}return}let C=String(p?.fk??""),D=String(p?.fv??"");if(!C||!D){P(u,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let I=p?.cursor??"",G=p?.dir==="prev"?"prev":"next",E;if(I)try{let g=i.repo.ref;typeof g.doc=="function"&&(E=await g.doc(I).get());}catch{}try{let g=await i.repo.query.paginate({pageSize:A,cursor:E,direction:G,where:[[C,"==",En(D)]]}),B=S(R({docs:g.data,repoName:i.name,basePath:c,fk:C,fv:D,columns:O,schema:i.schema,pagination:{hasPrev:g.hasPrevPage,hasNext:g.hasNextPage,prevCursor:g.prevCursor?.id??"",nextCursor:g.nextCursor?.id??"",pageSize:A}}));P(u,B);}catch(g){P(u,`<div class='p-6 text-error text-sm'>Error: ${g.message}</div>`,500);}},b=async(m,u)=>{let x=[];for(let i of u){let c;if(m.isGroup||m.parentKeys?.length){let p=await ye(m,i);c=p?Ie(p,m.pathKey):void 0;}c||(c=[i]);try{let p=m.repo.documentRef(...c);p&&x.push(p);}catch{}}return x},y=async(m,u)=>{let x=Rt(u),i=m.documentKey??"docId",c=[],p;for(;;){let k=await m.repo.query.paginate({pageSize:500,cursor:p,direction:"next",...x.length>0?{where:x}:{}});for(let A of k.data){let O=String(A[i]??A.id??"");O&&c.push(O);}if(!k.hasNextPage||!k.nextCursor)break;p=k.nextCursor;}return c},N=async(m,u)=>{let x=m.params.repoName;if(!x){W(u,{error:"Bad request"},400);return}let i=e[x];if(!i){W(u,{error:"Repository not found"},404);return}if(!i.allowDelete){W(u,{error:"Delete is not allowed for this repository"},403);return}let c=m.body??{};try{let p=await h(i,c);if(p.length===0){W(u,{deleted:0});return}let k=await b(i,p);for(let A=0;A<k.length;A+=500)await i.repo.bulk.delete(k.slice(A,A+500));W(u,{deleted:k.length});}catch(p){W(u,{error:p.message},500);}},T=async(m,u)=>{let x=m.params.repoName;if(!x){W(u,{error:"Bad request"},400);return}let i=e[x];if(!i){W(u,{error:"Repository not found"},404);return}let c=m.body??{},p=String(c.field??"");if(!p){W(u,{error:"Missing 'field'"},400);return}if(!i.mutableFields||!i.mutableFields.includes(p)){W(u,{error:`Field '${p}' is not bulk-updatable`},403);return}let k=i.schema.shape?.[p],A=c.value;if(k){let O=k.safeParse(c.value);if(!O.success){W(u,{error:`Invalid value for '${p}': ${O.error.message}`},400);return}A=O.data;}try{let O=await h(i,c);if(O.length===0){W(u,{updated:0});return}let R=(await b(i,O)).map(S=>({docRef:S,data:{[p]:A}}));for(let S=0;S<R.length;S+=500)await i.repo.bulk.update(R.slice(S,S+500));W(u,{updated:R.length});}catch(O){W(u,{error:O.message},500);}};async function h(m,u){if(u.selectAll){let x=q(u.filters,m);return await y(m,x)}return Array.isArray(u.ids)?u.ids.filter(x=>typeof x=="string"&&!!x):[]}function q(m,u){if(!Array.isArray(m))return [];let x=new Set((u.filterableFields??Object.keys(Y(u.schema))).map(p=>String(p))),i=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),c=[];for(let p of m)p&&typeof p=="object"&&typeof p.field=="string"&&x.has(p.field)&&typeof p.value=="string"&&i.has(String(p.op))&&c.push({field:p.field,op:p.op,value:p.value});return c}return {handleDashboard:n,handleList:r,handleCreateForm:a,handleCreateSubmit:o,handleEditForm:s,handleEditSubmit:d,handleDelete:l,handlePanel:f,handleBulkDelete:N,handleBulkUpdate:T,handleHistory:async(m,u)=>{let x=m.params.repoName,i=m.params.id;if(!x||!i){P(u,"Bad request",400);return}let c=e[x];if(!c){P(u,"Repository not found",404);return}if(!c.historyEnabled||!c.repo.history){P(u,"History not enabled for this repository",404);return}let p=te(m,t),k=c.historySubcollection??"history",A=[i];try{let g=await ye(c,i),B=g?Ie(g,c.pathKey):void 0;B&&B.length>0&&(A=B);}catch{}let O=parseInt(String(m.query?.limit??"")),w=Number.isFinite(O)&&O>0?Math.min(O,500):100,R=[],S;try{R=await c.repo.history.list(...A,{limit:w});}catch(g){S=g.message;}let C=g=>String(g??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),D=g=>{if(g===void 0)return '<span class="opacity-40">undefined</span>';if(g===null)return '<span class="opacity-40">null</span>';if(typeof g=="object")try{return `<code class="text-xs">${C(JSON.stringify(g))}</code>`}catch{return C(String(g))}return C(String(g))},I=g=>g?typeof g.toDate=="function"?g.toDate().toISOString():g instanceof Date?g.toISOString():C(String(g)):"",G=g=>`<span class="badge badge-sm ${g==="create"?"badge-success":g==="delete"?"badge-error":"badge-info"}">${C(g)}</span>`,E="";if(E+='<div class="flex items-center justify-between mb-4">',E+=`<a href="${p}/${c.name}/${encodeURIComponent(i)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,E+=`<a href="${p}/${c.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,E+="</div>",E+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${C(k)}</code> \xB7 Showing up to ${w} entries.</p>`,S)E+=`<div class="alert alert-error mb-4">${C(S)}</div>`;else if(R.length===0)E+='<div class="alert">No history entries found.</div>';else {E+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',E+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let g of R){let B=g.meta??{},se=[B.reason,B.comment].filter(V=>V!=null&&V!=="").map(V=>C(String(V))).join(" \u2014 "),ne="",ve=Object.keys(g.changes??{});ve.length===0?ne='<span class="opacity-40">\u2014</span>':ne='<ul class="space-y-1">'+ve.map(V=>{let Re=g.changes[V];return `<li><strong>${C(V)}</strong>: ${D(Re.oldValue)} \u2192 ${D(Re.newValue)}</li>`}).join("")+"</ul>",E+="<tr>",E+=`<td class="whitespace-nowrap text-xs font-mono">${C(I(g.historySetAt))}</td>`,E+=`<td>${G(g.operation??"update")}</td>`,E+=`<td class="text-xs">${C(B.userEmail??B.userId??"")}</td>`,E+=`<td class="text-xs">${se}</td>`,E+=`<td>${ne}</td>`,E+="</tr>";}E+="</tbody></table></div>";}P(u,Pe(E,{title:`History \u2014 ${c.name} / ${i}`,basePath:p,breadcrumb:[{label:"Repositories",href:p},{label:c.name,href:`${p}/${c.name}`},{label:`History ${i}`}]}));}}}function W(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function En(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}function Tn(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,r=>r===":"?r:`\\${r}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(r,a)=>(t.push(a),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function On(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var Ae=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,r)=>{console.error("[MiniRouter]",t),r.status(500).send("Internal Server Error");};}use(t){return this.middlewares.push(t),this}get(t,n){return this.addRoute("GET",t,n)}post(t,n){return this.addRoute("POST",t,n)}put(t,n){return this.addRoute("PUT",t,n)}patch(t,n){return this.addRoute("PATCH",t,n)}delete(t,n){return this.addRoute("DELETE",t,n)}onNotFound(t){return this.notFoundHandler=t,this}onError(t){return this.errorHandler=t,this}addRoute(t,n,r){let{pattern:a,paramNames:o}=Tn(n);return this.routes.push({method:t.toUpperCase(),pattern:a,paramNames:o,handler:r}),this}async handle(t,n){let r=(t.method??"GET").toUpperCase(),a=On(t),o=null,s={};for(let f of this.routes){if(f.method!==r)continue;let b=a.match(f.pattern);if(b){o=f,s={},f.paramNames.forEach((y,N)=>{s[y]=decodeURIComponent(b[N+1]??"");});break}}let d=Object.assign(t,{params:s}),l=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,l);}catch(f){this.errorHandler(f,t,n);}}async runMiddlewareChain(t,n,r){let a=0,o=async()=>{if(a<this.middlewares.length){let s=this.middlewares[a++];await s(t,n,o);}else await r(t,n);};await o();}};var _t="https://cdn.jsdelivr.net",Nt="https://www.gstatic.com",_n=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${_t} ${Nt}`,`style-src 'self' 'unsafe-inline' ${_t}`,`connect-src 'self' ${Nt} https://*.googleapis.com https://*.firebaseio.com https://identitytoolkit.googleapis.com`,"img-src 'self' data:","font-src 'self' data:","frame-ancestors 'none'","base-uri 'self'","form-action 'self'"].join("; ");function Pt(e={}){let t=e.csp===void 0?_n:e.csp,n=e.frameOptions===void 0?"DENY":e.frameOptions,r=e.referrerPolicy===void 0?"no-referrer":e.referrerPolicy,a=e.cacheControl===void 0?"private, no-store":e.cacheControl;return async(o,s,d)=>{typeof s?.setHeader=="function"&&(s.setHeader("X-Content-Type-Options","nosniff"),n&&s.setHeader("X-Frame-Options",n),r&&s.setHeader("Referrer-Policy",r),a&&s.setHeader("Cache-Control",a),t&&s.setHeader("Content-Security-Policy",t)),await d();}}async function Nn(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Pn(e){let t={};if(!e)return t;for(let n of e.split("&")){let r=n.indexOf("=");if(r===-1)continue;let a=decodeURIComponent(n.slice(0,r).replace(/\+/g," ")),o=decodeURIComponent(n.slice(r+1).replace(/\+/g," ")),s=t[a];s===void 0?t[a]=o:Array.isArray(s)?s.push(o):t[a]=[s,o];}return t}function ta(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:a,auth:o,middleware:s=[],httpsOptions:d}=e,l=t==="/"?"":t.replace(/\/$/,""),f={};for(let[T,h]of Object.entries(n)){let q=h.schema??h.repo.schema??null;if(!q)throw new Error(`[createAdminServer] Repository "${T}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let j,m,u;if(h.fieldsConfig){let c=h.fieldsConfig;j=[],m=[],u=[];for(let[p,k]of Object.entries(c))for(let A of k)A==="filterable"?j.push(p):A==="mutable"?m.push(p):A==="create"&&u.push(p);j.length===0&&(j=void 0),m.length===0&&(m=void 0),u.length===0&&(u=void 0);}let x=(()=>{let c=h.repo._parentKeys;return c&&c.length>0?c:void 0})();if(x&&u)for(let c of x)u.includes(c)||u.push(c);let i={name:T,path:h.path,repo:h.repo,schema:q,documentKey:h.documentKey??"docId",pathKey:h.repo._pathKey??void 0,isGroup:!!h.repo._isGroup,parentKeys:x,createdKey:h.repo._createdKey??void 0,listColumns:h.listColumns,pageSize:h.pageSize,filterableFields:j,mutableFields:m,createFields:u,allowDelete:h.allowDelete??false,historyEnabled:!!h.repo.history,historySubcollection:(h.repo.history&&h.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!h.relationalFields||h.relationalFields.length===0)return;let c=h.repo.relationalKeys??{},p=[];for(let k of h.relationalFields){let A=c[k.key];A&&p.push({key:k.key,column:k.column,targetRepo:String(A.repo),targetKey:String(A.key),type:A.type});}return p.length>0?p:void 0})()};f[T]=i;}let b=Ot(f,l),y=new Ae;if(a!==false&&y.use(Pt(a===void 0?{}:a)),r&&y.use(async(T,h,q)=>{let j=T,m=String(j.headers?.["content-type"]??"");if(m.includes("application/x-www-form-urlencoded")){let u=await Nn(j);T.body=Pn(u);}else if(m.includes("application/json")&&typeof j.body=="string")try{T.body=JSON.parse(j.body);}catch{}await q();}),o)if(Fe(o)){for(let T of o.routes){let h=`${l}${T.path}`;T.method==="GET"?y.get(h,T.handler):y.post(h,T.handler);}y.use(o.middleware);}else if(typeof o=="function")y.use(o);else {let T=o.realm??"Admin",h="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");y.use((q,j,m)=>{if((q.headers?.authorization??"")!==h){j.status(401).set("WWW-Authenticate",`Basic realm="${T}"`).set("Content-Type","text/plain").send("Unauthorized");return}m();});}for(let T of s)y.use(T);y.get(`${l}/`,b.handleDashboard),y.get(`${l}`,b.handleDashboard),y.get(`${l}/:repoName/_panel`,b.handlePanel),y.post(`${l}/:repoName/_bulk/delete`,b.handleBulkDelete),y.post(`${l}/:repoName/_bulk/update`,b.handleBulkUpdate),y.get(`${l}/:repoName`,b.handleList),y.get(`${l}/:repoName/create`,b.handleCreateForm),y.post(`${l}/:repoName/create`,b.handleCreateSubmit),y.get(`${l}/:repoName/:id/edit`,b.handleEditForm),y.post(`${l}/:repoName/:id/edit`,b.handleEditSubmit),y.get(`${l}/:repoName/:id/history`,b.handleHistory),y.post(`${l}/:repoName/:id/delete`,b.handleDelete);let N=async(T,h)=>{await y.handle(T,h);};return d&&(N.httpsOptions=d),N}
1064
- export{Ae as MiniRouter,ta as createAdminServer};//# sourceMappingURL=index.js.map
1063
+ `;function Ne(){return jsx("script",{dangerouslySetInnerHTML:{__html:yt}})}Ve();function ae(e){return "<!DOCTYPE html>"+renderToString(e)}var fn=["corporate","silk","dark"],mn=()=>jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:"size-4",children:[jsx("circle",{cx:"12",cy:"12",r:"4"}),jsx("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsx("ul",{tabIndex:0,class:"dropdown-content menu menu-sm bg-base-100 text-base-content rounded-box z-50 mt-2 w-40 p-1 shadow-lg border border-base-300",children:fn.map(e=>jsx("li",{children:jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsx("span",{children:e}),jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),se=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:a,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("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),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:[jsxs("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"})}),jsx("div",{class:"flex-none",children:jsx(mn,{})})]}),jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsx("ul",{children:r.map((o,d)=>o.href?jsx("li",{children:jsx("a",{href:o.href,children:o.label})},d):jsx("li",{class:"text-base-content/60",children:o.label},d))})}),jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),a&&jsxs("div",{role:"alert",class:`alert ${a.type==="success"?"alert-success":a.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsx("span",{class:"flex-1",children:a.message}),a.action&&jsx("a",{href:a.action.href,...a.action.external?{target:"_blank",rel:"noopener noreferrer"}:{},class:"btn btn-sm btn-outline",children:a.action.label})]}),t]}),jsx(qe,{basePath:s}),jsx(Ne,{})]})]})};function Je(e,t){return ae(jsx(se,{opts:t,children:jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Ke(e,t){return ae(jsx(se,{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 kt=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],bn=[{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"}],hn=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function gn(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return bn;case "ZodBoolean":return kt;case "ZodArray":return hn;default:return kt}}var oe="__null__";function yn(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="${oe}"]');if(!o){o=document.createElement('option');o.value='${oe}';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='${oe}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${oe}"][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!=='${oe}')?i.dataset._prev:'';}}})(this)`}function vn(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 Ae({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:yn(e)}),jsx("span",{children:"\u2205"})]})}function xn({col:e,active:t}){let n=t?.value??"",r=n===oe,a=`fv_input_${e.name.replace(/\./g,"__")}`,s=t?.op,o=s==="in"||s==="not-in";if(e.enumValues&&e.enumValues.length>0){if(o){let d=new Set(n.split(",").map(f=>f.trim()).filter(Boolean)),l=`eg_${e.name.replace(/\./g,"__")}`;return jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsx("input",{type:"hidden",id:a,name:`fv_${e.name}`,value:n}),e.enumValues.map(f=>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:f,checked:d.has(f),"data-enum-group":l,onchange:vn(a,l)}),jsx("span",{children:f})]},f))]})}return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:a,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(d=>jsx("option",{value:d,selected:n===d,children:d},d)),e.nullable&&jsx("option",{value:oe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsx(Ae,{inputId:a,active:r})]})}if(e.zodType==="ZodBoolean")return jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxs("select",{id:a,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsx("option",{value:"true",selected:n==="true",children:"true"}),jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsx("option",{value:oe,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsx(Ae,{inputId:a,active:r})]});if(e.zodType==="ZodArray"){let d=t?.op==="array-contains-any";return jsx("input",{id:a,type:"text",name:`fv_${e.name}`,value:n,placeholder:d?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:a,type:r?"text":"number",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"number":void 0}),e.nullable&&jsx(Ae,{inputId:a,active:r})]}):e.zodType==="ZodDate"?jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:a,type:r?"text":"datetime-local",name:`fv_${e.name}`,value:n,class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0,"data-_type":r?"datetime-local":void 0}),e.nullable&&jsx(Ae,{inputId:a,active:r})]}):jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsx("input",{id:a,type:"text",name:`fv_${e.name}`,value:n,placeholder:"value",class:"input input-sm input-bordered w-full",readOnly:r||void 0,style:r?"opacity:0.55":void 0}),e.nullable&&jsx(Ae,{inputId:a,active:r})]})}function Ge({action:e,columnMeta:t,activeFilters:n,isGroup:r}){let a=Object.fromEntries(n.map(l=>[l.field,l])),s=n.length>0,o=n.length>=2||r&&s,d=t.filter(l=>l.zodType!=="ZodObject"&&l.zodType!=="ZodRecord");return jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:s?true:void 0,children:[jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",s&&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:d.map(l=>{let f=gn(l.zodType),b=a[l.name],y=b?.op??f[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:l.name}),jsxs("div",{class:"flex gap-1.5",children:[f.length>1?jsx("select",{name:`fo_${l.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:f.map(O=>jsx("option",{value:O.value,selected:O.value===y,children:O.label},O.value))}):jsx("input",{type:"hidden",name:`fo_${l.name}`,value:f[0].value}),jsx(xn,{col:l,active:b})]})]},l.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"}),s&&jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),o&&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"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function We(e,t,n,r,a,s){let o=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,d=n==="create"?[{label:"Repositories",href:a},{label:e,href:`${a}/${e}`},{label:"New document"}]:[{label:"Repositories",href:a},{label:e,href:`${a}/${e}`},{label:`Edit ${r??""}`}];return ae(jsx(se,{opts:{title:o,breadcrumb:d,basePath:a,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}})})})}))}_e();Ue();function Qe(e,t,n){let r=new URLSearchParams;for(let a of e)r.set(`fv_${a.field}`,a.value),r.set(`fo_${a.field}`,a.op);return t&&(r.set("ob",t.field),r.set("od",t.dir)),n&&r.set("ps",String(n)),r}function St(e,t,n,r,a){let s=Qe(e,r,a);return s.set("cursor",t),s.set("dir",n),`?${s.toString()}`}function wn(e,t,n,r){let a=Qe(n,void 0,r);return t?.field===e?t.dir==="asc"&&(a.set("ob",e),a.set("od","desc")):(a.set("ob",e),a.set("od","asc")),`?${a.toString()}`}function kn(e,t,n){return `?${Qe(t,n,e).toString()}`}function Xe(e,t,n,r,a,s,o=[],d=[],l=false,f=[],b,y,O,$,g,U,z,B=false){let m=`${r}/${e}`,p=`${m}/create`,k={};if(z)for(let h of n)k[h]=ge(ye(z,h));let i=(U??[]).filter(h=>{let N=k[h]??ge(ye(z,h));return N==="string"||N==="number"||N==="bigint"||N==="boolean"||N==="enum"||N==="literal"}),c=i.length>0,u=l,w=u||c,I=i.map(h=>{let N=ye(z,h),S=ge(N),A=o.find(E=>E.name===h);return {name:h,type:S,enumValues:A?.enumValues??null,nullable:A?.nullable??false}});return ae(jsxs(se,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:s},children:[o.length>0&&jsx(Ge,{action:m,columnMeta:o,activeFilters:d,isGroup:$}),O&&jsxs("div",{role:"alert",class:`alert ${O.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:O.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:O.type==="index"?"Composite index required":"Query failed"}),jsx("div",{class:"text-sm",children:O.message})]}),O.indexUrl&&jsx("a",{href:O.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","data-frs-toolbar":true,children:[jsxs("div",{class:"flex items-center gap-3",children:[jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof g=="number"&&jsxs(Fragment,{children:[" ","of"," ",jsx("span",{class:"font-semibold text-base-content/80",children:g})]})," ","document",(typeof g=="number"?g: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(h=>jsx("a",{href:kn(h,d,b),class:`join-item btn btn-xs ${y===h?"btn-active btn-primary":"btn-outline"}`,children:h},h))})]})]}),jsx("a",{href:p,class:"btn btn-primary btn-sm",children:"+ New"})]}),w&&jsxs("div",{class:"hidden mb-3 alert alert-info py-2 px-3","data-frs-bulk-bar":true,"data-frs-repo":e,"data-frs-total":typeof g=="number"?String(g):"","data-frs-page-size":String(y??t.length),"data-frs-allow-delete":u?"1":"0","data-frs-allow-update":c?"1":"0","data-frs-fields":JSON.stringify(I),"data-frs-filters":JSON.stringify(d),children:[jsxs("div",{class:"flex-1 text-sm",children:[jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof g=="number"&&g>t.length&&jsxs("button",{type:"button",class:"ml-3 link text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",g," matching documents"]}),jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",g??"?"," matching documents are selected."," ",jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxs("div",{class:"flex gap-2",children:[c&&jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),u&&jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),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:[w&&jsx("th",{class:"w-8",children:jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((h,N)=>{let S=b?.field===h,A=S?b.dir==="asc"?" \u25B2":" \u25BC":"";return jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxs("a",{href:wn(h,b,d,y),class:`hover:text-base-content inline-flex items-center gap-0.5${S?" text-primary font-bold":""}`,children:[h,A]})},N)}),f.map((h,N)=>jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:h.column},`rel-${N}`)),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+f.length+1+(w?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((h,N)=>{let S=String(h.docId??h.id??""),A=`${r}/${e}/${encodeURIComponent(S)}/edit`,E=`${r}/${e}/${encodeURIComponent(S)}/delete`;return jsxs("tr",{class:"hover","data-frs-row-id":S,children:[w&&jsx("td",{class:"align-middle py-2",children:jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:S,"aria-label":`Select ${S}`})}),n.map((C,j)=>{let M=h[C],P=k[C],v=P?Se(P,M):null;return jsx("td",{class:"align-top py-2",children:jsx(he,{val:M,mismatch:v})},j)}),f.map((C,j)=>{let M=h[C.key];if(M==null||M==="")return jsx("td",{class:"py-2"},`rel-${j}`);let P=C.type==="one"?`${r}/${C.targetRepo}/${encodeURIComponent(String(M))}/edit`:`${r}/${C.targetRepo}?fv_${C.targetKey}=${encodeURIComponent(String(M))}`;return jsx("td",{class:"align-middle py-2",children:jsx("a",{href:P,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":C.type,"data-frs-rel-repo":C.targetRepo,"data-frs-rel-fk":C.targetKey,"data-frs-rel-val":String(M),"data-frs-rel-label":C.column,children:C.column})},`rel-${j}`)}),jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxs("div",{class:"flex gap-1 justify-end",children:[jsx("a",{href:A,class:"btn btn-xs btn-outline",children:"Edit"}),B&&jsx("a",{href:`${r}/${e}/${encodeURIComponent(S)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),l&&jsx("form",{method:"post",action:E,onsubmit:"return confirm('Delete this document?')",children:jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},N)})})]})}),(a.hasPrev||a.hasNext)&&jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxs("div",{class:"flex justify-center items-center gap-2",children:[a.hasPrev?jsx("a",{href:St(d,a.prevCursor,"prev",b,y),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),a.hasNext?jsx("a",{href:St(d,a.nextCursor,"next",b,y),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof g=="number"&&jsxs("div",{class:"text-xs text-base-content/50",children:[g," total document",g!==1?"s":"",d.length>0?" matching filters":""]})]}),w&&c&&jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxs("div",{class:"modal-box",children:[jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsx("p",{class:"text-sm text-base-content/60 mb-4","data-frs-bulk-update-summary":true,children:"Update one field on the selected documents."}),jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxs("label",{class:"form-control w-full mb-3",children:[jsx("div",{class:"label",children:jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),i.map(h=>jsx("option",{value:h,children:h},h))]})]}),jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxs("div",{class:"modal-action",children:[jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsx("form",{method:"dialog",class:"modal-backdrop",children:jsx("button",{children:"close"})})]})]}))}function Ie(e,t){return Je(e,t)}function At(e,t){return Ke(e,t)}function Rt(e,t,n,r,a,s,o,d,l,f,b,y,O,$,g,U,z,B){return Xe(e,t,n,r,a,s,o,d,l,f,b,y,O,$,g,U,z,B)}function ue(e,t,n,r,a,s){return We(e,t,n,r,a,s)}var Ye="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function $n(){let e="";for(;e.length<20;){let t=randomBytes(20);for(let n=0;n<t.length&&e.length<20;n++){let r=t[n];r>=Ye.length*4||(e+=Ye.charAt(r%Ye.length));}}return e}function Ze(e,t){if(!t)return;let n=e[t];if(typeof n!="string"||!n)return;let r=n.split("/").filter(Boolean),a=[];for(let s=1;s<r.length;s+=2)a.push(r[s]);return a.length>0?a:void 0}async function ve(e,t){let n=e.documentKey??"docId",r=`by${n.charAt(0).toUpperCase()}${n.slice(1)}`;if(typeof e.repo.get[r]=="function")try{let s=await e.repo.get[r](t);if(s)return s}catch{}return (await e.repo.query.by({where:[[n,"==",t]],limit:1}))[0]??null}function et(e,t,n){let r=e.documentKey??"docId",a=Me(n,{ref:e.repo.ref,path:e.path,isGroup:!!e.isGroup,filters:[{field:r,op:"==",value:t}]});return a.type==="index"?{type:"warning",message:"Loading this document requires a composite index that does not exist yet.",...a.indexUrl?{action:{href:a.indexUrl,label:"Create Index \u2192",external:true}}:{}}:{type:"error",message:a.message}}function _(e,t,n=200){e.status(n).set("Content-Type","text/html; charset=utf-8").send(t);}function tt(e,t){e.status(302).set("Location",t).send("");}function nt(e,t){let n=t.shape,r={};for(let[a,s]of Object.entries(n)){let o=at(s);if(o==="ZodObject"){if(e[a+"__isnull"]==="1"){r[a]=null;continue}let f={},b=false;for(let[$,g]of Object.entries(e))$.startsWith(`${a}.`)&&(f[$.slice(a.length+1)]=g,b=true);if(b){let $=s;for(;;){let g=L($);if(g==="ZodOptional"||g==="ZodNullable"||g==="ZodDefault")$=G($);else break}r[a]=nt(f,$);continue}let y=e[a],O=Array.isArray(y)?y[y.length-1]:y;if(O)try{r[a]=JSON.parse(O);}catch{r[a]=O;}continue}let d=e[a],l=Array.isArray(d)?d[d.length-1]:d;if(e[a+"__isnull"]==="1"){r[a]=null;continue}if(l===void 0||l===""){o==="ZodBoolean"&&(r[a]=false);continue}switch(o){case "ZodBoolean":l==="__null__"?r[a]=null:r[a]=l==="true"||l==="on"||l==="1";break;case "ZodNumber":case "ZodBigInt":r[a]=Number(l);break;case "ZodDate":r[a]=new Date(l);break;case "ZodArray":try{r[a]=JSON.parse(l);}catch{r[a]=l;}break;default:if(l.startsWith("{")||l.startsWith("["))try{r[a]=JSON.parse(l);break}catch{}r[a]=l;}}return r}function $t(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let r=new Date(e);isNaN(r.getTime())||(t=r);}if(!t||isNaN(t.getTime()))return null;let n=r=>String(r).padStart(2,"0");return `${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function at(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return n}}function Cn(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function Et(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable")return true;if(n==="ZodDefault"){t=G(t);continue}return false}}function Tt(e){let t=Cn(e),n=L(t);if(n==="ZodEnum"){let r=we(t);return r.length>0?r:void 0}if(n==="ZodNativeEnum"){let r=ke(t),a=Object.values(r).filter(s=>typeof s=="string");return a.length>0?a:void 0}if(n==="ZodLiteral"){let r=Ee(t);return typeof r=="string"?[r]:void 0}}function Ot(e,t,n=""){let r={};for(let a of Object.keys(t.shape)){let s=n?`${n}.${a}`:a,o=e[a];if(o===null){r[s]="__null__";continue}if(o===void 0)continue;let d=t.shape[a];for(;;){let f=L(d);if(f==="ZodOptional"||f==="ZodNullable"||f==="ZodDefault")d=G(d);else break}let l=L(d);if(l==="ZodObject"&&typeof o=="object"&&o!==null&&!Array.isArray(o)){let f=Ot(o,d,s);Object.assign(r,f);}else if(l==="ZodDate"){let f=$t(o);f!==null&&(r[s]=f);}else if(typeof o=="object"&&o!==null&&!Array.isArray(o)&&("_seconds"in o||typeof o.toDate=="function")){let f=$t(o);r[s]=f??JSON.stringify(o,null,2);}else typeof o=="object"?r[s]=JSON.stringify(o,null,2):r[s]=String(o);}return r}function rt(e,t){return e.map(n=>({...n,defaultValue:t[n.name]??n.defaultValue,nested:n.nested?rt(n.nested,t):void 0}))}function En(e,t){let n=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),r=[];for(let[a,s]of Object.entries(e)){if(!a.startsWith("fv_"))continue;let o=a.slice(3);if(!t.has(o))continue;let d=(s??"").trim();if(!d)continue;let l=e[`fo_${o}`]??"==",f=n.has(l)?l:"==";r.push({field:o,op:f,value:d});}return r}function Ct(e){let t="__null__",n=r=>r===t?null:r==="true"?true:r==="false"?false:r!==""&&!isNaN(Number(r))?Number(r):r;return e.map(r=>{if(r.op==="array-contains-any"||r.op==="in"||r.op==="not-in"){let a=r.value.split(",").map(s=>s.trim()).filter(s=>s!==""&&s!==t).map(s=>n(s));return [r.field,r.op,a]}return [r.field,r.op,n(r.value)]})}function _t(e,t,n=""){let r=[];for(let a of e){let s=n?`${n}.${a}`:a,o=t.shape[a];if(!o){r.push({name:s,zodType:"ZodString"});continue}let d=at(o);if(d==="ZodObject"){let l=o;for(;;){let b=L(l);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")l=G(l);else break}let f=ee(l);r.push(..._t(Object.keys(f),l,s));}else r.push({name:s,zodType:d,nullable:Et(o),enumValues:Tt(o)});}return r}function Tn(e,t){let n=t.split("."),r=e;for(let a of n){for(;;){let o=L(r);if(o==="ZodOptional"||o==="ZodNullable"||o==="ZodDefault")r=G(r);else break}let s=ee(r);if(!(a in s))return null;r=s[a];}return r}function pe(e,t){if(!t||t.length===0)return e;let n=[],r=new Map;for(let s of t){let o=s.indexOf(".");if(o===-1)n.push(s);else {let d=s.slice(0,o),l=s.slice(o+1);r.has(d)||r.set(d,[]),r.get(d).push(l);}}let a={};for(let s of n)s in e.shape&&(a[s]=e.shape[s]);for(let[s,o]of r){if(!(s in e.shape))continue;let d=e.shape[s];for(;;){let l=L(d);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")d=G(d);else break}if(L(d)!=="ZodObject"){a[s]=e.shape[s];continue}a[s]=pe(d,o);}return z.object(a)}function ne(e,t,n){return Fe(e,t,n)}function Nt(e,t,n){let r=(m,p)=>{let k=ne(m,t,n),i=Object.values(e).map(c=>({name:c.name,path:c.path}));_(p,At(i,k));},a=async(m,p)=>{let k=m.params.repoName;if(!k){_(p,"Bad request",400);return}let i=e[k];if(!i){_(p,"Repository not found",404);return}let c=i.pageSize??25,u=m.query??{},w=u.cursor,I=u.dir==="prev"?"prev":"next",h=u.ob??"",N=u.od==="desc"?"desc":"asc",S=h?{field:h,dir:N}:void 0,A=parseInt(u.ps??""),E=Number.isFinite(A)&&A>0?Math.min(A,200):c,C=i.listColumns??Object.keys(i.schema.shape),j=i.documentKey??"docId",M=[j,...C.filter(V=>V!==j)];S&&(new Set([j,...C]).has(S.field)||(S=void 0));let P=i.filterableFields?(()=>{let V=[];for(let Y of i.filterableFields)(Y.includes(".")||C.includes(Y))&&V.push(Y);return V})():C,v=(()=>{let V=[];for(let Y of P)if(Y.includes(".")){let me=Tn(i.schema,Y);V.push({name:Y,zodType:me?at(me):"ZodString",nullable:me?Et(me):false,enumValues:me?Tt(me):void 0});}else V.push(..._t([Y],i.schema));return V})(),q=new Set(v.map(V=>V.name)),ie=En(u,q),re=Ct(ie),xe;if(w)try{let V=i.repo.ref;typeof V.doc=="function"&&(xe=await V.doc(w).get());}catch{}let[K,$e]=await Promise.all([i.repo.query.paginate({pageSize:E,cursor:xe,direction:I,...re.length>0?{where:re}:{},...S?{orderBy:[{field:S.field,direction:S.dir}]}:{}}).catch(V=>({queryError:Me(V,{ref:i.repo.ref,path:i.path,isGroup:!!i.isGroup,filters:ie,sort:S})})),i.repo.aggregate.count(re.length>0?{where:re}:{}).catch(()=>{})]),fe="queryError"in K,Ft=fe?[]:K.data,Dt=fe?"":K.nextCursor?.id??"",zt=fe?"":K.prevCursor?.id??"",jt=fe?K.queryError:void 0,Lt=ne(m,t,n);_(p,Rt(i.name,Ft,M,Lt,{hasPrev:fe?false:K.hasPrevPage,hasNext:fe?false:K.hasNextPage,prevCursor:zt,nextCursor:Dt},void 0,v,ie,i.allowDelete??false,i.relationalMeta,S,E,jt,i.isGroup,$e,i.mutableFields,i.schema,i.historyEnabled));},s=(m,p)=>{let k=m.params.repoName;if(!k){_(p,"Bad request",400);return}let i=e[k];if(!i){_(p,"Repository not found",404);return}let c=ne(m,t,n),u=pe(i.schema,i.createFields),w=te(u),I=`${c}/${i.name}/create`,h=le(w,I,"POST","Create document");_(p,ue(i.name,h,"create",null,c));},o=async(m,p)=>{let k=m.params.repoName;if(!k){_(p,"Bad request",400);return}let i=e[k];if(!i){_(p,"Repository not found",404);return}let c=ne(m,t,n),u=m.body??{},w=nt(u,i.schema),I=pe(i.schema,i.createFields),h=I.safeParse(w);if(!h.success){let N=te(I),S=`${c}/${i.name}/create`,A=le(N,S,"POST","Create document"),E=h.error.issues.map(C=>`${C.path.join(".")}: ${C.message}`).join(", ");_(p,ue(i.name,A,"create",null,c,{type:"error",message:`Validation error: ${E}`}),422);return}try{if(i.isGroup&&i.parentKeys&&i.parentKeys.length>0){let N={...h.data};i.createdKey&&(N[i.createdKey]=new Date);let S=i.parentKeys.filter(j=>!N[j]);if(S.length>0)throw new Error(`Missing parent key(s) for subcollection create: ${S.join(", ")}`);let A=i.parentKeys.map(j=>N[j]),E=i.documentKey??"docId",C=N[E]||$n();await i.repo.set(...A,C,N);}else await i.repo.create(h.data);tt(p,`${c}/${i.name}?flash=created`);}catch(N){let S=pe(i.schema,i.createFields),A=te(S),E=`${c}/${i.name}/create`,C=le(A,E,"POST","Create document");_(p,ue(i.name,C,"create",null,c,{type:"error",message:`Save error: ${N.message}`}),500);}},d=async(m,p)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(p,"Bad request",400);return}let c=e[k];if(!c){_(p,"Repository not found",404);return}let u=ne(m,t,n),w=null;try{w=await ve(c,i);}catch(E){let C=et(c,i,E),j=ce(E)?424:500;_(p,Ie("",{title:`Edit ${c.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:c.name,href:`${u}/${c.name}`},{label:`Edit ${i}`}],flash:C}),j);return}if(!w){_(p,"Document not found",404);return}let I=Ot(w,c.schema),h=pe(c.schema,c.mutableFields),N=rt(te(h),I),S=`${u}/${c.name}/${encodeURIComponent(i)}/edit`,A=le(N,S,"POST","Save changes");_(p,ue(c.name,A,"edit",i,u));},l=async(m,p)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(p,"Bad request",400);return}let c=e[k];if(!c){_(p,"Repository not found",404);return}let u=ne(m,t,n),w=m.body??{},I=nt(w,c.schema),h=pe(c.schema,c.mutableFields),S=h.partial().safeParse(I);if(!S.success){let A=Object.fromEntries(Object.entries(w).map(([P,v])=>[P,Array.isArray(v)?v.join(","):v??""])),E=rt(te(h),A),C=`${u}/${c.name}/${encodeURIComponent(i)}/edit`,j=le(E,C,"POST","Save changes"),M=S.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`).join(", ");_(p,ue(c.name,j,"edit",i,u,{type:"error",message:`Validation error: ${M}`}),422);return}try{let A=await ve(c,i),E=(A&&Ze(A,c.pathKey))??[i];await c.repo.update(...E,S.data),tt(p,`${u}/${c.name}?flash=updated`);}catch(A){let E=pe(c.schema,c.mutableFields),C=te(E),j=`${u}/${c.name}/${encodeURIComponent(i)}/edit`,M=le(C,j,"POST","Save changes"),P=ce(A)?et(c,i,A):{type:"error",message:`Save error: ${A.message}`},v=ce(A)?424:500;_(p,ue(c.name,M,"edit",i,u,P),v);}},f=async(m,p)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(p,"Bad request",400);return}let c=e[k];if(!c){_(p,"Repository not found",404);return}if(!c.allowDelete){_(p,"Delete is not allowed for this repository",403);return}let u=ne(m,t,n);try{let w=await ve(c,i),I=(w&&Ze(w,c.pathKey))??[i];await c.repo.delete(...I),tt(p,`${u}/${c.name}?flash=deleted`);}catch(w){let I=ce(w)?et(c,i,w):{type:"error",message:`Delete error: ${w.message}`},h=ce(w)?424:500;_(p,Ie("",{title:`Delete ${c.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:c.name,href:`${u}/${c.name}`},{label:`Delete ${i}`}],flash:I}),h);}},b=async(m,p)=>{let k=m.params.repoName;if(!k){_(p,"Bad request",400);return}let i=e[k];if(!i){_(p,"Repository not found",404);return}let c=ne(m,t,n),u=m.query,w=u?.type==="many"?"many":"one",I=Math.max(1,Math.min(100,Number(u?.ps??25)||25)),h=i.listColumns??Object.keys(ee(i.schema)),{PanelOne:N,PanelMany:S}=await Promise.resolve().then(()=>(Ve(),xt)),{renderToString:A}=await import('hono/jsx/dom/server');if(w==="one"){let v=String(u?.id??"");if(!v){_(p,"<div class='p-6 text-error'>Missing id parameter.</div>",400);return}try{let q=await ve(i,v),ie=A(N({doc:q,repoName:i.name,basePath:c,schema:i.schema,columns:h}));_(p,ie);}catch(q){_(p,`<div class='p-6 text-error text-sm'>Error: ${q.message}</div>`,500);}return}let E=String(u?.fk??""),C=String(u?.fv??"");if(!E||!C){_(p,"<div class='p-6 text-error'>Missing fk/fv parameters.</div>",400);return}let j=u?.cursor??"",M=u?.dir==="prev"?"prev":"next",P;if(j)try{let v=i.repo.ref;typeof v.doc=="function"&&(P=await v.doc(j).get());}catch{}try{let v=await i.repo.query.paginate({pageSize:I,cursor:P,direction:M,where:[[E,"==",On(C)]]}),q=A(S({docs:v.data,repoName:i.name,basePath:c,fk:E,fv:C,columns:h,schema:i.schema,pagination:{hasPrev:v.hasPrevPage,hasNext:v.hasNextPage,prevCursor:v.prevCursor?.id??"",nextCursor:v.nextCursor?.id??"",pageSize:I}}));_(p,q);}catch(v){_(p,`<div class='p-6 text-error text-sm'>Error: ${v.message}</div>`,500);}},y=async(m,p)=>{let k=[];for(let i of p){let c;if(m.isGroup||m.parentKeys?.length){let u=await ve(m,i);c=u?Ze(u,m.pathKey):void 0;}c||(c=[i]);try{let u=m.repo.documentRef(...c);u&&k.push(u);}catch{}}return k},O=async(m,p)=>{let k=Ct(p),i=m.documentKey??"docId",c=[],u;for(;;){let w=await m.repo.query.paginate({pageSize:500,cursor:u,direction:"next",...k.length>0?{where:k}:{}});for(let I of w.data){let h=String(I[i]??I.id??"");h&&c.push(h);}if(!w.hasNextPage||!w.nextCursor)break;u=w.nextCursor;}return c},$=async(m,p)=>{let k=m.params.repoName;if(!k){Q(p,{error:"Bad request"},400);return}let i=e[k];if(!i){Q(p,{error:"Repository not found"},404);return}if(!i.allowDelete){Q(p,{error:"Delete is not allowed for this repository"},403);return}let c=m.body??{};try{let u=await U(i,c);if(u.length===0){Q(p,{deleted:0});return}let w=await y(i,u);for(let I=0;I<w.length;I+=500)await i.repo.bulk.delete(w.slice(I,I+500));Q(p,{deleted:w.length});}catch(u){Q(p,{error:u.message},500);}},g=async(m,p)=>{let k=m.params.repoName;if(!k){Q(p,{error:"Bad request"},400);return}let i=e[k];if(!i){Q(p,{error:"Repository not found"},404);return}let c=m.body??{},u=String(c.field??"");if(!u){Q(p,{error:"Missing 'field'"},400);return}if(!i.mutableFields||!i.mutableFields.includes(u)){Q(p,{error:`Field '${u}' is not bulk-updatable`},403);return}let w=i.schema.shape?.[u],I=c.value;if(w){let h=w.safeParse(c.value);if(!h.success){Q(p,{error:`Invalid value for '${u}': ${h.error.message}`},400);return}I=h.data;}try{let h=await U(i,c);if(h.length===0){Q(p,{updated:0});return}let S=(await y(i,h)).map(A=>({docRef:A,data:{[u]:I}}));for(let A=0;A<S.length;A+=500)await i.repo.bulk.update(S.slice(A,A+500));Q(p,{updated:S.length});}catch(h){Q(p,{error:h.message},500);}};async function U(m,p){if(p.selectAll){let k=z(p.filters,m);return await O(m,k)}return Array.isArray(p.ids)?p.ids.filter(k=>typeof k=="string"&&!!k):[]}function z(m,p){if(!Array.isArray(m))return [];let k=new Set((p.filterableFields??Object.keys(ee(p.schema))).map(u=>String(u))),i=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),c=[];for(let u of m)u&&typeof u=="object"&&typeof u.field=="string"&&k.has(u.field)&&typeof u.value=="string"&&i.has(String(u.op))&&c.push({field:u.field,op:u.op,value:u.value});return c}return {handleDashboard:r,handleList:a,handleCreateForm:s,handleCreateSubmit:o,handleEditForm:d,handleEditSubmit:l,handleDelete:f,handlePanel:b,handleBulkDelete:$,handleBulkUpdate:g,handleHistory:async(m,p)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(p,"Bad request",400);return}let c=e[k];if(!c){_(p,"Repository not found",404);return}if(!c.historyEnabled||!c.repo.history){_(p,"History not enabled for this repository",404);return}let u=ne(m,t,n),w=c.historySubcollection??"history",I=[i];try{let v=await ve(c,i),q=v?Ze(v,c.pathKey):void 0;q&&q.length>0&&(I=q);}catch{}let h=parseInt(String(m.query?.limit??"")),N=Number.isFinite(h)&&h>0?Math.min(h,500):100,S=[],A;try{S=await c.repo.history.list(...I,{limit:N});}catch(v){A=v.message;}let E=v=>String(v??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),C=v=>{if(v===void 0)return '<span class="opacity-40">undefined</span>';if(v===null)return '<span class="opacity-40">null</span>';if(typeof v=="object")try{return `<code class="text-xs">${E(JSON.stringify(v))}</code>`}catch{return E(String(v))}return E(String(v))},j=v=>v?typeof v.toDate=="function"?v.toDate().toISOString():v instanceof Date?v.toISOString():E(String(v)):"",M=v=>`<span class="badge badge-sm ${v==="create"?"badge-success":v==="delete"?"badge-error":"badge-info"}">${E(v)}</span>`,P="";if(P+='<div class="flex items-center justify-between mb-4">',P+=`<a href="${u}/${c.name}/${encodeURIComponent(i)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,P+=`<a href="${u}/${c.name}" class="btn btn-sm btn-outline">\u2190 Back to list</a>`,P+="</div>",P+=`<p class="text-sm text-base-content/60 mb-4">Subcollection: <code>${E(w)}</code> \xB7 Showing up to ${N} entries.</p>`,A)P+=`<div class="alert alert-error mb-4">${E(A)}</div>`;else if(S.length===0)P+='<div class="alert">No history entries found.</div>';else {P+='<div class="overflow-x-auto"><table class="table table-zebra table-sm">',P+="<thead><tr><th>When</th><th>Op</th><th>User</th><th>Reason / Comment</th><th>Changes</th></tr></thead><tbody>";for(let v of S){let q=v.meta??{},ie=[q.reason,q.comment].filter(K=>K!=null&&K!=="").map(K=>E(String(K))).join(" \u2014 "),re="",xe=Object.keys(v.changes??{});xe.length===0?re='<span class="opacity-40">\u2014</span>':re='<ul class="space-y-1">'+xe.map(K=>{let $e=v.changes[K];return `<li><strong>${E(K)}</strong>: ${C($e.oldValue)} \u2192 ${C($e.newValue)}</li>`}).join("")+"</ul>",P+="<tr>",P+=`<td class="whitespace-nowrap text-xs font-mono">${E(j(v.historySetAt))}</td>`,P+=`<td>${M(v.operation??"update")}</td>`,P+=`<td class="text-xs">${E(q.userEmail??q.userId??"")}</td>`,P+=`<td class="text-xs">${ie}</td>`,P+=`<td>${re}</td>`,P+="</tr>";}P+="</tbody></table></div>";}_(p,Ie(P,{title:`History \u2014 ${c.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:c.name,href:`${u}/${c.name}`},{label:`History ${i}`}]}));}}}function Q(e,t,n=200){e.status(n).set("Content-Type","application/json; charset=utf-8").send(JSON.stringify(t));}function On(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}function _n(e){let t=[],n=e.replace(/[.*+?^${}()|[\]\\]/g,r=>r===":"?r:`\\${r}`).replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(r,a)=>(t.push(a),"([^/]+)"));return {pattern:new RegExp(`^${n}$`),paramNames:t}}function Nn(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var Re=class{constructor(){this.routes=[];this.middlewares=[];this.notFoundHandler=(t,n)=>{n.status(404).send("Not Found");};this.errorHandler=(t,n,r)=>{console.error("[MiniRouter]",t),r.status(500).send("Internal Server Error");};}use(t){return this.middlewares.push(t),this}get(t,n){return this.addRoute("GET",t,n)}post(t,n){return this.addRoute("POST",t,n)}put(t,n){return this.addRoute("PUT",t,n)}patch(t,n){return this.addRoute("PATCH",t,n)}delete(t,n){return this.addRoute("DELETE",t,n)}onNotFound(t){return this.notFoundHandler=t,this}onError(t){return this.errorHandler=t,this}addRoute(t,n,r){let{pattern:a,paramNames:s}=_n(n);return this.routes.push({method:t.toUpperCase(),pattern:a,paramNames:s,handler:r}),this}async handle(t,n){let r=(t.method??"GET").toUpperCase(),a=Nn(t),s=null,o={};for(let f of this.routes){if(f.method!==r)continue;let b=a.match(f.pattern);if(b){s=f,o={},f.paramNames.forEach((y,O)=>{o[y]=decodeURIComponent(b[O+1]??"");});break}}let d=Object.assign(t,{params:o}),l=s?s.handler:this.notFoundHandler;try{await this.runMiddlewareChain(d,n,l);}catch(f){this.errorHandler(f,t,n);}}async runMiddlewareChain(t,n,r){let a=0,s=async()=>{if(a<this.middlewares.length){let o=this.middlewares[a++];await o(t,n,s);}else await r(t,n);};await s();}};var Pt="https://cdn.jsdelivr.net",It="https://www.gstatic.com",Pn=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${Pt} ${It}`,`style-src 'self' 'unsafe-inline' ${Pt}`,`connect-src 'self' ${It} https://*.googleapis.com https://*.firebaseio.com https://identitytoolkit.googleapis.com`,"img-src 'self' data:","font-src 'self' data:","frame-ancestors 'none'","base-uri 'self'","form-action 'self'"].join("; ");function Zt(e={}){let t=e.csp===void 0?Pn:e.csp,n=e.frameOptions===void 0?"DENY":e.frameOptions,r=e.referrerPolicy===void 0?"no-referrer":e.referrerPolicy,a=e.cacheControl===void 0?"private, no-store":e.cacheControl;return async(s,o,d)=>{typeof o?.setHeader=="function"&&(o.setHeader("X-Content-Type-Options","nosniff"),n&&o.setHeader("X-Frame-Options",n),r&&o.setHeader("Referrer-Policy",r),a&&o.setHeader("Cache-Control",a),t&&o.setHeader("Content-Security-Policy",t)),await d();}}async function In(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Zn(e){let t={};if(!e)return t;for(let n of e.split("&")){let r=n.indexOf("=");if(r===-1)continue;let a=decodeURIComponent(n.slice(0,r).replace(/\+/g," ")),s=decodeURIComponent(n.slice(r+1).replace(/\+/g," ")),o=t[a];o===void 0?t[a]=s:Array.isArray(o)?o.push(s):t[a]=[o,s];}return t}function aa(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:a,auth:s,middleware:o=[],httpsOptions:d}=e,l=t==="/"?"":t.replace(/\/$/,""),f={};for(let[$,g]of Object.entries(n)){let U=g.schema??g.repo.schema??null;if(!U)throw new Error(`[createAdminServer] Repository "${$}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let z,B,m;if(g.fieldsConfig){let i=g.fieldsConfig;z=[],B=[],m=[];for(let[c,u]of Object.entries(i))for(let w of u)w==="filterable"?z.push(c):w==="mutable"?B.push(c):w==="create"&&m.push(c);z.length===0&&(z=void 0),B.length===0&&(B=void 0),m.length===0&&(m=void 0);}let p=(()=>{let i=g.repo._parentKeys;return i&&i.length>0?i:void 0})();if(p&&m)for(let i of p)m.includes(i)||m.push(i);let k={name:$,path:g.path,repo:g.repo,schema:U,documentKey:g.documentKey??"docId",pathKey:g.repo._pathKey??void 0,isGroup:!!g.repo._isGroup,parentKeys:p,createdKey:g.repo._createdKey??void 0,listColumns:g.listColumns,pageSize:g.pageSize,filterableFields:z,mutableFields:B,createFields:m,allowDelete:g.allowDelete??false,historyEnabled:!!g.repo.history,historySubcollection:(g.repo.history&&g.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!g.relationalFields||g.relationalFields.length===0)return;let i=g.repo.relationalKeys??{},c=[];for(let u of g.relationalFields){let w=i[u.key];w&&c.push({key:u.key,column:u.column,targetRepo:String(w.repo),targetKey:String(w.key),type:w.type});}return c.length>0?c:void 0})()};f[$]=k;}let b=Nt(f,l,st(d?.region)),y=new Re;if(a!==false&&y.use(Zt(a===void 0?{}:a)),r&&y.use(async($,g,U)=>{let z=$,B=String(z.headers?.["content-type"]??"");if(B.includes("application/x-www-form-urlencoded")){let m=await In(z);$.body=Zn(m);}else if(B.includes("application/json")&&typeof z.body=="string")try{$.body=JSON.parse(z.body);}catch{}await U();}),s)if(De(s)){for(let $ of s.routes){let g=`${l}${$.path}`;$.method==="GET"?y.get(g,$.handler):y.post(g,$.handler);}y.use(s.middleware);}else if(typeof s=="function")y.use(s);else {let $=s.realm??"Admin",g="Basic "+Buffer.from(`${s.username}:${s.password}`).toString("base64");y.use((U,z,B)=>{if((U.headers?.authorization??"")!==g){z.status(401).set("WWW-Authenticate",`Basic realm="${$}"`).set("Content-Type","text/plain").send("Unauthorized");return}B();});}for(let $ of o)y.use($);y.get(`${l}/`,b.handleDashboard),y.get(`${l}`,b.handleDashboard),y.get(`${l}/:repoName/_panel`,b.handlePanel),y.post(`${l}/:repoName/_bulk/delete`,b.handleBulkDelete),y.post(`${l}/:repoName/_bulk/update`,b.handleBulkUpdate),y.get(`${l}/:repoName`,b.handleList),y.get(`${l}/:repoName/create`,b.handleCreateForm),y.post(`${l}/:repoName/create`,b.handleCreateSubmit),y.get(`${l}/:repoName/:id/edit`,b.handleEditForm),y.post(`${l}/:repoName/:id/edit`,b.handleEditSubmit),y.get(`${l}/:repoName/:id/history`,b.handleHistory),y.post(`${l}/:repoName/:id/delete`,b.handleDelete);let O=async($,g)=>{await y.handle($,g);};return d&&(O.httpsOptions=d),O}
1064
+ export{Re as MiniRouter,aa as createAdminServer};//# sourceMappingURL=index.js.map
1065
1065
  //# sourceMappingURL=index.js.map