Skip to content

Commit d939c95

Browse files
committed
fix #174
1 parent 596b302 commit d939c95

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/utils/schema.js

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
import {get, set, each} from "lodash";
1+
import {get, set, each, isObject, isArray, isFunction, cloneDeep} from "lodash";
22

33
// Create a new model by schema default values
44
module.exports.createDefaultObject = function (schema, obj = {}){
55
each(schema.fields, (field) => {
6-
if (get(obj, field.model) === undefined && field.default !== undefined)
7-
set(obj, field.model, field.default);
6+
if (get(obj, field.model) === undefined && field.default !== undefined) {
7+
if (isFunction(field.default)) {
8+
set(obj, field.model, field.default(field, schema, obj));
9+
} else if (isObject(field.default) || isArray(field.default)) {
10+
set(obj, field.model, cloneDeep(field.default));
11+
} else
12+
set(obj, field.model, field.default);
13+
}
814
});
915
return obj;
1016
};

test/unit/specs/utils/schema.spec.js

+18-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* global sinon */
12
import { expect } from "chai";
23
import { clone } from "lodash";
34

@@ -7,14 +8,21 @@ describe("SchemaUtils", () => {
78

89
describe("test createDefaultObject function", () => {
910

11+
let obj = { a: 5 };
12+
let arr = [5, 3];
13+
14+
let cb = sinon.stub().returns(100);
15+
1016
let schema = {
1117
fields: [
1218
{ model: "id" },
1319
{ model: "name", default: "Anonymous" },
1420
{ model: "password" },
1521
{ model: "age", default: 30 },
1622
{ model: "email" },
17-
{ model: "skills", default: [] },
23+
{ model: "skills", default: arr },
24+
{ model: "data", default: obj },
25+
{ model: "fromFn", default: cb },
1826
{ model: "status", default: true }
1927
]
2028
};
@@ -28,9 +36,17 @@ describe("SchemaUtils", () => {
2836
id: 5,
2937
name: "Anonymous",
3038
age: 45,
31-
skills: [],
39+
skills: [5, 3],
40+
data: { a: 5 },
41+
fromFn: 100,
3242
status: true
3343
});
44+
45+
// Need to clone Object & Array
46+
expect(res.skills).to.not.equal(arr);
47+
expect(res.data).to.not.equal(obj);
48+
49+
expect(cb.calledOnce).to.be.true;
3450
});
3551

3652

0 commit comments

Comments
 (0)