typia 4.0.9 → 4.0.10-dev.20230616

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 (58) hide show
  1. package/lib/factories/MetadataTagFactory.js +64 -20
  2. package/lib/factories/MetadataTagFactory.js.map +1 -1
  3. package/lib/factories/internal/metadata/explore_metadata.js +4 -2
  4. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  5. package/lib/factories/internal/metadata/iterate_metadata_collection.js +3 -3
  6. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  7. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +9 -3
  8. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  9. package/lib/factories/internal/metadata/iterate_metadata_sort.js +1 -1
  10. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  11. package/lib/metadata/IMetadata.d.ts +2 -1
  12. package/lib/metadata/IMetadataResolved.d.ts +5 -0
  13. package/lib/metadata/IMetadataResolved.js +3 -0
  14. package/lib/metadata/IMetadataResolved.js.map +1 -0
  15. package/lib/metadata/Metadata.d.ts +2 -1
  16. package/lib/metadata/Metadata.js +31 -24
  17. package/lib/metadata/Metadata.js.map +1 -1
  18. package/lib/metadata/MetadataArray.d.ts +4 -2
  19. package/lib/metadata/MetadataArray.js.map +1 -1
  20. package/lib/metadata/MetadataResolved.d.ts +12 -0
  21. package/lib/metadata/MetadataResolved.js +31 -0
  22. package/lib/metadata/MetadataResolved.js.map +1 -0
  23. package/lib/programmers/CloneProgrammer.js +1 -1
  24. package/lib/programmers/CloneProgrammer.js.map +1 -1
  25. package/lib/programmers/RandomProgrammer.js +1 -1
  26. package/lib/programmers/RandomProgrammer.js.map +1 -1
  27. package/lib/programmers/StringifyProgrammer.js +1 -1
  28. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  29. package/lib/programmers/helpers/StringifyPredicator.js +1 -1
  30. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  31. package/lib/programmers/internal/application_resolved.d.ts +4 -0
  32. package/lib/programmers/internal/application_resolved.js +50 -0
  33. package/lib/programmers/internal/application_resolved.js.map +1 -0
  34. package/lib/programmers/internal/application_schema.js +28 -5
  35. package/lib/programmers/internal/application_schema.js.map +1 -1
  36. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +1 -1
  37. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/factories/MetadataTagFactory.ts +80 -25
  40. package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
  41. package/src/factories/internal/metadata/explore_metadata.ts +40 -37
  42. package/src/factories/internal/metadata/iterate_metadata.ts +85 -85
  43. package/src/factories/internal/metadata/iterate_metadata_collection.ts +3 -3
  44. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -38
  45. package/src/factories/internal/metadata/iterate_metadata_sort.ts +2 -1
  46. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  47. package/src/metadata/IMetadata.ts +2 -1
  48. package/src/metadata/IMetadataResolved.ts +6 -0
  49. package/src/metadata/Metadata.ts +17 -4
  50. package/src/metadata/MetadataArray.ts +4 -1
  51. package/src/metadata/MetadataResolved.ts +51 -0
  52. package/src/programmers/CloneProgrammer.ts +1 -1
  53. package/src/programmers/RandomProgrammer.ts +5 -1
  54. package/src/programmers/StringifyProgrammer.ts +983 -983
  55. package/src/programmers/helpers/StringifyPredicator.ts +1 -1
  56. package/src/programmers/internal/application_resolved.ts +55 -0
  57. package/src/programmers/internal/application_schema.ts +7 -6
  58. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +1 -1
@@ -84,7 +84,7 @@ export namespace MetadataTagFactory {
84
84
  NUMBER
85
85
  ----------------------------------------------------------- */
86
86
  type: (_identifier, metadata, text, _output) => {
87
- return has_atomic(metadata)("number") &&
87
+ return has_atomic("number")(new Set())(metadata) &&
88
88
  (text === "int" || text === "uint")
89
89
  ? { kind: "type", value: text }
90
90
  : text === "{int}" || text === "{uint}"
@@ -169,15 +169,19 @@ export namespace MetadataTagFactory {
169
169
  /* -----------------------------------------------------------
170
170
  STRING
171
171
  ----------------------------------------------------------- */
172
+ // Ignore arbitrary @format values in the internal metadata,
173
+ // these are currently only supported on the typia.application() API.
172
174
  format: (identifier, metadata, str, output) => {
173
- validate(identifier, metadata, output, "format", "string", [
174
- "pattern",
175
- ]);
176
-
177
- // Ignore arbitrary @format values in the internal metadata,
178
- // these are currently only supported on the typia.application() API.
179
175
  const value: IMetadataTag.IFormat["value"] | undefined =
180
176
  FORMATS.get(str);
177
+ validate(
178
+ identifier,
179
+ metadata,
180
+ output,
181
+ "format",
182
+ value === "date" || value === "datetime" ? "Date" : "string",
183
+ ["pattern"],
184
+ );
181
185
  if (value === undefined) return null;
182
186
  return {
183
187
  kind: "format",
@@ -255,14 +259,20 @@ const validate = (
255
259
  metadata: Metadata,
256
260
  output: IMetadataTag[],
257
261
  kind: IMetadataTag["kind"],
258
- type: "array" | "string" | "number",
262
+ type: "array" | "string" | "number" | "Date",
259
263
  neighbors: IMetadataTag["kind"][],
260
264
  ): void => {
261
265
  // TYPE CHECKING
262
266
  if (type === "array") {
263
- if (has_array(metadata) === false)
267
+ if (has_array(new Set())(metadata) === false)
264
268
  throw new Error(WRONG_TYPE(kind, "array", identifier));
265
- } else if (has_atomic(metadata)(type) === false)
269
+ } else if (type === "Date") {
270
+ if (
271
+ has_native("Date")(new Set())(metadata) === false &&
272
+ has_atomic("string")(new Set())(metadata) === false
273
+ )
274
+ throw new Error(WRONG_TYPE(kind, "string", identifier));
275
+ } else if (has_atomic(type)(new Set())(metadata) === false)
266
276
  throw new Error(WRONG_TYPE(kind, type, identifier));
267
277
 
268
278
  // DUPLICATED TAG
@@ -281,20 +291,65 @@ const validate = (
281
291
 
282
292
  // @todo: must block repeated array and tuple type
283
293
  const has_atomic =
284
- (metadata: Metadata) =>
285
- (type: "string" | "number"): boolean =>
286
- metadata.atomics.find(
287
- type === "number"
288
- ? (atom: string) => atom === type || atom === "bigint"
289
- : (atom: string) => atom === type,
290
- ) !== undefined ||
291
- metadata.arrays.some((child) => has_atomic(child.value)(type)) ||
292
- metadata.tuples.some((tuple) =>
293
- tuple.elements.some((child) => has_atomic(child)(type)),
294
+ (type: "string" | "number") =>
295
+ (visited: Set<Metadata>) =>
296
+ (metadata: Metadata): boolean => {
297
+ if (visited.has(metadata)) return false;
298
+ visited.add(metadata);
299
+ return (
300
+ metadata.atomics.find(
301
+ type === "number"
302
+ ? (atom: string) => atom === type || atom === "bigint"
303
+ : (atom: string) => atom === type,
304
+ ) !== undefined ||
305
+ metadata.arrays.some((array) =>
306
+ has_atomic(type)(visited)(array.value),
307
+ ) ||
308
+ metadata.tuples.some((tuple) =>
309
+ tuple.elements.some(has_atomic(type)(visited)),
310
+ ) ||
311
+ metadata.aliases.some((alias) =>
312
+ has_atomic(type)(visited)(alias.value),
313
+ ) ||
314
+ (metadata.resolved !== null &&
315
+ has_atomic(type)(visited)(metadata.resolved.returns))
294
316
  );
317
+ };
295
318
 
296
- const has_array = (metadata: Metadata): boolean =>
297
- metadata.arrays.length !== 0 ||
298
- metadata.tuples.some((tuple) =>
299
- tuple.elements.some((child) => has_array(child)),
300
- );
319
+ const has_native =
320
+ (type: string) =>
321
+ (visited: Set<Metadata>) =>
322
+ (metadata: Metadata): boolean => {
323
+ if (visited.has(metadata)) return false;
324
+ visited.add(metadata);
325
+ return (
326
+ metadata.natives.find((native) => native === type) !== undefined ||
327
+ metadata.arrays.some((child) =>
328
+ has_native(type)(visited)(child.value),
329
+ ) ||
330
+ metadata.tuples.some((tuple) =>
331
+ tuple.elements.some(has_native(type)(visited)),
332
+ ) ||
333
+ metadata.aliases.some((alias) =>
334
+ has_native(type)(visited)(alias.value),
335
+ ) ||
336
+ (metadata.resolved !== null &&
337
+ has_native(type)(visited)(metadata.resolved.returns))
338
+ );
339
+ };
340
+
341
+ const has_array =
342
+ (visited: Set<Metadata>) =>
343
+ (metadata: Metadata): boolean => {
344
+ if (visited.has(metadata)) return false;
345
+ visited.add(metadata);
346
+ return (
347
+ metadata.arrays.length !== 0 ||
348
+ metadata.tuples.some((tuple) =>
349
+ tuple.elements.some(has_array(visited)),
350
+ ) ||
351
+ metadata.aliases.some((alias) => has_array(visited)(alias.value)) ||
352
+ (metadata.resolved !== null &&
353
+ has_array(visited)(metadata.resolved.returns))
354
+ );
355
+ };
@@ -1,33 +1,33 @@
1
- import { Metadata } from "../../../metadata/Metadata";
2
-
3
- import { ArrayUtil } from "../../../utils/ArrayUtil";
4
-
5
- export const emend_metadata_atomics = (meta: Metadata) => {
6
- // ATOMICS
7
- for (const type of meta.atomics) {
8
- const index: number = meta.constants.findIndex((c) => c.type === type);
9
- if (index !== -1) meta.constants.splice(index, 1);
10
- }
11
-
12
- // BOOLEAN
13
- {
14
- const index: number = meta.constants.findIndex(
15
- (c) => c.type === "boolean",
16
- );
17
- if (index !== -1 && meta.constants[index]!.values.length === 2) {
18
- meta.constants.splice(index, 1);
19
- ArrayUtil.take(
20
- meta.atomics,
21
- (type) => type === "boolean",
22
- () => "boolean",
23
- );
24
- }
25
- }
26
-
27
- // TEMPLATE
28
- if (
29
- meta.templates.length &&
30
- meta.atomics.find((type) => type === "string") !== undefined
31
- )
32
- meta.templates.splice(0, meta.templates.length);
33
- };
1
+ import { Metadata } from "../../../metadata/Metadata";
2
+
3
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
4
+
5
+ export const emend_metadata_atomics = (meta: Metadata) => {
6
+ // ATOMICS
7
+ for (const type of meta.atomics) {
8
+ const index: number = meta.constants.findIndex((c) => c.type === type);
9
+ if (index !== -1) meta.constants.splice(index, 1);
10
+ }
11
+
12
+ // BOOLEAN
13
+ {
14
+ const index: number = meta.constants.findIndex(
15
+ (c) => c.type === "boolean",
16
+ );
17
+ if (index !== -1 && meta.constants[index]!.values.length === 2) {
18
+ meta.constants.splice(index, 1);
19
+ ArrayUtil.take(
20
+ meta.atomics,
21
+ (type) => type === "boolean",
22
+ () => "boolean",
23
+ );
24
+ }
25
+ }
26
+
27
+ // TEMPLATE
28
+ if (
29
+ meta.templates.length &&
30
+ meta.atomics.find((type) => type === "string") !== undefined
31
+ )
32
+ meta.templates.splice(0, meta.templates.length);
33
+ };
@@ -1,37 +1,40 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../../../metadata/Metadata";
4
-
5
- import { MetadataCollection } from "../../MetadataCollection";
6
- import { MetadataFactory } from "../../MetadataFactory";
7
- import { emend_metadata_atomics } from "./emend_metadata_atomics";
8
- import { iterate_metadata } from "./iterate_metadata";
9
-
10
- export const explore_metadata =
11
- (checker: ts.TypeChecker) =>
12
- (options: MetadataFactory.IOptions) =>
13
- (collection: MetadataCollection) =>
14
- (
15
- type: ts.Type | null,
16
- parentResolved: boolean,
17
- aliased: boolean = false,
18
- ): Metadata => {
19
- // CONSTRUCT METADATA
20
- const meta: Metadata = Metadata.initialize(parentResolved);
21
- const out = (meta: Metadata) => {
22
- if (options.validate) options.validate(meta);
23
- return meta;
24
- };
25
- if (type === null) return out(meta);
26
-
27
- // ITERATE TYPESCRIPT TYPES
28
- iterate_metadata(checker)(options)(collection)(
29
- meta,
30
- type,
31
- parentResolved,
32
- aliased,
33
- );
34
- emend_metadata_atomics(meta);
35
- if (meta.resolved) emend_metadata_atomics(meta.resolved);
36
- return out(meta);
37
- };
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+
5
+ import { MetadataCollection } from "../../MetadataCollection";
6
+ import { MetadataFactory } from "../../MetadataFactory";
7
+ import { emend_metadata_atomics } from "./emend_metadata_atomics";
8
+ import { iterate_metadata } from "./iterate_metadata";
9
+
10
+ export const explore_metadata =
11
+ (checker: ts.TypeChecker) =>
12
+ (options: MetadataFactory.IOptions) =>
13
+ (collection: MetadataCollection) =>
14
+ (
15
+ type: ts.Type | null,
16
+ parentResolved: boolean,
17
+ aliased: boolean = false,
18
+ ): Metadata => {
19
+ // CONSTRUCT METADATA
20
+ const meta: Metadata = Metadata.initialize(parentResolved);
21
+ const out = (meta: Metadata) => {
22
+ if (options.validate) options.validate(meta);
23
+ return meta;
24
+ };
25
+ if (type === null) return out(meta);
26
+
27
+ // ITERATE TYPESCRIPT TYPES
28
+ iterate_metadata(checker)(options)(collection)(
29
+ meta,
30
+ type,
31
+ parentResolved,
32
+ aliased,
33
+ );
34
+ emend_metadata_atomics(meta);
35
+ if (meta.resolved) {
36
+ emend_metadata_atomics(meta.resolved.original);
37
+ emend_metadata_atomics(meta.resolved.returns);
38
+ }
39
+ return out(meta);
40
+ };
@@ -1,85 +1,85 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../../../metadata/Metadata";
4
-
5
- // import { ArrayUtil } from "../../../utils/ArrayUtil";
6
- import { MetadataCollection } from "../../MetadataCollection";
7
- import { MetadataFactory } from "../../MetadataFactory";
8
- import { iterate_metadata_alias } from "./iterate_metadata_alias";
9
- import { iterate_metadata_array } from "./iterate_metadata_array";
10
- import { iterate_metadata_atomic } from "./iterate_metadata_atomic";
11
- import { iterate_metadata_coalesce } from "./iterate_metadata_coalesce";
12
- import { iterate_metadata_constant } from "./iterate_metadata_constant";
13
- import { iterate_metadata_intersection } from "./iterate_metadata_intersection";
14
- import { iterate_metadata_map } from "./iterate_metadata_map";
15
- import { iterate_metadata_native } from "./iterate_metadata_native";
16
- import { iterate_metadata_object } from "./iterate_metadata_object";
17
- import { iterate_metadata_resolve } from "./iterate_metadata_resolve";
18
- import { iterate_metadata_set } from "./iterate_metadata_set";
19
- import { iterate_metadata_template } from "./iterate_metadata_template";
20
- import { iterate_metadata_tuple } from "./iterate_metadata_tuple";
21
- import { iterate_metadata_union } from "./iterate_metadata_union";
22
-
23
- export const iterate_metadata =
24
- (checker: ts.TypeChecker) =>
25
- (options: MetadataFactory.IOptions) =>
26
- (collection: MetadataCollection) =>
27
- (
28
- meta: Metadata,
29
- type: ts.Type,
30
- resolved: boolean,
31
- aliased: boolean,
32
- ): void => {
33
- if (type.isTypeParameter() === true)
34
- throw new Error(
35
- `Error on typia.MetadataFactory.generate(): non-specified generic argument on ${meta.getName()}.`,
36
- );
37
- // CHECK SPECIAL CASES
38
- if (
39
- (aliased !== true &&
40
- iterate_metadata_alias(checker)(options)(collection)(
41
- meta,
42
- type,
43
- )) ||
44
- iterate_metadata_intersection(checker)(options)(collection)(
45
- meta,
46
- type,
47
- resolved,
48
- aliased,
49
- ) ||
50
- iterate_metadata_union(checker)(options)(collection)(
51
- meta,
52
- type,
53
- resolved,
54
- ) ||
55
- iterate_metadata_resolve(checker)(options)(collection)(
56
- meta,
57
- type,
58
- resolved,
59
- aliased,
60
- )
61
- )
62
- return;
63
-
64
- // ITERATE CASES
65
- iterate_metadata_coalesce(meta, type) ||
66
- iterate_metadata_constant(checker)(options)(meta, type) ||
67
- iterate_metadata_template(checker)(options)(collection)(
68
- meta,
69
- type,
70
- ) ||
71
- iterate_metadata_atomic(meta, type) ||
72
- iterate_metadata_tuple(checker)(options)(collection)(
73
- meta,
74
- type as ts.TupleType,
75
- ) ||
76
- iterate_metadata_array(checker)(options)(collection)(meta, type) ||
77
- iterate_metadata_native(checker)(meta, type) ||
78
- iterate_metadata_map(checker)(options)(collection)(meta, type) ||
79
- iterate_metadata_set(checker)(options)(collection)(meta, type) ||
80
- iterate_metadata_object(checker)(options)(collection)(
81
- meta,
82
- type,
83
- resolved,
84
- );
85
- };
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+
5
+ // import { ArrayUtil } from "../../../utils/ArrayUtil";
6
+ import { MetadataCollection } from "../../MetadataCollection";
7
+ import { MetadataFactory } from "../../MetadataFactory";
8
+ import { iterate_metadata_alias } from "./iterate_metadata_alias";
9
+ import { iterate_metadata_array } from "./iterate_metadata_array";
10
+ import { iterate_metadata_atomic } from "./iterate_metadata_atomic";
11
+ import { iterate_metadata_coalesce } from "./iterate_metadata_coalesce";
12
+ import { iterate_metadata_constant } from "./iterate_metadata_constant";
13
+ import { iterate_metadata_intersection } from "./iterate_metadata_intersection";
14
+ import { iterate_metadata_map } from "./iterate_metadata_map";
15
+ import { iterate_metadata_native } from "./iterate_metadata_native";
16
+ import { iterate_metadata_object } from "./iterate_metadata_object";
17
+ import { iterate_metadata_resolve } from "./iterate_metadata_resolve";
18
+ import { iterate_metadata_set } from "./iterate_metadata_set";
19
+ import { iterate_metadata_template } from "./iterate_metadata_template";
20
+ import { iterate_metadata_tuple } from "./iterate_metadata_tuple";
21
+ import { iterate_metadata_union } from "./iterate_metadata_union";
22
+
23
+ export const iterate_metadata =
24
+ (checker: ts.TypeChecker) =>
25
+ (options: MetadataFactory.IOptions) =>
26
+ (collection: MetadataCollection) =>
27
+ (
28
+ meta: Metadata,
29
+ type: ts.Type,
30
+ resolved: boolean,
31
+ aliased: boolean,
32
+ ): void => {
33
+ if (type.isTypeParameter() === true)
34
+ throw new Error(
35
+ `Error on typia.MetadataFactory.generate(): non-specified generic argument on ${meta.getName()}.`,
36
+ );
37
+ // CHECK SPECIAL CASES
38
+ if (
39
+ (aliased !== true &&
40
+ iterate_metadata_alias(checker)(options)(collection)(
41
+ meta,
42
+ type,
43
+ )) ||
44
+ iterate_metadata_intersection(checker)(options)(collection)(
45
+ meta,
46
+ type,
47
+ resolved,
48
+ aliased,
49
+ ) ||
50
+ iterate_metadata_union(checker)(options)(collection)(
51
+ meta,
52
+ type,
53
+ resolved,
54
+ ) ||
55
+ iterate_metadata_resolve(checker)(options)(collection)(
56
+ meta,
57
+ type,
58
+ resolved,
59
+ aliased,
60
+ )
61
+ )
62
+ return;
63
+
64
+ // ITERATE CASES
65
+ iterate_metadata_coalesce(meta, type) ||
66
+ iterate_metadata_constant(checker)(options)(meta, type) ||
67
+ iterate_metadata_template(checker)(options)(collection)(
68
+ meta,
69
+ type,
70
+ ) ||
71
+ iterate_metadata_atomic(meta, type) ||
72
+ iterate_metadata_tuple(checker)(options)(collection)(
73
+ meta,
74
+ type as ts.TupleType,
75
+ ) ||
76
+ iterate_metadata_array(checker)(options)(collection)(meta, type) ||
77
+ iterate_metadata_native(checker)(meta, type) ||
78
+ iterate_metadata_map(checker)(options)(collection)(meta, type) ||
79
+ iterate_metadata_set(checker)(options)(collection)(meta, type) ||
80
+ iterate_metadata_object(checker)(options)(collection)(
81
+ meta,
82
+ type,
83
+ resolved,
84
+ );
85
+ };
@@ -56,7 +56,7 @@ const isArrayRecursive =
56
56
  meta.maps.some((m) => isArrayRecursive(visited)(array)(m.value)) ||
57
57
  meta.sets.some((s) => isArrayRecursive(visited)(array)(s)) ||
58
58
  (meta.resolved !== null &&
59
- isArrayRecursive(visited)(array)(meta.resolved)) ||
59
+ isArrayRecursive(visited)(array)(meta.resolved.returns)) ||
60
60
  (meta.rest !== null && isArrayRecursive(visited)(array)(meta.rest))
61
61
  );
62
62
  };
@@ -84,7 +84,7 @@ const isTupleRecursive =
84
84
  isTupleRecursive(visited)(tuple)(d.value),
85
85
  ) ||
86
86
  (meta.resolved !== null &&
87
- isTupleRecursive(visited)(tuple)(meta.resolved)) ||
87
+ isTupleRecursive(visited)(tuple)(meta.resolved.returns)) ||
88
88
  (meta.rest !== null && isTupleRecursive(visited)(tuple)(meta.rest))
89
89
  );
90
90
  };
@@ -124,7 +124,7 @@ const isObjectRecursive =
124
124
  ) ||
125
125
  meta.sets.some((value) => isObjectRecursive(visited)(obj)(value)) ||
126
126
  (meta.resolved !== null &&
127
- isObjectRecursive(visited)(obj)(meta.resolved)) ||
127
+ isObjectRecursive(visited)(obj)(meta.resolved.returns)) ||
128
128
  (meta.rest !== null && isObjectRecursive(visited)(obj)(meta.rest))
129
129
  );
130
130
  };
@@ -1,38 +1,49 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../../../metadata/Metadata";
4
-
5
- import { Writable } from "../../../typings/Writable";
6
-
7
- import { MetadataCollection } from "../../MetadataCollection";
8
- import { MetadataFactory } from "../../MetadataFactory";
9
- import { TypeFactory } from "../../TypeFactory";
10
- import { iterate_metadata } from "./iterate_metadata";
11
-
12
- // import { iterate_metadata_coalesce } from "./iterate_metadata_coalesce";
13
-
14
- export const iterate_metadata_resolve =
15
- (checker: ts.TypeChecker) =>
16
- (options: MetadataFactory.IOptions) =>
17
- (collection: MetadataCollection) =>
18
- (
19
- meta: Metadata,
20
- type: ts.Type,
21
- resolved: boolean,
22
- aliased: boolean,
23
- ): boolean => {
24
- if (options.resolve === false || resolved === true) return false;
25
-
26
- const escaped: ts.Type | null = TypeFactory.resolve(checker)(type);
27
- if (escaped === null) return false;
28
-
29
- if (meta.resolved === null)
30
- Writable(meta).resolved = Metadata.initialize();
31
- iterate_metadata(checker)(options)(collection)(
32
- meta.resolved!,
33
- escaped,
34
- true,
35
- aliased,
36
- );
37
- return true;
38
- };
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+ import { MetadataResolved } from "../../../metadata/MetadataResolved";
5
+
6
+ import { Writable } from "../../../typings/Writable";
7
+
8
+ import { MetadataCollection } from "../../MetadataCollection";
9
+ import { MetadataFactory } from "../../MetadataFactory";
10
+ import { TypeFactory } from "../../TypeFactory";
11
+ import { iterate_metadata } from "./iterate_metadata";
12
+
13
+ // import { iterate_metadata_coalesce } from "./iterate_metadata_coalesce";
14
+
15
+ export const iterate_metadata_resolve =
16
+ (checker: ts.TypeChecker) =>
17
+ (options: MetadataFactory.IOptions) =>
18
+ (collection: MetadataCollection) =>
19
+ (
20
+ meta: Metadata,
21
+ type: ts.Type,
22
+ resolved: boolean,
23
+ aliased: boolean,
24
+ ): boolean => {
25
+ if (options.resolve === false || resolved === true) return false;
26
+
27
+ const escaped: ts.Type | null = TypeFactory.resolve(checker)(type);
28
+ if (escaped === null) return false;
29
+
30
+ if (meta.resolved === null) {
31
+ Writable(meta).resolved = MetadataResolved.create({
32
+ original: Metadata.initialize(),
33
+ returns: Metadata.initialize(),
34
+ });
35
+ }
36
+ iterate_metadata(checker)(options)(collection)(
37
+ meta.resolved!.original,
38
+ type,
39
+ true,
40
+ aliased,
41
+ );
42
+ iterate_metadata(checker)(options)(collection)(
43
+ meta.resolved!.returns,
44
+ escaped,
45
+ true,
46
+ aliased,
47
+ );
48
+ return true;
49
+ };
@@ -27,7 +27,8 @@ const iterate =
27
27
  // ITERATE CHILDREN
28
28
  for (const map of meta.maps) iterate(visited)(collection)(map.value);
29
29
  for (const set of meta.sets) iterate(visited)(collection)(set);
30
- if (meta.resolved !== null) iterate(visited)(collection)(meta.resolved);
30
+ if (meta.resolved !== null)
31
+ iterate(visited)(collection)(meta.resolved.returns);
31
32
  if (meta.rest !== null) iterate(visited)(collection)(meta.rest);
32
33
 
33
34
  // SORT OBJECTS
@@ -1,24 +1,24 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../../../metadata/Metadata";
4
-
5
- import { MetadataCollection } from "../../MetadataCollection";
6
- import { MetadataFactory } from "../../MetadataFactory";
7
- import { iterate_metadata } from "./iterate_metadata";
8
-
9
- export const iterate_metadata_union =
10
- (checker: ts.TypeChecker) =>
11
- (options: MetadataFactory.IOptions) =>
12
- (collection: MetadataCollection) =>
13
- (meta: Metadata, type: ts.Type, parentResolved: boolean): boolean => {
14
- if (!type.isUnion()) return false;
15
- type.types.forEach((t) =>
16
- iterate_metadata(checker)(options)(collection)(
17
- meta,
18
- t,
19
- parentResolved,
20
- false,
21
- ),
22
- );
23
- return true;
24
- };
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+
5
+ import { MetadataCollection } from "../../MetadataCollection";
6
+ import { MetadataFactory } from "../../MetadataFactory";
7
+ import { iterate_metadata } from "./iterate_metadata";
8
+
9
+ export const iterate_metadata_union =
10
+ (checker: ts.TypeChecker) =>
11
+ (options: MetadataFactory.IOptions) =>
12
+ (collection: MetadataCollection) =>
13
+ (meta: Metadata, type: ts.Type, parentResolved: boolean): boolean => {
14
+ if (!type.isUnion()) return false;
15
+ type.types.forEach((t) =>
16
+ iterate_metadata(checker)(options)(collection)(
17
+ meta,
18
+ t,
19
+ parentResolved,
20
+ false,
21
+ ),
22
+ );
23
+ return true;
24
+ };
@@ -2,6 +2,7 @@ import { Atomic } from "../typings/Atomic";
2
2
 
3
3
  import { IMetadataConstant } from "./IMetadataConstant";
4
4
  import { IMetadataEntry } from "./IMetadataEntry";
5
+ import { IMetadataResolved } from "./IMetadataResolved";
5
6
 
6
7
  export interface IMetadata {
7
8
  any: boolean;
@@ -13,7 +14,7 @@ export interface IMetadata {
13
14
  atomics: Atomic.Literal[];
14
15
  constants: IMetadataConstant[];
15
16
  templates: IMetadata[][];
16
- resolved: IMetadata | null;
17
+ resolved: IMetadataResolved | null;
17
18
 
18
19
  rest: IMetadata | null;
19
20
  arrays: string[];
@@ -0,0 +1,6 @@
1
+ import { IMetadata } from "./IMetadata";
2
+
3
+ export interface IMetadataResolved {
4
+ original: IMetadata;
5
+ returns: IMetadata;
6
+ }