@lpdjs/firestore-repo-service 2.6.16 → 2.6.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/history/index.cjs +1 -1
- package/dist/history/index.cjs.map +1 -1
- package/dist/history/index.js +1 -1
- package/dist/history/index.js.map +1 -1
- package/dist/index.cjs +76 -76
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +76 -76
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +2737 -0
- package/dist/llms.txt +120 -0
- package/dist/servers/admin/index.cjs +4 -4
- package/dist/servers/admin/index.cjs.map +1 -1
- package/dist/servers/admin/index.js +4 -4
- package/dist/servers/admin/index.js.map +1 -1
- package/dist/servers/hono/cli.cjs +171 -49
- package/dist/servers/hono/cli.cjs.map +1 -1
- package/dist/servers/hono/cli.js +171 -49
- package/dist/servers/hono/cli.js.map +1 -1
- package/dist/servers/hono/index.cjs +6 -6
- package/dist/servers/hono/index.cjs.map +1 -1
- package/dist/servers/hono/index.d.cts +17 -2
- package/dist/servers/hono/index.d.ts +17 -2
- package/dist/servers/hono/index.js +6 -6
- package/dist/servers/hono/index.js.map +1 -1
- package/dist/servers/index.cjs +85 -85
- package/dist/servers/index.cjs.map +1 -1
- package/dist/servers/index.js +85 -85
- package/dist/servers/index.js.map +1 -1
- package/dist/sync/index.cjs +46 -46
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.js +46 -46
- package/dist/sync/index.js.map +1 -1
- package/package.json +4 -3
package/dist/llms.txt
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# @lpdjs/firestore-repo-service (v2.6.18)
|
|
2
|
+
|
|
3
|
+
> ⚡ Type-safe Firestore ORM with auto-generated repositories, advanced queries, relations with typed select, pagination with include, batch/bulk operations, aggregations and transactions.
|
|
4
|
+
|
|
5
|
+
Type-safe Firestore ORM + servers (admin UI, CRUD REST, Hono file-based API, Firestore→SQL sync, change-history). Firestore is resolved lazily, so registries and servers can be imported before `initializeApp()`. This file is generated from the documentation — see `llms-full.txt` for the full content.
|
|
6
|
+
|
|
7
|
+
## Guides
|
|
8
|
+
- [Getting Started](https://frs.lpdjs.fr/guide/getting-started): Using Zod gives you automatic schema inference — no need to declare the model interface separately.
|
|
9
|
+
- [Configuration](https://frs.lpdjs.fr/guide/configuration): The refCb receives parent IDs in order, then the document ID last.
|
|
10
|
+
- [Relations & Populate](https://frs.lpdjs.fr/guide/relations): Each entry maps a field in the source model to a target repository:
|
|
11
|
+
- [Querying](https://frs.lpdjs.fr/guide/querying): Retrieve a single document by a foreign key.
|
|
12
|
+
- [Advanced Usage](https://frs.lpdjs.fr/guide/advanced): Creates or replaces a document with a specific ID.
|
|
13
|
+
- [Admin Server](https://frs.lpdjs.fr/guide/admin): The admin UI is built via createServers(repos).admin(...) — a unified factory that auto-binds the repository registry so each entry's repo field is inferred from its key (and so are model field paths in fieldsConfig).
|
|
14
|
+
- [Change History](https://frs.lpdjs.fr/guide/history): Opt-in, per-repo change-history capture using Firestore triggers, with a typed read API on the configured repository.
|
|
15
|
+
- [Firestore → SQL Sync](https://frs.lpdjs.fr/guide/sync): Automatically replicate Firestore collections to a SQL database (BigQuery, etc.) via Cloud Pub/Sub.
|
|
16
|
+
- [Hono API Server](https://frs.lpdjs.fr/guide/hono): A typed, file-based HTTP server built on Hono, designed
|
|
17
|
+
|
|
18
|
+
## Package entry points
|
|
19
|
+
- `@lpdjs/firestore-repo-service` — Core ORM: createRepositoryConfig, createRepositoryMapping (lazy Firestore), typed get/query/aggregate/crud/batch/bulk/transaction.
|
|
20
|
+
- `@lpdjs/firestore-repo-service/sync` — Firestore → SQL sync pipeline (triggers + worker + admin).
|
|
21
|
+
- `@lpdjs/firestore-repo-service/sync/bigquery` — BigQuery adapter for the sync pipeline.
|
|
22
|
+
- `@lpdjs/firestore-repo-service/history` — Change-history triggers and read API (createHistoryTriggers).
|
|
23
|
+
- `@lpdjs/firestore-repo-service/servers` — createServers(repos) → admin / crud / sync builders (lazy, definable in separate files).
|
|
24
|
+
- `@lpdjs/firestore-repo-service/servers/admin` — Auto-generated admin UI (Zod forms, filtering, relations).
|
|
25
|
+
- `@lpdjs/firestore-repo-service/servers/crud` — CRUD REST API with per-repo rules and OpenAPI spec.
|
|
26
|
+
- `@lpdjs/firestore-repo-service/servers/auth` — firebaseAuth: login page + session cookie guard for the admin/crud UIs.
|
|
27
|
+
- `@lpdjs/firestore-repo-service/servers/hono` — Hono file-based API server: useCaseRoute, createApiRegistry, BaseErrorHandler, BaseLogger, firebaseDocsAuth, and the `frs` CLI.
|
|
28
|
+
|
|
29
|
+
## CLI (`frs`)
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
frs — Hono file-based codegen
|
|
33
|
+
|
|
34
|
+
Usage:
|
|
35
|
+
frs init [flags]
|
|
36
|
+
frs gen [flags]
|
|
37
|
+
frs new <name> [flags]
|
|
38
|
+
frs add service <name> [flags]
|
|
39
|
+
frs add server <admin|crud|sync> [flags]
|
|
40
|
+
frs sdk:spec [flags]
|
|
41
|
+
frs help
|
|
42
|
+
|
|
43
|
+
Flags (init):
|
|
44
|
+
--root <dir> Domain root to create (default: src/domains)
|
|
45
|
+
--apis-file <path> Path to the apis.ts file to create (default: src/apis.ts)
|
|
46
|
+
--services-file <path>
|
|
47
|
+
Path to the services.ts file to create
|
|
48
|
+
(default: src/services.ts)
|
|
49
|
+
--apis <list> Comma-separated API tags to register (default: v1)
|
|
50
|
+
--base-path <prefix> basePath shared by all APIs (default: derived from tag)
|
|
51
|
+
--force Overwrite existing files
|
|
52
|
+
--yes Skip prompts, use defaults / flag values
|
|
53
|
+
|
|
54
|
+
Flags (gen):
|
|
55
|
+
--root <dir> Domain root to scan (e.g. src/domains)
|
|
56
|
+
— falls back to "root" in .frsrc.json
|
|
57
|
+
--out <file> Output file relative to --root
|
|
58
|
+
(default: .frsrc.json "out" or __generated__/routes.ts)
|
|
59
|
+
--routes-file <name> Filename to look for (default: routes.ts)
|
|
60
|
+
--skip <list> Comma-separated path segments to drop from URLs
|
|
61
|
+
(default: useCases,useCase,use-cases,use-case)
|
|
62
|
+
--casing <preserve|kebab>
|
|
63
|
+
Casing applied to remaining segments (default: preserve)
|
|
64
|
+
--ext <.js|.ts|''> Import extension in the generated file
|
|
65
|
+
(default: .js — required for ESM Node.js)
|
|
66
|
+
--exclude <list> Comma-separated directories to skip
|
|
67
|
+
(default: node_modules,__generated__,tests,__tests__,dist,build)
|
|
68
|
+
--silent Do not print the generated route table
|
|
69
|
+
|
|
70
|
+
Flags (new <name>):
|
|
71
|
+
--root <dir> Domain root (default: .frsrc.json "root" or src/domains)
|
|
72
|
+
--domain <name> Domain name (e.g. posts) — prompted if missing
|
|
73
|
+
--method <verb> HTTP method (default: post) — prompted if missing
|
|
74
|
+
--api <tag> API tag (default: .frsrc.json first "apis" or v1)
|
|
75
|
+
— prompted if missing
|
|
76
|
+
--usecase-folder <name>
|
|
77
|
+
Parent folder under <domain>.
|
|
78
|
+
Default: .frsrc.json "useCaseFolder" or useCases
|
|
79
|
+
--with-usecase Also scaffold a sibling <domain>.<name>.useCase.ts file
|
|
80
|
+
(default: true)
|
|
81
|
+
--with-test Also scaffold a sibling <domain>.<name>.useCase.test.ts
|
|
82
|
+
(Vitest, default: true)
|
|
83
|
+
--apis-import <path> Import path for the registry (default: auto-detect
|
|
84
|
+
../../../../apis.js — adjust if your layout differs)
|
|
85
|
+
--force Overwrite if files already exist
|
|
86
|
+
--yes Skip prompts, use defaults / flag values
|
|
87
|
+
|
|
88
|
+
Flags (add service <name>):
|
|
89
|
+
--services-file <path>
|
|
90
|
+
Path to the services.ts file (default: src/services.ts)
|
|
91
|
+
--services-dir <dir> Directory hosting individual service files
|
|
92
|
+
(default: <dir-of-services-file>/services)
|
|
93
|
+
--force Overwrite existing files
|
|
94
|
+
|
|
95
|
+
Flags (add server <admin|crud|sync>):
|
|
96
|
+
--dir <dir> Directory for the server files (default: .frsrc.json
|
|
97
|
+
servers dir, or dir of apis.ts, or "src")
|
|
98
|
+
--force Overwrite existing files
|
|
99
|
+
Scaffolds repos.ts + servers.ts (once) and <type>Server.ts, and records
|
|
100
|
+
their paths in .frsrc.json under "servers".
|
|
101
|
+
|
|
102
|
+
Flags (sdk:spec):
|
|
103
|
+
--entry <path> Module exporting a CRUD server (.spec()) or an OpenAPI
|
|
104
|
+
document. Must be Node-importable (built JS, or run via
|
|
105
|
+
`bunx frs sdk:spec ...` for TS).
|
|
106
|
+
--export <name> Named export to read (default: auto-detect first spec).
|
|
107
|
+
--out <file> Output JSON path (default: openapi.json)
|
|
108
|
+
Statically writes the OpenAPI 3.1 spec to a file — no server boot. For Hono:
|
|
109
|
+
`export const openapi = apis.spec("v1", routes)` then --export openapi.
|
|
110
|
+
|
|
111
|
+
Examples:
|
|
112
|
+
frs init
|
|
113
|
+
frs new createPost --domain posts --method post
|
|
114
|
+
frs new listPosts --domain posts --method get --api v1
|
|
115
|
+
frs add service postRepo
|
|
116
|
+
frs add server admin
|
|
117
|
+
frs add server crud
|
|
118
|
+
frs add server sync
|
|
119
|
+
frs sdk:spec --entry lib/crudServer.js --export api --out openapi.json
|
|
120
|
+
```
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var jsxRuntime=require('hono/jsx/jsx-runtime'),crypto=require('crypto'),zod=require('zod'),server=require('hono/jsx/dom/server');var Ht=Object.defineProperty;var Ee=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ut=(e,t)=>{for(var n in t)Ht(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return Jt[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 st(e){let t=e,n=t._zod?.def?.in;if(n)return n;if(t._def?.schema)return t._def.schema}function it(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function lt(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 Se(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function dt(e){let t=e;return Array.isArray(t.options)?t.options:Array.isArray(t._zod?.def?.options)?t._zod.def.options:Array.isArray(t._def?.options)?t._def.options:[]}function ct(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 Jt,Te=Ee(()=>{Jt={string:"ZodString",number:"ZodNumber",bigint:"ZodBigInt",boolean:"ZodBoolean",date:"ZodDate",enum:"ZodEnum",nativeEnum:"ZodNativeEnum",literal:"ZodLiteral",object:"ZodObject",array:"ZodArray",optional:"ZodOptional",nullable:"ZodNullable",default:"ZodDefault",coerce:"ZodCoerce",union:"ZodUnion",undefined:"ZodUndefined",unknown:"ZodUnknown",any:"ZodAny",record:"ZodRecord"};});function vt({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function an({message:e}){return jsxRuntime.jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsxRuntime.jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function ye({val:e,mismatch:t}){let n=on(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(an,{message:t})]}):n}function on(e){if(e==null)return jsxRuntime.jsx("span",{class:"opacity-30 italic text-xs",children:"\u2014"});if(typeof e=="boolean")return e?jsxRuntime.jsx("span",{class:"badge badge-success badge-sm",children:"true"}):jsxRuntime.jsx("span",{class:"badge badge-error badge-sm",children:"false"});if(e instanceof Date)return jsxRuntime.jsx(vt,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(vt,{val:e.toDate()});if(typeof e=="number")return jsxRuntime.jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxRuntime.jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsxRuntime.jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxRuntime.jsxs("li",{class:"text-base-content/40 italic",children:["+",e.length-8," more\u2026"]})]});if(typeof e=="object"&&e!==null){let n=Object.entries(e);return n.length===0?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxRuntime.jsxs("dl",{class:"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5 text-xs m-0",children:[n.slice(0,8).map(([r,a])=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsxRuntime.jsx("dd",{class:"break-all",children:String(a??"")})]})),n.length>8&&jsxRuntime.jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsxRuntime.jsx("span",{class:"text-sm break-all",children:t})}var _e=Ee(()=>{});function he(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 ge(e,t){if(!e)return;let n=t.split("."),r=e;for(let a of n){if(!r)return;let o=He(r);if(L(o)!=="ZodObject")return;r=ee(o)[a];}return r}function cn(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 Ae(e,t){if(e==="unknown")return null;let n=cn(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=Ee(()=>{Te();});var kt={};Ut(kt,{PanelMany:()=>pn,PanelOne:()=>un,RightPanel:()=>qe});function un({doc:e,repoName:t,basePath:n,schema:r,columns:a}){if(!e)return jsxRuntime.jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let o=String(e.docId??e.id??""),s=`${n}/${t}/${encodeURIComponent(o)}/edit`,c=wt(r,a);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:o})]}),jsxRuntime.jsx("a",{href:s,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsxRuntime.jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:a.map(l=>{let p=e[l],b=c[l],h=b?Ae(b,p):null;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:l}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(ye,{val:p,mismatch:h})})]})})})]})}function pn({docs:e,repoName:t,basePath:n,fk:r,fv:a,columns:o,schema:s,pagination:c}){let l=`${n}/${t}?fv_${r}=${encodeURIComponent(a)}`,p=wt(s,o);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" where "}),jsxRuntime.jsx("span",{class:"font-mono",children:r}),jsxRuntime.jsx("span",{class:"opacity-50",children:" = "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:a}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsxRuntime.jsx("a",{href:l,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxRuntime.jsxs("table",{class:"table table-xs w-full",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[o.map((b,h)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:b},h)),jsxRuntime.jsx("th",{})]})}),jsxRuntime.jsx("tbody",{children:e.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:o.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((b,h)=>{let $=String(b.docId??b.id??""),C=`${n}/${t}/${encodeURIComponent($)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[o.map((g,U)=>{let D=b[g],B=p[g],m=B?Ae(B,D):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(ye,{val:D,mismatch:m})},U)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:C,class:"btn btn-xs btn-ghost",children:"Edit"})})]},h)})})]})}),(c.hasPrev||c.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[c.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":c.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),c.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":c.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function wt(e,t){if(!e)return {};let n={};for(let r of t)n[r]=he(ge(e,r));return n}var qe,Ve=Ee(()=>{_e();Ue();qe=({basePath:e=""})=>jsxRuntime.jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"data-frs-base-path":e,"aria-hidden":"true",children:[jsxRuntime.jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxRuntime.jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxRuntime.jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsxRuntime.jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsxRuntime.jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsxRuntime.jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsxRuntime.jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function ze(e,t,n){let r=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",c=n??process.env.FUNCTION_REGION??"us-central1",l=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${c}/${l}${r}`}let a=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return a&&typeof o=="string"&&o.includes("cloudfunctions.net")?`/${a.toLowerCase()}${r}`:r}function ot(e){if(typeof e=="string")return e;if(Array.isArray(e)){let t=e[0];return typeof t=="string"?t:void 0}}function Fe(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Te();Te();function Kt(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function ut(e){let t=e,n=true,r=false,a;for(;;){let o=L(t);if(o==="ZodOptional")n=false,t=G(t);else if(o==="ZodNullable")n=false,r=true,t=G(t);else if(o==="ZodDefault")n=false,a=lt(t),t=G(t);else if(o==="ZodEffects"||o==="ZodPipe"||o==="ZodTransform"){let s=st(t);if(!s)break;t=s;}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,o])=>pt(t?`${t}.${a}`:a,a,o))}return [pt(t||"value",t||"value",e)]}function pt(e,t,n){let{inner:r,required:a,nullable:o,defaultValue:s}=ut(n),c=L(r),l=Kt(t.split(".").pop()??t);switch(c){case "ZodString":{let p=ct(r),b=p.includes("email"),h=p.includes("url");return {name:e,label:l,type:"text",required:a,nullable:o,defaultValue:s,hint:b?"email":h?"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 p=we(r);return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:p}}case "ZodNativeEnum":{let p=ke(r),b=Object.values(p).filter(h=>typeof h=="string");return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:b}}case "ZodLiteral":{let p=String(Se(r)??"");return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:[p]}}case "ZodUnion":{let p=dt(r);if(p.length>0&&p.every(h=>L(h)==="ZodLiteral")){let h=p.map($=>String(Se($)??""));return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:h}}return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON"}}case "ZodObject":{let p=te(r,e);return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,nested:p,hint:"JSON object"}}case "ZodArray":{let p=it(r);if(!p)return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON array"};let{inner:b}=ut(p),h=L(b),$,C,g;switch(h){case "ZodString":$="text";break;case "ZodNumber":case "ZodBigInt":$="number";break;case "ZodBoolean":$="checkbox";break;case "ZodDate":$="datetime-local";break;case "ZodEnum":$="select",C=we(b);break;case "ZodNativeEnum":$="select",C=Object.values(ke(b)).filter(U=>typeof U=="string");break;case "ZodObject":$="object",g=te(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:$,arrayElementOptions:C,arrayElementFields:g}}default:return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON"}}}function bt(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__",c=!s&&e.defaultValue!=null?String(e.defaultValue):"",l=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
|
|
1
|
+
'use strict';var jsxRuntime=require('hono/jsx/jsx-runtime'),crypto=require('crypto'),zod=require('zod'),server=require('hono/jsx/dom/server');var Ht=Object.defineProperty;var Ee=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ut=(e,t)=>{for(var n in t)Ht(e,n,{get:t[n],enumerable:true});};function L(e){let t=e,n=t._zod?.def?.type;if(n)return Jt[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 st(e){let t=e,n=t._zod?.def?.in;if(n)return n;if(t._def?.schema)return t._def.schema}function it(e){let t=e;if(t._zod?.def?.element)return t._zod.def.element;if(t._def?.type)return t._def.type}function lt(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 Se(e){let t=e;return Array.isArray(t._zod?.def?.values)?t._zod.def.values[0]:t._def?.value}function dt(e){let t=e;return Array.isArray(t.options)?t.options:Array.isArray(t._zod?.def?.options)?t._zod.def.options:Array.isArray(t._def?.options)?t._def.options:[]}function ct(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 Jt,Te=Ee(()=>{Jt={string:"ZodString",number:"ZodNumber",bigint:"ZodBigInt",boolean:"ZodBoolean",date:"ZodDate",enum:"ZodEnum",nativeEnum:"ZodNativeEnum",literal:"ZodLiteral",object:"ZodObject",array:"ZodArray",optional:"ZodOptional",nullable:"ZodNullable",default:"ZodDefault",coerce:"ZodCoerce",union:"ZodUnion",undefined:"ZodUndefined",unknown:"ZodUnknown",any:"ZodAny",record:"ZodRecord"};});function vt({val:e}){return jsxRuntime.jsx("span",{class:"text-sm text-base-content/80 font-mono tabular-nums whitespace-nowrap",children:e.toLocaleString()})}function an({message:e}){return jsxRuntime.jsx("span",{class:"tooltip tooltip-warning tooltip-right inline-flex align-middle ml-1 text-warning","data-tip":e,role:"img","aria-label":e,children:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",class:"size-3.5",children:jsxRuntime.jsx("path",{d:"M12 2 1 22h22L12 2zm0 6 7.5 13h-15L12 8zm-1 4v4h2v-4h-2zm0 5v2h2v-2h-2z"})})})}function ye({val:e,mismatch:t}){let n=on(e);return t?jsxRuntime.jsxs("span",{class:"inline-flex items-start gap-0.5",children:[n,jsxRuntime.jsx(an,{message:t})]}):n}function on(e){if(e==null)return jsxRuntime.jsx("span",{class:"opacity-30 italic text-xs",children:"\u2014"});if(typeof e=="boolean")return e?jsxRuntime.jsx("span",{class:"badge badge-success badge-sm",children:"true"}):jsxRuntime.jsx("span",{class:"badge badge-error badge-sm",children:"false"});if(e instanceof Date)return jsxRuntime.jsx(vt,{val:e});if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")return jsxRuntime.jsx(vt,{val:e.toDate()});if(typeof e=="number")return jsxRuntime.jsx("span",{class:"text-sm font-mono tabular-nums",children:String(e)});if(Array.isArray(e))return e.length===0?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"[]"}):jsxRuntime.jsxs("ul",{class:"list-none p-0 m-0 space-y-0.5 text-xs",children:[e.slice(0,8).map((n,r)=>jsxRuntime.jsx("li",{class:"break-all",children:typeof n=="object"?JSON.stringify(n):String(n)},r)),e.length>8&&jsxRuntime.jsxs("li",{class:"text-base-content/40 italic",children:["+",e.length-8," more\u2026"]})]});if(typeof e=="object"&&e!==null){let n=Object.entries(e);return n.length===0?jsxRuntime.jsx("span",{class:"text-xs text-base-content/30",children:"{}"}):jsxRuntime.jsxs("dl",{class:"grid grid-cols-[auto_1fr] gap-x-2 gap-y-0.5 text-xs m-0",children:[n.slice(0,8).map(([r,a])=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-base-content/50 font-semibold whitespace-nowrap",children:r}),jsxRuntime.jsx("dd",{class:"break-all",children:String(a??"")})]})),n.length>8&&jsxRuntime.jsxs("dt",{class:"col-span-2 text-base-content/40 italic",children:["+",n.length-8," more\u2026"]})]})}let t=String(e);return jsxRuntime.jsx("span",{class:"text-sm break-all",children:t})}var _e=Ee(()=>{});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 he(e,t){if(!e)return;let n=t.split("."),r=e;for(let a of n){if(!r)return;let o=He(r);if(L(o)!=="ZodObject")return;r=ee(o)[a];}return r}function cn(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 Ae(e,t){if(e==="unknown")return null;let n=cn(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=Ee(()=>{Te();});var kt={};Ut(kt,{PanelMany:()=>pn,PanelOne:()=>un,RightPanel:()=>qe});function un({doc:e,repoName:t,basePath:n,schema:r,columns:a}){if(!e)return jsxRuntime.jsx("div",{class:"text-center py-12 text-base-content/50",children:"Document not found."});let o=String(e.docId??e.id??""),s=`${n}/${t}/${encodeURIComponent(o)}/edit`,c=wt(r,a);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:o})]}),jsxRuntime.jsx("a",{href:s,class:"btn btn-sm btn-primary",children:"Edit \u2192"})]}),jsxRuntime.jsx("dl",{class:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 border border-base-300 rounded-box p-4 bg-base-100",children:a.map(l=>{let p=e[l],b=c[l],g=b?Ae(b,p):null;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("dt",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide pt-0.5",children:l}),jsxRuntime.jsx("dd",{class:"min-w-0",children:jsxRuntime.jsx(ye,{val:p,mismatch:g})})]})})})]})}function pn({docs:e,repoName:t,basePath:n,fk:r,fv:a,columns:o,schema:s,pagination:c}){let l=`${n}/${t}?fv_${r}=${encodeURIComponent(a)}`,p=wt(s,o);return jsxRuntime.jsxs("div",{class:"space-y-4",children:[jsxRuntime.jsxs("div",{class:"flex items-center justify-between gap-2",children:[jsxRuntime.jsxs("div",{class:"text-xs text-base-content/60",children:[jsxRuntime.jsx("span",{class:"font-mono",children:t}),jsxRuntime.jsx("span",{class:"opacity-50",children:" where "}),jsxRuntime.jsx("span",{class:"font-mono",children:r}),jsxRuntime.jsx("span",{class:"opacity-50",children:" = "}),jsxRuntime.jsx("span",{class:"font-mono break-all",children:a}),jsxRuntime.jsx("span",{class:"opacity-50",children:" \xB7 "}),jsxRuntime.jsxs("span",{children:[e.length," doc",e.length!==1?"s":""]})]}),jsxRuntime.jsx("a",{href:l,class:"btn btn-sm btn-outline",children:"Full view \u2192"})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100",children:jsxRuntime.jsxs("table",{class:"table table-xs w-full",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[o.map((b,g)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:b},g)),jsxRuntime.jsx("th",{})]})}),jsxRuntime.jsx("tbody",{children:e.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:o.length+1,class:"text-center py-10 text-base-content/40",children:"No related documents"})}):e.map((b,g)=>{let $=String(b.docId??b.id??""),C=`${n}/${t}/${encodeURIComponent($)}/edit`;return jsxRuntime.jsxs("tr",{class:"hover",children:[o.map((h,U)=>{let D=b[h],B=p[h],m=B?Ae(B,D):null;return jsxRuntime.jsx("td",{class:"align-top py-1.5",children:jsxRuntime.jsx(ye,{val:D,mismatch:m})},U)}),jsxRuntime.jsx("td",{class:"text-right py-1.5",children:jsxRuntime.jsx("a",{href:C,class:"btn btn-xs btn-ghost",children:"Edit"})})]},g)})})]})}),(c.hasPrev||c.hasNext)&&jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[c.hasPrev?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"prev","data-cursor":c.prevCursor,children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"\u2190 Previous"}),c.hasNext?jsxRuntime.jsx("button",{type:"button",class:"btn btn-xs btn-outline","data-frs-panel-page":"next","data-cursor":c.nextCursor,children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-xs btn-outline",disabled:true,children:"Next \u2192"})]})]})}function wt(e,t){if(!e)return {};let n={};for(let r of t)n[r]=ge(he(e,r));return n}var qe,Ve=Ee(()=>{_e();Ue();qe=({basePath:e=""})=>jsxRuntime.jsxs("div",{class:"fixed inset-0 z-[100] hidden pointer-events-none","data-frs-panel-root":true,"data-frs-base-path":e,"aria-hidden":"true",children:[jsxRuntime.jsx("div",{class:"absolute inset-0 bg-black/30 opacity-0 transition-opacity duration-200 pointer-events-auto","data-frs-panel-backdrop":true}),jsxRuntime.jsxs("aside",{class:"absolute top-0 right-0 h-full w-full md:w-1/2 bg-base-100 shadow-2xl border-l border-base-300 translate-x-full transition-transform duration-200 pointer-events-auto flex flex-col","data-frs-panel":true,role:"dialog","aria-label":"Relation preview",children:[jsxRuntime.jsxs("header",{class:"flex items-center justify-between px-5 py-3 border-b border-base-300 bg-base-200/40 shrink-0",children:[jsxRuntime.jsx("h2",{class:"font-semibold text-base truncate","data-frs-panel-title":true,children:"Relation"}),jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost btn-circle","data-frs-panel-close":true,"aria-label":"Close panel",children:"\u2715"})]}),jsxRuntime.jsx("div",{class:"flex-1 overflow-auto p-5 text-sm","data-frs-panel-body":true,children:jsxRuntime.jsx("div",{class:"flex items-center justify-center py-12 text-base-content/40",children:jsxRuntime.jsx("span",{class:"loading loading-spinner loading-md"})})})]})]});});function ze(e,t,n){let r=t==="/"?"":t.replace(/\/$/,"");if(process.env.FUNCTIONS_EMULATOR==="true"){let s=process.env.GCLOUD_PROJECT??process.env.GOOGLE_CLOUD_PROJECT??"demo-project",c=n??process.env.FUNCTION_REGION??"us-central1",l=(process.env.FUNCTION_TARGET??"").replace(/\./g,"-");return `/${s}/${c}/${l}${r}`}let a=process.env.K_SERVICE,o=e?.hostname??e?.headers?.host??"";return a&&typeof o=="string"&&o.includes("cloudfunctions.net")?`/${a.toLowerCase()}${r}`:r}function ot(e){if(typeof e=="string")return e;if(Array.isArray(e)){let t=e[0];return typeof t=="string"?t:void 0}}function Fe(e){return !!e&&typeof e=="object"&&e.__authExtension===true}Te();Te();function Kt(e){return e.replace(/([A-Z])/g," $1").replace(/_/g," ").replace(/^\s/,"").replace(/^./,t=>t.toUpperCase())}function ut(e){let t=e,n=true,r=false,a;for(;;){let o=L(t);if(o==="ZodOptional")n=false,t=G(t);else if(o==="ZodNullable")n=false,r=true,t=G(t);else if(o==="ZodDefault")n=false,a=lt(t),t=G(t);else if(o==="ZodEffects"||o==="ZodPipe"||o==="ZodTransform"){let s=st(t);if(!s)break;t=s;}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,o])=>pt(t?`${t}.${a}`:a,a,o))}return [pt(t||"value",t||"value",e)]}function pt(e,t,n){let{inner:r,required:a,nullable:o,defaultValue:s}=ut(n),c=L(r),l=Kt(t.split(".").pop()??t);switch(c){case "ZodString":{let p=ct(r),b=p.includes("email"),g=p.includes("url");return {name:e,label:l,type:"text",required:a,nullable:o,defaultValue:s,hint:b?"email":g?"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 p=we(r);return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:p}}case "ZodNativeEnum":{let p=ke(r),b=Object.values(p).filter(g=>typeof g=="string");return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:b}}case "ZodLiteral":{let p=String(Se(r)??"");return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:[p]}}case "ZodUnion":{let p=dt(r);if(p.length>0&&p.every(g=>L(g)==="ZodLiteral")){let g=p.map($=>String(Se($)??""));return {name:e,label:l,type:"select",required:a,nullable:o,defaultValue:s,options:g}}return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON"}}case "ZodObject":{let p=te(r,e);return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,nested:p,hint:"JSON object"}}case "ZodArray":{let p=it(r);if(!p)return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON array"};let{inner:b}=ut(p),g=L(b),$,C,h;switch(g){case "ZodString":$="text";break;case "ZodNumber":case "ZodBigInt":$="number";break;case "ZodBoolean":$="checkbox";break;case "ZodDate":$="datetime-local";break;case "ZodEnum":$="select",C=we(b);break;case "ZodNativeEnum":$="select",C=Object.values(ke(b)).filter(U=>typeof U=="string");break;case "ZodObject":$="object",h=te(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:$,arrayElementOptions:C,arrayElementFields:h}}default:return {name:e,label:l,type:"textarea",required:a,nullable:o,defaultValue:s,hint:"JSON"}}}function bt(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__",c=!s&&e.defaultValue!=null?String(e.defaultValue):"",l=e.nullable&&e.type!=="checkbox"?`<span class="flex items-center gap-1 shrink-0">
|
|
2
2
|
<input type="hidden" id="${r}__isnull" name="${a}__isnull" value="${s?"1":""}">
|
|
3
3
|
<label class="flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/40 hover:text-base-content/70 border border-base-300 rounded px-2 py-1">
|
|
4
4
|
<input type="checkbox" class="checkbox checkbox-xs" ${s?"checked":""}
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
${e.required&&!e.nullable?"":'<option value="">\u2014 optional \u2014</option>'}
|
|
36
36
|
${(e.options??[]).map(b=>`<option value="${R(b)}"${c===b?" selected":""}>${R(b)}</option>`).join(`
|
|
37
37
|
`)}
|
|
38
|
-
</select>`;break;case "textarea":if(e.arrayElementType)return Gt(e,t);if(e.nested&&e.nested.length>0){let b=e.nested.map(
|
|
38
|
+
</select>`;break;case "textarea":if(e.arrayElementType)return Gt(e,t);if(e.nested&&e.nested.length>0){let b=e.nested.map(g=>bt(g,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">
|
|
@@ -133,7 +133,7 @@
|
|
|
133
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 Wt=new Set(["<","<=",">",">=","!="]),Qt=new Set(["array-contains","array-contains-any"]);function De(e){return e==="desc"?"DESCENDING":"ASCENDING"}function Xt(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function Yt(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(Qt.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(Wt.has(l.op)){if(s.has(l.field))continue;s.add(l.field);let p=a?.field===l.field?De(a.dir):"ASCENDING";o.push({fieldPath:l.field,order:p});}if(a&&!s.has(a.field)&&o.push({fieldPath:a.field,order:De(a.dir)}),o.length===1&&n)return nn(e,t,o[0]);let c=a&&o.some(l=>l.fieldPath===a.field)?De(a.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:c}),en(e,t,n,o)}function en(e,t,n,r,a="(default)"){let o=`projects/${e}/databases/${a}/collectionGroups/${t}/indexes/_`,s=[...Be(1,o),...Oe(2,n?2:1)];for(let p of r)s.push(...yt(3,
|
|
136
|
+
</form>`}var Wt=new Set(["<","<=",">",">=","!="]),Qt=new Set(["array-contains","array-contains-any"]);function De(e){return e==="desc"?"DESCENDING":"ASCENDING"}function Xt(e){let t=e.split("/").filter(Boolean);return t[t.length-1]??e}function Yt(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(Qt.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(Wt.has(l.op)){if(s.has(l.field))continue;s.add(l.field);let p=a?.field===l.field?De(a.dir):"ASCENDING";o.push({fieldPath:l.field,order:p});}if(a&&!s.has(a.field)&&o.push({fieldPath:a.field,order:De(a.dir)}),o.length===1&&n)return nn(e,t,o[0]);let c=a&&o.some(l=>l.fieldPath===a.field)?De(a.dir):"ASCENDING";return o.push({fieldPath:"__name__",order:c}),en(e,t,n,o)}function en(e,t,n,r,a="(default)"){let o=`projects/${e}/databases/${a}/collectionGroups/${t}/indexes/_`,s=[...Be(1,o),...Oe(2,n?2:1)];for(let p of r)s.push(...yt(3,gt(p)));let c=a==="(default)"?"-default-":a,l=encodeURIComponent(ht(s));return `https://console.firebase.google.com/project/${e}/firestore/databases/${c}/indexes?create_composite=${l}`}function tn(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 yt(e,t){return [Le(e,2),...je(t.length),...t]}function gt(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 nn(e,t,n,r="(default)"){let a=`projects/${e}/databases/${r}/collectionGroups/${t}/fields/${n.fieldPath}`,o=[...Be(1,a),...Oe(2,2),...yt(3,gt(n))],s=r==="(default)"?"-default-":r,c=encodeURIComponent(ht(o));return `https://console.firebase.google.com/project/${e}/firestore/databases/${s}/indexes/automatic?create_exemption=${c}`}function rn(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 de(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=de(e),a;if(r&&(a=n.message?tn(n.message):void 0,!a)){let o=rn(t.ref);if(o){let s=Xt(t.path);a=Yt(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}}_e();var xt=`// \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 Ne(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:xt}})}Ve();function ae(e){return "<!DOCTYPE html>"+server.renderToString(e)}var bn=["corporate","silk","dark"],yn=()=>jsxRuntime.jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxRuntime.jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxRuntime.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:"size-4",children:[jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"}),jsxRuntime.jsx("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),jsxRuntime.jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsxRuntime.jsx("ul",{tabIndex:0,class:"dropdown-content menu menu-sm bg-base-100 text-base-content rounded-box z-50 mt-2 w-40 p-1 shadow-lg border border-base-300",children:bn.map(e=>jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsxRuntime.jsx("span",{children:e}),jsxRuntime.jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),oe=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:a,basePath:o="/"}=e;return jsxRuntime.jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxRuntime.jsxs("head",{children:[jsxRuntime.jsx("meta",{charset:"UTF-8"}),jsxRuntime.jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxRuntime.jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxRuntime.jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsxRuntime.jsxs("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:[jsxRuntime.jsx("div",{class:"flex-1",children:jsxRuntime.jsx("a",{href:o,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsxRuntime.jsx("div",{class:"flex-none",children:jsxRuntime.jsx(yn,{})})]}),jsxRuntime.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((s,c)=>s.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:s.href,children:s.label})},c):jsxRuntime.jsx("li",{class:"text-base-content/60",children:s.label},c))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),a&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${a.type==="success"?"alert-success":a.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:a.message}),a.action&&jsxRuntime.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]}),jsxRuntime.jsx(qe,{basePath:o}),jsxRuntime.jsx(Ne,{})]})]})};function Je(e,t){return ae(jsxRuntime.jsx(oe,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Ke(e,t){return ae(jsxRuntime.jsx(oe,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxRuntime.jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsxRuntime.jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsxRuntime.jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:e.map(n=>jsxRuntime.jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxRuntime.jsxs("div",{class:"card-body p-5",children:[jsxRuntime.jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsxRuntime.jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var At=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],hn=[{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"}],gn=[{value:"array-contains",label:"contains"},{value:"array-contains-any",label:"contains any"}];function vn(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return hn;case "ZodBoolean":return At;case "ZodArray":return gn;default:return At}}var se="__null__";function xn(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="${se}"]');if(!o){o=document.createElement('option');o.value='${se}';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='${se}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${se}"][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!=='${se}')?i.dataset._prev:'';}}})(this)`}function wn(e,t){return `(function(){var h=document.getElementById('${e}');var boxes=document.querySelectorAll('input[data-enum-group="${t}"]');h.value=Array.from(boxes).filter(function(b){return b.checked;}).map(function(b){return b.value;}).join(',');})()`}function Re({inputId:e,active:t}){return jsxRuntime.jsxs("label",{class:"flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/60 hover:text-base-content border border-base-300 rounded-md px-1.5 py-1 shrink-0 leading-none h-8",title:"Filter where field IS NULL",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:xn(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function kn({col:e,active:t}){let n=t?.value??"",r=n===se,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 c=new Set(n.split(",").map(p=>p.trim()).filter(Boolean)),l=`eg_${e.name.replace(/\./g,"__")}`;return jsxRuntime.jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{type:"hidden",id:a,name:`fv_${e.name}`,value:n}),e.enumValues.map(p=>jsxRuntime.jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:p,checked:c.has(p),"data-enum-group":l,onchange:wn(a,l)}),jsxRuntime.jsx("span",{children:p})]},p))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:a,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(c=>jsxRuntime.jsx("option",{value:c,selected:n===c,children:c},c)),e.nullable&&jsxRuntime.jsx("option",{value:se,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Re,{inputId:a,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:a,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsxRuntime.jsx("option",{value:se,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Re,{inputId:a,active:r})]});if(e.zodType==="ZodArray"){let c=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:a,type:"text",name:`fv_${e.name}`,value:n,placeholder:c?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id: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&&jsxRuntime.jsx(Re,{inputId:a,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.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&&jsxRuntime.jsx(Re,{inputId:a,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.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&&jsxRuntime.jsx(Re,{inputId:a,active:r})]})}function Ge({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,c=t.filter(l=>l.zodType!=="ZodObject"&&l.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:o?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",o&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:c.map(l=>{let p=vn(l.zodType),b=a[l.name],h=b?.op??p[0].value;return jsxRuntime.jsxs("div",{class:"flex flex-col gap-1.5",children:[jsxRuntime.jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:l.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[p.length>1?jsxRuntime.jsx("select",{name:`fo_${l.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:p.map($=>jsxRuntime.jsx("option",{value:$.value,selected:$.value===h,children:$.label},$.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${l.name}`,value:p[0].value}),jsxRuntime.jsx(kn,{col:l,active:b})]})]},l.name)})}),jsxRuntime.jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),o&&jsxRuntime.jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),s&&jsxRuntime.jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function We(e,t,n,r,a,o){let s=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,c=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(jsxRuntime.jsx(oe,{opts:{title:s,breadcrumb:c,basePath:a,flash:o},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}_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 Rt(e,t,n,r,a){let o=Qe(e,r,a);return o.set("cursor",t),o.set("dir",n),`?${o.toString()}`}function Sn(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 An(e,t,n){return `?${Qe(t,n,e).toString()}`}function Xe(e,t,n,r,a,o,s=[],c=[],l=false,p=[],b,h,$,C,g,U,D,B=false){let m=`${r}/${e}`,f=`${m}/create`,k={};if(D)for(let y of n)k[y]=he(ge(D,y));let i=(U??[]).filter(y=>{let N=k[y]??he(ge(D,y));return N==="string"||N==="number"||N==="bigint"||N==="boolean"||N==="enum"||N==="literal"}),d=i.length>0,u=l,w=u||d,I=i.map(y=>{let N=ge(D,y),S=he(N),A=s.find(T=>T.name===y);return {name:y,type:S,enumValues:A?.enumValues??null,nullable:A?.nullable??false}});return ae(jsxRuntime.jsxs(oe,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:o},children:[s.length>0&&jsxRuntime.jsx(Ge,{action:m,columnMeta:s,activeFilters:c,isGroup:C}),$&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${$.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-6 w-6 shrink-0 stroke-current",fill:"none",viewBox:"0 0 24 24",children:$.type==="index"?jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}):jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"})}),jsxRuntime.jsxs("div",{class:"flex-1",children:[jsxRuntime.jsx("h3",{class:"font-bold",children:$.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:$.message})]}),$.indexUrl&&jsxRuntime.jsx("a",{href:$.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxRuntime.jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxRuntime.jsxs("div",{class:"flex items-center gap-3",children:[jsxRuntime.jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof g=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of"," ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:g})]})," ","document",(typeof g=="number"?g:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(y=>jsxRuntime.jsx("a",{href:An(y,c,b),class:`join-item btn btn-xs ${h===y?"btn-active btn-primary":"btn-outline"}`,children:y},y))})]})]}),jsxRuntime.jsx("a",{href:f,class:"btn btn-primary btn-sm",children:"+ New"})]}),w&&jsxRuntime.jsxs("div",{class:"hidden mb-3 alert alert-info py-2 px-3","data-frs-bulk-bar":true,"data-frs-repo":e,"data-frs-total":typeof g=="number"?String(g):"","data-frs-page-size":String(h??t.length),"data-frs-allow-delete":u?"1":"0","data-frs-allow-update":d?"1":"0","data-frs-fields":JSON.stringify(I),"data-frs-filters":JSON.stringify(c),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof g=="number"&&g>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",g," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",g??"?"," matching documents are selected."," ",jsxRuntime.jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxRuntime.jsxs("div",{class:"flex gap-2",children:[d&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),u&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[w&&jsxRuntime.jsx("th",{class:"w-8",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((y,N)=>{let S=b?.field===y,A=S?b.dir==="asc"?" \u25B2":" \u25BC":"";return jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxRuntime.jsxs("a",{href:Sn(y,b,c,h),class:`hover:text-base-content inline-flex items-center gap-0.5${S?" text-primary font-bold":""}`,children:[y,A]})},N)}),p.map((y,N)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y.column},`rel-${N}`)),jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsxRuntime.jsx("tbody",{children:t.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:n.length+p.length+1+(w?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((y,N)=>{let S=String(y.docId??y.id??""),A=`${r}/${e}/${encodeURIComponent(S)}/edit`,T=`${r}/${e}/${encodeURIComponent(S)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":S,children:[w&&jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:S,"aria-label":`Select ${S}`})}),n.map((E,j)=>{let M=y[E],P=k[E],v=P?Ae(P,M):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(ye,{val:M,mismatch:v})},j)}),p.map((E,j)=>{let M=y[E.key];if(M==null||M==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${j}`);let P=E.type==="one"?`${r}/${E.targetRepo}/${encodeURIComponent(String(M))}/edit`:`${r}/${E.targetRepo}?fv_${E.targetKey}=${encodeURIComponent(String(M))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:P,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":E.type,"data-frs-rel-repo":E.targetRepo,"data-frs-rel-fk":E.targetKey,"data-frs-rel-val":String(M),"data-frs-rel-label":E.column,children:E.column})},`rel-${j}`)}),jsxRuntime.jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxRuntime.jsxs("div",{class:"flex gap-1 justify-end",children:[jsxRuntime.jsx("a",{href:A,class:"btn btn-xs btn-outline",children:"Edit"}),B&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(S)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),l&&jsxRuntime.jsx("form",{method:"post",action:T,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},N)})})]})}),(a.hasPrev||a.hasNext)&&jsxRuntime.jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[a.hasPrev?jsxRuntime.jsx("a",{href:Rt(c,a.prevCursor,"prev",b,h),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),a.hasNext?jsxRuntime.jsx("a",{href:Rt(c,a.nextCursor,"next",b,h),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof g=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[g," total document",g!==1?"s":"",c.length>0?" matching filters":""]})]}),w&&d&&jsxRuntime.jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxRuntime.jsxs("div",{class:"modal-box",children:[jsxRuntime.jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsxRuntime.jsx("p",{class:"text-sm text-base-content/60 mb-4","data-frs-bulk-update-summary":true,children:"Update one field on the selected documents."}),jsxRuntime.jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxRuntime.jsxs("label",{class:"form-control w-full mb-3",children:[jsxRuntime.jsx("div",{class:"label",children:jsxRuntime.jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxRuntime.jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsxRuntime.jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),i.map(y=>jsxRuntime.jsx("option",{value:y,children:y},y))]})]}),jsxRuntime.jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxRuntime.jsxs("div",{class:"modal-action",children:[jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsxRuntime.jsx("form",{method:"dialog",class:"modal-backdrop",children:jsxRuntime.jsx("button",{children:"close"})})]})]}))}function Ie(e,t){return Je(e,t)}function $t(e,t){return Ke(e,t)}function Ct(e,t,n,r,a,o,s,c,l,p,b,h,$,C,g,U,D,B){return Xe(e,t,n,r,a,o,s,c,l,p,b,h,$,C,g,U,D,B)}function ue(e,t,n,r,a,o){return We(e,t,n,r,a,o)}var Ye="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function En(){let e="";for(;e.length<20;){let t=crypto.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 o=1;o<r.length;o+=2)a.push(r[o]);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 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 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,o]of Object.entries(n)){let s=at(o);if(s==="ZodObject"){if(e[a+"__isnull"]==="1"){r[a]=null;continue}let p={},b=false;for(let[C,g]of Object.entries(e))C.startsWith(`${a}.`)&&(p[C.slice(a.length+1)]=g,b=true);if(b){let C=o;for(;;){let g=L(C);if(g==="ZodOptional"||g==="ZodNullable"||g==="ZodDefault")C=G(C);else break}r[a]=nt(p,C);continue}let h=e[a],$=Array.isArray(h)?h[h.length-1]:h;if($)try{r[a]=JSON.parse($);}catch{r[a]=$;}continue}let c=e[a],l=Array.isArray(c)?c[c.length-1]:c;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 Et(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let 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 Tn(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function Ot(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 _t(e){let t=Tn(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(o=>typeof o=="string");return a.length>0?a:void 0}if(n==="ZodLiteral"){let r=Se(t);return typeof r=="string"?[r]:void 0}}function Nt(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 c=t.shape[a];for(;;){let p=L(c);if(p==="ZodOptional"||p==="ZodNullable"||p==="ZodDefault")c=G(c);else break}let l=L(c);if(l==="ZodObject"&&typeof s=="object"&&s!==null&&!Array.isArray(s)){let p=Nt(s,c,o);Object.assign(r,p);}else if(l==="ZodDate"){let p=Et(s);p!==null&&(r[o]=p);}else if(typeof s=="object"&&s!==null&&!Array.isArray(s)&&("_seconds"in s||typeof s.toDate=="function")){let p=Et(s);r[o]=p??JSON.stringify(s,null,2);}else typeof s=="object"?r[o]=JSON.stringify(s,null,2):r[o]=String(s);}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 On(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 c=(o??"").trim();if(!c)continue;let l=e[`fo_${s}`]??"==",p=n.has(l)?l:"==";r.push({field:s,op:p,value:c});}return r}function Tt(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 Pt(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 c=at(s);if(c==="ZodObject"){let l=s;for(;;){let b=L(l);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")l=G(l);else break}let p=ee(l);r.push(...Pt(Object.keys(p),l,o));}else r.push({name:o,zodType:c,nullable:Ot(s),enumValues:_t(s)});}return r}function _n(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=G(r);else break}let o=ee(r);if(!(a in o))return null;r=o[a];}return r}function pe(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 c=o.slice(0,s),l=o.slice(s+1);r.has(c)||r.set(c,[]),r.get(c).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 c=e.shape[o];for(;;){let l=L(c);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")c=G(c);else break}if(L(c)!=="ZodObject"){a[o]=e.shape[o];continue}a[o]=pe(c,s);}return zod.z.object(a)}function ne(e,t,n){return ze(e,t,n)}function It(e,t,n){let r=(m,f)=>{let k=ne(m,t,n),i=Object.values(e).map(d=>({name:d.name,path:d.path}));_(f,$t(i,k));},a=async(m,f)=>{let k=m.params.repoName;if(!k){_(f,"Bad request",400);return}let i=e[k];if(!i){_(f,"Repository not found",404);return}let d=i.pageSize??25,u=m.query??{},w=u.cursor,I=u.dir==="prev"?"prev":"next",y=u.ob??"",N=u.od==="desc"?"desc":"asc",S=y?{field:y,dir:N}:void 0,A=parseInt(u.ps??""),T=Number.isFinite(A)&&A>0?Math.min(A,200):d,E=i.listColumns??Object.keys(i.schema.shape),j=i.documentKey??"docId",M=[j,...E.filter(V=>V!==j)];S&&(new Set([j,...E]).has(S.field)||(S=void 0));let P=i.filterableFields?(()=>{let V=[];for(let Y of i.filterableFields)(Y.includes(".")||E.includes(Y))&&V.push(Y);return V})():E,v=(()=>{let V=[];for(let Y of P)if(Y.includes(".")){let me=_n(i.schema,Y);V.push({name:Y,zodType:me?at(me):"ZodString",nullable:me?Ot(me):false,enumValues:me?_t(me):void 0});}else V.push(...Pt([Y],i.schema));return V})(),q=new Set(v.map(V=>V.name)),ie=On(u,q),re=Tt(ie),xe;if(w)try{let V=i.repo.ref;typeof V.doc=="function"&&(xe=await V.doc(w).get());}catch{}let[K,Ce]=await Promise.all([i.repo.query.paginate({pageSize:T,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,Dt=fe?[]:K.data,jt=fe?"":K.nextCursor?.id??"",Lt=fe?"":K.prevCursor?.id??"",Bt=fe?K.queryError:void 0,Mt=ne(m,t,n);_(f,Ct(i.name,Dt,M,Mt,{hasPrev:fe?false:K.hasPrevPage,hasNext:fe?false:K.hasNextPage,prevCursor:Lt,nextCursor:jt},void 0,v,ie,i.allowDelete??false,i.relationalMeta,S,T,Bt,i.isGroup,Ce,i.mutableFields,i.schema,i.historyEnabled));},o=(m,f)=>{let k=m.params.repoName;if(!k){_(f,"Bad request",400);return}let i=e[k];if(!i){_(f,"Repository not found",404);return}let d=ne(m,t,n),u=pe(i.schema,i.createFields),w=te(u),I=`${d}/${i.name}/create`,y=le(w,I,"POST","Create document");_(f,ue(i.name,y,"create",null,d));},s=async(m,f)=>{let k=m.params.repoName;if(!k){_(f,"Bad request",400);return}let i=e[k];if(!i){_(f,"Repository not found",404);return}let d=ne(m,t,n),u=m.body??{},w=nt(u,i.schema),I=pe(i.schema,i.createFields),y=I.safeParse(w);if(!y.success){let N=te(I),S=`${d}/${i.name}/create`,A=le(N,S,"POST","Create document"),T=y.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`).join(", ");_(f,ue(i.name,A,"create",null,d,{type:"error",message:`Validation error: ${T}`}),422);return}try{if(i.isGroup&&i.parentKeys&&i.parentKeys.length>0){let N={...y.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]),T=i.documentKey??"docId",E=N[T]||En();await i.repo.set(...A,E,N);}else await i.repo.create(y.data);tt(f,`${d}/${i.name}?flash=created`);}catch(N){let S=pe(i.schema,i.createFields),A=te(S),T=`${d}/${i.name}/create`,E=le(A,T,"POST","Create document");_(f,ue(i.name,E,"create",null,d,{type:"error",message:`Save error: ${N.message}`}),500);}},c=async(m,f)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(f,"Bad request",400);return}let d=e[k];if(!d){_(f,"Repository not found",404);return}let u=ne(m,t,n),w=null;try{w=await ve(d,i);}catch(T){let E=et(d,i,T),j=de(T)?424:500;_(f,Ie("",{title:`Edit ${d.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:d.name,href:`${u}/${d.name}`},{label:`Edit ${i}`}],flash:E}),j);return}if(!w){_(f,"Document not found",404);return}let I=Nt(w,d.schema),y=pe(d.schema,d.mutableFields),N=rt(te(y),I),S=`${u}/${d.name}/${encodeURIComponent(i)}/edit`,A=le(N,S,"POST","Save changes");_(f,ue(d.name,A,"edit",i,u));},l=async(m,f)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(f,"Bad request",400);return}let d=e[k];if(!d){_(f,"Repository not found",404);return}let u=ne(m,t,n),w=m.body??{},I=nt(w,d.schema),y=pe(d.schema,d.mutableFields),S=y.partial().safeParse(I);if(!S.success){let A=Object.fromEntries(Object.entries(w).map(([P,v])=>[P,Array.isArray(v)?v.join(","):v??""])),T=rt(te(y),A),E=`${u}/${d.name}/${encodeURIComponent(i)}/edit`,j=le(T,E,"POST","Save changes"),M=S.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`).join(", ");_(f,ue(d.name,j,"edit",i,u,{type:"error",message:`Validation error: ${M}`}),422);return}try{let A=await ve(d,i),T=(A&&Ze(A,d.pathKey))??[i];await d.repo.update(...T,S.data),tt(f,`${u}/${d.name}?flash=updated`);}catch(A){let T=pe(d.schema,d.mutableFields),E=te(T),j=`${u}/${d.name}/${encodeURIComponent(i)}/edit`,M=le(E,j,"POST","Save changes"),P=de(A)?et(d,i,A):{type:"error",message:`Save error: ${A.message}`},v=de(A)?424:500;_(f,ue(d.name,M,"edit",i,u,P),v);}},p=async(m,f)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(f,"Bad request",400);return}let d=e[k];if(!d){_(f,"Repository not found",404);return}if(!d.allowDelete){_(f,"Delete is not allowed for this repository",403);return}let u=ne(m,t,n);try{let w=await ve(d,i),I=(w&&Ze(w,d.pathKey))??[i];await d.repo.delete(...I),tt(f,`${u}/${d.name}?flash=deleted`);}catch(w){let I=de(w)?et(d,i,w):{type:"error",message:`Delete error: ${w.message}`},y=de(w)?424:500;_(f,Ie("",{title:`Delete ${d.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:d.name,href:`${u}/${d.name}`},{label:`Delete ${i}`}],flash:I}),y);}},b=async(m,f)=>{let k=m.params.repoName;if(!k){_(f,"Bad request",400);return}let i=e[k];if(!i){_(f,"Repository not found",404);return}let d=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)),y=i.listColumns??Object.keys(ee(i.schema)),{PanelOne:N,PanelMany:S}=await Promise.resolve().then(()=>(Ve(),kt)),{renderToString:A}=await import('hono/jsx/dom/server');if(w==="one"){let v=String(u?.id??"");if(!v){_(f,"<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:d,schema:i.schema,columns:y}));_(f,ie);}catch(q){_(f,`<div class='p-6 text-error text-sm'>Error: ${q.message}</div>`,500);}return}let T=String(u?.fk??""),E=String(u?.fv??"");if(!T||!E){_(f,"<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:[[T,"==",Nn(E)]]}),q=A(S({docs:v.data,repoName:i.name,basePath:d,fk:T,fv:E,columns:y,schema:i.schema,pagination:{hasPrev:v.hasPrevPage,hasNext:v.hasNextPage,prevCursor:v.prevCursor?.id??"",nextCursor:v.nextCursor?.id??"",pageSize:I}}));_(f,q);}catch(v){_(f,`<div class='p-6 text-error text-sm'>Error: ${v.message}</div>`,500);}},h=async(m,f)=>{let k=[];for(let i of f){let d;if(m.isGroup||m.parentKeys?.length){let u=await ve(m,i);d=u?Ze(u,m.pathKey):void 0;}d||(d=[i]);try{let u=m.repo.documentRef(...d);u&&k.push(u);}catch{}}return k},$=async(m,f)=>{let k=Tt(f),i=m.documentKey??"docId",d=[],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 y=String(I[i]??I.id??"");y&&d.push(y);}if(!w.hasNextPage||!w.nextCursor)break;u=w.nextCursor;}return d},C=async(m,f)=>{let k=m.params.repoName;if(!k){Q(f,{error:"Bad request"},400);return}let i=e[k];if(!i){Q(f,{error:"Repository not found"},404);return}if(!i.allowDelete){Q(f,{error:"Delete is not allowed for this repository"},403);return}let d=m.body??{};try{let u=await U(i,d);if(u.length===0){Q(f,{deleted:0});return}let w=await h(i,u);for(let I=0;I<w.length;I+=500)await i.repo.bulk.delete(w.slice(I,I+500));Q(f,{deleted:w.length});}catch(u){Q(f,{error:u.message},500);}},g=async(m,f)=>{let k=m.params.repoName;if(!k){Q(f,{error:"Bad request"},400);return}let i=e[k];if(!i){Q(f,{error:"Repository not found"},404);return}let d=m.body??{},u=String(d.field??"");if(!u){Q(f,{error:"Missing 'field'"},400);return}if(!i.mutableFields||!i.mutableFields.includes(u)){Q(f,{error:`Field '${u}' is not bulk-updatable`},403);return}let w=i.schema.shape?.[u],I=d.value;if(w){let y=w.safeParse(d.value);if(!y.success){Q(f,{error:`Invalid value for '${u}': ${y.error.message}`},400);return}I=y.data;}try{let y=await U(i,d);if(y.length===0){Q(f,{updated:0});return}let S=(await h(i,y)).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(f,{updated:S.length});}catch(y){Q(f,{error:y.message},500);}};async function U(m,f){if(f.selectAll){let k=D(f.filters,m);return await $(m,k)}return Array.isArray(f.ids)?f.ids.filter(k=>typeof k=="string"&&!!k):[]}function D(m,f){if(!Array.isArray(m))return [];let k=new Set((f.filterableFields??Object.keys(ee(f.schema))).map(u=>String(u))),i=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),d=[];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))&&d.push({field:u.field,op:u.op,value:u.value});return d}return {handleDashboard:r,handleList:a,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:c,handleEditSubmit:l,handleDelete:p,handlePanel:b,handleBulkDelete:C,handleBulkUpdate:g,handleHistory:async(m,f)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(f,"Bad request",400);return}let d=e[k];if(!d){_(f,"Repository not found",404);return}if(!d.historyEnabled||!d.repo.history){_(f,"History not enabled for this repository",404);return}let u=ne(m,t,n),w=d.historySubcollection??"history",I=[i];try{let v=await ve(d,i),q=v?Ze(v,d.pathKey):void 0;q&&q.length>0&&(I=q);}catch{}let y=parseInt(String(m.query?.limit??"")),N=Number.isFinite(y)&&y>0?Math.min(y,500):100,S=[],A;try{S=await d.repo.history.list(...I,{limit:N});}catch(v){A=v.message;}let T=v=>String(v??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),E=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">${T(JSON.stringify(v))}</code>`}catch{return T(String(v))}return T(String(v))},j=v=>v?typeof v.toDate=="function"?v.toDate().toISOString():v instanceof Date?v.toISOString():T(String(v)):"",M=v=>`<span class="badge badge-sm ${v==="create"?"badge-success":v==="delete"?"badge-error":"badge-info"}">${T(v)}</span>`,P="";if(P+='<div class="flex items-center justify-between mb-4">',P+=`<a href="${u}/${d.name}/${encodeURIComponent(i)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,P+=`<a href="${u}/${d.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>${T(w)}</code> \xB7 Showing up to ${N} entries.</p>`,A)P+=`<div class="alert alert-error mb-4">${T(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=>T(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 Ce=v.changes[K];return `<li><strong>${T(K)}</strong>: ${E(Ce.oldValue)} \u2192 ${E(Ce.newValue)}</li>`}).join("")+"</ul>",P+="<tr>",P+=`<td class="whitespace-nowrap text-xs font-mono">${T(j(v.historySetAt))}</td>`,P+=`<td>${M(v.operation??"update")}</td>`,P+=`<td class="text-xs">${T(q.userEmail??q.userId??"")}</td>`,P+=`<td class="text-xs">${ie}</td>`,P+=`<td>${re}</td>`,P+="</tr>";}P+="</tbody></table></div>";}_(f,Ie(P,{title:`History \u2014 ${d.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:d.name,href:`${u}/${d.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 Nn(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}function Pn(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 In(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var $e=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}=Pn(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=In(t),o=null,s={};for(let p of this.routes){if(p.method!==r)continue;let b=a.match(p.pattern);if(b){o=p,s={},p.paramNames.forEach((h,$)=>{s[h]=decodeURIComponent(b[$+1]??"");});break}}let c=Object.assign(t,{params:s}),l=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(c,n,l);}catch(p){this.errorHandler(p,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 Zt="https://cdn.jsdelivr.net",zt="https://www.gstatic.com",Zn=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${Zt} ${zt}`,`style-src 'self' 'unsafe-inline' ${Zt}`,`connect-src 'self' ${zt} 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 Ft(e={}){let t=e.csp===void 0?Zn: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,c)=>{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 c();}}async function zn(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Fn(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 sa(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:a,auth:o,middleware:s=[],httpsOptions:c}=e,l=t==="/"?"":t.replace(/\/$/,""),p={};for(let[C,g]of Object.entries(n)){let U=g.schema??g.repo.schema??null;if(!U)throw new Error(`[createAdminServer] Repository "${C}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let D,B,m;if(g.fieldsConfig){let i=g.fieldsConfig;D=[],B=[],m=[];for(let[d,u]of Object.entries(i))for(let w of u)w==="filterable"?D.push(d):w==="mutable"?B.push(d):w==="create"&&m.push(d);D.length===0&&(D=void 0),B.length===0&&(B=void 0),m.length===0&&(m=void 0);}let f=(()=>{let i=g.repo._parentKeys;return i&&i.length>0?i:void 0})();if(f&&m)for(let i of f)m.includes(i)||m.push(i);let k={name:C,path:g.path,repo:g.repo,schema:U,documentKey:g.documentKey??"docId",pathKey:g.repo._pathKey??void 0,isGroup:!!g.repo._isGroup,parentKeys:f,createdKey:g.repo._createdKey??void 0,listColumns:g.listColumns,pageSize:g.pageSize,filterableFields:D,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??{},d=[];for(let u of g.relationalFields){let w=i[u.key];w&&d.push({key:u.key,column:u.column,targetRepo:String(w.repo),targetKey:String(w.key),type:w.type});}return d.length>0?d:void 0})()};p[C]=k;}let b=It(p,l,ot(c?.region)),h=new $e;if(a!==false&&h.use(Ft(a===void 0?{}:a)),r&&h.use(async(C,g,U)=>{let D=C,B=String(D.headers?.["content-type"]??"");if(B.includes("application/x-www-form-urlencoded")){let m=await zn(D);C.body=Fn(m);}else if(B.includes("application/json")&&typeof D.body=="string")try{C.body=JSON.parse(D.body);}catch{}await U();}),o)if(Fe(o)){for(let C of o.routes){let g=`${l}${C.path}`;C.method==="GET"?h.get(g,C.handler):h.post(g,C.handler);}h.use(o.middleware);}else if(typeof o=="function")h.use(o);else {let C=o.realm??"Admin",g="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");h.use((U,D,B)=>{if((U.headers?.authorization??"")!==g){D.status(401).set("WWW-Authenticate",`Basic realm="${C}"`).set("Content-Type","text/plain").send("Unauthorized");return}B();});}for(let C of s)h.use(C);h.get(`${l}/`,b.handleDashboard),h.get(`${l}`,b.handleDashboard),h.get(`${l}/:repoName/_panel`,b.handlePanel),h.post(`${l}/:repoName/_bulk/delete`,b.handleBulkDelete),h.post(`${l}/:repoName/_bulk/update`,b.handleBulkUpdate),h.get(`${l}/:repoName`,b.handleList),h.get(`${l}/:repoName/create`,b.handleCreateForm),h.post(`${l}/:repoName/create`,b.handleCreateSubmit),h.get(`${l}/:repoName/:id/edit`,b.handleEditForm),h.post(`${l}/:repoName/:id/edit`,b.handleEditSubmit),h.get(`${l}/:repoName/:id/history`,b.handleHistory),h.post(`${l}/:repoName/:id/delete`,b.handleDelete);let $=async(C,g)=>{await h.handle(C,g);};return c&&($.httpsOptions=c),$}
|
|
1063
|
+
`;function Ne(){return jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:xt}})}Ve();function ae(e){return "<!DOCTYPE html>"+server.renderToString(e)}var bn=["corporate","silk","dark"],yn=()=>jsxRuntime.jsxs("div",{class:"dropdown dropdown-end","data-frs-theme-switcher":true,children:[jsxRuntime.jsxs("button",{type:"button",tabIndex:0,class:"btn btn-sm btn-ghost text-neutral-content gap-1.5","aria-label":"Switch theme",children:[jsxRuntime.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2",class:"size-4",children:[jsxRuntime.jsx("circle",{cx:"12",cy:"12",r:"4"}),jsxRuntime.jsx("path",{d:"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"})]}),jsxRuntime.jsx("span",{class:"text-xs hidden sm:inline","data-frs-theme-current":true,children:"Theme"})]}),jsxRuntime.jsx("ul",{tabIndex:0,class:"dropdown-content menu menu-sm bg-base-100 text-base-content rounded-box z-50 mt-2 w-40 p-1 shadow-lg border border-base-300",children:bn.map(e=>jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("button",{type:"button","data-frs-theme":e,class:"capitalize justify-between",children:[jsxRuntime.jsx("span",{children:e}),jsxRuntime.jsx("span",{class:"hidden text-primary","data-frs-theme-check":e,children:"\u2713"})]})},e))})]}),oe=({opts:e,children:t})=>{let{title:n,breadcrumb:r,flash:a,basePath:o="/"}=e;return jsxRuntime.jsxs("html",{lang:"en","data-theme":"corporate",children:[jsxRuntime.jsxs("head",{children:[jsxRuntime.jsx("meta",{charset:"UTF-8"}),jsxRuntime.jsx("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),jsxRuntime.jsxs("title",{children:[n," \u2014 FRS Admin"]}),jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:"(function(){try{var t=localStorage.getItem('frs-admin-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(_){}})();"}}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/themes.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("link",{href:"https://cdn.jsdelivr.net/npm/daisyui@5/daisyui.css",rel:"stylesheet",type:"text/css"}),jsxRuntime.jsx("script",{src:"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"})]}),jsxRuntime.jsxs("body",{class:"bg-base-200/50 min-h-screen flex flex-col",children:[jsxRuntime.jsxs("div",{class:"navbar bg-neutral text-neutral-content shadow-sm sticky top-0 z-50 px-6",children:[jsxRuntime.jsx("div",{class:"flex-1",children:jsxRuntime.jsx("a",{href:o,class:"font-bold text-lg tracking-tight hover:opacity-80 transition-opacity",children:"FRS Admin"})}),jsxRuntime.jsx("div",{class:"flex-none",children:jsxRuntime.jsx(yn,{})})]}),jsxRuntime.jsxs("main",{class:"px-6 py-8 w-full flex-1",children:[r&&r.length>0&&jsxRuntime.jsx("div",{class:"text-sm breadcrumbs mb-4",children:jsxRuntime.jsx("ul",{children:r.map((s,c)=>s.href?jsxRuntime.jsx("li",{children:jsxRuntime.jsx("a",{href:s.href,children:s.label})},c):jsxRuntime.jsx("li",{class:"text-base-content/60",children:s.label},c))})}),jsxRuntime.jsx("h1",{class:"text-2xl font-bold mb-6",children:n}),a&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${a.type==="success"?"alert-success":a.type==="warning"?"alert-warning":"alert-error"} mb-6`,children:[jsxRuntime.jsx("span",{class:"flex-1",children:a.message}),a.action&&jsxRuntime.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]}),jsxRuntime.jsx(qe,{basePath:o}),jsxRuntime.jsx(Ne,{})]})]})};function Je(e,t){return ae(jsxRuntime.jsx(oe,{opts:t,children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:e}})}))}function Ke(e,t){return ae(jsxRuntime.jsx(oe,{opts:{title:"Repositories",basePath:t},children:e.length===0?jsxRuntime.jsxs("div",{class:"text-center py-20 text-base-content/50",children:[jsxRuntime.jsx("p",{class:"text-lg font-medium mb-1",children:"No repositories configured"}),jsxRuntime.jsx("p",{class:"text-sm",children:"Add a repository to your FRS config to get started."})]}):jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:e.map(n=>jsxRuntime.jsx("a",{href:`${t}/${n.name}`,class:"card bg-base-100 border border-base-300 hover:shadow-md no-underline transition-shadow",children:jsxRuntime.jsxs("div",{class:"card-body p-5",children:[jsxRuntime.jsx("h2",{class:"card-title text-sm font-semibold",children:n.name}),jsxRuntime.jsx("p",{class:"text-xs text-base-content/50 font-mono",children:n.path})]})},n.name))})}))}var At=[{value:"==",label:"="},{value:"!=",label:"\u2260"},{value:"in",label:"in"},{value:"not-in",label:"not in"}],gn=[{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 vn(e){switch(e){case "ZodNumber":case "ZodBigInt":case "ZodDate":return gn;case "ZodBoolean":return At;case "ZodArray":return hn;default:return At}}var se="__null__";function xn(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="${se}"]');if(!o){o=document.createElement('option');o.value='${se}';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='${se}';i.readOnly=true;}i.style.opacity='0.55';}else{i.style.opacity='';if(i.tagName==='SELECT'){var o2=i.querySelector('option[value="${se}"][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!=='${se}')?i.dataset._prev:'';}}})(this)`}function wn(e,t){return `(function(){var h=document.getElementById('${e}');var boxes=document.querySelectorAll('input[data-enum-group="${t}"]');h.value=Array.from(boxes).filter(function(b){return b.checked;}).map(function(b){return b.value;}).join(',');})()`}function Re({inputId:e,active:t}){return jsxRuntime.jsxs("label",{class:"flex items-center gap-1 cursor-pointer select-none text-xs text-base-content/60 hover:text-base-content border border-base-300 rounded-md px-1.5 py-1 shrink-0 leading-none h-8",title:"Filter where field IS NULL",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",checked:t,onchange:xn(e)}),jsxRuntime.jsx("span",{children:"\u2205"})]})}function kn({col:e,active:t}){let n=t?.value??"",r=n===se,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 c=new Set(n.split(",").map(p=>p.trim()).filter(Boolean)),l=`eg_${e.name.replace(/\./g,"__")}`;return jsxRuntime.jsxs("div",{class:"flex flex-wrap items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{type:"hidden",id:a,name:`fv_${e.name}`,value:n}),e.enumValues.map(p=>jsxRuntime.jsxs("label",{class:"flex items-center gap-1 text-xs border border-base-300 rounded px-2 cursor-pointer hover:bg-base-200",children:[jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs",value:p,checked:c.has(p),"data-enum-group":l,onchange:wn(a,l)}),jsxRuntime.jsx("span",{children:p})]},p))]})}return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:a,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),e.enumValues.map(c=>jsxRuntime.jsx("option",{value:c,selected:n===c,children:c},c)),e.nullable&&jsxRuntime.jsx("option",{value:se,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Re,{inputId:a,active:r})]})}if(e.zodType==="ZodBoolean")return jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsxs("select",{id:a,name:`fv_${e.name}`,class:"select select-sm select-bordered w-full",style:r?"opacity:0.55":void 0,children:[jsxRuntime.jsx("option",{value:"",selected:n===""&&!r,children:"\u2014"}),jsxRuntime.jsx("option",{value:"true",selected:n==="true",children:"true"}),jsxRuntime.jsx("option",{value:"false",selected:n==="false",children:"false"}),e.nullable&&jsxRuntime.jsx("option",{value:se,"data-_auto":"1",selected:r,children:"\u2205 null"})]}),e.nullable&&jsxRuntime.jsx(Re,{inputId:a,active:r})]});if(e.zodType==="ZodArray"){let c=t?.op==="array-contains-any";return jsxRuntime.jsx("input",{id:a,type:"text",name:`fv_${e.name}`,value:n,placeholder:c?"val1, val2, \u2026":"value",class:"input input-sm input-bordered w-full"})}return e.zodType==="ZodNumber"||e.zodType==="ZodBigInt"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.jsx("input",{id: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&&jsxRuntime.jsx(Re,{inputId:a,active:r})]}):e.zodType==="ZodDate"?jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.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&&jsxRuntime.jsx(Re,{inputId:a,active:r})]}):jsxRuntime.jsxs("div",{class:"flex items-center gap-1 w-full",children:[jsxRuntime.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&&jsxRuntime.jsx(Re,{inputId:a,active:r})]})}function Ge({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,c=t.filter(l=>l.zodType!=="ZodObject"&&l.zodType!=="ZodRecord");return jsxRuntime.jsxs("details",{class:"collapse collapse-arrow bg-base-100 border border-base-300 rounded-box mb-6 shadow-sm",open:o?true:void 0,children:[jsxRuntime.jsxs("summary",{class:"collapse-title text-sm font-medium py-2 min-h-0",children:["Filters",o&&jsxRuntime.jsxs("span",{class:"badge badge-primary badge-sm ml-2",children:[n.length," active"]})]}),jsxRuntime.jsx("div",{class:"collapse-content pb-4 pt-2",children:jsxRuntime.jsxs("form",{method:"get",action:e,children:[jsxRuntime.jsx("div",{class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:c.map(l=>{let p=vn(l.zodType),b=a[l.name],g=b?.op??p[0].value;return jsxRuntime.jsxs("div",{class:"flex flex-col gap-1.5",children:[jsxRuntime.jsx("label",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:l.name}),jsxRuntime.jsxs("div",{class:"flex gap-1.5",children:[p.length>1?jsxRuntime.jsx("select",{name:`fo_${l.name}`,class:"select select-sm select-bordered w-20 shrink-0",children:p.map($=>jsxRuntime.jsx("option",{value:$.value,selected:$.value===g,children:$.label},$.value))}):jsxRuntime.jsx("input",{type:"hidden",name:`fo_${l.name}`,value:p[0].value}),jsxRuntime.jsx(kn,{col:l,active:b})]})]},l.name)})}),jsxRuntime.jsxs("div",{class:"flex flex-wrap gap-2 mt-4 pt-3 border-t border-base-200 items-center",children:[jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary",children:"Apply"}),o&&jsxRuntime.jsx("a",{href:e,class:"btn btn-sm btn-ghost",children:"Clear"}),s&&jsxRuntime.jsxs("span",{class:"text-xs text-warning ml-auto flex items-center gap-1",children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})}),r?"Collection group queries require a composite index":"Multiple filters may require a composite index"]})]})]})})]})}function We(e,t,n,r,a,o){let s=n==="create"?`Create ${e}`:`Edit ${e} / ${r??""}`,c=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(jsxRuntime.jsx(oe,{opts:{title:s,breadcrumb:c,basePath:a,flash:o},children:jsxRuntime.jsx("div",{class:"card bg-base-100 border border-base-300",children:jsxRuntime.jsx("div",{class:"card-body p-6",children:jsxRuntime.jsx("div",{dangerouslySetInnerHTML:{__html:t}})})})}))}_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 Rt(e,t,n,r,a){let o=Qe(e,r,a);return o.set("cursor",t),o.set("dir",n),`?${o.toString()}`}function Sn(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 An(e,t,n){return `?${Qe(t,n,e).toString()}`}function Xe(e,t,n,r,a,o,s=[],c=[],l=false,p=[],b,g,$,C,h,U,D,B=false){let m=`${r}/${e}`,f=`${m}/create`,k={};if(D)for(let y of n)k[y]=ge(he(D,y));let i=(U??[]).filter(y=>{let N=k[y]??ge(he(D,y));return N==="string"||N==="number"||N==="bigint"||N==="boolean"||N==="enum"||N==="literal"}),d=i.length>0,u=l,w=u||d,I=i.map(y=>{let N=he(D,y),S=ge(N),A=s.find(T=>T.name===y);return {name:y,type:S,enumValues:A?.enumValues??null,nullable:A?.nullable??false}});return ae(jsxRuntime.jsxs(oe,{opts:{title:e,breadcrumb:[{label:"Repositories",href:r},{label:e}],basePath:r,flash:o},children:[s.length>0&&jsxRuntime.jsx(Ge,{action:m,columnMeta:s,activeFilters:c,isGroup:C}),$&&jsxRuntime.jsxs("div",{role:"alert",class:`alert ${$.type==="index"?"alert-warning":"alert-error"} mb-6 shadow-sm`,children:[jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-6 w-6 shrink-0 stroke-current",fill:"none",viewBox:"0 0 24 24",children:$.type==="index"?jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"}):jsxRuntime.jsx("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"})}),jsxRuntime.jsxs("div",{class:"flex-1",children:[jsxRuntime.jsx("h3",{class:"font-bold",children:$.type==="index"?"Composite index required":"Query failed"}),jsxRuntime.jsx("div",{class:"text-sm",children:$.message})]}),$.indexUrl&&jsxRuntime.jsx("a",{href:$.indexUrl,target:"_blank",rel:"noopener noreferrer",class:"btn btn-sm btn-outline",children:"Create Index \u2192"})]}),jsxRuntime.jsxs("div",{class:"flex flex-wrap justify-between items-center mb-4 gap-3","data-frs-toolbar":true,children:[jsxRuntime.jsxs("div",{class:"flex items-center gap-3",children:[jsxRuntime.jsxs("span",{class:"text-sm text-base-content/60",children:[t.length,typeof h=="number"&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[" ","of"," ",jsxRuntime.jsx("span",{class:"font-semibold text-base-content/80",children:h})]})," ","document",(typeof h=="number"?h:t.length)!==1&&"s"]}),jsxRuntime.jsxs("div",{class:"flex items-center gap-1.5 text-sm text-base-content/60",children:[jsxRuntime.jsx("span",{children:"Rows"}),jsxRuntime.jsx("div",{class:"join",children:[10,25,50,100].map(y=>jsxRuntime.jsx("a",{href:An(y,c,b),class:`join-item btn btn-xs ${g===y?"btn-active btn-primary":"btn-outline"}`,children:y},y))})]})]}),jsxRuntime.jsx("a",{href:f,class:"btn btn-primary btn-sm",children:"+ New"})]}),w&&jsxRuntime.jsxs("div",{class:"hidden mb-3 alert alert-info py-2 px-3","data-frs-bulk-bar":true,"data-frs-repo":e,"data-frs-total":typeof h=="number"?String(h):"","data-frs-page-size":String(g??t.length),"data-frs-allow-delete":u?"1":"0","data-frs-allow-update":d?"1":"0","data-frs-fields":JSON.stringify(I),"data-frs-filters":JSON.stringify(c),children:[jsxRuntime.jsxs("div",{class:"flex-1 text-sm",children:[jsxRuntime.jsx("span",{"data-frs-bulk-summary":true,children:"0 selected"}),typeof h=="number"&&h>t.length&&jsxRuntime.jsxs("button",{type:"button",class:"ml-3 link text-sm hidden","data-frs-bulk-select-all":true,children:["Select all ",h," matching documents"]}),jsxRuntime.jsxs("span",{class:"hidden ml-3 italic","data-frs-bulk-all-active":true,children:["All ",h??"?"," matching documents are selected."," ",jsxRuntime.jsx("button",{type:"button",class:"link","data-frs-bulk-clear":true,children:"Clear selection"})]})]}),jsxRuntime.jsxs("div",{class:"flex gap-2",children:[d&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-outline","data-frs-bulk-action":"update",children:"Update field\u2026"}),u&&jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-error btn-outline","data-frs-bulk-action":"delete",children:"Delete"})]})]}),jsxRuntime.jsx("div",{class:"overflow-x-auto rounded-box border border-base-300 bg-base-100","data-frs-table-wrap":true,children:jsxRuntime.jsxs("table",{class:"table table-sm w-full","data-frs-table":true,"data-frs-repo":e,"data-frs-colcount":n.length,children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsxs("tr",{class:"bg-base-200/50",children:[w&&jsxRuntime.jsx("th",{class:"w-8",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-page":true,"aria-label":"Select all on this page"})}),[...n].map((y,N)=>{let S=b?.field===y,A=S?b.dir==="asc"?" \u25B2":" \u25BC":"";return jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:jsxRuntime.jsxs("a",{href:Sn(y,b,c,g),class:`hover:text-base-content inline-flex items-center gap-0.5${S?" text-primary font-bold":""}`,children:[y,A]})},N)}),p.map((y,N)=>jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide",children:y.column},`rel-${N}`)),jsxRuntime.jsx("th",{class:"text-xs font-semibold text-base-content/60 uppercase tracking-wide text-right",children:"Actions"})]})}),jsxRuntime.jsx("tbody",{children:t.length===0?jsxRuntime.jsx("tr",{children:jsxRuntime.jsx("td",{colspan:n.length+p.length+1+(w?1:0),class:"text-center py-16 text-base-content/40",children:"No documents found"})}):t.map((y,N)=>{let S=String(y.docId??y.id??""),A=`${r}/${e}/${encodeURIComponent(S)}/edit`,T=`${r}/${e}/${encodeURIComponent(S)}/delete`;return jsxRuntime.jsxs("tr",{class:"hover","data-frs-row-id":S,children:[w&&jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","data-frs-select-row":true,value:S,"aria-label":`Select ${S}`})}),n.map((E,j)=>{let M=y[E],P=k[E],v=P?Ae(P,M):null;return jsxRuntime.jsx("td",{class:"align-top py-2",children:jsxRuntime.jsx(ye,{val:M,mismatch:v})},j)}),p.map((E,j)=>{let M=y[E.key];if(M==null||M==="")return jsxRuntime.jsx("td",{class:"py-2"},`rel-${j}`);let P=E.type==="one"?`${r}/${E.targetRepo}/${encodeURIComponent(String(M))}/edit`:`${r}/${E.targetRepo}?fv_${E.targetKey}=${encodeURIComponent(String(M))}`;return jsxRuntime.jsx("td",{class:"align-middle py-2",children:jsxRuntime.jsx("a",{href:P,class:"btn btn-xs btn-ghost btn-outline","data-frs-relation":true,"data-frs-rel-type":E.type,"data-frs-rel-repo":E.targetRepo,"data-frs-rel-fk":E.targetKey,"data-frs-rel-val":String(M),"data-frs-rel-label":E.column,children:E.column})},`rel-${j}`)}),jsxRuntime.jsx("td",{class:"align-middle text-right whitespace-nowrap py-2",children:jsxRuntime.jsxs("div",{class:"flex gap-1 justify-end",children:[jsxRuntime.jsx("a",{href:A,class:"btn btn-xs btn-outline",children:"Edit"}),B&&jsxRuntime.jsx("a",{href:`${r}/${e}/${encodeURIComponent(S)}/history`,class:"btn btn-xs btn-outline",title:"View change history",children:"History"}),l&&jsxRuntime.jsx("form",{method:"post",action:T,onsubmit:"return confirm('Delete this document?')",children:jsxRuntime.jsx("button",{type:"submit",class:"btn btn-xs btn-error btn-outline",children:"Delete"})})]})})]},N)})})]})}),(a.hasPrev||a.hasNext)&&jsxRuntime.jsxs("div",{class:"flex flex-col items-center mt-6 gap-2",children:[jsxRuntime.jsxs("div",{class:"flex justify-center items-center gap-2",children:[a.hasPrev?jsxRuntime.jsx("a",{href:Rt(c,a.prevCursor,"prev",b,g),class:"btn btn-sm btn-outline",children:"\u2190 Previous"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"\u2190 Previous"}),a.hasNext?jsxRuntime.jsx("a",{href:Rt(c,a.nextCursor,"next",b,g),class:"btn btn-sm btn-outline",children:"Next \u2192"}):jsxRuntime.jsx("button",{class:"btn btn-sm btn-outline",disabled:true,children:"Next \u2192"})]}),typeof h=="number"&&jsxRuntime.jsxs("div",{class:"text-xs text-base-content/50",children:[h," total document",h!==1?"s":"",c.length>0?" matching filters":""]})]}),w&&d&&jsxRuntime.jsxs("dialog",{id:"frs-bulk-update-modal",class:"modal",children:[jsxRuntime.jsxs("div",{class:"modal-box",children:[jsxRuntime.jsx("h3",{class:"font-bold text-lg mb-3",children:"Bulk update field"}),jsxRuntime.jsx("p",{class:"text-sm text-base-content/60 mb-4","data-frs-bulk-update-summary":true,children:"Update one field on the selected documents."}),jsxRuntime.jsxs("form",{method:"dialog","data-frs-bulk-update-form":true,children:[jsxRuntime.jsxs("label",{class:"form-control w-full mb-3",children:[jsxRuntime.jsx("div",{class:"label",children:jsxRuntime.jsx("span",{class:"label-text text-xs uppercase tracking-wide",children:"Field"})}),jsxRuntime.jsxs("select",{class:"select select-bordered select-sm w-full",name:"field",required:true,"data-frs-bulk-field-select":true,children:[jsxRuntime.jsx("option",{value:"",children:"\u2014 Select a field \u2014"}),i.map(y=>jsxRuntime.jsx("option",{value:y,children:y},y))]})]}),jsxRuntime.jsx("div",{class:"mb-4","data-frs-bulk-value-container":true}),jsxRuntime.jsxs("div",{class:"modal-action",children:[jsxRuntime.jsx("button",{type:"button",class:"btn btn-sm btn-ghost","data-frs-bulk-update-cancel":true,children:"Cancel"}),jsxRuntime.jsx("button",{type:"submit",class:"btn btn-sm btn-primary","data-frs-bulk-update-submit":true,children:"Apply"})]})]})]}),jsxRuntime.jsx("form",{method:"dialog",class:"modal-backdrop",children:jsxRuntime.jsx("button",{children:"close"})})]})]}))}function Ie(e,t){return Je(e,t)}function $t(e,t){return Ke(e,t)}function Ct(e,t,n,r,a,o,s,c,l,p,b,g,$,C,h,U,D,B){return Xe(e,t,n,r,a,o,s,c,l,p,b,g,$,C,h,U,D,B)}function ue(e,t,n,r,a,o){return We(e,t,n,r,a,o)}var Ye="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function En(){let e="";for(;e.length<20;){let t=crypto.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 o=1;o<r.length;o+=2)a.push(r[o]);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 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 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,o]of Object.entries(n)){let s=at(o);if(s==="ZodObject"){if(e[a+"__isnull"]==="1"){r[a]=null;continue}let p={},b=false;for(let[C,h]of Object.entries(e))C.startsWith(`${a}.`)&&(p[C.slice(a.length+1)]=h,b=true);if(b){let C=o;for(;;){let h=L(C);if(h==="ZodOptional"||h==="ZodNullable"||h==="ZodDefault")C=G(C);else break}r[a]=nt(p,C);continue}let g=e[a],$=Array.isArray(g)?g[g.length-1]:g;if($)try{r[a]=JSON.parse($);}catch{r[a]=$;}continue}let c=e[a],l=Array.isArray(c)?c[c.length-1]:c;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 Et(e){let t=null;if(e instanceof Date)t=e;else if(typeof e=="object"&&e!==null&&typeof e.toDate=="function")t=e.toDate();else if(typeof e=="object"&&e!==null&&"_seconds"in e&&"_nanoseconds"in e)t=new Date(e._seconds*1e3+Math.floor(e._nanoseconds/1e6));else if(typeof e=="string"||typeof e=="number"){let 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 Tn(e){let t=e;for(;;){let n=L(t);if(n==="ZodOptional"||n==="ZodNullable"||n==="ZodDefault")t=G(t);else return t}}function Ot(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 _t(e){let t=Tn(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(o=>typeof o=="string");return a.length>0?a:void 0}if(n==="ZodLiteral"){let r=Se(t);return typeof r=="string"?[r]:void 0}}function Nt(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 c=t.shape[a];for(;;){let p=L(c);if(p==="ZodOptional"||p==="ZodNullable"||p==="ZodDefault")c=G(c);else break}let l=L(c);if(l==="ZodObject"&&typeof s=="object"&&s!==null&&!Array.isArray(s)){let p=Nt(s,c,o);Object.assign(r,p);}else if(l==="ZodDate"){let p=Et(s);p!==null&&(r[o]=p);}else if(typeof s=="object"&&s!==null&&!Array.isArray(s)&&("_seconds"in s||typeof s.toDate=="function")){let p=Et(s);r[o]=p??JSON.stringify(s,null,2);}else typeof s=="object"?r[o]=JSON.stringify(s,null,2):r[o]=String(s);}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 On(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 c=(o??"").trim();if(!c)continue;let l=e[`fo_${s}`]??"==",p=n.has(l)?l:"==";r.push({field:s,op:p,value:c});}return r}function Tt(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 Pt(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 c=at(s);if(c==="ZodObject"){let l=s;for(;;){let b=L(l);if(b==="ZodOptional"||b==="ZodNullable"||b==="ZodDefault")l=G(l);else break}let p=ee(l);r.push(...Pt(Object.keys(p),l,o));}else r.push({name:o,zodType:c,nullable:Ot(s),enumValues:_t(s)});}return r}function _n(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=G(r);else break}let o=ee(r);if(!(a in o))return null;r=o[a];}return r}function pe(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 c=o.slice(0,s),l=o.slice(s+1);r.has(c)||r.set(c,[]),r.get(c).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 c=e.shape[o];for(;;){let l=L(c);if(l==="ZodOptional"||l==="ZodNullable"||l==="ZodDefault")c=G(c);else break}if(L(c)!=="ZodObject"){a[o]=e.shape[o];continue}a[o]=pe(c,s);}return zod.z.object(a)}function ne(e,t,n){return ze(e,t,n)}function It(e,t,n){let r=(m,f)=>{let k=ne(m,t,n),i=Object.values(e).map(d=>({name:d.name,path:d.path}));_(f,$t(i,k));},a=async(m,f)=>{let k=m.params.repoName;if(!k){_(f,"Bad request",400);return}let i=e[k];if(!i){_(f,"Repository not found",404);return}let d=i.pageSize??25,u=m.query??{},w=u.cursor,I=u.dir==="prev"?"prev":"next",y=u.ob??"",N=u.od==="desc"?"desc":"asc",S=y?{field:y,dir:N}:void 0,A=parseInt(u.ps??""),T=Number.isFinite(A)&&A>0?Math.min(A,200):d,E=i.listColumns??Object.keys(i.schema.shape),j=i.documentKey??"docId",M=[j,...E.filter(V=>V!==j)];S&&(new Set([j,...E]).has(S.field)||(S=void 0));let P=i.filterableFields?(()=>{let V=[];for(let Y of i.filterableFields)(Y.includes(".")||E.includes(Y))&&V.push(Y);return V})():E,v=(()=>{let V=[];for(let Y of P)if(Y.includes(".")){let me=_n(i.schema,Y);V.push({name:Y,zodType:me?at(me):"ZodString",nullable:me?Ot(me):false,enumValues:me?_t(me):void 0});}else V.push(...Pt([Y],i.schema));return V})(),q=new Set(v.map(V=>V.name)),ie=On(u,q),re=Tt(ie),xe;if(w)try{let V=i.repo.ref;typeof V.doc=="function"&&(xe=await V.doc(w).get());}catch{}let[K,Ce]=await Promise.all([i.repo.query.paginate({pageSize:T,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,Dt=fe?[]:K.data,jt=fe?"":K.nextCursor?.id??"",Lt=fe?"":K.prevCursor?.id??"",Bt=fe?K.queryError:void 0,Mt=ne(m,t,n);_(f,Ct(i.name,Dt,M,Mt,{hasPrev:fe?false:K.hasPrevPage,hasNext:fe?false:K.hasNextPage,prevCursor:Lt,nextCursor:jt},void 0,v,ie,i.allowDelete??false,i.relationalMeta,S,T,Bt,i.isGroup,Ce,i.mutableFields,i.schema,i.historyEnabled));},o=(m,f)=>{let k=m.params.repoName;if(!k){_(f,"Bad request",400);return}let i=e[k];if(!i){_(f,"Repository not found",404);return}let d=ne(m,t,n),u=pe(i.schema,i.createFields),w=te(u),I=`${d}/${i.name}/create`,y=le(w,I,"POST","Create document");_(f,ue(i.name,y,"create",null,d));},s=async(m,f)=>{let k=m.params.repoName;if(!k){_(f,"Bad request",400);return}let i=e[k];if(!i){_(f,"Repository not found",404);return}let d=ne(m,t,n),u=m.body??{},w=nt(u,i.schema),I=pe(i.schema,i.createFields),y=I.safeParse(w);if(!y.success){let N=te(I),S=`${d}/${i.name}/create`,A=le(N,S,"POST","Create document"),T=y.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`).join(", ");_(f,ue(i.name,A,"create",null,d,{type:"error",message:`Validation error: ${T}`}),422);return}try{if(i.isGroup&&i.parentKeys&&i.parentKeys.length>0){let N={...y.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]),T=i.documentKey??"docId",E=N[T]||En();await i.repo.set(...A,E,N);}else await i.repo.create(y.data);tt(f,`${d}/${i.name}?flash=created`);}catch(N){let S=pe(i.schema,i.createFields),A=te(S),T=`${d}/${i.name}/create`,E=le(A,T,"POST","Create document");_(f,ue(i.name,E,"create",null,d,{type:"error",message:`Save error: ${N.message}`}),500);}},c=async(m,f)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(f,"Bad request",400);return}let d=e[k];if(!d){_(f,"Repository not found",404);return}let u=ne(m,t,n),w=null;try{w=await ve(d,i);}catch(T){let E=et(d,i,T),j=de(T)?424:500;_(f,Ie("",{title:`Edit ${d.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:d.name,href:`${u}/${d.name}`},{label:`Edit ${i}`}],flash:E}),j);return}if(!w){_(f,"Document not found",404);return}let I=Nt(w,d.schema),y=pe(d.schema,d.mutableFields),N=rt(te(y),I),S=`${u}/${d.name}/${encodeURIComponent(i)}/edit`,A=le(N,S,"POST","Save changes");_(f,ue(d.name,A,"edit",i,u));},l=async(m,f)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(f,"Bad request",400);return}let d=e[k];if(!d){_(f,"Repository not found",404);return}let u=ne(m,t,n),w=m.body??{},I=nt(w,d.schema),y=pe(d.schema,d.mutableFields),S=y.partial().safeParse(I);if(!S.success){let A=Object.fromEntries(Object.entries(w).map(([P,v])=>[P,Array.isArray(v)?v.join(","):v??""])),T=rt(te(y),A),E=`${u}/${d.name}/${encodeURIComponent(i)}/edit`,j=le(T,E,"POST","Save changes"),M=S.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`).join(", ");_(f,ue(d.name,j,"edit",i,u,{type:"error",message:`Validation error: ${M}`}),422);return}try{let A=await ve(d,i),T=(A&&Ze(A,d.pathKey))??[i];await d.repo.update(...T,S.data),tt(f,`${u}/${d.name}?flash=updated`);}catch(A){let T=pe(d.schema,d.mutableFields),E=te(T),j=`${u}/${d.name}/${encodeURIComponent(i)}/edit`,M=le(E,j,"POST","Save changes"),P=de(A)?et(d,i,A):{type:"error",message:`Save error: ${A.message}`},v=de(A)?424:500;_(f,ue(d.name,M,"edit",i,u,P),v);}},p=async(m,f)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(f,"Bad request",400);return}let d=e[k];if(!d){_(f,"Repository not found",404);return}if(!d.allowDelete){_(f,"Delete is not allowed for this repository",403);return}let u=ne(m,t,n);try{let w=await ve(d,i),I=(w&&Ze(w,d.pathKey))??[i];await d.repo.delete(...I),tt(f,`${u}/${d.name}?flash=deleted`);}catch(w){let I=de(w)?et(d,i,w):{type:"error",message:`Delete error: ${w.message}`},y=de(w)?424:500;_(f,Ie("",{title:`Delete ${d.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:d.name,href:`${u}/${d.name}`},{label:`Delete ${i}`}],flash:I}),y);}},b=async(m,f)=>{let k=m.params.repoName;if(!k){_(f,"Bad request",400);return}let i=e[k];if(!i){_(f,"Repository not found",404);return}let d=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)),y=i.listColumns??Object.keys(ee(i.schema)),{PanelOne:N,PanelMany:S}=await Promise.resolve().then(()=>(Ve(),kt)),{renderToString:A}=await import('hono/jsx/dom/server');if(w==="one"){let v=String(u?.id??"");if(!v){_(f,"<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:d,schema:i.schema,columns:y}));_(f,ie);}catch(q){_(f,`<div class='p-6 text-error text-sm'>Error: ${q.message}</div>`,500);}return}let T=String(u?.fk??""),E=String(u?.fv??"");if(!T||!E){_(f,"<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:[[T,"==",Nn(E)]]}),q=A(S({docs:v.data,repoName:i.name,basePath:d,fk:T,fv:E,columns:y,schema:i.schema,pagination:{hasPrev:v.hasPrevPage,hasNext:v.hasNextPage,prevCursor:v.prevCursor?.id??"",nextCursor:v.nextCursor?.id??"",pageSize:I}}));_(f,q);}catch(v){_(f,`<div class='p-6 text-error text-sm'>Error: ${v.message}</div>`,500);}},g=async(m,f)=>{let k=[];for(let i of f){let d;if(m.isGroup||m.parentKeys?.length){let u=await ve(m,i);d=u?Ze(u,m.pathKey):void 0;}d||(d=[i]);try{let u=m.repo.documentRef(...d);u&&k.push(u);}catch{}}return k},$=async(m,f)=>{let k=Tt(f),i=m.documentKey??"docId",d=[],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 y=String(I[i]??I.id??"");y&&d.push(y);}if(!w.hasNextPage||!w.nextCursor)break;u=w.nextCursor;}return d},C=async(m,f)=>{let k=m.params.repoName;if(!k){Q(f,{error:"Bad request"},400);return}let i=e[k];if(!i){Q(f,{error:"Repository not found"},404);return}if(!i.allowDelete){Q(f,{error:"Delete is not allowed for this repository"},403);return}let d=m.body??{};try{let u=await U(i,d);if(u.length===0){Q(f,{deleted:0});return}let w=await g(i,u);for(let I=0;I<w.length;I+=500)await i.repo.bulk.delete(w.slice(I,I+500));Q(f,{deleted:w.length});}catch(u){Q(f,{error:u.message},500);}},h=async(m,f)=>{let k=m.params.repoName;if(!k){Q(f,{error:"Bad request"},400);return}let i=e[k];if(!i){Q(f,{error:"Repository not found"},404);return}let d=m.body??{},u=String(d.field??"");if(!u){Q(f,{error:"Missing 'field'"},400);return}if(!i.mutableFields||!i.mutableFields.includes(u)){Q(f,{error:`Field '${u}' is not bulk-updatable`},403);return}let w=i.schema.shape?.[u],I=d.value;if(w){let y=w.safeParse(d.value);if(!y.success){Q(f,{error:`Invalid value for '${u}': ${y.error.message}`},400);return}I=y.data;}try{let y=await U(i,d);if(y.length===0){Q(f,{updated:0});return}let S=(await g(i,y)).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(f,{updated:S.length});}catch(y){Q(f,{error:y.message},500);}};async function U(m,f){if(f.selectAll){let k=D(f.filters,m);return await $(m,k)}return Array.isArray(f.ids)?f.ids.filter(k=>typeof k=="string"&&!!k):[]}function D(m,f){if(!Array.isArray(m))return [];let k=new Set((f.filterableFields??Object.keys(ee(f.schema))).map(u=>String(u))),i=new Set(["==","!=","<","<=",">",">=","in","not-in","array-contains","array-contains-any"]),d=[];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))&&d.push({field:u.field,op:u.op,value:u.value});return d}return {handleDashboard:r,handleList:a,handleCreateForm:o,handleCreateSubmit:s,handleEditForm:c,handleEditSubmit:l,handleDelete:p,handlePanel:b,handleBulkDelete:C,handleBulkUpdate:h,handleHistory:async(m,f)=>{let k=m.params.repoName,i=m.params.id;if(!k||!i){_(f,"Bad request",400);return}let d=e[k];if(!d){_(f,"Repository not found",404);return}if(!d.historyEnabled||!d.repo.history){_(f,"History not enabled for this repository",404);return}let u=ne(m,t,n),w=d.historySubcollection??"history",I=[i];try{let v=await ve(d,i),q=v?Ze(v,d.pathKey):void 0;q&&q.length>0&&(I=q);}catch{}let y=parseInt(String(m.query?.limit??"")),N=Number.isFinite(y)&&y>0?Math.min(y,500):100,S=[],A;try{S=await d.repo.history.list(...I,{limit:N});}catch(v){A=v.message;}let T=v=>String(v??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),E=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">${T(JSON.stringify(v))}</code>`}catch{return T(String(v))}return T(String(v))},j=v=>v?typeof v.toDate=="function"?v.toDate().toISOString():v instanceof Date?v.toISOString():T(String(v)):"",M=v=>`<span class="badge badge-sm ${v==="create"?"badge-success":v==="delete"?"badge-error":"badge-info"}">${T(v)}</span>`,P="";if(P+='<div class="flex items-center justify-between mb-4">',P+=`<a href="${u}/${d.name}/${encodeURIComponent(i)}/edit" class="btn btn-sm btn-outline">\u2190 Back to edit</a>`,P+=`<a href="${u}/${d.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>${T(w)}</code> \xB7 Showing up to ${N} entries.</p>`,A)P+=`<div class="alert alert-error mb-4">${T(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=>T(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 Ce=v.changes[K];return `<li><strong>${T(K)}</strong>: ${E(Ce.oldValue)} \u2192 ${E(Ce.newValue)}</li>`}).join("")+"</ul>",P+="<tr>",P+=`<td class="whitespace-nowrap text-xs font-mono">${T(j(v.historySetAt))}</td>`,P+=`<td>${M(v.operation??"update")}</td>`,P+=`<td class="text-xs">${T(q.userEmail??q.userId??"")}</td>`,P+=`<td class="text-xs">${ie}</td>`,P+=`<td>${re}</td>`,P+="</tr>";}P+="</tbody></table></div>";}_(f,Ie(P,{title:`History \u2014 ${d.name} / ${i}`,basePath:u,breadcrumb:[{label:"Repositories",href:u},{label:d.name,href:`${u}/${d.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 Nn(e){return e==="true"?true:e==="false"?false:e!==""&&!isNaN(Number(e))?Number(e):e}function Pn(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 In(e){let t=e.path??e.url??"/",n=t.indexOf("?");return n===-1?t:t.slice(0,n)}var $e=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}=Pn(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=In(t),o=null,s={};for(let p of this.routes){if(p.method!==r)continue;let b=a.match(p.pattern);if(b){o=p,s={},p.paramNames.forEach((g,$)=>{s[g]=decodeURIComponent(b[$+1]??"");});break}}let c=Object.assign(t,{params:s}),l=o?o.handler:this.notFoundHandler;try{await this.runMiddlewareChain(c,n,l);}catch(p){this.errorHandler(p,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 Zt="https://cdn.jsdelivr.net",zt="https://www.gstatic.com",Zn=["default-src 'self'",`script-src 'self' 'unsafe-inline' 'unsafe-eval' ${Zt} ${zt}`,`style-src 'self' 'unsafe-inline' ${Zt}`,`connect-src 'self' ${zt} 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 Ft(e={}){let t=e.csp===void 0?Zn: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,c)=>{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 c();}}async function zn(e){return typeof e.rawBody=="string"?e.rawBody:Buffer.isBuffer(e.rawBody)?e.rawBody.toString("utf8"):""}function Fn(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 sa(e){let{basePath:t="/",repos:n,parseBody:r=true,securityHeaders:a,auth:o,middleware:s=[],httpsOptions:c}=e,l=t==="/"?"":t.replace(/\/$/,""),p={};for(let[C,h]of Object.entries(n)){let U=h.schema??h.repo.schema??null;if(!U)throw new Error(`[createAdminServer] Repository "${C}" has no Zod schema. Either use createRepositoryConfig(schema)(config) or pass schema: explicitly.`);let D,B,m;if(h.fieldsConfig){let i=h.fieldsConfig;D=[],B=[],m=[];for(let[d,u]of Object.entries(i))for(let w of u)w==="filterable"?D.push(d):w==="mutable"?B.push(d):w==="create"&&m.push(d);D.length===0&&(D=void 0),B.length===0&&(B=void 0),m.length===0&&(m=void 0);}let f=(()=>{let i=h.repo._parentKeys;return i&&i.length>0?i:void 0})();if(f&&m)for(let i of f)m.includes(i)||m.push(i);let k={name:C,path:h.path,repo:h.repo,schema:U,documentKey:h.documentKey??"docId",pathKey:h.repo._pathKey??void 0,isGroup:!!h.repo._isGroup,parentKeys:f,createdKey:h.repo._createdKey??void 0,listColumns:h.listColumns,pageSize:h.pageSize,filterableFields:D,mutableFields:B,createFields:m,allowDelete:h.allowDelete??false,historyEnabled:!!h.repo._historyConfig?.enabled,historySubcollection:(h.repo._historyConfig?.enabled&&h.repo._historySubcollection)??void 0,relationalMeta:(()=>{if(!h.relationalFields||h.relationalFields.length===0)return;let i=h.repo.relationalKeys??{},d=[];for(let u of h.relationalFields){let w=i[u.key];w&&d.push({key:u.key,column:u.column,targetRepo:String(w.repo),targetKey:String(w.key),type:w.type});}return d.length>0?d:void 0})()};p[C]=k;}let b=It(p,l,ot(c?.region)),g=new $e;if(a!==false&&g.use(Ft(a===void 0?{}:a)),r&&g.use(async(C,h,U)=>{let D=C,B=String(D.headers?.["content-type"]??"");if(B.includes("application/x-www-form-urlencoded")){let m=await zn(D);C.body=Fn(m);}else if(B.includes("application/json")&&typeof D.body=="string")try{C.body=JSON.parse(D.body);}catch{}await U();}),o)if(Fe(o)){for(let C of o.routes){let h=`${l}${C.path}`;C.method==="GET"?g.get(h,C.handler):g.post(h,C.handler);}g.use(o.middleware);}else if(typeof o=="function")g.use(o);else {let C=o.realm??"Admin",h="Basic "+Buffer.from(`${o.username}:${o.password}`).toString("base64");g.use((U,D,B)=>{if((U.headers?.authorization??"")!==h){D.status(401).set("WWW-Authenticate",`Basic realm="${C}"`).set("Content-Type","text/plain").send("Unauthorized");return}B();});}for(let C of s)g.use(C);g.get(`${l}/`,b.handleDashboard),g.get(`${l}`,b.handleDashboard),g.get(`${l}/:repoName/_panel`,b.handlePanel),g.post(`${l}/:repoName/_bulk/delete`,b.handleBulkDelete),g.post(`${l}/:repoName/_bulk/update`,b.handleBulkUpdate),g.get(`${l}/:repoName`,b.handleList),g.get(`${l}/:repoName/create`,b.handleCreateForm),g.post(`${l}/:repoName/create`,b.handleCreateSubmit),g.get(`${l}/:repoName/:id/edit`,b.handleEditForm),g.post(`${l}/:repoName/:id/edit`,b.handleEditSubmit),g.get(`${l}/:repoName/:id/history`,b.handleHistory),g.post(`${l}/:repoName/:id/delete`,b.handleDelete);let $=async(C,h)=>{await g.handle(C,h);};return c&&($.httpsOptions=c),$}
|
|
1064
1064
|
exports.MiniRouter=$e;exports.createAdminServer=sa;//# sourceMappingURL=index.cjs.map
|
|
1065
1065
|
//# sourceMappingURL=index.cjs.map
|