typia 7.0.0-dev.20240930 → 7.0.0-dev.20241001

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 (169) hide show
  1. package/lib/index.mjs +25 -25
  2. package/lib/index.mjs.map +1 -1
  3. package/lib/programmers/AssertProgrammer.js +20 -17
  4. package/lib/programmers/AssertProgrammer.js.map +1 -1
  5. package/lib/programmers/CheckerProgrammer.js +274 -216
  6. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  7. package/lib/programmers/FeatureProgrammer.js +16 -8
  8. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  9. package/lib/programmers/IsProgrammer.js +38 -20
  10. package/lib/programmers/IsProgrammer.js.map +1 -1
  11. package/lib/programmers/RandomProgrammer.js +83 -68
  12. package/lib/programmers/RandomProgrammer.js.map +1 -1
  13. package/lib/programmers/TypiaProgrammer.d.ts +2 -2
  14. package/lib/programmers/TypiaProgrammer.js +79 -75
  15. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  16. package/lib/programmers/ValidateProgrammer.js +39 -17
  17. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  18. package/lib/programmers/helpers/CloneJoiner.js +4 -1
  19. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  20. package/lib/programmers/helpers/NotationJoiner.d.ts +2 -1
  21. package/lib/programmers/helpers/NotationJoiner.js +34 -33
  22. package/lib/programmers/helpers/NotationJoiner.js.map +1 -1
  23. package/lib/programmers/helpers/PruneJoiner.js +4 -1
  24. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  25. package/lib/programmers/helpers/RandomJoiner.d.ts +1 -1
  26. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  27. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  28. package/lib/programmers/helpers/StringifyJoinder.js +4 -1
  29. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  30. package/lib/programmers/helpers/StringifyPredicator.d.ts +1 -1
  31. package/lib/programmers/helpers/StringifyPredicator.js +4 -3
  32. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  33. package/lib/programmers/helpers/UnionExplorer.d.ts +52 -12
  34. package/lib/programmers/helpers/UnionExplorer.js +183 -144
  35. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  36. package/lib/programmers/helpers/UnionPredicator.d.ts +1 -1
  37. package/lib/programmers/helpers/UnionPredicator.js +7 -7
  38. package/lib/programmers/http/HttpFormDataProgrammer.js +77 -70
  39. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  40. package/lib/programmers/http/HttpHeadersProgrammer.js +69 -68
  41. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  42. package/lib/programmers/http/HttpQueryProgrammer.js +69 -62
  43. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  44. package/lib/programmers/internal/application_escaped.js +4 -4
  45. package/lib/programmers/internal/application_escaped.js.map +1 -1
  46. package/lib/programmers/internal/application_templates.js +8 -2
  47. package/lib/programmers/internal/application_templates.js.map +1 -1
  48. package/lib/programmers/internal/application_union_discriminator.d.ts +1 -1
  49. package/lib/programmers/internal/application_union_discriminator.js +6 -6
  50. package/lib/programmers/internal/application_union_discriminator.js.map +1 -1
  51. package/lib/programmers/internal/application_v30_object.js +6 -3
  52. package/lib/programmers/internal/application_v30_object.js.map +1 -1
  53. package/lib/programmers/internal/application_v31_object.js +4 -1
  54. package/lib/programmers/internal/application_v31_object.js.map +1 -1
  55. package/lib/programmers/internal/check_array_length.js +21 -26
  56. package/lib/programmers/internal/check_array_length.js.map +1 -1
  57. package/lib/programmers/internal/check_bigint.js +18 -26
  58. package/lib/programmers/internal/check_bigint.js.map +1 -1
  59. package/lib/programmers/internal/check_dynamic_key.d.ts +1 -5
  60. package/lib/programmers/internal/check_dynamic_key.js +109 -91
  61. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  62. package/lib/programmers/internal/check_dynamic_properties.js +88 -90
  63. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  64. package/lib/programmers/internal/check_native.js +8 -5
  65. package/lib/programmers/internal/check_native.js.map +1 -1
  66. package/lib/programmers/internal/check_number.js +59 -65
  67. package/lib/programmers/internal/check_number.js.map +1 -1
  68. package/lib/programmers/internal/check_object.js +31 -22
  69. package/lib/programmers/internal/check_object.js.map +1 -1
  70. package/lib/programmers/internal/check_string.js +18 -26
  71. package/lib/programmers/internal/check_string.js.map +1 -1
  72. package/lib/programmers/internal/check_template.js +20 -21
  73. package/lib/programmers/internal/check_template.js.map +1 -1
  74. package/lib/programmers/internal/check_union_array_like.js +68 -53
  75. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  76. package/lib/programmers/internal/decode_union_object.js +59 -49
  77. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  78. package/lib/programmers/internal/feature_object_entries.js +31 -37
  79. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  80. package/lib/programmers/internal/llm_schema_escaped.js +29 -11
  81. package/lib/programmers/internal/llm_schema_escaped.js.map +1 -1
  82. package/lib/programmers/internal/llm_schema_object.js +4 -1
  83. package/lib/programmers/internal/llm_schema_object.js.map +1 -1
  84. package/lib/programmers/internal/metadata_to_pattern.js +44 -41
  85. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  86. package/lib/programmers/internal/postfix_of_tuple.d.ts +1 -1
  87. package/lib/programmers/internal/postfix_of_tuple.js +3 -0
  88. package/lib/programmers/internal/postfix_of_tuple.js.map +1 -1
  89. package/lib/programmers/internal/prune_object_properties.js +6 -3
  90. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  91. package/lib/programmers/internal/random_custom.js +8 -14
  92. package/lib/programmers/internal/random_custom.js.map +1 -1
  93. package/lib/programmers/internal/stringify_dynamic_properties.js +4 -1
  94. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  95. package/lib/programmers/internal/stringify_regular_properties.js +4 -4
  96. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  97. package/lib/programmers/internal/template_to_pattern.js +10 -5
  98. package/lib/programmers/internal/template_to_pattern.js.map +1 -1
  99. package/lib/programmers/internal/wrap_metadata_rest_tuple.d.ts +1 -2
  100. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +3 -0
  101. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  102. package/lib/programmers/json/JsonStringifyProgrammer.js +76 -52
  103. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  104. package/lib/programmers/misc/MiscCloneProgrammer.js +143 -115
  105. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  106. package/lib/programmers/misc/MiscPruneProgrammer.js +65 -50
  107. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  108. package/lib/programmers/notations/NotationGeneralProgrammer.d.ts +4 -1
  109. package/lib/programmers/notations/NotationGeneralProgrammer.js +166 -115
  110. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  111. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +32 -24
  112. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  113. package/lib/utils/NamingConvention/NamingConvention.js +41 -47
  114. package/lib/utils/NamingConvention/NamingConvention.js.map +1 -1
  115. package/package.json +1 -1
  116. package/src/programmers/AssertProgrammer.ts +30 -27
  117. package/src/programmers/CheckerProgrammer.ts +279 -248
  118. package/src/programmers/FeatureProgrammer.ts +17 -15
  119. package/src/programmers/IsProgrammer.ts +34 -20
  120. package/src/programmers/RandomProgrammer.ts +18 -9
  121. package/src/programmers/TypiaProgrammer.ts +48 -34
  122. package/src/programmers/ValidateProgrammer.ts +50 -27
  123. package/src/programmers/helpers/CloneJoiner.ts +4 -1
  124. package/src/programmers/helpers/NotationJoiner.ts +85 -83
  125. package/src/programmers/helpers/ProtobufUtil.ts +2 -2
  126. package/src/programmers/helpers/PruneJoiner.ts +4 -1
  127. package/src/programmers/helpers/RandomJoiner.ts +5 -2
  128. package/src/programmers/helpers/RandomRanger.ts +8 -1
  129. package/src/programmers/helpers/StringifyJoinder.ts +4 -1
  130. package/src/programmers/helpers/StringifyPredicator.ts +4 -3
  131. package/src/programmers/helpers/UnionExplorer.ts +279 -202
  132. package/src/programmers/helpers/UnionPredicator.ts +5 -5
  133. package/src/programmers/http/HttpFormDataProgrammer.ts +135 -114
  134. package/src/programmers/http/HttpHeadersProgrammer.ts +145 -120
  135. package/src/programmers/http/HttpQueryProgrammer.ts +137 -116
  136. package/src/programmers/internal/application_escaped.ts +6 -6
  137. package/src/programmers/internal/application_templates.ts +8 -6
  138. package/src/programmers/internal/application_union_discriminator.ts +6 -6
  139. package/src/programmers/internal/application_v30_object.ts +6 -3
  140. package/src/programmers/internal/application_v31_object.ts +4 -1
  141. package/src/programmers/internal/application_v31_tuple.ts +1 -1
  142. package/src/programmers/internal/check_array_length.ts +31 -30
  143. package/src/programmers/internal/check_bigint.ts +31 -31
  144. package/src/programmers/internal/check_dynamic_key.ts +155 -126
  145. package/src/programmers/internal/check_dynamic_properties.ts +152 -154
  146. package/src/programmers/internal/check_native.ts +11 -5
  147. package/src/programmers/internal/check_number.ts +88 -84
  148. package/src/programmers/internal/check_object.ts +45 -31
  149. package/src/programmers/internal/check_string.ts +31 -30
  150. package/src/programmers/internal/check_template.ts +34 -32
  151. package/src/programmers/internal/check_union_array_like.ts +245 -228
  152. package/src/programmers/internal/decode_union_object.ts +92 -75
  153. package/src/programmers/internal/feature_object_entries.ts +43 -46
  154. package/src/programmers/internal/llm_schema_escaped.ts +36 -13
  155. package/src/programmers/internal/llm_schema_object.ts +4 -1
  156. package/src/programmers/internal/metadata_to_pattern.ts +31 -23
  157. package/src/programmers/internal/postfix_of_tuple.ts +3 -0
  158. package/src/programmers/internal/prune_object_properties.ts +6 -3
  159. package/src/programmers/internal/random_custom.ts +24 -23
  160. package/src/programmers/internal/stringify_dynamic_properties.ts +4 -1
  161. package/src/programmers/internal/stringify_regular_properties.ts +7 -7
  162. package/src/programmers/internal/template_to_pattern.ts +12 -4
  163. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +3 -0
  164. package/src/programmers/json/JsonStringifyProgrammer.ts +71 -51
  165. package/src/programmers/misc/MiscCloneProgrammer.ts +156 -132
  166. package/src/programmers/misc/MiscPruneProgrammer.ts +61 -49
  167. package/src/programmers/notations/NotationGeneralProgrammer.ts +193 -144
  168. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +25 -21
  169. package/src/utils/NamingConvention/NamingConvention.ts +40 -42
@@ -11,7 +11,7 @@ import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
11
11
  import { Escaper } from "../../utils/Escaper";
12
12
 
13
13
  export namespace RandomJoiner {
14
- export type Decoder = (meta: Metadata) => ts.Expression;
14
+ export type Decoder = (metadata: Metadata) => ts.Expression;
15
15
 
16
16
  export const array = (props: {
17
17
  coalesce: (method: string) => ts.Expression;
@@ -54,7 +54,10 @@ export namespace RandomJoiner {
54
54
  );
55
55
  };
56
56
 
57
- export const tuple = (props: { decode: Decoder; elements: Metadata[] }) =>
57
+ export const tuple = (props: {
58
+ decode: Decoder;
59
+ elements: Metadata[];
60
+ }): ts.ArrayLiteralExpression =>
58
61
  ts.factory.createArrayLiteralExpression(
59
62
  props.elements.map((elem) => props.decode(elem.rest ?? elem)),
60
63
  true,
@@ -182,7 +182,14 @@ const take = (props: {
182
182
  return value !== undefined ? Number(value) : undefined;
183
183
  };
184
184
 
185
- const multiplier = (props: { range: IRange; gap: number; value: number }) => {
185
+ const multiplier = (props: {
186
+ range: IRange;
187
+ gap: number;
188
+ value: number;
189
+ }): {
190
+ minimum: number;
191
+ maximum: number;
192
+ } => {
186
193
  const minimum: number =
187
194
  props.range.minimum.value === undefined
188
195
  ? 0
@@ -24,7 +24,10 @@ export namespace StringifyJoiner {
24
24
  (entry) => !entry.key.isSoleLiteral(),
25
25
  );
26
26
  const expressions: ts.Expression[] = [
27
- ...stringify_regular_properties(regular, dynamic),
27
+ ...stringify_regular_properties({
28
+ regular,
29
+ dynamic,
30
+ }),
28
31
  ...(dynamic.length
29
32
  ? [
30
33
  stringify_dynamic_properties(
@@ -4,9 +4,10 @@ export namespace StringifyPredicator {
4
4
  export const require_escape = (value: string): boolean =>
5
5
  value.split("").some((ch) => ESCAPED.some((escaped) => escaped === ch));
6
6
 
7
- export const undefindable = (meta: Metadata): boolean =>
8
- meta.isRequired() === false ||
9
- (meta.escaped !== null && meta.escaped.returns.isRequired() === false);
7
+ export const undefindable = (metadata: Metadata): boolean =>
8
+ metadata.isRequired() === false ||
9
+ (metadata.escaped !== null &&
10
+ metadata.escaped.returns.isRequired() === false);
10
11
 
11
12
  const ESCAPED = ['"', "\\", "\b", "\f", "\n", "\n", "\r", "\t"];
12
13
  }
@@ -16,225 +16,250 @@ import { UnionPredicator } from "./UnionPredicator";
16
16
 
17
17
  export namespace UnionExplorer {
18
18
  export interface Decoder<T> {
19
- (
20
- input: ts.Expression,
21
- target: T,
22
- explore: FeatureProgrammer.IExplore,
23
- ): ts.Expression;
19
+ (props: {
20
+ input: ts.Expression;
21
+ definition: T;
22
+ explore: FeatureProgrammer.IExplore;
23
+ }): ts.Expression;
24
24
  }
25
25
  export type ObjectCombiner = Decoder<MetadataObject[]>;
26
26
 
27
27
  /* -----------------------------------------------------------
28
28
  OBJECT
29
29
  ----------------------------------------------------------- */
30
- export const object =
31
- (config: FeatureProgrammer.IConfig, level: number = 0) =>
32
- (
33
- input: ts.Expression,
34
- targets: MetadataObject[],
35
- explore: FeatureProgrammer.IExplore,
36
- ): ts.Expression => {
37
- // BREAKER
38
- if (targets.length === 1)
39
- return config.objector.decoder({
40
- input,
41
- object: targets[0]!,
42
- explore,
43
- });
30
+ export const object = (props: {
31
+ config: FeatureProgrammer.IConfig;
32
+ level?: number;
33
+ objects: MetadataObject[];
34
+ input: ts.Expression;
35
+ explore: FeatureProgrammer.IExplore;
36
+ }): ts.Expression => {
37
+ // BREAKER
38
+ if (props.objects.length === 1)
39
+ return props.config.objector.decoder({
40
+ input: props.input,
41
+ object: props.objects[0]!,
42
+ explore: props.explore,
43
+ });
44
44
 
45
- const expected: string = `(${targets.map((t) => t.name).join(" | ")})`;
45
+ const expected: string = `(${props.objects.map((t) => t.name).join(" | ")})`;
46
46
 
47
- // POSSIBLE TO SPECIALIZE?
48
- const specList = UnionPredicator.object(targets);
49
- if (specList.length === 0) {
50
- const condition: ts.Expression = config.objector.unionizer({
51
- input,
52
- objects: targets,
53
- explore: {
54
- ...explore,
55
- tracable: false,
56
- },
57
- });
58
- return config.objector.full
59
- ? config.objector.full({
60
- condition,
61
- expected,
62
- explore,
63
- input,
64
- })
65
- : condition;
66
- }
67
- const remained: MetadataObject[] = targets.filter(
68
- (t) => specList.find((s) => s.object === t) === undefined,
69
- );
47
+ // POSSIBLE TO SPECIALIZE?
48
+ const specList = UnionPredicator.object(props.objects);
49
+ if (specList.length === 0) {
50
+ const condition: ts.Expression = props.config.objector.unionizer({
51
+ objects: props.objects,
52
+ input: props.input,
53
+ explore: {
54
+ ...props.explore,
55
+ tracable: false,
56
+ },
57
+ });
58
+ return props.config.objector.full
59
+ ? props.config.objector.full({
60
+ condition,
61
+ expected,
62
+ explore: props.explore,
63
+ input: props.input,
64
+ })
65
+ : condition;
66
+ }
67
+ const remained: MetadataObject[] = props.objects.filter(
68
+ (t) => specList.find((s) => s.object === t) === undefined,
69
+ );
70
70
 
71
- // DO SPECIALIZE
72
- const condition: ts.IfStatement = specList
73
- .filter((spec) => spec.property.key.getSoleLiteral() !== null)
74
- .map((spec, i, array) => {
75
- const key: string = spec.property.key.getSoleLiteral()!;
76
- const accessor: ts.Expression = IdentifierFactory.access(input)(key);
77
- const pred: ts.Expression = spec.neighbour
78
- ? config.objector.checker({
79
- input: accessor,
80
- metadata: spec.property.value,
81
- explore: {
82
- ...explore,
83
- tracable: false,
84
- postfix: IdentifierFactory.postfix(key),
85
- },
86
- })
87
- : (config.objector.required || ((exp) => exp))(
88
- ExpressionFactory.isRequired(accessor),
89
- );
90
- return ts.factory.createIfStatement(
91
- (config.objector.is || ((exp) => exp))(pred),
92
- ts.factory.createReturnStatement(
93
- config.objector.decoder({
94
- object: spec.object,
95
- input,
96
- explore,
97
- }),
98
- ),
99
- i === array.length - 1
100
- ? remained.length
101
- ? ts.factory.createReturnStatement(
102
- object(config, level + 1)(input, remained, explore),
103
- )
104
- : config.objector.failure({
105
- input,
106
- expected,
107
- explore,
108
- })
109
- : undefined,
110
- );
111
- })
112
- .reverse()
113
- .reduce((a, b) =>
114
- ts.factory.createIfStatement(b.expression, b.thenStatement, a),
71
+ // DO SPECIALIZE
72
+ const condition: ts.IfStatement = specList
73
+ .filter((spec) => spec.property.key.getSoleLiteral() !== null)
74
+ .map((spec, i, array) => {
75
+ const key: string = spec.property.key.getSoleLiteral()!;
76
+ const accessor: ts.Expression = IdentifierFactory.access(props.input)(
77
+ key,
78
+ );
79
+ const pred: ts.Expression = spec.neighbour
80
+ ? props.config.objector.checker({
81
+ input: accessor,
82
+ metadata: spec.property.value,
83
+ explore: {
84
+ ...props.explore,
85
+ tracable: false,
86
+ postfix: IdentifierFactory.postfix(key),
87
+ },
88
+ })
89
+ : (props.config.objector.required || ((exp) => exp))(
90
+ ExpressionFactory.isRequired(accessor),
91
+ );
92
+ return ts.factory.createIfStatement(
93
+ (props.config.objector.is || ((exp) => exp))(pred),
94
+ ts.factory.createReturnStatement(
95
+ props.config.objector.decoder({
96
+ object: spec.object,
97
+ input: props.input,
98
+ explore: props.explore,
99
+ }),
100
+ ),
101
+ i === array.length - 1
102
+ ? remained.length
103
+ ? ts.factory.createReturnStatement(
104
+ object({
105
+ config: props.config,
106
+ level: (props.level ?? 0) + 1,
107
+ input: props.input,
108
+ objects: remained,
109
+ explore: props.explore,
110
+ }),
111
+ )
112
+ : props.config.objector.failure({
113
+ input: props.input,
114
+ explore: props.explore,
115
+ expected,
116
+ })
117
+ : undefined,
115
118
  );
119
+ })
120
+ .reverse()
121
+ .reduce((a, b) =>
122
+ ts.factory.createIfStatement(b.expression, b.thenStatement, a),
123
+ );
116
124
 
117
- // RETURNS WITH CONDITIONS
118
- return ts.factory.createCallExpression(
119
- ts.factory.createArrowFunction(
120
- undefined,
121
- undefined,
122
- [],
123
- undefined,
124
- undefined,
125
- ts.factory.createBlock([condition], true),
126
- ),
125
+ // RETURNS WITH CONDITIONS
126
+ return ts.factory.createCallExpression(
127
+ ts.factory.createArrowFunction(
127
128
  undefined,
128
129
  undefined,
129
- );
130
- };
130
+ [],
131
+ undefined,
132
+ undefined,
133
+ ts.factory.createBlock([condition], true),
134
+ ),
135
+ undefined,
136
+ undefined,
137
+ );
138
+ };
131
139
 
132
140
  /* -----------------------------------------------------------
133
141
  ARRAY LIKE
134
142
  ----------------------------------------------------------- */
135
- export const tuple = (
136
- props: check_union_array_like.IProps<MetadataTuple, MetadataTuple>,
137
- ) =>
143
+ export const tuple = (props: {
144
+ config: check_union_array_like.IConfig<MetadataTuple, MetadataTuple>;
145
+ parameters: ts.ParameterDeclaration[];
146
+ input: ts.Expression;
147
+ tuples: MetadataTuple[];
148
+ explore: FeatureProgrammer.IExplore;
149
+ }) =>
138
150
  check_union_array_like<MetadataTuple, MetadataTuple, MetadataTuple>({
139
- transform: (x) => x,
140
- element: (x) => x,
141
- size: null!,
142
- front: (input) => input,
143
- array: (input) => input,
144
- name: (t) => t.type.name,
145
- })(props);
151
+ config: props.config,
152
+ accessor: {
153
+ transform: (x) => x,
154
+ element: (x) => x,
155
+ size: null!,
156
+ front: (input) => input,
157
+ array: (input) => input,
158
+ name: (t) => t.type.name,
159
+ },
160
+ parameters: props.parameters,
161
+ input: props.input,
162
+ definitions: props.tuples,
163
+ explore: props.explore,
164
+ });
146
165
  export namespace tuple {
147
- export type IProps = check_union_array_like.IProps<
166
+ export type IConfig = check_union_array_like.IConfig<
148
167
  MetadataTuple,
149
168
  MetadataTuple
150
169
  >;
151
170
  }
152
171
 
153
- export const array = (props: array.IProps) =>
172
+ export const array = (props: {
173
+ config: array.IConfig;
174
+ parameters: ts.ParameterDeclaration[];
175
+ input: ts.Expression;
176
+ arrays: MetadataArray[];
177
+ explore: FeatureProgrammer.IExplore;
178
+ }) =>
154
179
  check_union_array_like<MetadataArray, MetadataArray, Metadata>({
155
- transform: (x) => x,
156
- element: (x) => x.type.value,
157
- size: (input) => IdentifierFactory.access(input)("length"),
158
- front: (input) => ts.factory.createElementAccessExpression(input, 0),
159
- array: (input) => input,
160
- name: (t) => t.type.name,
161
- })(props);
180
+ config: props.config,
181
+ accessor: {
182
+ transform: (x) => x,
183
+ element: (x) => x.type.value,
184
+ size: (input) => IdentifierFactory.access(input)("length"),
185
+ front: (input) => ts.factory.createElementAccessExpression(input, 0),
186
+ array: (input) => input,
187
+ name: (t) => t.type.name,
188
+ },
189
+ parameters: props.parameters,
190
+ input: props.input,
191
+ definitions: props.arrays,
192
+ explore: props.explore,
193
+ });
162
194
  export namespace array {
163
- export type IProps = check_union_array_like.IProps<MetadataArray, Metadata>;
195
+ export type IConfig = check_union_array_like.IConfig<
196
+ MetadataArray,
197
+ Metadata
198
+ >;
164
199
  }
165
200
 
166
- export const array_or_tuple = (props: array_or_tuple.IProps) =>
201
+ export const array_or_tuple = (props: {
202
+ config: array_or_tuple.IConfig;
203
+ parameters: ts.ParameterDeclaration[];
204
+ input: ts.Expression;
205
+ definitions: (MetadataArray | MetadataTuple)[];
206
+ explore: FeatureProgrammer.IExplore;
207
+ }) =>
167
208
  check_union_array_like<
168
209
  MetadataArray | MetadataTuple,
169
210
  MetadataArray | MetadataTuple,
170
211
  Metadata | MetadataTuple
171
212
  >({
172
- transform: (x) => x,
173
- element: (x) => (x instanceof MetadataArray ? x.type.value : x),
174
- size: (input) => IdentifierFactory.access(input)("length"),
175
- front: (input) => ts.factory.createElementAccessExpression(input, 0),
176
- array: (input) => input,
177
- name: (m) => m.type.name,
178
- })(props);
213
+ config: props.config,
214
+ accessor: {
215
+ transform: (x) => x,
216
+ element: (x) => (x instanceof MetadataArray ? x.type.value : x),
217
+ size: (input) => IdentifierFactory.access(input)("length"),
218
+ front: (input) => ts.factory.createElementAccessExpression(input, 0),
219
+ array: (input) => input,
220
+ name: (m) => m.type.name,
221
+ },
222
+ parameters: props.parameters,
223
+ input: props.input,
224
+ definitions: props.definitions,
225
+ explore: props.explore,
226
+ });
179
227
  export namespace array_or_tuple {
180
- export type IProps = check_union_array_like.IProps<
228
+ export type IConfig = check_union_array_like.IConfig<
181
229
  MetadataArray | MetadataTuple,
182
230
  Metadata | MetadataTuple
183
231
  >;
184
232
  }
185
233
 
186
- export const set = (props: set.IProps) =>
234
+ export const set = (props: {
235
+ config: set.IConfig;
236
+ parameters: ts.ParameterDeclaration[];
237
+ input: ts.Expression;
238
+ sets: Metadata[];
239
+ explore: FeatureProgrammer.IExplore;
240
+ }) =>
187
241
  check_union_array_like<Metadata, MetadataArray, Metadata>({
188
- transform: (value: Metadata) =>
189
- MetadataArray.create({
190
- tags: [],
191
- type: MetadataArrayType.create({
192
- name: `Set<${value.getName()}>`,
193
- index: null,
194
- recursive: false,
195
- nullables: [],
196
- value,
242
+ config: props.config,
243
+ accessor: {
244
+ transform: (value: Metadata) =>
245
+ MetadataArray.create({
246
+ tags: [],
247
+ type: MetadataArrayType.create({
248
+ name: `Set<${value.getName()}>`,
249
+ index: null,
250
+ recursive: false,
251
+ nullables: [],
252
+ value,
253
+ }),
197
254
  }),
198
- }),
199
- element: (array) => array.type.value,
200
- size: (input) => IdentifierFactory.access(input)("size"),
201
- front: (input) =>
202
- IdentifierFactory.access(
203
- ts.factory.createCallExpression(
204
- IdentifierFactory.access(
205
- ts.factory.createCallExpression(
206
- IdentifierFactory.access(input)("values"),
207
- undefined,
208
- undefined,
209
- ),
210
- )("next"),
211
- undefined,
212
- undefined,
213
- ),
214
- )("value"),
215
- array: (input) =>
216
- ts.factory.createArrayLiteralExpression(
217
- [ts.factory.createSpreadElement(input)],
218
- false,
219
- ),
220
- name: (_m, e) => `Set<${e.getName()}>`,
221
- })(props);
222
- export namespace set {
223
- export type IProps = check_union_array_like.IProps<MetadataArray, Metadata>;
224
- }
225
-
226
- export const map = (props: map.IProps) =>
227
- check_union_array_like<Metadata.Entry, MetadataArray, [Metadata, Metadata]>(
228
- {
229
- element: (array) =>
230
- array.type.value.tuples[0]!.type.elements as [Metadata, Metadata],
255
+ element: (array) => array.type.value,
231
256
  size: (input) => IdentifierFactory.access(input)("size"),
232
257
  front: (input) =>
233
258
  IdentifierFactory.access(
234
259
  ts.factory.createCallExpression(
235
260
  IdentifierFactory.access(
236
261
  ts.factory.createCallExpression(
237
- IdentifierFactory.access(input)("entries"),
262
+ IdentifierFactory.access(input)("values"),
238
263
  undefined,
239
264
  undefined,
240
265
  ),
@@ -248,41 +273,93 @@ export namespace UnionExplorer {
248
273
  [ts.factory.createSpreadElement(input)],
249
274
  false,
250
275
  ),
251
- name: (_m, [k, v]) => `Map<${k.getName()}, ${v.getName()}>`,
252
- transform: (m: Metadata.Entry) =>
253
- MetadataArray.create({
254
- tags: [],
255
- type: MetadataArrayType.create({
256
- name: `Map<${m.key.getName()}, ${m.value.getName()}>`,
257
- index: null,
258
- recursive: false,
259
- nullables: [],
260
- value: Metadata.create({
261
- ...Metadata.initialize(),
262
- tuples: [
263
- (() => {
264
- const tuple = MetadataTuple.create({
265
- tags: [],
266
- type: MetadataTupleType.create({
267
- name: `[${m.key.getName()}, ${m.value.getName()}]`,
268
- index: null,
269
- recursive: false,
270
- nullables: [],
271
- elements: [m.key, m.value],
272
- }),
273
- });
274
- tuple.type.of_map = true;
275
- return tuple;
276
- })(),
277
- ],
276
+ name: (_m, e) => `Set<${e.getName()}>`,
277
+ },
278
+ parameters: props.parameters,
279
+ input: props.input,
280
+ definitions: props.sets,
281
+ explore: props.explore,
282
+ });
283
+ export namespace set {
284
+ export type IConfig = check_union_array_like.IConfig<
285
+ MetadataArray,
286
+ Metadata
287
+ >;
288
+ }
289
+
290
+ export const map = (props: {
291
+ config: map.IConfig;
292
+ parameters: ts.ParameterDeclaration[];
293
+ input: ts.Expression;
294
+ maps: Metadata.Entry[];
295
+ explore: FeatureProgrammer.IExplore;
296
+ }) =>
297
+ check_union_array_like<Metadata.Entry, MetadataArray, [Metadata, Metadata]>(
298
+ {
299
+ config: props.config,
300
+ accessor: {
301
+ element: (array) =>
302
+ array.type.value.tuples[0]!.type.elements as [Metadata, Metadata],
303
+ size: (input) => IdentifierFactory.access(input)("size"),
304
+ front: (input) =>
305
+ IdentifierFactory.access(
306
+ ts.factory.createCallExpression(
307
+ IdentifierFactory.access(
308
+ ts.factory.createCallExpression(
309
+ IdentifierFactory.access(input)("entries"),
310
+ undefined,
311
+ undefined,
312
+ ),
313
+ )("next"),
314
+ undefined,
315
+ undefined,
316
+ ),
317
+ )("value"),
318
+ array: (input) =>
319
+ ts.factory.createArrayLiteralExpression(
320
+ [ts.factory.createSpreadElement(input)],
321
+ false,
322
+ ),
323
+ name: (_m, [k, v]) => `Map<${k.getName()}, ${v.getName()}>`,
324
+ transform: (m: Metadata.Entry) =>
325
+ MetadataArray.create({
326
+ tags: [],
327
+ type: MetadataArrayType.create({
328
+ name: `Map<${m.key.getName()}, ${m.value.getName()}>`,
329
+ index: null,
330
+ recursive: false,
331
+ nullables: [],
332
+ value: Metadata.create({
333
+ ...Metadata.initialize(),
334
+ tuples: [
335
+ (() => {
336
+ const tuple = MetadataTuple.create({
337
+ tags: [],
338
+ type: MetadataTupleType.create({
339
+ name: `[${m.key.getName()}, ${m.value.getName()}]`,
340
+ index: null,
341
+ recursive: false,
342
+ nullables: [],
343
+ elements: [m.key, m.value],
344
+ }),
345
+ });
346
+ tuple.type.of_map = true;
347
+ return tuple;
348
+ })(),
349
+ ],
350
+ }),
278
351
  }),
279
352
  }),
280
- }),
353
+ },
354
+ parameters: props.parameters,
355
+ input: props.input,
356
+ definitions: props.maps,
357
+ explore: props.explore,
281
358
  },
282
- )(props);
359
+ );
283
360
 
284
361
  export namespace map {
285
- export type IProps = check_union_array_like.IProps<
362
+ export type IConfig = check_union_array_like.IConfig<
286
363
  MetadataArray,
287
364
  [Metadata, Metadata]
288
365
  >;
@@ -13,18 +13,18 @@ export namespace UnionPredicator {
13
13
  neighbour: boolean;
14
14
  }
15
15
 
16
- export const object = (targets: MetadataObject[]): Array<ISpecialized> => {
16
+ export const object = (objects: MetadataObject[]): Array<ISpecialized> => {
17
17
  // PROPERTY MATRIX
18
18
  const matrix: Map<string, Array<MetadataProperty | null>> = new Map();
19
- for (const obj of targets)
19
+ for (const obj of objects)
20
20
  for (const prop of obj.properties) {
21
21
  const key: string | null = prop.key.getSoleLiteral();
22
22
  if (key !== null)
23
23
  MapUtil.take(matrix)(key, () =>
24
- ArrayUtil.repeat(targets.length, () => null),
24
+ ArrayUtil.repeat(objects.length, () => null),
25
25
  );
26
26
  }
27
- targets.forEach((obj, i) => {
27
+ objects.forEach((obj, i) => {
28
28
  for (const prop of obj.properties) {
29
29
  const key: string | null = prop.key.getSoleLiteral();
30
30
  if (key !== null) matrix.get(key)![i] = prop;
@@ -33,7 +33,7 @@ export namespace UnionPredicator {
33
33
 
34
34
  // EXPLORE SPECIALIZERS
35
35
  const output: ISpecialized[] = [];
36
- targets.forEach((obj, i) => {
36
+ objects.forEach((obj, i) => {
37
37
  const children: ISpecializedProperty[] = [];
38
38
  obj.properties.forEach((prop) => {
39
39
  // MUST BE REQUIRED