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,152 +11,181 @@ import { check_number } from "./check_number";
11
11
  import { check_string } from "./check_string";
12
12
  import { check_template } from "./check_template";
13
13
 
14
- export const check_dynamic_key =
15
- (project: ITypiaContext) =>
16
- (importer: FunctionImporter) =>
17
- (input: ts.Expression, metadata: Metadata): ts.Expression => {
18
- // IF PURE STRING EXISTS, THEN SKIP VALIDATION
19
- if (
20
- (metadata.atomics.length !== 0 &&
21
- metadata.atomics.some(
22
- (a) =>
23
- a.type === "string" &&
24
- a.tags.filter((row) => row.every((t) => t.validate !== undefined))
25
- .length === 0,
26
- )) ||
27
- (metadata.natives.length !== 0 &&
28
- metadata.natives.some((type) => type === "String"))
29
- )
30
- return ts.factory.createTrue();
14
+ /**
15
+ * @internal
16
+ */
17
+ export const check_dynamic_key = (props: {
18
+ context: ITypiaContext;
19
+ importer: FunctionImporter;
20
+ metadata: Metadata;
21
+ input: ts.Expression;
22
+ }): ts.Expression => {
23
+ // IF PURE STRING EXISTS, THEN SKIP VALIDATION
24
+ if (
25
+ (props.metadata.atomics.length !== 0 &&
26
+ props.metadata.atomics.some(
27
+ (a) =>
28
+ a.type === "string" &&
29
+ a.tags.filter((row) => row.every((t) => t.validate !== undefined))
30
+ .length === 0,
31
+ )) ||
32
+ (props.metadata.natives.length !== 0 &&
33
+ props.metadata.natives.some((type) => type === "String"))
34
+ )
35
+ return ts.factory.createTrue();
31
36
 
32
- const conditions: ts.Expression[] = [];
37
+ const conditions: ts.Expression[] = [];
33
38
 
34
- // NULLISH COALESCING
35
- if (metadata.nullable === true)
39
+ // NULLISH COALESCING
40
+ if (props.metadata.nullable === true)
41
+ conditions.push(
42
+ ts.factory.createStrictEquality(
43
+ ts.factory.createStringLiteral("null"),
44
+ props.input,
45
+ ),
46
+ );
47
+ if (props.metadata.isRequired() === false)
48
+ conditions.push(
49
+ ts.factory.createStrictEquality(
50
+ ts.factory.createStringLiteral("undefined"),
51
+ props.input,
52
+ ),
53
+ );
54
+
55
+ // ATOMICS
56
+ for (const atom of props.metadata.atomics)
57
+ if (atom.type === "boolean")
36
58
  conditions.push(
37
- ts.factory.createStrictEquality(
38
- ts.factory.createStringLiteral("null"),
39
- input,
59
+ ts.factory.createLogicalOr(
60
+ ts.factory.createStrictEquality(
61
+ ts.factory.createStringLiteral("false"),
62
+ props.input,
63
+ ),
64
+ ts.factory.createStrictEquality(
65
+ ts.factory.createStringLiteral("true"),
66
+ props.input,
67
+ ),
40
68
  ),
41
69
  );
42
- if (metadata.isRequired() === false)
70
+ else if (atom.type === "bigint")
43
71
  conditions.push(
44
- ts.factory.createStrictEquality(
45
- ts.factory.createStringLiteral("undefined"),
46
- input,
47
- ),
48
- );
49
-
50
- // ATOMICS
51
- for (const atom of metadata.atomics)
52
- if (atom.type === "boolean")
53
- conditions.push(
54
- ts.factory.createLogicalOr(
55
- ts.factory.createStrictEquality(
56
- ts.factory.createStringLiteral("false"),
57
- input,
58
- ),
59
- ts.factory.createStrictEquality(
60
- ts.factory.createStringLiteral("true"),
61
- input,
62
- ),
63
- ),
64
- );
65
- else if (atom.type === "bigint")
66
- conditions.push(
67
- ts.factory.createLogicalAnd(
68
- ts.factory.createCallExpression(
69
- importer.use("is_bigint_string"),
70
- undefined,
71
- [input],
72
- ),
73
- atomist(
74
- check_bigint(project)(atom)(
75
- ts.factory.createCallExpression(
76
- ts.factory.createIdentifier("BigInt"),
77
- undefined,
78
- [input],
79
- ),
80
- ),
81
- ),
72
+ ts.factory.createLogicalAnd(
73
+ ts.factory.createCallExpression(
74
+ props.importer.use("is_bigint_string"),
75
+ undefined,
76
+ [props.input],
82
77
  ),
83
- );
84
- else if (atom.type === "number")
85
- conditions.push(
86
78
  atomist(
87
- check_number(project, true)(atom)(
88
- ts.factory.createCallExpression(
89
- ts.factory.createIdentifier("Number"),
79
+ check_bigint({
80
+ context: props.context,
81
+ atomic: atom,
82
+ input: ts.factory.createCallExpression(
83
+ ts.factory.createIdentifier("BigInt"),
90
84
  undefined,
91
- [input],
85
+ [props.input],
92
86
  ),
93
- ),
87
+ }),
94
88
  ),
95
- );
96
- else conditions.push(atomist(check_string(project)(atom)(input)));
89
+ ),
90
+ );
91
+ else if (atom.type === "number")
92
+ conditions.push(
93
+ atomist(
94
+ check_number({
95
+ context: props.context,
96
+ numeric: true,
97
+ atomic: atom,
98
+ input: ts.factory.createCallExpression(
99
+ ts.factory.createIdentifier("Number"),
100
+ undefined,
101
+ [props.input],
102
+ ),
103
+ }),
104
+ ),
105
+ );
106
+ else
107
+ conditions.push(
108
+ atomist(
109
+ check_string({
110
+ context: props.context,
111
+ atomic: atom,
112
+ input: props.input,
113
+ }),
114
+ ),
115
+ );
97
116
 
98
- // CONSTANTS
99
- for (const constant of metadata.constants)
100
- for (const { value } of constant.values)
101
- conditions.push(
102
- ts.factory.createStrictEquality(
103
- ts.factory.createStringLiteral(String(value)),
104
- input,
105
- ),
106
- );
117
+ // CONSTANTS
118
+ for (const constant of props.metadata.constants)
119
+ for (const { value } of constant.values)
120
+ conditions.push(
121
+ ts.factory.createStrictEquality(
122
+ ts.factory.createStringLiteral(String(value)),
123
+ props.input,
124
+ ),
125
+ );
107
126
 
108
- // TEMPLATES
109
- if (!!metadata.templates.length)
110
- conditions.push(atomist(check_template(metadata.templates)(input)));
127
+ // TEMPLATES
128
+ if (!!props.metadata.templates.length)
129
+ conditions.push(
130
+ atomist(
131
+ check_template({
132
+ templates: props.metadata.templates,
133
+ input: props.input,
134
+ }),
135
+ ),
136
+ );
111
137
 
112
- // NATIVES
113
- for (const native of metadata.natives)
114
- if (native === "Boolean")
115
- conditions.push(
116
- ts.factory.createLogicalOr(
117
- ts.factory.createStrictEquality(
118
- ts.factory.createStringLiteral("false"),
119
- input,
120
- ),
121
- ts.factory.createStrictEquality(
122
- ts.factory.createStringLiteral("true"),
123
- input,
124
- ),
138
+ // NATIVES
139
+ for (const native of props.metadata.natives)
140
+ if (native === "Boolean")
141
+ conditions.push(
142
+ ts.factory.createLogicalOr(
143
+ ts.factory.createStrictEquality(
144
+ ts.factory.createStringLiteral("false"),
145
+ props.input,
125
146
  ),
126
- );
127
- else if (native === "BigInt")
128
- conditions.push(
147
+ ts.factory.createStrictEquality(
148
+ ts.factory.createStringLiteral("true"),
149
+ props.input,
150
+ ),
151
+ ),
152
+ );
153
+ else if (native === "BigInt")
154
+ conditions.push(
155
+ ts.factory.createCallExpression(
156
+ props.importer.use("is_bigint_string"),
157
+ undefined,
158
+ [props.input],
159
+ ),
160
+ );
161
+ else if (native === "Number")
162
+ conditions.push(
163
+ ts.factory.createStrictEquality(
164
+ ts.factory.createFalse(),
129
165
  ts.factory.createCallExpression(
130
- importer.use("is_bigint_string"),
166
+ ts.factory.createIdentifier("Number.isNaN"),
131
167
  undefined,
132
- [input],
133
- ),
134
- );
135
- else if (native === "Number")
136
- conditions.push(
137
- ts.factory.createStrictEquality(
138
- ts.factory.createFalse(),
139
- ts.factory.createCallExpression(
140
- ts.factory.createIdentifier("Number.isNaN"),
141
- undefined,
142
- [
143
- ts.factory.createCallExpression(
144
- ts.factory.createIdentifier("Number"),
145
- undefined,
146
- [input],
147
- ),
148
- ],
149
- ),
168
+ [
169
+ ts.factory.createCallExpression(
170
+ ts.factory.createIdentifier("Number"),
171
+ undefined,
172
+ [props.input],
173
+ ),
174
+ ],
150
175
  ),
151
- );
176
+ ),
177
+ );
152
178
 
153
- return conditions.length === 0
154
- ? ts.factory.createTrue()
155
- : conditions.length === 1
156
- ? conditions[0]!
157
- : conditions.reduce(ts.factory.createLogicalOr);
158
- };
179
+ return conditions.length === 0
180
+ ? ts.factory.createTrue()
181
+ : conditions.length === 1
182
+ ? conditions[0]!
183
+ : conditions.reduce(ts.factory.createLogicalOr);
184
+ };
159
185
 
186
+ /**
187
+ * @internal
188
+ */
160
189
  const atomist = (entry: ICheckEntry) =>
161
190
  [
162
191
  ...(entry.expression ? [entry.expression] : []),
@@ -15,176 +15,174 @@ import { check_object } from "./check_object";
15
15
  /**
16
16
  * @internal
17
17
  */
18
- export const check_dynamic_properties =
19
- (props: check_object.IProps) =>
20
- (project: ITypiaContext) =>
21
- (importer: FunctionImporter) =>
22
- (
23
- input: ts.Expression,
24
- regular: IExpressionEntry<ts.Expression>[],
25
- dynamic: IExpressionEntry<ts.Expression>[],
26
- ): ts.Expression => {
27
- const length = IdentifierFactory.access(
28
- ts.factory.createCallExpression(
29
- ts.factory.createIdentifier("Object.keys"),
30
- undefined,
31
- [input],
32
- ),
33
- )("length");
34
- const left: ts.Expression | null =
35
- props.equals === true && dynamic.length === 0
36
- ? props.undefined === true || regular.every((r) => r.meta.isRequired())
37
- ? ts.factory.createStrictEquality(
18
+ export const check_dynamic_properties = (props: {
19
+ config: check_object.IConfig;
20
+ context: ITypiaContext;
21
+ importer: FunctionImporter;
22
+ regular: IExpressionEntry<ts.Expression>[];
23
+ dynamic: IExpressionEntry<ts.Expression>[];
24
+ input: ts.Expression;
25
+ }): ts.Expression => {
26
+ const length = IdentifierFactory.access(
27
+ ts.factory.createCallExpression(
28
+ ts.factory.createIdentifier("Object.keys"),
29
+ undefined,
30
+ [props.input],
31
+ ),
32
+ )("length");
33
+ const left: ts.Expression | null =
34
+ props.config.equals === true && props.dynamic.length === 0
35
+ ? props.config.undefined === true ||
36
+ props.regular.every((r) => r.meta.isRequired())
37
+ ? ts.factory.createStrictEquality(
38
+ ExpressionFactory.number(
39
+ props.regular.filter((r) => r.meta.isRequired()).length,
40
+ ),
41
+ length,
42
+ )
43
+ : ts.factory.createCallExpression(
44
+ props.importer.use("is_between"),
45
+ [],
46
+ [
47
+ length,
38
48
  ExpressionFactory.number(
39
- regular.filter((r) => r.meta.isRequired()).length,
49
+ props.regular.filter((r) => r.meta.isRequired()).length,
40
50
  ),
41
- length,
42
- )
43
- : ts.factory.createCallExpression(
44
- importer.use("is_between"),
45
- [],
46
- [
47
- length,
48
- ExpressionFactory.number(
49
- regular.filter((r) => r.meta.isRequired()).length,
50
- ),
51
- ExpressionFactory.number(regular.length),
52
- ],
53
- )
54
- : null;
55
- if (
56
- props.undefined === false &&
57
- left !== null &&
58
- regular.every((r) => r.meta.isRequired())
59
- )
60
- return left;
51
+ ExpressionFactory.number(props.regular.length),
52
+ ],
53
+ )
54
+ : null;
55
+ if (
56
+ left !== null &&
57
+ props.config.undefined === false &&
58
+ props.regular.every((r) => r.meta.isRequired())
59
+ )
60
+ return left;
61
61
 
62
- const criteria = props.entries
63
- ? ts.factory.createCallExpression(props.entries, undefined, [
62
+ const criteria: ts.CallExpression = props.config.entries
63
+ ? ts.factory.createCallExpression(props.config.entries, undefined, [
64
+ ts.factory.createCallExpression(
65
+ ts.factory.createIdentifier("Object.keys"),
66
+ undefined,
67
+ [props.input],
68
+ ),
69
+ check_dynamic_property(props),
70
+ ])
71
+ : ts.factory.createCallExpression(
72
+ IdentifierFactory.access(
64
73
  ts.factory.createCallExpression(
65
74
  ts.factory.createIdentifier("Object.keys"),
66
75
  undefined,
67
- [input],
68
- ),
69
- check_dynamic_property(props)(project)(importer)(
70
- input,
71
- regular,
72
- dynamic,
76
+ [props.input],
73
77
  ),
74
- ])
75
- : ts.factory.createCallExpression(
76
- IdentifierFactory.access(
77
- ts.factory.createCallExpression(
78
- ts.factory.createIdentifier("Object.keys"),
79
- undefined,
80
- [input],
81
- ),
82
- )(props.assert ? "every" : "map"),
83
- undefined,
84
- [
85
- check_dynamic_property(props)(project)(importer)(
86
- input,
87
- regular,
88
- dynamic,
89
- ),
90
- ],
91
- );
92
- const right: ts.Expression = (props.halt || ((elem) => elem))(
93
- props.assert ? criteria : check_everything(criteria),
94
- );
95
- return left
96
- ? (props.undefined
97
- ? ts.factory.createLogicalOr
98
- : ts.factory.createLogicalAnd)(left, right)
99
- : right;
100
- };
101
-
102
- const check_dynamic_property =
103
- (props: check_object.IProps) =>
104
- (project: ITypiaContext) =>
105
- (importer: FunctionImporter) =>
106
- (
107
- input: ts.Expression,
108
- regular: IExpressionEntry<ts.Expression>[],
109
- dynamic: IExpressionEntry<ts.Expression>[],
110
- ) => {
111
- //----
112
- // IF CONDITIONS
113
- //----
114
- // PREPARE ASSETS
115
- const key = ts.factory.createIdentifier("key");
116
- const value = ts.factory.createIdentifier("value");
117
-
118
- const statements: ts.Statement[] = [];
119
- const add = (exp: ts.Expression, output: ts.Expression) =>
120
- statements.push(
121
- ts.factory.createIfStatement(
122
- exp,
123
- ts.factory.createReturnStatement(output),
124
- ),
78
+ )(props.config.assert ? "every" : "map"),
79
+ undefined,
80
+ [check_dynamic_property(props)],
125
81
  );
126
- const broken = { value: false };
82
+ const right: ts.Expression = (props.config.halt || ((elem) => elem))(
83
+ props.config.assert ? criteria : check_everything(criteria),
84
+ );
85
+ return left
86
+ ? (props.config.undefined
87
+ ? ts.factory.createLogicalOr
88
+ : ts.factory.createLogicalAnd)(left, right)
89
+ : right;
90
+ };
91
+
92
+ /**
93
+ * @internal
94
+ */
95
+ const check_dynamic_property = (props: {
96
+ config: check_object.IConfig;
97
+ context: ITypiaContext;
98
+ importer: FunctionImporter;
99
+ regular: IExpressionEntry<ts.Expression>[];
100
+ dynamic: IExpressionEntry<ts.Expression>[];
101
+ input: ts.Expression;
102
+ }) => {
103
+ //----
104
+ // IF CONDITIONS
105
+ //----
106
+ // PREPARE ASSETS
107
+ const key = ts.factory.createIdentifier("key");
108
+ const value = ts.factory.createIdentifier("value");
127
109
 
128
- // GATHER CONDITIONS
129
- if (regular.length) add(is_regular_property(regular), props.positive);
110
+ const statements: ts.Statement[] = [];
111
+ const add = (expression: ts.Expression, output: ts.Expression) =>
130
112
  statements.push(
131
- StatementFactory.constant(
132
- "value",
133
- ts.factory.createElementAccessExpression(input, key),
113
+ ts.factory.createIfStatement(
114
+ expression,
115
+ ts.factory.createReturnStatement(output),
134
116
  ),
135
117
  );
136
- if (props.undefined === true)
137
- add(
138
- ts.factory.createStrictEquality(
139
- ts.factory.createIdentifier("undefined"),
140
- value,
141
- ),
142
- props.positive,
143
- );
118
+ const broken = { value: false };
144
119
 
145
- for (const entry of dynamic) {
146
- const condition: ts.Expression = check_dynamic_key(project)(importer)(
147
- key,
148
- entry.key,
149
- );
150
- if (condition.kind === ts.SyntaxKind.TrueKeyword) {
151
- statements.push(ts.factory.createReturnStatement(entry.expression));
152
- broken.value = true;
153
- break;
154
- } else add(condition, entry.expression);
155
- }
156
-
157
- //----
158
- // FUNCTION BODY
159
- //----
160
- // CLOSURE BLOCK
161
- const block: ts.Block = ts.factory.createBlock(
162
- [
163
- ...statements,
164
- ...(broken.value
165
- ? []
166
- : [
167
- ts.factory.createReturnStatement(
168
- props.equals === true
169
- ? props.superfluous(value)
170
- : props.positive,
171
- ),
172
- ]),
173
- ],
174
- true,
120
+ // GATHER CONDITIONS
121
+ if (props.regular.length)
122
+ add(is_regular_property(props.regular), props.config.positive);
123
+ statements.push(
124
+ StatementFactory.constant(
125
+ "value",
126
+ ts.factory.createElementAccessExpression(props.input, key),
127
+ ),
128
+ );
129
+ if (props.config.undefined === true)
130
+ add(
131
+ ts.factory.createStrictEquality(
132
+ ts.factory.createIdentifier("undefined"),
133
+ value,
134
+ ),
135
+ props.config.positive,
175
136
  );
176
137
 
177
- // RETURNS
178
- return ts.factory.createArrowFunction(
179
- undefined,
180
- undefined,
181
- [IdentifierFactory.parameter("key")],
182
- undefined,
183
- undefined,
184
- block,
185
- );
186
- };
138
+ for (const entry of props.dynamic) {
139
+ const condition: ts.Expression = check_dynamic_key({
140
+ context: props.context,
141
+ importer: props.importer,
142
+ metadata: entry.key,
143
+ input: key,
144
+ });
145
+ if (condition.kind === ts.SyntaxKind.TrueKeyword) {
146
+ statements.push(ts.factory.createReturnStatement(entry.expression));
147
+ broken.value = true;
148
+ break;
149
+ } else add(condition, entry.expression);
150
+ }
151
+
152
+ //----
153
+ // FUNCTION BODY
154
+ //----
155
+ // CLOSURE BLOCK
156
+ const block: ts.Block = ts.factory.createBlock(
157
+ [
158
+ ...statements,
159
+ ...(broken.value
160
+ ? []
161
+ : [
162
+ ts.factory.createReturnStatement(
163
+ props.config.equals === true
164
+ ? props.config.superfluous(value)
165
+ : props.config.positive,
166
+ ),
167
+ ]),
168
+ ],
169
+ true,
170
+ );
171
+
172
+ // RETURNS
173
+ return ts.factory.createArrowFunction(
174
+ undefined,
175
+ undefined,
176
+ [IdentifierFactory.parameter("key")],
177
+ undefined,
178
+ undefined,
179
+ block,
180
+ );
181
+ };
187
182
 
183
+ /**
184
+ * @internal
185
+ */
188
186
  const is_regular_property = (regular: IExpressionEntry[]) =>
189
187
  ts.factory.createCallExpression(
190
188
  IdentifierFactory.access(
@@ -5,17 +5,23 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory";
5
5
  /**
6
6
  * @internal
7
7
  */
8
- export const check_native = (type: string) => (input: ts.Expression) => {
9
- const instanceOf = ExpressionFactory.isInstanceOf(type)(input);
10
- return ATOMIC_LIKE.has(type)
8
+ export const check_native = (props: {
9
+ type: string;
10
+ input: ts.Expression;
11
+ }): ts.Expression => {
12
+ const instanceOf = ExpressionFactory.isInstanceOf(props.type)(props.input);
13
+ return ATOMIC_LIKE.has(props.type)
11
14
  ? ts.factory.createLogicalOr(
12
15
  ts.factory.createStrictEquality(
13
- ts.factory.createStringLiteral(type.toLowerCase()),
14
- ts.factory.createTypeOfExpression(input),
16
+ ts.factory.createStringLiteral(props.type.toLowerCase()),
17
+ ts.factory.createTypeOfExpression(props.input),
15
18
  ),
16
19
  instanceOf,
17
20
  )
18
21
  : instanceOf;
19
22
  };
20
23
 
24
+ /**
25
+ * @internal
26
+ */
21
27
  const ATOMIC_LIKE = new Set(["Boolean", "Number", "String"]);