chartjs-plugin-chart2music 0.6.0 → 0.7.0
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.
- package/README.md +96 -71
- package/dist/plugin.amd.js +180 -46
- package/dist/plugin.cjs +336 -231
- package/dist/plugin.d.ts +8 -1
- package/dist/plugin.js +180 -46
- package/dist/plugin.mjs +180 -46
- package/package.json +58 -23
package/dist/plugin.mjs
CHANGED
|
@@ -84,7 +84,8 @@ const chartjs_c2m_converter = {
|
|
|
84
84
|
boxplot: "box",
|
|
85
85
|
radar: "bar",
|
|
86
86
|
wordCloud: "bar",
|
|
87
|
-
scatter: "scatter"
|
|
87
|
+
scatter: "scatter",
|
|
88
|
+
matrix: "matrix"
|
|
88
89
|
};
|
|
89
90
|
const processChartType = (chart) => {
|
|
90
91
|
const topLevelType = chart.config.type;
|
|
@@ -109,7 +110,7 @@ const processChartType = (chart) => {
|
|
|
109
110
|
};
|
|
110
111
|
const generateAxisInfo = (chartAxisInfo, chart) => {
|
|
111
112
|
const axis = {};
|
|
112
|
-
if (chartAxisInfo?.min) {
|
|
113
|
+
if (chartAxisInfo?.min !== undefined) {
|
|
113
114
|
if (typeof chartAxisInfo.min === "string") {
|
|
114
115
|
axis.minimum = chart.data.labels.indexOf(chartAxisInfo.min);
|
|
115
116
|
}
|
|
@@ -117,7 +118,7 @@ const generateAxisInfo = (chartAxisInfo, chart) => {
|
|
|
117
118
|
axis.minimum = chartAxisInfo.min;
|
|
118
119
|
}
|
|
119
120
|
}
|
|
120
|
-
if (chartAxisInfo?.max) {
|
|
121
|
+
if (chartAxisInfo?.max !== undefined) {
|
|
121
122
|
if (typeof chartAxisInfo.max === "string") {
|
|
122
123
|
axis.maximum = chart.data.labels.indexOf(chartAxisInfo.max);
|
|
123
124
|
}
|
|
@@ -134,17 +135,20 @@ const generateAxisInfo = (chartAxisInfo, chart) => {
|
|
|
134
135
|
}
|
|
135
136
|
return axis;
|
|
136
137
|
};
|
|
137
|
-
const generateAxes = (chart) => {
|
|
138
|
+
const generateAxes = (chart, options) => {
|
|
138
139
|
const axes = {
|
|
139
140
|
x: {
|
|
140
141
|
...generateAxisInfo(chart.options?.scales?.x, chart),
|
|
141
|
-
valueLabels: chart.data.labels.slice(0)
|
|
142
142
|
},
|
|
143
143
|
y: {
|
|
144
|
+
format: options?.axes?.y?.format || ((value) => value.toLocaleString()),
|
|
144
145
|
...generateAxisInfo(chart.options?.scales?.y, chart),
|
|
145
|
-
format: (value) => value.toLocaleString()
|
|
146
146
|
}
|
|
147
147
|
};
|
|
148
|
+
const xAxisValueLabels = chart.data.labels.slice(0);
|
|
149
|
+
if (xAxisValueLabels.length > 0) {
|
|
150
|
+
axes.x.valueLabels = xAxisValueLabels;
|
|
151
|
+
}
|
|
148
152
|
return axes;
|
|
149
153
|
};
|
|
150
154
|
const whichDataStructure = (data) => {
|
|
@@ -156,6 +160,55 @@ const whichDataStructure = (data) => {
|
|
|
156
160
|
}
|
|
157
161
|
return data;
|
|
158
162
|
};
|
|
163
|
+
const labelIndex = (labels, value) => {
|
|
164
|
+
let index = labels.indexOf(value);
|
|
165
|
+
if (index === -1) {
|
|
166
|
+
labels.push(value);
|
|
167
|
+
index = labels.length - 1;
|
|
168
|
+
}
|
|
169
|
+
return index;
|
|
170
|
+
};
|
|
171
|
+
const processMatrixDataPoints = (data, datasetIndex, xLabels, yLabels) => {
|
|
172
|
+
return data.map((point, index) => {
|
|
173
|
+
const x = typeof point.x === "string" ? labelIndex(xLabels, point.x) : point.x;
|
|
174
|
+
const y = typeof point.y === "string" ? labelIndex(yLabels, point.y) : point.y;
|
|
175
|
+
return {
|
|
176
|
+
...point,
|
|
177
|
+
x,
|
|
178
|
+
y,
|
|
179
|
+
custom: {
|
|
180
|
+
...point.custom,
|
|
181
|
+
group: datasetIndex,
|
|
182
|
+
datasetIndex,
|
|
183
|
+
index
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
const processMatrixData = (data) => {
|
|
189
|
+
const xLabels = [];
|
|
190
|
+
const yLabels = [];
|
|
191
|
+
// Chart2Music represents matrix rows as groups and columns as points within
|
|
192
|
+
// each group. This preserves two-dimensional keyboard navigation.
|
|
193
|
+
const result = {};
|
|
194
|
+
data.datasets.forEach((obj, index) => {
|
|
195
|
+
const points = processMatrixDataPoints(obj.data, index, xLabels, yLabels);
|
|
196
|
+
points.forEach((point) => {
|
|
197
|
+
const rowLabel = typeof point.y === "number" && yLabels[point.y] !== undefined
|
|
198
|
+
? yLabels[point.y]
|
|
199
|
+
: String(point.y);
|
|
200
|
+
const groupName = data.datasets.length === 1
|
|
201
|
+
? rowLabel
|
|
202
|
+
: `${obj.label ?? `Group ${index + 1}`}: ${rowLabel}`;
|
|
203
|
+
if (!result[groupName]) {
|
|
204
|
+
result[groupName] = [];
|
|
205
|
+
}
|
|
206
|
+
result[groupName].push(point);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
Object.values(result).forEach((row) => row.sort((a, b) => a.x - b.x));
|
|
210
|
+
return { groups: Object.keys(result), data: result, xLabels, yLabels };
|
|
211
|
+
};
|
|
159
212
|
const scrubX = (data) => {
|
|
160
213
|
const blackboard = JSON.parse(JSON.stringify(data));
|
|
161
214
|
let labels = [];
|
|
@@ -170,11 +223,18 @@ const scrubX = (data) => {
|
|
|
170
223
|
});
|
|
171
224
|
return { labels, data: blackboard };
|
|
172
225
|
}
|
|
226
|
+
else {
|
|
227
|
+
// Grouped
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
173
230
|
};
|
|
174
231
|
const processData = (data, c2m_types) => {
|
|
175
232
|
if (c2m_types === "box") {
|
|
176
233
|
return processBoxData(data);
|
|
177
234
|
}
|
|
235
|
+
if (c2m_types === "matrix") {
|
|
236
|
+
return processMatrixData(data);
|
|
237
|
+
}
|
|
178
238
|
let groups = [];
|
|
179
239
|
if (data.datasets.length === 1) {
|
|
180
240
|
return {
|
|
@@ -206,26 +266,36 @@ const determineCCElement = (canvas, provided) => {
|
|
|
206
266
|
canvas.insertAdjacentElement("afterend", cc);
|
|
207
267
|
return cc;
|
|
208
268
|
};
|
|
269
|
+
const createDataSnapshot = (chart) => {
|
|
270
|
+
return JSON.stringify({
|
|
271
|
+
datasets: chart.data.datasets.map(ds => ds.data),
|
|
272
|
+
labels: chart.data.labels
|
|
273
|
+
});
|
|
274
|
+
};
|
|
209
275
|
const displayPoint = (chart) => {
|
|
210
276
|
if (!chartStates.has(chart)) {
|
|
211
277
|
return;
|
|
212
278
|
}
|
|
213
|
-
const { c2m: ref
|
|
279
|
+
const { c2m: ref } = chartStates.get(chart);
|
|
214
280
|
const { point, index } = ref.getCurrent();
|
|
281
|
+
// Use Chart2Music's internal visible group tracking
|
|
282
|
+
// @ts-ignore - accessing internal Chart2Music property
|
|
283
|
+
const visibleGroupIndices = ref._visible_group_indices?.slice(1) || [];
|
|
215
284
|
try {
|
|
216
285
|
const highlightElements = [];
|
|
217
286
|
if ("custom" in point) {
|
|
287
|
+
const customPoint = point;
|
|
218
288
|
highlightElements.push({
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
// @ts-ignore
|
|
222
|
-
index: point.custom.index
|
|
289
|
+
datasetIndex: customPoint.custom.datasetIndex ?? customPoint.custom.group,
|
|
290
|
+
index: customPoint.custom.index
|
|
223
291
|
});
|
|
224
292
|
}
|
|
225
293
|
else {
|
|
226
|
-
|
|
294
|
+
// For stacked charts, Chart2Music includes an "All" group at index 0,
|
|
295
|
+
// so we subtract 1 to get the actual dataset index
|
|
296
|
+
visibleGroupIndices.forEach((groupIndex) => {
|
|
227
297
|
highlightElements.push({
|
|
228
|
-
datasetIndex,
|
|
298
|
+
datasetIndex: groupIndex - 1,
|
|
229
299
|
index
|
|
230
300
|
});
|
|
231
301
|
});
|
|
@@ -241,11 +311,10 @@ const displayPoint = (chart) => {
|
|
|
241
311
|
const generateChart = (chart, options) => {
|
|
242
312
|
const { valid, c2m_types, invalidType } = processChartType(chart);
|
|
243
313
|
if (!valid) {
|
|
244
|
-
// @ts-ignore
|
|
245
314
|
options.errorCallback?.(`Unable to connect chart2music to chart. The chart is of type "${invalidType}", which is not one of the supported chart types for this plugin. This plugin supports: ${Object.keys(chartjs_c2m_converter).join(", ")}`);
|
|
246
315
|
return;
|
|
247
316
|
}
|
|
248
|
-
let axes = generateAxes(chart);
|
|
317
|
+
let axes = generateAxes(chart, options);
|
|
249
318
|
if (chart.config.type === "wordCloud") {
|
|
250
319
|
delete axes.x.minimum;
|
|
251
320
|
delete axes.x.maximum;
|
|
@@ -260,8 +329,20 @@ const generateChart = (chart, options) => {
|
|
|
260
329
|
}
|
|
261
330
|
// Generate CC element
|
|
262
331
|
const cc = determineCCElement(chart.canvas, options.cc);
|
|
263
|
-
const
|
|
332
|
+
const processedData = processData(chart.data, c2m_types);
|
|
333
|
+
const { data } = processedData;
|
|
264
334
|
// lastDataObj = JSON.stringify(data);
|
|
335
|
+
if (c2m_types === "matrix") {
|
|
336
|
+
if (processedData.xLabels?.length > 0) {
|
|
337
|
+
axes.x.valueLabels = processedData.xLabels.slice(0);
|
|
338
|
+
}
|
|
339
|
+
if (processedData.yLabels?.length > 0) {
|
|
340
|
+
// Category labels provide the Matrix Plot's Y-axis formatter.
|
|
341
|
+
// The general numeric formatter would otherwise announce row indexes.
|
|
342
|
+
delete axes.y.format;
|
|
343
|
+
axes.y.valueLabels = processedData.yLabels.slice(0);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
265
346
|
let scrub = scrubX(data);
|
|
266
347
|
if (scrub?.labels && scrub?.labels?.length > 0) { // Something was scrubbed
|
|
267
348
|
if (!chart.data.labels || chart.data.labels.length === 0) {
|
|
@@ -283,6 +364,13 @@ const generateChart = (chart, options) => {
|
|
|
283
364
|
...(options.axes?.y)
|
|
284
365
|
},
|
|
285
366
|
};
|
|
367
|
+
// Start with plugin's internal onFocusCallback
|
|
368
|
+
const pluginOnFocusCallback = () => {
|
|
369
|
+
displayPoint(chart);
|
|
370
|
+
};
|
|
371
|
+
// Merge user's options, wrapping onFocusCallback if provided
|
|
372
|
+
const userOptions = options.options || {};
|
|
373
|
+
const userOnFocusCallback = userOptions.onFocusCallback;
|
|
286
374
|
const c2mOptions = {
|
|
287
375
|
cc,
|
|
288
376
|
element: chart.canvas,
|
|
@@ -291,10 +379,13 @@ const generateChart = (chart, options) => {
|
|
|
291
379
|
title: determineChartTitle(chart.options),
|
|
292
380
|
axes,
|
|
293
381
|
options: {
|
|
294
|
-
|
|
295
|
-
onFocusCallback:
|
|
296
|
-
|
|
297
|
-
|
|
382
|
+
...userOptions,
|
|
383
|
+
onFocusCallback: userOnFocusCallback
|
|
384
|
+
? (point) => {
|
|
385
|
+
pluginOnFocusCallback();
|
|
386
|
+
userOnFocusCallback(point);
|
|
387
|
+
}
|
|
388
|
+
: pluginOnFocusCallback
|
|
298
389
|
}
|
|
299
390
|
};
|
|
300
391
|
if (Array.isArray(c2mOptions.data)) {
|
|
@@ -303,8 +394,9 @@ const generateChart = (chart, options) => {
|
|
|
303
394
|
return {
|
|
304
395
|
...point,
|
|
305
396
|
custom: {
|
|
306
|
-
|
|
307
|
-
|
|
397
|
+
...point.custom,
|
|
398
|
+
group: point.custom?.group ?? 0,
|
|
399
|
+
index: point.custom?.index ?? index
|
|
308
400
|
}
|
|
309
401
|
};
|
|
310
402
|
});
|
|
@@ -323,10 +415,11 @@ const generateChart = (chart, options) => {
|
|
|
323
415
|
}
|
|
324
416
|
}
|
|
325
417
|
else {
|
|
326
|
-
const
|
|
418
|
+
const dataObj = c2mOptions.data;
|
|
419
|
+
const groups = Object.keys(dataObj);
|
|
327
420
|
groups.forEach((groupName, groupNumber) => {
|
|
328
|
-
if (!isNaN(
|
|
329
|
-
|
|
421
|
+
if (!isNaN(dataObj[groupName][0])) {
|
|
422
|
+
dataObj[groupName] = dataObj[groupName].map((num, index) => {
|
|
330
423
|
return {
|
|
331
424
|
x: index,
|
|
332
425
|
y: num,
|
|
@@ -338,26 +431,25 @@ const generateChart = (chart, options) => {
|
|
|
338
431
|
});
|
|
339
432
|
}
|
|
340
433
|
else {
|
|
341
|
-
|
|
434
|
+
dataObj[groupName] = dataObj[groupName].map((point, index) => {
|
|
342
435
|
return {
|
|
343
436
|
...point,
|
|
344
437
|
custom: {
|
|
345
|
-
|
|
346
|
-
|
|
438
|
+
...point.custom,
|
|
439
|
+
group: point.custom?.group ?? groupNumber,
|
|
440
|
+
index: point.custom?.index ?? index
|
|
347
441
|
}
|
|
348
442
|
};
|
|
349
443
|
});
|
|
350
444
|
}
|
|
351
445
|
});
|
|
352
446
|
}
|
|
353
|
-
// @ts-ignore
|
|
354
447
|
if (chart.config.options?.scales?.x?.stacked) {
|
|
355
|
-
|
|
356
|
-
|
|
448
|
+
if (c2mOptions.options) {
|
|
449
|
+
c2mOptions.options.stack = true;
|
|
450
|
+
}
|
|
357
451
|
}
|
|
358
|
-
// @ts-ignore
|
|
359
452
|
if (options.audioEngine) {
|
|
360
|
-
// @ts-ignore
|
|
361
453
|
c2mOptions.audioEngine = options.audioEngine;
|
|
362
454
|
}
|
|
363
455
|
if (c2mOptions.data.length === 0) {
|
|
@@ -369,7 +461,6 @@ const generateChart = (chart, options) => {
|
|
|
369
461
|
const { err, data: c2m } = c2mChart(c2mOptions);
|
|
370
462
|
/* istanbul-ignore-next */
|
|
371
463
|
if (err) {
|
|
372
|
-
// @ts-ignore
|
|
373
464
|
options.errorCallback?.(err);
|
|
374
465
|
return;
|
|
375
466
|
}
|
|
@@ -378,12 +469,32 @@ const generateChart = (chart, options) => {
|
|
|
378
469
|
}
|
|
379
470
|
chartStates.set(chart, {
|
|
380
471
|
c2m,
|
|
381
|
-
|
|
472
|
+
lastDataSnapshot: createDataSnapshot(chart)
|
|
382
473
|
});
|
|
474
|
+
if (c2m_types === "matrix") {
|
|
475
|
+
const matrixKeydown = (event) => {
|
|
476
|
+
if (event.key !== "ArrowUp" && event.key !== "ArrowDown") {
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
event.preventDefault();
|
|
480
|
+
event.stopImmediatePropagation();
|
|
481
|
+
const actions = c2m._availableActions;
|
|
482
|
+
if (event.key === "ArrowUp") {
|
|
483
|
+
actions.next_category();
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
actions.previous_category();
|
|
487
|
+
}
|
|
488
|
+
};
|
|
489
|
+
chart.canvas.addEventListener("keydown", matrixKeydown, true);
|
|
490
|
+
const state = chartStates.get(chart);
|
|
491
|
+
state.matrixKeydown = matrixKeydown;
|
|
492
|
+
state.matrixKeydownTarget = chart.canvas;
|
|
493
|
+
}
|
|
383
494
|
};
|
|
384
495
|
const plugin = {
|
|
385
496
|
id: "chartjs2music",
|
|
386
|
-
afterInit: (chart,
|
|
497
|
+
afterInit: (chart, _args, options) => {
|
|
387
498
|
if (!chartStates.has(chart)) {
|
|
388
499
|
generateChart(chart, options);
|
|
389
500
|
// Remove tooltip when the chart blurs
|
|
@@ -410,19 +521,17 @@ const plugin = {
|
|
|
410
521
|
if (!chartStates.has(chart)) {
|
|
411
522
|
generateChart(chart, options);
|
|
412
523
|
}
|
|
413
|
-
const { c2m: ref
|
|
524
|
+
const { c2m: ref } = chartStates.get(chart);
|
|
414
525
|
if (!ref) {
|
|
415
526
|
return;
|
|
416
527
|
}
|
|
417
|
-
|
|
418
|
-
const groups =
|
|
419
|
-
|
|
420
|
-
if (ref._options.stack) {
|
|
528
|
+
const refInternal = ref;
|
|
529
|
+
const groups = refInternal._groups.slice(0);
|
|
530
|
+
if (refInternal._options.stack) {
|
|
421
531
|
groups.shift();
|
|
422
532
|
}
|
|
423
533
|
if (args.mode === "hide") {
|
|
424
534
|
const err = ref.setCategoryVisibility(groups[args.index], false);
|
|
425
|
-
visible_groups.splice(args.index, 1);
|
|
426
535
|
if (err) {
|
|
427
536
|
console.error(err);
|
|
428
537
|
}
|
|
@@ -430,24 +539,49 @@ const plugin = {
|
|
|
430
539
|
}
|
|
431
540
|
if (args.mode === "show") {
|
|
432
541
|
const err = ref.setCategoryVisibility(groups[args.index], true);
|
|
433
|
-
visible_groups.push(args.index);
|
|
434
542
|
if (err) {
|
|
435
543
|
console.error(err);
|
|
436
544
|
}
|
|
437
545
|
return;
|
|
438
546
|
}
|
|
439
547
|
},
|
|
548
|
+
afterDatasetsUpdate: (chart, _args, options) => {
|
|
549
|
+
const state = chartStates.get(chart);
|
|
550
|
+
if (!state?.c2m)
|
|
551
|
+
return;
|
|
552
|
+
// Check if data has changed
|
|
553
|
+
const currentSnapshot = createDataSnapshot(chart);
|
|
554
|
+
if (currentSnapshot === state.lastDataSnapshot) {
|
|
555
|
+
return; // No data change, skip update
|
|
556
|
+
}
|
|
557
|
+
// Get chart type
|
|
558
|
+
const { valid, c2m_types } = processChartType(chart);
|
|
559
|
+
if (!valid)
|
|
560
|
+
return;
|
|
561
|
+
// Process data and generate axes
|
|
562
|
+
const { data } = processData(chart.data, c2m_types);
|
|
563
|
+
const axes = generateAxes(chart, options);
|
|
564
|
+
// Update Chart2Music with new data
|
|
565
|
+
state.c2m.setData(data, axes);
|
|
566
|
+
// Update snapshot
|
|
567
|
+
state.lastDataSnapshot = currentSnapshot;
|
|
568
|
+
},
|
|
440
569
|
afterDestroy: (chart) => {
|
|
441
|
-
const
|
|
442
|
-
if (!
|
|
570
|
+
const state = chartStates.get(chart);
|
|
571
|
+
if (!state?.c2m) {
|
|
443
572
|
return;
|
|
444
573
|
}
|
|
574
|
+
const { c2m: ref } = state;
|
|
575
|
+
if (state?.matrixKeydown && state.matrixKeydownTarget) {
|
|
576
|
+
state.matrixKeydownTarget.removeEventListener("keydown", state.matrixKeydown, true);
|
|
577
|
+
}
|
|
445
578
|
ref.cleanUp();
|
|
446
579
|
},
|
|
447
580
|
defaults: {
|
|
448
581
|
cc: null,
|
|
449
582
|
audioEngine: null,
|
|
450
|
-
errorCallback: null
|
|
583
|
+
errorCallback: null,
|
|
584
|
+
options: {}
|
|
451
585
|
}
|
|
452
586
|
};
|
|
453
587
|
|
package/package.json
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chartjs-plugin-chart2music",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Chart.js plugin for Chart2Music. Turns chart.js charts into music so the blind can hear data.",
|
|
6
6
|
"main": "dist/plugin.js",
|
|
7
7
|
"module": "dist/plugin.mjs",
|
|
8
8
|
"exports": {
|
|
9
|
-
"import":
|
|
9
|
+
"import": {
|
|
10
|
+
"default": "./dist/plugin.mjs",
|
|
11
|
+
"types": "./dist/plugin.d.ts"
|
|
12
|
+
},
|
|
10
13
|
"require": "./dist/plugin.cjs"
|
|
11
14
|
},
|
|
12
15
|
"types": "dist/plugin.d.ts",
|
|
@@ -31,7 +34,9 @@
|
|
|
31
34
|
},
|
|
32
35
|
"license": "MIT",
|
|
33
36
|
"scripts": {
|
|
34
|
-
"start": "
|
|
37
|
+
"start": "storybook dev -p 6006",
|
|
38
|
+
"storybook": "storybook dev -p 6006",
|
|
39
|
+
"build-storybook": "storybook build",
|
|
35
40
|
"build": "rollup -c rollup.config.js --silent && yarn build-cjs",
|
|
36
41
|
"build-cjs": "babel ./dist/plugin.mjs --out-file ./dist/plugin.cjs",
|
|
37
42
|
"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest",
|
|
@@ -40,29 +45,59 @@
|
|
|
40
45
|
"prepack": "npm run clean && npm run build"
|
|
41
46
|
},
|
|
42
47
|
"devDependencies": {
|
|
43
|
-
"@babel/cli": "
|
|
44
|
-
"@babel/core": "
|
|
45
|
-
"@babel/plugin-transform-modules-commonjs": "
|
|
46
|
-
"@babel/preset-env": "
|
|
47
|
-
"@rollup/plugin-typescript": "12.
|
|
48
|
-
"@
|
|
49
|
-
"@
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"chartjs-
|
|
53
|
-
"
|
|
48
|
+
"@babel/cli": "^8.0.4",
|
|
49
|
+
"@babel/core": "^8.0.1",
|
|
50
|
+
"@babel/plugin-transform-modules-commonjs": "^8.0.1",
|
|
51
|
+
"@babel/preset-env": "^8.0.2",
|
|
52
|
+
"@rollup/plugin-typescript": "12.3.0",
|
|
53
|
+
"@storybook/html-vite": "10.5.0",
|
|
54
|
+
"@sgratzl/chartjs-chart-boxplot": "4.4.5",
|
|
55
|
+
"@types/jest": "^30.0.0",
|
|
56
|
+
"canvas": "^3.2.3",
|
|
57
|
+
"chartjs-adapter-luxon": "1.3.1",
|
|
58
|
+
"chartjs-chart-matrix": "3.0.5",
|
|
59
|
+
"chartjs-chart-wordcloud": "4.4.5",
|
|
60
|
+
"chartjs-plugin-a11y-legend": "0.2.2",
|
|
61
|
+
"cross-env": "^10.1.0",
|
|
54
62
|
"depcheck": "1.4.7",
|
|
55
|
-
"jest": "
|
|
56
|
-
"jest-environment-jsdom": "
|
|
57
|
-
"
|
|
63
|
+
"jest": "^30.4.2",
|
|
64
|
+
"jest-environment-jsdom": "^30.4.1",
|
|
65
|
+
"luxon": "^3.7.2",
|
|
66
|
+
"rimraf": "^6.1.3",
|
|
67
|
+
"rollup": "^4.62.2",
|
|
58
68
|
"rollup-plugin-copy": "3.5.0",
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
69
|
+
"storybook": "10.5.0",
|
|
70
|
+
"ts-jest": "^29.4.11",
|
|
71
|
+
"tslib": "2.8.1",
|
|
72
|
+
"typescript": "5.9.3",
|
|
73
|
+
"vite": "^8.1.4"
|
|
63
74
|
},
|
|
64
75
|
"dependencies": {
|
|
65
|
-
"chart.js": "4.
|
|
66
|
-
"chart2music": "1.
|
|
76
|
+
"chart.js": "4.5.1",
|
|
77
|
+
"chart2music": "1.20.0"
|
|
78
|
+
},
|
|
79
|
+
"resolutions": {
|
|
80
|
+
"@babel/core": "^8.0.1",
|
|
81
|
+
"brace-expansion": "^1.1.13",
|
|
82
|
+
"@babel/cli/**/brace-expansion": "^1.1.13",
|
|
83
|
+
"@babel/cli/**/minimatch": "^3.1.4",
|
|
84
|
+
"@babel/cli/**/picomatch": "^2.3.2",
|
|
85
|
+
"@rollup/plugin-typescript/**/picomatch": "^4.0.4",
|
|
86
|
+
"canvas/**/tar-fs": "^2.1.3",
|
|
87
|
+
"depcheck/**/brace-expansion": "^2.0.3",
|
|
88
|
+
"depcheck/**/js-yaml": "^3.15.0",
|
|
89
|
+
"depcheck/**/lodash": "^4.18.1",
|
|
90
|
+
"depcheck/**/minimatch": "^7.4.8",
|
|
91
|
+
"depcheck/**/picomatch": "^2.3.2",
|
|
92
|
+
"depcheck/**/postcss": "^8.5.10",
|
|
93
|
+
"jest/**/brace-expansion": "^1.1.13",
|
|
94
|
+
"jest/**/js-yaml": "^3.15.0",
|
|
95
|
+
"jest/**/minimatch": "^3.1.4",
|
|
96
|
+
"jest/**/picomatch": "^2.3.2",
|
|
97
|
+
"rollup-plugin-copy/**/brace-expansion": "^1.1.13",
|
|
98
|
+
"rollup-plugin-copy/**/minimatch": "^3.1.4",
|
|
99
|
+
"rollup-plugin-copy/**/picomatch": "^2.3.2",
|
|
100
|
+
"**/ws": "^8.21.0",
|
|
101
|
+
"**/yaml": "^1.10.3"
|
|
67
102
|
}
|
|
68
103
|
}
|