Skip to content
This repository has been archived by the owner on Feb 18, 2024. It is now read-only.

Feature: allow specifying to use before or after other use #42

Merged
merged 3 commits into from
Oct 6, 2017
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,8 +201,11 @@ entries()
```js
// Provide an object which maps its properties and values
// into the backing Map as keys and values.
// You can also provide an array to the second argument
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/an array to the second argument/an array as the second argument/ maybe? Up to you :-)

// for property names to omit from being merged.
// obj: Object
merge(obj)
// omit: Optional Array
merge(obj, omit)
```

```js
Expand Down
20 changes: 18 additions & 2 deletions src/ChainedMap.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
const merge = require('deepmerge');
const Chainable = require('./Chainable');

module.exports = class extends Chainable {
Expand Down Expand Up @@ -53,8 +54,23 @@ module.exports = class extends Chainable {
return this;
}

merge(obj) {
Object.keys(obj).forEach(key => this.set(key, obj[key]));
merge(obj, omit = []) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This and the other merge/omit parts could be a separate commit in the PR from the before/after parts :-)

Object
.keys(obj)
.forEach(key => {
if (omit.includes(key)) {
return;
}

const value = obj[key];

if ((!Array.isArray(value) && typeof value !== 'object') || value === null || !this.has(key)) {
this.set(key, value);
} else {
this.set(key, merge(this.get(key), value));
}
});

return this;
}

Expand Down
58 changes: 26 additions & 32 deletions src/Config.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,41 +74,35 @@ module.exports = class extends ChainedMap {
}));
}

merge(obj = {}) {
Object
.keys(obj)
.forEach(key => {
const value = obj[key];
merge(obj = {}, omit = []) {
const omissions = [
'node',
'output',
'resolve',
'resolveLoader',
'devServer',
'performance',
'module'
];

switch (key) {
case 'node':
case 'output':
case 'resolve':
case 'resolveLoader':
case 'devServer':
case 'performance':
case 'module': {
return this[key].merge(value);
}

case 'entry': {
return Object
.keys(value)
.forEach(name => this.entry(name).merge(value[name]));
}
if (!omit.includes('entry') && 'entry' in obj) {
Object
.keys(obj.entry)
.forEach(name => this.entry(name).merge(obj.entry[name]));
}

case 'plugin': {
return Object
.keys(value)
.forEach(name => this.plugin(name).merge(value[name]));
}
if (!omit.includes('plugin') && 'plugin' in obj) {
Object
.keys(obj.plugin)
.forEach(name => this.plugin(name).merge(obj.plugin[name]));
}

default: {
this.set(key, value);
}
}
});
omissions.forEach(key => {
if (!omit.includes(key) && key in obj) {
this[key].merge(obj[key]);
}
});

return this;
return super.merge(obj, [...omit, ...omissions, 'entry', 'plugin']);
}
};
26 changes: 5 additions & 21 deletions src/DevServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,27 +54,11 @@ module.exports = class extends ChainedMap {
}, this.entries() || {}));
}

merge(obj) {
Object
.keys(obj)
.forEach(key => {
const value = obj[key];
merge(obj, omit = []) {
if (!omit.includes('allowedHosts') && 'allowedHosts' in obj) {
this.allowedHosts.merge(obj.allowedHosts);
}

switch (key) {
case 'allowedHosts': {
return this[key].merge(value);
}

default: {
if (this.has(key)) {
this.set(key, merge(this.get(key), value));
} else {
this.set(key, value);
}
}
}
});

return this;
return super.merge(obj, ['allowedHosts']);
}
};
26 changes: 7 additions & 19 deletions src/Module.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,13 @@ module.exports = class extends ChainedMap {
}));
}

merge(obj) {
Object
.keys(obj)
.forEach(key => {
const value = obj[key];

switch (key) {
case 'rule': {
return Object
.keys(value)
.forEach(name => this.rule(name).merge(value[name]));
}

default: {
this.set(key, value);
}
}
});
merge(obj, omit = []) {
if (!omit.includes('rule') && 'rule' in obj) {
Object
.keys(obj.rule)
.forEach(name => this.rule(name).merge(obj.rule[name]));
}

return this;
return super.merge(obj, ['rule']);
}
};
8 changes: 4 additions & 4 deletions src/Plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ module.exports = class extends ChainedMap {
return this;
}

merge(obj) {
if (obj.plugin) {
merge(obj, omit = []) {
if ('plugin' in obj) {
this.set('plugin', obj.plugin);
}

if (obj.args) {
if ('args' in obj) {
this.set('args', obj.args);
}

return this;
return super.merge(obj, [...omit, 'args', 'plugin'])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing semicolon.

I wonder if we should add some linting to this repo?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I've put it off for a while. I can do that in another PR, although it would be easier to either use Neutrino (seems circular) or move this repo into the monorepo.

}

toConfig() {
Expand Down
44 changes: 17 additions & 27 deletions src/Resolve.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,34 +45,24 @@ module.exports = class extends ChainedMap {
}));
}

merge(obj) {
Object
.keys(obj)
.forEach(key => {
const value = obj[key];
merge(obj, omit = []) {
const omissions = [
'alias',
'aliasFields',
'descriptionFiles',
'extensions',
'mainFields',
'mainFiles',
'modules',
'plugins'
];

switch (key) {
case 'alias':
case 'aliasFields':
case 'descriptionFiles':
case 'extensions':
case 'mainFields':
case 'mainFiles':
case 'modules':
case 'plugins': {
return this[key].merge(value);
}
omissions.forEach(key => {
if (!omit.includes(key) && key in obj) {
this[key].merge(obj[key]);
}
});

default: {
if (this.has(key)) {
this.set(key, merge(this.get(key), value));
} else {
this.set(key, value);
}
}
}
});

return this;
return super.merge(obj, [...omit, ...omissions]);
}
};
36 changes: 13 additions & 23 deletions src/ResolveLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,20 @@ module.exports = class extends ChainedMap {
}, this.entries() || {}));
}

merge(obj) {
Object
.keys(obj)
.forEach(key => {
const value = obj[key];
merge(obj, omit = []) {
const omissions = [
'extensions',
'modules',
'moduleExtensions',
'packageMains'
];

switch (key) {
case 'extensions':
case 'modules':
case 'moduleExtensions':
case 'packageMains': {
return this[key].merge(value);
}
omissions.forEach(key => {
if (!omit.includes(key) && key in obj) {
this[key].merge(obj[key]);
}
});

default: {
if (this.has(key)) {
this.set(key, merge(this.get(key), value));
} else {
this.set(key, value);
}
}
}
});

return this;
return super.merge(obj, [...omit, ...omissions]);
}
};
53 changes: 22 additions & 31 deletions src/Rule.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,45 +40,36 @@ module.exports = class Rule extends ChainedMap {
return this.clean(Object.assign(this.entries() || {}, {
include: this.include.values(),
exclude: this.exclude.values(),
oneOf: this.oneOfs.values().map(r => r.toConfig()),
oneOf: this.oneOfs.values().map(oneOf => oneOf.toConfig()),
use: this.uses.values().map(use => use.toConfig())
}));
}

merge(obj) {
Object
.keys(obj)
.forEach(key => {
const value = obj[key];

switch (key) {
case 'include':
case 'exclude': {
return this[key].merge(value);
}
merge(obj, omit = []) {
if (!omit.includes('include') && 'include' in obj) {
this.include.merge(obj.include);
}

case 'use': {
return Object
.keys(value)
.forEach(name => this.use(name).merge(value[name]));
}
if (!omit.includes('exclude') && 'exclude' in obj) {
this.exclude.merge(obj.exclude);
}

case 'oneOf': {
return Object
.keys(value)
.forEach(name => this.oneOf(name).merge(value[name]))
}
if (!omit.includes('use') && 'use' in obj) {
Object
.keys(obj.use)
.forEach(name => this.use(name).merge(obj.use[name]));
}

case 'test': {
return this.test(value instanceof RegExp ? value : new RegExp(value));
}
if (!omit.includes('oneOf') && 'oneOf' in obj) {
Object
.keys(obj.oneOf)
.forEach(name => this.oneOf(name).merge(obj.oneOf[name]))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing semicolon

}

default: {
this.set(key, value);
}
}
});
if (!omit.includes('test') && 'test' in obj) {
this.test(obj.test instanceof RegExp ? obj.test : new RegExp(obj.test));
}

return this;
return super.merge(obj, [...omit, 'include', 'exclude', 'use', 'oneOf', 'test']);
}
};
8 changes: 4 additions & 4 deletions src/Use.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@ module.exports = class extends ChainedMap {
return this;
}

merge(obj) {
if (obj.loader) {
merge(obj, omit = []) {
if (!omit.includes('loader') && 'loader' in obj) {
this.loader(obj.loader);
}

if (obj.options) {
if (!omit.includes('options') && 'options' in obj) {
this.options(merge(this.store.get('options') || {}, obj.options));
}

return this;
return super.merge(obj, [...omit, 'loader', 'options']);
}

toConfig() {
Expand Down
9 changes: 9 additions & 0 deletions test/ChainedMap.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,15 @@ test('merge with overriding values', t => {
t.deepEqual(map.entries(), { a: 'alpha', b: 'beta', c: 'gamma' });
});

test('merge with omitting keys', t => {
const map = new ChainedMap();
const obj = { a: 'alpha', b: 'beta', c: 'gamma'};

map.merge(obj, ['b']);

t.deepEqual(map.entries(), { a: 'alpha', c: 'gamma' });
});

test('when true', t => {
const map = new ChainedMap();
const right = instance => {
Expand Down
Loading