@vobs/payment 1.2.1 → 1.3.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 (85) hide show
  1. package/dist/alipay/client.cjs +31 -8
  2. package/dist/alipay/client.cjs.map +1 -1
  3. package/dist/alipay/client.js +6 -5
  4. package/dist/alipay/client.js.map +1 -1
  5. package/dist/alipay/config.cjs +27 -5
  6. package/dist/alipay/config.cjs.map +1 -1
  7. package/dist/alipay/config.js +3 -3
  8. package/dist/alipay/config.js.map +1 -1
  9. package/dist/alipay/index.cjs +56 -177
  10. package/dist/alipay/index.cjs.map +1 -1
  11. package/dist/alipay/index.js +17 -162
  12. package/dist/alipay/index.js.map +1 -1
  13. package/dist/alipay/notify.cjs +27 -5
  14. package/dist/alipay/notify.cjs.map +1 -1
  15. package/dist/alipay/notify.js +3 -3
  16. package/dist/alipay/notify.js.map +1 -1
  17. package/dist/alipay/payment.cjs +27 -5
  18. package/dist/alipay/payment.cjs.map +1 -1
  19. package/dist/alipay/payment.js +3 -3
  20. package/dist/alipay/payment.js.map +1 -1
  21. package/dist/alipay/plugin.cjs +36 -165
  22. package/dist/alipay/plugin.cjs.map +1 -1
  23. package/dist/alipay/plugin.js +9 -160
  24. package/dist/alipay/plugin.js.map +1 -1
  25. package/dist/alipay/query.cjs +29 -5
  26. package/dist/alipay/query.cjs.map +1 -1
  27. package/dist/alipay/query.js +3 -3
  28. package/dist/alipay/query.js.map +1 -1
  29. package/dist/alipay/refund.cjs +29 -5
  30. package/dist/alipay/refund.cjs.map +1 -1
  31. package/dist/alipay/refund.js +3 -3
  32. package/dist/alipay/refund.js.map +1 -1
  33. package/dist/alipay/response.cjs +29 -6
  34. package/dist/alipay/response.cjs.map +1 -1
  35. package/dist/alipay/response.js +4 -3
  36. package/dist/alipay/response.js.map +1 -1
  37. package/dist/alipay/types.cjs +18 -2
  38. package/dist/alipay/types.cjs.map +1 -1
  39. package/dist/alipay/types.js +0 -2
  40. package/dist/alipay/types.js.map +1 -1
  41. package/dist/alipay/wap.cjs +27 -5
  42. package/dist/alipay/wap.cjs.map +1 -1
  43. package/dist/alipay/wap.js +3 -3
  44. package/dist/alipay/wap.js.map +1 -1
  45. package/dist/index.cjs +85 -194
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.js +38 -167
  48. package/dist/index.js.map +1 -1
  49. package/dist/wechat/client.cjs +31 -8
  50. package/dist/wechat/client.cjs.map +1 -1
  51. package/dist/wechat/client.js +6 -5
  52. package/dist/wechat/client.js.map +1 -1
  53. package/dist/wechat/config.cjs +27 -5
  54. package/dist/wechat/config.cjs.map +1 -1
  55. package/dist/wechat/config.js +3 -3
  56. package/dist/wechat/config.js.map +1 -1
  57. package/dist/wechat/index.cjs +64 -181
  58. package/dist/wechat/index.cjs.map +1 -1
  59. package/dist/wechat/index.js +23 -164
  60. package/dist/wechat/index.js.map +1 -1
  61. package/dist/wechat/notify.cjs +33 -10
  62. package/dist/wechat/notify.cjs.map +1 -1
  63. package/dist/wechat/notify.js +6 -5
  64. package/dist/wechat/notify.js.map +1 -1
  65. package/dist/wechat/payment.cjs +33 -10
  66. package/dist/wechat/payment.cjs.map +1 -1
  67. package/dist/wechat/payment.js +6 -5
  68. package/dist/wechat/payment.js.map +1 -1
  69. package/dist/wechat/plugin.cjs +36 -165
  70. package/dist/wechat/plugin.cjs.map +1 -1
  71. package/dist/wechat/plugin.js +9 -160
  72. package/dist/wechat/plugin.js.map +1 -1
  73. package/dist/wechat/refund.cjs +29 -5
  74. package/dist/wechat/refund.cjs.map +1 -1
  75. package/dist/wechat/refund.js +3 -3
  76. package/dist/wechat/refund.js.map +1 -1
  77. package/dist/wechat/response.cjs +31 -7
  78. package/dist/wechat/response.cjs.map +1 -1
  79. package/dist/wechat/response.js +5 -3
  80. package/dist/wechat/response.js.map +1 -1
  81. package/dist/wechat/types.cjs +18 -2
  82. package/dist/wechat/types.cjs.map +1 -1
  83. package/dist/wechat/types.js +0 -2
  84. package/dist/wechat/types.js.map +1 -1
  85. package/package.json +2 -2
@@ -1,166 +1,36 @@
1
- 'use strict';
2
-
3
- var wechatpayAxiosPlugin = require('wechatpay-axios-plugin');
4
-
1
+ var __VOBS_CJS_FILE_URL = require("url").pathToFileURL(__filename).href;
2
+ "use strict";
5
3
  var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
7
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
-
8
- // packages/reactivity/src/debug.ts
9
- var activeDebugHooks = null;
10
- function hasDebugHooks() {
11
- return activeDebugHooks !== null;
12
- }
13
- __name(hasDebugHooks, "hasDebugHooks");
14
- function invokeDebug(name, ...args) {
15
- return;
16
- }
17
- __name(invokeDebug, "invokeDebug");
18
-
19
- // packages/reactivity/src/owner.ts
20
- var currentOwner = null;
21
- function getCurrentOwner() {
22
- return currentOwner;
23
- }
24
- __name(getCurrentOwner, "getCurrentOwner");
25
-
26
- // packages/reactivity/src/scheduler.ts
27
- var _Scheduler = class _Scheduler {
28
- constructor() {
29
- this.dirtyEffects = /* @__PURE__ */ new Set();
30
- this.lowPriorityEffects = /* @__PURE__ */ new Set();
31
- // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
32
- this.normalBuffer = [];
33
- this.lowBuffer = [];
34
- this.flushing = false;
35
- this.scheduled = false;
36
- this.batchDepth = 0;
37
- }
38
- schedule(effect2) {
39
- if (effect2.disposed) return;
40
- this.dirtyEffects.add(effect2);
41
- this.lowPriorityEffects.delete(effect2);
42
- this.ensureScheduled();
43
- }
44
- /** Queue an effect behind normal updates while preserving deterministic order. */
45
- scheduleLow(effect2) {
46
- if (effect2.disposed) return;
47
- if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
48
- this.ensureScheduled();
49
- }
50
- ensureScheduled() {
51
- if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
52
- this.scheduled = true;
53
- queueMicrotask(() => {
54
- this.scheduled = false;
55
- this.flush();
56
- });
57
- }
58
- }
59
- remove(effect2) {
60
- this.dirtyEffects.delete(effect2);
61
- this.lowPriorityEffects.delete(effect2);
62
- }
63
- batch(fn) {
64
- this.batchDepth++;
65
- try {
66
- return fn();
67
- } finally {
68
- this.batchDepth--;
69
- if (this.batchDepth === 0) this.flush();
70
- }
71
- }
72
- flush() {
73
- if (this.flushing || this.batchDepth > 0) return;
74
- this.flushing = true;
75
- let rounds = 0;
76
- let firstError;
77
- let hasError = false;
78
- try {
79
- while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
80
- if (++rounds > 100) {
81
- this.dirtyEffects.clear();
82
- this.lowPriorityEffects.clear();
83
- throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
84
- }
85
- this.collectRunnable(this.dirtyEffects, this.normalBuffer);
86
- this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
87
- sortEffects(this.normalBuffer);
88
- sortEffects(this.lowBuffer);
89
- for (const effect2 of this.normalBuffer) {
90
- try {
91
- effect2.run();
92
- } catch (error) {
93
- if (!hasError) {
94
- firstError = error;
95
- hasError = true;
96
- }
97
- }
98
- }
99
- for (const effect2 of this.lowBuffer) {
100
- try {
101
- effect2.run();
102
- } catch (error) {
103
- if (!hasError) {
104
- firstError = error;
105
- hasError = true;
106
- }
107
- }
108
- }
109
- this.normalBuffer.length = 0;
110
- this.lowBuffer.length = 0;
111
- }
112
- } finally {
113
- this.normalBuffer.length = 0;
114
- this.lowBuffer.length = 0;
115
- this.flushing = false;
116
- }
117
- if (hasError) throw firstError;
118
- }
119
- /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
120
- collectRunnable(source, target) {
121
- for (const effect2 of source) {
122
- if (!effect2.disposed) target.push(effect2);
123
- }
124
- source.clear();
125
- }
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
126
11
  };
127
- __name(_Scheduler, "Scheduler");
128
- function sortEffects(effects) {
129
- if (effects.length > 1) {
130
- effects.sort((a, b) => b.depth - a.depth || a.order - b.order);
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
131
17
  }
132
- }
133
- __name(sortEffects, "sortEffects");
134
-
135
- // packages/runtime/src/hmr.ts
136
- var globalTarget = globalThis;
137
- var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
138
- globalTarget.__VOBS_HMR__ = hmrGlobal;
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
139
21
 
140
- // packages/vobs/src/context.ts
141
- var ownerProviders = /* @__PURE__ */ new WeakMap();
142
- function inject(key, fallback) {
143
- const owner = getCurrentOwner();
144
- const value = owner ? injectFromOwner(owner, key) : void 0;
145
- return value === void 0 ? fallback : value;
146
- }
147
- __name(inject, "inject");
148
- function injectFromOwner(owner, key) {
149
- let current = owner;
150
- while (current) {
151
- const providers = ownerProviders.get(current);
152
- if (providers?.has(key)) return providers.get(key);
153
- current = current.parent;
154
- }
155
- return void 0;
156
- }
157
- __name(injectFromOwner, "injectFromOwner");
22
+ // packages/payment/src/wechat/plugin.ts
23
+ var plugin_exports = {};
24
+ __export(plugin_exports, {
25
+ WECHAT_KEY: () => WECHAT_KEY,
26
+ useWechat: () => useWechat,
27
+ wechatPlugin: () => wechatPlugin
28
+ });
29
+ module.exports = __toCommonJS(plugin_exports);
30
+ var import_vobs = require("@vobs/vobs");
158
31
 
159
- // packages/vobs/src/app.ts
160
- function createInjectionKey(description) {
161
- return Symbol(description);
162
- }
163
- __name(createInjectionKey, "createInjectionKey");
32
+ // packages/payment/src/wechat/client.ts
33
+ var import_wechatpay_axios_plugin = require("wechatpay-axios-plugin");
164
34
 
165
35
  // packages/payment/src/wechat/config.ts
166
36
  var _WechatConfig = class _WechatConfig {
@@ -254,7 +124,7 @@ var _WechatClient = class _WechatClient {
254
124
  this._sdk = null;
255
125
  }
256
126
  createSdk(options) {
257
- return new wechatpayAxiosPlugin.Wechatpay({
127
+ return new import_wechatpay_axios_plugin.Wechatpay({
258
128
  mchid: options.mchid,
259
129
  serial: options.serial,
260
130
  privateKey: options.privateKey,
@@ -272,9 +142,9 @@ __name(_WechatClient, "WechatClient");
272
142
  var WechatClient = _WechatClient;
273
143
 
274
144
  // packages/payment/src/wechat/plugin.ts
275
- var WECHAT_KEY = createInjectionKey("vobs.payment.wechat");
145
+ var WECHAT_KEY = (0, import_vobs.createInjectionKey)("vobs.payment.wechat");
276
146
  function useWechat() {
277
- const client = inject(WECHAT_KEY);
147
+ const client = (0, import_vobs.inject)(WECHAT_KEY);
278
148
  if (!client) {
279
149
  throw new Error("Vobs Payment: \u627E\u4E0D\u5230 WechatClient\uFF0C\u8BF7\u5B89\u88C5 wechatPlugin");
280
150
  }
@@ -297,9 +167,10 @@ function wechatPlugin(options) {
297
167
  };
298
168
  }
299
169
  __name(wechatPlugin, "wechatPlugin");
300
-
301
- exports.WECHAT_KEY = WECHAT_KEY;
302
- exports.useWechat = useWechat;
303
- exports.wechatPlugin = wechatPlugin;
304
- //# sourceMappingURL=plugin.cjs.map
170
+ // Annotate the CommonJS export names for ESM import in node:
171
+ 0 && (module.exports = {
172
+ WECHAT_KEY,
173
+ useWechat,
174
+ wechatPlugin
175
+ });
305
176
  //# sourceMappingURL=plugin.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../reactivity/src/debug.ts","../../../reactivity/src/owner.ts","../../../reactivity/src/scheduler.ts","../../../runtime/src/hmr.ts","../../../vobs/src/context.ts","../../../vobs/src/app.ts","../../src/wechat/config.ts","../../src/wechat/client.ts","../../src/wechat/plugin.ts"],"names":["effect","Wechatpay"],"mappings":"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","file":"plugin.cjs","sourcesContent":["import type { Effect } from './effect'\nimport type { Owner } from './owner'\nimport type { Dependency, ReadableSignal, Subscriber } from './signal'\n\nexport interface ReactivityDebugHooks {\n ownerCreated?(owner: Owner): void\n ownerNamed?(owner: Owner, name: string): void\n ownerDisposed?(owner: Owner): void\n signalCreated?(signal: ReadableSignal<unknown>, owner: Owner | null): void\n signalNamed?(signal: ReadableSignal<unknown>, name: string): void\n signalRead?(signal: ReadableSignal<unknown>, subscriber: Subscriber): void\n signalChanged?(signal: ReadableSignal<unknown>, previousValue: unknown, nextValue: unknown): void\n signalDisposed?(signal: ReadableSignal<unknown>): void\n dependencyTracked?(dependency: Dependency, subscriber: Subscriber): void\n dependencyUntracked?(dependency: Dependency, subscriber: Subscriber): void\n effectCreated?(effect: Effect, owner: Owner | null): void\n effectInvalidated?(effect: Effect): void\n effectRunStart?(effect: Effect): void\n effectRunEnd?(effect: Effect, error?: unknown, handled?: boolean): void\n effectDisposed?(effect: Effect): void\n memoCreated?(signal: ReadableSignal<unknown>, subscriber: Subscriber, owner: Owner | null): void\n memoInvalidated?(signal: ReadableSignal<unknown>): void\n flushStart?(): void\n flushEnd?(): void\n}\n\nlet activeDebugHooks: ReactivityDebugHooks | null = null\nconst signalNames = new WeakMap<object, string>()\n\nexport function setDebugHooks(hooks: ReactivityDebugHooks | null): ReactivityDebugHooks | null {\n const previous = activeDebugHooks\n activeDebugHooks = hooks\n return previous\n}\n\nexport function getDebugHooks(): ReactivityDebugHooks | null {\n return activeDebugHooks\n}\n\n/** 热路径守卫:无 hooks 时跳过 invokeDebug 调用,避免 rest 参数数组分配。 */\nexport function hasDebugHooks(): boolean {\n return activeDebugHooks !== null\n}\n\nexport function setSignalDebugName(signal: ReadableSignal<unknown>, name: string): void {\n signalNames.set(signal, name)\n invokeDebug('signalNamed', signal, name)\n}\n\nexport function getSignalDebugName(signal: ReadableSignal<unknown>): string | undefined {\n return signalNames.get(signal)\n}\n\nexport function invokeDebug<K extends keyof ReactivityDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<ReactivityDebugHooks[K]>>\n): void {\n const callback = activeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change application behavior.\n }\n}\n","import { invokeDebug, hasDebugHooks } from './debug'\n\nexport interface Owner {\n readonly id: string\n readonly parent: Owner | null\n readonly children: readonly Owner[]\n readonly depth: number\n readonly disposed: boolean\n run<T>(fn: () => T): T\n addCleanup(cleanup: () => void): void\n onDispose(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n handleError(error: unknown): boolean\n dispose(): void\n}\n\nlet currentOwner: Owner | null = null\nlet nextOwnerId = 1\nconst ownerNames = new WeakMap<Owner, string>()\n\nexport function createOwner(): Owner {\n const parent = currentOwner\n let disposed = parent?.disposed ?? false\n const children: Owner[] = []\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n\n const owner: Owner = {\n id: `owner-${nextOwnerId++}`,\n parent,\n children,\n depth: (parent?.depth ?? -1) + 1,\n\n get disposed(): boolean {\n return disposed\n },\n\n run<T>(fn: () => T): T {\n if (disposed) throw new Error('Vobs: 已销毁的 Owner 不能继续运行')\n const previous = currentOwner\n currentOwner = owner\n try {\n return fn()\n } finally {\n currentOwner = previous\n }\n },\n\n addCleanup(cleanup: () => void): void {\n if (disposed) {\n cleanup()\n return\n }\n cleanups.push(cleanup)\n },\n\n onDispose(cleanup: () => void): void {\n owner.addCleanup(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n owner.addCleanup(remove)\n return remove\n },\n\n handleError(error: unknown): boolean {\n for (const handler of [...errorHandlers].reverse()) {\n try {\n handler(error)\n return true\n } catch (handlerError) {\n return parent?.handleError(handlerError) ?? false\n }\n }\n return parent?.handleError(error) ?? false\n },\n\n dispose(): void {\n if (disposed) return\n disposed = true\n for (const child of [...children]) child.dispose()\n children.length = 0\n\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n if (parent) {\n const index = parent.children.indexOf(owner)\n if (index >= 0) (parent.children as Owner[]).splice(index, 1)\n }\n if (hasDebugHooks()) invokeDebug('ownerDisposed', owner)\n if (firstError) throw firstError\n }\n }\n\n if (parent && !parent.disposed) (parent.children as Owner[]).push(owner)\n if (hasDebugHooks()) invokeDebug('ownerCreated', owner)\n return owner\n}\n\nexport function setOwnerDebugName(owner: Owner, name: string): void {\n ownerNames.set(owner, name)\n if (hasDebugHooks()) invokeDebug('ownerNamed', owner, name)\n}\n\nexport function getOwnerDebugName(owner: Owner): string | undefined {\n return ownerNames.get(owner)\n}\n\nexport function getCurrentOwner(): Owner | null {\n return currentOwner\n}\n\n/** Re-enter an Owner for an explicitly captured asynchronous continuation. */\nexport function runWithOwner<T>(owner: Owner, fn: () => T): T {\n return owner.run(fn)\n}\n\nexport function onDispose(cleanup: () => void): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: onDispose 必须在 Owner 作用域内调用')\n owner.onDispose(cleanup)\n}\n","import type { Effect } from './effect'\nimport { hasDebugHooks, invokeDebug } from './debug'\n\nexport class Scheduler {\n private readonly dirtyEffects = new Set<Effect>()\n private readonly lowPriorityEffects = new Set<Effect>()\n // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。\n private readonly normalBuffer: Effect[] = []\n private readonly lowBuffer: Effect[] = []\n private flushing = false\n private scheduled = false\n private batchDepth = 0\n\n schedule(effect: Effect): void {\n if (effect.disposed) return\n this.dirtyEffects.add(effect)\n this.lowPriorityEffects.delete(effect)\n this.ensureScheduled()\n }\n\n /** Queue an effect behind normal updates while preserving deterministic order. */\n scheduleLow(effect: Effect): void {\n if (effect.disposed) return\n if (!this.dirtyEffects.has(effect)) this.lowPriorityEffects.add(effect)\n this.ensureScheduled()\n }\n\n private ensureScheduled(): void {\n if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {\n this.scheduled = true\n queueMicrotask(() => {\n this.scheduled = false\n this.flush()\n })\n }\n }\n\n remove(effect: Effect): void {\n this.dirtyEffects.delete(effect)\n this.lowPriorityEffects.delete(effect)\n }\n\n batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) this.flush()\n }\n }\n\n flush(): void {\n if (this.flushing || this.batchDepth > 0) return\n this.flushing = true\n const debugEnabled = hasDebugHooks()\n if (debugEnabled) invokeDebug('flushStart')\n let rounds = 0\n let firstError: unknown\n let hasError = false\n try {\n while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {\n if (++rounds > 100) {\n this.dirtyEffects.clear()\n this.lowPriorityEffects.clear()\n throw new Error('Vobs: 响应式更新超过 100 轮,可能存在循环依赖')\n }\n\n // normal 先、low 后,两组分别排序:与旧的合并排序语义一致\n // (旧比较器里 low 优先级本就高于 depth),但消除了比较器内的 Set 查找。\n this.collectRunnable(this.dirtyEffects, this.normalBuffer)\n this.collectRunnable(this.lowPriorityEffects, this.lowBuffer)\n sortEffects(this.normalBuffer)\n sortEffects(this.lowBuffer)\n for (const effect of this.normalBuffer) {\n try {\n effect.run()\n } catch (error) {\n // Isolate one failed effect from the rest of the flush. Re-throw\n // the first error after all runnable effects have had a chance.\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n for (const effect of this.lowBuffer) {\n try {\n effect.run()\n } catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n }\n } finally {\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n this.flushing = false\n if (debugEnabled) invokeDebug('flushEnd')\n }\n if (hasError) throw firstError\n }\n\n /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */\n private collectRunnable(source: Set<Effect>, target: Effect[]): void {\n for (const effect of source) {\n if (!effect.disposed) target.push(effect)\n }\n source.clear()\n }\n}\n\n/** depth 深的先跑(子 effect 先于父),同深度按创建顺序。 */\nfunction sortEffects(effects: Effect[]): void {\n if (effects.length > 1) {\n effects.sort((a, b) => b.depth - a.depth || a.order - b.order)\n }\n}\n\nexport const scheduler = new Scheduler()\n\nexport function batch<T>(fn: () => T): T {\n return scheduler.batch(fn)\n}\n\n/** Schedule a low-priority effect explicitly. */\nexport function scheduleLow(effect: Effect): void {\n effect.scheduleLow()\n}\n","import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","import { getCurrentOwner, type Owner } from '@vobs/reactivity'\nimport type { InjectionKey, ProvideOptions } from './app'\n\nconst ownerProviders = new WeakMap<Owner, Map<InjectionKey<unknown>, unknown>>()\n\nexport function provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: provide 必须在组件或 Owner 作用域内调用')\n provideToOwner(owner, key, value, options)\n}\n\nexport function inject<T>(key: InjectionKey<T>): T | undefined\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const owner = getCurrentOwner()\n const value = owner ? injectFromOwner(owner, key) : undefined\n return value === undefined ? fallback : value\n}\n\nexport function injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = inject(key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n}\n\nexport function provideToOwner<T>(\n owner: Owner,\n key: InjectionKey<T>,\n value: T,\n options: ProvideOptions = {}\n): void {\n let providers = ownerProviders.get(owner)\n if (!providers) {\n providers = new Map<InjectionKey<unknown>, unknown>()\n ownerProviders.set(owner, providers)\n owner.onDispose(() => ownerProviders.delete(owner))\n }\n if (providers.has(key) && !options.override) {\n throw new Error(`Vobs: 注入项 ${String(key)} 已存在;如需覆盖请传入 override: true`)\n }\n providers.set(key, value)\n}\n\nexport function injectFromOwner<T>(owner: Owner, key: InjectionKey<T>): T | undefined {\n let current: Owner | null = owner\n while (current) {\n const providers = ownerProviders.get(current)\n if (providers?.has(key)) return providers.get(key) as T\n current = current.parent\n }\n return undefined\n}\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","import type { WechatClientOptions } from './types'\n\n/**\n * 微信支付配置管理\n * 遵循 vobs 生命周期管理:可创建、可校验、可更新、可替换\n */\nexport class WechatConfig {\n private _options: WechatClientOptions\n\n constructor(options: WechatClientOptions) {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 获取完整配置 */\n get options(): Readonly<WechatClientOptions> {\n return this._options\n }\n\n /** 商户号 */\n get mchid(): string {\n return this._options.mchid\n }\n\n /** 应用 ID(公众号 / 小程序 / APP) */\n get appid(): string {\n return this._options.appid\n }\n\n /** 商户 API 证书序列号 */\n get serial(): string {\n return this._options.serial\n }\n\n /** APIv3 密钥(回调解密用) */\n get apiv3Key(): string {\n return this._options.apiv3Key\n }\n\n /** 异步通知地址 */\n get notifyUrl(): string | undefined {\n return this._options.notifyUrl\n }\n\n /** 更新配置(部分更新) */\n update(patch: Partial<WechatClientOptions>): void {\n const merged = { ...this._options, ...patch }\n this.validate(merged)\n this._options = merged\n }\n\n /** 替换配置 */\n replace(options: WechatClientOptions): void {\n this.validate(options)\n this._options = { ...options }\n }\n\n private validate(options: WechatClientOptions): void {\n if (!options.mchid) {\n throw new Error('WechatConfig: mchid 不能为空')\n }\n if (!options.serial) {\n throw new Error('WechatConfig: serial(商户 API 证书序列号)不能为空')\n }\n if (!options.privateKey) {\n throw new Error('WechatConfig: privateKey(商户 API 私钥 PEM)不能为空')\n }\n if (!options.certs || Object.keys(options.certs).length === 0) {\n throw new Error('WechatConfig: certs(平台证书/微信支付公钥 {序列号: PEM})不能为空')\n }\n if (!options.appid) {\n throw new Error('WechatConfig: appid 不能为空')\n }\n if (!options.apiv3Key) {\n throw new Error('WechatConfig: apiv3Key 不能为空')\n }\n if (options.apiv3Key.length !== 32) {\n throw new Error('WechatConfig: apiv3Key 必须为 32 字节字符串')\n }\n }\n}\n","import { Wechatpay } from 'wechatpay-axios-plugin'\nimport { WechatConfig } from './config'\nimport type { WechatClientOptions } from './types'\n\n/**\n * 微信支付客户端封装\n *\n * 封装官方 wechatpay-axios-plugin 的 Wechatpay 实例,提供统一的生命周期管理。\n * 可独立使用,也可通过 wechatPlugin 注册到 vobs 框架。\n *\n * @example\n * ```ts\n * const client = new WechatClient({\n * mchid: '1900000000',\n * serial: '商户API证书序列号',\n * privateKey: '-----BEGIN PRIVATE KEY-----...',\n * certs: { 'PUB_KEY_ID_xxx': '-----BEGIN PUBLIC KEY-----...' },\n * appid: 'wx1234567890',\n * apiv3Key: '32字节APIv3密钥',\n * notifyUrl: 'https://your-domain.com/wechat/notify'\n * })\n * ```\n */\nexport class WechatClient {\n readonly config: WechatConfig\n private _sdk: Wechatpay\n private _disposed = false\n\n constructor(options: WechatClientOptions) {\n this.config = new WechatConfig(options)\n this._sdk = this.createSdk(options)\n }\n\n /** 获取底层 Wechatpay 实例(链式 API:client.sdk.v3.pay.transactions.jsapi.post(...)) */\n get sdk(): Wechatpay {\n this.ensureActive()\n return this._sdk\n }\n\n /** 更新配置并重建 SDK 实例 */\n updateConfig(patch: Partial<WechatClientOptions>): void {\n this.ensureActive()\n this.config.update(patch)\n this._sdk = this.createSdk(this.config.options as WechatClientOptions)\n }\n\n /** 销毁客户端 */\n dispose(): void {\n this._disposed = true\n ;(this._sdk as any) = null\n }\n\n private createSdk(options: WechatClientOptions): Wechatpay {\n return new Wechatpay({\n mchid: options.mchid,\n serial: options.serial,\n privateKey: options.privateKey,\n certs: options.certs,\n timeout: options.timeout ?? 5000\n })\n }\n\n private ensureActive(): void {\n if (this._disposed) {\n throw new Error('WechatClient: 客户端已销毁')\n }\n }\n}\n","import { createInjectionKey, inject, type VobsContext, type VobsPlugin } from '@vobs/vobs'\r\nimport { WechatClient } from './client'\r\nimport type { WechatClientOptions } from './types'\r\n\r\nexport const WECHAT_KEY = createInjectionKey<WechatClient>('vobs.payment.wechat')\r\n\r\nexport interface WechatPluginOptions {\r\n /** 微信支付客户端配置(未传入 client 时必填) */\r\n config?: WechatClientOptions\r\n /** 可选的已有客户端实例(指定后忽略 config) */\r\n client?: WechatClient\r\n}\r\n\r\n/** 从 vobs 插件上下文获取微信支付客户端 */\r\nexport function useWechat(): WechatClient {\r\n const client = inject(WECHAT_KEY)\r\n if (!client) {\r\n throw new Error('Vobs Payment: 找不到 WechatClient,请安装 wechatPlugin')\r\n }\r\n return client\r\n}\r\n\r\n/**\r\n * 微信支付插件\r\n *\r\n * @example\r\n * ```ts\r\n * createVobs({\r\n * plugins: [\r\n * wechatPlugin({\r\n * config: {\r\n * mchid: '1900000000',\r\n * serial: '...',\r\n * privateKey: '...',\r\n * certs: { 'PUB_KEY_ID_xxx': '...' },\r\n * appid: 'wx1234567890',\r\n * apiv3Key: '...'\r\n * }\r\n * })\r\n * ]\r\n * })\r\n * ```\r\n */\r\nexport function wechatPlugin(options: WechatPluginOptions): VobsPlugin {\r\n return {\r\n name: '@vobs/payment/wechat',\r\n version: '0.1.0',\r\n install(context: VobsContext) {\r\n if (!options.client && !options.config) {\r\n throw new Error('Vobs Payment: wechatPlugin 需要提供 config 或 client 之一')\r\n }\r\n // 仅销毁插件自建的客户端;外部传入的实例由其所有者负责生命周期。\r\n const ownClient = !options.client\r\n const client = options.client ?? new WechatClient(options.config!)\r\n context.provide(WECHAT_KEY, client)\r\n return ownClient ? () => client.dispose() : undefined\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/wechat/plugin.ts","../../src/wechat/client.ts","../../src/wechat/config.ts"],"sourcesContent":["import { createInjectionKey, inject, type VobsContext, type VobsPlugin } from '@vobs/vobs'\r\nimport { WechatClient } from './client'\r\nimport type { WechatClientOptions } from './types'\r\n\r\nexport const WECHAT_KEY = createInjectionKey<WechatClient>('vobs.payment.wechat')\r\n\r\nexport interface WechatPluginOptions {\r\n /** 微信支付客户端配置(未传入 client 时必填) */\r\n config?: WechatClientOptions\r\n /** 可选的已有客户端实例(指定后忽略 config) */\r\n client?: WechatClient\r\n}\r\n\r\n/** 从 vobs 插件上下文获取微信支付客户端 */\r\nexport function useWechat(): WechatClient {\r\n const client = inject(WECHAT_KEY)\r\n if (!client) {\r\n throw new Error('Vobs Payment: 找不到 WechatClient,请安装 wechatPlugin')\r\n }\r\n return client\r\n}\r\n\r\n/**\r\n * 微信支付插件\r\n *\r\n * @example\r\n * ```ts\r\n * createVobs({\r\n * plugins: [\r\n * wechatPlugin({\r\n * config: {\r\n * mchid: '1900000000',\r\n * serial: '...',\r\n * privateKey: '...',\r\n * certs: { 'PUB_KEY_ID_xxx': '...' },\r\n * appid: 'wx1234567890',\r\n * apiv3Key: '...'\r\n * }\r\n * })\r\n * ]\r\n * })\r\n * ```\r\n */\r\nexport function wechatPlugin(options: WechatPluginOptions): VobsPlugin {\r\n return {\r\n name: '@vobs/payment/wechat',\r\n version: '0.1.0',\r\n install(context: VobsContext) {\r\n if (!options.client && !options.config) {\r\n throw new Error('Vobs Payment: wechatPlugin 需要提供 config 或 client 之一')\r\n }\r\n // 仅销毁插件自建的客户端;外部传入的实例由其所有者负责生命周期。\r\n const ownClient = !options.client\r\n const client = options.client ?? new WechatClient(options.config!)\r\n context.provide(WECHAT_KEY, client)\r\n return ownClient ? () => client.dispose() : undefined\r\n }\r\n }\r\n}\r\n","import { Wechatpay } from 'wechatpay-axios-plugin'\nimport { WechatConfig } from './config'\nimport type { WechatClientOptions } from './types'\n\n/**\n * 微信支付客户端封装\n *\n * 封装官方 wechatpay-axios-plugin 的 Wechatpay 实例,提供统一的生命周期管理。\n * 可独立使用,也可通过 wechatPlugin 注册到 vobs 框架。\n *\n * @example\n * ```ts\n * const client = new WechatClient({\n * mchid: '1900000000',\n * serial: '商户API证书序列号',\n * privateKey: '-----BEGIN PRIVATE KEY-----...',\n * certs: { 'PUB_KEY_ID_xxx': '-----BEGIN PUBLIC KEY-----...' },\n * appid: 'wx1234567890',\n * apiv3Key: '32字节APIv3密钥',\n * notifyUrl: 'https://your-domain.com/wechat/notify'\n * })\n * ```\n */\nexport class WechatClient {\n readonly config: WechatConfig\n private _sdk: Wechatpay\n private _disposed = false\n\n constructor(options: WechatClientOptions) {\n this.config = new WechatConfig(options)\n this._sdk = this.createSdk(options)\n }\n\n /** 获取底层 Wechatpay 实例(链式 API:client.sdk.v3.pay.transactions.jsapi.post(...)) */\n get sdk(): Wechatpay {\n this.ensureActive()\n return this._sdk\n }\n\n /** 更新配置并重建 SDK 实例 */\n updateConfig(patch: Partial<WechatClientOptions>): void {\n this.ensureActive()\n this.config.update(patch)\n this._sdk = this.createSdk(this.config.options as WechatClientOptions)\n }\n\n /** 销毁客户端 */\n dispose(): void {\n this._disposed = true\n ;(this._sdk as any) = null\n }\n\n private createSdk(options: WechatClientOptions): Wechatpay {\n return new Wechatpay({\n mchid: options.mchid,\n serial: options.serial,\n privateKey: options.privateKey,\n certs: options.certs,\n timeout: options.timeout ?? 5000\n })\n }\n\n private ensureActive(): void {\n if (this._disposed) {\n throw new Error('WechatClient: 客户端已销毁')\n }\n }\n}\n","import type { WechatClientOptions } from './types'\n\n/**\n * 微信支付配置管理\n * 遵循 vobs 生命周期管理:可创建、可校验、可更新、可替换\n */\nexport class WechatConfig {\n private _options: WechatClientOptions\n\n constructor(options: WechatClientOptions) {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 获取完整配置 */\n get options(): Readonly<WechatClientOptions> {\n return this._options\n }\n\n /** 商户号 */\n get mchid(): string {\n return this._options.mchid\n }\n\n /** 应用 ID(公众号 / 小程序 / APP) */\n get appid(): string {\n return this._options.appid\n }\n\n /** 商户 API 证书序列号 */\n get serial(): string {\n return this._options.serial\n }\n\n /** APIv3 密钥(回调解密用) */\n get apiv3Key(): string {\n return this._options.apiv3Key\n }\n\n /** 异步通知地址 */\n get notifyUrl(): string | undefined {\n return this._options.notifyUrl\n }\n\n /** 更新配置(部分更新) */\n update(patch: Partial<WechatClientOptions>): void {\n const merged = { ...this._options, ...patch }\n this.validate(merged)\n this._options = merged\n }\n\n /** 替换配置 */\n replace(options: WechatClientOptions): void {\n this.validate(options)\n this._options = { ...options }\n }\n\n private validate(options: WechatClientOptions): void {\n if (!options.mchid) {\n throw new Error('WechatConfig: mchid 不能为空')\n }\n if (!options.serial) {\n throw new Error('WechatConfig: serial(商户 API 证书序列号)不能为空')\n }\n if (!options.privateKey) {\n throw new Error('WechatConfig: privateKey(商户 API 私钥 PEM)不能为空')\n }\n if (!options.certs || Object.keys(options.certs).length === 0) {\n throw new Error('WechatConfig: certs(平台证书/微信支付公钥 {序列号: PEM})不能为空')\n }\n if (!options.appid) {\n throw new Error('WechatConfig: appid 不能为空')\n }\n if (!options.apiv3Key) {\n throw new Error('WechatConfig: apiv3Key 不能为空')\n }\n if (options.apiv3Key.length !== 32) {\n throw new Error('WechatConfig: apiv3Key 必须为 32 字节字符串')\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,164 +1,11 @@
1
- import { Wechatpay } from 'wechatpay-axios-plugin';
2
-
3
1
  var __defProp = Object.defineProperty;
4
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
5
3
 
6
- // packages/reactivity/src/debug.ts
7
- var activeDebugHooks = null;
8
- function hasDebugHooks() {
9
- return activeDebugHooks !== null;
10
- }
11
- __name(hasDebugHooks, "hasDebugHooks");
12
- function invokeDebug(name, ...args) {
13
- return;
14
- }
15
- __name(invokeDebug, "invokeDebug");
16
-
17
- // packages/reactivity/src/owner.ts
18
- var currentOwner = null;
19
- function getCurrentOwner() {
20
- return currentOwner;
21
- }
22
- __name(getCurrentOwner, "getCurrentOwner");
23
-
24
- // packages/reactivity/src/scheduler.ts
25
- var _Scheduler = class _Scheduler {
26
- constructor() {
27
- this.dirtyEffects = /* @__PURE__ */ new Set();
28
- this.lowPriorityEffects = /* @__PURE__ */ new Set();
29
- // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。
30
- this.normalBuffer = [];
31
- this.lowBuffer = [];
32
- this.flushing = false;
33
- this.scheduled = false;
34
- this.batchDepth = 0;
35
- }
36
- schedule(effect2) {
37
- if (effect2.disposed) return;
38
- this.dirtyEffects.add(effect2);
39
- this.lowPriorityEffects.delete(effect2);
40
- this.ensureScheduled();
41
- }
42
- /** Queue an effect behind normal updates while preserving deterministic order. */
43
- scheduleLow(effect2) {
44
- if (effect2.disposed) return;
45
- if (!this.dirtyEffects.has(effect2)) this.lowPriorityEffects.add(effect2);
46
- this.ensureScheduled();
47
- }
48
- ensureScheduled() {
49
- if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {
50
- this.scheduled = true;
51
- queueMicrotask(() => {
52
- this.scheduled = false;
53
- this.flush();
54
- });
55
- }
56
- }
57
- remove(effect2) {
58
- this.dirtyEffects.delete(effect2);
59
- this.lowPriorityEffects.delete(effect2);
60
- }
61
- batch(fn) {
62
- this.batchDepth++;
63
- try {
64
- return fn();
65
- } finally {
66
- this.batchDepth--;
67
- if (this.batchDepth === 0) this.flush();
68
- }
69
- }
70
- flush() {
71
- if (this.flushing || this.batchDepth > 0) return;
72
- this.flushing = true;
73
- let rounds = 0;
74
- let firstError;
75
- let hasError = false;
76
- try {
77
- while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {
78
- if (++rounds > 100) {
79
- this.dirtyEffects.clear();
80
- this.lowPriorityEffects.clear();
81
- throw new Error("Vobs: \u54CD\u5E94\u5F0F\u66F4\u65B0\u8D85\u8FC7 100 \u8F6E\uFF0C\u53EF\u80FD\u5B58\u5728\u5FAA\u73AF\u4F9D\u8D56");
82
- }
83
- this.collectRunnable(this.dirtyEffects, this.normalBuffer);
84
- this.collectRunnable(this.lowPriorityEffects, this.lowBuffer);
85
- sortEffects(this.normalBuffer);
86
- sortEffects(this.lowBuffer);
87
- for (const effect2 of this.normalBuffer) {
88
- try {
89
- effect2.run();
90
- } catch (error) {
91
- if (!hasError) {
92
- firstError = error;
93
- hasError = true;
94
- }
95
- }
96
- }
97
- for (const effect2 of this.lowBuffer) {
98
- try {
99
- effect2.run();
100
- } catch (error) {
101
- if (!hasError) {
102
- firstError = error;
103
- hasError = true;
104
- }
105
- }
106
- }
107
- this.normalBuffer.length = 0;
108
- this.lowBuffer.length = 0;
109
- }
110
- } finally {
111
- this.normalBuffer.length = 0;
112
- this.lowBuffer.length = 0;
113
- this.flushing = false;
114
- }
115
- if (hasError) throw firstError;
116
- }
117
- /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */
118
- collectRunnable(source, target) {
119
- for (const effect2 of source) {
120
- if (!effect2.disposed) target.push(effect2);
121
- }
122
- source.clear();
123
- }
124
- };
125
- __name(_Scheduler, "Scheduler");
126
- function sortEffects(effects) {
127
- if (effects.length > 1) {
128
- effects.sort((a, b) => b.depth - a.depth || a.order - b.order);
129
- }
130
- }
131
- __name(sortEffects, "sortEffects");
132
-
133
- // packages/runtime/src/hmr.ts
134
- var globalTarget = globalThis;
135
- var hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: /* @__PURE__ */ new Map() };
136
- globalTarget.__VOBS_HMR__ = hmrGlobal;
137
-
138
- // packages/vobs/src/context.ts
139
- var ownerProviders = /* @__PURE__ */ new WeakMap();
140
- function inject(key, fallback) {
141
- const owner = getCurrentOwner();
142
- const value = owner ? injectFromOwner(owner, key) : void 0;
143
- return value === void 0 ? fallback : value;
144
- }
145
- __name(inject, "inject");
146
- function injectFromOwner(owner, key) {
147
- let current = owner;
148
- while (current) {
149
- const providers = ownerProviders.get(current);
150
- if (providers?.has(key)) return providers.get(key);
151
- current = current.parent;
152
- }
153
- return void 0;
154
- }
155
- __name(injectFromOwner, "injectFromOwner");
4
+ // packages/payment/src/wechat/plugin.ts
5
+ import { createInjectionKey, inject } from "@vobs/vobs";
156
6
 
157
- // packages/vobs/src/app.ts
158
- function createInjectionKey(description) {
159
- return Symbol(description);
160
- }
161
- __name(createInjectionKey, "createInjectionKey");
7
+ // packages/payment/src/wechat/client.ts
8
+ import { Wechatpay } from "wechatpay-axios-plugin";
162
9
 
163
10
  // packages/payment/src/wechat/config.ts
164
11
  var _WechatConfig = class _WechatConfig {
@@ -295,7 +142,9 @@ function wechatPlugin(options) {
295
142
  };
296
143
  }
297
144
  __name(wechatPlugin, "wechatPlugin");
298
-
299
- export { WECHAT_KEY, useWechat, wechatPlugin };
300
- //# sourceMappingURL=plugin.js.map
145
+ export {
146
+ WECHAT_KEY,
147
+ useWechat,
148
+ wechatPlugin
149
+ };
301
150
  //# sourceMappingURL=plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../reactivity/src/debug.ts","../../../reactivity/src/owner.ts","../../../reactivity/src/scheduler.ts","../../../runtime/src/hmr.ts","../../../vobs/src/context.ts","../../../vobs/src/app.ts","../../src/wechat/config.ts","../../src/wechat/client.ts","../../src/wechat/plugin.ts"],"names":["effect"],"mappings":"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","file":"plugin.js","sourcesContent":["import type { Effect } from './effect'\nimport type { Owner } from './owner'\nimport type { Dependency, ReadableSignal, Subscriber } from './signal'\n\nexport interface ReactivityDebugHooks {\n ownerCreated?(owner: Owner): void\n ownerNamed?(owner: Owner, name: string): void\n ownerDisposed?(owner: Owner): void\n signalCreated?(signal: ReadableSignal<unknown>, owner: Owner | null): void\n signalNamed?(signal: ReadableSignal<unknown>, name: string): void\n signalRead?(signal: ReadableSignal<unknown>, subscriber: Subscriber): void\n signalChanged?(signal: ReadableSignal<unknown>, previousValue: unknown, nextValue: unknown): void\n signalDisposed?(signal: ReadableSignal<unknown>): void\n dependencyTracked?(dependency: Dependency, subscriber: Subscriber): void\n dependencyUntracked?(dependency: Dependency, subscriber: Subscriber): void\n effectCreated?(effect: Effect, owner: Owner | null): void\n effectInvalidated?(effect: Effect): void\n effectRunStart?(effect: Effect): void\n effectRunEnd?(effect: Effect, error?: unknown, handled?: boolean): void\n effectDisposed?(effect: Effect): void\n memoCreated?(signal: ReadableSignal<unknown>, subscriber: Subscriber, owner: Owner | null): void\n memoInvalidated?(signal: ReadableSignal<unknown>): void\n flushStart?(): void\n flushEnd?(): void\n}\n\nlet activeDebugHooks: ReactivityDebugHooks | null = null\nconst signalNames = new WeakMap<object, string>()\n\nexport function setDebugHooks(hooks: ReactivityDebugHooks | null): ReactivityDebugHooks | null {\n const previous = activeDebugHooks\n activeDebugHooks = hooks\n return previous\n}\n\nexport function getDebugHooks(): ReactivityDebugHooks | null {\n return activeDebugHooks\n}\n\n/** 热路径守卫:无 hooks 时跳过 invokeDebug 调用,避免 rest 参数数组分配。 */\nexport function hasDebugHooks(): boolean {\n return activeDebugHooks !== null\n}\n\nexport function setSignalDebugName(signal: ReadableSignal<unknown>, name: string): void {\n signalNames.set(signal, name)\n invokeDebug('signalNamed', signal, name)\n}\n\nexport function getSignalDebugName(signal: ReadableSignal<unknown>): string | undefined {\n return signalNames.get(signal)\n}\n\nexport function invokeDebug<K extends keyof ReactivityDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<ReactivityDebugHooks[K]>>\n): void {\n const callback = activeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change application behavior.\n }\n}\n","import { invokeDebug, hasDebugHooks } from './debug'\n\nexport interface Owner {\n readonly id: string\n readonly parent: Owner | null\n readonly children: readonly Owner[]\n readonly depth: number\n readonly disposed: boolean\n run<T>(fn: () => T): T\n addCleanup(cleanup: () => void): void\n onDispose(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n handleError(error: unknown): boolean\n dispose(): void\n}\n\nlet currentOwner: Owner | null = null\nlet nextOwnerId = 1\nconst ownerNames = new WeakMap<Owner, string>()\n\nexport function createOwner(): Owner {\n const parent = currentOwner\n let disposed = parent?.disposed ?? false\n const children: Owner[] = []\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n\n const owner: Owner = {\n id: `owner-${nextOwnerId++}`,\n parent,\n children,\n depth: (parent?.depth ?? -1) + 1,\n\n get disposed(): boolean {\n return disposed\n },\n\n run<T>(fn: () => T): T {\n if (disposed) throw new Error('Vobs: 已销毁的 Owner 不能继续运行')\n const previous = currentOwner\n currentOwner = owner\n try {\n return fn()\n } finally {\n currentOwner = previous\n }\n },\n\n addCleanup(cleanup: () => void): void {\n if (disposed) {\n cleanup()\n return\n }\n cleanups.push(cleanup)\n },\n\n onDispose(cleanup: () => void): void {\n owner.addCleanup(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n owner.addCleanup(remove)\n return remove\n },\n\n handleError(error: unknown): boolean {\n for (const handler of [...errorHandlers].reverse()) {\n try {\n handler(error)\n return true\n } catch (handlerError) {\n return parent?.handleError(handlerError) ?? false\n }\n }\n return parent?.handleError(error) ?? false\n },\n\n dispose(): void {\n if (disposed) return\n disposed = true\n for (const child of [...children]) child.dispose()\n children.length = 0\n\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n if (parent) {\n const index = parent.children.indexOf(owner)\n if (index >= 0) (parent.children as Owner[]).splice(index, 1)\n }\n if (hasDebugHooks()) invokeDebug('ownerDisposed', owner)\n if (firstError) throw firstError\n }\n }\n\n if (parent && !parent.disposed) (parent.children as Owner[]).push(owner)\n if (hasDebugHooks()) invokeDebug('ownerCreated', owner)\n return owner\n}\n\nexport function setOwnerDebugName(owner: Owner, name: string): void {\n ownerNames.set(owner, name)\n if (hasDebugHooks()) invokeDebug('ownerNamed', owner, name)\n}\n\nexport function getOwnerDebugName(owner: Owner): string | undefined {\n return ownerNames.get(owner)\n}\n\nexport function getCurrentOwner(): Owner | null {\n return currentOwner\n}\n\n/** Re-enter an Owner for an explicitly captured asynchronous continuation. */\nexport function runWithOwner<T>(owner: Owner, fn: () => T): T {\n return owner.run(fn)\n}\n\nexport function onDispose(cleanup: () => void): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: onDispose 必须在 Owner 作用域内调用')\n owner.onDispose(cleanup)\n}\n","import type { Effect } from './effect'\nimport { hasDebugHooks, invokeDebug } from './debug'\n\nexport class Scheduler {\n private readonly dirtyEffects = new Set<Effect>()\n private readonly lowPriorityEffects = new Set<Effect>()\n // flush 不可重入(flushing 标志保证),缓冲数组可在轮次间安全复用,避免每轮分配。\n private readonly normalBuffer: Effect[] = []\n private readonly lowBuffer: Effect[] = []\n private flushing = false\n private scheduled = false\n private batchDepth = 0\n\n schedule(effect: Effect): void {\n if (effect.disposed) return\n this.dirtyEffects.add(effect)\n this.lowPriorityEffects.delete(effect)\n this.ensureScheduled()\n }\n\n /** Queue an effect behind normal updates while preserving deterministic order. */\n scheduleLow(effect: Effect): void {\n if (effect.disposed) return\n if (!this.dirtyEffects.has(effect)) this.lowPriorityEffects.add(effect)\n this.ensureScheduled()\n }\n\n private ensureScheduled(): void {\n if (this.batchDepth === 0 && !this.flushing && !this.scheduled) {\n this.scheduled = true\n queueMicrotask(() => {\n this.scheduled = false\n this.flush()\n })\n }\n }\n\n remove(effect: Effect): void {\n this.dirtyEffects.delete(effect)\n this.lowPriorityEffects.delete(effect)\n }\n\n batch<T>(fn: () => T): T {\n this.batchDepth++\n try {\n return fn()\n } finally {\n this.batchDepth--\n if (this.batchDepth === 0) this.flush()\n }\n }\n\n flush(): void {\n if (this.flushing || this.batchDepth > 0) return\n this.flushing = true\n const debugEnabled = hasDebugHooks()\n if (debugEnabled) invokeDebug('flushStart')\n let rounds = 0\n let firstError: unknown\n let hasError = false\n try {\n while (this.dirtyEffects.size > 0 || this.lowPriorityEffects.size > 0) {\n if (++rounds > 100) {\n this.dirtyEffects.clear()\n this.lowPriorityEffects.clear()\n throw new Error('Vobs: 响应式更新超过 100 轮,可能存在循环依赖')\n }\n\n // normal 先、low 后,两组分别排序:与旧的合并排序语义一致\n // (旧比较器里 low 优先级本就高于 depth),但消除了比较器内的 Set 查找。\n this.collectRunnable(this.dirtyEffects, this.normalBuffer)\n this.collectRunnable(this.lowPriorityEffects, this.lowBuffer)\n sortEffects(this.normalBuffer)\n sortEffects(this.lowBuffer)\n for (const effect of this.normalBuffer) {\n try {\n effect.run()\n } catch (error) {\n // Isolate one failed effect from the rest of the flush. Re-throw\n // the first error after all runnable effects have had a chance.\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n for (const effect of this.lowBuffer) {\n try {\n effect.run()\n } catch (error) {\n if (!hasError) {\n firstError = error\n hasError = true\n }\n }\n }\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n }\n } finally {\n this.normalBuffer.length = 0\n this.lowBuffer.length = 0\n this.flushing = false\n if (debugEnabled) invokeDebug('flushEnd')\n }\n if (hasError) throw firstError\n }\n\n /** 收集未 disposed 的 effect 并清空源集合;run() 期间新调度的 effect 留给下一轮。 */\n private collectRunnable(source: Set<Effect>, target: Effect[]): void {\n for (const effect of source) {\n if (!effect.disposed) target.push(effect)\n }\n source.clear()\n }\n}\n\n/** depth 深的先跑(子 effect 先于父),同深度按创建顺序。 */\nfunction sortEffects(effects: Effect[]): void {\n if (effects.length > 1) {\n effects.sort((a, b) => b.depth - a.depth || a.order - b.order)\n }\n}\n\nexport const scheduler = new Scheduler()\n\nexport function batch<T>(fn: () => T): T {\n return scheduler.batch(fn)\n}\n\n/** Schedule a low-priority effect explicitly. */\nexport function scheduleLow(effect: Effect): void {\n effect.scheduleLow()\n}\n","import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(_moduleId: string, nextModule: Record<string, unknown>): void {\n const modules = [...hmrGlobal.modules.values()]\n for (const module of modules) {\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) continue\n for (const instance of module.instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","import { getCurrentOwner, type Owner } from '@vobs/reactivity'\nimport type { InjectionKey, ProvideOptions } from './app'\n\nconst ownerProviders = new WeakMap<Owner, Map<InjectionKey<unknown>, unknown>>()\n\nexport function provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n const owner = getCurrentOwner()\n if (!owner) throw new Error('Vobs: provide 必须在组件或 Owner 作用域内调用')\n provideToOwner(owner, key, value, options)\n}\n\nexport function inject<T>(key: InjectionKey<T>): T | undefined\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T | undefined {\n const owner = getCurrentOwner()\n const value = owner ? injectFromOwner(owner, key) : undefined\n return value === undefined ? fallback : value\n}\n\nexport function injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = inject(key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n}\n\nexport function provideToOwner<T>(\n owner: Owner,\n key: InjectionKey<T>,\n value: T,\n options: ProvideOptions = {}\n): void {\n let providers = ownerProviders.get(owner)\n if (!providers) {\n providers = new Map<InjectionKey<unknown>, unknown>()\n ownerProviders.set(owner, providers)\n owner.onDispose(() => ownerProviders.delete(owner))\n }\n if (providers.has(key) && !options.override) {\n throw new Error(`Vobs: 注入项 ${String(key)} 已存在;如需覆盖请传入 override: true`)\n }\n providers.set(key, value)\n}\n\nexport function injectFromOwner<T>(owner: Owner, key: InjectionKey<T>): T | undefined {\n let current: Owner | null = owner\n while (current) {\n const providers = ownerProviders.get(current)\n if (providers?.has(key)) return providers.get(key) as T\n current = current.parent\n }\n return undefined\n}\n","import { createOwner, scheduler, setOwnerDebugName, type Owner } from '@vobs/reactivity'\nimport { createDOMRenderer } from '@vobs/dom'\nimport { insertBefore as insertRuntimeNode, setRenderer, type VobsFragment, type VobsRenderer } from '@vobs/runtime'\nimport { injectFromOwner, provideToOwner } from './context'\n\nexport type InjectionKey<T> = symbol & {\n readonly __vobsType?: T\n}\n\nexport interface ProvideOptions {\n override?: boolean\n}\n\nexport interface VobsPlugin {\n name: string\n version?: string\n requires?: readonly VobsPlugin[]\n optional?: readonly VobsPlugin[]\n install?: (ctx: VobsContext) => void | (() => void)\n}\n\nexport interface VobsContext {\n readonly app: VobsApp\n provide<T>(key: InjectionKey<T>, value: T, options?: ProvideOptions): void\n inject<T>(key: InjectionKey<T>): T | undefined\n injectRequired<T>(key: InjectionKey<T>, description?: string): T\n onDestroy(cleanup: () => void): void\n onError(handler: (error: unknown) => void): () => void\n}\n\nexport interface VobsConfig<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n> {\n render: () => NodeType | VobsFragment | Node | null | undefined\n renderer?: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n plugins?: VobsPlugin[]\n /** Optional application-level error observer. Observers are isolated from the app. */\n onError?: (error: unknown) => void\n}\n\nexport interface VobsApp<NodeType = Node> {\n readonly mounted: boolean\n readonly destroyed: boolean\n use(plugin: VobsPlugin): VobsApp<NodeType>\n mount(target: string | NodeType): void\n hydrate(target: string | NodeType): void\n update(): void\n destroy(): void\n}\n\nexport function createInjectionKey<T>(description: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>\n}\n\nexport function createVobs(\n config: VobsConfig<Node, Text, Element, Comment>\n): VobsApp<Node>\nexport function createVobs<\n NodeType = Node,\n TextNode extends NodeType = NodeType,\n ElementNode extends NodeType = NodeType,\n CommentNode extends NodeType = NodeType\n>(\n config: VobsConfig<NodeType, TextNode, ElementNode, CommentNode> & {\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>\n }\n): VobsApp<NodeType>\nexport function createVobs(\n config: VobsConfig<any, any, any, any>\n): VobsApp<any> {\n if (!config.render) throw new Error('createVobs: render 不能为空')\n\n const renderer = config.renderer ?? createDOMRenderer()\n const rootOwner: Owner = createOwner()\n setOwnerDebugName(rootOwner, 'App')\n const cleanups: Array<() => void> = []\n const errorHandlers = new Set<(error: unknown) => void>()\n const installed = new Set<string>()\n const installing = new Set<string>()\n let mounted = false\n let destroyed = false\n let container: any = null\n let app!: VobsApp<any>\n\n if (config.onError) {\n errorHandlers.add(config.onError)\n cleanups.push(() => errorHandlers.delete(config.onError!))\n }\n\n const context: VobsContext = {\n get app(): VobsApp<any> {\n return app\n },\n\n provide<T>(key: InjectionKey<T>, value: T, options: ProvideOptions = {}): void {\n provideToOwner(rootOwner, key, value, options)\n },\n\n inject<T>(key: InjectionKey<T>): T | undefined {\n return injectFromOwner(rootOwner, key)\n },\n\n injectRequired<T>(key: InjectionKey<T>, description?: string): T {\n const value = injectFromOwner(rootOwner, key)\n if (value === undefined) {\n throw new Error(`Vobs: 找不到必需注入项${description ? ` ${description}` : ''}`)\n }\n return value\n },\n\n onDestroy(cleanup: () => void): void {\n cleanups.push(cleanup)\n },\n\n onError(handler: (error: unknown) => void): () => void {\n errorHandlers.add(handler)\n const remove = () => errorHandlers.delete(handler)\n cleanups.push(remove)\n return remove\n }\n }\n\n function notifyError(error: unknown): void {\n for (const handler of [...errorHandlers]) {\n try {\n handler(error)\n } catch {\n // 错误处理器不能覆盖触发它的原始错误。\n }\n }\n }\n\n function installPlugin(plugin: VobsPlugin): void {\n if (installed.has(plugin.name)) return\n if (installing.has(plugin.name)) {\n throw new Error(`Vobs: 插件依赖存在循环:${plugin.name}`)\n }\n\n installing.add(plugin.name)\n try {\n for (const dependency of plugin.requires ?? []) installPlugin(dependency)\n const cleanup = plugin.install?.(context)\n if (cleanup) cleanups.push(cleanup)\n installed.add(plugin.name)\n } finally {\n installing.delete(plugin.name)\n }\n }\n\n function cleanup(clearContainer = true): unknown {\n let firstError: unknown\n for (let index = cleanups.length - 1; index >= 0; index--) {\n try {\n cleanups[index]()\n } catch (error) {\n firstError ??= error\n }\n }\n cleanups.length = 0\n\n try {\n rootOwner.dispose()\n } catch (error) {\n firstError ??= error\n }\n\n if (container && clearContainer) {\n try {\n renderer.clear(container)\n } catch (error) {\n firstError ??= error\n }\n }\n return firstError\n }\n\n function start(target: string | any, hydrating: boolean): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能挂载')\n if (mounted) return\n\n container = typeof target === 'string' ? document.querySelector(target) : target\n if (!container) throw new Error(`mount: 目标不存在: ${target}`)\n if (hydrating && !renderer.beginHydration) {\n throw new Error('Vobs: 当前渲染器不支持 Hydration')\n }\n\n setRenderer(renderer)\n try {\n if (hydrating) renderer.beginHydration?.()\n const rootNode = rootOwner.run(config.render)\n if (!hydrating) renderer.clear(container)\n if (rootNode) insertRuntimeNode(container, rootNode as any, null)\n if (hydrating) renderer.completeHydration?.()\n mounted = true\n } catch (error) {\n notifyError(error)\n const cleanupError = cleanup(!hydrating)\n destroyed = true\n throw cleanupError ?? error\n }\n }\n\n app = {\n get mounted(): boolean {\n return mounted\n },\n\n get destroyed(): boolean {\n return destroyed\n },\n\n use(plugin: VobsPlugin): VobsApp<any> {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能安装插件')\n installPlugin(plugin)\n return app\n },\n\n mount(target: string | any): void {\n start(target, false)\n },\n\n hydrate(target: string | any): void {\n start(target, true)\n },\n\n update(): void {\n if (destroyed) throw new Error('Vobs: 已销毁的应用不能更新')\n try {\n scheduler.flush()\n } catch (error) {\n notifyError(error)\n throw error\n }\n },\n\n destroy(): void {\n if (destroyed) return\n try {\n const cleanupError = cleanup()\n if (cleanupError) {\n notifyError(cleanupError)\n throw cleanupError\n }\n } finally {\n mounted = false\n destroyed = true\n }\n }\n }\n\n try {\n for (const plugin of config.plugins ?? []) app.use(plugin)\n } catch (error) {\n notifyError(error)\n cleanup()\n destroyed = true\n throw error\n }\n\n return app\n}\n","import type { WechatClientOptions } from './types'\n\n/**\n * 微信支付配置管理\n * 遵循 vobs 生命周期管理:可创建、可校验、可更新、可替换\n */\nexport class WechatConfig {\n private _options: WechatClientOptions\n\n constructor(options: WechatClientOptions) {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 获取完整配置 */\n get options(): Readonly<WechatClientOptions> {\n return this._options\n }\n\n /** 商户号 */\n get mchid(): string {\n return this._options.mchid\n }\n\n /** 应用 ID(公众号 / 小程序 / APP) */\n get appid(): string {\n return this._options.appid\n }\n\n /** 商户 API 证书序列号 */\n get serial(): string {\n return this._options.serial\n }\n\n /** APIv3 密钥(回调解密用) */\n get apiv3Key(): string {\n return this._options.apiv3Key\n }\n\n /** 异步通知地址 */\n get notifyUrl(): string | undefined {\n return this._options.notifyUrl\n }\n\n /** 更新配置(部分更新) */\n update(patch: Partial<WechatClientOptions>): void {\n const merged = { ...this._options, ...patch }\n this.validate(merged)\n this._options = merged\n }\n\n /** 替换配置 */\n replace(options: WechatClientOptions): void {\n this.validate(options)\n this._options = { ...options }\n }\n\n private validate(options: WechatClientOptions): void {\n if (!options.mchid) {\n throw new Error('WechatConfig: mchid 不能为空')\n }\n if (!options.serial) {\n throw new Error('WechatConfig: serial(商户 API 证书序列号)不能为空')\n }\n if (!options.privateKey) {\n throw new Error('WechatConfig: privateKey(商户 API 私钥 PEM)不能为空')\n }\n if (!options.certs || Object.keys(options.certs).length === 0) {\n throw new Error('WechatConfig: certs(平台证书/微信支付公钥 {序列号: PEM})不能为空')\n }\n if (!options.appid) {\n throw new Error('WechatConfig: appid 不能为空')\n }\n if (!options.apiv3Key) {\n throw new Error('WechatConfig: apiv3Key 不能为空')\n }\n if (options.apiv3Key.length !== 32) {\n throw new Error('WechatConfig: apiv3Key 必须为 32 字节字符串')\n }\n }\n}\n","import { Wechatpay } from 'wechatpay-axios-plugin'\nimport { WechatConfig } from './config'\nimport type { WechatClientOptions } from './types'\n\n/**\n * 微信支付客户端封装\n *\n * 封装官方 wechatpay-axios-plugin 的 Wechatpay 实例,提供统一的生命周期管理。\n * 可独立使用,也可通过 wechatPlugin 注册到 vobs 框架。\n *\n * @example\n * ```ts\n * const client = new WechatClient({\n * mchid: '1900000000',\n * serial: '商户API证书序列号',\n * privateKey: '-----BEGIN PRIVATE KEY-----...',\n * certs: { 'PUB_KEY_ID_xxx': '-----BEGIN PUBLIC KEY-----...' },\n * appid: 'wx1234567890',\n * apiv3Key: '32字节APIv3密钥',\n * notifyUrl: 'https://your-domain.com/wechat/notify'\n * })\n * ```\n */\nexport class WechatClient {\n readonly config: WechatConfig\n private _sdk: Wechatpay\n private _disposed = false\n\n constructor(options: WechatClientOptions) {\n this.config = new WechatConfig(options)\n this._sdk = this.createSdk(options)\n }\n\n /** 获取底层 Wechatpay 实例(链式 API:client.sdk.v3.pay.transactions.jsapi.post(...)) */\n get sdk(): Wechatpay {\n this.ensureActive()\n return this._sdk\n }\n\n /** 更新配置并重建 SDK 实例 */\n updateConfig(patch: Partial<WechatClientOptions>): void {\n this.ensureActive()\n this.config.update(patch)\n this._sdk = this.createSdk(this.config.options as WechatClientOptions)\n }\n\n /** 销毁客户端 */\n dispose(): void {\n this._disposed = true\n ;(this._sdk as any) = null\n }\n\n private createSdk(options: WechatClientOptions): Wechatpay {\n return new Wechatpay({\n mchid: options.mchid,\n serial: options.serial,\n privateKey: options.privateKey,\n certs: options.certs,\n timeout: options.timeout ?? 5000\n })\n }\n\n private ensureActive(): void {\n if (this._disposed) {\n throw new Error('WechatClient: 客户端已销毁')\n }\n }\n}\n","import { createInjectionKey, inject, type VobsContext, type VobsPlugin } from '@vobs/vobs'\r\nimport { WechatClient } from './client'\r\nimport type { WechatClientOptions } from './types'\r\n\r\nexport const WECHAT_KEY = createInjectionKey<WechatClient>('vobs.payment.wechat')\r\n\r\nexport interface WechatPluginOptions {\r\n /** 微信支付客户端配置(未传入 client 时必填) */\r\n config?: WechatClientOptions\r\n /** 可选的已有客户端实例(指定后忽略 config) */\r\n client?: WechatClient\r\n}\r\n\r\n/** 从 vobs 插件上下文获取微信支付客户端 */\r\nexport function useWechat(): WechatClient {\r\n const client = inject(WECHAT_KEY)\r\n if (!client) {\r\n throw new Error('Vobs Payment: 找不到 WechatClient,请安装 wechatPlugin')\r\n }\r\n return client\r\n}\r\n\r\n/**\r\n * 微信支付插件\r\n *\r\n * @example\r\n * ```ts\r\n * createVobs({\r\n * plugins: [\r\n * wechatPlugin({\r\n * config: {\r\n * mchid: '1900000000',\r\n * serial: '...',\r\n * privateKey: '...',\r\n * certs: { 'PUB_KEY_ID_xxx': '...' },\r\n * appid: 'wx1234567890',\r\n * apiv3Key: '...'\r\n * }\r\n * })\r\n * ]\r\n * })\r\n * ```\r\n */\r\nexport function wechatPlugin(options: WechatPluginOptions): VobsPlugin {\r\n return {\r\n name: '@vobs/payment/wechat',\r\n version: '0.1.0',\r\n install(context: VobsContext) {\r\n if (!options.client && !options.config) {\r\n throw new Error('Vobs Payment: wechatPlugin 需要提供 config 或 client 之一')\r\n }\r\n // 仅销毁插件自建的客户端;外部传入的实例由其所有者负责生命周期。\r\n const ownClient = !options.client\r\n const client = options.client ?? new WechatClient(options.config!)\r\n context.provide(WECHAT_KEY, client)\r\n return ownClient ? () => client.dispose() : undefined\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/wechat/plugin.ts","../../src/wechat/client.ts","../../src/wechat/config.ts"],"sourcesContent":["import { createInjectionKey, inject, type VobsContext, type VobsPlugin } from '@vobs/vobs'\r\nimport { WechatClient } from './client'\r\nimport type { WechatClientOptions } from './types'\r\n\r\nexport const WECHAT_KEY = createInjectionKey<WechatClient>('vobs.payment.wechat')\r\n\r\nexport interface WechatPluginOptions {\r\n /** 微信支付客户端配置(未传入 client 时必填) */\r\n config?: WechatClientOptions\r\n /** 可选的已有客户端实例(指定后忽略 config) */\r\n client?: WechatClient\r\n}\r\n\r\n/** 从 vobs 插件上下文获取微信支付客户端 */\r\nexport function useWechat(): WechatClient {\r\n const client = inject(WECHAT_KEY)\r\n if (!client) {\r\n throw new Error('Vobs Payment: 找不到 WechatClient,请安装 wechatPlugin')\r\n }\r\n return client\r\n}\r\n\r\n/**\r\n * 微信支付插件\r\n *\r\n * @example\r\n * ```ts\r\n * createVobs({\r\n * plugins: [\r\n * wechatPlugin({\r\n * config: {\r\n * mchid: '1900000000',\r\n * serial: '...',\r\n * privateKey: '...',\r\n * certs: { 'PUB_KEY_ID_xxx': '...' },\r\n * appid: 'wx1234567890',\r\n * apiv3Key: '...'\r\n * }\r\n * })\r\n * ]\r\n * })\r\n * ```\r\n */\r\nexport function wechatPlugin(options: WechatPluginOptions): VobsPlugin {\r\n return {\r\n name: '@vobs/payment/wechat',\r\n version: '0.1.0',\r\n install(context: VobsContext) {\r\n if (!options.client && !options.config) {\r\n throw new Error('Vobs Payment: wechatPlugin 需要提供 config 或 client 之一')\r\n }\r\n // 仅销毁插件自建的客户端;外部传入的实例由其所有者负责生命周期。\r\n const ownClient = !options.client\r\n const client = options.client ?? new WechatClient(options.config!)\r\n context.provide(WECHAT_KEY, client)\r\n return ownClient ? () => client.dispose() : undefined\r\n }\r\n }\r\n}\r\n","import { Wechatpay } from 'wechatpay-axios-plugin'\nimport { WechatConfig } from './config'\nimport type { WechatClientOptions } from './types'\n\n/**\n * 微信支付客户端封装\n *\n * 封装官方 wechatpay-axios-plugin 的 Wechatpay 实例,提供统一的生命周期管理。\n * 可独立使用,也可通过 wechatPlugin 注册到 vobs 框架。\n *\n * @example\n * ```ts\n * const client = new WechatClient({\n * mchid: '1900000000',\n * serial: '商户API证书序列号',\n * privateKey: '-----BEGIN PRIVATE KEY-----...',\n * certs: { 'PUB_KEY_ID_xxx': '-----BEGIN PUBLIC KEY-----...' },\n * appid: 'wx1234567890',\n * apiv3Key: '32字节APIv3密钥',\n * notifyUrl: 'https://your-domain.com/wechat/notify'\n * })\n * ```\n */\nexport class WechatClient {\n readonly config: WechatConfig\n private _sdk: Wechatpay\n private _disposed = false\n\n constructor(options: WechatClientOptions) {\n this.config = new WechatConfig(options)\n this._sdk = this.createSdk(options)\n }\n\n /** 获取底层 Wechatpay 实例(链式 API:client.sdk.v3.pay.transactions.jsapi.post(...)) */\n get sdk(): Wechatpay {\n this.ensureActive()\n return this._sdk\n }\n\n /** 更新配置并重建 SDK 实例 */\n updateConfig(patch: Partial<WechatClientOptions>): void {\n this.ensureActive()\n this.config.update(patch)\n this._sdk = this.createSdk(this.config.options as WechatClientOptions)\n }\n\n /** 销毁客户端 */\n dispose(): void {\n this._disposed = true\n ;(this._sdk as any) = null\n }\n\n private createSdk(options: WechatClientOptions): Wechatpay {\n return new Wechatpay({\n mchid: options.mchid,\n serial: options.serial,\n privateKey: options.privateKey,\n certs: options.certs,\n timeout: options.timeout ?? 5000\n })\n }\n\n private ensureActive(): void {\n if (this._disposed) {\n throw new Error('WechatClient: 客户端已销毁')\n }\n }\n}\n","import type { WechatClientOptions } from './types'\n\n/**\n * 微信支付配置管理\n * 遵循 vobs 生命周期管理:可创建、可校验、可更新、可替换\n */\nexport class WechatConfig {\n private _options: WechatClientOptions\n\n constructor(options: WechatClientOptions) {\n this.validate(options)\n this._options = { ...options }\n }\n\n /** 获取完整配置 */\n get options(): Readonly<WechatClientOptions> {\n return this._options\n }\n\n /** 商户号 */\n get mchid(): string {\n return this._options.mchid\n }\n\n /** 应用 ID(公众号 / 小程序 / APP) */\n get appid(): string {\n return this._options.appid\n }\n\n /** 商户 API 证书序列号 */\n get serial(): string {\n return this._options.serial\n }\n\n /** APIv3 密钥(回调解密用) */\n get apiv3Key(): string {\n return this._options.apiv3Key\n }\n\n /** 异步通知地址 */\n get notifyUrl(): string | undefined {\n return this._options.notifyUrl\n }\n\n /** 更新配置(部分更新) */\n update(patch: Partial<WechatClientOptions>): void {\n const merged = { ...this._options, ...patch }\n this.validate(merged)\n this._options = merged\n }\n\n /** 替换配置 */\n replace(options: WechatClientOptions): void {\n this.validate(options)\n this._options = { ...options }\n }\n\n private validate(options: WechatClientOptions): void {\n if (!options.mchid) {\n throw new Error('WechatConfig: mchid 不能为空')\n }\n if (!options.serial) {\n throw new Error('WechatConfig: serial(商户 API 证书序列号)不能为空')\n }\n if (!options.privateKey) {\n throw new Error('WechatConfig: privateKey(商户 API 私钥 PEM)不能为空')\n }\n if (!options.certs || Object.keys(options.certs).length === 0) {\n throw new Error('WechatConfig: certs(平台证书/微信支付公钥 {序列号: PEM})不能为空')\n }\n if (!options.appid) {\n throw new Error('WechatConfig: appid 不能为空')\n }\n if (!options.apiv3Key) {\n throw new Error('WechatConfig: apiv3Key 不能为空')\n }\n if (options.apiv3Key.length !== 32) {\n throw new Error('WechatConfig: apiv3Key 必须为 32 字节字符串')\n }\n }\n}\n"],"mappings":";;;;AAAA,SAAS,oBAAoB,cAAiD;;;ACA9E,SAAS,iBAAiB;;;ACMnB,IAAM,gBAAN,MAAM,cAAa;AAAA,EAGxB,YAAY,SAA8B;AACxC,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW,EAAE,GAAG,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAI,UAAyC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,QAAgB;AAClB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,QAAgB;AAClB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,SAAiB;AACnB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,WAAmB;AACrB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,YAAgC;AAClC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,OAAO,OAA2C;AAChD,UAAM,SAAS,EAAE,GAAG,KAAK,UAAU,GAAG,MAAM;AAC5C,SAAK,SAAS,MAAM;AACpB,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA,EAGA,QAAQ,SAAoC;AAC1C,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW,EAAE,GAAG,QAAQ;AAAA,EAC/B;AAAA,EAEQ,SAAS,SAAoC;AACnD,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAM,IAAI,MAAM,8CAA0B;AAAA,IAC5C;AACA,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,IAAI,MAAM,yGAAwC;AAAA,IAC1D;AACA,QAAI,CAAC,QAAQ,YAAY;AACvB,YAAM,IAAI,MAAM,+FAA6C;AAAA,IAC/D;AACA,QAAI,CAAC,QAAQ,SAAS,OAAO,KAAK,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC7D,YAAM,IAAI,MAAM,gJAAiD;AAAA,IACnE;AACA,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAM,IAAI,MAAM,8CAA0B;AAAA,IAC5C;AACA,QAAI,CAAC,QAAQ,UAAU;AACrB,YAAM,IAAI,MAAM,iDAA6B;AAAA,IAC/C;AACA,QAAI,QAAQ,SAAS,WAAW,IAAI;AAClC,YAAM,IAAI,MAAM,6EAAqC;AAAA,IACvD;AAAA,EACF;AACF;AA1E0B;AAAnB,IAAM,eAAN;;;ADiBA,IAAM,gBAAN,MAAM,cAAa;AAAA,EAKxB,YAAY,SAA8B;AAF1C,SAAQ,YAAY;AAGlB,SAAK,SAAS,IAAI,aAAa,OAAO;AACtC,SAAK,OAAO,KAAK,UAAU,OAAO;AAAA,EACpC;AAAA;AAAA,EAGA,IAAI,MAAiB;AACnB,SAAK,aAAa;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,aAAa,OAA2C;AACtD,SAAK,aAAa;AAClB,SAAK,OAAO,OAAO,KAAK;AACxB,SAAK,OAAO,KAAK,UAAU,KAAK,OAAO,OAA8B;AAAA,EACvE;AAAA;AAAA,EAGA,UAAgB;AACd,SAAK,YAAY;AAChB,IAAC,KAAK,OAAe;AAAA,EACxB;AAAA,EAEQ,UAAU,SAAyC;AACzD,WAAO,IAAI,UAAU;AAAA,MACnB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,YAAY,QAAQ;AAAA,MACpB,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ,WAAW;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA,EAEQ,eAAqB;AAC3B,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,oDAAsB;AAAA,IACxC;AAAA,EACF;AACF;AA5C0B;AAAnB,IAAM,eAAN;;;ADnBA,IAAM,aAAa,mBAAiC,qBAAqB;AAUzE,SAAS,YAA0B;AACxC,QAAM,SAAS,OAAO,UAAU;AAChC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,oFAAiD;AAAA,EACnE;AACA,SAAO;AACT;AANgB;AA6BT,SAAS,aAAa,SAA0C;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,SAAsB;AAC5B,UAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,QAAQ;AACtC,cAAM,IAAI,MAAM,uFAAoD;AAAA,MACtE;AAEA,YAAM,YAAY,CAAC,QAAQ;AAC3B,YAAM,SAAS,QAAQ,UAAU,IAAI,aAAa,QAAQ,MAAO;AACjE,cAAQ,QAAQ,YAAY,MAAM;AAClC,aAAO,YAAY,MAAM,OAAO,QAAQ,IAAI;AAAA,IAC9C;AAAA,EACF;AACF;AAfgB;","names":[]}