Skip to content

Commit a50828e

Browse files
Merge pull request #1 from explore-node-js/master
sync. with main repository
2 parents 400d737 + 2499208 commit a50828e

File tree

6 files changed

+149
-31
lines changed

6 files changed

+149
-31
lines changed

.gitignore

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,7 @@
1-
# Logs
2-
logs
3-
*.log
4-
npm-debug.log*
5-
6-
# Runtime data
7-
pids
8-
*.pid
9-
*.seed
10-
11-
# Directory for instrumented libs generated by jscoverage/JSCover
12-
lib-cov
13-
14-
# Coverage directory used by tools like istanbul
15-
coverage
16-
17-
# nyc test coverage
18-
.nyc_output
19-
20-
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
21-
.grunt
22-
23-
# node-waf configuration
24-
.lock-wscript
25-
26-
# Compiled binary addons (http://nodejs.org/api/addons.html)
27-
build/Release
28-
291
# Dependency directories
302
node_modules
313
jspm_packages
324

33-
# Optional npm cache directory
345
.npm
356

36-
# Optional REPL history
37-
.node_repl_history
7+
coverage

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,17 @@
11
# node.js-object-field-resolver
22
allows overwrite object fields with value
3+
4+
5+
how to use:
6+
7+
```
8+
import overwriteObjectField from "node-object-field-resolver"
9+
10+
...
11+
let object = {xxx: 'value'}
12+
13+
object = overwriteObjectField('xxx.yyy', object, 'new value', '.');
14+
15+
object // {xxx: { yyy: 'new value'} }
16+
17+
```

circle.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
machine:
2+
node:
3+
version: 6.9
4+
5+
dependencies:
6+
cache_directories:
7+
- ~/.npm/
8+
9+
test:
10+
override:
11+
- npm test -- --coverage

package.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "node-object-field-resolver",
3+
"version": "0.1.0",
4+
"description": "allows overwrite object fields with value",
5+
"main": "./src/overwrite_object_field_value.js",
6+
"repository": {
7+
"type": "git",
8+
"url": "git+https://github.com/explore-node-js/node.js-object-field-resolver.git"
9+
},
10+
"keywords": [
11+
"object field resolver, overwrite object fields"
12+
],
13+
"author": "Eugene Matvejev <eugene.matvejev@gmail.com>",
14+
"license": "MIT",
15+
"bugs": {
16+
"url": "https://github.com/explore-node-js/node.js-object-field-resolver/issues"
17+
},
18+
"homepage": "https://github.com/explore-node-js/node.js-object-field-resolver#readme",
19+
"dependencies": {},
20+
"devDependencies": {
21+
"jest": "^18.1.0"
22+
},
23+
"scripts": {
24+
"test": "node node_modules/jest/bin/jest.js --verbose"
25+
}
26+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"use strict";
2+
3+
module.exports = function overwriteObjectFieldValue(abstractPath, value, object, delimiter) {
4+
delimiter = undefined !== delimiter ? delimiter : '.';
5+
6+
const indexes = abstractPath.split(delimiter);
7+
const lastPathIndex = indexes.length - 1;
8+
let obj = object;
9+
10+
for (let i = 0; i <= lastPathIndex; i++) {
11+
const index = indexes[i];
12+
13+
if (undefined === obj[index]) {
14+
obj[index] = {};
15+
}
16+
17+
if (i === lastPathIndex) {
18+
obj[index] = value;
19+
20+
break;
21+
}
22+
23+
obj = obj[index];
24+
}
25+
26+
return object;
27+
};
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
const overwriteObjectFieldValue = require("../src/overwrite_object_field_value");
2+
3+
describe(`resolver: object field`, () => {
4+
const dataProvider = [
5+
{
6+
absolutePath: 'node1',
7+
value: {},
8+
object: {},
9+
expected: { node1: {} }
10+
},
11+
{
12+
absolutePath: 'node1',
13+
value: {},
14+
object: { node1: ['test'] },
15+
expected: { node1: {} }
16+
},
17+
{
18+
absolutePath: 'node1',
19+
value: {},
20+
object: { node2: ['test'] },
21+
expected: { node2: ['test'], node1: {} }
22+
},
23+
{
24+
absolutePath: 'node1.node2',
25+
value: { value: 'test' },
26+
object: {},
27+
expected: { node1: { node2: { value: 'test' } } }
28+
},
29+
{
30+
absolutePath: 'node1.node2.node3',
31+
value: ['test'],
32+
object: {},
33+
expected: { node1: { node2: { node3: ['test'] } } }
34+
},
35+
{
36+
absolutePath: 'node1.node2.node3',
37+
value: ['test'],
38+
object: { node1: { node2: { node3: { node4: {} } } } },
39+
expected: { node1: { node2: { node3: ['test'] } } }
40+
},
41+
{
42+
absolutePath: 'node1.node2.node3.node4',
43+
value: 'string',
44+
object: { node4: { node2: { node3: { node4: '' } } } },
45+
expected: { node4: { node2: { node3: { node4: '' } } }, node1: { node2: { node3: { node4: 'string' } } } }
46+
}
47+
];
48+
const execute = (el) => {
49+
it(`::overwriteObjectFieldValue using: object - "${JSON.stringify(el.object)}" path - "${el.absolutePath}" delimiter - "${el.delimiter}"`, () => {
50+
const object = overwriteObjectFieldValue(el.absolutePath, el.value, el.object, el.delimiter);
51+
52+
expect(JSON.stringify(object)).toMatch(JSON.stringify(el.expected));
53+
});
54+
};
55+
56+
dataProvider
57+
/** tests where delimiter is undefined */
58+
.forEach(el => execute(el));
59+
60+
dataProvider
61+
/** tests where delimiter is defined */
62+
.map(el => {
63+
const delimiter = '/';
64+
el.absolutePath = el.absolutePath.replace(/\./g, delimiter);
65+
el.delimiter = delimiter;
66+
67+
return el;
68+
}).forEach(el => execute(el));
69+
});

0 commit comments

Comments
 (0)