@kingsleyweb/bun-ui 0.0.0-stage → 3.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +80 -2
- package/app/docs/App.tsx +72 -0
- package/app/docs/api/client.ts +303 -0
- package/app/docs/api/contract.ts +24 -0
- package/app/docs/api/docs.ts +38 -0
- package/app/docs/api/errors.ts +144 -0
- package/app/docs/boot.tsx +58 -0
- package/app/docs/components/Badge.tsx +65 -0
- package/app/docs/components/Button.tsx +37 -0
- package/app/docs/components/Card.tsx +41 -0
- package/app/docs/components/ConfirmDialog.tsx +173 -0
- package/app/docs/components/CopyButton.tsx +68 -0
- package/app/docs/components/Dialog.tsx +230 -0
- package/app/docs/components/EmptyState.tsx +34 -0
- package/app/docs/components/ErrorView.tsx +70 -0
- package/app/docs/components/Field.tsx +93 -0
- package/app/docs/components/JsonEditor.tsx +151 -0
- package/app/docs/components/JsonView.tsx +338 -0
- package/app/docs/components/KeyValue.tsx +63 -0
- package/app/docs/components/ProblemBanner.tsx +116 -0
- package/app/docs/components/ScreenErrorBoundary.tsx +141 -0
- package/app/docs/components/Spinner.tsx +33 -0
- package/app/docs/components/Table.tsx +33 -0
- package/app/docs/components/Tabs.tsx +226 -0
- package/app/docs/components/classNames.ts +4 -0
- package/app/docs/components/components.css +691 -0
- package/app/docs/components/copy.ts +89 -0
- package/app/docs/components/fieldContext.ts +29 -0
- package/app/docs/components/inputValues.ts +142 -0
- package/app/docs/components/inputs.tsx +387 -0
- package/app/docs/components/jsonParse.ts +338 -0
- package/app/docs/components/listKeys.ts +30 -0
- package/app/docs/config.ts +86 -0
- package/app/docs/context.ts +33 -0
- package/app/docs/embed.ts +74 -0
- package/app/docs/env.d.ts +2 -0
- package/app/docs/format.ts +9 -0
- package/app/docs/hooks/useUrlTab.ts +16 -0
- package/app/docs/main.tsx +11 -0
- package/app/docs/queryClient.ts +54 -0
- package/app/docs/router.tsx +194 -0
- package/app/docs/routing.ts +194 -0
- package/app/docs/screens/docs/document.ts +27 -0
- package/app/docs/screens/docs/http/OperationView.tsx +407 -0
- package/app/docs/screens/docs/http/Sidebar.tsx +190 -0
- package/app/docs/screens/docs/http/TryItPanel.tsx +603 -0
- package/app/docs/screens/docs/http/http.css +405 -0
- package/app/docs/screens/docs/http/index.tsx +395 -0
- package/app/docs/screens/docs/http/model.ts +604 -0
- package/app/docs/screens/docs/http/tryIt.ts +455 -0
- package/app/docs/screens/docs/permissions.ts +6 -0
- package/app/docs/screens/docs/schema/Prose.tsx +43 -0
- package/app/docs/screens/docs/schema/SchemaTree.tsx +319 -0
- package/app/docs/screens/docs/schema/index.ts +30 -0
- package/app/docs/screens/docs/schema/resolve.ts +466 -0
- package/app/docs/screens/docs/schema/schema.css +137 -0
- package/app/docs/screens/docs/schema/skeleton.ts +92 -0
- package/app/docs/screens/docs/viewer.tsx +154 -0
- package/app/docs/screens/docs/ws/InlineText.tsx +25 -0
- package/app/docs/screens/docs/ws/PayloadSchema.tsx +39 -0
- package/app/docs/screens/docs/ws/format.ts +82 -0
- package/app/docs/screens/docs/ws/index.tsx +286 -0
- package/app/docs/screens/docs/ws/items.tsx +786 -0
- package/app/docs/screens/docs/ws/model.ts +1178 -0
- package/app/docs/screens/docs/ws/panels.tsx +440 -0
- package/app/docs/screens/docs/ws/ws.css +231 -0
- package/app/docs/shortcuts.ts +94 -0
- package/app/docs/styles/base.css +847 -0
- package/app/docs/styles/tokens.css +143 -0
- package/app/docs/theme.ts +56 -0
- package/app/kit/unauthorized.ts +222 -0
- package/dist/docs/assets/main-0rchxtv5.js +18 -0
- package/dist/docs/assets/main-0rchxtv5.js.map +99 -0
- package/dist/docs/assets/main-cqgyvs86.css +1 -0
- package/dist/docs/manifest.json +26 -0
- package/dist/jobs/assets/AddFlowDialog-h6xkgx9b.js +6 -0
- package/dist/jobs/assets/AddFlowDialog-h6xkgx9b.js.map +11 -0
- package/dist/jobs/assets/AddFlowDialog-n7gtc84v.css +1 -0
- package/dist/jobs/assets/added-cbwsxv3e.js +4 -0
- package/dist/jobs/assets/added-cbwsxv3e.js.map +11 -0
- package/dist/jobs/assets/bodies-yyw5hmrp.js +6 -0
- package/dist/jobs/assets/bodies-yyw5hmrp.js.map +10 -0
- package/dist/jobs/assets/channel-tgkvqm8y.js +4 -0
- package/dist/jobs/assets/channel-tgkvqm8y.js.map +10 -0
- package/dist/jobs/assets/channelChecks-s4yz4yhw.js +4 -0
- package/dist/jobs/assets/channelChecks-s4yz4yhw.js.map +10 -0
- package/dist/jobs/assets/index-02427smp.css +1 -0
- package/dist/jobs/assets/index-09z2cjft.js +4 -0
- package/dist/jobs/assets/index-09z2cjft.js.map +16 -0
- package/dist/jobs/assets/index-18bn0gvy.css +1 -0
- package/dist/jobs/assets/index-47pxmyxn.js +4 -0
- package/dist/jobs/assets/index-47pxmyxn.js.map +10 -0
- package/dist/jobs/assets/index-4e55z986.js +4 -0
- package/dist/jobs/assets/index-4e55z986.js.map +11 -0
- package/dist/jobs/assets/index-5c933424.js +4 -0
- package/dist/jobs/assets/index-5c933424.js.map +18 -0
- package/dist/jobs/assets/index-5kbyqspm.css +1 -0
- package/dist/jobs/assets/index-5ng37hk6.css +1 -0
- package/dist/jobs/assets/index-5w8w7fvc.css +1 -0
- package/dist/jobs/assets/index-71qs5qyx.css +1 -0
- package/dist/jobs/assets/index-btpg4r8b.css +1 -0
- package/dist/jobs/assets/index-d5r5n0mm.js +4 -0
- package/dist/jobs/assets/index-d5r5n0mm.js.map +23 -0
- package/dist/jobs/assets/index-e0yy2skq.css +1 -0
- package/dist/jobs/assets/index-hs60b25v.js +10 -0
- package/dist/jobs/assets/index-hs60b25v.js.map +62 -0
- package/dist/jobs/assets/index-k2smrr70.js +4 -0
- package/dist/jobs/assets/index-k2smrr70.js.map +9 -0
- package/dist/jobs/assets/index-q24jw3w9.js +4 -0
- package/dist/jobs/assets/index-q24jw3w9.js.map +32 -0
- package/dist/jobs/assets/index-qfb80xen.css +1 -0
- package/dist/jobs/assets/index-rtynx6wj.js +4 -0
- package/dist/jobs/assets/index-rtynx6wj.js.map +10 -0
- package/dist/jobs/assets/live-6k7s6358.js +4 -0
- package/dist/jobs/assets/live-6k7s6358.js.map +10 -0
- package/dist/jobs/assets/main-0jmeh6mq.js +6 -0
- package/dist/jobs/assets/main-0jmeh6mq.js.map +12 -0
- package/dist/jobs/assets/main-3yj6bv90.js +5 -0
- package/dist/jobs/assets/main-3yj6bv90.js.map +10 -0
- package/dist/jobs/assets/main-4g69fn3x.js +5 -0
- package/dist/jobs/assets/main-4g69fn3x.js.map +10 -0
- package/dist/jobs/assets/main-4gte3eqq.js +5 -0
- package/dist/jobs/assets/main-4gte3eqq.js.map +10 -0
- package/dist/jobs/assets/main-4j1fcevh.js +5 -0
- package/dist/jobs/assets/main-4j1fcevh.js.map +10 -0
- package/dist/jobs/assets/main-54qwkz28.css +1 -0
- package/dist/jobs/assets/main-5grjvsy7.js +5 -0
- package/dist/jobs/assets/main-5grjvsy7.js.map +11 -0
- package/dist/jobs/assets/main-5zbx60gq.js +5 -0
- package/dist/jobs/assets/main-5zbx60gq.js.map +11 -0
- package/dist/jobs/assets/main-9prgjhg4.js +5 -0
- package/dist/jobs/assets/main-9prgjhg4.js.map +10 -0
- package/dist/jobs/assets/main-a250ffk7.js +17 -0
- package/dist/jobs/assets/main-a250ffk7.js.map +115 -0
- package/dist/jobs/assets/main-d6ge7w08.js +5 -0
- package/dist/jobs/assets/main-d6ge7w08.js.map +10 -0
- package/dist/jobs/assets/main-gngzht43.js +5 -0
- package/dist/jobs/assets/main-gngzht43.js.map +10 -0
- package/dist/jobs/assets/main-hg0hrg8j.js +5 -0
- package/dist/jobs/assets/main-hg0hrg8j.js.map +10 -0
- package/dist/jobs/assets/main-hm1ng3yg.js +5 -0
- package/dist/jobs/assets/main-hm1ng3yg.js.map +12 -0
- package/dist/jobs/assets/main-jkvd92z9.js +5 -0
- package/dist/jobs/assets/main-jkvd92z9.js.map +10 -0
- package/dist/jobs/assets/main-jv5xqd13.js +5 -0
- package/dist/jobs/assets/main-jv5xqd13.js.map +21 -0
- package/dist/jobs/assets/main-jxre7w93.js +5 -0
- package/dist/jobs/assets/main-jxre7w93.js.map +23 -0
- package/dist/jobs/assets/main-kwmqkjfx.js +5 -0
- package/dist/jobs/assets/main-kwmqkjfx.js.map +11 -0
- package/dist/jobs/assets/main-n9cf6bxm.js +5 -0
- package/dist/jobs/assets/main-n9cf6bxm.js.map +11 -0
- package/dist/jobs/assets/main-pegp0ygb.js +5 -0
- package/dist/jobs/assets/main-pegp0ygb.js.map +10 -0
- package/dist/jobs/assets/main-qr573853.js +5 -0
- package/dist/jobs/assets/main-qr573853.js.map +12 -0
- package/dist/jobs/assets/main-rq97rdr4.js +4 -0
- package/dist/jobs/assets/main-rq97rdr4.js.map +22 -0
- package/dist/jobs/assets/main-szjdmydc.js +5 -0
- package/dist/jobs/assets/main-szjdmydc.js.map +13 -0
- package/dist/jobs/assets/main-tnbhrm9n.js +7 -0
- package/dist/jobs/assets/main-tnbhrm9n.js.map +11 -0
- package/dist/jobs/assets/main-ts19j4n0.js +5 -0
- package/dist/jobs/assets/main-ts19j4n0.js.map +25 -0
- package/dist/jobs/assets/main-w93x1dzs.js +5 -0
- package/dist/jobs/assets/main-w93x1dzs.js.map +10 -0
- package/dist/jobs/assets/sections-0ksdxs8m.css +1 -0
- package/dist/jobs/assets/sections-0y7w4fb4.js +4 -0
- package/dist/jobs/assets/sections-0y7w4fb4.js.map +10 -0
- package/dist/jobs/assets/sse-mn0t0fh7.js +5 -0
- package/dist/jobs/assets/sse-mn0t0fh7.js.map +11 -0
- package/dist/jobs/assets/sseChecks-t7tcm7ra.js +4 -0
- package/dist/jobs/assets/sseChecks-t7tcm7ra.js.map +10 -0
- package/dist/jobs/assets/validation-ysjfy072.js +4 -0
- package/dist/jobs/assets/validation-ysjfy072.js.map +9 -0
- package/dist/jobs/manifest.json +511 -0
- package/dts/docs/assets.d.ts +144 -0
- package/dts/docs/assets.d.ts.map +1 -0
- package/dts/docs/browser/config.d.ts +61 -0
- package/dts/docs/browser/config.d.ts.map +1 -0
- package/dts/docs/browser/index.d.ts +12 -0
- package/dts/docs/browser/index.d.ts.map +1 -0
- package/dts/docs/docsUi.d.ts +42 -0
- package/dts/docs/docsUi.d.ts.map +1 -0
- package/dts/docs/hosted.d.ts +22 -0
- package/dts/docs/hosted.d.ts.map +1 -0
- package/dts/docs/index.d.ts +18 -0
- package/dts/docs/index.d.ts.map +1 -0
- package/dts/docs/shell.d.ts +57 -0
- package/dts/docs/shell.d.ts.map +1 -0
- package/dts/docs/types.d.ts +137 -0
- package/dts/docs/types.d.ts.map +1 -0
- package/dts/index.d.ts +21 -0
- package/dts/index.d.ts.map +1 -0
- package/dts/jobs/assets.d.ts +157 -0
- package/dts/jobs/assets.d.ts.map +1 -0
- package/dts/jobs/browser/config.d.ts +67 -0
- package/dts/jobs/browser/config.d.ts.map +1 -0
- package/dts/jobs/browser/index.d.ts +10 -0
- package/dts/jobs/browser/index.d.ts.map +1 -0
- package/dts/jobs/browser/unauthorized.d.ts +9 -0
- package/dts/jobs/browser/unauthorized.d.ts.map +1 -0
- package/dts/jobs/index.d.ts +24 -0
- package/dts/jobs/index.d.ts.map +1 -0
- package/dts/jobs/jobsUi.d.ts +63 -0
- package/dts/jobs/jobsUi.d.ts.map +1 -0
- package/dts/jobs/shell.d.ts +77 -0
- package/dts/jobs/shell.d.ts.map +1 -0
- package/dts/jobs/types.d.ts +146 -0
- package/dts/jobs/types.d.ts.map +1 -0
- package/dts/kit/browser/shared.d.ts +10 -0
- package/dts/kit/browser/shared.d.ts.map +1 -0
- package/dts/kit/browser/unauthorized.d.ts +74 -0
- package/dts/kit/browser/unauthorized.d.ts.map +1 -0
- package/dts/kit/unauthorized.d.ts +47 -0
- package/dts/kit/unauthorized.d.ts.map +1 -0
- package/guides/docs.md +170 -0
- package/guides/jobs.md +1120 -0
- package/lib/docs/assets.ts +427 -0
- package/lib/docs/browser/config.ts +66 -0
- package/lib/docs/browser/index.ts +24 -0
- package/lib/docs/docsUi.ts +623 -0
- package/lib/docs/hosted.ts +31 -0
- package/lib/docs/index.ts +37 -0
- package/lib/docs/shell.ts +156 -0
- package/lib/docs/types.ts +149 -0
- package/lib/index.ts +27 -0
- package/lib/jobs/assets.ts +448 -0
- package/lib/jobs/browser/config.ts +65 -0
- package/lib/jobs/browser/index.ts +9 -0
- package/lib/jobs/browser/unauthorized.ts +11 -0
- package/lib/jobs/index.ts +41 -0
- package/lib/jobs/jobsUi.ts +709 -0
- package/lib/jobs/shell.ts +205 -0
- package/lib/jobs/types.ts +162 -0
- package/lib/kit/browser/shared.ts +11 -0
- package/lib/kit/browser/unauthorized.ts +114 -0
- package/lib/kit/unauthorized.ts +222 -0
- package/package.json +198 -4
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{r,N,n,e,t}from"./main-a250ffk7.js";import{ns,ge}from"./main-5grjvsy7.js";function S(s){if(s===null)return"null";if(Array.isArray(s))return"array";switch(typeof s){case"object":return s instanceof Date?"other":"object";case"string":return"string";case"number":case"bigint":return"number";case"boolean":return"boolean";case"undefined":return"undefined";default:return"other"}}function C(s){if(typeof s==="bigint")return`${s}n`;if(s instanceof Date)return Number.isNaN(s.getTime())?"Invalid Date":s.toISOString();if(typeof s==="symbol"||typeof s==="function")return s.toString();return String(s)}function J(s,a){if(Array.isArray(s))return s.slice(0,a).map((i,u)=>[String(u),i]);let c=s;return Object.keys(c).slice(0,a).map((i)=>[i,c[i]])}function ae({value:s,label:a="JSON",expandDepth:c=1,maxStringLength:i=200,maxChildren:u=100,copyable:o=!0,className:l}){let m={expandDepth:c,maxStringLength:i,maxChildren:u};return t("div",{className:N("json-view",l),children:[o&&e("div",{className:"json-view-toolbar",children:e(ge,{text:()=>ns(s,2),ariaLabel:`Copy ${a}`})}),e("ul",{className:"json-tree","aria-label":a,children:e(g,{name:null,value:s,depth:0,ancestors:[],limits:m})})]})}function g({name:s,value:a,depth:c,ancestors:i,limits:u}){let o=S(a),l=s===null?null:t("span",{className:"json-key",children:[s,": "]});if(o!=="object"&&o!=="array")return t("li",{className:"json-row",children:[l,e(P,{value:a,kind:o,maxLength:u.maxStringLength})]});let m=a;if(i.includes(m))return t("li",{className:"json-row",children:[l,e("span",{className:"json-circular",children:"[Circular]"})]});return e(L,{nameNode:l,value:m,isArray:o==="array",depth:c,ancestors:i,limits:u})}function L({nameNode:s,value:a,isArray:c,depth:i,ancestors:u,limits:o}){let[l,m]=r(i<o.expandDepth),[b,j]=r(o.maxChildren),p=c?a.length:Object.keys(a).length,h=c?"[":"{",f=c?"]":"}",y=c?`${p} ${p===1?"item":"items"}`:`${p} ${p===1?"key":"keys"}`;if(p===0)return t("li",{className:"json-row",children:[s,t("span",{className:"json-punct",children:[h,f]})]});let w=l?J(a,b):[],x=l?[...u,a]:u;return t("li",{className:"json-row json-container",children:[t("button",{type:"button",className:"json-toggle","aria-expanded":l,onClick:()=>m((d)=>!d),children:[e("span",{className:"json-caret","aria-hidden":"true"}),s,e("span",{className:"json-punct",children:h}),!l&&t(n,{children:[e("span",{className:"json-summary",children:y}),e("span",{className:"json-punct",children:f})]})]}),l&&t(n,{children:[t("ul",{className:"json-children",children:[w.map(([d,k])=>e(g,{name:d,value:k,depth:i+1,ancestors:x,limits:o},d)),p>b&&e("li",{className:"json-row",children:t("button",{type:"button",className:"json-more",onClick:()=>j((d)=>d+o.maxChildren),children:["Show ",Math.min(o.maxChildren,p-b)," more (",p-b," hidden)"]})})]}),e("span",{className:"json-punct",children:f})]})]})}function P({value:s,kind:a,maxLength:c}){let[i,u]=r(!1);if(a==="string"){let o=s,l=!i&&o.length>c;return t(n,{children:[t("span",{className:"json-string",children:['"',l?o.slice(0,c):o,l?"…":"",'"']}),o.length>c&&e("button",{type:"button",className:"json-more","aria-expanded":i,onClick:()=>u((m)=>!m),children:i?"Show less":`Show more (${o.length} chars)`})]})}return e("span",{className:`json-${a}`,children:C(s)})}
|
|
2
|
+
export{ae};
|
|
3
|
+
|
|
4
|
+
//# debugId=3F66FABB717147FF64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-d6ge7w08.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["app/jobs/components/JsonView.tsx"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { cx } from \"./classNames\";\nimport { safeStringify } from \"./copy\";\nimport { CopyButton } from \"./CopyButton\";\n\n/** Limits of a {@link JsonView}. */\ninterface ViewLimits {\n /** Levels expanded on first render. */\n expandDepth: number;\n /** Characters of a string shown before \"show more\". */\n maxStringLength: number;\n /** Children rendered per expand (and per \"show more\"). */\n maxChildren: number;\n}\n\n/** Props of {@link JsonView}. */\nexport interface JsonViewProps {\n /** Any value: JSON, `undefined`, a `Date`, a `bigint`, even a circular object. */\n value: unknown;\n /** Accessible name of the tree, e.g. \"Job data\". Defaults to `\"JSON\"`. */\n label?: string;\n /** Levels expanded on first render; `0` starts collapsed. Defaults to `1`. */\n expandDepth?: number;\n /** Characters of a string shown before a \"show more\" control. Defaults to `200`. */\n maxStringLength?: number;\n /** Array items / object keys rendered per expand; \"show more\" renders the next batch. Defaults to `100`. */\n maxChildren?: number;\n /** Show a Copy button for the whole value (serialised on click, circular-safe). Defaults to `true`. */\n copyable?: boolean;\n /** Extra class names. */\n className?: string;\n}\n\n/** What a value looks like to the viewer. */\ntype Kind =\n | \"object\"\n | \"array\"\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"null\"\n | \"undefined\"\n | \"other\";\n\n/** Classifies a value for rendering. */\nfunction kindOf(value: unknown): Kind {\n if (value === null) {\n return \"null\";\n }\n if (Array.isArray(value)) {\n return \"array\";\n }\n switch (typeof value) {\n case \"object\":\n return value instanceof Date ? \"other\" : \"object\";\n case \"string\":\n return \"string\";\n case \"number\":\n case \"bigint\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"undefined\":\n return \"undefined\";\n default:\n return \"other\";\n }\n}\n\n/** A primitive's (or opaque value's) text. */\nfunction scalarText(value: unknown): string {\n if (typeof value === \"bigint\") {\n return `${value}n`;\n }\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? \"Invalid Date\" : value.toISOString();\n }\n if (typeof value === \"symbol\" || typeof value === \"function\") {\n return value.toString();\n }\n return String(value);\n}\n\n/** The first `limit` entries of a container, arrays keyed by index; never touches the rest. */\nfunction entriesOf(value: object, limit: number): [string, unknown][] {\n if (Array.isArray(value)) {\n return value\n .slice(0, limit)\n .map((item: unknown, index) => [String(index), item]);\n }\n const record = value as Record<string, unknown>;\n return Object.keys(record)\n .slice(0, limit)\n .map((key) => [key, record[key]]);\n}\n\n/**\n * A read-only, collapsible tree of any value. Built for job payloads of any\n * size: levels past `expandDepth` start collapsed, each expand renders at\n * most `maxChildren` children (with \"show more\"), long strings are cut at\n * `maxStringLength`, and a reference back to an ancestor renders as\n * `[Circular]` instead of recursing.\n */\nexport function JsonView({\n value,\n label = \"JSON\",\n expandDepth = 1,\n maxStringLength = 200,\n maxChildren = 100,\n copyable = true,\n className,\n}: JsonViewProps) {\n const limits: ViewLimits = { expandDepth, maxStringLength, maxChildren };\n return (\n <div className={cx(\"json-view\", className)}>\n {copyable && (\n <div className=\"json-view-toolbar\">\n <CopyButton\n text={() => safeStringify(value, 2)}\n ariaLabel={`Copy ${label}`}\n />\n </div>\n )}\n <ul\n className=\"json-tree\"\n aria-label={label}\n >\n <JsonNode\n name={null}\n value={value}\n depth={0}\n ancestors={[]}\n limits={limits}\n />\n </ul>\n </div>\n );\n}\n\n/** Props of {@link JsonNode}. */\ninterface JsonNodeProps {\n /** The key or index, or `null` at the root. */\n name: string | null;\n /** The value at this node. */\n value: unknown;\n /** Nesting level, root = 0. */\n depth: number;\n /** The containers above this node, for the circular check. */\n ancestors: readonly object[];\n /** Rendering limits. */\n limits: ViewLimits;\n}\n\n/** One key/value row, expandable when the value is a non-empty container. */\nfunction JsonNode({ name, value, depth, ancestors, limits }: JsonNodeProps) {\n const kind = kindOf(value);\n const key = name === null ? null : <span className=\"json-key\">{name}: </span>;\n\n if (kind !== \"object\" && kind !== \"array\") {\n return (\n <li className=\"json-row\">\n {key}\n <JsonScalar\n value={value}\n kind={kind}\n maxLength={limits.maxStringLength}\n />\n </li>\n );\n }\n\n const container = value as object;\n if (ancestors.includes(container)) {\n return (\n <li className=\"json-row\">\n {key}\n <span className=\"json-circular\">[Circular]</span>\n </li>\n );\n }\n return (\n <JsonContainer\n nameNode={key}\n value={container}\n isArray={kind === \"array\"}\n depth={depth}\n ancestors={ancestors}\n limits={limits}\n />\n );\n}\n\n/** Props of {@link JsonContainer}. */\ninterface JsonContainerProps {\n /** The rendered key, or `null` at the root. */\n nameNode: ReactNode;\n /** The object or array. */\n value: object;\n /** Whether it is an array. */\n isArray: boolean;\n /** Nesting level. */\n depth: number;\n /** The containers above it. */\n ancestors: readonly object[];\n /** Rendering limits. */\n limits: ViewLimits;\n}\n\n/** An object or array: a disclosure button, and its children once expanded. */\nfunction JsonContainer({\n nameNode,\n value,\n isArray,\n depth,\n ancestors,\n limits,\n}: JsonContainerProps) {\n const [expanded, setExpanded] = useState(depth < limits.expandDepth);\n const [shown, setShown] = useState(limits.maxChildren);\n // Object.keys is O(n) but cheap next to rendering; children are only\n // materialised while expanded.\n const size = isArray\n ? (value as unknown[]).length\n : Object.keys(value).length;\n const open = isArray ? \"[\" : \"{\";\n const close = isArray ? \"]\" : \"}\";\n const summary = isArray\n ? `${size} ${size === 1 ? \"item\" : \"items\"}`\n : `${size} ${size === 1 ? \"key\" : \"keys\"}`;\n\n if (size === 0) {\n return (\n <li className=\"json-row\">\n {nameNode}\n <span className=\"json-punct\">\n {open}\n {close}\n </span>\n </li>\n );\n }\n\n const children = expanded ? entriesOf(value, shown) : [];\n const nextAncestors = expanded ? [...ancestors, value] : ancestors;\n return (\n <li className=\"json-row json-container\">\n <button\n type=\"button\"\n className=\"json-toggle\"\n aria-expanded={expanded}\n onClick={() => setExpanded((current) => !current)}\n >\n <span\n className=\"json-caret\"\n aria-hidden=\"true\"\n />\n {nameNode}\n <span className=\"json-punct\">{open}</span>\n {!expanded && (\n <>\n <span className=\"json-summary\">{summary}</span>\n <span className=\"json-punct\">{close}</span>\n </>\n )}\n </button>\n {expanded && (\n <>\n <ul className=\"json-children\">\n {children.map(([key, item]) => (\n <JsonNode\n key={key}\n name={key}\n value={item}\n depth={depth + 1}\n ancestors={nextAncestors}\n limits={limits}\n />\n ))}\n {size > shown && (\n <li className=\"json-row\">\n <button\n type=\"button\"\n className=\"json-more\"\n onClick={() =>\n setShown((current) => current + limits.maxChildren)\n }\n >\n Show {Math.min(limits.maxChildren, size - shown)} more (\n {size - shown} hidden)\n </button>\n </li>\n )}\n </ul>\n <span className=\"json-punct\">{close}</span>\n </>\n )}\n </li>\n );\n}\n\n/** Props of {@link JsonScalar}. */\ninterface JsonScalarProps {\n /** The value. */\n value: unknown;\n /** Its kind. */\n kind: Kind;\n /** String length before truncation. */\n maxLength: number;\n}\n\n/** A leaf value, colour-coded; long strings truncate with \"show more\". */\nfunction JsonScalar({ value, kind, maxLength }: JsonScalarProps) {\n const [full, setFull] = useState(false);\n if (kind === \"string\") {\n const text = value as string;\n const cut = !full && text.length > maxLength;\n return (\n <>\n <span className=\"json-string\">\n "{cut ? text.slice(0, maxLength) : text}\n {cut ? \"…\" : \"\"}"\n </span>\n {text.length > maxLength && (\n <button\n type=\"button\"\n className=\"json-more\"\n aria-expanded={full}\n onClick={() => setFull((current) => !current)}\n >\n {full ? \"Show less\" : `Show more (${text.length} chars)`}\n </button>\n )}\n </>\n );\n }\n return <span className={`json-${kind}`}>{scalarText(value)}</span>;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "gFA8CA,SAAS,CAAM,CAAC,EAAsB,CACpC,GAAI,IAAU,KACZ,MAAO,OAET,GAAI,MAAM,QAAQ,CAAK,EACrB,MAAO,QAET,OAAQ,OAAO,GACb,IAAK,SACH,OAAO,aAAiB,KAAO,QAAU,SAC3C,IAAK,SACH,MAAO,SACT,IAAK,SACL,IAAK,SACH,MAAO,SACT,IAAK,UACH,MAAO,UACT,IAAK,YACH,MAAO,YACT,QACE,MAAO,SAKb,SAAS,CAAU,CAAC,EAAwB,CAC1C,GAAI,OAAO,IAAU,SACnB,MAAO,GAAG,KAEZ,GAAI,aAAiB,KACnB,OAAO,OAAO,MAAM,EAAM,QAAQ,CAAC,EAAI,eAAiB,EAAM,YAAY,EAE5E,GAAI,OAAO,IAAU,UAAY,OAAO,IAAU,WAChD,OAAO,EAAM,SAAS,EAExB,OAAO,OAAO,CAAK,EAIrB,SAAS,CAAS,CAAC,EAAe,EAAoC,CACpE,GAAI,MAAM,QAAQ,CAAK,EACrB,OAAO,EACJ,MAAM,EAAG,CAAK,EACd,IAAI,CAAC,EAAe,IAAU,CAAC,OAAO,CAAK,EAAG,CAAI,CAAC,EAExD,IAAM,EAAS,EACf,OAAO,OAAO,KAAK,CAAM,EACtB,MAAM,EAAG,CAAK,EACd,IAAI,CAAC,IAAQ,CAAC,EAAK,EAAO,EAAI,CAAC,EAU7B,SAAS,EAAQ,EACtB,QACA,QAAQ,OACR,cAAc,EACd,kBAAkB,IAClB,cAAc,IACd,WAAW,GACX,aACgB,CAChB,IAAM,EAAqB,CAAE,cAAa,kBAAiB,aAAY,EACvE,OACE,EAAC,MAAD,CAAK,UAAW,EAAG,YAAa,CAAS,EAAzC,SAqBE,CApBC,GACC,EAAC,MAAD,CAAK,UAAU,oBAAf,SACE,EAAC,GAAD,CACE,KAAM,IAAM,GAAc,EAAO,CAAC,EAClC,UAAW,QAAQ,IACrB,EACA,EAEJ,EAAC,KAAD,CACE,UAAU,YACV,aAAY,EAFd,SAIE,EAAC,EAAD,CACE,KAAM,KACN,MAAO,EACP,MAAO,EACP,UAAW,CAAC,EACZ,OAAQ,EACV,EACA,GACF,EAmBN,SAAS,CAAQ,EAAG,OAAM,QAAO,QAAO,YAAW,UAAyB,CAC1E,IAAM,EAAO,EAAO,CAAK,EACnB,EAAM,IAAS,KAAO,KAAO,EAAC,OAAD,CAAM,UAAU,WAAhB,SAAqC,CAAT,EAA5B,MAAqC,EAExE,GAAI,IAAS,UAAY,IAAS,QAChC,OACE,EAAC,KAAD,CAAI,UAAU,WAAd,SAOE,CANC,EACD,EAAC,EAAD,CACE,MAAO,EACP,KAAM,EACN,UAAW,EAAO,gBACpB,GACA,EAIN,IAAM,EAAY,EAClB,GAAI,EAAU,SAAS,CAAS,EAC9B,OACE,EAAC,KAAD,CAAI,UAAU,WAAd,SAGE,CAFC,EACD,EAAC,OAAD,CAAM,UAAU,gBAAhB,sBAA4C,GAC5C,EAGN,OACE,EAAC,EAAD,CACE,SAAU,EACV,MAAO,EACP,QAAS,IAAS,QAClB,MAAO,EACP,UAAW,EACX,OAAQ,EACV,EAqBJ,SAAS,CAAa,EACpB,WACA,QACA,UACA,QACA,YACA,UACqB,CACrB,IAAO,EAAU,GAAe,EAAS,EAAQ,EAAO,WAAW,GAC5D,EAAO,GAAY,EAAS,EAAO,WAAW,EAG/C,EAAO,EACR,EAAoB,OACrB,OAAO,KAAK,CAAK,EAAE,OACjB,EAAO,EAAU,IAAM,IACvB,EAAQ,EAAU,IAAM,IACxB,EAAU,EACZ,GAAG,KAAQ,IAAS,EAAI,OAAS,UACjC,GAAG,KAAQ,IAAS,EAAI,MAAQ,SAEpC,GAAI,IAAS,EACX,OACE,EAAC,KAAD,CAAI,UAAU,WAAd,SAME,CALC,EACD,EAAC,OAAD,CAAM,UAAU,aAAhB,SAGE,CAFC,EACA,GACD,GACF,EAIN,IAAM,EAAW,EAAW,EAAU,EAAO,CAAK,EAAI,CAAC,EACjD,EAAgB,EAAW,CAAC,GAAG,EAAW,CAAK,EAAI,EACzD,OACE,EAAC,KAAD,CAAI,UAAU,0BAAd,SAmDE,CAlDA,EAAC,SAAD,CACE,KAAK,SACL,UAAU,cACV,gBAAe,EACf,QAAS,IAAM,EAAY,CAAC,IAAY,CAAC,CAAO,EAJlD,SAkBE,CAZA,EAAC,OAAD,CACE,UAAU,aACV,cAAY,OACd,EACC,EACD,EAAC,OAAD,CAAM,UAAU,aAAhB,SAA8B,EAAO,EACpC,CAAC,GACA,cAGE,CAFA,EAAC,OAAD,CAAM,UAAU,eAAhB,SAAgC,EAAU,EAC1C,EAAC,OAAD,CAAM,UAAU,aAAhB,SAA8B,EAAQ,GACtC,GAEJ,EACD,GACC,cA4BE,CA3BA,EAAC,KAAD,CAAI,UAAU,gBAAd,SAyBE,CAxBC,EAAS,IAAI,EAAE,EAAK,KACnB,EAAC,EAAD,CAEE,KAAM,EACN,MAAO,EACP,MAAO,EAAQ,EACf,UAAW,EACX,OAAQ,GALH,CAMP,CACD,EACA,EAAO,GACN,EAAC,KAAD,CAAI,UAAU,WAAd,SACE,EAAC,SAAD,CACE,KAAK,SACL,UAAU,YACV,QAAS,IACP,EAAS,CAAC,IAAY,EAAU,EAAO,WAAW,EAJtD,SASE,CATF,QAOQ,KAAK,IAAI,EAAO,YAAa,EAAO,CAAK,EAPjD,UAQG,EAAO,EARV,YASE,EACF,GAEJ,EACF,EAAC,OAAD,CAAM,UAAU,aAAhB,SAA8B,EAAQ,GACtC,GAEJ,EAeN,SAAS,CAAU,EAAG,QAAO,OAAM,aAA8B,CAC/D,IAAO,EAAM,GAAW,EAAS,EAAK,EACtC,GAAI,IAAS,SAAU,CACrB,IAAM,EAAO,EACP,EAAM,CAAC,GAAQ,EAAK,OAAS,EACnC,OACE,cAeE,CAdA,EAAC,OAAD,CAAM,UAAU,cAAhB,SAGE,CAHF,IACS,EAAM,EAAK,MAAM,EAAG,CAAS,EAAI,EACvC,EAAM,IAAM,GAFf,KAGE,EACD,EAAK,OAAS,GACb,EAAC,SAAD,CACE,KAAK,SACL,UAAU,YACV,gBAAe,EACf,QAAS,IAAM,EAAQ,CAAC,IAAY,CAAC,CAAO,EAJ9C,SAMG,EAAO,YAAc,cAAc,EAAK,gBACzC,GAEJ,EAGN,OAAO,EAAC,OAAD,CAAM,UAAW,QAAQ,IAAzB,SAAkC,EAAW,CAAK,EAAI",
|
|
8
|
+
"debugId": "3F66FABB717147FF64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{P,pe,Ke}from"./main-a250ffk7.js";var he={all:["runners"],list:()=>["runners","list"],runner:(n)=>["runner",n],detail:(n)=>["runner",n,"detail"],historyAll:(n)=>["runner",n,"history"],history:(n,t)=>["runner",n,"history",{...t}],stats:(n)=>["runner",n,"stats"]};function Ne(n){return[he.runner(n),he.all]}function mt(n){return`/runners/${P(n)}`}function s(n,t=""){return`/runners/${P(n)}${t}`}function cn(n,t){return n.request("GET","/runners",{signal:t})}async function ho(n,t,r){let e=s(t),o=await n.request("GET",e,{signal:r});return pe(o,(i)=>Ke(i,"id","name"),"a runner",e)}function go(n,t,r,e){return n.request("GET",s(t,"/history"),{query:{offset:r.offset,limit:r.limit,order:r.order},signal:e})}function yo(n,t,r){return n.request("GET",s(t,"/stats"),{signal:r})}
|
|
2
|
+
export{he,Ne,mt,cn,ho,go,yo};
|
|
3
|
+
|
|
4
|
+
//# debugId=133DFFEDD9988E7464756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-gngzht43.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["app/jobs/api/runners.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { QueryKey } from \"@tanstack/react-query\";\nimport type { ApiClient } from \"./client\";\nimport type {\n RunnerHistoryDto,\n RunnerInfoDto,\n RunnerListDto,\n RunnerStatsDto,\n} from \"./types\";\nimport { segment } from \"./client\";\nimport { assertShape, hasStrings } from \"./shape\";\n\n/**\n * The runner screens' reads and query keys.\n *\n * Everything about one runner sits under {@link runnerKeys.runner}\n * (`[\"runner\", id]`), so one invalidation refreshes the whole runner screen;\n * the runner list sits under {@link runnerKeys.all} (`[\"runners\"]`). The\n * runner actions import these keys to invalidate after a write, so keep them\n * stable.\n */\nexport const runnerKeys = {\n /** Every `GET /runners` read. */\n all: [\"runners\"] as const,\n /** `GET /runners`. */\n list: () => [\"runners\", \"list\"] as const,\n /** Everything about one runner. */\n runner: (id: string) => [\"runner\", id] as const,\n /** `GET /runners/:runner`. */\n detail: (id: string) => [\"runner\", id, \"detail\"] as const,\n /** Every `GET /runners/:runner/history`, whatever window it asked for. */\n historyAll: (id: string) => [\"runner\", id, \"history\"] as const,\n /**\n * One `GET /runners/:runner/history` window.\n *\n * The **offset is part of the key**: the route pages on the server, so two\n * windows of one runner are two different answers, and a key holding only\n * the limit would serve page 2 the cached page 1. Every invalidation goes\n * through {@link runnerKeys.historyAll} (or {@link runnerKeys.runner}\n * above it), which is the prefix of all of them, so no window is missed.\n */\n history: (id: string, window: HistoryWindow) =>\n [\"runner\", id, \"history\", { ...window }] as const,\n /** `GET /runners/:runner/stats`. */\n stats: (id: string) => [\"runner\", id, \"stats\"] as const,\n};\n\n/** What a write to one runner invalidates: the runner, and every runner list (a status shows there). */\nexport function runnerInvalidations(id: string): QueryKey[] {\n return [runnerKeys.runner(id), runnerKeys.all];\n}\n\n/** The app path of one runner (the id percent-encoded as `segment()` does). */\nexport function runnerPath(id: string): string {\n return `/runners/${segment(id)}`;\n}\n\n/** The API path of a runner, plus an optional suffix. */\nfunction base(id: string, suffix = \"\"): string {\n return `/runners/${segment(id)}${suffix}`;\n}\n\n/**\n * `GET /runners`: local runners (with name and status), then the ids of those\n * registered in other processes.\n */\nexport function listRunners(\n api: ApiClient,\n signal?: AbortSignal,\n): Promise<RunnerListDto> {\n return api.request<RunnerListDto>(\"GET\", \"/runners\", { signal });\n}\n\n/**\n * `GET /runners/:runner`. A body without a string `id` and `name` rejects\n * with an `UNEXPECTED_RESPONSE` `ApiError`, so the screen shows its error\n * state rather than an empty runner.\n */\nexport async function getRunner(\n api: ApiClient,\n id: string,\n signal?: AbortSignal,\n): Promise<RunnerInfoDto> {\n const path = base(id);\n const body = await api.request<unknown>(\"GET\", path, { signal });\n return assertShape<RunnerInfoDto>(\n body,\n (fields) => hasStrings(fields, \"id\", \"name\"),\n \"a runner\",\n path,\n );\n}\n\n/**\n * One window of `GET /runners/:runner/history`.\n *\n * `limit` bounds a **page**, not how far back `offset` may read: the route\n * caps `limit` at `limits.maxHistory` (more is 400 `VALIDATION`) and leaves\n * `offset` uncapped, so every stored run is reachable.\n */\nexport interface HistoryWindow {\n /** Runs skipped before the page. `0` is the first page. */\n offset: number;\n /** Runs on the page, `1` to `limits.maxHistory`. */\n limit: number;\n /** Which end to read from, by start time. `\"desc\"` is newest first. */\n order: \"asc\" | \"desc\";\n}\n\n/** `GET /runners/:runner/history`: one window of the runner's stored runs. */\nexport function getRunnerHistory(\n api: ApiClient,\n id: string,\n window: HistoryWindow,\n signal?: AbortSignal,\n): Promise<RunnerHistoryDto> {\n return api.request<RunnerHistoryDto>(\"GET\", base(id, \"/history\"), {\n query: { offset: window.offset, limit: window.limit, order: window.order },\n signal,\n });\n}\n\n/** `GET /runners/:runner/stats`. */\nexport function getRunnerStats(\n api: ApiClient,\n id: string,\n signal?: AbortSignal,\n): Promise<RunnerStatsDto> {\n return api.request<RunnerStatsDto>(\"GET\", base(id, \"/stats\"), { signal });\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "wCAoBO,IAAM,GAAa,CAExB,IAAK,CAAC,SAAS,EAEf,KAAM,IAAM,CAAC,UAAW,MAAM,EAE9B,OAAQ,CAAC,IAAe,CAAC,SAAU,CAAE,EAErC,OAAQ,CAAC,IAAe,CAAC,SAAU,EAAI,QAAQ,EAE/C,WAAY,CAAC,IAAe,CAAC,SAAU,EAAI,SAAS,EAUpD,QAAS,CAAC,EAAY,IACpB,CAAC,SAAU,EAAI,UAAW,IAAK,CAAO,CAAC,EAEzC,MAAO,CAAC,IAAe,CAAC,SAAU,EAAI,OAAO,CAC/C,EAGO,SAAS,EAAmB,CAAC,EAAwB,CAC1D,MAAO,CAAC,GAAW,OAAO,CAAE,EAAG,GAAW,GAAG,EAIxC,SAAS,EAAU,CAAC,EAAoB,CAC7C,MAAO,YAAY,EAAQ,CAAE,IAI/B,SAAS,CAAI,CAAC,EAAY,EAAS,GAAY,CAC7C,MAAO,YAAY,EAAQ,CAAE,IAAI,IAO5B,SAAS,EAAW,CACzB,EACA,EACwB,CACxB,OAAO,EAAI,QAAuB,MAAO,WAAY,CAAE,QAAO,CAAC,EAQ1D,eAAe,EAAS,CAC7B,EACA,EACA,EACwB,CACxB,IAAM,EAAO,EAAK,CAAE,EACd,EAAO,MAAM,EAAI,QAAiB,MAAO,EAAM,CAAE,QAAO,CAAC,EAC/D,OAAO,GACL,EACA,CAAC,IAAW,GAAW,EAAQ,KAAM,MAAM,EAC3C,WACA,CACF,EAoBK,SAAS,EAAgB,CAC9B,EACA,EACA,EACA,EAC2B,CAC3B,OAAO,EAAI,QAA0B,MAAO,EAAK,EAAI,UAAU,EAAG,CAChE,MAAO,CAAE,OAAQ,EAAO,OAAQ,MAAO,EAAO,MAAO,MAAO,EAAO,KAAM,EACzE,QACF,CAAC,EAII,SAAS,EAAc,CAC5B,EACA,EACA,EACyB,CACzB,OAAO,EAAI,QAAwB,MAAO,EAAK,EAAI,QAAQ,EAAG,CAAE,QAAO,CAAC",
|
|
8
|
+
"debugId": "133DFFEDD9988E7464756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var u={minutes:60000,hours:3600000,days:86400000};function Lo(n,r){if(n===void 0||!Number.isFinite(n)||n<0)return;return Math.round(n*u[r])}function U(n){if(n<1000)return`${n}ms`;let r=[],e=Math.round(n/1000);for(let[t,i]of[[86400,"d"],[3600,"h"],[60,"m"],[1,"s"]])if(e>=t)r.push(`${Math.floor(e/t)}${i}`),e%=t;return r.join(" ")}function Po(n){let r=n.trim();if(r==="")return;return/^\d+$/.test(r)?Number(r):r}
|
|
2
|
+
export{Lo,U,Po};
|
|
3
|
+
|
|
4
|
+
//# debugId=46FDEF7F3EFCAB3064756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-hg0hrg8j.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["app/jobs/screens/queues/duration.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/** A unit an age or window is typed in. */\nexport type DurationUnit = \"minutes\" | \"hours\" | \"days\";\n\n/** Milliseconds per unit. */\nexport const UNIT_MS: Readonly<Record<DurationUnit, number>> = {\n minutes: 60_000,\n hours: 3_600_000,\n days: 86_400_000,\n};\n\n/** Converts an amount in a unit to whole milliseconds (`undefined` for an empty or negative amount). */\nexport function toMs(\n amount: number | undefined,\n unit: DurationUnit,\n): number | undefined {\n if (amount === undefined || !Number.isFinite(amount) || amount < 0) {\n return undefined;\n }\n return Math.round(amount * UNIT_MS[unit]);\n}\n\n/** Formats milliseconds compactly: `90000` → `1m 30s`, `3600000` → `1h`. */\nexport function formatMs(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n const parts: string[] = [];\n let rest = Math.round(ms / 1000);\n for (const [size, suffix] of [\n [86_400, \"d\"],\n [3_600, \"h\"],\n [60, \"m\"],\n [1, \"s\"],\n ] as const) {\n if (rest >= size) {\n parts.push(`${Math.floor(rest / size)}${suffix}`);\n rest %= size;\n }\n }\n return parts.join(\" \");\n}\n\n/** A rate window as typed: all digits is milliseconds, anything else a duration phrase the API parses (`\"1 minute\"`). */\nexport function parseWindow(text: string): number | string | undefined {\n const trimmed = text.trim();\n if (trimmed === \"\") {\n return undefined;\n }\n return /^\\d+$/.test(trimmed) ? Number(trimmed) : trimmed;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "AAIO,IAAM,EAAkD,CAC7D,QAAS,MACT,MAAO,QACP,KAAM,QACR,EAGO,SAAS,EAAI,CAClB,EACA,EACoB,CACpB,GAAI,IAAW,QAAa,CAAC,OAAO,SAAS,CAAM,GAAK,EAAS,EAC/D,OAEF,OAAO,KAAK,MAAM,EAAS,EAAQ,EAAK,EAInC,SAAS,CAAQ,CAAC,EAAoB,CAC3C,GAAI,EAAK,KACP,MAAO,GAAG,MAEZ,IAAM,EAAkB,CAAC,EACrB,EAAO,KAAK,MAAM,EAAK,IAAI,EAC/B,QAAY,EAAM,IAAW,CAC3B,CAAC,MAAQ,GAAG,EACZ,CAAC,KAAO,GAAG,EACX,CAAC,GAAI,GAAG,EACR,CAAC,EAAG,GAAG,CACT,EACE,GAAI,GAAQ,EACV,EAAM,KAAK,GAAG,KAAK,MAAM,EAAO,CAAI,IAAI,GAAQ,EAChD,GAAQ,EAGZ,OAAO,EAAM,KAAK,GAAG,EAIhB,SAAS,EAAW,CAAC,EAA2C,CACrE,IAAM,EAAU,EAAK,KAAK,EAC1B,GAAI,IAAY,GACd,OAEF,MAAO,QAAQ,KAAK,CAAO,EAAI,OAAO,CAAO,EAAI",
|
|
8
|
+
"debugId": "46FDEF7F3EFCAB3064756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{C,v,r,Ae,b,N,e,t,J,X,Te,tt,Wt,Ee,x,Gr,s}from"./main-a250ffk7.js";var d=class extends Ee{#e;#i=void 0;#t;#s;constructor(i,o){super();this.#e=i,this.setOptions(o),this.bindMethods(),this.#r()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(i){let o=this.options;if(this.options=this.#e.defaultMutationOptions(i),!tt(this.options,o))this.#e.getMutationCache().notify({type:"observerOptionsUpdated",mutation:this.#t,observer:this});if(o?.mutationKey&&this.options.mutationKey&&Te(o.mutationKey)!==Te(this.options.mutationKey))this.reset();else if(this.#t?.state.status==="pending")this.#t.setOptions(this.options)}onSubscribe(){if(this.listeners.size===1&&this.#t)this.#t.addObserver(this),this.#r()}onUnsubscribe(){if(!this.hasListeners())this.#t?.removeObserver(this)}onMutationUpdate(i){this.#r(),this.#o(i)}getCurrentResult(){return this.#i}reset(){this.#t?.removeObserver(this),this.#t=void 0,this.#r(),this.#o()}mutate(i,o){return this.#s=o,this.#t?.removeObserver(this),this.#t=this.#e.getMutationCache().build(this.#e,this.options),this.#t.addObserver(this),this.#t.execute(i)}#r(){let i=this.#t?.state??Gr();this.#i={...i,isPending:i.status==="pending",isSuccess:i.status==="success",isError:i.status==="error",isIdle:i.status==="idle",mutate:this.mutate,reset:this.reset}}#o(i){x.batch(()=>{if(this.#s&&this.hasListeners()){let o=this.#i.variables,h=this.#i.context,n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(i?.type==="success"){try{this.#s.onSuccess?.(i.data,o,h,n)}catch(a){Promise.reject(a)}try{this.#s.onSettled?.(i.data,null,o,h,n)}catch(a){Promise.reject(a)}}else if(i?.type==="error"){try{this.#s.onError?.(i.error,o,h,n)}catch(a){Promise.reject(a)}try{this.#s.onSettled?.(void 0,i.error,o,h,n)}catch(a){Promise.reject(a)}}}this.listeners.forEach((o)=>{o(this.#i)})})}};function On(i,o){let h=J(o),[n]=r(()=>new d(h,i));v(()=>{n.setOptions(i)},[n,i]);let a=Ae(C((l)=>n.subscribe(x.batchCalls(l)),[n]),()=>n.getCurrentResult(),()=>n.getCurrentResult()),c=C((...l)=>{n.mutate(l[0],l[1]).catch(X)},[n]);if(a.error&&Wt(n.options.throwOnError,[a.error]))throw a.error;return{...a,mutate:c,mutateAsync:a.mutate}}function g(i){if(typeof i==="string")return i;try{return JSON.stringify(i)??String(i)}catch{return String(i)}}function D({error:i,title:o,onRetry:h,onDismiss:n,className:a}){let c=b(i)?i:null,l=o??c?.title??"Something went wrong",m=c?.detail??(i instanceof Error?i.message:String(i)),p=c?Object.entries(c.context):[];return t("div",{className:N("problem-banner",a),role:"alert",children:[t("div",{className:"problem-banner-main",children:[t("p",{className:"problem-banner-title",children:[e("strong",{children:l}),c&&t("code",{className:"problem-banner-code",children:[c.code,c.status>0?` · ${c.status}`:""]})]}),m&&m!==l&&e("p",{className:"problem-banner-detail",children:m}),p.length>0&&e("ul",{className:"problem-banner-context","aria-label":"Context",children:p.map(([u,f])=>t("li",{children:[e("span",{className:"problem-banner-key",children:u}),"=",e("code",{children:g(f)})]},u))}),c&&c.issues.length>0&&e("ul",{className:"problem-banner-issues",children:c.issues.map((u)=>t("li",{children:[t("code",{children:[u.target,u.path?`.${u.path}`:""]})," ",u.message]},`${u.target}:${u.path}:${u.message}`))})]}),(h||n)&&t("div",{className:"problem-banner-actions",children:[h&&e(s,{size:"sm",onClick:h,children:"Retry"}),n&&e(s,{size:"sm",variant:"ghost",onClick:n,children:"Dismiss"})]})]})}
|
|
2
|
+
export{On,D};
|
|
3
|
+
|
|
4
|
+
//# debugId=415DBB6FBA7B4D6564756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-hm1ng3yg.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../node_modules/@tanstack/query-core/build/modern/mutationObserver.js", "../../node_modules/@tanstack/react-query/build/modern/useMutation.js", "app/jobs/components/ProblemBanner.tsx"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { hashKey, shallowEqualObjects } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { getDefaultState } from \"./mutation.js\";\n//#region src/mutationObserver.ts\n/**\n* Observes a single mutation and derives a `MutationObserverResult` from it.\n* A framework hook like `useMutation` creates one `MutationObserver` per hook\n* call, keeps it stable across re-renders, calls `setOptions` when the options\n* passed to the hook change, subscribes to it to re-render on updates, and\n* reads `getCurrentResult()` for the value to return. Calling `mutate()`\n* builds a new underlying `Mutation` in the `MutationCache` and executes it.\n*\n* @example\n* ```ts\n* const observer = new MutationObserver(queryClient, {\n* mutationFn: (variables: { title: string }) => addPost(variables),\n* })\n* ```\n*/\nvar MutationObserver = class extends Subscribable {\n\t#client;\n\t#currentResult = void 0;\n\t#currentMutation;\n\t#mutateOptions;\n\tconstructor(client, options) {\n\t\tsuper();\n\t\tthis.#client = client;\n\t\tthis.setOptions(options);\n\t\tthis.bindMethods();\n\t\tthis.#updateResult();\n\t}\n\tbindMethods() {\n\t\tthis.mutate = this.mutate.bind(this);\n\t\tthis.reset = this.reset.bind(this);\n\t}\n\t/**\n\t* Updates the observer's options.\n\t*\n\t* If the new `mutationKey` differs from the previous one (and both were\n\t* defined), the observer is reset, detaching it from the mutation it was\n\t* observing. Otherwise, if the currently observed mutation is still\n\t* `pending`, its options are updated in place as well.\n\t*\n\t* @example\n\t* ```ts\n\t* observer.setOptions({\n\t* mutationFn: (variables: { title: string }) => addPost(variables),\n\t* onSuccess: (data) => console.log(data),\n\t* })\n\t* ```\n\t*/\n\tsetOptions(options) {\n\t\tconst prevOptions = this.options;\n\t\tthis.options = this.#client.defaultMutationOptions(options);\n\t\tif (!shallowEqualObjects(this.options, prevOptions)) this.#client.getMutationCache().notify({\n\t\t\ttype: \"observerOptionsUpdated\",\n\t\t\tmutation: this.#currentMutation,\n\t\t\tobserver: this\n\t\t});\n\t\tif (prevOptions?.mutationKey && this.options.mutationKey && hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)) this.reset();\n\t\telse if (this.#currentMutation?.state.status === \"pending\") this.#currentMutation.setOptions(this.options);\n\t}\n\tonSubscribe() {\n\t\tif (this.listeners.size === 1 && this.#currentMutation) {\n\t\t\tthis.#currentMutation.addObserver(this);\n\t\t\tthis.#updateResult();\n\t\t}\n\t}\n\tonUnsubscribe() {\n\t\tif (!this.hasListeners()) this.#currentMutation?.removeObserver(this);\n\t}\n\t/** @internal */\n\tonMutationUpdate(action) {\n\t\tthis.#updateResult();\n\t\tthis.#notify(action);\n\t}\n\t/**\n\t* Returns the observer's current result, derived from the observed\n\t* mutation's state (or the default, `idle` state if no mutation has been\n\t* built yet, e.g. before the first `mutate()` call or after `reset()`).\n\t*/\n\tgetCurrentResult() {\n\t\treturn this.#currentResult;\n\t}\n\t/**\n\t* Detaches the observer from the mutation it is currently observing (if\n\t* any) and resets the observed result back to its default, `idle` state.\n\t*\n\t* This does not cancel an in-flight mutation; the mutation itself keeps\n\t* running to completion and its own callbacks still fire, but this\n\t* observer stops reflecting its state and a subsequent `mutate()` call\n\t* will build a brand new mutation.\n\t*\n\t* @example\n\t* ```ts\n\t* observer.reset()\n\t* ```\n\t*\n\t* @see {@link MutationObserver#mutate}\n\t*/\n\treset() {\n\t\tthis.#currentMutation?.removeObserver(this);\n\t\tthis.#currentMutation = void 0;\n\t\tthis.#updateResult();\n\t\tthis.#notify();\n\t}\n\t/**\n\t* Builds a new `Mutation` in the `MutationCache` using the observer's\n\t* current options, detaches this observer from any previously observed\n\t* mutation, attaches it to the new one, and executes it with the given\n\t* variables.\n\t*\n\t* The optional per-call `options` (`onSuccess`/`onError`/`onSettled`) are\n\t* invoked once the mutation settles, in addition to any callbacks defined\n\t* on the observer's own options.\n\t*\n\t* @example\n\t* ```ts\n\t* await observer.mutate(\n\t* { title: 'New post' },\n\t* { onSuccess: (data) => console.log(data) },\n\t* )\n\t* ```\n\t*/\n\tmutate(variables, options) {\n\t\tthis.#mutateOptions = options;\n\t\tthis.#currentMutation?.removeObserver(this);\n\t\tthis.#currentMutation = this.#client.getMutationCache().build(this.#client, this.options);\n\t\tthis.#currentMutation.addObserver(this);\n\t\treturn this.#currentMutation.execute(variables);\n\t}\n\t#updateResult() {\n\t\tconst state = this.#currentMutation?.state ?? getDefaultState();\n\t\tthis.#currentResult = {\n\t\t\t...state,\n\t\t\tisPending: state.status === \"pending\",\n\t\t\tisSuccess: state.status === \"success\",\n\t\t\tisError: state.status === \"error\",\n\t\t\tisIdle: state.status === \"idle\",\n\t\t\tmutate: this.mutate,\n\t\t\treset: this.reset\n\t\t};\n\t}\n\t#notify(action) {\n\t\tnotifyManager.batch(() => {\n\t\t\tif (this.#mutateOptions && this.hasListeners()) {\n\t\t\t\tconst variables = this.#currentResult.variables;\n\t\t\t\tconst onMutateResult = this.#currentResult.context;\n\t\t\t\tconst context = {\n\t\t\t\t\tclient: this.#client,\n\t\t\t\t\tmeta: this.options.meta,\n\t\t\t\t\tmutationKey: this.options.mutationKey\n\t\t\t\t};\n\t\t\t\tif (action?.type === \"success\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#mutateOptions.onSuccess?.(action.data, variables, onMutateResult, context);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tPromise.reject(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#mutateOptions.onSettled?.(action.data, null, variables, onMutateResult, context);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tPromise.reject(e);\n\t\t\t\t\t}\n\t\t\t\t} else if (action?.type === \"error\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#mutateOptions.onError?.(action.error, variables, onMutateResult, context);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tPromise.reject(e);\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#mutateOptions.onSettled?.(void 0, action.error, variables, onMutateResult, context);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tPromise.reject(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.listeners.forEach((listener) => {\n\t\t\t\tlistener(this.#currentResult);\n\t\t\t});\n\t\t});\n\t}\n};\n//#endregion\nexport { MutationObserver };\n\n//# sourceMappingURL=mutationObserver.js.map",
|
|
6
|
+
"\"use client\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport * as React from \"react\";\nimport { MutationObserver, noop, notifyManager, shouldThrowError } from \"@tanstack/query-core\";\n//#region src/useMutation.ts\n/**\n* Unlike queries, mutations are typically used to create/update/delete data or perform server side-effects.\n* `useMutation` is the hook for that.\n*\n* @see {@link mutationOptions} to share these options across multiple `useMutation` call sites, or to look\n* the mutation up elsewhere via its `mutationKey` (e.g. with `useMutationState`).\n* @param options - The {@link UseMutationOptions} to use — everything you can pass to `useMutation`.\n* @param queryClient - Use this to use a custom `QueryClient`. Otherwise, the one from the nearest context will\n* be used.\n* @returns `mutate`/`mutateAsync` also accept per-call `onSuccess`/`onError`/`onSettled` callbacks as a second\n* argument, useful for triggering call-site side effects (e.g. navigation) without coupling them to the shared\n* mutation definition. Hook-level callbacks (passed to `options`) fire for every mutation; per-call callbacks\n* fire only for the latest call you've made, and only while the component is still mounted — unmounting before\n* the mutation settles removes the subscription and prevents them from firing.\n*\n* @example\n* ```tsx\n* import { useMutation, useQueryClient } from '@tanstack/react-query'\n*\n* function AddTodo() {\n* const queryClient = useQueryClient()\n*\n* const addMutation = useMutation({\n* mutationFn: addTodo,\n* onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n* })\n*\n* return (\n* <button\n* onClick={() =>\n* addMutation.mutate('Item', {\n* onError: (error) => console.error('Failed to add item:', error),\n* })\n* }\n* >\n* Add\n* </button>\n* )\n* }\n* ```\n*\n* @example\n* Rendering the mutation's own state, rather than just firing it off:\n* ```tsx\n* import { useMutation, useQueryClient } from '@tanstack/react-query'\n*\n* function AddTodo() {\n* const queryClient = useQueryClient()\n*\n* const addMutation = useMutation({\n* mutationFn: addTodo,\n* onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n* })\n*\n* return (\n* <div>\n* {addMutation.isPending ? (\n* 'Adding todo...'\n* ) : (\n* <>\n* {addMutation.isError ? (\n* <div>An error occurred: {addMutation.error.message}</div>\n* ) : null}\n* <button onClick={() => addMutation.mutate('Item')}>Add</button>\n* </>\n* )}\n* </div>\n* )\n* }\n* ```\n*\n* @example\n* Optimistic update via `onMutate`, rolling back on `onError`:\n* ```tsx\n* import { useMutation, useQueryClient } from '@tanstack/react-query'\n*\n* function AddTodo() {\n* const queryClient = useQueryClient()\n*\n* const addMutation = useMutation({\n* mutationFn: addTodo,\n* onMutate: async (newTodo) => {\n* await queryClient.cancelQueries({ queryKey: ['todos'] })\n* const previousTodos = queryClient.getQueryData<Array<string>>(['todos'])\n*\n* queryClient.setQueryData<Array<string>>(['todos'], (old) => [\n* ...(old ?? []),\n* newTodo,\n* ])\n*\n* // Passed to `onError` as `onMutateResult` if the mutation fails.\n* return { previousTodos }\n* },\n* onError: (_err, _newTodo, onMutateResult) => {\n* queryClient.setQueryData(['todos'], onMutateResult?.previousTodos)\n* },\n* onSettled: () => {\n* queryClient.invalidateQueries({ queryKey: ['todos'] })\n* },\n* })\n*\n* return (\n* <button onClick={() => addMutation.mutate('Item')}>Add</button>\n* )\n* }\n* ```\n*\n* @example\n* Callbacks passed per call to `mutate` only fire for the last call — `mutateAsync` gives you a\n* promise per call instead, so you can wait for all of them when they succeed:\n* ```tsx\n* import { useMutation, useQueryClient } from '@tanstack/react-query'\n*\n* function AddTodos() {\n* const queryClient = useQueryClient()\n*\n* const addMutation = useMutation({\n* mutationFn: addTodo,\n* onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n* })\n*\n* async function handleAddAll(todos: Array<string>) {\n* try {\n* await Promise.all(todos.map((todo) => addMutation.mutateAsync(todo)))\n* } catch (error) {\n* console.error('Failed to add todos:', error)\n* }\n* }\n*\n* return (\n* <button onClick={() => handleAddAll(['Todo 1', 'Todo 2', 'Todo 3'])}>\n* Add all\n* </button>\n* )\n* }\n* ```\n*\n* @example\n* If some of the mutations above can fail independently of the others, and you want to know which ones\n* did — rather than losing that information the moment the first one rejects — swap `Promise.all` for\n* `Promise.allSettled`:\n* ```tsx\n* import { useMutation, useQueryClient } from '@tanstack/react-query'\n*\n* function AddTodos() {\n* const queryClient = useQueryClient()\n*\n* const addMutation = useMutation({\n* mutationFn: addTodo,\n* onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] }),\n* })\n*\n* async function handleAddAll(todos: Array<string>) {\n* const addResults = await Promise.allSettled(\n* todos.map((todo) => addMutation.mutateAsync(todo)),\n* )\n*\n* addResults.forEach((addResult, index) => {\n* if (addResult.status === 'rejected') {\n* console.error(`Failed to add \"${todos[index]}\":`, addResult.reason)\n* }\n* })\n* }\n*\n* return (\n* <button onClick={() => handleAddAll(['Todo 1', 'Todo 2', 'Todo 3'])}>\n* Add all\n* </button>\n* )\n* }\n* ```\n*/\nfunction useMutation(options, queryClient) {\n\tconst client = useQueryClient(queryClient);\n\tconst [observer] = React.useState(() => new MutationObserver(client, options));\n\tReact.useEffect(() => {\n\t\tobserver.setOptions(options);\n\t}, [observer, options]);\n\tconst result = React.useSyncExternalStore(React.useCallback((onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)), [observer]), () => observer.getCurrentResult(), () => observer.getCurrentResult());\n\tconst mutate = React.useCallback((...args) => {\n\t\tobserver.mutate(args[0], args[1]).catch(noop);\n\t}, [observer]);\n\tif (result.error && shouldThrowError(observer.options.throwOnError, [result.error])) throw result.error;\n\treturn {\n\t\t...result,\n\t\tmutate,\n\t\tmutateAsync: result.mutate\n\t};\n}\n//#endregion\nexport { useMutation };\n\n//# sourceMappingURL=useMutation.js.map",
|
|
7
|
+
"import { isApiError } from \"../api/errors\";\nimport { Button } from \"./Button\";\nimport { cx } from \"./classNames\";\n\n/** Props of {@link ProblemBanner}. */\nexport interface ProblemBannerProps {\n /** What failed: an `ApiError` shows its title, code, detail, context and issues; anything else its message. */\n error: unknown;\n /** A heading override, e.g. \"Could not save limits\". Defaults to the problem's title. */\n title?: string;\n /** Offers a Retry button when given. */\n onRetry?: () => void;\n /** Offers a Dismiss button when given. */\n onDismiss?: () => void;\n /** Extra class names. */\n className?: string;\n}\n\n/** Formats one context value for the banner: strings as-is, the rest as JSON. */\nfunction contextText(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * A compact, inline error for a panel or a dialog: one line of title and\n * code, the detail, the problem's `context` as `key=value` chips, and any\n * validation issues. {@link ErrorView} is the full-size version for a screen.\n */\nexport function ProblemBanner({\n error,\n title,\n onRetry,\n onDismiss,\n className,\n}: ProblemBannerProps) {\n const api = isApiError(error) ? error : null;\n const heading = title ?? api?.title ?? \"Something went wrong\";\n const detail =\n api?.detail ?? (error instanceof Error ? error.message : String(error));\n const context = api ? Object.entries(api.context) : [];\n return (\n <div\n className={cx(\"problem-banner\", className)}\n role=\"alert\"\n >\n <div className=\"problem-banner-main\">\n <p className=\"problem-banner-title\">\n <strong>{heading}</strong>\n {api && (\n <code className=\"problem-banner-code\">\n {api.code}\n {api.status > 0 ? ` · ${api.status}` : \"\"}\n </code>\n )}\n </p>\n {detail && detail !== heading && (\n <p className=\"problem-banner-detail\">{detail}</p>\n )}\n {context.length > 0 && (\n <ul\n className=\"problem-banner-context\"\n aria-label=\"Context\"\n >\n {context.map(([key, value]) => (\n <li key={key}>\n <span className=\"problem-banner-key\">{key}</span>=\n <code>{contextText(value)}</code>\n </li>\n ))}\n </ul>\n )}\n {api && api.issues.length > 0 && (\n <ul className=\"problem-banner-issues\">\n {api.issues.map((issue) => (\n <li key={`${issue.target}:${issue.path}:${issue.message}`}>\n <code>\n {issue.target}\n {issue.path ? `.${issue.path}` : \"\"}\n </code>{\" \"}\n {issue.message}\n </li>\n ))}\n </ul>\n )}\n </div>\n {(onRetry || onDismiss) && (\n <div className=\"problem-banner-actions\">\n {onRetry && (\n <Button\n size=\"sm\"\n onClick={onRetry}\n >\n Retry\n </Button>\n )}\n {onDismiss && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={onDismiss}\n >\n Dismiss\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "415DBB6FBA7B4D6564756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{m,et}from"./main-a250ffk7.js";function re(){let o=m(),t=et();return(n)=>!o.readOnly&&t(n)}function ts(o,t){return t&&!o.readOnly&&(o.addableNames===null||o.addableNames.length>0)}
|
|
2
|
+
export{re,ts};
|
|
3
|
+
|
|
4
|
+
//# debugId=FF1586937CD5291F64756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-jkvd92z9.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["app/jobs/screens/queues/gating.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { JobsApiAction } from \"../../api/contract\";\nimport type { MetaDto } from \"../../api/types\";\nimport { useCanFn, useMeta } from \"../../meta/hooks\";\n\n/**\n * Whether a mutation is offered: the caller holds the action **and** the API\n * is not read-only. A read-only API prunes its mutation routes (so the\n * permission is absent anyway); checking `readOnly` too keeps the rule true\n * even for a permissions map that says otherwise.\n */\nexport function useCanMutate(): (action: JobsApiAction) => boolean {\n const meta = useMeta();\n const can = useCanFn();\n return (action) => !meta.readOnly && can(action);\n}\n\n/** Whether the add-job dialog is offered: `jobs.add`, not read-only, and some name addable (`null` = any name). */\nexport function canAddJobs(meta: MetaDto, canAdd: boolean): boolean {\n return (\n canAdd &&\n !meta.readOnly &&\n (meta.addableNames === null || meta.addableNames.length > 0)\n );\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "qCAUO,SAAS,EAAY,EAAuC,CACjE,IAAM,EAAO,EAAQ,EACf,EAAM,GAAS,EACrB,MAAO,CAAC,IAAW,CAAC,EAAK,UAAY,EAAI,CAAM,EAI1C,SAAS,EAAU,CAAC,EAAe,EAA0B,CAClE,OACE,GACA,CAAC,EAAK,WACL,EAAK,eAAiB,MAAQ,EAAK,aAAa,OAAS",
|
|
8
|
+
"debugId": "FF1586937CD5291F64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
function ee(e){return(typeof e==="object"||typeof e==="function")&&e!==null&&typeof e.then==="function"}var F=Symbol.for("bun-validate.contract"),xe=Symbol.for("bun-validate.variants");function G(e){return typeof e==="object"&&e!==null?e[xe]:void 0}var Re=[Date,RegExp,Error,Map,Set,WeakMap,WeakSet];function Te(e){return e instanceof Date||e instanceof RegExp||e instanceof Error||e instanceof Map||e instanceof Set||e instanceof WeakMap||e instanceof WeakSet}function K(e,n){if(n===void 0||n==="nest"||n==="minimal")return n;throw TypeError(`${e}: stripProtoKeys must be "nest" or "minimal" (or unset)`)}function M(e,n="nest"){if(e===null||typeof e!=="object"||ArrayBuffer.isView(e)&&!(e instanceof DataView))return;if(Te(e))return;let t=e;if(Array.isArray(e)){for(let r in t)M(t[r],n);return}if(Object.hasOwn(t,"__proto__"))Reflect.deleteProperty(t,"__proto__");if(n==="nest"){if(Object.hasOwn(t,"prototype"))Reflect.deleteProperty(t,"prototype");if(Object.hasOwn(t,"constructor")&&!Re.includes(t.constructor))Reflect.deleteProperty(t,"constructor")}else if(Object.hasOwn(t,"constructor")){let r=t.constructor;if(typeof r==="object"&&r!==null&&Object.hasOwn(r,"prototype"))Reflect.deleteProperty(t,"constructor")}for(let r in t)M(t[r],n)}var _=256,Oe=8,ve=/^[\w.:-]{1,64}$/;function Me(e){let{code:n,type:t}=e,r=typeof n==="string"?n:t;return typeof r==="string"&&ve.test(r)?r:void 0}function B(e){let n=Me(e);return n===void 0?"Invalid value":`Invalid value (${n})`}var ne=(e)=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function Ve(e,n){let t=ne(n);return new RegExp(`(?:received|was|value|got|given)[^A-Za-z0-9]{0,4}${t}(?![\\w.])|["'\`]${t}["'\`]`,"i").test(e)}function Ie(e,n){return new RegExp(`(?<!\\w)${ne(n)}(?!\\w)`).test(e)}function D(e,n,t,r=!1){if(n.plain.length+n.short.length>=_)return;switch(typeof e){case"string":if(e.length>=3)n.plain.push(e);else if(e.length>0)n.plain.push(JSON.stringify(e)),n.short.push(e);return;case"number":case"bigint":{let o=String(e);if(o.length>=3)n.plain.push(o);else n.short.push(o);return}case"boolean":n.short.push(String(e));return;case"object":{if(e===null||t>=Oe)return;if(e instanceof Date){if(!Number.isNaN(e.getTime()))n.plain.push(e.toISOString());return}if(ArrayBuffer.isView(e)||e instanceof ArrayBuffer)return;let o=Array.isArray(e);for(let a of Object.keys(e)){if(!o){if(n.plain.push(JSON.stringify(a)),r&&a.length>=3&&n.keys.length<_)n.keys.push(a)}if(D(e[a],n,t+1,r),n.plain.length+n.short.length>=_)return}}}}function U(e){return typeof e==="object"&&e!==null&&"key"in e?e.key:e}function Ee(e,n){let t=e,r;for(let o of n??[]){if(typeof t!=="object"||t===null)return;r=t,t=t[U(o)]}return{value:t,holder:r}}function je(e,n,t){let r=e.message,o={plain:[],short:[],keys:[]},a=Ee(n,e.path);if(a===void 0||a.holder===void 0)D(n,o,0,!0);else if(D(a.value,o,0,t==="path"),t==="whole")D(n,o,0);for(let s of e.path??[]){let i=U(s);if(typeof i==="string")o.plain.push(JSON.stringify(i))}for(let s of o.plain)if(r.includes(s))return!0;for(let s of o.short)if(Ve(r,s))return!0;for(let s of o.keys)if(Ie(r,s))return!0;return!1}function Ke(e,n,t,r){if(t?.messages==="generic")return B(e);let o=typeof e.message==="string"?e.message:"";if(o.length===0)return B(e);return je(e,n,r)?B(e):o}function De(e){if(!e.path||e.path.length===0)return"";return e.path.map((n)=>String(U(n))).join(".")}function $e(e,n,t,r,o,a,s="path"){return e.map((i)=>{let u={target:t,message:Ke(i,n,a,s),path:a?.redactPaths===!0?"":De(i)};if(r!==void 0)u.key=r;if(o!==void 0)u.mediaType=o;return u})}function A(e,n,t,r,o,a){let s=(u)=>u.issues?{ok:!1,issues:$e(u.issues,n,t,r===void 0?void 0:String(r),o,a)}:{ok:!0,value:u.value},i=e["~standard"].validate(n);return ee(i)?Promise.resolve(i).then(s):s(i)}function Pe(e,n,t,r,o,a){let s=K("validateStandard()",a?.stripProtoKeys);if(s!==void 0)M(n,s);return A(e,n,t,r,o,a)}var Ae={warn:(e,n)=>{if(n===void 0)console.warn(e);else console.warn(e,n)},error:(e,n)=>{if(n===void 0)console.error(e);else console.error(e,n)}};function Ne(e){let n=(t)=>(r,o={})=>{let a=o.error;e({level:t,message:r,...a instanceof Error?{error:a}:{},fields:o,bindings:{},time:Date.now()})};return{warn:n("warn"),error:n("error")}}function qe(e){if(e===void 0||e===null)return Ae;if(typeof e==="function")return Ne(e);if(typeof e==="object"&&typeof e.warn==="function"&&typeof e.error==="function")return e;throw TypeError("Unrecognised logger. Pass an object with warn(message, fields) and error(message, fields), or a function taking each log record.")}var Le;function te(e){return(Le??qe)(e)}var re=/^[!#$%&'*+.^\w`|~-]+$/;function oe(e){let n=e.indexOf(";");return(n===-1?e:e.slice(0,n)).trim().toLowerCase()}function Je(e){let n=oe(e),t=n.indexOf("/");if(t<=0||t!==n.lastIndexOf("/"))return;let r=n.slice(0,t),o=n.slice(t+1);if(!re.test(r)||!re.test(o))return;if(r==="*")return o==="*"?{declared:e,bare:n,type:r,specificity:0}:void 0;if(r.includes("*"))return;if(o==="*")return{declared:e,bare:n,type:r,specificity:1};if(o.includes("*"))return;return{declared:e,bare:n,type:r,specificity:2}}function N(e,n){let t=new Map,r=[];for(let[a,s]of Object.entries(e)){let i=Je(a);if(i===void 0)throw TypeError(`${n}: ${JSON.stringify(a)} is not a media type (type/subtype, type/* or */*)`);let u=t.get(i.bare);if(u!==void 0)throw TypeError(`${n}: ${JSON.stringify(u[0].declared)} and ${JSON.stringify(a)} are the same media type once parameters and case are ignored`);t.set(i.bare,[i,s]),r.push(a)}let o=t.get("*/*");return{declared:r,match:(a)=>{let s=oe(a),i=t.get(s);if(i!==void 0&&i[0].specificity===2)return i;let u=s.indexOf("/");if(u>0){let p=t.get(`${s.slice(0,u)}/*`);if(p!==void 0)return p}return o}}}var ae=Symbol.for("bun-validate.documented"),We=Symbol.for("bun-validate.kind");function Fe(e){return typeof e.input==="function"&&typeof e.output==="function"}function Ge(e){if(Fe(e))return e;let n=()=>structuredClone(e);return{input:n,output:n}}function H(e){return typeof e==="object"&&e!==null&&e[ae]===!0}function _e(e){if(typeof e!=="object"||e===null)return"value";let n=e[We];return n==="chunks"||n==="sse"||n==="opaque"?n:"value"}function se(e){if(_e(e)!=="opaque")return;let n=e.mediaType;return typeof n==="string"?n:void 0}function ie(e){if(typeof e!=="object"||e===null)throw TypeError("documented(): expected a JSON Schema object or converter");let n={"~standard":{version:1,vendor:"bun-common/documented",validate:(t)=>({value:t}),jsonSchema:Ge(e)}};return Object.defineProperty(n,ae,{value:!0,enumerable:!1}),n}var Be=["inbound","outbound"];function E(e){if(typeof e!=="object"&&typeof e!=="function")return!1;if(e===null)return!1;let n=e["~standard"];return typeof n==="object"&&n!==null&&typeof n.validate==="function"}function q(e){if(typeof e!=="object"||e===null)return!1;let n=Object.getPrototypeOf(e);return n===Object.prototype||n===null}function Ue(e,n,t){let r=`defineTransport("${e}").${n}`;if(!Array.isArray(t.parts))throw TypeError(`${r}: "parts" must be an array of part names`);let o=new Set;for(let a of t.parts){if(typeof a!=="string"||a.length===0)throw TypeError(`${r}: every part name must be a non-empty string`);if(o.has(a))throw TypeError(`${r}: the part "${a}" is listed twice`);o.add(a)}if(t.key!==void 0){if(typeof t.key!=="string"||t.key.length===0)throw TypeError(`${r}: "key" must be a non-empty string`);if(o.has(t.key))throw TypeError(`${r}: the key "${t.key}" cannot also be a part`)}for(let a of t.media??[])if(!o.has(a))throw TypeError(`${r}: media part "${a}" is not a part`);for(let a of Object.keys(t.encodings??{}))if(!o.has(a))throw TypeError(`${r}: the encoding for "${a}" names no part`)}function de(e,n,t){if(!q(t))throw TypeError(`${e}: expected an object of parts`);for(let[r,o]of Object.entries(t)){if(!n.parts.includes(r))throw TypeError(`${e}: "${r}" is not a part (${n.parts.join(", ")})`);if(o===void 0||o===null||E(o))continue;if(!(n.media??[]).includes(r))throw TypeError(`${e}: "${r}" must be a Standard Schema or null`);if(!q(o))throw TypeError(`${e}: "${r}" must be a Standard Schema, a media map or null`);for(let[a,s]of Object.entries(o)){if(s!==null&&!E(s))throw TypeError(`${e}: "${r}" media type "${a}" must be a Standard Schema or null`);let i=se(s);if(i!==void 0)throw TypeError(`${e}: "${r}" media type "${a}": opaque(${JSON.stringify(i)}) names a second media type; inside a media map write opaque()`)}N(o,`${e}: "${r}"`)}}function He(e,n){if(!q(n))throw TypeError(`${e.name}.contract(): expected an object of sides`);for(let[t,r]of Object.entries(n)){if(r===void 0)continue;let o=t==="inbound"||t==="outbound"?e[t]:void 0;if(o===void 0)throw TypeError(`${e.name}.contract(): no ${t} side`);let a=`${e.name}.contract().${t}`;if(o.key===void 0){de(a,o,r);continue}if(!q(r))throw TypeError(`${a}: expected an object keyed by ${o.key}`);for(let[s,i]of Object.entries(r))de(`${a}[${JSON.stringify(s)}]`,o,i)}}function Xe(e,n,t){let r={transport:e,def:n,meta:t};return Ye(r,r)}function L(e){if(typeof e?.name!=="string"||e.name.length===0)throw TypeError('defineTransport(): "name" must be a non-empty string');if(e.wire!==void 0&&e.wire!=="json"&&e.wire!=="identity")throw TypeError(`defineTransport("${e.name}"): "wire" is "json" or "identity"`);for(let t of Be){let r=e[t];if(r!==void 0)Ue(e.name,t,r)}return{spec:e,contract:(t,r={})=>(He(e,t),Xe(e,t,r))}}var ze=Reflect;function Ye(e,n){return Object.defineProperty(e,F,{value:n,enumerable:!1,writable:!1,configurable:!0}),ze.defineMetadata?.(F,n,e),e}class ut extends Error{issues;context;constructor(e,n){let t=`${n.transport} ${n.side}${n.key===void 0?"":` ${n.key}`}`,r=e.map((o)=>`${o.target}${o.path?`.${o.path}`:""}: ${o.message}`).join("; ");super(`${t} failed its contract: ${r}`);this.name="ContractError",this.issues=e,this.context=n}}function Qe(e){if(e===null)return!1;if(E(e))return H(e);let n=Object.values(e);return n.length>0&&n.every(H)}function ue(e){return Object.entries(e).filter(([,n])=>n!==void 0&&!Qe(n))}var Ze=/^(?:0|[1-9]\d*)$/,ce=Object.assign((e)=>e,{checks:!1,checksKey:(e)=>!1}),fe=new WeakMap;function rn(e,n){let t=fe.get(e);if(t===void 0)t=N(e,"contract media map"),fe.set(e,t);let r=t.match(n);return r===void 0?void 0:[r[0].declared,r[1]]}function on(e){let n=e.slice(0,10).join(", ");return e.length>10?`${n}, …`:n}function an(e,n,t,r,o,a){if(n===null){if(t===void 0)return{ok:!0,value:t};let c={target:e,message:`No ${e} is declared here`,path:""};if(r!==void 0)c.key=String(r);return{ok:!1,issues:[c]}}if(E(n)){if(a!==void 0)M(t,a);return A(n,t,e,r,void 0,o)}let s=t,i=typeof s?.mediaType==="string"?rn(n,s.mediaType):void 0;if(i===void 0){let c={target:e,message:`This media type is not declared (${Object.keys(n).join(", ")})`,path:""};if(r!==void 0)c.key=String(r);return{ok:!1,issues:[c]}}let[u,p]=i;if(p===null){if(s.value===void 0)return{ok:!0,value:t};let c={target:e,message:`No ${e} is declared for this media type`,path:"",mediaType:u};if(r!==void 0)c.key=String(r);return{ok:!1,issues:[c]}}if(a!==void 0)M(s.value,a);let f=A(p,s.value,e,r,u,o),d=(c)=>c.ok?{ok:!0,value:{mediaType:s.mediaType,value:c.value}}:c;return f instanceof Promise?f.then(d):d(f)}function sn(e,n,t,r){if(t===void 0)return;let o=r===void 0?G(t)===void 0?void 0:"":Object.keys(t).find((a)=>G(t[a])!==void 0);if(o===void 0)return;throw TypeError(`${e} ${n}${o===""?"":` ${r} ${JSON.stringify(o)}`} is declared with variants(), which the contract core's guards (createSender, createReceiver) do not check yet; HTTP's validate() checks them`)}function le(e,n,t,r){let o=t.policy??"error",a=t.undeclaredKey??"report",{onIssues:s}=t,i=K(r?"createReceiver()":"createSender()",t.stripProtoKeys)??"nest",u=r?i:void 0,p={...t.messages===void 0?{}:{messages:t.messages},...t.redactPaths===void 0?{}:{redactPaths:t.redactPaths}},f=e.transport[n],d=e.def[n],c=f?.key;sn(e.transport.name,n,d,c);let y=d===void 0||c!==void 0?[]:ue(d);if(o==="off"||f===void 0||d===void 0||c===void 0&&y.length===0)return ce;let w=new Map,m=[];if(c!==void 0){for(let[l,S]of Object.entries(d)){let k=ue(S);if(w.set(l,k),Ze.test(l))w.set(Number(l),k);m.push(l)}if(a==="allow"&&[...w.values()].every((l)=>l.length===0))return ce}let g=e.transport.name,h,C=()=>h??=te(t.logger),v=(l,S,k)=>{let O=k===void 0?{transport:g,side:n,policy:o}:{transport:g,side:n,key:k,policy:o};if(s!==void 0)try{s(S,O)}catch(b){C().error("contract onIssues hook failed",{transport:g,side:n,error:b})}if(o==="error")return new ut(S,O);return C().warn("contract mismatch",{transport:g,side:n,...k===void 0?{}:{key:k},issues:S.map((b)=>({target:b.target,path:b.path,message:b.message,...b.key===void 0?{}:{key:b.key},...b.mediaType===void 0?{}:{mediaType:b.mediaType}}))}),l},T=(l,S,k,O)=>{let b;for(let R of k)if(!R.ok)(b??=[]).push(...R.issues);if(b!==void 0)return v(l,b,O);if(!r)return l;let I=typeof l==="object"&&l!==null?{...l}:{};for(let R=0;R<S.length;R++)I[S[R][0]]=k[R].value;return I};return Object.assign((l)=>{let S=typeof l==="object"&&l!==null?l:void 0,k=y,O;if(c!==void 0){let x=S?.[c],V=typeof x==="string"||typeof x==="number"?w.get(x):void 0;if(V===void 0){if(a==="allow")return l;return v(l,[{target:c,message:`This ${c} is not declared (${on(m)})`,path:""}],void 0)}if(V.length===0)return l;k=V,O=x}let b=Array.from({length:k.length}),I=!1;for(let x=0;x<k.length;x++){let[V,Ce]=k[x],Z=an(V,Ce,S?.[V],O,p,u);b[x]=Z,I||=Z instanceof Promise}let R=O===void 0?void 0:String(O);return I?Promise.all(b).then((x)=>T(l,k,x,R)):T(l,k,b,R)},{checks:!0,checksKey:c===void 0?(l)=>!0:(l)=>{let S=w.get(l);return S===void 0?a==="report":S.length>0}})}function en(e,n,t){return le(e,n,t??{},!0)}function tn(e,n,t){return le(e,n,t??{},!1)}var ye=L({name:"websocket",inbound:{key:"type",parts:["data"]},outbound:{key:"type",parts:["data"]}});var dn={type:"object",properties:{code:{enum:["VALIDATION","UNKNOWN_MESSAGE","UNSUPPORTED_DATA"]},status:{type:"integer"},detail:{type:"string"},issues:{type:"array",items:{type:"object"}}},required:["code","status"]};function pe(e,n){let t={};for(let[r,o]of Object.entries(e)){if(o!==null&&!un(o))throw TypeError(`defineChannel(): the ${n} "${r}" must be a Standard Schema or null`);t[r]={data:o}}return t}function un(e){if(typeof e!=="object"&&typeof e!=="function"||e===null)return!1;return typeof e["~standard"]?.validate==="function"}function Pn(e){if(typeof e?.path!=="string"||!e.path.startsWith("/"))throw TypeError('defineChannel(): "path" must be a route path (starting with "/")');let n=pe(e.receives,"receives"),t=pe(e.sends,"sends");if(!("error"in t))t.error={data:ie(dn)};let r={path:e.path,...e.request===void 0?{}:{request:e.request},envelope:{idField:e.envelope?.idField??"id"},replies:e.replies??{},binary:e.binary===!0,subprotocol:e.subprotocol,topics:e.topics,fallback:e.fallback};return{contract:ye.contract({inbound:n,outbound:t},{name:e.meta?.name??e.path,description:e.meta?.description,channel:r}),meta:r,spec:e}}var me=L({name:"http",wire:"json",inbound:{parts:["headers","cookies","signedCookies","params","query","body"],media:["body"],encodings:{headers:"header-string",cookies:"cookie-string",signedCookies:"signed-cookie",params:"path-string",query:"querystring",body:"body"}},outbound:{key:"status",parts:["headers","cookies","body"],media:["body"],encodings:{headers:"header-string",cookies:"set-cookie",body:"body"}}});function cn(e){if(typeof e!=="object"||e===null)return!1;let n=Object.getPrototypeOf(e);return n===Object.prototype||n===null}function X(e,n){return e===""?n:`${e}.${n}`}function ge(e,n,t=20){let r=[],o=(a,s,i,u)=>{if(a===s||u>32||r.length>=t)return;if(Array.isArray(a)&&Array.isArray(s)){let f=Math.min(a.length,s.length);for(let d=0;d<f&&r.length<t;d++)o(a[d],s[d],X(i,String(d)),u+1);return}if(typeof a!=="object"||a===null||Array.isArray(a)||!cn(s))return;let p=a;for(let f of Object.keys(p)){if(r.length>=t)return;if(!Object.hasOwn(s,f))r.push(X(i,f));else o(p[f],s[f],X(i,f),u+1)}};return o(e,n,"",0),r}var he=new WeakMap;function be(e,n,t){let r=he.get(e);if(r===void 0)r=new Map,he.set(e,r);let o=r.get(n);if(o===void 0)o=t(),r.set(n,o);return o}function we(e){return me.contract(e)}function nn(e,n){return e.map((t)=>({...t,target:n&&t.target==="body"?"response":t.target,source:"builtin"}))}function fn(e){let n=e;return n!==null&&n.kind==="chunks"&&typeof n.chunk==="object"&&n.chunk!==null&&"~standard"in n.chunk?n.chunk:e}function Un(e){return e.map((n)=>({...n,target:n.target,source:"custom"}))}async function Ms(e,n,t){let r=Object.keys(n),o=[],a=r.filter((i)=>i!=="files"&&n[i].builtin&&e?.[i]!==void 0);if(e!==void 0&&a.length>0){let i=be(e,`request:${a.join(",")}`,()=>tn(we({inbound:Object.fromEntries(a.map((f)=>[f,e[f]]))}),"inbound")),u=Object.fromEntries(a.map((f)=>[f,t[f]])),p=await i(u);if(p instanceof ut)o.push(...nn(p.issues,!1))}if(n.files?.builtin===!0&&e?.files!==void 0){let i=await Pe(e.files,t.files,"files");if(!i.ok)o.push(...nn(i.issues,!1))}let s={...t};for(let i of r){let u=n[i].custom;if(u===void 0)continue;let p=await Pe(u,t[i],i);if(p.ok)s[i]=p.value;else o.push(...Un(p.issues))}return{value:s,issues:o}}async function Fs(e,n,t,r){let o=[],a,s=r.checkBody&&t.builtin&&e?.responses?.[n]!==void 0,i=r.headers!==void 0&&t.headers&&e?.responseHeaders?.[n]!==void 0;if(e!==void 0&&(s||i)){let p=be(e,`response:${s?"body":""}:${i?"headers":""}`,()=>{let c=new Set([...s?Object.keys(e.responses??{}):[],...i?Object.keys(e.responseHeaders??{}):[]]);return en(we({outbound:Object.fromEntries([...c].map((y)=>{let w={},m=e.responseHeaders?.[Number(y)];if(i&&m!==void 0)w.headers=m;let g=e.responses?.[Number(y)];if(s&&g!==void 0)w.body=fn(g);return[y,w]}))}),"outbound",{undeclaredKey:"allow"})}),f={status:n};if(i)f.headers={...r.headers};if(s)f.body=r.body;let d=await p(f);if(d instanceof ut)o.push(...nn(d.issues,!0));else if(s)a={ok:!0,value:d.body}}let u=r.body;if(r.checkBody&&t.custom!==void 0){let p=await Pe(t.custom,a===void 0?r.body:a.value,"response",String(n),void 0,{stripProtoKeys:"nest"});if(p.ok)u=p.value;else o.push(...Un(p.issues))}return{value:u,issues:o}}function Se(e,n,t,r,o,...a){let s=[];for(let[i,u,p]of a){let f=p?ge(u,p):[];if(f.length===0)continue;if(e==="warn"){o.warn(`${n}: the custom ${i} schema dropped keys: ${f.join(", ")}`);continue}for(let d of f)s.push({target:i,message:"Unrecognized key",path:d,source:"custom",...t===void 0?{}:{key:String(t)}})}return s.length===0?r:[...r,...s]}var z=["params","query","body","headers","files"],Q=()=>({enabled:!1,custom:void 0,replace:!1});function j(e,n){if(n===void 0)return;if(n===!1){Object.assign(e,Q());return}if(n===!0){e.enabled=!0;return}if(n.enabled!==void 0)e.enabled=n.enabled;if(n.custom!==void 0)e.custom=n.custom;if(n.replace!==void 0)e.replace=n.replace}function ln(e,n){let t=()=>({enabled:e,custom:void 0,replace:!1}),r={parts:{params:t(),query:t(),body:t(),headers:t(),files:t()},response:t(),statuses:new Map,onRequest:"throw",onResponse:"warn",unknownKeys:"strip"};for(let o of n){if(o===void 0)continue;if(o===!1){for(let i of z)r.parts[i]=Q();r.response=Q(),r.statuses.clear();continue}if(o.request!==void 0)for(let i of z)j(r.parts[i],o.request);for(let i of z)j(r.parts[i],o[i]);let a=o.response;if(typeof a==="boolean"){j(r.response,a);for(let i of r.statuses.values())j(i,a)}else if(a!==void 0)for(let[i,u]of Object.entries(a)){let p=Number(i),f=r.statuses.get(p)??{...r.response};j(f,u),r.statuses.set(p,f)}if(o.unknownKeys!==void 0)r.unknownKeys=o.unknownKeys;let s=o.onFailure;if(typeof s==="string"||typeof s==="function")r.onRequest=s,r.onResponse=s;else if(s!==void 0){if(s.request!==void 0)r.onRequest=s.request;if(s.response!==void 0)r.onResponse=s.response}}return r}function J(e,n){let t=n&&e.enabled&&!e.replace;if(!t&&e.custom===void 0)return;return e.custom===void 0?{builtin:t}:{builtin:t,custom:e.custom}}function ke(e,n){let t=J(e,n),r=n&&e.enabled;if(t===void 0&&!r)return;return t===void 0?{builtin:!1,headers:r}:{...t,headers:r}}function Y(e){let n={};return e.forEach((t,r)=>{n[r]=t}),n}function Bs(e){let{source:n,logger:t}=e,{ClientError:r,ValidationError:o}=e.errors,a=n!==void 0,s,i=(d)=>(s??=(async()=>{let c;try{c=typeof n==="function"?await n():n}catch(w){throw s=void 0,new r(`${d}: the built-in schemas failed to load`,{key:d,cause:w})}let y=c?.schemas;if(typeof y!=="object"||y===null)throw s=void 0,new r(`${d}: the schema source has no \`schemas\` object (a module generated by \`bun-client generate --zod\` exports one)`,{key:d});return y})(),s),u=async(d,c)=>c.some((y)=>y.builtin)?(await i(d))[d]:void 0,p=async(d,c,y)=>c.builtin||y&&c.headers?(await i(d))[d]:void 0,f=(d,c)=>{if(d==="throw")throw c;if(d==="warn")t.warn(c.message);else d(c)};return(d,c)=>{let y=ln(e.development,c),w=J(y.parts.headers,a);return{request:async(m,g)=>{let h={};for(let l of["params","query","body","files"]){if(g&&(l==="body"||l==="files"))continue;let S=J(y.parts[l],a);if(S!==void 0)h[l]=S}let C=Object.values(h);if(C.length===0)return m;let v=await Ms(await u(d,C),h,{params:m.params??{},query:m.query??{},body:m.body,files:m.files??{}}),{value:T,issues:P}=v;if(y.unknownKeys!=="strip")P=Se(y.unknownKeys,d,void 0,P,t,["query",m.query,h.query?.custom&&T.query],["body",m.body,h.body?.custom&&T.body]);if(P.length>0)f(y.onRequest,new o(d,"request",P));let W={...m};for(let l of Object.keys(h))W[l]=T[l];return W},headers:w===void 0?void 0:async(m)=>{let{issues:g}=await Ms(await u(d,[w]),{headers:w},{headers:Y(m.headers)});if(g.length>0)f(y.onRequest,new o(d,"request",g))},response:async(m,g,h)=>{let C=ke(y.statuses.get(m)??y.response,a);if(C===void 0)return g;let v=await Fs(await p(d,C,h!==void 0),m,C,{checkBody:!0,body:g,...h===void 0?{}:{headers:Y(h)}}),{value:T,issues:P}=v;if(y.unknownKeys!=="strip")P=Se(y.unknownKeys,d,m,P,t,["response",g,C.custom&&T]);if(P.length>0)return f(y.onResponse,new o(d,"response",P,m)),g;return T},responseHeaders:async(m,g)=>{let h=ke(y.statuses.get(m)??y.response,a);if(h===void 0||!h.headers)return;let{issues:C}=await Fs(await p(d,h,!0),m,h,{checkBody:!1,headers:Y(g)});if(C.length>0)f(y.onResponse,new o(d,"response",C,m))},events:async(m)=>{let g=J(y.statuses.get(m)??y.response,a);return g===void 0?void 0:{plan:g,route:await u(d,[g]),mode:y.onResponse}}}}}
|
|
2
|
+
export{Pe,ut,en,tn,Pn,nn,Un,Ms,Fs,Bs};
|
|
3
|
+
|
|
4
|
+
//# debugId=00CD9124281B829264756E2164756E21
|
|
5
|
+
//# sourceMappingURL=main-jv5xqd13.js.map
|