@opra/common
Version:
Opra common package
85 lines (84 loc) • 2.63 kB
JavaScript
;
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;
}