typia 4.0.10-dev.20230615 → 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 (61) hide show
  1. package/lib/factories/MetadataTagFactory.js +3 -3
  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 +3 -3
  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_alias.ts +30 -30
  44. package/src/factories/internal/metadata/iterate_metadata_collection.ts +3 -3
  45. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +87 -87
  46. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -38
  47. package/src/factories/internal/metadata/iterate_metadata_sort.ts +2 -1
  48. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  49. package/src/metadata/IMetadata.ts +2 -1
  50. package/src/metadata/IMetadataResolved.ts +6 -0
  51. package/src/metadata/Metadata.ts +17 -4
  52. package/src/metadata/MetadataArray.ts +4 -1
  53. package/src/metadata/MetadataResolved.ts +51 -0
  54. package/src/programmers/CloneProgrammer.ts +1 -1
  55. package/src/programmers/RandomProgrammer.ts +5 -1
  56. package/src/programmers/StringifyProgrammer.ts +983 -983
  57. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  58. package/src/programmers/helpers/StringifyPredicator.ts +1 -1
  59. package/src/programmers/internal/application_resolved.ts +55 -0
  60. package/src/programmers/internal/application_schema.ts +7 -6
  61. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +1 -1
@@ -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
+ };
@@ -1,30 +1,30 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../../../metadata/Metadata";
4
- import { MetadataAlias } from "../../../metadata/MetadataAlias";
5
-
6
- import { ArrayUtil } from "../../../utils/ArrayUtil";
7
-
8
- import { MetadataCollection } from "../../MetadataCollection";
9
- import { MetadataFactory } from "../../MetadataFactory";
10
- import { emplace_metadata_definition } from "./emplace_metadata_definition";
11
-
12
- export const iterate_metadata_alias =
13
- (checker: ts.TypeChecker) =>
14
- (options: MetadataFactory.IOptions) =>
15
- (collection: MetadataCollection) =>
16
- (meta: Metadata, type: ts.Type): boolean => {
17
- if (options.absorb !== false || type.aliasSymbol === undefined)
18
- return false;
19
-
20
- const node: ts.Declaration | undefined =
21
- type.aliasSymbol.declarations?.[0];
22
- if (node === undefined) return false;
23
-
24
- // CONSTRUCT DEFINITION
25
- const alias: MetadataAlias = emplace_metadata_definition(checker)(
26
- options,
27
- )(collection)(type, meta.nullable);
28
- ArrayUtil.add(meta.aliases, alias, (elem) => elem.name === alias.name);
29
- return true;
30
- };
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+ import { MetadataAlias } from "../../../metadata/MetadataAlias";
5
+
6
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
7
+
8
+ import { MetadataCollection } from "../../MetadataCollection";
9
+ import { MetadataFactory } from "../../MetadataFactory";
10
+ import { emplace_metadata_definition } from "./emplace_metadata_definition";
11
+
12
+ export const iterate_metadata_alias =
13
+ (checker: ts.TypeChecker) =>
14
+ (options: MetadataFactory.IOptions) =>
15
+ (collection: MetadataCollection) =>
16
+ (meta: Metadata, type: ts.Type): boolean => {
17
+ if (options.absorb !== false || type.aliasSymbol === undefined)
18
+ return false;
19
+
20
+ const node: ts.Declaration | undefined =
21
+ type.aliasSymbol.declarations?.[0];
22
+ if (node === undefined) return false;
23
+
24
+ // CONSTRUCT DEFINITION
25
+ const alias: MetadataAlias = emplace_metadata_definition(checker)(
26
+ options,
27
+ )(collection)(type, meta.nullable);
28
+ ArrayUtil.add(meta.aliases, alias, (elem) => elem.name === alias.name);
29
+ return true;
30
+ };
@@ -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,87 +1,87 @@
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 { explore_metadata } from "./explore_metadata";
8
- import { iterate_metadata } from "./iterate_metadata";
9
- import { iterate_metadata_object } from "./iterate_metadata_object";
10
-
11
- export const iterate_metadata_intersection =
12
- (checker: ts.TypeChecker) =>
13
- (options: MetadataFactory.IOptions) =>
14
- (collection: MetadataCollection) =>
15
- (
16
- meta: Metadata,
17
- type: ts.Type,
18
- resolved: boolean,
19
- aliased: boolean,
20
- ): boolean => {
21
- if (!type.isIntersection()) return false;
22
-
23
- // COSTRUCT FAKE METADATA LIST
24
- const fakeCollection: MetadataCollection = new MetadataCollection();
25
- const children: Metadata[] = [
26
- ...new Map(
27
- type.types.map((t) => {
28
- const m: Metadata = explore_metadata(checker)({
29
- ...options,
30
- absorb: true,
31
- })(fakeCollection)(t, resolved);
32
- return [m.getName(), m] as const;
33
- }),
34
- ).values(),
35
- ];
36
-
37
- // ONLY ONE CHILD AFTER REMOVING DUPLICATES
38
- if (children.length === 1) {
39
- iterate_metadata(checker)(options)(collection)(
40
- meta,
41
- type.types[0]!,
42
- resolved,
43
- aliased,
44
- );
45
- return true;
46
- }
47
-
48
- // ONLY OBJECT TYPES -> MERGE
49
- const object: boolean = children.every(
50
- (c) => c.objects.length && c.objects.length === c.size(),
51
- );
52
- if (object)
53
- return iterate_metadata_object(checker)(options)(collection)(
54
- meta,
55
- type,
56
- resolved,
57
- true,
58
- );
59
-
60
- // ABSORB TO ATOMIC (OR CONSTANT) TYPE
61
- const atomics: Metadata[] = children.filter(
62
- (c) =>
63
- (c.atomics.length ? 1 : 0 + c.constants.length ? 1 : 0) ===
64
- c.bucket(),
65
- );
66
- const objects: Metadata[] = children.filter(
67
- (c) => c.objects.length && c.objects.length === c.size(),
68
- );
69
- if (
70
- atomics.length === 0 ||
71
- atomics.length + objects.length !== children.length
72
- )
73
- throw new Error(message(children));
74
-
75
- const least: Metadata = atomics.reduce((x, y) => {
76
- if (Metadata.covers(x, y)) return y;
77
- else if (Metadata.covers(y, x)) return x;
78
- throw new Error(message(children));
79
- });
80
- Object.assign(meta, Metadata.merge(meta, least));
81
- return true;
82
- };
83
-
84
- const message = (children: Metadata[]) =>
85
- `Error on typia.MetadataFactory.analyze(): nonsensible intersection type detected - ${children
86
- .map((c) => c.getName())
87
- .join(" & ")}.`;
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 { explore_metadata } from "./explore_metadata";
8
+ import { iterate_metadata } from "./iterate_metadata";
9
+ import { iterate_metadata_object } from "./iterate_metadata_object";
10
+
11
+ export const iterate_metadata_intersection =
12
+ (checker: ts.TypeChecker) =>
13
+ (options: MetadataFactory.IOptions) =>
14
+ (collection: MetadataCollection) =>
15
+ (
16
+ meta: Metadata,
17
+ type: ts.Type,
18
+ resolved: boolean,
19
+ aliased: boolean,
20
+ ): boolean => {
21
+ if (!type.isIntersection()) return false;
22
+
23
+ // COSTRUCT FAKE METADATA LIST
24
+ const fakeCollection: MetadataCollection = new MetadataCollection();
25
+ const children: Metadata[] = [
26
+ ...new Map(
27
+ type.types.map((t) => {
28
+ const m: Metadata = explore_metadata(checker)({
29
+ ...options,
30
+ absorb: true,
31
+ })(fakeCollection)(t, resolved);
32
+ return [m.getName(), m] as const;
33
+ }),
34
+ ).values(),
35
+ ];
36
+
37
+ // ONLY ONE CHILD AFTER REMOVING DUPLICATES
38
+ if (children.length === 1) {
39
+ iterate_metadata(checker)(options)(collection)(
40
+ meta,
41
+ type.types[0]!,
42
+ resolved,
43
+ aliased,
44
+ );
45
+ return true;
46
+ }
47
+
48
+ // ONLY OBJECT TYPES -> MERGE
49
+ const object: boolean = children.every(
50
+ (c) => c.objects.length && c.objects.length === c.size(),
51
+ );
52
+ if (object)
53
+ return iterate_metadata_object(checker)(options)(collection)(
54
+ meta,
55
+ type,
56
+ resolved,
57
+ true,
58
+ );
59
+
60
+ // ABSORB TO ATOMIC (OR CONSTANT) TYPE
61
+ const atomics: Metadata[] = children.filter(
62
+ (c) =>
63
+ (c.atomics.length ? 1 : 0 + c.constants.length ? 1 : 0) ===
64
+ c.bucket(),
65
+ );
66
+ const objects: Metadata[] = children.filter(
67
+ (c) => c.objects.length && c.objects.length === c.size(),
68
+ );
69
+ if (
70
+ atomics.length === 0 ||
71
+ atomics.length + objects.length !== children.length
72
+ )
73
+ throw new Error(message(children));
74
+
75
+ const least: Metadata = atomics.reduce((x, y) => {
76
+ if (Metadata.covers(x, y)) return y;
77
+ else if (Metadata.covers(y, x)) return x;
78
+ throw new Error(message(children));
79
+ });
80
+ Object.assign(meta, Metadata.merge(meta, least));
81
+ return true;
82
+ };
83
+
84
+ const message = (children: Metadata[]) =>
85
+ `Error on typia.MetadataFactory.analyze(): nonsensible intersection type detected - ${children
86
+ .map((c) => c.getName())
87
+ .join(" & ")}.`;
@@ -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