From e30bb8054a16898d1f35d1288712faf6d7e23fca Mon Sep 17 00:00:00 2001 From: smallstonesk <575913857@qq.com> Date: Mon, 31 Aug 2020 11:42:09 +0800 Subject: [PATCH] feat: integrate data accessing ability into logic --- packages/cli/src/cmd/dev/mergePkg.js | 7 +++ packages/cli/src/cmd/dev/template/context.js | 44 ++++++++++++++++++ packages/cli/src/cmd/dev/template/logic.js | 49 ++++++++------------ 3 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 packages/cli/src/cmd/dev/template/context.js diff --git a/packages/cli/src/cmd/dev/mergePkg.js b/packages/cli/src/cmd/dev/mergePkg.js index dbb6c95..47317b9 100644 --- a/packages/cli/src/cmd/dev/mergePkg.js +++ b/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)); }; diff --git a/packages/cli/src/cmd/dev/template/context.js b/packages/cli/src/cmd/dev/template/context.js new file mode 100644 index 0000000..74f65f2 --- /dev/null +++ b/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]; + }); + } +} diff --git a/packages/cli/src/cmd/dev/template/logic.js b/packages/cli/src/cmd/dev/template/logic.js index e0a93b0..793e454 100644 --- a/packages/cli/src/cmd/dev/template/logic.js +++ b/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); + } +}