@fncts/schema 0.0.15 → 0.0.17

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 (153) hide show
  1. package/AST.d.ts +19 -6
  2. package/ASTAnnotation.d.ts +10 -2
  3. package/ParseError/ParseError.d.ts +231 -0
  4. package/ParseError/ParseErrorFormatter.d.ts +2 -0
  5. package/ParseError/PathFormatter.d.ts +13 -0
  6. package/ParseError/TreeFormatter.d.ts +14 -0
  7. package/ParseError.d.ts +4 -144
  8. package/ParseResult.d.ts +1 -8
  9. package/Parser/interpreter.d.ts +0 -1
  10. package/Schema/api/conc.d.ts +0 -2
  11. package/Schema/api/hashMap.d.ts +0 -1
  12. package/Schema/api/hashSet.d.ts +0 -1
  13. package/Schema/api/immutableArray.d.ts +0 -1
  14. package/Schema/api/list.d.ts +1 -2
  15. package/Schema/api/map.d.ts +19 -0
  16. package/Schema/api/set.d.ts +19 -0
  17. package/Schema/api.d.ts +12 -2
  18. package/Schema/derivations.d.ts +1 -1
  19. package/Schema.d.ts +2 -0
  20. package/Show.d.ts +7 -3
  21. package/_cjs/AST.cjs +180 -113
  22. package/_cjs/AST.cjs.map +1 -1
  23. package/_cjs/ASTAnnotation.cjs +6 -1
  24. package/_cjs/ASTAnnotation.cjs.map +1 -1
  25. package/_cjs/Gen.cjs +24 -24
  26. package/_cjs/Gen.cjs.map +1 -1
  27. package/_cjs/ParseError/ParseError.cjs +260 -0
  28. package/_cjs/ParseError/ParseError.cjs.map +1 -0
  29. package/_cjs/ParseError/ParseErrorFormatter.cjs +6 -0
  30. package/_cjs/ParseError/ParseErrorFormatter.cjs.map +1 -0
  31. package/_cjs/ParseError/PathFormatter.cjs +94 -0
  32. package/_cjs/ParseError/PathFormatter.cjs.map +1 -0
  33. package/_cjs/ParseError/TreeFormatter.cjs +123 -0
  34. package/_cjs/ParseError/TreeFormatter.cjs.map +1 -0
  35. package/_cjs/ParseError.cjs +43 -289
  36. package/_cjs/ParseError.cjs.map +1 -1
  37. package/_cjs/ParseResult.cjs +1 -10
  38. package/_cjs/ParseResult.cjs.map +1 -1
  39. package/_cjs/Parser/api.cjs +2 -2
  40. package/_cjs/Parser/api.cjs.map +1 -1
  41. package/_cjs/Parser/definition.cjs +1 -1
  42. package/_cjs/Parser/interpreter.cjs +121 -117
  43. package/_cjs/Parser/interpreter.cjs.map +1 -1
  44. package/_cjs/Schema/api/conc.cjs +35 -45
  45. package/_cjs/Schema/api/conc.cjs.map +1 -1
  46. package/_cjs/Schema/api/either.cjs +24 -30
  47. package/_cjs/Schema/api/either.cjs.map +1 -1
  48. package/_cjs/Schema/api/hashMap.cjs +41 -101
  49. package/_cjs/Schema/api/hashMap.cjs.map +1 -1
  50. package/_cjs/Schema/api/hashSet.cjs +46 -106
  51. package/_cjs/Schema/api/hashSet.cjs.map +1 -1
  52. package/_cjs/Schema/api/immutableArray.cjs +22 -48
  53. package/_cjs/Schema/api/immutableArray.cjs.map +1 -1
  54. package/_cjs/Schema/api/list.cjs +35 -52
  55. package/_cjs/Schema/api/list.cjs.map +1 -1
  56. package/_cjs/Schema/api/map.cjs +97 -0
  57. package/_cjs/Schema/api/map.cjs.map +1 -0
  58. package/_cjs/Schema/api/maybe.cjs +24 -35
  59. package/_cjs/Schema/api/maybe.cjs.map +1 -1
  60. package/_cjs/Schema/api/set.cjs +76 -0
  61. package/_cjs/Schema/api/set.cjs.map +1 -0
  62. package/_cjs/Schema/api.cjs +21 -3
  63. package/_cjs/Schema/api.cjs.map +1 -1
  64. package/_cjs/Schema.cjs +22 -0
  65. package/_cjs/Schema.cjs.map +1 -1
  66. package/_cjs/Show.cjs +106 -89
  67. package/_cjs/Show.cjs.map +1 -1
  68. package/_cjs/utils.cjs +5 -0
  69. package/_cjs/utils.cjs.map +1 -1
  70. package/_mjs/AST.mjs +177 -112
  71. package/_mjs/AST.mjs.map +1 -1
  72. package/_mjs/ASTAnnotation.mjs +5 -0
  73. package/_mjs/ASTAnnotation.mjs.map +1 -1
  74. package/_mjs/Gen.mjs +24 -24
  75. package/_mjs/Gen.mjs.map +1 -1
  76. package/_mjs/ParseError/ParseError.mjs +228 -0
  77. package/_mjs/ParseError/ParseError.mjs.map +1 -0
  78. package/_mjs/ParseError/ParseErrorFormatter.mjs +2 -0
  79. package/_mjs/ParseError/ParseErrorFormatter.mjs.map +1 -0
  80. package/_mjs/ParseError/PathFormatter.mjs +86 -0
  81. package/_mjs/ParseError/PathFormatter.mjs.map +1 -0
  82. package/_mjs/ParseError/TreeFormatter.mjs +113 -0
  83. package/_mjs/ParseError/TreeFormatter.mjs.map +1 -0
  84. package/_mjs/ParseError.mjs +6 -270
  85. package/_mjs/ParseError.mjs.map +1 -1
  86. package/_mjs/ParseResult.mjs +1 -9
  87. package/_mjs/ParseResult.mjs.map +1 -1
  88. package/_mjs/Parser/api.mjs +2 -2
  89. package/_mjs/Parser/api.mjs.map +1 -1
  90. package/_mjs/Parser/definition.mjs +1 -1
  91. package/_mjs/Parser/interpreter.mjs +121 -117
  92. package/_mjs/Parser/interpreter.mjs.map +1 -1
  93. package/_mjs/Schema/api/conc.mjs +35 -44
  94. package/_mjs/Schema/api/conc.mjs.map +1 -1
  95. package/_mjs/Schema/api/either.mjs +24 -30
  96. package/_mjs/Schema/api/either.mjs.map +1 -1
  97. package/_mjs/Schema/api/hashMap.mjs +41 -101
  98. package/_mjs/Schema/api/hashMap.mjs.map +1 -1
  99. package/_mjs/Schema/api/hashSet.mjs +46 -106
  100. package/_mjs/Schema/api/hashSet.mjs.map +1 -1
  101. package/_mjs/Schema/api/immutableArray.mjs +23 -49
  102. package/_mjs/Schema/api/immutableArray.mjs.map +1 -1
  103. package/_mjs/Schema/api/list.mjs +35 -52
  104. package/_mjs/Schema/api/list.mjs.map +1 -1
  105. package/_mjs/Schema/api/map.mjs +88 -0
  106. package/_mjs/Schema/api/map.mjs.map +1 -0
  107. package/_mjs/Schema/api/maybe.mjs +24 -35
  108. package/_mjs/Schema/api/maybe.mjs.map +1 -1
  109. package/_mjs/Schema/api/set.mjs +67 -0
  110. package/_mjs/Schema/api/set.mjs.map +1 -0
  111. package/_mjs/Schema/api.mjs +19 -3
  112. package/_mjs/Schema/api.mjs.map +1 -1
  113. package/_mjs/Schema.mjs +2 -0
  114. package/_mjs/Schema.mjs.map +1 -1
  115. package/_mjs/Show.mjs +106 -90
  116. package/_mjs/Show.mjs.map +1 -1
  117. package/_mjs/utils.mjs +4 -0
  118. package/_mjs/utils.mjs.map +1 -1
  119. package/_src/AST.ts +144 -43
  120. package/_src/ASTAnnotation.ts +8 -1
  121. package/_src/Gen.ts +12 -9
  122. package/_src/ParseError/ParseError.ts +304 -0
  123. package/_src/ParseError/ParseErrorFormatter.ts +1 -0
  124. package/_src/ParseError/PathFormatter.ts +117 -0
  125. package/_src/ParseError/TreeFormatter.ts +127 -0
  126. package/_src/ParseError.ts +7 -331
  127. package/_src/ParseResult.ts +2 -9
  128. package/_src/Parser/api.ts +1 -1
  129. package/_src/Parser/interpreter.ts +98 -75
  130. package/_src/Schema/api/conc.ts +33 -42
  131. package/_src/Schema/api/either.ts +20 -30
  132. package/_src/Schema/api/hashMap.ts +40 -124
  133. package/_src/Schema/api/hashSet.ts +31 -117
  134. package/_src/Schema/api/immutableArray.ts +15 -45
  135. package/_src/Schema/api/list.ts +32 -55
  136. package/_src/Schema/api/map.ts +93 -0
  137. package/_src/Schema/api/maybe.ts +19 -34
  138. package/_src/Schema/api/set.ts +74 -0
  139. package/_src/Schema/api.ts +21 -3
  140. package/_src/Schema/derivations.ts +1 -1
  141. package/_src/Schema.ts +2 -0
  142. package/_src/Show.ts +156 -128
  143. package/_src/global.ts +0 -4
  144. package/_src/utils.ts +5 -0
  145. package/global.d.ts +0 -4
  146. package/package.json +2 -2
  147. package/utils.d.ts +1 -0
  148. package/ParseFailure.d.ts +0 -18
  149. package/_cjs/ParseFailure.cjs +0 -28
  150. package/_cjs/ParseFailure.cjs.map +0 -1
  151. package/_mjs/ParseFailure.mjs +0 -20
  152. package/_mjs/ParseFailure.mjs.map +0 -1
  153. package/_src/ParseFailure.ts +0 -18
@@ -1,331 +1,7 @@
1
- import type { Refinement, TemplateLiteral, TemplateLiteralSpan, Transform, Validation } from "@fncts/schema/AST";
2
-
3
- import { showWithOptions } from "@fncts/base/data/Showable";
4
- import { concrete } from "@fncts/schema/AST";
5
- import { ASTTag } from "@fncts/schema/AST";
6
- import { ASTAnnotation } from "@fncts/schema/ASTAnnotation";
7
-
8
- export const enum ParseErrorTag {
9
- Type,
10
- Index,
11
- Key,
12
- Missing,
13
- Unexpected,
14
- UnionMember,
15
- Refinement,
16
- Transformation,
17
- }
18
-
19
- /**
20
- * @tsplus type fncts.schema.ParseError
21
- * @tsplus companion fncts.schema.ParseErrorOps
22
- */
23
- export type ParseError =
24
- | TypeError
25
- | IndexError
26
- | KeyError
27
- | MissingError
28
- | UnexpectedError
29
- | UnionMemberError
30
- | RefinementError
31
- | TransformationError;
32
-
33
- /**
34
- * @tsplus companion fncts.schema.ParseError.TypeError
35
- */
36
- export class TypeError {
37
- readonly _tag = ParseErrorTag.Type;
38
- constructor(
39
- readonly expected: AST,
40
- readonly actual: unknown,
41
- ) {}
42
- }
43
-
44
- /**
45
- * @tsplus static fncts.schema.ParseError.TypeError __call
46
- * @tsplus static fncts.schema.ParseErrorOps TypeError
47
- */
48
- export function typeError(expected: AST, actual: unknown): ParseError {
49
- return new TypeError(expected, actual);
50
- }
51
-
52
- /**
53
- * @tsplus companion fncts.schema.ParseError.IndexError
54
- */
55
- export class IndexError {
56
- readonly _tag = ParseErrorTag.Index;
57
- constructor(
58
- readonly index: number,
59
- readonly errors: Vector<ParseError>,
60
- ) {}
61
- }
62
-
63
- /**
64
- * @tsplus static fncts.schema.ParseError.IndexError __call
65
- * @tsplus static fncts.schema.ParseErrorOps IndexError
66
- */
67
- export function indexError(index: number, errors: Vector<ParseError>): ParseError {
68
- return new IndexError(index, errors);
69
- }
70
-
71
- /**
72
- * @tsplus companion fncts.schema.ParseError.KeyError
73
- */
74
- export class KeyError {
75
- readonly _tag = ParseErrorTag.Key;
76
- constructor(
77
- readonly keyAST: AST,
78
- readonly key: any,
79
- readonly errors: Vector<ParseError>,
80
- ) {}
81
- }
82
-
83
- /**
84
- * @tsplus static fncts.schema.ParseError.KeyError __call
85
- * @tsplus static fncts.schema.ParseErrorOps KeyError
86
- */
87
- export function keyError(keyAST: AST, key: any, errors: Vector<ParseError>): ParseError {
88
- return new KeyError(keyAST, key, errors);
89
- }
90
-
91
- /**
92
- * @tsplus companion fncts.schema.ParseError.MissingError
93
- */
94
- export class MissingError {
95
- readonly _tag = ParseErrorTag.Missing;
96
- }
97
-
98
- /**
99
- * @tsplus static fncts.schema.ParseErrorOps MissingError
100
- */
101
- export const missingError = new MissingError();
102
-
103
- /**
104
- * @tsplus companion fncts.schema.ParseError.UnexpectedError
105
- */
106
- export class UnexpectedError {
107
- readonly _tag = ParseErrorTag.Unexpected;
108
- constructor(readonly actual: unknown) {}
109
- }
110
-
111
- /**
112
- * @tsplus static fncts.schema.ParseError.UnexpectedError __call
113
- * @tsplus static fncts.schema.ParseErrorOps UnexpectedError
114
- */
115
- export function unexpectedError(actual: unknown): ParseError {
116
- return new UnexpectedError(actual);
117
- }
118
-
119
- /**
120
- * @tsplus companion fncts.schema.ParseError.UnionMemberError
121
- */
122
- export class UnionMemberError {
123
- readonly _tag = ParseErrorTag.UnionMember;
124
- constructor(readonly errors: Vector<ParseError>) {}
125
- }
126
-
127
- /**
128
- * @tsplus static fncts.schema.ParseError.UnionMemberError __call
129
- * @tsplus static fncts.schema.ParseErrorOps UnionMemberError
130
- */
131
- export function unionMemberError(errors: Vector<ParseError>): ParseError {
132
- return new UnionMemberError(errors);
133
- }
134
-
135
- /**
136
- * @tsplus companion fncts.schema.ParseError.RefinementError
137
- */
138
- export class RefinementError {
139
- readonly _tag = ParseErrorTag.Refinement;
140
- constructor(
141
- readonly ast: Refinement,
142
- readonly actual: unknown,
143
- readonly kind: "From" | "Predicate",
144
- readonly errors: Vector<ParseError>,
145
- ) {}
146
- }
147
-
148
- /**
149
- * @tsplus static fncts.schema.ParseError.RefinementError __call
150
- * @tsplus static fncts.schema.ParseErrorOps RefinementError
151
- */
152
- export function refinementError(
153
- ast: Refinement,
154
- actual: unknown,
155
- kind: "From" | "Predicate",
156
- errors: Vector<ParseError>,
157
- ): ParseError {
158
- return new RefinementError(ast, actual, kind, errors);
159
- }
160
-
161
- /**
162
- * @tsplus companion fncts.schema.ParseError.TransformationError
163
- */
164
- export class TransformationError {
165
- readonly _tag = ParseErrorTag.Transformation;
166
- constructor(
167
- readonly ast: Transform,
168
- readonly actual: unknown,
169
- readonly kind: "Encoded" | "Transformation" | "Type",
170
- readonly errors: Vector<ParseError>,
171
- ) {}
172
- }
173
-
174
- /**
175
- * @tsplus static fncts.schema.ParseError.TransformationError __call
176
- * @tsplus static fncts.schema.ParseErrorOps TransformationError
177
- */
178
- export function transformationError(
179
- ast: Transform,
180
- actual: unknown,
181
- kind: "Encoded" | "Transformation" | "Type",
182
- errors: Vector<ParseError>,
183
- ): ParseError {
184
- return new TransformationError(ast, actual, kind, errors);
185
- }
186
-
187
- /**
188
- * @tsplus static fncts.schema.ParseErrorOps format
189
- */
190
- export function format(errors: Vector<ParseError>): string {
191
- return RoseTree(`${errors.length} error(s) found`, errors.map(go)).draw;
192
- }
193
-
194
- function formatActual(actual: unknown): string {
195
- return showWithOptions(actual, { colors: false });
196
- }
197
-
198
- function formatTemplateLiteralSpan(span: TemplateLiteralSpan): string {
199
- switch (span.type._tag) {
200
- case ASTTag.StringKeyword:
201
- return "${string}";
202
- case ASTTag.NumberKeyword:
203
- return "${number}";
204
- }
205
- }
206
-
207
- function formatTemplateLiteral(ast: TemplateLiteral): string {
208
- return ast.head + ast.spans.map((span) => formatTemplateLiteralSpan(span) + span.literal).join("");
209
- }
210
-
211
- function formatRefinementKind(error: RefinementError): string {
212
- switch (error.kind) {
213
- case "From": {
214
- return "From side refinement failure";
215
- }
216
- case "Predicate": {
217
- return "Predicate refinement failure";
218
- }
219
- }
220
- }
221
-
222
- function formatTransformationKind(error: TransformationError): string {
223
- switch (error.kind) {
224
- case "Encoded": {
225
- return "Encoded side transformation failure";
226
- }
227
- case "Transformation": {
228
- return "Transformation process failure";
229
- }
230
- case "Type": {
231
- return "Type side transformation failure";
232
- }
233
- }
234
- }
235
-
236
- function getExpected(ast: AST): Maybe<string> {
237
- return ast.annotations
238
- .get(ASTAnnotation.Identifier)
239
- .orElse(ast.annotations.get(ASTAnnotation.Title))
240
- .flatMap((title) =>
241
- ast.annotations.get(ASTAnnotation.Description).match(
242
- () => Just(title),
243
- (description) => Just(`${title} (${description})`),
244
- ),
245
- );
246
- }
247
-
248
- function getMissedBrands(ast: Validation): string {
249
- return ast.validation.map((validation) => validation.name).join(" & ");
250
- }
251
-
252
- function formatExpected(ast: AST): string {
253
- concrete(ast);
254
- switch (ast._tag) {
255
- case ASTTag.StringKeyword:
256
- return getExpected(ast).getOrElse("string");
257
- case ASTTag.NumberKeyword:
258
- return getExpected(ast).getOrElse("number");
259
- case ASTTag.BooleanKeyword:
260
- return getExpected(ast).getOrElse("boolean");
261
- case ASTTag.BigIntKeyword:
262
- return getExpected(ast).getOrElse("bigint");
263
- case ASTTag.UndefinedKeyword:
264
- return getExpected(ast).getOrElse("undefined");
265
- case ASTTag.SymbolKeyword:
266
- return getExpected(ast).getOrElse("symbol");
267
- case ASTTag.ObjectKeyword:
268
- return getExpected(ast).getOrElse("object");
269
- case ASTTag.AnyKeyword:
270
- return getExpected(ast).getOrElse("any");
271
- case ASTTag.UnknownKeyword:
272
- return getExpected(ast).getOrElse("unknown");
273
- case ASTTag.VoidKeyword:
274
- return getExpected(ast).getOrElse("void");
275
- case ASTTag.NeverKeyword:
276
- return getExpected(ast).getOrElse("never");
277
- case ASTTag.Literal:
278
- return getExpected(ast).getOrElse(formatActual(ast.literal));
279
- case ASTTag.UniqueSymbol:
280
- return getExpected(ast).getOrElse(formatActual(ast.symbol));
281
- case ASTTag.Union:
282
- return ast.types.map(formatExpected).join(" or ");
283
- case ASTTag.Refinement:
284
- return getExpected(ast).getOrElse("refinement");
285
- case ASTTag.TemplateLiteral:
286
- return getExpected(ast).getOrElse(formatTemplateLiteral(ast));
287
- case ASTTag.Tuple:
288
- return getExpected(ast).getOrElse("tuple or array");
289
- case ASTTag.TypeLiteral:
290
- return getExpected(ast).getOrElse("type literal");
291
- case ASTTag.Enum:
292
- return getExpected(ast).getOrElse(ast.enums.map(([_, value]) => JSON.stringify(value)).join(" | "));
293
- case ASTTag.Lazy:
294
- return getExpected(ast).getOrElse("<anonymous lazy schema>");
295
- case ASTTag.Declaration:
296
- return getExpected(ast).getOrElse("<anonymous Declaration schema>");
297
- case ASTTag.Transform:
298
- return `a parsable value from ${formatExpected(ast.from)} to ${formatExpected(ast.to)}`;
299
- case ASTTag.Validation:
300
- return getExpected(ast).match(
301
- () => getMissedBrands(ast),
302
- (expected) => `${expected} with validation(s) ${getMissedBrands(ast)}`,
303
- );
304
- }
305
- }
306
-
307
- function go(error: ParseError): RoseTree<string> {
308
- switch (error._tag) {
309
- case ParseErrorTag.Type:
310
- return RoseTree(
311
- error.expected.annotations
312
- .get(ASTAnnotation.Message)
313
- .map((f) => f(error.actual))
314
- .getOrElse(`Expected ${formatExpected(error.expected)}, actual ${formatActual(error.actual)}`),
315
- );
316
- case ParseErrorTag.Index:
317
- return RoseTree(`index ${error.index}`, error.errors.map(go));
318
- case ParseErrorTag.Unexpected:
319
- return RoseTree("is unexpected");
320
- case ParseErrorTag.Key:
321
- return RoseTree(`key ${formatActual(error.key)}`, error.errors.map(go));
322
- case ParseErrorTag.Missing:
323
- return RoseTree("is missing");
324
- case ParseErrorTag.UnionMember:
325
- return RoseTree("union member", error.errors.map(go));
326
- case ParseErrorTag.Refinement:
327
- return RoseTree(formatRefinementKind(error), error.errors.map(go));
328
- case ParseErrorTag.Transformation:
329
- return RoseTree(formatTransformationKind(error), error.errors.map(go));
330
- }
331
- }
1
+ /* eslint-disable simple-import-sort/exports */
2
+ // codegen:start { preset: barrel, include: ./ParseError/*.ts }
3
+ export * from "./ParseError/TreeFormatter.js";
4
+ export * from "./ParseError/PathFormatter.js";
5
+ export * from "./ParseError/ParseErrorFormatter.js";
6
+ export * from "./ParseError/ParseError.js";
7
+ // codegen:end
@@ -2,7 +2,7 @@
2
2
  * @tsplus type fncts.schema.ParseResult
3
3
  * @tsplus companion fncts.schema.ParseResultOps
4
4
  */
5
- export interface ParseResult<A> extends Either<ParseFailure, A> {}
5
+ export interface ParseResult<A> extends Either<ParseError, A> {}
6
6
 
7
7
  /**
8
8
  * @tsplus static fncts.schema.ParseResultOps succeed
@@ -11,16 +11,9 @@ export function succeed<A>(value: A): ParseResult<A> {
11
11
  return Either.right(value);
12
12
  }
13
13
 
14
- /**
15
- * @tsplus static fncts.schema.ParseResultOps failures
16
- */
17
- export function failures<A = never>(value: Vector<ParseError>): ParseResult<A> {
18
- return Either.left(ParseFailure(value));
19
- }
20
-
21
14
  /**
22
15
  * @tsplus static fncts.schema.ParseResultOps fail
23
16
  */
24
17
  export function fail<A = never>(value: ParseError): ParseResult<A> {
25
- return Either.left(ParseFailure(Vector(value)));
18
+ return Either.left(value);
26
19
  }
@@ -45,7 +45,7 @@ function parseOrThrow(ast: AST) {
45
45
  const parser = parserFor(ast, true);
46
46
  return (input: unknown, options?: ParseOptions) => {
47
47
  return parser(input, options).match((failure) => {
48
- throw new Error(ParseError.format(failure.errors));
48
+ throw new Error(ParseError.drawTree(failure));
49
49
  }, Function.identity);
50
50
  };
51
51
  }