UNPKG

@opra/common

Version:
128 lines (127 loc) 5.04 kB
"use strict"; 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;