UNPKG

@opra/common

Version:
85 lines (84 loc) 2.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UnionType = void 0; require("reflect-metadata"); const objects_1 = require("@jsopen/objects"); const ts_gems_1 = require("ts-gems"); const valgen_1 = require("valgen"); const index_js_1 = require("../../schema/index.js"); const constants_js_1 = require("../constants.js"); const data_type_js_1 = require("./data-type.js"); /** * @class UnionType */ exports.UnionType = function (...args) { // UnionType factory if (!this) { return exports.UnionType[constants_js_1.DECORATOR].apply(undefined, args); } // Constructor const [owner, initArgs, context] = args; data_type_js_1.DataType.call(this, owner, initArgs, context); const _this = (0, ts_gems_1.asMutable)(this); _this.kind = index_js_1.OpraSchema.UnionType.Kind; _this.discriminator = initArgs.discriminator; _this.types = []; for (const base of initArgs.types) { _this.types.push(base); } }; /** * * @class UnionType */ class UnionTypeClass extends data_type_js_1.DataType { toJSON(options) { const superJson = super.toJSON(options); return (0, objects_1.omitUndefined)({ ...superJson, kind: this.kind, discriminator: this.discriminator, types: this.types.map(base => { const baseName = this.node.getDataTypeNameWithNs(base); return baseName ? baseName : base.toJSON(options); }), }); } generateCodec(codec, options) { const codecs = this.types.map(t => { const fn = t.generateCodec(codec, options); if ((t.kind === index_js_1.OpraSchema.ComplexType.Kind || t.kind === index_js_1.OpraSchema.MappedType.Kind) && t.discriminatorField) { return [ fn, { [t.discriminatorField]: valgen_1.vg.isEqual(t.discriminatorValue) }, ]; } return fn; }); return valgen_1.vg.oneOf(codecs); } extendsFrom() { return false; } _locateBase() { return; } } exports.UnionType.prototype = UnionTypeClass.prototype; exports.UnionType[constants_js_1.DECORATOR] = UnionTypeFactory; /** * */ function UnionTypeFactory(clasRefs, options) { class UnionClass { } const metadata = { ...options, kind: index_js_1.OpraSchema.UnionType.Kind, types: clasRefs, }; Reflect.defineMetadata(constants_js_1.DATATYPE_METADATA, metadata, UnionClass); return UnionClass; }