Browse Source

feat: integrate data accessing ability into logic

master
smallstonesk 5 years ago
parent
commit
e30bb8054a
  1. 7
      packages/cli/src/cmd/dev/mergePkg.js
  2. 44
      packages/cli/src/cmd/dev/template/context.js
  3. 49
      packages/cli/src/cmd/dev/template/logic.js

7
packages/cli/src/cmd/dev/mergePkg.js

@ -1,6 +1,10 @@
const path = require('path');
const fs = require('fs-extra');
const builtinDependencies = {
"eventemitter3": "^4.0.7"
};
const extractDep = (dsl) => {
const mergedDependencies = {};
const {cells = []} = dsl;
@ -27,6 +31,9 @@ const setup = async (dsl, projectRootPath) => {
Object.keys(dslDependencies).forEach(key => {
pkgJson.dependencies[key] = dslDependencies[key];
});
Object.keys(builtinDependencies).forEach(key => {
pkgJson.dependencies[key] = builtinDependencies[key];
});
}
await fs.writeFile(pkgPath, JSON.stringify(pkgJson, null, 2));
};

44
packages/cli/src/cmd/dev/template/context.js

@ -0,0 +1,44 @@
export default class Context {
constructor() {
this.curNode = null;
}
_reset(opts = {}) {
const {payload = {}} = opts;
this.context = Object.create(null);
this.payload = Object.freeze({...payload});
}
_transitTo(node, lastRet) {
this.curNode = node;
this.lastRet = lastRet;
}
prepare(opts = {}) {
this.payload = opts.payload;
this.context = {};
}
getConfig() {
return this.curNode.data.configData;
}
getPayload() {
return this.payload;
}
getPipe() {
return this.lastRet;
}
getContext() {
return this.context;
}
setContext(data = {}) {
Object.keys(data).forEach(key => {
this.context[key] = data[key];
});
}
}

49
packages/cli/src/cmd/dev/template/logic.js

@ -1,20 +1,6 @@
import nodeFns from './nodeFns';
class Context {
constructor(opts) {
this.curNode = null;
}
transitionToNode(node) {
this.curNode = node;
}
getConfig() {
}
}
import Context from './context';
import EventEmitter from 'eventemitter3';
const SHAPES = {
START: 'imove-start',
@ -22,11 +8,13 @@ const SHAPES = {
BEHAVIOR: 'imove-behavior'
}
class Logic {
export default class Logic {
constructor(opts = {}) {
this.ctx = null;
this.dsl = opts.dsl;
this.ctx = new Context();
this.events = new EventEmitter();
this.ctx.emit = this.events.emit.bind(this.events);
}
get cells() {
@ -77,27 +65,30 @@ class Logic {
}
}
_initCtx(data) {
_resetCtx(data) {
this.ctx._reset({payload: data});
}
_prepareCtx() {
_prepareCtx(node, lastRet) {
this.ctx._transitTo(node, lastRet);
}
async invoke(trigger, data) {
let curNode = this._getStartNode(trigger);
if(!curNode) {
return Promise.reject(`Invoke failed, because no logic-start named ${trigger} found!`);
return Promise.reject(`Invoke failed! No logic-start named ${trigger} found!`);
}
this._initCtx(data);
let lastRet;
this._resetCtx(data);
while(curNode) {
this._prepareCtx();
this._prepareCtx(curNode, lastRet);
const fn = nodeFns[curNode.id];
const ret = await fn(this.ctx);
curNode = this._getNextNode(curNode, ret);
lastRet = await fn(this.ctx);
curNode = this._getNextNode(curNode, lastRet);
}
}
}
module.exports = Logic;
on(...args) {
this.events.on(...args);
}
}

Loading…
Cancel
Save