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
@@ -12,96 +12,100 @@ import { OptionPredicator } from "../helpers/OptionPredicator";
12
12
  /**
13
13
  * @internal
14
14
  */
15
- export const check_number =
16
- (project: ITypiaContext, numeric: boolean) =>
17
- (atomic: MetadataAtomic) =>
18
- (input: ts.Expression): ICheckEntry => {
19
- const base = ts.factory.createStrictEquality(
20
- ts.factory.createStringLiteral("number"),
21
- ts.factory.createTypeOfExpression(input),
22
- );
23
- const addition: ts.Expression | null =
24
- numeric === true
25
- ? OptionPredicator.finite(project.options)
26
- ? ts.factory.createCallExpression(
27
- ts.factory.createIdentifier("Number.isFinite"),
28
- undefined,
29
- [input],
15
+ export const check_number = (props: {
16
+ numeric: boolean;
17
+ context: ITypiaContext;
18
+ atomic: MetadataAtomic;
19
+ input: ts.Expression;
20
+ }): ICheckEntry => {
21
+ const base: ts.BinaryExpression = ts.factory.createStrictEquality(
22
+ ts.factory.createStringLiteral("number"),
23
+ ts.factory.createTypeOfExpression(props.input),
24
+ );
25
+ const addition: ts.Expression | null =
26
+ props.numeric === true
27
+ ? OptionPredicator.finite(props.context.options)
28
+ ? ts.factory.createCallExpression(
29
+ ts.factory.createIdentifier("Number.isFinite"),
30
+ undefined,
31
+ [props.input],
32
+ )
33
+ : OptionPredicator.numeric(props.context.options)
34
+ ? ts.factory.createLogicalNot(
35
+ ts.factory.createCallExpression(
36
+ ts.factory.createIdentifier("Number.isNaN"),
37
+ undefined,
38
+ [props.input],
39
+ ),
30
40
  )
31
- : OptionPredicator.numeric(project.options)
32
- ? ts.factory.createLogicalNot(
33
- ts.factory.createCallExpression(
34
- ts.factory.createIdentifier("Number.isNaN"),
35
- undefined,
36
- [input],
37
- ),
38
- )
39
- : null
40
- : null;
41
-
42
- const conditions: ICheckEntry.ICondition[][] =
43
- check_numeric_type_tags(project)(atomic)(addition)(input);
44
-
45
- return {
46
- expected: atomic.getName(),
47
- expression:
48
- addition !== null && conditions.length === 0
49
- ? ts.factory.createLogicalAnd(base, addition)
50
- : base,
51
- conditions,
52
- };
41
+ : null
42
+ : null;
43
+ const conditions: ICheckEntry.ICondition[][] = check_numeric_type_tags({
44
+ context: props.context,
45
+ atomic: props.atomic,
46
+ input: props.input,
47
+ addition,
48
+ });
49
+ return {
50
+ expected: props.atomic.getName(),
51
+ expression:
52
+ addition !== null && conditions.length === 0
53
+ ? ts.factory.createLogicalAnd(base, addition)
54
+ : base,
55
+ conditions,
53
56
  };
57
+ };
54
58
 
55
59
  /**
56
60
  * @internal
57
61
  */
58
- const check_numeric_type_tags =
59
- (project: ITypiaContext) =>
60
- (atomic: MetadataAtomic) =>
61
- (addition: ts.Expression | null) =>
62
- (input: ts.Expression): ICheckEntry.ICondition[][] =>
63
- atomic.tags
64
- .map((row) => row.filter((tag) => !!tag.validate))
65
- .filter((row) => !!row.length)
66
- .map((row) => [
67
- ...(addition === null
68
- ? []
69
- : row.some(
70
- (tag) =>
71
- tag.kind === "type" &&
72
- (tag.value === "int32" ||
73
- tag.value === "uint32" ||
74
- tag.value === "int64" ||
75
- tag.value === "uint64" ||
76
- tag.value === "float"),
77
- ) ||
62
+ const check_numeric_type_tags = (props: {
63
+ context: ITypiaContext;
64
+ atomic: MetadataAtomic;
65
+ addition: ts.Expression | null;
66
+ input: ts.Expression;
67
+ }): ICheckEntry.ICondition[][] =>
68
+ props.atomic.tags
69
+ .map((row) => row.filter((tag) => !!tag.validate))
70
+ .filter((row) => !!row.length)
71
+ .map((row) => [
72
+ ...(props.addition === null
73
+ ? []
74
+ : row.some(
75
+ (tag) =>
76
+ tag.kind === "type" &&
77
+ (tag.value === "int32" ||
78
+ tag.value === "uint32" ||
79
+ tag.value === "int64" ||
80
+ tag.value === "uint64" ||
81
+ tag.value === "float"),
82
+ ) ||
83
+ row.some(
84
+ (tag) =>
85
+ tag.kind === "multipleOf" && typeof tag.value === "number",
86
+ ) ||
87
+ (row.some(
88
+ (tag) =>
89
+ (tag.kind === "minimum" || tag.kind === "exclusiveMinimum") &&
90
+ typeof tag.value === "number",
91
+ ) &&
78
92
  row.some(
79
93
  (tag) =>
80
- tag.kind === "multipleOf" && typeof tag.value === "number",
81
- ) ||
82
- (row.some(
83
- (tag) =>
84
- (tag.kind === "minimum" || tag.kind === "exclusiveMinimum") &&
94
+ (tag.kind === "maximum" || tag.kind === "exclusiveMaximum") &&
85
95
  typeof tag.value === "number",
86
- ) &&
87
- row.some(
88
- (tag) =>
89
- (tag.kind === "maximum" ||
90
- tag.kind === "exclusiveMaximum") &&
91
- typeof tag.value === "number",
92
- ))
93
- ? []
94
- : [
95
- {
96
- expected: "number",
97
- expression: addition!,
98
- },
99
- ]),
100
- ...row.map((tag) => ({
101
- expected: `number & ${tag.name}`,
102
- expression: (
103
- tag.predicate ??
104
- ExpressionFactory.transpile(project.transformer)(tag.validate!)
105
- )(input),
106
- })),
107
- ]);
96
+ ))
97
+ ? []
98
+ : [
99
+ {
100
+ expected: "number",
101
+ expression: props.addition!,
102
+ },
103
+ ]),
104
+ ...row.map((tag) => ({
105
+ expected: `number & ${tag.name}`,
106
+ expression: (
107
+ tag.predicate ??
108
+ ExpressionFactory.transpile(props.context.transformer)(tag.validate!)
109
+ )(props.input),
110
+ })),
111
+ ]);
@@ -10,39 +10,49 @@ import { check_everything } from "./check_everything";
10
10
  /**
11
11
  * @internal
12
12
  */
13
- export const check_object =
14
- (config: check_object.IProps) =>
15
- (project: ITypiaContext) =>
16
- (importer: FunctionImporter) =>
17
- (props: {
18
- input: ts.Expression;
19
- entries: IExpressionEntry<ts.Expression>[];
20
- }) => {
21
- // PREPARE ASSETS
22
- const regular = props.entries.filter((entry) => entry.key.isSoleLiteral());
23
- const dynamic = props.entries.filter((entry) => !entry.key.isSoleLiteral());
24
- const flags: ts.Expression[] = regular.map((entry) => entry.expression);
13
+ export const check_object = (props: {
14
+ config: check_object.IConfig;
15
+ context: ITypiaContext;
16
+ importer: FunctionImporter;
17
+ input: ts.Expression;
18
+ entries: IExpressionEntry<ts.Expression>[];
19
+ }) => {
20
+ // PREPARE ASSETS
21
+ const regular = props.entries.filter((entry) => entry.key.isSoleLiteral());
22
+ const dynamic = props.entries.filter((entry) => !entry.key.isSoleLiteral());
23
+ const flags: ts.Expression[] = regular.map((entry) => entry.expression);
25
24
 
26
- // REGULAR WITHOUT DYNAMIC PROPERTIES
27
- if (config.equals === false && dynamic.length === 0)
28
- return regular.length === 0 ? config.positive : reduce(config)(flags);
25
+ // REGULAR WITHOUT DYNAMIC PROPERTIES
26
+ if (props.config.equals === false && dynamic.length === 0)
27
+ return regular.length === 0
28
+ ? props.config.positive
29
+ : reduce({
30
+ config: props.config,
31
+ expressions: flags,
32
+ });
29
33
 
30
- // CHECK DYNAMIC PROPERTIES
31
- flags.push(
32
- check_dynamic_properties(config)(project)(importer)(
33
- props.input,
34
- regular,
35
- dynamic,
36
- ),
37
- );
38
- return reduce(config)(flags);
39
- };
34
+ // CHECK DYNAMIC PROPERTIES
35
+ flags.push(
36
+ check_dynamic_properties({
37
+ config: props.config,
38
+ context: props.context,
39
+ importer: props.importer,
40
+ input: props.input,
41
+ regular,
42
+ dynamic,
43
+ }),
44
+ );
45
+ return reduce({
46
+ config: props.config,
47
+ expressions: flags,
48
+ });
49
+ };
40
50
 
41
51
  /**
42
52
  * @internal
43
53
  */
44
54
  export namespace check_object {
45
- export interface IProps {
55
+ export interface IConfig {
46
56
  equals: boolean;
47
57
  assert: boolean;
48
58
  undefined: boolean;
@@ -57,8 +67,12 @@ export namespace check_object {
57
67
  /**
58
68
  * @internal
59
69
  */
60
- const reduce =
61
- (props: check_object.IProps) => (expressions: ts.Expression[]) =>
62
- props.assert
63
- ? expressions.reduce(props.reduce)
64
- : check_everything(ts.factory.createArrayLiteralExpression(expressions));
70
+ const reduce = (props: {
71
+ config: check_object.IConfig;
72
+ expressions: ts.Expression[];
73
+ }) =>
74
+ props.config.assert
75
+ ? props.expressions.reduce(props.config.reduce)
76
+ : check_everything(
77
+ ts.factory.createArrayLiteralExpression(props.expressions),
78
+ );
@@ -11,38 +11,39 @@ import { ICheckEntry } from "../helpers/ICheckEntry";
11
11
  /**
12
12
  * @internal
13
13
  */
14
- export const check_string =
15
- (project: ITypiaContext) =>
16
- (atomic: MetadataAtomic) =>
17
- (input: ts.Expression): ICheckEntry => {
18
- const conditions: ICheckEntry.ICondition[][] =
19
- check_string_type_tags(project)(atomic)(input);
20
- return {
21
- expected: atomic.getName(),
22
- expression: ts.factory.createStrictEquality(
23
- ts.factory.createStringLiteral("string"),
24
- ts.factory.createTypeOfExpression(input),
25
- ),
26
- conditions,
27
- };
14
+ export const check_string = (props: {
15
+ context: ITypiaContext;
16
+ atomic: MetadataAtomic;
17
+ input: ts.Expression;
18
+ }): ICheckEntry => {
19
+ const conditions: ICheckEntry.ICondition[][] = check_string_type_tags(props);
20
+ return {
21
+ expected: props.atomic.getName(),
22
+ expression: ts.factory.createStrictEquality(
23
+ ts.factory.createStringLiteral("string"),
24
+ ts.factory.createTypeOfExpression(props.input),
25
+ ),
26
+ conditions,
28
27
  };
28
+ };
29
29
 
30
30
  /**
31
31
  * @internal
32
32
  */
33
- const check_string_type_tags =
34
- (project: ITypiaContext) =>
35
- (atomic: MetadataAtomic) =>
36
- (input: ts.Expression): ICheckEntry.ICondition[][] =>
37
- atomic.tags
38
- .map((row) => row.filter((tag) => !!tag.validate))
39
- .filter((row) => !!row.length)
40
- .map((row) =>
41
- row.map((tag) => ({
42
- expected: `string & ${tag.name}`,
43
- expression: (
44
- tag.predicate ??
45
- ExpressionFactory.transpile(project.transformer)(tag.validate!)
46
- )(input),
47
- })),
48
- );
33
+ const check_string_type_tags = (props: {
34
+ context: ITypiaContext;
35
+ atomic: MetadataAtomic;
36
+ input: ts.Expression;
37
+ }): ICheckEntry.ICondition[][] =>
38
+ props.atomic.tags
39
+ .map((row) => row.filter((tag) => !!tag.validate))
40
+ .filter((row) => !!row.length)
41
+ .map((row) =>
42
+ row.map((tag) => ({
43
+ expected: `string & ${tag.name}`,
44
+ expression: (
45
+ tag.predicate ??
46
+ ExpressionFactory.transpile(props.context.transformer)(tag.validate!)
47
+ )(props.input),
48
+ })),
49
+ );
@@ -8,39 +8,41 @@ import { template_to_pattern } from "./template_to_pattern";
8
8
  /**
9
9
  * @internal
10
10
  */
11
- export const check_template =
12
- (templates: MetadataTemplate[]) =>
13
- (input: ts.Expression): ICheckEntry => {
14
- // TYPEOF STRING & TAGS
15
- const conditions: ts.Expression[] = [
16
- ts.factory.createStrictEquality(
17
- ts.factory.createStringLiteral("string"),
18
- ts.factory.createTypeOfExpression(input),
19
- ),
20
- ];
11
+ export const check_template = (props: {
12
+ templates: MetadataTemplate[];
13
+ input: ts.Expression;
14
+ }): ICheckEntry => {
15
+ // TYPEOF STRING & TAGS
16
+ const conditions: ts.Expression[] = [
17
+ ts.factory.createStrictEquality(
18
+ ts.factory.createStringLiteral("string"),
19
+ ts.factory.createTypeOfExpression(props.input),
20
+ ),
21
+ ];
21
22
 
22
- // TEMPLATES
23
- const internal: ts.Expression[] = templates.map((tpl) =>
24
- ts.factory.createCallExpression(
25
- ts.factory.createIdentifier(
26
- `RegExp(/${template_to_pattern(true)(tpl.row)}/).test`,
27
- ),
28
- undefined,
29
- [input],
23
+ // TEMPLATES
24
+ const internal: ts.Expression[] = props.templates.map((tpl) =>
25
+ ts.factory.createCallExpression(
26
+ ts.factory.createIdentifier(
27
+ `RegExp(/${template_to_pattern({
28
+ top: true,
29
+ template: tpl.row,
30
+ })}/).test`,
30
31
  ),
31
- );
32
- conditions.push(
33
- internal.length === 1
34
- ? internal[0]!
35
- : internal.reduce((x, y) => ts.factory.createLogicalOr(x, y)),
36
- );
32
+ undefined,
33
+ [props.input],
34
+ ),
35
+ );
36
+ conditions.push(
37
+ internal.length === 1
38
+ ? internal[0]!
39
+ : internal.reduce((x, y) => ts.factory.createLogicalOr(x, y)),
40
+ );
37
41
 
38
- // COMBINATION
39
- return {
40
- expression: conditions.reduce((x, y) =>
41
- ts.factory.createLogicalAnd(x, y),
42
- ),
43
- conditions: [],
44
- expected: templates.map((tpl) => tpl.getName()).join(" | "),
45
- };
42
+ // COMBINATION
43
+ return {
44
+ expression: conditions.reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
45
+ conditions: [],
46
+ expected: props.templates.map((tpl) => tpl.getName()).join(" | "),
46
47
  };
48
+ };