typia 4.0.9 → 4.0.10-dev.20230615
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/package.json +1 -1
- package/src/factories/MetadataTagFactory.ts +80 -25
- package/src/factories/internal/metadata/iterate_metadata_alias.ts +30 -30
- package/src/factories/internal/metadata/iterate_metadata_intersection.ts +87 -87
- package/src/programmers/helpers/PruneJoiner.ts +143 -143
|
@@ -77,7 +77,7 @@ var MetadataTagFactory;
|
|
|
77
77
|
};
|
|
78
78
|
},
|
|
79
79
|
type: function (_identifier, metadata, text, _output) {
|
|
80
|
-
return has_atomic(
|
|
80
|
+
return has_atomic("number")(new Set())(metadata) &&
|
|
81
81
|
(text === "int" || text === "uint")
|
|
82
82
|
? { kind: "type", value: text }
|
|
83
83
|
: text === "{int}" || text === "{uint}"
|
|
@@ -140,10 +140,8 @@ var MetadataTagFactory;
|
|
|
140
140
|
};
|
|
141
141
|
},
|
|
142
142
|
format: function (identifier, metadata, str, output) {
|
|
143
|
-
validate(identifier, metadata, output, "format", "string", [
|
|
144
|
-
"pattern",
|
|
145
|
-
]);
|
|
146
143
|
var value = FORMATS.get(str);
|
|
144
|
+
validate(identifier, metadata, output, "format", value === "date" || value === "datetime" ? "Date" : "string", ["pattern"]);
|
|
147
145
|
if (value === undefined)
|
|
148
146
|
return null;
|
|
149
147
|
return {
|
|
@@ -212,10 +210,15 @@ var WRONG_TYPE = function (tag, type, identifier) { return "".concat(LABEL, ": "
|
|
|
212
210
|
var validate = function (identifier, metadata, output, kind, type, neighbors) {
|
|
213
211
|
var e_2, _a;
|
|
214
212
|
if (type === "array") {
|
|
215
|
-
if (has_array(metadata) === false)
|
|
213
|
+
if (has_array(new Set())(metadata) === false)
|
|
216
214
|
throw new Error(WRONG_TYPE(kind, "array", identifier));
|
|
217
215
|
}
|
|
218
|
-
else if (
|
|
216
|
+
else if (type === "Date") {
|
|
217
|
+
if (has_native("Date")(new Set())(metadata) === false &&
|
|
218
|
+
has_atomic("string")(new Set())(metadata) === false)
|
|
219
|
+
throw new Error(WRONG_TYPE(kind, "string", identifier));
|
|
220
|
+
}
|
|
221
|
+
else if (has_atomic(type)(new Set())(metadata) === false)
|
|
219
222
|
throw new Error(WRONG_TYPE(kind, type, identifier));
|
|
220
223
|
if (output.some(function (tag) { return tag.kind === kind; }))
|
|
221
224
|
throw new Error("".concat(LABEL, ": duplicated ").concat(kind, " tags on \"").concat(identifier(), "\"."));
|
|
@@ -237,21 +240,62 @@ var validate = function (identifier, metadata, output, kind, type, neighbors) {
|
|
|
237
240
|
finally { if (e_2) throw e_2.error; }
|
|
238
241
|
}
|
|
239
242
|
};
|
|
240
|
-
var has_atomic = function (
|
|
241
|
-
return function (
|
|
242
|
-
return metadata
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
metadata.
|
|
247
|
-
|
|
248
|
-
|
|
243
|
+
var has_atomic = function (type) {
|
|
244
|
+
return function (visited) {
|
|
245
|
+
return function (metadata) {
|
|
246
|
+
if (visited.has(metadata))
|
|
247
|
+
return false;
|
|
248
|
+
visited.add(metadata);
|
|
249
|
+
return (metadata.atomics.find(type === "number"
|
|
250
|
+
? function (atom) { return atom === type || atom === "bigint"; }
|
|
251
|
+
: function (atom) { return atom === type; }) !== undefined ||
|
|
252
|
+
metadata.arrays.some(function (array) {
|
|
253
|
+
return has_atomic(type)(visited)(array.value);
|
|
254
|
+
}) ||
|
|
255
|
+
metadata.tuples.some(function (tuple) {
|
|
256
|
+
return tuple.elements.some(has_atomic(type)(visited));
|
|
257
|
+
}) ||
|
|
258
|
+
metadata.aliases.some(function (alias) {
|
|
259
|
+
return has_atomic(type)(visited)(alias.value);
|
|
260
|
+
}) ||
|
|
261
|
+
(metadata.resolved !== null &&
|
|
262
|
+
has_atomic(type)(visited)(metadata.resolved)));
|
|
263
|
+
};
|
|
249
264
|
};
|
|
250
265
|
};
|
|
251
|
-
var
|
|
252
|
-
return
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
266
|
+
var has_native = function (type) {
|
|
267
|
+
return function (visited) {
|
|
268
|
+
return function (metadata) {
|
|
269
|
+
if (visited.has(metadata))
|
|
270
|
+
return false;
|
|
271
|
+
visited.add(metadata);
|
|
272
|
+
return (metadata.natives.find(function (native) { return native === type; }) !== undefined ||
|
|
273
|
+
metadata.arrays.some(function (child) {
|
|
274
|
+
return has_native(type)(visited)(child.value);
|
|
275
|
+
}) ||
|
|
276
|
+
metadata.tuples.some(function (tuple) {
|
|
277
|
+
return tuple.elements.some(has_native(type)(visited));
|
|
278
|
+
}) ||
|
|
279
|
+
metadata.aliases.some(function (alias) {
|
|
280
|
+
return has_native(type)(visited)(alias.value);
|
|
281
|
+
}) ||
|
|
282
|
+
(metadata.resolved !== null &&
|
|
283
|
+
has_native(type)(visited)(metadata.resolved)));
|
|
284
|
+
};
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
var has_array = function (visited) {
|
|
288
|
+
return function (metadata) {
|
|
289
|
+
if (visited.has(metadata))
|
|
290
|
+
return false;
|
|
291
|
+
visited.add(metadata);
|
|
292
|
+
return (metadata.arrays.length !== 0 ||
|
|
293
|
+
metadata.tuples.some(function (tuple) {
|
|
294
|
+
return tuple.elements.some(has_array(visited));
|
|
295
|
+
}) ||
|
|
296
|
+
metadata.aliases.some(function (alias) { return has_array(visited)(alias.value); }) ||
|
|
297
|
+
(metadata.resolved !== null &&
|
|
298
|
+
has_array(visited)(metadata.resolved)));
|
|
299
|
+
};
|
|
256
300
|
};
|
|
257
301
|
//# sourceMappingURL=MetadataTagFactory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataTagFactory.js","sourceRoot":"","sources":["../../src/factories/MetadataTagFactory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAKA,IAAiB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"MetadataTagFactory.js","sourceRoot":"","sources":["../../src/factories/MetadataTagFactory.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -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))
|
|
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))
|
|
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))
|
|
354
|
+
);
|
|
355
|
+
};
|
|
@@ -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
|
+
};
|
|
@@ -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,143 +1,143 @@
|
|
|
1
|
-
import ts from "typescript";
|
|
2
|
-
|
|
3
|
-
import { IdentifierFactory } from "../../factories/IdentifierFactory";
|
|
4
|
-
|
|
5
|
-
import { MetadataObject } from "../../metadata/MetadataObject";
|
|
6
|
-
|
|
7
|
-
import { ArrayUtil } from "../../utils/ArrayUtil";
|
|
8
|
-
|
|
9
|
-
import { metadata_to_pattern } from "../internal/metadata_to_pattern";
|
|
10
|
-
import { prune_object_properties } from "../internal/prune_object_properties";
|
|
11
|
-
import { IExpressionEntry } from "./IExpressionEntry";
|
|
12
|
-
|
|
13
|
-
export namespace PruneJoiner {
|
|
14
|
-
export const object = (
|
|
15
|
-
input: ts.Expression,
|
|
16
|
-
entries: IExpressionEntry[],
|
|
17
|
-
obj: MetadataObject,
|
|
18
|
-
): ts.ConciseBody => {
|
|
19
|
-
// PREPARE ASSETS
|
|
20
|
-
const regular = entries.filter((entry) => entry.key.isSoleLiteral());
|
|
21
|
-
const dynamic = entries.filter((entry) => !entry.key.isSoleLiteral());
|
|
22
|
-
|
|
23
|
-
const statements: ts.Statement[] = ArrayUtil.flat(
|
|
24
|
-
regular.map((entry) =>
|
|
25
|
-
ts.isBlock(entry.expression)
|
|
26
|
-
? [...entry.expression.statements]
|
|
27
|
-
: [ts.factory.createExpressionStatement(entry.expression)],
|
|
28
|
-
),
|
|
29
|
-
);
|
|
30
|
-
if (dynamic.length)
|
|
31
|
-
statements.push(
|
|
32
|
-
ts.factory.createExpressionStatement(
|
|
33
|
-
iterate_dynamic_properties({ regular, dynamic })(input),
|
|
34
|
-
),
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
statements.push(prune_object_properties(obj));
|
|
38
|
-
return ts.factory.createBlock(statements, true);
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export const array = (input: ts.Expression, arrow: ts.ArrowFunction) =>
|
|
42
|
-
ts.factory.createCallExpression(
|
|
43
|
-
IdentifierFactory.access(input)("forEach"),
|
|
44
|
-
undefined,
|
|
45
|
-
[arrow],
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
export const tuple = (
|
|
49
|
-
children: ts.ConciseBody[],
|
|
50
|
-
rest: ts.ConciseBody | null,
|
|
51
|
-
): ts.Block => {
|
|
52
|
-
const entire: ts.ConciseBody[] = [...children];
|
|
53
|
-
if (rest !== null) entire.push(rest);
|
|
54
|
-
|
|
55
|
-
const statements: ts.Statement[] = ArrayUtil.flat(
|
|
56
|
-
entire.map((elem) =>
|
|
57
|
-
ts.isBlock(elem)
|
|
58
|
-
? [...elem.statements]
|
|
59
|
-
: [ts.factory.createExpressionStatement(elem)],
|
|
60
|
-
),
|
|
61
|
-
);
|
|
62
|
-
return ts.factory.createBlock(statements, true);
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const iterate_dynamic_properties =
|
|
67
|
-
(props: { regular: IExpressionEntry[]; dynamic: IExpressionEntry[] }) =>
|
|
68
|
-
(input: ts.Expression) =>
|
|
69
|
-
ts.factory.createCallExpression(
|
|
70
|
-
IdentifierFactory.access(
|
|
71
|
-
ts.factory.createCallExpression(
|
|
72
|
-
ts.factory.createIdentifier("Object.entries"),
|
|
73
|
-
undefined,
|
|
74
|
-
[input],
|
|
75
|
-
),
|
|
76
|
-
)("forEach"),
|
|
77
|
-
undefined,
|
|
78
|
-
[
|
|
79
|
-
ts.factory.createArrowFunction(
|
|
80
|
-
undefined,
|
|
81
|
-
undefined,
|
|
82
|
-
[
|
|
83
|
-
IdentifierFactory.parameter(
|
|
84
|
-
ts.factory.createArrayBindingPattern(
|
|
85
|
-
["key", "value"].map((l) =>
|
|
86
|
-
ts.factory.createBindingElement(
|
|
87
|
-
undefined,
|
|
88
|
-
undefined,
|
|
89
|
-
ts.factory.createIdentifier(l),
|
|
90
|
-
undefined,
|
|
91
|
-
),
|
|
92
|
-
),
|
|
93
|
-
),
|
|
94
|
-
),
|
|
95
|
-
],
|
|
96
|
-
undefined,
|
|
97
|
-
undefined,
|
|
98
|
-
ts.factory.createBlock(
|
|
99
|
-
[
|
|
100
|
-
ts.factory.createIfStatement(
|
|
101
|
-
ts.factory.createStrictEquality(
|
|
102
|
-
ts.factory.createIdentifier("undefined"),
|
|
103
|
-
ts.factory.createIdentifier("value"),
|
|
104
|
-
),
|
|
105
|
-
ts.factory.createReturnStatement(),
|
|
106
|
-
),
|
|
107
|
-
...props.regular.map(({ key }) =>
|
|
108
|
-
ts.factory.createIfStatement(
|
|
109
|
-
ts.factory.createStrictEquality(
|
|
110
|
-
ts.factory.createStringLiteral(
|
|
111
|
-
key.getSoleLiteral()!,
|
|
112
|
-
),
|
|
113
|
-
ts.factory.createIdentifier("key"),
|
|
114
|
-
),
|
|
115
|
-
ts.factory.createReturnStatement(),
|
|
116
|
-
),
|
|
117
|
-
),
|
|
118
|
-
...props.dynamic.map((dynamic) =>
|
|
119
|
-
ts.factory.createIfStatement(
|
|
120
|
-
ts.factory.createCallExpression(
|
|
121
|
-
ts.factory.createIdentifier(
|
|
122
|
-
`RegExp(/${metadata_to_pattern(
|
|
123
|
-
true,
|
|
124
|
-
)(dynamic.key)}/).test`,
|
|
125
|
-
),
|
|
126
|
-
undefined,
|
|
127
|
-
[ts.factory.createIdentifier("key")],
|
|
128
|
-
),
|
|
129
|
-
ts.isBlock(dynamic.expression)
|
|
130
|
-
? dynamic.expression
|
|
131
|
-
: ts.factory.createBlock([
|
|
132
|
-
ts.factory.createExpressionStatement(
|
|
133
|
-
dynamic.expression,
|
|
134
|
-
),
|
|
135
|
-
]),
|
|
136
|
-
),
|
|
137
|
-
),
|
|
138
|
-
],
|
|
139
|
-
true,
|
|
140
|
-
),
|
|
141
|
-
),
|
|
142
|
-
],
|
|
143
|
-
);
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
|
|
3
|
+
import { IdentifierFactory } from "../../factories/IdentifierFactory";
|
|
4
|
+
|
|
5
|
+
import { MetadataObject } from "../../metadata/MetadataObject";
|
|
6
|
+
|
|
7
|
+
import { ArrayUtil } from "../../utils/ArrayUtil";
|
|
8
|
+
|
|
9
|
+
import { metadata_to_pattern } from "../internal/metadata_to_pattern";
|
|
10
|
+
import { prune_object_properties } from "../internal/prune_object_properties";
|
|
11
|
+
import { IExpressionEntry } from "./IExpressionEntry";
|
|
12
|
+
|
|
13
|
+
export namespace PruneJoiner {
|
|
14
|
+
export const object = (
|
|
15
|
+
input: ts.Expression,
|
|
16
|
+
entries: IExpressionEntry[],
|
|
17
|
+
obj: MetadataObject,
|
|
18
|
+
): ts.ConciseBody => {
|
|
19
|
+
// PREPARE ASSETS
|
|
20
|
+
const regular = entries.filter((entry) => entry.key.isSoleLiteral());
|
|
21
|
+
const dynamic = entries.filter((entry) => !entry.key.isSoleLiteral());
|
|
22
|
+
|
|
23
|
+
const statements: ts.Statement[] = ArrayUtil.flat(
|
|
24
|
+
regular.map((entry) =>
|
|
25
|
+
ts.isBlock(entry.expression)
|
|
26
|
+
? [...entry.expression.statements]
|
|
27
|
+
: [ts.factory.createExpressionStatement(entry.expression)],
|
|
28
|
+
),
|
|
29
|
+
);
|
|
30
|
+
if (dynamic.length)
|
|
31
|
+
statements.push(
|
|
32
|
+
ts.factory.createExpressionStatement(
|
|
33
|
+
iterate_dynamic_properties({ regular, dynamic })(input),
|
|
34
|
+
),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
statements.push(prune_object_properties(obj));
|
|
38
|
+
return ts.factory.createBlock(statements, true);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const array = (input: ts.Expression, arrow: ts.ArrowFunction) =>
|
|
42
|
+
ts.factory.createCallExpression(
|
|
43
|
+
IdentifierFactory.access(input)("forEach"),
|
|
44
|
+
undefined,
|
|
45
|
+
[arrow],
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
export const tuple = (
|
|
49
|
+
children: ts.ConciseBody[],
|
|
50
|
+
rest: ts.ConciseBody | null,
|
|
51
|
+
): ts.Block => {
|
|
52
|
+
const entire: ts.ConciseBody[] = [...children];
|
|
53
|
+
if (rest !== null) entire.push(rest);
|
|
54
|
+
|
|
55
|
+
const statements: ts.Statement[] = ArrayUtil.flat(
|
|
56
|
+
entire.map((elem) =>
|
|
57
|
+
ts.isBlock(elem)
|
|
58
|
+
? [...elem.statements]
|
|
59
|
+
: [ts.factory.createExpressionStatement(elem)],
|
|
60
|
+
),
|
|
61
|
+
);
|
|
62
|
+
return ts.factory.createBlock(statements, true);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const iterate_dynamic_properties =
|
|
67
|
+
(props: { regular: IExpressionEntry[]; dynamic: IExpressionEntry[] }) =>
|
|
68
|
+
(input: ts.Expression) =>
|
|
69
|
+
ts.factory.createCallExpression(
|
|
70
|
+
IdentifierFactory.access(
|
|
71
|
+
ts.factory.createCallExpression(
|
|
72
|
+
ts.factory.createIdentifier("Object.entries"),
|
|
73
|
+
undefined,
|
|
74
|
+
[input],
|
|
75
|
+
),
|
|
76
|
+
)("forEach"),
|
|
77
|
+
undefined,
|
|
78
|
+
[
|
|
79
|
+
ts.factory.createArrowFunction(
|
|
80
|
+
undefined,
|
|
81
|
+
undefined,
|
|
82
|
+
[
|
|
83
|
+
IdentifierFactory.parameter(
|
|
84
|
+
ts.factory.createArrayBindingPattern(
|
|
85
|
+
["key", "value"].map((l) =>
|
|
86
|
+
ts.factory.createBindingElement(
|
|
87
|
+
undefined,
|
|
88
|
+
undefined,
|
|
89
|
+
ts.factory.createIdentifier(l),
|
|
90
|
+
undefined,
|
|
91
|
+
),
|
|
92
|
+
),
|
|
93
|
+
),
|
|
94
|
+
),
|
|
95
|
+
],
|
|
96
|
+
undefined,
|
|
97
|
+
undefined,
|
|
98
|
+
ts.factory.createBlock(
|
|
99
|
+
[
|
|
100
|
+
ts.factory.createIfStatement(
|
|
101
|
+
ts.factory.createStrictEquality(
|
|
102
|
+
ts.factory.createIdentifier("undefined"),
|
|
103
|
+
ts.factory.createIdentifier("value"),
|
|
104
|
+
),
|
|
105
|
+
ts.factory.createReturnStatement(),
|
|
106
|
+
),
|
|
107
|
+
...props.regular.map(({ key }) =>
|
|
108
|
+
ts.factory.createIfStatement(
|
|
109
|
+
ts.factory.createStrictEquality(
|
|
110
|
+
ts.factory.createStringLiteral(
|
|
111
|
+
key.getSoleLiteral()!,
|
|
112
|
+
),
|
|
113
|
+
ts.factory.createIdentifier("key"),
|
|
114
|
+
),
|
|
115
|
+
ts.factory.createReturnStatement(),
|
|
116
|
+
),
|
|
117
|
+
),
|
|
118
|
+
...props.dynamic.map((dynamic) =>
|
|
119
|
+
ts.factory.createIfStatement(
|
|
120
|
+
ts.factory.createCallExpression(
|
|
121
|
+
ts.factory.createIdentifier(
|
|
122
|
+
`RegExp(/${metadata_to_pattern(
|
|
123
|
+
true,
|
|
124
|
+
)(dynamic.key)}/).test`,
|
|
125
|
+
),
|
|
126
|
+
undefined,
|
|
127
|
+
[ts.factory.createIdentifier("key")],
|
|
128
|
+
),
|
|
129
|
+
ts.isBlock(dynamic.expression)
|
|
130
|
+
? dynamic.expression
|
|
131
|
+
: ts.factory.createBlock([
|
|
132
|
+
ts.factory.createExpressionStatement(
|
|
133
|
+
dynamic.expression,
|
|
134
|
+
),
|
|
135
|
+
]),
|
|
136
|
+
),
|
|
137
|
+
),
|
|
138
|
+
],
|
|
139
|
+
true,
|
|
140
|
+
),
|
|
141
|
+
),
|
|
142
|
+
],
|
|
143
|
+
);
|