typia 5.2.6 → 5.3.0-dev.20231112

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 (202) hide show
  1. package/lib/factories/ExpressionFactory.js +14 -16
  2. package/lib/factories/ExpressionFactory.js.map +1 -1
  3. package/lib/factories/JsonMetadataFactory.d.ts +1 -1
  4. package/lib/factories/JsonMetadataFactory.js +2 -2
  5. package/lib/factories/JsonMetadataFactory.js.map +1 -1
  6. package/lib/factories/LiteralFactory.js +2 -0
  7. package/lib/factories/LiteralFactory.js.map +1 -1
  8. package/lib/factories/MetadataCollection.d.ts +2 -2
  9. package/lib/factories/MetadataFactory.d.ts +1 -1
  10. package/lib/factories/MetadataFactory.js +236 -170
  11. package/lib/factories/MetadataFactory.js.map +1 -1
  12. package/lib/factories/NumericRangeFactory.d.ts +2 -2
  13. package/lib/factories/NumericRangeFactory.js +41 -21
  14. package/lib/factories/NumericRangeFactory.js.map +1 -1
  15. package/lib/factories/ProtobufFactory.d.ts +1 -1
  16. package/lib/factories/ProtobufFactory.js +2 -2
  17. package/lib/factories/ProtobufFactory.js.map +1 -1
  18. package/lib/factories/internal/metadata/MetadataHelper.js +3 -2
  19. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -1
  20. package/lib/factories/internal/metadata/iterate_metadata_constant.js +13 -8
  21. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -1
  22. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +8 -5
  23. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  24. package/lib/functional/$from.d.ts +3 -0
  25. package/lib/functional/$from.js +9 -0
  26. package/lib/functional/$from.js.map +1 -0
  27. package/lib/functional/Namespace.js +7 -0
  28. package/lib/functional/Namespace.js.map +1 -1
  29. package/lib/module.d.ts +1 -0
  30. package/lib/module.js +2 -5
  31. package/lib/module.js.map +1 -1
  32. package/lib/programmers/CheckerProgrammer.js +11 -16
  33. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  34. package/lib/programmers/RandomProgrammer.js +1 -1
  35. package/lib/programmers/RandomProgrammer.js.map +1 -1
  36. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  37. package/lib/programmers/http/HttpHeadersProgrammer.js +1 -1
  38. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  39. package/lib/programmers/http/HttpParameterProgrammer.js +1 -1
  40. package/lib/programmers/http/HttpParameterProgrammer.js.map +1 -1
  41. package/lib/programmers/http/HttpQueryProgrammer.js +1 -1
  42. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  43. package/lib/programmers/internal/application_array.js +8 -0
  44. package/lib/programmers/internal/application_array.js.map +1 -1
  45. package/lib/programmers/internal/application_number.js +8 -1
  46. package/lib/programmers/internal/application_number.js.map +1 -1
  47. package/lib/programmers/internal/application_string.js +8 -1
  48. package/lib/programmers/internal/application_string.js.map +1 -1
  49. package/lib/programmers/internal/check_array_length.js +7 -4
  50. package/lib/programmers/internal/check_array_length.js.map +1 -1
  51. package/lib/programmers/internal/check_bigint.js +7 -4
  52. package/lib/programmers/internal/check_bigint.js.map +1 -1
  53. package/lib/programmers/internal/check_number.js +7 -4
  54. package/lib/programmers/internal/check_number.js.map +1 -1
  55. package/lib/programmers/internal/check_string.js +7 -4
  56. package/lib/programmers/internal/check_string.js.map +1 -1
  57. package/lib/programmers/internal/metadata_to_pattern.js +3 -1
  58. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  59. package/lib/programmers/json/JsonAssertParseProgrammer.js +1 -1
  60. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  61. package/lib/programmers/json/JsonIsParseProgrammer.js +1 -1
  62. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  63. package/lib/programmers/json/JsonStringifyProgrammer.js +3 -8
  64. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  65. package/lib/programmers/json/JsonValidateParseProgrammer.js +1 -1
  66. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  67. package/lib/programmers/misc/MiscCloneProgrammer.js +19 -24
  68. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  69. package/lib/programmers/misc/MiscLiteralsProgrammer.js +1 -1
  70. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  71. package/lib/programmers/misc/MiscPruneProgrammer.js +11 -16
  72. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  73. package/lib/programmers/notations/NotationGeneralProgrammer.js +11 -16
  74. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  75. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +1 -1
  76. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  77. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +38 -42
  78. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  79. package/lib/programmers/protobuf/ProtobufMessageProgrammer.d.ts +1 -1
  80. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +22 -25
  81. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  82. package/lib/reflect.d.ts +3 -0
  83. package/lib/reflect.js +13 -0
  84. package/lib/reflect.js.map +1 -0
  85. package/lib/schemas/json/IJsonSchema.d.ts +1 -0
  86. package/lib/schemas/metadata/IMetadataApplication.d.ts +2 -2
  87. package/lib/schemas/metadata/{IMetadataCollection.d.ts → IMetadataComponents.d.ts} +1 -1
  88. package/lib/schemas/metadata/{IMetadataCollection.js → IMetadataComponents.js} +1 -1
  89. package/lib/schemas/metadata/IMetadataComponents.js.map +1 -0
  90. package/lib/schemas/metadata/IMetadataConstant.d.ts +1 -1
  91. package/lib/schemas/metadata/IMetadataTypeTag.d.ts +2 -2
  92. package/lib/schemas/metadata/Metadata.d.ts +2 -2
  93. package/lib/schemas/metadata/Metadata.js +82 -173
  94. package/lib/schemas/metadata/Metadata.js.map +1 -1
  95. package/lib/schemas/metadata/MetadataAlias.js +1 -1
  96. package/lib/schemas/metadata/MetadataAlias.js.map +1 -1
  97. package/lib/schemas/metadata/MetadataApplication.d.ts +13 -0
  98. package/lib/schemas/metadata/MetadataApplication.js +30 -0
  99. package/lib/schemas/metadata/MetadataApplication.js.map +1 -0
  100. package/lib/schemas/metadata/MetadataArrayType.js +1 -1
  101. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -1
  102. package/lib/schemas/metadata/MetadataAtomic.d.ts +3 -0
  103. package/lib/schemas/metadata/MetadataAtomic.js +42 -0
  104. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -1
  105. package/lib/schemas/metadata/MetadataComponents.d.ts +16 -0
  106. package/lib/schemas/metadata/MetadataComponents.js +151 -0
  107. package/lib/schemas/metadata/MetadataComponents.js.map +1 -0
  108. package/lib/schemas/metadata/MetadataConstant.d.ts +9 -1
  109. package/lib/schemas/metadata/MetadataConstant.js +29 -0
  110. package/lib/schemas/metadata/MetadataConstant.js.map +1 -1
  111. package/lib/schemas/metadata/MetadataEscaped.js +4 -4
  112. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -1
  113. package/lib/schemas/metadata/MetadataObject.js +2 -2
  114. package/lib/schemas/metadata/MetadataObject.js.map +1 -1
  115. package/lib/schemas/metadata/MetadataProperty.js +4 -4
  116. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  117. package/lib/schemas/metadata/MetadataTupleType.js +1 -1
  118. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -1
  119. package/lib/transformers/CallExpressionTransformer.js +5 -2
  120. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  121. package/lib/transformers/features/json/JsonApplicationTransformer.d.ts +1 -1
  122. package/lib/transformers/features/json/JsonApplicationTransformer.js +4 -5
  123. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  124. package/lib/transformers/features/reflect/ReflectMetadataTransformer.d.ts +5 -0
  125. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js +58 -0
  126. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js.map +1 -0
  127. package/package.json +2 -2
  128. package/src/Primitive.ts +135 -135
  129. package/src/executable/TypiaSetupWizard.ts +142 -142
  130. package/src/executable/setup/CommandExecutor.ts +8 -8
  131. package/src/factories/ExpressionFactory.ts +12 -13
  132. package/src/factories/JsonMetadataFactory.ts +53 -50
  133. package/src/factories/LiteralFactory.ts +2 -0
  134. package/src/factories/MetadataCollection.ts +282 -282
  135. package/src/factories/MetadataFactory.ts +55 -22
  136. package/src/factories/NumericRangeFactory.ts +56 -17
  137. package/src/factories/ProtobufFactory.ts +5 -2
  138. package/src/factories/internal/metadata/MetadataHelper.ts +7 -4
  139. package/src/factories/internal/metadata/emplace_metadata_object.ts +178 -178
  140. package/src/factories/internal/metadata/iterate_metadata_constant.ts +10 -8
  141. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +9 -8
  142. package/src/functional/$from.ts +5 -0
  143. package/src/functional/$stoll.ts +8 -8
  144. package/src/functional/Namespace.ts +175 -168
  145. package/src/module.ts +1 -19
  146. package/src/programmers/AssertProgrammer.ts +322 -322
  147. package/src/programmers/CheckerProgrammer.ts +16 -17
  148. package/src/programmers/IsProgrammer.ts +258 -258
  149. package/src/programmers/RandomProgrammer.ts +4 -1
  150. package/src/programmers/ValidateProgrammer.ts +350 -350
  151. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  152. package/src/programmers/helpers/ProtobufUtil.ts +3 -2
  153. package/src/programmers/http/HttpHeadersProgrammer.ts +4 -1
  154. package/src/programmers/http/HttpParameterProgrammer.ts +4 -1
  155. package/src/programmers/http/HttpQueryProgrammer.ts +4 -1
  156. package/src/programmers/internal/application_array.ts +8 -0
  157. package/src/programmers/internal/application_number.ts +8 -1
  158. package/src/programmers/internal/application_string.ts +8 -1
  159. package/src/programmers/internal/check_array_length.ts +5 -2
  160. package/src/programmers/internal/check_bigint.ts +5 -2
  161. package/src/programmers/internal/check_dynamic_key.ts +178 -178
  162. package/src/programmers/internal/check_dynamic_properties.ts +202 -202
  163. package/src/programmers/internal/check_number.ts +5 -2
  164. package/src/programmers/internal/check_object.ts +62 -62
  165. package/src/programmers/internal/check_string.ts +5 -3
  166. package/src/programmers/internal/metadata_to_pattern.ts +3 -1
  167. package/src/programmers/json/JsonAssertParseProgrammer.ts +1 -0
  168. package/src/programmers/json/JsonIsParseProgrammer.ts +1 -0
  169. package/src/programmers/json/JsonStringifyProgrammer.ts +959 -960
  170. package/src/programmers/json/JsonValidateParseProgrammer.ts +1 -0
  171. package/src/programmers/misc/MiscCloneProgrammer.ts +787 -786
  172. package/src/programmers/misc/MiscLiteralsProgrammer.ts +4 -1
  173. package/src/programmers/misc/MiscPruneProgrammer.ts +549 -548
  174. package/src/programmers/notations/NotationGeneralProgrammer.ts +717 -716
  175. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +1 -0
  176. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +872 -882
  177. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +21 -21
  178. package/src/reflect.ts +24 -0
  179. package/src/schemas/json/IJsonSchema.ts +1 -0
  180. package/src/schemas/metadata/IMetadataApplication.ts +2 -2
  181. package/src/schemas/metadata/{IMetadataCollection.ts → IMetadataComponents.ts} +1 -1
  182. package/src/schemas/metadata/IMetadataConstant.ts +1 -1
  183. package/src/schemas/metadata/IMetadataTypeTag.ts +9 -2
  184. package/src/schemas/metadata/Metadata.ts +18 -91
  185. package/src/schemas/metadata/MetadataAlias.ts +1 -1
  186. package/src/schemas/metadata/MetadataApplication.ts +44 -0
  187. package/src/schemas/metadata/MetadataArrayType.ts +1 -1
  188. package/src/schemas/metadata/MetadataAtomic.ts +44 -0
  189. package/src/schemas/metadata/MetadataComponents.ts +98 -0
  190. package/src/schemas/metadata/MetadataConstant.ts +44 -1
  191. package/src/schemas/metadata/MetadataEscaped.ts +4 -4
  192. package/src/schemas/metadata/MetadataObject.ts +2 -2
  193. package/src/schemas/metadata/MetadataProperty.ts +4 -7
  194. package/src/schemas/metadata/MetadataTupleType.ts +1 -1
  195. package/src/transform.ts +35 -35
  196. package/src/transformers/CallExpressionTransformer.ts +5 -2
  197. package/src/transformers/features/json/JsonApplicationTransformer.ts +7 -4
  198. package/src/transformers/features/{misc/MetadataTransformer.ts → reflect/ReflectMetadataTransformer.ts} +25 -8
  199. package/lib/schemas/metadata/IMetadataCollection.js.map +0 -1
  200. package/lib/transformers/features/misc/MetadataTransformer.d.ts +0 -5
  201. package/lib/transformers/features/misc/MetadataTransformer.js +0 -55
  202. package/lib/transformers/features/misc/MetadataTransformer.js.map +0 -1
@@ -1,31 +1,31 @@
1
- import { Metadata } from "../../schemas/metadata/Metadata";
2
-
3
- import { Atomic } from "../../typings/Atomic";
4
-
5
- import { ArrayUtil } from "../../utils/ArrayUtil";
6
-
7
- export namespace AtomicPredicator {
8
- export const constant =
9
- (meta: Metadata) =>
10
- (name: Atomic.Literal): boolean =>
11
- !ArrayUtil.has(meta.atomics, (a) => a.type === name) &&
12
- !ArrayUtil.has(
13
- meta.natives,
14
- (native) => native.toLowerCase() === name,
15
- );
16
-
17
- export const atomic =
18
- (meta: Metadata) =>
19
- (name: Atomic.Literal): boolean =>
20
- !ArrayUtil.has(
21
- meta.natives,
22
- (native) => native.toLowerCase() === name,
23
- );
24
-
25
- export const native = (name: string) => LIKE.has(name.toLowerCase());
26
-
27
- export const template = (meta: Metadata): boolean =>
28
- !ArrayUtil.has(meta.atomics, (a) => a.type === "string");
29
- }
30
-
31
- const LIKE = new Set(["boolean", "bigint", "number", "string"]);
1
+ import { Metadata } from "../../schemas/metadata/Metadata";
2
+
3
+ import { Atomic } from "../../typings/Atomic";
4
+
5
+ import { ArrayUtil } from "../../utils/ArrayUtil";
6
+
7
+ export namespace AtomicPredicator {
8
+ export const constant =
9
+ (meta: Metadata) =>
10
+ (name: Atomic.Literal): boolean =>
11
+ !ArrayUtil.has(meta.atomics, (a) => a.type === name) &&
12
+ !ArrayUtil.has(
13
+ meta.natives,
14
+ (native) => native.toLowerCase() === name,
15
+ );
16
+
17
+ export const atomic =
18
+ (meta: Metadata) =>
19
+ (name: Atomic.Literal): boolean =>
20
+ !ArrayUtil.has(
21
+ meta.natives,
22
+ (native) => native.toLowerCase() === name,
23
+ );
24
+
25
+ export const native = (name: string) => LIKE.has(name.toLowerCase());
26
+
27
+ export const template = (meta: Metadata): boolean =>
28
+ !ArrayUtil.has(meta.atomics, (a) => a.type === "string");
29
+ }
30
+
31
+ const LIKE = new Set(["boolean", "bigint", "number", "string"]);
@@ -26,7 +26,7 @@ export namespace ProtobufUtil {
26
26
  if (c.type === "boolean") set.add("bool");
27
27
  else if (c.type === "bigint") set.add("uint64");
28
28
  else if (c.type === "number")
29
- set.add(deduce_numeric_type(c.values));
29
+ set.add(deduce_numeric_type(c.values as number[]));
30
30
  else if (c.type === "string") set.add("string");
31
31
  for (const atomic of meta.atomics)
32
32
  if (atomic.type === "boolean") set.add("bool");
@@ -42,7 +42,8 @@ export namespace ProtobufUtil {
42
42
  export const getNumbers = (meta: Metadata) => {
43
43
  const set: Set<ProtobufAtomic.Numeric> = new Set();
44
44
  for (const c of meta.constants)
45
- if (c.type === "number") set.add(deduce_numeric_type(c.values));
45
+ if (c.type === "number")
46
+ set.add(deduce_numeric_type(c.values as number[]));
46
47
  for (const atomic of meta.atomics)
47
48
  if (atomic.type === "number")
48
49
  decode_number(atomic.tags).forEach((t) => set.add(t));
@@ -35,7 +35,10 @@ export namespace HttpHeadersProgrammer {
35
35
  modulo.getText(),
36
36
  );
37
37
  const collection: MetadataCollection = new MetadataCollection();
38
- const result = MetadataFactory.analyze(project.checker)({
38
+ const result = MetadataFactory.analyze(
39
+ project.checker,
40
+ project.context,
41
+ )({
39
42
  escape: false,
40
43
  constant: true,
41
44
  absorb: true,
@@ -20,7 +20,10 @@ export namespace HttpParameterProgrammer {
20
20
  (project: IProject) =>
21
21
  (modulo: ts.LeftHandSideExpression) =>
22
22
  (type: ts.Type, name?: string): ts.ArrowFunction => {
23
- const result = MetadataFactory.analyze(project.checker)({
23
+ const result = MetadataFactory.analyze(
24
+ project.checker,
25
+ project.context,
26
+ )({
24
27
  escape: false,
25
28
  constant: true,
26
29
  absorb: true,
@@ -33,7 +33,10 @@ export namespace HttpQueryProgrammer {
33
33
  modulo.getText(),
34
34
  );
35
35
  const collection: MetadataCollection = new MetadataCollection();
36
- const result = MetadataFactory.analyze(project.checker)({
36
+ const result = MetadataFactory.analyze(
37
+ project.checker,
38
+ project.context,
39
+ )({
37
40
  escape: false,
38
41
  constant: true,
39
42
  absorb: true,
@@ -49,5 +49,13 @@ const application_array_tags =
49
49
  schema.minItems = tag.value;
50
50
  else if (tag.kind === "maxItems" && typeof tag.value === "number")
51
51
  schema.maxItems = tag.value;
52
+ schema["x-typia-typeTags"] = row.map((tag) => ({
53
+ target: tag.target,
54
+ name: tag.name,
55
+ kind: tag.kind,
56
+ value: tag.value,
57
+ validate: tag.validate,
58
+ exclusive: tag.exclusive,
59
+ }));
52
60
  return schema;
53
61
  };
@@ -85,6 +85,13 @@ const application_number_tags =
85
85
  else if (tag.kind === "default" && typeof tag.value === "number")
86
86
  base.default = tag.value;
87
87
  }
88
- base["x-typia-typeTags"] = row;
88
+ base["x-typia-typeTags"] = row.map((tag) => ({
89
+ target: tag.target,
90
+ name: tag.name,
91
+ kind: tag.kind,
92
+ value: tag.value,
93
+ validate: tag.validate,
94
+ exclusive: tag.exclusive,
95
+ }));
89
96
  return base;
90
97
  };
@@ -49,6 +49,13 @@ const application_string_tags =
49
49
  else if (tag.kind === "pattern") base.pattern = tag.value;
50
50
  else if (tag.kind === "default" && typeof tag.value === "string")
51
51
  base.default = tag.value;
52
- base["x-typia-typeTags"] = row;
52
+ base["x-typia-typeTags"] = row.map((tag) => ({
53
+ target: tag.target,
54
+ name: tag.name,
55
+ kind: tag.kind,
56
+ value: tag.value,
57
+ validate: tag.validate,
58
+ exclusive: tag.exclusive,
59
+ }));
53
60
  return base;
54
61
  };
@@ -37,8 +37,11 @@ const check_string_type_tags =
37
37
  .map((row) =>
38
38
  row.map((tag) => ({
39
39
  expected: `Array<> & ${tag.name}`,
40
- expression: ExpressionFactory.transpile(project.context)(
41
- tag.validate!,
40
+ expression: (
41
+ tag.predicate ??
42
+ ExpressionFactory.transpile(project.context)(
43
+ tag.validate!,
44
+ )
42
45
  )(input),
43
46
  })),
44
47
  );
@@ -41,8 +41,11 @@ const check_bigint_type_tags =
41
41
  .map((row) =>
42
42
  row.map((tag) => ({
43
43
  expected: `bigint & ${tag.name}`,
44
- expression: ExpressionFactory.transpile(project.context)(
45
- tag.validate!,
44
+ expression: (
45
+ tag.predicate ??
46
+ ExpressionFactory.transpile(project.context)(
47
+ tag.validate!,
48
+ )
46
49
  )(input),
47
50
  })),
48
51
  );
@@ -1,178 +1,178 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../../schemas/metadata/Metadata";
4
-
5
- import { IProject } from "../../transformers/IProject";
6
-
7
- import { FunctionImporter } from "../helpers/FunctionImporeter";
8
- import { ICheckEntry } from "../helpers/ICheckEntry";
9
- import { check_bigint } from "./check_bigint";
10
- import { check_number } from "./check_number";
11
- import { check_string } from "./check_string";
12
- import { check_template } from "./check_template";
13
-
14
- export const check_dynamic_key =
15
- (project: IProject) =>
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) =>
25
- row.every((t) => t.validate !== undefined),
26
- ).length === 0,
27
- )) ||
28
- (metadata.natives.length !== 0 &&
29
- metadata.natives.some((type) => type === "String"))
30
- )
31
- return ts.factory.createTrue();
32
-
33
- const conditions: ts.Expression[] = [];
34
-
35
- // NULLISH COALESCING
36
- if (metadata.nullable === true)
37
- conditions.push(
38
- ts.factory.createStrictEquality(
39
- ts.factory.createStringLiteral("null"),
40
- input,
41
- ),
42
- );
43
- if (metadata.isRequired() === false)
44
- conditions.push(
45
- ts.factory.createStrictEquality(
46
- ts.factory.createStringLiteral("undefined"),
47
- input,
48
- ),
49
- );
50
-
51
- // ATOMICS
52
- for (const atom of metadata.atomics)
53
- if (atom.type === "boolean")
54
- conditions.push(
55
- ts.factory.createLogicalOr(
56
- ts.factory.createStrictEquality(
57
- ts.factory.createStringLiteral("false"),
58
- input,
59
- ),
60
- ts.factory.createStrictEquality(
61
- ts.factory.createStringLiteral("true"),
62
- input,
63
- ),
64
- ),
65
- );
66
- else if (atom.type === "bigint")
67
- conditions.push(
68
- ts.factory.createLogicalAnd(
69
- ts.factory.createCallExpression(
70
- importer.use("is_bigint_string"),
71
- undefined,
72
- [input],
73
- ),
74
- atomist(
75
- check_bigint(project)(atom)(
76
- ts.factory.createCallExpression(
77
- ts.factory.createIdentifier("BigInt"),
78
- undefined,
79
- [input],
80
- ),
81
- ),
82
- ),
83
- ),
84
- );
85
- else if (atom.type === "number")
86
- conditions.push(
87
- atomist(
88
- check_number(project, true)(atom)(
89
- ts.factory.createCallExpression(
90
- ts.factory.createIdentifier("Number"),
91
- undefined,
92
- [input],
93
- ),
94
- ),
95
- ),
96
- );
97
- else conditions.push(atomist(check_string(project)(atom)(input)));
98
-
99
- // CONSTANTS
100
- for (const constant of metadata.constants)
101
- for (const value of constant.values)
102
- conditions.push(
103
- ts.factory.createStrictEquality(
104
- ts.factory.createStringLiteral(String(value)),
105
- input,
106
- ),
107
- );
108
-
109
- // TEMPLATES
110
- if (!!metadata.templates.length)
111
- conditions.push(atomist(check_template(metadata.templates)(input)));
112
-
113
- // NATIVES
114
- for (const native of metadata.natives)
115
- if (native === "Boolean")
116
- conditions.push(
117
- ts.factory.createLogicalOr(
118
- ts.factory.createStrictEquality(
119
- ts.factory.createStringLiteral("false"),
120
- input,
121
- ),
122
- ts.factory.createStrictEquality(
123
- ts.factory.createStringLiteral("true"),
124
- input,
125
- ),
126
- ),
127
- );
128
- else if (native === "BigInt")
129
- conditions.push(
130
- ts.factory.createCallExpression(
131
- importer.use("is_bigint_string"),
132
- undefined,
133
- [input],
134
- ),
135
- );
136
- else if (native === "Number")
137
- conditions.push(
138
- ts.factory.createStrictEquality(
139
- ts.factory.createFalse(),
140
- ts.factory.createCallExpression(
141
- ts.factory.createIdentifier("Number.isNaN"),
142
- undefined,
143
- [
144
- ts.factory.createCallExpression(
145
- ts.factory.createIdentifier("Number"),
146
- undefined,
147
- [input],
148
- ),
149
- ],
150
- ),
151
- ),
152
- );
153
-
154
- return conditions.length === 0
155
- ? ts.factory.createTrue()
156
- : conditions.length === 1
157
- ? conditions[0]!
158
- : conditions.reduce(ts.factory.createLogicalOr);
159
- };
160
-
161
- const atomist = (entry: ICheckEntry) => {
162
- return [
163
- ...(entry.expression ? [entry.expression] : []),
164
- ...(entry.conditions.length === 0
165
- ? []
166
- : [
167
- entry.conditions
168
- .map((set) =>
169
- set
170
- .map((s) => s.expression)
171
- .reduce((a, b) =>
172
- ts.factory.createLogicalAnd(a, b),
173
- ),
174
- )
175
- .reduce((a, b) => ts.factory.createLogicalOr(a, b)),
176
- ]),
177
- ].reduce((x, y) => ts.factory.createLogicalAnd(x, y));
178
- };
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../schemas/metadata/Metadata";
4
+
5
+ import { IProject } from "../../transformers/IProject";
6
+
7
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
8
+ import { ICheckEntry } from "../helpers/ICheckEntry";
9
+ import { check_bigint } from "./check_bigint";
10
+ import { check_number } from "./check_number";
11
+ import { check_string } from "./check_string";
12
+ import { check_template } from "./check_template";
13
+
14
+ export const check_dynamic_key =
15
+ (project: IProject) =>
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) =>
25
+ row.every((t) => t.validate !== undefined),
26
+ ).length === 0,
27
+ )) ||
28
+ (metadata.natives.length !== 0 &&
29
+ metadata.natives.some((type) => type === "String"))
30
+ )
31
+ return ts.factory.createTrue();
32
+
33
+ const conditions: ts.Expression[] = [];
34
+
35
+ // NULLISH COALESCING
36
+ if (metadata.nullable === true)
37
+ conditions.push(
38
+ ts.factory.createStrictEquality(
39
+ ts.factory.createStringLiteral("null"),
40
+ input,
41
+ ),
42
+ );
43
+ if (metadata.isRequired() === false)
44
+ conditions.push(
45
+ ts.factory.createStrictEquality(
46
+ ts.factory.createStringLiteral("undefined"),
47
+ input,
48
+ ),
49
+ );
50
+
51
+ // ATOMICS
52
+ for (const atom of metadata.atomics)
53
+ if (atom.type === "boolean")
54
+ conditions.push(
55
+ ts.factory.createLogicalOr(
56
+ ts.factory.createStrictEquality(
57
+ ts.factory.createStringLiteral("false"),
58
+ input,
59
+ ),
60
+ ts.factory.createStrictEquality(
61
+ ts.factory.createStringLiteral("true"),
62
+ input,
63
+ ),
64
+ ),
65
+ );
66
+ else if (atom.type === "bigint")
67
+ conditions.push(
68
+ ts.factory.createLogicalAnd(
69
+ ts.factory.createCallExpression(
70
+ importer.use("is_bigint_string"),
71
+ undefined,
72
+ [input],
73
+ ),
74
+ atomist(
75
+ check_bigint(project)(atom)(
76
+ ts.factory.createCallExpression(
77
+ ts.factory.createIdentifier("BigInt"),
78
+ undefined,
79
+ [input],
80
+ ),
81
+ ),
82
+ ),
83
+ ),
84
+ );
85
+ else if (atom.type === "number")
86
+ conditions.push(
87
+ atomist(
88
+ check_number(project, true)(atom)(
89
+ ts.factory.createCallExpression(
90
+ ts.factory.createIdentifier("Number"),
91
+ undefined,
92
+ [input],
93
+ ),
94
+ ),
95
+ ),
96
+ );
97
+ else conditions.push(atomist(check_string(project)(atom)(input)));
98
+
99
+ // CONSTANTS
100
+ for (const constant of metadata.constants)
101
+ for (const value of constant.values)
102
+ conditions.push(
103
+ ts.factory.createStrictEquality(
104
+ ts.factory.createStringLiteral(String(value)),
105
+ input,
106
+ ),
107
+ );
108
+
109
+ // TEMPLATES
110
+ if (!!metadata.templates.length)
111
+ conditions.push(atomist(check_template(metadata.templates)(input)));
112
+
113
+ // NATIVES
114
+ for (const native of metadata.natives)
115
+ if (native === "Boolean")
116
+ conditions.push(
117
+ ts.factory.createLogicalOr(
118
+ ts.factory.createStrictEquality(
119
+ ts.factory.createStringLiteral("false"),
120
+ input,
121
+ ),
122
+ ts.factory.createStrictEquality(
123
+ ts.factory.createStringLiteral("true"),
124
+ input,
125
+ ),
126
+ ),
127
+ );
128
+ else if (native === "BigInt")
129
+ conditions.push(
130
+ ts.factory.createCallExpression(
131
+ importer.use("is_bigint_string"),
132
+ undefined,
133
+ [input],
134
+ ),
135
+ );
136
+ else if (native === "Number")
137
+ conditions.push(
138
+ ts.factory.createStrictEquality(
139
+ ts.factory.createFalse(),
140
+ ts.factory.createCallExpression(
141
+ ts.factory.createIdentifier("Number.isNaN"),
142
+ undefined,
143
+ [
144
+ ts.factory.createCallExpression(
145
+ ts.factory.createIdentifier("Number"),
146
+ undefined,
147
+ [input],
148
+ ),
149
+ ],
150
+ ),
151
+ ),
152
+ );
153
+
154
+ return conditions.length === 0
155
+ ? ts.factory.createTrue()
156
+ : conditions.length === 1
157
+ ? conditions[0]!
158
+ : conditions.reduce(ts.factory.createLogicalOr);
159
+ };
160
+
161
+ const atomist = (entry: ICheckEntry) => {
162
+ return [
163
+ ...(entry.expression ? [entry.expression] : []),
164
+ ...(entry.conditions.length === 0
165
+ ? []
166
+ : [
167
+ entry.conditions
168
+ .map((set) =>
169
+ set
170
+ .map((s) => s.expression)
171
+ .reduce((a, b) =>
172
+ ts.factory.createLogicalAnd(a, b),
173
+ ),
174
+ )
175
+ .reduce((a, b) => ts.factory.createLogicalOr(a, b)),
176
+ ]),
177
+ ].reduce((x, y) => ts.factory.createLogicalAnd(x, y));
178
+ };