Comparing version 0.5.2 to 0.5.3
@@ -5,3 +5,3 @@ { | ||
"description": "A D3-based reusable chart library", | ||
"version": "0.5.2", | ||
"version": "0.5.3", | ||
"keywords": [], | ||
@@ -8,0 +8,0 @@ "dependencies": { |
{ | ||
"name": "c3", | ||
"version": "0.5.2", | ||
"version": "0.5.3", | ||
"description": "D3-based reusable chart library", | ||
@@ -9,2 +9,3 @@ "main": "c3.js", | ||
"lint": "jshint --reporter=node_modules/jshint-stylish src/ spec/", | ||
"docs": "bundle exec middleman", | ||
"build": "npm run build:js && npm run build:css", | ||
@@ -17,5 +18,8 @@ "build:js": "npm run build:js:rollup && npm run build:js:uglify", | ||
"build:css:min": "cleancss -o c3.min.css c3.css", | ||
"build:docs": "bundle exec middleman build", | ||
"publish-docs": "npm run build:docs && gh-pages -d build -m \"chore: update gh-pages [skip ci]\"", | ||
"watch": "nodemon -e js,scss --watch src -x 'npm run build:js:rollup && npm run build:css:sass'", | ||
"watch:js": "nodemon -e js --watch src --ignore src/scss -x 'npm run build:js:rollup'", | ||
"watch:css": "nodemon -e scss --watch src -x 'npm run build:css:sass'", | ||
"watch:docs": "bundle exec middleman", | ||
"test:only": "karma start karma.conf.js", | ||
@@ -55,2 +59,3 @@ "test": "npm run build && npm run lint && karma start karma.conf.js", | ||
"codecov": "^3.0.0", | ||
"gh-pages": "^1.1.0", | ||
"jasmine-core": "^2.3.4", | ||
@@ -57,0 +62,0 @@ "jshint": "^2.9.4", |
@@ -51,8 +51,11 @@ # c3 | ||
Please fork this fiddle: | ||
+ http://jsfiddle.net/7kYJu/4742/ | ||
## Dependency | ||
+ [D3.js](https://github.com/mbostock/d3) `^4.12.0` | ||
## License | ||
MIT |
import c3 from '../src'; | ||
const $$ = c3.chart.internal.fn; | ||
$$.d3 = require("d3"); | ||
describe('$$.convertColumnsToData', () => { | ||
it('converts column data to normalized data', () => { | ||
const data = $$.convertColumnsToData([ | ||
["cat1", "a", "b", "c", "d"], | ||
["data1", 30, 200, 100, 400], | ||
["cat2", "b", "a", "c", "d", "e", "f"], | ||
["data2", 400, 60, 200, 800, 10, 10] | ||
]); | ||
describe('data.convert', () => { | ||
expect(data).toEqual([{ | ||
cat1: 'a', | ||
data1: 30, | ||
cat2: 'b', | ||
data2: 400 | ||
}, { | ||
cat1: 'b', | ||
data1: 200, | ||
cat2: 'a', | ||
data2: 60 | ||
}, { | ||
cat1: 'c', | ||
data1: 100, | ||
cat2: 'c', | ||
data2: 200 | ||
}, { | ||
cat1: 'd', | ||
data1: 400, | ||
cat2: 'd', | ||
data2: 800 | ||
}, { | ||
cat2: 'e', | ||
data2: 10 | ||
}, { | ||
cat2: 'f', | ||
data2: 10 | ||
}]); | ||
describe('$$.convertColumnsToData', () => { | ||
it('converts column data to normalized data', () => { | ||
const data = $$.convertColumnsToData([ | ||
["cat1", "a", "b", "c", "d"], | ||
["data1", 30, 200, 100, 400], | ||
["cat2", "b", "a", "c", "d", "e", "f"], | ||
["data2", 400, 60, 200, 800, 10, 10] | ||
]); | ||
expect(data).toEqual({ | ||
keys: [ 'cat1', 'data1', 'cat2', 'data2' ], | ||
rows: [{ | ||
cat1: 'a', | ||
data1: 30, | ||
cat2: 'b', | ||
data2: 400 | ||
}, { | ||
cat1: 'b', | ||
data1: 200, | ||
cat2: 'a', | ||
data2: 60 | ||
}, { | ||
cat1: 'c', | ||
data1: 100, | ||
cat2: 'c', | ||
data2: 200 | ||
}, { | ||
cat1: 'd', | ||
data1: 400, | ||
cat2: 'd', | ||
data2: 800 | ||
}, { | ||
cat2: 'e', | ||
data2: 10 | ||
}, { | ||
cat2: 'f', | ||
data2: 10 | ||
}] | ||
}); | ||
}); | ||
it('throws when the column data contains undefined', () => { | ||
expect(() => $$.convertColumnsToData([ | ||
["cat1", "a", "b", "c", "d"], | ||
["data1", undefined] | ||
])).toThrowError(Error, /Source data is missing a component/); | ||
}); | ||
}); | ||
it('throws when the column data contains undefined', () => { | ||
expect(() => $$.convertColumnsToData([ | ||
["cat1", "a", "b", "c", "d"], | ||
["data1", undefined] | ||
])).toThrowError(Error, /Source data is missing a component/); | ||
describe('$$.convertRowsToData', () => { | ||
it('converts the row data to normalized data', () => { | ||
const data = $$.convertRowsToData([ | ||
['data1', 'data2', 'data3'], | ||
[90, 120, 300], | ||
[40, 160, 240], | ||
[50, 200, 290], | ||
[120, 160, 230], | ||
[80, 130, 300], | ||
[90, 220, 320] | ||
]); | ||
expect(data).toEqual({ | ||
keys: ['data1', 'data2', 'data3'], | ||
rows: [{ | ||
data1: 90, | ||
data2: 120, | ||
data3: 300 | ||
}, { | ||
data1: 40, | ||
data2: 160, | ||
data3: 240 | ||
}, { | ||
data1: 50, | ||
data2: 200, | ||
data3: 290 | ||
}, { | ||
data1: 120, | ||
data2: 160, | ||
data3: 230 | ||
}, { | ||
data1: 80, | ||
data2: 130, | ||
data3: 300 | ||
}, { | ||
data1: 90, | ||
data2: 220, | ||
data3: 320 | ||
}] | ||
}); | ||
}); | ||
it('throws when the row data contains undefined', () => { | ||
expect(() => $$.convertRowsToData([ | ||
['data1', 'data2', 'data3'], | ||
[40, 160, 240], | ||
[90, 120, undefined] | ||
])).toThrowError(Error, /Source data is missing a component/); | ||
}); | ||
}); | ||
}); | ||
describe('$$.convertRowsToData', () => { | ||
it('converts the row data to normalized data', () => { | ||
const data = $$.convertRowsToData([ | ||
['data1', 'data2', 'data3'], | ||
[90, 120, 300], | ||
[40, 160, 240], | ||
[50, 200, 290], | ||
[120, 160, 230], | ||
[80, 130, 300], | ||
[90, 220, 320] | ||
]); | ||
describe('$$.convertCsvToData', () => { | ||
it('converts the csv data to normalized data', () => { | ||
const data = $$.convertCsvToData(`data1,data2,data3 | ||
90,120,300 | ||
40,160,240 | ||
50,200,290 | ||
120,160,230 | ||
80,130,300 | ||
90,220,320`); | ||
expect(data).toEqual([{ | ||
data1: 90, | ||
data2: 120, | ||
data3: 300 | ||
}, { | ||
data1: 40, | ||
data2: 160, | ||
data3: 240 | ||
}, { | ||
data1: 50, | ||
data2: 200, | ||
data3: 290 | ||
}, { | ||
data1: 120, | ||
data2: 160, | ||
data3: 230 | ||
}, { | ||
data1: 80, | ||
data2: 130, | ||
data3: 300 | ||
}, { | ||
data1: 90, | ||
data2: 220, | ||
data3: 320 | ||
}]); | ||
expect(data).toEqual({ | ||
keys: ['data1', 'data2', 'data3'], | ||
rows: [{ | ||
data1: '90', | ||
data2: '120', | ||
data3: '300' | ||
}, { | ||
data1: '40', | ||
data2: '160', | ||
data3: '240' | ||
}, { | ||
data1: '50', | ||
data2: '200', | ||
data3: '290' | ||
}, { | ||
data1: '120', | ||
data2: '160', | ||
data3: '230' | ||
}, { | ||
data1: '80', | ||
data2: '130', | ||
data3: '300' | ||
}, { | ||
data1: '90', | ||
data2: '220', | ||
data3: '320' | ||
}] | ||
}); | ||
}); | ||
it('converts one lined CSV data', () => { | ||
const data = $$.convertCsvToData(`data1,data2,data3`); | ||
expect(data).toEqual({ | ||
keys: ['data1', 'data2', 'data3'], | ||
rows: [{ | ||
data1: null, | ||
data2: null, | ||
data3: null | ||
}] | ||
}); | ||
}); | ||
}); | ||
it('throws when the row data contains undefined', () => { | ||
expect(() => $$.convertRowsToData([ | ||
['data1', 'data2', 'data3'], | ||
[40, 160, 240], | ||
[90, 120, undefined] | ||
])).toThrowError(Error, /Source data is missing a component/); | ||
describe('$$.convertTsvToData', () => { | ||
it('converts the tsv data to normalized data', () => { | ||
const data = $$.convertTsvToData(`data1\tdata2\tdata3 | ||
90\t120\t300 | ||
40\t160\t240 | ||
50\t200\t290 | ||
120\t160\t230 | ||
80\t130\t300 | ||
90\t220\t320`); | ||
expect(data).toEqual({ | ||
keys: ['data1', 'data2', 'data3'], | ||
rows: [{ | ||
data1: '90', | ||
data2: '120', | ||
data3: '300' | ||
}, { | ||
data1: '40', | ||
data2: '160', | ||
data3: '240' | ||
}, { | ||
data1: '50', | ||
data2: '200', | ||
data3: '290' | ||
}, { | ||
data1: '120', | ||
data2: '160', | ||
data3: '230' | ||
}, { | ||
data1: '80', | ||
data2: '130', | ||
data3: '300' | ||
}, { | ||
data1: '90', | ||
data2: '220', | ||
data3: '320' | ||
}] | ||
}); | ||
}); | ||
it('converts one lined TSV data', () => { | ||
const data = $$.convertTsvToData(`data1\tdata2\tdata3`); | ||
expect(data).toEqual({ | ||
keys: ['data1', 'data2', 'data3'], | ||
rows: [{ | ||
data1: null, | ||
data2: null, | ||
data3: null | ||
}] | ||
}); | ||
}); | ||
}); | ||
describe('$$.convertDataToTargets', () => { | ||
beforeEach(() => { | ||
$$.cache = {}; | ||
$$.data = { | ||
xs: [] | ||
}; | ||
$$.config = { | ||
data_idConverter: (v) => v | ||
}; | ||
}); | ||
it('converts the legacy data format into targets', () => { | ||
const targets = $$.convertDataToTargets([ { | ||
data1: 90, | ||
data2: 120, | ||
data3: 300 | ||
}, { | ||
data1: 40, | ||
data2: 160, | ||
data3: 240 | ||
} ]); | ||
expect(targets).toEqual([{ | ||
id: 'data1', | ||
id_org: 'data1', | ||
values: [ { x: 0, value: 90, id: 'data1', index: 0 }, { x: 1, value: 40, id: 'data1', index: 1 } ] | ||
}, { | ||
id: 'data2', | ||
id_org: 'data2', | ||
values: [ { x: 0, value: 120, id: 'data2', index: 0 }, { x: 1, value: 160, id: 'data2', index: 1 } ] | ||
}, { | ||
id: 'data3', | ||
id_org: 'data3', | ||
values: [ { x: 0, value: 300, id: 'data3', index: 0 }, { x: 1, value: 240, id: 'data3', index: 1 } ] | ||
}]); | ||
}); | ||
it('converts the data into targets', () => { | ||
const targets = $$.convertDataToTargets({ | ||
keys: [ 'data1', 'data2', 'data3' ], | ||
rows: [ { | ||
data1: 90, | ||
data2: 120, | ||
data3: 300 | ||
}, { | ||
data1: 40, | ||
data2: 160, | ||
data3: 240 | ||
} ] | ||
}); | ||
expect(targets).toEqual([{ | ||
id: 'data1', | ||
id_org: 'data1', | ||
values: [ { x: 0, value: 90, id: 'data1', index: 0 }, { x: 1, value: 40, id: 'data1', index: 1 } ] | ||
}, { | ||
id: 'data2', | ||
id_org: 'data2', | ||
values: [ { x: 0, value: 120, id: 'data2', index: 0 }, { x: 1, value: 160, id: 'data2', index: 1 } ] | ||
}, { | ||
id: 'data3', | ||
id_org: 'data3', | ||
values: [ { x: 0, value: 300, id: 'data3', index: 0 }, { x: 1, value: 240, id: 'data3', index: 1 } ] | ||
}]); | ||
}); | ||
}); | ||
describe('$$.convertJsonToData', () => { | ||
it('converts JSON as object (no keys provided)', () => { | ||
const data = $$.convertJsonToData({ | ||
data1: [ 90, 40, 50, 120, 80, 90 ], | ||
data2: [ 120, 160, 200, 160, 130, 220 ], | ||
data3: [ 300, 240, 290, 230, 300, 320 ] | ||
}); | ||
expect(data).toEqual({ | ||
keys: ['data1', 'data2', 'data3'], | ||
rows: [{ | ||
data1: 90, | ||
data2: 120, | ||
data3: 300 | ||
}, { | ||
data1: 40, | ||
data2: 160, | ||
data3: 240 | ||
}, { | ||
data1: 50, | ||
data2: 200, | ||
data3: 290 | ||
}, { | ||
data1: 120, | ||
data2: 160, | ||
data3: 230 | ||
}, { | ||
data1: 80, | ||
data2: 130, | ||
data3: 300 | ||
}, { | ||
data1: 90, | ||
data2: 220, | ||
data3: 320 | ||
}] | ||
}); | ||
}); | ||
it('converts JSON as rows (keys provided)', () => { | ||
const data = $$.convertJsonToData([{ | ||
data1: 90, | ||
data2: 120, | ||
data3: 300, | ||
unused: 42 | ||
}, { | ||
data1: 40, | ||
data2: 160, | ||
data3: 240, | ||
unused: 42 | ||
}, { | ||
data1: 50, | ||
data2: 200, | ||
data3: 290, | ||
unused: 42 | ||
}, { | ||
data1: 120, | ||
data2: 160, | ||
data3: 230, | ||
unused: 42 | ||
}, { | ||
data1: 80, | ||
data2: 130, | ||
data3: 300, | ||
unused: 42 | ||
}, { | ||
data1: 90, | ||
data2: 220, | ||
data3: 320, | ||
unused: 42 | ||
}], { | ||
value: [ 'data1', 'data2', 'data3' ] | ||
}); | ||
expect(data).toEqual({ | ||
keys: ['data1', 'data2', 'data3'], | ||
rows: [{ | ||
data1: 90, | ||
data2: 120, | ||
data3: 300 | ||
}, { | ||
data1: 40, | ||
data2: 160, | ||
data3: 240 | ||
}, { | ||
data1: 50, | ||
data2: 200, | ||
data3: 290 | ||
}, { | ||
data1: 120, | ||
data2: 160, | ||
data3: 230 | ||
}, { | ||
data1: 80, | ||
data2: 130, | ||
data3: 300 | ||
}, { | ||
data1: 90, | ||
data2: 220, | ||
data3: 320 | ||
}] | ||
}); | ||
}); | ||
}); | ||
}); |
@@ -5,3 +5,3 @@ import Axis from './axis'; | ||
export var c3 = { version: "0.5.2" }; | ||
export var c3 = { version: "0.5.3" }; | ||
@@ -8,0 +8,0 @@ export var c3_chart_fn; |
import { c3_chart_internal_fn } from './core'; | ||
import { isValue, isUndefined, isDefined, notEmpty } from './util'; | ||
import { isValue, isUndefined, isDefined, notEmpty, isArray } from './util'; | ||
@@ -29,18 +29,16 @@ c3_chart_internal_fn.convertUrlToData = function (url, mimeType, headers, keys, done) { | ||
c3_chart_internal_fn.convertXsvToData = function (xsv, parser) { | ||
var rows = parser(xsv), d; | ||
if (rows.length === 1) { | ||
d = [{}]; | ||
rows[0].forEach(function (id) { | ||
d[0][id] = null; | ||
}); | ||
var [ keys, ...rows ] = parser.parseRows(xsv); | ||
if (rows.length === 0) { | ||
return { keys, rows: [ keys.reduce((row, key) => Object.assign(row, { [key]: null }), {}) ] }; | ||
} else { | ||
d = parser(xsv); | ||
// [].concat() is to convert result into a plain array otherwise | ||
// test is not happy because rows have properties. | ||
return { keys, rows: [].concat(parser.parse(xsv)) }; | ||
} | ||
return d; | ||
}; | ||
c3_chart_internal_fn.convertCsvToData = function (csv) { | ||
return this.convertXsvToData(csv, this.d3.csvParse); | ||
return this.convertXsvToData(csv, { parse: this.d3.csvParse, parseRows: this.d3.csvParseRows }); | ||
}; | ||
c3_chart_internal_fn.convertTsvToData = function (tsv) { | ||
return this.convertXsvToData(tsv, this.d3.tsvParse); | ||
return this.convertXsvToData(tsv, { parse: this.d3.tsvParse, parseRows: this.d3.tsvParseRows }); | ||
}; | ||
@@ -97,3 +95,3 @@ c3_chart_internal_fn.convertJsonToData = function (json, keys) { | ||
* @param {any[][]} rows The row data | ||
* @return {Object[]} | ||
* @return {Object} | ||
*/ | ||
@@ -114,3 +112,3 @@ c3_chart_internal_fn.convertRowsToData = (rows) => { | ||
} | ||
return newRows; | ||
return { keys, rows: newRows }; | ||
}; | ||
@@ -121,6 +119,7 @@ | ||
* @param {any[][]} columns The column data | ||
* @return {Object[]} | ||
* @return {Object} | ||
*/ | ||
c3_chart_internal_fn.convertColumnsToData = (columns) => { | ||
const newRows = []; | ||
const keys = []; | ||
@@ -138,13 +137,30 @@ for (let i = 0; i < columns.length; i++) { | ||
} | ||
keys.push(key); | ||
} | ||
return newRows; | ||
return { keys, rows: newRows }; | ||
}; | ||
/** | ||
* Converts the data format into the target format. | ||
* @param {!Object} data | ||
* @param {!Array} data.keys Ordered list of target IDs. | ||
* @param {!Array} data.rows Rows of data to convert. | ||
* @param {boolean} appendXs True to append to $$.data.xs, False to replace. | ||
* @return {!Array} | ||
*/ | ||
c3_chart_internal_fn.convertDataToTargets = function (data, appendXs) { | ||
var $$ = this, config = $$.config, | ||
ids = $$.d3.keys(data[0]).filter($$.isNotX, $$), | ||
xs = $$.d3.keys(data[0]).filter($$.isX, $$), | ||
targets; | ||
var $$ = this, config = $$.config, targets, ids, xs, keys; | ||
// handles format where keys are not orderly provided | ||
if (isArray(data)) { | ||
keys = Object.keys(data[ 0 ]); | ||
} else { | ||
keys = data.keys; | ||
data = data.rows; | ||
} | ||
ids = keys.filter($$.isNotX, $$); | ||
xs = keys.filter($$.isX, $$); | ||
// save x for update data by load when custom x and c3.x API | ||
@@ -151,0 +167,0 @@ ids.forEach(function (id) { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
3920359
538
35820
61
25
6
6
3