typia 7.0.0-dev.20240916 → 7.0.0-dev.20240918

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 (170) hide show
  1. package/lib/factories/JsonMetadataFactory.d.ts +7 -1
  2. package/lib/factories/JsonMetadataFactory.js +17 -15
  3. package/lib/factories/JsonMetadataFactory.js.map +1 -1
  4. package/lib/factories/MetadataFactory.d.ts +14 -2
  5. package/lib/factories/MetadataFactory.js +287 -324
  6. package/lib/factories/MetadataFactory.js.map +1 -1
  7. package/lib/factories/ProtobufFactory.d.ts +8 -1
  8. package/lib/factories/ProtobufFactory.js +22 -17
  9. package/lib/factories/ProtobufFactory.js.map +1 -1
  10. package/lib/factories/internal/metadata/IMetadataIteratorProps.d.ts +13 -0
  11. package/lib/factories/internal/metadata/IMetadataIteratorProps.js +3 -0
  12. package/lib/factories/internal/metadata/IMetadataIteratorProps.js.map +1 -0
  13. package/lib/factories/internal/metadata/emplace_metadata_alias.d.ts +2 -4
  14. package/lib/factories/internal/metadata/emplace_metadata_alias.js +10 -18
  15. package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
  16. package/lib/factories/internal/metadata/emplace_metadata_array_type.d.ts +6 -3
  17. package/lib/factories/internal/metadata/emplace_metadata_array_type.js +10 -18
  18. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -1
  19. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +2 -4
  20. package/lib/factories/internal/metadata/emplace_metadata_object.js +171 -158
  21. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  22. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +2 -3
  23. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +26 -34
  24. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -1
  25. package/lib/factories/internal/metadata/explore_metadata.d.ts +6 -3
  26. package/lib/factories/internal/metadata/explore_metadata.js +24 -21
  27. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  28. package/lib/factories/internal/metadata/iterate_metadata.d.ts +2 -5
  29. package/lib/factories/internal/metadata/iterate_metadata.js +27 -36
  30. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  31. package/lib/factories/internal/metadata/iterate_metadata_alias.d.ts +2 -5
  32. package/lib/factories/internal/metadata/iterate_metadata_alias.js +11 -19
  33. package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
  34. package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +2 -5
  35. package/lib/factories/internal/metadata/iterate_metadata_array.js +59 -56
  36. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  37. package/lib/factories/internal/metadata/iterate_metadata_atomic.d.ts +4 -1
  38. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +3 -3
  39. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  40. package/lib/factories/internal/metadata/iterate_metadata_coalesce.d.ts +4 -1
  41. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js +5 -5
  42. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -1
  43. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +4 -1
  44. package/lib/factories/internal/metadata/iterate_metadata_collection.js +119 -121
  45. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  46. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +4 -1
  47. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js +7 -7
  48. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -1
  49. package/lib/factories/internal/metadata/iterate_metadata_constant.d.ts +2 -4
  50. package/lib/factories/internal/metadata/iterate_metadata_constant.js +39 -43
  51. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -1
  52. package/lib/factories/internal/metadata/iterate_metadata_escape.d.ts +2 -5
  53. package/lib/factories/internal/metadata/iterate_metadata_escape.js +15 -23
  54. package/lib/factories/internal/metadata/iterate_metadata_escape.js.map +1 -1
  55. package/lib/factories/internal/metadata/iterate_metadata_function.d.ts +2 -5
  56. package/lib/factories/internal/metadata/iterate_metadata_function.js +43 -51
  57. package/lib/factories/internal/metadata/iterate_metadata_function.js.map +1 -1
  58. package/lib/factories/internal/metadata/iterate_metadata_intersection.d.ts +2 -5
  59. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +142 -152
  60. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  61. package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +2 -5
  62. package/lib/factories/internal/metadata/iterate_metadata_map.js +15 -23
  63. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  64. package/lib/factories/internal/metadata/iterate_metadata_native.d.ts +2 -3
  65. package/lib/factories/internal/metadata/iterate_metadata_native.js +42 -36
  66. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  67. package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +2 -5
  68. package/lib/factories/internal/metadata/iterate_metadata_object.js +12 -20
  69. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  70. package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +2 -5
  71. package/lib/factories/internal/metadata/iterate_metadata_set.js +11 -19
  72. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  73. package/lib/factories/internal/metadata/iterate_metadata_sort.d.ts +4 -1
  74. package/lib/factories/internal/metadata/iterate_metadata_sort.js +112 -95
  75. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  76. package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +2 -5
  77. package/lib/factories/internal/metadata/iterate_metadata_template.js +17 -25
  78. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  79. package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +2 -4
  80. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +9 -17
  81. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  82. package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +2 -5
  83. package/lib/factories/internal/metadata/iterate_metadata_union.js +7 -15
  84. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  85. package/lib/programmers/CheckerProgrammer.js +11 -5
  86. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  87. package/lib/programmers/RandomProgrammer.js +18 -12
  88. package/lib/programmers/RandomProgrammer.js.map +1 -1
  89. package/lib/programmers/http/HttpFormDataProgrammer.js +12 -6
  90. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  91. package/lib/programmers/http/HttpHeadersProgrammer.js +12 -6
  92. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  93. package/lib/programmers/http/HttpParameterProgrammer.js +12 -6
  94. package/lib/programmers/http/HttpParameterProgrammer.js.map +1 -1
  95. package/lib/programmers/http/HttpQueryProgrammer.js +14 -6
  96. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  97. package/lib/programmers/json/JsonStringifyProgrammer.js +6 -1
  98. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  99. package/lib/programmers/misc/MiscCloneProgrammer.js +18 -12
  100. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  101. package/lib/programmers/misc/MiscLiteralsProgrammer.js +21 -15
  102. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  103. package/lib/programmers/misc/MiscPruneProgrammer.js +11 -5
  104. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  105. package/lib/programmers/notations/NotationGeneralProgrammer.js +11 -5
  106. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  107. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +7 -1
  108. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  109. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +7 -1
  110. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  111. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +7 -1
  112. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  113. package/lib/transformers/features/json/JsonApplicationTransformer.js +12 -6
  114. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  115. package/lib/transformers/features/llm/LlmApplicationTransformer.js +13 -7
  116. package/lib/transformers/features/llm/LlmApplicationTransformer.js.map +1 -1
  117. package/lib/transformers/features/llm/LlmSchemaTransformer.js +12 -6
  118. package/lib/transformers/features/llm/LlmSchemaTransformer.js.map +1 -1
  119. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js +12 -6
  120. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js.map +1 -1
  121. package/lib/transformers/features/reflect/ReflectNameTransformer.js +11 -5
  122. package/lib/transformers/features/reflect/ReflectNameTransformer.js.map +1 -1
  123. package/package.json +1 -1
  124. package/src/factories/JsonMetadataFactory.ts +21 -14
  125. package/src/factories/MetadataFactory.ts +269 -184
  126. package/src/factories/ProtobufFactory.ts +23 -16
  127. package/src/factories/internal/metadata/IMetadataIteratorProps.ts +16 -0
  128. package/src/factories/internal/metadata/emplace_metadata_alias.ts +22 -31
  129. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +26 -29
  130. package/src/factories/internal/metadata/emplace_metadata_object.ts +163 -144
  131. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +39 -40
  132. package/src/factories/internal/metadata/explore_metadata.ts +22 -20
  133. package/src/factories/internal/metadata/iterate_metadata.ts +31 -80
  134. package/src/factories/internal/metadata/iterate_metadata_alias.ts +18 -24
  135. package/src/factories/internal/metadata/iterate_metadata_array.ts +51 -51
  136. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +6 -6
  137. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +8 -8
  138. package/src/factories/internal/metadata/iterate_metadata_collection.ts +128 -114
  139. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +24 -22
  140. package/src/factories/internal/metadata/iterate_metadata_constant.ts +63 -63
  141. package/src/factories/internal/metadata/iterate_metadata_escape.ts +35 -40
  142. package/src/factories/internal/metadata/iterate_metadata_function.ts +70 -74
  143. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +182 -182
  144. package/src/factories/internal/metadata/iterate_metadata_map.ts +37 -36
  145. package/src/factories/internal/metadata/iterate_metadata_native.ts +56 -43
  146. package/src/factories/internal/metadata/iterate_metadata_object.ts +18 -24
  147. package/src/factories/internal/metadata/iterate_metadata_set.ts +24 -30
  148. package/src/factories/internal/metadata/iterate_metadata_sort.ts +71 -62
  149. package/src/factories/internal/metadata/iterate_metadata_template.ts +29 -31
  150. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +16 -27
  151. package/src/factories/internal/metadata/iterate_metadata_union.ts +16 -24
  152. package/src/programmers/CheckerProgrammer.ts +11 -8
  153. package/src/programmers/RandomProgrammer.ts +18 -15
  154. package/src/programmers/http/HttpFormDataProgrammer.ts +12 -9
  155. package/src/programmers/http/HttpHeadersProgrammer.ts +12 -9
  156. package/src/programmers/http/HttpParameterProgrammer.ts +12 -9
  157. package/src/programmers/http/HttpQueryProgrammer.ts +13 -9
  158. package/src/programmers/json/JsonStringifyProgrammer.ts +6 -4
  159. package/src/programmers/misc/MiscCloneProgrammer.ts +18 -15
  160. package/src/programmers/misc/MiscLiteralsProgrammer.ts +20 -17
  161. package/src/programmers/misc/MiscPruneProgrammer.ts +11 -8
  162. package/src/programmers/notations/NotationGeneralProgrammer.ts +11 -8
  163. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +7 -4
  164. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +7 -4
  165. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +7 -4
  166. package/src/transformers/features/json/JsonApplicationTransformer.ts +12 -9
  167. package/src/transformers/features/llm/LlmApplicationTransformer.ts +13 -10
  168. package/src/transformers/features/llm/LlmSchemaTransformer.ts +12 -9
  169. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +12 -9
  170. package/src/transformers/features/reflect/ReflectNameTransformer.ts +11 -8
@@ -1,41 +1,32 @@
1
- import ts from "typescript";
2
-
3
1
  import { Metadata } from "../../../schemas/metadata/Metadata";
4
2
  import { MetadataAlias } from "../../../schemas/metadata/MetadataAlias";
5
3
 
6
4
  import { ArrayUtil } from "../../../utils/ArrayUtil";
7
5
 
8
- import { MetadataCollection } from "../../MetadataCollection";
9
- import { MetadataFactory } from "../../MetadataFactory";
6
+ import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
10
7
  import { explore_metadata } from "./explore_metadata";
11
8
 
12
- export const emplace_metadata_alias =
13
- (checker: ts.TypeChecker) =>
14
- (options: MetadataFactory.IOptions) =>
15
- (collection: MetadataCollection) =>
16
- (errors: MetadataFactory.IError[]) =>
17
- (
18
- type: ts.Type,
19
- nullable: boolean,
20
- explore: MetadataFactory.IExplore,
21
- ): MetadataAlias => {
22
- // CHECK EXISTENCE
23
- const [alias, newbie, closure] = collection.emplaceAlias(
24
- checker,
25
- type,
26
- type.aliasSymbol!,
27
- );
28
- ArrayUtil.add(alias.nullables, nullable);
29
- if (newbie === false) return alias;
9
+ export const emplace_metadata_alias = (
10
+ props: IMetadataIteratorProps,
11
+ ): MetadataAlias => {
12
+ // CHECK EXISTENCE
13
+ const [alias, newbie, closure] = props.collection.emplaceAlias(
14
+ props.checker,
15
+ props.type,
16
+ props.type.aliasSymbol!,
17
+ );
18
+ ArrayUtil.add(alias.nullables, props.metadata.nullable);
19
+ if (newbie === false) return alias;
30
20
 
31
- // CONSTRUCT VALUE TYPE
32
- const value: Metadata = explore_metadata(checker)(options)(collection)(
33
- errors,
34
- )(type, {
35
- ...explore,
21
+ // CONSTRUCT VALUE TYPE
22
+ const value: Metadata = explore_metadata({
23
+ ...props,
24
+ explore: {
25
+ ...props.explore,
36
26
  escaped: false,
37
27
  aliased: true,
38
- });
39
- closure(value);
40
- return alias;
41
- };
28
+ },
29
+ });
30
+ closure(value);
31
+ return alias;
32
+ };
@@ -5,38 +5,35 @@ import { MetadataArrayType } from "../../../schemas/metadata/MetadataArrayType";
5
5
 
6
6
  import { ArrayUtil } from "../../../utils/ArrayUtil";
7
7
 
8
- import { MetadataCollection } from "../../MetadataCollection";
9
- import { MetadataFactory } from "../../MetadataFactory";
8
+ import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
10
9
  import { explore_metadata } from "./explore_metadata";
11
10
 
12
- export const emplace_metadata_array_type =
13
- (checker: ts.TypeChecker) =>
14
- (options: MetadataFactory.IOptions) =>
15
- (collection: MetadataCollection) =>
16
- (errors: MetadataFactory.IError[]) =>
17
- (
18
- aliasType: ts.Type,
19
- arrayType: ts.Type,
20
- nullable: boolean,
21
- explore: MetadataFactory.IExplore,
22
- ): MetadataArrayType => {
23
- // CHECK EXISTENCE
24
- const [array, newbie, setValue] = collection.emplaceArray(
25
- checker,
26
- aliasType,
27
- );
28
- ArrayUtil.add(array.nullables, nullable);
29
- if (newbie === false) return array;
11
+ interface IProps extends IMetadataIteratorProps {
12
+ array: ts.Type;
13
+ }
30
14
 
31
- // CONSTRUCT VALUE TYPE
32
- const value: Metadata = explore_metadata(checker)(options)(collection)(
33
- errors,
34
- )(arrayType.getNumberIndexType()!, {
35
- ...explore,
15
+ export const emplace_metadata_array_type = (
16
+ props: IProps,
17
+ ): MetadataArrayType => {
18
+ // CHECK EXISTENCE
19
+ const [array, newbie, setValue] = props.collection.emplaceArray(
20
+ props.checker,
21
+ props.type,
22
+ );
23
+ ArrayUtil.add(array.nullables, props.metadata.nullable);
24
+ if (newbie === false) return array;
25
+
26
+ // CONSTRUCT VALUE TYPE
27
+ const value: Metadata = explore_metadata({
28
+ ...props,
29
+ type: props.array.getNumberIndexType()!,
30
+ explore: {
31
+ ...props.explore,
36
32
  escaped: false,
37
33
  aliased: false,
38
- });
39
- setValue(value);
34
+ },
35
+ });
36
+ setValue(value);
40
37
 
41
- return array;
42
- };
38
+ return array;
39
+ };
@@ -9,115 +9,123 @@ import { Writable } from "../../../typings/Writable";
9
9
  import { ArrayUtil } from "../../../utils/ArrayUtil";
10
10
 
11
11
  import { CommentFactory } from "../../CommentFactory";
12
- import { MetadataCollection } from "../../MetadataCollection";
13
- import { MetadataFactory } from "../../MetadataFactory";
12
+ import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
14
13
  import { MetadataHelper } from "./MetadataHelper";
15
14
  import { explore_metadata } from "./explore_metadata";
16
15
  import { iterate_metadata_coalesce } from "./iterate_metadata_coalesce";
17
16
 
18
- export const emplace_metadata_object =
19
- (checker: ts.TypeChecker) =>
20
- (options: MetadataFactory.IOptions) =>
21
- (collection: MetadataCollection) =>
22
- (errors: MetadataFactory.IError[]) =>
23
- (parent: ts.Type, nullable: boolean): MetadataObject => {
24
- // EMPLACE OBJECT
25
- const [obj, newbie] = collection.emplace(checker, parent);
26
- ArrayUtil.add(obj.nullables, nullable, (elem) => elem === nullable);
27
-
28
- if (newbie === false) return obj;
29
-
30
- // PREPARE ASSETS
31
- const isClass: boolean = parent.isClass();
32
- const isProperty = significant(!!options.functional);
33
- const pred: (node: ts.Declaration) => boolean = isClass
34
- ? (node) => {
35
- const kind: ts.SyntaxKind | undefined = node
36
- .getChildren()[0]
37
- ?.getChildren()[0]?.kind;
38
- return (
39
- kind !== ts.SyntaxKind.PrivateKeyword &&
40
- kind !== ts.SyntaxKind.ProtectedKeyword &&
41
- isProperty(node)
42
- );
43
- }
44
- : (node) => isProperty(node);
45
-
46
- const insert =
47
- (key: Metadata) =>
48
- (value: Metadata) =>
49
- (
50
- symbol: ts.Symbol | undefined,
51
- filter?: (doc: ts.JSDocTagInfo) => boolean,
52
- ): MetadataProperty => {
53
- // COMMENTS AND TAGS
54
- const description: string | null = symbol
55
- ? (CommentFactory.description(symbol) ?? null)
56
- : null;
57
- const jsDocTags: ts.JSDocTagInfo[] = (
58
- symbol?.getJsDocTags() ?? []
59
- ).filter(filter ?? (() => true));
60
-
61
- // THE PROPERTY
62
- const property: MetadataProperty = MetadataProperty.create({
63
- key,
64
- value,
65
- description,
66
- jsDocTags,
67
- });
68
- obj.properties.push(property);
69
- return property;
70
- };
71
-
72
- //----
73
- // REGULAR PROPERTIES
74
- //----
75
- for (const prop of parent.getApparentProperties()) {
76
- // CHECK INTERNAL TAG
77
- if (
78
- (prop.getJsDocTags(checker) ?? []).find(
79
- (tag) => tag.name === "internal",
80
- ) !== undefined
81
- )
82
- continue;
83
-
84
- // CHECK NODE IS A FORMAL PROPERTY
85
- const [node, type] = (() => {
86
- const node = prop.getDeclarations()?.[0] as
87
- | ts.PropertyDeclaration
88
- | undefined;
89
- const type: ts.Type | undefined = node
90
- ? checker.getTypeOfSymbolAtLocation(prop, node)
91
- : checker.getTypeOfPropertyOfType(parent, prop.name);
92
- return [node, type];
93
- })();
94
- if ((node && pred(node) === false) || type === undefined) continue;
95
-
96
- // GET EXACT TYPE
97
- const key: Metadata = MetadataHelper.literal_to_metadata(prop.name);
98
- const value: Metadata = explore_metadata(checker)(options)(collection)(
99
- errors,
100
- )(type, {
17
+ export const emplace_metadata_object = (
18
+ props: IMetadataIteratorProps,
19
+ ): MetadataObject => {
20
+ // EMPLACE OBJECT
21
+ const [obj, newbie] = props.collection.emplace(props.checker, props.type);
22
+ ArrayUtil.add(
23
+ obj.nullables,
24
+ props.metadata.nullable,
25
+ (elem) => elem === props.metadata.nullable,
26
+ );
27
+
28
+ if (newbie === false) return obj;
29
+
30
+ // PREPARE ASSETS
31
+ const isClass: boolean = props.type.isClass();
32
+ const isProperty = significant(!!props.options.functional);
33
+ const pred: (node: ts.Declaration) => boolean = isClass
34
+ ? (node) => {
35
+ const kind: ts.SyntaxKind | undefined = node
36
+ .getChildren()[0]
37
+ ?.getChildren()[0]?.kind;
38
+ return (
39
+ kind !== ts.SyntaxKind.PrivateKeyword &&
40
+ kind !== ts.SyntaxKind.ProtectedKeyword &&
41
+ isProperty(node)
42
+ );
43
+ }
44
+ : (node) => isProperty(node);
45
+
46
+ const insert = (props: {
47
+ key: Metadata;
48
+ value: Metadata;
49
+ symbol: ts.Symbol | undefined;
50
+ filter?: (doc: ts.JSDocTagInfo) => boolean;
51
+ }): MetadataProperty => {
52
+ // COMMENTS AND TAGS
53
+ const description: string | null = props.symbol
54
+ ? (CommentFactory.description(props.symbol) ?? null)
55
+ : null;
56
+ const jsDocTags: ts.JSDocTagInfo[] = (
57
+ props.symbol?.getJsDocTags() ?? []
58
+ ).filter(props.filter ?? (() => true));
59
+
60
+ // THE PROPERTY
61
+ const property: MetadataProperty = MetadataProperty.create({
62
+ key: props.key,
63
+ value: props.value,
64
+ description,
65
+ jsDocTags,
66
+ });
67
+ obj.properties.push(property);
68
+ return property;
69
+ };
70
+
71
+ //----
72
+ // REGULAR PROPERTIES
73
+ //----
74
+ for (const symbol of props.type.getApparentProperties()) {
75
+ // CHECK INTERNAL TAG
76
+ if (
77
+ (symbol.getJsDocTags(props.checker) ?? []).find(
78
+ (tag) => tag.name === "internal",
79
+ ) !== undefined
80
+ )
81
+ continue;
82
+
83
+ // CHECK NODE IS A FORMAL PROPERTY
84
+ const [node, type] = (() => {
85
+ const node = symbol.getDeclarations()?.[0] as
86
+ | ts.PropertyDeclaration
87
+ | undefined;
88
+ const type: ts.Type | undefined = node
89
+ ? props.checker.getTypeOfSymbolAtLocation(symbol, node)
90
+ : props.checker.getTypeOfPropertyOfType(props.type, symbol.name);
91
+ return [node, type];
92
+ })();
93
+ if ((node && pred(node) === false) || type === undefined) continue;
94
+
95
+ // GET EXACT TYPE
96
+ const key: Metadata = MetadataHelper.literal_to_metadata(symbol.name);
97
+ const value: Metadata = explore_metadata({
98
+ ...props,
99
+ type,
100
+ explore: {
101
101
  top: false,
102
102
  object: obj,
103
- property: prop.name,
103
+ property: symbol.name,
104
104
  parameter: null,
105
105
  nested: null,
106
106
  aliased: false,
107
107
  escaped: false,
108
108
  output: false,
109
- });
110
- Writable(value).optional = (prop.flags & ts.SymbolFlags.Optional) !== 0;
111
- insert(key)(value)(prop);
112
- }
113
-
114
- //----
115
- // DYNAMIC PROPERTIES
116
- //----
117
- for (const index of checker.getIndexInfosOfType(parent)) {
118
- // GET EXACT TYPE
119
- const analyzer = (type: ts.Type) => (property: {} | null) =>
120
- explore_metadata(checker)(options)(collection)(errors)(type, {
109
+ },
110
+ });
111
+ Writable(value).optional = (symbol.flags & ts.SymbolFlags.Optional) !== 0;
112
+ insert({
113
+ key,
114
+ value,
115
+ symbol,
116
+ });
117
+ }
118
+
119
+ //----
120
+ // DYNAMIC PROPERTIES
121
+ //----
122
+ for (const index of props.checker.getIndexInfosOfType(props.type)) {
123
+ // GET EXACT TYPE
124
+ const analyzer = (type: ts.Type) => (property: {} | null) =>
125
+ explore_metadata({
126
+ ...props,
127
+ type,
128
+ explore: {
121
129
  top: false,
122
130
  object: obj,
123
131
  property,
@@ -126,48 +134,51 @@ export const emplace_metadata_object =
126
134
  aliased: false,
127
135
  escaped: false,
128
136
  output: false,
129
- });
130
- const key: Metadata = analyzer(index.keyType)(null);
131
- const value: Metadata = analyzer(index.type)({});
132
-
133
- if (
134
- key.atomics.length +
135
- key.constants.map((c) => c.values.length).reduce((a, b) => a + b, 0) +
136
- key.templates.length +
137
- key.natives.filter(
138
- (type) =>
139
- type === "Boolean" ||
140
- type === "BigInt" ||
141
- type === "Number" ||
142
- type === "String",
143
- ).length !==
144
- key.size()
145
- )
146
- errors.push({
147
- name: key.getName(),
148
- explore: {
149
- top: false,
150
- object: obj,
151
- property: "[key]",
152
- parameter: null,
153
- nested: null,
154
- aliased: false,
155
- escaped: false,
156
- output: false,
157
- },
158
- messages: [],
159
- });
160
-
161
- // INSERT WITH REQUIRED CONFIGURATION
162
- insert(key)(value)(
163
- index.declaration?.parent
164
- ? checker.getSymbolAtLocation(index.declaration.parent)
165
- : undefined,
166
- (doc) => doc.name !== "default",
167
- );
168
- }
169
- return obj;
170
- };
137
+ },
138
+ });
139
+ const key: Metadata = analyzer(index.keyType)(null);
140
+ const value: Metadata = analyzer(index.type)({});
141
+
142
+ if (
143
+ key.atomics.length +
144
+ key.constants.map((c) => c.values.length).reduce((a, b) => a + b, 0) +
145
+ key.templates.length +
146
+ key.natives.filter(
147
+ (type) =>
148
+ type === "Boolean" ||
149
+ type === "BigInt" ||
150
+ type === "Number" ||
151
+ type === "String",
152
+ ).length !==
153
+ key.size()
154
+ )
155
+ props.errors.push({
156
+ name: key.getName(),
157
+ explore: {
158
+ top: false,
159
+ object: obj,
160
+ property: "[key]",
161
+ parameter: null,
162
+ nested: null,
163
+ aliased: false,
164
+ escaped: false,
165
+ output: false,
166
+ },
167
+ messages: [],
168
+ });
169
+
170
+ // INSERT WITH REQUIRED CONFIGURATION
171
+ insert({
172
+ key,
173
+ value,
174
+ symbol: index.declaration?.parent
175
+ ? props.checker.getSymbolAtLocation(index.declaration.parent)
176
+ : undefined,
177
+ filter: (doc) => doc.name !== "default",
178
+ });
179
+ }
180
+ return obj;
181
+ };
171
182
 
172
183
  const significant = (functional: boolean) =>
173
184
  functional
@@ -179,8 +190,16 @@ const significant = (functional: boolean) =>
179
190
  ts.isPropertySignature(node) ||
180
191
  ts.isTypeLiteralNode(node);
181
192
 
182
- const iterate_optional_coalesce = (meta: Metadata, type: ts.Type): void => {
183
- if (type.isUnionOrIntersection())
184
- type.types.forEach((child) => iterate_optional_coalesce(meta, child));
185
- else iterate_metadata_coalesce(meta, type);
193
+ const iterate_optional_coalesce = (props: {
194
+ metadata: Metadata;
195
+ type: ts.Type;
196
+ }): void => {
197
+ if (props.type.isUnionOrIntersection())
198
+ props.type.types.forEach((child) =>
199
+ iterate_optional_coalesce({
200
+ metadata: props.metadata,
201
+ type: child,
202
+ }),
203
+ );
204
+ else iterate_metadata_coalesce(props);
186
205
  };
@@ -7,51 +7,50 @@ import { Writable } from "../../../typings/Writable";
7
7
 
8
8
  import { ArrayUtil } from "../../../utils/ArrayUtil";
9
9
 
10
- import { MetadataCollection } from "../../MetadataCollection";
11
- import { MetadataFactory } from "../../MetadataFactory";
10
+ import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
12
11
  import { explore_metadata } from "./explore_metadata";
13
12
 
14
- export const emplace_metadata_tuple =
15
- (checker: ts.TypeChecker) =>
16
- (options: MetadataFactory.IOptions) =>
17
- (collection: MetadataCollection) =>
18
- (errors: MetadataFactory.IError[]) =>
19
- (
20
- type: ts.TupleType,
21
- nullable: boolean,
22
- explore: MetadataFactory.IExplore,
23
- ): MetadataTupleType => {
24
- // CHECK EXISTENCE
25
- const [tuple, newbie, closure] = collection.emplaceTuple(checker, type);
26
- ArrayUtil.add(tuple.nullables, nullable);
27
- if (newbie === false) return tuple;
28
-
29
- // CONSTRUCT ELEMENT TYPES
30
- const flagList: readonly ts.ElementFlags[] =
31
- type.elementFlags ?? (type.target as ts.TupleType)?.elementFlags ?? [];
32
- const elements: Metadata[] = checker
33
- .getTypeArguments(type as ts.TypeReference)
34
- .map((elem, i) => {
35
- const child: Metadata = explore_metadata(checker)(options)(collection)(
36
- errors,
37
- )(elem, {
38
- ...explore,
13
+ export const emplace_metadata_tuple = (
14
+ props: IMetadataIteratorProps<ts.TupleType>,
15
+ ): MetadataTupleType => {
16
+ // CHECK EXISTENCE
17
+ const [tuple, newbie, closure] = props.collection.emplaceTuple(
18
+ props.checker,
19
+ props.type,
20
+ );
21
+ ArrayUtil.add(tuple.nullables, props.metadata.nullable);
22
+ if (newbie === false) return tuple;
23
+
24
+ // CONSTRUCT ELEMENT TYPES
25
+ const flagList: readonly ts.ElementFlags[] =
26
+ props.type.elementFlags ??
27
+ (props.type.target as ts.TupleType)?.elementFlags ??
28
+ [];
29
+ const elements: Metadata[] = props.checker
30
+ .getTypeArguments(props.type as ts.TypeReference)
31
+ .map((elem, i) => {
32
+ const child: Metadata = explore_metadata({
33
+ ...props,
34
+ type: elem,
35
+ explore: {
36
+ ...props.explore,
39
37
  nested: tuple,
40
38
  aliased: false,
41
39
  escaped: false,
42
- });
40
+ },
41
+ });
43
42
 
44
- // CHECK OPTIONAL
45
- const flag: ts.ElementFlags | undefined = flagList[i];
46
- if (flag === ts.ElementFlags.Optional) Writable(child).optional = true;
43
+ // CHECK OPTIONAL
44
+ const flag: ts.ElementFlags | undefined = flagList[i];
45
+ if (flag === ts.ElementFlags.Optional) Writable(child).optional = true;
47
46
 
48
- // REST TYPE
49
- if (flag !== ts.ElementFlags.Rest) return child;
50
- const wrapper: Metadata = Metadata.initialize();
51
- Writable(wrapper).rest = child;
52
- return wrapper;
53
- });
54
- closure(elements);
47
+ // REST TYPE
48
+ if (flag !== ts.ElementFlags.Rest) return child;
49
+ const wrapper: Metadata = Metadata.initialize();
50
+ Writable(wrapper).rest = child;
51
+ return wrapper;
52
+ });
53
+ closure(elements);
55
54
 
56
- return tuple;
57
- };
55
+ return tuple;
56
+ };
@@ -2,27 +2,29 @@ import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../../../schemas/metadata/Metadata";
4
4
 
5
- import { MetadataCollection } from "../../MetadataCollection";
6
- import { MetadataFactory } from "../../MetadataFactory";
5
+ import { IMetadataIteratorProps } from "./IMetadataIteratorProps";
7
6
  import { emend_metadata_atomics } from "./emend_metadata_atomics";
8
7
  import { iterate_metadata } from "./iterate_metadata";
9
8
 
10
- export const explore_metadata =
11
- (checker: ts.TypeChecker) =>
12
- (options: MetadataFactory.IOptions) =>
13
- (collection: MetadataCollection) =>
14
- (errors: MetadataFactory.IError[]) =>
15
- (type: ts.Type | null, explore: MetadataFactory.IExplore): Metadata => {
16
- // CONSTRUCT METADATA
17
- const meta: Metadata = Metadata.initialize(explore.escaped);
18
- if (type === null) return meta;
9
+ export const explore_metadata = (props: IProps): Metadata => {
10
+ // CONSTRUCT METADATA
11
+ const metadata: Metadata = Metadata.initialize(props.explore.escaped);
12
+ if (props.type === null) return metadata;
19
13
 
20
- // ITERATE TYPESCRIPT TYPES
21
- iterate_metadata(checker)(options)(collection)(errors)(meta, type, explore);
22
- emend_metadata_atomics(meta);
23
- if (meta.escaped) {
24
- emend_metadata_atomics(meta.escaped.original);
25
- emend_metadata_atomics(meta.escaped.returns);
26
- }
27
- return meta;
28
- };
14
+ // ITERATE TYPESCRIPT TYPES
15
+ iterate_metadata({
16
+ ...props,
17
+ metadata,
18
+ type: props.type,
19
+ });
20
+ emend_metadata_atomics(metadata);
21
+ if (metadata.escaped) {
22
+ emend_metadata_atomics(metadata.escaped.original);
23
+ emend_metadata_atomics(metadata.escaped.returns);
24
+ }
25
+ return metadata;
26
+ };
27
+
28
+ interface IProps extends Omit<IMetadataIteratorProps, "metadata" | "type"> {
29
+ type: ts.Type | null;
30
+ }