diff --git a/.travis.yml b/.travis.yml index b0ffe8b..333bb88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - "0.10" + - "4.0" before_script: - npm install -g grunt-cli@0.1.x diff --git a/lib/jsonapter.js b/lib/jsonapter.js index 840806e..8572d02 100644 --- a/lib/jsonapter.js +++ b/lib/jsonapter.js @@ -3,14 +3,13 @@ var _ = require('lodash'); var util = require('./util'); -var outFns = { - string: util.convertToString, - boolean: util.convertToBoolean, - number: util.convertToNumber, - object: util.convertToObject +var outFns = { + string: util.convertToString, + boolean: util.convertToBoolean, + number: util.convertToNumber, + object: util.convertToObject }; - function templateHasKey(template) { return function (key) { return template.hasOwnProperty(key); @@ -29,7 +28,7 @@ var prototype = { if ((Array.isArray(paramKey) || _.isPlainObject(paramKey)) && this.options.mode === 'strict') { throw new Error("paramKey can only be a string " + paramKey); } - if ((paramKey === '' || paramKey === null) && this.options.mode === 'strict') { + if ((paramKey === '' || paramKey === null) && this.options.mode === 'strict') { throw new Error("paramKey can not be an empty string or null " + paramKey); } return _.get(params, paramKey, null); @@ -42,7 +41,7 @@ var prototype = { var n = keyArray.length; for (var i = 0; i < n; ++i) { var dataKey = keyArray[i]; - var inputCandidate = fn(input, dataKey); + var inputCandidate = fn.call(this, input, dataKey); if ((inputCandidate !== null) && (inputCandidate !== undefined)) { return inputCandidate; } @@ -60,7 +59,7 @@ var prototype = { if (_.isPlainObject(dataKey) && this.options.mode === 'strict') { throw new Error("dataKey can be a string, array or function " + dataKey); } - if ((dataKey === '' || dataKey === null) && this.options.mode === 'strict') { + if ((dataKey === '' || dataKey === null) && this.options.mode === 'strict') { throw new Error("dataKey can not be an empty string or null " + dataKey); } if (Array.isArray(dataKey)) { @@ -243,7 +242,7 @@ var prototype = { return this.evaluateValue(templateValue, input, parent, params, arrayIndex, arraySize, options); }, - arrayIndex : function (template, input, parent, params, arrayIndex, arraySize) { + arrayIndex: function (template, input, parent, params, arrayIndex, arraySize) { return this.evaluateArrayIndex(arrayIndex, template.arrayIndex); }, runForArray: function (template, input, parent, params, options) { @@ -384,7 +383,8 @@ var prototype = { return template.output(resultForArray, input, parent, params); } else if (output && outFns[output] && !util.isNullOrUndefined(resultForArray)) { return outFns[output](resultForArray, template.output.type ? template.output : {}); - } if (Array.isArray(resultForArray) && _.intersection(_.keys(template), this.arrayOptions).length > 0) { + } + if (Array.isArray(resultForArray) && _.intersection(_.keys(template), this.arrayOptions).length > 0) { return util.convertArray(resultForArray, template); } else { return resultForArray; @@ -439,6 +439,6 @@ exports.instance = function (overrides, addlActionKeys, options) { if (addlActionKeys) { result.actionKeys = result.actionKeys.concat(addlActionKeys); } - result.options = options || {mode: 'strict'}; + result.options = options || { mode: 'strict' }; return result; }; diff --git a/lib/util.js b/lib/util.js index 714f219..5c99c75 100644 --- a/lib/util.js +++ b/lib/util.js @@ -146,4 +146,4 @@ module.exports = { convertToNumber: convertToNumber, convertToObject: convertToObject, isNullOrUndefined: isNullOrUndefined -}; \ No newline at end of file +}; diff --git a/package.json b/package.json index d3ee6cc..9fc466e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsonapter", - "version": "2.0.3", + "version": "2.0.4", "description": "Template based JSON to JSON transformer", "main": "./index.js", "directories": { diff --git a/test/test-dataKey.js b/test/test-dataKey.js index db4ed3a..dbc9921 100644 --- a/test/test-dataKey.js +++ b/test/test-dataKey.js @@ -8,6 +8,7 @@ var case_0 = require('./test_cases/case-dataKey-0'); var case_1 = require('./test_cases/case-dataKey-1'); var case_2 = require('./test_cases/case-dataKey-2'); var case_3 = require('./test_cases/case-dataKey-3'); +var case_4 = require('./test_cases/case-dataKey-4'); var expect = chai.expect; @@ -60,4 +61,13 @@ describe('dataKey', function () { } }); + it('case-dataKey-4: ', function () { + var template = case_4.template; + var n = case_4.inputs.length; + for (var i = 0; i < n; ++i) { + var actual = engine.run(template, case_4.inputs[i]); + // console.log(JSON.stringify(actual, null, 2)); + expect(actual).to.deep.equal(case_4.expecteds[i]); + } + }); }); diff --git a/test/test-error-mode-slack.js b/test/test-error-mode-slack.js index 1756953..e4344aa 100644 --- a/test/test-error-mode-slack.js +++ b/test/test-error-mode-slack.js @@ -6,7 +6,7 @@ var expect = chai.expect; var _ = require('lodash'); // var j2j = bbj2j.instance(); var bbj2j = require('../index'); -var j2j = bbj2j.instance(null, null, {mode: ""}); +var j2j = bbj2j.instance(null, null, { mode: "" }); describe('example error', function () { @@ -155,4 +155,4 @@ describe('example error', function () { } }); -}); \ No newline at end of file +}); diff --git a/test/test-error.js b/test/test-error.js index e72d243..9c1a940 100644 --- a/test/test-error.js +++ b/test/test-error.js @@ -267,4 +267,4 @@ describe('example error', function () { } }); -}); \ No newline at end of file +}); diff --git a/test/test-examples.js b/test/test-examples.js index 416570b..ea73f3c 100644 --- a/test/test-examples.js +++ b/test/test-examples.js @@ -205,24 +205,23 @@ describe('examples', function () { var template = { dataKey: jsonave('$.[1:]'), content: { - cost: {dataKey: 'price'}, - num: {arrayIndex: {}} + cost: { dataKey: 'price' }, + num: { arrayIndex: {} } } }; - var r = j2j.run(template, - [{ - price: 10 - }, { - price: 20 - }, { - price: 30 - }]); + var r = j2j.run(template, [{ + price: 10 + }, { + price: 20 + }, { + price: 30 + }]); //console.log(r); // [{cost: 20, num: 0}, {cost: 30, num: 1}] expect(r).to.deep.equal([ - {cost: 20, num: 0}, - {cost: 30, num: 1} + { cost: 20, num: 0 }, + { cost: 30, num: 1 } ]); }); @@ -233,87 +232,80 @@ describe('examples', function () { template: { assign: [{ content: { - cost: {dataKey: 'price'}, - num: {arrayIndex: {}} + cost: { dataKey: 'price' }, + num: { arrayIndex: {} } } }, { content: { - tax: {dataKey: 'tax'} + tax: { dataKey: 'tax' } } - } - ] + }] } }; - var r = j2j.run(template, - [{ - price: 10, - tax: 1.3 - }, { - price: 20, - tax: 1.1 - }, { - price: 30, - tax: 1.3 - }]); + var r = j2j.run(template, [{ + price: 10, + tax: 1.3 + }, { + price: 20, + tax: 1.1 + }, { + price: 30, + tax: 1.3 + }]); //console.log(r); // [{cost: 20, tax: 1.1, num: 0}, {cost: 30, tax: 1.3, num: 1}] expect(r).to.deep.equal([ - {cost: 20, tax: 1.1, num: 0}, - {cost: 30, tax: 1.3, num: 1} + { cost: 20, tax: 1.1, num: 0 }, + { cost: 30, tax: 1.3, num: 1 } ]); }); it('dataKey - with arrayIndex and size in a nested array with start', function () { var template = { content: { - name: {dataKey: 'name'}, + name: { dataKey: 'name' }, costs: { dataKey: 'prices', content: { - cost: {dataKey: "price"}, - num: {arrayIndex: {start: 1}}, - total: {size: {}} + cost: { dataKey: "price" }, + num: { arrayIndex: { start: 1 } }, + total: { size: {} } } }, - num: {arrayIndex: {start: 1}}, + num: { arrayIndex: { start: 1 } }, // total: {dataKey: 'name', size:{}} - total: {size: {}} + total: { size: {} } } }; - var r = j2j.run(template, - [{ - name: "apple", - prices: [{ + var r = j2j.run(template, [{ + name: "apple", + prices: [{ price: 10 }, - { - price: 20 - }, { - price: 30 - } - ] - }, { - name: "peach", - prices: [{ + { + price: 20 + }, { + price: 30 + } + ] + }, { + name: "peach", + prices: [{ price: 20 }, - { - price: 40 - }, { - price: 60 - } - ] - } + { + price: 40 + }, { + price: 60 + } ] - ); + }]); - expect(r).to.deep.equal([ - { + expect(r).to.deep.equal([{ name: "apple", - costs: [ - { + costs: [{ cost: 10, num: 1, total: 3 @@ -334,8 +326,7 @@ describe('examples', function () { }, { name: "peach", - costs: [ - { + costs: [{ cost: 20, num: 1, total: 3 @@ -358,7 +349,7 @@ describe('examples', function () { }); it('dataKey - with size of string', function () { - var template = {dataKey: 'name', size: {}}; + var template = { dataKey: 'name', size: {} }; var r = j2j.run(template, { name: 'USA' }); @@ -367,21 +358,22 @@ describe('examples', function () { }); it('dataKey - with size of string inside content', function () { - var template = {dataKey: 'name', - content : { + var template = { + dataKey: 'name', + content: { item: {}, - size: {size: {}} + size: { size: {} } } }; var r = j2j.run(template, { name: 'USA' }); //console.log(r); // {item: 'USA', size: 3} - expect(r).to.deep.equal({item: 'USA', size: 3}); + expect(r).to.deep.equal({ item: 'USA', size: 3 }); }); it('dataKey - with size of array', function () { - var template = {dataKey: 'name', size: {}}; + var template = { dataKey: 'name', size: {} }; var r = j2j.run(template, { name: ['USA', 'Cananda', 'Mexico'] }); @@ -390,10 +382,10 @@ describe('examples', function () { }); it('dataKey - with size of object', function () { - var template = {dataKey: 'countries', size: {}}; + var template = { dataKey: 'countries', size: {} }; var r = j2j.run(template, { countries: { - USA : {}, + USA: {}, Cananda: {}, Mexico: {} } @@ -1086,15 +1078,13 @@ describe('examples', function () { } }; - var r = j2j.run(template, [ - { - person : { - lastName: 'DOE', - firstName: 'JOE', - birthYear: 1980 - } + var r = j2j.run(template, [{ + person: { + lastName: 'DOE', + firstName: 'JOE', + birthYear: 1980 } - ]); + }]); //console.log(r); // {name: {last: 'DOE', first: 'JOE'}, age: 35} console.log(JSON.stringify(r, null, 2)); expect(r).to.deep.equal({ @@ -1474,13 +1464,13 @@ describe('examples', function () { var template = { assign: [{ - dataKey: "subscriber", - content: { - id: function (input, parent) { - return parent.subscriberNum + input.givenName[0] + input.familyName; + dataKey: "subscriber", + content: { + id: function (input, parent) { + return parent.subscriberNum + input.givenName[0] + input.familyName; + } } - } - }, + }, { dataKey: "subscriber", template: nameTemplate diff --git a/test/test-output.js b/test/test-output.js index 1aacbf5..a2e1caf 100644 --- a/test/test-output.js +++ b/test/test-output.js @@ -18,7 +18,7 @@ describe('output', function () { }); it('case-output-2: array output as object', function () { - case_output.template.output = {type: "object"}; + case_output.template.output = { type: "object" }; var actual = engine.run(case_output.template, case_output.input); expect(actual).to.deep.equal(case_output.expected); }); diff --git a/test/test_cases/case-content-2.js b/test/test_cases/case-content-2.js index f1f9a67..73b2e01 100644 --- a/test/test_cases/case-content-2.js +++ b/test/test_cases/case-content-2.js @@ -2,21 +2,25 @@ var _ = require('lodash'); var cmap = { - a: "x", - b: "y", - c: "z" + a: "x", + b: "y", + c: "z" }; exports.template = { content: { prop_s: { - dataKey: 'st', join: {separator: "~"} + dataKey: 'st', + join: { separator: "~" } }, prop_sa: { - dataKey: 'st', value: cmap, join: {separator: "~"} + dataKey: 'st', + value: cmap, + join: { separator: "~" } }, prop_sb: { - dataKey: 'sta', compact: true + dataKey: 'sta', + compact: true }, type: 'Testable', prop_a: { @@ -46,10 +50,12 @@ exports.template = { default: 'default value' }, prop_ss: { - dataKey: 'stt', flatten: {} + dataKey: 'stt', + flatten: {} }, prop_ss_deep: { - dataKey: 'stt', flatten: {deep: true} + dataKey: 'stt', + flatten: { deep: true } } }, ignoreDeep: true @@ -70,9 +76,11 @@ exports.input = { st: ["a", "b", "c"], sta: ["a", "b", "c", null, '', undefined], stt: [ - [{namea: "a"}], - [[{nameb: "b"}]], - [{namec: "c"}] + [{ namea: "a" }], + [ + [{ nameb: "b" }] + ], + [{ namec: "c" }] ] }; @@ -89,16 +97,16 @@ exports.expected = { prop_sa: "x~y~z", prop_sb: ["a", "b", "c"], prop_ss: [ - {namea: "a"}, + { namea: "a" }, [ - {nameb: "b"} + { nameb: "b" } ], - {namec: "c"} + { namec: "c" } ], prop_ss_deep: [ - {namea: "a"}, - {nameb: "b"}, - {namec: "c"} + { namea: "a" }, + { nameb: "b" }, + { namec: "c" } ], prop_default: 'default value' }; diff --git a/test/test_cases/case-dataKey-0.js b/test/test_cases/case-dataKey-0.js index 65f3b04..2e29721 100644 --- a/test/test_cases/case-dataKey-0.js +++ b/test/test_cases/case-dataKey-0.js @@ -8,23 +8,28 @@ exports.template = { return result.substring(0, 1).toUpperCase() + result.substring(1); } }, - nickNames: {dataKey: "nickNames", split: {separator: /\s+/}}, - city: {dataKey: "city", trim: true, lowerCase: true}, - state: {dataKey: "state", trim: true, upperCase: true}, - child: {dataKey: "adult", reverse: true}, - salary: {dataKey: "salary", output: "number"}, + nickNames: { dataKey: "nickNames", split: { separator: /\s+/ } }, + city: { dataKey: "city", trim: true, lowerCase: true }, + state: { dataKey: "state", trim: true, upperCase: true }, + child: { dataKey: "adult", reverse: true }, + salary: { dataKey: "salary", output: "number" }, date: { dataKey: ['birthDate', 'recordedDate'] }, year: { - dataKey: ['birthDate', 'recordedDate'], substring: {start: 0, end: 4} + dataKey: ['birthDate', 'recordedDate'], + substring: { start: 0, end: 4 } }, - occurred: {timeStamp: {serialize: false}}, - occurred1: {timeStamp: {}}, - occurred2: {timeStamp: {serialize: function (value) { - return 'Date:' + value.toJSON(); - }}}, - occurred3: {timeStamp: {serialize: false}, output: "string"} + occurred: { timeStamp: { serialize: false } }, + occurred1: { timeStamp: {} }, + occurred2: { + timeStamp: { + serialize: function (value) { + return 'Date:' + value.toJSON(); + } + } + }, + occurred3: { timeStamp: { serialize: false }, output: "string" } } }; diff --git a/test/test_cases/case-dataKey-4.js b/test/test_cases/case-dataKey-4.js new file mode 100644 index 0000000..b28e2dc --- /dev/null +++ b/test/test_cases/case-dataKey-4.js @@ -0,0 +1,35 @@ +"use strict"; + +var jsonave = require('jsonave'); + +exports.template = { + content: { + productPrice: { + dataKey: ['price', jsonave.instance('$.items[0].price')] + }, + productName: { + dataKey: 'name' + } + } +}; + +exports.inputs = []; +exports.expecteds = []; + +exports.inputs[0] = [{ + name: 'product-0', + price: 5 +}, { + name: 'product-1', + items: [{ + price: 8 + }] +}]; + +exports.expecteds[0] = [{ + productName: 'product-0', + productPrice: 5 +}, { + productName: 'product-1', + productPrice: 8 +}]; diff --git a/test/test_cases/case-output-1.js b/test/test_cases/case-output-1.js index 6d1cc71..5758dc9 100644 --- a/test/test_cases/case-output-1.js +++ b/test/test_cases/case-output-1.js @@ -1,15 +1,15 @@ "use strict"; exports.template = { - dataKey: "subscriber", output: "string" + dataKey: "subscriber", + output: "string" }; exports.input = { subscriber: { - firstName: "John", - lastName: "Smith" - } - }; - -exports.expected = { + firstName: "John", + lastName: "Smith" + } }; + +exports.expected = {}; diff --git a/test/test_cases/case-output.js b/test/test_cases/case-output.js index e7c903a..73bc539 100644 --- a/test/test_cases/case-output.js +++ b/test/test_cases/case-output.js @@ -8,24 +8,23 @@ exports.template = { dest_a: { dataKey: "a" }, dest_a1: { dataKey: "a", output: "string" }, dest_obj: { dataKey: "str", output: "object" }, - empty: { dataKey: "count", output: {type: "boolean", reverse: true} }, - visible: { dataKey: "hidden", output: {type: "boolean", reverse: true} }, - ignore: { dataKey: "mark", output: {type: "boolean", reverse: true} }, + empty: { dataKey: "count", output: { type: "boolean", reverse: true } }, + visible: { dataKey: "hidden", output: { type: "boolean", reverse: true } }, + ignore: { dataKey: "mark", output: { type: "boolean", reverse: true } }, visible1: { dataKey: "hidden1", reverse: true }, dest_ar: { dataKey: "a", round: true }, dest_af: { dataKey: "a", floor: true }, dest_ac: { dataKey: "a", ceiling: true }, - dest_aStr: {dataKey: "a2", output: {type: "string", prefix: "Num ", suffix: "."}}, - dest_bStr: {dataKey: "a1", prefix: "Num ", suffix: "."}, - dest_cStr: {dataKey: "a1", size: {}, output: "string"} + dest_aStr: { dataKey: "a2", output: { type: "string", prefix: "Num ", suffix: "." } }, + dest_bStr: { dataKey: "a1", prefix: "Num ", suffix: "." }, + dest_cStr: { dataKey: "a1", size: {}, output: "string" } } }, - count: {size: {}, output: {type: "string", prefix: "Total ", suffix: "."}} + count: { size: {}, output: { type: "string", prefix: "Total ", suffix: "." } } } }; -exports.input = [ - { +exports.input = [{ a: 1.2, str: '{"a": "sample"}', a1: "1", @@ -51,8 +50,7 @@ exports.input = [ ]; exports.expected = { - items: [ - { + items: [{ dest_a: 1.2, dest_a1: "1.2", dest_ar: 1, @@ -60,7 +58,7 @@ exports.expected = { dest_af: 1, dest_ac: 2, dest_obj: { - a: "sample" + a: "sample" }, visible: false, visible1: false, diff --git a/test/test_cases/case-parent-0.js b/test/test_cases/case-parent-0.js index 8bc38a5..43a2243 100644 --- a/test/test_cases/case-parent-0.js +++ b/test/test_cases/case-parent-0.js @@ -8,11 +8,11 @@ exports.template = { template: { dataKey: "address", content: { - company: {dataKey: "company", source: "parent"}, - street: {dataKey: "street"}, - city: {dataKey: "city"}, - state: {dataKey: "state"}, - zip: {dataKey: "zip"} + company: { dataKey: "company", source: "parent" }, + street: { dataKey: "street" }, + city: { dataKey: "city" }, + state: { dataKey: "state" }, + zip: { dataKey: "zip" } } } }; @@ -32,7 +32,6 @@ exports.inputs[0] = { } }; - exports.expecteds[0] = { company: "Google", street: "1600 Amphitheatre Parkway", diff --git a/test/test_cases/case-parent-1.js b/test/test_cases/case-parent-1.js index f4bf8cb..6e2321b 100644 --- a/test/test_cases/case-parent-1.js +++ b/test/test_cases/case-parent-1.js @@ -10,11 +10,14 @@ exports.template = { template: { dataKey: jsonave('a2[:].a_inner'), content: { - x_new: {dataKey: "x_outer", source: "parent", value: function (input, parent) { - console.log(input, parent); - return 2*input; - }, - floor: true + x_new: { + dataKey: "x_outer", + source: "parent", + value: function (input, parent) { + console.log(input, parent); + return 2 * input; + }, + floor: true }, a_new: {} } @@ -57,18 +60,17 @@ exports.inputs[0] = { }] }; - exports.expecteds[0] = { stuff: [{ x_new: 2, a_new: 4 - },{ + }, { x_new: 2, a_new: 7 - },{ + }, { x_new: 20, a_new: 13 - },{ + }, { x_new: 20, a_new: 16 }] diff --git a/test/test_cases/case-parent-2.js b/test/test_cases/case-parent-2.js index 1dde02a..cd6cd9d 100644 --- a/test/test_cases/case-parent-2.js +++ b/test/test_cases/case-parent-2.js @@ -10,9 +10,9 @@ exports.template = { template: { dataKey: "users", content: { - name: {dataKey: "name"}, - age: {dataKey: "age"}, - company: {dataKey: "company", source: "parent"} + name: { dataKey: "name" }, + age: { dataKey: "age" }, + company: { dataKey: "company", source: "parent" } } }, flatten: true @@ -25,16 +25,15 @@ exports.expecteds = []; exports.inputs[0] = { companies: [{ - company: "Google", - users: [{ - name: "John", - age: 30 - }, { - name: "Jim", - age: 40 - } - ] - }, + company: "Google", + users: [{ + name: "John", + age: 30 + }, { + name: "Jim", + age: 40 + }] + }, { company: "Yahoo", users: [{ @@ -43,15 +42,13 @@ exports.inputs[0] = { }, { name: "Tom", age: 50 - } - ] - }] + }] + } + ] }; - exports.expecteds[0] = { - actors: [ - { + actors: [{ name: "John", age: 30, company: "Google" diff --git a/test/test_cases/case-value-0.js b/test/test_cases/case-value-0.js index 6fe291c..6d0964e 100644 --- a/test/test_cases/case-value-0.js +++ b/test/test_cases/case-value-0.js @@ -9,7 +9,7 @@ var nestedTemplate = { value: function (input, parent, params, extraParams) { return input * extraParams.multiplier; }, - params: {multiplier: 4}, + params: { multiplier: 4 }, dataKey: 'detail.values' }, n_prop_c: { @@ -26,7 +26,7 @@ exports.template = { }, prop_a: { value: function (status, parent, params, extraParams) { - console.log('extraParams '+ extraParams); + console.log('extraParams ' + extraParams); return parent.stage === 'Final' && status === 'Resolved' && extraParams; }, params: true, diff --git a/test/test_cases/case-value-1.js b/test/test_cases/case-value-1.js index 5a87ad5..ccdc9bc 100644 --- a/test/test_cases/case-value-1.js +++ b/test/test_cases/case-value-1.js @@ -2,7 +2,7 @@ exports.template = { value: function (input, parent, params, extraParams) { - return (input > extraParams) ? input - extraParams: null; + return (input > extraParams) ? input - extraParams : null; }, params: 50 }; diff --git a/test/test_cases/case-value-4.js b/test/test_cases/case-value-4.js index 0d88543..4a4d605 100644 --- a/test/test_cases/case-value-4.js +++ b/test/test_cases/case-value-4.js @@ -9,10 +9,10 @@ function parameter(input, parent, params, extraParams) { exports.template = { arrayContent: [{ - dataKey: 'firstName', - value: parameter, - params: 'firstName' - }, + dataKey: 'firstName', + value: parameter, + params: 'firstName' + }, { dataKey: 'lastName', value: parameter, @@ -35,8 +35,7 @@ exports.inputs[0] = { title: 'Mr' }; -exports.expecteds[0] = [ - { +exports.expecteds[0] = [{ name: 'firstName', value: 'John' },