typia 3.4.14 → 3.4.16

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 (167) hide show
  1. package/README.md +5 -2
  2. package/lib/executable/internal/TypiaSetupWizard.d.ts +6 -2
  3. package/lib/executable/internal/TypiaSetupWizard.js +26 -25
  4. package/lib/executable/internal/TypiaSetupWizard.js.map +1 -1
  5. package/lib/executable/typia.js +11 -10
  6. package/lib/executable/typia.js.map +1 -1
  7. package/lib/factories/MetadataFactory.d.ts +1 -0
  8. package/lib/factories/MetadataFactory.js +1 -1
  9. package/lib/factories/MetadataFactory.js.map +1 -1
  10. package/lib/factories/MetadataTagFactory.js +4 -1
  11. package/lib/factories/MetadataTagFactory.js.map +1 -1
  12. package/lib/factories/internal/{MetadataHelper.d.ts → metadata/MetadataHelper.d.ts} +1 -1
  13. package/lib/factories/internal/{MetadataHelper.js → metadata/MetadataHelper.js} +1 -1
  14. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -0
  15. package/lib/factories/internal/{emplace_metadata_object.d.ts → metadata/emplace_metadata_object.d.ts} +3 -3
  16. package/lib/factories/internal/{emplace_metadata_object.js → metadata/emplace_metadata_object.js} +5 -5
  17. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -0
  18. package/lib/factories/internal/{explore_metadata.d.ts → metadata/explore_metadata.d.ts} +3 -3
  19. package/lib/factories/internal/{explore_metadata.js → metadata/explore_metadata.js} +5 -3
  20. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -0
  21. package/lib/factories/internal/{iterate_metadata.d.ts → metadata/iterate_metadata.d.ts} +3 -3
  22. package/lib/factories/internal/{iterate_metadata.js → metadata/iterate_metadata.js} +1 -1
  23. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -0
  24. package/lib/factories/internal/{iterate_metadata_array.d.ts → metadata/iterate_metadata_array.d.ts} +3 -3
  25. package/lib/factories/internal/{iterate_metadata_array.js → metadata/iterate_metadata_array.js} +1 -1
  26. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -0
  27. package/lib/factories/internal/{iterate_metadata_atomic.d.ts → metadata/iterate_metadata_atomic.d.ts} +1 -1
  28. package/lib/factories/internal/{iterate_metadata_atomic.js → metadata/iterate_metadata_atomic.js} +1 -1
  29. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -0
  30. package/lib/factories/internal/{iterate_metadata_coalesce.d.ts → metadata/iterate_metadata_coalesce.d.ts} +1 -1
  31. package/lib/factories/internal/{iterate_metadata_coalesce.js → metadata/iterate_metadata_coalesce.js} +2 -2
  32. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -0
  33. package/lib/factories/internal/{iterate_metadata_constant.d.ts → metadata/iterate_metadata_constant.d.ts} +2 -2
  34. package/lib/factories/internal/{iterate_metadata_constant.js → metadata/iterate_metadata_constant.js} +1 -1
  35. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -0
  36. package/lib/factories/internal/{iterate_metadata_map.d.ts → metadata/iterate_metadata_map.d.ts} +3 -3
  37. package/lib/factories/internal/{iterate_metadata_map.js → metadata/iterate_metadata_map.js} +2 -2
  38. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -0
  39. package/lib/factories/internal/{iterate_metadata_native.d.ts → metadata/iterate_metadata_native.d.ts} +1 -1
  40. package/lib/factories/internal/{iterate_metadata_native.js → metadata/iterate_metadata_native.js} +2 -2
  41. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -0
  42. package/lib/factories/internal/{iterate_metadata_object.d.ts → metadata/iterate_metadata_object.d.ts} +3 -3
  43. package/lib/factories/internal/{iterate_metadata_object.js → metadata/iterate_metadata_object.js} +3 -3
  44. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -0
  45. package/lib/factories/internal/{iterate_metadata_resolve.d.ts → metadata/iterate_metadata_resolve.d.ts} +3 -3
  46. package/lib/factories/internal/{iterate_metadata_resolve.js → metadata/iterate_metadata_resolve.js} +2 -2
  47. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -0
  48. package/lib/factories/internal/{iterate_metadata_set.d.ts → metadata/iterate_metadata_set.d.ts} +3 -3
  49. package/lib/factories/internal/{iterate_metadata_set.js → metadata/iterate_metadata_set.js} +2 -2
  50. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -0
  51. package/lib/factories/internal/{iterate_metadata_template.d.ts → metadata/iterate_metadata_template.d.ts} +3 -3
  52. package/lib/factories/internal/{iterate_metadata_template.js → metadata/iterate_metadata_template.js} +0 -0
  53. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -0
  54. package/lib/factories/internal/{iterate_metadata_tuple.d.ts → metadata/iterate_metadata_tuple.d.ts} +3 -3
  55. package/lib/factories/internal/{iterate_metadata_tuple.js → metadata/iterate_metadata_tuple.js} +3 -3
  56. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -0
  57. package/lib/factories/internal/{iterate_metadata_union.d.ts → metadata/iterate_metadata_union.d.ts} +3 -3
  58. package/lib/factories/internal/{iterate_metadata_union.js → metadata/iterate_metadata_union.js} +3 -3
  59. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -0
  60. package/lib/functional/$number.js +2 -9
  61. package/lib/functional/$number.js.map +1 -1
  62. package/lib/programmers/AssertParseProgrammer.js +12 -1
  63. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  64. package/lib/programmers/AssertProgrammer.js +2 -1
  65. package/lib/programmers/AssertProgrammer.js.map +1 -1
  66. package/lib/programmers/AssertStringifyProgrammer.js +13 -2
  67. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  68. package/lib/programmers/CheckerProgrammer.js +6 -0
  69. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  70. package/lib/programmers/IsParseProgrammer.js +12 -1
  71. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  72. package/lib/programmers/IsProgrammer.js +5 -2
  73. package/lib/programmers/IsProgrammer.js.map +1 -1
  74. package/lib/programmers/IsStringifyProgrammer.js +13 -2
  75. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  76. package/lib/programmers/StringifyProgrammer.js +5 -0
  77. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  78. package/lib/programmers/ValidateParseProgrammer.js +12 -1
  79. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  80. package/lib/programmers/ValidateProgrammer.js +2 -1
  81. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  82. package/lib/programmers/ValidateStringifyProgrammer.js +13 -2
  83. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  84. package/lib/programmers/helpers/OptionPredicator.d.ts +2 -1
  85. package/lib/programmers/helpers/OptionPredicator.js +7 -3
  86. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  87. package/lib/programmers/internal/application_schema.js +7 -3
  88. package/lib/programmers/internal/application_schema.js.map +1 -1
  89. package/lib/programmers/internal/check_bigint.d.ts +3 -0
  90. package/lib/programmers/internal/check_bigint.js +97 -0
  91. package/lib/programmers/internal/check_bigint.js.map +1 -0
  92. package/lib/programmers/internal/check_number.js +21 -22
  93. package/lib/programmers/internal/check_number.js.map +1 -1
  94. package/lib/schemas/IJsonSchema.d.ts +3 -5
  95. package/lib/transformers/ITransformOptions.d.ts +42 -1
  96. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +4 -0
  97. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  98. package/lib/transformers/features/stringifiers/StringifyTransformer.js +12 -1
  99. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -1
  100. package/package.json +3 -2
  101. package/src/executable/internal/TypiaSetupWizard.ts +182 -175
  102. package/src/executable/typia.ts +6 -4
  103. package/src/factories/MetadataCollection.ts +122 -122
  104. package/src/factories/MetadataFactory.ts +47 -46
  105. package/src/factories/MetadataTagFactory.ts +351 -347
  106. package/src/factories/internal/{MetadataHelper.ts → metadata/MetadataHelper.ts} +12 -12
  107. package/src/factories/internal/{emplace_metadata_object.ts → metadata/emplace_metadata_object.ts} +140 -140
  108. package/src/factories/internal/{explore_metadata.ts → metadata/explore_metadata.ts} +92 -91
  109. package/src/factories/internal/{iterate_metadata.ts → metadata/iterate_metadata.ts} +80 -80
  110. package/src/factories/internal/{iterate_metadata_array.ts → metadata/iterate_metadata_array.ts} +29 -29
  111. package/src/factories/internal/{iterate_metadata_atomic.ts → metadata/iterate_metadata_atomic.ts} +59 -59
  112. package/src/factories/internal/{iterate_metadata_coalesce.ts → metadata/iterate_metadata_coalesce.ts} +33 -33
  113. package/src/factories/internal/{iterate_metadata_constant.ts → metadata/iterate_metadata_constant.ts} +58 -58
  114. package/src/factories/internal/{iterate_metadata_map.ts → metadata/iterate_metadata_map.ts} +41 -41
  115. package/src/factories/internal/{iterate_metadata_native.ts → metadata/iterate_metadata_native.ts} +227 -227
  116. package/src/factories/internal/{iterate_metadata_object.ts → metadata/iterate_metadata_object.ts} +48 -48
  117. package/src/factories/internal/{iterate_metadata_resolve.ts → metadata/iterate_metadata_resolve.ts} +27 -27
  118. package/src/factories/internal/{iterate_metadata_set.ts → metadata/iterate_metadata_set.ts} +33 -33
  119. package/src/factories/internal/{iterate_metadata_template.ts → metadata/iterate_metadata_template.ts} +38 -38
  120. package/src/factories/internal/{iterate_metadata_tuple.ts → metadata/iterate_metadata_tuple.ts} +45 -45
  121. package/src/factories/internal/{iterate_metadata_union.ts → metadata/iterate_metadata_union.ts} +59 -59
  122. package/src/functional/$number.ts +12 -19
  123. package/src/metadata/IMetadataTag.ts +122 -122
  124. package/src/metadata/Metadata.ts +477 -477
  125. package/src/module.ts +1535 -1535
  126. package/src/programmers/AssertParseProgrammer.ts +55 -45
  127. package/src/programmers/AssertProgrammer.ts +445 -444
  128. package/src/programmers/AssertStringifyProgrammer.ts +65 -45
  129. package/src/programmers/CheckerProgrammer.ts +810 -804
  130. package/src/programmers/IsParseProgrammer.ts +61 -51
  131. package/src/programmers/IsProgrammer.ts +175 -172
  132. package/src/programmers/IsStringifyProgrammer.ts +69 -49
  133. package/src/programmers/StringifyProgrammer.ts +762 -756
  134. package/src/programmers/ValidateParseProgrammer.ts +59 -49
  135. package/src/programmers/ValidateProgrammer.ts +237 -236
  136. package/src/programmers/ValidateStringifyProgrammer.ts +80 -60
  137. package/src/programmers/helpers/OptionPredicator.ts +15 -11
  138. package/src/programmers/internal/application_default.ts +17 -17
  139. package/src/programmers/internal/application_object.ts +103 -103
  140. package/src/programmers/internal/application_schema.ts +228 -221
  141. package/src/programmers/internal/check_bigint.ts +85 -0
  142. package/src/programmers/internal/check_number.ts +175 -178
  143. package/src/schemas/IJsonSchema.ts +90 -92
  144. package/src/transformers/CallExpressionTransformer.ts +124 -124
  145. package/src/transformers/ITransformOptions.ts +47 -4
  146. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +119 -114
  147. package/src/transformers/features/stringifiers/StringifyTransformer.ts +46 -36
  148. package/lib/factories/internal/MetadataHelper.js.map +0 -1
  149. package/lib/factories/internal/emplace_metadata_object.js.map +0 -1
  150. package/lib/factories/internal/explore_metadata.js.map +0 -1
  151. package/lib/factories/internal/iterate_metadata.js.map +0 -1
  152. package/lib/factories/internal/iterate_metadata_array.js.map +0 -1
  153. package/lib/factories/internal/iterate_metadata_atomic.js.map +0 -1
  154. package/lib/factories/internal/iterate_metadata_coalesce.js.map +0 -1
  155. package/lib/factories/internal/iterate_metadata_constant.js.map +0 -1
  156. package/lib/factories/internal/iterate_metadata_map.js.map +0 -1
  157. package/lib/factories/internal/iterate_metadata_native.js.map +0 -1
  158. package/lib/factories/internal/iterate_metadata_object.js.map +0 -1
  159. package/lib/factories/internal/iterate_metadata_resolve.js.map +0 -1
  160. package/lib/factories/internal/iterate_metadata_set.js.map +0 -1
  161. package/lib/factories/internal/iterate_metadata_template.js.map +0 -1
  162. package/lib/factories/internal/iterate_metadata_tuple.js.map +0 -1
  163. package/lib/factories/internal/iterate_metadata_union.js.map +0 -1
  164. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.d.ts +0 -5
  165. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.js +0 -29
  166. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.js.map +0 -1
  167. package/src/transformers/features/miscellaneous/CreateInstanceTransformer.ts +0 -41
@@ -1,49 +1,59 @@
1
- import ts from "typescript";
2
-
3
- import { IdentifierFactory } from "../factories/IdentifierFactory";
4
- import { StatementFactory } from "../factories/StatementFactory";
5
-
6
- import { IProject } from "../transformers/IProject";
7
-
8
- import { ValidateProgrammer } from "./ValidateProgrammer";
9
-
10
- export namespace ValidateParseProgrammer {
11
- export const generate =
12
- (project: IProject, modulo: ts.LeftHandSideExpression) =>
13
- (type: ts.Type) =>
14
- ts.factory.createArrowFunction(
15
- undefined,
16
- undefined,
17
- [IdentifierFactory.parameter("input")],
18
- undefined,
19
- undefined,
20
- ts.factory.createBlock([
21
- StatementFactory.constant(
22
- "validate",
23
- ValidateProgrammer.generate(project, modulo)(type),
24
- ),
25
- ts.factory.createExpressionStatement(
26
- ts.factory.createBinaryExpression(
27
- ts.factory.createIdentifier("input"),
28
- ts.SyntaxKind.EqualsToken,
29
- ts.factory.createCallExpression(
30
- ts.factory.createIdentifier("JSON.parse"),
31
- undefined,
32
- [ts.factory.createIdentifier("input")],
33
- ),
34
- ),
35
- ),
36
- StatementFactory.constant(
37
- "output",
38
- ts.factory.createCallExpression(
39
- ts.factory.createIdentifier("validate"),
40
- undefined,
41
- [ts.factory.createIdentifier("input")],
42
- ),
43
- ),
44
- ts.factory.createReturnStatement(
45
- ts.factory.createIdentifier("output"),
46
- ),
47
- ]),
48
- );
49
- }
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { StatementFactory } from "../factories/StatementFactory";
5
+
6
+ import { IProject } from "../transformers/IProject";
7
+
8
+ import { ValidateProgrammer } from "./ValidateProgrammer";
9
+
10
+ export namespace ValidateParseProgrammer {
11
+ export const generate =
12
+ (project: IProject, modulo: ts.LeftHandSideExpression) =>
13
+ (type: ts.Type) =>
14
+ ts.factory.createArrowFunction(
15
+ undefined,
16
+ undefined,
17
+ [IdentifierFactory.parameter("input")],
18
+ undefined,
19
+ undefined,
20
+ ts.factory.createBlock([
21
+ StatementFactory.constant(
22
+ "validate",
23
+ ValidateProgrammer.generate(
24
+ {
25
+ ...project,
26
+ options: {
27
+ ...project.options,
28
+ functional: false,
29
+ numeric: false,
30
+ },
31
+ },
32
+ modulo,
33
+ )(type),
34
+ ),
35
+ ts.factory.createExpressionStatement(
36
+ ts.factory.createBinaryExpression(
37
+ ts.factory.createIdentifier("input"),
38
+ ts.SyntaxKind.EqualsToken,
39
+ ts.factory.createCallExpression(
40
+ ts.factory.createIdentifier("JSON.parse"),
41
+ undefined,
42
+ [ts.factory.createIdentifier("input")],
43
+ ),
44
+ ),
45
+ ),
46
+ StatementFactory.constant(
47
+ "output",
48
+ ts.factory.createCallExpression(
49
+ ts.factory.createIdentifier("validate"),
50
+ undefined,
51
+ [ts.factory.createIdentifier("input")],
52
+ ),
53
+ ),
54
+ ts.factory.createReturnStatement(
55
+ ts.factory.createIdentifier("output"),
56
+ ),
57
+ ]),
58
+ );
59
+ }
@@ -1,236 +1,237 @@
1
- import ts from "typescript";
2
-
3
- import { IdentifierFactory } from "../factories/IdentifierFactory";
4
- import { StatementFactory } from "../factories/StatementFactory";
5
-
6
- import { IProject } from "../transformers/IProject";
7
-
8
- import { CheckerProgrammer } from "./CheckerProgrammer";
9
- import { IsProgrammer } from "./IsProgrammer";
10
- import { FunctionImporter } from "./helpers/FunctionImporeter";
11
- import { check_everything } from "./internal/check_everything";
12
- import { check_object } from "./internal/check_object";
13
-
14
- export namespace ValidateProgrammer {
15
- export const generate =
16
- (
17
- project: IProject,
18
- modulo: ts.LeftHandSideExpression,
19
- equals: boolean = false,
20
- ) =>
21
- (type: ts.Type) => {
22
- const importer: FunctionImporter = new FunctionImporter();
23
- const program: ts.ArrowFunction = CheckerProgrammer.generate(
24
- project,
25
- {
26
- functors: "$vo",
27
- unioners: "$vu",
28
- path: true,
29
- trace: true,
30
- numeric: !!project.options.numeric,
31
- equals,
32
- combiner: combine(equals)(importer),
33
- joiner: joiner(equals)(importer),
34
- success: ts.factory.createTrue(),
35
- },
36
- importer,
37
- )(type);
38
-
39
- return ts.factory.createArrowFunction(
40
- undefined,
41
- undefined,
42
- [IdentifierFactory.parameter("input")],
43
- undefined,
44
- undefined,
45
- ts.factory.createBlock(
46
- [
47
- StatementFactory.constant(
48
- "errors",
49
- ts.factory.createArrayLiteralExpression([]),
50
- ),
51
- StatementFactory.constant(
52
- "$report",
53
- ts.factory.createCallExpression(
54
- IdentifierFactory.join(modulo, "report"),
55
- [],
56
- [ts.factory.createIdentifier("errors")],
57
- ),
58
- ),
59
- ...importer.declare(modulo),
60
- ts.factory.createExpressionStatement(
61
- ts.factory.createCallExpression(
62
- program,
63
- undefined,
64
- [
65
- ts.factory.createIdentifier("input"),
66
- ts.factory.createStringLiteral("$input"),
67
- ts.factory.createTrue(),
68
- ],
69
- ),
70
- ),
71
- StatementFactory.constant(
72
- "success",
73
- ts.factory.createStrictEquality(
74
- ts.factory.createNumericLiteral(0),
75
- ts.factory.createIdentifier("errors.length"),
76
- ),
77
- ),
78
- ts.factory.createReturnStatement(create_output()),
79
- ],
80
- true,
81
- ),
82
- );
83
- };
84
- }
85
-
86
- const combine =
87
- (equals: boolean) =>
88
- (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner =>
89
- (explore: CheckerProgrammer.IExplore) => {
90
- if (explore.tracable === false && explore.from !== "top")
91
- return IsProgrammer.CONFIG({
92
- object: validate_object(equals)(importer),
93
- numeric: true,
94
- }).combiner(explore);
95
-
96
- const path: string = explore.postfix
97
- ? `path + ${explore.postfix}`
98
- : "path";
99
- return (logic) => (input, binaries, expected) =>
100
- logic === "and"
101
- ? binaries
102
- .map((binary) =>
103
- binary.combined
104
- ? binary.expression
105
- : ts.factory.createLogicalOr(
106
- binary.expression,
107
- create_report_call(
108
- explore.source === "top"
109
- ? ts.factory.createTrue()
110
- : ts.factory.createIdentifier(
111
- "exceptionable",
112
- ),
113
- )(
114
- ts.factory.createIdentifier(path),
115
- expected,
116
- input,
117
- ),
118
- ),
119
- )
120
- .reduce(ts.factory.createLogicalAnd)
121
- : ts.factory.createLogicalOr(
122
- binaries
123
- .map((binary) => binary.expression)
124
- .reduce(ts.factory.createLogicalOr),
125
- create_report_call(
126
- explore.source === "top"
127
- ? ts.factory.createTrue()
128
- : ts.factory.createIdentifier("exceptionable"),
129
- )(ts.factory.createIdentifier(path), expected, input),
130
- );
131
- };
132
-
133
- const validate_object = (equals: boolean) => (importer: FunctionImporter) =>
134
- check_object({
135
- equals,
136
- assert: false,
137
- reduce: ts.factory.createLogicalAnd,
138
- positive: ts.factory.createTrue(),
139
- superfluous: (value) =>
140
- create_report_call()(
141
- ts.factory.createAdd(
142
- ts.factory.createIdentifier("path"),
143
- ts.factory.createCallExpression(
144
- importer.use("join"),
145
- undefined,
146
- [ts.factory.createIdentifier("key")],
147
- ),
148
- ),
149
- "undefined",
150
- value,
151
- ),
152
- halt: (expr) =>
153
- ts.factory.createLogicalOr(
154
- ts.factory.createStrictEquality(
155
- ts.factory.createFalse(),
156
- ts.factory.createIdentifier("exceptionable"),
157
- ),
158
- expr,
159
- ),
160
- });
161
-
162
- const joiner =
163
- (equals: boolean) =>
164
- (importer: FunctionImporter): CheckerProgrammer.IConfig.IJoiner => ({
165
- object: validate_object(equals)(importer),
166
- array: (input, arrow) =>
167
- check_everything(
168
- ts.factory.createCallExpression(
169
- IdentifierFactory.join(input, "map"),
170
- undefined,
171
- [arrow],
172
- ),
173
- ),
174
- failure: (value, expected, explore) =>
175
- create_report_call(
176
- explore?.from === "top"
177
- ? ts.factory.createTrue()
178
- : ts.factory.createIdentifier("exceptionable"),
179
- )(
180
- ts.factory.createIdentifier(
181
- explore?.postfix ? `path + ${explore.postfix}` : "path",
182
- ),
183
- expected,
184
- value,
185
- ),
186
- tuple: (binaries) =>
187
- check_everything(
188
- ts.factory.createArrayLiteralExpression(binaries, true),
189
- ),
190
- });
191
-
192
- function create_output() {
193
- return ts.factory.createObjectLiteralExpression(
194
- [
195
- ts.factory.createShorthandPropertyAssignment("success"),
196
- ts.factory.createShorthandPropertyAssignment("errors"),
197
- ts.factory.createPropertyAssignment(
198
- "data",
199
- ts.factory.createConditionalExpression(
200
- ts.factory.createIdentifier("success"),
201
- undefined,
202
- ts.factory.createIdentifier("input"),
203
- undefined,
204
- ts.factory.createIdentifier("undefined"),
205
- ),
206
- ),
207
- ],
208
- true,
209
- );
210
- }
211
-
212
- const create_report_call =
213
- (exceptionable?: ts.Expression) =>
214
- (
215
- path: ts.Expression,
216
- expected: string,
217
- value: ts.Expression,
218
- ): ts.Expression =>
219
- ts.factory.createCallExpression(
220
- ts.factory.createIdentifier("$report"),
221
- undefined,
222
- [
223
- exceptionable || ts.factory.createIdentifier("exceptionable"),
224
- ts.factory.createObjectLiteralExpression(
225
- [
226
- ts.factory.createPropertyAssignment("path", path),
227
- ts.factory.createPropertyAssignment(
228
- "expected",
229
- ts.factory.createStringLiteral(expected),
230
- ),
231
- ts.factory.createPropertyAssignment("value", value),
232
- ],
233
- true,
234
- ),
235
- ],
236
- );
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { StatementFactory } from "../factories/StatementFactory";
5
+
6
+ import { IProject } from "../transformers/IProject";
7
+
8
+ import { CheckerProgrammer } from "./CheckerProgrammer";
9
+ import { IsProgrammer } from "./IsProgrammer";
10
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
11
+ import { OptionPredicator } from "./helpers/OptionPredicator";
12
+ import { check_everything } from "./internal/check_everything";
13
+ import { check_object } from "./internal/check_object";
14
+
15
+ export namespace ValidateProgrammer {
16
+ export const generate =
17
+ (
18
+ project: IProject,
19
+ modulo: ts.LeftHandSideExpression,
20
+ equals: boolean = false,
21
+ ) =>
22
+ (type: ts.Type) => {
23
+ const importer: FunctionImporter = new FunctionImporter();
24
+ const program: ts.ArrowFunction = CheckerProgrammer.generate(
25
+ project,
26
+ {
27
+ functors: "$vo",
28
+ unioners: "$vu",
29
+ path: true,
30
+ trace: true,
31
+ numeric: OptionPredicator.numeric(project.options),
32
+ equals,
33
+ combiner: combine(equals)(importer),
34
+ joiner: joiner(equals)(importer),
35
+ success: ts.factory.createTrue(),
36
+ },
37
+ importer,
38
+ )(type);
39
+
40
+ return ts.factory.createArrowFunction(
41
+ undefined,
42
+ undefined,
43
+ [IdentifierFactory.parameter("input")],
44
+ undefined,
45
+ undefined,
46
+ ts.factory.createBlock(
47
+ [
48
+ StatementFactory.constant(
49
+ "errors",
50
+ ts.factory.createArrayLiteralExpression([]),
51
+ ),
52
+ StatementFactory.constant(
53
+ "$report",
54
+ ts.factory.createCallExpression(
55
+ IdentifierFactory.join(modulo, "report"),
56
+ [],
57
+ [ts.factory.createIdentifier("errors")],
58
+ ),
59
+ ),
60
+ ...importer.declare(modulo),
61
+ ts.factory.createExpressionStatement(
62
+ ts.factory.createCallExpression(
63
+ program,
64
+ undefined,
65
+ [
66
+ ts.factory.createIdentifier("input"),
67
+ ts.factory.createStringLiteral("$input"),
68
+ ts.factory.createTrue(),
69
+ ],
70
+ ),
71
+ ),
72
+ StatementFactory.constant(
73
+ "success",
74
+ ts.factory.createStrictEquality(
75
+ ts.factory.createNumericLiteral(0),
76
+ ts.factory.createIdentifier("errors.length"),
77
+ ),
78
+ ),
79
+ ts.factory.createReturnStatement(create_output()),
80
+ ],
81
+ true,
82
+ ),
83
+ );
84
+ };
85
+ }
86
+
87
+ const combine =
88
+ (equals: boolean) =>
89
+ (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner =>
90
+ (explore: CheckerProgrammer.IExplore) => {
91
+ if (explore.tracable === false && explore.from !== "top")
92
+ return IsProgrammer.CONFIG({
93
+ object: validate_object(equals)(importer),
94
+ numeric: true,
95
+ }).combiner(explore);
96
+
97
+ const path: string = explore.postfix
98
+ ? `path + ${explore.postfix}`
99
+ : "path";
100
+ return (logic) => (input, binaries, expected) =>
101
+ logic === "and"
102
+ ? binaries
103
+ .map((binary) =>
104
+ binary.combined
105
+ ? binary.expression
106
+ : ts.factory.createLogicalOr(
107
+ binary.expression,
108
+ create_report_call(
109
+ explore.source === "top"
110
+ ? ts.factory.createTrue()
111
+ : ts.factory.createIdentifier(
112
+ "exceptionable",
113
+ ),
114
+ )(
115
+ ts.factory.createIdentifier(path),
116
+ expected,
117
+ input,
118
+ ),
119
+ ),
120
+ )
121
+ .reduce(ts.factory.createLogicalAnd)
122
+ : ts.factory.createLogicalOr(
123
+ binaries
124
+ .map((binary) => binary.expression)
125
+ .reduce(ts.factory.createLogicalOr),
126
+ create_report_call(
127
+ explore.source === "top"
128
+ ? ts.factory.createTrue()
129
+ : ts.factory.createIdentifier("exceptionable"),
130
+ )(ts.factory.createIdentifier(path), expected, input),
131
+ );
132
+ };
133
+
134
+ const validate_object = (equals: boolean) => (importer: FunctionImporter) =>
135
+ check_object({
136
+ equals,
137
+ assert: false,
138
+ reduce: ts.factory.createLogicalAnd,
139
+ positive: ts.factory.createTrue(),
140
+ superfluous: (value) =>
141
+ create_report_call()(
142
+ ts.factory.createAdd(
143
+ ts.factory.createIdentifier("path"),
144
+ ts.factory.createCallExpression(
145
+ importer.use("join"),
146
+ undefined,
147
+ [ts.factory.createIdentifier("key")],
148
+ ),
149
+ ),
150
+ "undefined",
151
+ value,
152
+ ),
153
+ halt: (expr) =>
154
+ ts.factory.createLogicalOr(
155
+ ts.factory.createStrictEquality(
156
+ ts.factory.createFalse(),
157
+ ts.factory.createIdentifier("exceptionable"),
158
+ ),
159
+ expr,
160
+ ),
161
+ });
162
+
163
+ const joiner =
164
+ (equals: boolean) =>
165
+ (importer: FunctionImporter): CheckerProgrammer.IConfig.IJoiner => ({
166
+ object: validate_object(equals)(importer),
167
+ array: (input, arrow) =>
168
+ check_everything(
169
+ ts.factory.createCallExpression(
170
+ IdentifierFactory.join(input, "map"),
171
+ undefined,
172
+ [arrow],
173
+ ),
174
+ ),
175
+ failure: (value, expected, explore) =>
176
+ create_report_call(
177
+ explore?.from === "top"
178
+ ? ts.factory.createTrue()
179
+ : ts.factory.createIdentifier("exceptionable"),
180
+ )(
181
+ ts.factory.createIdentifier(
182
+ explore?.postfix ? `path + ${explore.postfix}` : "path",
183
+ ),
184
+ expected,
185
+ value,
186
+ ),
187
+ tuple: (binaries) =>
188
+ check_everything(
189
+ ts.factory.createArrayLiteralExpression(binaries, true),
190
+ ),
191
+ });
192
+
193
+ function create_output() {
194
+ return ts.factory.createObjectLiteralExpression(
195
+ [
196
+ ts.factory.createShorthandPropertyAssignment("success"),
197
+ ts.factory.createShorthandPropertyAssignment("errors"),
198
+ ts.factory.createPropertyAssignment(
199
+ "data",
200
+ ts.factory.createConditionalExpression(
201
+ ts.factory.createIdentifier("success"),
202
+ undefined,
203
+ ts.factory.createIdentifier("input"),
204
+ undefined,
205
+ ts.factory.createIdentifier("undefined"),
206
+ ),
207
+ ),
208
+ ],
209
+ true,
210
+ );
211
+ }
212
+
213
+ const create_report_call =
214
+ (exceptionable?: ts.Expression) =>
215
+ (
216
+ path: ts.Expression,
217
+ expected: string,
218
+ value: ts.Expression,
219
+ ): ts.Expression =>
220
+ ts.factory.createCallExpression(
221
+ ts.factory.createIdentifier("$report"),
222
+ undefined,
223
+ [
224
+ exceptionable || ts.factory.createIdentifier("exceptionable"),
225
+ ts.factory.createObjectLiteralExpression(
226
+ [
227
+ ts.factory.createPropertyAssignment("path", path),
228
+ ts.factory.createPropertyAssignment(
229
+ "expected",
230
+ ts.factory.createStringLiteral(expected),
231
+ ),
232
+ ts.factory.createPropertyAssignment("value", value),
233
+ ],
234
+ true,
235
+ ),
236
+ ],
237
+ );