UNPKG

@matatbread/typia

Version:

Superfast runtime validators with only one line

59 lines 4.58 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CloneJoiner = void 0; const typescript_1 = __importDefault(require("typescript")); const IdentifierFactory_1 = require("../../factories/IdentifierFactory"); const StatementFactory_1 = require("../../factories/StatementFactory"); const TypeFactory_1 = require("../../factories/TypeFactory"); const Escaper_1 = require("../../utils/Escaper"); const metadata_to_pattern_1 = require("../internal/metadata_to_pattern"); var CloneJoiner; (function (CloneJoiner) { CloneJoiner.object = (props) => { if (props.entries.length === 0) return typescript_1.default.factory.createIdentifier("{}"); const regular = props.entries.filter((e) => e.key.isSoleLiteral()); const dynamic = props.entries.filter((e) => !e.key.isSoleLiteral()); const literal = typescript_1.default.factory.createObjectLiteralExpression(regular.map((entry) => { const str = entry.key.getSoleLiteral(); return typescript_1.default.factory.createPropertyAssignment(Escaper_1.Escaper.variable(str) ? str : typescript_1.default.factory.createStringLiteral(str), entry.expression); }), true); if (dynamic.length === 0) return literal; const key = typescript_1.default.factory.createIdentifier("key"); const output = typescript_1.default.factory.createIdentifier("output"); const statements = []; if (regular.length !== 0) statements.push(typescript_1.default.factory.createIfStatement(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(typescript_1.default.factory.createArrayLiteralExpression(regular.map((r) => typescript_1.default.factory.createStringLiteral(r.key.getSoleLiteral()))), "some"), undefined, [ typescript_1.default.factory.createArrowFunction(undefined, undefined, [IdentifierFactory_1.IdentifierFactory.parameter("regular")], undefined, undefined, typescript_1.default.factory.createStrictEquality(typescript_1.default.factory.createIdentifier("regular"), typescript_1.default.factory.createIdentifier("key"))), ]), typescript_1.default.factory.createContinueStatement())); statements.push(...dynamic.map((entry) => typescript_1.default.factory.createIfStatement(typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createIdentifier(`RegExp(/${(0, metadata_to_pattern_1.metadata_to_pattern)({ top: true, metadata: entry.key, })}/).test`), undefined, [key]), typescript_1.default.factory.createBlock([ typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createElementAccessExpression(output, key), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.EqualsToken), entry.expression)), typescript_1.default.factory.createContinueStatement(), ])))); return typescript_1.default.factory.createBlock([ StatementFactory_1.StatementFactory.constant({ name: "output", value: typescript_1.default.factory.createAsExpression(literal, TypeFactory_1.TypeFactory.keyword("any")), }), typescript_1.default.factory.createForOfStatement(undefined, StatementFactory_1.StatementFactory.entry({ key: "key", value: "value", }), typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createIdentifier("Object.entries"), undefined, [props.input]), typescript_1.default.factory.createBlock(statements)), typescript_1.default.factory.createReturnStatement(output), ]); }; CloneJoiner.tuple = (props) => { return typescript_1.default.factory.createAsExpression(typescript_1.default.factory.createArrayLiteralExpression(props.rest === null ? props.elements : [...props.elements, typescript_1.default.factory.createSpreadElement(props.rest)], true), TypeFactory_1.TypeFactory.keyword("any")); }; CloneJoiner.array = (props) => typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createPropertyAccessExpression(props.input, "map"), undefined, [props.arrow]); })(CloneJoiner || (exports.CloneJoiner = CloneJoiner = {})); //# sourceMappingURL=CloneJoiner.js.map