UNPKG

fractal-core

Version:

A minimalist and well crafted app, content or component is our conviction

192 lines 8.2 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const _1 = require("."); const interface_1 = require("./interface"); const fun_1 = require("../utils/fun"); const module_1 = require("./module"); exports.makeInputHelpers = (ctx) => ({ state: ctx.state, ctx, in: interface_1._in(ctx), act: interface_1._act(ctx), inFn: interface_1._inFn(ctx), actFn: interface_1._actFn(ctx), stateOf: exports._stateOf(ctx), toIn: module_1.toIn(ctx), toChild: exports.toChild(ctx), toChildAct: exports.toChildAct(ctx), toAct: exports.toAct(ctx), set: exports.set(ctx), task: module_1.performTask(ctx), emit: ctx.eventBus.emit, on: (evName, evData, pullable) => { const _dispatchEv = _1.dispatchEv(ctx); return ctx.eventBus.on(evName, data => _dispatchEv(data, evData), pullable); }, off: ctx.eventBus.off, comps: exports._componentHelpers(ctx), _clearCache: exports._clearCache(ctx), }); // extract state from a child component exports._stateOf = (ctx) => (name) => { let id = ctx.id + '$' + name; let childCtx = ctx.components[id]; if (childCtx) { return childCtx.state; } else { ctx.error('stateOf', `there are no child '${name}' in context '${ctx.id}'`); } }; // send a message to an input of a component from its parent exports.toChild = (ctx) => (childCompName, inputName, msg = undefined) => __awaiter(this, void 0, void 0, function* () { let childId = ctx.id + '$' + childCompName; let compCtx = ctx.components[childId]; if (compCtx) { return yield module_1.toIn(compCtx)(inputName, msg); } else { ctx.error('toChild', `there are no child '${childCompName}' in space '${ctx.id}'`); } }); // execute an action of a component from its parent exports.toChildAct = (ctx) => (childCompName, actionName, msg = undefined) => __awaiter(this, void 0, void 0, function* () { let childId = ctx.id + '$' + childCompName; let compCtx = ctx.components[childId]; if (compCtx) { return yield module_1.toIn(compCtx)('_action', [actionName, msg]); } else { ctx.error('toChild', `there are no child '${childCompName}' in space '${ctx.id}'`); } }); // generic action caller exports.toAct = (ctx) => { let _toIn = module_1.toIn(ctx); return (actionName, data) => __awaiter(this, void 0, void 0, function* () { return yield _toIn('_action', [actionName, data]); }); }; // Set Action caller (syntax sugar) exports.set = (ctx) => { let _toIn = module_1.toIn(ctx); return (arg0, arg1) => __awaiter(this, void 0, void 0, function* () { return yield _toIn('_action', ['Set', arg0 instanceof Array ? arg0 : [arg0, arg1]]); }); }; /** * Clears the interface cache of a component and its descendants * @param ctx The component Context */ exports._clearCache = (ctx) => { return (interfaceName, childNames) => { let descendantIds, childId; if (childNames) { for (let i = 0, childName; childName = childNames[i]; i++) { childId = ctx.id + '$' + childName; ctx.components[childId].interfaceValues[interfaceName] = undefined; descendantIds = _1.getDescendantIds(ctx, childId); for (let j = 0, descId; descId = descendantIds[j]; j++) { ctx.components[descId].interfaceValues[interfaceName] = undefined; } } } else { ctx.components[ctx.id].interfaceValues[interfaceName] = undefined; descendantIds = _1.getDescendantIds(ctx, childId); for (let j = 0, descId; descId = descendantIds[j]; j++) { ctx.components[descId].interfaceValues[interfaceName] = undefined; } } }; }; exports.getName = (name) => name.split('_')[1]; exports.getCompleteNames = (state, groupName) => Object.keys(state._nest) .filter(name => name.split('_')[0] === groupName); exports.getNames = (state, groupName) => exports.getCompleteNames(state, groupName) .map(n => n.split('_')[1]); exports._componentHelpers = (ctx) => { let _toChild = exports.toChild(ctx); let stateOf = exports._stateOf(ctx); return groupName => { let completeNames = Object.keys(ctx.components[ctx.id].state._nest) .filter(name => name.split('_')[0] === groupName); let componentNames = completeNames.map(n => n.split('_')[1]); return { getState(key, options) { let obj = {}; let name; let exceptions = options && options.exceptions; let nameFn = options && options.nameFn; for (let i = 0, len = completeNames.length; i < len; i++) { if (exceptions && exceptions.indexOf(componentNames[i]) === -1 || !exceptions) { name = componentNames[i]; name = nameFn ? nameFn(name) : name; obj[name] = stateOf(completeNames[i])[key]; } } return obj; }, getStates(options) { let obj = {}; let name, state; let exceptions = options && options.exceptions; let path = options && options.path; let nameFn = options && options.nameFn; for (let i = 0, len = completeNames.length; i < len; i++) { if (exceptions && exceptions.indexOf(completeNames[i]) === -1 || !exceptions) { name = exports.getName(completeNames[i]); name = nameFn ? nameFn(name) : name; state = stateOf(completeNames[i]); obj[name] = path ? fun_1.getPath(path, state) : state; } } return obj; }, executeAll(insts) { for (let i = 0, inst; inst = insts[i]; i++) { _toChild(groupName + '_' + inst[0], inst[1], inst[2]); } }, broadcast(inputName, data) { for (let i = 0, name; name = completeNames[i]; i++) { _toChild(name, inputName, data); } }, optionalBroadcast(inputName, data) { for (let i = 0, name; name = completeNames[i]; i++) { if (ctx.components[ctx.id + '$' + name].inputs[inputName]) { _toChild(name, inputName, data); } } }, seqBroadcast(inputName, data) { return __awaiter(this, void 0, void 0, function* () { for (let i = 0, name; name = completeNames[i]; i++) { yield _toChild(name, inputName, data); } }); }, seqOptionalBroadcast(inputName, data) { return __awaiter(this, void 0, void 0, function* () { for (let i = 0, name; name = completeNames[i]; i++) { if (ctx.components[ctx.id + '$' + name].inputs[inputName]) { yield _toChild(name, inputName, data); } } }); }, getNames() { return componentNames; }, getCompleteNames() { return completeNames; } }; }; }; //# sourceMappingURL=input.js.map