UNPKG

scrivito

Version:

Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.

66 lines (55 loc) 1.78 kB
import { ArgumentError } from 'scrivito_sdk/common'; import { AttributeDefinitions, Obj, Schema, Widget } from 'scrivito_sdk/realm'; import { AttributeTypeOf } from 'scrivito_sdk/realm/schema'; import { AttributeValueOf, unwrapAppAttributes, wrapInAppClass, } from 'scrivito_sdk/realm/wrap_in_app_class'; import { getRealmClass } from './registry'; export function readAppAttribute< AttrDefs extends AttributeDefinitions, AttrName extends keyof AttrDefs & string, >( model: Obj | Widget, attributeName: AttrName, ): AttributeValueOf<AttrDefs, AttrName> | null { const basicField = Schema.basicFieldFor<AttributeTypeOf<AttrDefs[AttrName]>>( model, attributeName, ); return basicField && wrapInAppClass(basicField.get()); } export function updateAppAttributes( model: Obj | Widget, attributes: { [name: string]: unknown }, ): void { const objClass = model.objClass(); const appClass = getRealmClass(objClass); if (!appClass) { let baseClass; if (model.constructor === Obj) { baseClass = 'Obj'; } else { baseClass = 'Widget'; } throw new ArgumentError( `Updating is not supported on the base class "${baseClass}".`, ); } if (attributes.constructor !== Object) { throw new ArgumentError( 'The provided attributes are invalid. They have ' + 'to be an Object with valid Scrivito attribute values.', ); } // Bang: truthy appClass implies that model is neither Obj nor Widget itself. // Every Subclass of Obj and Widget has a Schema. const schema = Schema.forInstance(model)!; const attributesWithTypeInfo = unwrapAppAttributes( attributes, schema, objClass, ); model._scrivitoPrivateContent.updateWithUnknownValues(attributesWithTypeInfo); }