weifuwu 0.93.2 → 0.94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +5 -5
  2. package/dist/client/components/ActionSheet/ActionSheet.d.ts +1 -1
  3. package/dist/client/components/AlertGroup/AlertGroup.d.ts +1 -1
  4. package/dist/client/components/Anchor/Anchor.d.ts +1 -1
  5. package/dist/client/components/AppShell/AppShell.d.ts +20 -3
  6. package/dist/client/components/AuthPage/AuthPage.d.ts +1 -1
  7. package/dist/client/components/AutoComplete/AutoComplete.d.ts +1 -1
  8. package/dist/client/components/AvatarGroup/AvatarGroup.d.ts +1 -1
  9. package/dist/client/components/Button/Button.d.ts +8 -2
  10. package/dist/client/components/Chart/Chart.d.ts +1 -1
  11. package/dist/client/components/Chart/chart-utils.d.ts +1 -1
  12. package/dist/client/components/ChatInput/ChatInput.d.ts +3 -1
  13. package/dist/client/components/CodeBlock/CodeBlock.d.ts +1 -1
  14. package/dist/client/components/CodeBlock/highlight.d.ts +1 -1
  15. package/dist/client/components/Confirm/Confirm.d.ts +1 -1
  16. package/dist/client/components/CronPicker/CronPicker.d.ts +31 -0
  17. package/dist/client/components/DatePicker/DatePicker.d.ts +1 -1
  18. package/dist/client/components/DatePicker/calendar-utils.d.ts +1 -1
  19. package/dist/client/components/Descriptions/Descriptions.d.ts +1 -1
  20. package/dist/client/components/Drawer/Drawer.d.ts +4 -1
  21. package/dist/client/components/DropZone/DropZone.d.ts +1 -1
  22. package/dist/client/components/Dropdown/Dropdown.d.ts +1 -1
  23. package/dist/client/components/Editor/Editor.d.ts +1 -1
  24. package/dist/client/components/Editor/edit-events.d.ts +1 -1
  25. package/dist/client/components/Editor/model/apply.d.ts +1 -1
  26. package/dist/client/components/Editor/model/diff.d.ts +1 -1
  27. package/dist/client/components/Editor/model/dom.d.ts +1 -1
  28. package/dist/client/components/Editor/model/history.d.ts +1 -1
  29. package/dist/client/components/Editor/model/html.d.ts +1 -1
  30. package/dist/client/components/Editor/model/inverse.d.ts +1 -1
  31. package/dist/client/components/Editor/model/types.d.ts +1 -1
  32. package/dist/client/components/Editor/tools/table.d.ts +1 -1
  33. package/dist/client/components/Editor/tools/toolbar.d.ts +1 -1
  34. package/dist/client/components/Editor/tools/types.d.ts +1 -1
  35. package/dist/client/components/FilePreview/FilePreview.d.ts +1 -1
  36. package/dist/client/components/FilePreview/markdown.d.ts +1 -1
  37. package/dist/client/components/FileTree/FileTree.d.ts +1 -1
  38. package/dist/client/components/FileUpload/FileUpload.d.ts +1 -1
  39. package/dist/client/components/FloatButton/FloatButton.d.ts +1 -1
  40. package/dist/client/components/Grid/Grid.d.ts +1 -1
  41. package/dist/client/components/Highlight/Highlight.d.ts +1 -1
  42. package/dist/client/components/HoverCard/HoverCard.d.ts +1 -1
  43. package/dist/client/components/Icon/Icon.d.ts +1 -1
  44. package/dist/client/components/Img/Img.d.ts +1 -1
  45. package/dist/client/components/InView/InView.d.ts +1 -1
  46. package/dist/client/components/Input/Input.d.ts +6 -0
  47. package/dist/client/components/InputNumber/InputNumber.d.ts +1 -1
  48. package/dist/client/components/JSONViewer/JSONViewer.d.ts +1 -1
  49. package/dist/client/components/Layout/Layout.d.ts +1 -1
  50. package/dist/client/components/Link/Link.d.ts +1 -1
  51. package/dist/client/components/List/List.d.ts +1 -1
  52. package/dist/client/components/ListScaffold/ListScaffold.d.ts +40 -0
  53. package/dist/client/components/LogViewer/LogViewer.d.ts +1 -1
  54. package/dist/client/components/Markdown/Markdown.d.ts +1 -1
  55. package/dist/client/components/Markdown/parser.d.ts +1 -1
  56. package/dist/client/components/Menu/Menu.d.ts +3 -1
  57. package/dist/client/components/MessageBubble/MessageBubble.d.ts +1 -1
  58. package/dist/client/components/Modal/Modal.d.ts +5 -1
  59. package/dist/client/components/NavBar/NavBar.d.ts +1 -1
  60. package/dist/client/components/NavMenu/NavMenu.d.ts +1 -1
  61. package/dist/client/components/OfficeEditor/ai/ai-bridge.d.ts +1 -1
  62. package/dist/client/components/OfficeEditor/model/apply.d.ts +1 -1
  63. package/dist/client/components/OfficeEditor/model/types.d.ts +1 -1
  64. package/dist/client/components/PasswordInput/PasswordInput.d.ts +1 -1
  65. package/dist/client/components/Popconfirm/Popconfirm.d.ts +1 -1
  66. package/dist/client/components/Popover/Popover.d.ts +1 -1
  67. package/dist/client/components/PromptTemplate/PromptTemplate.d.ts +1 -1
  68. package/dist/client/components/RelationGraph/RelationGraph.d.ts +1 -1
  69. package/dist/client/components/Result/Result.d.ts +1 -1
  70. package/dist/client/components/Scrollbar/Scrollbar.d.ts +1 -1
  71. package/dist/client/components/SheetGrid/SheetGrid.d.ts +2 -2
  72. package/dist/client/components/Skeleton/Skeleton.d.ts +1 -1
  73. package/dist/client/components/SlideCanvas/SlideCanvas.d.ts +2 -2
  74. package/dist/client/components/Space/Space.d.ts +1 -1
  75. package/dist/client/components/StatusDot/StatusDot.d.ts +25 -0
  76. package/dist/client/components/TabBar/TabBar.d.ts +1 -1
  77. package/dist/client/components/TagsInput/TagsInput.d.ts +1 -1
  78. package/dist/client/components/Textarea/Textarea.d.ts +6 -0
  79. package/dist/client/components/ThemeSwitch/ThemeSwitch.d.ts +1 -1
  80. package/dist/client/components/Timeline/Timeline.d.ts +1 -1
  81. package/dist/client/components/Tooltip/Tooltip.d.ts +1 -1
  82. package/dist/client/components/VirtualTable/VirtualTable.d.ts +1 -1
  83. package/dist/client/components/WordCloud/WordCloud.d.ts +1 -1
  84. package/dist/client/components/index.d.ts +9 -3
  85. package/dist/client/components/index.js +36 -36
  86. package/dist/client/components/style.css +1 -1
  87. package/dist/client/layout/decl.d.ts +9 -0
  88. package/dist/client/layout/define.d.ts +41 -0
  89. package/dist/client/layout/index.d.ts +20 -0
  90. package/dist/client/layout/index.js +17 -0
  91. package/dist/client/layout/weifuwu-layout.css +1 -1
  92. package/dist/client/vdom/context/UIContext.d.ts +1 -1
  93. package/dist/client/vdom/core/create-component.d.ts +42 -0
  94. package/dist/client/vdom/core/create-item.d.ts +52 -0
  95. package/dist/client/vdom/core/vnode.d.ts +8 -2
  96. package/dist/client/vdom/hooks/env.d.ts +12 -0
  97. package/dist/client/vdom/hooks/field.d.ts +54 -0
  98. package/dist/client/vdom/hooks/overlay.d.ts +60 -0
  99. package/dist/client/vdom/hooks/signal.d.ts +25 -0
  100. package/dist/client/vdom/index.d.ts +9 -2
  101. package/dist/client/vdom/index.js +3 -3
  102. package/dist/client/vdom/jsx-runtime.d.ts +4 -4
  103. package/dist/client/vdom/jsx-runtime.js +1 -1
  104. package/dist/client/vdom/testing.js +2 -2
  105. package/dist/dev/index.js +7 -6
  106. package/dist/server/ai/index.js +7 -0
  107. package/dist/server/ai/types.d.ts +1 -1
  108. package/dist/server/email/index.js +1 -0
  109. package/dist/server/index.js +235 -5
  110. package/dist/server/messager/index.js +1 -0
  111. package/dist/server/postgres/index.js +56 -0
  112. package/dist/server/queue/index.js +1 -0
  113. package/dist/server/redis/index.js +3 -0
  114. package/dist/server/scheduler/index.js +1 -0
  115. package/dist/server/ui/index.d.ts +1 -1
  116. package/dist/server/ui/index.js +15 -0
  117. package/dist/server/user/index.js +1 -0
  118. package/dist/server/user/token.d.ts +1 -1
  119. package/dist/server/workflows/index.js +24 -0
  120. package/dist/shared/router/index.js +2 -0
  121. package/docs/client.md +143 -10
  122. package/docs/layout.md +14 -14
  123. package/docs/server.md +1 -1
  124. package/package.json +66 -12
@@ -10324,6 +10324,85 @@ import { fileURLToPath } from "node:url";
10324
10324
 
10325
10325
  // src/client/layout/bundle.ts
10326
10326
  import { readFile, readdir } from "node:fs/promises";
10327
+
10328
+ // src/client/layout/define.ts
10329
+ var rule = (sel, props) => props && Object.keys(props).length ? `${sel} { ${Object.entries(props).map(([k, v]) => `${k}: ${v};`).join(" ")} }` : "";
10330
+ function generateLayoutCss(decls) {
10331
+ const out = [];
10332
+ for (const d of decls) {
10333
+ const sel = `.${d.class}`;
10334
+ const b = rule(sel, d.base ?? {});
10335
+ if (b) out.push(b);
10336
+ const def = rule(`:where(${sel})`, d.defaults ?? {});
10337
+ if (def) out.push(def);
10338
+ for (const [vcls, v] of Object.entries(d.variants ?? {})) {
10339
+ const vs = `.${vcls}`;
10340
+ const vb = rule(vs, { ...d.base ?? {}, ...v.cover ?? {} });
10341
+ if (vb) out.push(vb);
10342
+ const vdef = rule(`:where(${vs})`, { ...d.defaults ?? {}, ...v.defaults ?? {} });
10343
+ if (vdef) out.push(vdef);
10344
+ }
10345
+ }
10346
+ return out.join("\n");
10347
+ }
10348
+
10349
+ // src/client/layout/decl.ts
10350
+ var structures = [
10351
+ {
10352
+ class: "wf-stack",
10353
+ base: { display: "flex", "flex-direction": "column" },
10354
+ defaults: { gap: "var(--wf-gap, var(--wf-gap-md))", "align-items": "var(--wf-align, stretch)" }
10355
+ },
10356
+ {
10357
+ class: "wf-row",
10358
+ base: { display: "flex", "flex-wrap": "wrap" },
10359
+ defaults: { gap: "var(--wf-gap, var(--wf-gap-md))", "align-items": "var(--wf-align, center)" },
10360
+ variants: {
10361
+ "wf-row-reverse": { cover: { "flex-direction": "row-reverse" } }
10362
+ }
10363
+ },
10364
+ // items — 交叉轴对齐(单机制——设 --wf-align 变量,wf-row/wf-stack 等消费;
10365
+ // 值为 CSS align-items 值词。物理方向词(top/bottom)禁入对齐域)
10366
+ { class: "wf-items-start", base: { "--wf-align": "flex-start" } },
10367
+ { class: "wf-items-center", base: { "--wf-align": "center" } },
10368
+ { class: "wf-items-end", base: { "--wf-align": "flex-end" } },
10369
+ { class: "wf-items-stretch", base: { "--wf-align": "stretch" } },
10370
+ // W5 扩容(结构原语同构面——base+defaults 验证):
10371
+ // grid — 栅格(--wf-cols 列数变量)
10372
+ {
10373
+ class: "wf-grid",
10374
+ base: { display: "grid", "grid-template-columns": "var(--wf-cols, repeat(auto-fill, minmax(280px, 1fr)))" },
10375
+ defaults: { gap: "var(--wf-gap, var(--wf-gap-lg))" }
10376
+ },
10377
+ // center — 居中(base-only)
10378
+ {
10379
+ class: "wf-center",
10380
+ base: { display: "flex", "flex-direction": "column", "align-items": "center", "justify-content": "center" }
10381
+ },
10382
+ // justify 家族(base+defaults 同构——变体即独立类)
10383
+ { class: "wf-justify-between", base: { display: "flex", "justify-content": "space-between" }, defaults: { "align-items": "var(--wf-align, center)", gap: "var(--wf-gap, var(--wf-gap-md))" } },
10384
+ { class: "wf-justify-end", base: { display: "flex", "justify-content": "flex-end" }, defaults: { "align-items": "var(--wf-align, center)", gap: "var(--wf-gap, var(--wf-gap-md))" } },
10385
+ { class: "wf-justify-center", base: { display: "flex", "justify-content": "center" }, defaults: { "align-items": "var(--wf-align, center)", gap: "var(--wf-gap, var(--wf-gap-md))" } },
10386
+ // fill — 弹性填充(base-only)
10387
+ { class: "wf-fill", base: { flex: "1", "min-width": "0", "min-height": "0" } },
10388
+ // fill-hover — 填充悬停面(消费侧欠账补定义——消费证据:平台行按钮)
10389
+ {
10390
+ class: "wf-fill-hover",
10391
+ base: {
10392
+ "border-radius": "var(--wf-radius-sm)",
10393
+ padding: "2px 4px",
10394
+ margin: "-2px -4px",
10395
+ transition: "background 0.15s ease"
10396
+ }
10397
+ },
10398
+ // cover — 全屏覆盖(base-only——z-index token 化)
10399
+ {
10400
+ class: "wf-cover",
10401
+ base: { position: "fixed", inset: "0", display: "flex", "align-items": "center", "justify-content": "center", "z-index": "var(--wf-z, var(--wf-cover-z))" }
10402
+ }
10403
+ ];
10404
+
10405
+ // src/client/layout/bundle.ts
10327
10406
  import { join, resolve as resolve2 } from "node:path";
10328
10407
  var LAYER_ORDER = ["tokens", "base", "layout", "components", "utilities"];
10329
10408
  var LAYER_OF = {
@@ -10388,6 +10467,14 @@ async function bundleLayout(layoutDir) {
10388
10467
  const inputs = [join(dir, "weifuwu-layout.css")];
10389
10468
  const chunks = [];
10390
10469
  for (const f2 of files) {
10470
+ if (f2 === "_stack.css") {
10471
+ inputs.push(join(dir, "decl.ts"), join(dir, "define.ts"));
10472
+ chunks.push(`@layer ${LAYER_OF["_stack"]} {
10473
+ ${generateLayoutCss(structures)}
10474
+ }`);
10475
+ continue;
10476
+ }
10477
+ if (f2 === "_row.css") continue;
10391
10478
  const abs = join(dir, f2);
10392
10479
  inputs.push(abs);
10393
10480
  const content = stripImports(await readFile(abs, "utf-8")).trim();
@@ -10400,7 +10487,7 @@ async function bundleLayout(layoutDir) {
10400
10487
  ${content}
10401
10488
  }`);
10402
10489
  }
10403
- const css = `/* weifuwu/layout \u2014 CSS \u5E03\u5C40\u539F\u8BED + \u8BBE\u8BA1 Token\uFF08\u88C5\u914D\u5355\u6E90\uFF1Asrc/client/layout/bundle.ts\uFF09 */
10490
+ const css = `/* weifuwu/client/layout \u2014 CSS \u5E03\u5C40\u539F\u8BED + \u8BBE\u8BA1 Token\uFF08\u88C5\u914D\u5355\u6E90\uFF1Asrc/client/layout/bundle.ts\uFF09 */
10404
10491
 
10405
10492
  @layer ${LAYER_ORDER.join(", ")};
10406
10493
 
@@ -10973,8 +11060,29 @@ function stripKey(props) {
10973
11060
  }
10974
11061
 
10975
11062
  // src/client/vdom/core/vnode.ts
11063
+ function normalizeClass(v) {
11064
+ if (v == null || v === false) return void 0;
11065
+ if (typeof v === "string") return v.trim() || void 0;
11066
+ if (typeof v === "number") return String(v);
11067
+ if (Array.isArray(v)) {
11068
+ const parts = v.map(normalizeClass).filter((x) => !!x);
11069
+ return parts.length ? parts.join(" ") : void 0;
11070
+ }
11071
+ if (typeof v === "object") {
11072
+ const parts = Object.entries(v).filter(([, on]) => !!on).map(([k]) => k);
11073
+ return parts.length ? parts.join(" ") : void 0;
11074
+ }
11075
+ return void 0;
11076
+ }
11077
+ function normalizeProps(p) {
11078
+ for (const k of ["class", "className"]) {
11079
+ const v = p[k];
11080
+ if (v != null && typeof v !== "string") p[k] = normalizeClass(v);
11081
+ }
11082
+ return p;
11083
+ }
10976
11084
  function h(type, props, ...children) {
10977
- const p = stripKey(props);
11085
+ const p = stripKey(normalizeProps(props ?? {}));
10978
11086
  if (children.length === 1) p.children = children[0];
10979
11087
  else if (children.length > 1) p.children = children;
10980
11088
  return { type, props: p, key: extractKey(props) };
@@ -11336,7 +11444,16 @@ function createSegment(factory, props, ctx, compId, requestSegmentRender) {
11336
11444
  },
11337
11445
  getSharedContext: () => ctx ?? null
11338
11446
  });
11339
- const renderFn = factory(props, instCtx);
11447
+ const out = factory(props, instCtx);
11448
+ let renderFn;
11449
+ if (typeof out === "function") {
11450
+ renderFn = out;
11451
+ } else {
11452
+ renderFn = ((p) => {
11453
+ const r = factory(p, instCtx);
11454
+ return typeof r === "function" ? null : r;
11455
+ });
11456
+ }
11340
11457
  const renderBase = hookSeq.n;
11341
11458
  return { factory, renderFn, lastOutput: void 0, hookSeq, renderBase, instData, destroy$, disposed: false, epoch: segmentEpoch };
11342
11459
  }
@@ -13924,6 +14041,116 @@ function visualViewport$(env) {
13924
14041
  });
13925
14042
  }
13926
14043
 
14044
+ // src/client/vdom/hooks/signal.ts
14045
+ function useSignal(env, init) {
14046
+ const idx = env.nextHookIndex();
14047
+ let st = env.getHookState(idx);
14048
+ if (st === void 0) {
14049
+ st = { v: init };
14050
+ env.setHookState(idx, st);
14051
+ }
14052
+ return {
14053
+ get: () => st.v,
14054
+ set: (v) => {
14055
+ st.v = typeof v === "function" ? v(st.v) : v;
14056
+ env.requestRender();
14057
+ }
14058
+ };
14059
+ }
14060
+
14061
+ // src/client/vdom/hooks/overlay.ts
14062
+ function useOverlay(env, opts) {
14063
+ let handle2 = null;
14064
+ let latest = opts;
14065
+ const maskProps = {
14066
+ onClick: (e) => {
14067
+ if (latest.maskClosable !== false && e.target === e.currentTarget) close();
14068
+ }
14069
+ };
14070
+ const panelProps = { role: opts.role ?? "dialog", "aria-modal": true };
14071
+ const close = () => latest.onOpenChange?.(false);
14072
+ const sync = (getContent, latestOpts) => {
14073
+ if (latestOpts) latest = latestOpts;
14074
+ const open2 = !!latest.open;
14075
+ if (open2 && !handle2) {
14076
+ handle2 = openPopup(env, {
14077
+ key: "overlay",
14078
+ presence: !!latest.presence,
14079
+ trapFocus: latest.trapFocus !== false,
14080
+ lockScroll: latest.lockScroll !== false,
14081
+ positioning: "none",
14082
+ closeOnOutside: false,
14083
+ // 遮罩点击语义组件自控(maskProps)
14084
+ closeOnEscape: false,
14085
+ // Esc 契约自控(mount 期 useGlobalKey——open 期间)
14086
+ content: getContent,
14087
+ onClose: () => {
14088
+ handle2 = null;
14089
+ }
14090
+ });
14091
+ } else if (!open2 && handle2) {
14092
+ handle2.update(getContent());
14093
+ handle2.close();
14094
+ handle2 = null;
14095
+ } else if (handle2) {
14096
+ handle2.update(getContent());
14097
+ }
14098
+ };
14099
+ useGlobalKey(env, (e) => {
14100
+ if (e.key === "Escape" && handle2?.open && latest.closeOnEscape !== false) close();
14101
+ });
14102
+ env.onUnmount?.(() => {
14103
+ if (handle2) handle2.close();
14104
+ });
14105
+ return { maskProps, panelProps, close, sync };
14106
+ }
14107
+
14108
+ // src/client/vdom/hooks/field.ts
14109
+ function useField(env, optsIn) {
14110
+ void env;
14111
+ let opts = optsIn;
14112
+ const id = () => opts.id ?? (opts.name ? `wf-${opts.name}` : void 0);
14113
+ const baseId = () => id() ?? "wf-field";
14114
+ return {
14115
+ get hasWrap() {
14116
+ return !!(opts.label || opts.error || opts.hint);
14117
+ },
14118
+ get stateClass() {
14119
+ return opts.error ? ` ${opts.wrapErrClass ?? "wf-field--err"}` : "";
14120
+ },
14121
+ get inputId() {
14122
+ return id();
14123
+ },
14124
+ inputProps() {
14125
+ const p = {};
14126
+ const i = id();
14127
+ if (i) p.id = i;
14128
+ if (opts.error) p["aria-invalid"] = true;
14129
+ const desc = [];
14130
+ if (opts.error) desc.push(`${baseId()}-err`);
14131
+ if (opts.hint && !opts.error) desc.push(`${baseId()}-hint`);
14132
+ if (desc.length) p["aria-describedby"] = desc.join(" ");
14133
+ if (opts.required) p["aria-required"] = true;
14134
+ return p;
14135
+ },
14136
+ renderLabel() {
14137
+ if (opts.label == null && !opts.required) return null;
14138
+ const kids = [];
14139
+ if (opts.label != null) kids.push(opts.label);
14140
+ if (opts.required) {
14141
+ kids.push(h("span", { class: opts.reqClass ?? "wf-field-req" }, opts.reqChar ?? "*"));
14142
+ }
14143
+ return h("label", { class: opts.labelClass, ...id() ? { for: id() } : {} }, kids);
14144
+ },
14145
+ renderError() {
14146
+ return opts.error ? h("div", { class: opts.errClass, id: `${baseId()}-err` }, opts.error) : null;
14147
+ },
14148
+ renderHint() {
14149
+ return opts.hint && !opts.error ? h("div", { class: opts.hintClass, id: `${baseId()}-hint` }, opts.hint) : null;
14150
+ }
14151
+ };
14152
+ }
14153
+
13927
14154
  // src/client/vdom/hooks/env.ts
13928
14155
  var asyncRegistry = /* @__PURE__ */ new Map();
13929
14156
  var asyncInflight = /* @__PURE__ */ new Set();
@@ -14037,7 +14264,10 @@ function createUi(env) {
14037
14264
  useTween: (target, opts) => useTween(env, target, opts),
14038
14265
  useDrag: (options) => useDrag(env, options),
14039
14266
  useVisualViewport: () => useVisualViewport(env),
14040
- useReducedMotion: () => useReducedMotion(env)
14267
+ useReducedMotion: () => useReducedMotion(env),
14268
+ useSignal: (init) => useSignal(env, init),
14269
+ useOverlay: (opts) => useOverlay(env, opts),
14270
+ useField: (opts) => useField(env, opts)
14041
14271
  };
14042
14272
  }
14043
14273
 
@@ -14457,7 +14687,7 @@ function ui(options = {}) {
14457
14687
  format: "esm",
14458
14688
  platform: "browser",
14459
14689
  jsx: "automatic",
14460
- jsxImportSource: "weifuwu/vdom",
14690
+ jsxImportSource: "weifuwu/client/vdom",
14461
14691
  write: false,
14462
14692
  metafile: true,
14463
14693
  // 依赖闭包快照(新鲜度校验——依赖变更也重建)
@@ -0,0 +1 @@
1
+ var f=class extends Error{status;constructor(e,t){super(e),this.name="HttpError",this.status=t}};var j=class extends Error{issues;constructor(e){super(e.map(t=>`${t.path}: ${t.message}`).join("; ")),this.name="ZodError",this.issues=e}},g=class{_meta={};get metaInfo(){return this._meta}meta(e){return this._meta={...this._meta,...e},this}parse(e){let t=this._parse(e);if(!t.ok)throw new j([{path:t.path??"",message:t.message??"invalid"}]);return t.value}safeParse(e){let t=this._parse(e);return t.ok?{success:!0,data:t.value}:{success:!1,error:new j([{path:t.path??"",message:t.message??"invalid"}])}}optional(){return new X(this)}nullable(){return new Q(this)}default(e){return new Y(this,e)}refine(e,t){return new ee(this,e,t)}transform(e){return new te(this,e)}},Z=class extends g{_typeName(){return"string"}_parse(e){if(typeof e!="string")return{ok:!1,path:"",message:"expected string"};let t=e;return this._min!==void 0&&t.length<this._min?{ok:!1,path:"",message:`too small (min ${this._min})`}:this._max!==void 0&&t.length>this._max?{ok:!1,path:"",message:`too big (max ${this._max})`}:this._pattern&&!this._pattern.test(t)?{ok:!1,path:"",message:"invalid pattern"}:this._email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?{ok:!1,path:"",message:"invalid email"}:this._uuid&&!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)?{ok:!1,path:"",message:"invalid uuid"}:{ok:!0,value:t}}_min;_max;_pattern;_email=!1;_uuid=!1;min(e){return this._min=e,this}max(e){return this._max=e,this}regex(e,t){return this._pattern=e,this}email(){return this._email=!0,this}uuid(){return this._uuid=!0,this}},z=class extends g{_typeName(){return"number"}_parse(e){if(typeof e!="number"||Number.isNaN(e))return{ok:!1,path:"",message:"expected number"};let t=e;return this._int&&!Number.isInteger(t)?{ok:!1,path:"",message:"expected integer"}:this._min!==void 0&&t<this._min?{ok:!1,path:"",message:`too small (min ${this._min})`}:this._max!==void 0&&t>this._max?{ok:!1,path:"",message:`too big (max ${this._max})`}:{ok:!0,value:t}}_int=!1;_min;_max;int(){return this._int=!0,this}min(e){return this._min=e,this}max(e){return this._max=e,this}positive(){return this._min=0,this}},W=class extends g{_typeName(){return"boolean"}_parse(e){return typeof e!="boolean"?{ok:!1,path:"",message:"expected boolean"}:{ok:!0,value:e}}},N=class extends g{lit;constructor(e){super(),this.lit=e}get value(){return this.lit}_typeName(){return"literal"}_parse(e){return e!==this.lit?{ok:!1,path:"",message:`expected literal ${JSON.stringify(this.lit)}`}:{ok:!0,value:e}}},q=class extends g{raw;constructor(e){super(),this.raw=e}get values(){return this.raw}_typeName(){return"enum"}_parse(e){return typeof e!="string"||!this.raw.includes(e)?{ok:!1,path:"",message:`expected one of ${this.raw.join(" | ")}`}:{ok:!0,value:e}}},A=class extends g{_typeName(){return"datetime"}_parse(e){return typeof e!="string"||Number.isNaN(Date.parse(e))?{ok:!1,path:"",message:"expected datetime string (ISO)"}:{ok:!0,value:e}}},H=class extends g{dims;constructor(e){super(),this.dims=e}_typeName(){return"vector"}_parse(e){return typeof e!="object"||e===null||!Array.isArray(e)||!e.every(t=>typeof t=="number")?{ok:!1,path:"",message:"expected number[] vector"}:this.dims>0&&e.length!==this.dims?{ok:!1,path:"",message:`expected vector(${this.dims})\u2014\u2014got ${e.length} dims`}:{ok:!0,value:e}}},L=class extends g{_typeName(){return"json"}_parse(e){return{ok:!0,value:e}}},B=class r extends g{shape;constructor(e){super(),this.shape=e}_typeName(){return"object"}_parse(e){if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,path:"",message:"expected object"};let t={},l=[];for(let[p,E]of Object.entries(this.shape)){let S=E._parse(e[p]);if(!S.ok){l.push({path:p,message:S.message??""});continue}t[p]=S.value}return l.length?{ok:!1,path:l[0].path,message:l[0].message}:{ok:!0,value:t}}pick(e){let t={};for(let l of e)t[l]=this.shape[l];return new r(t)}omit(e){let t={};for(let[l,p]of Object.entries(this.shape))e.includes(l)||(t[l]=p);return new r(t)}extend(e){return new r({...this.shape,...e})}},J=class extends g{inner;constructor(e){super(),this.inner=e}get itemSchema(){return this.inner}_typeName(){return"array"}_parse(e){if(!Array.isArray(e))return{ok:!1,path:"",message:"expected array"};if(this._min!==void 0&&e.length<this._min)return{ok:!1,path:"",message:`too small (min ${this._min})`};if(this._max!==void 0&&e.length>this._max)return{ok:!1,path:"",message:`too big (max ${this._max})`};let t=[];for(let l=0;l<e.length;l++){let p=this.inner._parse(e[l]);if(!p.ok)return{ok:!1,path:`${l}`,message:p.message};t.push(p.value)}return{ok:!0,value:t}}_min;_max;min(e){return this._min=e,this}max(e){return this._max=e,this}},V=class extends g{options;constructor(e){super(),this.options=e}_typeName(){return"union"}_parse(e){let t=null;for(let l of this.options){let p=l._parse(e);if(p.ok)return{ok:!0,value:p.value};t||(t={path:p.path??"",message:p.message??""})}return{ok:!1,path:"",message:`expected union (${t?.message})`}}},G=class extends g{disc;options;discValueOf;constructor(e,t,l){super(),this.disc=e,this.options=t,this.discValueOf=l}_typeName(){return"disUnion"}_parse(e){if(typeof e!="object"||e===null)return{ok:!1,path:"",message:"expected object"};let t=e[this.disc];for(let l of this.options)if(this.discValueOf(l.shape)===t){let p=l._parse(e);return p.ok?{ok:!0,value:p.value}:{ok:!1,path:`(${String(t)})`,message:p.message??""}}return{ok:!1,path:this.disc,message:`invalid discriminator value ${JSON.stringify(t)}`}}};function Te(r,e){let t=r[e];if(t instanceof N)return t.lit;if(t instanceof q)return t.values;throw new Error(`z.discriminatedUnion: \u5224\u522B\u5B57\u6BB5\u9700\u4E3A literal/enum\u2014\u2014\u5F97\u5230 ${t?._typeName?.()}`)}var X=class extends g{inner;constructor(e){super(),this.inner=e}_typeName(){return"optional"}_parse(e){return e===void 0?{ok:!0,value:void 0}:this.inner._parse(e)}},Q=class extends g{inner;constructor(e){super(),this.inner=e}_typeName(){return"nullable"}_parse(e){return e===null?{ok:!0,value:null}:this.inner._parse(e)}},Y=class extends g{inner;d;constructor(e,t){super(),this.inner=e,this.d=t}_typeName(){return"default"}_parse(e){if(e===void 0){let t=typeof this.d=="function"?this.d():this.d;return this.inner._parse(t)}return this.inner._parse(e)}},ee=class extends g{inner;fn;msg;constructor(e,t,l){super(),this.inner=e,this.fn=t,this.msg=l}_typeName(){return"effects"}_parse(e){let t=this.inner._parse(e);return t.ok?this.fn(t.value)?{ok:!0,value:t.value}:{ok:!1,path:"",message:this.msg??"refine failed"}:{ok:!1,path:t.path??"",message:t.message??""}}},te=class extends g{inner;fn;constructor(e,t){super(),this.inner=e,this.fn=t}_typeName(){return"transform"}_parse(e){let t=this.inner._parse(e);return t.ok?{ok:!0,value:this.fn(t.value)}:{ok:!1,path:t.path??"",message:t.message??""}}},u={string:()=>new Z,number:()=>new z,boolean:()=>new W,literal:r=>new N(r),enum:r=>new q(r),date:()=>new A,uuid:()=>new Z().uuid(),json:()=>new L,vector:r=>new H(r),object:r=>new B(r),array:r=>new J(r),union:r=>new V(r),discriminatedUnion:(r,e)=>new G(r,e,t=>Te(t,r))};function T(r,e){return r.meta(e)}var h={pk:r=>T(r,{pk:!0,default:"random"}),req:r=>T(r,{notNull:!0}),col:(r,e)=>T(r,{column:e}),now:r=>T(r,{default:"now"}),unique:r=>T(r,{unique:!0}),dflt:(r,e)=>T(r,{default:e})};function D(r,e){return Response.json(r,{status:200,...e})}function P(r,e){return Response.json(r,{status:201,...e})}function ne(r){return new Response(null,{status:204,...r})}function k(r){return Response.json({error:r??"Bad Request"},{status:400})}var Se=0,I="_weifuwu_conversations",_="_weifuwu_conversation_members",re="_weifuwu_messages",se={conversations:{id:h.pk(u.uuid()),type:u.string().meta({notNull:!0,default:"direct"}),created_by:u.uuid().nullable(),direct_key:u.string().nullable(),created_at:h.now(u.date())},members:{conversation_id:h.req(u.uuid()),user_id:h.req(u.uuid()),last_read_at:u.date().nullable(),joined_at:h.now(u.date())},messages:{id:h.pk(u.uuid()),conversation_id:h.req(u.uuid()),sender_type:u.string().meta({notNull:!0,default:"user"}),sender_id:u.uuid().nullable(),content:h.req(u.string()),msg_type:u.string().meta({notNull:!0,default:"text"}),created_at:h.now(u.date()),edited_at:u.date().nullable(),deleted_at:u.date().nullable()}};function ze(r){let e=r.orm,t=e.table(I,se.conversations),l=e.table(_,se.members),p=e.table(re,se.messages),E=r.prefix??"/api/messages";async function S(n,o){let s=await e.query.from(`${I} c`).where({"c.type":{eq:"direct"}}).exists({kind:"select",table:_,alias:"m",cols:["1"],where:{"m.conversation_id":{col:"c.id"},"m.user_id":{eq:n}}}).exists({kind:"select",table:_,alias:"m",cols:["1"],where:{"m.conversation_id":{col:"c.id"},"m.user_id":{eq:o}}}).in("c.id",{kind:"select",table:_,alias:"m",cols:["conversation_id"],groupBy:["conversation_id"],having:{"count(*)":{eq:2}}}).select("c.id","c.type","c.created_by","c.created_at").limit(1).run();return s.length?s[0]:null}async function oe(n,o,s){let i=n.table(_);for(let d of s)await i.insert({conversation_id:o,user_id:d}).onConflict(void 0,!1).run()}async function $(n,o){if(o.type==="direct"){let i=[n,o.otherUserId].sort().join(":"),d=await S(n,o.otherUserId);if(d)return d;let a=async y=>{let x=await y.table(I).insert({type:"direct",created_by:n,direct_key:i}).onConflict("direct_key").run();if(!x.length)return null;let ye=x[0];return await oe(y,String(ye.id),[n,o.otherUserId]),ye},c=await e.transaction(a);if(c)return c;let m=await t.select().where({type:{eq:"direct"},direct_key:{eq:i}}).run();if(m.length)return m[0];throw new f("Conversation creation failed",500)}let s=[n,...o.memberIds.filter(i=>i!==n)];return _e(n,"group",s)}async function _e(n,o,s){let i=async d=>{let m=(await d.table(I).insert({type:o,created_by:n}).run())[0];return await oe(d,String(m.id),s),m};return e.transaction(i)}async function ae(n){let o=await e.query.from(`${_} m`).join(`${I} c`,{"c.id":{col:"m.conversation_id"}}).where({"m.user_id":{eq:n}}).select("c.id","c.type","c.created_by","c.created_at","m.last_read_at").run(),s=[];for(let i of o){let d=String(i.id),a=await p.select().where({conversation_id:{eq:d},deleted_at:{isNull:!0}}).orderBy("created_at","desc").orderBy("id","desc").limit(1).run(),c=await p.select().where({conversation_id:{eq:d},deleted_at:{isNull:!0},...i.last_read_at?{created_at:{gt:String(i.last_read_at)}}:{},or:[{sender_id:{isNull:!0}},{sender_id:{ne:n}}]}).count().run();s.push({id:d,type:i.type,created_by:i.created_by,created_at:new Date(i.created_at).toISOString(),last_message:a.length?O(a[0]):null,unread_count:Number(c[0].count)})}return s.sort((i,d)=>{let a=i.last_message?Date.parse(i.last_message.created_at):Date.parse(i.created_at);return(d.last_message?Date.parse(d.last_message.created_at):Date.parse(d.created_at))-a}),s}async function we(n,o){if(!await U(n,o))return null;let s=await t.select().where({id:{eq:n}}).run();return s.length?s[0]:null}async function U(n,o){return l.exists({conversation_id:{eq:n},user_id:{eq:o}})}async function ie(n,o){let s=await p.insert({conversation_id:n,sender_type:o.senderType,sender_id:o.senderId??null,content:o.content,msg_type:o.msgType??"text"}).run();return O(s[0])}async function de(n,o){let s=o.limit??50,i=p.select().where({conversation_id:{eq:n}});if(o.before){let[a]=await p.select("created_at","id").where({id:{eq:o.before}}).run();a&&i.where({or:[{created_at:{lt:a.created_at}},{created_at:{eq:a.created_at},id:{lt:a.id}}]})}return(await i.orderBy("created_at","desc").orderBy("id","desc").limit(s).run()).map(O)}async function ue(n,o){let s=await p.update({content:o,edited_at:new Date().toISOString()}).where({id:{eq:n},deleted_at:{isNull:!0}}).returning("*").run();return s.length?O(s[0]):null}async function ce(n){return(await p.update({deleted_at:new Date().toISOString()}).where({id:{eq:n},deleted_at:{isNull:!0}}).returning("id").run()).length>0}async function le(n,o){await l.update({last_read_at:new Date().toISOString()}).where({conversation_id:{eq:n},user_id:{eq:o}}).run()}function O(n){return{id:n.id,conversation_id:n.conversation_id,sender_type:n.sender_type,sender_id:n.sender_id,content:n.content,msg_type:n.msg_type,created_at:new Date(n.created_at).toISOString(),edited_at:n.edited_at?new Date(n.edited_at).toISOString():null,deleted_at:n.deleted_at?new Date(n.deleted_at).toISOString():null}}let K="wf:msg:",w=new Map,v=new Map,b=null;function be(){let n=r.redis;!n||b||(b=n.createSubscriber(),b?.connect()?.then(()=>{b.psubscribe(`${K}*`,(o,s)=>{try{let i=o.slice(K.length),d=JSON.parse(s);if(d._pid===pe)return;me(i,d)}catch{}})}).catch(o=>{console.error("[messager] redis subscriber init error:",o)}))}let pe=`wf:${process.pid}:${++Se}`;function me(n,o){let s=w.get(n);if(!s)return;let{_pid:i,...d}=o,a=JSON.stringify(d);for(let c of[...s])if(c.readyState===c.OPEN)try{c.send(a)}catch{}}function R(n,o){me(n,o);let s=r.redis;s&&s.publish(`${K}${n}`,JSON.stringify({...o,_pid:pe})).catch(i=>{console.error("[messager] redis publish error:",i)})}function xe(n,o){R(`user:${n}`,o)}function ge(n,o){let s=w.get(n);s||(s=new Set,w.set(n,s)),s.add(o);let i=v.get(o);i||(i=new Set,v.set(o,i)),i.add(n)}function F(n,o){w.get(n)?.delete(o),w.get(n)?.size===0&&w.delete(n),v.get(o)?.delete(n)}function fe(n){let o=v.get(n);if(o)for(let s of[...o])F(s,n);v.delete(n)}function ke(n){let o=new Map;return{async open(s,i){if(n?.verifyToken){let d=i.query.token;if(d){let a=await n.verifyToken(d);a?.sub&&o.set(s,a.sub)}if(!o.has(s)){s.send(JSON.stringify({type:"unauthorized"}));return}}s.send(JSON.stringify({type:"connected"}))},async message(s,i,d){try{let a=JSON.parse(d.toString());if(a.type==="ping")s.send(JSON.stringify({type:"pong"}));else if(a.type==="subscribe"&&a.room){if(n?.verifyToken){let c=o.get(s);if(!c){s.send(JSON.stringify({type:"error",code:"unauthorized",room:a.room}));return}if(n.authorizeRoom&&!await n.authorizeRoom(c,a.room)){s.send(JSON.stringify({type:"error",code:"forbidden",room:a.room}));return}}ge(a.room,s),s.send(JSON.stringify({type:"subscribed",room:a.room}))}else a.type==="unsubscribe"&&a.room&&F(a.room,s)}catch{}},close(s){fe(s),o.delete(s)},error(s){fe(s),o.delete(s)}}}async function ve(){if(b){try{await b.close?.()}catch{}b=null}w.clear(),v.clear()}let he={handler:ke,broadcast:R,sendTo:xe,join:ge,leave:F,close:ve,createConversation:$,listConversations:ae,getConversationForUser:we,isMember:U,sendMessage:ie,listMessages:de,editMessage:ue,deleteMessage:ce,markRead:le};be();let C=(async(n,o,s)=>(o.msg=he,s(n,o)));return C.client=he,C.__meta={injects:["msg"],depends:[]},C.routes=(n,o)=>{let s=o?.prefix??E;async function i(d,a){if(!a.user)throw new f("Unauthorized",401);if(!await U(d,a.user.id))throw new f("Forbidden: not a conversation member",403)}n.post(`${s}/conversations`,async(d,a)=>{if(!a.user)throw new f("Unauthorized",401);let c=await d.json().catch(()=>({}));if(c.type==="direct"&&c.otherUserId){let m=await $(a.user.id,{type:"direct",otherUserId:c.otherUserId});return P(m)}if(c.type==="group"&&Array.isArray(c.memberIds)){let m=await $(a.user.id,{type:"group",memberIds:c.memberIds});return P(m)}return k("conversation input invalid")}),n.get(`${s}/conversations`,async(d,a)=>{if(!a.user)throw new f("Unauthorized",401);return D(await ae(a.user.id))}),n.get(`${s}/conversations/:id/messages`,async(d,a)=>{if(!a.user)throw new f("Unauthorized",401);let c=a.params.id;await i(c,a);let m=new URL(d.url),y=m.searchParams.get("before")??void 0,M=Math.min(100,Math.max(1,Number(m.searchParams.get("limit")??50)||50));return D(await de(c,{before:y,limit:M}))}),n.post(`${s}/conversations/:id/messages`,async(d,a)=>{if(!a.user)throw new f("Unauthorized",401);let c=a.params.id;await i(c,a);let m=await d.json().catch(()=>({}));if(!m.content?.trim())return k("content is required");let y=await ie(c,{senderType:"user",senderId:a.user.id,content:m.content,msgType:m.msgType??"text"});return R(`conv:${c}`,{type:"new_message",message:y}),P(y)}),n.post(`${s}/conversations/:id/read`,async(d,a)=>{if(!a.user)throw new f("Unauthorized",401);let c=a.params.id;return await i(c,a),await le(c,a.user.id),ne()}),n.patch(`${s}/messages/:id`,async(d,a)=>{if(!a.user)throw new f("Unauthorized",401);let c=a.params.id,m=await d.json().catch(()=>({}));if(!m.content?.trim())return k("content is required");let y=await e.query.from(`${re} m`).join(`${_} mem`,{"mem.conversation_id":{col:"m.conversation_id"}}).where({"m.id":{eq:c},"mem.user_id":{eq:String(a.user.id)}}).select("m.conversation_id","m.sender_type","m.sender_id").run();if(!y.length)return k("message not found");let M=y[0];if(M.sender_type==="user"&&M.sender_id!==a.user.id)throw new f("Forbidden: not your message",403);let x=await ue(c,m.content);return x?(R(`conv:${x.conversation_id}`,{type:"message_edited",message:x}),D(x)):k("message not found")}),n.delete(`${s}/messages/:id`,async(d,a)=>{if(!a.user)throw new f("Unauthorized",401);let c=a.params.id,m=await e.query.from(`${re} m`).join(`${_} mem`,{"mem.conversation_id":{col:"m.conversation_id"}}).where({"m.id":{eq:c},"mem.user_id":{eq:String(a.user.id)}}).select("m.conversation_id","m.sender_type","m.sender_id").run();if(!m.length)return k("message not found");let y=m[0];if(y.sender_type==="user"&&y.sender_id!==a.user.id)throw new f("Forbidden: not your message",403);return await ce(c),R(`conv:${y.conversation_id}`,{type:"message_deleted",messageId:c}),ne()})},C}var We={tables:[{name:"_weifuwu_conversations",columns:{id:h.pk(u.uuid()),type:u.string().meta({default:"direct"}),created_by:u.uuid(),direct_key:u.string().nullable().meta({unique:!0}),created_at:u.date().meta({default:"now"})}},{name:"_weifuwu_conversation_members",columns:{conversation_id:h.req(u.uuid()).meta({references:"_weifuwu_conversations",onDelete:"cascade"}),user_id:h.req(u.uuid()),last_read_at:u.date(),joined_at:u.date().meta({default:"now"})},uniques:[["conversation_id","user_id"]]},{name:"_weifuwu_messages",columns:{id:h.pk(u.uuid()),conversation_id:h.req(u.uuid()).meta({references:"_weifuwu_conversations",onDelete:"cascade"}),sender_type:u.string().meta({default:"user"}),sender_id:u.uuid(),content:u.string().meta({notNull:!0}),msg_type:u.string().meta({default:"text"}),created_at:u.date().meta({default:"now"}),edited_at:u.date(),deleted_at:u.date()},indexes:[{cols:["conversation_id",{col:"created_at",desc:!0},{col:"id",desc:!0}],name:"idx_messages_conv"}]}]};export{se as MESSAGER_TABLES,We as WEIFUWU_MESSAGER_SCHEMA,ze as messager};
@@ -0,0 +1,56 @@
1
+ import In from"node:net";import B from"node:crypto";var I=class extends Error{kind;code;cause;constructor(e,n,r){super(n),this.name="DbError",this.kind=e,this.code=r?.code,this.cause=r?.cause}},v=class extends I{constructor(e,n){super("protocol",n??`${e} is not supported by weifuwu/db`,{code:"UNSUPPORTED"}),this.name="ProtocolError"}},O=class extends I{attempts;constructor(e,n=1,r){super("connection",e,{cause:r}),this.name="ConnectionError",this.attempts=n}};var fe=class extends I{operation;ms;constructor(e,n){super("timeout",`${e} timed out after ${n}ms`),this.name="TimeoutError",this.operation=e,this.ms=n}},R=class extends I{constructor(e){super("validation",e),this.name="ValidationError"}};function C(t,e){let n=new Uint8Array(5+e.length);n[0]=t.charCodeAt(0);let r=4+e.length;return n[1]=r>>24&255,n[2]=r>>16&255,n[3]=r>>8&255,n[4]=r&255,n.set(e,5),n}function ze(t){let e=[];e.push(0,3,0,0);for(let[s,o]of Object.entries(t)){for(let i of N(s))e.push(i);e.push(0);for(let i of N(o))e.push(i);e.push(0)}e.push(0);let n=new Uint8Array(4+e.length),r=4+e.length;return n[0]=r>>24&255,n[1]=r>>16&255,n[2]=r>>8&255,n[3]=r&255,n.set(e,4),n}function me(t){return C("Q",pe(N(t),new Uint8Array([0])))}function Ge(t,e,n=[]){let r=pe(N(t),new Uint8Array([0]),N(e),new Uint8Array([0])),s=new Uint8Array(2+n.length*4);return s[0]=n.length>>8&255,s[1]=n.length&255,n.forEach((o,i)=>{let a=2+i*4;s[a]=o>>24&255,s[a+1]=o>>16&255,s[a+2]=o>>8&255,s[a+3]=o&255}),C("P",pe(r,s))}function Se(t,e,n=[]){let r=N(t),s=new Array(e.length),o=1+r.length+1;o+=2+n.length*2,o+=2;for(let u=0;u<e.length;u++){let l=e[u];if(o+=4,l!==null){let c=typeof l=="string"?Nn(l):l.length;s[u]=c,o+=c}}o+=2;let i=new Uint8Array(o),a=0;i[a++]=0,i.set(r,a),a+=r.length,i[a++]=0,i[a]=n.length>>8&255,i[a+1]=n.length&255,a+=2;for(let u of n)i[a]=u>>8&255,i[a+1]=u&255,a+=2;i[a]=e.length>>8&255,i[a+1]=e.length&255,a+=2;for(let u=0;u<e.length;u++){let l=e[u];if(l===null)i[a]=i[a+1]=i[a+2]=i[a+3]=255,a+=4;else{let c=s[u];i[a]=c>>24&255,i[a+1]=c>>16&255,i[a+2]=c>>8&255,i[a+3]=c&255,a+=4,typeof l=="string"?i.set(N(l),a):i.set(l,a),a+=c}}return i[a]=0,i[a+1]=0,C("B",i)}function Nn(t){return Buffer.byteLength(t)}function $e(t="",e=0){let n=new Uint8Array(t.length+1+4);n.set(N(t),0),n[t.length]=0;let r=t.length+1;return n[r]=e>>24&255,n[r+1]=e>>16&255,n[r+2]=e>>8&255,n[r+3]=e&255,C("E",n)}function te(){return C("S",new Uint8Array(0))}function Je(){return C("H",new Uint8Array(0))}function Xe(t,e=""){return C("D",pe(N(t),N(e),new Uint8Array([0])))}function Ye(){return C("X",new Uint8Array(0))}function Ee(t){return C("p",N(t))}var de=class t{buf=new Uint8Array(0);off=0;static MAX_BUFFER=1<<20;push(e){this.append(e);let n=[];for(;;){let r=this.off,s=this.tryRead();if(!s){this.off=r;break}n.push(s)}return n.length>0&&this.compact(),n}append(e){if(e.length===0)return;let n=this.buf.length-this.off;if(n===0){this.buf=e,this.off=0;return}let r=n+e.length;if(r>t.MAX_BUFFER)throw new v(`postgres: \u4E0D\u5B8C\u6574\u6D88\u606F\u8D85\u8FC7\u7F13\u51B2\u4E0A\u9650\uFF08${t.MAX_BUFFER} \u5B57\u8282\uFF09\u2014\u2014DoS \u9632\u5FA1`);if(this.buf.length>=r){this.buf.set(e,n),this.off=0;return}let s=new Uint8Array(Math.max(r,this.buf.length*2));s.set(this.buf.subarray(this.off),0),s.set(e,n),this.buf=s,this.off=0}compact(){this.off===this.buf.length?(this.buf=new Uint8Array(0),this.off=0):this.off>0&&(this.buf=this.buf.subarray(this.off),this.off=0)}tryRead(){if(this.buf.length-this.off<5)return null;let e=(this.buf[this.off+1]<<24|this.buf[this.off+2]<<16|this.buf[this.off+3]<<8|this.buf[this.off+4])>>>0;if(e===0||e>t.MAX_BUFFER||this.buf.length-this.off<1+e)return null;let n=String.fromCharCode(this.buf[this.off]),r=this.buf.subarray(this.off+5,this.off+1+e);return this.off+=1+e,{type:n,payload:r}}};function en(t){return t.type!=="R"||t.payload.length<4?-1:t.payload[0]<<24|t.payload[1]<<16|t.payload[2]<<8|t.payload[3]}function nn(t){let e=t[0]<<8|t[1],n=[],r=2;for(let s=0;s<e;s++){let o=r;for(;t[o]!==0;)o++;let i=Oe.decode(t.subarray(r,o));r=o+1,r+=6;let a=t[r]<<24|t[r+1]<<16|t[r+2]<<8|t[r+3];r+=4;let u=t[r]<<8|t[r+1];r+=2,r+=6,n.push({name:i,typeOid:a,typeLen:u})}return n}function tn(t){let e=t[0]<<8|t[1],n=[],r=2;for(let s=0;s<e;s++){let o=t[r]<<24|t[r+1]<<16|t[r+2]<<8|t[r+3];r+=4,o===-1?n.push(null):(n.push(Oe.decode(t.subarray(r,r+o))),r+=o)}return n}function ve(t){let e={},n=0;for(;n<t.length&&t[n]!==0;){let r=String.fromCharCode(t[n]),s=n+1;for(;s<t.length&&t[s]!==0;)s++;let o=Oe.decode(t.subarray(n+1,s));switch(r){case"S":e.severity=o;break;case"C":e.code=o;break;case"M":e.message=o;break;case"D":e.detail=o;break;case"H":e.hint=o;break;case"P":e.position=o;break}n=s+1}return e}var Oe=new TextDecoder,jn=new TextEncoder;function N(t){return jn.encode(t)}function pe(...t){let e=0;for(let s of t)e+=s.length;let n=new Uint8Array(e),r=0;for(let s of t)n.set(s,r),r+=s.length;return n}function An(t){return t.includes("cached plan must not change result type")||t.includes("cache lookup failed for type")}var z=class t{opts;timeoutSet=!1;awaitingReady=!1;pendingErrorZ=!1;socket=null;stream=new de;status="idle";waiters=[];constructor(e={}){this.opts={host:e.host??"127.0.0.1",port:e.port??5432,user:e.user??"postgres",database:e.database??"postgres",connectTimeoutMs:e.connectTimeoutMs??1e4,statementTimeoutMs:e.statementTimeoutMs??0,password:e.password}}get connected(){return this.status==="ready"}lastUsed=0;connect(){return new Promise((e,n)=>{this.status="connecting";let r=In.connect(this.opts.port,this.opts.host);this.socket=r;let s=setTimeout(()=>{r.destroy(),n(new O(`postgres: connect timeout after ${this.opts.connectTimeoutMs}ms`))},this.opts.connectTimeoutMs);r.once("connect",()=>{r.setNoDelay(!0),r.write(ze({user:this.opts.user,database:this.opts.database}))}),r.on("data",o=>this.onData(o)),r.on("error",o=>{clearTimeout(s),this.status==="connecting"&&n(new O(`postgres: ${o.message}`))}),r.on("close",()=>{if(clearTimeout(s),this.socket=null,this.status!=="closed"){this.status="closed";let o=this.currentQuery;this.currentQuery=null,o&&o.reject(new O("postgres: connection closed"))}}),this.onReady=()=>{clearTimeout(s),this.status="ready",e()},this.onAuthFail=o=>{clearTimeout(s),n(o)}})}onReady=null;onAuthFail=null;expectingAuth=!0;authCtx=null;prepared=new Map;static PREPARED_MAX=128;stmtSeq=0;deallocQueue=[];awaitingDeallocZ=!1;currentQuery=null;pendingRetry=null;onData(e){let n=this.stream.push(new Uint8Array(e));for(let r of n)this.handle(r)}handle(e){if(this.expectingAuth){if(e.type==="R"){let n=en(e);if(n!==0){if(n===3)this.send(Ee(this.opts.password??""));else if(n===5){let r=e.payload.subarray(8,12),s=B.createHash("md5").update(this.opts.password+this.opts.user).digest("hex"),o=B.createHash("md5").update(s+Buffer.from(r).toString("latin1")).digest("hex");this.send(Ee(`md5${o}`))}else if(n===10){let r=B.randomBytes(18).toString("base64url"),s=`n=,r=${r}`;this.authCtx={clientNonce:r,clientFirstBare:s,serverFirst:""};let o=_e("SCRAM-SHA-256\0"),i=_e(`n,,${s}`),a=new Uint8Array(o.length+4+i.length);a.set(o,0),a[o.length]=i.length>>24&255,a[o.length+1]=i.length>>16&255,a[o.length+2]=i.length>>8&255,a[o.length+3]=i.length&255,a.set(i,o.length+4),this.send(rn(a))}else if(n===11){let r=new TextDecoder().decode(e.payload.subarray(4));if(!this.authCtx){this.onAuthFail?.(new O("postgres: unexpected SASL continue"));return}this.authCtx.serverFirst=r;let s=this.scramFinal(this.authCtx);this.send(rn(_e(s)))}else if(n===12){let s=new TextDecoder().decode(e.payload.subarray(4)).match(/v=([A-Za-z0-9+/=]+)/);if(s&&this.authCtx){let o=this.scramServerSignature(this.authCtx);if(s[1]!==o){this.onAuthFail?.(new O("postgres: SCRAM server signature mismatch"));return}}}}return}if(e.type==="E"){let n=ve(e.payload);this.expectingAuth=!1,this.onAuthFail?.(new O(`postgres: auth failed: ${n.message??"unknown"}`)),this.socket?.destroy();return}if(e.type==="Z"){if(this.expectingAuth=!1,this.opts.statementTimeoutMs>0&&!this.timeoutSet){this.timeoutSet=!0,this.awaitingReady=!0,this.socket?.write(me(`SET statement_timeout = ${this.opts.statementTimeoutMs}`));return}this.onReady?.();return}return}switch(e.type){case"T":{if(this.currentQuery){this.currentQuery.columns=nn(e.payload);let n=`${this.currentQuery.sql}|${this.currentQuery.params?.length??0}`,r=this.getPrepared(n);r&&(r.columns=this.currentQuery.columns)}break}case"D":{let n=tn(e.payload);if(this.currentQuery&&this.currentQuery.columns){let r={};this.currentQuery.columns.forEach((s,o)=>{r[s.name]=Mn(s.typeOid,n[o]??null)}),this.currentQuery.rows.push(r)}break}case"C":{let n=this.currentQuery;if(n){let s=new TextDecoder().decode(e.payload).replace(/\0+$/,"").match(/^(?:INSERT|UPDATE|DELETE|MERGE)\s+(?:\d+\s+)?(\d+)$/);s&&(n.affectedRows=parseInt(s[1],10))}break}case"t":{this.currentQuery?.awaitingDescribe&&this.currentQuery.sql!==void 0&&(this.currentQuery.awaitingDescribe=!1,this.currentQuery.prepKey&&this.currentQuery.prepName&&this.setPrepared(this.currentQuery.prepKey,{name:this.currentQuery.prepName,columns:this.currentQuery.columns}),this.send(Se(this.currentQuery.prepName??"",this.currentQuery.params??[])),this.send($e()),this.send(te()));break}case"Z":{if(this.pendingErrorZ){if(this.pendingErrorZ=!1,this.pendingRetry){let r=this.pendingRetry;this.pendingRetry=null,this.issueExtendedQuery(r.sql,r.params??[],r.resolve,r.reject,r.retried)}break}if(this.awaitingDeallocZ){this.awaitingDeallocZ=!1;break}let n=this.currentQuery;if(this.currentQuery=null,n){let r=n.rows;n.affectedRows!==void 0&&Object.defineProperty(r,"affectedRows",{value:n.affectedRows,enumerable:!1,writable:!0,configurable:!0}),n.resolve(r)}this.flushDealloc(),this.awaitingReady&&(this.awaitingReady=!1,this.onReady?.()),this.notifyIdle();break}case"E":{let n=ve(e.payload),r=this.currentQuery;if(this.currentQuery=null,r){this.pendingErrorZ=!0;let s=new Error(n.message??"postgres query error");if(s.code=n.code,r.prepKey&&An(n.message??"")&&(this.prepared.clear(),!r.retried)){this.pendingRetry={sql:r.sql??"",params:r.params,columns:r.columns,resolve:r.resolve,reject:r.reject,retried:!0},r.awaitingDescribe&&this.send(te());break}r.awaitingDescribe&&this.send(te()),r.reject(s)}break}case"N":break;default:break}}scramFinal(e){let n=new Map(e.serverFirst.split(",").map(h=>{let m=h.indexOf("=");return[h.slice(0,m),h.slice(m+1)]})),r=Buffer.from(n.get("s")??"","base64"),s=parseInt(n.get("i")??"4096",10),o=n.get("r")??"",i=this.opts.password??"",a=B.pbkdf2Sync(i,r,s,32,"sha256"),u=he(a,"Client Key"),l=B.createHash("sha256").update(u).digest(),f=`c=biws,r=${o}`,d=`${e.clientFirstBare},${e.serverFirst},${f}`,w=he(l,d),p=Dn(u,w);return`${f},p=${Buffer.from(p).toString("base64")}`}scramServerSignature(e){let n=new Map(e.serverFirst.split(",").map(c=>{let f=c.indexOf("=");return[c.slice(0,f),c.slice(f+1)]})),r=Buffer.from(n.get("s")??"","base64"),s=parseInt(n.get("i")??"4096",10),o=n.get("r")??"",i=B.pbkdf2Sync(this.opts.password??"",r,s,32,"sha256"),a=he(i,"Server Key"),u=`c=biws,r=${o}`,l=`${e.clientFirstBare},${e.serverFirst},${u}`;return Buffer.from(he(a,l)).toString("base64")}getPrepared(e){let n=this.prepared.get(e);return n&&(this.prepared.delete(e),this.prepared.set(e,n)),n}setPrepared(e,n){if(this.prepared.delete(e),this.prepared.set(e,n),this.prepared.size>t.PREPARED_MAX){let r=this.prepared.keys().next().value;if(r!==void 0){let s=this.prepared.get(r);this.prepared.delete(r),s&&this.deallocQueue.push(s.name)}}}flushDealloc(){if(this.deallocQueue.length===0||!this.socket)return;let e=this.deallocQueue.splice(0);this.awaitingDeallocZ=!0,this.socket.write(me(e.map(n=>`DEALLOCATE "${n}"`).join("; ")))}async transaction(e){await this.query("BEGIN");try{let n=await e({query:(r,s)=>this.query(r,s)});return await this.query("COMMIT"),n}catch(n){throw await this.query("ROLLBACK").catch(()=>{}),n}}query(e,n){return new Promise((r,s)=>{if(this.status!=="ready"||!this.socket){s(new O("postgres: not connected"));return}if(this.currentQuery){s(new O("postgres: query already in progress"));return}if(!n||n.length===0)this.currentQuery={columns:[],rows:[],resolve:r,reject:s},process.env.PGDBG2&&console.error("[cquery]",JSON.stringify(e.slice(0,120))),this.socket.write(me(e));else{let o=`${e}|${n.length}`,i=this.getPrepared(o),a=Cn(n);i?(this.currentQuery={columns:[...i.columns],rows:[],resolve:r,reject:s,sql:e,params:a,awaitingDescribe:!1,prepKey:o,prepName:i.name},this.socket.write(Se(i.name,a)),this.socket.write($e()),this.socket.write(te())):this.issueExtendedQuery(e,a,r,s)}})}issueExtendedQuery(e,n,r,s,o){let i=`wf_s${++this.stmtSeq}`;this.currentQuery={columns:[],rows:[],resolve:r,reject:s,sql:e,params:n,awaitingDescribe:!0,prepKey:`${e}|${n.length}`,prepName:i,retried:o},this.socket?.write(Ge(i,e,n.map(()=>0))),this.socket?.write(Xe("S",i)),this.socket?.write(Je())}send(e){this.socket?.write(e)}notifyIdle(){let e=this.waiters;this.waiters=[];for(let n of e)n()}waitIdle(){return this.currentQuery?new Promise(e=>this.waiters.push(e)):Promise.resolve()}async close(){let e=this.socket;this.status==="ready"&&e&&e.write(Ye()),this.status="closed",e&&e.destroy()}};function _e(t){return new TextEncoder().encode(t)}function rn(t){let e=new Uint8Array(5+t.length);e[0]=112;let n=4+t.length;return e[1]=n>>24&255,e[2]=n>>16&255,e[3]=n>>8&255,e[4]=n&255,e.set(t,5),e}function he(t,e){return B.createHmac("sha256",t).update(e).digest()}function Dn(t,e){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t[r]^e[r];return n}function Cn(t){return t.map(e=>e==null?null:typeof e=="object"?Array.isArray(e.__pgArray)?Pn(e.__pgArray):JSON.stringify(e):String(e))}function Pn(t){return`{${t.map(n=>{if(n==null)return"NULL";let r=typeof n=="object"?JSON.stringify(n):String(n);return/^[A-Za-z0-9_+.-]*$/.test(r)?r:'"'+r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}).join(",")}}`}function Mn(t,e){if(e===null)return null;switch(t){case 114:case 3802:return JSON.parse(e);case 20:{let n=BigInt(e);return n>BigInt(Number.MAX_SAFE_INTEGER)||n<BigInt(-Number.MAX_SAFE_INTEGER)?e:Number(n)}case 21:case 23:case 26:return Number(e);case 700:case 701:case 1700:return parseFloat(e);case 16:return e==="t";case 1184:return new Date(e);default:return e}}function Qn(t,e,n){if(e==null){if(t.required)throw new R(`schema: '${n}' is required`);return}switch(t.type){case"text":if(typeof e!="string")throw new R(`schema: '${n}' must be a string, got ${typeof e}`);break;case"int":if(typeof e!="number"||!Number.isInteger(e))throw new R(`schema: '${n}' must be an integer, got ${typeof e}`);break;case"jsonb":if(typeof e!="object"||e===null||Array.isArray(e))throw new R(`schema: '${n}' must be a JSON object`);break;case"enum":if(!t.values?.includes(e))throw new R(`schema: '${n}' must be one of [${t.values?.join(", ")}], got ${String(e)}`);break}}function re(t,e){for(let[n,r]of Object.entries(t))if(r.required&&(e[n]===void 0||e[n]===null))throw new R(`schema: '${n}' is required`);for(let[n,r]of Object.entries(e)){let s=t[n];s&&Qn(s,r,n)}}var ge=class t{all=[];available=[];waiters=[];closed=!1;opts;initPromise=null;schemas=new Map;idleTimer=null;constructor(e={}){this.opts=e}static async create(e={}){let n=new t(e);return await n.ensure(),n}readyPromise=null;ensure(){return this.readyPromise?this.readyPromise:(this.initPromise||(this.initPromise=this.init()),this.initPromise)}async init(){let e=this.opts.poolSize??5,n=await Promise.all(Array.from({length:e},async()=>{let s=new z(this.opts);return await s.connect(),s})),r=Date.now();for(let s of n)s.lastUsed=r;this.all=n,this.available=[...n],this.readyPromise=Promise.resolve(),this.startIdleReaper()}startIdleReaper(){let e=this.opts.idleTimeoutMs??0;e<=0||this.idleTimer||(this.idleTimer=setInterval(()=>this.reapIdle(),e),this.idleTimer.unref?.())}reapIdle(){if(this.closed)return;let e=Date.now(),n=this.opts.idleTimeoutMs??0;for(let r=this.available.length-1;r>=0;r--){let s=this.available[r];if(s.lastUsed>0&&e-s.lastUsed>=n){this.available.splice(r,1);let o=this.all.indexOf(s);o>=0&&this.all.splice(o,1),s.close()}}}get open(){return this.all.length}acquire(){if(this.closed)return Promise.reject(new O("postgres: pool is closed"));if(this.available.length>0)return Promise.resolve(this.available.pop());let e=this.opts.poolSize??5;if(this.all.length<e){let r=new z(this.opts);return r.connect().then(()=>(this.all.push(r),r),()=>{throw setTimeout(()=>this.replenish(),500),new O("postgres: failed to establish connection")})}let n=this.opts.acquireTimeoutMs??3e4;return new Promise((r,s)=>{let o={resolve:r,reject:s};n>0&&(o.timer=setTimeout(()=>{let i=this.waiters.indexOf(o);i>=0&&this.waiters.splice(i,1),s(new fe("postgres: pool acquire",n))},n)),this.waiters.push(o)})}release(e){if(this.closed){e.close();return}if(!e.connected){e.close(),this.replenish();return}e.lastUsed=Date.now(),this.dispatchAvailable(e)}dispatchAvailable(e){let n=this.waiters.shift();n?(n.timer&&clearTimeout(n.timer),n.resolve(e)):this.available.push(e)}replenish(){if(this.closed)return;let e=new z(this.opts);e.connect().then(()=>{if(this.closed){e.close();return}this.all.push(e),this.dispatchAvailable(e)}).catch(()=>{setTimeout(()=>this.replenish(),500)})}async query(e,n){await this.ensure();let r=await this.acquire(),s=performance.now();try{let o=await r.query(e,n);return this.opts.onQuery?.(e,performance.now()-s,o.length),o}finally{this.release(r)}}register(e,n){this.schemas.set(e,n)}async insertMany(e,n,r={}){let s=[];if(n.length===0)return Object.defineProperty(s,"affectedRows",{value:0,enumerable:!1,writable:!0}),s;let o=this.schemas.get(e),i=Object.keys(n[0]).sort(),a=Math.max(1,r.batchSize??500),u=0,l=s;for(let c=0;c<n.length;c+=a){let f=n.slice(c,c+a);for(let m=0;m<f.length;m++){let g=f[m],b=Object.keys(g).sort();if(b.length!==i.length||b.some((k,y)=>k!==i[y]))throw new R(`schema: insertMany requires identical keys across rows (row ${c+m} has [${b}], expected [${i}])`);o&&re(o,g)}let d=f.map((m,g)=>`(${i.map((b,k)=>`$${g*i.length+k+1}`).join(", ")})`).join(", "),w=`INSERT INTO ${e} (${i.join(", ")}) VALUES ${d}`,p=f.flatMap(m=>i.map(g=>m[g])),h=await this.query(w,p);u+=h.affectedRows??f.length,h.length>0&&(l=h)}return Object.defineProperty(l,"affectedRows",{value:u,enumerable:!1,writable:!0}),l}async update(e,n,r,s={}){let o=this.schemas.get(e);o&&re(o,{...n,...r});let i=Object.keys(n);if(i.length===0)throw new R("schema: update requires at least one SET column");let a=Object.keys(r);if(a.length===0)throw new R("schema: update requires a WHERE clause (full-table update via unsafe)");let u=i.map((w,p)=>`${w} = $${p+1}`).join(", "),l=a.map((w,p)=>`${w} = $${i.length+p+1}`).join(" AND "),c=s.returning?.length?` RETURNING ${s.returning.join(", ")}`:"",f=`UPDATE ${e} SET ${u} WHERE ${l}${c}`,d=[...i.map(w=>n[w]),...a.map(w=>r[w])];return this.query(f,d)}async delete(e,n){let r=this.schemas.get(e);r&&re(r,n);let s=Object.keys(n);if(s.length===0)throw new R("schema: delete requires a WHERE clause");let o=`DELETE FROM ${e} WHERE ${s.map((i,a)=>`${i} = $${a+1}`).join(" AND ")}`;return this.query(o,s.map(i=>n[i]))}async insert(e,n){let r=this.schemas.get(e);if(!r)throw new R(`schema: table '${e}' not registered\u2014call register() first`);re(r,n);let s=Object.keys(n);if(s.length===0)throw new R("schema: insert requires at least one column");let o=s.map((a,u)=>`$${u+1}`).join(", "),i=`INSERT INTO ${e} (${s.join(", ")}) VALUES (${o})`;return this.query(i,s.map(a=>n[a]))}tag(e,...n){let{sql:r,params:s}=Ne(e,n);return this.query(r,s)}async begin(e){return await this.ensure(),this.transaction(async n=>e((s,...o)=>{let{sql:i,params:a}=Ne(s,o);return n.query(i,a)}))}frag(e,...n){let{sql:r,params:s}=Ne(e,n);return{__fragment:{sql:r,params:s}}}async unsafe(e,n){await this.ensure();let r=await this.acquire();try{return await r.query(e,n)}finally{this.release(r)}}async transaction(e){await this.ensure();let n=await this.acquire();try{await n.query("BEGIN");try{let r=await e({query:(s,o)=>n.query(s,o)});return await n.query("COMMIT"),r}catch(r){throw await n.query("ROLLBACK").catch(()=>{}),r}}finally{this.release(n)}}async close(){this.closed=!0,this.idleTimer&&(clearInterval(this.idleTimer),this.idleTimer=null),this.readyPromise=null,this.available=[],await Promise.all(this.all.map(n=>n.close())),this.all=[];let e=this.waiters;this.waiters=[];for(let n of e)n.timer&&clearTimeout(n.timer),n.reject(new O("postgres: pool is closed"))}get size(){return this.available.length+this.waiters.length}};function Ne(t,e){let n=t[0],r=[];for(let s=0;s<e.length;s++){let o=e[s]?.__fragment;if(o){let i=o.sql.replace(/\$(\d+)/g,(a,u)=>(r.push(o.params[parseInt(u,10)-1]),`$${r.length}`));n+=i+t[s+1]}else r.push(e[s]),n+=`$${r.length}`+t[s+1]}return{sql:n,params:r}}var A=class extends Error{status;constructor(e,n){super(e),this.name="HttpError",this.status=n}};import{AsyncLocalStorage as ut}from"node:async_hooks";var je=["col","eq","gt","gte","lt","lte","ne","in","notIn","like","ilike","isNull","between"];function Q(t,e){return t.push(e),`$${t.length}`}function M(t,e){let n=[];for(let[r,s]of Object.entries(t)){if(r==="or"){let i=s.map(a=>M(a,e)).filter(a=>a!=="");n.push(i.length?`(${i.join(" OR ")})`:"");continue}if(r==="and"){let i=s.map(a=>M(a,e)).filter(a=>a!=="");n.push(i.length?`(${i.join(" AND ")})`:"");continue}if(typeof s=="object"&&s!==null){let o=s;for(let[l,c]of Object.entries(o))if(c===void 0)throw new I("protocol",`where.${r}.${l} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`,{code:"PROTOCOL"});if(!je.some(l=>o[l]!==void 0)){n.push(`${r} = ${Q(e,s)}`);continue}let a=[],u=l=>{if(typeof l=="object"&&l!==null&&("__interval"in l||"__monthStart"in l)){if("__monthStart"in l)return"DATE_TRUNC('month', NOW())";let[c,f]=l.__interval,d=Math.abs(c);return`NOW() ${c<0?"-":"+"} INTERVAL '${d} ${f}'`}return Q(e,l)};o.col!==void 0&&n.push(`${r} = ${o.col}`),o.eq===null?a.push(["IS","NULL"]):o.eq!==void 0&&a.push(["=",u(o.eq)]),o.gt!==void 0&&a.push([">",u(o.gt)]),o.gte!==void 0&&a.push([">=",u(o.gte)]),o.lt!==void 0&&a.push(["<",u(o.lt)]),o.lte!==void 0&&a.push(["<=",u(o.lte)]),o.ne!==void 0&&a.push(["<>",u(o.ne)]),o.in&&a.push(["IN",`(${o.in.map(l=>u(l)).join(", ")})`]),o.notIn&&a.push(["NOT IN",`(${o.notIn.map(l=>u(l)).join(", ")})`]),o.like!==void 0&&a.push(["LIKE",u(o.like)]),o.ilike!==void 0&&a.push(["ILIKE",u(o.ilike)]),o.between&&a.push(["BETWEEN",`${u(o.between[0])} AND ${u(o.between[1])}`]),o.isNull!==void 0&&a.push(["IS",o.isNull?"NULL":"NOT NULL"]);for(let[l,c]of a)n.push(`${r} ${l} ${c}`);continue}throw new v(`weifuwu/db: WHERE \u5217 ${r} \u503C\u5FC5\u987B\u4E3A\u7B97\u5B50\u5BF9\u8C61\uFF08{ eq: v } / { in: [...] } / { isNull: true }\u2014\u2014\u88F8\u6807\u91CF/\u6570\u7EC4/null \u5F62\u6001\u5DF2\u79FB\u9664\uFF09`)}return n.filter(r=>r!=="").join(" AND ")}function Un(t){return t?.length?` ORDER BY ${t.map(e=>`${e.col} ${e.dir==="desc"?"DESC":"ASC"}`).join(", ")}`:""}function Ln(t,e){let n=`[${t.vec.join(",")}]`;return`${Q(e,n)}::vector`}function Fn(t,e){return t.aggregate?.length?t.aggregate.map(n=>{let r=n.filter?` FILTER (WHERE ${M(n.filter,e)})`:"";return`${n.fn.toUpperCase()}(${n.col==="*"?"*":n.col})${r} AS ${n.as}`}).join(", "):""}function sn(t){let e=[],n=(t.cols&&t.cols.length?t.cols.map(i=>Ie(i)?Ae(i,e):i).join(", "):t.aggregate?.length?"":"*")+(t.vector?`, 1 - (${t.vector.col} <=> ${Ln(t.vector,e)}) as ${t.vector.as}`:""),r=t.aggregate?.length?`${n?", ":""}${Fn(t,e)}`:"",o=`SELECT ${t.distinct?"DISTINCT ":""}${n}${r} FROM ${t.table}${t.alias?` ${t.alias}`:""}`;for(let i of t.joins??[]){let a=Ie(i.on)?Ae(i.on,e):M(i.on,e);o+=` ${i.type==="left"?"LEFT JOIN":"JOIN"} ${i.table}${i.alias?` ${i.alias}`:""} ON ${a||"(1=1)"}`}{let i=t.where?M(t.where,e):"";i&&(o+=` WHERE ${i}`)}for(let i of t.sub??[]){let a=sn(i.query),u=e.length+1,l=a.sql.replace(/\$(\d+)/g,(f,d)=>`$${u+Number(d)-1}`);e.push(...a.params);let c=i.type==="exists"?i.not?"NOT EXISTS":"EXISTS":i.not?"NOT IN":"IN";i.type==="exists"?o+=` AND ${c} (${l})`:o+=` AND ${i.col} ${c} (${l})`}return t.groupBy?.length&&(o+=` GROUP BY ${t.groupBy.join(", ")}`),t.having&&(o+=` HAVING ${M(t.having,e)}`),o+=Un(t.orderBy),t.limit!==void 0&&(o+=` LIMIT ${Q(e,t.limit)}`),t.offset!==void 0&&(o+=` OFFSET ${Q(e,t.offset)}`),{sql:o,params:e}}function Zn(t){let e=[],n=Object.keys(t.rows[0]),r=n.join(", "),s=t.rows.map(i=>`(${n.map(a=>Q(e,i[a])).join(", ")})`),o=`INSERT INTO ${t.table} (${r}) VALUES ${s.join(", ")}`;if(t.onConflict)if(t.onConflict.col){let i=Array.isArray(t.onConflict.col)?t.onConflict.col:[t.onConflict.col];if(o+=` ON CONFLICT (${i.join(", ")})`,t.onConflict.update){let a=new Set(i),u=t.onConflict.merge,l=u?Object.keys(u):n.filter(f=>!a.has(f)),c=l.length?l:i;o+=` DO UPDATE SET ${c.map(f=>u&&f in u?`${f} = ${an(f,u[f],e,t.table)}`:`${f} = EXCLUDED.${f}`).join(", ")}`}else o+=" DO NOTHING"}else o+=" ON CONFLICT DO NOTHING";if(t.returning){let i=t.returning==="*"?"*":t.returning.join(", ");o+=` RETURNING ${i}`}return{sql:o,params:e}}function Bn(t){let e=[];if(!t.where)throw new R("weifuwu/db: UPDATE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u66F4\u65B0\u7528 orm.execute \u663E\u5F0F\uFF09");let n=Object.entries(t.sets).map(([s,o])=>`${s} = ${an(s,o,e,t.table)}`).join(", "),r=`UPDATE ${t.table} SET ${n}`;{let s=M(t.where,e);if(!s)throw new R("weifuwu/db: UPDATE \u6761\u4EF6\u4E3A\u7A7A\uFF08\u7A7A\u5BF9\u8C61/\u7A7A and \u7EC4 = \u5168\u8868\u66F4\u65B0\u2014\u2014\u663E\u5F0F\u62D2\u7EDD\uFF09");r+=` WHERE ${s}`}if(t.returning){let s=t.returning==="*"?"*":t.returning.join(", ");r+=` RETURNING ${s}`}return{sql:r,params:e}}function qn(t){let e=[];if(!t.where)throw new R("weifuwu/db: DELETE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u5220\u9664\u7528 orm.execute \u663E\u5F0F\uFF09");let n=`DELETE FROM ${t.table}`;{let r=M(t.where,e);if(!r)throw new R("weifuwu/db: DELETE \u6761\u4EF6\u4E3A\u7A7A\uFF08\u7A7A\u5BF9\u8C61/\u7A7A and \u7EC4 = \u5168\u8868\u5220\u9664\u2014\u2014\u663E\u5F0F\u62D2\u7EDD\uFF09");n+=` WHERE ${r}`}if(t.returning){let r=t.returning==="*"?"*":t.returning.join(", ");n+=` RETURNING ${r}`}return{sql:n,params:e}}function on(t){switch(t.kind){case"select":return sn(t);case"insert":return Zn(t);case"update":return Bn(t);case"delete":return qn(t);case"ddl":throw new v("memory-sql: DDL \u4E0D\u8D70 Query Language\u2014\u2014\u58F0\u660E\u5F0F migrateModule\uFF08SchemaModule\uFF09\u6216\u8FC1\u79FB\u9762 runMigration(name, sql)")}}function Wn(t,e){if(typeof t!="object"||t===null||typeof e!="object"||e===null)return null;let n=t,r=e,s=je.some(i=>Object.hasOwn(n,i)),o=je.some(i=>Object.hasOwn(r,i));if(!s||!o)return null;for(let i of Object.keys(r))if(Object.hasOwn(n,i))return null;return{...n,...r}}function Vn(t,e,n){if(e==="and"&&Array.isArray(n)){t.and=[...t.and??[],...n];return}if(!(e in t)){t[e]=n;return}let r=Wn(t[e],n);if(r!==null){t[e]=r;return}t.and=[...t.and??[],{[e]:n}]}function we(t,e){let n={...t};for(let[r,s]of Object.entries(e)){if(r==="or"&&n.or!==void 0&&Array.isArray(s)){n.and=[...n.and??[],{or:s}];continue}Vn(n,r,s)}return n}function Ie(t){return typeof t=="object"&&t!==null&&"__raw"in t}function an(t,e,n,r){if(Ie(e))return Ae(e,n);if(typeof e=="object"&&e!==null){if("__jsonbAppend"in e)return`${r}.${t} || ${Q(n,e.__jsonbAppend)}::jsonb`;if("__inc"in e)return`${t} + ${Number(e.__inc)||1}`;if("__now"in e)return"NOW()";if("__interval"in e){let[s,o]=e.__interval,i=Math.abs(s);return`NOW() ${s<0?"-":"+"} INTERVAL '${i} ${o}'`}if("__colRef"in e)return String(e.__colRef)}return Q(n,e)}function Ae(t,e){let n=e.length,r=t.__raw.replace(/\$(\d+)/g,(s,o)=>`$${n+Number(o)}`);return e.push(...t.params),r}function De(t){return t.inner}function G(t){let e=t._typeName();switch(e){case"string":return t._uuid?"UUID":"TEXT";case"number":return t._int?"INT":"DOUBLE PRECISION";case"boolean":return"BOOLEAN";case"datetime":return"TIMESTAMPTZ";case"json":case"object":case"array":return"JSONB";case"vector":return"JSONB";case"enum":return"TEXT";case"optional":case"nullable":case"default":case"effects":case"transform":return G(De(t)??t);default:throw new Error(`schema: \u65E0\u6CD5\u6620\u5C04 zod \u7C7B\u578B ${e}\uFF08\u5217\u578B\u6CE8\u89E3 columnTypes \u53EF\u8986\u76D6\uFF09`)}}function un(t){if(t._typeName()==="enum")return(t.values??[]).map(String);let e=De(t);return e?un(e):void 0}function ln(t){return t===null?"NULL":typeof t=="number"||typeof t=="bigint"?String(t):typeof t=="boolean"?t?"TRUE":"FALSE":typeof t=="string"?`'${t.replace(/'/g,"''")}'`:`'${JSON.stringify(t).replace(/'/g,"''")}'::JSONB`}function Ce(t){let e=[];for(let n of t.extensions??[])e.push({kind:"ddl",op:"createExtension",table:n});for(let n of t.enums??[]){e.push({kind:"ddl",op:"createEnum",table:n.name,enumValues:n.values});for(let r of n.values)e.push({kind:"ddl",op:"alterEnumAddValue",table:n.name,enumValues:[r]})}for(let n of t.tables)e.push(...Xn(n));return e}function cn(t){let e=[];for(let n of t)e.push(...Kn(n));return e.join(`
2
+ `)}function Kn(t){switch(t.op){case"createExtension":return[`CREATE EXTENSION IF NOT EXISTS ${t.table};`];case"createEnum":return[`DO $$ BEGIN
3
+ CREATE TYPE ${t.table} AS ENUM (${(t.enumValues??[]).map(e=>`'${e.replace(/'/g,"''")}'`).join(", ")});
4
+ EXCEPTION WHEN duplicate_object THEN NULL;
5
+ END $$;`];case"alterEnumAddValue":return[(t.enumValues??[]).map(e=>`ALTER TYPE ${t.table} ADD VALUE IF NOT EXISTS '${e.replace(/'/g,"''")}';`).join(`
6
+ `)].filter(Boolean);case"createTable":return[Gn(t)];case"alterAddColumn":return[`ALTER TABLE ${t.table} ADD COLUMN IF NOT EXISTS ${t.column} ${t.columnType}${Hn(t)}${t.columnType&&!zn(t)?" NOT NULL":""};`];case"alter":return(t.dropNotNull??[]).length?[`ALTER TABLE ${t.table} ALTER COLUMN ${(t.dropNotNull??[]).join(", ")} DROP NOT NULL;`]:[];case"createIndex":return[Jn(t)];default:return[]}}function Hn(t){return t.defaultVal===void 0?"":typeof t.defaultVal=="object"&&t.defaultVal!==null&&"__now"in t.defaultVal?" DEFAULT NOW()":` DEFAULT ${ln(t.defaultVal)}`}function zn(t){return t.defaultVal!==void 0||t.nullable===!0}function Gn(t){let e=[],n=[],r=[];for(let s of t.columns??[]){if(s.type==="table-constraint"){s.constraintCols&&s.constraintCols.length>1&&n.push(` UNIQUE (${s.constraintCols.join(", ")})`);continue}let o=[s.name,s.type];s.pk?(o.push("PRIMARY KEY"),s.defaultUuid&&o.push("DEFAULT gen_random_uuid()")):(s.defaultUuid?o.push("DEFAULT gen_random_uuid()"):s.defaultNow?o.push("DEFAULT NOW()"):s.defaultVal!==void 0&&o.push(`DEFAULT ${ln(s.defaultVal)}`),s.nullable||o.push("NOT NULL"),s.unique&&o.push("UNIQUE")),s.ref&&o.push(`REFERENCES ${s.ref.table} (${s.ref.col??"id"})${s.ref.onDelete?` ON DELETE ${s.ref.onDelete}`:""}`),e.push(` ${o.join(" ")}`)}for(let s of t.checks??[])r.push(`CONSTRAINT ${t.table}_${s.col}_check CHECK (${s.col} IN (${s.vals.map(o=>`'${o.replace(/'/g,"''")}'`).join(", ")}))`);return`CREATE TABLE IF NOT EXISTS ${t.table} (
7
+ ${[...e,...n,...r].join(`,
8
+ `)}
9
+ );`}function Jn(t){let e=t.index;if(!e)return"";let n=e.unique?"UNIQUE ":"",r=e.using?` USING ${e.using}`:"",s=e.opclass?` ${e.opclass}`:"",o=e.with?` WITH (${e.with})`:"",i=e.where?" WHERE "+e.where:"";return`CREATE ${n}INDEX IF NOT EXISTS ${e.name} ON ${t.table}${r} (${e.cols}${s})${o}${i};`}function Xn(t){let e=[],n={kind:"ddl",op:"createTable",table:t.name,ifNotExists:!0,columns:[],checks:[]},r=o=>{let i=o._typeName();return i==="nullable"||i==="optional"?!1:i==="default"||i==="effects"||i==="transform"?r(De(o)??o):!0},s=[];for(let[o,i]of Object.entries(t.columns)){let a=i,u=a.metaInfo,l=u.column??o,c=t.columnTypes?.[l]??G(a);s.push({col:l,pgType:c,zt:a,pk:!!u.pk,nullable:!r(a)});let f=t.refs?.[l],d=u.references,w={name:l,type:c,pk:!!u.pk,unique:!!u.unique,defaultNow:u.default==="now",defaultUuid:u.default==="random",defaultVal:u.default!==void 0&&u.default!=="now"&&u.default!=="random"?u.default:void 0,nullable:!r(a)};if(f)w.ref={table:f.table,col:f.col,onDelete:f.onDelete};else if(d){let[h,m]=d.includes(".")?d.split("."):[d,"id"];w.ref={table:h,col:m,onDelete:u.onDelete}}n.columns.push(w);let p=un(a);p&&p.length>1&&n.checks.push({col:l,vals:p})}for(let o of t.uniques??[])n.columns.push({name:o[0],type:"table-constraint",pk:!1,unique:!0,defaultNow:!1,defaultUuid:!1,constraintCols:o});for(let[o,i]of Object.entries(t.checks??{}))n.checks.push({col:o,vals:i});for(let[o]of Object.entries(t.refs??{}))if(!s.some(i=>i.col===o))throw new Error(`schema: ${t.name}.${o} refs \u58F0\u660E\u7684\u5217\u4E0D\u5B58\u5728`);t.dropNotNull&&e.push({kind:"ddl",op:"alter",table:t.name,dropNotNull:t.dropNotNull}),e.push(n);for(let o of s){if(o.pk)continue;let u=Object.entries(t.columns).find(([c,f])=>(f.metaInfo?.column??c)===o.col)?.[1]?.metaInfo?.default,l=u!==void 0&&u!=="now"&&u!=="random";e.push({kind:"ddl",op:"alterAddColumn",table:t.name,column:o.col,columnType:o.pgType,defaultVal:u==="now"?{__now:!0}:l?u:void 0,nullable:o.nullable})}for(let o of t.indexes??[]){let i=o.cols.map(l=>typeof l=="string"?l:`${l.col}${l.desc?" DESC":""}`).join(", "),a=o.name??`idx_${t.name}_${o.cols.map(l=>typeof l=="string"?l:l.col).join("_")}`,u=o.where?o.where.map(l=>l.isNull!==void 0?`${l.col} IS ${l.isNull?"":"NOT "}NULL`:l.eq!==void 0?`${l.col} = '${l.eq.replace(/'/g,"''")}'`:l.ne!==void 0?`${l.col} <> '${l.ne.replace(/'/g,"''")}'`:"").filter(Boolean).join(" AND "):void 0;e.push({kind:"ddl",op:"createIndex",table:t.name,index:{name:a,cols:i,unique:!!o.unique,using:o.using,opclass:o.opclass,with:o.with,where:u}})}return e}function fn(t){let e=t.toLowerCase().replace(/\(\d+(,\d+)?\)/,""),n=[["text",["text","character varying","varchar","character","char","bpchar","citext"]],["uuid",["uuid"]],["int",["int","integer","int4","int2","smallint","serial"]],["int8",["bigint","int8"]],["numeric",["numeric","decimal"]],["float",["double precision","float8","real","float4"]],["bool",["boolean","bool"]],["timestamptz",["timestamp with time zone","timestamp without time zone","timestamp","timestamptz","date"]],["jsonb",["jsonb","json"]]];for(let[r,s]of n)if(s.includes(e))return r;return e}function Pe(t,e){let n=[],r=new Map(e.map(s=>[s.name,s]));for(let s of t){let o=r.get(s.name);if(!o){n.push({level:"error",kind:"table-missing",table:s.name});continue}let i=new Map(o.columns.map(a=>[a.name.toLowerCase(),a]));for(let[a,u]of Object.entries(s.fields)){let l=(s.dbFields[a]?.column??a).toLowerCase(),c=i.get(l);if(!c){n.push({level:"error",kind:"column-missing",table:s.name,column:l});continue}let f;try{f=fn(G(u))}catch{f=void 0}f&&fn(c.type)!==f&&n.push({level:"warn",kind:"type-mismatch",table:s.name,column:l,expected:f,found:c.type})}}for(let s of e){if(s.name.startsWith("_weifuwu"))continue;let o=t.find(a=>a.name===s.name);if(!o){n.push({level:"warn",kind:"table-extra",table:s.name});continue}let i=new Set(Object.entries(o.fields).map(([a])=>(o.dbFields[a]?.column??a).toLowerCase()));for(let a of s.columns)i.has(a.name.toLowerCase())||n.push({level:"warn",kind:"column-extra",table:s.name,column:a.name})}return{ok:n.every(s=>s.level==="warn"),issues:n}}function se(t,e="where"){if(t!=null){if(Array.isArray(t)){for(let n of t)se(n,e);return}if(typeof t=="object")for(let[n,r]of Object.entries(t)){if(r===void 0)throw new R(`weifuwu/db: ${e}.${n} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\uFF08\u65E0\u8BE5\u6761\u4EF6\uFF09\u6216\u663E\u5F0F isNull`);typeof r=="object"&&r!==null&&se(r,`${e}.${n}`)}}}function dn(t){let e=(o,i)=>{let a={kind:"select",table:o,alias:i},u={distinct(){return a.distinct=!0,u},select(...l){return a.cols=l.length===1&&l[0]==="*"?void 0:l,u},join(l,c,f){a.joins??=[];let d=l,w=f?.alias;return!w&&/\s/.test(l)&&([d,w]=l.split(/\s+/)),a.joins.push({table:d,alias:w,type:f?.type??"inner",on:c}),u},where(l){return se(l),a.where=a.where?we(a.where,l):l,u},in(l,c,f=!1){return a.sub??=[],a.sub.push({type:"in",col:l,query:c,not:f}),u},exists(l,c=!1){return a.sub??=[],a.sub.push({type:"exists",query:l,not:c}),u},groupBy(...l){return a.groupBy=l,u},having(l){return a.having=l,u},count(l="*",c="count",f){return a.aggregate??=[],a.aggregate.push({fn:"count",col:l,as:c,filter:f}),u},sum(l,c="sum",f){return a.aggregate??=[],a.aggregate.push({fn:"sum",col:l,as:c,filter:f}),u},avg(l,c="avg",f){return a.aggregate??=[],a.aggregate.push({fn:"avg",col:l,as:c,filter:f}),u},min(l,c="min",f){return a.aggregate??=[],a.aggregate.push({fn:"min",col:l,as:c,filter:f}),u},max(l,c="max",f){return a.aggregate??=[],a.aggregate.push({fn:"max",col:l,as:c,filter:f}),u},orderBy(l,c="asc"){return a.orderBy??=[],a.orderBy.push({col:l,dir:c}),u},vectorScore(l,c,f){return a.vector={col:l,vec:c,as:f},u},limit(l){return a.limit=l,u},offset(l){return a.offset=l,u},async run(){return t(a)},async one(){return(await t(a))[0]},toQuery(){return structuredClone(a)}};return u},n=o=>{let i={kind:"insert",table:o,rows:[]},a={values(u){return i.rows.push(u),a},rows(u){return i.rows.push(...u),a},returning(...u){return i.returning=u.length===1&&u[0]==="*"?"*":u,a},onConflict(u,l=!1,c){return i.onConflict={col:u,update:l,merge:c},a},async run(){return t(i)},toQuery(){return structuredClone(i)}};return a},r=o=>{let i={kind:"update",table:o,sets:{}},a={set(u){return i.sets=u,a},where(u){return se(u),i.where=i.where?we(i.where,u):u,a},returning(...u){return i.returning=u.length===1&&u[0]==="*"?"*":u,a},async run(){if(!i.where)throw new R("weifuwu/db: UPDATE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u66F4\u65B0\u662F\u5371\u9669\u64CD\u4F5C\u2014\u2014\u9010\u6279 where \u6216\u8FC1\u79FB\u9762\u663E\u5F0F\u6267\u884C\uFF09");return t(i)},toQuery(){return structuredClone(i)}};return a},s=o=>{let i={kind:"delete",table:o},a={where(u){return se(u),i.where=i.where?we(i.where,u):u,a},returning(...u){return i.returning=u.length===1&&u[0]==="*"?"*":u,a},async run(){if(!i.where)throw new R("weifuwu/db: DELETE \u5FC5\u987B\u5E26 WHERE\uFF08\u5168\u8868\u6E05\u7A7A\u662F\u5371\u9669\u64CD\u4F5C\u2014\u2014\u8FC1\u79FB\u9762 runMigration \u663E\u5F0F\u6267\u884C\uFF09");return t(i)},toQuery(){return structuredClone(i)}};return a};return{from:(o,i)=>{if(!i&&/\s/.test(o)){let[a,u]=o.split(/\s+/);return e(a,u)}return e(o,i)},insert:o=>n(o),update:o=>r(o),delete:o=>s(o)}}var ye=class extends Error{issues;constructor(e){super(e.map(n=>`${n.path}: ${n.message}`).join("; ")),this.name="ZodError",this.issues=e}},E=class{_meta={};get metaInfo(){return this._meta}meta(e){return this._meta={...this._meta,...e},this}parse(e){let n=this._parse(e);if(!n.ok)throw new ye([{path:n.path??"",message:n.message??"invalid"}]);return n.value}safeParse(e){let n=this._parse(e);return n.ok?{success:!0,data:n.value}:{success:!1,error:new ye([{path:n.path??"",message:n.message??"invalid"}])}}optional(){return new J(this)}nullable(){return new X(this)}default(e){return new Y(this,e)}refine(e,n){return new ae(this,e,n)}transform(e){return new ue(this,e)}},U=class extends E{_typeName(){return"string"}_parse(e){if(typeof e!="string")return{ok:!1,path:"",message:"expected string"};let n=e;return this._min!==void 0&&n.length<this._min?{ok:!1,path:"",message:`too small (min ${this._min})`}:this._max!==void 0&&n.length>this._max?{ok:!1,path:"",message:`too big (max ${this._max})`}:this._pattern&&!this._pattern.test(n)?{ok:!1,path:"",message:"invalid pattern"}:this._email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n)?{ok:!1,path:"",message:"invalid email"}:this._uuid&&!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n)?{ok:!1,path:"",message:"invalid uuid"}:{ok:!0,value:n}}_min;_max;_pattern;_email=!1;_uuid=!1;min(e){return this._min=e,this}max(e){return this._max=e,this}regex(e,n){return this._pattern=e,this}email(){return this._email=!0,this}uuid(){return this._uuid=!0,this}},q=class extends E{_typeName(){return"number"}_parse(e){if(typeof e!="number"||Number.isNaN(e))return{ok:!1,path:"",message:"expected number"};let n=e;return this._int&&!Number.isInteger(n)?{ok:!1,path:"",message:"expected integer"}:this._min!==void 0&&n<this._min?{ok:!1,path:"",message:`too small (min ${this._min})`}:this._max!==void 0&&n>this._max?{ok:!1,path:"",message:`too big (max ${this._max})`}:{ok:!0,value:n}}_int=!1;_min;_max;int(){return this._int=!0,this}min(e){return this._min=e,this}max(e){return this._max=e,this}positive(){return this._min=0,this}},W=class extends E{_typeName(){return"boolean"}_parse(e){return typeof e!="boolean"?{ok:!1,path:"",message:"expected boolean"}:{ok:!0,value:e}}},L=class extends E{lit;constructor(e){super(),this.lit=e}get value(){return this.lit}_typeName(){return"literal"}_parse(e){return e!==this.lit?{ok:!1,path:"",message:`expected literal ${JSON.stringify(this.lit)}`}:{ok:!0,value:e}}},F=class extends E{raw;constructor(e){super(),this.raw=e}get values(){return this.raw}_typeName(){return"enum"}_parse(e){return typeof e!="string"||!this.raw.includes(e)?{ok:!1,path:"",message:`expected one of ${this.raw.join(" | ")}`}:{ok:!0,value:e}}},V=class extends E{_typeName(){return"datetime"}_parse(e){return typeof e!="string"||Number.isNaN(Date.parse(e))?{ok:!1,path:"",message:"expected datetime string (ISO)"}:{ok:!0,value:e}}},oe=class extends E{dims;constructor(e){super(),this.dims=e}_typeName(){return"vector"}_parse(e){return typeof e!="object"||e===null||!Array.isArray(e)||!e.every(n=>typeof n=="number")?{ok:!1,path:"",message:"expected number[] vector"}:this.dims>0&&e.length!==this.dims?{ok:!1,path:"",message:`expected vector(${this.dims})\u2014\u2014got ${e.length} dims`}:{ok:!0,value:e}}},Me=class extends E{_typeName(){return"json"}_parse(e){return{ok:!0,value:e}}},Qe=class t extends E{shape;constructor(e){super(),this.shape=e}_typeName(){return"object"}_parse(e){if(typeof e!="object"||e===null||Array.isArray(e))return{ok:!1,path:"",message:"expected object"};let n={},r=[];for(let[s,o]of Object.entries(this.shape)){let i=o._parse(e[s]);if(!i.ok){r.push({path:s,message:i.message??""});continue}n[s]=i.value}return r.length?{ok:!1,path:r[0].path,message:r[0].message}:{ok:!0,value:n}}pick(e){let n={};for(let r of e)n[r]=this.shape[r];return new t(n)}omit(e){let n={};for(let[r,s]of Object.entries(this.shape))e.includes(r)||(n[r]=s);return new t(n)}extend(e){return new t({...this.shape,...e})}},ie=class extends E{inner;constructor(e){super(),this.inner=e}get itemSchema(){return this.inner}_typeName(){return"array"}_parse(e){if(!Array.isArray(e))return{ok:!1,path:"",message:"expected array"};if(this._min!==void 0&&e.length<this._min)return{ok:!1,path:"",message:`too small (min ${this._min})`};if(this._max!==void 0&&e.length>this._max)return{ok:!1,path:"",message:`too big (max ${this._max})`};let n=[];for(let r=0;r<e.length;r++){let s=this.inner._parse(e[r]);if(!s.ok)return{ok:!1,path:`${r}`,message:s.message};n.push(s.value)}return{ok:!0,value:n}}_min;_max;min(e){return this._min=e,this}max(e){return this._max=e,this}},Ue=class extends E{options;constructor(e){super(),this.options=e}_typeName(){return"union"}_parse(e){let n=null;for(let r of this.options){let s=r._parse(e);if(s.ok)return{ok:!0,value:s.value};n||(n={path:s.path??"",message:s.message??""})}return{ok:!1,path:"",message:`expected union (${n?.message})`}}},Le=class extends E{disc;options;discValueOf;constructor(e,n,r){super(),this.disc=e,this.options=n,this.discValueOf=r}_typeName(){return"disUnion"}_parse(e){if(typeof e!="object"||e===null)return{ok:!1,path:"",message:"expected object"};let n=e[this.disc];for(let r of this.options)if(this.discValueOf(r.shape)===n){let s=r._parse(e);return s.ok?{ok:!0,value:s.value}:{ok:!1,path:`(${String(n)})`,message:s.message??""}}return{ok:!1,path:this.disc,message:`invalid discriminator value ${JSON.stringify(n)}`}}};function Yn(t,e){let n=t[e];if(n instanceof L)return n.lit;if(n instanceof F)return n.values;throw new Error(`z.discriminatedUnion: \u5224\u522B\u5B57\u6BB5\u9700\u4E3A literal/enum\u2014\u2014\u5F97\u5230 ${n?._typeName?.()}`)}var J=class extends E{inner;constructor(e){super(),this.inner=e}_typeName(){return"optional"}_parse(e){return e===void 0?{ok:!0,value:void 0}:this.inner._parse(e)}},X=class extends E{inner;constructor(e){super(),this.inner=e}_typeName(){return"nullable"}_parse(e){return e===null?{ok:!0,value:null}:this.inner._parse(e)}},Y=class extends E{inner;d;constructor(e,n){super(),this.inner=e,this.d=n}_typeName(){return"default"}_parse(e){if(e===void 0){let n=typeof this.d=="function"?this.d():this.d;return this.inner._parse(n)}return this.inner._parse(e)}},ae=class extends E{inner;fn;msg;constructor(e,n,r){super(),this.inner=e,this.fn=n,this.msg=r}_typeName(){return"effects"}_parse(e){let n=this.inner._parse(e);return n.ok?this.fn(n.value)?{ok:!0,value:n.value}:{ok:!1,path:"",message:this.msg??"refine failed"}:{ok:!1,path:n.path??"",message:n.message??""}}},ue=class extends E{inner;fn;constructor(e,n){super(),this.inner=e,this.fn=n}_typeName(){return"transform"}_parse(e){let n=this.inner._parse(e);return n.ok?{ok:!0,value:this.fn(n.value)}:{ok:!1,path:n.path??"",message:n.message??""}}},Fe={string:()=>new U,number:()=>new q,boolean:()=>new W,literal:t=>new L(t),enum:t=>new F(t),date:()=>new V,uuid:()=>new U().uuid(),json:()=>new Me,vector:t=>new oe(t),object:t=>new Qe(t),array:t=>new ie(t),union:t=>new Ue(t),discriminatedUnion:(t,e)=>new Le(t,e,n=>Yn(n,t))};function mn(t){let e={},n;for(let[o,i]of Object.entries(t.fields)){let a=i.metaInfo??{};e[o]={column:a.column??o,...a.pk?{pk:!0}:{},...a.unique?{unique:!0}:{},...a.notNull?{notNull:!0}:{},...a.default!==void 0?{default:a.default}:{},...a.references?{references:a.references}:{},...a.onDelete?{onDelete:a.onDelete}:{}},a.pk&&(n=o)}let r={table:t.table,fields:t.fields,dbFields:e,pkField:n},s=o=>{let i=e[o];return i?.default==="random"||i?.default==="now"};return r.insertSchema=(o={})=>{let i={};for(let[a,u]of Object.entries(t.fields)){if(s(a)||o.omit?.includes(a))continue;let l=u,c=l._typeName?.()==="nullable";i[a]=e[a]?.default!==void 0||c?l.optional():l}return pn(Fe.object(i))},r.toDb=o=>{let i={},a=o;for(let[u,l]of Object.entries(a)){let c=e[u];i[c?.column??u]=l}return i},r.fromDb=o=>{let i={},a=o;for(let[u,l]of Object.entries(e))a[l.column??u]!==void 0&&(i[u]=a[l.column??u]);for(let u of Object.keys(a))!Object.values(e).some(c=>c.column===u)&&!(u in i)&&(i[u]=a[u]);return i},r.updateSchema=(o={})=>{let i={};for(let[a,u]of Object.entries(t.fields))s(a)||o.omit?.includes(a)||(i[a]=u.optional());return pn(Fe.object(i))},r}function pn(t){return t.transform(e=>typeof e!="object"||e===null?e:Object.fromEntries(Object.entries(e).filter(([,n])=>n!==void 0)))}function Ze(t,e){let n={};if(!t)return n;for(let[r,s]of Object.entries(t)){if(r==="and"||r==="or"){let u=(Array.isArray(s)?s:[s]).map(l=>Ze(l,e));n[r]=u;continue}if(s===null||typeof s!="object")continue;let o=e.dbFields[r]?.column??r,i=s;if(i.eq===null&&Object.keys(i).length===1){n[o]={isNull:!0};continue}if(Object.keys(i).some(u=>u==="eq")&&Object.keys(i).length===1&&typeof i.eq!="object"){n[o]={eq:i.eq};continue}let a={};for(let[u,l]of Object.entries(i)){if(l===void 0)throw new R(`filter \u503C\u4E0D\u80FD\u4E3A undefined\uFF08\u5217 ${o} \u7B97\u5B50 ${u}\uFF09\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`);if(l===null){if(u==="eq"){a.isNull=!0;continue}continue}if(!(u==="eq"&&l===null)){if(u==="contains"){a.ilike=`%${String(l).replace(/([%_])/g,"\\$1")}%`;continue}if(u==="startsWith"){a.ilike=`${String(l).replace(/([%_])/g,"\\$1")}%`;continue}if(u==="endsWith"){a.ilike=`%${String(l).replace(/([%_])/g,"\\$1")}`;continue}a[u]=l}}Object.keys(a).length&&(n[o]=a)}return n}function Be(t){let e=t;for(;;)if(e instanceof J||e instanceof X||e instanceof Y||e instanceof ae)e=e.inner;else if(e instanceof ue)e=e.inner;else break;return e}function hn(t){return t instanceof J||t instanceof Y||t instanceof X}function K(t){return t.replace(/[-_](.)/g,(e,n)=>n.toUpperCase()).replace(/^(.)/,e=>e.toUpperCase())}function be(t,e,n,r){let s=Be(t);if(s instanceof U||s instanceof V)return"String";if(s instanceof q)return"Float";if(s instanceof W)return"Boolean";if(s instanceof L)return n.has(e)||(n.add(e),r.push(`enum ${e} { ${JSON.stringify(s.value)} }`)),e;if(s instanceof F)return n.has(e)||(n.add(e),r.push(`enum ${e} { ${s.values.join(" ")} }`)),e;if(s instanceof ie){let o=be(s.itemSchema,`${e}Item`,n,r);return o?`[${o}!]`:null}return s instanceof oe?"[Float!]":null}function gn(t,e={}){let n=e.name??K(t.table),r=new Set,s=[],o=[],i=[],a=[],u=[],l=[],c=new Set(e.hidden??[]),f=p=>c.has(p);for(let[p,h]of Object.entries(t.fields)){if(f(p))continue;let m=hn(h)?"":"!",g=be(h,`${n}${K(p)}Enum`,r,s);g&&o.push(` ${p}: ${g}${m}`);let b=Be(h),k=b instanceof U||b instanceof V?"str":b instanceof q?"num":b instanceof W?"bool":null;if(!k){if(b instanceof F||b instanceof L){let x=be(h,`${n}${K(p)}Enum`,r,s);x&&i.push(`input ${n}${K(p)}Filter {
10
+ eq: ${x}
11
+ ne: ${x}
12
+ in: [${x}!]
13
+ notIn: [${x}!]
14
+ isNull: Boolean
15
+ }`)}continue}let y=["eq","ne","in","notIn","isNull"];k==="str"&&y.push("contains","ilike","startsWith","endsWith"),k==="num"&&y.push("gt","gte","lt","lte");let T=k==="num"?"Float":k==="bool"?"Boolean":"String",S=y.map(x=>` ${x}: ${x==="in"||x==="notIn"?`[${T}!]`:x==="isNull"?"Boolean":T}`).join(`
16
+ `);i.push(`input ${n}${K(p)}Filter {
17
+ ${S}
18
+ }`),a.push(` ${p}`)}for(let[p,h]of Object.entries(t.fields)){if(et(t,p)||f(p))continue;let m=be(h,`${n}${K(p)}Enum`,r,s);if(!m)continue;let g=p===e.tenant?.field||hn(h)||t.dbFields[p]?.default!==void 0;u.push(` ${p}: ${m}${g?"":"!"}`),l.push(` ${p}: ${m}`)}let d=Object.keys(t.fields).filter(p=>{if(f(p))return!1;let h=Be(t.fields[p]);return h instanceof U||h instanceof V||h instanceof q||h instanceof W||h instanceof F||h instanceof L});return{typeDefs:[`type ${n} {
19
+ ${o.join(`
20
+ `)}
21
+ }`,...s,...i,`input ${n}Filter {
22
+ ${d.map(p=>` ${p}: ${n}${K(p)}Filter`).join(`
23
+ `)}
24
+ and: [${n}Filter!]
25
+ or: [${n}Filter!]
26
+ }`,`enum ${n}SortField {
27
+ ${a.join(`
28
+ `)}
29
+ }`,"enum SortDir { asc desc }",`input ${n}SortInput { field: ${n}SortField! dir: SortDir }`,`input ${n}InsertInput {
30
+ ${u.join(`
31
+ `)}
32
+ }`,`input ${n}PatchInput {
33
+ ${l.join(`
34
+ `)}
35
+ }`,`type ${n}Page {
36
+ rows: [${n}!]!
37
+ total: Int!
38
+ }`,`type Query {
39
+ ${_(n)}List(filter: ${n}Filter, sort: [${n}SortInput!], limit: Int, offset: Int): [${n}!]!
40
+ ${_(n)}ListPage(filter: ${n}Filter, sort: [${n}SortInput!], limit: Int, offset: Int): ${n}Page!
41
+ ${_(n)}One(filter: ${n}Filter): ${n}
42
+ }`,`type Mutation {
43
+ ${_(n)}Insert(data: ${n}InsertInput!): ${n}!
44
+ ${_(n)}Update(id: ID!, patch: ${n}PatchInput!): ${n}
45
+ ${_(n)}Delete(id: ID!): ${n}
46
+ }`].join(`
47
+
48
+ `),resolvers:nt(t,n,e)}}function et(t,e){let n=t.dbFields[e];return n?.default==="random"||n?.default==="now"}function _(t){return t.replace(/^(.)/,e=>e.toLowerCase())}function nt(t,e,n){let r=t.table,s=t.pkField??"id",o=new Set(n.hidden??[]),a=Object.keys(t.fields).filter(p=>!o.has(p)).map(p=>t.dbFields[p]?.column??p),u=p=>{let h=t.fromDb(p);for(let m of o)delete h[m];return h},l=n.sql??(p=>p.orm),c=n.tenant?t.dbFields[n.tenant.field]?.column??n.tenant.field:void 0;function f(p){return l(p).query}function d(p,h){let m=Ze(p,t);if(c&&h){let g=n.tenant.value(h);g!==void 0&&m[c]===void 0&&(m[c]={eq:g})}return m}async function w(p,h){let m=f(h).from(r).select(...a),g=d(p.filter,h);Object.keys(g).length&&m.where(g);let b=p.sort;if(b?.length)for(let y of b)m.orderBy(t.dbFields[y.field]?.column??y.field,y.dir==="desc"?"desc":"asc");return p.limit!==void 0&&p.limit!==null&&m.limit(Math.min(Number(p.limit),n.maxLimit??100)),p.offset!==void 0&&p.offset!==null&&m.offset(Number(p.offset)),(await m.run()).map(y=>u(y))}return{Query:{[`${_(e)}List`]:async(p,h,m)=>await w(h,m),[`${_(e)}ListPage`]:async(p,h,m)=>{let g=await w(h,m),b=d(h.filter,m),k=await f(m).from(r).count("*","__total").where(b).run(),y=Number(k[0]?.__total??g.length);return{rows:g,total:Number.isFinite(y)?y:g.length}},[`${_(e)}One`]:async(p,h,m)=>{let g=await f(m).from(r).select(...a).where(d(h.filter,m)).limit(1).run();return g[0]?u(g[0]):null}},Mutation:{[`${_(e)}Insert`]:async(p,h,m)=>{let g={...h.data};if(n.tenant){let T=n.tenant.value(m);T!==void 0&&g[n.tenant.field]===void 0&&(g[n.tenant.field]=T)}let b=t.insertSchema().parse(g),k=t.toDb(b),y=await f(m).insert(r).values(k).returning(...a).run();return y[0]?u(y[0]):null},[`${_(e)}Update`]:async(p,h,m)=>{let g=t.updateSchema().parse(h.patch),b=t.toDb(g),k=d({[s]:{eq:h.id}},m),y=await f(m).update(r).set(b).where(k).returning(...a).run();return y[0]?u(y[0]):null},[`${_(e)}Delete`]:async(p,h,m)=>{let g=d({[s]:{eq:h.id}},m),b=await f(m).from(r).select(...a).where(g).run();return b.length?(await f(m).delete(r).where(g).run(),u(b[0])):null}}}}function H(t,e){let n=t instanceof Error?t.message:String(t),r;if(t instanceof A)return Response.json({error:n},{status:e??t.status});if(t instanceof I){let s=e??(t.code==="23505"?409:400);return r=t.code==="23505"?"conflict":t.kind,Response.json({error:n,code:r},{status:s})}return Response.json({error:n},{status:e??400})}function tt(t){let e=t;for(;;){let n=e.inner;if(n&&typeof e._typeName=="string"&&["optional","nullable","default","effects","transform"].includes(e._typeName))e=n;else break}return e}function rt(t,e){let r=tt(t.fields[e]).values;return Array.isArray(r)?r.map(String):void 0}function wn(t,e,n={}){let r=n.maxLimit??100,s=n.defaultLimit??20,i=e.__shape??e,a=t.searchParams,u=Object.keys(i.fields),l=new Set(u),c={};for(let[h,m]of a.entries()){if(h==="sort"||h==="limit"||h==="offset")continue;let g=rt(i,h);if(g&&!g.includes(m))throw new Error(`invalid enum value for ${h}: ${m}\uFF08\u5141\u8BB8\uFF1A${g.join(" | ")}\uFF09`);c[h]={eq:m}}let f=[],d=a.get("sort");if(d)for(let h of d.split(",")){let m=h.startsWith("-")?"desc":"asc",g=m==="desc"?h.slice(1):h;if(!l.has(g))throw new Error(`invalid sort field: ${g}`);f.push({field:g,dir:m})}let w=Math.min(r,Math.max(1,parseInt(a.get("limit")??String(s),10)||s)),p=Math.max(0,parseInt(a.get("offset")??"0",10)||0);return{filter:c,sort:f,limit:w,offset:p}}function yn(t,e={}){let n=e.name??t.table,r=new Set(e.hidden??[]),s=e.maxLimit??100,o=Object.keys(t.fields).filter(d=>!r.has(d)),i=o.map(d=>t.dbFields[d]?.column??d),a=new Set(o),u=t.pkField??"id",l=d=>{let w=t.fromDb(d);for(let p of r)delete w[p];return w},c=d=>{let w=d.orm;return typeof w.ctxTable=="function"?w.ctxTable(n):w.table(n)},f=async d=>{let w=await d.json().catch(()=>null);if(!w||typeof w!="object")throw new Error("invalid JSON body");return w};return{mount:(d,w)=>{d.get(w,async(p,h)=>{try{let m=e.hooks;await m?.beforeList?.(p,h);let g=new URL(p.url),b=c(h),{filter:k,sort:y,limit:T,offset:S}=wn(g,t,{maxLimit:s,defaultLimit:20}),$=await b.paginate({filter:k,sort:y,limit:T,offset:S}),Z=$.rows.map(l);return m?.afterList&&(Z=await m.afterList(Z,p,h)),Response.json({[n]:Z,total:$.total})}catch(m){return H(m)}}),d.get(`${w}/:id`,async(p,h)=>{try{let m=h.params.id,b=await c(h).select(...i).where({[u]:{eq:m}}).limit(1).run();return b.length?Response.json(l(b[0])):Response.json({error:"not found"},{status:404})}catch(m){return H(m)}}),d.post(w,async(p,h)=>{try{await e.hooks?.beforeInsert?.(await f(p).catch(()=>({})),p,h);let m=await f(p),b=await c(h).insert(m).returning(...i).run();return Response.json(l(b[0]??{}),{status:201})}catch(m){return H(m)}}),d.patch(`${w}/:id`,async(p,h)=>{try{let m=h.params.id;await e.hooks?.beforeUpdate?.(m,await f(p).catch(()=>({})),p,h);let g=await f(p),k=await c(h).update(g).where({[u]:{eq:m}}).returning(...i).run();return k.length?Response.json(l(k[0])):Response.json({error:"not found"},{status:404})}catch(m){return H(m)}}),d.delete(`${w}/:id`,async(p,h)=>{try{let m=h.params.id;await e.hooks?.beforeDelete?.(m,p,h);let g=c(h);return(await g.select(...i).where({[u]:{eq:m}}).limit(1).run()).length?(await g.delete().where({[u]:{eq:m}}).run(),new Response(null,{status:204})):Response.json({error:"not found"},{status:404})}catch(m){return H(m)}})}}}function ke(t,e){return bn(t,e,new Map)}function bn(t,e,n){let r=dn(async u=>await t.executeQuery(u));function s(u,l){let c=n.get(u);if(c)return c.t;if(l===void 0)throw new R(`weifuwu/db: \u8868 ${u} \u672A\u6CE8\u518C\uFF08tx/ctx \u6D3E\u751F\u7528 orm.table(name, shapeDef) \u5148\u884C\u6CE8\u518C\uFF09`);let f=Object.keys(l),d=mn({table:u,fields:l}),w=f.map(y=>d.dbFields[y]?.column??y),p=y=>d.fromDb(y),h=new Set(["distinct","select","join","where","in","exists","groupBy","having","count","sum","avg","min","max","orderBy","limit","offset","values","rows","returning","onConflict","set"]),m=y=>y==="*"?"*":typeof y=="string"?d.dbFields[y]?.column??y:y,g=y=>{let T={run:()=>y.run().then(S=>S.map(x=>p(x))),one:async()=>(await T.run())[0]};for(let S of h){if(S==="returning")continue;let x=y[S];typeof x=="function"&&(T[S]=(...$)=>(x.apply(y,$),T))}return T.returning=(...S)=>(y.returning(...S.map(x=>m(x))),T),T},b={};for(let y of f)b[y]={ref:d.dbFields[y]?.column??y,__out:void 0};let k={c:b,select:(...y)=>g(r.from(u).select(...y.length?y.map(T=>m(T)):["*"])),insert:y=>{let T=d.insertSchema(),S=Array.isArray(y)?y:[y],x=r.insert(u);for(let $ of S)x=x.values(d.toDb(T.parse($)));return g(x.returning(...w))},update:y=>{let T=Object.entries(y).filter(([,$])=>typeof $=="object"&&$!==null&&["__jsonbAppend","__inc","__now","__interval","__colRef","__monthStart"].some(Z=>Z in $)).map(([$])=>$),S=Object.fromEntries(Object.entries(y).filter(([$])=>!T.includes($))),x={...d.updateSchema().parse(S),...Object.fromEntries(T.map($=>[$,y[$]]))};return g(r.update(u).set(d.toDb(x)).returning(...w))},delete:()=>g(r.delete(u).returning(...w)),exists:async y=>(await r.from(u).select("1").where(y).limit(1).run()).length>0,paginate:async y=>{let T=Math.max(1,Math.min(y.limit??50,100)),S=Math.max(0,y.offset??0),x=r.from(u);y.filter&&x.where(y.filter);let[$]=await x.count("*","total").run(),Z=Number($.total??0),ce=r.from(u);y.filter&&ce.where(y.filter);for(let He of y.sort??[])ce.orderBy(He.field,He.dir==="desc"?"desc":"asc");return ce.limit(T).offset(S),{rows:await g(ce).run(),total:Z}},shapeDef:l,__shape:d,__shapeDbFields:d.dbFields};return n.set(u,{t:k}),k}let o=u=>{let l=()=>e?.value(u),c=(f,d)=>{let w=s(f,d),p=w.__shape,h=e&&p.dbFields[e.field]?p.dbFields[e.field].column??e.field:null,m=()=>{let g=l();return g!==void 0&&h?{[h]:{eq:g}}:null};return{...w,select:(...g)=>{let b=w.select(...g),k=m();return k&&b.where(k),b},insert:g=>{let b=Array.isArray(g)?g:[g],k=l(),y=b.map(T=>m()&&T[e.field]===void 0?{...T,[e.field]:k}:T);return w.insert(Array.isArray(g)?y:y[0])},update:g=>{let b=w.update(g),k=m();return k&&b.where(k),b},delete:()=>{let g=w.delete(),b=m();return b&&g.where(b),g},paginate:async g=>{let b=m();return w.paginate({...g,filter:b?{and:[g.filter??{},b]}:g.filter})}}};return{...i(),ctxTable:c}},i=()=>a,a={table:s,query:r,gql:(u,l)=>{if(!u.__shape)throw new Error("orm.gql: \u8868\u672A\u6CE8\u518C\uFF08orm.table \u5148\u884C\uFF09");let c=l,f={...c,...c?.tenant===void 0&&e?{tenant:{field:e.field,value:e.value}}:{},sql:()=>a};return gn(u.__shape,f)},rest:(u,l)=>{if(!u.__shape)throw new Error("orm.rest: \u8868\u672A\u6CE8\u518C\uFF08orm.table \u5148\u884C\uFF09");return yn(u.__shape,l)},withCtx:o,execute:u=>t.executeQuery(u),tables:()=>{let u=[];for(let[l,c]of n)u.push({name:l,fields:c.t.shapeDef,dbFields:c.t.__shapeDbFields});return u},transaction:u=>t.transaction?t.transaction(async l=>u(bn({executeQuery:f=>l(f)},e,n))):u(a)};return a}function kn(t,e){return{executeQuery:async n=>{let{sql:r,params:s}=e(n);return t.query(r,s)},transaction:n=>{let r=t;if(!r.transaction)throw new R("weifuwu/db: \u5F53\u524D adapter \u65E0\u4E8B\u52A1\u80FD\u529B");return r.transaction(async s=>n(o=>{let{sql:i,params:a}=e(o);return s.query(i,a)}))}}}function qe(t){let e=new Map;return{executeQuery:n=>Promise.resolve(t.executeQuery(n)),transaction:n=>{if(!t.snapshot||!t.restore)return n(s=>Promise.resolve(t.executeQuery(s)));let r=t.snapshot();return n(s=>Promise.resolve(t.executeQuery(s))).catch(s=>{throw t.restore(r),s})}}}import{randomUUID as st}from"node:crypto";var xe=class{opts;constructor(e){this.opts=e}tables=new Map;enums=new Map;async close(){}executeQuery(e){let n;switch(e.kind){case"select":n=this.execSelect(e);break;case"insert":n=this.execInsert(e);break;case"update":n=this.execUpdate(e);break;case"delete":n=this.execDelete(e);break;case"ddl":return this.executeDdl(e)}return this.jsonDecodeRows(e.table,n)}jsonDecodeRows(e,n){if(!e||!this.tables.has(e))return n;let r=this.tables.get(e),s=r.columnTypes,o=new Set(Object.entries(s).filter(([,a])=>/^(jsonb?|vector(?:\\(\d+\\))?)$/i.test(a)).map(([a])=>a)),i=a=>{if(typeof a!="string")return!1;try{let u=JSON.parse(a);return typeof u=="object"&&u!==null}catch{return!1}};for(let a of n)if(!(typeof a!="object"||a===null))for(let u of Object.keys(a)){let l=u.includes(".")?u.slice(u.lastIndexOf(".")+1):u;if((r.state==="declared"?o.has(l):i(a[u]))&&typeof a[u]=="string")try{a[u]=JSON.parse(a[u])}catch{}}return n}tableCols(e){let n=this.table(e),r=new Set(n.columns);for(let s of n.rows)for(let o of Object.keys(s))r.add(ne(o));return r}assertKnownCols(e,n,r){if(this.opts?.validateCols===!1||r)return;let s=[{alias:n.alias??n.table,cols:this.tableCols(n.table)}];for(let a of n.joins??[])s.push({alias:a.alias??a.table,cols:this.tableCols(a.table)});let o=new Set((n.aggregate??[]).map(a=>a.as)),i=[];n.where&&i.push(...Ve(n.where));for(let a of n.joins??[])le(a.on)||i.push(...Ve(a.on));for(let a of n.cols??[])typeof a=="string"&&i.push(a);for(let a of n.orderBy??[])o.has(a.col)||i.push(a.col);if(n.groupBy)for(let a of n.groupBy)o.has(a)||i.push(a);i.length&&it(e,i,s,n.table,o)}execSelect(e,n){if(e.table&&(this.assertTableExists("SELECT",e.table),this.assertKnownCols("SELECT",e,n)),e.count){let l=this.table(e.table),c=e.where?l.rows.filter(d=>P(d,e.where,e.alias)).length:l.rows.length,f=e.cols?.[0]??"count";return ee([{[f]:c}],1)}let r=this.table(e.table).rows,s=e.alias??e.table;for(let l of e.joins??[]){let c=this.table(l.table).rows,f=l.alias??l.table,d=l.type==="left",w=[];for(let p of r){let h=!1;for(let m of c){let g={};for(let[b,k]of Object.entries(p))g[b.includes(".")?b:`${s}.${b}`]=k;for(let[b,k]of Object.entries(m))g[`${f}.${b}`]=k;if(le(l.on))throw new v("raw JOIN","memory-sql: raw JOIN ON \u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");P(g,l.on,void 0)&&(w.push(g),h=!0)}if(!h&&d){let m={};for(let[g,b]of Object.entries(p))m[g.includes(".")?g:`${s}.${g}`]=b;w.push(m)}}r=w,s=f}let o=l=>{if(!n)return l;let c={};for(let[f,d]of Object.entries(l))c[`${e.alias??e.table}.${f}`]=d;for(let[f,d]of Object.entries(n.row))c[`${n.alias}.${f}`]=d;return c},i=e.where;Ke(i);let a=i?r.filter(l=>P(o(l),i,e.alias)):r;for(let l of e.sub??[])a=a.filter(c=>{let f=this.execSelect(l.query,{row:c,alias:s});if(l.type==="exists")return l.not?f.length===0:f.length>0;let d=new Set(f.map(p=>p[String(l.query.cols?.[0]??Object.keys(p)[0])])),w=j(c,l.col,s);return l.not?!d.has(w):d.has(w)});let u;if(e.aggregate?.length){let l=new Map;for(let c of a){let f=(e.groupBy??[]).map(d=>JSON.stringify(j(c,d,s))).join("|");l.has(f)||l.set(f,[]),l.get(f).push(c)}if(!l.size&&!e.groupBy?.length&&l.set("",[]),u=[...l.values()].map(c=>{let f={};for(let d of e.groupBy??[])f[d]=j(c[0],d,s);for(let d of e.aggregate){let w=d.col==="*"?void 0:j(c[0],d.col,s),p=d.filter?c.filter(m=>P(m,d.filter,void 0)):c,h=d.col==="*"?p:p.map(m=>j(m,d.col,s));d.fn==="count"?f[d.as]=h.length:h.length?d.fn==="sum"?f[d.as]=h.reduce((m,g)=>m+Number(g??0),0):d.fn==="avg"?f[d.as]=h.length?h.reduce((m,g)=>m+Number(g??0),0)/h.length:0:d.fn==="min"?f[d.as]=h.reduce((m,g)=>g!==null&&(m===null||g<m)?g:m,null):d.fn==="max"&&(f[d.as]=h.reduce((m,g)=>g!==null&&(m===null||g>m)?g:m,null)):f[d.as]=null}return f}),e.having){let c=new Map;for(let d of e.aggregate??[])c.set(`${d.fn}(${d.col==="*"?"*":d.col})`,d.as);let f={};for(let[d,w]of Object.entries(e.having))f[c.get(d)??d]=w;u=u.filter(d=>P(d,f,void 0))}}else if(e.cols?.length){let l=new Set(this.table(e.table).columns);for(let c of e.joins??[])for(let f of this.table(c.table).columns)l.add(f);u=a.map(c=>{let f={};for(let d of e.cols){if(le(d))throw new v("raw \u6295\u5F71","memory-sql: raw \u6295\u5F71\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");let w=/^(.+?)\s+AS\s+([\w.]+)$/i.exec(d);if(w)f[w[2]]=j(c,w[1].trim());else{let p=ne(d),h=j(c,d);f[p]=h===void 0&&l.has(p)?null:h}}return e.vector&&(f[e.vector.as]=xn(Tn(j(c,e.vector.col,s)),e.vector.vec)),f})}else u=a.map(l=>{let c={},f=e.joins?.length?l:at(l);for(let[d,w]of Object.entries(f))c[ne(d)]=w;return c});if(e.distinct){let l=new Set;u=u.filter(c=>{let f=JSON.stringify(c);return l.has(f)?!1:(l.add(f),!0)})}if(e.vector&&(u=u.map(l=>({r:l,sim:xn(Tn(j(l,e.vector.col,s)),e.vector.vec)})).sort((l,c)=>c.sim-l.sim).map(l=>l.r)),e.orderBy?.length){let l=e.orderBy;u=u.map((c,f)=>({r:c,idx:f})).sort((c,f)=>{for(let d of l){let w=c.r[ne(d.col)],p=f.r[ne(d.col)];if(w===p)continue;let h=typeof w=="number"&&typeof p=="number"?w>p?1:-1:String(w)>String(p)?1:-1;return d.dir==="desc"?-h:h}return f.idx-c.idx}).map(c=>c.r)}return e.offset!==void 0&&(u=u.slice(e.offset)),e.limit!==void 0&&(u=u.slice(0,e.limit)),ee(u,u.length)}execInsert(e){let n=this.obtain(e.table),r=[],s=0,o=e.rows.map(i=>({...i}));for(let i of o){let a=Object.keys(i);n.pk&&!(n.pk.col in i)&&(i[n.pk.col]=n.pk.defaultUuid?st():`mem-${n.nextId}`);for(let l of n.defaultNow)l in i||(i[l]=new Date().toISOString());for(let[l,c]of n.defaultVals)l in i||(i[l]=c);for(let l of Object.keys(i))i[l]=We(l,void 0,i[l],i);let u;for(let l of n.uniques)if(l in i&&i[l]!=null){let c=n.rows.find(f=>D(f[l],i[l]));if(c){u={u:l,row:c};break}}if(!u){for(let l of n.groups)if(l.every(c=>c in i&&i[c]!=null)){let c=n.rows.find(f=>l.every(d=>D(f[d],i[d])));if(c){u={u:l.join(","),row:c};break}}}if(u){if(!e.onConflict)throw new A(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${u.u}"`,409);if(e.onConflict.update){if(e.onConflict.merge)for(let[l,c]of Object.entries(e.onConflict.merge))u.row[l]=We(l,u.row[l],c,u.row);else{let l=Array.isArray(e.onConflict.col)?new Set(e.onConflict.col):e.onConflict.col?new Set([e.onConflict.col]):null;for(let c of a)l?.has(c)||(u.row[c]=i[c])}s++,e.returning&&r.push(e.returning==="*"?{...u.row}:Re(u.row,e.returning))}continue}n.rows.push(i),n.nextId++,s++,e.returning&&r.push(e.returning==="*"?{...i}:Re(i,e.returning))}return ee(r,s)}execUpdate(e){let n=this.table(e.table),r=[],s=[];for(let i of n.rows)if(!e.where||P(i,e.where,void 0)){let a={...i};for(let[u,l]of Object.entries(e.sets))if(ot(l))a[u]=We(u,a[u],l,a);else if(le(l))if(/^now\(\)$/i.test(l.__raw.trim()))a[u]=new Date().toISOString();else throw new v("raw SET","memory-sql: raw SET \u503C\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09");else a[u]=l;s.push({row:i,next:a})}let o=new Map(s.map(i=>[i.row,i.next]));for(let{row:i,next:a}of s){for(let u of n.uniques){if(!(u in a)||a[u]==null)continue;if(n.rows.some(c=>c!==i&&D((o.get(c)??c)[u],a[u])))throw new A(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${u}"`,409)}for(let u of n.groups){if(!u.every(c=>c in a&&a[c]!=null))continue;if(n.rows.some(c=>c!==i&&u.every(f=>D((o.get(c)??c)[f],a[f]))))throw new A(`\u6570\u636E\u5E93\u9519\u8BEF: duplicate key value violates unique constraint "${u.join(", ")}"`,409)}}for(let{row:i,next:a}of s){for(let[u,l]of Object.entries(a))i[u]=l;e.returning&&r.push(e.returning==="*"?{...i}:Re(i,e.returning))}return ee(r,s.length)}execDelete(e){Ke(e.where);let n=this.table(e.table),r=n.rows.length,s=[],o=[];for(let i of n.rows)!e.where||P(i,e.where,void 0)?e.returning&&o.push(e.returning==="*"?{...i}:Re(i,e.returning)):s.push(i);return n.rows=s,ee(o,r-s.length)}assertTableExists(e,n){if(n&&!this.tables.has(n))throw new v("relation",`memory-sql: ${e} \u8868 '${n}' \u4E0D\u5B58\u5728\uFF08relation does not exist\u2014\u2014\u5BF9\u9F50\u771F\u5E93 42P01\uFF09`)}table(e){let n=this.tables.get(e);if(!n)throw new v("relation",`memory-sql: \u8868 '${e}' \u4E0D\u5B58\u5728\uFF08relation does not exist\u2014\u2014\u5BF9\u9F50\u771F\u5E93 42P01\uFF09`);return n}obtain(e){let n=this.tables.get(e);return n||(n={state:"observed",rows:[],nextId:1,uniques:new Set,groups:[],defaultNow:new Set,defaultVals:new Map,columns:[],columnTypes:{}},this.tables.set(e,n)),n}toDeclared(e){let n=this.obtain(e);return n.state="declared",n}hasTable(e){return this.tables.has(e)}inspectTable(e){let n=this.tables.get(e);if(!n)throw new v("relation",`memory-sql: \u8868 '${e}' \u4E0D\u5B58\u5728\uFF0842P01\uFF09`);return{state:n.state,columns:[...n.columns],columnTypes:{...n.columnTypes},constraints:{pk:n.pk?{...n.pk}:void 0,uniques:[...n.uniques],groups:n.groups.map(r=>[...r]),defaultNow:[...n.defaultNow],defaultVals:{...n.defaultVals}}}}schemaSnapshot(){let e=[];for(let[n,r]of this.tables)e.push({name:n,columns:r.columns.map(s=>({name:s,type:(r.columnTypes[s]??"TEXT").toLowerCase()}))});return e}getColumnType(e,n){return this.tables.get(e)?.columnTypes[n]}getColumnTypes(e){return this.tables.get(e)?.columns.map(n=>this.tables.get(e).columnTypes[n]??"text")??[]}snapshot(){let e=new Map;for(let[n,r]of this.tables)e.set(n,{rows:r.rows.map(s=>({...s})),nextId:r.nextId,columns:[...r.columns],columnTypes:{...r.columnTypes},pk:r.pk?{...r.pk}:void 0,uniques:[...r.uniques],groups:r.groups.map(s=>[...s]),state:r.state,defaultNow:[...r.defaultNow],defaultVals:Object.fromEntries(r.defaultVals)});return e}restore(e){let n=new Set;for(let[r,s]of e)this.tables.set(r,{state:s.state,rows:s.rows.map(o=>({...o})),nextId:s.nextId,columns:[...s.columns],columnTypes:{...s.columnTypes},pk:s.pk?{...s.pk}:void 0,uniques:new Set(s.uniques),groups:(s.groups??[]).map(o=>[...o]),defaultNow:new Set(s.defaultNow),defaultVals:new Map(Object.entries(s.defaultVals??{}))}),n.add(r);for(let r of this.tables.keys())n.has(r)||this.tables.delete(r)}applySchema(e){for(let n of e.tables??[]){let r=this.toDeclared(n.name);r.columns=[],r.columnTypes={};for(let[s,o]of Object.entries(n.columns)){let i=o,a=i.metaInfo,u=a.column??s;r.columns.push(u),r.columnTypes[u]=(n.columnTypes?.[u]??G(i)).toLowerCase(),a.pk&&(r.pk={col:u,defaultUuid:a.default==="random"}),a.unique&&r.uniques.add(u),a.default==="now"?r.defaultNow.add(u):a.default!==void 0&&a.default!=="random"&&r.defaultVals.set(u,a.default)}for(let s of n.uniques??[])s.length>1&&r.groups.push(s)}}executeDdl(e){if(e.op==="createTable"&&e.table){let n=this.toDeclared(e.table),r=(e.columns??[]).filter(s=>s.type!=="table-constraint");if(n.columns.length===0){n.columns=r.map(s=>s.name);for(let s of r)n.columnTypes[s.name]=s.type.toLowerCase()}else{for(let s of r)n.columns.includes(s.name)||(n.columns.push(s.name),n.columnTypes[s.name]=s.type.toLowerCase());for(let s of n.rows)for(let o of r)!(o.name in s)&&o.defaultVal!==void 0&&(s[o.name]=o.defaultVal)}for(let s of e.columns??[]){if(s.type==="table-constraint"){s.constraintCols&&s.constraintCols.length>1&&n.groups.push(s.constraintCols);continue}s.pk&&(n.pk={col:s.name,defaultUuid:s.defaultUuid}),s.unique&&n.uniques.add(s.name),s.defaultNow&&n.defaultNow.add(s.name),s.defaultVal!==void 0&&n.defaultVals.set(s.name,s.defaultVal)}}else if(e.op==="alterAddColumn"&&e.table&&e.column){let n=this.table(e.table);if(!n.columns.includes(e.column)&&(n.columns.push(e.column),e.columnType&&(n.columnTypes[e.column]=e.columnType),e.defaultVal!==void 0)){let r=typeof e.defaultVal=="object"&&e.defaultVal!==null&&"__now"in e.defaultVal?new Date().toISOString():e.defaultVal;n.defaultVals.set(e.column,r);for(let s of n.rows)e.column in s||(s[e.column]=r)}}else if(e.op==="dropTable"&&e.table)this.tables.delete(e.table);else if(e.op==="dropEnum"&&e.table)this.enums.delete(e.table);else if(e.op==="alterEnumAddValue"&&e.table){let n=this.enums.get(e.table)??[];for(let r of e.enumValues??[])n.includes(r)||n.push(r);this.enums.set(e.table,n)}else e.op==="createEnum"&&e.table&&(this.enums.has(e.table)||this.enums.set(e.table,e.enumValues??[]));return ee([],0)}};function Rn(t){if(Array.isArray(t))return t;if(typeof t=="string")try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}return t==null?[]:[t]}function Tn(t){if(Array.isArray(t))return t;if(typeof t=="string")try{let e=JSON.parse(t);if(Array.isArray(e))return e}catch{}return t==null?[]:[]}function xn(t,e){let n=0,r=0,s=0,o=Math.min(t.length,e.length);for(let i=0;i<o;i++)n+=t[i]*e[i],r+=t[i]*t[i],s+=e[i]*e[i];return r&&s?n/(Math.sqrt(r)*Math.sqrt(s)):0}function We(t,e,n,r){if(typeof n!="object"||n===null)return n;let s=n;if("__jsonbAppend"in s)return[...Rn(e),...Rn(s.__jsonbAppend)];if("__inc"in s)return Number(e??0)+Number(s.__inc);if("__now"in s)return new Date().toISOString();if("__interval"in s){let[o,i]=s.__interval;return new Date(Date.now()+o*En(i)).toISOString()}return"__colRef"in s?r[String(s.__colRef)]:"__monthStart"in s?vn(n):n}function ot(t){return typeof t=="object"&&t!==null&&["__jsonbAppend","__inc","__now","__interval","__colRef","__monthStart"].some(e=>e in t)}function En(t){switch(t){case"day":return 864e5;case"hour":return 36e5;case"minute":return 6e4;default:return 1e3}}function vn(t){if(typeof t=="object"&&t!==null){if("__interval"in t){let[e,n]=t.__interval;return new Date(Date.now()+e*En(n)).toISOString()}if("__monthStart"in t){let e=new Date;return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),1)).toISOString()}}return t}function ee(t,e){let n=t;return Object.defineProperty(n,"affectedRows",{value:e,enumerable:!1,writable:!0,configurable:!0}),n}function Re(t,e){let n={};for(let r of e)r in t&&(n[r]=t[r]);return n}function it(t,e,n,r,s){for(let o of e){if(o==="*"||o===""||/^\d+$/.test(o)||!/^[\w.]+$/.test(o)||s?.has(o)||s?.has(o.slice(o.lastIndexOf(".")+1)))continue;let i=o.includes(".")?o.slice(o.lastIndexOf(".")+1):o;if(n.some(u=>u.cols.has(i)))continue;let a=[...new Set(n.flatMap(u=>[...u.cols]))].sort();throw new v("\u672A\u77E5\u5217",`memory-sql: ${t} \u672A\u77E5\u5217 '${o}'\u2014\u2014${r} \u5408\u6CD5\u5217\uFF1A${a.join(", ")}`)}}function Ve(t){let e=[];for(let[n,r]of Object.entries(t)){if(n==="or"||n==="and"){for(let s of r)e.push(...Ve(s));continue}n!=="__raw"&&(e.push(n),typeof r=="object"&&r!==null&&!Array.isArray(r)&&"col"in r&&e.push(String(r.col)))}return e}function j(t,e,n){if(t==null)return;if(e in t)return t[e];let r=e.indexOf(".");if(r>=0){let s=e.slice(r+1);return s in t?t[s]:void 0}for(let[s,o]of Object.entries(t))if(s.slice(s.indexOf(".")+1)===e)return o}function ne(t){let e=t.lastIndexOf(".");return e>=0?t.slice(e+1):t}function at(t){let e={};for(let[n,r]of Object.entries(t))e[ne(n)]=r;return e}function le(t){return typeof t=="object"&&t!==null&&"__raw"in t}function Ke(t,e="where"){if(t)for(let[n,r]of Object.entries(t)){if(r===void 0)throw new v(`weifuwu/db: ${e}.${n} \u4E0D\u80FD\u4E3A undefined\u2014\u2014\u7701\u7565\u8BE5\u952E\u6216\u663E\u5F0F isNull`);typeof r=="object"&&r!==null&&Ke(r,`${e}.${n}`)}}function P(t,e,n){for(let[r,s]of Object.entries(e)){if(r==="or"){if(!s.some(i=>P(t,i,n)))return!1;continue}if(r==="and"){if(!s.every(i=>P(t,i,n)))return!1;continue}if(typeof s=="object"&&s!==null){let o=s,i=j(t,r,n);if(!["col","eq","gt","gte","lt","lte","ne","in","notIn","like","ilike","isNull","between"].some(l=>o[l]!==void 0)){if(!D(i,s))return!1;continue}let u=l=>{if(typeof l=="object"&&l!==null&&("__interval"in l||"__monthStart"in l))return vn(l);if(!le(l))return l;let c=l.__raw.trim(),f=/^now\(\)\s*-\s*interval\s*'([0-9]+)\s*(days?|hours?|minutes?)'$/i.exec(c);if(/^now\(\)$/i.test(c))return new Date().toISOString();if(f){let w=Number(f[1]),p=f[2].toLowerCase(),h=p.startsWith("day")?w*864e5:p.startsWith("hour")?w*36e5:w*6e4;return new Date(Date.now()-h).toISOString()}let d=/^date_trunc\('(month|day|week|hour|minute)',\s*now\(\)\)$/i.exec(c);if(d){let w=new Date,p=d[1].toLowerCase();return p==="month"?new Date(Date.UTC(w.getUTCFullYear(),w.getUTCMonth(),1)).toISOString():p==="day"?new Date(Date.UTC(w.getUTCFullYear(),w.getUTCMonth(),w.getUTCDate())).toISOString():p==="hour"?new Date(w.setUTCMinutes(0,0,0)).toISOString():p==="minute"?new Date(w.setUTCSeconds(0,0)).toISOString():new Date(w).toISOString()}throw new v("WHERE \u503C\u8868\u8FBE\u5F0F",`memory-sql: WHERE \u503C\u8868\u8FBE\u5F0F\u4E0D\u652F\u6301\uFF08\u8BDA\u5B9E\u88C1\u526A\u2014\u2014\u7528\u771F\u5E93\uFF09\uFF1A${c}`)};if(o.col!==void 0&&!D(i,j(t,o.col,n))||o.eq!==void 0&&!D(i,u(o.eq))||o.gt!==void 0&&Te(i,u(o.gt))<=0||o.gte!==void 0&&Te(i,u(o.gte))<0||o.lt!==void 0&&Te(i,u(o.lt))>=0||o.lte!==void 0&&Te(i,u(o.lte))>0||o.ne!==void 0&&D(i,u(o.ne))||o.in&&!o.in.some(l=>D(i,u(l)))||o.notIn&&o.notIn.some(l=>D(i,u(l)))||o.like!==void 0&&(i==null||!Sn(o.like).test(String(i)))||o.ilike!==void 0&&(i==null||!Sn(o.ilike,!0).test(String(i))))return!1;if(o.between){let[l,c]=o.between;if(!(Number(i)>=Number(l)&&Number(i)<=Number(c)))return!1}if(o.isNull!==void 0&&i==null!==o.isNull)return!1;continue}throw process.env.PGDBG2&&console.error("[mmw where]",JSON.stringify({col:r,field:s})),new v("WHERE \u503C\u5F62\u6001",`memory-sql: WHERE \u5217 ${r} \u503C\u5FC5\u987B\u4E3A\u7B97\u5B50\u5BF9\u8C61\uFF08\u88F8\u6807\u91CF/\u6570\u7EC4/null \u5F62\u6001\u5DF2\u79FB\u9664\u2014\u2014\u7528 { eq: v } / { in: [...] } / { isNull: true }\uFF09`)}return!0}function Sn(t,e=!1){let n="";for(let r=0;r<t.length;r++){let s=t[r];if(s==="\\"){let o=t[r+1];if(o==="%"||o==="_"||o==="\\"){n+=$n(o),r++;continue}n+="\\\\";continue}if(s==="%"){n+=".*";continue}if(s==="_"){n+=".";continue}n+=$n(s)}return new RegExp(`^${n}$`,e?"i":"")}function $n(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Te(t,e){if(typeof t=="number"&&typeof e=="number")return t>e?1:t<e?-1:0;let n=String(t),r=String(e);return n>r?1:n<r?-1:0}function D(t,e){return t===e?!0:t===null||e===null?!1:typeof t=="object"&&typeof e=="object"?JSON.stringify(t)===JSON.stringify(e):!1}var lt="_weifuwu_migrations",On=new ut;function ct(t){let e=typeof t=="string"?{connection:t}:t??{};if(e.memory)return ft(e);let n=e.connection??process.env.DATABASE_URL;if(!n)throw new Error("postgres: DATABASE_URL is not set. Pass a connection string or set the DATABASE_URL environment variable.");let r=new URL(n),s=new ge({host:r.hostname,port:Number(r.port||5432),user:decodeURIComponent(r.username),password:decodeURIComponent(r.password),database:r.pathname.replace(/^\//,""),poolSize:e.max??e.poolSize??10,acquireTimeoutMs:e.acquireTimeoutMs,statementTimeoutMs:e.statementTimeoutMs??e.statementTimeout,idleTimeoutMs:e.idle_timeout,onQuery:e.onQuery?(a,u,l)=>{let c=On.getStore();e.onQuery?.(a,u,l,c||void 0)}:void 0}),o=ke(kn({query:(a,u)=>dt(s.query(a,u)),transaction:(a=>s.transaction(a))},on),e.tenant),i=((a,u,l)=>(u.orm=e.tenant?o.withCtx(u):o,On.run(a.headers.get("x-trace-id")??"",()=>l(a,u))));return i.__meta={injects:["orm"],depends:[]},i.orm=o,i.migrate=async()=>{await s.unsafe(`
49
+ CREATE TABLE IF NOT EXISTS "_weifuwu_migrations" (
50
+ name TEXT PRIMARY KEY,
51
+ applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
52
+ )
53
+ `)},i.markMigrated=async a=>{await s.unsafe('INSERT INTO "_weifuwu_migrations" (name) VALUES ($1) ON CONFLICT DO NOTHING',[a])},i.isMigrated=async a=>(await s.unsafe('SELECT 1 FROM "_weifuwu_migrations" WHERE name = $1',[a])).length>0,i.runMigration=async(a,u)=>{await i.isMigrated(a)||(await s.unsafe(u),await i.markMigrated(a))},i.migrateModule=async(a,u)=>{await i.runMigration(a,cn(Ce(u)))},i.transaction=o.transaction,i.poolStats=()=>({active:0,idle:s.size,waiting:0,max:s.size}),i.checkConsistency=async()=>{let a=await s.unsafe(`
54
+ SELECT table_name AS tbl, column_name AS col, data_type AS dt
55
+ FROM information_schema.columns WHERE table_schema = current_schema()
56
+ `),u=new Map;for(let l of a){let c=l.tbl;u.has(c)||u.set(c,{name:c,columns:[]}),u.get(c).columns.push({name:l.col,type:l.dt})}return Pe(o.tables(),[...u.values()])},i.close=()=>s.close(),i}function ft(t={}){let e=new xe,n=ke(qe(e),t.tenant),r=new Set,s=((o,i,a)=>(i.orm=t.tenant?n.withCtx(i):n,a(o,i)));return s.__meta={injects:["orm"],depends:[]},s.orm=n,s.migrate=async()=>{e.executeQuery({kind:"ddl",op:"createTable",table:"_weifuwu_migrations",ifNotExists:!0,columns:[{name:"name",type:"TEXT",pk:!0,unique:!1,defaultNow:!1,defaultUuid:!1,nullable:!1},{name:"applied_at",type:"TIMESTAMPTZ",pk:!1,unique:!1,defaultNow:!0,defaultUuid:!1,nullable:!1}]})},s.markMigrated=async o=>{r.add(o)},s.isMigrated=async o=>{if(r.has(o))return!0;try{return e.executeQuery({kind:"select",table:"_weifuwu_migrations",cols:["name"],where:{name:{eq:o}}}).length>0}catch{return!1}},s.migrateModule=async(o,i)=>{for(let a of Ce(i))e.executeQuery(a);await s.isMigrated(o)||await s.markMigrated(o)},s.transaction=n.transaction,s.poolStats=()=>({active:0,idle:0,waiting:0,max:1}),s.checkConsistency=async()=>Pe(n.tables(),e.schemaSnapshot()),s.close=async()=>{},s}var _n={23505:409,23503:400,23502:400,23514:400,"22P02":400,22003:400};function dt(t){return t.catch(e=>{let n=e?.code;throw n&&_n[n]?new A(`\u6570\u636E\u5E93\u9519\u8BEF: ${e.message}`,_n[n]):e})}export{lt as MIGRATIONS_TABLE,ct as postgres};
@@ -0,0 +1 @@
1
+ import{randomUUID as Z}from"node:crypto";import{hostname as Y}from"node:os";var C="workers";function H(c){let m=c.redis,f=c.prefix??"q:",R=r=>`${f}${r}`,J=r=>`${f}${r}:dead`;async function j(r,w){let u=await m.command("XADD",R(r),"*","payload",JSON.stringify(w));return String(u)}let M={async add(r,w,u){return{id:await j(r,{id:Z(),name:r,data:w,attempts:0,maxAttempts:u?.attempts??3,addedAt:Date.now()})}},length:async r=>Number(await m.command("XLEN",R(r))),worker(r,w,u){let k=u?.consumer??`${Y()}-${process.pid}-${Math.random().toString(36).slice(2,6)}`,O=u?.concurrency??1,E=u?.visibilityTimeout??3e4,L=u?.blockMs??1e3,p=R(r),q=J(r),v=`${f}${r}:delayed`,s=!1,D=0,h=0,n=null,g=-1,y=500,A=new Map,P=new Set;function B(){let e=n;n=null,g=-1,e?.close().catch(()=>{})}async function x(e){let o=e instanceof Error?e.message:String(e);return/pool is closed/.test(o)?!1:(B(),await new Promise(t=>setTimeout(t,y)),y=Math.min(y*2,5e3),!0)}function $(){y=500}async function N(e){if(n&&g===e)return n;if(n){let t=n;n=null,g=-1,await t.close().catch(()=>{})}let o=await m.createConnection();return n=o,g=e,o}async function Q(){let e;for(let o=0;o<3;o++)try{await n.command("XGROUP","CREATE",p,C,"0","MKSTREAM");return}catch(t){if(String(t.message).includes("BUSYGROUP"))return;e=t,o<2&&await new Promise(a=>setTimeout(a,50))}throw e}async function U(e,o){let t;try{t=JSON.parse(o.payload??"{}")}catch{await n.command("XADD",q,"*","payload",JSON.stringify({originalId:e,name:r,error:"unparseable payload",attempts:-1})),await n.command("XACK",p,C,e);return}let a=Number(t.attempts??0),i=Number(t.maxAttempts??3);try{await w({id:e,name:r,data:t.data,attempts:a}),await n.command("XACK",p,C,e)}catch(l){let d=a+1;d>=i?(await n.command("XADD",q,"*","payload",JSON.stringify({originalId:e,name:r,data:t.data,error:l instanceof Error?l.message:String(l),attempts:d})),await n.command("XACK",p,C,e),console.error(`[queue] ${r} job failed permanently (attempt ${d}/${i}):`,l)):(await n.command("ZADD",v,String(Date.now()+E),JSON.stringify({...t,attempts:d})),await n.command("XACK",p,C,e),console.error(`[queue] ${r} job failed (attempt ${d}/${i}), retry in ${E}ms:`,l))}}async function K(){let e=Date.now(),o;try{o=await n.command("ZRANGEBYSCORE",v,0,e)}catch(t){if(T(t)){if(await x(t))return;s=!1;return}s&&S()&&console.error("[queue] ZRANGEBYSCORE:",t instanceof Error?t.message:t);return}for(let t of o)await n.command("ZREM",v,t)&&await n.command("XADD",p,"*","payload",t)}async function W(){try{let o=(await n.command("XAUTOCLAIM",p,C,k,E,"0","COUNT",String(O)))[1];for(let[t,a]of o)await U(t,G(a))}catch(e){if(T(e)){if(await x(e))return;s=!1;return}if(await X(e))return;s&&S()&&console.error("[queue] XAUTOCLAIM:",e instanceof Error?e.message:e)}}async function X(e){let o=e instanceof Error?e.message:String(e);if(!/NOGROUP/.test(o))return!1;try{return await Q(),!0}catch{return!1}}function S(){let e=Date.now();return e-D>5e3?(D=e,!0):!1}async function I(e){for(;s&&e===h;){if(!n||g!==e){try{await N(e)}catch(i){s&&S()&&console.error("[queue] reconnect:",i instanceof Error?i.message:i),await new Promise(l=>setTimeout(l,y)),y=Math.min(y*2,5e3);continue}$()}if(await W(),await K(),P.size>=O){await Promise.race([...P].map(i=>i.catch(()=>{})));continue}let o;try{o=await n.command("XREADGROUP","GROUP",C,k,"COUNT",String(O-P.size),"BLOCK",String(L),"STREAMS",p,">"),$()}catch(i){if(T(i)){if(await x(i))continue;s=!1;return}if(await X(i))continue;s&&S()&&console.error("[queue] XREADGROUP:",i instanceof Error?i.message:i);continue}if(!o)continue;let a=o[0][1];for(let[i,l]of a){let d=U(i,G(l));P.add(d),d.finally(()=>P.delete(d)).catch(()=>{})}}}return{start:async()=>{if(s)return;s=!0;let e=h;try{await N(e),await Q()}catch(t){if(s=!1,n){let a=n;n=null,g=-1,await a.close().catch(()=>{})}throw t}let o=I(e);A.set(e,o),o.finally(()=>A.delete(e)).catch(t=>console.error("[queue] worker loop crashed:",t))},stop:async()=>{if(!s){await Promise.allSettled([...A.values()]);return}h++,s=!1;let e=n;n=null,g=-1;let o=[...A.entries()].filter(([t])=>t<h).map(([,t])=>t);await Promise.allSettled([...P]),await Promise.allSettled(o),await e?.close().catch(()=>{})}}}},b=(async(r,w,u)=>(w.queue=M,u(r,w)));return b.__meta={injects:["queue"],depends:[]},b.queue=M,b.close=async()=>{},b}function G(c){let m={};for(let f=0;f+1<c.length;f+=2)m[String(c[f])]=String(c[f+1]);return m}function T(c){let m=c instanceof Error?c.message:String(c);return/pool is closed|connection closed/.test(m)}export{H as queue};