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 path = require('path');
const fs = require('fs-extra'); const fs = require('fs-extra');
const builtinDependencies = {
"eventemitter3": "^4.0.7"
};
const extractDep = (dsl) => { const extractDep = (dsl) => {
const mergedDependencies = {}; const mergedDependencies = {};
const {cells = []} = dsl; const {cells = []} = dsl;
@ -27,6 +31,9 @@ const setup = async (dsl, projectRootPath) => {
Object.keys(dslDependencies).forEach(key => { Object.keys(dslDependencies).forEach(key => {
pkgJson.dependencies[key] = dslDependencies[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)); 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'; import nodeFns from './nodeFns';
import Context from './context';
class Context { import EventEmitter from 'eventemitter3';
constructor(opts) {
this.curNode = null;
}
transitionToNode(node) {
this.curNode = node;
}
getConfig() {
}
}
const SHAPES = { const SHAPES = {
START: 'imove-start', START: 'imove-start',
@ -22,11 +8,13 @@ const SHAPES = {
BEHAVIOR: 'imove-behavior' BEHAVIOR: 'imove-behavior'
} }
class Logic { export default class Logic {
constructor(opts = {}) { constructor(opts = {}) {
this.ctx = null;
this.dsl = opts.dsl; this.dsl = opts.dsl;
this.ctx = new Context();
this.events = new EventEmitter();
this.ctx.emit = this.events.emit.bind(this.events);
} }
get cells() { 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) { async invoke(trigger, data) {
let curNode = this._getStartNode(trigger); let curNode = this._getStartNode(trigger);
if(!curNode) { 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) { while(curNode) {
this._prepareCtx(); this._prepareCtx(curNode, lastRet);
const fn = nodeFns[curNode.id]; const fn = nodeFns[curNode.id];
const ret = await fn(this.ctx); lastRet = await fn(this.ctx);
curNode = this._getNextNode(curNode, ret); curNode = this._getNextNode(curNode, lastRet);
} }
} }
}
module.exports = Logic; on(...args) {
this.events.on(...args);
}
}

Loading…
Cancel
Save