import { FieldSchema, Objects, StructureSchema } from '@ephox/boulder'; import { Fun } from '@ephox/katamari'; import * as CommonBehaviour from '../../behaviour/common/Behaviour'; import { type BehaviourState, NoState } from '../../behaviour/common/BehaviourState'; import type * as BehaviourTypes from '../../behaviour/common/BehaviourTypes'; export type ConfiguredBehaviour = BehaviourTypes.ConfiguredBehaviour; export type AlloyBehaviourRecord = BehaviourTypes.BehaviourRecord; export type BehaviourConfigSpec = BehaviourTypes.BehaviourConfigSpec; export type BehaviourConfigDetail = BehaviourTypes.BehaviourConfigDetail; export type NamedConfiguredBehaviour = BehaviourTypes.NamedConfiguredBehaviour; export type AlloyBehaviour = BehaviourTypes.AlloyBehaviour; export type AlloyBehaviourConfig, E extends BehaviourTypes.BehaviourExtraRecord = {}> = BehaviourTypes.BehaviourConfig; export type BehaviourModeSpec, E extends BehaviourTypes.BehaviourExtraRecord = {}> = BehaviourTypes.BehaviourModeSpec; const derive = ( capabilities: Array> ): AlloyBehaviourRecord => Objects.wrapAll(capabilities); const simpleSchema = StructureSchema.objOfOnly([ FieldSchema.required('fields'), FieldSchema.required('name'), FieldSchema.defaulted('active', { }), FieldSchema.defaulted('apis', { }), FieldSchema.defaulted('state', NoState), FieldSchema.defaulted('extra', { }) ]); const create = < C extends BehaviourTypes.BehaviourConfigSpec, D extends BehaviourTypes.BehaviourConfigDetail, S extends BehaviourState, A extends BehaviourTypes.BehaviourApisRecord, E extends BehaviourTypes.BehaviourExtraRecord = {} >(data: AlloyBehaviourConfig): CommonBehaviour.AlloyBehaviourWithApis => { const value = StructureSchema.asRawOrDie('Creating behaviour: ' + data.name, simpleSchema, data); return CommonBehaviour.create(value.fields, value.name, value.active, value.apis, value.extra, value.state); }; const modeSchema = StructureSchema.objOfOnly([ FieldSchema.required('branchKey'), FieldSchema.required('branches'), FieldSchema.required('name'), FieldSchema.defaulted('active', { }), FieldSchema.defaulted('apis', { }), FieldSchema.defaulted('state', NoState), FieldSchema.defaulted('extra', { }) ]); const createModes = < C extends BehaviourTypes.BehaviourConfigSpec, D extends BehaviourTypes.BehaviourConfigDetail, S extends BehaviourState, A extends BehaviourTypes.BehaviourApisRecord, E extends BehaviourTypes.BehaviourExtraRecord = {} >(data: BehaviourModeSpec): CommonBehaviour.AlloyBehaviourWithApis => { const value = StructureSchema.asRawOrDie('Creating behaviour: ' + data.name, modeSchema, data); return CommonBehaviour.createModes( StructureSchema.choose(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state ); }; const revoke = Fun.constant(undefined); const noActive = Fun.constant({ }); const noApis = Fun.constant({ }); const noExtra = Fun.constant({ }); export { derive, revoke, noActive, noApis, noExtra, create, createModes };