@evolu/common 8.2.0 → 8.3.1

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 (221) 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/Object.d.ts +1 -0
  6. package/dist/src/Object.d.ts.map +1 -1
  7. package/dist/src/RefCount.d.ts +1 -0
  8. package/dist/src/RefCount.d.ts.map +1 -1
  9. package/dist/src/Relation.d.ts +2 -0
  10. package/dist/src/Relation.d.ts.map +1 -1
  11. package/dist/src/Resource.d.ts +1 -0
  12. package/dist/src/Resource.d.ts.map +1 -1
  13. package/dist/src/Result.d.ts +383 -548
  14. package/dist/src/Result.d.ts.map +1 -1
  15. package/dist/src/Result.js +296 -46
  16. package/dist/src/StackTrace.d.ts +1 -0
  17. package/dist/src/StackTrace.d.ts.map +1 -1
  18. package/dist/src/Task.d.ts +985 -1069
  19. package/dist/src/Task.d.ts.map +1 -1
  20. package/dist/src/Task.js +1007 -156
  21. package/dist/src/Time.d.ts +1 -0
  22. package/dist/src/Time.d.ts.map +1 -1
  23. package/dist/src/Type.d.ts +1322 -793
  24. package/dist/src/Type.d.ts.map +1 -1
  25. package/dist/src/Type.js +1192 -244
  26. package/dist/src/intl/_en.d.ts +126 -0
  27. package/dist/src/intl/_en.d.ts.map +1 -0
  28. package/dist/src/intl/_en.js +267 -0
  29. package/dist/src/intl/ar.d.ts +117 -0
  30. package/dist/src/intl/ar.d.ts.map +1 -0
  31. package/dist/src/intl/ar.js +245 -0
  32. package/dist/src/intl/bn.d.ts +117 -0
  33. package/dist/src/intl/bn.d.ts.map +1 -0
  34. package/dist/src/intl/bn.js +258 -0
  35. package/dist/src/intl/ca.d.ts +117 -0
  36. package/dist/src/intl/ca.d.ts.map +1 -0
  37. package/dist/src/intl/ca.js +258 -0
  38. package/dist/src/intl/cs.d.ts +20 -7
  39. package/dist/src/intl/cs.d.ts.map +1 -1
  40. package/dist/src/intl/cs.js +54 -27
  41. package/dist/src/intl/da.d.ts +117 -0
  42. package/dist/src/intl/da.d.ts.map +1 -0
  43. package/dist/src/intl/da.js +258 -0
  44. package/dist/src/intl/de.d.ts +117 -0
  45. package/dist/src/intl/de.d.ts.map +1 -0
  46. package/dist/src/intl/de.js +258 -0
  47. package/dist/src/intl/el.d.ts +117 -0
  48. package/dist/src/intl/el.d.ts.map +1 -0
  49. package/dist/src/intl/el.js +265 -0
  50. package/dist/src/intl/es.d.ts +117 -0
  51. package/dist/src/intl/es.d.ts.map +1 -0
  52. package/dist/src/intl/es.js +258 -0
  53. package/dist/src/intl/fa.d.ts +117 -0
  54. package/dist/src/intl/fa.d.ts.map +1 -0
  55. package/dist/src/intl/fa.js +258 -0
  56. package/dist/src/intl/fi.d.ts +117 -0
  57. package/dist/src/intl/fi.d.ts.map +1 -0
  58. package/dist/src/intl/fi.js +258 -0
  59. package/dist/src/intl/fil.d.ts +117 -0
  60. package/dist/src/intl/fil.d.ts.map +1 -0
  61. package/dist/src/intl/fil.js +258 -0
  62. package/dist/src/intl/fr.d.ts +117 -0
  63. package/dist/src/intl/fr.d.ts.map +1 -0
  64. package/dist/src/intl/fr.js +258 -0
  65. package/dist/src/intl/he.d.ts +117 -0
  66. package/dist/src/intl/he.d.ts.map +1 -0
  67. package/dist/src/intl/he.js +258 -0
  68. package/dist/src/intl/hi.d.ts +117 -0
  69. package/dist/src/intl/hi.d.ts.map +1 -0
  70. package/dist/src/intl/hi.js +258 -0
  71. package/dist/src/intl/hr.d.ts +117 -0
  72. package/dist/src/intl/hr.d.ts.map +1 -0
  73. package/dist/src/intl/hr.js +265 -0
  74. package/dist/src/intl/hu.d.ts +63 -0
  75. package/dist/src/intl/hu.d.ts.map +1 -0
  76. package/dist/src/intl/hu.js +204 -0
  77. package/dist/src/intl/id.d.ts +117 -0
  78. package/dist/src/intl/id.d.ts.map +1 -0
  79. package/dist/src/intl/id.js +258 -0
  80. package/dist/src/intl/index.d.ts +42 -0
  81. package/dist/src/intl/index.d.ts.map +1 -1
  82. package/dist/src/intl/index.js +42 -0
  83. package/dist/src/intl/it.d.ts +117 -0
  84. package/dist/src/intl/it.d.ts.map +1 -0
  85. package/dist/src/intl/it.js +258 -0
  86. package/dist/src/intl/ja.d.ts +117 -0
  87. package/dist/src/intl/ja.d.ts.map +1 -0
  88. package/dist/src/intl/ja.js +258 -0
  89. package/dist/src/intl/ko.d.ts +117 -0
  90. package/dist/src/intl/ko.d.ts.map +1 -0
  91. package/dist/src/intl/ko.js +258 -0
  92. package/dist/src/intl/ml.d.ts +117 -0
  93. package/dist/src/intl/ml.d.ts.map +1 -0
  94. package/dist/src/intl/ml.js +258 -0
  95. package/dist/src/intl/mr.d.ts +117 -0
  96. package/dist/src/intl/mr.d.ts.map +1 -0
  97. package/dist/src/intl/mr.js +258 -0
  98. package/dist/src/intl/ms.d.ts +117 -0
  99. package/dist/src/intl/ms.d.ts.map +1 -0
  100. package/dist/src/intl/ms.js +245 -0
  101. package/dist/src/intl/nb.d.ts +63 -0
  102. package/dist/src/intl/nb.d.ts.map +1 -0
  103. package/dist/src/intl/nb.js +191 -0
  104. package/dist/src/intl/nl.d.ts +117 -0
  105. package/dist/src/intl/nl.d.ts.map +1 -0
  106. package/dist/src/intl/nl.js +258 -0
  107. package/dist/src/intl/pa.d.ts +117 -0
  108. package/dist/src/intl/pa.d.ts.map +1 -0
  109. package/dist/src/intl/pa.js +258 -0
  110. package/dist/src/intl/pl.d.ts +117 -0
  111. package/dist/src/intl/pl.d.ts.map +1 -0
  112. package/dist/src/intl/pl.js +242 -0
  113. package/dist/src/intl/pt-BR.d.ts +117 -0
  114. package/dist/src/intl/pt-BR.d.ts.map +1 -0
  115. package/dist/src/intl/pt-BR.js +258 -0
  116. package/dist/src/intl/pt.d.ts +117 -0
  117. package/dist/src/intl/pt.d.ts.map +1 -0
  118. package/dist/src/intl/pt.js +246 -0
  119. package/dist/src/intl/ro.d.ts +117 -0
  120. package/dist/src/intl/ro.d.ts.map +1 -0
  121. package/dist/src/intl/ro.js +258 -0
  122. package/dist/src/intl/sk.d.ts +117 -0
  123. package/dist/src/intl/sk.d.ts.map +1 -0
  124. package/dist/src/intl/sk.js +244 -0
  125. package/dist/src/intl/sl.d.ts +117 -0
  126. package/dist/src/intl/sl.d.ts.map +1 -0
  127. package/dist/src/intl/sl.js +258 -0
  128. package/dist/src/intl/sv.d.ts +117 -0
  129. package/dist/src/intl/sv.d.ts.map +1 -0
  130. package/dist/src/intl/sv.js +258 -0
  131. package/dist/src/intl/sw.d.ts +63 -0
  132. package/dist/src/intl/sw.d.ts.map +1 -0
  133. package/dist/src/intl/sw.js +191 -0
  134. package/dist/src/intl/ta.d.ts +117 -0
  135. package/dist/src/intl/ta.d.ts.map +1 -0
  136. package/dist/src/intl/ta.js +258 -0
  137. package/dist/src/intl/te.d.ts +117 -0
  138. package/dist/src/intl/te.d.ts.map +1 -0
  139. package/dist/src/intl/te.js +258 -0
  140. package/dist/src/intl/th.d.ts +117 -0
  141. package/dist/src/intl/th.d.ts.map +1 -0
  142. package/dist/src/intl/th.js +258 -0
  143. package/dist/src/intl/tr.d.ts +117 -0
  144. package/dist/src/intl/tr.d.ts.map +1 -0
  145. package/dist/src/intl/tr.js +255 -0
  146. package/dist/src/intl/uk.d.ts +117 -0
  147. package/dist/src/intl/uk.d.ts.map +1 -0
  148. package/dist/src/intl/uk.js +258 -0
  149. package/dist/src/intl/ur.d.ts +117 -0
  150. package/dist/src/intl/ur.d.ts.map +1 -0
  151. package/dist/src/intl/ur.js +245 -0
  152. package/dist/src/intl/vi.d.ts +117 -0
  153. package/dist/src/intl/vi.d.ts.map +1 -0
  154. package/dist/src/intl/vi.js +255 -0
  155. package/dist/src/intl/zh-CN.d.ts +117 -0
  156. package/dist/src/intl/zh-CN.d.ts.map +1 -0
  157. package/dist/src/intl/zh-CN.js +258 -0
  158. package/dist/src/intl/zh-TW.d.ts +117 -0
  159. package/dist/src/intl/zh-TW.d.ts.map +1 -0
  160. package/dist/src/intl/zh-TW.js +258 -0
  161. package/dist/src/local-first/Owner.d.ts +156 -62
  162. package/dist/src/local-first/Owner.d.ts.map +1 -1
  163. package/dist/src/local-first/Owner.js +119 -20
  164. package/package.json +1 -1
  165. package/src/Function.ts +2 -0
  166. package/src/Http.ts +9 -0
  167. package/src/Object.ts +2 -0
  168. package/src/RefCount.ts +2 -0
  169. package/src/Relation.ts +4 -0
  170. package/src/Resource.ts +2 -0
  171. package/src/Result.ts +397 -560
  172. package/src/StackTrace.ts +2 -0
  173. package/src/Task.ts +1143 -1222
  174. package/src/Time.ts +2 -0
  175. package/src/Type.ts +1759 -794
  176. package/src/intl/_en.ts +497 -0
  177. package/src/intl/ar.ts +417 -0
  178. package/src/intl/bn.ts +486 -0
  179. package/src/intl/ca.ts +488 -0
  180. package/src/intl/cs.ts +95 -31
  181. package/src/intl/da.ts +488 -0
  182. package/src/intl/de.ts +488 -0
  183. package/src/intl/el.ts +494 -0
  184. package/src/intl/es.ts +488 -0
  185. package/src/intl/fa.ts +487 -0
  186. package/src/intl/fi.ts +487 -0
  187. package/src/intl/fil.ts +488 -0
  188. package/src/intl/fr.ts +488 -0
  189. package/src/intl/he.ts +486 -0
  190. package/src/intl/hi.ts +487 -0
  191. package/src/intl/hr.ts +494 -0
  192. package/src/intl/hu.ts +387 -0
  193. package/src/intl/id.ts +487 -0
  194. package/src/intl/index.ts +42 -0
  195. package/src/intl/it.ts +488 -0
  196. package/src/intl/ja.ts +488 -0
  197. package/src/intl/ko.ts +487 -0
  198. package/src/intl/ml.ts +487 -0
  199. package/src/intl/mr.ts +487 -0
  200. package/src/intl/ms.ts +410 -0
  201. package/src/intl/nb.ts +364 -0
  202. package/src/intl/nl.ts +488 -0
  203. package/src/intl/pa.ts +487 -0
  204. package/src/intl/pl.ts +450 -0
  205. package/src/intl/pt-BR.ts +487 -0
  206. package/src/intl/pt.ts +424 -0
  207. package/src/intl/ro.ts +488 -0
  208. package/src/intl/sk.ts +412 -0
  209. package/src/intl/sl.ts +487 -0
  210. package/src/intl/sv.ts +488 -0
  211. package/src/intl/sw.ts +324 -0
  212. package/src/intl/ta.ts +487 -0
  213. package/src/intl/te.ts +487 -0
  214. package/src/intl/th.ts +484 -0
  215. package/src/intl/tr.ts +487 -0
  216. package/src/intl/uk.ts +488 -0
  217. package/src/intl/ur.ts +410 -0
  218. package/src/intl/vi.ts +435 -0
  219. package/src/intl/zh-CN.ts +482 -0
  220. package/src/intl/zh-TW.ts +482 -0
  221. package/src/local-first/Owner.ts +156 -62
package/src/intl/ko.ts ADDED
@@ -0,0 +1,487 @@
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
+ "값이 허용된 어떤 variant와도 일치하지 않습니다.";
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)} 값은 정규 10진수 문자열이어야 합니다.`;
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
+ ) =>
172
+ `${safelyStringifyUnknownValue(error.value)} 값은 유효한 Int64 문자열이 아닙니다.`;
173
+
174
+ /** CapitalizedError를 한국어로 포맷합니다. */
175
+ export const formatCapitalizedError: TypeErrorFormatter<CapitalizedError> = (
176
+ error,
177
+ ) =>
178
+ `${safelyStringifyUnknownValue(error.value)} 값은 첫 글자가 대문자여야 합니다.`;
179
+
180
+ /** TrimmedError를 한국어로 포맷합니다. */
181
+ export const formatTrimmedError: TypeErrorFormatter<TrimmedError> = (error) =>
182
+ `${safelyStringifyUnknownValue(error.value)} 값의 앞뒤 공백이 제거되어 있어야 합니다.`;
183
+
184
+ /** MinLengthError를 한국어로 포맷합니다. */
185
+ export const formatMinLengthError: TypeErrorFormatter<MinLengthError> = (
186
+ error,
187
+ ) =>
188
+ `${safelyStringifyUnknownValue(error.value)} 값은 최소 길이 ${error.min}을 충족하지 않습니다.`;
189
+
190
+ /** MaxLengthError를 한국어로 포맷합니다. */
191
+ export const formatMaxLengthError: TypeErrorFormatter<MaxLengthError> = (
192
+ error,
193
+ ) =>
194
+ `${safelyStringifyUnknownValue(error.value)} 값은 최대 길이 ${error.max}을 초과합니다.`;
195
+
196
+ /** LengthError를 한국어로 포맷합니다. */
197
+ export const formatLengthError: TypeErrorFormatter<LengthError> = (error) =>
198
+ `${safelyStringifyUnknownValue(error.value)} 값의 길이는 ${error.exact}이어야 합니다.`;
199
+
200
+ /** RegexError를 한국어로 포맷합니다. */
201
+ export const formatRegexError: TypeErrorFormatter<RegexError> = (error) =>
202
+ `${safelyStringifyUnknownValue(error.value)} 값은 /${error.source}/${error.flags}와 일치하지 않습니다.`;
203
+
204
+ /** Base64UrlError를 한국어로 포맷합니다. */
205
+ export const formatBase64UrlError: TypeErrorFormatter<Base64UrlError> = (
206
+ error,
207
+ ) =>
208
+ `${safelyStringifyUnknownValue(error.value)} 값은 유효한 Base64Url 문자열이 아닙니다.`;
209
+
210
+ /** NameError를 한국어로 포맷합니다. */
211
+ export const formatNameError: TypeErrorFormatter<NameError> = (error) =>
212
+ `${safelyStringifyUnknownValue(error.value)} 값은 유효한 Name이 아닙니다.`;
213
+
214
+ /** MnemonicError를 한국어로 포맷합니다. */
215
+ export const formatMnemonicError: TypeErrorFormatter<MnemonicError> = (error) =>
216
+ `${safelyStringifyUnknownValue(error.value)} 값은 유효한 영어 BIP39 니모닉이 아닙니다.`;
217
+
218
+ /** IdError를 한국어로 포맷합니다. */
219
+ export const formatIdError: TypeErrorFormatter<IdError> = (error) =>
220
+ `${safelyStringifyUnknownValue(error.value)} 값은 유효한 Id가 아닙니다.`;
221
+
222
+ /** TableIdError를 한국어로 포맷합니다. */
223
+ export const formatTableIdError: TypeErrorFormatter<TableIdError> = (error) =>
224
+ `${safelyStringifyUnknownValue(error.value)} 값은 ${error.table} 테이블에 유효한 Id가 아닙니다.`;
225
+
226
+ /** NonNegativeError를 한국어로 포맷합니다. */
227
+ export const formatNonNegativeError: TypeErrorFormatter<NonNegativeError> = (
228
+ error,
229
+ ) =>
230
+ `${safelyStringifyUnknownValue(error.value)} 값은 음수가 아니어야 합니다(>= 0).`;
231
+
232
+ /** NonNegativeDecimalStringError를 한국어로 포맷합니다. */
233
+ export const formatNonNegativeDecimalStringError: TypeErrorFormatter<
234
+ NonNegativeDecimalStringError
235
+ > = (error) =>
236
+ `${safelyStringifyUnknownValue(error.value)} 값은 음수가 아닌 10진수 문자열이어야 합니다.`;
237
+
238
+ /** PositiveError를 한국어로 포맷합니다. */
239
+ export const formatPositiveError: TypeErrorFormatter<PositiveError> = (error) =>
240
+ `${safelyStringifyUnknownValue(error.value)} 값은 양수여야 합니다(> 0).`;
241
+
242
+ /** PositiveDecimalStringError를 한국어로 포맷합니다. */
243
+ export const formatPositiveDecimalStringError: TypeErrorFormatter<
244
+ PositiveDecimalStringError
245
+ > = (error) =>
246
+ `${safelyStringifyUnknownValue(error.value)} 값은 양의 10진수 문자열이어야 합니다.`;
247
+
248
+ /** NonPositiveError를 한국어로 포맷합니다. */
249
+ export const formatNonPositiveError: TypeErrorFormatter<NonPositiveError> = (
250
+ error,
251
+ ) =>
252
+ `${safelyStringifyUnknownValue(error.value)} 값은 양수가 아니어야 합니다(<= 0).`;
253
+
254
+ /** NonPositiveDecimalStringError를 한국어로 포맷합니다. */
255
+ export const formatNonPositiveDecimalStringError: TypeErrorFormatter<
256
+ NonPositiveDecimalStringError
257
+ > = (error) =>
258
+ `${safelyStringifyUnknownValue(error.value)} 값은 양수가 아닌 10진수 문자열이어야 합니다.`;
259
+
260
+ /** NegativeError를 한국어로 포맷합니다. */
261
+ export const formatNegativeError: TypeErrorFormatter<NegativeError> = (error) =>
262
+ `${safelyStringifyUnknownValue(error.value)} 값은 음수여야 합니다(< 0).`;
263
+
264
+ /** NegativeDecimalStringError를 한국어로 포맷합니다. */
265
+ export const formatNegativeDecimalStringError: TypeErrorFormatter<
266
+ NegativeDecimalStringError
267
+ > = (error) =>
268
+ `${safelyStringifyUnknownValue(error.value)} 값은 음의 10진수 문자열이어야 합니다.`;
269
+
270
+ /** IntError를 한국어로 포맷합니다. */
271
+ export const formatIntError: TypeErrorFormatter<IntError> = (error) =>
272
+ `${safelyStringifyUnknownValue(error.value)} 값은 안전한 정수여야 합니다.`;
273
+
274
+ /** GreaterThanError를 한국어로 포맷합니다. */
275
+ export const formatGreaterThanError: TypeErrorFormatter<GreaterThanError> = (
276
+ error,
277
+ ) =>
278
+ `${safelyStringifyUnknownValue(error.value)} 값은 ${error.min}보다 커야 합니다.`;
279
+
280
+ /** GreaterThanOrEqualToError를 한국어로 포맷합니다. */
281
+ export const formatGreaterThanOrEqualToError: TypeErrorFormatter<
282
+ GreaterThanOrEqualToError
283
+ > = (error) =>
284
+ `${safelyStringifyUnknownValue(error.value)} 값은 ${error.min} 이상이어야 합니다.`;
285
+
286
+ /** LessThanError를 한국어로 포맷합니다. */
287
+ export const formatLessThanError: TypeErrorFormatter<LessThanError> = (error) =>
288
+ `${safelyStringifyUnknownValue(error.value)} 값은 ${error.max}보다 작아야 합니다.`;
289
+
290
+ /** LessThanOrEqualToError를 한국어로 포맷합니다. */
291
+ export const formatLessThanOrEqualToError: TypeErrorFormatter<
292
+ LessThanOrEqualToError
293
+ > = (error) =>
294
+ `${safelyStringifyUnknownValue(error.value)} 값은 ${error.max} 이하여야 합니다.`;
295
+
296
+ /** NonNaNError를 한국어로 포맷합니다. */
297
+ export const formatNonNaNError: TypeErrorFormatter<NonNaNError> = () =>
298
+ "값은 NaN이어서는 안 됩니다.";
299
+
300
+ /** FiniteError를 한국어로 포맷합니다. */
301
+ export const formatFiniteError: TypeErrorFormatter<FiniteError> = (error) =>
302
+ `${safelyStringifyUnknownValue(error.value)} 값은 유한해야 합니다.`;
303
+
304
+ /** MultipleOfError를 한국어로 포맷합니다. */
305
+ export const formatMultipleOfError: TypeErrorFormatter<MultipleOfError> = (
306
+ error,
307
+ ) =>
308
+ `${safelyStringifyUnknownValue(error.value)} 값은 ${error.divisor}의 배수여야 합니다.`;
309
+
310
+ /** BetweenError를 한국어로 포맷합니다. */
311
+ export const formatBetweenError: TypeErrorFormatter<BetweenError> = (error) =>
312
+ `${safelyStringifyUnknownValue(error.value)} 값은 ${error.min} 이상 ${error.max} 이하여야 합니다.`;
313
+
314
+ /** ArrayError를 한국어로 포맷합니다. */
315
+ export const formatArrayError: TypeErrorFormatter<ArrayError> = (error) => {
316
+ if (error.reason.kind === "NotArray") {
317
+ return `${safelyStringifyUnknownValue(error.reason.value)} 값은 배열이 아닙니다.`;
318
+ }
319
+ const issue = error.reason.issues[0];
320
+
321
+ switch (issue.kind) {
322
+ case "Hole":
323
+ return `인덱스 ${issue.index}의 배열 요소가 없습니다.`;
324
+ case "Accessor":
325
+ return `인덱스 ${issue.index}의 배열 요소는 데이터 프로퍼티여야 합니다.`;
326
+ case "ExcessProperty":
327
+ return "불필요한 Array 프로퍼티는 허용되지 않습니다. 해당 프로퍼티를 제거하거나 다른 Type을 사용하세요.";
328
+ case "Element":
329
+ return `인덱스 ${issue.index}의 배열 요소가 유효하지 않습니다.`;
330
+ }
331
+ };
332
+
333
+ /** SetError를 한국어로 포맷합니다. */
334
+ export const formatSetError: TypeErrorFormatter<SetError> = (error) => {
335
+ if (error.reason.kind === "NotSet") {
336
+ return `${safelyStringifyUnknownValue(error.reason.value)} 값은 Set이 아닙니다.`;
337
+ }
338
+ if (error.reason.kind === "UnexpectedPrototype") {
339
+ return "값은 Set 서브클래스의 인스턴스이지만 Set Output은 직접적인 Set 인스턴스여야 합니다.";
340
+ }
341
+
342
+ const issue = error.reason.issues[0];
343
+
344
+ switch (issue.kind) {
345
+ case "ExcessProperty":
346
+ return `불필요한 Set 프로퍼티 ${safelyStringifyUnknownValue(issue.key)}은(는) 허용되지 않습니다.`;
347
+ case "Element":
348
+ return `인덱스 ${issue.index}의 Set 요소가 유효하지 않습니다.`;
349
+ }
350
+ };
351
+
352
+ /** TupleError를 한국어로 포맷합니다. */
353
+ export const formatTupleError: TypeErrorFormatter<
354
+ TupleError | TupleElementsError<TypeError>
355
+ > = (error) => {
356
+ if (error.reason.kind === "NotArray") {
357
+ return `${safelyStringifyUnknownValue(error.reason.value)} 값은 튜플이 아닙니다.`;
358
+ }
359
+ if (error.reason.kind === "InvalidLength") {
360
+ return `Tuple에는 정확히 ${error.reason.expected}개의 요소가 있어야 하지만 값에는 ${error.reason.actual}개의 요소가 있습니다.`;
361
+ }
362
+
363
+ const issue = error.reason.issues[0];
364
+
365
+ switch (issue.kind) {
366
+ case "Hole":
367
+ return `인덱스 ${issue.index}의 Tuple 요소가 없습니다.`;
368
+ case "Accessor":
369
+ return `인덱스 ${issue.index}의 Tuple 요소는 데이터 프로퍼티여야 합니다.`;
370
+ case "ExcessProperty":
371
+ return "불필요한 Tuple 프로퍼티는 허용되지 않습니다. 해당 프로퍼티를 제거하거나 다른 Type을 사용하세요.";
372
+ case "Element":
373
+ return `인덱스 ${issue.index}의 Tuple 요소가 유효하지 않습니다.`;
374
+ }
375
+ };
376
+
377
+ /** RecordError를 한국어로 포맷합니다. */
378
+ export const formatRecordError: TypeErrorFormatter<RecordError> = (error) => {
379
+ if (error.reason.kind === "NotRecord") {
380
+ return `${safelyStringifyUnknownValue(error.reason.value)} 값은 Record가 아닙니다.`;
381
+ }
382
+ if (error.reason.kind === "NotPlainRecord") {
383
+ return "값은 객체이지만 Record Output은 일반 객체이거나 null 프로토타입을 가져야 합니다.";
384
+ }
385
+
386
+ const issue = error.reason.issues[0];
387
+
388
+ switch (issue.kind) {
389
+ case "Key":
390
+ return `프로퍼티 키 ${safelyStringifyUnknownValue(issue.key)}이(가) 유효하지 않습니다.`;
391
+ case "Value":
392
+ return `프로퍼티 ${safelyStringifyUnknownValue(issue.key)}의 값이 유효하지 않습니다.`;
393
+ case "Accessor":
394
+ return `Record 프로퍼티 ${safelyStringifyUnknownValue(issue.key)}은(는) 데이터 프로퍼티여야 합니다.`;
395
+ case "NonEnumerable":
396
+ return `Record 프로퍼티 ${safelyStringifyUnknownValue(issue.key)}은(는) 열거 가능해야 합니다.`;
397
+ case "Collision":
398
+ return `Record 키 ${safelyStringifyUnknownValue(issue.previousKey)}와(과) ${safelyStringifyUnknownValue(issue.key)}은(는) 디코딩하면 동일한 키 ${safelyStringifyUnknownValue(issue.outputKey)}이(가) 됩니다.`;
399
+ }
400
+ };
401
+
402
+ /** ObjectError를 한국어로 포맷합니다. */
403
+ export const formatObjectError: TypeErrorFormatter<ObjectError> = (error) => {
404
+ if (error.reason.kind !== "Properties") {
405
+ return formatPlainObjectRootError(error.reason);
406
+ }
407
+
408
+ const key = Reflect.ownKeys(error.reason.errors).at(0);
409
+ assertNonNullable(key);
410
+ const propertyError = error.reason.errors[key];
411
+ assertNonNullable(propertyError);
412
+
413
+ if (propertyError.type === "ObjectPropertyAccess") {
414
+ switch ((propertyError as ObjectPropertyAccessError).reason) {
415
+ case "Accessor":
416
+ return "Object 프로퍼티는 데이터 프로퍼티여야 합니다. 이 Type을 사용하기 전에 접근자 값을 일반 데이터로 구체화하거나 다른 Type을 사용하세요.";
417
+ case "NonEnumerable":
418
+ return "Object 프로퍼티는 열거 가능해야 합니다. 열거 가능하게 만들거나 다른 Type을 사용하세요.";
419
+ }
420
+ }
421
+ if (propertyError.type === "ObjectMissingProperty") {
422
+ return `필수 프로퍼티 ${safelyStringifyUnknownValue(key)}이(가) 없습니다.`;
423
+ }
424
+ if (typeof key === "symbol") {
425
+ return "Object 프로퍼티 키는 문자열이어야 합니다. symbol 프로퍼티를 제거하거나 다른 Type을 사용하세요.";
426
+ }
427
+ if (propertyError.type === "ObjectExcessProperty") {
428
+ return `프로퍼티 ${safelyStringifyUnknownValue(key)}은(는) 허용되지 않습니다. 해당 프로퍼티를 제거하거나 다른 Type을 사용하세요.`;
429
+ }
430
+ return `프로퍼티 ${safelyStringifyUnknownValue(key)}이(가) 유효하지 않습니다.`;
431
+ };
432
+
433
+ /** DiscriminatedUnionError를 한국어로 포맷합니다. */
434
+ export const formatDiscriminatedUnionError: TypeErrorFormatter<
435
+ DiscriminatedUnionError
436
+ > = (error) => {
437
+ switch (error.reason.kind) {
438
+ case "Object":
439
+ return formatPlainObjectRootError(error.reason.error.reason);
440
+ case "PropertyAccess": {
441
+ const property = `판별자 프로퍼티 ${safelyStringifyUnknownValue(error.reason.key)}`;
442
+ if (error.reason.reason === "Accessor") {
443
+ return `${property}은(는) 데이터 프로퍼티여야 합니다.`;
444
+ }
445
+ if (error.reason.reason === "Inherited") {
446
+ return `${property}은(는) 자체 프로퍼티여야 합니다.`;
447
+ }
448
+ return `${property}은(는) 열거 가능해야 합니다.`;
449
+ }
450
+ case "Discriminator":
451
+ return `판별자 프로퍼티 ${safelyStringifyUnknownValue(error.reason.key)}에 예상하지 못한 값 ${safelyStringifyUnknownValue(error.reason.value)}이(가) 있습니다.`;
452
+ case "Member":
453
+ return `선택된 variant ${safelyStringifyUnknownValue(error.reason.discriminator)}이(가) 유효하지 않습니다.`;
454
+ }
455
+ };
456
+
457
+ /** JsonValueError를 한국어로 포맷합니다. */
458
+ export const formatJsonValueError: TypeErrorFormatter<JsonValueError> = (
459
+ error,
460
+ ) => {
461
+ const issue = error.reason.issues[0];
462
+
463
+ switch (issue.kind) {
464
+ case "InvalidType":
465
+ return `${safelyStringifyUnknownValue(issue.value)} 값은 JSON 값이 아닙니다.`;
466
+ case "NonFiniteNumber":
467
+ return "JSON 숫자는 유한해야 합니다.";
468
+ case "UnexpectedPrototype":
469
+ return "값은 객체이지만 JsonValue 객체는 일반 객체이거나 null 프로토타입을 가져야 합니다.";
470
+ case "Accessor":
471
+ return "JSON 프로퍼티는 데이터 프로퍼티여야 합니다. 이 Type을 사용하기 전에 접근자 값을 일반 데이터로 구체화하거나 다른 Type을 사용하세요.";
472
+ case "NonEnumerable":
473
+ return "JSON 객체 프로퍼티는 열거 가능해야 합니다. 해당 프로퍼티를 제거하거나 다른 Type을 사용하세요.";
474
+ case "SymbolProperty":
475
+ return "JSON 객체 프로퍼티 키는 문자열이어야 합니다. symbol 프로퍼티를 제거하거나 다른 Type을 사용하세요.";
476
+ case "Hole":
477
+ return "JSON 배열 요소가 없습니다.";
478
+ case "ExcessProperty":
479
+ return "불필요한 JSON 배열 프로퍼티는 허용되지 않습니다. 해당 프로퍼티를 제거하거나 다른 Type을 사용하세요.";
480
+ case "CircularReference":
481
+ return "JsonValue에는 순환 참조가 포함되어서는 안 됩니다.";
482
+ }
483
+ };
484
+
485
+ /** JsonError를 한국어로 포맷합니다. */
486
+ export const formatJsonError: TypeErrorFormatter<JsonError> = (error) =>
487
+ `${safelyStringifyUnknownValue(error.value)} 값을 JsonValue로 파싱할 수 없습니다.`;