typia 5.2.6-dev.20231108 → 5.2.7-dev.20231109

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 (125) 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/MetadataFactory.d.ts +1 -1
  9. package/lib/factories/MetadataFactory.js +233 -168
  10. package/lib/factories/MetadataFactory.js.map +1 -1
  11. package/lib/factories/NumericRangeFactory.d.ts +2 -2
  12. package/lib/factories/NumericRangeFactory.js +41 -21
  13. package/lib/factories/NumericRangeFactory.js.map +1 -1
  14. package/lib/factories/ProtobufFactory.d.ts +1 -1
  15. package/lib/factories/ProtobufFactory.js +2 -2
  16. package/lib/factories/ProtobufFactory.js.map +1 -1
  17. package/lib/programmers/CheckerProgrammer.js +11 -16
  18. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  19. package/lib/programmers/RandomProgrammer.js +1 -1
  20. package/lib/programmers/RandomProgrammer.js.map +1 -1
  21. package/lib/programmers/http/HttpHeadersProgrammer.js +1 -1
  22. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  23. package/lib/programmers/http/HttpParameterProgrammer.js +1 -1
  24. package/lib/programmers/http/HttpParameterProgrammer.js.map +1 -1
  25. package/lib/programmers/http/HttpQueryProgrammer.js +1 -1
  26. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  27. package/lib/programmers/internal/application_array.js +8 -0
  28. package/lib/programmers/internal/application_array.js.map +1 -1
  29. package/lib/programmers/internal/application_number.js +8 -1
  30. package/lib/programmers/internal/application_number.js.map +1 -1
  31. package/lib/programmers/internal/application_string.js +8 -1
  32. package/lib/programmers/internal/application_string.js.map +1 -1
  33. package/lib/programmers/internal/check_array_length.js +7 -4
  34. package/lib/programmers/internal/check_array_length.js.map +1 -1
  35. package/lib/programmers/internal/check_bigint.js +7 -4
  36. package/lib/programmers/internal/check_bigint.js.map +1 -1
  37. package/lib/programmers/internal/check_number.js +7 -4
  38. package/lib/programmers/internal/check_number.js.map +1 -1
  39. package/lib/programmers/internal/check_string.js.map +1 -1
  40. package/lib/programmers/json/JsonAssertParseProgrammer.js +1 -1
  41. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  42. package/lib/programmers/json/JsonIsParseProgrammer.js +1 -1
  43. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  44. package/lib/programmers/json/JsonStringifyProgrammer.js +3 -8
  45. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  46. package/lib/programmers/json/JsonValidateParseProgrammer.js +1 -1
  47. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  48. package/lib/programmers/misc/MiscCloneProgrammer.js +19 -24
  49. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  50. package/lib/programmers/misc/MiscLiteralsProgrammer.js +1 -1
  51. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  52. package/lib/programmers/misc/MiscPruneProgrammer.js +11 -16
  53. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  54. package/lib/programmers/notations/NotationGeneralProgrammer.js +11 -16
  55. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  56. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +1 -1
  57. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  58. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +38 -42
  59. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  60. package/lib/programmers/protobuf/ProtobufMessageProgrammer.d.ts +1 -1
  61. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +22 -25
  62. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  63. package/lib/schemas/json/IJsonSchema.d.ts +1 -0
  64. package/lib/schemas/metadata/Metadata.js +1 -6
  65. package/lib/schemas/metadata/Metadata.js.map +1 -1
  66. package/lib/schemas/metadata/MetadataAtomic.d.ts +2 -0
  67. package/lib/schemas/metadata/MetadataAtomic.js +15 -0
  68. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -1
  69. package/lib/transformers/features/json/JsonApplicationTransformer.d.ts +1 -1
  70. package/lib/transformers/features/json/JsonApplicationTransformer.js +4 -5
  71. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  72. package/lib/transformers/features/misc/MetadataTransformer.d.ts +1 -1
  73. package/lib/transformers/features/misc/MetadataTransformer.js +3 -4
  74. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  75. package/package.json +2 -2
  76. package/src/Primitive.ts +135 -135
  77. package/src/executable/TypiaSetupWizard.ts +142 -142
  78. package/src/executable/setup/CommandExecutor.ts +8 -8
  79. package/src/factories/ExpressionFactory.ts +12 -13
  80. package/src/factories/JsonMetadataFactory.ts +53 -50
  81. package/src/factories/LiteralFactory.ts +2 -0
  82. package/src/factories/MetadataCollection.ts +282 -282
  83. package/src/factories/MetadataFactory.ts +48 -18
  84. package/src/factories/NumericRangeFactory.ts +56 -17
  85. package/src/factories/ProtobufFactory.ts +5 -2
  86. package/src/factories/internal/metadata/emplace_metadata_object.ts +178 -178
  87. package/src/functional/$stoll.ts +8 -8
  88. package/src/functional/Namespace.ts +168 -168
  89. package/src/programmers/AssertProgrammer.ts +322 -322
  90. package/src/programmers/CheckerProgrammer.ts +16 -17
  91. package/src/programmers/IsProgrammer.ts +258 -258
  92. package/src/programmers/RandomProgrammer.ts +4 -1
  93. package/src/programmers/ValidateProgrammer.ts +350 -350
  94. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  95. package/src/programmers/http/HttpHeadersProgrammer.ts +4 -1
  96. package/src/programmers/http/HttpParameterProgrammer.ts +4 -1
  97. package/src/programmers/http/HttpQueryProgrammer.ts +4 -1
  98. package/src/programmers/internal/application_array.ts +8 -0
  99. package/src/programmers/internal/application_number.ts +8 -1
  100. package/src/programmers/internal/application_string.ts +8 -1
  101. package/src/programmers/internal/check_array_length.ts +5 -2
  102. package/src/programmers/internal/check_bigint.ts +5 -2
  103. package/src/programmers/internal/check_dynamic_key.ts +178 -178
  104. package/src/programmers/internal/check_dynamic_properties.ts +202 -202
  105. package/src/programmers/internal/check_number.ts +5 -2
  106. package/src/programmers/internal/check_object.ts +62 -62
  107. package/src/programmers/internal/check_string.ts +0 -1
  108. package/src/programmers/json/JsonAssertParseProgrammer.ts +1 -0
  109. package/src/programmers/json/JsonIsParseProgrammer.ts +1 -0
  110. package/src/programmers/json/JsonStringifyProgrammer.ts +959 -960
  111. package/src/programmers/json/JsonValidateParseProgrammer.ts +1 -0
  112. package/src/programmers/misc/MiscCloneProgrammer.ts +787 -786
  113. package/src/programmers/misc/MiscLiteralsProgrammer.ts +4 -1
  114. package/src/programmers/misc/MiscPruneProgrammer.ts +549 -548
  115. package/src/programmers/notations/NotationGeneralProgrammer.ts +717 -716
  116. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +1 -0
  117. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +872 -882
  118. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +21 -21
  119. package/src/schemas/json/IJsonSchema.ts +1 -0
  120. package/src/schemas/metadata/IMetadataTypeTag.ts +7 -0
  121. package/src/schemas/metadata/Metadata.ts +1 -6
  122. package/src/schemas/metadata/MetadataAtomic.ts +17 -0
  123. package/src/transform.ts +35 -35
  124. package/src/transformers/features/json/JsonApplicationTransformer.ts +7 -4
  125. package/src/transformers/features/misc/MetadataTransformer.ts +6 -3
@@ -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"]);
@@ -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
+ };