typia 3.7.5-dev.20230413 → 3.7.6

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 (231) hide show
  1. package/README.md +35 -228
  2. package/lib/executable/TypiaSetupWizard.d.ts +1 -0
  3. package/lib/executable/TypiaSetupWizard.js +62 -30
  4. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  5. package/lib/executable/setup/PackageManager.d.ts +1 -1
  6. package/lib/executable/typia.d.ts +1 -1
  7. package/lib/executable/typia.js +1 -1
  8. package/lib/executable/typia.js.map +1 -1
  9. package/lib/factories/IdentifierFactory.d.ts +1 -1
  10. package/lib/factories/IdentifierFactory.js +1 -1
  11. package/lib/factories/IdentifierFactory.js.map +1 -1
  12. package/lib/factories/TypiaFileFactory.js +9 -4
  13. package/lib/factories/TypiaFileFactory.js.map +1 -1
  14. package/lib/programmers/internal/check_string_tags.js +2 -2
  15. package/lib/programmers/internal/check_string_tags.js.map +1 -1
  16. package/lib/programmers/internal/check_template.js +1 -1
  17. package/lib/programmers/internal/check_template.js.map +1 -1
  18. package/package.json +11 -12
  19. package/src/CustomValidatorMap.ts +126 -126
  20. package/src/IRandomGenerator.ts +33 -33
  21. package/src/IValidation.ts +21 -21
  22. package/src/Primitive.ts +104 -104
  23. package/src/TypeGuardError.ts +36 -36
  24. package/src/executable/TypiaGenerateWizard.ts +85 -85
  25. package/src/executable/TypiaSetupWizard.ts +47 -14
  26. package/src/executable/setup/ArgumentParser.ts +45 -45
  27. package/src/executable/setup/CommandExecutor.ts +8 -8
  28. package/src/executable/setup/FileRetriever.ts +22 -22
  29. package/src/executable/setup/PackageManager.ts +1 -1
  30. package/src/executable/setup/PluginConfigurator.ts +59 -59
  31. package/src/executable/typia.ts +54 -53
  32. package/src/factories/CommentFactory.ts +10 -10
  33. package/src/factories/ExpressionFactory.ts +77 -77
  34. package/src/factories/IdentifierFactory.ts +81 -59
  35. package/src/factories/LiteralFactory.ts +44 -44
  36. package/src/factories/MetadataCollection.ts +122 -122
  37. package/src/factories/MetadataFactory.ts +51 -51
  38. package/src/factories/MetadataTagFactory.ts +302 -302
  39. package/src/factories/StatementFactory.ts +60 -60
  40. package/src/factories/TemplateFactory.ts +56 -56
  41. package/src/factories/TypeFactory.ts +129 -129
  42. package/src/factories/TypiaFileFactory.ts +12 -3
  43. package/src/factories/ValueFactory.ts +12 -12
  44. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  45. package/src/factories/internal/metadata/emplace_metadata_object.ts +142 -142
  46. package/src/factories/internal/metadata/explore_metadata.ts +92 -92
  47. package/src/factories/internal/metadata/iterate_metadata.ts +80 -80
  48. package/src/factories/internal/metadata/iterate_metadata_array.ts +29 -29
  49. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  50. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  51. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  52. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  53. package/src/factories/internal/metadata/iterate_metadata_native.ts +222 -222
  54. package/src/factories/internal/metadata/iterate_metadata_object.ts +48 -48
  55. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +27 -27
  56. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  57. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  58. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +45 -45
  59. package/src/factories/internal/metadata/iterate_metadata_union.ts +59 -59
  60. package/src/functional/$any.ts +3 -3
  61. package/src/functional/$dictionary.ts +20 -20
  62. package/src/functional/$every.ts +11 -11
  63. package/src/functional/$guard.ts +35 -35
  64. package/src/functional/$is_between.ts +7 -7
  65. package/src/functional/$is_custom.ts +14 -14
  66. package/src/functional/$is_date.ts +4 -4
  67. package/src/functional/$is_datetime.ts +3 -3
  68. package/src/functional/$is_email.ts +5 -5
  69. package/src/functional/$is_ipv4.ts +5 -5
  70. package/src/functional/$is_ipv6.ts +5 -5
  71. package/src/functional/$is_url.ts +5 -5
  72. package/src/functional/$is_uuid.ts +5 -5
  73. package/src/functional/$join.ts +50 -50
  74. package/src/functional/$number.ts +12 -12
  75. package/src/functional/$report.ts +15 -15
  76. package/src/functional/$rest.ts +3 -3
  77. package/src/functional/$string.ts +37 -37
  78. package/src/functional/$tail.ts +6 -6
  79. package/src/functional/Namespace.ts +127 -127
  80. package/src/index.ts +4 -4
  81. package/src/metadata/ICommentTag.ts +4 -4
  82. package/src/metadata/IJsDocTagInfo.ts +10 -10
  83. package/src/metadata/IMetadata.ts +25 -25
  84. package/src/metadata/IMetadataApplication.ts +7 -7
  85. package/src/metadata/IMetadataConstant.ts +16 -16
  86. package/src/metadata/IMetadataEntry.ts +6 -6
  87. package/src/metadata/IMetadataObject.ts +29 -29
  88. package/src/metadata/IMetadataProperty.ts +11 -11
  89. package/src/metadata/IMetadataTag.ts +105 -105
  90. package/src/metadata/Metadata.ts +534 -534
  91. package/src/metadata/MetadataConstant.ts +3 -3
  92. package/src/metadata/MetadataObject.ts +131 -131
  93. package/src/metadata/MetadataProperty.ts +64 -64
  94. package/src/module.ts +2043 -2043
  95. package/src/programmers/ApplicationProgrammer.ts +55 -55
  96. package/src/programmers/AssertCloneProgrammer.ts +70 -70
  97. package/src/programmers/AssertParseProgrammer.ts +65 -65
  98. package/src/programmers/AssertProgrammer.ts +284 -284
  99. package/src/programmers/AssertPruneProgrammer.ts +67 -67
  100. package/src/programmers/AssertStringifyProgrammer.ts +71 -71
  101. package/src/programmers/CheckerProgrammer.ts +922 -922
  102. package/src/programmers/CloneProgrammer.ts +388 -388
  103. package/src/programmers/FeatureProgrammer.ts +512 -512
  104. package/src/programmers/IsCloneProgrammer.ts +80 -80
  105. package/src/programmers/IsParseProgrammer.ts +74 -74
  106. package/src/programmers/IsProgrammer.ts +206 -206
  107. package/src/programmers/IsPruneProgrammer.ts +75 -75
  108. package/src/programmers/IsStringifyProgrammer.ts +81 -81
  109. package/src/programmers/LiteralsProgrammer.ts +65 -65
  110. package/src/programmers/PruneProgrammer.ts +343 -343
  111. package/src/programmers/RandomProgrammer.ts +413 -413
  112. package/src/programmers/StringifyProgrammer.ts +801 -801
  113. package/src/programmers/ValidateCloneProgrammer.ts +90 -90
  114. package/src/programmers/ValidateParseProgrammer.ts +69 -69
  115. package/src/programmers/ValidateProgrammer.ts +317 -317
  116. package/src/programmers/ValidatePruneProgrammer.ts +83 -83
  117. package/src/programmers/ValidateStringifyProgrammer.ts +89 -89
  118. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  119. package/src/programmers/helpers/CloneJoiner.ts +134 -134
  120. package/src/programmers/helpers/FunctionImporeter.ts +55 -55
  121. package/src/programmers/helpers/ICheckEntry.ts +12 -12
  122. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  123. package/src/programmers/helpers/OptionPredicator.ts +19 -19
  124. package/src/programmers/helpers/PruneJoiner.ts +52 -52
  125. package/src/programmers/helpers/RandomJoiner.ts +161 -161
  126. package/src/programmers/helpers/RandomRanger.ts +216 -216
  127. package/src/programmers/helpers/StringifyJoinder.ts +114 -114
  128. package/src/programmers/helpers/StringifyPredicator.ts +18 -18
  129. package/src/programmers/helpers/UnionExplorer.ts +281 -281
  130. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  131. package/src/programmers/internal/application_array.ts +37 -37
  132. package/src/programmers/internal/application_boolean.ts +17 -17
  133. package/src/programmers/internal/application_constant.ts +29 -29
  134. package/src/programmers/internal/application_default.ts +17 -17
  135. package/src/programmers/internal/application_default_string.ts +32 -32
  136. package/src/programmers/internal/application_native.ts +32 -32
  137. package/src/programmers/internal/application_number.ts +73 -73
  138. package/src/programmers/internal/application_object.ts +153 -153
  139. package/src/programmers/internal/application_schema.ts +184 -184
  140. package/src/programmers/internal/application_string.ts +45 -45
  141. package/src/programmers/internal/application_templates.ts +27 -27
  142. package/src/programmers/internal/application_tuple.ts +29 -29
  143. package/src/programmers/internal/check_array.ts +30 -30
  144. package/src/programmers/internal/check_array_length.ts +35 -35
  145. package/src/programmers/internal/check_bigint.ts +82 -82
  146. package/src/programmers/internal/check_custom.ts +33 -33
  147. package/src/programmers/internal/check_dynamic_properties.ts +197 -197
  148. package/src/programmers/internal/check_everything.ts +28 -28
  149. package/src/programmers/internal/check_native.ts +21 -21
  150. package/src/programmers/internal/check_number.ts +177 -177
  151. package/src/programmers/internal/check_object.ts +55 -55
  152. package/src/programmers/internal/check_string.ts +25 -25
  153. package/src/programmers/internal/check_string_tags.ts +9 -15
  154. package/src/programmers/internal/check_template.ts +6 -9
  155. package/src/programmers/internal/check_union_array_like.ts +272 -272
  156. package/src/programmers/internal/check_union_tuple.ts +35 -35
  157. package/src/programmers/internal/decode_union_object.ts +73 -73
  158. package/src/programmers/internal/feature_object_entries.ts +63 -63
  159. package/src/programmers/internal/get_comment_tags.ts +23 -23
  160. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  161. package/src/programmers/internal/prune_object_properties.ts +60 -60
  162. package/src/programmers/internal/random_custom.ts +30 -30
  163. package/src/programmers/internal/stringify_dynamic_properties.ts +168 -168
  164. package/src/programmers/internal/stringify_native.ts +8 -8
  165. package/src/programmers/internal/stringify_regular_properties.ts +84 -84
  166. package/src/programmers/internal/template_to_pattern.ts +15 -15
  167. package/src/schemas/IJsonApplication.ts +9 -9
  168. package/src/schemas/IJsonComponents.ts +26 -26
  169. package/src/schemas/IJsonSchema.ts +121 -121
  170. package/src/transform.ts +21 -21
  171. package/src/transformers/CallExpressionTransformer.ts +174 -174
  172. package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -66
  173. package/src/transformers/FileTransformer.ts +49 -49
  174. package/src/transformers/IProject.ts +11 -11
  175. package/src/transformers/ITransformOptions.ts +62 -62
  176. package/src/transformers/ImportTransformer.ts +66 -66
  177. package/src/transformers/NodeTransformer.ts +19 -19
  178. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +119 -119
  179. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  180. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  181. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  182. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  183. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  184. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  185. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  186. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  187. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  188. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +41 -41
  189. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  190. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  191. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  192. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  193. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +30 -30
  194. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +54 -54
  195. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  196. package/src/transformers/features/miscellaneous/RandomTransformer.ts +46 -46
  197. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  198. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  199. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  200. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  201. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  202. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  203. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  204. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  205. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  206. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +9 -9
  207. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  208. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  209. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +11 -11
  210. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  211. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  212. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  213. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  214. package/src/transformers/features/validators/CreateAssertTransformer.ts +12 -12
  215. package/src/transformers/features/validators/CreateIsTransformer.ts +10 -10
  216. package/src/transformers/features/validators/CreateValidateTransformer.ts +12 -12
  217. package/src/transformers/features/validators/IsTransformer.ts +10 -10
  218. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  219. package/src/transformers/internal/GenericTransformer.ts +99 -99
  220. package/src/typings/Atomic.ts +17 -17
  221. package/src/typings/ClassProperties.ts +5 -5
  222. package/src/typings/Customizable.ts +5 -5
  223. package/src/typings/OmitNever.ts +3 -3
  224. package/src/typings/SpecialFields.ts +3 -3
  225. package/src/typings/Writable.ts +11 -11
  226. package/src/utils/ArrayUtil.ts +49 -49
  227. package/src/utils/Escaper.ts +50 -50
  228. package/src/utils/MapUtil.ts +14 -14
  229. package/src/utils/PatternUtil.ts +30 -30
  230. package/src/utils/RandomGenerator.ts +96 -96
  231. package/src/utils/Singleton.ts +17 -17
@@ -1,206 +1,206 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../factories/IdentifierFactory";
5
- import { ValueFactory } from "../factories/ValueFactory";
6
-
7
- import { MetadataObject } from "../metadata/MetadataObject";
8
-
9
- import { IProject } from "../transformers/IProject";
10
-
11
- import { CheckerProgrammer } from "./CheckerProgrammer";
12
- import { FunctionImporter } from "./helpers/FunctionImporeter";
13
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
14
- import { OptionPredicator } from "./helpers/OptionPredicator";
15
- import { check_object } from "./internal/check_object";
16
- import { feature_object_entries } from "./internal/feature_object_entries";
17
-
18
- export namespace IsProgrammer {
19
- export const CONFIG =
20
- (options?: Partial<CONFIG.IOptions>) =>
21
- (importer: FunctionImporter): CheckerProgrammer.IConfig => ({
22
- functors: "$io",
23
- unioners: "$iu",
24
- trace: false,
25
- path: false,
26
- equals: !!options?.object,
27
- numeric: OptionPredicator.numeric({
28
- numeric: options?.numeric,
29
- }),
30
- atomist: () => (entry) => () =>
31
- [
32
- entry.expression,
33
- ...entry.tags.map((tag) => tag.expression),
34
- ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
35
- combiner: () => (type: "and" | "or") => {
36
- const initial: ts.TrueLiteral | ts.FalseLiteral =
37
- type === "and"
38
- ? ts.factory.createTrue()
39
- : ts.factory.createFalse();
40
- const binder =
41
- type === "and"
42
- ? ts.factory.createLogicalAnd
43
- : ts.factory.createLogicalOr;
44
- return (
45
- _input: ts.Expression,
46
- binaries: CheckerProgrammer.IBinary[],
47
- ) =>
48
- binaries.length
49
- ? binaries
50
- .map((binary) => binary.expression)
51
- .reduce((x, y) => binder(x, y))
52
- : initial;
53
- },
54
- joiner: {
55
- object:
56
- options?.object ||
57
- check_object({
58
- equals: !!options?.object,
59
- undefined: OptionPredicator.undefined({
60
- undefined: options?.undefined,
61
- }),
62
- assert: true,
63
- reduce: ts.factory.createLogicalAnd,
64
- positive: ts.factory.createTrue(),
65
- superfluous: () => ts.factory.createFalse(),
66
- })(importer),
67
- array: (input, arrow) =>
68
- ts.factory.createCallExpression(
69
- IdentifierFactory.join(input, "every"),
70
- undefined,
71
- [arrow],
72
- ),
73
- failure: () => ts.factory.createFalse(),
74
- },
75
- success: ts.factory.createTrue(),
76
- });
77
-
78
- export namespace CONFIG {
79
- export interface IOptions {
80
- numeric: boolean;
81
- undefined: boolean;
82
- object: (
83
- input: ts.Expression,
84
- entries: IExpressionEntry<ts.Expression>[],
85
- ) => ts.Expression;
86
- }
87
- }
88
-
89
- /* -----------------------------------------------------------
90
- GENERATORS
91
- ----------------------------------------------------------- */
92
- export function generate(
93
- project: IProject,
94
- modulo: ts.LeftHandSideExpression,
95
- equals: boolean = false,
96
- ) {
97
- const importer: FunctionImporter = new FunctionImporter();
98
-
99
- // CONFIGURATION
100
- const config = CONFIG({
101
- object: check_object({
102
- equals,
103
- undefined: OptionPredicator.undefined(project.options),
104
- assert: true,
105
- reduce: ts.factory.createLogicalAnd,
106
- positive: ts.factory.createTrue(),
107
- superfluous: () => ts.factory.createFalse(),
108
- })(importer),
109
- numeric: OptionPredicator.numeric(project.options),
110
- })(importer);
111
- config.trace = equals;
112
-
113
- config.decoder = (input, target, explore, tags, jsDocTags) => {
114
- if (
115
- target.size() === 1 &&
116
- target.objects.length === 1 &&
117
- target.required === true &&
118
- target.nullable === false
119
- ) {
120
- // ONLY WHEN OBJECT WITH SOME ATOMIC PROPERTIES
121
- const obj: MetadataObject = target.objects[0]!;
122
- if (
123
- obj._Is_simple() &&
124
- (equals === false ||
125
- OptionPredicator.undefined(project.options) === false)
126
- )
127
- return ts.factory.createLogicalAnd(
128
- ExpressionFactory.isObject(input, {
129
- checkNull: true,
130
- checkArray: false,
131
- }),
132
- config.joiner.object(
133
- input,
134
- feature_object_entries(config as any)(importer)(
135
- obj,
136
- )(input),
137
- ),
138
- );
139
- }
140
- return CheckerProgrammer.decode(project, config, importer)(
141
- input,
142
- target,
143
- explore,
144
- tags,
145
- jsDocTags,
146
- );
147
- };
148
-
149
- // GENERATE CHECKER
150
- return CheckerProgrammer.generate(project, config, importer, () =>
151
- importer.declare(modulo),
152
- );
153
- }
154
-
155
- export const generate_functors = (
156
- project: IProject,
157
- importer: FunctionImporter,
158
- ) =>
159
- CheckerProgrammer.generate_functors(
160
- project,
161
- CONFIG()(importer),
162
- importer,
163
- );
164
-
165
- export const generate_unioners = (
166
- project: IProject,
167
- importer: FunctionImporter,
168
- ) =>
169
- CheckerProgrammer.generate_unioners(
170
- project,
171
- CONFIG()(importer),
172
- importer,
173
- );
174
-
175
- /* -----------------------------------------------------------
176
- DECODERS
177
- ----------------------------------------------------------- */
178
- export const decode = (project: IProject, importer: FunctionImporter) =>
179
- CheckerProgrammer.decode(project, CONFIG()(importer), importer);
180
-
181
- export const decode_object = (importer: FunctionImporter) =>
182
- CheckerProgrammer.decode_object(CONFIG()(importer))(importer);
183
-
184
- export function decode_to_json(
185
- input: ts.Expression,
186
- checkNull: boolean,
187
- ): ts.Expression {
188
- return ts.factory.createLogicalAnd(
189
- ExpressionFactory.isObject(input, {
190
- checkArray: false,
191
- checkNull,
192
- }),
193
- ts.factory.createStrictEquality(
194
- ts.factory.createStringLiteral("function"),
195
- ValueFactory.TYPEOF(IdentifierFactory.join(input, "toJSON")),
196
- ),
197
- );
198
- }
199
-
200
- export function decode_functional(input: ts.Expression) {
201
- return ts.factory.createStrictEquality(
202
- ts.factory.createStringLiteral("function"),
203
- ValueFactory.TYPEOF(input),
204
- );
205
- }
206
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { ValueFactory } from "../factories/ValueFactory";
6
+
7
+ import { MetadataObject } from "../metadata/MetadataObject";
8
+
9
+ import { IProject } from "../transformers/IProject";
10
+
11
+ import { CheckerProgrammer } from "./CheckerProgrammer";
12
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
13
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
14
+ import { OptionPredicator } from "./helpers/OptionPredicator";
15
+ import { check_object } from "./internal/check_object";
16
+ import { feature_object_entries } from "./internal/feature_object_entries";
17
+
18
+ export namespace IsProgrammer {
19
+ export const CONFIG =
20
+ (options?: Partial<CONFIG.IOptions>) =>
21
+ (importer: FunctionImporter): CheckerProgrammer.IConfig => ({
22
+ functors: "$io",
23
+ unioners: "$iu",
24
+ trace: false,
25
+ path: false,
26
+ equals: !!options?.object,
27
+ numeric: OptionPredicator.numeric({
28
+ numeric: options?.numeric,
29
+ }),
30
+ atomist: () => (entry) => () =>
31
+ [
32
+ entry.expression,
33
+ ...entry.tags.map((tag) => tag.expression),
34
+ ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
35
+ combiner: () => (type: "and" | "or") => {
36
+ const initial: ts.TrueLiteral | ts.FalseLiteral =
37
+ type === "and"
38
+ ? ts.factory.createTrue()
39
+ : ts.factory.createFalse();
40
+ const binder =
41
+ type === "and"
42
+ ? ts.factory.createLogicalAnd
43
+ : ts.factory.createLogicalOr;
44
+ return (
45
+ _input: ts.Expression,
46
+ binaries: CheckerProgrammer.IBinary[],
47
+ ) =>
48
+ binaries.length
49
+ ? binaries
50
+ .map((binary) => binary.expression)
51
+ .reduce((x, y) => binder(x, y))
52
+ : initial;
53
+ },
54
+ joiner: {
55
+ object:
56
+ options?.object ||
57
+ check_object({
58
+ equals: !!options?.object,
59
+ undefined: OptionPredicator.undefined({
60
+ undefined: options?.undefined,
61
+ }),
62
+ assert: true,
63
+ reduce: ts.factory.createLogicalAnd,
64
+ positive: ts.factory.createTrue(),
65
+ superfluous: () => ts.factory.createFalse(),
66
+ })(importer),
67
+ array: (input, arrow) =>
68
+ ts.factory.createCallExpression(
69
+ IdentifierFactory.join(input, "every"),
70
+ undefined,
71
+ [arrow],
72
+ ),
73
+ failure: () => ts.factory.createFalse(),
74
+ },
75
+ success: ts.factory.createTrue(),
76
+ });
77
+
78
+ export namespace CONFIG {
79
+ export interface IOptions {
80
+ numeric: boolean;
81
+ undefined: boolean;
82
+ object: (
83
+ input: ts.Expression,
84
+ entries: IExpressionEntry<ts.Expression>[],
85
+ ) => ts.Expression;
86
+ }
87
+ }
88
+
89
+ /* -----------------------------------------------------------
90
+ GENERATORS
91
+ ----------------------------------------------------------- */
92
+ export function generate(
93
+ project: IProject,
94
+ modulo: ts.LeftHandSideExpression,
95
+ equals: boolean = false,
96
+ ) {
97
+ const importer: FunctionImporter = new FunctionImporter();
98
+
99
+ // CONFIGURATION
100
+ const config = CONFIG({
101
+ object: check_object({
102
+ equals,
103
+ undefined: OptionPredicator.undefined(project.options),
104
+ assert: true,
105
+ reduce: ts.factory.createLogicalAnd,
106
+ positive: ts.factory.createTrue(),
107
+ superfluous: () => ts.factory.createFalse(),
108
+ })(importer),
109
+ numeric: OptionPredicator.numeric(project.options),
110
+ })(importer);
111
+ config.trace = equals;
112
+
113
+ config.decoder = (input, target, explore, tags, jsDocTags) => {
114
+ if (
115
+ target.size() === 1 &&
116
+ target.objects.length === 1 &&
117
+ target.required === true &&
118
+ target.nullable === false
119
+ ) {
120
+ // ONLY WHEN OBJECT WITH SOME ATOMIC PROPERTIES
121
+ const obj: MetadataObject = target.objects[0]!;
122
+ if (
123
+ obj._Is_simple() &&
124
+ (equals === false ||
125
+ OptionPredicator.undefined(project.options) === false)
126
+ )
127
+ return ts.factory.createLogicalAnd(
128
+ ExpressionFactory.isObject(input, {
129
+ checkNull: true,
130
+ checkArray: false,
131
+ }),
132
+ config.joiner.object(
133
+ input,
134
+ feature_object_entries(config as any)(importer)(
135
+ obj,
136
+ )(input),
137
+ ),
138
+ );
139
+ }
140
+ return CheckerProgrammer.decode(project, config, importer)(
141
+ input,
142
+ target,
143
+ explore,
144
+ tags,
145
+ jsDocTags,
146
+ );
147
+ };
148
+
149
+ // GENERATE CHECKER
150
+ return CheckerProgrammer.generate(project, config, importer, () =>
151
+ importer.declare(modulo),
152
+ );
153
+ }
154
+
155
+ export const generate_functors = (
156
+ project: IProject,
157
+ importer: FunctionImporter,
158
+ ) =>
159
+ CheckerProgrammer.generate_functors(
160
+ project,
161
+ CONFIG()(importer),
162
+ importer,
163
+ );
164
+
165
+ export const generate_unioners = (
166
+ project: IProject,
167
+ importer: FunctionImporter,
168
+ ) =>
169
+ CheckerProgrammer.generate_unioners(
170
+ project,
171
+ CONFIG()(importer),
172
+ importer,
173
+ );
174
+
175
+ /* -----------------------------------------------------------
176
+ DECODERS
177
+ ----------------------------------------------------------- */
178
+ export const decode = (project: IProject, importer: FunctionImporter) =>
179
+ CheckerProgrammer.decode(project, CONFIG()(importer), importer);
180
+
181
+ export const decode_object = (importer: FunctionImporter) =>
182
+ CheckerProgrammer.decode_object(CONFIG()(importer))(importer);
183
+
184
+ export function decode_to_json(
185
+ input: ts.Expression,
186
+ checkNull: boolean,
187
+ ): ts.Expression {
188
+ return ts.factory.createLogicalAnd(
189
+ ExpressionFactory.isObject(input, {
190
+ checkArray: false,
191
+ checkNull,
192
+ }),
193
+ ts.factory.createStrictEquality(
194
+ ts.factory.createStringLiteral("function"),
195
+ ValueFactory.TYPEOF(IdentifierFactory.join(input, "toJSON")),
196
+ ),
197
+ );
198
+ }
199
+
200
+ export function decode_functional(input: ts.Expression) {
201
+ return ts.factory.createStrictEquality(
202
+ ts.factory.createStringLiteral("function"),
203
+ ValueFactory.TYPEOF(input),
204
+ );
205
+ }
206
+ }
@@ -1,75 +1,75 @@
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 { IsProgrammer } from "./IsProgrammer";
10
- import { PruneProgrammer } from "./PruneProgrammer";
11
-
12
- export namespace IsPruneProgrammer {
13
- export const generate =
14
- (project: IProject, modulo: ts.LeftHandSideExpression) =>
15
- (type: ts.Type, name?: string) =>
16
- ts.factory.createArrowFunction(
17
- undefined,
18
- undefined,
19
- [
20
- IdentifierFactory.parameter(
21
- "input",
22
- TypeFactory.keyword("any"),
23
- ),
24
- ],
25
- ts.factory.createTypePredicateNode(
26
- undefined,
27
- "input",
28
- ts.factory.createTypeReferenceNode(
29
- name ?? TypeFactory.getFullName(project.checker, type),
30
- ),
31
- ),
32
- undefined,
33
- ts.factory.createBlock([
34
- StatementFactory.constant(
35
- "is",
36
- IsProgrammer.generate(project, modulo)(type, name),
37
- ),
38
- StatementFactory.constant(
39
- "prune",
40
- PruneProgrammer.generate(
41
- {
42
- ...project,
43
- options: {
44
- ...project.options,
45
- functional: false,
46
- numeric: false,
47
- },
48
- },
49
- modulo,
50
- )(type, name),
51
- ),
52
- ts.factory.createIfStatement(
53
- ts.factory.createPrefixUnaryExpression(
54
- ts.SyntaxKind.ExclamationToken,
55
- ts.factory.createCallExpression(
56
- ts.factory.createIdentifier("is"),
57
- undefined,
58
- [ts.factory.createIdentifier("input")],
59
- ),
60
- ),
61
- ts.factory.createReturnStatement(
62
- ts.factory.createFalse(),
63
- ),
64
- ),
65
- ts.factory.createExpressionStatement(
66
- ts.factory.createCallExpression(
67
- ts.factory.createIdentifier("prune"),
68
- undefined,
69
- [ts.factory.createIdentifier("input")],
70
- ),
71
- ),
72
- ts.factory.createReturnStatement(ts.factory.createTrue()),
73
- ]),
74
- );
75
- }
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 { IsProgrammer } from "./IsProgrammer";
10
+ import { PruneProgrammer } from "./PruneProgrammer";
11
+
12
+ export namespace IsPruneProgrammer {
13
+ export const generate =
14
+ (project: IProject, modulo: ts.LeftHandSideExpression) =>
15
+ (type: ts.Type, name?: string) =>
16
+ ts.factory.createArrowFunction(
17
+ undefined,
18
+ undefined,
19
+ [
20
+ IdentifierFactory.parameter(
21
+ "input",
22
+ TypeFactory.keyword("any"),
23
+ ),
24
+ ],
25
+ ts.factory.createTypePredicateNode(
26
+ undefined,
27
+ "input",
28
+ ts.factory.createTypeReferenceNode(
29
+ name ?? TypeFactory.getFullName(project.checker, type),
30
+ ),
31
+ ),
32
+ undefined,
33
+ ts.factory.createBlock([
34
+ StatementFactory.constant(
35
+ "is",
36
+ IsProgrammer.generate(project, modulo)(type, name),
37
+ ),
38
+ StatementFactory.constant(
39
+ "prune",
40
+ PruneProgrammer.generate(
41
+ {
42
+ ...project,
43
+ options: {
44
+ ...project.options,
45
+ functional: false,
46
+ numeric: false,
47
+ },
48
+ },
49
+ modulo,
50
+ )(type, name),
51
+ ),
52
+ ts.factory.createIfStatement(
53
+ ts.factory.createPrefixUnaryExpression(
54
+ ts.SyntaxKind.ExclamationToken,
55
+ ts.factory.createCallExpression(
56
+ ts.factory.createIdentifier("is"),
57
+ undefined,
58
+ [ts.factory.createIdentifier("input")],
59
+ ),
60
+ ),
61
+ ts.factory.createReturnStatement(
62
+ ts.factory.createFalse(),
63
+ ),
64
+ ),
65
+ ts.factory.createExpressionStatement(
66
+ ts.factory.createCallExpression(
67
+ ts.factory.createIdentifier("prune"),
68
+ undefined,
69
+ [ts.factory.createIdentifier("input")],
70
+ ),
71
+ ),
72
+ ts.factory.createReturnStatement(ts.factory.createTrue()),
73
+ ]),
74
+ );
75
+ }