typia 3.8.8 → 3.9.0-dev.20230603

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 (233) hide show
  1. package/lib/IRandomGenerator.d.ts +1 -0
  2. package/lib/factories/CommentFactory.js +2 -1
  3. package/lib/factories/CommentFactory.js.map +1 -1
  4. package/lib/factories/IdentifierFactory.js +2 -1
  5. package/lib/factories/IdentifierFactory.js.map +1 -1
  6. package/lib/factories/MetadataCollection.d.ts +22 -4
  7. package/lib/factories/MetadataCollection.js +121 -28
  8. package/lib/factories/MetadataCollection.js.map +1 -1
  9. package/lib/factories/MetadataFactory.d.ts +1 -0
  10. package/lib/factories/MetadataFactory.js +6 -48
  11. package/lib/factories/MetadataFactory.js.map +1 -1
  12. package/lib/factories/MetadataTagFactory.js +5 -3
  13. package/lib/factories/MetadataTagFactory.js.map +1 -1
  14. package/lib/factories/internal/metadata/emplace_metadata_array.d.ts +5 -0
  15. package/lib/factories/internal/metadata/emplace_metadata_array.js +38 -0
  16. package/lib/factories/internal/metadata/emplace_metadata_array.js.map +1 -0
  17. package/lib/factories/internal/metadata/emplace_metadata_definition.d.ts +5 -0
  18. package/lib/factories/internal/metadata/emplace_metadata_definition.js +38 -0
  19. package/lib/factories/internal/metadata/emplace_metadata_definition.js.map +1 -0
  20. package/lib/factories/internal/metadata/emplace_metadata_object.js +4 -4
  21. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  22. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +5 -0
  23. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +58 -0
  24. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -0
  25. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  26. package/lib/factories/internal/metadata/explore_metadata.js +11 -34
  27. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  28. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  29. package/lib/factories/internal/metadata/iterate_metadata.js +5 -2
  30. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  31. package/lib/factories/internal/metadata/iterate_metadata_array.js +4 -5
  32. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  33. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -0
  34. package/lib/factories/internal/metadata/iterate_metadata_collection.js +151 -0
  35. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -0
  36. package/lib/factories/internal/metadata/iterate_metadata_definition.d.ts +5 -0
  37. package/lib/factories/internal/metadata/iterate_metadata_definition.js +24 -0
  38. package/lib/factories/internal/metadata/iterate_metadata_definition.js.map +1 -0
  39. package/lib/factories/internal/metadata/iterate_metadata_object.js +1 -1
  40. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  41. package/lib/factories/internal/metadata/iterate_metadata_sort.d.ts +3 -0
  42. package/lib/factories/internal/metadata/iterate_metadata_sort.js +156 -0
  43. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -0
  44. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +3 -26
  45. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  46. package/lib/factories/internal/metadata/iterate_metadata_union.js +3 -3
  47. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  48. package/lib/metadata/IMetadata.d.ts +3 -2
  49. package/lib/metadata/IMetadataApplication.d.ts +2 -2
  50. package/lib/metadata/IMetadataArray.d.ts +8 -0
  51. package/lib/metadata/IMetadataArray.js +3 -0
  52. package/lib/metadata/IMetadataArray.js.map +1 -0
  53. package/lib/metadata/IMetadataCollection.d.ts +10 -0
  54. package/lib/metadata/IMetadataCollection.js +3 -0
  55. package/lib/metadata/IMetadataCollection.js.map +1 -0
  56. package/lib/metadata/IMetadataDefinition.d.ts +10 -0
  57. package/lib/metadata/IMetadataDefinition.js +3 -0
  58. package/lib/metadata/IMetadataDefinition.js.map +1 -0
  59. package/lib/metadata/IMetadataDictionary.js +3 -0
  60. package/lib/metadata/IMetadataDictionary.js.map +1 -0
  61. package/lib/metadata/IMetadataObject.d.ts +3 -0
  62. package/lib/metadata/IMetadataProperty.d.ts +1 -1
  63. package/lib/metadata/IMetadataTuple.d.ts +8 -0
  64. package/lib/metadata/IMetadataTuple.js +3 -0
  65. package/lib/metadata/IMetadataTuple.js.map +1 -0
  66. package/lib/metadata/Metadata.d.ts +24 -21
  67. package/lib/metadata/Metadata.js +323 -262
  68. package/lib/metadata/Metadata.js.map +1 -1
  69. package/lib/metadata/MetadataArray.d.ts +12 -0
  70. package/lib/metadata/MetadataArray.js +36 -0
  71. package/lib/metadata/MetadataArray.js.map +1 -0
  72. package/lib/metadata/MetadataDefinition.d.ts +16 -0
  73. package/lib/metadata/MetadataDefinition.js +39 -0
  74. package/lib/metadata/MetadataDefinition.js.map +1 -0
  75. package/lib/metadata/MetadataObject.d.ts +4 -0
  76. package/lib/metadata/MetadataObject.js +3 -5
  77. package/lib/metadata/MetadataObject.js.map +1 -1
  78. package/lib/metadata/MetadataProperty.d.ts +1 -1
  79. package/lib/metadata/MetadataProperty.js +3 -3
  80. package/lib/metadata/MetadataProperty.js.map +1 -1
  81. package/lib/metadata/MetadataTuple.d.ts +12 -0
  82. package/lib/metadata/MetadataTuple.js +36 -0
  83. package/lib/metadata/MetadataTuple.js.map +1 -0
  84. package/lib/programmers/ApplicationProgrammer.js +3 -3
  85. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  86. package/lib/programmers/AssertProgrammer.js +13 -21
  87. package/lib/programmers/AssertProgrammer.js.map +1 -1
  88. package/lib/programmers/CheckerProgrammer.d.ts +6 -7
  89. package/lib/programmers/CheckerProgrammer.js +276 -185
  90. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  91. package/lib/programmers/CloneProgrammer.js +312 -204
  92. package/lib/programmers/CloneProgrammer.js.map +1 -1
  93. package/lib/programmers/FeatureProgrammer.d.ts +21 -27
  94. package/lib/programmers/FeatureProgrammer.js +60 -63
  95. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  96. package/lib/programmers/IsProgrammer.d.ts +3 -3
  97. package/lib/programmers/IsProgrammer.js +43 -28
  98. package/lib/programmers/IsProgrammer.js.map +1 -1
  99. package/lib/programmers/LiteralsProgrammer.js +1 -0
  100. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  101. package/lib/programmers/PruneProgrammer.js +270 -176
  102. package/lib/programmers/PruneProgrammer.js.map +1 -1
  103. package/lib/programmers/RandomProgrammer.js +124 -32
  104. package/lib/programmers/RandomProgrammer.js.map +1 -1
  105. package/lib/programmers/StringifyProgrammer.js +462 -356
  106. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  107. package/lib/programmers/ValidateProgrammer.js +9 -9
  108. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  109. package/lib/programmers/helpers/FunctionImporeter.d.ts +2 -0
  110. package/lib/programmers/helpers/FunctionImporeter.js +17 -2
  111. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  112. package/lib/programmers/helpers/RandomJoiner.d.ts +6 -1
  113. package/lib/programmers/helpers/RandomJoiner.js +11 -14
  114. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  115. package/lib/programmers/helpers/UnionExplorer.d.ts +12 -10
  116. package/lib/programmers/helpers/UnionExplorer.js +47 -12
  117. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  118. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  119. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  120. package/lib/programmers/helpers/disable_function_importer_declare.js +1 -0
  121. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  122. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.d.ts +1 -1
  123. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js +2 -2
  124. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js.map +1 -1
  125. package/lib/programmers/internal/application_array.js +41 -21
  126. package/lib/programmers/internal/application_array.js.map +1 -1
  127. package/lib/programmers/internal/application_definition.d.ts +5 -0
  128. package/lib/programmers/internal/application_definition.js +45 -0
  129. package/lib/programmers/internal/application_definition.js.map +1 -0
  130. package/lib/programmers/internal/application_native.js +14 -11
  131. package/lib/programmers/internal/application_native.js.map +1 -1
  132. package/lib/programmers/internal/application_object.js +19 -14
  133. package/lib/programmers/internal/application_object.js.map +1 -1
  134. package/lib/programmers/internal/application_schema.js +28 -31
  135. package/lib/programmers/internal/application_schema.js.map +1 -1
  136. package/lib/programmers/internal/application_tuple.js +34 -5
  137. package/lib/programmers/internal/application_tuple.js.map +1 -1
  138. package/lib/programmers/internal/check_union_array_like.js +54 -63
  139. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  140. package/lib/programmers/internal/feature_object_entries.js +2 -2
  141. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  142. package/lib/programmers/internal/wrap_metadata_rest_tuple.d.ts +2 -0
  143. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +18 -0
  144. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -0
  145. package/lib/schemas/IJsonApplication.d.ts +0 -4
  146. package/lib/schemas/IJsonComponents.d.ts +16 -4
  147. package/lib/schemas/IJsonSchema.d.ts +1 -1
  148. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  149. package/lib/transformers/FileTransformer.js +3 -3
  150. package/lib/transformers/FileTransformer.js.map +1 -1
  151. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -0
  152. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  153. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +2 -1
  154. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  155. package/lib/utils/ArrayUtil.d.ts +1 -1
  156. package/lib/utils/ArrayUtil.js +2 -1
  157. package/lib/utils/ArrayUtil.js.map +1 -1
  158. package/lib/utils/RandomGenerator.js +2 -3
  159. package/lib/utils/RandomGenerator.js.map +1 -1
  160. package/package.json +6 -1
  161. package/src/IRandomGenerator.ts +1 -0
  162. package/src/factories/CommentFactory.ts +2 -1
  163. package/src/factories/IdentifierFactory.ts +3 -1
  164. package/src/factories/MetadataCollection.ts +173 -34
  165. package/src/factories/MetadataFactory.ts +7 -29
  166. package/src/factories/MetadataTagFactory.ts +6 -3
  167. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -0
  168. package/src/factories/internal/metadata/emplace_metadata_definition.ts +35 -0
  169. package/src/factories/internal/metadata/emplace_metadata_object.ts +4 -4
  170. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -0
  171. package/src/factories/internal/metadata/explore_metadata.ts +18 -44
  172. package/src/factories/internal/metadata/iterate_metadata.ts +13 -3
  173. package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -11
  174. package/src/factories/internal/metadata/iterate_metadata_collection.ts +130 -0
  175. package/src/factories/internal/metadata/iterate_metadata_definition.ts +34 -0
  176. package/src/factories/internal/metadata/iterate_metadata_object.ts +1 -0
  177. package/src/factories/internal/metadata/iterate_metadata_sort.ts +68 -0
  178. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -31
  179. package/src/factories/internal/metadata/iterate_metadata_union.ts +13 -2
  180. package/src/metadata/IMetadata.ts +3 -2
  181. package/src/metadata/IMetadataApplication.ts +2 -2
  182. package/src/metadata/IMetadataArray.ts +10 -0
  183. package/src/metadata/IMetadataCollection.ts +11 -0
  184. package/src/metadata/IMetadataDefinition.ts +12 -0
  185. package/src/metadata/IMetadataDictionary.ts +14 -0
  186. package/src/metadata/IMetadataObject.ts +2 -13
  187. package/src/metadata/IMetadataProperty.ts +1 -1
  188. package/src/metadata/IMetadataTuple.ts +10 -0
  189. package/src/metadata/Metadata.ts +473 -134
  190. package/src/metadata/MetadataArray.ts +52 -0
  191. package/src/metadata/MetadataDefinition.ts +65 -0
  192. package/src/metadata/MetadataObject.ts +7 -20
  193. package/src/metadata/MetadataProperty.ts +5 -5
  194. package/src/metadata/MetadataTuple.ts +53 -0
  195. package/src/programmers/ApplicationProgrammer.ts +1 -2
  196. package/src/programmers/AssertProgrammer.ts +45 -39
  197. package/src/programmers/CheckerProgrammer.ts +612 -331
  198. package/src/programmers/CloneProgrammer.ts +344 -138
  199. package/src/programmers/FeatureProgrammer.ts +110 -115
  200. package/src/programmers/IsProgrammer.ts +86 -52
  201. package/src/programmers/LiteralsProgrammer.ts +1 -0
  202. package/src/programmers/PruneProgrammer.ts +304 -101
  203. package/src/programmers/RandomProgrammer.ts +227 -61
  204. package/src/programmers/StringifyProgrammer.ts +374 -182
  205. package/src/programmers/ValidateProgrammer.ts +41 -44
  206. package/src/programmers/helpers/FunctionImporeter.ts +35 -11
  207. package/src/programmers/helpers/RandomJoiner.ts +25 -13
  208. package/src/programmers/helpers/UnionExplorer.ts +76 -50
  209. package/src/programmers/helpers/UnionPredicator.ts +1 -1
  210. package/src/programmers/helpers/disable_function_importer_declare.ts +5 -0
  211. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  212. package/src/programmers/internal/application_array.ts +48 -16
  213. package/src/programmers/internal/application_definition.ts +45 -0
  214. package/src/programmers/internal/application_native.ts +15 -12
  215. package/src/programmers/internal/application_object.ts +17 -12
  216. package/src/programmers/internal/application_schema.ts +31 -65
  217. package/src/programmers/internal/application_tuple.ts +63 -13
  218. package/src/programmers/internal/check_union_array_like.ts +249 -191
  219. package/src/programmers/internal/feature_object_entries.ts +2 -2
  220. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -0
  221. package/src/schemas/IJsonApplication.ts +0 -5
  222. package/src/schemas/IJsonComponents.ts +17 -5
  223. package/src/schemas/IJsonSchema.ts +1 -1
  224. package/src/transformers/CallExpressionTransformer.ts +2 -0
  225. package/src/transformers/FileTransformer.ts +8 -8
  226. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +1 -0
  227. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +2 -1
  228. package/src/utils/ArrayUtil.ts +3 -2
  229. package/src/utils/RandomGenerator.ts +3 -3
  230. package/lib/programmers/internal/check_union_tuple.js +0 -15
  231. package/lib/programmers/internal/check_union_tuple.js.map +0 -1
  232. package/src/programmers/internal/check_union_tuple.ts +0 -33
  233. /package/lib/{programmers/internal/check_union_tuple.d.ts → metadata/IMetadataDictionary.d.ts} +0 -0
@@ -9,6 +9,7 @@ import { ValueFactory } from "../factories/ValueFactory";
9
9
  import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
10
10
  import { IMetadataTag } from "../metadata/IMetadataTag";
11
11
  import { Metadata } from "../metadata/Metadata";
12
+ import { MetadataArray } from "../metadata/MetadataArray";
12
13
  import { MetadataObject } from "../metadata/MetadataObject";
13
14
 
14
15
  import { IProject } from "../transformers/IProject";
@@ -27,14 +28,9 @@ export namespace FeatureProgrammer {
27
28
  types: IConfig.ITypes;
28
29
 
29
30
  /**
30
- * Prefix name of functions for specific object types.
31
+ * Prefix name of internal functions for specific types.
31
32
  */
32
- functors: string;
33
-
34
- /**
35
- * Prefix name of functions for union object types.
36
- */
37
- unioners: string;
33
+ prefix: string;
38
34
 
39
35
  /**
40
36
  * Whether to archive access path or not.
@@ -58,7 +54,7 @@ export namespace FeatureProgrammer {
58
54
  /**
59
55
  * Decoder, station of every types.
60
56
  */
61
- decoder: Decoder<Metadata, Output>;
57
+ decoder: () => Decoder<Metadata, Output>;
62
58
 
63
59
  /**
64
60
  * Object configurator.
@@ -68,7 +64,7 @@ export namespace FeatureProgrammer {
68
64
  /**
69
65
  * Generator of functions for object types.
70
66
  */
71
- generator?: Partial<IConfig.IGenerator>;
67
+ generator: IConfig.IGenerator;
72
68
  }
73
69
  export namespace IConfig {
74
70
  export interface ITypes {
@@ -80,12 +76,12 @@ export namespace FeatureProgrammer {
80
76
  /**
81
77
  * Type checker when union object type comes.
82
78
  */
83
- checker: Decoder<Metadata, ts.Expression>;
79
+ checker: () => Decoder<Metadata, ts.Expression>;
84
80
 
85
81
  /**
86
82
  * Decoder, function call expression generator of specific typed objects.
87
83
  */
88
- decoder: Decoder<MetadataObject, ts.Expression>;
84
+ decoder: () => Decoder<MetadataObject, ts.Expression>;
89
85
 
90
86
  /**
91
87
  * Joiner of expressions from properties.
@@ -174,23 +170,16 @@ export namespace FeatureProgrammer {
174
170
  type?: ts.TypeNode;
175
171
  }
176
172
  export interface IGenerator {
177
- /**
178
- *
179
- * @param col
180
- */
181
- functors(col: MetadataCollection): ts.VariableStatement[];
182
-
183
- /**
184
- *
185
- * @param col
186
- */
187
- unioners(col: MetadataCollection): ts.VariableStatement[];
173
+ objects?(): (col: MetadataCollection) => ts.VariableStatement[];
174
+ unions?(): (col: MetadataCollection) => ts.VariableStatement[];
175
+ arrays(): (col: MetadataCollection) => ts.VariableStatement[];
176
+ tuples(): (col: MetadataCollection) => ts.VariableStatement[];
188
177
  }
189
178
  }
190
179
 
191
180
  export interface IExplore {
192
181
  tracable: boolean;
193
- source: "top" | "object";
182
+ source: "top" | "function";
194
183
  from: "top" | "array" | "object";
195
184
  postfix: string;
196
185
  start?: number;
@@ -212,7 +201,7 @@ export namespace FeatureProgrammer {
212
201
  /* -----------------------------------------------------------
213
202
  GENERATORS
214
203
  ----------------------------------------------------------- */
215
- export const analyze =
204
+ export const write =
216
205
  (project: IProject) =>
217
206
  (config: IConfig) =>
218
207
  (importer: FunctionImporter) =>
@@ -220,7 +209,7 @@ export namespace FeatureProgrammer {
220
209
  const [collection, meta] = config.initializer(project)(type);
221
210
 
222
211
  // ITERATE OVER ALL METADATA
223
- const output: ts.ConciseBody = config.decoder(
212
+ const output: ts.ConciseBody = config.decoder()(
224
213
  ValueFactory.INPUT(),
225
214
  meta,
226
215
  {
@@ -234,12 +223,17 @@ export namespace FeatureProgrammer {
234
223
  );
235
224
 
236
225
  // RETURNS THE OPTIMAL ARROW FUNCTION
237
- const functors: ts.VariableStatement[] = (
238
- config.generator?.functors ?? write_functors(config)(importer)
239
- )(collection);
240
- const unioners: ts.VariableStatement[] = (
241
- config.generator?.unioners ?? write_unioners(config)(importer)
242
- )(collection);
226
+ const functions = {
227
+ objects: (
228
+ config.generator.objects?.() ??
229
+ write_object_functions(config)(importer)
230
+ )(collection),
231
+ unions: (
232
+ config.generator.unions?.() ?? write_union_functions(config)
233
+ )(collection),
234
+ arrays: config.generator.arrays()(collection),
235
+ tuples: config.generator.tuples()(collection),
236
+ };
243
237
  const added: ts.Statement[] = (config.addition ?? (() => []))(
244
238
  collection,
245
239
  );
@@ -247,7 +241,7 @@ export namespace FeatureProgrammer {
247
241
  return ts.factory.createArrowFunction(
248
242
  undefined,
249
243
  undefined,
250
- PARAMETERS(config)(config.types.input(type, name))(
244
+ parameterDeclarations(config)(config.types.input(type, name))(
251
245
  ValueFactory.INPUT(),
252
246
  ),
253
247
  config.types.output(type, name),
@@ -255,11 +249,17 @@ export namespace FeatureProgrammer {
255
249
  ts.factory.createBlock(
256
250
  [
257
251
  ...added,
258
- ...functors.filter((_, i) =>
259
- importer.hasLocal(`${config.functors}${i}`),
252
+ ...functions.objects.filter((_, i) =>
253
+ importer.hasLocal(`${config.prefix}o${i}`),
254
+ ),
255
+ ...functions.unions.filter((_, i) =>
256
+ importer.hasLocal(`${config.prefix}u${i}`),
260
257
  ),
261
- ...unioners.filter((_, i) =>
262
- importer.hasLocal(`${config.unioners}${i}`),
258
+ ...functions.arrays.filter((_, i) =>
259
+ importer.hasLocal(`${config.prefix}a${i}`),
260
+ ),
261
+ ...functions.tuples.filter((_, i) =>
262
+ importer.hasLocal(`${config.prefix}t${i}`),
263
263
  ),
264
264
  ...(ts.isBlock(output)
265
265
  ? output.statements
@@ -270,7 +270,7 @@ export namespace FeatureProgrammer {
270
270
  );
271
271
  };
272
272
 
273
- export const write_functors =
273
+ export const write_object_functions =
274
274
  (config: IConfig) =>
275
275
  (importer: FunctionImporter) =>
276
276
  (collection: MetadataCollection) =>
@@ -278,45 +278,37 @@ export namespace FeatureProgrammer {
278
278
  .objects()
279
279
  .map((obj, i) =>
280
280
  StatementFactory.constant(
281
- `${config.functors}${i}`,
282
- write_object(config)(importer)(obj),
281
+ `${config.prefix}o${i}`,
282
+ ts.factory.createArrowFunction(
283
+ undefined,
284
+ undefined,
285
+ parameterDeclarations(config)(
286
+ TypeFactory.keyword("any"),
287
+ )(ValueFactory.INPUT()),
288
+ config.objector.type ?? TypeFactory.keyword("any"),
289
+ undefined,
290
+ config.objector.joiner(
291
+ ts.factory.createIdentifier("input"),
292
+ feature_object_entries(config)(importer)(obj)(
293
+ ts.factory.createIdentifier("input"),
294
+ ),
295
+ obj,
296
+ ),
297
+ ),
283
298
  ),
284
299
  );
285
300
 
286
- export const write_unioners =
287
- (config: IConfig) =>
288
- (importer: FunctionImporter) =>
289
- (collection: MetadataCollection) =>
301
+ export const write_union_functions =
302
+ (config: IConfig) => (collection: MetadataCollection) =>
290
303
  collection
291
304
  .unions()
292
305
  .map((union, i) =>
293
306
  StatementFactory.constant(
294
- importer.useLocal(`${config.unioners}${i}`),
307
+ `${config.prefix}u${i}`,
295
308
  write_union(config)(union),
296
309
  ),
297
310
  );
298
311
 
299
- const write_object =
300
- (config: IConfig) =>
301
- (importer: FunctionImporter) =>
302
- (obj: MetadataObject) =>
303
- ts.factory.createArrowFunction(
304
- undefined,
305
- undefined,
306
- PARAMETERS(config)(TypeFactory.keyword("any"))(
307
- ValueFactory.INPUT(),
308
- ),
309
- config.objector.type ?? TypeFactory.keyword("any"),
310
- undefined,
311
- config.objector.joiner(
312
- ts.factory.createIdentifier("input"),
313
- feature_object_entries(config)(importer)(obj)(
314
- ts.factory.createIdentifier("input"),
315
- ),
316
- obj,
317
- ),
318
- );
319
-
320
312
  const write_union = (config: IConfig) => {
321
313
  const explorer = UnionExplorer.object(config);
322
314
  const input = ValueFactory.INPUT();
@@ -325,7 +317,7 @@ export namespace FeatureProgrammer {
325
317
  ts.factory.createArrowFunction(
326
318
  undefined,
327
319
  undefined,
328
- PARAMETERS(config)(TypeFactory.keyword("any"))(
320
+ parameterDeclarations(config)(TypeFactory.keyword("any"))(
329
321
  ValueFactory.INPUT(),
330
322
  ),
331
323
  TypeFactory.keyword("any"),
@@ -335,7 +327,7 @@ export namespace FeatureProgrammer {
335
327
  meta,
336
328
  {
337
329
  tracable: config.path || config.trace,
338
- source: "object",
330
+ source: "function",
339
331
  from: "object",
340
332
  postfix: "",
341
333
  },
@@ -349,7 +341,7 @@ export namespace FeatureProgrammer {
349
341
  DECODERS
350
342
  ----------------------------------------------------------- */
351
343
  export const decode_array =
352
- (config: Pick<IConfig, "trace" | "path" | "decoder">) =>
344
+ (config: Pick<IConfig, "trace" | "path" | "decoder" | "prefix">) =>
353
345
  (importer: FunctionImporter) =>
354
346
  (
355
347
  combiner: (
@@ -372,7 +364,7 @@ export namespace FeatureProgrammer {
372
364
 
373
365
  return (
374
366
  input: ts.Expression,
375
- meta: Metadata,
367
+ array: MetadataArray,
376
368
  explore: IExplore,
377
369
  metaTags: IMetadataTag[],
378
370
  jsDocTags: IJsDocTagInfo[],
@@ -389,14 +381,14 @@ export namespace FeatureProgrammer {
389
381
  ],
390
382
  undefined,
391
383
  undefined,
392
- config.decoder(
384
+ config.decoder()(
393
385
  ValueFactory.INPUT("elem"),
394
- meta,
386
+ array.value,
395
387
  {
396
388
  tracable: explore.tracable,
397
389
  source: explore.source,
398
390
  from: "array",
399
- postfix: INDEX_SYMBOL(explore.start ?? null)(
391
+ postfix: index(explore.start ?? null)(
400
392
  explore.postfix,
401
393
  )(rand),
402
394
  },
@@ -409,18 +401,33 @@ export namespace FeatureProgrammer {
409
401
  };
410
402
 
411
403
  export const decode_object =
412
- (config: Pick<IConfig, "trace" | "path" | "functors">) =>
404
+ (config: Pick<IConfig, "trace" | "path" | "prefix">) =>
413
405
  (importer: FunctionImporter) =>
414
406
  (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
415
407
  ts.factory.createCallExpression(
416
408
  ts.factory.createIdentifier(
417
- importer.useLocal(`${config.functors}${obj.index}`),
409
+ importer.useLocal(`${config.prefix}o${obj.index}`),
418
410
  ),
419
411
  undefined,
420
- get_object_arguments(config)(explore)(input),
412
+ argumentsArray(config)(explore)(input),
421
413
  );
422
414
 
423
- export const get_object_arguments =
415
+ /* -----------------------------------------------------------
416
+ UTILITIES FOR INTERNAL FUNCTIONS
417
+ ----------------------------------------------------------- */
418
+ export const index =
419
+ (start: number | null) => (prev: string) => (rand: string) => {
420
+ const tail: string =
421
+ start !== null
422
+ ? `"[" + (${start} + _index${rand}) + "]"`
423
+ : `"[" + _index${rand} + "]"`;
424
+ if (prev === "") return tail;
425
+ else if (prev[prev.length - 1] === `"`)
426
+ return prev.substring(0, prev.length - 1) + tail.substring(1);
427
+ return prev + ` + ${tail}`;
428
+ };
429
+
430
+ export const argumentsArray =
424
431
  (config: Pick<IConfig, "path" | "trace">) =>
425
432
  (explore: FeatureProgrammer.IExplore) => {
426
433
  const tail: ts.Expression[] =
@@ -433,7 +440,7 @@ export namespace FeatureProgrammer {
433
440
  ? `_path + ${explore.postfix}`
434
441
  : "_path",
435
442
  ),
436
- explore.source === "object"
443
+ explore.source === "function"
437
444
  ? ts.factory.createIdentifier(
438
445
  `${explore.tracable} && _exceptionable`,
439
446
  )
@@ -450,7 +457,7 @@ export namespace FeatureProgrammer {
450
457
  ),
451
458
  ]
452
459
  : [
453
- explore.source === "object"
460
+ explore.source === "function"
454
461
  ? ts.factory.createIdentifier(
455
462
  `${explore.tracable} && _exceptionable`,
456
463
  )
@@ -460,41 +467,29 @@ export namespace FeatureProgrammer {
460
467
  ];
461
468
  return (input: ts.Expression) => [input, ...tail];
462
469
  };
463
- }
464
-
465
- const INDEX_SYMBOL =
466
- (start: number | null) => (prev: string) => (rand: string) => {
467
- const tail: string =
468
- start !== null
469
- ? `"[" + (${start} + _index${rand}) + "]"`
470
- : `"[" + _index${rand} + "]"`;
471
- if (prev === "") return tail;
472
- else if (prev[prev.length - 1] === `"`)
473
- return prev.substring(0, prev.length - 1) + tail.substring(1);
474
- return prev + ` + ${tail}`;
475
- };
476
470
 
477
- const PARAMETERS =
478
- (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
479
- (type: ts.TypeNode) => {
480
- const tail: ts.ParameterDeclaration[] = [];
481
- if (props.path)
482
- tail.push(
483
- IdentifierFactory.parameter(
484
- "_path",
485
- TypeFactory.keyword("string"),
486
- ),
487
- );
488
- if (props.trace)
489
- tail.push(
490
- IdentifierFactory.parameter(
491
- "_exceptionable",
492
- TypeFactory.keyword("boolean"),
493
- ts.factory.createTrue(),
494
- ),
495
- );
496
- return (input: ts.Identifier) => [
497
- IdentifierFactory.parameter(input, type),
498
- ...tail,
499
- ];
500
- };
471
+ export const parameterDeclarations =
472
+ (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
473
+ (type: ts.TypeNode) => {
474
+ const tail: ts.ParameterDeclaration[] = [];
475
+ if (props.path)
476
+ tail.push(
477
+ IdentifierFactory.parameter(
478
+ "_path",
479
+ TypeFactory.keyword("string"),
480
+ ),
481
+ );
482
+ if (props.trace)
483
+ tail.push(
484
+ IdentifierFactory.parameter(
485
+ "_exceptionable",
486
+ TypeFactory.keyword("boolean"),
487
+ ts.factory.createTrue(),
488
+ ),
489
+ );
490
+ return (input: ts.Identifier): ts.ParameterDeclaration[] => [
491
+ IdentifierFactory.parameter(input, type),
492
+ ...tail,
493
+ ];
494
+ };
495
+ }
@@ -2,6 +2,8 @@ import ts from "typescript";
2
2
 
3
3
  import { ExpressionFactory } from "../factories/ExpressionFactory";
4
4
  import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { TypeFactory } from "../factories/TypeFactory";
5
7
  import { ValueFactory } from "../factories/ValueFactory";
6
8
 
7
9
  import { MetadataObject } from "../metadata/MetadataObject";
@@ -20,8 +22,7 @@ export namespace IsProgrammer {
20
22
  export const configure =
21
23
  (options?: Partial<CONFIG.IOptions>) =>
22
24
  (importer: FunctionImporter): CheckerProgrammer.IConfig => ({
23
- functors: "$io",
24
- unioners: "$iu",
25
+ prefix: "$i",
25
26
  trace: false,
26
27
  path: false,
27
28
  equals: !!options?.object,
@@ -107,7 +108,7 @@ export namespace IsProgrammer {
107
108
  (modulo: ts.LeftHandSideExpression, disable?: boolean) =>
108
109
  (equals: boolean) => {
109
110
  const importer: FunctionImporter =
110
- disable === true
111
+ disable === <any>{}
111
112
  ? disable_function_importer_declare(new FunctionImporter())
112
113
  : new FunctionImporter();
113
114
 
@@ -128,65 +129,98 @@ export namespace IsProgrammer {
128
129
  addition: () => importer.declare(modulo),
129
130
  };
130
131
 
131
- config.decoder = (input, target, explore, tags, jsDocTags) => {
132
- if (
133
- target.size() === 1 &&
134
- target.objects.length === 1 &&
135
- target.required === true &&
136
- target.nullable === false
137
- ) {
138
- // ONLY WHEN OBJECT WITH SOME ATOMIC PROPERTIES
139
- const obj: MetadataObject = target.objects[0]!;
132
+ config.decoder =
133
+ () => (input, target, explore, tags, jsDocTags) => {
140
134
  if (
141
- obj._Is_simple() &&
142
- (equals === false ||
143
- OptionPredicator.undefined(project.options) ===
144
- false)
145
- )
146
- return ts.factory.createLogicalAnd(
147
- ExpressionFactory.isObject({
148
- checkNull: true,
149
- checkArray: false,
150
- })(input),
151
- config.joiner.object(
152
- input,
153
- feature_object_entries(config as any)(importer)(
154
- obj,
155
- )(input),
156
- ),
157
- );
158
- }
159
- return CheckerProgrammer.decode(project)(config)(importer)(
160
- input,
161
- target,
162
- explore,
163
- tags,
164
- jsDocTags,
165
- );
166
- };
135
+ target.size() === 1 &&
136
+ target.objects.length === 1 &&
137
+ target.required === true &&
138
+ target.nullable === false
139
+ ) {
140
+ // ONLY WHEN OBJECT WITH SOME ATOMIC PROPERTIES
141
+ const obj: MetadataObject = target.objects[0]!;
142
+ if (
143
+ obj._Is_simple() &&
144
+ (equals === false ||
145
+ OptionPredicator.undefined(project.options) ===
146
+ false)
147
+ )
148
+ return ts.factory.createLogicalAnd(
149
+ ExpressionFactory.isObject({
150
+ checkNull: true,
151
+ checkArray: false,
152
+ })(input),
153
+ config.joiner.object(
154
+ ts.factory.createAsExpression(
155
+ input,
156
+ TypeFactory.keyword("any"),
157
+ ),
158
+ feature_object_entries(config as any)(
159
+ importer,
160
+ )(obj)(
161
+ ts.factory.createAsExpression(
162
+ input,
163
+ TypeFactory.keyword("any"),
164
+ ),
165
+ ),
166
+ ),
167
+ );
168
+ }
169
+ return CheckerProgrammer.decode(project)(config)(importer)(
170
+ input,
171
+ target,
172
+ explore,
173
+ tags,
174
+ jsDocTags,
175
+ );
176
+ };
167
177
 
168
178
  // GENERATE CHECKER
169
179
  return CheckerProgrammer.write(project)(config)(importer);
170
180
  };
171
181
 
172
- export const write_functors =
173
- (project: IProject) => (importer: FunctionImporter) =>
174
- CheckerProgrammer.write_functors(project)(configure()(importer))(
175
- importer,
176
- );
177
-
178
- export const write_unioners =
179
- (project: IProject) => (importer: FunctionImporter) =>
180
- CheckerProgrammer.write_unioners(
181
- project,
182
- configure()(importer),
183
- importer,
184
- );
182
+ export const write_function_statements =
183
+ (project: IProject) =>
184
+ (importer: FunctionImporter) =>
185
+ (collection: MetadataCollection) => {
186
+ const config = configure()(importer);
187
+ const objects =
188
+ CheckerProgrammer.write_object_functions(project)(config)(
189
+ importer,
190
+ )(collection);
191
+ const unions =
192
+ CheckerProgrammer.write_union_functions(project)(config)(
193
+ importer,
194
+ )(collection);
195
+ const arrays =
196
+ CheckerProgrammer.write_array_functions(project)(config)(
197
+ importer,
198
+ )(collection);
199
+ const tuples =
200
+ CheckerProgrammer.write_tuple_functions(project)(config)(
201
+ importer,
202
+ )(collection);
203
+
204
+ return [
205
+ ...objects.filter((_, i) =>
206
+ importer.hasLocal(`${config.prefix}o${i}`),
207
+ ),
208
+ ...unions.filter((_, i) =>
209
+ importer.hasLocal(`${config.prefix}u${i}`),
210
+ ),
211
+ ...arrays.filter((_, i) =>
212
+ importer.hasLocal(`${config.prefix}a${i}`),
213
+ ),
214
+ ...tuples.filter((_, i) =>
215
+ importer.hasLocal(`${config.prefix}t${i}`),
216
+ ),
217
+ ];
218
+ };
185
219
 
186
220
  /* -----------------------------------------------------------
187
221
  DECODERS
188
222
  ----------------------------------------------------------- */
189
- export const decode = (project: IProject, importer: FunctionImporter) =>
223
+ export const decode = (project: IProject) => (importer: FunctionImporter) =>
190
224
  CheckerProgrammer.decode(project)(configure()(importer))(importer);
191
225
 
192
226
  export const decode_object = (importer: FunctionImporter) =>
@@ -22,6 +22,7 @@ export namespace LiteralsProgrammer {
22
22
  const meta: Metadata = MetadataFactory.analyze(project.checker)({
23
23
  resolve: true,
24
24
  constant: true,
25
+ absorb: true,
25
26
  validate: (meta) => {
26
27
  const length: number =
27
28
  meta.constants