Skip to content

Commit

Permalink
fix(system): allow wrapping selectors in chain (#7304)
Browse files Browse the repository at this point in the history
Refs #7157
  • Loading branch information
char0n committed May 26, 2021
1 parent 385ef75 commit 96cdf00
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 12 deletions.
47 changes: 35 additions & 12 deletions src/core/system.js
Expand Up @@ -392,23 +392,46 @@ function systemExtend(dest={}, src={}) {
if(isObject(statePlugins)) {
for(let namespace in statePlugins) {
const namespaceObj = statePlugins[namespace]
if(!isObject(namespaceObj) || !isObject(namespaceObj.wrapActions)) {
if(!isObject(namespaceObj)) {
continue
}
const { wrapActions } = namespaceObj
for(let actionName in wrapActions) {
let action = wrapActions[actionName]

// This should only happen if dest is the first plugin, since invocations after that will ensure its an array
if(!Array.isArray(action)) {
action = [action]
wrapActions[actionName] = action // Put the value inside an array
}

if(src && src.statePlugins && src.statePlugins[namespace] && src.statePlugins[namespace].wrapActions && src.statePlugins[namespace].wrapActions[actionName]) {
src.statePlugins[namespace].wrapActions[actionName] = wrapActions[actionName].concat(src.statePlugins[namespace].wrapActions[actionName])
const { wrapActions, wrapSelectors } = namespaceObj

// process action wrapping
if (isObject(wrapActions)) {
for(let actionName in wrapActions) {
let action = wrapActions[actionName]

// This should only happen if dest is the first plugin, since invocations after that will ensure its an array
if(!Array.isArray(action)) {
action = [action]
wrapActions[actionName] = action // Put the value inside an array
}

if(src && src.statePlugins && src.statePlugins[namespace] && src.statePlugins[namespace].wrapActions && src.statePlugins[namespace].wrapActions[actionName]) {
src.statePlugins[namespace].wrapActions[actionName] = wrapActions[actionName].concat(src.statePlugins[namespace].wrapActions[actionName])
}

}
}

// process selector wrapping
if (isObject(wrapSelectors)) {
for(let selectorName in wrapSelectors) {
let selector = wrapSelectors[selectorName]

// This should only happen if dest is the first plugin, since invocations after that will ensure its an array
if(!Array.isArray(selector)) {
selector = [selector]
wrapSelectors[selectorName] = selector // Put the value inside an array
}

if(src && src.statePlugins && src.statePlugins[namespace] && src.statePlugins[namespace].wrapSelectors && src.statePlugins[namespace].wrapSelectors[selectorName]) {
src.statePlugins[namespace].wrapSelectors[selectorName] = wrapSelectors[selectorName].concat(src.statePlugins[namespace].wrapSelectors[selectorName])
}

}
}
}
}
Expand Down
45 changes: 45 additions & 0 deletions test/unit/core/system/wrapSelectors.js
@@ -0,0 +1,45 @@
import System from "core/system"

describe("wrapSelectors", () => {
it("should wrap correctly when registering multiple plugins targeting the same selector", function() {
const probeBase = {
statePlugins: {
probe: {
selectors: {
selectProbe: () => {
return "base"
}
}
}
}
}
const probeWrap1 = {
statePlugins: {
probe: {
wrapSelectors: {
selectProbe: (oriSelector) => (state, ...args) => {
const selectedValue = oriSelector(state, ...args)
return `${selectedValue}wrap1`
}
}
}
}
}
const probeWrap2 = {
statePlugins: {
probe: {
wrapSelectors: {
selectProbe: (oriSelector) => (state, ...args) => {
const selectedValue = oriSelector(state, ...args)
return `${selectedValue}wrap2`
}
}
}
}
}

const system = new System({ plugins: [probeBase, probeWrap1, probeWrap2] })

expect(system.getSystem().probeSelectors.selectProbe()).toEqual("basewrap1wrap2")
})
})

0 comments on commit 96cdf00

Please sign in to comment.