Skip to content

Commit

Permalink
chore: add warning for overrided fields, close: #2
Browse files Browse the repository at this point in the history
  • Loading branch information
bzone authored and benjycui committed Oct 17, 2017
1 parent 90e25d1 commit f495068
Show file tree
Hide file tree
Showing 4 changed files with 1,953 additions and 28 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/node_modules
/lib
/yarn.lock
47 changes: 40 additions & 7 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,53 @@
const check = (origin, cache, count) => {
for (let key in origin) {
if (cache.indexOf(key) === -1) {
cache.push(key);
} else {
count[key] ? count[key]++ : count[key] = 1;
}
}
}

const log = (model, constitute, count) => {
let logCount = 0;
for (let key in count) {
if (!logCount) {
console.warn(`Please note that some of the attributes are inherited in the ${model.namespace} / ${constitute}:`);
}
logCount++;
console.warn(`-> ${key} be overwritten ${count[key]} time(s).`);
}
}

export default function modelExtend(...models) {
const base = {
state: {},
subscriptions: {},
effects: {},
reducers: {},
};
return models.reduce((acc, extend) => {
const
base = { state: {}, subscriptions: {}, effects: {}, reducers: {}, },
stateCache = [], stateCount = {},
subscriptionsCache = [], subscriptionsCount = {},
effectsCache = [], effectsCount = {},
reducersCache = [], reducersCount = {};

const model = models.reduce((acc, extend) => {

acc.namespace = extend.namespace;
if (typeof extend.state === 'object' && !Array.isArray(extend.state)) {
check(extend.state, stateCache, stateCount)
Object.assign(acc.state, extend.state);
} else if ('state' in extend) {
acc.state = extend.state;
}
check(extend.subscriptions, subscriptionsCache, subscriptionsCount)
Object.assign(acc.subscriptions, extend.subscriptions);
check(extend.effects, effectsCache, effectsCount)
Object.assign(acc.effects, extend.effects);
check(extend.reducers, reducersCache, reducersCount)
Object.assign(acc.reducers, extend.reducers);
return acc;
}, base);

log(model, 'state', stateCount)
log(model, 'subscriptions', subscriptionsCount)
log(model, 'effects', effectsCount)
log(model, 'reducers', reducersCount)
return model;
};
167 changes: 146 additions & 21 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@ const modelExtend = require('../lib').default;

describe('modelExtend', () => {
it('should support multi inheritance', () => {
function keyup() {}
function *focus() {}
function updateState() {}
function keyup() { }
function* focus() { }
function updateState() { }
const res = modelExtend({
subscriptions: {
keyup,
},
}, {
effects: {
focus,
},
}, {
namespace: 'test',
state: {},
reducers: {
updateState,
},
});
effects: {
focus,
},
}, {
namespace: 'test',
state: {},
reducers: {
updateState,
},
});
assert.deepEqual(res, {
namespace: 'test',
state: {},
Expand All @@ -44,10 +44,10 @@ describe('modelExtend', () => {
name: 'Benjy',
},
}, {
state: {
age: 18,
},
});
state: {
age: 18,
},
});
assert.deepEqual(res.state, {
name: 'Benjy',
age: 18,
Expand All @@ -60,8 +60,8 @@ describe('modelExtend', () => {
name: 'Benjy',
},
}, {
state: 18,
});
state: 18,
});
assert.strictEqual(res.state, 18);
});

Expand All @@ -71,9 +71,134 @@ describe('modelExtend', () => {
name: 'Benjy',
},
}, {
state: [],
});
state: [],
});
assert.ok(Array.isArray(res.state));
assert.strictEqual(res.state.length, 0);
});

it('should log 2 times of state overwritten log', () => {
modelExtend({
state: {
name: 'Benjy',
},
}, {
state: {
name: 'Benjy',
},
}, {
state: {
name: 'Benjy',
},
namespace: 'test',
});
});

it('should log 2 times of subscriptions overwritten log', () => {
modelExtend({
subscriptions: {
name: 'Benjy',
},
}, {
subscriptions: {
name: 'Benjy',
},
}, {
subscriptions: {
name: 'Benjy',
},
namespace: 'test',
});
});

it('should log 2 times of effects overwritten log', () => {
modelExtend({
effects: {
name: 'Benjy',
},
}, {
effects: {
name: 'Benjy',
},
}, {
effects: {
name: 'Benjy',
},
namespace: 'test',
});
});

it('should log 2 times of reducers overwritten log', () => {
modelExtend({
reducers: {
name: 'Benjy',
},
}, {
reducers: {
name: 'Benjy',
},
}, {
reducers: {
name: 'Benjy',
},
namespace: 'test',
});
});

it('should log all overwritten log', () => {
modelExtend({
subscriptions: {
name: 'Benjy',
},
}, {
subscriptions: {
name: 'Benjy',
},
}, {
subscriptions: {
name: 'Benjy',
},
namespace: 'test',
},
{
effects: {
name: 'Benjy',
},
}, {
effects: {
name: 'Benjy',
},
}, {
effects: {
name: 'Benjy',
},
namespace: 'test',
},
{
reducers: {
name: 'Benjy',
},
}, {
reducers: {
name: 'Benjy',
},
}, {
reducers: {
name: 'Benjy',
},
}, {
state: {
name: 'Benjy',
},
}, {
state: {
name: 'Benjy',
},
}, {
state: {
name: 'Benjy',
},
namespace: 'test',
});
});
});
Loading

0 comments on commit f495068

Please sign in to comment.