@opra/common
Version:
Opra common package
128 lines (127 loc) • 5.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ComplexType = void 0;
require("reflect-metadata");
const objects_1 = require("@jsopen/objects");
const ts_gems_1 = require("ts-gems");
const index_js_1 = require("../../schema/index.js");
const document_init_context_js_1 = require("../common/document-init-context.js");
const constants_js_1 = require("../constants.js");
const complex_type_decorator_js_1 = require("../decorators/complex-type.decorator.js");
const api_field_js_1 = require("./api-field.js");
const complex_type_base_js_1 = require("./complex-type-base.js");
const data_type_js_1 = require("./data-type.js");
/**
* ComplexType constructor
*/
exports.ComplexType = function (...args) {
// Decorator
if (!this)
return exports.ComplexType[constants_js_1.DECORATOR].apply(undefined, args);
// Constructor
const [owner, initArgs] = args;
const context = args[2] || new document_init_context_js_1.DocumentInitContext({ maxErrors: 0 });
complex_type_base_js_1.ComplexTypeBase.call(this, owner, initArgs, context);
const _this = (0, ts_gems_1.asMutable)(this);
_this.kind = index_js_1.OpraSchema.ComplexType.Kind;
_this.discriminatorField = initArgs.discriminatorField;
_this.discriminatorValue = initArgs.discriminatorValue;
if (initArgs.base) {
context.enter('.base', () => {
// noinspection SuspiciousTypeOfGuard
if (!(initArgs.base instanceof complex_type_base_js_1.ComplexTypeBase)) {
throw new TypeError(`"${initArgs.base.kind}" can't be set as base for a "${this.kind}"`);
}
_this.base = initArgs.base;
_this.additionalFields = _this.base.additionalFields;
_this.keyField = _this.base.keyField;
/** Copy fields from base */
for (const v of _this.base.fields('*')) {
_this._fields.set(v.name, new api_field_js_1.ApiField(this, v));
}
});
}
if (initArgs.additionalFields !== undefined)
_this.additionalFields = initArgs.additionalFields;
if (initArgs.keyField !== undefined)
_this.keyField = initArgs.keyField;
_this.ctor = initArgs.ctor || _this.base?.ctor;
/** Add own fields */
if (initArgs.fields) {
context.enter('.fields', () => {
for (const [k, v] of Object.entries(initArgs.fields)) {
const field = new api_field_js_1.ApiField(this, {
...v,
name: k,
});
this._fields.set(field.name, field);
}
});
}
};
/**
*
* @class ComplexType
*/
class ComplexTypeClass extends complex_type_base_js_1.ComplexTypeBase {
extendsFrom(baseType) {
if (!(baseType instanceof data_type_js_1.DataType))
baseType = this.node.getDataType(baseType);
if (!(baseType instanceof complex_type_base_js_1.ComplexTypeBase))
return false;
if (baseType === this)
return true;
return !!this.base?.extendsFrom(baseType);
}
toJSON(options) {
const superJson = super.toJSON(options);
const baseName = this.base
? this.node.getDataTypeNameWithNs(this.base)
: undefined;
const out = {
...superJson,
kind: this.kind,
base: this.base
? baseName
? baseName
: this.base.toJSON(options)
: undefined,
discriminatorField: this.discriminatorField,
discriminatorValue: this.discriminatorValue,
};
if (this.additionalFields) {
if (this.additionalFields instanceof data_type_js_1.DataType) {
const typeName = this.node.getDataTypeNameWithNs(this.additionalFields);
out.additionalFields = typeName
? typeName
: this.additionalFields.toJSON(options);
}
else
out.additionalFields = this.additionalFields;
}
if (this._fields.size) {
const fields = {};
let i = 0;
for (const field of this._fields.values()) {
if (field.origin === this && field.inScope(options?.scope)) {
fields[field.name] = field.toJSON(options);
i++;
}
}
if (i)
out.fields = fields;
}
return (0, objects_1.omitUndefined)(out);
}
_locateBase(callback) {
if (!this.base)
return;
if (callback(this.base))
return this.base;
if (this.base._locateBase)
return this.base._locateBase(callback);
}
}
exports.ComplexType.prototype = ComplexTypeClass.prototype;
Object.assign(exports.ComplexType, complex_type_decorator_js_1.ComplexTypeDecorator);
exports.ComplexType[constants_js_1.DECORATOR] = complex_type_decorator_js_1.ComplexTypeDecorator;