@bemedev/app-solid
Version:
Middleware between @bemedev/app-ts and solidjs
100 lines (96 loc) • 3.26 kB
JavaScript
;
var appTs = require('@bemedev/app-ts');
var index_js$2 = require('@bemedev/app-ts/lib/constants/index.js');
var index_js$1 = require('@bemedev/app-ts/lib/events/index.js');
var index_js = require('@bemedev/app-ts/lib/utils/index.js');
var solidJs = require('solid-js');
var _default = require('./default.cjs');
const interpret = (...[machine, config]) => {
const service = appTs.interpret(machine, config);
const initialState = {
context: service.context,
status: 'idle',
value: service.initialValue,
event: index_js$1.INIT_EVENT,
};
const _store = solidJs.from(service);
const store = () => _store() ?? initialState;
const start = service.start;
const stop = service.stop;
const pause = service.pause;
const resume = service.resume;
const state = (...[accessor = _default.defaultSelector, equals]) => {
const out = solidJs.createRoot(() => solidJs.createMemo(() => accessor(store()), accessor(initialState), {
equals,
}));
return out;
};
const reducer = (accessor) => {
const stateAccessor = accessor;
const reduceS = (...[_accessor = _default.defaultSelector, equals]) => state(_state => {
const step1 = stateAccessor(_state);
const step2 = _accessor(step1);
return step2;
}, equals);
return reduceS;
};
const context = reducer(state => state.context);
const send = service.send;
const value = () => state(state => state.value)();
const mapper = (entry) => index_js.replaceAll({ entry, match: '.', replacement: index_js$2.DEFAULT_DELIMITER });
const dps = () => index_js.decomposeSV(value()).map(mapper);
const status = () => state(state => state.status)();
const tags = () => state(state => state.tags)();
const _select = (selector, equals) => {
const initial = appTs.getByKey(initialState, selector);
const out = solidJs.createRoot(() => solidJs.createMemo(() => {
const _state = store();
const _out = appTs.getByKey(_state, selector);
return _out;
}, initial, {
equals,
}));
return out;
};
const select = (typeof service.context !== 'object' ? undefined : _select);
// #endregion
const matches = (...values) => {
return () => {
const out = values.every(value => dps().includes(value));
return out;
};
};
const contains = (...values) => {
return () => {
const out = values.every(value => dps().every(dp => dp.includes(value)));
return out;
};
};
const values = Object.keys(machine.flat);
const subscribe = service.subscribe;
const dispose = service[Symbol.asyncDispose];
const addOptions = service.addOptions;
return {
contains,
context,
dispose,
dps,
matches,
pause,
reducer,
resume,
select,
send,
start,
state,
status,
stop,
subscribe,
tags,
value,
values,
addOptions,
};
};
exports.interpret = interpret;
//# sourceMappingURL=interpret.cjs.map