@ayd-ab/react-pivottable 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,413 @@
1
+ 'use strict';
2
+
3
+ var _Utilities = require('../Utilities');
4
+
5
+ var utils = _interopRequireWildcard(_Utilities);
6
+
7
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
8
+
9
+ /* eslint-disable no-magic-numbers */
10
+
11
+ /*
12
+ * decaffeinate suggestions:
13
+ * DS101: Remove unnecessary use of Array.from
14
+ * DS102: Remove unnecessary code created because of implicit returns
15
+ * DS207: Consider shorter variations of null checks
16
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
17
+ */
18
+ var fixtureData = [['name', 'gender', 'colour', 'birthday', 'trials', 'successes'], ['Nick', 'male', 'blue', '1982-11-07', 103, 12], ['Jane', 'female', 'red', '1982-11-08', 95, 25], ['John', 'male', 'blue', '1982-12-08', 112, 30], ['Carol', 'female', 'yellow', '1983-12-08', 102, 14]];
19
+
20
+ describe(' utils', function () {
21
+ describe('.PivotData()', function () {
22
+ describe('with no options', function () {
23
+ var aoaInput = [['a', 'b'], [1, 2], [3, 4]];
24
+ var pd = new utils.PivotData({ data: aoaInput });
25
+
26
+ it('has the correct grand total value', function () {
27
+ return expect(pd.getAggregator([], []).value()).toBe(2);
28
+ });
29
+ });
30
+
31
+ describe('with array-of-array input', function () {
32
+ var aoaInput = [['a', 'b'], [1, 2], [3, 4]];
33
+ var pd = new utils.PivotData({
34
+ data: aoaInput,
35
+ aggregatorName: 'Sum over Sum',
36
+ vals: ['a', 'b']
37
+ });
38
+
39
+ it('has the correct grand total value', function () {
40
+ return expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4));
41
+ });
42
+ });
43
+
44
+ describe('with array-of-object input', function () {
45
+ var aosInput = [{ a: 1, b: 2 }, { a: 3, b: 4 }];
46
+ var pd = new utils.PivotData({
47
+ data: aosInput,
48
+ aggregatorName: 'Sum over Sum',
49
+ vals: ['a', 'b']
50
+ });
51
+
52
+ it('has the correct grand total value', function () {
53
+ return expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4));
54
+ });
55
+ });
56
+
57
+ describe('with ragged array-of-object input', function () {
58
+ var raggedAosInput = [{ a: 1 }, { b: 4 }, { a: 3, b: 2 }];
59
+ var pd = new utils.PivotData({
60
+ data: raggedAosInput,
61
+ aggregatorName: 'Sum over Sum',
62
+ vals: ['a', 'b']
63
+ });
64
+
65
+ it('has the correct grand total value', function () {
66
+ return expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4));
67
+ });
68
+ });
69
+
70
+ describe('with function input', function () {
71
+ var functionInput = function functionInput(record) {
72
+ record({ a: 1, b: 2 });
73
+ record({ a: 3, b: 4 });
74
+ };
75
+ var pd = new utils.PivotData({
76
+ data: functionInput,
77
+ aggregatorName: 'Sum over Sum',
78
+ vals: ['a', 'b']
79
+ });
80
+
81
+ it('has the correct grand total value', function () {
82
+ return expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4));
83
+ });
84
+ });
85
+
86
+ describe('with rows/cols', function () {
87
+ var pd = new utils.PivotData({
88
+ data: fixtureData,
89
+ rows: ['name', 'colour'],
90
+ cols: ['trials', 'successes']
91
+ });
92
+
93
+ it('has correctly-ordered row keys', function () {
94
+ return expect(pd.getRowKeys()).toEqual([['Carol', 'yellow'], ['Jane', 'red'], ['John', 'blue'], ['Nick', 'blue']]);
95
+ });
96
+
97
+ it('has correctly-ordered col keys', function () {
98
+ return expect(pd.getColKeys()).toEqual([[95, 25], [102, 14], [103, 12], [112, 30]]);
99
+ });
100
+
101
+ it('can be iterated over', function () {
102
+ var numNotNull = 0;
103
+ var numNull = 0;
104
+ var _iteratorNormalCompletion = true;
105
+ var _didIteratorError = false;
106
+ var _iteratorError = undefined;
107
+
108
+ try {
109
+ for (var _iterator = Array.from(pd.getRowKeys())[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
110
+ var r = _step.value;
111
+ var _iteratorNormalCompletion2 = true;
112
+ var _didIteratorError2 = false;
113
+ var _iteratorError2 = undefined;
114
+
115
+ try {
116
+ for (var _iterator2 = Array.from(pd.getColKeys())[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
117
+ var c = _step2.value;
118
+
119
+ if (pd.getAggregator(r, c).value() !== null) {
120
+ numNotNull++;
121
+ } else {
122
+ numNull++;
123
+ }
124
+ }
125
+ } catch (err) {
126
+ _didIteratorError2 = true;
127
+ _iteratorError2 = err;
128
+ } finally {
129
+ try {
130
+ if (!_iteratorNormalCompletion2 && _iterator2.return) {
131
+ _iterator2.return();
132
+ }
133
+ } finally {
134
+ if (_didIteratorError2) {
135
+ throw _iteratorError2;
136
+ }
137
+ }
138
+ }
139
+ }
140
+ } catch (err) {
141
+ _didIteratorError = true;
142
+ _iteratorError = err;
143
+ } finally {
144
+ try {
145
+ if (!_iteratorNormalCompletion && _iterator.return) {
146
+ _iterator.return();
147
+ }
148
+ } finally {
149
+ if (_didIteratorError) {
150
+ throw _iteratorError;
151
+ }
152
+ }
153
+ }
154
+
155
+ expect(numNotNull).toBe(4);
156
+ expect(numNull).toBe(12);
157
+ });
158
+
159
+ it('returns matching records', function () {
160
+ var records = [];
161
+ pd.forEachMatchingRecord({ gender: 'male' }, function (x) {
162
+ return records.push(x.name);
163
+ });
164
+ expect(records).toEqual(['Nick', 'John']);
165
+ });
166
+
167
+ it('has a correct spot-checked aggregator', function () {
168
+ var agg = pd.getAggregator(['Carol', 'yellow'], [102, 14]);
169
+ var val = agg.value();
170
+ expect(val).toBe(1);
171
+ expect(agg.format(val)).toBe('1');
172
+ });
173
+
174
+ it('has a correct grand total aggregator', function () {
175
+ var agg = pd.getAggregator([], []);
176
+ var val = agg.value();
177
+ expect(val).toBe(4);
178
+ expect(agg.format(val)).toBe('4');
179
+ });
180
+ });
181
+ });
182
+
183
+ describe('.aggregatorTemplates', function () {
184
+ var getVal = function getVal(agg, vals) {
185
+ return new utils.PivotData({
186
+ data: fixtureData,
187
+ aggregators: { agg: agg },
188
+ aggregatorName: 'agg',
189
+ vals: vals
190
+ }).getAggregator([], []).value();
191
+ };
192
+ var tpl = utils.aggregatorTemplates;
193
+
194
+ describe('.count', function () {
195
+ return it('works', function () {
196
+ return expect(getVal(tpl.count(), [])).toBe(4);
197
+ });
198
+ });
199
+
200
+ describe('.countUnique', function () {
201
+ return it('works', function () {
202
+ return expect(getVal(tpl.countUnique(), ['gender'])).toBe(2);
203
+ });
204
+ });
205
+
206
+ describe('.listUnique', function () {
207
+ return it('works', function () {
208
+ return expect(getVal(tpl.listUnique(), ['gender'])).toBe('male,female');
209
+ });
210
+ });
211
+
212
+ describe('.average', function () {
213
+ return it('works', function () {
214
+ return expect(getVal(tpl.average(), ['trials'])).toBe(103);
215
+ });
216
+ });
217
+
218
+ describe('.sum', function () {
219
+ return it('works', function () {
220
+ return expect(getVal(tpl.sum(), ['trials'])).toBe(412);
221
+ });
222
+ });
223
+
224
+ describe('.min', function () {
225
+ return it('works', function () {
226
+ return expect(getVal(tpl.min(), ['trials'])).toBe(95);
227
+ });
228
+ });
229
+
230
+ describe('.max', function () {
231
+ return it('works', function () {
232
+ return expect(getVal(tpl.max(), ['trials'])).toBe(112);
233
+ });
234
+ });
235
+
236
+ describe('.first', function () {
237
+ return it('works', function () {
238
+ return expect(getVal(tpl.first(), ['name'])).toBe('Carol');
239
+ });
240
+ });
241
+
242
+ describe('.last', function () {
243
+ return it('works', function () {
244
+ return expect(getVal(tpl.last(), ['name'])).toBe('Nick');
245
+ });
246
+ });
247
+
248
+ describe('.average', function () {
249
+ return it('works', function () {
250
+ return expect(getVal(tpl.average(), ['trials'])).toBe(103);
251
+ });
252
+ });
253
+
254
+ describe('.median', function () {
255
+ return it('works', function () {
256
+ return expect(getVal(tpl.median(), ['trials'])).toBe(102.5);
257
+ });
258
+ });
259
+
260
+ describe('.quantile', function () {
261
+ return it('works', function () {
262
+ expect(getVal(tpl.quantile(0), ['trials'])).toBe(95);
263
+ expect(getVal(tpl.quantile(0.1), ['trials'])).toBe(98.5);
264
+ expect(getVal(tpl.quantile(0.25), ['trials'])).toBe(98.5);
265
+ expect(getVal(tpl.quantile(1 / 3), ['trials'])).toBe(102);
266
+ expect(getVal(tpl.quantile(1), ['trials'])).toBe(112);
267
+ });
268
+ });
269
+
270
+ describe('.var', function () {
271
+ return it('works', function () {
272
+ return expect(getVal(tpl.var(), ['trials'])).toBe(48.666666666666686);
273
+ });
274
+ });
275
+
276
+ describe('.stdev', function () {
277
+ return it('works', function () {
278
+ return expect(getVal(tpl.stdev(), ['trials'])).toBe(6.976149845485451);
279
+ });
280
+ });
281
+
282
+ describe('.sumOverSum', function () {
283
+ return it('works', function () {
284
+ return expect(getVal(tpl.sumOverSum(), ['successes', 'trials'])).toBe((12 + 25 + 30 + 14) / (95 + 102 + 103 + 112));
285
+ });
286
+ });
287
+
288
+ describe('.fractionOf', function () {
289
+ return it('works', function () {
290
+ return expect(getVal(tpl.fractionOf(tpl.sum()), ['trials'])).toBe(1);
291
+ });
292
+ });
293
+ });
294
+
295
+ describe('.naturalSort()', function () {
296
+ var naturalSort = utils.naturalSort;
297
+
298
+
299
+ var sortedArr = [null, NaN, -Infinity, '-Infinity', -3, '-3', -2, '-2', -1, '-1', 0, '2e-1', 1, '01', '1', 2, '002', '002e0', '02', '2', '2e-0', 3, 10, '10', '11', '12', '1e2', '112', Infinity, 'Infinity', '1a', '2a', '12a', '20a', 'A', 'A', 'NaN', 'a', 'a', 'a01', 'a012', 'a02', 'a1', 'a2', 'a12', 'a12', 'a21', 'a21', 'b', 'c', 'd', 'null'];
300
+
301
+ it('sorts naturally (null, NaN, numbers & numbery strings, Alphanum for text strings)', function () {
302
+ return expect(sortedArr.slice().sort(naturalSort)).toEqual(sortedArr);
303
+ });
304
+ });
305
+
306
+ describe('.sortAs()', function () {
307
+ var sortAs = utils.sortAs;
308
+
309
+
310
+ it('sorts with unknown values sorted at the end', function () {
311
+ return expect([5, 2, 3, 4, 1].sort(sortAs([4, 3, 2]))).toEqual([4, 3, 2, 1, 5]);
312
+ });
313
+
314
+ it('sorts lowercase after uppercase', function () {
315
+ return expect(['Ab', 'aA', 'aa', 'ab'].sort(sortAs(['Ab', 'Aa']))).toEqual(['Ab', 'ab', 'aa', 'aA']);
316
+ });
317
+ });
318
+
319
+ describe('.numberFormat()', function () {
320
+ var numberFormat = utils.numberFormat;
321
+
322
+
323
+ it('formats numbers', function () {
324
+ var nf = numberFormat();
325
+ expect(nf(1234567.89123456)).toEqual('1,234,567.89');
326
+ });
327
+
328
+ it('formats booleans', function () {
329
+ var nf = numberFormat();
330
+ expect(nf(true)).toEqual('1.00');
331
+ });
332
+
333
+ it('formats numbers in strings', function () {
334
+ var nf = numberFormat();
335
+ expect(nf('1234567.89123456')).toEqual('1,234,567.89');
336
+ });
337
+
338
+ it("doesn't formats strings", function () {
339
+ var nf = numberFormat();
340
+ expect(nf('hi there')).toEqual('');
341
+ });
342
+
343
+ it("doesn't formats objects", function () {
344
+ var nf = numberFormat();
345
+ expect(nf({ a: 1 })).toEqual('');
346
+ });
347
+
348
+ it('formats percentages', function () {
349
+ var nf = numberFormat({ scaler: 100, suffix: '%' });
350
+ expect(nf(0.12345)).toEqual('12.35%');
351
+ });
352
+
353
+ it('adds separators', function () {
354
+ var nf = numberFormat({ thousandsSep: 'a', decimalSep: 'b' });
355
+ expect(nf(1234567.89123456)).toEqual('1a234a567b89');
356
+ });
357
+
358
+ it('adds prefixes and suffixes', function () {
359
+ var nf = numberFormat({ prefix: 'a', suffix: 'b' });
360
+ expect(nf(1234567.89123456)).toEqual('a1,234,567.89b');
361
+ });
362
+
363
+ it('scales and rounds', function () {
364
+ var nf = numberFormat({ digitsAfterDecimal: 3, scaler: 1000 });
365
+ expect(nf(1234567.89123456)).toEqual('1,234,567,891.235');
366
+ });
367
+ });
368
+
369
+ describe('.derivers', function () {
370
+ describe('.dateFormat()', function () {
371
+ var df = utils.derivers.dateFormat('x', 'abc % %% %%% %a %y %m %n %d %w %x %H %M %S', true);
372
+
373
+ it('formats date objects', function () {
374
+ return expect(df({ x: new Date('2015-01-02T23:43:11Z') })).toBe('abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11');
375
+ });
376
+
377
+ it('formats input parsed by Date.parse()', function () {
378
+ expect(df({ x: '2015-01-02T23:43:11Z' })).toBe('abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11');
379
+
380
+ expect(df({ x: 'bla' })).toBe('');
381
+ });
382
+ });
383
+
384
+ describe('.bin()', function () {
385
+ var binner = utils.derivers.bin('x', 10);
386
+
387
+ it('bins numbers', function () {
388
+ expect(binner({ x: 11 })).toBe(10);
389
+
390
+ expect(binner({ x: 9 })).toBe(0);
391
+
392
+ expect(binner({ x: 111 })).toBe(110);
393
+ });
394
+
395
+ it('bins booleans', function () {
396
+ return expect(binner({ x: true })).toBe(0);
397
+ });
398
+
399
+ it('bins negative numbers', function () {
400
+ return expect(binner({ x: -12 })).toBe(-10);
401
+ });
402
+
403
+ it("doesn't bin strings", function () {
404
+ return expect(binner({ x: 'a' })).toBeNaN();
405
+ });
406
+
407
+ it("doesn't bin objects", function () {
408
+ return expect(binner({ x: { a: 1 } })).toBeNaN();
409
+ });
410
+ });
411
+ });
412
+ });
413
+ //# sourceMappingURL=Utilities-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/__tests__/Utilities-test.js"],"names":["utils","fixtureData","describe","aoaInput","pd","PivotData","data","it","expect","getAggregator","value","toBe","aggregatorName","vals","aosInput","a","b","raggedAosInput","functionInput","record","rows","cols","getRowKeys","toEqual","getColKeys","numNotNull","numNull","Array","from","r","c","records","forEachMatchingRecord","gender","push","x","name","agg","val","format","getVal","aggregators","tpl","aggregatorTemplates","count","countUnique","listUnique","average","sum","min","max","first","last","median","quantile","var","stdev","sumOverSum","fractionOf","naturalSort","sortedArr","NaN","Infinity","slice","sort","sortAs","numberFormat","nf","scaler","suffix","thousandsSep","decimalSep","prefix","digitsAfterDecimal","df","derivers","dateFormat","Date","binner","bin","toBeNaN"],"mappings":"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","file":"Utilities-test.js","sourcesContent":["import * as utils from '../Utilities';\n/* eslint-disable no-magic-numbers */\n\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nconst fixtureData = [\n ['name', 'gender', 'colour', 'birthday', 'trials', 'successes'],\n ['Nick', 'male', 'blue', '1982-11-07', 103, 12],\n ['Jane', 'female', 'red', '1982-11-08', 95, 25],\n ['John', 'male', 'blue', '1982-12-08', 112, 30],\n ['Carol', 'female', 'yellow', '1983-12-08', 102, 14],\n];\n\ndescribe(' utils', function() {\n describe('.PivotData()', function() {\n describe('with no options', function() {\n const aoaInput = [['a', 'b'], [1, 2], [3, 4]];\n const pd = new utils.PivotData({data: aoaInput});\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe(2));\n });\n\n describe('with array-of-array input', function() {\n const aoaInput = [['a', 'b'], [1, 2], [3, 4]];\n const pd = new utils.PivotData({\n data: aoaInput,\n aggregatorName: 'Sum over Sum',\n vals: ['a', 'b'],\n });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4)));\n });\n\n describe('with array-of-object input', function() {\n const aosInput = [{a: 1, b: 2}, {a: 3, b: 4}];\n const pd = new utils.PivotData({\n data: aosInput,\n aggregatorName: 'Sum over Sum',\n vals: ['a', 'b'],\n });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4)));\n });\n\n describe('with ragged array-of-object input', function() {\n const raggedAosInput = [{a: 1}, {b: 4}, {a: 3, b: 2}];\n const pd = new utils.PivotData({\n data: raggedAosInput,\n aggregatorName: 'Sum over Sum',\n vals: ['a', 'b'],\n });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4)));\n });\n\n describe('with function input', function() {\n const functionInput = function(record) {\n record({a: 1, b: 2});\n record({a: 3, b: 4});\n };\n const pd = new utils.PivotData({\n data: functionInput,\n aggregatorName: 'Sum over Sum',\n vals: ['a', 'b'],\n });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4)));\n });\n\n describe('with rows/cols', function() {\n const pd = new utils.PivotData({\n data: fixtureData,\n rows: ['name', 'colour'],\n cols: ['trials', 'successes'],\n });\n\n it('has correctly-ordered row keys', () =>\n expect(pd.getRowKeys()).toEqual([\n ['Carol', 'yellow'],\n ['Jane', 'red'],\n ['John', 'blue'],\n ['Nick', 'blue'],\n ]));\n\n it('has correctly-ordered col keys', () =>\n expect(pd.getColKeys()).toEqual([\n [95, 25],\n [102, 14],\n [103, 12],\n [112, 30],\n ]));\n\n it('can be iterated over', function() {\n let numNotNull = 0;\n let numNull = 0;\n for (const r of Array.from(pd.getRowKeys())) {\n for (const c of Array.from(pd.getColKeys())) {\n if (pd.getAggregator(r, c).value() !== null) {\n numNotNull++;\n } else {\n numNull++;\n }\n }\n }\n expect(numNotNull).toBe(4);\n expect(numNull).toBe(12);\n });\n\n it('returns matching records', function() {\n const records = [];\n pd.forEachMatchingRecord({gender: 'male'}, x => records.push(x.name));\n expect(records).toEqual(['Nick', 'John']);\n });\n\n it('has a correct spot-checked aggregator', function() {\n const agg = pd.getAggregator(['Carol', 'yellow'], [102, 14]);\n const val = agg.value();\n expect(val).toBe(1);\n expect(agg.format(val)).toBe('1');\n });\n\n it('has a correct grand total aggregator', function() {\n const agg = pd.getAggregator([], []);\n const val = agg.value();\n expect(val).toBe(4);\n expect(agg.format(val)).toBe('4');\n });\n });\n });\n\n describe('.aggregatorTemplates', function() {\n const getVal = (agg, vals) => {\n return new utils.PivotData({\n data: fixtureData,\n aggregators: {agg},\n aggregatorName: 'agg',\n vals,\n })\n .getAggregator([], [])\n .value();\n };\n const tpl = utils.aggregatorTemplates;\n\n describe('.count', () =>\n it('works', () => expect(getVal(tpl.count(), [])).toBe(4)));\n\n describe('.countUnique', () =>\n it('works', () => expect(getVal(tpl.countUnique(), ['gender'])).toBe(2)));\n\n describe('.listUnique', () =>\n it('works', () =>\n expect(getVal(tpl.listUnique(), ['gender'])).toBe('male,female')));\n\n describe('.average', () =>\n it('works', () => expect(getVal(tpl.average(), ['trials'])).toBe(103)));\n\n describe('.sum', () =>\n it('works', () => expect(getVal(tpl.sum(), ['trials'])).toBe(412)));\n\n describe('.min', () =>\n it('works', () => expect(getVal(tpl.min(), ['trials'])).toBe(95)));\n\n describe('.max', () =>\n it('works', () => expect(getVal(tpl.max(), ['trials'])).toBe(112)));\n\n describe('.first', () =>\n it('works', () => expect(getVal(tpl.first(), ['name'])).toBe('Carol')));\n\n describe('.last', () =>\n it('works', () => expect(getVal(tpl.last(), ['name'])).toBe('Nick')));\n\n describe('.average', () =>\n it('works', () => expect(getVal(tpl.average(), ['trials'])).toBe(103)));\n\n describe('.median', () =>\n it('works', () => expect(getVal(tpl.median(), ['trials'])).toBe(102.5)));\n\n describe('.quantile', () =>\n it('works', function() {\n expect(getVal(tpl.quantile(0), ['trials'])).toBe(95);\n expect(getVal(tpl.quantile(0.1), ['trials'])).toBe(98.5);\n expect(getVal(tpl.quantile(0.25), ['trials'])).toBe(98.5);\n expect(getVal(tpl.quantile(1 / 3), ['trials'])).toBe(102);\n expect(getVal(tpl.quantile(1), ['trials'])).toBe(112);\n }));\n\n describe('.var', () =>\n it('works', () =>\n expect(getVal(tpl.var(), ['trials'])).toBe(48.666666666666686)));\n\n describe('.stdev', () =>\n it('works', () =>\n expect(getVal(tpl.stdev(), ['trials'])).toBe(6.976149845485451)));\n\n describe('.sumOverSum', () =>\n it('works', () =>\n expect(getVal(tpl.sumOverSum(), ['successes', 'trials'])).toBe(\n (12 + 25 + 30 + 14) / (95 + 102 + 103 + 112)\n )));\n\n describe('.fractionOf', () =>\n it('works', () =>\n expect(getVal(tpl.fractionOf(tpl.sum()), ['trials'])).toBe(1)));\n });\n\n describe('.naturalSort()', function() {\n const {naturalSort} = utils;\n\n const sortedArr = [\n null,\n NaN,\n -Infinity,\n '-Infinity',\n -3,\n '-3',\n -2,\n '-2',\n -1,\n '-1',\n 0,\n '2e-1',\n 1,\n '01',\n '1',\n 2,\n '002',\n '002e0',\n '02',\n '2',\n '2e-0',\n 3,\n 10,\n '10',\n '11',\n '12',\n '1e2',\n '112',\n Infinity,\n 'Infinity',\n '1a',\n '2a',\n '12a',\n '20a',\n 'A',\n 'A',\n 'NaN',\n 'a',\n 'a',\n 'a01',\n 'a012',\n 'a02',\n 'a1',\n 'a2',\n 'a12',\n 'a12',\n 'a21',\n 'a21',\n 'b',\n 'c',\n 'd',\n 'null',\n ];\n\n it('sorts naturally (null, NaN, numbers & numbery strings, Alphanum for text strings)', () =>\n expect(sortedArr.slice().sort(naturalSort)).toEqual(sortedArr));\n });\n\n describe('.sortAs()', function() {\n const {sortAs} = utils;\n\n it('sorts with unknown values sorted at the end', () =>\n expect([5, 2, 3, 4, 1].sort(sortAs([4, 3, 2]))).toEqual([4, 3, 2, 1, 5]));\n\n it('sorts lowercase after uppercase', () =>\n expect(['Ab', 'aA', 'aa', 'ab'].sort(sortAs(['Ab', 'Aa']))).toEqual([\n 'Ab',\n 'ab',\n 'aa',\n 'aA',\n ]));\n });\n\n describe('.numberFormat()', function() {\n const {numberFormat} = utils;\n\n it('formats numbers', function() {\n const nf = numberFormat();\n expect(nf(1234567.89123456)).toEqual('1,234,567.89');\n });\n\n it('formats booleans', function() {\n const nf = numberFormat();\n expect(nf(true)).toEqual('1.00');\n });\n\n it('formats numbers in strings', function() {\n const nf = numberFormat();\n expect(nf('1234567.89123456')).toEqual('1,234,567.89');\n });\n\n it(\"doesn't formats strings\", function() {\n const nf = numberFormat();\n expect(nf('hi there')).toEqual('');\n });\n\n it(\"doesn't formats objects\", function() {\n const nf = numberFormat();\n expect(nf({a: 1})).toEqual('');\n });\n\n it('formats percentages', function() {\n const nf = numberFormat({scaler: 100, suffix: '%'});\n expect(nf(0.12345)).toEqual('12.35%');\n });\n\n it('adds separators', function() {\n const nf = numberFormat({thousandsSep: 'a', decimalSep: 'b'});\n expect(nf(1234567.89123456)).toEqual('1a234a567b89');\n });\n\n it('adds prefixes and suffixes', function() {\n const nf = numberFormat({prefix: 'a', suffix: 'b'});\n expect(nf(1234567.89123456)).toEqual('a1,234,567.89b');\n });\n\n it('scales and rounds', function() {\n const nf = numberFormat({digitsAfterDecimal: 3, scaler: 1000});\n expect(nf(1234567.89123456)).toEqual('1,234,567,891.235');\n });\n });\n\n describe('.derivers', function() {\n describe('.dateFormat()', function() {\n const df = utils.derivers.dateFormat(\n 'x',\n 'abc % %% %%% %a %y %m %n %d %w %x %H %M %S',\n true\n );\n\n it('formats date objects', () =>\n expect(df({x: new Date('2015-01-02T23:43:11Z')})).toBe(\n 'abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11'\n ));\n\n it('formats input parsed by Date.parse()', function() {\n expect(df({x: '2015-01-02T23:43:11Z'})).toBe(\n 'abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11'\n );\n\n expect(df({x: 'bla'})).toBe('');\n });\n });\n\n describe('.bin()', function() {\n const binner = utils.derivers.bin('x', 10);\n\n it('bins numbers', function() {\n expect(binner({x: 11})).toBe(10);\n\n expect(binner({x: 9})).toBe(0);\n\n expect(binner({x: 111})).toBe(110);\n });\n\n it('bins booleans', () => expect(binner({x: true})).toBe(0));\n\n it('bins negative numbers', () => expect(binner({x: -12})).toBe(-10));\n\n it(\"doesn't bin strings\", () => expect(binner({x: 'a'})).toBeNaN());\n\n it(\"doesn't bin objects\", () => expect(binner({x: {a: 1}})).toBeNaN());\n });\n });\n});\n"]}
@@ -0,0 +1,14 @@
1
+ import ReactPivottableUI from "./PivotTableUI";
2
+ export { TableInput } from "./input";
3
+ export { PivotTableProps } from "./PivotTable";
4
+ export {
5
+ DraggableAttribute,
6
+ DraggableAttributeProps,
7
+ Dropdown,
8
+ DropdownProps,
9
+ PivotTableUIProps,
10
+ } from "./PivotTableUI";
11
+ export { BuildInPlotlyRenderersNames } from "./PlotlyRenderers";
12
+ export { BuildInRenderersNames, TableRenderers } from "./TableRenderers";
13
+ export { Pivot, TQuerySort, TSorterFn } from "./Utilities";
14
+ export default ReactPivottableUI;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * ```javascript
3
+ * const data = [
4
+ * {
5
+ * attr1: 'value1_attr1',
6
+ * attr2: 'value1_attr2'
7
+ * attr2: 'value1_attr2'
8
+ * },
9
+ * {
10
+ * attr1: 'value2_attr1',
11
+ * attr2: 'value2_attr2',
12
+ * },
13
+ * ]
14
+ * const data = [
15
+ * ['attr1', 'attr2'],
16
+ * ['value1_attr1', 'value1_attr2'],
17
+ * ['value2_attr1', 'value2_attr2'],
18
+ * ];
19
+ * const data = function(callback) {
20
+ * callback({
21
+ * "attr1": "value1_attr1",
22
+ * "attr2": "value1_attr2",
23
+ * //...
24
+ * });
25
+ * callback({
26
+ * "attr1": "value2_attr1",
27
+ * "attr2": "value2_attr2",
28
+ * //...
29
+ * };
30
+ * //...
31
+ * };
32
+ * ```
33
+ * ];
34
+ */
35
+ export type TableInput =
36
+ | string[][]
37
+ | Array<{ [K: string]: string }>
38
+ | ((cb: (param: { [K: string]: string }) => void) => void);
package/package.json CHANGED
@@ -1,20 +1,12 @@
1
1
  {
2
2
  "name": "@ayd-ab/react-pivottable",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "description": "A React-based pivot table",
5
- "main": "PivotTableUI.js",
5
+ "main": "./dist/PivotTableUI.js",
6
6
  "files": [
7
- "PivotTable.js",
8
- "PivotTableUI.js",
9
- "PlotlyRenderers.js",
10
- "TableRenderers.js",
11
- "Utilities.js",
12
- "PivotTable.js.map",
13
- "PivotTableUI.js.map",
14
- "PlotlyRenderers.js.map",
15
- "TableRenderers.js.map",
16
- "Utilities.js.map",
17
- "pivottable.css"
7
+ "dist",
8
+ "README.md",
9
+ "LICENSE"
18
10
  ],
19
11
  "scripts": {
20
12
  "start": "webpack-dev-server",
@@ -24,8 +16,8 @@
24
16
  "test:prettier:fix": "prettier --write \"src/*.js*\"",
25
17
  "test:jest": "jest",
26
18
  "test": "npm run test:eslint && npm run test:prettier && npm run test:jest",
27
- "clean": "rm -rf __tests__ PivotTable.js* PivotTableUI.js* PlotlyRenderers.js* TableRenderers.js* Utilities.js* pivottable.css",
28
- "build": "npm run clean && cp src/pivottable.css . && babel src --out-dir=. --source-maps --presets=env,react --plugins babel-plugin-add-module-exports",
19
+ "clean": "rm -rf __tests__ dist",
20
+ "build": "npm run clean && mkdir dist && cp src/pivottable.css dist/ && cp types/* dist/ && babel src --out-dir=dist --source-maps --presets=env,react --plugins babel-plugin-add-module-exports",
29
21
  "doPublish": "npm run build && npm publish",
30
22
  "postpublish": "npm run clean"
31
23
  },
@@ -77,5 +69,6 @@
77
69
  "style-loader": "^0.19.0",
78
70
  "webpack": "^3.8.1",
79
71
  "webpack-dev-server": "^2.9.3"
80
- }
72
+ },
73
+ "types": "./dist/index.d.ts"
81
74
  }
package/PivotTable.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["src/PivotTable.jsx"],"names":["PivotTable","Renderer","props","renderers","rendererName","Object","keys","React","PureComponent","propTypes","assign","PivotData","PropTypes","string","objectOf","func","defaultProps","TableRenderers"],"mappings":";;;;;;;;AAAA;;;;AACA;;;;AACA;;AACA;;;;;;;;;;;;AAEA;AACA;;IAEMA,U;;;;;;;;;;;6BACK;AACP,UAAMC,WAAW,KAAKC,KAAL,CAAWC,SAAX,CACf,KAAKD,KAAL,CAAWE,YAAX,IAA2B,KAAKF,KAAL,CAAWC,SAAtC,GACI,KAAKD,KAAL,CAAWE,YADf,GAEIC,OAAOC,IAAP,CAAY,KAAKJ,KAAL,CAAWC,SAAvB,EAAkC,CAAlC,CAHW,CAAjB;AAKA,aAAO,8BAAC,QAAD,EAAc,KAAKD,KAAnB,CAAP;AACD;;;;EARsBK,gBAAMC,a;;AAW/BR,WAAWS,SAAX,GAAuBJ,OAAOK,MAAP,CAAc,EAAd,EAAkBC,qBAAUF,SAA5B,EAAuC;AAC5DL,gBAAcQ,oBAAUC,MADoC;AAE5DV,aAAWS,oBAAUE,QAAV,CAAmBF,oBAAUG,IAA7B;AAFiD,CAAvC,CAAvB;;AAKAf,WAAWgB,YAAX,GAA0BX,OAAOK,MAAP,CAAc,EAAd,EAAkBC,qBAAUK,YAA5B,EAA0C;AAClEZ,gBAAc,OADoD;AAElED,aAAWc;AAFuD,CAA1C,CAA1B;;kBAKejB,U","file":"PivotTable.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport {PivotData} from './Utilities';\nimport TableRenderers from './TableRenderers';\n\n/* eslint-disable react/prop-types */\n// eslint can't see inherited propTypes!\n\nclass PivotTable extends React.PureComponent {\n render() {\n const Renderer = this.props.renderers[\n this.props.rendererName in this.props.renderers\n ? this.props.rendererName\n : Object.keys(this.props.renderers)[0]\n ];\n return <Renderer {...this.props} />;\n }\n}\n\nPivotTable.propTypes = Object.assign({}, PivotData.propTypes, {\n rendererName: PropTypes.string,\n renderers: PropTypes.objectOf(PropTypes.func),\n});\n\nPivotTable.defaultProps = Object.assign({}, PivotData.defaultProps, {\n rendererName: 'Table',\n renderers: TableRenderers,\n});\n\nexport default PivotTable;\n"]}