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.52 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 { isElementRef } = data const { MultivalueRegistry, chainMultivalueRegistries } = registry const registryAttribute = '@@skele/_transformRegistry' SubSystem.extend(() => { const registry = new MultivalueRegistry() return { transform: { [registryAttribute]: registry, /** * Registers a transformer for the specific kind */ register(kind, transformer) { invariant( isElementRef(kind), 'You must provide a valid element reference to register' ) invariant( transformer != null && typeof transformer === 'function', 'You must provide a transformer function' ) registry.register(kind, transformer) }, reset() { registry.reset() }, }, } }) export default SubSystem.create(system => ({ name: 'transform', /** * Creates the read transformer */ buildTransformer() { const combinedRegistry = getCombinedRegistry(system.subsystemSequence) if (combinedRegistry == null) { return R.identity } return impl.transformer(combinedRegistry, system.elementZipper) }, })) const getRegistry = R.path(['transform', registryAttribute]) const getCombinedRegistry = R.pipe( R.map(getRegistry), R.reject(R.isNil), chainMultivalueRegistries )