@matatbread/typia
Version:
Superfast runtime validators with only one line
87 lines (84 loc) • 4.27 kB
JavaScript
import ts from 'typescript';
import { ExpressionFactory } from '../../factories/ExpressionFactory.mjs';
import { IdentifierFactory } from '../../factories/IdentifierFactory.mjs';
import { LiteralFactory } from '../../factories/LiteralFactory.mjs';
import { Metadata } from '../../schemas/metadata/Metadata.mjs';
import { MetadataArray } from '../../schemas/metadata/MetadataArray.mjs';
import { MetadataArrayType } from '../../schemas/metadata/MetadataArrayType.mjs';
import { MetadataTuple } from '../../schemas/metadata/MetadataTuple.mjs';
import { MetadataTupleType } from '../../schemas/metadata/MetadataTupleType.mjs';
import { Escaper } from '../../utils/Escaper.mjs';
var RandomJoiner;
(function (RandomJoiner) {
RandomJoiner.array = (props) => {
const call = ts.factory.createCallExpression(props.expression, undefined, [
ts.factory.createObjectLiteralExpression([
...(props.schema
? Object.entries(props.schema)
.filter(([key]) => key !== "items")
.map(([key, value]) => ts.factory.createPropertyAssignment(IdentifierFactory.identifier(key), LiteralFactory.write(value)))
: []),
...(props.schema
? []
: [
ts.factory.createSpreadAssignment(ts.factory.createIdentifier("_schema")),
]),
ts.factory.createPropertyAssignment("element", ts.factory.createArrowFunction(undefined, undefined, [], undefined, undefined, props.decode(props.array.value))),
], true),
]);
if (props.recursive === false)
return call;
return ts.factory.createConditionalExpression(ts.factory.createGreaterThanEquals(ExpressionFactory.number(5), ts.factory.createIdentifier("_depth")), undefined, call, undefined, ts.factory.createArrayLiteralExpression([]));
};
RandomJoiner.tuple = (props) => ts.factory.createArrayLiteralExpression(props.elements.map((elem) => props.decode(elem.rest ?? elem)), true);
RandomJoiner.object = (props) => {
if (props.object.properties.length === 0)
return LiteralFactory.write({});
// LIST UP PROPERTIES
const regular = props.object.properties.filter((p) => p.key.isSoleLiteral());
const dynamic = props.object.properties.filter((p) => !p.key.isSoleLiteral());
return ts.factory.createObjectLiteralExpression([
...regular.map((p) => {
const str = p.key.getSoleLiteral();
return ts.factory.createPropertyAssignment(Escaper.variable(str) ? str : ts.factory.createStringLiteral(str), props.decode(p.value));
}),
...dynamic.map((property) => ts.factory.createSpreadAssignment(dynamicProperty({
decode: props.decode,
property: property,
}))),
], true);
};
const dynamicProperty = (props) => {
const tuple = MetadataTuple.create({
type: MetadataTupleType.create({
name: `[${props.property.key.getName()}, ${props.property.value.getName()}]`,
elements: [props.property.key, props.property.value],
index: null,
recursive: false,
nullables: [false],
}),
tags: [],
});
const array = MetadataArray.create({
type: MetadataArrayType.create({
name: `Array<[${props.property.key.getName()}, ${props.property.value.getName()}]>`,
value: Metadata.create({
...Metadata.initialize(),
tuples: [tuple],
}),
nullables: [false],
recursive: false,
index: null,
}),
tags: [[]],
});
return ts.factory.createCallExpression(IdentifierFactory.access(ts.factory.createIdentifier("Object"), "fromEntries"), undefined, [
props.decode(Metadata.create({
...Metadata.initialize(),
arrays: [array],
})),
]);
};
})(RandomJoiner || (RandomJoiner = {}));
export { RandomJoiner };
//# sourceMappingURL=RandomJoiner.mjs.map