@evolu/common 8.1.0 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/src/Function.d.ts +1 -0
  2. package/dist/src/Function.d.ts.map +1 -1
  3. package/dist/src/Http.d.ts +9 -0
  4. package/dist/src/Http.d.ts.map +1 -1
  5. package/dist/src/Number.d.ts +66 -6
  6. package/dist/src/Number.d.ts.map +1 -1
  7. package/dist/src/Number.js +11 -3
  8. package/dist/src/Object.d.ts +1 -0
  9. package/dist/src/Object.d.ts.map +1 -1
  10. package/dist/src/RefCount.d.ts +1 -0
  11. package/dist/src/RefCount.d.ts.map +1 -1
  12. package/dist/src/Relation.d.ts +2 -0
  13. package/dist/src/Relation.d.ts.map +1 -1
  14. package/dist/src/Resource.d.ts +1 -0
  15. package/dist/src/Resource.d.ts.map +1 -1
  16. package/dist/src/Result.d.ts +383 -548
  17. package/dist/src/Result.d.ts.map +1 -1
  18. package/dist/src/Result.js +296 -46
  19. package/dist/src/Schedule.d.ts +2 -2
  20. package/dist/src/Schedule.d.ts.map +1 -1
  21. package/dist/src/StackTrace.d.ts +1 -0
  22. package/dist/src/StackTrace.d.ts.map +1 -1
  23. package/dist/src/Task.d.ts +978 -1061
  24. package/dist/src/Task.d.ts.map +1 -1
  25. package/dist/src/Task.js +1010 -159
  26. package/dist/src/Time.d.ts +71 -34
  27. package/dist/src/Time.d.ts.map +1 -1
  28. package/dist/src/Time.js +77 -1
  29. package/dist/src/Type.d.ts +1740 -795
  30. package/dist/src/Type.d.ts.map +1 -1
  31. package/dist/src/Type.js +1634 -211
  32. package/dist/src/Types.d.ts +0 -24
  33. package/dist/src/Types.d.ts.map +1 -1
  34. package/dist/src/intl/_en.d.ts +126 -0
  35. package/dist/src/intl/_en.d.ts.map +1 -0
  36. package/dist/src/intl/_en.js +267 -0
  37. package/dist/src/intl/ar.d.ts +117 -0
  38. package/dist/src/intl/ar.d.ts.map +1 -0
  39. package/dist/src/intl/ar.js +245 -0
  40. package/dist/src/intl/bn.d.ts +117 -0
  41. package/dist/src/intl/bn.d.ts.map +1 -0
  42. package/dist/src/intl/bn.js +258 -0
  43. package/dist/src/intl/ca.d.ts +117 -0
  44. package/dist/src/intl/ca.d.ts.map +1 -0
  45. package/dist/src/intl/ca.js +258 -0
  46. package/dist/src/intl/cs.d.ts +30 -7
  47. package/dist/src/intl/cs.d.ts.map +1 -1
  48. package/dist/src/intl/cs.js +65 -28
  49. package/dist/src/intl/da.d.ts +117 -0
  50. package/dist/src/intl/da.d.ts.map +1 -0
  51. package/dist/src/intl/da.js +258 -0
  52. package/dist/src/intl/de.d.ts +117 -0
  53. package/dist/src/intl/de.d.ts.map +1 -0
  54. package/dist/src/intl/de.js +258 -0
  55. package/dist/src/intl/el.d.ts +117 -0
  56. package/dist/src/intl/el.d.ts.map +1 -0
  57. package/dist/src/intl/el.js +265 -0
  58. package/dist/src/intl/es.d.ts +117 -0
  59. package/dist/src/intl/es.d.ts.map +1 -0
  60. package/dist/src/intl/es.js +258 -0
  61. package/dist/src/intl/fa.d.ts +117 -0
  62. package/dist/src/intl/fa.d.ts.map +1 -0
  63. package/dist/src/intl/fa.js +258 -0
  64. package/dist/src/intl/fi.d.ts +117 -0
  65. package/dist/src/intl/fi.d.ts.map +1 -0
  66. package/dist/src/intl/fi.js +258 -0
  67. package/dist/src/intl/fil.d.ts +117 -0
  68. package/dist/src/intl/fil.d.ts.map +1 -0
  69. package/dist/src/intl/fil.js +258 -0
  70. package/dist/src/intl/fr.d.ts +117 -0
  71. package/dist/src/intl/fr.d.ts.map +1 -0
  72. package/dist/src/intl/fr.js +258 -0
  73. package/dist/src/intl/he.d.ts +117 -0
  74. package/dist/src/intl/he.d.ts.map +1 -0
  75. package/dist/src/intl/he.js +258 -0
  76. package/dist/src/intl/hi.d.ts +117 -0
  77. package/dist/src/intl/hi.d.ts.map +1 -0
  78. package/dist/src/intl/hi.js +258 -0
  79. package/dist/src/intl/hr.d.ts +117 -0
  80. package/dist/src/intl/hr.d.ts.map +1 -0
  81. package/dist/src/intl/hr.js +265 -0
  82. package/dist/src/intl/hu.d.ts +63 -0
  83. package/dist/src/intl/hu.d.ts.map +1 -0
  84. package/dist/src/intl/hu.js +204 -0
  85. package/dist/src/intl/id.d.ts +117 -0
  86. package/dist/src/intl/id.d.ts.map +1 -0
  87. package/dist/src/intl/id.js +258 -0
  88. package/dist/src/intl/index.d.ts +42 -0
  89. package/dist/src/intl/index.d.ts.map +1 -1
  90. package/dist/src/intl/index.js +42 -0
  91. package/dist/src/intl/it.d.ts +117 -0
  92. package/dist/src/intl/it.d.ts.map +1 -0
  93. package/dist/src/intl/it.js +258 -0
  94. package/dist/src/intl/ja.d.ts +117 -0
  95. package/dist/src/intl/ja.d.ts.map +1 -0
  96. package/dist/src/intl/ja.js +258 -0
  97. package/dist/src/intl/ko.d.ts +117 -0
  98. package/dist/src/intl/ko.d.ts.map +1 -0
  99. package/dist/src/intl/ko.js +258 -0
  100. package/dist/src/intl/ml.d.ts +117 -0
  101. package/dist/src/intl/ml.d.ts.map +1 -0
  102. package/dist/src/intl/ml.js +258 -0
  103. package/dist/src/intl/mr.d.ts +117 -0
  104. package/dist/src/intl/mr.d.ts.map +1 -0
  105. package/dist/src/intl/mr.js +258 -0
  106. package/dist/src/intl/ms.d.ts +117 -0
  107. package/dist/src/intl/ms.d.ts.map +1 -0
  108. package/dist/src/intl/ms.js +245 -0
  109. package/dist/src/intl/nb.d.ts +63 -0
  110. package/dist/src/intl/nb.d.ts.map +1 -0
  111. package/dist/src/intl/nb.js +191 -0
  112. package/dist/src/intl/nl.d.ts +117 -0
  113. package/dist/src/intl/nl.d.ts.map +1 -0
  114. package/dist/src/intl/nl.js +258 -0
  115. package/dist/src/intl/pa.d.ts +117 -0
  116. package/dist/src/intl/pa.d.ts.map +1 -0
  117. package/dist/src/intl/pa.js +258 -0
  118. package/dist/src/intl/pl.d.ts +117 -0
  119. package/dist/src/intl/pl.d.ts.map +1 -0
  120. package/dist/src/intl/pl.js +242 -0
  121. package/dist/src/intl/pt-BR.d.ts +117 -0
  122. package/dist/src/intl/pt-BR.d.ts.map +1 -0
  123. package/dist/src/intl/pt-BR.js +258 -0
  124. package/dist/src/intl/pt.d.ts +117 -0
  125. package/dist/src/intl/pt.d.ts.map +1 -0
  126. package/dist/src/intl/pt.js +246 -0
  127. package/dist/src/intl/ro.d.ts +117 -0
  128. package/dist/src/intl/ro.d.ts.map +1 -0
  129. package/dist/src/intl/ro.js +258 -0
  130. package/dist/src/intl/sk.d.ts +117 -0
  131. package/dist/src/intl/sk.d.ts.map +1 -0
  132. package/dist/src/intl/sk.js +244 -0
  133. package/dist/src/intl/sl.d.ts +117 -0
  134. package/dist/src/intl/sl.d.ts.map +1 -0
  135. package/dist/src/intl/sl.js +258 -0
  136. package/dist/src/intl/sv.d.ts +117 -0
  137. package/dist/src/intl/sv.d.ts.map +1 -0
  138. package/dist/src/intl/sv.js +258 -0
  139. package/dist/src/intl/sw.d.ts +63 -0
  140. package/dist/src/intl/sw.d.ts.map +1 -0
  141. package/dist/src/intl/sw.js +191 -0
  142. package/dist/src/intl/ta.d.ts +117 -0
  143. package/dist/src/intl/ta.d.ts.map +1 -0
  144. package/dist/src/intl/ta.js +258 -0
  145. package/dist/src/intl/te.d.ts +117 -0
  146. package/dist/src/intl/te.d.ts.map +1 -0
  147. package/dist/src/intl/te.js +258 -0
  148. package/dist/src/intl/th.d.ts +117 -0
  149. package/dist/src/intl/th.d.ts.map +1 -0
  150. package/dist/src/intl/th.js +258 -0
  151. package/dist/src/intl/tr.d.ts +117 -0
  152. package/dist/src/intl/tr.d.ts.map +1 -0
  153. package/dist/src/intl/tr.js +255 -0
  154. package/dist/src/intl/uk.d.ts +117 -0
  155. package/dist/src/intl/uk.d.ts.map +1 -0
  156. package/dist/src/intl/uk.js +258 -0
  157. package/dist/src/intl/ur.d.ts +117 -0
  158. package/dist/src/intl/ur.d.ts.map +1 -0
  159. package/dist/src/intl/ur.js +245 -0
  160. package/dist/src/intl/vi.d.ts +117 -0
  161. package/dist/src/intl/vi.d.ts.map +1 -0
  162. package/dist/src/intl/vi.js +255 -0
  163. package/dist/src/intl/zh-CN.d.ts +117 -0
  164. package/dist/src/intl/zh-CN.d.ts.map +1 -0
  165. package/dist/src/intl/zh-CN.js +258 -0
  166. package/dist/src/intl/zh-TW.d.ts +117 -0
  167. package/dist/src/intl/zh-TW.d.ts.map +1 -0
  168. package/dist/src/intl/zh-TW.js +258 -0
  169. package/dist/src/local-first/Owner.d.ts +156 -62
  170. package/dist/src/local-first/Owner.d.ts.map +1 -1
  171. package/dist/src/local-first/Owner.js +119 -20
  172. package/package.json +1 -1
  173. package/src/Function.ts +2 -0
  174. package/src/Http.ts +9 -0
  175. package/src/Number.ts +85 -14
  176. package/src/Object.ts +2 -0
  177. package/src/RefCount.ts +2 -0
  178. package/src/Relation.ts +4 -0
  179. package/src/Resource.ts +2 -0
  180. package/src/Result.ts +397 -560
  181. package/src/Schedule.ts +1 -1
  182. package/src/StackTrace.ts +2 -0
  183. package/src/Task.ts +1145 -1225
  184. package/src/Time.ts +110 -62
  185. package/src/Type.ts +2842 -835
  186. package/src/Types.ts +0 -49
  187. package/src/intl/_en.ts +497 -0
  188. package/src/intl/ar.ts +417 -0
  189. package/src/intl/bn.ts +486 -0
  190. package/src/intl/ca.ts +488 -0
  191. package/src/intl/cs.ts +131 -32
  192. package/src/intl/da.ts +488 -0
  193. package/src/intl/de.ts +488 -0
  194. package/src/intl/el.ts +494 -0
  195. package/src/intl/es.ts +488 -0
  196. package/src/intl/fa.ts +487 -0
  197. package/src/intl/fi.ts +487 -0
  198. package/src/intl/fil.ts +488 -0
  199. package/src/intl/fr.ts +488 -0
  200. package/src/intl/he.ts +486 -0
  201. package/src/intl/hi.ts +487 -0
  202. package/src/intl/hr.ts +494 -0
  203. package/src/intl/hu.ts +387 -0
  204. package/src/intl/id.ts +487 -0
  205. package/src/intl/index.ts +42 -0
  206. package/src/intl/it.ts +488 -0
  207. package/src/intl/ja.ts +488 -0
  208. package/src/intl/ko.ts +487 -0
  209. package/src/intl/ml.ts +487 -0
  210. package/src/intl/mr.ts +487 -0
  211. package/src/intl/ms.ts +410 -0
  212. package/src/intl/nb.ts +364 -0
  213. package/src/intl/nl.ts +488 -0
  214. package/src/intl/pa.ts +487 -0
  215. package/src/intl/pl.ts +450 -0
  216. package/src/intl/pt-BR.ts +487 -0
  217. package/src/intl/pt.ts +424 -0
  218. package/src/intl/ro.ts +488 -0
  219. package/src/intl/sk.ts +412 -0
  220. package/src/intl/sl.ts +487 -0
  221. package/src/intl/sv.ts +488 -0
  222. package/src/intl/sw.ts +324 -0
  223. package/src/intl/ta.ts +487 -0
  224. package/src/intl/te.ts +487 -0
  225. package/src/intl/th.ts +484 -0
  226. package/src/intl/tr.ts +487 -0
  227. package/src/intl/uk.ts +488 -0
  228. package/src/intl/ur.ts +410 -0
  229. package/src/intl/vi.ts +435 -0
  230. package/src/intl/zh-CN.ts +482 -0
  231. package/src/intl/zh-TW.ts +482 -0
  232. package/src/local-first/Owner.ts +156 -62
@@ -0,0 +1,482 @@
1
+ /**
2
+ * 简体中文 Evolu Type 错误格式化器。
3
+ *
4
+ * @module
5
+ */
6
+
7
+ import { assertNonNullable } from "../Assert.ts";
8
+ import { safelyStringifyUnknownValue } from "../String.ts";
9
+ import type {
10
+ ArrayError,
11
+ Base64UrlError,
12
+ BetweenError,
13
+ CapitalizedError,
14
+ DateIsoError,
15
+ DateIsoFromDateError,
16
+ DecimalStringError,
17
+ DiscriminatedUnionError,
18
+ EvoluTypeError,
19
+ FiniteError,
20
+ GreaterThanError,
21
+ GreaterThanOrEqualToError,
22
+ InstanceOfError,
23
+ Int64Error,
24
+ Int64StringError,
25
+ IntError,
26
+ IdError,
27
+ JsonError,
28
+ JsonValueError,
29
+ LengthError,
30
+ LessThanError,
31
+ LessThanOrEqualToError,
32
+ LiteralError,
33
+ MaxLengthError,
34
+ MinLengthError,
35
+ MnemonicError,
36
+ MultipleOfError,
37
+ NegativeDecimalStringError,
38
+ NegativeError,
39
+ NameError,
40
+ NeverError,
41
+ NonNaNError,
42
+ NonNegativeDecimalStringError,
43
+ NonNegativeError,
44
+ NonPositiveDecimalStringError,
45
+ NonPositiveError,
46
+ ObjectError,
47
+ ObjectNotObjectError,
48
+ ObjectPropertyAccessError,
49
+ ObjectTagError,
50
+ ObjectUnexpectedPrototypeError,
51
+ PositiveDecimalStringError,
52
+ PositiveError,
53
+ RecordError,
54
+ RegexError,
55
+ SetError,
56
+ TableIdError,
57
+ TemplateLiteralError,
58
+ TrimmedError,
59
+ TupleElementsError,
60
+ TupleError,
61
+ TypeError,
62
+ TypeErrorFormatter,
63
+ TypeOfError,
64
+ UInt64Error,
65
+ UnionError,
66
+ } from "../Type.ts";
67
+
68
+ const formatTypeOfError = (
69
+ error: TypeOfError<
70
+ "String" | "Number" | "BigInt" | "Boolean" | "Symbol" | "Function"
71
+ >,
72
+ ): string => {
73
+ const typeOf = error.expected.toLowerCase();
74
+
75
+ return `值 ${safelyStringifyUnknownValue(error.value)} 不是 ${typeOf} 类型。`;
76
+ };
77
+
78
+ const formatPlainObjectRootError = (
79
+ reason:
80
+ ObjectNotObjectError["reason"] | ObjectUnexpectedPrototypeError["reason"],
81
+ ): string =>
82
+ reason.kind === "NotObject"
83
+ ? `值 ${safelyStringifyUnknownValue(reason.value)} 不是对象。`
84
+ : "该值是对象,但 Object Output 必须是普通对象或具有 null 原型。";
85
+
86
+ /** 以简体中文格式化 NeverError。 */
87
+ export const formatNeverError: TypeErrorFormatter<NeverError> = (error) =>
88
+ `值 ${safelyStringifyUnknownValue(error.value)} 对类型 Never 无效。`;
89
+
90
+ /** 以简体中文格式化 String TypeOfError。 */
91
+ export const formatStringError: TypeErrorFormatter<TypeOfError<"String">> =
92
+ formatTypeOfError;
93
+
94
+ /** 以简体中文格式化 TemplateLiteralError。 */
95
+ export const formatTemplateLiteralError: TypeErrorFormatter<
96
+ TemplateLiteralError
97
+ > = (error) =>
98
+ `值 ${safelyStringifyUnknownValue(error.value)} 不匹配模板字面量。`;
99
+
100
+ /** 以简体中文格式化 Number TypeOfError。 */
101
+ export const formatNumberError: TypeErrorFormatter<TypeOfError<"Number">> =
102
+ formatTypeOfError;
103
+
104
+ /** 以简体中文格式化 BigInt TypeOfError。 */
105
+ export const formatBigIntError: TypeErrorFormatter<TypeOfError<"BigInt">> =
106
+ formatTypeOfError;
107
+
108
+ /** 以简体中文格式化 Boolean TypeOfError。 */
109
+ export const formatBooleanError: TypeErrorFormatter<TypeOfError<"Boolean">> =
110
+ formatTypeOfError;
111
+
112
+ /** 以简体中文格式化 Symbol TypeOfError。 */
113
+ export const formatSymbolError: TypeErrorFormatter<TypeOfError<"Symbol">> =
114
+ formatTypeOfError;
115
+
116
+ /** 以简体中文格式化 Function TypeOfError。 */
117
+ export const formatFunctionError: TypeErrorFormatter<TypeOfError<"Function">> =
118
+ formatTypeOfError;
119
+
120
+ /** Formats an EvoluTypeError。 */
121
+ export const formatEvoluTypeError: TypeErrorFormatter<EvoluTypeError> = (
122
+ error,
123
+ ) => `值 ${safelyStringifyUnknownValue(error.value)} 不是 Evolu Type。`;
124
+
125
+ /** Formats an ObjectTagError。 */
126
+ export const formatObjectTagError: TypeErrorFormatter<ObjectTagError> = (
127
+ error,
128
+ ) =>
129
+ `值 ${safelyStringifyUnknownValue(error.value)} 不具有预期的对象标签 ${safelyStringifyUnknownValue(error.expected)}。`;
130
+
131
+ /** Formats an InstanceOfError。 */
132
+ export const formatInstanceOfError: TypeErrorFormatter<InstanceOfError> = (
133
+ error,
134
+ ) =>
135
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是 ${error.constructorName} 的实例。`;
136
+
137
+ /** 以简体中文格式化 LiteralError。 */
138
+ export const formatLiteralError: TypeErrorFormatter<LiteralError> = (error) =>
139
+ `值 ${safelyStringifyUnknownValue(error.value)} 不严格等于预期字面量:${globalThis.String(error.expected)}。`;
140
+
141
+ /** 以简体中文格式化 UnionError。 */
142
+ export const formatUnionError: TypeErrorFormatter<UnionError> = () =>
143
+ "值不匹配任何允许的变体。";
144
+
145
+ /** 以简体中文格式化 DateIsoError。 */
146
+ export const formatDateIsoError: TypeErrorFormatter<DateIsoError> = (error) =>
147
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是规范的 ISO 日期时间字符串。`;
148
+
149
+ /** 以简体中文格式化 DateIsoFromDateError。 */
150
+ export const formatDateIsoFromDateError: TypeErrorFormatter<
151
+ DateIsoFromDateError
152
+ > = () => "Date 无法表示为 DateIso。";
153
+
154
+ /** 以简体中文格式化 DecimalStringError。 */
155
+ export const formatDecimalStringError: TypeErrorFormatter<
156
+ DecimalStringError
157
+ > = (error) =>
158
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须是规范的十进制字符串。`;
159
+
160
+ /** Formats an Int64Error。 */
161
+ export const formatInt64Error: TypeErrorFormatter<Int64Error> = (error) =>
162
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是有效的有符号 64 位整数(Int64)。`;
163
+
164
+ /** 以简体中文格式化 UInt64Error。 */
165
+ export const formatUInt64Error: TypeErrorFormatter<UInt64Error> = (error) =>
166
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是有效的无符号 64 位整数(UInt64)。`;
167
+
168
+ /** Formats an Int64StringError。 */
169
+ export const formatInt64StringError: TypeErrorFormatter<Int64StringError> = (
170
+ error,
171
+ ) => `值 ${safelyStringifyUnknownValue(error.value)} 不是有效的 Int64 字符串。`;
172
+
173
+ /** 以简体中文格式化 CapitalizedError。 */
174
+ export const formatCapitalizedError: TypeErrorFormatter<CapitalizedError> = (
175
+ error,
176
+ ) => `值 ${safelyStringifyUnknownValue(error.value)} 必须以大写字母开头。`;
177
+
178
+ /** 以简体中文格式化 TrimmedError。 */
179
+ export const formatTrimmedError: TypeErrorFormatter<TrimmedError> = (error) =>
180
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须去除首尾空白。`;
181
+
182
+ /** 以简体中文格式化 MinLengthError。 */
183
+ export const formatMinLengthError: TypeErrorFormatter<MinLengthError> = (
184
+ error,
185
+ ) =>
186
+ `值 ${safelyStringifyUnknownValue(error.value)} 未达到最小长度 ${error.min}。`;
187
+
188
+ /** 以简体中文格式化 MaxLengthError。 */
189
+ export const formatMaxLengthError: TypeErrorFormatter<MaxLengthError> = (
190
+ error,
191
+ ) =>
192
+ `值 ${safelyStringifyUnknownValue(error.value)} 超过最大长度 ${error.max}。`;
193
+
194
+ /** 以简体中文格式化 LengthError。 */
195
+ export const formatLengthError: TypeErrorFormatter<LengthError> = (error) =>
196
+ `值 ${safelyStringifyUnknownValue(error.value)} 的长度不等于要求的 ${error.exact}。`;
197
+
198
+ /** 以简体中文格式化 RegexError。 */
199
+ export const formatRegexError: TypeErrorFormatter<RegexError> = (error) =>
200
+ `值 ${safelyStringifyUnknownValue(error.value)} 不匹配 /${error.source}/${error.flags}。`;
201
+
202
+ /** 以简体中文格式化 Base64UrlError。 */
203
+ export const formatBase64UrlError: TypeErrorFormatter<Base64UrlError> = (
204
+ error,
205
+ ) =>
206
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是有效的 Base64Url 字符串。`;
207
+
208
+ /** 以简体中文格式化 NameError。 */
209
+ export const formatNameError: TypeErrorFormatter<NameError> = (error) =>
210
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是有效的 Name。`;
211
+
212
+ /** 以简体中文格式化 MnemonicError。 */
213
+ export const formatMnemonicError: TypeErrorFormatter<MnemonicError> = (error) =>
214
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是有效的英文 BIP39 助记词。`;
215
+
216
+ /** Formats an IdError。 */
217
+ export const formatIdError: TypeErrorFormatter<IdError> = (error) =>
218
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是有效的 Id。`;
219
+
220
+ /** 以简体中文格式化 TableIdError。 */
221
+ export const formatTableIdError: TypeErrorFormatter<TableIdError> = (error) =>
222
+ `值 ${safelyStringifyUnknownValue(error.value)} 不是表 ${error.table} 的有效 Id。`;
223
+
224
+ /** 以简体中文格式化 NonNegativeError。 */
225
+ export const formatNonNegativeError: TypeErrorFormatter<NonNegativeError> = (
226
+ error,
227
+ ) => `值 ${safelyStringifyUnknownValue(error.value)} 必须为非负数(>= 0)。`;
228
+
229
+ /** 以简体中文格式化 NonNegativeDecimalStringError。 */
230
+ export const formatNonNegativeDecimalStringError: TypeErrorFormatter<
231
+ NonNegativeDecimalStringError
232
+ > = (error) =>
233
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须是非负十进制字符串。`;
234
+
235
+ /** 以简体中文格式化 PositiveError。 */
236
+ export const formatPositiveError: TypeErrorFormatter<PositiveError> = (error) =>
237
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须为正数(> 0)。`;
238
+
239
+ /** 以简体中文格式化 PositiveDecimalStringError。 */
240
+ export const formatPositiveDecimalStringError: TypeErrorFormatter<
241
+ PositiveDecimalStringError
242
+ > = (error) =>
243
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须是正十进制字符串。`;
244
+
245
+ /** 以简体中文格式化 NonPositiveError。 */
246
+ export const formatNonPositiveError: TypeErrorFormatter<NonPositiveError> = (
247
+ error,
248
+ ) => `值 ${safelyStringifyUnknownValue(error.value)} 必须为非正数(<= 0)。`;
249
+
250
+ /** 以简体中文格式化 NonPositiveDecimalStringError。 */
251
+ export const formatNonPositiveDecimalStringError: TypeErrorFormatter<
252
+ NonPositiveDecimalStringError
253
+ > = (error) =>
254
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须是非正十进制字符串。`;
255
+
256
+ /** 以简体中文格式化 NegativeError。 */
257
+ export const formatNegativeError: TypeErrorFormatter<NegativeError> = (error) =>
258
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须为负数(< 0)。`;
259
+
260
+ /** 以简体中文格式化 NegativeDecimalStringError。 */
261
+ export const formatNegativeDecimalStringError: TypeErrorFormatter<
262
+ NegativeDecimalStringError
263
+ > = (error) =>
264
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须是负十进制字符串。`;
265
+
266
+ /** Formats an IntError。 */
267
+ export const formatIntError: TypeErrorFormatter<IntError> = (error) =>
268
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须是安全整数。`;
269
+
270
+ /** 以简体中文格式化 GreaterThanError。 */
271
+ export const formatGreaterThanError: TypeErrorFormatter<GreaterThanError> = (
272
+ error,
273
+ ) => `值 ${safelyStringifyUnknownValue(error.value)} 必须大于 ${error.min}。`;
274
+
275
+ /** 以简体中文格式化 GreaterThanOrEqualToError。 */
276
+ export const formatGreaterThanOrEqualToError: TypeErrorFormatter<
277
+ GreaterThanOrEqualToError
278
+ > = (error) =>
279
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须大于或等于 ${error.min}。`;
280
+
281
+ /** 以简体中文格式化 LessThanError。 */
282
+ export const formatLessThanError: TypeErrorFormatter<LessThanError> = (error) =>
283
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须小于 ${error.max}。`;
284
+
285
+ /** 以简体中文格式化 LessThanOrEqualToError。 */
286
+ export const formatLessThanOrEqualToError: TypeErrorFormatter<
287
+ LessThanOrEqualToError
288
+ > = (error) =>
289
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须小于或等于 ${error.max}。`;
290
+
291
+ /** 以简体中文格式化 NonNaNError。 */
292
+ export const formatNonNaNError: TypeErrorFormatter<NonNaNError> = () =>
293
+ "值不能为 NaN。";
294
+
295
+ /** 以简体中文格式化 FiniteError。 */
296
+ export const formatFiniteError: TypeErrorFormatter<FiniteError> = (error) =>
297
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须是有限数。`;
298
+
299
+ /** 以简体中文格式化 MultipleOfError。 */
300
+ export const formatMultipleOfError: TypeErrorFormatter<MultipleOfError> = (
301
+ error,
302
+ ) =>
303
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须是 ${error.divisor} 的倍数。`;
304
+
305
+ /** 以简体中文格式化 BetweenError。 */
306
+ export const formatBetweenError: TypeErrorFormatter<BetweenError> = (error) =>
307
+ `值 ${safelyStringifyUnknownValue(error.value)} 必须介于 ${error.min} 和 ${error.max} 之间(含边界)。`;
308
+
309
+ /** Formats an ArrayError。 */
310
+ export const formatArrayError: TypeErrorFormatter<ArrayError> = (error) => {
311
+ if (error.reason.kind === "NotArray") {
312
+ return `值 ${safelyStringifyUnknownValue(error.reason.value)} 不是数组。`;
313
+ }
314
+ const issue = error.reason.issues[0];
315
+
316
+ switch (issue.kind) {
317
+ case "Hole":
318
+ return `索引 ${issue.index} 处缺少数组元素。`;
319
+ case "Accessor":
320
+ return `索引 ${issue.index} 处的数组元素必须是数据属性。`;
321
+ case "ExcessProperty":
322
+ return "不允许多余的 Array 属性。请将其删除或使用其他 Type。";
323
+ case "Element":
324
+ return `索引 ${issue.index} 处的数组元素无效。`;
325
+ }
326
+ };
327
+
328
+ /** 以简体中文格式化 SetError。 */
329
+ export const formatSetError: TypeErrorFormatter<SetError> = (error) => {
330
+ if (error.reason.kind === "NotSet") {
331
+ return `值 ${safelyStringifyUnknownValue(error.reason.value)} 不是 Set。`;
332
+ }
333
+ if (error.reason.kind === "UnexpectedPrototype") {
334
+ return "该值是 Set 子类的实例,但 Set Output 必须是直接的 Set 实例。";
335
+ }
336
+
337
+ const issue = error.reason.issues[0];
338
+
339
+ switch (issue.kind) {
340
+ case "ExcessProperty":
341
+ return `不允许多余的 Set 属性 ${safelyStringifyUnknownValue(issue.key)}。`;
342
+ case "Element":
343
+ return `索引 ${issue.index} 处的 Set 元素无效。`;
344
+ }
345
+ };
346
+
347
+ /** 以简体中文格式化 TupleError。 */
348
+ export const formatTupleError: TypeErrorFormatter<
349
+ TupleError | TupleElementsError<TypeError>
350
+ > = (error) => {
351
+ if (error.reason.kind === "NotArray") {
352
+ return `值 ${safelyStringifyUnknownValue(error.reason.value)} 不是元组。`;
353
+ }
354
+ if (error.reason.kind === "InvalidLength") {
355
+ return `Tuple 必须恰好包含 ${error.reason.expected} 个元素,但该值包含 ${error.reason.actual} 个。`;
356
+ }
357
+
358
+ const issue = error.reason.issues[0];
359
+
360
+ switch (issue.kind) {
361
+ case "Hole":
362
+ return `索引 ${issue.index} 处缺少 Tuple 元素。`;
363
+ case "Accessor":
364
+ return `索引 ${issue.index} 处的 Tuple 元素必须是数据属性。`;
365
+ case "ExcessProperty":
366
+ return "不允许多余的 Tuple 属性。请将其删除或使用其他 Type。";
367
+ case "Element":
368
+ return `索引 ${issue.index} 处的 Tuple 元素无效。`;
369
+ }
370
+ };
371
+
372
+ /** 以简体中文格式化 RecordError。 */
373
+ export const formatRecordError: TypeErrorFormatter<RecordError> = (error) => {
374
+ if (error.reason.kind === "NotRecord") {
375
+ return `值 ${safelyStringifyUnknownValue(error.reason.value)} 不是 Record。`;
376
+ }
377
+ if (error.reason.kind === "NotPlainRecord") {
378
+ return "该值是对象,但 Record Output 必须是普通对象或具有 null 原型。";
379
+ }
380
+
381
+ const issue = error.reason.issues[0];
382
+
383
+ switch (issue.kind) {
384
+ case "Key":
385
+ return `属性键 ${safelyStringifyUnknownValue(issue.key)} 无效。`;
386
+ case "Value":
387
+ return `属性 ${safelyStringifyUnknownValue(issue.key)} 的值无效。`;
388
+ case "Accessor":
389
+ return `Record 属性 ${safelyStringifyUnknownValue(issue.key)} 必须是数据属性。`;
390
+ case "NonEnumerable":
391
+ return `Record 属性 ${safelyStringifyUnknownValue(issue.key)} 必须是可枚举的。`;
392
+ case "Collision":
393
+ return `Record 键 ${safelyStringifyUnknownValue(issue.previousKey)} 和 ${safelyStringifyUnknownValue(issue.key)} 解码后得到相同的键 ${safelyStringifyUnknownValue(issue.outputKey)}。`;
394
+ }
395
+ };
396
+
397
+ /** Formats an ObjectError。 */
398
+ export const formatObjectError: TypeErrorFormatter<ObjectError> = (error) => {
399
+ if (error.reason.kind !== "Properties") {
400
+ return formatPlainObjectRootError(error.reason);
401
+ }
402
+
403
+ const key = Reflect.ownKeys(error.reason.errors).at(0);
404
+ assertNonNullable(key);
405
+ const propertyError = error.reason.errors[key];
406
+ assertNonNullable(propertyError);
407
+
408
+ if (propertyError.type === "ObjectPropertyAccess") {
409
+ switch ((propertyError as ObjectPropertyAccessError).reason) {
410
+ case "Accessor":
411
+ return "Object 属性必须是数据属性。请先将访问器值具体化为普通数据,再使用此 Type,或改用其他 Type。";
412
+ case "NonEnumerable":
413
+ return "Object 属性必须可枚举。请将其设为可枚举,或使用其他 Type。";
414
+ }
415
+ }
416
+ if (propertyError.type === "ObjectMissingProperty") {
417
+ return `缺少必需属性 ${safelyStringifyUnknownValue(key)}。`;
418
+ }
419
+ if (typeof key === "symbol") {
420
+ return "Object 属性键必须是字符串。请删除 symbol 属性或使用其他 Type。";
421
+ }
422
+ if (propertyError.type === "ObjectExcessProperty") {
423
+ return `不允许属性 ${safelyStringifyUnknownValue(key)}。请将其删除或使用其他 Type。`;
424
+ }
425
+ return `属性 ${safelyStringifyUnknownValue(key)} 无效。`;
426
+ };
427
+
428
+ /** 以简体中文格式化 DiscriminatedUnionError。 */
429
+ export const formatDiscriminatedUnionError: TypeErrorFormatter<
430
+ DiscriminatedUnionError
431
+ > = (error) => {
432
+ switch (error.reason.kind) {
433
+ case "Object":
434
+ return formatPlainObjectRootError(error.reason.error.reason);
435
+ case "PropertyAccess": {
436
+ const property = `判别属性 ${safelyStringifyUnknownValue(error.reason.key)}`;
437
+ if (error.reason.reason === "Accessor") {
438
+ return `${property} 必须是数据属性。`;
439
+ }
440
+ if (error.reason.reason === "Inherited") {
441
+ return `${property} 必须是自有属性。`;
442
+ }
443
+ return `${property} 必须是可枚举的。`;
444
+ }
445
+ case "Discriminator":
446
+ return `判别属性 ${safelyStringifyUnknownValue(error.reason.key)} 的值 ${safelyStringifyUnknownValue(error.reason.value)} 不符合预期。`;
447
+ case "Member":
448
+ return `所选变体 ${safelyStringifyUnknownValue(error.reason.discriminator)} 无效。`;
449
+ }
450
+ };
451
+
452
+ /** 以简体中文格式化 JsonValueError。 */
453
+ export const formatJsonValueError: TypeErrorFormatter<JsonValueError> = (
454
+ error,
455
+ ) => {
456
+ const issue = error.reason.issues[0];
457
+
458
+ switch (issue.kind) {
459
+ case "InvalidType":
460
+ return `值 ${safelyStringifyUnknownValue(issue.value)} 不是 JSON 值。`;
461
+ case "NonFiniteNumber":
462
+ return "JSON 数字必须是有限数。";
463
+ case "UnexpectedPrototype":
464
+ return "该值是对象,但 JsonValue 对象必须是普通对象或具有 null 原型。";
465
+ case "Accessor":
466
+ return "JSON 属性必须是数据属性。请先将访问器值具体化为普通数据,再使用此 Type,或改用其他 Type。";
467
+ case "NonEnumerable":
468
+ return "JSON 对象属性必须可枚举。请将其删除或使用其他 Type。";
469
+ case "SymbolProperty":
470
+ return "JSON 对象属性键必须是字符串。请删除 symbol 属性或使用其他 Type。";
471
+ case "Hole":
472
+ return "缺少 JSON 数组元素。";
473
+ case "ExcessProperty":
474
+ return "不允许多余的 JSON 数组属性。请将其删除或使用其他 Type。";
475
+ case "CircularReference":
476
+ return "JsonValue 不能包含循环引用。";
477
+ }
478
+ };
479
+
480
+ /** 以简体中文格式化 JsonError。 */
481
+ export const formatJsonError: TypeErrorFormatter<JsonError> = (error) =>
482
+ `值 ${safelyStringifyUnknownValue(error.value)} 无法解析为 JsonValue。`;