fractal-core
Version:
A minimalist and well crafted app, content or component is our conviction
192 lines • 8.2 kB
JavaScript
;
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