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.
- package/lib/factories/MetadataTagFactory.js +64 -20
- package/lib/factories/MetadataTagFactory.js.map +1 -1
- package/lib/factories/internal/metadata/explore_metadata.js +4 -2
- package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_collection.js +3 -3
- package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_resolve.js +9 -3
- package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_sort.js +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
- package/lib/metadata/IMetadata.d.ts +2 -1
- package/lib/metadata/IMetadataResolved.d.ts +5 -0
- package/lib/metadata/IMetadataResolved.js +3 -0
- package/lib/metadata/IMetadataResolved.js.map +1 -0
- package/lib/metadata/Metadata.d.ts +2 -1
- package/lib/metadata/Metadata.js +31 -24
- package/lib/metadata/Metadata.js.map +1 -1
- package/lib/metadata/MetadataArray.d.ts +4 -2
- package/lib/metadata/MetadataArray.js.map +1 -1
- package/lib/metadata/MetadataResolved.d.ts +12 -0
- package/lib/metadata/MetadataResolved.js +31 -0
- package/lib/metadata/MetadataResolved.js.map +1 -0
- package/lib/programmers/CloneProgrammer.js +1 -1
- package/lib/programmers/CloneProgrammer.js.map +1 -1
- package/lib/programmers/RandomProgrammer.js +1 -1
- package/lib/programmers/RandomProgrammer.js.map +1 -1
- package/lib/programmers/StringifyProgrammer.js +1 -1
- package/lib/programmers/StringifyProgrammer.js.map +1 -1
- package/lib/programmers/helpers/StringifyPredicator.js +1 -1
- package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
- package/lib/programmers/internal/application_resolved.d.ts +4 -0
- package/lib/programmers/internal/application_resolved.js +50 -0
- package/lib/programmers/internal/application_resolved.js.map +1 -0
- package/lib/programmers/internal/application_schema.js +28 -5
- package/lib/programmers/internal/application_schema.js.map +1 -1
- package/lib/transformers/features/miscellaneous/MetadataTransformer.js +1 -1
- package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
- package/package.json +1 -1
- package/src/factories/MetadataTagFactory.ts +80 -25
- package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
- package/src/factories/internal/metadata/explore_metadata.ts +40 -37
- package/src/factories/internal/metadata/iterate_metadata.ts +85 -85
- package/src/factories/internal/metadata/iterate_metadata_collection.ts +3 -3
- package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -38
- package/src/factories/internal/metadata/iterate_metadata_sort.ts +2 -1
- package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
- package/src/metadata/IMetadata.ts +2 -1
- package/src/metadata/IMetadataResolved.ts +6 -0
- package/src/metadata/Metadata.ts +17 -4
- package/src/metadata/MetadataArray.ts +4 -1
- package/src/metadata/MetadataResolved.ts +51 -0
- package/src/programmers/CloneProgrammer.ts +1 -1
- package/src/programmers/RandomProgrammer.ts +5 -1
- package/src/programmers/StringifyProgrammer.ts +983 -983
- package/src/programmers/helpers/StringifyPredicator.ts +1 -1
- package/src/programmers/internal/application_resolved.ts +55 -0
- package/src/programmers/internal/application_schema.ts +7 -6
- 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(
|
|
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 (
|
|
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
|
-
(
|
|
285
|
-
(
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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)
|
|
36
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
(
|
|
17
|
-
(
|
|
18
|
-
(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
)
|
|
37
|
-
|
|
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)
|
|
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:
|
|
17
|
+
resolved: IMetadataResolved | null;
|
|
17
18
|
|
|
18
19
|
rest: IMetadata | null;
|
|
19
20
|
arrays: string[];
|