typia 3.5.0-dev.20230126 → 3.5.0-dev.20230212

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 (263) hide show
  1. package/README.md +70 -70
  2. package/lib/factories/MetadataCollection.d.ts +9 -1
  3. package/lib/factories/MetadataCollection.js +75 -2
  4. package/lib/factories/MetadataCollection.js.map +1 -1
  5. package/lib/factories/internal/metadata/iterate_metadata_native.js +0 -3
  6. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  7. package/lib/functional/$is_between.d.ts +1 -0
  8. package/lib/functional/$is_between.js +8 -0
  9. package/lib/functional/$is_between.js.map +1 -0
  10. package/lib/metadata/IMetadataTag.d.ts +3 -7
  11. package/lib/metadata/Metadata.js +2 -2
  12. package/lib/metadata/Metadata.js.map +1 -1
  13. package/lib/module.d.ts +210 -6
  14. package/lib/module.js +88 -9
  15. package/lib/module.js.map +1 -1
  16. package/lib/programmers/AssertProgrammer.js +3 -2
  17. package/lib/programmers/AssertProgrammer.js.map +1 -1
  18. package/lib/programmers/AssertPruneProgrammer.d.ts +5 -0
  19. package/lib/programmers/AssertPruneProgrammer.js +37 -0
  20. package/lib/programmers/AssertPruneProgrammer.js.map +1 -0
  21. package/lib/programmers/CheckerProgrammer.d.ts +2 -2
  22. package/lib/programmers/CheckerProgrammer.js +21 -16
  23. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  24. package/lib/programmers/FeatureProgrammer.d.ts +114 -18
  25. package/lib/programmers/FeatureProgrammer.js +4 -4
  26. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  27. package/lib/programmers/IsProgrammer.d.ts +4 -3
  28. package/lib/programmers/IsProgrammer.js +72 -61
  29. package/lib/programmers/IsProgrammer.js.map +1 -1
  30. package/lib/programmers/IsPruneProgrammer.d.ts +5 -0
  31. package/lib/programmers/IsPruneProgrammer.js +37 -0
  32. package/lib/programmers/IsPruneProgrammer.js.map +1 -0
  33. package/lib/programmers/PruneProgrammer.d.ts +5 -0
  34. package/lib/programmers/PruneProgrammer.js +279 -0
  35. package/lib/programmers/PruneProgrammer.js.map +1 -0
  36. package/lib/programmers/StringifyProgrammer.js +26 -21
  37. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  38. package/lib/programmers/ValidateProgrammer.js +3 -2
  39. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  40. package/lib/programmers/ValidatePruneProgrammer.d.ts +5 -0
  41. package/lib/programmers/ValidatePruneProgrammer.js +37 -0
  42. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -0
  43. package/lib/programmers/helpers/AtomicPredicator.d.ts +2 -0
  44. package/lib/programmers/helpers/AtomicPredicator.js +9 -1
  45. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  46. package/lib/programmers/helpers/IExpressionEntry.d.ts +2 -2
  47. package/lib/programmers/helpers/OptionPredicator.d.ts +1 -0
  48. package/lib/programmers/helpers/OptionPredicator.js +4 -0
  49. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  50. package/lib/programmers/helpers/PruneJoiner.d.ts +8 -0
  51. package/lib/programmers/helpers/PruneJoiner.js +60 -0
  52. package/lib/programmers/helpers/PruneJoiner.js.map +1 -0
  53. package/lib/programmers/helpers/StringifyJoinder.d.ts +1 -1
  54. package/lib/programmers/helpers/StringifyJoinder.js +2 -4
  55. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  56. package/lib/programmers/internal/application_object.js +11 -11
  57. package/lib/programmers/internal/application_object.js.map +1 -1
  58. package/lib/programmers/internal/application_schema.js +21 -12
  59. package/lib/programmers/internal/application_schema.js.map +1 -1
  60. package/lib/programmers/internal/check_dynamic_properties.js +34 -11
  61. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  62. package/lib/programmers/internal/check_native.js +9 -1
  63. package/lib/programmers/internal/check_native.js.map +1 -1
  64. package/lib/programmers/internal/check_object.d.ts +1 -0
  65. package/lib/programmers/internal/check_object.js +13 -9
  66. package/lib/programmers/internal/check_object.js.map +1 -1
  67. package/lib/programmers/internal/check_union_array_like.d.ts +1 -1
  68. package/lib/programmers/internal/check_union_array_like.js +3 -1
  69. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  70. package/lib/programmers/internal/feature_object_entries.d.ts +2 -2
  71. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  72. package/lib/programmers/internal/prune_object_properties.d.ts +1 -0
  73. package/lib/programmers/internal/prune_object_properties.js +28 -0
  74. package/lib/programmers/internal/prune_object_properties.js.map +1 -0
  75. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  76. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  77. package/lib/transformers/CallExpressionTransformer.js +17 -3
  78. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  79. package/lib/transformers/ITransformOptions.d.ts +14 -0
  80. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +3 -1
  81. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  82. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.d.ts +5 -0
  83. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js +23 -0
  84. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js.map +1 -0
  85. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.d.ts +5 -0
  86. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js +17 -0
  87. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js.map +1 -0
  88. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.d.ts +5 -0
  89. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js +17 -0
  90. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js.map +1 -0
  91. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.d.ts +5 -0
  92. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js +17 -0
  93. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js.map +1 -0
  94. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.d.ts +5 -0
  95. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js +17 -0
  96. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js.map +1 -0
  97. package/lib/transformers/features/miscellaneous/IsPruneTransformer.d.ts +5 -0
  98. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js +23 -0
  99. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js.map +1 -0
  100. package/lib/transformers/features/miscellaneous/PruneTransformer.d.ts +5 -0
  101. package/lib/transformers/features/miscellaneous/PruneTransformer.js +34 -0
  102. package/lib/transformers/features/miscellaneous/PruneTransformer.js.map +1 -0
  103. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.d.ts +5 -0
  104. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js +23 -0
  105. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js.map +1 -0
  106. package/package.json +5 -4
  107. package/src/factories/MetadataCollection.ts +41 -2
  108. package/src/factories/internal/metadata/iterate_metadata_native.ts +0 -5
  109. package/src/functional/$is_between.ts +7 -0
  110. package/src/metadata/IMetadataTag.ts +4 -19
  111. package/src/metadata/Metadata.ts +3 -6
  112. package/src/module.ts +366 -19
  113. package/src/programmers/AssertProgrammer.ts +3 -2
  114. package/src/programmers/AssertPruneProgrammer.ts +59 -0
  115. package/src/programmers/CheckerProgrammer.ts +21 -13
  116. package/src/programmers/FeatureProgrammer.ts +146 -21
  117. package/src/programmers/IsProgrammer.ts +107 -87
  118. package/src/programmers/IsPruneProgrammer.ts +63 -0
  119. package/src/programmers/PruneProgrammer.ts +323 -0
  120. package/src/programmers/StringifyProgrammer.ts +51 -34
  121. package/src/programmers/ValidateProgrammer.ts +3 -2
  122. package/src/programmers/ValidatePruneProgrammer.ts +73 -0
  123. package/src/programmers/helpers/AtomicPredicator.ts +17 -1
  124. package/src/programmers/helpers/IExpressionEntry.ts +4 -2
  125. package/src/programmers/helpers/OptionPredicator.ts +4 -0
  126. package/src/programmers/helpers/PruneJoiner.ts +52 -0
  127. package/src/programmers/helpers/StringifyJoinder.ts +7 -4
  128. package/src/programmers/internal/application_object.ts +5 -5
  129. package/src/programmers/internal/application_schema.ts +33 -27
  130. package/src/programmers/internal/check_dynamic_properties.ts +67 -16
  131. package/src/programmers/internal/check_native.ts +14 -2
  132. package/src/programmers/internal/check_object.ts +8 -2
  133. package/src/programmers/internal/check_union_array_like.ts +4 -2
  134. package/src/programmers/internal/feature_object_entries.ts +6 -1
  135. package/src/programmers/internal/prune_object_properties.ts +60 -0
  136. package/src/programmers/internal/stringify_dynamic_properties.ts +2 -2
  137. package/src/programmers/internal/stringify_regular_properties.ts +2 -2
  138. package/src/transformers/CallExpressionTransformer.ts +27 -16
  139. package/src/transformers/ITransformOptions.ts +15 -0
  140. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +3 -1
  141. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +38 -0
  142. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +32 -0
  143. package/src/transformers/features/{protocols/MessageTransformer.ts → miscellaneous/CreateIsPruneTransformer.ts} +6 -6
  144. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +31 -0
  145. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +32 -0
  146. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +38 -0
  147. package/src/transformers/features/miscellaneous/PruneTransformer.ts +46 -0
  148. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +38 -0
  149. package/lib/factories/ProtocolFactory.d.ts +0 -8
  150. package/lib/factories/ProtocolFactory.js +0 -112
  151. package/lib/factories/ProtocolFactory.js.map +0 -1
  152. package/lib/factories/internal/protocols/ProtocolMetadataUtil.d.ts +0 -16
  153. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js +0 -156
  154. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js.map +0 -1
  155. package/lib/factories/internal/protocols/emplace_protocol_object.d.ts +0 -3
  156. package/lib/factories/internal/protocols/emplace_protocol_object.js +0 -47
  157. package/lib/factories/internal/protocols/emplace_protocol_object.js.map +0 -1
  158. package/lib/factories/internal/protocols/emplace_protocol_property.d.ts +0 -4
  159. package/lib/factories/internal/protocols/emplace_protocol_property.js +0 -20
  160. package/lib/factories/internal/protocols/emplace_protocol_property.js.map +0 -1
  161. package/lib/factories/internal/protocols/iterate_protocol_atomic.d.ts +0 -3
  162. package/lib/factories/internal/protocols/iterate_protocol_atomic.js +0 -69
  163. package/lib/factories/internal/protocols/iterate_protocol_atomic.js.map +0 -1
  164. package/lib/factories/internal/protocols/iterate_protocol_constant.d.ts +0 -2
  165. package/lib/factories/internal/protocols/iterate_protocol_constant.js +0 -30
  166. package/lib/factories/internal/protocols/iterate_protocol_constant.js.map +0 -1
  167. package/lib/factories/internal/protocols/iterate_protocol_main.d.ts +0 -3
  168. package/lib/factories/internal/protocols/iterate_protocol_main.js +0 -17
  169. package/lib/factories/internal/protocols/iterate_protocol_main.js.map +0 -1
  170. package/lib/factories/internal/protocols/iterate_protocol_map.d.ts +0 -4
  171. package/lib/factories/internal/protocols/iterate_protocol_map.js +0 -75
  172. package/lib/factories/internal/protocols/iterate_protocol_map.js.map +0 -1
  173. package/lib/factories/internal/protocols/iterate_protocol_metadata.d.ts +0 -5
  174. package/lib/factories/internal/protocols/iterate_protocol_metadata.js +0 -190
  175. package/lib/factories/internal/protocols/iterate_protocol_metadata.js.map +0 -1
  176. package/lib/factories/internal/protocols/iterate_protocol_native.d.ts +0 -2
  177. package/lib/factories/internal/protocols/iterate_protocol_native.js +0 -33
  178. package/lib/factories/internal/protocols/iterate_protocol_native.js.map +0 -1
  179. package/lib/factories/internal/protocols/iterate_protocol_never.d.ts +0 -1
  180. package/lib/factories/internal/protocols/iterate_protocol_never.js +0 -6
  181. package/lib/factories/internal/protocols/iterate_protocol_never.js.map +0 -1
  182. package/lib/factories/internal/protocols/iterate_protocol_object.d.ts +0 -4
  183. package/lib/factories/internal/protocols/iterate_protocol_object.js +0 -157
  184. package/lib/factories/internal/protocols/iterate_protocol_object.js.map +0 -1
  185. package/lib/factories/internal/protocols/iterate_protocol_repeated.d.ts +0 -5
  186. package/lib/factories/internal/protocols/iterate_protocol_repeated.js +0 -25
  187. package/lib/factories/internal/protocols/iterate_protocol_repeated.js.map +0 -1
  188. package/lib/factories/internal/protocols/iterate_protocol_tuple.d.ts +0 -3
  189. package/lib/factories/internal/protocols/iterate_protocol_tuple.js +0 -46
  190. package/lib/factories/internal/protocols/iterate_protocol_tuple.js.map +0 -1
  191. package/lib/functional/$proto_bytes.d.ts +0 -2
  192. package/lib/functional/$proto_bytes.js +0 -37
  193. package/lib/functional/$proto_bytes.js.map +0 -1
  194. package/lib/functional/$proto_field.d.ts +0 -10
  195. package/lib/functional/$proto_field.js +0 -42
  196. package/lib/functional/$proto_field.js.map +0 -1
  197. package/lib/functional/$proto_float.d.ts +0 -4
  198. package/lib/functional/$proto_float.js +0 -28
  199. package/lib/functional/$proto_float.js.map +0 -1
  200. package/lib/functional/$proto_i32.d.ts +0 -2
  201. package/lib/functional/$proto_i32.js +0 -23
  202. package/lib/functional/$proto_i32.js.map +0 -1
  203. package/lib/functional/$proto_i64.d.ts +0 -2
  204. package/lib/functional/$proto_i64.js +0 -31
  205. package/lib/functional/$proto_i64.js.map +0 -1
  206. package/lib/functional/$proto_size.d.ts +0 -6
  207. package/lib/functional/$proto_size.js +0 -76
  208. package/lib/functional/$proto_size.js.map +0 -1
  209. package/lib/functional/$proto_string.d.ts +0 -2
  210. package/lib/functional/$proto_string.js +0 -34
  211. package/lib/functional/$proto_string.js.map +0 -1
  212. package/lib/functional/$varint.d.ts +0 -6
  213. package/lib/functional/$varint.js +0 -99
  214. package/lib/functional/$varint.js.map +0 -1
  215. package/lib/functional/$zigzag.d.ts +0 -4
  216. package/lib/functional/$zigzag.js +0 -34
  217. package/lib/functional/$zigzag.js.map +0 -1
  218. package/lib/messages/IProtocolMap.d.ts +0 -5
  219. package/lib/messages/IProtocolMap.js +0 -3
  220. package/lib/messages/IProtocolMap.js.map +0 -1
  221. package/lib/messages/IProtocolMessage.d.ts +0 -5
  222. package/lib/messages/IProtocolMessage.js +0 -3
  223. package/lib/messages/IProtocolMessage.js.map +0 -1
  224. package/lib/messages/IProtocolProperty.d.ts +0 -12
  225. package/lib/messages/IProtocolProperty.js +0 -3
  226. package/lib/messages/IProtocolProperty.js.map +0 -1
  227. package/lib/programmers/MessageProgrammer.d.ts +0 -5
  228. package/lib/programmers/MessageProgrammer.js +0 -141
  229. package/lib/programmers/MessageProgrammer.js.map +0 -1
  230. package/lib/transformers/features/protocols/MessageTransformer.d.ts +0 -5
  231. package/lib/transformers/features/protocols/MessageTransformer.js +0 -17
  232. package/lib/transformers/features/protocols/MessageTransformer.js.map +0 -1
  233. package/lib/utils/NameEncoder.d.ts +0 -4
  234. package/lib/utils/NameEncoder.js +0 -89
  235. package/lib/utils/NameEncoder.js.map +0 -1
  236. package/src/factories/ProtocolFactory.ts +0 -79
  237. package/src/factories/internal/protocols/ProtocolMetadataUtil.ts +0 -163
  238. package/src/factories/internal/protocols/emplace_protocol_object.ts +0 -25
  239. package/src/factories/internal/protocols/emplace_protocol_property.ts +0 -12
  240. package/src/factories/internal/protocols/iterate_protocol_atomic.ts +0 -34
  241. package/src/factories/internal/protocols/iterate_protocol_constant.ts +0 -27
  242. package/src/factories/internal/protocols/iterate_protocol_main.ts +0 -19
  243. package/src/factories/internal/protocols/iterate_protocol_map.ts +0 -58
  244. package/src/factories/internal/protocols/iterate_protocol_metadata.ts +0 -96
  245. package/src/factories/internal/protocols/iterate_protocol_native.ts +0 -34
  246. package/src/factories/internal/protocols/iterate_protocol_never.ts +0 -1
  247. package/src/factories/internal/protocols/iterate_protocol_object.ts +0 -110
  248. package/src/factories/internal/protocols/iterate_protocol_repeated.ts +0 -34
  249. package/src/factories/internal/protocols/iterate_protocol_tuple.ts +0 -29
  250. package/src/functional/$proto_bytes.ts +0 -25
  251. package/src/functional/$proto_field.ts +0 -30
  252. package/src/functional/$proto_float.ts +0 -37
  253. package/src/functional/$proto_i32.ts +0 -29
  254. package/src/functional/$proto_i64.ts +0 -37
  255. package/src/functional/$proto_size.ts +0 -82
  256. package/src/functional/$proto_string.ts +0 -24
  257. package/src/functional/$varint.ts +0 -130
  258. package/src/functional/$zigzag.ts +0 -39
  259. package/src/messages/IProtocolMap.ts +0 -5
  260. package/src/messages/IProtocolMessage.ts +0 -6
  261. package/src/messages/IProtocolProperty.ts +0 -13
  262. package/src/programmers/MessageProgrammer.ts +0 -126
  263. package/src/utils/NameEncoder.ts +0 -32
@@ -0,0 +1,323 @@
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../factories/MetadataFactory";
7
+
8
+ import { Metadata } from "../metadata/Metadata";
9
+
10
+ import { IProject } from "../transformers/IProject";
11
+
12
+ import { FeatureProgrammer } from "./FeatureProgrammer";
13
+ import { IsProgrammer } from "./IsProgrammer";
14
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
15
+ import { PruneJoiner } from "./helpers/PruneJoiner";
16
+ import { UnionExplorer } from "./helpers/UnionExplorer";
17
+ import { decode_union_object } from "./internal/decode_union_object";
18
+
19
+ export namespace PruneProgrammer {
20
+ export function generate(
21
+ project: IProject,
22
+ modulo: ts.LeftHandSideExpression,
23
+ ) {
24
+ const importer: FunctionImporter = new FunctionImporter();
25
+ return FeatureProgrammer.generate(
26
+ project,
27
+ CONFIG(project, importer),
28
+ importer,
29
+ (collection) => {
30
+ const isFunctors = IsProgrammer.generate_functors(
31
+ project,
32
+ importer,
33
+ )(collection);
34
+ const isUnioners = IsProgrammer.generate_unioners(
35
+ project,
36
+ importer,
37
+ )(collection);
38
+
39
+ return [
40
+ ...importer.declare(modulo),
41
+ ...isFunctors,
42
+ ...isUnioners,
43
+ ];
44
+ },
45
+ );
46
+ }
47
+
48
+ /* -----------------------------------------------------------
49
+ DECODERS
50
+ ----------------------------------------------------------- */
51
+ const decode =
52
+ (project: IProject, importer: FunctionImporter) =>
53
+ (
54
+ input: ts.Expression,
55
+ meta: Metadata,
56
+ explore: FeatureProgrammer.IExplore,
57
+ ): ts.ConciseBody => {
58
+ if (filter(meta) === false) return ts.factory.createBlock([]);
59
+
60
+ interface IUnion {
61
+ type: string;
62
+ is: () => ts.Expression;
63
+ value: () => ts.Expression | ts.Block | ts.ReturnStatement;
64
+ }
65
+ const unions: IUnion[] = [];
66
+
67
+ //----
68
+ // LIST UP UNION TYPES
69
+ //----
70
+ // TUPLES
71
+ for (const tuple of meta.tuples.filter((t) =>
72
+ t.some((e) => filter(e.rest ?? e)),
73
+ ))
74
+ unions.push({
75
+ type: "tuple",
76
+ is: () =>
77
+ IsProgrammer.decode(project, importer)(
78
+ input,
79
+ (() => {
80
+ const partial = Metadata.initialize();
81
+ partial.tuples.push(tuple);
82
+ return partial;
83
+ })(),
84
+ explore,
85
+ [],
86
+ ),
87
+ value: () =>
88
+ decode_tuple(project, importer)(input, tuple, explore),
89
+ });
90
+
91
+ // ARRAYS
92
+ if (meta.arrays.filter(filter).length)
93
+ unions.push({
94
+ type: "array",
95
+ is: () => ExpressionFactory.isArray(input),
96
+ value: () =>
97
+ explore_arrays(project, importer)(
98
+ input,
99
+ meta.arrays,
100
+ {
101
+ ...explore,
102
+ from: "array",
103
+ },
104
+ [],
105
+ ),
106
+ });
107
+
108
+ // BUILT-IN CLASSES
109
+ if (meta.natives.length)
110
+ for (const native of meta.natives)
111
+ unions.push({
112
+ type: "native",
113
+ is: () => ExpressionFactory.isInstanceOf(input, native),
114
+ value: () => ts.factory.createReturnStatement(),
115
+ });
116
+ if (meta.sets.length)
117
+ unions.push({
118
+ type: "set",
119
+ is: () => ExpressionFactory.isInstanceOf(input, "Set"),
120
+ value: () => ts.factory.createReturnStatement(),
121
+ });
122
+ if (meta.maps.length)
123
+ unions.push({
124
+ type: "map",
125
+ is: () => ExpressionFactory.isInstanceOf(input, "Map"),
126
+ value: () => ts.factory.createReturnStatement(),
127
+ });
128
+
129
+ // OBJECTS
130
+ if (meta.objects.length)
131
+ unions.push({
132
+ type: "object",
133
+ is: () =>
134
+ ExpressionFactory.isObject(input, {
135
+ checkNull: true,
136
+ checkArray: false,
137
+ }),
138
+ value: () =>
139
+ explore_objects(input, meta, {
140
+ ...explore,
141
+ from: "object",
142
+ }),
143
+ });
144
+
145
+ //----
146
+ // STATEMENTS
147
+ //----
148
+ const converter = (
149
+ v: ts.Expression | ts.Block | ts.ReturnStatement,
150
+ ) =>
151
+ ts.isReturnStatement(v) || ts.isBlock(v)
152
+ ? v
153
+ : ts.factory.createExpressionStatement(v);
154
+
155
+ const statements: ts.Statement[] = unions.map((u) =>
156
+ ts.factory.createIfStatement(u.is(), converter(u.value())),
157
+ );
158
+ return ts.factory.createBlock(statements, true);
159
+ };
160
+
161
+ const decode_tuple =
162
+ (project: IProject, importer: FunctionImporter) =>
163
+ (
164
+ input: ts.Expression,
165
+ tuple: Metadata[],
166
+ explore: FeatureProgrammer.IExplore,
167
+ ): ts.Block => {
168
+ const children: ts.ConciseBody[] = tuple
169
+ .map((elem, index) => [elem, index] as const)
170
+ .filter(([elem]) => filter(elem) && elem.rest === null)
171
+ .map(([elem, index]) =>
172
+ decode(project, importer)(
173
+ ts.factory.createElementAccessExpression(input, index),
174
+ elem,
175
+ {
176
+ ...explore,
177
+ from: "array",
178
+ },
179
+ ),
180
+ );
181
+ const rest = (() => {
182
+ if (tuple.length === 0) return null;
183
+
184
+ const last: Metadata = tuple[tuple.length - 1]!;
185
+ const rest: Metadata | null = last.rest;
186
+ if (rest === null || filter(rest) === false) return null;
187
+
188
+ return decode(project, importer)(
189
+ ts.factory.createCallExpression(
190
+ IdentifierFactory.join(input, "slice"),
191
+ undefined,
192
+ [ts.factory.createNumericLiteral(tuple.length - 1)],
193
+ ),
194
+ (() => {
195
+ const wrapper: Metadata = Metadata.initialize();
196
+ wrapper.arrays.push(rest);
197
+ return wrapper;
198
+ })(),
199
+ {
200
+ ...explore,
201
+ start: tuple.length - 1,
202
+ },
203
+ );
204
+ })();
205
+ return PruneJoiner.tuple(children, rest);
206
+ };
207
+
208
+ const decode_array = (project: IProject, importer: FunctionImporter) =>
209
+ FeatureProgrammer.decode_array(
210
+ CONFIG(project, importer),
211
+ importer,
212
+ PruneJoiner.array,
213
+ );
214
+
215
+ const decode_object = () =>
216
+ FeatureProgrammer.decode_object({
217
+ trace: false,
218
+ path: false,
219
+ functors: FUNCTORS,
220
+ });
221
+
222
+ const explore_arrays = (project: IProject, importer: FunctionImporter) =>
223
+ UnionExplorer.array({
224
+ checker: IsProgrammer.decode(project, importer),
225
+ decoder: decode_array(project, importer),
226
+ empty: ts.factory.createReturnStatement(),
227
+ success: ts.factory.createTrue(),
228
+ failure: (input, expected) =>
229
+ create_throw_error(importer, input, expected),
230
+ });
231
+
232
+ const explore_objects = (
233
+ input: ts.Expression,
234
+ meta: Metadata,
235
+ explore: FeatureProgrammer.IExplore,
236
+ ) => {
237
+ if (meta.objects.length === 1)
238
+ return decode_object()(input, meta.objects[0]!, explore);
239
+
240
+ return ts.factory.createCallExpression(
241
+ ts.factory.createIdentifier(`${UNIONERS}${meta.union_index!}`),
242
+ undefined,
243
+ [input],
244
+ );
245
+ };
246
+
247
+ const filter = (meta: Metadata): boolean =>
248
+ meta.any === false &&
249
+ (meta.objects.length !== 0 ||
250
+ meta.tuples.some((t) => t.some((e) => filter(e.rest ?? e))) ||
251
+ meta.arrays.some((e) => filter(e)));
252
+
253
+ /* -----------------------------------------------------------
254
+ CONFIGURATIONS
255
+ ----------------------------------------------------------- */
256
+ const FUNCTORS = "$po";
257
+ const UNIONERS = "$pu";
258
+
259
+ const CONFIG = (
260
+ project: IProject,
261
+ importer: FunctionImporter,
262
+ ): FeatureProgrammer.IConfig => ({
263
+ functors: FUNCTORS,
264
+ unioners: UNIONERS,
265
+ trace: false,
266
+ path: false,
267
+ initializer,
268
+ decoder: decode(project, importer),
269
+ objector: OBJECTOR(project, importer),
270
+ });
271
+
272
+ const OBJECTOR = (
273
+ project: IProject,
274
+ importer: FunctionImporter,
275
+ ): FeatureProgrammer.IConfig.IObjector => ({
276
+ checker: IsProgrammer.decode(project, importer),
277
+ decoder: decode_object(),
278
+ joiner: PruneJoiner.object,
279
+ unionizer: decode_union_object(IsProgrammer.decode_object(importer))(
280
+ decode_object(),
281
+ )((exp) => exp)((value, expected) =>
282
+ create_throw_error(importer, value, expected),
283
+ ),
284
+ failure: (input, expected) =>
285
+ create_throw_error(importer, input, expected),
286
+ });
287
+
288
+ const initializer: FeatureProgrammer.IConfig["initializer"] = (
289
+ { checker },
290
+ type,
291
+ ) => {
292
+ const collection = new MetadataCollection();
293
+ const meta = MetadataFactory.generate(checker, collection, type, {
294
+ resolve: false,
295
+ constant: true,
296
+ });
297
+ return [collection, meta];
298
+ };
299
+
300
+ const create_throw_error = (
301
+ importer: FunctionImporter,
302
+ value: ts.Expression,
303
+ expected: string,
304
+ ) =>
305
+ ts.factory.createExpressionStatement(
306
+ ts.factory.createCallExpression(
307
+ importer.use("throws"),
308
+ [],
309
+ [
310
+ ts.factory.createObjectLiteralExpression(
311
+ [
312
+ ts.factory.createPropertyAssignment(
313
+ "expected",
314
+ ts.factory.createStringLiteral(expected),
315
+ ),
316
+ ts.factory.createPropertyAssignment("value", value),
317
+ ],
318
+ true,
319
+ ),
320
+ ],
321
+ ),
322
+ );
323
+ }
@@ -12,6 +12,8 @@ import { MetadataObject } from "../metadata/MetadataObject";
12
12
 
13
13
  import { IProject } from "../transformers/IProject";
14
14
 
15
+ import { Atomic } from "../typings/Atomic";
16
+
15
17
  import { ArrayUtil } from "../utils/ArrayUtil";
16
18
 
17
19
  import { FeatureProgrammer } from "./FeatureProgrammer";
@@ -23,6 +25,7 @@ import { OptionPredicator } from "./helpers/OptionPredicator";
23
25
  import { StringifyJoiner } from "./helpers/StringifyJoinder";
24
26
  import { StringifyPredicator } from "./helpers/StringifyPredicator";
25
27
  import { UnionExplorer } from "./helpers/UnionExplorer";
28
+ import { check_native } from "./internal/check_native";
26
29
  import { decode_union_object } from "./internal/decode_union_object";
27
30
  import { feature_object_entries } from "./internal/feature_object_entries";
28
31
 
@@ -177,10 +180,9 @@ export namespace StringifyProgrammer {
177
180
 
178
181
  // CONSTANTS
179
182
  for (const constant of meta.constants)
180
- if (
181
- constant.type !== "string" &&
182
- AtomicPredicator.constant(meta)(constant.type)
183
- )
183
+ if (AtomicPredicator.constant(meta)(constant.type) === false)
184
+ continue;
185
+ else if (constant.type !== "string")
184
186
  unions.push({
185
187
  type: "atomic",
186
188
  is: () =>
@@ -223,28 +225,31 @@ export namespace StringifyProgrammer {
223
225
  explore,
224
226
  ),
225
227
  });
228
+
229
+ /// ATOMICS
226
230
  for (const type of meta.atomics)
227
- unions.push({
228
- type: "atomic",
229
- is: () =>
230
- IsProgrammer.decode(project, importer)(
231
- input,
232
- (() => {
233
- const partial = Metadata.initialize();
234
- partial.atomics.push(type);
235
- return partial;
236
- })(),
237
- explore,
238
- [],
239
- ),
240
- value: () =>
241
- decode_atomic(project, importer)(
242
- input,
243
- type,
244
- explore,
245
- tags,
246
- ),
247
- });
231
+ if (AtomicPredicator.atomic(meta)(type))
232
+ unions.push({
233
+ type: "atomic",
234
+ is: () =>
235
+ IsProgrammer.decode(project, importer)(
236
+ input,
237
+ (() => {
238
+ const partial = Metadata.initialize();
239
+ partial.atomics.push(type);
240
+ return partial;
241
+ })(),
242
+ explore,
243
+ [],
244
+ ),
245
+ value: () =>
246
+ decode_atomic(project, importer)(
247
+ input,
248
+ type,
249
+ explore,
250
+ tags,
251
+ ),
252
+ });
248
253
 
249
254
  // TUPLES
250
255
  for (const tuple of meta.tuples) {
@@ -315,8 +320,16 @@ export namespace StringifyProgrammer {
315
320
  for (const native of meta.natives)
316
321
  unions.push({
317
322
  type: "object",
318
- is: () => ExpressionFactory.isInstanceOf(input, native),
319
- value: () => ts.factory.createStringLiteral("{}"),
323
+ is: () => check_native(native)(input),
324
+ value: () =>
325
+ AtomicPredicator.native(native)
326
+ ? decode_atomic(project, importer)(
327
+ input,
328
+ native.toLowerCase() as Atomic.Literal,
329
+ explore,
330
+ tags,
331
+ )
332
+ : ts.factory.createStringLiteral("{}"),
320
333
  });
321
334
 
322
335
  // SETS
@@ -356,13 +369,16 @@ export namespace StringifyProgrammer {
356
369
  meta.objects[0]!._Is_simple()
357
370
  ? (() => {
358
371
  const obj: MetadataObject = meta.objects[0]!;
359
- const entries: IExpressionEntry[] =
360
- feature_object_entries({
372
+ const entries: IExpressionEntry<ts.Expression>[] =
373
+ feature_object_entries<ts.Expression>({
361
374
  decoder: decode(project, importer),
362
375
  trace: false,
363
376
  path: false,
364
- })(obj)(input);
377
+ })(obj)(
378
+ input,
379
+ );
365
380
  return StringifyJoiner.object(importer)(
381
+ input,
366
382
  entries,
367
383
  );
368
384
  })()
@@ -691,7 +707,10 @@ export namespace StringifyProgrammer {
691
707
  objector: OBJECTOR(project, importer),
692
708
  });
693
709
 
694
- const initializer: FeatureProgrammer.Initializer = ({ checker }, type) => {
710
+ const initializer: FeatureProgrammer.IConfig["initializer"] = (
711
+ { checker },
712
+ type,
713
+ ) => {
695
714
  const collection: MetadataCollection = new MetadataCollection();
696
715
  const meta: Metadata = MetadataFactory.generate(
697
716
  checker,
@@ -716,15 +735,13 @@ export namespace StringifyProgrammer {
716
735
  checker: IsProgrammer.decode(project, importer),
717
736
  decoder: decode_object(),
718
737
  joiner: StringifyJoiner.object(importer),
719
- unionizer: decode_union_object(IsProgrammer.decode_object())(
738
+ unionizer: decode_union_object(IsProgrammer.decode_object(importer))(
720
739
  decode_object(),
721
740
  )((exp) => exp)((value, expected) =>
722
741
  create_throw_error(importer, value, expected),
723
742
  ),
724
743
  failure: (input, expected) =>
725
744
  create_throw_error(importer, input, expected),
726
- is: (expr) => expr,
727
- required: (expr) => expr,
728
745
  });
729
746
 
730
747
  function create_throw_error(
@@ -92,7 +92,7 @@ const combine =
92
92
  return IsProgrammer.CONFIG({
93
93
  object: validate_object(equals)(importer),
94
94
  numeric: true,
95
- }).combiner(explore);
95
+ })(importer).combiner(explore);
96
96
 
97
97
  const path: string = explore.postfix
98
98
  ? `path + ${explore.postfix}`
@@ -134,6 +134,7 @@ const combine =
134
134
  const validate_object = (equals: boolean) => (importer: FunctionImporter) =>
135
135
  check_object({
136
136
  equals,
137
+ undefined: true,
137
138
  assert: false,
138
139
  reduce: ts.factory.createLogicalAnd,
139
140
  positive: ts.factory.createTrue(),
@@ -158,7 +159,7 @@ const validate_object = (equals: boolean) => (importer: FunctionImporter) =>
158
159
  ),
159
160
  expr,
160
161
  ),
161
- });
162
+ })(importer);
162
163
 
163
164
  const joiner =
164
165
  (equals: boolean) =>
@@ -0,0 +1,73 @@
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 { PruneProgrammer } from "./PruneProgrammer";
9
+ import { ValidateProgrammer } from "./ValidateProgrammer";
10
+
11
+ export namespace ValidatePruneProgrammer {
12
+ export const generate =
13
+ (project: IProject, modulo: ts.LeftHandSideExpression) =>
14
+ (type: ts.Type) =>
15
+ ts.factory.createArrowFunction(
16
+ undefined,
17
+ undefined,
18
+ [IdentifierFactory.parameter("input")],
19
+ undefined,
20
+ undefined,
21
+ ts.factory.createBlock([
22
+ StatementFactory.constant(
23
+ "validate",
24
+ ValidateProgrammer.generate(
25
+ {
26
+ ...project,
27
+ options: {
28
+ ...project.options,
29
+ functional: false,
30
+ numeric: true,
31
+ },
32
+ },
33
+ modulo,
34
+ )(type),
35
+ ),
36
+ StatementFactory.constant(
37
+ "prune",
38
+ PruneProgrammer.generate(
39
+ {
40
+ ...project,
41
+ options: {
42
+ ...project.options,
43
+ functional: false,
44
+ numeric: false,
45
+ },
46
+ },
47
+ modulo,
48
+ )(type),
49
+ ),
50
+ StatementFactory.constant(
51
+ "output",
52
+ ts.factory.createCallExpression(
53
+ ts.factory.createIdentifier("validate"),
54
+ undefined,
55
+ [ts.factory.createIdentifier("input")],
56
+ ),
57
+ ),
58
+ ts.factory.createIfStatement(
59
+ ts.factory.createIdentifier("output.success"),
60
+ ts.factory.createExpressionStatement(
61
+ ts.factory.createCallExpression(
62
+ ts.factory.createIdentifier("prune"),
63
+ undefined,
64
+ [ts.factory.createIdentifier("input")],
65
+ ),
66
+ ),
67
+ ),
68
+ ts.factory.createReturnStatement(
69
+ ts.factory.createIdentifier("output"),
70
+ ),
71
+ ]),
72
+ );
73
+ }
@@ -8,8 +8,24 @@ export namespace AtomicPredicator {
8
8
  export const constant =
9
9
  (meta: Metadata) =>
10
10
  (name: Atomic.Literal): boolean =>
11
- !ArrayUtil.has(meta.atomics, (atomic) => atomic === name);
11
+ !ArrayUtil.has(meta.atomics, (atomic) => atomic === name) &&
12
+ !ArrayUtil.has(
13
+ meta.natives,
14
+ (native) => native.toLowerCase() === name,
15
+ );
16
+
17
+ export const atomic =
18
+ (meta: Metadata) =>
19
+ (name: Atomic.Literal): boolean =>
20
+ !ArrayUtil.has(
21
+ meta.natives,
22
+ (native) => native.toLowerCase() === name,
23
+ );
24
+
25
+ export const native = (name: string) => LIKE.has(name.toLowerCase());
12
26
 
13
27
  export const template = (meta: Metadata): boolean =>
14
28
  !ArrayUtil.has(meta.atomics, (type) => type === "string");
15
29
  }
30
+
31
+ const LIKE = new Set(["boolean", "number", "string"]);
@@ -2,9 +2,11 @@ import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../../metadata/Metadata";
4
4
 
5
- export interface IExpressionEntry {
5
+ export interface IExpressionEntry<
6
+ Expression extends ts.ConciseBody = ts.ConciseBody,
7
+ > {
6
8
  input: ts.Expression;
7
9
  key: Metadata;
8
10
  meta: Metadata;
9
- expression: ts.Expression;
11
+ expression: Expression;
10
12
  }
@@ -12,4 +12,8 @@ export namespace OptionPredicator {
12
12
  export function finite(options: ITransformOptions): boolean {
13
13
  return options.finite === true;
14
14
  }
15
+
16
+ export function undefined(options: ITransformOptions): boolean {
17
+ return options.undefined !== false;
18
+ }
15
19
  }
@@ -0,0 +1,52 @@
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
4
+
5
+ import { MetadataObject } from "../../metadata/MetadataObject";
6
+
7
+ import { ArrayUtil } from "../../utils/ArrayUtil";
8
+
9
+ import { prune_object_properties } from "../internal/prune_object_properties";
10
+ import { IExpressionEntry } from "./IExpressionEntry";
11
+
12
+ export namespace PruneJoiner {
13
+ export const object = (
14
+ _input: ts.Expression,
15
+ entries: IExpressionEntry[],
16
+ obj: MetadataObject,
17
+ ): ts.ConciseBody => {
18
+ const statements: ts.Statement[] = ArrayUtil.flat(
19
+ entries.map((entry) =>
20
+ ts.isBlock(entry.expression)
21
+ ? [...entry.expression.statements]
22
+ : [ts.factory.createExpressionStatement(entry.expression)],
23
+ ),
24
+ );
25
+ statements.push(prune_object_properties(obj));
26
+ return ts.factory.createBlock(statements, true);
27
+ };
28
+
29
+ export const array = (input: ts.Expression, arrow: ts.ArrowFunction) =>
30
+ ts.factory.createCallExpression(
31
+ IdentifierFactory.join(input, "forEach"),
32
+ undefined,
33
+ [arrow],
34
+ );
35
+
36
+ export const tuple = (
37
+ children: ts.ConciseBody[],
38
+ rest: ts.ConciseBody | null,
39
+ ): ts.Block => {
40
+ const entire: ts.ConciseBody[] = [...children];
41
+ if (rest !== null) entire.push(rest);
42
+
43
+ const statements: ts.Statement[] = ArrayUtil.flat(
44
+ entire.map((elem) =>
45
+ ts.isBlock(elem)
46
+ ? [...elem.statements]
47
+ : [ts.factory.createExpressionStatement(elem)],
48
+ ),
49
+ );
50
+ return ts.factory.createBlock(statements, true);
51
+ };
52
+ }