diff --git a/.eslintignore b/.eslintignore index 0448b1c..8c1913b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,3 +2,4 @@ node_modules/ dist/ coverage/ packages/classic/src/vendor +packages/core/src/vendor diff --git a/README.md b/README.md index 5316984..d666112 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ The repository is a monorepo that is composed of several NPM packages. | [Classic](/packages/classic) | The library as a (still) monolithic package. | | [Config](/packages/config) | Library for setting up layered app configuration. | | [Components](/packages/components) | Collection of helpful custom components. | +| [Core](/packages/core) | Essential building blocks of the framework. | ## Documentation diff --git a/package.json b/package.json index ed4296f..431c04a 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,20 @@ "coverage-report": "cat ./coverage/lcov.info | coveralls", "lint": "eslint .", "es5": - "yarn run es5:classic && yarn run es5:config && yarn run es5:components", + "yarn run es5:classic && yarn run es5:config && yarn run es5:components && yarn run es5:core", "es5:classic": "babel -q packages/classic/src --out-dir packages/classic/dist/es5", "es5:config": "babel -q packages/config/src --out-dir packages/config/dist/es5", "es5:components": "babel -q packages/components/src --out-dir packages/components/dist/es5", + "es5:core": "babel -q packages/core/src --out-dir packages/core/dist/es5", "clean": - "yarn run clean:classic && yarn run clean:config && yarn run clean:components", + "yarn run clean:classic && yarn run clean:config && yarn run clean:components && yarn run clean:core", "clean:classic": "del-cli packages/classic/dist", "clean:config": "del-cli packages/config/dist", "clean:components": "del-cli packages/components/dist", + "clean:core": "del-cli packages/core/dist", "build": "yarn run clean && yarn run test && yarn run lint && yarn run es5", "release:test-token": "test -n \"$CONVENTIONAL_GITHUB_RELEASER_TOKEN\" || (echo 'Setup your github autho token first: https://github.com/conventional-changelog/conventional-github-releaser#cli' && exit 1)", @@ -90,7 +92,8 @@ "roots": [ "/packages/classic", "/packages/config", - "/packages/components" + "/packages/components", + "/packages/core" ], "testMatch": ["**/__tests__/**/*.js"], "collectCoverageFrom": [ @@ -98,7 +101,8 @@ "!**/__tests__/**", "!**/node_modules/**", "!**/vendor/**", - "!**/dist/es5/**" + "!**/dist/es5/**", + "!packages/core/src/log/**" ] }, "workspaces": ["packages/*"] diff --git a/packages/classic/package.json b/packages/classic/package.json index 87d0da3..a2366a4 100644 --- a/packages/classic/package.json +++ b/packages/classic/package.json @@ -1,20 +1,15 @@ { "name": "@skele/classic", "version": "1.0.0-alpha.31", - "description": "Skele is an architectural framework that assists with building data-driven apps with React or React Native.", + "description": + "Skele is an architectural framework that assists with building data-driven apps with React or React Native.", "react-native": "src/index.js", "main": "dist/es5/index.js", "repository": { "type": "git", "url": "git+https://github.com/netceteragroup/skele.git" }, - "keywords": [ - "react", - "react-native", - "redux", - "redux-saga", - "netcetera" - ], + "keywords": ["react", "react-native", "redux", "netcetera"], "author": "netcetera", "license": "MIT", "bugs": { @@ -22,6 +17,7 @@ }, "homepage": "https://netcetera.gitbooks.io/skele/", "dependencies": { + "@skele/core": "^1.0.0-alpha.31", "immutable": "^3.8.1", "invariant": "^2.2.2", "ramda": "^0.25.0", diff --git a/packages/classic/src/__tests__/read.js b/packages/classic/src/__tests__/read.js index e5a5eb6..1342233 100644 --- a/packages/classic/src/__tests__/read.js +++ b/packages/classic/src/__tests__/read.js @@ -4,9 +4,10 @@ import { mount } from 'enzyme' import React from 'react' import { fromJS } from 'immutable' -import { ui, enrich, enhance, transform, read, data, Engine, http } from '..' +import { ui, enrich, enhance, transform, read, Engine, http } from '..' import * as propNames from '../propNames' -const { isOfKind } = data.element +import { data } from '@skele/core' +const { isOfKind } = data describe("Reads using core subsystem's Read element", () => { const appState = { diff --git a/packages/classic/src/action.js b/packages/classic/src/action.js index 39cbd1f..6450e0d 100644 --- a/packages/classic/src/action.js +++ b/packages/classic/src/action.js @@ -1,7 +1,7 @@ 'use strict' import * as R from 'ramda' -import { kindOf } from './data' +import { data } from '@skele/core' export const actionMetaProperty = '@@skele/actionMeta' @@ -16,7 +16,7 @@ export const actionMeta = R.prop(actionMetaProperty) */ export const atCursor = R.curry((cursor, action) => { const keyPath = cursor._keyPath - const kind = kindOf(cursor) + const kind = data.kindOf(cursor) return { ...action, [actionMetaProperty]: { keyPath, kind } } }) diff --git a/packages/classic/src/effect/impl.js b/packages/classic/src/effect/impl.js index cff00b5..1462a5f 100644 --- a/packages/classic/src/effect/impl.js +++ b/packages/classic/src/effect/impl.js @@ -4,13 +4,14 @@ import * as R from 'ramda' import * as actions from '../action' import { types as actionTypes } from './actions' -import * as data from '../data' -import { ActionRegistry } from '../registry' +import { data, log } from '@skele/core' import { findParentEntry } from '../impl/cursor' -import { error } from '../impl/log' + +import { ActionRegistry } from '../registry' const updateStateAction = '@@skele/_effects.updateState' +const { error } = log export const middleware = R.curry((config, store, next, action) => { const { kernel, effectsRegistry } = config diff --git a/packages/classic/src/effect/index.js b/packages/classic/src/effect/index.js index 16a8614..30a9eba 100644 --- a/packages/classic/src/effect/index.js +++ b/packages/classic/src/effect/index.js @@ -3,12 +3,15 @@ import * as R from 'ramda' import invariant from 'invariant' -import { chainRegistries, ActionRegistry } from '../registry' -import * as data from '../data' +import { data, registry } from '@skele/core' +import { ActionRegistry } from '../registry' + import * as Subsystem from '../subsystem' import * as impl from './impl' +const { chainRegistries } = registry + const effectsRegistryAttribute = '@@skele/_effectsRegistry' const sideEffectsRegistryAttribute = '@@skele/_sideEffectsRegistry' diff --git a/packages/classic/src/enhance/__tests__/enhance.js b/packages/classic/src/enhance/__tests__/enhance.js index e5bfb7a..a0da957 100644 --- a/packages/classic/src/enhance/__tests__/enhance.js +++ b/packages/classic/src/enhance/__tests__/enhance.js @@ -4,7 +4,7 @@ import { fromJS } from 'immutable' import * as SubSystem from '../../subsystem' import * as Kernel from '../../kernel' import * as propNames from '../../propNames' -import * as data from '../../data' +import { data } from '@skele/core' import enhanceSubsystem from '..' diff --git a/packages/classic/src/enhance/impl.js b/packages/classic/src/enhance/impl.js index 860c0b9..30f799c 100644 --- a/packages/classic/src/enhance/impl.js +++ b/packages/classic/src/enhance/impl.js @@ -2,7 +2,7 @@ import * as R from 'ramda' import I from 'immutable' -import * as zip from '../zip' +import { zip } from '@skele/core' export async function runEnhancers(el, context, enhancers) { return Promise.all( diff --git a/packages/classic/src/enhance/index.js b/packages/classic/src/enhance/index.js index bb4c011..a309431 100644 --- a/packages/classic/src/enhance/index.js +++ b/packages/classic/src/enhance/index.js @@ -4,16 +4,18 @@ import * as R from 'ramda' import { List } from 'immutable' import invariant from 'invariant' -import { isElementRef } from '../data' +import { data, registry } from '@skele/core' import * as SubSystem from '../subsystem' -import { MultivalueRegistry, chainMultivalueRegistries } from '../registry' import * as impl from './impl' const readDependentRegistryAttribute = '@@skele/_readDependentEnhanceRegistry' const readIndependentListAttribute = '@@skele/_readIndependentEnhanceList' +const { MultivalueRegistry, chainMultivalueRegistries } = registry +const { isElementRef } = data + SubSystem.extend(() => { const readDependentRegistry = new MultivalueRegistry() const readIndependentList = List().asMutable() diff --git a/packages/classic/src/enrich/__tests__/enrich.js b/packages/classic/src/enrich/__tests__/enrich.js index c0d9c8b..4873ad6 100644 --- a/packages/classic/src/enrich/__tests__/enrich.js +++ b/packages/classic/src/enrich/__tests__/enrich.js @@ -4,7 +4,7 @@ import { fromJS, List } from 'immutable' import * as Subsystem from '../../subsystem' import * as Kernel from '../../kernel' import * as propNames from '../../propNames' -import * as data from '../../data' +import { data } from '@skele/core' import enrichSubsystem from '..' diff --git a/packages/classic/src/enrich/impl.js b/packages/classic/src/enrich/impl.js index 4a6929e..54dff34 100644 --- a/packages/classic/src/enrich/impl.js +++ b/packages/classic/src/enrich/impl.js @@ -2,8 +2,7 @@ import * as R from 'ramda' import { memoize } from '../impl/util' -import * as data from '../data' -import * as zip from '../zip' +import { data, zip } from '@skele/core' export function enricher(config) { const { registry, elementZipper } = config diff --git a/packages/classic/src/enrich/index.js b/packages/classic/src/enrich/index.js index 0993dea..009f2e7 100644 --- a/packages/classic/src/enrich/index.js +++ b/packages/classic/src/enrich/index.js @@ -3,15 +3,16 @@ import * as R from 'ramda' import invariant from 'invariant' -import { isElementRef } from '../data' +import { data, registry } from '@skele/core' import * as SubSystem from '../subsystem' -import { MultivalueRegistry, chainMultivalueRegistries } from '../registry' - import * as impl from './impl' const registryAttribute = '@@skele/_enrichRegistry' +const { MultivalueRegistry, chainMultivalueRegistries } = registry +const { isElementRef } = data + SubSystem.extend(() => { const registry = new MultivalueRegistry() diff --git a/packages/classic/src/impl/cursor.js b/packages/classic/src/impl/cursor.js index ba4cd1e..815ae7e 100644 --- a/packages/classic/src/impl/cursor.js +++ b/packages/classic/src/impl/cursor.js @@ -4,7 +4,7 @@ import * as R from 'ramda' import { List, Seq } from 'immutable' import Cursor from 'immutable/contrib/cursor' -import * as data from '../data' +import { data } from '@skele/core' export const findParentEntry = R.curry((registry, keyfn, cursor) => data.flow( diff --git a/packages/classic/src/index.js b/packages/classic/src/index.js index 258d226..6fbc0df 100644 --- a/packages/classic/src/index.js +++ b/packages/classic/src/index.js @@ -4,8 +4,7 @@ import * as Subsystem from './subsystem' import * as Kernel from './kernel' import core, { defaultSubsystems } from './core' -import * as data from './data' -import * as zip from './zip' +import { data, zip } from '@skele/core' import * as action from './action' import * as registry from './registry' import * as propNames from './propNames' diff --git a/packages/classic/src/kernel.js b/packages/classic/src/kernel.js index dd875b6..280ecb3 100644 --- a/packages/classic/src/kernel.js +++ b/packages/classic/src/kernel.js @@ -4,9 +4,8 @@ import I from 'immutable' import Cursor from 'immutable/contrib/cursor' import * as R from 'ramda' -import * as zip from './zip' +import { data, zip } from '@skele/core' import * as actions from './action' -import * as data from './data' import { createStore, applyMiddleware } from 'redux' diff --git a/packages/classic/src/propNames.js b/packages/classic/src/propNames.js index b9b3632..4e026d9 100644 --- a/packages/classic/src/propNames.js +++ b/packages/classic/src/propNames.js @@ -1,7 +1,10 @@ 'use strict' +import { propNames } from '@skele/core' + export { actionMetaProperty as actionMeta } from './action' export { fallback as readFallback } from './read' -export { childrenProperty as children } from './data' -export const metadata = '@@skele/metadata' +const { children, metadata } = propNames +export { children } +export { metadata } diff --git a/packages/classic/src/read/__tests__/read.js b/packages/classic/src/read/__tests__/read.js index 24e69e6..b422e2b 100644 --- a/packages/classic/src/read/__tests__/read.js +++ b/packages/classic/src/read/__tests__/read.js @@ -13,7 +13,7 @@ import read from '..' import * as http from '../http' import * as action from '../../action' -import * as data from '../../data' +import { data } from '@skele/core' import * as readActions from '../actions' import * as propNames from '../../propNames' diff --git a/packages/classic/src/read/impl.js b/packages/classic/src/read/impl.js index c77739a..98297b0 100644 --- a/packages/classic/src/read/impl.js +++ b/packages/classic/src/read/impl.js @@ -6,14 +6,17 @@ import { fromJS } from 'immutable' import uuid from 'uuid' -import { info, error } from '../impl/log' +import { data, log } from '@skele/core' + import { time, timeSync } from '../impl/util' -import { canonical, flow, kindOf } from '../data' import * as readActions from './actions' import * as propNames from '../propNames' import { isOK, isResponse } from './http' +const { canonical, flow, kindOf } = data +const { info, error } = log + export const fallback = '@@skele/defaultRead' const updateKind = R.curry((update, element) => diff --git a/packages/classic/src/read/index.js b/packages/classic/src/read/index.js index 5d99369..08b4eeb 100644 --- a/packages/classic/src/read/index.js +++ b/packages/classic/src/read/index.js @@ -11,7 +11,7 @@ import '../enrich' import '../enhance' import '../transform' -import { PatternRegistry, chainRegistries } from '../registry' +import { registry } from '@skele/core' import * as impl from './impl' import * as http from './http' @@ -20,6 +20,8 @@ import * as readActions from './actions' const registryAttribute = '@@skele/_readRegistry' const fallback = impl.fallback +const { PatternRegistry, chainRegistries } = registry + /** * Extension point for defining reads */ diff --git a/packages/classic/src/registry/ActionRegistry.js b/packages/classic/src/registry/ActionRegistry.js index c2096d4..060a6db 100644 --- a/packages/classic/src/registry/ActionRegistry.js +++ b/packages/classic/src/registry/ActionRegistry.js @@ -2,9 +2,10 @@ import { List } from 'immutable' -import { Registry, MultivalueRegistry } from '../registry' +import { data, registry } from '@skele/core' import * as actions from '../action' -import * as data from '../data' + +const { Registry, MultivalueRegistry } = registry export const keyFor = (kind, action) => List.of(data.canonical(kind), action) diff --git a/packages/classic/src/registry/index.js b/packages/classic/src/registry/index.js index c4aa583..78fab82 100644 --- a/packages/classic/src/registry/index.js +++ b/packages/classic/src/registry/index.js @@ -1,13 +1,3 @@ 'use strict' -export { default as AbstractRegistry } from './AbstractRegistry' -export { default as Registry } from './Registry' -export { default as MultivalueRegistry } from './MultivalueRegistry' -export { default as PatternRegistry } from './PatternRegistry' export { ActionRegistry, ActionMultivalueRegistry } from './ActionRegistry' -export { - RegistryChain, - MultivalueRegistryChain, - chainRegistries, - chainMultivalueRegistries, -} from './RegistryChain' diff --git a/packages/classic/src/transform/impl.js b/packages/classic/src/transform/impl.js index 1c2fb0f..b9092b4 100644 --- a/packages/classic/src/transform/impl.js +++ b/packages/classic/src/transform/impl.js @@ -1,11 +1,13 @@ 'use strict' import * as R from 'ramda' -import { kindOf } from '../data/element' + +import { data, zip } from '@skele/core' + import { memoize } from '../impl/util' -import { postWalk, root, value } from '../zip' -import { flow } from '../data' +const { postWalk, root, value } = zip +const { flow, kindOf } = data export function transformer(registry, elementZipper) { const elementTransformer = memoize(kind => diff --git a/packages/classic/src/transform/index.js b/packages/classic/src/transform/index.js index 64b077b..ab054a9 100644 --- a/packages/classic/src/transform/index.js +++ b/packages/classic/src/transform/index.js @@ -3,13 +3,15 @@ import * as R from 'ramda' import invariant from 'invariant' -import { isElementRef } from '../data' +import { data, registry } from '@skele/core' import * as SubSystem from '../subsystem' -import { MultivalueRegistry, chainMultivalueRegistries } from '../registry' import * as impl from './impl' +const { isElementRef } = data +const { MultivalueRegistry, chainMultivalueRegistries } = registry + const registryAttribute = '@@skele/_transformRegistry' SubSystem.extend(() => { diff --git a/packages/classic/src/ui/ElementView.js b/packages/classic/src/ui/ElementView.js index 6a47ce9..433c938 100644 --- a/packages/classic/src/ui/ElementView.js +++ b/packages/classic/src/ui/ElementView.js @@ -5,7 +5,7 @@ import I from 'immutable' import React from 'react' import PropTypes from 'prop-types' -import * as data from '../data' +import { data } from '@skele/core' export default R.curry((kind, Component, runtime) => { const { uiFor: globalUIFor, system } = runtime diff --git a/packages/classic/src/ui/__tests__/ui.js b/packages/classic/src/ui/__tests__/ui.js index 8b7b962..5814815 100644 --- a/packages/classic/src/ui/__tests__/ui.js +++ b/packages/classic/src/ui/__tests__/ui.js @@ -6,13 +6,16 @@ import React from 'react' import { Iterable, List, fromJS } from 'immutable' import Cursor from 'immutable/contrib/cursor' -import { kindOf, isOfKind } from '../../data' +import { data } from '@skele/core' + import { isSubclassOf } from '../../impl/classes' import * as Subsystem from '../../subsystem' import * as Kernel from '../../kernel' import uiSubsystem from '..' +const { kindOf, isOfKind } = data + const app = Subsystem.create(() => ({ name: 'app', })) diff --git a/packages/classic/src/ui/index.js b/packages/classic/src/ui/index.js index b7ec4ea..01df3d7 100644 --- a/packages/classic/src/ui/index.js +++ b/packages/classic/src/ui/index.js @@ -6,13 +6,14 @@ import React from 'react' import invariant from 'invariant' -import { warning } from '../impl/log' -import { Registry, chainRegistries } from '../registry' +import { registry, data, log } from '@skele/core' import ElementView from './ElementView' -import * as data from '../data' import { memoize } from '../impl/util' import { isSubclassOf } from '../impl/classes' +const { Registry, chainRegistries } = registry +const { warning } = log + const registryAttribute = '@@skele/_uiRegistry' // required subsystems diff --git a/packages/classic/src/update/__tests__/update.js b/packages/classic/src/update/__tests__/update.js index 5d06591..0d3b231 100644 --- a/packages/classic/src/update/__tests__/update.js +++ b/packages/classic/src/update/__tests__/update.js @@ -2,17 +2,18 @@ import { fromJS } from 'immutable' import Cursor from 'immutable/contrib/cursor' - +import { data } from '@skele/core' import * as actions from '../../action' +import { ActionRegistry } from '../../registry' import * as Subsystem from '../../subsystem' import * as Kernel from '../../kernel' -import { ActionRegistry } from '../../registry' -import { flow } from '../../data' import updateSubS from '..' const registryAttribute = '@@skele/_updateRegistry' +const { flow } = data + describe('updates API', function() { const app = Subsystem.create(() => ({ name: 'app', @@ -37,27 +38,25 @@ describe('updates API', function() { updates.register(action2.type, () => {}) }) - const registry = app.update[registryAttribute] + const reg = app.update[registryAttribute] expect( - registry.get( - ActionRegistry.keyFor(['article', 'specific'], 'TOGGLE_BOOKMARK') - ) + reg.get(ActionRegistry.keyFor(['article', 'specific'], 'TOGGLE_BOOKMARK')) ).toEqual(expect.anything()) - expect(registry.get(ActionRegistry.keyFor(['article'], '.LOAD'))).toEqual( + expect(reg.get(ActionRegistry.keyFor(['article'], '.LOAD'))).toEqual( expect.anything() ) expect( - registry.get(ActionRegistry.keyFor(['article', 'specific'], '.LOAD')) + reg.get(ActionRegistry.keyFor(['article', 'specific'], '.LOAD')) ).toEqual(expect.anything()) - expect( - registry.get(ActionRegistry.keyFor(['article'], 'unknown')) - ).not.toEqual(expect.anything()) - expect( - registry.get(ActionRegistry.keyFor(['unknown'], '.LOAD')) - ).not.toEqual(expect.anything()) + expect(reg.get(ActionRegistry.keyFor(['article'], 'unknown'))).not.toEqual( + expect.anything() + ) + expect(reg.get(ActionRegistry.keyFor(['unknown'], '.LOAD'))).not.toEqual( + expect.anything() + ) }) it('reduces the app state according to registrations', function() { diff --git a/packages/classic/src/update/impl.js b/packages/classic/src/update/impl.js index 8632ccf..c7f59b0 100644 --- a/packages/classic/src/update/impl.js +++ b/packages/classic/src/update/impl.js @@ -3,13 +3,15 @@ import * as R from 'ramda' import invariant from 'invariant' -import { warning } from '../impl/log' -import * as data from '../data' +import { data, log } from '@skele/core' import * as actions from '../action' import { findParentEntry } from '../impl/cursor' import { ActionRegistry } from '../registry' + +const { warning } = log + /** * Main application reducer. * diff --git a/packages/classic/src/update/index.js b/packages/classic/src/update/index.js index c8fa68b..b63aa15 100644 --- a/packages/classic/src/update/index.js +++ b/packages/classic/src/update/index.js @@ -2,18 +2,20 @@ import * as R from 'ramda' import invariant from 'invariant' -import deprecated from '../impl/deprecated' -import { chainRegistries, ActionRegistry } from '../registry' -import * as data from '../data' +import { data, registry, log } from '@skele/core' +import { ActionRegistry } from '../registry' import * as Subsystem from '../subsystem' import * as impl from './impl' const registryAttribute = '@@skele/_updateRegistry' +const { chainRegistries } = registry +const { deprecated } = log + Subsystem.extend(() => { - const registry = new ActionRegistry() + const reg = new ActionRegistry() const _register = R.curry((kind, action, update) => { invariant( @@ -27,7 +29,7 @@ Subsystem.extend(() => { ) invariant(typeof update === 'function', 'the update must be a function') - registry.register(ActionRegistry.keyFor(kind, action), update) + reg.register(ActionRegistry.keyFor(kind, action), update) }) const forKind = R.curry((kind, registrations) => { @@ -46,7 +48,7 @@ Subsystem.extend(() => { return { update: { - [registryAttribute]: registry, + [registryAttribute]: reg, forKind, diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000..0c155b5 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,27 @@ +{ + "name": "@skele/core", + "version": "1.0.0-alpha.31", + "description": + "Core package of the Skele framework. Element definitions, registrations and traversal.", + "react-native": "src/index.js", + "main": "dist/es5/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/netceteragroup/skele.git" + }, + "keywords": ["react", "react-native", "redux", "netcetera"], + "author": "netcetera", + "license": "MIT", + "bugs": { + "url": "https://github.com/netceteragroup/skele/issues" + }, + "homepage": "https://github.com/netceteragroup/skele#readme", + "dependencies": { + "immutable": "^3.8.1", + "invariant": "^2.2.2", + "ramda": "^0.25.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/core/src/__tests__/index.js b/packages/core/src/__tests__/index.js new file mode 100644 index 0000000..f94f0b9 --- /dev/null +++ b/packages/core/src/__tests__/index.js @@ -0,0 +1,77 @@ +'use strict' + +import { data, log, registry, zip, propNames } from '../' + +const anyFunction = expect.any(Function) +const anyString = expect.any(String) + +test('core.data interface', () => { + // functions + expect(data.flow).toEqual(anyFunction) + expect(data.when).toEqual(anyFunction) + expect(data.isOfKind).toEqual(anyFunction) + expect(data.isElementRef).toEqual(anyFunction) + expect(data.isExactlyOfKind).toEqual(anyFunction) + expect(data.kindOf).toEqual(anyFunction) + expect(data.isElement).toEqual(anyFunction) + expect(data.ancestorKinds).toEqual(anyFunction) + expect(data.canonical).toEqual(anyFunction) + expect(data.pathsToChildElements).toEqual(anyFunction) + expect(data.asList).toEqual(anyFunction) + expect(data.childPositions).toEqual(anyFunction) + + // constants + expect(data.childrenProperty).toEqual(anyString) +}) + +test('core.registry interface', () => { + const { + AbstractRegistry, + Registry, + MultivalueRegistry, + PatternRegistry, + RegistryChain, + MultivalueRegistryChain, + chainRegistries, + chainMultivalueRegistries, + } = registry + + expectRegistryToConformAbstractRegistry(new AbstractRegistry()) + expectRegistryToConformAbstractRegistry(new Registry()) + expectRegistryToConformAbstractRegistry(new MultivalueRegistry()) + expectRegistryToConformAbstractRegistry(new PatternRegistry()) + expectRegistryToConformAbstractRegistry(new RegistryChain()) + expectRegistryToConformAbstractRegistry(new MultivalueRegistryChain()) + expect(chainRegistries).toEqual(anyFunction) + expect(chainMultivalueRegistries).toEqual(anyFunction) +}) + +const expectRegistryToConformAbstractRegistry = reg => { + expect(reg.register).toEqual(anyFunction) + expect(reg.get).toEqual(anyFunction) + expect(reg.isEmpty).toEqual(anyFunction) + expect(reg.reset).toEqual(anyFunction) +} + +test('core.zip interface', () => { + // from zippa + // ... + + // from skele + expect(zip.elementZipper).toEqual(anyFunction) + expect(zip.reduce).toEqual(anyFunction) + expect(zip.reducePre).toEqual(anyFunction) + expect(zip.editCond).toEqual(anyFunction) +}) + +test('core.log interface', () => { + expect(log.deprecated).toEqual(anyFunction) + expect(log.info).toEqual(anyFunction) + expect(log.warning).toEqual(anyFunction) + expect(log.error).toEqual(anyFunction) +}) + +test('core.propNames interface', () => { + expect(propNames.metadata).toEqual('@@skele/metadata') + expect(propNames.children).toEqual('@@skele/children') +}) diff --git a/packages/classic/src/data/__tests__/element.js b/packages/core/src/data/__tests__/element.js similarity index 90% rename from packages/classic/src/data/__tests__/element.js rename to packages/core/src/data/__tests__/element.js index ae19e14..03c2cca 100644 --- a/packages/classic/src/data/__tests__/element.js +++ b/packages/core/src/data/__tests__/element.js @@ -8,10 +8,11 @@ import { ancestorKinds, canonical, isElement, + isElementRef, childrenProperty, childPositions, pathsToChildElements, -} from '../element' +} from '../' describe('element', function() { it('tests if an object is an element', () => { @@ -42,6 +43,22 @@ describe('element', function() { expect(isElement(aList)).toEqual(false) }) + it('tests if an object-kind is a proper ref for an element', () => { + // not proper kinds + expect(isElementRef(undefined)).toEqual(false) + expect(isElementRef(null)).toEqual(false) + expect(isElementRef([null])).toEqual(false) + expect(isElementRef(['test', null])).toEqual(false) + expect(isElementRef(['test', {}])).toEqual(false) + expect(isElementRef(['test', []])).toEqual(false) + + // proper kinds + expect(isElementRef([])).toEqual(true) + expect(isElementRef('test')).toEqual(true) + expect(isElementRef(['test'])).toEqual(true) + expect(isElementRef(['test', 'test2'])).toEqual(true) + }) + it('properly checks for element kinds', function() { const emptyKind = fromJS({ kind: [], diff --git a/packages/classic/src/data/element.js b/packages/core/src/data/element.js similarity index 84% rename from packages/classic/src/data/element.js rename to packages/core/src/data/element.js index 153fe70..2b5bc4e 100644 --- a/packages/classic/src/data/element.js +++ b/packages/core/src/data/element.js @@ -1,19 +1,9 @@ -/* @flow */ 'use strict' import * as R from 'ramda' import invariant from 'invariant' -import deprecated from '../impl/deprecated' -import { - List, - Seq, - is, - Iterable, - KeyedIterable, - IndexedIterable, -} from 'immutable' - -import type { ElementRef, ElementRefCanonical } from './types' +import deprecated from '../log/deprecated' +import { List, Seq, is, Iterable } from 'immutable' /** * Checks if a given object is of the provided kind. @@ -22,10 +12,7 @@ import type { ElementRef, ElementRefCanonical } from './types' * @param element the element * @returns {*} */ -export const isOfKind = R.curry(function isOfKind( - kind: ElementRef, - element: ?KeyedIterable -): boolean { +export const isOfKind = R.curry(function isOfKind(kind, element) { if (element == null) { return false } @@ -42,7 +29,7 @@ export const isOfKind = R.curry(function isOfKind( return is(elementKindNormalized.take(normalized.count()), normalized) }) -export function isElementRef(obj: any): boolean { +export function isElementRef(obj) { const isString = o => typeof o === 'string' if (isString(obj)) return true @@ -60,10 +47,7 @@ export function isElementRef(obj: any): boolean { * @param element tne element * @returns {*} */ -export const isExactlyOfKind = R.curry(function isExactlyOfKind( - kind: ElementRef, - element: ?KeyedIterable -): boolean { +export const isExactlyOfKind = R.curry(function isExactlyOfKind(kind, element) { if (element == null || kindOf(element) == null) { return false } @@ -80,8 +64,8 @@ export const isExactlyOfKind = R.curry(function isExactlyOfKind( * @param element any object, potentially an element * @returns the kind of that element or null (which means the provided object is not an element */ -export function kindOf(element: KeyedIterable): ?ElementRefCanonical { - const kind: ?ElementRef = element.get('kind') +export function kindOf(element) { + const kind = element.get('kind') if (kind != null) { return canonical(kind) @@ -93,7 +77,7 @@ export function kindOf(element: KeyedIterable): ?ElementRefCanonical { /** * Returns true if object provided is an element */ -export function isElement(obj: any): boolean { +export function isElement(obj) { return Iterable.isIterable(obj) && kindOf(obj) != null } @@ -109,9 +93,7 @@ export function isElement(obj: any): boolean { * @param ref the kind * @returns {*} */ -export function ancestorKinds( - ref: ElementRef -): IndexedIterable { +export function ancestorKinds(ref) { const cRef = canonical(ref) invariant(cRef != null, 'you must provide a valid element reference') @@ -136,11 +118,11 @@ export function ancestorKinds( * @param ref an element reference * @returns the canonical version for the reference kind */ -export function canonical(ref: ElementRef): ?List { +export function canonical(ref) { return normalize(ref) } -function normalize(kind): ?List { +function normalize(kind) { if (typeof kind === 'string') { return normalize([kind]) } diff --git a/packages/classic/src/data/index.js b/packages/core/src/data/index.js similarity index 81% rename from packages/classic/src/data/index.js rename to packages/core/src/data/index.js index d0deb52..73547bd 100644 --- a/packages/classic/src/data/index.js +++ b/packages/core/src/data/index.js @@ -1,10 +1,8 @@ 'use strict' import * as R from 'ramda' -import * as element from './element' -export * from './element' -export { element } // deprecated use +export * from './element' /** * Like R.pipe, but the composition is immediately executed using the first arg. diff --git a/packages/core/src/index.js b/packages/core/src/index.js new file mode 100644 index 0000000..07d9c94 --- /dev/null +++ b/packages/core/src/index.js @@ -0,0 +1,17 @@ +'use strict' + +import * as data from './data' +import * as registry from './registry' +import * as zip from './zip' +import * as log from './log' +import * as propNames from './propNames' + +export { data, registry, zip, log, propNames } + +export default { + data, + registry, + zip, + log, + propNames, +} diff --git a/packages/classic/src/impl/deprecated.js b/packages/core/src/log/deprecated.js similarity index 95% rename from packages/classic/src/impl/deprecated.js rename to packages/core/src/log/deprecated.js index c2a5a3d..81b2d5f 100644 --- a/packages/classic/src/impl/deprecated.js +++ b/packages/core/src/log/deprecated.js @@ -1,7 +1,5 @@ 'use strict' -import 'core-js/fn/object/assign' - import { warning } from './log' /** diff --git a/packages/core/src/log/index.js b/packages/core/src/log/index.js new file mode 100644 index 0000000..8375be4 --- /dev/null +++ b/packages/core/src/log/index.js @@ -0,0 +1,4 @@ +'use strict' + +export * from './log' +export { default as deprecated } from './deprecated' diff --git a/packages/classic/src/impl/log.js b/packages/core/src/log/log.js similarity index 100% rename from packages/classic/src/impl/log.js rename to packages/core/src/log/log.js diff --git a/packages/core/src/propNames.js b/packages/core/src/propNames.js new file mode 100644 index 0000000..9bd84a9 --- /dev/null +++ b/packages/core/src/propNames.js @@ -0,0 +1,6 @@ +'use strict' + +import { childrenProperty as children } from './data' + +export { children } +export const metadata = '@@skele/metadata' diff --git a/packages/classic/src/registry/AbstractRegistry.js b/packages/core/src/registry/AbstractRegistry.js similarity index 100% rename from packages/classic/src/registry/AbstractRegistry.js rename to packages/core/src/registry/AbstractRegistry.js diff --git a/packages/classic/src/registry/MultivalueRegistry.js b/packages/core/src/registry/MultivalueRegistry.js similarity index 100% rename from packages/classic/src/registry/MultivalueRegistry.js rename to packages/core/src/registry/MultivalueRegistry.js diff --git a/packages/classic/src/registry/PatternRegistry.js b/packages/core/src/registry/PatternRegistry.js similarity index 100% rename from packages/classic/src/registry/PatternRegistry.js rename to packages/core/src/registry/PatternRegistry.js diff --git a/packages/classic/src/registry/Registry.js b/packages/core/src/registry/Registry.js similarity index 100% rename from packages/classic/src/registry/Registry.js rename to packages/core/src/registry/Registry.js diff --git a/packages/classic/src/registry/RegistryChain.js b/packages/core/src/registry/RegistryChain.js similarity index 100% rename from packages/classic/src/registry/RegistryChain.js rename to packages/core/src/registry/RegistryChain.js diff --git a/packages/classic/src/registry/__tests__/MultivalueRegistry.js b/packages/core/src/registry/__tests__/MultivalueRegistry.js similarity index 100% rename from packages/classic/src/registry/__tests__/MultivalueRegistry.js rename to packages/core/src/registry/__tests__/MultivalueRegistry.js diff --git a/packages/classic/src/registry/__tests__/PatternRegistry.js b/packages/core/src/registry/__tests__/PatternRegistry.js similarity index 100% rename from packages/classic/src/registry/__tests__/PatternRegistry.js rename to packages/core/src/registry/__tests__/PatternRegistry.js diff --git a/packages/classic/src/registry/__tests__/Registry.js b/packages/core/src/registry/__tests__/Registry.js similarity index 100% rename from packages/classic/src/registry/__tests__/Registry.js rename to packages/core/src/registry/__tests__/Registry.js diff --git a/packages/classic/src/registry/__tests__/RegistryChain.js b/packages/core/src/registry/__tests__/RegistryChain.js similarity index 100% rename from packages/classic/src/registry/__tests__/RegistryChain.js rename to packages/core/src/registry/__tests__/RegistryChain.js diff --git a/packages/core/src/registry/index.js b/packages/core/src/registry/index.js new file mode 100644 index 0000000..d081ebe --- /dev/null +++ b/packages/core/src/registry/index.js @@ -0,0 +1,12 @@ +'use strict' + +export { default as AbstractRegistry } from './AbstractRegistry' +export { default as Registry } from './Registry' +export { default as MultivalueRegistry } from './MultivalueRegistry' +export { default as PatternRegistry } from './PatternRegistry' +export { + RegistryChain, + MultivalueRegistryChain, + chainRegistries, + chainMultivalueRegistries, +} from './RegistryChain' diff --git a/packages/classic/src/vendor/zippa/LICENSE b/packages/core/src/vendor/zippa/LICENSE similarity index 100% rename from packages/classic/src/vendor/zippa/LICENSE rename to packages/core/src/vendor/zippa/LICENSE diff --git a/packages/classic/src/vendor/zippa/array_zipper.js b/packages/core/src/vendor/zippa/array_zipper.js similarity index 100% rename from packages/classic/src/vendor/zippa/array_zipper.js rename to packages/core/src/vendor/zippa/array_zipper.js diff --git a/packages/classic/src/vendor/zippa/index.js b/packages/core/src/vendor/zippa/index.js similarity index 100% rename from packages/classic/src/vendor/zippa/index.js rename to packages/core/src/vendor/zippa/index.js diff --git a/packages/classic/src/vendor/zippa/visit.js b/packages/core/src/vendor/zippa/visit.js similarity index 100% rename from packages/classic/src/vendor/zippa/visit.js rename to packages/core/src/vendor/zippa/visit.js diff --git a/packages/classic/src/vendor/zippa/walk.js b/packages/core/src/vendor/zippa/walk.js similarity index 100% rename from packages/classic/src/vendor/zippa/walk.js rename to packages/core/src/vendor/zippa/walk.js diff --git a/packages/classic/src/vendor/zippa/zipper.js b/packages/core/src/vendor/zippa/zipper.js similarity index 100% rename from packages/classic/src/vendor/zippa/zipper.js rename to packages/core/src/vendor/zippa/zipper.js diff --git a/packages/classic/src/zip/__tests__/edit.js b/packages/core/src/zip/__tests__/edit.js similarity index 100% rename from packages/classic/src/zip/__tests__/edit.js rename to packages/core/src/zip/__tests__/edit.js diff --git a/packages/classic/src/zip/__tests__/elementZipper.js b/packages/core/src/zip/__tests__/elementZipper.js similarity index 100% rename from packages/classic/src/zip/__tests__/elementZipper.js rename to packages/core/src/zip/__tests__/elementZipper.js diff --git a/packages/classic/src/zip/__tests__/reduce.js b/packages/core/src/zip/__tests__/reduce.js similarity index 100% rename from packages/classic/src/zip/__tests__/reduce.js rename to packages/core/src/zip/__tests__/reduce.js diff --git a/packages/classic/src/zip/edit.js b/packages/core/src/zip/edit.js similarity index 100% rename from packages/classic/src/zip/edit.js rename to packages/core/src/zip/edit.js diff --git a/packages/classic/src/zip/elementZipper.js b/packages/core/src/zip/elementZipper.js similarity index 100% rename from packages/classic/src/zip/elementZipper.js rename to packages/core/src/zip/elementZipper.js diff --git a/packages/classic/src/zip/index.js b/packages/core/src/zip/index.js similarity index 100% rename from packages/classic/src/zip/index.js rename to packages/core/src/zip/index.js diff --git a/packages/classic/src/zip/reduce.js b/packages/core/src/zip/reduce.js similarity index 100% rename from packages/classic/src/zip/reduce.js rename to packages/core/src/zip/reduce.js