UNPKG

@backland/schema

Version:

TypeScript schema declaration and validation library with static type inference

116 lines (115 loc) 3.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extendObjectDefinition = extendObjectDefinition; var _utils = require("@backland/utils"); var _CircularDeps = require("./CircularDeps"); var _ObjectType = require("./ObjectType"); var _MetaFieldField = require("./fields/MetaFieldField"); function extendObjectDefinition(input) { if (!input || typeof input !== 'object') { throw new _utils.RuntimeError(`Expected typeof input to be "object", found ${(0, _utils.getTypeName)(input)}`, { input }); } let obj = input; if (typeof obj === 'object' && obj.type === 'object' && obj.def && typeof obj.def === 'object') { return extendObjectDefinition(obj.def); } if (obj['object'] && typeof obj['object'] === 'object') { return extendObjectDefinition(obj.object); } if (_CircularDeps.CircularDeps.GraphType.is(obj)) { // @ts-ignore return extendObjectDefinition(obj.definition); } if (_CircularDeps.CircularDeps.ObjectType.is(obj)) { // @ts-ignore return extendObjectDefinition(obj.definition); } let clone = (0, _ObjectType.deleteCachedFieldInstance)((0, _utils.simpleObjectClone)((0, _ObjectType.parseObjectDefinition)((0, _ObjectType.deleteCachedFieldInstance)(obj), { deep: { omitMeta: true } }).definition)); const res = { def() { if (_MetaFieldField.objectMetaFieldKey in clone) { delete clone[_MetaFieldField.objectMetaFieldKey]; } return clone; }, exclude(keys) { const exclude = (0, _utils.ensureArray)(keys); exclude.forEach(key => { delete clone[key]; }); // @ts-ignore return extendObjectDefinition(clone); }, extendObjectDefinition(arg) { const ext = typeof arg === 'function' ? arg(res.def()) : arg; (0, _utils.assertEqual)((0, _utils.getTypeName)(ext), 'Object'); clone = Object.assign(clone, (0, _ObjectType.parseObjectDefinition)(ext, { omitMeta: true }).definition); return extendObjectDefinition(clone); }, graphType(name) { return name ? _CircularDeps.CircularDeps.createType(name, { object: res.def() }) : _CircularDeps.CircularDeps.createType({ object: res.def() }); }, objectType(name) { return name ? _CircularDeps.CircularDeps.ObjectType.createObjectType(name, res.def()) : _CircularDeps.CircularDeps.ObjectType.createObjectType(res.def()); }, only(keys) { const only = (0, _utils.ensureArray)(keys); Object.keys(clone).forEach(key => { if (only && !only.includes(key)) { delete clone[key]; } }); return extendObjectDefinition(clone); }, optional(keys = Object.keys(clone)) { const optional = (0, _utils.ensureArray)(keys); optional.forEach(key => { if ((0, _utils.getTypeName)(clone[key]) !== 'Object') { throw new _utils.RuntimeError(`Expected field ${key} to be a final object definition`, { input, key, value: clone[key] }); } clone[key] = { ...(0, _ObjectType.parseField)(clone[key]), optional: true }; }); return extendObjectDefinition(clone); }, required(keys) { const required = (0, _utils.ensureArray)(keys || Object.keys(clone)); required.forEach(key => { if ((0, _utils.getTypeName)(clone[key]) !== 'Object') { throw new _utils.RuntimeError(`Expected field ${key} to be a final object definition`, { input, key, value: clone[key] }); } clone[key] = { ...(0, _ObjectType.parseField)(clone[key]), optional: false }; }); return extendObjectDefinition(clone); } }; return res; } //# sourceMappingURL=extendObjectDefinition.js.map