UNPKG

typia

Version:

Superfast runtime validators with only one line

406 lines • 27.4 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProtobufDecodeProgrammer = void 0; var typescript_1 = __importDefault(require("typescript")); var ExpressionFactory_1 = require("../../factories/ExpressionFactory"); var IdentifierFactory_1 = require("../../factories/IdentifierFactory"); var MetadataCollection_1 = require("../../factories/MetadataCollection"); var MetadataFactory_1 = require("../../factories/MetadataFactory"); var ProtobufFactory_1 = require("../../factories/ProtobufFactory"); var StatementFactory_1 = require("../../factories/StatementFactory"); var TypeFactory_1 = require("../../factories/TypeFactory"); var Metadata_1 = require("../../schemas/metadata/Metadata"); var MetadataAtomic_1 = require("../../schemas/metadata/MetadataAtomic"); var MetadataProperty_1 = require("../../schemas/metadata/MetadataProperty"); var FeatureProgrammer_1 = require("../FeatureProgrammer"); var FunctionImporter_1 = require("../helpers/FunctionImporter"); var ProtobufUtil_1 = require("../helpers/ProtobufUtil"); var ProtobufDecodeProgrammer; (function (ProtobufDecodeProgrammer) { ProtobufDecodeProgrammer.decompose = function (props) { var _a; var collection = new MetadataCollection_1.MetadataCollection(); var meta = ProtobufFactory_1.ProtobufFactory.metadata(props.modulo.getText())(props.project.checker, props.project.context)(collection)(props.type); return { functions: Object.fromEntries(collection .objects() .filter(function (obj) { return ProtobufUtil_1.ProtobufUtil.isStaticObject(obj); }) .map(function (obj) { return [ "".concat(PREFIX, "o").concat(obj.index), StatementFactory_1.StatementFactory.constant(props.importer.useLocal("".concat(PREFIX, "o").concat(obj.index)), write_object_function(props.project)(props.importer)(obj)), ]; })), statements: [], arrow: typescript_1.default.factory.createArrowFunction(undefined, undefined, [ IdentifierFactory_1.IdentifierFactory.parameter("input", typescript_1.default.factory.createTypeReferenceNode("Uint8Array")), ], typescript_1.default.factory.createImportTypeNode(typescript_1.default.factory.createLiteralTypeNode(typescript_1.default.factory.createStringLiteral("typia")), undefined, typescript_1.default.factory.createIdentifier("Resolved"), [ typescript_1.default.factory.createTypeReferenceNode((_a = props.name) !== null && _a !== void 0 ? _a : TypeFactory_1.TypeFactory.getFullName(props.project.checker)(props.type)), ]), undefined, typescript_1.default.factory.createBlock([ StatementFactory_1.StatementFactory.constant("reader", typescript_1.default.factory.createNewExpression(props.importer.use("Reader"), undefined, [typescript_1.default.factory.createIdentifier("input")])), typescript_1.default.factory.createReturnStatement(decode_regular_object(true)(meta.objects[0])), ], true)), }; }; ProtobufDecodeProgrammer.write = function (project) { return function (modulo) { return function (type, name) { var importer = new FunctionImporter_1.FunctionImporter(modulo.getText()); var result = ProtobufDecodeProgrammer.decompose({ project: project, modulo: modulo, importer: importer, type: type, name: name, }); return FeatureProgrammer_1.FeatureProgrammer.writeDecomposed({ modulo: modulo, importer: importer, result: result, }); }; }; }; var write_object_function = function (project) { return function (importer) { return function (obj) { return typescript_1.default.factory.createArrowFunction(undefined, undefined, [ IdentifierFactory_1.IdentifierFactory.parameter("reader"), IdentifierFactory_1.IdentifierFactory.parameter("length", TypeFactory_1.TypeFactory.keyword("number"), ExpressionFactory_1.ExpressionFactory.number(-1)), ], TypeFactory_1.TypeFactory.keyword("any"), undefined, typescript_1.default.factory.createBlock(__spreadArray(__spreadArray([ typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createIdentifier("length"), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.EqualsToken), typescript_1.default.factory.createConditionalExpression(typescript_1.default.factory.createLessThan(typescript_1.default.factory.createIdentifier("length"), ExpressionFactory_1.ExpressionFactory.number(0)), undefined, typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("size"), undefined, undefined), undefined, typescript_1.default.factory.createAdd(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("index"), undefined, undefined), typescript_1.default.factory.createIdentifier("length"))))) ], __read(write_object_function_body(project)(importer)({ condition: typescript_1.default.factory.createLessThan(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("index"), undefined, undefined), typescript_1.default.factory.createIdentifier("length")), tag: "tag", output: "output", })(obj.properties)), false), [ typescript_1.default.factory.createReturnStatement(typescript_1.default.factory.createIdentifier("output")), ], false), true)); }; }; }; var write_object_function_body = function (project) { return function (importer) { return function (props) { return function (properties) { var i = 1; var clauses = properties .map(function (p) { var clause = decode_property(project)(importer)(i)(IdentifierFactory_1.IdentifierFactory.access(typescript_1.default.factory.createIdentifier(props.output))(p.key.getSoleLiteral()), p.value); i += ProtobufUtil_1.ProtobufUtil.size(p.value); return clause; }) .flat(); return [ StatementFactory_1.StatementFactory.constant(props.output, typescript_1.default.factory.createAsExpression(typescript_1.default.factory.createObjectLiteralExpression(properties .filter(function (p) { return !(project.compilerOptions.exactOptionalPropertyTypes === true && p.value.optional === true); }) .map(function (p) { return typescript_1.default.factory.createPropertyAssignment(IdentifierFactory_1.IdentifierFactory.identifier(p.key.getSoleLiteral()), write_property_default_value(p.value)); }), true), TypeFactory_1.TypeFactory.keyword("any"))), typescript_1.default.factory.createWhileStatement(props.condition, typescript_1.default.factory.createBlock([ StatementFactory_1.StatementFactory.constant(props.tag, typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("uint32"), undefined, undefined)), typescript_1.default.factory.createSwitchStatement(typescript_1.default.factory.createUnsignedRightShift(typescript_1.default.factory.createIdentifier(props.tag), ExpressionFactory_1.ExpressionFactory.number(3)), typescript_1.default.factory.createCaseBlock(__spreadArray(__spreadArray([], __read(clauses), false), [ typescript_1.default.factory.createDefaultClause([ typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("skipType"), undefined, [ typescript_1.default.factory.createBitwiseAnd(typescript_1.default.factory.createIdentifier(props.tag), ExpressionFactory_1.ExpressionFactory.number(7)), ])), typescript_1.default.factory.createBreakStatement(), ]), ], false))), ])), ]; }; }; }; }; var write_property_default_value = function (value) { return typescript_1.default.factory.createAsExpression(value.nullable ? typescript_1.default.factory.createNull() : value.isRequired() === false ? typescript_1.default.factory.createIdentifier("undefined") : value.arrays.length ? typescript_1.default.factory.createArrayLiteralExpression() : value.maps.length ? typescript_1.default.factory.createNewExpression(typescript_1.default.factory.createIdentifier("Map"), undefined, []) : value.natives.length ? typescript_1.default.factory.createNewExpression(typescript_1.default.factory.createIdentifier("Uint8Array"), undefined, []) : value.atomics.some(function (a) { return a.type === "string"; }) || value.constants.some(function (c) { return c.type === "string" && c.values.some(function (v) { return v.value === ""; }); }) || value.templates.some(function (tpl) { return tpl.row.length === 1 && tpl.row[0].getName() === "string"; }) ? typescript_1.default.factory.createStringLiteral("") : value.objects.length && value.objects.some(function (obj) { return !ProtobufUtil_1.ProtobufUtil.isStaticObject(obj); }) ? typescript_1.default.factory.createObjectLiteralExpression() : typescript_1.default.factory.createIdentifier("undefined"), TypeFactory_1.TypeFactory.keyword("any")); }; /* ----------------------------------------------------------- DECODERS ----------------------------------------------------------- */ var decode_property = function (project) { return function (importer) { return function (index) { return function (accessor, meta) { var e_1, _a, e_2, _b, e_3, _c, e_4, _d; var clauses = []; var emplace = function (name) { return function (v) { return clauses.push(typescript_1.default.factory.createCaseClause(ExpressionFactory_1.ExpressionFactory.number(index++), Array.isArray(v) ? __spreadArray(__spreadArray([ typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createIdentifier("// type: ".concat(name))) ], __read(v), false), [ typescript_1.default.factory.createBreakStatement(), ], false) : [ typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createIdentifier("// ".concat(name))), typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createBinaryExpression(accessor, typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.EqualsToken), v)), typescript_1.default.factory.createBreakStatement(), ])); }; }; var required = meta.isRequired() && !meta.nullable; try { for (var _e = __values(ProtobufUtil_1.ProtobufUtil.getAtomics(meta)), _f = _e.next(); !_f.done; _f = _e.next()) { var atomic = _f.value; emplace(atomic)(decode_atomic(meta)(atomic)); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_f && !_f.done && (_a = _e.return)) _a.call(_e); } finally { if (e_1) throw e_1.error; } } if (meta.natives.length) emplace("bytes")(decode_bytes("bytes")); try { for (var _g = __values(meta.arrays), _h = _g.next(); !_h.done; _h = _g.next()) { var array = _h.value; emplace("Array<".concat(array.type.value.getName(), ">"))(decode_array(accessor, array, required)); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_h && !_h.done && (_b = _g.return)) _b.call(_g); } finally { if (e_2) throw e_2.error; } } try { for (var _j = __values(meta.maps), _k = _j.next(); !_k.done; _k = _j.next()) { var map = _k.value; emplace("Map<string, ".concat(map.value.getName(), ">"))(decode_map(project)(importer)(accessor, map, required)); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_k && !_k.done && (_c = _j.return)) _c.call(_j); } finally { if (e_3) throw e_3.error; } } try { for (var _l = __values(meta.objects), _m = _l.next(); !_m.done; _m = _l.next()) { var obj = _m.value; emplace(obj.name)(ProtobufUtil_1.ProtobufUtil.isStaticObject(obj) ? decode_regular_object(false)(obj) : decode_dynamic_object(project)(importer)(accessor, obj, required)); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (_m && !_m.done && (_d = _l.return)) _d.call(_l); } finally { if (e_4) throw e_4.error; } } return clauses; }; }; }; }; var decode_atomic = function (meta) { return function (atomic) { if (atomic === "string") return decode_bytes("string"); var call = typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(typescript_1.default.factory.createIdentifier("reader"))(atomic), undefined, undefined); if (atomic !== "int64" && atomic !== "uint64") return call; var isNumber = ProtobufUtil_1.ProtobufUtil.getNumbers(meta).some(function (n) { return n === atomic; }); return isNumber ? typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createIdentifier("Number"), undefined, [call]) : call; }; }; var decode_bytes = function (method) { return typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(typescript_1.default.factory.createIdentifier("reader"))(method), undefined, undefined); }; var decode_array = function (accessor, array, required) { var statements = []; if (required === false) statements.push(typescript_1.default.factory.createBinaryExpression(accessor, typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.QuestionQuestionEqualsToken), typescript_1.default.factory.createAsExpression(typescript_1.default.factory.createArrayLiteralExpression(), typescript_1.default.factory.createTypeReferenceNode("any[]")))); var atomics = ProtobufUtil_1.ProtobufUtil.getAtomics(array.type.value); var decoder = atomics.length ? function () { return decode_atomic(array.type.value)(atomics[0]); } : array.type.value.natives.length ? function () { return decode_bytes("bytes"); } : array.type.value.objects.length ? function () { return decode_regular_object(false)(array.type.value.objects[0]); } : null; if (decoder === null) throw new Error("Never reach here."); else if (atomics.length && atomics[0] !== "string") { statements.push(typescript_1.default.factory.createIfStatement(typescript_1.default.factory.createStrictEquality(ExpressionFactory_1.ExpressionFactory.number(2), typescript_1.default.factory.createBitwiseAnd(typescript_1.default.factory.createIdentifier("tag"), ExpressionFactory_1.ExpressionFactory.number(7))), typescript_1.default.factory.createBlock([ StatementFactory_1.StatementFactory.constant("piece", typescript_1.default.factory.createAdd(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("uint32"), undefined, undefined), typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("index"), undefined, undefined))), typescript_1.default.factory.createWhileStatement(typescript_1.default.factory.createLessThan(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("index"), undefined, undefined), typescript_1.default.factory.createIdentifier("piece")), typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(accessor)("push"), undefined, [decoder()]))), ], true), typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(accessor)("push"), undefined, [decoder()])))); } else statements.push(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(accessor)("push"), undefined, [decoder()])); return statements.map(function (stmt) { return typescript_1.default.isExpression(stmt) ? typescript_1.default.factory.createExpressionStatement(stmt) : stmt; }); }; var decode_regular_object = function (top) { return function (obj) { return typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createIdentifier("".concat(PREFIX, "o").concat(obj.index)), undefined, __spreadArray([ typescript_1.default.factory.createIdentifier("reader") ], __read((top ? [] : [ typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("uint32"), undefined, undefined), ])), false)); }; }; var decode_dynamic_object = function (project) { return function (importer) { return function (accessor, obj, required) { var top = obj.properties[0]; return decode_entry(project)(importer)({ initializer: function () { return typescript_1.default.factory.createBinaryExpression(accessor, typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.QuestionQuestionEqualsToken), typescript_1.default.factory.createObjectLiteralExpression()); }, setter: function () { return typescript_1.default.factory.createBinaryExpression(typescript_1.default.factory.createElementAccessExpression(accessor, typescript_1.default.factory.createIdentifier("entry.key")), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.EqualsToken), typescript_1.default.factory.createIdentifier("entry.value")); }, })(MetadataProperty_1.MetadataProperty.create(__assign(__assign({}, top), { key: (function () { var key = Metadata_1.Metadata.initialize(); key.atomics.push(MetadataAtomic_1.MetadataAtomic.create({ type: "string", tags: [], })); return key; })() })), required); }; }; }; var decode_map = function (project) { return function (importer) { return function (accessor, map, required) { return decode_entry(project)(importer)({ initializer: function () { return typescript_1.default.factory.createBinaryExpression(accessor, typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.QuestionQuestionEqualsToken), typescript_1.default.factory.createNewExpression(typescript_1.default.factory.createIdentifier("Map"), [TypeFactory_1.TypeFactory.keyword("any"), TypeFactory_1.TypeFactory.keyword("any")], [])); }, setter: function () { return typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(accessor)("set"), undefined, [ typescript_1.default.factory.createIdentifier("entry.key"), typescript_1.default.factory.createIdentifier("entry.value"), ]); }, })(map, required); }; }; }; var decode_entry = function (project) { return function (importer) { return function (props) { return function (map, required) { var statements = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read((required ? [] : [typescript_1.default.factory.createExpressionStatement(props.initializer())])), false), [ StatementFactory_1.StatementFactory.constant("piece", typescript_1.default.factory.createAdd(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("uint32"), undefined, undefined), typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("index"), undefined, undefined))) ], false), __read(write_object_function_body(project)(importer)({ condition: typescript_1.default.factory.createLessThan(typescript_1.default.factory.createCallExpression(IdentifierFactory_1.IdentifierFactory.access(READER())("index"), undefined, undefined), typescript_1.default.factory.createIdentifier("piece")), tag: "kind", output: "entry", })([ MetadataProperty_1.MetadataProperty.create({ key: MetadataFactory_1.MetadataFactory.soleLiteral("key"), value: map.key, description: null, jsDocTags: [], }), MetadataProperty_1.MetadataProperty.create({ key: MetadataFactory_1.MetadataFactory.soleLiteral("value"), value: map.value, description: null, jsDocTags: [], }), ])), false), [ typescript_1.default.factory.createExpressionStatement(props.setter()), ], false); return [ typescript_1.default.factory.createExpressionStatement(ExpressionFactory_1.ExpressionFactory.selfCall(typescript_1.default.factory.createBlock(statements, true))), ]; }; }; }; }; })(ProtobufDecodeProgrammer || (exports.ProtobufDecodeProgrammer = ProtobufDecodeProgrammer = {})); var PREFIX = "$pd"; var READER = function () { return typescript_1.default.factory.createIdentifier("reader"); }; //# sourceMappingURL=ProtobufDecodeProgrammer.js.map