UNPKG

@skele/classic

Version:

Skele is an architectural framework that assists with building data-driven apps with React or React Native.

69 lines (53 loc) 1.5 kB
'use strict' import * as R from 'ramda' import invariant from 'invariant' import { data, registry } from '@skele/core' import * as SubSystem from '../subsystem' import * as impl from './impl' const registryAttribute = '@@skele/_enrichRegistry' const { MultivalueRegistry, chainMultivalueRegistries } = registry const { isElementRef } = data SubSystem.extend(() => { const registry = new MultivalueRegistry() return { enrich: { [registryAttribute]: registry, /** * Registers an enricher for the specific kind */ register(kind, enricher) { invariant( isElementRef(kind), 'You must provide a valid element reference to register' ) invariant( enricher != null && typeof enricher === 'function', 'You must provide an enricher function' ) registry.register(kind, enricher) }, reset() { registry.reset() }, }, } }) export default SubSystem.create(system => ({ name: 'enrich', buildEnricher() { const combinedRegistry = getCombinedRegistry(system.subsystemSequence) if (combinedRegistry == null) { return x => Promise.resolve(x) } return impl.enricher({ registry: combinedRegistry, elementZipper: system.elementZipper, }) }, })) const getRegistry = R.path(['enrich', registryAttribute]) const getCombinedRegistry = R.pipe( R.map(getRegistry), R.reject(R.isNil), chainMultivalueRegistries )