typia 4.3.2-dev.20230821 → 4.3.3-dev.20230825

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 (241) hide show
  1. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +2 -0
  2. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  3. package/lib/programmers/helpers/CloneJoiner.js +10 -2
  4. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  5. package/lib/programmers/internal/check_dynamic_properties.js +1 -1
  6. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  7. package/package.json +2 -2
  8. package/src/CustomValidatorMap.ts +126 -126
  9. package/src/IRandomGenerator.ts +34 -34
  10. package/src/IValidation.ts +21 -21
  11. package/src/Primitive.ts +131 -131
  12. package/src/TypeGuardError.ts +36 -36
  13. package/src/executable/TypiaGenerateWizard.ts +85 -85
  14. package/src/executable/TypiaSetupWizard.ts +153 -153
  15. package/src/executable/setup/ArgumentParser.ts +45 -45
  16. package/src/executable/setup/CommandExecutor.ts +8 -8
  17. package/src/executable/setup/FileRetriever.ts +22 -22
  18. package/src/executable/setup/PackageManager.ts +71 -71
  19. package/src/executable/setup/PluginConfigurator.ts +70 -70
  20. package/src/executable/typia.ts +52 -52
  21. package/src/factories/CommentFactory.ts +84 -84
  22. package/src/factories/ExpressionFactory.ts +77 -77
  23. package/src/factories/IdentifierFactory.ts +59 -59
  24. package/src/factories/LiteralFactory.ts +39 -39
  25. package/src/factories/MetadataCollection.ts +269 -269
  26. package/src/factories/MetadataFactory.ts +34 -34
  27. package/src/factories/MetadataTagFactory.ts +361 -361
  28. package/src/factories/StatementFactory.ts +24 -24
  29. package/src/factories/TemplateFactory.ts +58 -58
  30. package/src/factories/TypeFactory.ts +124 -124
  31. package/src/factories/ValueFactory.ts +12 -12
  32. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  33. package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
  34. package/src/factories/internal/metadata/emplace_metadata_alias.ts +40 -40
  35. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  36. package/src/factories/internal/metadata/emplace_metadata_object.ts +136 -136
  37. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  38. package/src/factories/internal/metadata/explore_metadata.ts +38 -38
  39. package/src/factories/internal/metadata/iterate_metadata.ts +81 -81
  40. package/src/factories/internal/metadata/iterate_metadata_alias.ts +30 -30
  41. package/src/factories/internal/metadata/iterate_metadata_array.ts +24 -24
  42. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  43. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  44. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  45. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  46. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +88 -84
  47. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  48. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  49. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  50. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  51. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  52. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  53. package/src/factories/internal/metadata/iterate_metadata_tag.ts +31 -31
  54. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  55. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -24
  56. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  57. package/src/functional/$any.ts +2 -2
  58. package/src/functional/$dictionary.ts +25 -25
  59. package/src/functional/$every.ts +11 -11
  60. package/src/functional/$guard.ts +35 -35
  61. package/src/functional/$is_between.ts +2 -2
  62. package/src/functional/$is_custom.ts +14 -14
  63. package/src/functional/$is_date.ts +3 -3
  64. package/src/functional/$is_datetime.ts +2 -2
  65. package/src/functional/$is_email.ts +4 -4
  66. package/src/functional/$is_ipv4.ts +4 -4
  67. package/src/functional/$is_ipv6.ts +4 -4
  68. package/src/functional/$is_url.ts +4 -4
  69. package/src/functional/$is_uuid.ts +4 -4
  70. package/src/functional/$join.ts +46 -46
  71. package/src/functional/$number.ts +12 -12
  72. package/src/functional/$report.ts +15 -15
  73. package/src/functional/$rest.ts +3 -3
  74. package/src/functional/$string.ts +50 -50
  75. package/src/functional/$tail.ts +5 -5
  76. package/src/functional/Namespace.ts +127 -127
  77. package/src/index.ts +4 -4
  78. package/src/metadata/ICommentTag.ts +4 -4
  79. package/src/metadata/IJsDocTagInfo.ts +10 -10
  80. package/src/metadata/IMetadata.ts +28 -28
  81. package/src/metadata/IMetadataAlias.ts +14 -14
  82. package/src/metadata/IMetadataApplication.ts +7 -7
  83. package/src/metadata/IMetadataArray.ts +10 -10
  84. package/src/metadata/IMetadataCollection.ts +11 -11
  85. package/src/metadata/IMetadataConstant.ts +16 -16
  86. package/src/metadata/IMetadataDictionary.ts +14 -14
  87. package/src/metadata/IMetadataEntry.ts +6 -6
  88. package/src/metadata/IMetadataObject.ts +18 -18
  89. package/src/metadata/IMetadataProperty.ts +11 -11
  90. package/src/metadata/IMetadataResolved.ts +6 -6
  91. package/src/metadata/IMetadataTag.ts +112 -112
  92. package/src/metadata/IMetadataTuple.ts +10 -10
  93. package/src/metadata/Metadata.ts +607 -607
  94. package/src/metadata/MetadataAlias.ts +66 -66
  95. package/src/metadata/MetadataArray.ts +55 -55
  96. package/src/metadata/MetadataConstant.ts +3 -3
  97. package/src/metadata/MetadataObject.ts +129 -129
  98. package/src/metadata/MetadataProperty.ts +64 -64
  99. package/src/metadata/MetadataResolved.ts +51 -51
  100. package/src/metadata/MetadataTuple.ts +58 -58
  101. package/src/module.ts +2038 -2038
  102. package/src/programmers/ApplicationProgrammer.ts +47 -47
  103. package/src/programmers/AssertCloneProgrammer.ts +71 -71
  104. package/src/programmers/AssertParseProgrammer.ts +66 -66
  105. package/src/programmers/AssertProgrammer.ts +279 -279
  106. package/src/programmers/AssertPruneProgrammer.ts +68 -68
  107. package/src/programmers/AssertStringifyProgrammer.ts +66 -66
  108. package/src/programmers/CheckerProgrammer.ts +1173 -1173
  109. package/src/programmers/CloneProgrammer.ts +587 -587
  110. package/src/programmers/FeatureProgrammer.ts +495 -495
  111. package/src/programmers/IsCloneProgrammer.ts +78 -78
  112. package/src/programmers/IsParseProgrammer.ts +72 -72
  113. package/src/programmers/IsProgrammer.ts +239 -239
  114. package/src/programmers/IsPruneProgrammer.ts +73 -73
  115. package/src/programmers/IsStringifyProgrammer.ts +76 -76
  116. package/src/programmers/LiteralsProgrammer.ts +64 -64
  117. package/src/programmers/PruneProgrammer.ts +542 -542
  118. package/src/programmers/RandomProgrammer.ts +578 -578
  119. package/src/programmers/StringifyProgrammer.ts +986 -986
  120. package/src/programmers/TypiaProgrammer.ts +129 -129
  121. package/src/programmers/ValidateCloneProgrammer.ts +85 -85
  122. package/src/programmers/ValidateParseProgrammer.ts +70 -70
  123. package/src/programmers/ValidateProgrammer.ts +305 -305
  124. package/src/programmers/ValidatePruneProgrammer.ts +78 -78
  125. package/src/programmers/ValidateStringifyProgrammer.ts +84 -84
  126. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  127. package/src/programmers/helpers/CloneJoiner.ts +168 -131
  128. package/src/programmers/helpers/FunctionImporeter.ts +78 -78
  129. package/src/programmers/helpers/ICheckEntry.ts +12 -12
  130. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  131. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  132. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  133. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  134. package/src/programmers/helpers/RandomRanger.ts +208 -208
  135. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  136. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  137. package/src/programmers/helpers/UnionExplorer.ts +305 -305
  138. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  139. package/src/programmers/helpers/disable_function_importer_declare.ts +26 -26
  140. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  141. package/src/programmers/internal/application_alias.ts +66 -66
  142. package/src/programmers/internal/application_array.ts +30 -30
  143. package/src/programmers/internal/application_boolean.ts +15 -15
  144. package/src/programmers/internal/application_constant.ts +26 -26
  145. package/src/programmers/internal/application_default.ts +17 -17
  146. package/src/programmers/internal/application_default_string.ts +33 -33
  147. package/src/programmers/internal/application_native.ts +39 -39
  148. package/src/programmers/internal/application_number.ts +80 -80
  149. package/src/programmers/internal/application_object.ts +165 -165
  150. package/src/programmers/internal/application_resolved.ts +55 -55
  151. package/src/programmers/internal/application_schema.ts +157 -157
  152. package/src/programmers/internal/application_string.ts +44 -44
  153. package/src/programmers/internal/application_templates.ts +25 -25
  154. package/src/programmers/internal/application_tuple.ts +57 -57
  155. package/src/programmers/internal/check_array.ts +30 -30
  156. package/src/programmers/internal/check_array_length.ts +35 -35
  157. package/src/programmers/internal/check_bigint.ts +110 -110
  158. package/src/programmers/internal/check_custom.ts +31 -31
  159. package/src/programmers/internal/check_dynamic_properties.ts +194 -195
  160. package/src/programmers/internal/check_everything.ts +28 -28
  161. package/src/programmers/internal/check_native.ts +21 -21
  162. package/src/programmers/internal/check_object.ts +55 -55
  163. package/src/programmers/internal/check_string.ts +25 -25
  164. package/src/programmers/internal/check_string_tags.ts +67 -67
  165. package/src/programmers/internal/check_template.ts +56 -56
  166. package/src/programmers/internal/check_union_array_like.ts +329 -329
  167. package/src/programmers/internal/decode_union_object.ts +73 -73
  168. package/src/programmers/internal/feature_object_entries.ts +63 -63
  169. package/src/programmers/internal/get_comment_tags.ts +23 -23
  170. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  171. package/src/programmers/internal/prune_object_properties.ts +60 -60
  172. package/src/programmers/internal/random_custom.ts +29 -29
  173. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  174. package/src/programmers/internal/stringify_native.ts +7 -7
  175. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  176. package/src/programmers/internal/template_to_pattern.ts +15 -15
  177. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  178. package/src/schemas/IJsonApplication.ts +8 -8
  179. package/src/schemas/IJsonComponents.ts +33 -33
  180. package/src/schemas/IJsonSchema.ts +133 -133
  181. package/src/transform.ts +27 -27
  182. package/src/transformers/CallExpressionTransformer.ts +179 -179
  183. package/src/transformers/FileTransformer.ts +47 -47
  184. package/src/transformers/IProject.ts +11 -11
  185. package/src/transformers/ITransformOptions.ts +62 -62
  186. package/src/transformers/ImportTransformer.ts +66 -66
  187. package/src/transformers/NodeTransformer.ts +13 -13
  188. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +112 -112
  189. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  190. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  191. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  192. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  193. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  194. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  195. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  196. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  197. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  198. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +39 -39
  199. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  200. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  201. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  202. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  203. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +28 -28
  204. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +53 -53
  205. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  206. package/src/transformers/features/miscellaneous/RandomTransformer.ts +42 -42
  207. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  208. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  209. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  210. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  211. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  212. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  213. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  214. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  215. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  216. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +12 -12
  217. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  218. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  219. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +12 -12
  220. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  221. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  222. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  223. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  224. package/src/transformers/features/validators/CreateAssertTransformer.ts +13 -13
  225. package/src/transformers/features/validators/CreateIsTransformer.ts +11 -11
  226. package/src/transformers/features/validators/CreateValidateTransformer.ts +13 -13
  227. package/src/transformers/features/validators/IsTransformer.ts +11 -11
  228. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  229. package/src/transformers/internal/GenericTransformer.ts +97 -97
  230. package/src/typings/Atomic.ts +17 -17
  231. package/src/typings/ClassProperties.ts +5 -5
  232. package/src/typings/Customizable.ts +5 -5
  233. package/src/typings/OmitNever.ts +3 -3
  234. package/src/typings/SpecialFields.ts +3 -3
  235. package/src/typings/Writable.ts +11 -11
  236. package/src/utils/ArrayUtil.ts +45 -45
  237. package/src/utils/Escaper.ts +46 -46
  238. package/src/utils/MapUtil.ts +12 -12
  239. package/src/utils/PatternUtil.ts +33 -33
  240. package/src/utils/RandomGenerator.ts +81 -81
  241. package/src/utils/Singleton.ts +17 -17
@@ -1,279 +1,279 @@
1
- import ts from "typescript";
2
-
3
- import { IdentifierFactory } from "../factories/IdentifierFactory";
4
- import { StatementFactory } from "../factories/StatementFactory";
5
- import { TypeFactory } from "../factories/TypeFactory";
6
-
7
- import { IProject } from "../transformers/IProject";
8
-
9
- import { CheckerProgrammer } from "./CheckerProgrammer";
10
- import { IsProgrammer } from "./IsProgrammer";
11
- import { FunctionImporter } from "./helpers/FunctionImporeter";
12
- import { OptionPredicator } from "./helpers/OptionPredicator";
13
- import { check_object } from "./internal/check_object";
14
-
15
- export namespace AssertProgrammer {
16
- export const write =
17
- (project: IProject) =>
18
- (modulo: ts.LeftHandSideExpression) =>
19
- (equals: boolean) =>
20
- (type: ts.Type, name?: string) => {
21
- const importer: FunctionImporter = new FunctionImporter();
22
- const is = IsProgrammer.write(project)(modulo, true)(equals)(
23
- type,
24
- name ?? TypeFactory.getFullName(project.checker)(type),
25
- );
26
- const assert: ts.ArrowFunction = CheckerProgrammer.write(project)({
27
- prefix: "$a",
28
- path: true,
29
- trace: true,
30
- numeric: OptionPredicator.numeric(project.options),
31
- equals,
32
- atomist: (explore) => (tuple) => (input) =>
33
- [
34
- tuple.expression,
35
- ...tuple.tags.map((tag) =>
36
- ts.factory.createLogicalOr(
37
- tag.expression,
38
- create_guard_call(importer)(
39
- explore.from === "top"
40
- ? ts.factory.createTrue()
41
- : ts.factory.createIdentifier(
42
- "_exceptionable",
43
- ),
44
- )(
45
- ts.factory.createIdentifier(
46
- explore.postfix
47
- ? `_path + ${explore.postfix}`
48
- : "_path",
49
- ),
50
- tag.expected,
51
- input,
52
- ),
53
- ),
54
- ),
55
- ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
56
- combiner: combiner(equals)(importer),
57
- joiner: joiner(equals)(importer),
58
- success: ts.factory.createTrue(),
59
- addition: () => importer.declare(modulo),
60
- })(importer)(type, name);
61
-
62
- return ts.factory.createArrowFunction(
63
- undefined,
64
- undefined,
65
- [
66
- IdentifierFactory.parameter(
67
- "input",
68
- TypeFactory.keyword("any"),
69
- ),
70
- ],
71
- ts.factory.createTypeReferenceNode(
72
- name ?? TypeFactory.getFullName(project.checker)(type),
73
- ),
74
- undefined,
75
- ts.factory.createBlock(
76
- [
77
- StatementFactory.constant("__is", is),
78
- ts.factory.createIfStatement(
79
- ts.factory.createStrictEquality(
80
- ts.factory.createFalse(),
81
- ts.factory.createCallExpression(
82
- ts.factory.createIdentifier("__is"),
83
- undefined,
84
- [ts.factory.createIdentifier("input")],
85
- ),
86
- ),
87
- ts.factory.createExpressionStatement(
88
- ts.factory.createCallExpression(
89
- assert,
90
- undefined,
91
- [
92
- ts.factory.createIdentifier("input"),
93
- ts.factory.createStringLiteral(
94
- "$input",
95
- ),
96
- ts.factory.createTrue(),
97
- ],
98
- ),
99
- ),
100
- undefined,
101
- ),
102
- ts.factory.createReturnStatement(
103
- ts.factory.createIdentifier(`input`),
104
- ),
105
- ],
106
- true,
107
- ),
108
- );
109
- };
110
-
111
- const combiner =
112
- (equals: boolean) =>
113
- (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner =>
114
- (explore: CheckerProgrammer.IExplore) => {
115
- if (explore.tracable === false)
116
- return IsProgrammer.configure({
117
- object: assert_object(equals)(importer),
118
- numeric: true,
119
- })(importer).combiner(explore);
120
-
121
- const path: string = explore.postfix
122
- ? `_path + ${explore.postfix}`
123
- : "_path";
124
- return (logic) => (input, binaries, expected) =>
125
- logic === "and"
126
- ? binaries
127
- .map((binary) =>
128
- binary.combined
129
- ? binary.expression
130
- : ts.factory.createLogicalOr(
131
- binary.expression,
132
- create_guard_call(importer)(
133
- explore.source === "top"
134
- ? ts.factory.createTrue()
135
- : ts.factory.createIdentifier(
136
- "_exceptionable",
137
- ),
138
- )(
139
- ts.factory.createIdentifier(path),
140
- expected,
141
- input,
142
- ),
143
- ),
144
- )
145
- .reduce(ts.factory.createLogicalAnd)
146
- : ts.factory.createLogicalOr(
147
- binaries
148
- .map((binary) => binary.expression)
149
- .reduce(ts.factory.createLogicalOr),
150
- create_guard_call(importer)(
151
- explore.source === "top"
152
- ? ts.factory.createTrue()
153
- : ts.factory.createIdentifier(
154
- "_exceptionable",
155
- ),
156
- )(ts.factory.createIdentifier(path), expected, input),
157
- );
158
- // : (() => {
159
- // const addicted = binaries.slice();
160
- // if (
161
- // addicted[addicted.length - 1]!.combined === false
162
- // ) {
163
- // addicted.push({
164
- // combined: true,
165
- // expression: create_guard_call(importer)(
166
- // explore.source === "top"
167
- // ? ts.factory.createTrue()
168
- // : ts.factory.createIdentifier(
169
- // "_exceptionable",
170
- // ),
171
- // )(
172
- // ts.factory.createIdentifier(path),
173
- // expected,
174
- // input,
175
- // ),
176
- // });
177
- // }
178
- // return addicted
179
- // .map((b) => b.expression)
180
- // .reduce(ts.factory.createLogicalOr);
181
- // })();
182
- };
183
-
184
- const assert_object = (equals: boolean) => (importer: FunctionImporter) =>
185
- check_object({
186
- equals,
187
- assert: true,
188
- undefined: true,
189
- reduce: ts.factory.createLogicalAnd,
190
- positive: ts.factory.createTrue(),
191
- superfluous: (value) =>
192
- create_guard_call(importer)()(
193
- ts.factory.createAdd(
194
- ts.factory.createIdentifier("_path"),
195
- ts.factory.createCallExpression(
196
- importer.use("join"),
197
- undefined,
198
- [ts.factory.createIdentifier("key")],
199
- ),
200
- ),
201
- "undefined",
202
- value,
203
- ),
204
- halt: (expr) =>
205
- ts.factory.createLogicalOr(
206
- ts.factory.createStrictEquality(
207
- ts.factory.createFalse(),
208
- ts.factory.createIdentifier("_exceptionable"),
209
- ),
210
- expr,
211
- ),
212
- })(importer);
213
-
214
- const joiner =
215
- (equals: boolean) =>
216
- (importer: FunctionImporter): CheckerProgrammer.IConfig.IJoiner => ({
217
- object: assert_object(equals)(importer),
218
- array: (input, arrow) =>
219
- ts.factory.createCallExpression(
220
- IdentifierFactory.access(input)("every"),
221
- undefined,
222
- [arrow],
223
- ),
224
- failure: (value, expected, explore) =>
225
- create_guard_call(importer)(
226
- explore?.from === "top"
227
- ? ts.factory.createTrue()
228
- : ts.factory.createIdentifier("_exceptionable"),
229
- )(
230
- ts.factory.createIdentifier(
231
- explore?.postfix
232
- ? `_path + ${explore.postfix}`
233
- : "_path",
234
- ),
235
- expected,
236
- value,
237
- ),
238
- full: equals
239
- ? undefined
240
- : (condition) => (input, expected, explore) =>
241
- ts.factory.createLogicalOr(
242
- condition,
243
- create_guard_call(importer)(
244
- explore.from === "top"
245
- ? ts.factory.createTrue()
246
- : ts.factory.createIdentifier(
247
- "_exceptionable",
248
- ),
249
- )(
250
- ts.factory.createIdentifier("_path"),
251
- expected,
252
- input,
253
- ),
254
- ),
255
- });
256
-
257
- const create_guard_call =
258
- (importer: FunctionImporter) =>
259
- (exceptionable?: ts.Expression) =>
260
- (
261
- path: ts.Expression,
262
- expected: string,
263
- value: ts.Expression,
264
- ): ts.Expression =>
265
- ts.factory.createCallExpression(importer.use("guard"), undefined, [
266
- exceptionable ?? ts.factory.createIdentifier("_exceptionable"),
267
- ts.factory.createObjectLiteralExpression(
268
- [
269
- ts.factory.createPropertyAssignment("path", path),
270
- ts.factory.createPropertyAssignment(
271
- "expected",
272
- ts.factory.createStringLiteral(expected),
273
- ),
274
- ts.factory.createPropertyAssignment("value", value),
275
- ],
276
- true,
277
- ),
278
- ]);
279
- }
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { StatementFactory } from "../factories/StatementFactory";
5
+ import { TypeFactory } from "../factories/TypeFactory";
6
+
7
+ import { IProject } from "../transformers/IProject";
8
+
9
+ import { CheckerProgrammer } from "./CheckerProgrammer";
10
+ import { IsProgrammer } from "./IsProgrammer";
11
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
12
+ import { OptionPredicator } from "./helpers/OptionPredicator";
13
+ import { check_object } from "./internal/check_object";
14
+
15
+ export namespace AssertProgrammer {
16
+ export const write =
17
+ (project: IProject) =>
18
+ (modulo: ts.LeftHandSideExpression) =>
19
+ (equals: boolean) =>
20
+ (type: ts.Type, name?: string) => {
21
+ const importer: FunctionImporter = new FunctionImporter();
22
+ const is = IsProgrammer.write(project)(modulo, true)(equals)(
23
+ type,
24
+ name ?? TypeFactory.getFullName(project.checker)(type),
25
+ );
26
+ const assert: ts.ArrowFunction = CheckerProgrammer.write(project)({
27
+ prefix: "$a",
28
+ path: true,
29
+ trace: true,
30
+ numeric: OptionPredicator.numeric(project.options),
31
+ equals,
32
+ atomist: (explore) => (tuple) => (input) =>
33
+ [
34
+ tuple.expression,
35
+ ...tuple.tags.map((tag) =>
36
+ ts.factory.createLogicalOr(
37
+ tag.expression,
38
+ create_guard_call(importer)(
39
+ explore.from === "top"
40
+ ? ts.factory.createTrue()
41
+ : ts.factory.createIdentifier(
42
+ "_exceptionable",
43
+ ),
44
+ )(
45
+ ts.factory.createIdentifier(
46
+ explore.postfix
47
+ ? `_path + ${explore.postfix}`
48
+ : "_path",
49
+ ),
50
+ tag.expected,
51
+ input,
52
+ ),
53
+ ),
54
+ ),
55
+ ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
56
+ combiner: combiner(equals)(importer),
57
+ joiner: joiner(equals)(importer),
58
+ success: ts.factory.createTrue(),
59
+ addition: () => importer.declare(modulo),
60
+ })(importer)(type, name);
61
+
62
+ return ts.factory.createArrowFunction(
63
+ undefined,
64
+ undefined,
65
+ [
66
+ IdentifierFactory.parameter(
67
+ "input",
68
+ TypeFactory.keyword("any"),
69
+ ),
70
+ ],
71
+ ts.factory.createTypeReferenceNode(
72
+ name ?? TypeFactory.getFullName(project.checker)(type),
73
+ ),
74
+ undefined,
75
+ ts.factory.createBlock(
76
+ [
77
+ StatementFactory.constant("__is", is),
78
+ ts.factory.createIfStatement(
79
+ ts.factory.createStrictEquality(
80
+ ts.factory.createFalse(),
81
+ ts.factory.createCallExpression(
82
+ ts.factory.createIdentifier("__is"),
83
+ undefined,
84
+ [ts.factory.createIdentifier("input")],
85
+ ),
86
+ ),
87
+ ts.factory.createExpressionStatement(
88
+ ts.factory.createCallExpression(
89
+ assert,
90
+ undefined,
91
+ [
92
+ ts.factory.createIdentifier("input"),
93
+ ts.factory.createStringLiteral(
94
+ "$input",
95
+ ),
96
+ ts.factory.createTrue(),
97
+ ],
98
+ ),
99
+ ),
100
+ undefined,
101
+ ),
102
+ ts.factory.createReturnStatement(
103
+ ts.factory.createIdentifier(`input`),
104
+ ),
105
+ ],
106
+ true,
107
+ ),
108
+ );
109
+ };
110
+
111
+ const combiner =
112
+ (equals: boolean) =>
113
+ (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner =>
114
+ (explore: CheckerProgrammer.IExplore) => {
115
+ if (explore.tracable === false)
116
+ return IsProgrammer.configure({
117
+ object: assert_object(equals)(importer),
118
+ numeric: true,
119
+ })(importer).combiner(explore);
120
+
121
+ const path: string = explore.postfix
122
+ ? `_path + ${explore.postfix}`
123
+ : "_path";
124
+ return (logic) => (input, binaries, expected) =>
125
+ logic === "and"
126
+ ? binaries
127
+ .map((binary) =>
128
+ binary.combined
129
+ ? binary.expression
130
+ : ts.factory.createLogicalOr(
131
+ binary.expression,
132
+ create_guard_call(importer)(
133
+ explore.source === "top"
134
+ ? ts.factory.createTrue()
135
+ : ts.factory.createIdentifier(
136
+ "_exceptionable",
137
+ ),
138
+ )(
139
+ ts.factory.createIdentifier(path),
140
+ expected,
141
+ input,
142
+ ),
143
+ ),
144
+ )
145
+ .reduce(ts.factory.createLogicalAnd)
146
+ : ts.factory.createLogicalOr(
147
+ binaries
148
+ .map((binary) => binary.expression)
149
+ .reduce(ts.factory.createLogicalOr),
150
+ create_guard_call(importer)(
151
+ explore.source === "top"
152
+ ? ts.factory.createTrue()
153
+ : ts.factory.createIdentifier(
154
+ "_exceptionable",
155
+ ),
156
+ )(ts.factory.createIdentifier(path), expected, input),
157
+ );
158
+ // : (() => {
159
+ // const addicted = binaries.slice();
160
+ // if (
161
+ // addicted[addicted.length - 1]!.combined === false
162
+ // ) {
163
+ // addicted.push({
164
+ // combined: true,
165
+ // expression: create_guard_call(importer)(
166
+ // explore.source === "top"
167
+ // ? ts.factory.createTrue()
168
+ // : ts.factory.createIdentifier(
169
+ // "_exceptionable",
170
+ // ),
171
+ // )(
172
+ // ts.factory.createIdentifier(path),
173
+ // expected,
174
+ // input,
175
+ // ),
176
+ // });
177
+ // }
178
+ // return addicted
179
+ // .map((b) => b.expression)
180
+ // .reduce(ts.factory.createLogicalOr);
181
+ // })();
182
+ };
183
+
184
+ const assert_object = (equals: boolean) => (importer: FunctionImporter) =>
185
+ check_object({
186
+ equals,
187
+ assert: true,
188
+ undefined: true,
189
+ reduce: ts.factory.createLogicalAnd,
190
+ positive: ts.factory.createTrue(),
191
+ superfluous: (value) =>
192
+ create_guard_call(importer)()(
193
+ ts.factory.createAdd(
194
+ ts.factory.createIdentifier("_path"),
195
+ ts.factory.createCallExpression(
196
+ importer.use("join"),
197
+ undefined,
198
+ [ts.factory.createIdentifier("key")],
199
+ ),
200
+ ),
201
+ "undefined",
202
+ value,
203
+ ),
204
+ halt: (expr) =>
205
+ ts.factory.createLogicalOr(
206
+ ts.factory.createStrictEquality(
207
+ ts.factory.createFalse(),
208
+ ts.factory.createIdentifier("_exceptionable"),
209
+ ),
210
+ expr,
211
+ ),
212
+ })(importer);
213
+
214
+ const joiner =
215
+ (equals: boolean) =>
216
+ (importer: FunctionImporter): CheckerProgrammer.IConfig.IJoiner => ({
217
+ object: assert_object(equals)(importer),
218
+ array: (input, arrow) =>
219
+ ts.factory.createCallExpression(
220
+ IdentifierFactory.access(input)("every"),
221
+ undefined,
222
+ [arrow],
223
+ ),
224
+ failure: (value, expected, explore) =>
225
+ create_guard_call(importer)(
226
+ explore?.from === "top"
227
+ ? ts.factory.createTrue()
228
+ : ts.factory.createIdentifier("_exceptionable"),
229
+ )(
230
+ ts.factory.createIdentifier(
231
+ explore?.postfix
232
+ ? `_path + ${explore.postfix}`
233
+ : "_path",
234
+ ),
235
+ expected,
236
+ value,
237
+ ),
238
+ full: equals
239
+ ? undefined
240
+ : (condition) => (input, expected, explore) =>
241
+ ts.factory.createLogicalOr(
242
+ condition,
243
+ create_guard_call(importer)(
244
+ explore.from === "top"
245
+ ? ts.factory.createTrue()
246
+ : ts.factory.createIdentifier(
247
+ "_exceptionable",
248
+ ),
249
+ )(
250
+ ts.factory.createIdentifier("_path"),
251
+ expected,
252
+ input,
253
+ ),
254
+ ),
255
+ });
256
+
257
+ const create_guard_call =
258
+ (importer: FunctionImporter) =>
259
+ (exceptionable?: ts.Expression) =>
260
+ (
261
+ path: ts.Expression,
262
+ expected: string,
263
+ value: ts.Expression,
264
+ ): ts.Expression =>
265
+ ts.factory.createCallExpression(importer.use("guard"), undefined, [
266
+ exceptionable ?? ts.factory.createIdentifier("_exceptionable"),
267
+ ts.factory.createObjectLiteralExpression(
268
+ [
269
+ ts.factory.createPropertyAssignment("path", path),
270
+ ts.factory.createPropertyAssignment(
271
+ "expected",
272
+ ts.factory.createStringLiteral(expected),
273
+ ),
274
+ ts.factory.createPropertyAssignment("value", value),
275
+ ],
276
+ true,
277
+ ),
278
+ ]);
279
+ }