@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
+ /** 以繁體中文格式化 EvoluTypeError。 */
121
+ export const formatEvoluTypeError: TypeErrorFormatter<EvoluTypeError> = (
122
+ error,
123
+ ) => `值 ${safelyStringifyUnknownValue(error.value)} 不是 Evolu Type。`;
124
+
125
+ /** 以繁體中文格式化 ObjectTagError。 */
126
+ export const formatObjectTagError: TypeErrorFormatter<ObjectTagError> = (
127
+ error,
128
+ ) =>
129
+ `值 ${safelyStringifyUnknownValue(error.value)} 沒有預期的物件標籤 ${safelyStringifyUnknownValue(error.expected)}。`;
130
+
131
+ /** 以繁體中文格式化 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
+ /** 以繁體中文格式化 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
+ /** 以繁體中文格式化 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
+ /** 以繁體中文格式化 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
+ /** 以繁體中文格式化 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
+ /** 以繁體中文格式化 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
+ /** 以繁體中文格式化 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。`;