@cmtlyt/lingshu-toolkit 0.5.0 → 0.7.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 (211) hide show
  1. package/README.md +10 -0
  2. package/dist/665.js +1 -0
  3. package/dist/893.js +1 -0
  4. package/dist/react/index.js +1 -205
  5. package/dist/react/use-boolean/index.d.ts +2 -1
  6. package/dist/react/use-boolean/index.js +1 -16
  7. package/dist/react/use-controllable-value/index.d.ts +3 -3
  8. package/dist/react/use-controllable-value/index.js +1 -32
  9. package/dist/react/use-counter/index.d.ts +2 -2
  10. package/dist/react/use-counter/index.js +1 -49
  11. package/dist/react/use-force-update/index.d.ts +2 -1
  12. package/dist/react/use-force-update/index.js +1 -6
  13. package/dist/react/use-mount/index.d.ts +2 -1
  14. package/dist/react/use-mount/index.js +1 -16
  15. package/dist/react/use-ref-state/index.d.ts +3 -2
  16. package/dist/react/use-ref-state/index.js +1 -33
  17. package/dist/react/use-storage/index.d.ts +2 -1
  18. package/dist/react/use-storage/index.js +1 -15
  19. package/dist/react/use-title/index.d.ts +2 -2
  20. package/dist/react/use-title/index.js +1 -24
  21. package/dist/react/use-toggle/index.d.ts +4 -4
  22. package/dist/react/use-toggle/index.js +1 -26
  23. package/dist/react/use-valid-data/index.d.ts +5 -4
  24. package/dist/react/use-valid-data/index.js +1 -14
  25. package/dist/shared/allx/index.d.ts +2 -1
  26. package/dist/shared/allx/index.js +1 -44
  27. package/dist/shared/allx/types.d.ts +6 -0
  28. package/dist/shared/allx/utils.d.ts +9 -7
  29. package/dist/shared/allx/utils.js +1 -94
  30. package/dist/shared/animation/index.d.ts +3 -2
  31. package/dist/shared/animation/index.js +1 -77
  32. package/dist/shared/animation/types.d.ts +8 -0
  33. package/dist/shared/animation/utils.d.ts +3 -10
  34. package/dist/shared/animation/utils.js +1 -134
  35. package/dist/shared/api-controller/create-api.js +1 -79
  36. package/dist/shared/api-controller/index.js +1 -3
  37. package/dist/shared/api-controller/request.js +1 -66
  38. package/dist/shared/api-controller/types.d.ts +26 -27
  39. package/dist/shared/api-controller/utils.d.ts +6 -15
  40. package/dist/shared/api-controller/utils.js +1 -96
  41. package/dist/shared/condition-merge/index.d.ts +6 -6
  42. package/dist/shared/condition-merge/index.js +1 -30
  43. package/dist/shared/create-storage-handler/index.d.ts +4 -3
  44. package/dist/shared/create-storage-handler/index.js +1 -68
  45. package/dist/shared/data-handler/index.d.ts +4 -3
  46. package/dist/shared/data-handler/index.js +1 -77
  47. package/dist/shared/data-handler/tools.d.ts +6 -23
  48. package/dist/shared/data-handler/tools.js +1 -48
  49. package/dist/shared/data-handler/types.d.ts +20 -2
  50. package/dist/shared/data-mixed-manager/constants.js +1 -9
  51. package/dist/shared/data-mixed-manager/index.js +1 -226
  52. package/dist/shared/data-mixed-manager/types.d.ts +1 -2
  53. package/dist/shared/index.d.ts +2 -0
  54. package/dist/shared/index.js +1 -957
  55. package/dist/shared/lock-data/__test__/_helpers/memory-adapters.d.ts +95 -0
  56. package/dist/shared/lock-data/__test__/_helpers/memory-adapters.js +1 -0
  57. package/dist/shared/lock-data/__test__/playground.js +1 -0
  58. package/dist/shared/lock-data/adapters/authority.d.ts +40 -0
  59. package/dist/shared/lock-data/adapters/authority.js +1 -0
  60. package/dist/shared/lock-data/adapters/channel.d.ts +39 -0
  61. package/dist/shared/lock-data/adapters/channel.js +1 -0
  62. package/dist/shared/lock-data/adapters/index.d.ts +58 -0
  63. package/dist/shared/lock-data/adapters/index.js +1 -0
  64. package/dist/shared/lock-data/adapters/logger.d.ts +56 -0
  65. package/dist/shared/lock-data/adapters/logger.js +1 -0
  66. package/dist/shared/lock-data/adapters/session-store.d.ts +37 -0
  67. package/dist/shared/lock-data/adapters/session-store.js +1 -0
  68. package/dist/shared/lock-data/authority/epoch.d.ts +135 -0
  69. package/dist/shared/lock-data/authority/epoch.js +1 -0
  70. package/dist/shared/lock-data/authority/extract.d.ts +107 -0
  71. package/dist/shared/lock-data/authority/extract.js +1 -0
  72. package/dist/shared/lock-data/authority/index.d.ts +182 -0
  73. package/dist/shared/lock-data/authority/index.js +1 -0
  74. package/dist/shared/lock-data/authority/serialize.d.ts +35 -0
  75. package/dist/shared/lock-data/authority/serialize.js +1 -0
  76. package/dist/shared/lock-data/constants.d.ts +46 -0
  77. package/dist/shared/lock-data/constants.js +1 -0
  78. package/dist/shared/lock-data/core/actions-helpers.d.ts +163 -0
  79. package/dist/shared/lock-data/core/actions-helpers.js +1 -0
  80. package/dist/shared/lock-data/core/actions.d.ts +72 -0
  81. package/dist/shared/lock-data/core/actions.js +1 -0
  82. package/dist/shared/lock-data/core/draft.d.ts +64 -0
  83. package/dist/shared/lock-data/core/draft.js +1 -0
  84. package/dist/shared/lock-data/core/entry.d.ts +133 -0
  85. package/dist/shared/lock-data/core/entry.js +1 -0
  86. package/dist/shared/lock-data/core/fanout.d.ts +42 -0
  87. package/dist/shared/lock-data/core/fanout.js +1 -0
  88. package/dist/shared/lock-data/core/readonly-view.d.ts +49 -0
  89. package/dist/shared/lock-data/core/readonly-view.js +1 -0
  90. package/dist/shared/lock-data/core/registry.d.ts +282 -0
  91. package/dist/shared/lock-data/core/registry.js +1 -0
  92. package/dist/shared/lock-data/core/signal.d.ts +33 -0
  93. package/dist/shared/lock-data/core/signal.js +1 -0
  94. package/dist/shared/lock-data/drivers/broadcast-protocol.d.ts +71 -0
  95. package/dist/shared/lock-data/drivers/broadcast-protocol.js +1 -0
  96. package/dist/shared/lock-data/drivers/broadcast-state.d.ts +125 -0
  97. package/dist/shared/lock-data/drivers/broadcast-state.js +1 -0
  98. package/dist/shared/lock-data/drivers/broadcast.d.ts +36 -0
  99. package/dist/shared/lock-data/drivers/broadcast.js +1 -0
  100. package/dist/shared/lock-data/drivers/custom.d.ts +27 -0
  101. package/dist/shared/lock-data/drivers/custom.js +1 -0
  102. package/dist/shared/lock-data/drivers/index.d.ts +59 -0
  103. package/dist/shared/lock-data/drivers/index.js +1 -0
  104. package/dist/shared/lock-data/drivers/local.d.ts +86 -0
  105. package/dist/shared/lock-data/drivers/local.js +1 -0
  106. package/dist/shared/lock-data/drivers/storage-protocol.d.ts +67 -0
  107. package/dist/shared/lock-data/drivers/storage-protocol.js +1 -0
  108. package/dist/shared/lock-data/drivers/storage-state.d.ts +103 -0
  109. package/dist/shared/lock-data/drivers/storage-state.js +1 -0
  110. package/dist/shared/lock-data/drivers/storage.d.ts +71 -0
  111. package/dist/shared/lock-data/drivers/storage.js +1 -0
  112. package/dist/shared/lock-data/drivers/types.d.ts +73 -0
  113. package/dist/shared/lock-data/drivers/types.js +0 -0
  114. package/dist/shared/lock-data/drivers/web-locks.d.ts +123 -0
  115. package/dist/shared/lock-data/drivers/web-locks.js +1 -0
  116. package/dist/shared/lock-data/errors/index.d.ts +12 -0
  117. package/dist/shared/lock-data/errors/index.js +1 -0
  118. package/dist/shared/lock-data/errors/invalid-options-error.d.ts +11 -0
  119. package/dist/shared/lock-data/errors/invalid-options-error.js +1 -0
  120. package/dist/shared/lock-data/errors/lock-aborted-error.d.ts +10 -0
  121. package/dist/shared/lock-data/errors/lock-aborted-error.js +1 -0
  122. package/dist/shared/lock-data/errors/lock-disposed-error.d.ts +14 -0
  123. package/dist/shared/lock-data/errors/lock-disposed-error.js +1 -0
  124. package/dist/shared/lock-data/errors/lock-revoked-error.d.ts +10 -0
  125. package/dist/shared/lock-data/errors/lock-revoked-error.js +1 -0
  126. package/dist/shared/lock-data/errors/lock-timeout-error.d.ts +9 -0
  127. package/dist/shared/lock-data/errors/lock-timeout-error.js +1 -0
  128. package/dist/shared/lock-data/errors/readonly-mutation-error.d.ts +11 -0
  129. package/dist/shared/lock-data/errors/readonly-mutation-error.js +1 -0
  130. package/dist/shared/lock-data/index.d.ts +57 -0
  131. package/dist/shared/lock-data/index.js +1 -0
  132. package/dist/shared/lock-data/types.d.ts +347 -0
  133. package/dist/shared/lock-data/types.js +0 -0
  134. package/dist/shared/lock-data/utils/json-safe.d.ts +69 -0
  135. package/dist/shared/lock-data/utils/json-safe.js +1 -0
  136. package/dist/shared/logger/index.d.ts +2 -2
  137. package/dist/shared/logger/index.js +1 -10
  138. package/dist/shared/priority-queue/index.d.ts +45 -0
  139. package/dist/shared/priority-queue/index.js +1 -0
  140. package/dist/shared/priority-queue/types.d.ts +10 -0
  141. package/dist/shared/priority-queue/types.js +0 -0
  142. package/dist/shared/priority-queue/utils.d.ts +7 -0
  143. package/dist/shared/priority-queue/utils.js +1 -0
  144. package/dist/shared/throw-error/index.d.ts +11 -3
  145. package/dist/shared/throw-error/index.js +1 -10
  146. package/dist/shared/try-call/index.d.ts +3 -3
  147. package/dist/shared/try-call/index.js +1 -59
  148. package/dist/shared/types/index.js +1 -2
  149. package/dist/shared/types/pack.d.ts +2 -2
  150. package/dist/shared/types/pack.js +1 -1
  151. package/dist/shared/utils/base.d.ts +1 -1
  152. package/dist/shared/utils/base.js +1 -6
  153. package/dist/shared/utils/index.js +1 -2
  154. package/dist/shared/utils/verify.d.ts +1 -1
  155. package/dist/shared/utils/verify.js +1 -67
  156. package/dist/shared/with-resolvers/index.d.ts +5 -3
  157. package/dist/shared/with-resolvers/index.js +1 -15
  158. package/dist/vue/index.js +1 -29
  159. package/dist/vue/use-title/index.d.ts +2 -2
  160. package/dist/vue/use-title/index.js +1 -29
  161. package/package.json +27 -27
  162. package/dist/247.js +0 -66
  163. package/dist/707.js +0 -142
  164. package/dist/react/use-force-update/index.test.d.ts +0 -1
  165. package/dist/react/use-mount/index.test.d.ts +0 -1
  166. package/dist/react/use-ref-state/index.test.d.ts +0 -1
  167. package/dist/react/use-storage/index.test.d.ts +0 -1
  168. package/dist/react/use-title/index.test.d.ts +0 -1
  169. package/dist/react/use-toggle/index.test.d.ts +0 -1
  170. package/dist/react/use-valid-data/index.test.d.ts +0 -1
  171. package/dist/shared/allx/__test__/allsettled.test.d.ts +0 -1
  172. package/dist/shared/allx/__test__/basic.test.d.ts +0 -1
  173. package/dist/shared/allx/__test__/circular-dependency.test.d.ts +0 -1
  174. package/dist/shared/allx/__test__/dependency.test.d.ts +0 -1
  175. package/dist/shared/allx/__test__/edge-cases.test.d.ts +0 -1
  176. package/dist/shared/allx/__test__/error-handling.test.d.ts +0 -1
  177. package/dist/shared/allx/__test__/execution-order.test.d.ts +0 -1
  178. package/dist/shared/allx/__test__/falsy-values.test.d.ts +0 -1
  179. package/dist/shared/allx/__test__/performance.test.d.ts +0 -1
  180. package/dist/shared/allx/__test__/type-checking.test.d.ts +0 -1
  181. package/dist/shared/allx/__test__/use-cases.test.d.ts +0 -1
  182. package/dist/shared/animation/__test__/animation-pause-resume.test.d.ts +0 -1
  183. package/dist/shared/animation/__test__/animation.test.d.ts +0 -1
  184. package/dist/shared/animation/__test__/step-animation.test.d.ts +0 -1
  185. package/dist/shared/animation/__test__/utils.test.d.ts +0 -1
  186. package/dist/shared/api-controller/__test__/index.browser.test.d.ts +0 -1
  187. package/dist/shared/api-controller/__test__/index.node.test.d.ts +0 -1
  188. package/dist/shared/condition-merge/index.test-d.js +0 -108
  189. package/dist/shared/condition-merge/index.test.d.ts +0 -1
  190. package/dist/shared/create-storage-handler/index.browser.test.d.ts +0 -1
  191. package/dist/shared/create-storage-handler/index.test.d.ts +0 -1
  192. package/dist/shared/data-handler/index.test.d.ts +0 -1
  193. package/dist/shared/data-mixed-manager/__test__/basic.test.d.ts +0 -1
  194. package/dist/shared/data-mixed-manager/__test__/build-options.test.d.ts +0 -1
  195. package/dist/shared/data-mixed-manager/__test__/constructor-options.test.d.ts +0 -1
  196. package/dist/shared/data-mixed-manager/__test__/data-management.test.d.ts +0 -1
  197. package/dist/shared/data-mixed-manager/__test__/edge-cases.test.d.ts +0 -1
  198. package/dist/shared/data-mixed-manager/__test__/events.browser.test.d.ts +0 -1
  199. package/dist/shared/data-mixed-manager/__test__/events.test.d.ts +0 -1
  200. package/dist/shared/data-mixed-manager/__test__/fixed-slots.test.d.ts +0 -1
  201. package/dist/shared/data-mixed-manager/__test__/insert-mode.test.d.ts +0 -1
  202. package/dist/shared/throw-error/index.test.d.ts +0 -1
  203. package/dist/shared/try-call/index.test.d.ts +0 -1
  204. package/dist/shared/utils/__test__/base.test.d.ts +0 -1
  205. package/dist/shared/utils/__test__/verify.test.d.ts +0 -1
  206. package/dist/shared/with-resolvers/index.test.d.ts +0 -1
  207. package/dist/test/utils.d.ts +0 -13
  208. package/dist/vue/use-title/index.test.d.ts +0 -1
  209. /package/dist/{react/use-boolean/index.test.d.ts → shared/lock-data/__test__/index.test-d.d.ts} +0 -0
  210. /package/dist/{react/use-controllable-value/index.test.d.ts → shared/lock-data/__test__/integration/entry.test-d.d.ts} +0 -0
  211. /package/dist/{react/use-counter/index.test.d.ts → shared/lock-data/__test__/playground.d.ts} +0 -0
@@ -1,957 +1 @@
1
- import { throwType, createError, logger, $dt, throwError, getType, identity, dataHandler, $t, noop } from "../707.js";
2
- function isSymbol(_v) {
3
- return 'symbol' == typeof _v;
4
- }
5
- function isUndef(_v) {
6
- return void 0 === _v;
7
- }
8
- function isNull(_v) {
9
- return null === _v;
10
- }
11
- function isNullOrUndef(_v) {
12
- return isNull(_v) || isUndef(_v);
13
- }
14
- function verify_isNaN(_v) {
15
- return Number.isNaN(_v);
16
- }
17
- function isPlainSymbol(_v) {
18
- return isSymbol(_v) && isUndef(Symbol.keyFor(_v));
19
- }
20
- function isObject(_v) {
21
- return 'object' == typeof _v && !isNull(_v);
22
- }
23
- function isPlainObject(_v) {
24
- return isObject(_v) && !isArray(_v);
25
- }
26
- function isArray(_v) {
27
- return Array.isArray(_v);
28
- }
29
- function isEmptyArray(_v) {
30
- return isArray(_v) && 0 === _v.length;
31
- }
32
- function isString(_v) {
33
- return 'string' == typeof _v;
34
- }
35
- function isEmptyString(_v) {
36
- return isString(_v) && 0 === _v.length;
37
- }
38
- function isNumber(_v) {
39
- return 'number' == typeof _v;
40
- }
41
- function isPlainNumber(_v) {
42
- return isNumber(_v) && !verify_isNaN(_v);
43
- }
44
- function isPropertyKey(_v) {
45
- return isString(_v) || isNumber(_v) || isSymbol(_v);
46
- }
47
- function isBoolean(_v) {
48
- return 'boolean' == typeof _v;
49
- }
50
- function isTrue(_v) {
51
- return true === _v || isString(_v) && 'true' === _v.toLowerCase();
52
- }
53
- function isFalse(_v) {
54
- return false === _v || isString(_v) && 'false' === _v.toLowerCase();
55
- }
56
- function isTruthy(_v) {
57
- return !!_v;
58
- }
59
- function isFalsy(_v) {
60
- return !(verify_isNaN(_v) || _v);
61
- }
62
- function isFunction(_v) {
63
- return 'function' == typeof _v;
64
- }
65
- function isPromiseLike(_v) {
66
- return isObject(_v) && isFunction(_v.then);
67
- }
68
- function withResolvers() {
69
- return 'function' == typeof Promise.withResolvers ? Promise.withResolvers() : (()=>{
70
- const resolver = {
71
- promise: null,
72
- resolve: null,
73
- reject: null
74
- };
75
- resolver.promise = new Promise((resolve, reject)=>{
76
- resolver.resolve = resolve;
77
- resolver.reject = reject;
78
- });
79
- return resolver;
80
- })();
81
- }
82
- function detectCycle(from, to, waitingForGraph) {
83
- const visited = new Set();
84
- const queue = [
85
- to
86
- ];
87
- let head = 0;
88
- while(head < queue.length){
89
- const node = queue[head++];
90
- if (node === from) return true;
91
- if (visited.has(node)) continue;
92
- visited.add(node);
93
- const deps = waitingForGraph.get(node);
94
- if (deps) {
95
- const depsIter = deps.values();
96
- for(let dep = depsIter.next(); !dep.done; dep = depsIter.next())queue.push(dep.value);
97
- }
98
- }
99
- return false;
100
- }
101
- function getCached(results, depName, allSettled) {
102
- if (Reflect.getOwnPropertyDescriptor(results, depName)) {
103
- const cached = results[depName];
104
- if (allSettled) return 'rejected' === cached.status ? Promise.reject(cached.reason) : Promise.resolve(cached.value);
105
- return Promise.resolve(cached);
106
- }
107
- }
108
- function createDepResolver(waitingFor, resolverMap, currentTask, depName) {
109
- waitingFor.set(currentTask, (waitingFor.get(currentTask) || new Set()).add(depName));
110
- const depResolvers = resolverMap.get(depName) || withResolvers();
111
- resolverMap.set(depName, depResolvers);
112
- return depResolvers.promise.then((value)=>{
113
- waitingFor.get(currentTask)?.delete(depName);
114
- return value;
115
- }, (error)=>{
116
- waitingFor.get(currentTask)?.delete(depName);
117
- throw error;
118
- });
119
- }
120
- function cleanWaitingForGraph(waitingForGraph, depName) {
121
- waitingForGraph.forEach((deps, task)=>{
122
- deps.delete(depName);
123
- if (0 === deps.size) waitingForGraph.delete(task);
124
- });
125
- }
126
- function createDepProxy(tasks, results, options) {
127
- const resolverMap = new Map();
128
- const taskNameSet = new Set(Reflect.ownKeys(tasks));
129
- const waitingForGraph = new Map();
130
- const resolveDepFor = (depName, value)=>{
131
- const resolver = resolverMap.get(depName);
132
- if (resolver) {
133
- resolver.resolve(value);
134
- resolverMap.delete(depName);
135
- }
136
- cleanWaitingForGraph(waitingForGraph, depName);
137
- };
138
- const rejectDepFor = (depName, error)=>{
139
- const resolver = resolverMap.get(depName);
140
- if (resolver) {
141
- resolver.reject(error);
142
- resolverMap.delete(depName);
143
- }
144
- cleanWaitingForGraph(waitingForGraph, depName);
145
- };
146
- const createContextFor = (currentTask)=>new Proxy({}, {
147
- get (_, depName) {
148
- if (!taskNameSet.has(depName)) return Promise.reject(createError('allx', `Unknown task "${String(depName)}"`));
149
- const cached = getCached(results, depName, options.allSettled);
150
- if (cached) return cached;
151
- if (detectCycle(currentTask, depName, waitingForGraph)) return Promise.reject(createError('allx', `Circular dependency detected: "${String(currentTask)}" -> "${String(depName)}"`));
152
- return createDepResolver(waitingForGraph, resolverMap, currentTask, depName);
153
- }
154
- });
155
- return {
156
- taskNameSet,
157
- createContextFor,
158
- resolveDepFor,
159
- rejectDepFor
160
- };
161
- }
162
- function getValueFormatFunc(options) {
163
- if (!options) return (value, _type = 'fulfilled')=>value;
164
- if (options.allSettled) return (value, status = 'fulfilled')=>'fulfilled' === status ? {
165
- status,
166
- value
167
- } : {
168
- status,
169
- reason: value
170
- };
171
- return (value, _type = 'fulfilled')=>value;
172
- }
173
- const validInfo = $dt({
174
- allSettled: $t.boolean(false)
175
- });
176
- async function allx(tasks, options) {
177
- const validOptions = dataHandler(options || {}, validInfo, {
178
- unwrap: true
179
- });
180
- const { allSettled } = validOptions;
181
- const results = {};
182
- const depCtrl = createDepProxy(tasks, results, validOptions);
183
- const valueFormat = getValueFormatFunc(options);
184
- const promises = [];
185
- depCtrl.taskNameSet.forEach(async (taskName)=>{
186
- const taskFn = tasks[taskName];
187
- const context = {
188
- $: depCtrl.createContextFor(taskName)
189
- };
190
- const taskResolvers = withResolvers();
191
- taskResolvers.promise.then((value)=>{
192
- results[taskName] = valueFormat(value, 'fulfilled');
193
- depCtrl.resolveDepFor(taskName, value);
194
- return value;
195
- }, (error)=>{
196
- if (allSettled) results[taskName] = valueFormat(error, 'rejected');
197
- depCtrl.rejectDepFor(taskName, error);
198
- });
199
- promises.push(taskResolvers.promise);
200
- if (isPromiseLike(taskFn)) return void await taskFn.then(taskResolvers.resolve, taskResolvers.reject);
201
- if (!isFunction(taskFn)) return void taskResolvers.resolve(taskFn);
202
- try {
203
- const result = await taskFn.call(context);
204
- taskResolvers.resolve(result);
205
- } catch (error) {
206
- taskResolvers.reject(error);
207
- }
208
- });
209
- if (allSettled) return Promise.allSettled(promises).then(()=>results);
210
- return Promise.all(promises).then(()=>results);
211
- }
212
- function getNextValueHandler(from, to, valueFormatter) {
213
- const type = getType(from);
214
- const context = {
215
- progress: 0,
216
- valueFormatter
217
- };
218
- const baseNextValue = (_from, _to)=>{
219
- const { valueFormatter: formatter, progress } = context;
220
- if ('number' !== getType(_from)) return _from;
221
- return formatter(_from + (_to - _from) * progress);
222
- };
223
- const arrayHandler = (_from, _to)=>{
224
- const result = Array.from(_from, (item, idx)=>{
225
- if (Array.isArray(item)) return arrayHandler(item, _to[idx]);
226
- if ('object' === getType(item)) return objectHandler(item, _to[idx]);
227
- return baseNextValue(item, _to[idx]);
228
- });
229
- return result;
230
- };
231
- const objectHandler = (_from, _to)=>{
232
- const result = {};
233
- const keys = Reflect.ownKeys(_from);
234
- for(let i = 0; i < keys.length; i++){
235
- const key = keys[i];
236
- const fromValue = _from[key];
237
- const toValue = _to[key];
238
- if (Array.isArray(_from[key])) result[key] = arrayHandler(fromValue, toValue);
239
- else if ('object' === getType(fromValue)) result[key] = objectHandler(fromValue, toValue);
240
- else result[key] = baseNextValue(fromValue, toValue);
241
- }
242
- return result;
243
- };
244
- let nextValueHandler = baseNextValue;
245
- if ('array' === type) nextValueHandler = arrayHandler;
246
- else if ('object' === type) nextValueHandler = objectHandler;
247
- return (progress)=>{
248
- context.progress = progress;
249
- return nextValueHandler(from, to);
250
- };
251
- }
252
- function matchValid(from, to, valueParser) {
253
- const fromType = getType(from);
254
- const toType = getType(to);
255
- if (fromType !== toType) throwType('animation/stepAnimation', 'from and to must be the same type');
256
- if ('array' === fromType) {
257
- if (from.length !== to.length) throwType('animation/stepAnimation', 'from and to must be the same length');
258
- const result = [
259
- Array.from({
260
- length: from.length
261
- }),
262
- Array.from({
263
- length: to.length
264
- })
265
- ];
266
- for(let i = 0; i < from.length; i++){
267
- const [fromItem, toItem] = matchValid(from[i], to[i], valueParser);
268
- result[0][i] = fromItem;
269
- result[1][i] = toItem;
270
- }
271
- return result;
272
- }
273
- if ('object' === fromType) {
274
- const toKeys = Reflect.ownKeys(to);
275
- const fromKeys = new Set(Reflect.ownKeys(from));
276
- const result = [
277
- {},
278
- {}
279
- ];
280
- for(let i = 0; i < toKeys.length; i++){
281
- const key = toKeys[i];
282
- if (!fromKeys.has(key)) throwType('animation/stepAnimation', `from does not have this key: ${String(key)}`);
283
- const [fromItem, toItem] = matchValid(from[key], to[key], valueParser);
284
- result[0][key] = fromItem;
285
- result[1][key] = toItem;
286
- }
287
- return result;
288
- }
289
- if ('number' !== fromType) return [
290
- valueParser(from),
291
- valueParser(to)
292
- ];
293
- return [
294
- from,
295
- to
296
- ];
297
- }
298
- function createNextTick(resolvers, rcSignal) {
299
- const nextTick = (()=>{
300
- if ('function' == typeof globalThis.requestAnimationFrame) return globalThis.requestAnimationFrame;
301
- return (callback)=>setTimeout(callback, 16);
302
- })();
303
- return (callback)=>{
304
- if (rcSignal.stopSignal) return true;
305
- nextTick(()=>tryRun(callback, resolvers, (error)=>{
306
- rcSignal.stop();
307
- resolvers.reject(error);
308
- }));
309
- return false;
310
- };
311
- }
312
- async function tryRun(callback, resolvers, customErrorHandler) {
313
- return new Promise((resolve, reject)=>{
314
- const result = callback();
315
- if (result && 'function' == typeof result.then) return result.then(resolve, reject);
316
- resolve();
317
- }).catch(customErrorHandler || resolvers.reject);
318
- }
319
- function createRunningControllerSignal(startFn, options) {
320
- const { onStart, onStop, onClear } = options;
321
- const resolvers = withResolvers();
322
- const ctrl = {
323
- stopSignal: true,
324
- resolvers,
325
- stop: ()=>{
326
- ctrl.stopSignal = true;
327
- onStop();
328
- },
329
- start: ()=>{
330
- ctrl.stopSignal = false;
331
- onStart();
332
- startFn();
333
- },
334
- clear: ()=>{
335
- ctrl.stopSignal = true;
336
- onClear();
337
- resolvers.resolve(true);
338
- }
339
- };
340
- return ctrl;
341
- }
342
- const animation_validInfo = $dt({
343
- autoStart: $t.boolean(true),
344
- easing: $t["function"](()=>identity),
345
- onStart: $t["function"](()=>noop),
346
- onStop: $t["function"](()=>noop),
347
- onClear: $t["function"](()=>noop),
348
- onUpdate: $t["function"](()=>noop),
349
- onComplete: $t["function"](()=>noop),
350
- formatterValue: $t["function"](()=>identity),
351
- formatter: $t["function"](()=>identity),
352
- parser: $t["function"](()=>identity)
353
- });
354
- function* stepAnimation(from, to, step, options = {}) {
355
- if (!Number.isInteger(step) || step <= 0) throwError('stepAnimation', 'step must be a positive integer', RangeError);
356
- const validOptions = dataHandler(options, animation_validInfo, {
357
- unwrap: true
358
- });
359
- const { parser: valueParser = identity, formatterValue = identity, formatter } = validOptions;
360
- const [validFrom, validTo] = matchValid(from, to, valueParser);
361
- const getNextValue = getNextValueHandler(validFrom, validTo, formatterValue);
362
- for(let i = 0; i <= step; i++){
363
- const value = formatter(getNextValue(i / step));
364
- yield value;
365
- }
366
- }
367
- function animation(from, to, duration, options = {}) {
368
- if (duration <= 0 || !Number.isInteger(duration)) throwError('animation', 'duration must be a positive integer', RangeError);
369
- const validOptions = dataHandler(options, animation_validInfo, {
370
- unwrap: true
371
- });
372
- const [validFrom, validTo] = matchValid(from, to, validOptions.parser);
373
- const { autoStart, easing, onComplete, onUpdate, formatterValue, formatter } = validOptions;
374
- const _getNextValue = getNextValueHandler(validFrom, validTo, formatterValue);
375
- const getNextValue = (...args)=>formatter(_getNextValue(...args));
376
- let startTime = 0;
377
- let hasStarted = false;
378
- const rcSignal = createRunningControllerSignal(()=>{
379
- const now = performance.now();
380
- startTime += now;
381
- const stopFlag = nextTick(tick);
382
- if (stopFlag) {
383
- startTime -= performance.now();
384
- return;
385
- }
386
- if (!hasStarted) {
387
- onUpdate(getNextValue(0));
388
- hasStarted = true;
389
- }
390
- }, validOptions);
391
- const { resolvers } = rcSignal;
392
- const nextTick = createNextTick(resolvers, rcSignal);
393
- const tick = ()=>{
394
- const elapsed = performance.now() - startTime;
395
- const progress = easing(Math.min(elapsed / duration, 1));
396
- const value = getNextValue(progress);
397
- onUpdate(value);
398
- if (elapsed < duration) {
399
- const stopFlag = nextTick(tick);
400
- if (stopFlag) startTime = -elapsed;
401
- } else {
402
- onComplete();
403
- resolvers.resolve(false);
404
- }
405
- };
406
- if (false !== autoStart) rcSignal.start();
407
- return {
408
- promise: resolvers.promise,
409
- stop: rcSignal.stop,
410
- start: rcSignal.start,
411
- clear: rcSignal.clear
412
- };
413
- }
414
- const EMPTY = Symbol('EMPTY');
415
- function tryCallFunc(cb, onError, onFinal) {
416
- if (!isFunction(cb)) throwType('tryCallFunc', 'callback is not a function');
417
- const catchFn = (self, ctx, error)=>{
418
- if (isFunction(onError)) try {
419
- ctx.errorResult = Reflect.apply(onError, self, [
420
- error
421
- ]);
422
- } catch (err) {
423
- ctx.error = err;
424
- }
425
- else ctx.error = error;
426
- return ctx.errorResult;
427
- };
428
- const finallyFn = (self, ctx, result)=>{
429
- try {
430
- if (ctx.error !== EMPTY) throw ctx.error;
431
- } finally{
432
- if (isFunction(onFinal)) if (ctx.errorResult !== EMPTY) Reflect.apply(onFinal, self, [
433
- ctx.errorResult
434
- ]);
435
- else if (ctx.error !== EMPTY) Reflect.apply(onFinal, self, [
436
- ctx.error
437
- ]);
438
- else Reflect.apply(onFinal, self, [
439
- result
440
- ]);
441
- }
442
- };
443
- return function(...args) {
444
- const ctx = {
445
- oriResult: EMPTY,
446
- errorResult: EMPTY,
447
- error: EMPTY
448
- };
449
- const asyncFn = async ()=>{
450
- try {
451
- ctx.oriResult = Reflect.apply(cb, this, args);
452
- return ctx.oriResult;
453
- } catch (error) {
454
- return catchFn(this, ctx, error);
455
- }
456
- };
457
- const fnPromise = asyncFn().catch((error)=>catchFn(this, ctx, error));
458
- if (isPromiseLike(ctx.oriResult)) return fnPromise.then((result)=>{
459
- finallyFn(this, ctx, result);
460
- return result;
461
- });
462
- finallyFn(this, ctx, ctx.oriResult);
463
- return ctx.oriResult !== EMPTY ? ctx.oriResult : ctx.errorResult;
464
- };
465
- }
466
- function tryCall(cb, onError, onFinal) {
467
- if (!isFunction(cb)) throwType('tryCall', 'callback is not a function');
468
- return tryCallFunc(cb, onError, onFinal).call(this);
469
- }
470
- const ABSOLUTE_URL_REG = /^[a-z][a-z\d+\-.]*:/im;
471
- function isAbsUrl(url) {
472
- if (!url) return false;
473
- return ABSOLUTE_URL_REG.test(url);
474
- }
475
- function targetUrlParser(_url, _baseUrl) {
476
- if (isAbsUrl(_url)) return new URL(_url);
477
- if (!isAbsUrl(_baseUrl)) throwType('apiController.request', 'baseUrl 配置不合法, 必须是绝对路径');
478
- const baseUrl = new URL(_baseUrl);
479
- const basePath = '/' === baseUrl.pathname ? '' : baseUrl.pathname.replace(/\/$/, '');
480
- const relativePath = _url.startsWith('/') ? _url : `/${_url}`;
481
- const url = `${basePath}${relativePath}`;
482
- return new URL(url, baseUrl);
483
- }
484
- function urlParamsParser(url, params) {
485
- if (!url.includes('/:')) return url;
486
- if (!params) throwType('apiController.parseParams', 'url 中存在 params 参数, params 配置不能为空, 请使用 custom 方法调用并传递 params 配置');
487
- const urlSplit = url.split('/');
488
- const emptyKeys = [];
489
- for(let i = 1; i < urlSplit.length; ++i){
490
- if (':' !== urlSplit[i][0]) continue;
491
- const param = urlSplit[i].slice(1);
492
- const originValue = params[param];
493
- if (!(isPlainNumber(originValue) || originValue)) {
494
- emptyKeys.push(param);
495
- continue;
496
- }
497
- const paramValue = encodeURIComponent(String(originValue));
498
- urlSplit[i] = paramValue;
499
- }
500
- if (emptyKeys.length) throwType('apiController.parseParams', `params 配置中缺少 [${emptyKeys.join(', ')}] 参数`);
501
- return urlSplit.join('/');
502
- }
503
- function getBody(data, tdto) {
504
- const _body = tdto ? tdto(data) : data;
505
- const bodyType = getType(_body);
506
- switch(bodyType){
507
- case 'object':
508
- case 'array':
509
- case 'number':
510
- case 'boolean':
511
- case 'function':
512
- return JSON.stringify(_body);
513
- default:
514
- return _body;
515
- }
516
- }
517
- function instanceMemberGetter(prop, instanceObj) {
518
- return instanceObj[prop];
519
- }
520
- function createInstance(apiMap, realDefaultConfig, defaultConfig) {
521
- return {
522
- $: apiMap,
523
- $$: defaultConfig,
524
- $$r: realDefaultConfig,
525
- $updateBaseUrl (baseUrl) {
526
- if (isAbsUrl(baseUrl)) realDefaultConfig.baseUrl = baseUrl;
527
- else {
528
- const { origin } = globalThis.location || {};
529
- if (!origin) throwError('apiController.$updateBaseUrl', 'location.origin is undefined');
530
- const normalizedPath = (baseUrl || '/').startsWith('/') ? baseUrl || '' : `/${baseUrl}`;
531
- realDefaultConfig.baseUrl = `${origin}${normalizedPath}`;
532
- }
533
- }
534
- };
535
- }
536
- function getInstanceMemberOrApi(target, prop, receiver, instanceObj) {
537
- if (Reflect.getOwnPropertyDescriptor(instanceObj, prop)) return {
538
- instanceMember: instanceMemberGetter(prop, instanceObj)
539
- };
540
- const hasExactProp = isString(prop) && Reflect.has(target, prop);
541
- const isCustom = isString(prop) && prop.endsWith('Custom') && !hasExactProp;
542
- const name = isCustom ? prop.slice(0, -6) : prop;
543
- if (!Reflect.getOwnPropertyDescriptor(target, name)) return;
544
- const api = Reflect.get(target, name, receiver);
545
- if (isCustom && !isString(api.url)) return;
546
- return {
547
- api,
548
- isCustom
549
- };
550
- }
551
- function apiNamesCheck(_apiMap, isDeep = false) {
552
- const apiNames = Reflect.ownKeys(_apiMap);
553
- const warnNames = [];
554
- for(let i = 0; i < apiNames.length; i++){
555
- const name = apiNames[i];
556
- if (name.endsWith('Custom')) warnNames.push(name);
557
- if (!isString(_apiMap[name].url)) warnNames.push(...apiNamesCheck(_apiMap[name], true));
558
- }
559
- if (!isDeep && warnNames.length > 0) logger.warn('apiController.createApiWithMap', 'api 命名不应该使用 Custom 结尾, 因为这是一个内部实现的方法', warnNames);
560
- return warnNames;
561
- }
562
- async function baseRequest(config, getResponse) {
563
- const { baseUrl, url, method: _method, parser, data, tdto, tvo, onResponse, ...rest } = config;
564
- const targetUrl = targetUrlParser(url, baseUrl);
565
- const method = _method?.toUpperCase();
566
- const requestInfo = tryCall(()=>{
567
- if (isNullOrUndef(method) || 'GET' === method || 'HEAD' === method) {
568
- const queryKeys = Object.keys(data || {});
569
- for(let i = 0; i < queryKeys.length; ++i)targetUrl.searchParams.append(queryKeys[i], data[queryKeys[i]]);
570
- return new Request(targetUrl, {
571
- ...rest,
572
- method
573
- });
574
- }
575
- const body = getBody(data, tdto);
576
- return new Request(targetUrl, {
577
- ...rest,
578
- method,
579
- body
580
- });
581
- });
582
- const responseInfo = await getResponse(requestInfo);
583
- const resResult = await tryCall(()=>{
584
- if (onResponse) return onResponse(responseInfo, config);
585
- if (!parser) return responseInfo.json();
586
- if ('stream' === parser) return responseInfo.body;
587
- const responseHandler = responseInfo[parser];
588
- if (isFunction(responseHandler)) return Reflect.apply(responseHandler, responseInfo, []);
589
- throwType('apiController.responseParser', 'Invalid parser');
590
- });
591
- return tvo ? tvo(resResult) : resResult;
592
- }
593
- async function mockRequest(config) {
594
- const { onRequest, ...rest } = config;
595
- return baseRequest(config, async (requestInfo)=>{
596
- const reqResult = await (onRequest && onRequest(requestInfo, config));
597
- const responseBody = getBody(reqResult);
598
- return new Response(responseBody, {
599
- ...rest
600
- });
601
- });
602
- }
603
- async function networkRequest(config) {
604
- return baseRequest(config, fetch);
605
- }
606
- function request(config) {
607
- const url = urlParamsParser(config.url, config.params);
608
- const { requestMode, requestModeMap } = config;
609
- const customRequest = (requestModeMap || {})[requestMode || ''];
610
- if (customRequest) return customRequest({
611
- ...config,
612
- url
613
- });
614
- if ('mock' === requestMode) return mockRequest({
615
- ...config,
616
- url
617
- });
618
- return networkRequest({
619
- ...config,
620
- url
621
- });
622
- }
623
- const FROM_DEFINE = Symbol('fromDefine');
624
- function createApiWithMap(apiMap, defaultConfig) {
625
- const fromDefine = apiMap[FROM_DEFINE];
626
- delete apiMap[FROM_DEFINE];
627
- const proxyCache = Object.create(null);
628
- const realDefaultConfig = defaultConfig || {};
629
- if (!isTrue(fromDefine)) apiNamesCheck(apiMap);
630
- const instanceObj = createInstance(apiMap, realDefaultConfig, defaultConfig);
631
- const proxy = new Proxy(apiMap, {
632
- get (target, prop, receiver) {
633
- if (Reflect.getOwnPropertyDescriptor(proxyCache, prop)) return proxyCache[prop];
634
- const { instanceMember, api, isCustom = false } = getInstanceMemberOrApi(target, prop, receiver, instanceObj) || {};
635
- if (instanceMember) return instanceMember;
636
- if (!api) return;
637
- let result = null;
638
- result = isString(api.url) ? createApi({
639
- ...api,
640
- [FROM_DEFINE]: fromDefine
641
- }, realDefaultConfig, isCustom) : createApiWithMap({
642
- ...api,
643
- [FROM_DEFINE]: fromDefine
644
- }, realDefaultConfig);
645
- proxyCache[prop] = result;
646
- return result;
647
- }
648
- });
649
- return proxy;
650
- }
651
- function createApi(api, defaultConfig, custom) {
652
- const fromDefine = api[FROM_DEFINE];
653
- delete api[FROM_DEFINE];
654
- const realDefaultConfig = defaultConfig || {};
655
- if (!isString(api.url)) throwType('apiController.createApi', '入参应为 APIConfig 对象');
656
- if (api.url.includes('/:')) {
657
- if (!isTrue(fromDefine)) logger.warn('apiController.createApi', 'url 中存在 params 参数, 使用 defineApi 或 defineApiMap 定义 API 或 API map 来获取更好的类型提示');
658
- if (!isTrue(custom)) throwType('apiController.createApi', 'url 中存在 params 参数, 不支持普通请求, 转为自定义请求');
659
- }
660
- let handler = null;
661
- handler = isTrue(custom) ? (data, config)=>request({
662
- ...realDefaultConfig,
663
- ...api,
664
- ...config,
665
- url: api.url,
666
- data,
667
- oriUrl: api.url
668
- }) : (data)=>request({
669
- ...realDefaultConfig,
670
- ...api,
671
- data,
672
- oriUrl: api.url
673
- });
674
- const instanceObj = createInstance(api, realDefaultConfig, defaultConfig);
675
- if (!isAbsUrl(api.url)) instanceObj.$updateBaseUrl(realDefaultConfig.baseUrl);
676
- return new Proxy(handler, {
677
- get (target, prop, receiver) {
678
- if (Reflect.getOwnPropertyDescriptor(instanceObj, prop)) return instanceMemberGetter(prop, instanceObj);
679
- return Reflect.get(target, prop, receiver);
680
- }
681
- });
682
- }
683
- function defineApi(_api) {
684
- return {
685
- ..._api,
686
- [FROM_DEFINE]: true
687
- };
688
- }
689
- function defineApiMap(_apiMap) {
690
- apiNamesCheck(_apiMap);
691
- return {
692
- ..._apiMap,
693
- [FROM_DEFINE]: true
694
- };
695
- }
696
- function getEmpty(_v) {
697
- return Array.isArray(_v) ? [] : {};
698
- }
699
- function valueCheck(_v) {
700
- return Array.isArray(_v) || 'object' == typeof _v;
701
- }
702
- function conditionMerge(...input) {
703
- const conditionItems = (input.length > 1 ? input : input[0]).map((item)=>{
704
- let result = null;
705
- if (Array.isArray(item)) {
706
- const [condition, value, fullback] = item;
707
- result = {
708
- condition,
709
- value,
710
- fullback
711
- };
712
- } else if (Object.getOwnPropertyDescriptor(item, 'condition')) result = item;
713
- else throwType('conditionMerge', 'input must be an ConditionItem');
714
- const validValue = valueCheck(result.value);
715
- const validFullback = void 0 === result.fullback || valueCheck(result.fullback);
716
- if (!(validValue && validFullback)) throwType('conditionMerge', 'value and fullback must be an array or object');
717
- return result;
718
- });
719
- const result = getEmpty(conditionItems[0].value);
720
- const mergeFn = Array.isArray(result) ? (a1, a2)=>Reflect.apply(Array.prototype.splice.bind(a1, a1.length, 0), null, a2) : Object.assign;
721
- for(let i = 0, item = conditionItems[i]; i < conditionItems.length; item = conditionItems[++i])mergeFn(result, item.condition ? item.value : item.fullback || getEmpty(item.value));
722
- return result;
723
- }
724
- const SLOT_TYPE = {
725
- fixed: {
726
- fixedFlag: Symbol('fixed')
727
- },
728
- insert: {
729
- insertFlag: Symbol('insert')
730
- }
731
- };
732
- const data_mixed_manager_validInfo = $dt({
733
- name: $t.string('default'),
734
- fixedSlots: $t.array([]),
735
- dataList: $t.array([]),
736
- listener: $t.object({})
737
- });
738
- class DataMixedManager extends EventTarget {
739
- addEventListener(...args) {
740
- return super.addEventListener.apply(this, args);
741
- }
742
- removeEventListener(...args) {
743
- return super.removeEventListener.apply(this, args);
744
- }
745
- options;
746
- fixedSlots = new Map();
747
- dataList = [];
748
- mixedData = [];
749
- lastMixedSlotIdx = -1;
750
- prevDataLength = 0;
751
- isBatching = false;
752
- constructor(options){
753
- super();
754
- const validOptions = dataHandler(options || {}, data_mixed_manager_validInfo, {
755
- unwrap: true
756
- });
757
- const { fixedSlots, dataList, listener } = validOptions;
758
- this.options = validOptions;
759
- this.addFixedSlots(fixedSlots, {
760
- lazy: true
761
- });
762
- this.appendList(dataList);
763
- try {
764
- this.initListener(listener);
765
- } catch (error) {
766
- throwError('dataMixedManager', error.message, error.constructor);
767
- }
768
- }
769
- initListener(listener) {
770
- const listenerNames = Object.keys(listener);
771
- for(let i = 0, name = listenerNames[i], handler = listener[name]; i < listenerNames.length; name = listenerNames[++i], handler = listener[name])this.addEventListener(name, handler);
772
- }
773
- getTypeText(_type) {
774
- switch(_type){
775
- case SLOT_TYPE.fixed:
776
- return 'fixed';
777
- case SLOT_TYPE.insert:
778
- return 'insert';
779
- }
780
- }
781
- buildSlotConfig(config, type) {
782
- const typeText = this.getTypeText(config.type || type);
783
- return {
784
- ...config,
785
- type: typeText,
786
- inputPosition: config.position,
787
- insertMode: config.insertMode || 'cover'
788
- };
789
- }
790
- addFixedSlot(config, buildOptions) {
791
- const realConfig = this.reorderFixedSlots(this.buildSlotConfig(config, SLOT_TYPE.fixed));
792
- this.fixedSlots.set(realConfig.position, realConfig);
793
- this.buildMixedData(buildOptions);
794
- return realConfig.position;
795
- }
796
- reorderFixedSlots(config) {
797
- const { position: oldPosition, insertMode } = config;
798
- if (null == insertMode || 'cover' === insertMode || !this.fixedSlots.has(oldPosition)) return {
799
- ...config,
800
- inputPosition: oldPosition
801
- };
802
- const position = 'after' === insertMode ? oldPosition + 1 : oldPosition;
803
- for(let i = position + 1, preItem = this.fixedSlots.get(i - 1), currItem = this.fixedSlots.get(i); preItem; ++i, preItem = currItem, currItem = this.fixedSlots.get(i)){
804
- preItem.position = i;
805
- this.fixedSlots.set(i, preItem);
806
- }
807
- return {
808
- ...config,
809
- position,
810
- inputPosition: oldPosition
811
- };
812
- }
813
- addFixedSlots(configs, buildOptions) {
814
- if (!configs.length) return [];
815
- const positions = this.batchUpdate(()=>configs.map((config)=>this.addFixedSlot(config)));
816
- this.buildMixedData(buildOptions);
817
- return positions;
818
- }
819
- deleteFixedSlot(position, buildOptions) {
820
- this.fixedSlots.delete(position);
821
- this.buildMixedData(buildOptions);
822
- }
823
- deleteFixedSlots(positions, buildOptions) {
824
- if (!positions.length) return;
825
- this.batchUpdate(()=>positions.forEach((position)=>void this.deleteFixedSlot(position)));
826
- this.buildMixedData(buildOptions);
827
- }
828
- batchUpdate(callback) {
829
- try {
830
- this.isBatching = true;
831
- const result = callback();
832
- return result;
833
- } finally{
834
- this.isBatching = false;
835
- }
836
- }
837
- clearFixedSlots(buildOptions) {
838
- this.fixedSlots.clear();
839
- this.buildMixedData(buildOptions);
840
- }
841
- appendList(list, buildOptions) {
842
- if (!list.length) return;
843
- this.dataList.push(...list);
844
- this.buildMixedData({
845
- ...buildOptions,
846
- lazy: true === (buildOptions || {}).lazy
847
- });
848
- }
849
- clearList() {
850
- this.dataList.length = 0;
851
- this.mixedData.length = 0;
852
- this.dispatch('change', {
853
- mode: 'clear',
854
- mixedData: this.getMixedData({
855
- mode: 'rebuild'
856
- })
857
- });
858
- this.dispatch('clear');
859
- }
860
- getMixedData(buildOptions) {
861
- this.buildMixedData({
862
- ...buildOptions,
863
- lazy: false
864
- });
865
- return this.mixedData.slice();
866
- }
867
- dispatch(name, data) {
868
- const detail = {
869
- name: this.options.name,
870
- ...data
871
- };
872
- this.dispatchEvent(new CustomEvent(name, {
873
- detail
874
- }));
875
- if ("u" > typeof window) window.dispatchEvent(new CustomEvent(`[DMM]:${name}`, {
876
- detail
877
- }));
878
- }
879
- buildMixedData(buildOptions) {
880
- if (this.isBatching) return;
881
- const { lazy, mode } = buildOptions || {};
882
- if ('rebuild' === mode) {
883
- this.prevDataLength = 0;
884
- this.lastMixedSlotIdx = -1;
885
- }
886
- if (false !== lazy || this.dataList.length <= this.prevDataLength) return;
887
- let dataStartIdx = this.prevDataLength;
888
- const dataEndIdx = this.dataList.length;
889
- const newItemCount = dataEndIdx - dataStartIdx;
890
- this.prevDataLength = dataEndIdx;
891
- const isPatchMode = dataStartIdx > 0;
892
- const filteredSlots = this.sliceSlots(isPatchMode ? this.mixedData.length : this.lastMixedSlotIdx, this.mixedData.length + newItemCount);
893
- this.lastMixedSlotIdx = filteredSlots.at(-1) ?? this.lastMixedSlotIdx;
894
- let mixedStartIdx = isPatchMode ? this.mixedData.length : 0;
895
- this.mixedData.length = (isPatchMode ? newItemCount + mixedStartIdx : dataEndIdx) + filteredSlots.length;
896
- for(let fpIdx = 0, fpItem = filteredSlots[fpIdx]; dataStartIdx < dataEndIdx; ++mixedStartIdx)if (mixedStartIdx === fpItem) {
897
- const fixedSlot = this.fixedSlots.get(fpItem);
898
- this.mixedData[mixedStartIdx] = {
899
- isFixed: true,
900
- type: fixedSlot.type,
901
- data: fixedSlot.data
902
- };
903
- fpItem = filteredSlots[++fpIdx];
904
- } else {
905
- this.mixedData[mixedStartIdx] = {
906
- isFixed: false,
907
- type: 'plain',
908
- data: this.dataList[dataStartIdx]
909
- };
910
- ++dataStartIdx;
911
- }
912
- this.dispatch('change', {
913
- mode: isPatchMode ? 'patch' : 'rebuild',
914
- mixedData: this.mixedData.slice()
915
- });
916
- }
917
- sliceSlots(startIdx, endIdx = 1 / 0) {
918
- let prevItem = -2;
919
- let count = 0;
920
- return Array.from(this.fixedSlots.keys()).sort((ai, bi)=>ai - bi).filter((item)=>{
921
- if (item >= startIdx && item < endIdx + count || item - 1 === prevItem) {
922
- ++count;
923
- prevItem = item;
924
- return true;
925
- }
926
- return false;
927
- });
928
- }
929
- insertSlot(config) {
930
- const realPosition = this.addFixedSlot({
931
- ...config,
932
- type: SLOT_TYPE.insert
933
- });
934
- if (realPosition > this.mixedData.length) return realPosition;
935
- this.buildMixedData({
936
- lazy: false,
937
- mode: 'rebuild'
938
- });
939
- return realPosition;
940
- }
941
- insertSlots(configs) {
942
- if (!configs.length) return [];
943
- const positions = this.batchUpdate(()=>configs.map((config)=>this.insertSlot(config)));
944
- this.buildMixedData({
945
- lazy: false,
946
- mode: 'rebuild'
947
- });
948
- return positions;
949
- }
950
- }
951
- function dataMixedManager(options) {
952
- return new DataMixedManager(options);
953
- }
954
- Symbol('__PACK__');
955
- export { $dt, $t, createError, dataHandler, defineTransform, getType, identity, noop, throwError, throwType } from "../707.js";
956
- export { createStorageHandler } from "../247.js";
957
- export { allx, animation, conditionMerge, createApi, createApiWithMap, dataMixedManager, defineApi, defineApiMap, isArray, isBoolean, isEmptyArray, isEmptyString, isFalse, isFalsy, isFunction, isNull, isNullOrUndef, isNumber, isObject, isPlainNumber, isPlainObject, isPlainSymbol, isPromiseLike, isPropertyKey, isString, isSymbol, isTrue, isTruthy, isUndef, request, stepAnimation, tryCall, tryCallFunc, verify_isNaN as isNaN, withResolvers };
1
+ import{isEmptyArray as e,createError as t,isTrue as r,isObject as n,isPlainNumber as o,isPromiseLike as i,isNumber as a,isString as l,dataHandler as s,noop as u,$dt as d,$t as c,isNullOrUndef as h,logger as f,throwError as p,isFunction as g,isArray as m,isBoolean as y,getType as b,identity as k,throwType as v}from"../665.js";function w(){let e;return"function"==typeof Promise.withResolvers?Promise.withResolvers():((e={promise:null,resolve:null,reject:null}).promise=new Promise((t,r)=>{e.resolve=t,e.reject=r}),e)}function $(e,t){e.forEach((r,n)=>{r.delete(t),0===r.size&&e.delete(n)})}let S=d({allSettled:c.boolean(!1)});async function T(e,r){let n,o,a,l=s(r||{},S,{unwrap:!0}),{allSettled:u}=l,d={},c=(n=new Map,o=new Set(Reflect.ownKeys(e)),a=new Map,{taskNameSet:o,createContextFor:e=>new Proxy({},{get(r,i){let s;if(!o.has(i))return Promise.reject(t("allx",`Unknown task "${String(i)}"`));let u=function(e,t,r){if(Reflect.getOwnPropertyDescriptor(e,t)){let n=e[t];return r?"rejected"===n.status?Promise.reject(n.reason):Promise.resolve(n.value):Promise.resolve(n)}}(d,i,l.allSettled);return h(u)?function(e,t,r){let n=new Set,o=[t],i=0;for(;i<o.length;){let t=o[i++];if(t===e)return!0;if(n.has(t))continue;n.add(t);let a=r.get(t);if(a){let e=a.values();for(let t=e.next();!t.done;t=e.next())o.push(t.value)}}return!1}(e,i,a)?Promise.reject(t("allx",`Circular dependency detected: "${String(e)}" -> "${String(i)}"`)):(a.set(e,(a.get(e)||new Set).add(i)),s=n.get(i)||w(),n.set(i,s),s.promise.then(t=>(a.get(e)?.delete(i),t),t=>{throw a.get(e)?.delete(i),t})):u}}),resolveDepFor:(e,t)=>{let r=n.get(e);r&&(r.resolve(t),n.delete(e)),$(a,e)},rejectDepFor:(e,t)=>{let r=n.get(e);r&&(r.reject(t),n.delete(e)),$(a,e)}}),f=r?r.allSettled?(e,t="fulfilled")=>"fulfilled"===t?{status:t,value:e}:{status:t,reason:e}:(e,t="fulfilled")=>e:(e,t="fulfilled")=>e,p=[];return(c.taskNameSet.forEach(async t=>{let r=e[t],n={$:c.createContextFor(t)},o=w();if(o.promise.then(e=>(d[t]=f(e,"fulfilled"),c.resolveDepFor(t,e),e),e=>{u&&(d[t]=f(e,"rejected")),c.rejectDepFor(t,e)}),p.push(o.promise),i(r))return void await r.then(o.resolve,o.reject);if(!g(r))return void o.resolve(r);try{let e=await r.call(n);o.resolve(e)}catch(e){o.reject(e)}}),u)?Promise.allSettled(p).then(()=>d):Promise.all(p).then(()=>d)}function q(e,t,r){let n=b(e),o={progress:0,valueFormatter:r},i=(e,t)=>{let{valueFormatter:r,progress:n}=o;return"number"!==b(e)?e:r(e+(t-e)*n)},a=(e,t)=>Array.from(e,(e,r)=>Array.isArray(e)?a(e,t[r]):"object"===b(e)?l(e,t[r]):i(e,t[r])),l=(e,t)=>{let r={},n=Reflect.ownKeys(e);for(let o=0;o<n.length;o++){let s=n[o],u=e[s],d=t[s];Array.isArray(e[s])?r[s]=a(u,d):"object"===b(u)?r[s]=l(u,d):r[s]=i(u,d)}return r},s=i;return"array"===n?s=a:"object"===n&&(s=l),r=>(o.progress=r,s(e,t))}function E(e,t,r){let n=b(e);if(n!==b(t)&&v("animation/stepAnimation","from and to must be the same type"),"array"===n){e.length!==t.length&&v("animation/stepAnimation","from and to must be the same length");let n=[Array.from({length:e.length}),Array.from({length:t.length})];for(let o=0;o<e.length;o++){let[i,a]=E(e[o],t[o],r);n[0][o]=i,n[1][o]=a}return n}if("object"===n){let n=Reflect.ownKeys(t),o=new Set(Reflect.ownKeys(e)),i=[{},{}];for(let a=0;a<n.length;a++){let l=n[a];o.has(l)||v("animation/stepAnimation",`from does not have this key: ${String(l)}`);let[s,u]=E(e[l],t[l],r);i[0][l]=s,i[1][l]=u}return i}return"number"!==n?[r(e),r(t)]:[e,t]}async function A(e,t,r){return new Promise((t,r)=>{let n=e();if(i(n))return n.then(t,r);t()}).catch(r??t.reject)}let D=d({autoStart:c.boolean(!0),easing:c.function(()=>k),onStart:c.function(()=>u),onStop:c.function(()=>u),onClear:c.function(()=>u),onUpdate:c.function(()=>u),onComplete:c.function(()=>u),formatterValue:c.function(()=>k),formatter:c.function(()=>k),parser:c.function(()=>k)});function*x(e,t,r,n={}){(!Number.isInteger(r)||r<=0)&&p("stepAnimation","step must be a positive integer",RangeError);let{parser:o=k,formatterValue:i=k,formatter:a}=s(n,D,{unwrap:!0}),[l,u]=E(e,t,o),d=q(l,u,i);for(let e=0;e<=r;e++){let t=a(d(e/r));yield t}}function P(e,t,r,n={}){let o;(r<=0||!Number.isInteger(r))&&p("animation","duration must be a positive integer",RangeError);let i=s(n,D,{unwrap:!0}),[a,l]=E(e,t,i.parser),{autoStart:u,easing:d,onComplete:c,onUpdate:h,formatterValue:f,formatter:g}=i,m=q(a,l,f),y=(...e)=>g(m(...e)),b=0,k=!1,v=function(e,t){let{onStart:r,onStop:n,onClear:o}=t,i=w(),a={stopSignal:!0,resolvers:i,stop:()=>{a.stopSignal=!0,n()},start:()=>{a.stopSignal=!1,r(),e()},clear:()=>{a.stopSignal=!0,o(),i.resolve(!0)}};return a}(()=>{let e=performance.now();if(b+=e,S(T)){b-=performance.now();return}k||(h(y(0)),k=!0)},i),{resolvers:$}=v,S=(o="function"==typeof globalThis.requestAnimationFrame?globalThis.requestAnimationFrame:e=>setTimeout(e,16),e=>!!v.stopSignal||(o(()=>A(e,$,e=>{v.stop(),$.reject(e)})),!1)),T=()=>{let e=performance.now()-b;h(y(d(Math.min(e/r,1)))),e<r?S(T)&&(b=-e):(c(),$.resolve(!1))};return!1!==u&&v.start(),{promise:$.promise,stop:v.stop,start:v.start,clear:v.clear}}let R=Symbol("EMPTY");function C(e,t,r){g(e)||v("tryCallFunc","callback is not a function");let n=(e,r,n)=>{if(g(t))try{r.errorResult=Reflect.apply(t,e,[n])}catch(e){r.error=e}else r.error=n;return r.errorResult},o=(e,t,n)=>{try{if(t.error!==R)throw t.error}finally{g(r)&&Reflect.apply(r,e,t.error===R?[n]:[t.error])}};return function(...t){let r={oriResult:R,errorResult:R,error:R},a=(async()=>{try{return r.oriResult=Reflect.apply(e,this,t),r.oriResult}catch(e){return n(this,r,e)}})().catch(e=>n(this,r,e));if(i(r.oriResult))return a.then(e=>(o(this,r,e),e));let l=r.oriResult===R?r.errorResult:r.oriResult;return o(this,r,l),l}}function I(e,t,r){return g(e)||v("tryCall","callback is not a function"),C(e,t,r).call(this)}let j=/^[a-z][a-z\d+\-.]*:/imu;function L(e){return!!e&&j.test(e)}function M(e,t){let r=t?t(e):e;switch(b(r)){case"object":case"array":case"number":case"boolean":case"function":return JSON.stringify(r);default:return r}}function O(e,t,r){return{$:e,$$:r,$$r:t,$updateBaseUrl(e){if(L(e))t.baseUrl=e;else{let{origin:r}=globalThis.location||{};r||p("apiController.$updateBaseUrl","location.origin is undefined");let n=(e||"/").startsWith("/")?e||"":`/${e}`;t.baseUrl=`${r}${n}`}}}}function _(e,t=!1){let r=Reflect.ownKeys(e),n=[];for(let t=0;t<r.length;t++){let o=r[t];o.endsWith("Custom")&&n.push(o),l(e[o].url)||n.push(..._(e[o],!0))}return!t&&n.length>0&&f.warn("apiController.createApiWithMap","api 命名不应该使用 Custom 结尾, 因为这是一个内部实现的方法",n),n}async function F(e,t){let{baseUrl:r,url:n,method:o,parser:i,data:a,tdto:l,tvo:s,onResponse:u,...d}=e,c=function(e,t){if(L(e))return new URL(e);L(t)||v("apiController.request","baseUrl 配置不合法, 必须是绝对路径");let r=new URL(t),n="/"===r.pathname?"":r.pathname.replace(/\/$/u,""),o=e.startsWith("/")?e:`/${e}`;return new URL(`${n}${o}`,r)}(n,r),f=o?.toUpperCase(),p=I(()=>{if(h(f)||"GET"===f||"HEAD"===f){let e=Object.keys(a||{});for(let t=0;t<e.length;++t)c.searchParams.append(e[t],a[e[t]]);return new Request(c,{...d,method:f})}let e=M(a,l);return new Request(c,{...d,method:f,body:e})}),m=await t(p),y=await I(()=>{if(u)return u(m,e);if(!i)return m.json();if("stream"===i)return m.body;let t=m[i];if(g(t))return Reflect.apply(t,m,[]);v("apiController.responseParser","Invalid parser")});return s?s(y):y}async function N(e){let{onRequest:t,...r}=e;return F(e,async n=>new Response(M(await (t&&t(n,e))),{...r}))}async function U(e){return F(e,fetch)}function B(e){let t=function(e,t){if(!e.includes("/:"))return e;t||v("apiController.parseParams","url 中存在 params 参数, params 配置不能为空, 请使用 custom 方法调用并传递 params 配置");let r=e.split("/"),n=[];for(let e=1;e<r.length;++e){if(":"!==r[e][0])continue;let i=r[e].slice(1),a=t[i];if(!(o(a)||a)){n.push(i);continue}let l=encodeURIComponent(String(a));r[e]=l}return n.length>0&&v("apiController.parseParams",`params 配置中缺少 [${n.join(", ")}] 参数`),r.join("/")}(e.url,e.params),{requestMode:r,requestModeMap:n}=e,i=(n||{})[r||""];return i?i({...e,url:t}):"mock"===r?N({...e,url:t}):U({...e,url:t})}let z=Symbol("fromDefine");function H(e,t){let n=e[z];delete e[z];let o=Object.create(null),i=t||{};r(n)||_(e);let a=O(e,i,t);return new Proxy(e,{get(e,t,r){if(Reflect.getOwnPropertyDescriptor(o,t))return o[t];let{instanceMember:s,api:u,isCustom:d=!1}=function(e,t,r,n){if(Reflect.getOwnPropertyDescriptor(n,t))return{instanceMember:n[t]};let o=l(t)&&Reflect.has(e,t),i=l(t)&&t.endsWith("Custom")&&!o,a=i?t.slice(0,-6):t;if(!Reflect.getOwnPropertyDescriptor(e,a))return;let s=Reflect.get(e,a,r);if(!i||l(s.url))return{api:s,isCustom:i}}(e,t,r,a)||{};if(s)return s;if(!u)return;let c=null;return c=l(u.url)?V({...u,[z]:n},i,d):H({...u,[z]:n},i),o[t]=c,c}})}function V(e,t,n){let o=e[z];delete e[z];let i=t||{};l(e.url)||v("apiController.createApi","入参应为 APIConfig 对象"),e.url.includes("/:")&&(r(o)||f.warn("apiController.createApi","url 中存在 params 参数, 使用 defineApi 或 defineApiMap 定义 API 或 API map 来获取更好的类型提示"),r(n)||v("apiController.createApi","url 中存在 params 参数, 不支持普通请求, 转为自定义请求"));let a=null;a=r(n)?(t,r)=>B({...i,...e,...r,url:e.url,data:t,oriUrl:e.url}):t=>B({...i,...e,data:t,oriUrl:e.url});let s=O(e,i,t);return L(e.url)||s.$updateBaseUrl(i.baseUrl),new Proxy(a,{get:(e,t,r)=>Reflect.getOwnPropertyDescriptor(s,t)?s[t]:Reflect.get(e,t,r)})}function J(e){return{...e,[z]:!0}}function K(e){return _(e),{...e,[z]:!0}}function W(e){return Array.isArray(e)?[]:{}}function G(e){return Array.isArray(e)||"object"==typeof e}function Q(...e){let t=(1===e.length&&Array.isArray(e[0])?e[0]:e).map(e=>{let t=null;if(Array.isArray(e)){let[r,n,o]=e;t={condition:r,value:n,fullback:o}}else Object.getOwnPropertyDescriptor(e,"condition")?t=e:v("conditionMerge","input must be an ConditionItem");let r=G(t.value),n=void 0===t.fullback||G(t.fullback);return r&&n||v("conditionMerge","value and fullback must be an array or object"),t}),r=W((t[0]||{}).value),n=Array.isArray(r)?(e,t)=>Reflect.apply(Array.prototype.splice.bind(e,e.length,0),null,t):Object.assign;for(let e=0,o=t[e];e<t.length;o=t[++e])n(r,o.condition?o.value:o.fullback||W(o.value));return r}let Y={fixed:{fixedFlag:Symbol("fixed")},insert:{insertFlag:Symbol("insert")}},X=d({name:c.string("default"),fixedSlots:c.array([]),dataList:c.array([]),listener:c.object({})});class Z extends EventTarget{addEventListener(...e){super.addEventListener.apply(this,e)}removeEventListener(...e){super.removeEventListener.apply(this,e)}options;fixedSlots=new Map;dataList=[];mixedData=[];lastMixedSlotIdx=-1;prevDataLength=0;isBatching=!1;constructor(e){super();let t=s(e||{},X,{unwrap:!0}),{fixedSlots:r,dataList:n,listener:o}=t;this.options=t,this.addFixedSlots(r,{lazy:!0}),this.appendList(n);try{this.initListener(o)}catch(e){p("dataMixedManager",e.message,e.constructor)}}initListener(e){let t=Object.keys(e);for(let r=0,n=t[r],o=e[n];r<t.length;o=e[n=t[++r]])this.addEventListener(n,o)}getTypeText(e){switch(e){case Y.fixed:return"fixed";case Y.insert:return"insert"}}buildSlotConfig(e,t){let r=this.getTypeText(e.type||t);return{...e,type:r,inputPosition:e.position,insertMode:e.insertMode??"cover"}}addFixedSlot(e,t){let r=this.reorderFixedSlots(this.buildSlotConfig(e,Y.fixed));return this.fixedSlots.set(r.position,r),this.buildMixedData(t),r.position}reorderFixedSlots(e){let{position:t,insertMode:r}=e;if(h(r)||"cover"===r||!this.fixedSlots.has(t))return{...e,inputPosition:t};let n="after"===r?t+1:t;for(let e=n+1,t=this.fixedSlots.get(e-1),r=this.fixedSlots.get(e);t;++e,t=r,r=this.fixedSlots.get(e))t.position=e,this.fixedSlots.set(e,t);return{...e,position:n,inputPosition:t}}addFixedSlots(t,r){if(e(t))return[];let n=this.batchUpdate(()=>t.map(e=>this.addFixedSlot(e)));return this.buildMixedData(r),n}deleteFixedSlot(e,t){this.fixedSlots.delete(e),this.buildMixedData(t)}deleteFixedSlots(t,r){e(t)||(this.batchUpdate(()=>t.forEach(e=>void this.deleteFixedSlot(e))),this.buildMixedData(r))}batchUpdate(e){try{return this.isBatching=!0,e()}finally{this.isBatching=!1}}clearFixedSlots(e){this.fixedSlots.clear(),this.buildMixedData(e)}appendList(t,r){e(t)||(this.dataList.push(...t),this.buildMixedData({...r,lazy:!0===(r||{}).lazy}))}clearList(){this.dataList.length=0,this.mixedData.length=0,this.dispatch("change",{mode:"clear",mixedData:this.getMixedData({mode:"rebuild"})}),this.dispatch("clear")}getMixedData(e){return this.buildMixedData({...e,lazy:!1}),this.mixedData.slice()}dispatch(e,t){let r={name:this.options.name,...t};this.dispatchEvent(new CustomEvent(e,{detail:r})),void 0!==globalThis.window&&globalThis.window.dispatchEvent(new CustomEvent(`[DMM]:${e}`,{detail:r}))}buildMixedData(e){if(this.isBatching)return;let{lazy:t,mode:r}=e||{};if("rebuild"===r&&(this.prevDataLength=0,this.lastMixedSlotIdx=-1),!1!==t||this.dataList.length<=this.prevDataLength)return;let n=this.prevDataLength,o=this.dataList.length,i=o-n;this.prevDataLength=o;let a=n>0,l=this.sliceSlots(a?this.mixedData.length:this.lastMixedSlotIdx,this.mixedData.length+i);this.lastMixedSlotIdx=l.at(-1)??this.lastMixedSlotIdx;let s=a?this.mixedData.length:0;this.mixedData.length=(a?i+s:o)+l.length;for(let e=0,t=l[e];n<o;++s)if(s===t){let r=this.fixedSlots.get(t);this.mixedData[s]={isFixed:!0,type:r.type,data:r.data},t=l[++e]}else this.mixedData[s]={isFixed:!1,type:"plain",data:this.dataList[n]},++n;this.dispatch("change",{mode:a?"patch":"rebuild",mixedData:this.mixedData.slice()})}sliceSlots(e,t=1/0){let r=-2,n=0;return Array.from(this.fixedSlots.keys()).sort((e,t)=>e-t).filter(o=>(o>=e&&o<t+n||o-1===r)&&(++n,r=o,!0))}insertSlot(e){let t=this.addFixedSlot({...e,type:Y.insert});return t>this.mixedData.length||this.buildMixedData({lazy:!1,mode:"rebuild"}),t}insertSlots(t){if(e(t))return[];let r=this.batchUpdate(()=>t.map(e=>this.insertSlot(e)));return this.buildMixedData({lazy:!1,mode:"rebuild"}),r}}function ee(e){return new Z(e)}let et="@cmtlyt/lingshu-toolkit:lockData",er=Symbol("@cmtlyt/lingshu-toolkit:lockData#NEVER_TIMEOUT"),en="persistent",eo="lockData";class ei extends TypeError{constructor(e){super(e),this.name="InvalidOptionsError"}}class ea extends Error{constructor(e){super(e),this.name="LockAbortedError"}}class el extends Error{constructor(e,t){super(e,t),this.name="LockDisposedError"}}class es extends Error{constructor(e){super(e),this.name="LockRevokedError"}}class eu extends Error{constructor(e){super(e),this.name="LockTimeoutError"}}class ed extends TypeError{constructor(e){super(e),this.name="ReadonlyMutationError"}}function ec(e){if(0===e.length)return"<root>";let t="";for(let r=0;r<e.length;r++){let n=e[r];if("number"==typeof n||"string"==typeof n&&/^\d+$/u.test(n)){t+=`[${String(n)}]`;continue}t+=0===r?String(n):`.${String(n)}`}return t}function eh(e){if(void 0===e)return"undefined";if("number"==typeof e){if(Number.isNaN(e))return"NaN";if(!Number.isFinite(e))return e>0?"Infinity":"-Infinity"}let t=typeof e;if("object"!==t)return t;if(null===e)return"null";let r=Object.prototype.toString.call(e).slice(8,-1);if("Object"!==r)return r;let n=e.constructor;return n&&n!==Object&&"string"==typeof n.name&&n.name.length>0?`class instance (${n.name})`:"non-plain object"}function ef(e,t,r,n){let o;if(null===e)return;void 0===e&&p(eo,`${n} only supports JSON-safe values, got "undefined" at "${ec(t)}" (use "null" instead)`,TypeError);let i=typeof e;if("string"===i||"boolean"===i)return;if("number"===i){Number.isFinite(e)||p(eo,`${n} only supports JSON-safe values, got "${eh(e)}" at "${ec(t)}"`,TypeError);return}if("object"!==i&&p(eo,`${n} only supports JSON-safe values, got "${eh(e)}" at "${ec(t)}"`,TypeError),r.has(e)&&p(eo,`${n} detected cyclic reference at "${ec(t)}"`,TypeError),Array.isArray(e)){r.add(e);for(let o=0;o<e.length;o++)ef(e[o],[...t,o],r,n);r.delete(e);return}(o=Object.getPrototypeOf(e))!==Object.prototype&&null!==o&&p(eo,`${n} only supports JSON-safe values (plain object / array / string / number / boolean / null), got "${eh(e)}" at "${ec(t)}"`,TypeError),r.add(e),Object.getOwnPropertySymbols(e).length>0&&p(eo,`${n} only supports JSON-safe values, got symbol-keyed property at "${ec(t)}"`,TypeError);let a=Object.keys(e);for(let o=0;o<a.length;o++){let i=a[o];ef(e[i],[...t,i],r,n)}r.delete(e)}function ep(e){return JSON.parse(JSON.stringify(e))}function eg(e,t){Array.isArray(e)&&p(eo,`${t} must not return an array; lockData rejects top-level arrays (wrap in object {} instead)`,ei),ef(e,[],new WeakSet,t)}function em(){try{let e=globalThis.crypto;if(e&&"function"==typeof e.randomUUID)return e.randomUUID()}catch{}return`${Math.random().toString(36).slice(2)}-${Date.now().toString(36)}`}async function ey(e){if("persistent"===e.persistence)return{epoch:en,effectivePersistence:"persistent",authorityCleared:!1};if(!e.sessionStore)return e.logger.warn('[lockData] sessionStore adapter unavailable, persistence="session" falls back to "persistent"'),{epoch:en,effectivePersistence:"persistent",authorityCleared:!1};let t=e.sessionStore.read();if(l(t)&&t.length>0)return{epoch:t,effectivePersistence:"session",authorityCleared:!1};if(!e.channel)return e.logger.warn("[lockData] channel adapter unavailable, skip session-probe and treat as first tab"),eb(e);let r=await function(e){let{channel:t}=e;if(!t)return Promise.resolve(null);let r=em(),o=e.sessionProbeTimeout||100,i=w(),a=!1,s=t.subscribe(e=>{!a&&n(e)&&"session-reply"===e.type&&l(e.probeId)&&l(e.epoch)&&e.probeId===r&&(a=!0,i.resolve(e.epoch))}),u=setTimeout(()=>{a||(a=!0,i.resolve(null))},o);return t.postMessage({type:"session-probe",probeId:r}),i.promise.finally(()=>{clearTimeout(u),s()})}(e);return l(r)?(e.sessionStore.write(r),{epoch:r,effectivePersistence:"session",authorityCleared:!1}):eb(e)}function eb(e){let t=em();e.sessionStore&&e.sessionStore.write(t);let r=!1;if(e.authority)try{e.authority.remove(),r=!0}catch(t){e.logger.warn("[lockData] authority.remove failed during freshEpoch",t)}return{epoch:t,effectivePersistence:"session",authorityCleared:r}}function ek(e){let t;try{t=JSON.parse(e)}catch{return null}if(!n(t))return null;let r=t;return a(r.rev)&&l(r.epoch)&&Reflect.has(r,"snapshot")?{rev:r.rev,ts:a(r.ts)?r.ts:0,epoch:r.epoch,snapshot:r.snapshot}:null}function ev(e,t,r,o){if(e.disposed)return;let{host:i,logger:a,emitSync:s}=t,u=function(e,t){let r;if(!t)return null;let n=(r=/^\{"rev":(?<rev>-?\d+)/u.exec(t))?Number(r[1]):null;if(null===n){var o;let r;return o=e,!(r=ek(t))||r.rev<=o.lastAppliedRev||l(o.epoch)&&r.epoch!==o.epoch?null:{rev:r.rev,snapshot:r.snapshot}}if(n<=e.lastAppliedRev)return null;if(l(e.epoch)){let r,n=(r=/,"epoch":"(?<epoch>[^"\\]*)"/u.exec(t))?r[1]:null;if(l(n)&&n!==e.epoch)return null}let i=ek(t);return i?{rev:n,snapshot:i.snapshot}:null}({lastAppliedRev:i.lastAppliedRev,epoch:i.epoch},o);if(!u)return;if(!n(u.snapshot))return void a.warn(`[lockData] authority snapshot is not an object (source=${r}), skip apply`);let d=u.snapshot;try{i.applyRemote(d)}catch(e){a.error(`[lockData] host.applyRemote failed (source=${r}, rev=${u.rev})`,e);return}i.rev=u.rev,i.lastAppliedRev=u.rev;try{s({source:r,rev:u.rev,snapshot:ep(d)})}catch(e){a.error(`[lockData] emitSync listener threw (source=${r})`,e)}}async function ew(e,t){let{host:r,authority:o,channel:i,sessionStore:a,persistence:s,sessionProbeTimeout:u,logger:d}=t;if(e.initialized)return d.warn("[lockData] StorageAuthority.init called twice, ignore the second call"),{epoch:r.epoch||"persistent",effectivePersistence:s,authorityCleared:!1};e.initialized=!0,function(e,t){var r,o;if("session"!==t.persistence||!t.channel)return;let i=(r=t.channel,o=()=>t.host.epoch,r.subscribe(e=>{if(!(n(e)&&"session-probe"===e.type&&l(e.probeId)))return;let t=o();l(t)&&0!==t.length&&r.postMessage({type:"session-reply",probeId:e.probeId,epoch:t})}));e.unsubscribers.push(i)}(e,t);let c=await ey({persistence:s,sessionStore:a,channel:i,authority:o?{remove:()=>o.remove()}:null,sessionProbeTimeout:u,logger:d});return e.disposed||(r.epoch=c.epoch,!function(e,t){let{authority:r}=t;if(!r)return;let n=r.subscribe(r=>{ev(e,t,"storage-event",r)});e.unsubscribers.push(n)}(e,t),!function(e,t){let{authority:r}=t;if(!r||void 0===globalThis.window||"u"<typeof document)return;let n=n=>{n.persisted&&ev(e,t,"pageshow",r.read())},o=()=>{"visible"===document.visibilityState&&ev(e,t,"visibilitychange",r.read())};window.addEventListener("pageshow",n),document.addEventListener("visibilitychange",o),e.unsubscribers.push(()=>{window.removeEventListener("pageshow",n),document.removeEventListener("visibilitychange",o)})}(e,t),o&&!c.authorityCleared&&ev(e,t,"pull-on-acquire",o.read())),c}function e$(e){return a(e)&&Number.isFinite(e)}function eS(e){return`${e}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,10)}`}function eT(e){null!==e.heartbeatTimer&&(clearInterval(e.heartbeatTimer),e.heartbeatTimer=null)}function eq(e){null!==e.deadTimer&&(clearTimeout(e.deadTimer),e.deadTimer=null)}function eE(e,t){if("holding"!==e.status.kind)return;let r=e.status;if(r.released)return;r.released=!0,eT(r),e.status={kind:"idle"};let{name:n,logger:o}=e.deps;o.debug(`[${n}] broadcast driver: revoked token=${r.token} reason=${t}`);let i=r.revokeCallback;if(g(i))try{i(t)}catch(e){o.error(`[${n}] broadcast driver: revoke callback threw`,e)}eP(e)}function eA(e,t){let r={kind:"holding",token:t,grantedAt:Date.now(),released:!1,revokeCallback:null,heartbeatTimer:null};return e.status=r,r.heartbeatTimer=setInterval(()=>{r.released||e.destroyed?eT(r):e.channel.postMessage({kind:"heartbeat",senderId:e.senderId,token:r.token,ts:Date.now()})},1e3),e.channel.postMessage({kind:"heartbeat",senderId:e.senderId,token:t,ts:r.grantedAt}),function(e,t){let{name:r,logger:n}=e.deps;return{release:()=>{if("holding"!==e.status.kind||e.status.token!==t||e.status.released)return;let o=e.status;o.released=!0,eT(o),e.status={kind:"idle"},n.debug(`[${r}] broadcast driver: release token=${t}`),e.channel.postMessage({kind:"release",senderId:e.senderId,token:t}),eP(e)},onRevokedByDriver:r=>{"holding"!==e.status.kind||e.status.token!==t||e.status.released||(e.status.revokeCallback=r)}}}(e,t)}function eD(e,t,r){"remote-held"===e.status.kind&&eq(e.status);let n={kind:"remote-held",token:t,peerTs:r,lastHeartbeat:Date.now(),deadTimer:null};e.status=n,eq(n),n.deadTimer=setTimeout(()=>{!function(e,t){let{name:r,logger:n}=e.deps;"remote-held"===e.status.kind&&e.status.token===t&&(eq(e.status),n.warn(`[${r}] broadcast driver: remote holder token=${t} dead by heartbeat timeout`),e.status={kind:"idle"},eP(e))}(e,n.token)},3e3)}function ex(e,t){let r=e.pendingAnnounce;if(null===r||r.abandoned)return;r.abandoned=!0,null!==r.timer&&(clearTimeout(r.timer),r.timer=null),e.pendingAnnounce=null;let{name:n,logger:o}=e.deps;o.debug(`[${n}] broadcast driver: abandon pendingAnnounce reason=${t} token=${r.waiter.token}`),e.waiters.push(r.waiter)}function eP(e){if(e.destroyed||"idle"!==e.status.kind||0===e.waiters.length||null!==e.pendingAnnounce||null!==e.pendingForce)return;let t=e.waiters.shift();t&&eR(e,t)}function eR(e,t){let{name:r,logger:n}=e.deps;if(e.destroyed)return void n.error(`[${r}] broadcast driver: startAnnounceCampaign called after destroyed`);if("idle"!==e.status.kind||null!==e.pendingAnnounce||null!==e.pendingForce){n.error(`[${r}] broadcast driver: startAnnounceCampaign precondition violated (status=${e.status.kind}, pendingAnnounce=${null!==e.pendingAnnounce}, pendingForce=${null!==e.pendingForce})`),e.waiters.push(t);return}let o=eS("req"),i=Date.now(),a={requestId:o,ts:i,waiter:t,abandoned:!1,timer:null};e.pendingAnnounce=a,e.channel.postMessage({kind:"announce",senderId:e.senderId,requestId:o,token:t.token,ts:i,force:!1}),n.debug(`[${r}] broadcast driver: announce token=${t.token} reqId=${o}`),a.timer=setTimeout(()=>{if(a.timer=null,a.abandoned||e.destroyed)return;e.pendingAnnounce=null;let o=eA(e,t.token);n.debug(`[${r}] broadcast driver: grant token=${t.token}`),t.resolve(o)},50)}function eC(e){let{id:t,getChannel:r}=e;g(r)||p(eo,"broadcast driver requires getChannel factory",TypeError),l(t)&&0!==t.length||p(eo,"broadcast driver requires a non-empty id",TypeError);let o=r({id:t,channel:"custom"});null===o&&p(eo,"broadcast driver getChannel returned null",TypeError);let i={deps:e,channel:o,senderId:eS("sender"),status:{kind:"idle"},waiters:[],pendingAnnounce:null,pendingForce:null,destroyed:!1,unsubscribe:null};function s(e){return new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: broadcast driver destroyed (token=${e})`)}return i.unsubscribe=o.subscribe(e=>(function(e,t){if(function(e){if(!n(e)||!l(e.senderId))return!1;switch(e.kind){case"announce":return l(e.requestId)&&l(e.token)&&e$(e.ts)&&y(e.force);case"reject":return l(e.requestId)&&l(e.holderToken)&&e$(e.holderTs);case"release":return l(e.token);case"force":case"heartbeat":return l(e.token)&&e$(e.ts);default:return!1}}(t))switch(t.kind){case"announce":!function(e,t){if(t.senderId===e.senderId)return;if("holding"===e.status.kind&&!e.status.released){let r=e.status;e.channel.postMessage({kind:"reject",senderId:e.senderId,requestId:t.requestId,holderToken:r.token,holderTs:r.grantedAt});return}let r=e.pendingAnnounce;if(null!==r&&!r.abandoned){var n,o,i,a;if(n=r.ts,o=r.requestId,i=t.ts,a=t.requestId,n!==i?n<i:o<a)return;ex(e,"arbitration-loss")}}(e,t);return;case"reject":!function(e,t){if(t.senderId===e.senderId)return;if("holding"===e.status.kind&&!e.status.released&&e.status.token!==t.holderToken){let{name:r,logger:n}=e.deps;n.warn(`[${r}] broadcast driver: double-hold detected (own=${e.status.token}, remote=${t.holderToken}); revoking self`),eE(e,"force"),eD(e,t.holderToken,t.holderTs);return}let r=e.pendingAnnounce;null===r||r.abandoned||r.requestId!==t.requestId||ex(e,"rejected"),("idle"===e.status.kind||"remote-held"===e.status.kind)&&eD(e,t.holderToken,t.holderTs)}(e,t);return;case"heartbeat":!function(e,t){if(t.senderId!==e.senderId&&("holding"!==e.status.kind||e.status.token!==t.token)){if("holding"===e.status.kind&&!e.status.released){let{name:r,logger:n}=e.deps;n.warn(`[${r}] broadcast driver: double-hold detected via heartbeat (own=${e.status.token}, remote=${t.token}); revoking self`),eE(e,"force"),eD(e,t.token,t.ts);return}null===e.pendingAnnounce||e.pendingAnnounce.abandoned||ex(e,"heartbeat-detected"),eD(e,t.token,t.ts)}}(e,t);return;case"release":t.senderId!==e.senderId&&"remote-held"===e.status.kind&&e.status.token===t.token&&(eq(e.status),e.status={kind:"idle"},eP(e));return;case"force":!function(e,t){if(t.senderId===e.senderId)return;let r=e.pendingForce;if(null!==r&&!r.abandoned){var n,o,i,a;if(n=r.ts,o=r.token,i=t.ts,a=t.token,n!==i?n<i:o<a)return;!function(e,t){let r=e.pendingForce;if(null===r||r.abandoned)return;r.abandoned=!0,null!==r.timer&&(clearTimeout(r.timer),r.timer=null),e.pendingForce=null;let{name:n,logger:o}=e.deps;o.debug(`[${n}] broadcast driver: abandon pendingForce reason=${t} token=${r.token}`),e.waiters.push(r.waiter)}(e,"arbitration-loss")}"holding"!==e.status.kind||e.status.released||e.status.token===t.token||eE(e,"force"),eD(e,t.token,t.ts)}(e,t);return;default:return}})(i,e)),{acquire:e=>e.signal.aborted?Promise.reject(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire aborted (token=${e.token})`)):i.destroyed?Promise.reject(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: broadcast driver has been destroyed (token=${e.token})`)):new Promise((t,r)=>{let n=function(e,t,r,n){let o=!1,i=null;function l(){null!==i&&(clearTimeout(i),i=null),e.signal.removeEventListener("abort",u)}let s={token:e.token,resolve:e=>{o||(o=!0,l(),r(e))},reject:e=>{o||(o=!0,l(),n(e))},abort:e=>{if(!o){if(!function(e,t){for(let r=0;r<e.length;r++)if(e[r]===t)return void e.splice(r,1)}(t.waiters,s),null!==t.pendingAnnounce&&t.pendingAnnounce.waiter===s){let e=t.pendingAnnounce;e.abandoned=!0,null!==e.timer&&(clearTimeout(e.timer),e.timer=null),t.pendingAnnounce=null}if(null!==t.pendingForce&&t.pendingForce.waiter===s){let e=t.pendingForce;e.abandoned=!0,null!==e.timer&&(clearTimeout(e.timer),e.timer=null),t.pendingForce=null}s.reject(e),eP(t)}}};function u(){s.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire aborted (token=${e.token})`))}if(e.signal.aborted)return queueMicrotask(()=>u()),s;if(e.signal.addEventListener("abort",u,{once:!0}),a(e.acquireTimeout)&&e.acquireTimeout>0){let t=e.acquireTimeout;i=setTimeout(()=>{s.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${t}ms (token=${e.token})`))},t)}return s}(e,i,t,r);if(e.force)return void function(e,t){let{name:r,logger:n}=e.deps;if(e.destroyed)return n.error(`[${r}] broadcast driver: startForceCampaign called after destroyed`);"holding"!==e.status.kind||e.status.released||eE(e,"force");let o=Date.now(),i={token:t.token,ts:o,waiter:t,abandoned:!1,timer:null};e.pendingForce=i,e.channel.postMessage({kind:"force",senderId:e.senderId,token:t.token,ts:o}),n.debug(`[${r}] broadcast driver: force-announce token=${t.token} ts=${o}`),i.timer=setTimeout(()=>{if(i.timer=null,i.abandoned||e.destroyed)return;e.pendingForce=null;let o=eA(e,t.token);n.debug(`[${r}] broadcast driver: grant (force) token=${t.token}`),t.resolve(o)},50)}(i,n);if("idle"===i.status.kind&&null===i.pendingAnnounce&&null===i.pendingForce)return void eR(i,n);i.waiters.push(n);let{name:o,logger:l}=i.deps;l.debug(`[${o}] broadcast driver: enqueue token=${e.token}, queue=${i.waiters.length}, status=${i.status.kind}`)}),destroy:()=>{i.destroyed||(i.destroyed=!0,function(e,t){let{deps:r,waiters:n}=e,{name:o,logger:i}=r;i.debug(`[${o}] broadcast driver: destroy (waiters=${n.length}, status=${e.status.kind}, pendingAnnounce=${null!==e.pendingAnnounce}, pendingForce=${null!==e.pendingForce})`);let a=[];if(null!==e.pendingAnnounce){let{pendingAnnounce:t}=e;t.abandoned=!0,null!==t.timer&&clearTimeout(t.timer),e.pendingAnnounce=null,a.push(t.waiter)}if(null!==e.pendingForce){let{pendingForce:t}=e;t.abandoned=!0,null!==t.timer&&clearTimeout(t.timer),e.pendingForce=null,a.push(t.waiter)}for(let e=0;e<n.length;e++)a.push(n[e]);if(n.length=0,"holding"===e.status.kind){let t=e.status;eT(t),t.released=!0;try{e.channel.postMessage({kind:"release",senderId:e.senderId,token:t.token})}catch(e){i.error(`[${o}] broadcast driver: release broadcast failed during destroy`,e)}}else"remote-held"===e.status.kind&&eq(e.status);e.status={kind:"idle"};for(let e=0;e<a.length;e++)a[e].abort(t(a[e].token));if(null!==e.unsubscribe){try{e.unsubscribe()}catch(e){i.error(`[${o}] broadcast driver: unsubscribe threw`,e)}e.unsubscribe=null}try{e.channel.close()}catch(e){i.error(`[${o}] broadcast driver: channel.close threw`,e)}}(i,s))}}}function eI(e,t,r){let{name:n,logger:o}=e,i=null,a=null;return{handle:{release:()=>{let{holder:i}=e;i&&i.token===t&&!i.released&&(i.released=!0,e.holder=null,o.debug(`[${n}] local driver: release by token=${t}`),r())},onRevokedByDriver:e=>{if(i=e,null!==a)try{i(a)}catch(e){o.error(`[${n}] local driver: revoke callback threw`,e)}}},notifyRevoke:e=>{if(a=e,g(i))try{i(e)}catch(e){o.error(`[${n}] local driver: revoke callback threw`,e)}}}}function ej(e){let{name:t,logger:r,waiters:n}=e;if(e.holder||0===n.length)return;let o=n.shift();if(!o)return;let{handle:i,notifyRevoke:a}=eI(e,o.token,()=>ej(e));e.holder={token:o.token,notifyRevoke:a,released:!1},r.debug(`[${t}] local driver: grant token=${o.token}`),o.resolve(i)}async function eL(e,t){let{name:r,logger:n}=e;if(e.destroyed&&p(eo,"local driver has been destroyed",ea),t.signal.aborted&&p(eo,`acquire aborted before start (token=${t.token})`,ea),t.force)return function(e,t){let{name:r,logger:n}=e;if(e.holder){let o=e.holder;o.released=!0,e.holder=null,n.debug(`[${r}] local driver: force-seize from token=${o.token} by token=${t}`),o.notifyRevoke("force")}let{handle:o,notifyRevoke:i}=eI(e,t,()=>ej(e));return e.holder={token:t,notifyRevoke:i,released:!1},n.debug(`[${r}] local driver: grant (force) token=${t}`),o}(e,t.token);if(!e.holder){let{handle:o,notifyRevoke:i}=eI(e,t.token,()=>ej(e));return e.holder={token:t.token,notifyRevoke:i,released:!1},n.debug(`[${r}] local driver: grant (fast-path) token=${t.token}`),o}return function(e,t){let{name:r,logger:n,waiters:o}=e;return new Promise((e,i)=>{let l=!1,s=null;function u(){null!==s&&(clearTimeout(s),s=null),t.signal.removeEventListener("abort",c)}let d={token:t.token,resolve:t=>{l||(l=!0,u(),e(t))},reject:e=>{l||(l=!0,u(),i(e))},abort:e=>{l||(!function(e,t){for(let r=0;r<e.length;r++)if(e[r]===t)return void e.splice(r,1)}(o,d),d.reject(e))}};function c(){d.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire aborted (token=${t.token})`))}if(a(t.acquireTimeout)&&t.acquireTimeout>0){let e=t.acquireTimeout;s=setTimeout(()=>{d.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${e}ms (token=${t.token})`))},e)}t.signal.addEventListener("abort",c,{once:!0}),o.push(d),n.debug(`[${r}] local driver: enqueue token=${t.token}, queue size=${o.length}`)})}(e,t)}let eM={holder:null,queue:[],rev:0};function eO(e){return a(e)&&Number.isFinite(e)}function e_(){return Math.floor(20*Math.random())}function eF(e){return Date.now()-e.heartbeat>2500}function eN(e){let t,{storage:r,key:o,deps:i}=e;try{t=r.getItem(o)}catch(e){return i.logger.warn(`[${i.name}] storage driver: getItem failed at key=${o}`,e),eM}if(null===t||""===t)return eM;try{let e=JSON.parse(t);if(function(e){var t,r;if(!n(e)||!eO(e.rev)||!m(e.queue))return!1;for(let r=0;r<e.queue.length;r++)if(!(n(t=e.queue[r])&&l(t.token)&&eO(t.ts)))return!1;return null===e.holder||!!(n(r=e.holder)&&l(r.token)&&eO(r.heartbeat)&&l(r.nonce))}(e))return e;return i.logger.warn(`[${i.name}] storage driver: malformed value at key=${o}; treating as empty`),eM}catch(e){return i.logger.warn(`[${i.name}] storage driver: JSON.parse failed at key=${o}`,e),eM}}function eU(e,t){let{storage:r,key:n,deps:o}=e;try{return r.setItem(n,JSON.stringify(t)),"success"}catch(e){return o.logger.warn(`[${o.name}] storage driver: setItem failed`,e),"abort"}}function eB(e,t,r){return new Promise(n=>{let o=0,i=()=>{let a=function(e,t,r){if(e.destroyed)return"abort";let n=eN(e),{holder:o,queue:i}=n;if(null!==o&&!eF(o)&&!r||!r&&i.length>0&&i[0].token!==t)return"cannot-acquire";let a=`n_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,10)}`,l=Date.now(),s=i.filter(e=>e.token!==t);if("abort"===eU(e,{holder:{token:t,heartbeat:l,nonce:a},queue:s,rev:n.rev+1}))return"abort";let u=eN(e);return null===u.holder||u.holder.token!==t||u.holder.nonce!==a?"retry":{token:t,nonce:a}}(e,t,r);"abort"===a||"cannot-acquire"===a?n(null):"retry"!==a?n(a):++o>=3?n(null):setTimeout(i,e_())};i()})}function ez(e){null!==e.heartbeatTimer&&(clearInterval(e.heartbeatTimer),e.heartbeatTimer=null)}function eH(e,t){if("holding"!==e.status.kind)return;let r=e.status;if(r.released)return;r.released=!0,ez(r),e.status={kind:"idle"};let{name:n,logger:o}=e.deps;o.debug(`[${n}] storage driver: revoked token=${r.token} reason=${t}`);let i=r.revokeCallback;if(g(i))try{i(t)}catch(e){o.error(`[${n}] storage driver: revoke callback threw`,e)}eJ(e)}function eV(e,t){for(let r=0;r<e.length;r++)if(e[r]===t)return void e.splice(r,1)}function eJ(e){if(e.destroyed||e.pumping||"idle"!==e.status.kind||0===e.waiters.length)return;let[t]=e.waiters;e.pumping=!0,eB(e,t.token,!1).then(r=>{if(e.pumping=!1,null===r)return;if(e.destroyed){eK(e,t.token,r.nonce),eV(e.waiters,t);return}if("idle"!==e.status.kind)return void eK(e,t.token,r.nonce);let[n]=e.waiters;if(n!==t)return void eK(e,t.token,r.nonce);if(t.isSettled()){e.waiters.shift(),eK(e,t.token,r.nonce);return}e.waiters.shift();let o=eW(e,t.token,r.nonce);e.deps.logger.debug(`[${e.deps.name}] storage driver: grant token=${t.token}`),t.resolve(o)})}function eK(e,t,r){let n=eN(e);null===n.holder||n.holder.token!==t||n.holder.nonce!==r||eU(e,{holder:null,queue:n.queue,rev:n.rev+1})}function eW(e,t,r){let n={kind:"holding",token:t,nonce:r,released:!1,revokeCallback:null,heartbeatTimer:null};return e.status=n,n.heartbeatTimer=setInterval(()=>{if(n.released||e.destroyed)return void ez(n);let t=eN(e);null===t.holder||t.holder.token!==n.token||t.holder.nonce!==n.nonce?eH(e,"force"):eU(e,{holder:{token:n.token,heartbeat:Date.now(),nonce:n.nonce},queue:t.queue,rev:t.rev+1})},500),function(e,t,r){let{name:n,logger:o}=e.deps;return{release:()=>{if("holding"!==e.status.kind||e.status.token!==t||e.status.nonce!==r||e.status.released)return;let i=e.status;i.released=!0,ez(i),e.status={kind:"idle"},o.debug(`[${n}] storage driver: release token=${t}`),eK(e,t,r),eJ(e)},onRevokedByDriver:n=>{"holding"!==e.status.kind||e.status.token!==t||e.status.nonce!==r||e.status.released||(e.status.revokeCallback=n)}}}(e,t,r)}function eG(e){if(e.destroyed)return;let t=eN(e);if("holding"===e.status.kind&&!e.status.released){(null===t.holder||t.holder.token!==e.status.token||t.holder.nonce!==e.status.nonce)&&eH(e,"force");return}"idle"===e.status.kind&&e.waiters.length>0&&(null===t.holder||eF(t.holder))&&eJ(e)}function eQ(e,t){var r,n;let{name:o,logger:i}=e.deps;e.waiters.push(t),i.debug(`[${o}] storage driver: enqueue token=${t.token}, queue=${e.waiters.length}`),(r=t.token,n=()=>(function(e,t){if(e.destroyed)return"abort";let r=eN(e);for(let e=0;e<r.queue.length;e++)if(r.queue[e].token===t)return"success";if("abort"===eU(e,{holder:r.holder,queue:[...r.queue,{token:t,ts:Date.now()}],rev:r.rev+1}))return"abort";let n=eN(e);for(let e=0;e<n.queue.length;e++)if(n.queue[e].token===t)return"success";return"retry"})(e,r),new Promise(e=>{let t=0,r=()=>{let o=n();"success"===o?e(!0):"abort"===o||++t>=3?e(!1):setTimeout(r,e_())};r()})).then(r=>{r||i.warn(`[${o}] storage driver: enqueueInStorage failed after retries (token=${t.token}); relying on timeout/polling`),eJ(e)})}function eY(e){let{id:t}=e;l(t)&&0!==t.length||p(eo,"storage driver requires a non-empty id",TypeError),!function(){try{let e=globalThis.localStorage;if(!e)return!1;let t=`${et}:__storage_driver_probe__`;return e.setItem(t,"1"),e.removeItem(t),!0}catch{return!1}}()&&p(eo,"storage driver requires a usable localStorage",TypeError);let r={deps:e,storage:globalThis.localStorage,key:`${et}:${t}:driver-lock`,status:{kind:"idle"},waiters:[],destroyed:!1,pumping:!1,unsubscribeStorageEvent:null,pollTimer:null};function n(e){return new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: storage driver destroyed (token=${e})`)}return r.unsubscribeStorageEvent=function(e){let t=globalThis;if(!g(t.addEventListener))return e.deps.logger.warn(`[${e.deps.name}] storage driver: globalThis.addEventListener unavailable; cross-tab notification disabled`),null;let r=t=>{if(t.storageArea===e.storage&&(t.key===e.key||null===t.key))try{eG(e)}catch(t){e.deps.logger.error(`[${e.deps.name}] storage driver: handleExternalChange threw`,t)}};return t.addEventListener("storage",r),()=>{t.removeEventListener?.("storage",r)}}(r),r.pollTimer=setInterval(()=>{try{eG(r)}catch(e){r.deps.logger.error(`[${r.deps.name}] storage driver: polling threw`,e)}},250),{acquire:e=>r.destroyed?Promise.reject(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: storage driver has been destroyed (token=${e.token})`)):new Promise((t,n)=>{let o=function(e,t,r,n){let o=!1,i=null;function l(){null!==i&&(clearTimeout(i),i=null),e.signal.removeEventListener("abort",u)}let s={token:e.token,resolve:e=>{o||(o=!0,l(),r(e))},reject:e=>{o||(o=!0,l(),n(e))},abort:e=>{o||(eV(t.waiters,s),s.reject(e),eJ(t))},isSettled:()=>o};function u(){s.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire aborted (token=${e.token})`))}if(e.signal.aborted)return queueMicrotask(()=>u()),s;if(e.signal.addEventListener("abort",u,{once:!0}),a(e.acquireTimeout)&&e.acquireTimeout>0){let t=e.acquireTimeout;i=setTimeout(()=>{s.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${t}ms (token=${e.token})`))},t)}return s}(e,r,t,n);e.force?function(e,t){let{name:r,logger:n}=e.deps;eB(e,t.token,!0).then(o=>{if(null===o)return void t.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: force acquire failed after retries (token=${t.token})`));if(e.destroyed){eK(e,t.token,o.nonce),t.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: storage driver destroyed during force acquire (token=${t.token})`));return}if(t.isSettled())return void eK(e,t.token,o.nonce);"holding"!==e.status.kind||e.status.released||eH(e,"force");let i=eW(e,t.token,o.nonce);n.debug(`[${r}] storage driver: grant (force) token=${t.token}`),t.resolve(i)})}(r,o):function(e){if("idle"!==e.status.kind||e.waiters.length>0)return!1;let t=eN(e);return!(t.queue.length>0)&&(null===t.holder||eF(t.holder))}(r)?eB(r,o.token,!1).then(e=>{null!==e?function(e,t,r){let{name:n,logger:o}=e.deps;if(e.destroyed){eK(e,t.token,r),t.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: storage driver destroyed during fast acquire (token=${t.token})`));return}if(t.isSettled())return eK(e,t.token,r);if("idle"!==e.status.kind){eK(e,t.token,r),eQ(e,t);return}let i=eW(e,t.token,r);o.debug(`[${n}] storage driver: grant (fast-path) token=${t.token}`),t.resolve(i)}(r,o,e.nonce):o.isSettled()||eQ(r,o)}):eQ(r,o)}),destroy:()=>{r.destroyed||(r.destroyed=!0,function(e,t){let{deps:r,waiters:n}=e,{name:o,logger:i}=r;if(i.debug(`[${o}] storage driver: destroy (waiters=${n.length}, status=${e.status.kind})`),null!==e.pollTimer&&(clearInterval(e.pollTimer),e.pollTimer=null),null!==e.unsubscribeStorageEvent){try{e.unsubscribeStorageEvent()}catch(e){i.error(`[${o}] storage driver: unsubscribe storage event threw`,e)}e.unsubscribeStorageEvent=null}if("holding"===e.status.kind){let t=e.status;ez(t),t.released=!0,eK(e,t.token,t.nonce)}e.status={kind:"idle"};let a=n.slice();if(n.length=0,a.length>0)try{let t=eN(e),r=new Set;for(let e=0;e<a.length;e++)r.add(a[e].token);let n=t.queue.filter(e=>!r.has(e.token));n.length!==t.queue.length&&eU(e,{holder:t.holder,queue:n,rev:t.rev+1})}catch(e){i.error(`[${o}] storage driver: batch dequeue failed during destroy`,e)}for(let e=0;e<a.length;e++)a[e].abort(t(a[e].token))}(r,n))}}}function eX(e){let{name:t,logger:r}=e,o=function(){if("u"<typeof navigator)return null;let{locks:e}=navigator;return e||null}();o||p(eo,"web-locks driver requires navigator.locks; use auto mode or fallback driver",TypeError);let i=new Set,l=!1;return{acquire:async function e(e){l&&p(eo,"web-locks driver has been destroyed",ea);let{signal:s,cleanup:u,getTimeoutFired:d}=function(e,t,r){let n=new AbortController,o=!1,i=null;if(e.aborted)return n.abort(e.reason),{signal:n.signal,cleanup:()=>void 0,getTimeoutFired:()=>o};function l(){n.abort(e.reason)}return e.addEventListener("abort",l,{once:!0}),a(t)&&t>0&&(i=setTimeout(()=>{o=!0,n.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${t}ms (token=${r})`))},t)),{signal:n.signal,cleanup:function(){null!==i&&(clearTimeout(i),i=null),e.removeEventListener("abort",l)},getTimeoutFired:()=>o}}(e.signal,e.acquireTimeout,e.token),c=w(),h=null,f=w(),m=!0===e.force?{mode:"exclusive",steal:!0}:{mode:"exclusive",signal:s};!function(e,t,r,n){let{holdings:o}=n;e.then(()=>{let e=t();e&&!e.released&&(e.released=!0,o.delete(e))}).catch(e=>{let o=t();o?function(e,t){if(e.released)return;let{holdings:r,logger:n,driverName:o}=t;if(e.released=!0,r.delete(e),e.resolveHold(),n.debug(`[${o}] web-locks driver: revoked by steal token=${e.token}`),g(e.revokeCallback))try{e.revokeCallback("force")}catch(e){n.error(`[${o}] web-locks driver: revoke callback threw`,e)}}(o,n):r(e)})}(o.request(t,m,()=>(h={token:e.token,holdPromise:c.promise,resolveHold:c.resolve,revokeCallback:null,released:!1},i.add(h),r.debug(`[${t}] web-locks driver: grant token=${e.token} steal=${!0===e.force}`),f.resolve(h),c.promise)),()=>h,f.reject,{holdings:i,logger:r,driverName:t});try{var y;let n=await f.promise;return u(),l&&(n.released=!0,i.delete(n),n.resolveHold(),p(eo,`web-locks driver destroyed during acquire (token=${e.token})`,ea)),y=n,{release:()=>{y.released||(y.released=!0,i.delete(y),y.resolveHold(),r.debug(`[${t}] web-locks driver: release token=${y.token}`))},onRevokedByDriver:e=>{y.revokeCallback=e}}}catch(o){throw u(),d()&&p(eo,`acquire timed out after ${String(e.acquireTimeout)}ms (token=${e.token})`,eu,{cause:o}),(function(e){if(!n(e))return!1;let{name:t}=e;return"AbortError"===t}(o)||e.signal.aborted)&&p(eo,`acquire aborted (token=${e.token})`,ea,{cause:o}),r.error(`[${t}] web-locks driver: request failed (token=${e.token})`,o),o}},destroy:function(){l||(l=!0,r.debug(`[${t}] web-locks driver: destroy (active holdings=${i.size})`),function(e){let t=Array.from(e);for(let r=0;r<t.length;r++){let n=t[r];n.released||(n.released=!0,e.delete(n),n.resolveHold())}}(i))}}}function eZ(){let e=globalThis.navigator;if(!n(e))return!1;let{locks:t}=e;return!!n(t)&&g(t.request)}function e0(){let e=globalThis.BroadcastChannel;if(!g(e))return!1;try{return new e(`${et}:__pick_driver_probe__`).close(),!0}catch{return!1}}function e1(){try{let e=globalThis.localStorage;if(!e)return!1;let t=`${et}:__pick_driver_probe__`;return e.setItem(t,"1"),e.removeItem(t),!0}catch{return!1}}function e3(e,t,r){let{adapters:n,id:o}=e;return{name:l(o)&&o.length>0?`${et}:${o}`:`${et}:__local__`,id:o,logger:n.logger,getChannel:t?n.getChannel:void 0,userGetLock:r?n.getLock:void 0}}function e6(){}function e2(e,t){return e.tokenSeq++,`${et}:${t}:token:${e.tokenSeq}`}function e5(e){return e===er?null:e}function e8(e){p(eo,"actions disposed",el,{cause:e})}function e9(e,t){let r=()=>{},n=e.writeChain.then(t,t);return e.writeChain=n.then(r,r),n}function e4(e){null!==e.holdTimer&&(clearTimeout(e.holdTimer),e.holdTimer=null)}function e7(){}function te(e,t,r,n){let o=`${n}::${String(r)}`;if(e.has(o))return;let i=Object.hasOwn(t,r),a=i?Reflect.get(t,r):void 0;e.set(o,{target:t,key:r,existed:i,prevValue:a})}function tt(e){e.isValid||p(eo,"draft is no longer valid (lock revoked / aborted)",es)}function tr(e,t,r,o,i){for(let a of e){let e,l=r(a);if(l){try{e=l(o)}catch(e){i.error(`[lockData] listener threw (${t})`,e);continue}n(e)&&"then"in e&&g(e.then)&&Promise.resolve(e).catch(e=>{i.error(`[lockData] listener threw (${t})`,e)})}}}function tn(e,t,r){tr(e,"onRevoked",e=>e.onRevoked,t,r)}function to(e,t,r){tr(e,"onCommit",e=>e.onCommit,t,r)}function ti(e,t,r,n){t.phase=r,tr(e.entry.listenersSet,"onLockStateChange",e=>e.onLockStateChange,{phase:r,token:n},e.entry.adapters.logger)}function ta(e,t,r){if(""===t.aliveToken)return;let n=t.aliveToken;t.aliveToken="",t.acquiredByGetLock=!1,e4(t),tl(e,t),ti(e,t,"revoked",n),tn(e.entry.listenersSet,{reason:r,token:n},e.entry.adapters.logger)}function tl(e,t){let r=t.currentHandle;r&&(t.currentHandle=null,function(e,t){let r;try{r=e.release()}catch(e){t.warn("[lockData] driver.release threw (sync)",e);return}n(r)&&"then"in r&&g(r.then)&&Promise.resolve(r).catch(e=>{t.warn("[lockData] driver.release threw (async)",e)})}(r,e.entry.adapters.logger))}async function ts(e,t){t.disposed&&e8();let{entry:r}=e;null!==r.dataReadyPromise&&(await r.dataReadyPromise,t.disposed&&e8())}async function tu(e,r,o,i,a){var l,s,u,d,c,h,f;let m,y,b,k,v,{entry:w,options:$}=e,S=i&&void 0!==i.acquireTimeout?i.acquireTimeout:void 0!==$.timeout?$.timeout:5e3,T=e5(S),q=i&&void 0!==i.holdTimeout?i.holdTimeout:void 0!==$.timeout?$.timeout:5e3,E=(l=[$.signal,i?.signal,o],k=null===(b=null===T?null:new AbortController)?null:setTimeout(()=>b.abort(new DOMException("acquire timeout","TimeoutError")),T),{signal:(v=function(e){let t=e.filter(e=>e instanceof AbortSignal);if("function"==typeof AbortSignal.any)return{signal:AbortSignal.any(t),dispose:e6};let r=new AbortController,n=t.find(e=>e.aborted);if(void 0!==n)return r.abort(n.reason),{signal:r.signal,dispose:e6};let o=[],i=()=>{for(let e=0;e<o.length;e++)o[e]();o.length=0};for(let e=0;e<t.length;e++){let n=t[e],a=()=>{r.abort(n.reason),i()};n.addEventListener("abort",a,{once:!0}),o.push(()=>n.removeEventListener("abort",a))}return{signal:r.signal,dispose:i}}([...l,b?b.signal:null])).signal,dispose:()=>{null!==k&&clearTimeout(k),v.dispose()},timeoutController:b}),A=e2(r,w.id);r.currentToken=A,r.aliveToken=A,ti(e,r,"acquiring",A);try{y=await w.driver.acquire({name:void 0===w.lockId?`${et}:__local__`:`${et}:${w.lockId}`,token:A,force:a,acquireTimeout:S,holdTimeout:q,signal:E.signal})}catch(o){throw r.disposed&&e8(o),r.aliveToken="",ti(e,r,"idle",A),(s=E.timeoutController)&&s.signal.aborted?t(eo,"acquire timeout",eu,{cause:o}):!function(e){if(!n(e))return!1;let{name:t}=e;return"AbortError"===t||"TimeoutError"===t}(o)?o:t(eo,"acquire aborted",ea,{cause:o})}finally{E.dispose()}(r.disposed||r.aliveToken!==A)&&(!function(e,t){let r;try{r=e.release()}catch(e){t.warn("[lockData] handle.release threw (dispose-race)",e);return}n(r)&&"then"in r&&g(r.then)&&Promise.resolve(r).catch(e=>{t.warn("[lockData] handle.release threw (dispose-race async)",e)})}(y,e.entry.adapters.logger),r.disposed&&e8(),p(eo,"lock revoked before activation",es)),r.currentHandle=y,u=e,d=r,g((c=y).onRevokedByDriver)&&c.onRevokedByDriver(e=>{ta(u,d,e)}),h=e,f=r,null!==(m=e5(q))&&(f.holdTimer=setTimeout(()=>{f.holdTimer=null,ta(h,f,"timeout")},m)),ti(e,r,"holding",A),w.authority&&w.authority.pullOnAcquire()}async function td(e,t,r,o){var i;let a,{entry:l}=e,s=(ef(i=l.dataRef.current,[],new WeakSet,"draft"),{draft:function e(t,r,n,o){return new Proxy(t,{get(t,i,a){let l=Reflect.get(t,i,a);if("object"!=typeof l||null===l)return l;let s=`${o}::${String(i)}`;return e(l,r,[...n,i],s)},set:(e,t,i)=>(tt(r.validity),ef(i,[...n,t],new WeakSet,"draft"),te(r.snapshot,e,t,o),r.mutations.push({path:[...n,t],op:"set",value:i}),Reflect.set(e,t,i)),deleteProperty:(e,t)=>(tt(r.validity),te(r.snapshot,e,t,o),r.mutations.push({path:[...n,t],op:"delete"}),Reflect.deleteProperty(e,t))})}(i,a={validity:{isValid:!0},mutations:[],snapshot:new Map},[],"root"),get mutations(){return a.mutations},commit:()=>(tt(a.validity),a.validity.isValid=!1,Object.freeze(a.mutations.map(e=>Object.freeze({...e,path:Object.freeze([...e.path])})))),rollback:()=>{!function(e){let t=Array.from(e.values()).reverse();for(let e=0;e<t.length;e++){let r=t[e];if(r.existed){Reflect.set(r.target,r.key,r.prevValue);continue}Reflect.deleteProperty(r.target,r.key)}}(a.snapshot),a.validity.isValid=!1,a.mutations.length=0,a.snapshot.clear()},dispose:()=>{a.validity.isValid=!1}}),u=t.currentToken;ti(e,t,"committing",u);let d=!1;try{let i=o(s.draft);n(i)&&"then"in i&&g(i.then)&&await i,t.aliveToken!==u&&p(eo,"lock revoked during recipe",es);let a=s.commit();d=!0,function(e,t,r,n,o){let{entry:i}=e,a=ep(i.dataRef.current);i.authority?i.authority.onCommitSuccess({source:r,token:n,mutations:o,snapshot:a}):(i.rev++,i.lastAppliedRev=i.rev,to(i.listenersSet,{source:r,token:n,rev:i.rev,mutations:o,snapshot:a},i.adapters.logger)),ti(e,t,"holding",n)}(e,t,r,u,a)}finally{d||s.rollback(),s.dispose()}}function tc(e,t){if(t.disposed&&e8(),"holding"!==t.phase&&"committing"!==t.phase)return;let r=t.currentToken;t.aliveToken="",e4(t),tl(e,t),t.acquiredByGetLock=!1,ti(e,t,"released",r),ti(e,t,"idle",r)}let th=new WeakMap;function tf(e){return"object"==typeof e&&null!==e}function tp(){p(eo,"cannot mutate readonly view",ed)}let tg={get(e,t,r){let n=Reflect.get(e,t,r);return tf(n)?tm(n):n},set:tp,deleteProperty:tp,defineProperty:tp,setPrototypeOf:tp};function tm(e){let t=th.get(e);if(void 0!==t)return t;let r=new Proxy(e,tg);return th.set(e,r),r}let ty={get(e,t){let r=Reflect.get(e.current,t);return tf(r)?tm(r):r},set:tp,deleteProperty:tp,defineProperty:tp,setPrototypeOf:tp,has:(e,t)=>Reflect.has(e.current,t),ownKeys:e=>Reflect.ownKeys(e.current),getOwnPropertyDescriptor:(e,t)=>{let r=Reflect.getOwnPropertyDescriptor(e.current,t);if(void 0!==r)return{...r,writable:!1,configurable:!0}},getPrototypeOf:e=>Reflect.getPrototypeOf(e.current)};function tb(){}function tk(e,r){return t(eo,`lockData id=${e} initialization failed during getValue()`,el,{cause:r})}let tv=null;function tw(e){let r=function(e){var r,o,s,u,d,c;let m,y,b,k,v,$,S,T,q,E,A,D,x,P,R=function(e){let{id:t}=e;return l(t)&&t.length>0?t:void 0}(e),C=(e,r,o,s)=>{var u,d,c;let m,y,b,k,v,$,S,T=(u=(m=o.adapters||{}).logger,y={warn(e,...t){f.warn(eo,e,...t)},error(e,...t){f.error(eo,e,...t)},debug(e,...t){f.debug(eo,e,...t)}},k={warn:"function"==typeof(b=u||{}).warn?b.warn.bind(b):y.warn,error:"function"==typeof b.error?b.error.bind(b):y.error,debug:"function"==typeof b.debug?b.debug.bind(b):y.debug},v=m.getAuthority,$=m.getChannel,S=m.getSessionStore,{logger:k,getAuthority:e=>{if(v){let t=v(e);if(null!==t)return t}return function(e,t){var r;if(!function(){try{let e=globalThis.localStorage;if(!e)return!1;let t=`${et}:__probe__`;return e.setItem(t,"1"),e.removeItem(t),!0}catch{return!1}}())return t.logger.warn('localStorage is not available; default authority adapter is disabled. syncMode="storage-authority" will fall back to local-only semantics.'),null;let n=(r=e.id,`${et}:${r}:latest`),o=globalThis.localStorage;return{read(){try{return o.getItem(n)}catch(e){return t.logger.warn("Failed to read authority snapshot from localStorage",e),null}},write(e){try{o.setItem(n,e)}catch(e){t.logger.warn("Failed to write authority snapshot to localStorage (likely QuotaExceededError); remote Tabs will not see this commit until next successful write.",e)}},remove(){try{o.removeItem(n)}catch(e){t.logger.warn("Failed to remove authority snapshot from localStorage",e)}},subscribe(e){let r=r=>{if(r.storageArea===o&&r.key===n)try{e(r.newValue)}catch(e){t.logger.error("Authority subscribe callback threw",e)}},i=globalThis;return"function"!=typeof i.addEventListener?(t.logger.warn("globalThis.addEventListener is not available; authority subscribe is noop."),()=>void 0):(i.addEventListener("storage",r),()=>{i.removeEventListener?.("storage",r)})}}}(e,{logger:k})},getChannel:e=>{if($){let t=$(e);if(null!==t)return t}return function(e,t){var r,n;if(!function(){let e=globalThis.BroadcastChannel;if("function"!=typeof e)return!1;try{return new e(`${et}:__probe__`).close(),!0}catch{return!1}}())return t.logger.warn("BroadcastChannel is not available; default channel adapter is disabled. Cross-tab sync features may fall back to degraded mode."),null;let o=new globalThis.BroadcastChannel((r=e.id,n=e.channel,`${et}:${r}:${n}`)),i=!1;return{postMessage(e){if(i||null===o)return void t.logger.warn("postMessage on closed ChannelAdapter is ignored.");try{o.postMessage(e)}catch(e){t.logger.warn("BroadcastChannel.postMessage failed",e)}},subscribe(e){if(i||null===o)return t.logger.warn("subscribe on closed ChannelAdapter is ignored; returning noop unsubscriber."),()=>void 0;let r=r=>{try{e(r.data)}catch(e){t.logger.error("Channel subscribe callback threw",e)}};return o.addEventListener("message",r),()=>{try{o?.removeEventListener("message",r)}catch{}}},close(){if(!i){i=!0;try{o?.close()}catch(e){t.logger.warn("BroadcastChannel.close failed",e)}finally{o=null}}}}}(e,{logger:k})},getSessionStore:e=>{if(S){let t=S(e);if(null!==t)return t}return function(e,t){var r;if(!function(){try{let e=globalThis.sessionStorage;if(!e)return!1;let t=`${et}:__probe__`;return e.setItem(t,"1"),e.removeItem(t),!0}catch{return!1}}())return t.logger.warn('sessionStorage is not available; default session store adapter is disabled. persistence="session" will fall back to "persistent".'),null;let n=(r=e.id,`${et}:${r}:epoch`),o=globalThis.sessionStorage;return{read(){try{return o.getItem(n)}catch(e){return t.logger.warn("Failed to read session store from sessionStorage",e),null}},write(e){try{o.setItem(n,e)}catch(e){t.logger.warn("Failed to write session store to sessionStorage; epoch may be reset on next startup.",e)}}}}(e,{logger:k})},getLock:m.getLock}),q=function(e,r){var n,o,i;let a,l,{getValue:s}=r;if(!g(s))throw t(eo,`lockData id=${e} requires options.getValue (function)`,TypeError);try{l=s()}catch(t){throw tk(e,t)}return null===(n=l)||"object"!=typeof n||"function"!=typeof n.then?(eg(l,"lockData getValue() result"),{firstValue:ep(l),dataReadyPromise:null}):(o=e,i=l,a=w(),Promise.resolve(i).then(e=>{try{eg(e,"lockData getValue() result")}catch(e){a.reject(tk(o,e));return}a.resolve(e)},e=>{a.reject(tk(o,e))}),a.promise.catch(tb),{firstValue:{},dataReadyPromise:a.promise})}(e,o),E=function(e){let{adapters:t,options:r,id:n}=e;if(g(t.getLock))return function(e){let{name:t,logger:r,userGetLock:n}=e;g(n)||p(eo,"custom driver requires adapters.getLock to be a function",TypeError);let o=!1;return{acquire:async function l(l){o&&p(eo,"custom driver has been destroyed",ea);let{signal:s,cleanup:u,getTimeoutFired:d}=function(e,t,r){let n=new AbortController,o=!1,i=null;if(e.aborted)return n.abort(e.reason),{signal:n.signal,cleanup:()=>void 0,getTimeoutFired:()=>o};function l(){n.abort(e.reason)}return e.addEventListener("abort",l,{once:!0}),a(t)&&t>0&&(i=setTimeout(()=>{o=!0,n.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${t}ms (token=${r})`))},t)),{signal:n.signal,cleanup:function(){null!==i&&(clearTimeout(i),i=null),e.removeEventListener("abort",l)},getTimeoutFired:()=>o}}(l.signal,l.acquireTimeout,l.token),c={name:t,token:l.token,force:l.force,acquireTimeout:l.acquireTimeout,holdTimeout:l.holdTimeout,signal:s};try{let o=n(c),a=await Promise.resolve(o);var f=l.token;if(!(a&&g(a.release))){let e=h(a)?String(a):typeof a.release;p(eo,`adapters.getLock must return an object with a "release" function, got ${e} (token=${f})`,TypeError)}return u(),r.debug(`[${t}] custom driver: grant token=${l.token}`),function(e,t,r){let{name:n,logger:o}=t,a=e.release,l=e.onRevokedByDriver,s={release:()=>{let t;try{t=a.call(e)}catch(e){o.error(`[${n}] custom driver: user release threw (token=${r})`,e);return}if(i(t))return Promise.resolve(t).catch(e=>{o.error(`[${n}] custom driver: user release rejected (token=${r})`,e)})}};return g(l)&&(s.onRevokedByDriver=l.bind(e)),s}(a,e,l.token)}catch(e){throw u(),d()&&p(eo,`acquire timed out after ${String(l.acquireTimeout)}ms (token=${l.token})`,eu,{cause:e}),l.signal.aborted&&p(eo,`acquire aborted (token=${l.token})`,ea,{cause:e}),r.error(`[${t}] custom driver: user getLock rejected (token=${l.token})`,e),e}},destroy:function(){o||(o=!0,r.debug(`[${t}] custom driver: destroy`))}}}(e3(e,!1,!0));if(!l(n)||0===n.length)return function(e){let{name:t,logger:r}=e,n={name:t,logger:r,waiters:[],holder:null,destroyed:!1};return{acquire:e=>eL(n,e),destroy:()=>{n.destroyed||(n.destroyed=!0,function(e){let{name:t,logger:r,waiters:n}=e;if(r.debug(`[${t}] local driver: destroy (waiters=${n.length}, holding=${e.holder?"yes":"no"})`),e.holder){let t=e.holder;t.released=!0,e.holder=null,t.notifyRevoke("force")}let o=n.slice();n.length=0;for(let e=0;e<o.length;e++)o[e].abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: local driver destroyed (token=${o[e].token})`))}(n))}}}(e3(e,!1,!1));let o=r.mode||"auto";switch(o){case"web-locks":return eZ()||p(eo,"mode='web-locks' requested but navigator.locks is unavailable in current environment",TypeError),eX(e3(e,!1,!1));case"broadcast":return e0()||p(eo,"mode='broadcast' requested but BroadcastChannel is unavailable in current environment",TypeError),eC(e3(e,!0,!1));case"storage":return e1()||p(eo,"mode='storage' requested but localStorage is unavailable in current environment",TypeError),eY(e3(e,!1,!1));case"auto":return eZ()?eX(e3(e,!1,!1)):e0()?eC(e3(e,!0,!1)):e1()?eY(e3(e,!1,!1)):void p(eo,"mode='auto' requires one of navigator.locks / BroadcastChannel / localStorage to be available; got none",TypeError);default:p(eo,`unknown mode: ${String(o)}`,TypeError)}}({adapters:T,options:o,id:r}),A=new Set;n(o.listeners)&&A.add(o.listeners);let D={current:q.firstValue},x=e=>{D.current=ep(e)},P={id:e,lockId:r,dataRef:D,driver:E,adapters:T,authority:null,listenersSet:A,initOptions:Object.freeze({timeout:o.timeout,mode:o.mode,syncMode:o.syncMode,persistence:o.persistence,sessionProbeTimeout:o.sessionProbeTimeout}),dataReadyPromise:null,registerTeardown:s.registerTeardown,refCount:1,rev:0,lastAppliedRev:0,epoch:null,applyRemote:x},R=(d=x,null===(c=q.dataReadyPromise)?null:c.then(e=>{d(e)})),C="storage-authority"==("storage-authority"===o.syncMode?"storage-authority":"none")&&void 0!==r?function(e,t,r,n){var o;let i,a="persistent"===t.persistence?"persistent":"session",s=r.getAuthority({id:n}),u=r.getChannel({id:n,channel:"session"}),d=r.getSessionStore({id:n});if(null===s&&null===u&&null===d)return r.logger.warn(`[lockData] syncMode='storage-authority' requested on id=${n} but no authority/channel/sessionStore adapter is available; fallback to in-process sharing only`),null;let c={disposed:!1},h=(o={host:e,authority:s,channel:u,sessionStore:d,persistence:a,sessionProbeTimeout:t.sessionProbeTimeout??100,logger:r.logger,emitSync:t=>{!c.disposed&&tr(e.listenersSet,"onSync",e=>e.onSync,t,e.adapters.logger)},emitCommit:t=>{c.disposed||to(e.listenersSet,t,e.adapters.logger)}},i={unsubscribers:[],disposed:!1,initialized:!1},{init:()=>ew(i,o),pullOnAcquire:()=>(function(e,t){let{authority:r}=t;!e.disposed&&r&&ev(e,t,"pull-on-acquire",r.read())})(i,o),onCommitSuccess:e=>(function(e,t,r){if(e.disposed)return;let{host:n,authority:o,logger:i,emitCommit:a}=t;if(n.rev++,n.lastAppliedRev=n.rev,o&&l(n.epoch)){var s,u,d,c;let e=(s=n.rev,u=Date.now(),d=n.epoch,c=r.snapshot,`{"rev":${s},"ts":${u},"epoch":${JSON.stringify(d)},"snapshot":${JSON.stringify(c)}}`);o.write(e)}try{a({source:r.source,token:r.token,rev:n.rev,mutations:r.mutations,snapshot:r.snapshot})}catch(e){i.error(`[lockData] emitCommit listener threw (source=${r.source})`,e)}})(i,o,e),dispose:()=>(function(e,t){if(e.disposed)return;e.disposed=!0;let{channel:r,logger:n}=t;for(let t=0;t<e.unsubscribers.length;t++)try{e.unsubscribers[t]()}catch(e){n.warn("[lockData] StorageAuthority dispose: unsubscriber threw",e)}if(e.unsubscribers.length=0,r)try{r.close()}catch(e){n.warn("[lockData] StorageAuthority dispose: channel.close threw",e)}})(i,o)});return e.authority=h,e.registerTeardown(()=>h.dispose()),e.registerTeardown(()=>{c.disposed=!0}),h.init().then(()=>{},e=>{r.logger.warn(`[lockData] StorageAuthority.init failed on id=${n}`,e)})}(P,o,T,r):null;return P.dataReadyPromise=null!==R&&null!==C?Promise.all([R,C]).then(()=>void 0):R??C,P},{entry:I,releaseFromRegistry:j}=void 0===R?(m=[],y={value:!0},{entry:b=C("__local__",void 0,e,{registerTeardown:e=>{y.value&&m.push(e)}}),releaseFromRegistry:()=>{if(y.value){y.value=!1;for(let e=m.length-1;e>=0;e--)try{m[e]()}catch(e){b.adapters.logger.warn("[lockData] standalone teardown threw",e)}m.length=0;try{b.driver.destroy()}catch(e){b.adapters.logger.warn("[lockData] standalone driver.destroy threw",e)}}}}):(o=R,s=e,u=C,{entry:(v=(null===tv&&(k=new Map,tv={getOrCreateEntry:(e,r,o)=>{if(0===e.length)throw t(eo,"InstanceRegistry requires a non-empty id",TypeError);let i=k.get(e);if(i){let{entry:t}=i;t.refCount++;let{listeners:o}=r;return n(o)&&t.listenersSet.add(o),!function(e,t,r,n){let o=["timeout","mode","syncMode","persistence","sessionProbeTimeout"];for(let i=0;i<o.length;i++){let a=o[i];t[a]!==r[a]&&n.warn(`[lockData] option conflict on id=${e} (field=${String(a)}, first=${String(r[a])}, incoming=${String(t[a])}), using first registered value`)}}(e,Object.freeze({timeout:r.timeout,mode:r.mode,syncMode:r.syncMode,persistence:r.persistence,sessionProbeTimeout:r.sessionProbeTimeout}),t.initOptions,t.adapters.logger),t}let a=[],l={value:!0},s=o(e,e,r,{registerTeardown:e=>{!g(e)||l.value&&a.push(e)}});return k.set(e,{entry:s,teardowns:a,alive:l}),s},releaseEntry:(e,t)=>{let r=k.get(e);if(!r||r.entry.refCount<=0)return;let{entry:n,teardowns:o,alive:i}=r;void 0!==t&&n.listenersSet.delete(t),n.refCount--,n.refCount>0||(i.value=!1,k.delete(e),function(e,t){let{driver:r,adapters:n,id:o}=e,{logger:i}=n;for(let e=t.length-1;e>=0;e--)try{t[e]()}catch(e){i.warn(`[lockData] teardown callback threw on id=${o}`,e)}try{r.destroy()}catch(e){i.warn(`[lockData] driver.destroy threw on id=${o}`,e)}}(n,o))},peek:{has:e=>k.has(e),size:()=>k.size}}),tv)).getOrCreateEntry(o,s,u),releaseFromRegistry:()=>{v.releaseEntry(o,s.listeners)}}),L=(r={entry:I,options:e,releaseFromRegistry:j},S={phase:"idle",currentHandle:null,currentToken:"",aliveToken:"",tokenSeq:0,holdTimer:null,acquiredByGetLock:!1,disposed:!1,writeChain:Promise.resolve()},T=new AbortController,q=e7,E=()=>{if(S.disposed)return;if(S.disposed=!0,q(),q=e7,T.signal.aborted||T.abort(t(eo,"actions disposed",ea)),""!==S.aliveToken){let e=S.aliveToken;S.aliveToken="",e4(S),tl(r,S),tn(r.entry.listenersSet,{reason:"dispose",token:e},r.entry.adapters.logger)}let e=e2(S,r.entry.id);ti(r,S,"disposed",e),r.releaseFromRegistry()},q=function(e,t){if(!(e instanceof AbortSignal))return e7;if(e.aborted)return queueMicrotask(t),e7;let r=()=>{t()};return e.addEventListener("abort",r,{once:!0}),()=>{e.removeEventListener("abort",r)}}(r.options.signal,E),A=()=>{S.disposed&&e8()},D=async(e,t)=>{if(await ts(r,S),"holding"===S.phase&&""!==S.aliveToken)return{alreadyHeld:!0};let n=e?.force===!0;return await tu(r,S,T.signal,e,n),"getLock"===t&&(S.acquiredByGetLock=!0),{alreadyHeld:!1}},x=e=>{e||S.acquiredByGetLock||"holding"===S.phase&&tc(r,S)},Object.defineProperty(P={get isHolding(){return"holding"===S.phase||"committing"===S.phase},update:async(e,t)=>(A(),g(e)||p(eo,"update requires a recipe function",TypeError),e9(S,async()=>{A();let{alreadyHeld:n}=await D(t,"update");try{await td(r,S,"update",e)}finally{x(n)}})),replace:async(e,t)=>(A(),n(e)||p(eo,"replace requires a non-null object",TypeError),eg(e,"lockData actions.replace(next)"),e9(S,async()=>{A();let{alreadyHeld:n}=await D(t,"replace");try{await td(r,S,"replace",t=>{!function(e,t){let r=Array.isArray(e),n=Array.isArray(t);if(r!==n&&p(eo,`replace shape mismatch: target is ${r?"array":"object"}, next is ${n?"array":"object"}`,TypeError),r){e.length=0;for(let r=0;r<t.length;r++)e.push(t[r]);return}let o=Object.keys(e);for(let r=0;r<o.length;r++){let n=o[r];Object.hasOwn(t,n)||Reflect.deleteProperty(e,n)}let i=Object.keys(t);for(let r=0;r<i.length;r++){let n=i[r];Reflect.set(e,n,t[n])}}(t,e)})}finally{x(n)}})),snapshot:()=>(A(),ep(r.entry.dataRef.current)),getLock:async e=>(A(),e9(S,async()=>{A(),await D(e,"getLock")})),release(){tc(r,S)},async dispose(){E()}},"__testHooks",{value:{doDispose:E,disposedController:T},enumerable:!1,configurable:!1,writable:!1}),P),M=function(e){let t=th.get(e);if(void 0!==t)return t;let r=new Proxy(e,ty);return th.set(e,r),r}(I.dataRef);return d=I,$=[M,c=L],null===d.dataReadyPromise?$:d.dataReadyPromise.then(()=>$,e=>{throw c.dispose(),e})}(e);return r instanceof Promise,r}let t$=new Set(["number","string","date"]);function tS(e,t){return t$.has(b(e))&&t$.has(b(t))?e<t?-1:+(e>t):(f.warn("PriorityQueue",`Unsupported type: ${b(e)} ${b(t)}`),0)}function tT(e,t,r,n,o){if(e>=r)return t;let i=o(n[e].item,n[t].item);return i<0||0===i&&n[e].insertOrder<n[t].insertOrder?e:t}let tq=d({compare:c.function(()=>tS),allowDuplicate:c.boolean(!1)});class tE{heap=[];itemSet=new Set;compare;allowDuplicate;insertCounter=0;constructor(e={}){let{compare:t,allowDuplicate:r}=s(e||{},tq,{unwrap:!0});this.compare=t,this.allowDuplicate=r}swapItems(e,t){[this.heap[e],this.heap[t]]=[this.heap[t],this.heap[e]]}heapifyUp(e){let t=e;for(;t>0;){let e=Math.floor((t-1)/2),r=this.heap[t],n=this.heap[e];if(0>this.compare(r.item,n.item))this.swapItems(t,e),t=e;else break}}heapifyDown(e){let t=e,r=this.heap.length;for(;t<r;){let e=2*t+1,n=2*t+2,o=t;if(o=tT(e,o,r,this.heap,this.compare),(o=tT(n,o,r,this.heap,this.compare))===t)break;this.swapItems(t,o),t=o}}isDuplicate(e){return!this.allowDuplicate&&this.itemSet.has(e)}enqueue(e){if(this.isDuplicate(e)){let t=I(()=>"object"==typeof e&&null!==e?JSON.stringify(e):String(e),()=>Object.prototype.toString.call(e));return f.warn("PriorityQueue.enqueue",`Duplicate item detected: ${t}`),!1}let t={item:e,insertOrder:this.insertCounter++};return this.allowDuplicate||this.itemSet.add(e),this.heap.push(t),this.heapifyUp(this.heap.length-1),!0}enqueueMany(e){return e.map(e=>this.enqueue(e))}dequeue(){let e;if(0!==this.heap.length)return 1===this.heap.length?e=this.heap.pop().item:(e=this.heap[0].item,this.heap[0]=this.heap.pop(),this.heapifyDown(0)),this.itemSet.delete(e),e}peek(){if(0!==this.heap.length)return this.heap[0].item}size(){return this.heap.length}isEmpty(){return 0===this.heap.length}clear(){this.heap.length=0,this.itemSet.clear(),this.insertCounter=0}toArray(){let e=[...this.heap];return e.sort((e,t)=>{let r=this.compare(e.item,t.item);return 0!==r?r:e.insertOrder-t.insertOrder}),e.map(e=>e.item)}}function tA(e){return new tE(e)}Symbol("__PACK__");export{$dt,$dt as defineTransform,$t,createError,dataHandler,getType,identity,isArray,isBoolean,isEmptyArray,isEmptyString,isFalse,isFalsy,isFunction,isNaN,isNull,isNullOrUndef,isNumber,isObject,isPlainNumber,isPlainObject,isPlainSymbol,isPromiseLike,isPropertyKey,isString,isSymbol,isTrue,isTruthy,isUndef,noop,throwError,throwType}from"../665.js";export{createStorageHandler}from"../893.js";export{ei as InvalidOptionsError,ea as LockAbortedError,el as LockDisposedError,es as LockRevokedError,eu as LockTimeoutError,er as NEVER_TIMEOUT,ed as ReadonlyMutationError,T as allx,P as animation,Q as conditionMerge,V as createApi,H as createApiWithMap,ee as dataMixedManager,J as defineApi,K as defineApiMap,tw as lockData,tA as priorityQueue,B as request,x as stepAnimation,I as tryCall,C as tryCallFunc,w as withResolvers};