typia 6.7.2 → 6.7.3-dev.20240808

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 (76) hide show
  1. package/lib/factories/TypeFactory.d.ts +2 -0
  2. package/lib/factories/TypeFactory.js +83 -4
  3. package/lib/factories/TypeFactory.js.map +1 -1
  4. package/lib/factories/internal/metadata/emplace_metadata_array_type.js +5 -1
  5. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -1
  6. package/lib/factories/internal/metadata/emplace_metadata_object.js +4 -3
  7. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  8. package/lib/factories/internal/metadata/iterate_metadata.js +2 -1
  9. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  10. package/lib/factories/internal/metadata/iterate_metadata_array.js +2 -1
  11. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  12. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +1 -1
  13. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  14. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js +1 -1
  15. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -1
  16. package/lib/factories/internal/metadata/iterate_metadata_constant.js +3 -2
  17. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -1
  18. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +3 -2
  19. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  20. package/lib/factories/internal/metadata/iterate_metadata_map.js +1 -1
  21. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  22. package/lib/factories/internal/metadata/iterate_metadata_native.js +1 -1
  23. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  24. package/lib/factories/internal/metadata/iterate_metadata_object.js +3 -2
  25. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  26. package/lib/factories/internal/metadata/iterate_metadata_set.js +1 -1
  27. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  28. package/lib/factories/internal/metadata/iterate_metadata_template.js +1 -1
  29. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  30. package/lib/factories/internal/metadata/iterate_metadata_union.js +2 -1
  31. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  32. package/lib/transformers/features/CreateRandomTransformer.js +2 -1
  33. package/lib/transformers/features/CreateRandomTransformer.js.map +1 -1
  34. package/lib/transformers/features/RandomTransformer.js +2 -1
  35. package/lib/transformers/features/RandomTransformer.js.map +1 -1
  36. package/lib/transformers/features/json/JsonApplicationTransformer.js +5 -4
  37. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  38. package/lib/transformers/features/misc/MiscLiteralsTransformer.js +2 -1
  39. package/lib/transformers/features/misc/MiscLiteralsTransformer.js.map +1 -1
  40. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +2 -1
  41. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  42. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js +2 -1
  43. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js.map +1 -1
  44. package/lib/transformers/internal/GenericTransformer.js +3 -2
  45. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  46. package/lib/utils/TypePredicator.d.ts +10 -0
  47. package/lib/utils/TypePredicator.js +36 -0
  48. package/lib/utils/TypePredicator.js.map +1 -0
  49. package/package.json +1 -1
  50. package/src/factories/StatementFactory.ts +74 -74
  51. package/src/factories/TypeFactory.ts +76 -4
  52. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +1 -1
  53. package/src/factories/internal/metadata/emplace_metadata_object.ts +6 -3
  54. package/src/factories/internal/metadata/iterate_metadata.ts +3 -1
  55. package/src/factories/internal/metadata/iterate_metadata_array.ts +2 -1
  56. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +1 -1
  57. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +1 -1
  58. package/src/factories/internal/metadata/iterate_metadata_constant.ts +3 -2
  59. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +3 -2
  60. package/src/factories/internal/metadata/iterate_metadata_map.ts +1 -1
  61. package/src/factories/internal/metadata/iterate_metadata_native.ts +1 -4
  62. package/src/factories/internal/metadata/iterate_metadata_object.ts +3 -2
  63. package/src/factories/internal/metadata/iterate_metadata_set.ts +1 -1
  64. package/src/factories/internal/metadata/iterate_metadata_template.ts +1 -1
  65. package/src/factories/internal/metadata/iterate_metadata_union.ts +3 -1
  66. package/src/schemas/metadata/IMetadataConstantValue.ts +11 -11
  67. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  68. package/src/tags/Type.ts +32 -32
  69. package/src/transformers/features/CreateRandomTransformer.ts +3 -1
  70. package/src/transformers/features/RandomTransformer.ts +3 -1
  71. package/src/transformers/features/json/JsonApplicationTransformer.ts +6 -4
  72. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +3 -1
  73. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +3 -1
  74. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +3 -1
  75. package/src/transformers/internal/GenericTransformer.ts +4 -2
  76. package/src/utils/TypePredicator.ts +32 -0
@@ -2,6 +2,8 @@ import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../../../schemas/metadata/Metadata";
4
4
 
5
+ import { TypePredicator } from "../../../utils/TypePredicator";
6
+
5
7
  import { MetadataCollection } from "../../MetadataCollection";
6
8
  import { MetadataFactory } from "../../MetadataFactory";
7
9
  import { TypeFactory } from "../../TypeFactory";
@@ -26,7 +28,7 @@ export const iterate_metadata =
26
28
  (collection: MetadataCollection) =>
27
29
  (errors: MetadataFactory.IError[]) =>
28
30
  (meta: Metadata, type: ts.Type, explore: MetadataFactory.IExplore): void => {
29
- if (type.isTypeParameter() === true) {
31
+ if (TypePredicator.isTypeParameter(type) === true) {
30
32
  errors.push({
31
33
  name: TypeFactory.getFullName(checker)(type),
32
34
  explore: { ...explore },
@@ -5,6 +5,7 @@ import { MetadataArray } from "../../../schemas/metadata/MetadataArray";
5
5
  import { MetadataArrayType } from "../../../schemas/metadata/MetadataArrayType";
6
6
 
7
7
  import { ArrayUtil } from "../../../utils/ArrayUtil";
8
+ import { TypePredicator } from "../../../utils/TypePredicator";
8
9
 
9
10
  import { MetadataCollection } from "../../MetadataCollection";
10
11
  import { MetadataFactory } from "../../MetadataFactory";
@@ -49,7 +50,7 @@ const find_array_extended =
49
50
 
50
51
  memory.set(type, null);
51
52
  const res: ts.Type | null = (() => {
52
- if (type.isClassOrInterface() === false) return null;
53
+ if (TypePredicator.isInterfaceOrClass(type) === false) return null;
53
54
  for (const t of type.resolvedBaseTypes ?? [])
54
55
  if (checker.isArrayType(t)) return t;
55
56
  else {
@@ -7,7 +7,7 @@ import { ArrayUtil } from "../../../utils/ArrayUtil";
7
7
 
8
8
  const same = (type: ts.Type | null) => {
9
9
  if (type === null) return () => false;
10
- return (flag: ts.TypeFlags) => (type.getFlags() & flag) !== 0;
10
+ return (flag: ts.TypeFlags) => (type.flags & flag) !== 0;
11
11
  };
12
12
 
13
13
  export const iterate_metadata_atomic = (
@@ -10,7 +10,7 @@ export const iterate_metadata_coalesce = (
10
10
  meta: Metadata,
11
11
  type: ts.Type,
12
12
  ): boolean => {
13
- const filter = (flag: ts.TypeFlags) => (type.getFlags() & flag) !== 0;
13
+ const filter = (flag: ts.TypeFlags) => (type.flags & flag) !== 0;
14
14
  if (filter(ts.TypeFlags.Unknown) || filter(ts.TypeFlags.Any)) {
15
15
  Writable(meta).any = true;
16
16
  return true;
@@ -5,6 +5,7 @@ import { MetadataConstant } from "../../../schemas/metadata/MetadataConstant";
5
5
  import { MetadataConstantValue } from "../../../schemas/metadata/MetadataConstantValue";
6
6
 
7
7
  import { ArrayUtil } from "../../../utils/ArrayUtil";
8
+ import { TypePredicator } from "../../../utils/TypePredicator";
8
9
 
9
10
  import { CommentFactory } from "../../CommentFactory";
10
11
  import { MetadataFactory } from "../../MetadataFactory";
@@ -15,7 +16,7 @@ export const iterate_metadata_constant =
15
16
  (meta: Metadata, type: ts.Type): boolean => {
16
17
  if (!options.constant) return false;
17
18
 
18
- const filter = (flag: ts.TypeFlags) => (type.getFlags() & flag) !== 0;
19
+ const filter = (flag: ts.TypeFlags) => (type.flags & flag) !== 0;
19
20
  const comment = () => {
20
21
  if (!filter(ts.TypeFlags.EnumLiteral)) return {};
21
22
  return {
@@ -25,7 +26,7 @@ export const iterate_metadata_constant =
25
26
  : undefined,
26
27
  };
27
28
  };
28
- if (type.isLiteral()) {
29
+ if (TypePredicator.isLiteral(type)) {
29
30
  const value: string | number | bigint =
30
31
  typeof type.value === "object"
31
32
  ? BigInt(`${type.value.negative ? "-" : ""}${type.value.base10Value}`)
@@ -8,6 +8,7 @@ import { MetadataConstantValue } from "../../../schemas/metadata/MetadataConstan
8
8
  import { MetadataTemplate } from "../../../schemas/metadata/MetadataTemplate";
9
9
 
10
10
  import { ArrayUtil } from "../../../utils/ArrayUtil";
11
+ import { TypePredicator } from "../../../utils/TypePredicator";
11
12
 
12
13
  import { MetadataCollection } from "../../MetadataCollection";
13
14
  import { MetadataFactory } from "../../MetadataFactory";
@@ -26,12 +27,12 @@ export const iterate_metadata_intersection =
26
27
  type: ts.Type,
27
28
  explore: MetadataFactory.IExplore,
28
29
  ): boolean => {
29
- if (!type.isIntersection()) return false;
30
+ if (TypePredicator.isIntersection(type) === false) return false;
30
31
  if (
31
32
  // ONLY OBJECT TYPED INTERSECTION
32
33
  type.types.every(
33
34
  (child) =>
34
- (child.getFlags() & ts.TypeFlags.Object) !== 0 &&
35
+ (child.flags & ts.TypeFlags.Object) !== 0 &&
35
36
  !checker.isArrayType(child) &&
36
37
  !checker.isTupleType(child),
37
38
  )
@@ -21,7 +21,7 @@ export const iterate_metadata_map =
21
21
  ): boolean => {
22
22
  type = checker.getApparentType(type);
23
23
 
24
- const name = TypeFactory.getFullName(checker)(type, type.getSymbol());
24
+ const name = TypeFactory.getFullName(checker)(type, type.symbol);
25
25
  const generic = type.aliasSymbol
26
26
  ? type.aliasTypeArguments
27
27
  : checker.getTypeArguments(type as ts.TypeReference);
@@ -10,10 +10,7 @@ export const iterate_metadata_native =
10
10
  (checker: ts.TypeChecker) =>
11
11
  (meta: Metadata, type: ts.Type): boolean => {
12
12
  const validator = validate(checker)(type);
13
- const name: string = TypeFactory.getFullName(checker)(
14
- type,
15
- type.getSymbol(),
16
- );
13
+ const name: string = TypeFactory.getFullName(checker)(type, type.symbol);
17
14
 
18
15
  const simple = SIMPLES.get(name);
19
16
  if (simple && validator(simple)) {
@@ -4,6 +4,7 @@ import { Metadata } from "../../../schemas/metadata/Metadata";
4
4
  import { MetadataObject } from "../../../schemas/metadata/MetadataObject";
5
5
 
6
6
  import { ArrayUtil } from "../../../utils/ArrayUtil";
7
+ import { TypePredicator } from "../../../utils/TypePredicator";
7
8
 
8
9
  import { MetadataCollection } from "../../MetadataCollection";
9
10
  import { MetadataFactory } from "../../MetadataFactory";
@@ -16,10 +17,10 @@ export const iterate_metadata_object =
16
17
  (errors: MetadataFactory.IError[]) =>
17
18
  (meta: Metadata, type: ts.Type, ensure: boolean = false): boolean => {
18
19
  if (ensure === false) {
19
- const filter = (flag: ts.TypeFlags) => (type.getFlags() & flag) !== 0;
20
+ const filter = (flag: ts.TypeFlags) => (type.flags & flag) !== 0;
20
21
  if (
21
22
  !filter(ts.TypeFlags.Object) &&
22
- !type.isIntersection() &&
23
+ !TypePredicator.isIntersection(type) &&
23
24
  (type as any).intrinsicName !== "object"
24
25
  )
25
26
  return false;
@@ -21,7 +21,7 @@ export const iterate_metadata_set =
21
21
  ): boolean => {
22
22
  type = checker.getApparentType(type);
23
23
 
24
- const name = TypeFactory.getFullName(checker)(type, type.getSymbol());
24
+ const name = TypeFactory.getFullName(checker)(type, type.symbol);
25
25
  const generic = type.aliasSymbol
26
26
  ? type.aliasTypeArguments
27
27
  : checker.getTypeArguments(type as ts.TypeReference);
@@ -18,7 +18,7 @@ export const iterate_metadata_template =
18
18
  type: ts.Type,
19
19
  explore: MetadataFactory.IExplore,
20
20
  ): boolean => {
21
- const filter = (flag: ts.TypeFlags) => (type.getFlags() & flag) !== 0;
21
+ const filter = (flag: ts.TypeFlags) => (type.flags & flag) !== 0;
22
22
  if (!filter(ts.TypeFlags.TemplateLiteral)) return false;
23
23
 
24
24
  const template: ts.TemplateLiteralType = type as ts.TemplateLiteralType;
@@ -2,6 +2,8 @@ import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../../../schemas/metadata/Metadata";
4
4
 
5
+ import { TypePredicator } from "../../../utils/TypePredicator";
6
+
5
7
  import { MetadataCollection } from "../../MetadataCollection";
6
8
  import { MetadataFactory } from "../../MetadataFactory";
7
9
  import { iterate_metadata } from "./iterate_metadata";
@@ -16,7 +18,7 @@ export const iterate_metadata_union =
16
18
  type: ts.Type,
17
19
  explore: MetadataFactory.IExplore,
18
20
  ): boolean => {
19
- if (!type.isUnion()) return false;
21
+ if (TypePredicator.isUnion(type) === false) return false;
20
22
  type.types.forEach((t) =>
21
23
  iterate_metadata(checker)(options)(collection)(errors)(meta, t, {
22
24
  ...explore,
@@ -1,11 +1,11 @@
1
- import { Atomic } from "../../typings/Atomic";
2
-
3
- import { IJsDocTagInfo } from "./IJsDocTagInfo";
4
- import { IMetadataTypeTag } from "./IMetadataTypeTag";
5
-
6
- export interface IMetadataConstantValue<T extends Atomic.Type> {
7
- value: T;
8
- tags?: IMetadataTypeTag[][] | undefined;
9
- description?: string | null;
10
- jsDocTags?: IJsDocTagInfo[];
11
- }
1
+ import { Atomic } from "../../typings/Atomic";
2
+
3
+ import { IJsDocTagInfo } from "./IJsDocTagInfo";
4
+ import { IMetadataTypeTag } from "./IMetadataTypeTag";
5
+
6
+ export interface IMetadataConstantValue<T extends Atomic.Type> {
7
+ value: T;
8
+ tags?: IMetadataTypeTag[][] | undefined;
9
+ description?: string | null;
10
+ jsDocTags?: IJsDocTagInfo[];
11
+ }
@@ -1,7 +1,7 @@
1
- import { IMetadata } from "./IMetadata";
2
- import { IMetadataTypeTag } from "./IMetadataTypeTag";
3
-
4
- export interface IMetadataTemplate {
5
- row: IMetadata[];
6
- tags?: IMetadataTypeTag[][] | undefined;
7
- }
1
+ import { IMetadata } from "./IMetadata";
2
+ import { IMetadataTypeTag } from "./IMetadataTypeTag";
3
+
4
+ export interface IMetadataTemplate {
5
+ row: IMetadata[];
6
+ tags?: IMetadataTypeTag[][] | undefined;
7
+ }
package/src/tags/Type.ts CHANGED
@@ -1,32 +1,32 @@
1
- import { TagBase } from "./TagBase";
2
-
3
- export type Type<
4
- Value extends "int32" | "uint32" | "int64" | "uint64" | "float" | "double",
5
- > = TagBase<{
6
- target: Value extends "int64" | "uint64" ? "bigint" | "number" : "number";
7
- kind: "type";
8
- value: Value;
9
- validate: Value extends "int32"
10
- ? `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`
11
- : Value extends "uint32"
12
- ? `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`
13
- : Value extends "int64"
14
- ? {
15
- number: `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`;
16
- bigint: `true`;
17
- }
18
- : Value extends "uint64"
19
- ? {
20
- number: `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`;
21
- bigint: `BigInt(0) <= $input`;
22
- }
23
- : Value extends "float"
24
- ? `-1.175494351e38 <= $input && $input <= 3.4028235e38`
25
- : `true`;
26
- exclusive: true;
27
- schema: {
28
- type: Value extends "int32" | "uint32" | "int64" | "uint64"
29
- ? "integer"
30
- : "number";
31
- };
32
- }>;
1
+ import { TagBase } from "./TagBase";
2
+
3
+ export type Type<
4
+ Value extends "int32" | "uint32" | "int64" | "uint64" | "float" | "double",
5
+ > = TagBase<{
6
+ target: Value extends "int64" | "uint64" ? "bigint" | "number" : "number";
7
+ kind: "type";
8
+ value: Value;
9
+ validate: Value extends "int32"
10
+ ? `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`
11
+ : Value extends "uint32"
12
+ ? `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`
13
+ : Value extends "int64"
14
+ ? {
15
+ number: `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`;
16
+ bigint: `true`;
17
+ }
18
+ : Value extends "uint64"
19
+ ? {
20
+ number: `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`;
21
+ bigint: `BigInt(0) <= $input`;
22
+ }
23
+ : Value extends "float"
24
+ ? `-1.175494351e38 <= $input && $input <= 3.4028235e38`
25
+ : `true`;
26
+ exclusive: true;
27
+ schema: {
28
+ type: Value extends "int32" | "uint32" | "int64" | "uint64"
29
+ ? "integer"
30
+ : "number";
31
+ };
32
+ }>;
@@ -2,6 +2,8 @@ import ts from "typescript";
2
2
 
3
3
  import { RandomProgrammer } from "../../programmers/RandomProgrammer";
4
4
 
5
+ import { TypePredicator } from "../../utils/TypePredicator";
6
+
5
7
  import { IProject } from "../IProject";
6
8
  import { TransformerError } from "../TransformerError";
7
9
 
@@ -21,7 +23,7 @@ export namespace CreateRandomTransformer {
21
23
  const node: ts.TypeNode = expression.typeArguments[0];
22
24
  const type: ts.Type = project.checker.getTypeFromTypeNode(node);
23
25
 
24
- if (type.isTypeParameter())
26
+ if (TypePredicator.isTypeParameter(type))
25
27
  throw new TransformerError({
26
28
  code: "typia.createRandom",
27
29
  message: "non-specified generic argument.",
@@ -2,6 +2,8 @@ import ts from "typescript";
2
2
 
3
3
  import { RandomProgrammer } from "../../programmers/RandomProgrammer";
4
4
 
5
+ import { TypePredicator } from "../../utils/TypePredicator";
6
+
5
7
  import { IProject } from "../IProject";
6
8
  import { TransformerError } from "../TransformerError";
7
9
 
@@ -21,7 +23,7 @@ export namespace RandomTransformer {
21
23
  const node: ts.TypeNode = expression.typeArguments[0];
22
24
  const type: ts.Type = project.checker.getTypeFromTypeNode(node);
23
25
 
24
- if (type.isTypeParameter())
26
+ if (TypePredicator.isTypeParameter(type))
25
27
  throw new TransformerError({
26
28
  code: `typia.${modulo.getText()}`,
27
29
  message: "non-specified generic argument.",
@@ -11,6 +11,8 @@ import { JsonApplicationProgrammer } from "../../../programmers/json/JsonApplica
11
11
 
12
12
  import { ValidationPipe } from "../../../typings/ValidationPipe";
13
13
 
14
+ import { TypePredicator } from "../../../utils/TypePredicator";
15
+
14
16
  import { IProject } from "../../IProject";
15
17
  import { TransformerError } from "../../TransformerError";
16
18
 
@@ -37,7 +39,7 @@ export namespace JsonApplicationTransformer {
37
39
  const types: ts.Type[] = top.elements.map((child) =>
38
40
  project.checker.getTypeFromTypeNode(child as ts.TypeNode),
39
41
  );
40
- if (types.some((t) => t.isTypeParameter()))
42
+ if (types.some(TypePredicator.isTypeParameter))
41
43
  throw new TransformerError({
42
44
  code: "typia.json.application",
43
45
  message: "non-specified generic argument(s).",
@@ -102,8 +104,8 @@ export namespace JsonApplicationTransformer {
102
104
  // CHECK LITERAL TYPE
103
105
  const type: ts.Type = props.checker.getTypeFromTypeNode(node);
104
106
  if (
105
- !type.isLiteral() &&
106
- (type.getFlags() & ts.TypeFlags.BooleanLiteral) === 0
107
+ !TypePredicator.isLiteral(type) &&
108
+ (type.flags & ts.TypeFlags.BooleanLiteral) === 0
107
109
  )
108
110
  throw new TransformerError({
109
111
  code: "typia.json.application",
@@ -111,7 +113,7 @@ export namespace JsonApplicationTransformer {
111
113
  });
112
114
 
113
115
  // GET VALUE AND VALIDATE IT
114
- const value = type.isLiteral()
116
+ const value = TypePredicator.isLiteral(type)
115
117
  ? type.value
116
118
  : props.checker.typeToString(type);
117
119
  if (typeof value !== "string" || props.is(value) === false)
@@ -2,6 +2,8 @@ import ts from "typescript";
2
2
 
3
3
  import { MiscLiteralsProgrammer } from "../../../programmers/misc/MiscLiteralsProgrammer";
4
4
 
5
+ import { TypePredicator } from "../../../utils/TypePredicator";
6
+
5
7
  import { IProject } from "../../IProject";
6
8
  import { TransformerError } from "../../TransformerError";
7
9
 
@@ -20,7 +22,7 @@ export namespace MiscLiteralsTransformer {
20
22
  const node: ts.TypeNode = expression.typeArguments[0];
21
23
  const type: ts.Type = project.checker.getTypeFromTypeNode(node);
22
24
 
23
- if (type.isTypeParameter())
25
+ if (TypePredicator.isTypeParameter(type))
24
26
  throw new TransformerError({
25
27
  code: "typia.misc.literals",
26
28
  message: "non-specified generic argument.",
@@ -2,6 +2,8 @@ import ts from "typescript";
2
2
 
3
3
  import { ProtobufMessageProgrammer } from "../../../programmers/protobuf/ProtobufMessageProgrammer";
4
4
 
5
+ import { TypePredicator } from "../../../utils/TypePredicator";
6
+
5
7
  import { IProject } from "../../IProject";
6
8
  import { TransformerError } from "../../TransformerError";
7
9
 
@@ -21,7 +23,7 @@ export namespace ProtobufMessageTransformer {
21
23
  const type: ts.Type = project.checker.getTypeFromTypeNode(
22
24
  expression.typeArguments[0],
23
25
  );
24
- if (type.isTypeParameter())
26
+ if (TypePredicator.isTypeParameter(type))
25
27
  throw new TransformerError({
26
28
  code: "tyipa.protobuf.message",
27
29
  message: "non-specified generic argument.",
@@ -7,6 +7,8 @@ import { MetadataFactory } from "../../../factories/MetadataFactory";
7
7
  import { IMetadataApplication } from "../../../schemas/metadata/IMetadataApplication";
8
8
  import { Metadata } from "../../../schemas/metadata/Metadata";
9
9
 
10
+ import { TypePredicator } from "../../../utils/TypePredicator";
11
+
10
12
  import { IProject } from "../../IProject";
11
13
  import { TransformerError } from "../../TransformerError";
12
14
 
@@ -30,7 +32,7 @@ export namespace ReflectMetadataTransformer {
30
32
  const types: ts.Type[] = top.elements.map((child) =>
31
33
  project.checker.getTypeFromTypeNode(child as ts.TypeNode),
32
34
  );
33
- if (types.some((t) => t.isTypeParameter()))
35
+ if (types.some(TypePredicator.isTypeParameter))
34
36
  throw new TransformerError({
35
37
  code: "typia.reflect.metadata",
36
38
  message: "non-specified generic argument(s).",
@@ -1,5 +1,7 @@
1
1
  import ts from "typescript";
2
2
 
3
+ import { TypePredicator } from "../../utils/TypePredicator";
4
+
3
5
  import { IProject } from "../IProject";
4
6
  import { TransformerError } from "../TransformerError";
5
7
 
@@ -36,7 +38,7 @@ export namespace GenericTransformer {
36
38
  expression.arguments[0]!,
37
39
  false,
38
40
  ];
39
- if (type.isTypeParameter())
41
+ if (TypePredicator.isTypeParameter(type))
40
42
  throw new TransformerError({
41
43
  code: `typia.${method}`,
42
44
  message: `non-specified generic argument.`,
@@ -82,7 +84,7 @@ export namespace GenericTransformer {
82
84
  const node: ts.TypeNode = expression.typeArguments[0];
83
85
  const type: ts.Type = project.checker.getTypeFromTypeNode(node);
84
86
 
85
- if (type.isTypeParameter())
87
+ if (TypePredicator.isTypeParameter(type))
86
88
  throw new TransformerError({
87
89
  code: `typia.${method}`,
88
90
  message: `non-specified generic argument.`,
@@ -0,0 +1,32 @@
1
+ import ts from "typescript";
2
+
3
+ export namespace TypePredicator {
4
+ export const isLiteral = (type: ts.Type): type is ts.LiteralType =>
5
+ !!(
6
+ type.flags &
7
+ (ts.TypeFlags.EnumLiteral |
8
+ ts.TypeFlags.StringLiteral |
9
+ ts.TypeFlags.NumberLiteral |
10
+ ts.TypeFlags.BigIntLiteral)
11
+ );
12
+
13
+ export const isTypeParameter = (type: ts.Type): type is ts.TypeParameter =>
14
+ !!(type.flags & ts.TypeFlags.TypeParameter);
15
+
16
+ export const isIntersection = (type: ts.Type): type is ts.IntersectionType =>
17
+ !!(type.flags & ts.TypeFlags.Intersection);
18
+
19
+ export const isUnion = (type: ts.Type): type is ts.UnionType =>
20
+ !!(type.flags & ts.TypeFlags.Union);
21
+
22
+ export const isUnionOrIntersection = (
23
+ type: ts.Type,
24
+ ): type is ts.UnionOrIntersectionType =>
25
+ !!(type.flags & ts.TypeFlags.UnionOrIntersection);
26
+
27
+ export const isClass = (type: ts.Type): type is ts.InterfaceType =>
28
+ !!(ts.getObjectFlags(type) & ts.ObjectFlags.Class);
29
+
30
+ export const isInterfaceOrClass = (type: ts.Type): type is ts.InterfaceType =>
31
+ !!(ts.getObjectFlags(type) & ts.ObjectFlags.ClassOrInterface);
32
+ }