diff --git a/lib/core/traverse.js b/lib/core/traverse.js index ee263e57516aca4dde6bc4ec78f65b79db6c021f..379910ec781847cd02fc9f6f035c95bd558a5a3d 100644 Binary files a/lib/core/traverse.js and b/lib/core/traverse.js differ diff --git a/ts/core/clean.ts b/ts/core/clean.ts new file mode 100644 index 0000000000000000000000000000000000000000..4e8e8acf620ffdf7dfae6c69e7f1d055ea4e10cb --- /dev/null +++ b/ts/core/clean.ts @@ -0,0 +1,67 @@ +// TODO: tsify + +function isArray(obj) { + return obj && Array.isArray(obj); +} + +function isObject(obj) { + return obj && obj !== null && typeof obj === 'object'; +} + +function hasNothing(obj) { + if (isArray(obj)) { + return obj.length === 0; + } + + if (isObject(obj)) { + return Object.keys(obj).length === 0; + } + + return typeof obj === 'undefined' || obj === null; +} + +function removeProps(obj, key?, parent?) { + var i, + value, + isFullyEmpty = true; + + if (isArray(obj)) { + for (i = 0; i < obj.length; ++i) { + value = obj[i]; + + if (isObject(value)) { + removeProps(value, i, obj); + } + + if (hasNothing(value)) { + obj.splice(i--, 1); + } else { + isFullyEmpty = false; + } + } + } else { + for (i in obj) { + value = obj[i]; + + if (isObject(value)) { + removeProps(value, i, obj); + } + + if (hasNothing(value)) { + delete obj[i]; + } else { + isFullyEmpty = false; + } + } + } + + if (typeof key !== 'undefined' && isFullyEmpty) { + delete parent[key]; + removeProps(obj); + } +} + +export = function(obj: any) { + removeProps(obj); + return obj; +}; diff --git a/ts/core/traverse.ts b/ts/core/traverse.ts index 8ceb630badb785f9b4851f391a6c1e3107449867..4883f0f9496a2b01e4a64c62ab8230664843edc5 100644 --- a/ts/core/traverse.ts +++ b/ts/core/traverse.ts @@ -1,3 +1,4 @@ +import clean = require('./clean'); import random = require('./random'); import ParseError = require('./error'); import inferType = require('./infer'); @@ -91,7 +92,7 @@ function traverse(schema: JsonSchema, path: SchemaPath, resolve: Function) { } } - return copy; + return clean(copy); } export = traverse;