@chartguard/quality-chartjs 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +17 -2
- package/dist/axes.d.ts +14 -0
- package/dist/axes.d.ts.map +1 -0
- package/dist/axes.js +146 -0
- package/dist/axes.js.map +1 -0
- package/dist/color.d.ts +8 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +123 -0
- package/dist/color.js.map +1 -0
- package/dist/fit.d.ts +11 -0
- package/dist/fit.d.ts.map +1 -0
- package/dist/fit.js +137 -0
- package/dist/fit.js.map +1 -0
- package/dist/fixes.d.ts +6 -0
- package/dist/fixes.d.ts.map +1 -0
- package/dist/fixes.js +30 -0
- package/dist/fixes.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/legend.d.ts +13 -0
- package/dist/legend.d.ts.map +1 -0
- package/dist/legend.js +59 -0
- package/dist/legend.js.map +1 -0
- package/dist/motion.d.ts +8 -0
- package/dist/motion.d.ts.map +1 -0
- package/dist/motion.js +69 -0
- package/dist/motion.js.map +1 -0
- package/dist/scales.d.ts +25 -0
- package/dist/scales.d.ts.map +1 -0
- package/dist/scales.js +95 -0
- package/dist/scales.js.map +1 -0
- package/dist/series.d.ts +12 -0
- package/dist/series.d.ts.map +1 -0
- package/dist/series.js +173 -0
- package/dist/series.js.map +1 -0
- package/dist/values.d.ts +7 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +43 -0
- package/dist/values.js.map +1 -0
- package/package.json +39 -5
package/dist/index.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { isBoolean, isString, itemsAt, linearScale, readFact, review, unknown, withFixes } from '@chartguard/quality-core';
|
|
2
|
+
import { asText, axesOf, isText } from './axes.js';
|
|
3
|
+
import { colorsDefinedOnce } from './color.js';
|
|
4
|
+
import { LINEAR, REMEDIES } from './fixes.js';
|
|
5
|
+
import { legendOf, legendShown } from './legend.js';
|
|
6
|
+
import { motionOf } from './motion.js';
|
|
7
|
+
import { scalesOf } from './scales.js';
|
|
8
|
+
import { addedScales, seriesOf } from './series.js';
|
|
9
|
+
const TITLE_SHOWN = {
|
|
10
|
+
value: false,
|
|
11
|
+
pointer: 'chart.js@4.5.1 dist/chart.js:8960 display: false, [in var plugin_title]'
|
|
12
|
+
};
|
|
13
|
+
/** The Chart.js config as library-neutral chart semantics (CG-05-02, CG-05-03). */
|
|
14
|
+
export function normalize(config) {
|
|
15
|
+
const datasets = itemsAt(config, ['data', 'datasets']);
|
|
16
|
+
const scales = scalesOf(config, datasets, addedScales(config));
|
|
17
|
+
const colorsDefined = colorsDefinedOnce(config, datasets);
|
|
18
|
+
const [chartType, legendDrawn] = [readFact(config, ['type'], isString), legendShown(config)];
|
|
19
|
+
const series = datasets.known
|
|
20
|
+
? {
|
|
21
|
+
...datasets,
|
|
22
|
+
items: datasets.items.map((item) => ({
|
|
23
|
+
...seriesOf(config, item, scales, colorsDefined),
|
|
24
|
+
legend: legendOf(config, item, chartType, legendDrawn)
|
|
25
|
+
}))
|
|
26
|
+
}
|
|
27
|
+
: datasets;
|
|
28
|
+
const titleAt = ['options', 'plugins', 'title'];
|
|
29
|
+
return {
|
|
30
|
+
library: 'chartjs',
|
|
31
|
+
title: {
|
|
32
|
+
text: asText(readFact(config, [...titleAt, 'text'], isText)),
|
|
33
|
+
shown: readFact(config, [...titleAt, 'display'], isBoolean, TITLE_SHOWN)
|
|
34
|
+
},
|
|
35
|
+
series,
|
|
36
|
+
axes: axesOf(config, { series, datasets }, scales),
|
|
37
|
+
// A canvas gets its text alternative and keyboard access from the page, not from the config.
|
|
38
|
+
access: { dataDescribed: unknown('$', 'page'), keyboard: unknown('$', 'page') },
|
|
39
|
+
// A canvas is transparent and Chart.js paints no background: the page behind it is the background.
|
|
40
|
+
background: unknown('$', 'page'),
|
|
41
|
+
motion: motionOf(config, datasets)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export { assertQualityOptions, QualityOptionsError } from '@chartguard/quality-core';
|
|
45
|
+
/** The rules' advisory findings on the config, shaped by the caller's rule settings and context (CG-05-05). */
|
|
46
|
+
export function analyze(config, options) {
|
|
47
|
+
const reviewed = (input) => review(normalize(input), options);
|
|
48
|
+
// Each fix is offered only when the config with it applied, reviewed the same way, no longer has the finding nor a new one.
|
|
49
|
+
return withFixes(reviewed(config), config, { ...REMEDIES, 'bar-log-scale': linearScale(normalize, LINEAR) }, reviewed);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/legend.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Fact, type Item, type TitleSemantics } from '@chartguard/quality-core';
|
|
2
|
+
/**
|
|
3
|
+
* Whether the legend draws an entry for every dataset: displayed (`display`, true by default) and
|
|
4
|
+
* listing the datasets with the default `generateLabels`. A callback that makes or filters the entries
|
|
5
|
+
* decides at runtime (`dynamic`).
|
|
6
|
+
*/
|
|
7
|
+
export declare function legendShown(config: unknown): Fact<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* A dataset's legend entry: its `label`, or "undefined"; drawn when the legend shows the datasets
|
|
10
|
+
* (`shown`, read once per chart). A pie, doughnut or polar area chart lists its labels instead.
|
|
11
|
+
*/
|
|
12
|
+
export declare function legendOf(config: unknown, item: Item, chartType: Fact<string>, shown: Fact<boolean>): TitleSemantics;
|
|
13
|
+
//# sourceMappingURL=legend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legend.d.ts","sourceRoot":"","sources":["../src/legend.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,IAAI,EAIT,KAAK,IAAI,EAGT,KAAK,cAAc,EAGnB,MAAM,0BAA0B,CAAC;AAgClC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAW1D;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,cAAc,CAInH"}
|
package/dist/legend.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { isBoolean, isDefined, isString, readFact, readPath, unknown, unreadable } from '@chartguard/quality-core';
|
|
2
|
+
/**
|
|
3
|
+
* A dataset's legend entry is its raw `label` (the legend plugin's `generateLabels`); without one the
|
|
4
|
+
* text is `undefined`, which the canvas draws as the word "undefined" (`fillText` takes a string).
|
|
5
|
+
*/
|
|
6
|
+
const UNLABELLED = {
|
|
7
|
+
value: 'undefined',
|
|
8
|
+
pointer: 'chart.js@4.5.1 dist/chart.js:8803 text: datasets[meta.index].label,'
|
|
9
|
+
};
|
|
10
|
+
/** The legend is drawn unless the config turns it off. */
|
|
11
|
+
const DISPLAYED = {
|
|
12
|
+
value: true,
|
|
13
|
+
pointer: 'chart.js@4.5.1 dist/chart.js:8773 display: true, [in var plugin_legend]'
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Chart types whose legend lists `data.labels`, not the datasets: their `overrides` replace
|
|
17
|
+
* `generateLabels` (doughnut, inherited by pie, dist/chart.js:1854; polarArea, :2221).
|
|
18
|
+
*/
|
|
19
|
+
const BY_LABELS = new Set(['pie', 'doughnut', 'polarArea']);
|
|
20
|
+
const LEGEND = ['options', 'plugins', 'legend'];
|
|
21
|
+
/** `false` turns a plugin off for the chart (`plugins: false` turns off every plugin). */
|
|
22
|
+
function switchedOff(config) {
|
|
23
|
+
for (const path of [['options', 'plugins'], LEGEND])
|
|
24
|
+
if (readPath(config, path) === false)
|
|
25
|
+
return readFact(config, path, isBoolean);
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Whether the legend draws an entry for every dataset: displayed (`display`, true by default) and
|
|
30
|
+
* listing the datasets with the default `generateLabels`. A callback that makes or filters the entries
|
|
31
|
+
* decides at runtime (`dynamic`).
|
|
32
|
+
*/
|
|
33
|
+
export function legendShown(config) {
|
|
34
|
+
const off = switchedOff(config);
|
|
35
|
+
if (off !== undefined)
|
|
36
|
+
return off;
|
|
37
|
+
const display = readFact(config, [...LEGEND, 'display'], isBoolean, DISPLAYED);
|
|
38
|
+
if (!display.known || !display.value)
|
|
39
|
+
return display;
|
|
40
|
+
for (const name of ['generateLabels', 'filter']) {
|
|
41
|
+
const callback = readFact(config, [...LEGEND, 'labels', name], isDefined);
|
|
42
|
+
if (callback.known)
|
|
43
|
+
return unknown(callback.path, 'dynamic');
|
|
44
|
+
if (unreadable(callback))
|
|
45
|
+
return callback;
|
|
46
|
+
}
|
|
47
|
+
return display;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A dataset's legend entry: its `label`, or "undefined"; drawn when the legend shows the datasets
|
|
51
|
+
* (`shown`, read once per chart). A pie, doughnut or polar area chart lists its labels instead.
|
|
52
|
+
*/
|
|
53
|
+
export function legendOf(config, item, chartType, shown) {
|
|
54
|
+
const text = readFact(config, [...item.segments, 'label'], isString, UNLABELLED);
|
|
55
|
+
if (!chartType.known)
|
|
56
|
+
return { text, shown: unknown(chartType.path, chartType.reason) };
|
|
57
|
+
return { text, shown: BY_LABELS.has(chartType.value) ? unknown(chartType.path, 'inapplicable') : shown };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=legend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legend.js","sourceRoot":"","sources":["../src/legend.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,SAAS,EACT,SAAS,EACT,QAAQ,EAER,QAAQ,EACR,QAAQ,EAER,OAAO,EACP,UAAU,EACV,MAAM,0BAA0B,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,GAAoB;IACnC,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,qEAAqE;CAC9E,CAAC;AAEF,0DAA0D;AAC1D,MAAM,SAAS,GAAqB;IACnC,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,yEAAyE;CAClF,CAAC;AAEF;;;GAGG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AAE5D,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhD,0FAA0F;AAC1F,SAAS,WAAW,CAAC,MAAe;IACnC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAClD,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAChF,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAe;IAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/E,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1E,IAAI,QAAQ,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7D,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,IAAU,EAAE,SAAuB,EAAE,KAAoB;IAClG,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACjF,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IACxF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AAC1G,CAAC"}
|
package/dist/motion.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Item, type Listed, type MotionSemantics } from '@chartguard/quality-core';
|
|
2
|
+
/**
|
|
3
|
+
* The motion Chart.js starts when it draws the chart: endless when an animation config `loop`s
|
|
4
|
+
* (default `undefined`), as long as the longest `duration` (default 1000 ms); none with
|
|
5
|
+
* `animation: false`. Datasets with animation options of their own are not modelled.
|
|
6
|
+
*/
|
|
7
|
+
export declare function motionOf(config: unknown, datasets: Listed<Item>): MotionSemantics;
|
|
8
|
+
//# sourceMappingURL=motion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AACA,OAAO,EAIN,KAAK,IAAI,EAET,KAAK,MAAM,EACX,KAAK,eAAe,EAIpB,MAAM,0BAA0B,CAAC;AAsBlC;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAyBjF"}
|
package/dist/motion.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { isContainer, ownDataProperty } from '@chartguard/core';
|
|
2
|
+
import { isDefined, known, readFact, unknown, unreadable } from '@chartguard/quality-core';
|
|
3
|
+
const DURATION = {
|
|
4
|
+
value: 1000,
|
|
5
|
+
pointer: 'chart.js@4.5.1 dist/chunks/helpers.dataset.js:783 duration: 1000,'
|
|
6
|
+
};
|
|
7
|
+
const LOOP = {
|
|
8
|
+
value: false,
|
|
9
|
+
pointer: 'chart.js@4.5.1 dist/chunks/helpers.dataset.js:787 loop: undefined,'
|
|
10
|
+
};
|
|
11
|
+
const isDynamic = (fact) => fact.known && typeof fact.value === 'function';
|
|
12
|
+
/** The animation configs that apply: `options.animation` and each `options.animations.<name>`; undefined when one cannot be read. */
|
|
13
|
+
function configs(config) {
|
|
14
|
+
const animations = readFact(config, ['options', 'animations'], isContainer);
|
|
15
|
+
if (unreadable(animations))
|
|
16
|
+
return undefined;
|
|
17
|
+
const names = animations.known ? Object.keys(animations.value) : [];
|
|
18
|
+
if (animations.known && names.some((name) => !ownDataProperty(animations.value, name).found))
|
|
19
|
+
return undefined;
|
|
20
|
+
return [['options', 'animation'], ...names.map((name) => ['options', 'animations', name])];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The motion Chart.js starts when it draws the chart: endless when an animation config `loop`s
|
|
24
|
+
* (default `undefined`), as long as the longest `duration` (default 1000 ms); none with
|
|
25
|
+
* `animation: false`. Datasets with animation options of their own are not modelled.
|
|
26
|
+
*/
|
|
27
|
+
export function motionOf(config, datasets) {
|
|
28
|
+
const animation = readFact(config, ['options', 'animation'], isDefined);
|
|
29
|
+
if (animation.known && animation.value === false)
|
|
30
|
+
return { endless: { ...animation, value: false }, longest: { ...animation, value: 0 } };
|
|
31
|
+
const own = datasets.known
|
|
32
|
+
? datasets.items.flatMap((item) => ['animation', 'animations'].map((key) => readFact(config, [...item.segments, key], isDefined)))
|
|
33
|
+
: [];
|
|
34
|
+
const scopes = configs(config);
|
|
35
|
+
if (unreadable(animation) ||
|
|
36
|
+
!datasets.known ||
|
|
37
|
+
scopes === undefined ||
|
|
38
|
+
own.some((fact) => fact.known || unreadable(fact)))
|
|
39
|
+
return {
|
|
40
|
+
endless: unknown('$.options.animation', 'unmodelled'),
|
|
41
|
+
longest: unknown('$.options.animation', 'unmodelled')
|
|
42
|
+
};
|
|
43
|
+
const loops = scopes.map((scope) => readFact(config, [...scope, 'loop'], isDefined));
|
|
44
|
+
const durations = scopes.map((scope, index) => readFact(config, [...scope, 'duration'], isDefined, index === 0 ? DURATION : undefined));
|
|
45
|
+
return { endless: endlessOf(loops), longest: longestOf(durations) };
|
|
46
|
+
}
|
|
47
|
+
function endlessOf(loops) {
|
|
48
|
+
const decided = loops.find((fact) => unreadable(fact) || isDynamic(fact) || (fact.known && fact.value === true));
|
|
49
|
+
if (decided === undefined)
|
|
50
|
+
return {
|
|
51
|
+
known: true,
|
|
52
|
+
value: false,
|
|
53
|
+
path: loops[0]?.path ?? '$.options.animation.loop',
|
|
54
|
+
source: 'default',
|
|
55
|
+
pointer: LOOP.pointer
|
|
56
|
+
};
|
|
57
|
+
if (!decided.known)
|
|
58
|
+
return decided;
|
|
59
|
+
return isDynamic(decided) ? unknown(decided.path, 'dynamic') : { ...decided, value: true };
|
|
60
|
+
}
|
|
61
|
+
function longestOf(durations) {
|
|
62
|
+
const undecided = durations.find((fact) => unreadable(fact) || isDynamic(fact));
|
|
63
|
+
if (undecided !== undefined)
|
|
64
|
+
return unknown(undecided.path, undecided.known ? 'dynamic' : undecided.reason);
|
|
65
|
+
const numbers = durations.filter((fact) => fact.known && typeof fact.value === 'number');
|
|
66
|
+
const longest = numbers.reduce((max, fact) => (max === undefined || fact.value > max.value ? fact : max), undefined);
|
|
67
|
+
return longest ?? known(0, '$.options.animation.duration');
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=motion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"motion.js","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAGN,SAAS,EAET,KAAK,EAGL,QAAQ,EACR,OAAO,EACP,UAAU,EACV,MAAM,0BAA0B,CAAC;AAElC,MAAM,QAAQ,GAAoB;IACjC,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,mEAAmE;CAC5E,CAAC;AACF,MAAM,IAAI,GAAqB;IAC9B,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,oEAAoE;CAC7E,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,IAAmB,EAAW,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC;AAEnG,qIAAqI;AACrI,SAAS,OAAO,CAAC,MAAe;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5E,IAAI,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,IAAI,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/G,OAAO,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,QAAsB;IAC/D,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;IACxE,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK;QAC/C,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IACzF,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK;QACzB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAChC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAC9F;QACF,CAAC,CAAC,EAAE,CAAC;IACN,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,IACC,UAAU,CAAC,SAAS,CAAC;QACrB,CAAC,QAAQ,CAAC,KAAK;QACf,MAAM,KAAK,SAAS;QACpB,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAElD,OAAO;YACN,OAAO,EAAE,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC;YACrD,OAAO,EAAE,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC;SACrD,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAC7C,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CACvF,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,SAAS,CAAC,KAA+B;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;IACjH,IAAI,OAAO,KAAK,SAAS;QACxB,OAAO;YACN,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,0BAA0B;YAClD,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IACnC,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC5F,CAAC;AAED,SAAS,SAAS,CAAC,SAAmC;IACrD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChF,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5G,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAC/B,CAAC,IAAI,EAA0C,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAC9F,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAC7B,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EACzE,SAAS,CACT,CAAC;IACF,OAAO,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE,8BAA8B,CAAC,CAAC;AAC5D,CAAC"}
|
package/dist/scales.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Fact, type Item, type Listed } from '@chartguard/quality-core';
|
|
2
|
+
export type Axis = 'x' | 'y' | 'r';
|
|
3
|
+
/**
|
|
4
|
+
* The scales a chart builds, in the order `chart.scales` holds them (chart.js@4.5.1 `mergeScaleConfig`):
|
|
5
|
+
* the configured ones first, then those the datasets' types add. `axis` is undefined where the config
|
|
6
|
+
* does not say: a scale whose axis is not readable, or in place of scales that cannot be read at all.
|
|
7
|
+
*/
|
|
8
|
+
export interface Scales {
|
|
9
|
+
readonly entries: readonly {
|
|
10
|
+
readonly id: string | undefined;
|
|
11
|
+
readonly axis: Axis | undefined;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
/** A dataset's scale ids and the axes they are on, as its type adds them; undefined when not readable. */
|
|
15
|
+
export type DatasetScales = (item: Item) => readonly {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly axis: Axis;
|
|
18
|
+
}[] | undefined;
|
|
19
|
+
export declare function scalesOf(config: unknown, datasets: Listed<Item>, added: DatasetScales): Scales;
|
|
20
|
+
/**
|
|
21
|
+
* The scale a dataset is measured on along `axis`: the one its `<axis>AxisID` names, else the first
|
|
22
|
+
* scale of the chart on that axis. Unknown when a scale before it might be on that axis.
|
|
23
|
+
*/
|
|
24
|
+
export declare function scaleOf(config: unknown, item: Item, axis: Axis, scales: Scales): Fact<string>;
|
|
25
|
+
//# sourceMappingURL=scales.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scales.d.ts","sourceRoot":"","sources":["../src/scales.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAY,KAAK,IAAI,EAAE,KAAK,MAAM,EAAgC,MAAM,0BAA0B,CAAC;AAErH,MAAM,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEnC;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAAA;KAAE,EAAE,CAAC;CAClG;AAQD,0GAA0G;AAC1G,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,EAAE,GAAG,SAAS,CAAC;AAmDhH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAU9F;AASD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAS7F"}
|
package/dist/scales.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { isContainer, ownDataProperty } from '@chartguard/core';
|
|
2
|
+
import { isString, MAX_ITEMS, readFact, unknown } from '@chartguard/quality-core';
|
|
3
|
+
const UNREAD = { id: undefined, axis: undefined };
|
|
4
|
+
const AXES = new Set(['x', 'y', 'r']);
|
|
5
|
+
const isAxis = (value) => typeof value === 'string' && AXES.has(value);
|
|
6
|
+
const POSITIONS = { top: 'x', bottom: 'x', left: 'y', right: 'y' };
|
|
7
|
+
/** An own string data property, or undefined (also for a getter, which never runs). */
|
|
8
|
+
function own(value, key) {
|
|
9
|
+
if (!isContainer(value))
|
|
10
|
+
return undefined;
|
|
11
|
+
const entry = ownDataProperty(value, key);
|
|
12
|
+
return entry.found ? entry.value : undefined;
|
|
13
|
+
}
|
|
14
|
+
/** The axis a dataset binds `id` to (`retrieveAxisFromDatasets`: the first dataset naming it, x before y). */
|
|
15
|
+
function axisFromDatasets(datasets, id) {
|
|
16
|
+
if (!datasets.known)
|
|
17
|
+
return undefined;
|
|
18
|
+
const bound = datasets.items.find(({ value }) => own(value, 'xAxisID') === id || own(value, 'yAxisID') === id);
|
|
19
|
+
if (bound === undefined)
|
|
20
|
+
return undefined;
|
|
21
|
+
return own(bound.value, 'xAxisID') === id ? 'x' : 'y';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The axis of a configured scale (`determineAxis`, dist/chart.js:5261): its id when that is `x`, `y`
|
|
25
|
+
* or `r`; else its `axis`, its `position`, the first letter of a longer id; else the axis a dataset binds
|
|
26
|
+
* it to. Undefined when none says (Chart.js then throws) or one is behind a getter.
|
|
27
|
+
*/
|
|
28
|
+
function axisOf(id, scale, datasets) {
|
|
29
|
+
if (isAxis(id))
|
|
30
|
+
return id;
|
|
31
|
+
const axis = own(scale, 'axis');
|
|
32
|
+
if (isAxis(axis))
|
|
33
|
+
return axis;
|
|
34
|
+
const position = own(scale, 'position');
|
|
35
|
+
if (typeof position === 'string' && POSITIONS[position] !== undefined)
|
|
36
|
+
return POSITIONS[position];
|
|
37
|
+
const letter = id.length > 1 ? id[0]?.toLowerCase() : undefined;
|
|
38
|
+
return isAxis(letter) ? letter : axisFromDatasets(datasets, id);
|
|
39
|
+
}
|
|
40
|
+
/** Configured scales Chart.js builds: plain objects only (`if (!isObject(scaleConf))` skips the rest). */
|
|
41
|
+
const isPlainObject = (value) => Object.prototype.toString.call(value) === '[object Object]';
|
|
42
|
+
/**
|
|
43
|
+
* The configured scales, in key order; an unreadable `options.scales` is one unread entry, and so are
|
|
44
|
+
* more scales than a list is read with (`MAX_ITEMS`): each is matched against the datasets.
|
|
45
|
+
*/
|
|
46
|
+
function configuredScales(config, datasets) {
|
|
47
|
+
const configured = readFact(config, ['options', 'scales'], isContainer);
|
|
48
|
+
if (!configured.known)
|
|
49
|
+
return configured.reason === 'unset' ? [] : [UNREAD];
|
|
50
|
+
const ids = Object.keys(configured.value);
|
|
51
|
+
if (ids.length > MAX_ITEMS)
|
|
52
|
+
return [UNREAD];
|
|
53
|
+
return ids.flatMap((id) => {
|
|
54
|
+
const scale = ownDataProperty(configured.value, id);
|
|
55
|
+
if (!scale.found)
|
|
56
|
+
return [{ id, axis: undefined }];
|
|
57
|
+
return isPlainObject(scale.value) ? [{ id, axis: axisOf(id, scale.value, datasets) }] : [];
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function scalesOf(config, datasets, added) {
|
|
61
|
+
const entries = [...configuredScales(config, datasets)];
|
|
62
|
+
if (!datasets.known)
|
|
63
|
+
return { entries: [...entries, UNREAD] };
|
|
64
|
+
for (const item of datasets.items) {
|
|
65
|
+
const scales = added(item);
|
|
66
|
+
// `scales[id] = scales[id] || …`: a configured or earlier scale keeps its place.
|
|
67
|
+
const fresh = scales?.filter(({ id }) => !entries.some((entry) => entry.id === id));
|
|
68
|
+
entries.push(...(fresh ?? [UNREAD]));
|
|
69
|
+
}
|
|
70
|
+
return { entries };
|
|
71
|
+
}
|
|
72
|
+
/** Per axis, the line of `linkScales` that defaults a dataset's scale to the first scale on that axis. */
|
|
73
|
+
const FIRST_SCALE = {
|
|
74
|
+
x: "chart.js@4.5.1 dist/chart.js:621 const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));",
|
|
75
|
+
y: "chart.js@4.5.1 dist/chart.js:622 const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));",
|
|
76
|
+
r: "chart.js@4.5.1 dist/chart.js:623 const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));"
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* The scale a dataset is measured on along `axis`: the one its `<axis>AxisID` names, else the first
|
|
80
|
+
* scale of the chart on that axis. Unknown when a scale before it might be on that axis.
|
|
81
|
+
*/
|
|
82
|
+
export function scaleOf(config, item, axis, scales) {
|
|
83
|
+
const named = readFact(config, [...item.segments, `${axis}AxisID`], isString);
|
|
84
|
+
if (named.known || named.reason !== 'unset')
|
|
85
|
+
return named;
|
|
86
|
+
for (const { id, axis: on } of scales.entries) {
|
|
87
|
+
if (id === undefined || on === undefined)
|
|
88
|
+
return unknown(named.path, 'unmodelled');
|
|
89
|
+
if (on === axis)
|
|
90
|
+
return { known: true, value: id, path: named.path, source: 'default', pointer: FIRST_SCALE[axis] };
|
|
91
|
+
}
|
|
92
|
+
// Every dataset adds a scale on each of its axes: one is always found when all are read.
|
|
93
|
+
return unknown(named.path, 'unmodelled');
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=scales.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scales.js","sourceRoot":"","sources":["../src/scales.ts"],"names":[],"mappings":"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"}
|
package/dist/series.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Default, type Fact, type Item, type SeriesSemantics } from '@chartguard/quality-core';
|
|
2
|
+
import { type DatasetScales, type Scales } from './scales.js';
|
|
3
|
+
/** Runtime facts, each pointing at the line of the pinned chart.js that applies it. */
|
|
4
|
+
export declare const INDEX_AXIS: Default<string>;
|
|
5
|
+
/**
|
|
6
|
+
* The scales a dataset's type adds (`const id = dataset[axis + 'AxisID'] || axis`, dist/chart.js:5323):
|
|
7
|
+
* one on x and one on y for cartesian types, one on r for radial ones, none for pie. Undefined when
|
|
8
|
+
* its type or a scale id cannot be read, or the type is not built in (it may add others).
|
|
9
|
+
*/
|
|
10
|
+
export declare function addedScales(config: unknown): DatasetScales;
|
|
11
|
+
export declare function seriesOf(config: unknown, item: Item, scales: Scales, colorsDefined: () => Fact<boolean>): Omit<SeriesSemantics, 'legend'>;
|
|
12
|
+
//# sourceMappingURL=series.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"series.d.ts","sourceRoot":"","sources":["../src/series.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,OAAO,EACZ,KAAK,IAAI,EAKT,KAAK,IAAI,EAKT,KAAK,eAAe,EAIpB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAa,KAAK,aAAa,EAAW,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAGlF,uFAAuF;AACvF,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,MAAM,CAItC,CAAC;AAyFF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAa1D;AAoDD,wBAAgB,QAAQ,CACvB,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,GAChC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAcjC"}
|
package/dist/series.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { firstSet, isNumber, isStaticValue, isString, readFact, sameShades, unknown } from '@chartguard/quality-core';
|
|
2
|
+
import { colorOf } from './color.js';
|
|
3
|
+
import { scaleOf } from './scales.js';
|
|
4
|
+
import { valuesOf } from './values.js';
|
|
5
|
+
/** Runtime facts, each pointing at the line of the pinned chart.js that applies it. */
|
|
6
|
+
export const INDEX_AXIS = {
|
|
7
|
+
value: 'x',
|
|
8
|
+
pointer: "chart.js@4.5.1 dist/chart.js:5234 return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';"
|
|
9
|
+
};
|
|
10
|
+
const FILL = { value: false, pointer: 'chart.js@4.5.1 dist/chart.js:6955 fill: false,' };
|
|
11
|
+
/** Stacked when the value scale says so, or when it says nothing and the dataset has a `stack`. */
|
|
12
|
+
const STACKED = 'chart.js@4.5.1 dist/chart.js:478 return stacked || stacked === undefined && meta.stack !== undefined;';
|
|
13
|
+
const CARTESIAN = {
|
|
14
|
+
bar: 'bar',
|
|
15
|
+
line: 'line',
|
|
16
|
+
scatter: 'scatter',
|
|
17
|
+
bubble: 'scatter'
|
|
18
|
+
};
|
|
19
|
+
const PIE = new Set(['pie', 'doughnut']);
|
|
20
|
+
/** Drawn on the radial scale `r`. */
|
|
21
|
+
const RADIAL = new Set(['radar', 'polarArea']);
|
|
22
|
+
/** A bar grows from zero unless its `base` is set (`startValue = baseValue ?? start`, with `start` zero unless stacked). */
|
|
23
|
+
const BASE = {
|
|
24
|
+
value: 0,
|
|
25
|
+
pointer: 'chart.js@4.5.1 dist/chart.js:1574 let start = 0; [in _calculateBarValuePixels(index)]'
|
|
26
|
+
};
|
|
27
|
+
/** A bar's `base`, through the dataset, the options for bar datasets and the chart options (`datasetScopeKeys`). */
|
|
28
|
+
function baseOf(config, item, kind) {
|
|
29
|
+
if (!kind.known || kind.value !== 'bar')
|
|
30
|
+
return unknown(`${item.path}.base`, kind.known ? 'inapplicable' : kind.reason);
|
|
31
|
+
return firstSet([
|
|
32
|
+
readFact(config, [...item.segments, 'base'], isNumber),
|
|
33
|
+
readFact(config, ['options', 'datasets', 'bar', 'base'], isNumber),
|
|
34
|
+
readFact(config, ['options', 'base'], isNumber)
|
|
35
|
+
], BASE);
|
|
36
|
+
}
|
|
37
|
+
/** Any value the config sets, except one decided at runtime. */
|
|
38
|
+
/** A dataset's type: its own, else the chart's (`const type = dataset.type || config.type`, dist/chart.js:5317). */
|
|
39
|
+
function typeOf(config, item) {
|
|
40
|
+
const own = readFact(config, [...item.segments, 'type'], isString);
|
|
41
|
+
return own.known || own.reason !== 'unset' ? own : readFact(config, ['type'], isString);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A line dataset with a `fill` other than `false` draws an area. `fill` resolves through the dataset,
|
|
45
|
+
* the options for line datasets and those for line elements; the line element default is `false`.
|
|
46
|
+
* (Drawing it needs the Filler plugin; the config engine reports an unregistered one.)
|
|
47
|
+
*/
|
|
48
|
+
function kindOf(config, item, type) {
|
|
49
|
+
if (!type.known)
|
|
50
|
+
return type;
|
|
51
|
+
if (type.value !== 'line')
|
|
52
|
+
return { ...type, value: CARTESIAN[type.value] ?? (PIE.has(type.value) ? 'pie' : 'other') };
|
|
53
|
+
const fill = firstSet([
|
|
54
|
+
readFact(config, [...item.segments, 'fill'], isStaticValue),
|
|
55
|
+
readFact(config, ['options', 'datasets', 'line', 'fill'], isStaticValue),
|
|
56
|
+
readFact(config, ['options', 'elements', 'line', 'fill'], isStaticValue)
|
|
57
|
+
], FILL);
|
|
58
|
+
if (!fill.known)
|
|
59
|
+
return fill;
|
|
60
|
+
return fill.value === false ? { ...type, value: 'line' } : { ...fill, value: 'area' };
|
|
61
|
+
}
|
|
62
|
+
/** The index axis: the dataset's, the one for its type, the chart's, else `x`. */
|
|
63
|
+
function indexAxisOf(config, item, type) {
|
|
64
|
+
return firstSet([
|
|
65
|
+
readFact(config, [...item.segments, 'indexAxis'], isString),
|
|
66
|
+
readFact(config, ['options', 'datasets', type, 'indexAxis'], isString),
|
|
67
|
+
readFact(config, ['options', 'indexAxis'], isString)
|
|
68
|
+
], INDEX_AXIS);
|
|
69
|
+
}
|
|
70
|
+
function orientationOf(index) {
|
|
71
|
+
if (!index.known)
|
|
72
|
+
return index;
|
|
73
|
+
if (index.value === 'x')
|
|
74
|
+
return { ...index, value: 'vertical' };
|
|
75
|
+
return index.value === 'y' ? { ...index, value: 'horizontal' } : unknown(index.path, 'unmodelled');
|
|
76
|
+
}
|
|
77
|
+
/** The axes a built-in type adds a scale on; undefined for a type that is not built in. */
|
|
78
|
+
function axesOfType(type) {
|
|
79
|
+
if (PIE.has(type))
|
|
80
|
+
return [];
|
|
81
|
+
if (RADIAL.has(type))
|
|
82
|
+
return ['r'];
|
|
83
|
+
return CARTESIAN[type] === undefined ? undefined : ['x', 'y'];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The scales a dataset's type adds (`const id = dataset[axis + 'AxisID'] || axis`, dist/chart.js:5323):
|
|
87
|
+
* one on x and one on y for cartesian types, one on r for radial ones, none for pie. Undefined when
|
|
88
|
+
* its type or a scale id cannot be read, or the type is not built in (it may add others).
|
|
89
|
+
*/
|
|
90
|
+
export function addedScales(config) {
|
|
91
|
+
return (item) => {
|
|
92
|
+
const type = typeOf(config, item);
|
|
93
|
+
if (!type.known)
|
|
94
|
+
return undefined;
|
|
95
|
+
const axes = axesOfType(type.value);
|
|
96
|
+
if (axes === undefined)
|
|
97
|
+
return undefined;
|
|
98
|
+
const ids = axes.map((axis) => readFact(config, [...item.segments, `${axis}AxisID`], isString));
|
|
99
|
+
if (ids.some((id) => !id.known && id.reason !== 'unset'))
|
|
100
|
+
return undefined;
|
|
101
|
+
return axes.map((axis, index) => {
|
|
102
|
+
const id = ids[index];
|
|
103
|
+
return { id: id?.known === true && id.value !== '' ? id.value : axis, axis };
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Whether the dataset's values are stacked, from its value scale's `stacked`, else its own `stack`. */
|
|
108
|
+
function stackingOf(config, item, scale) {
|
|
109
|
+
if (!scale.known)
|
|
110
|
+
return unknown(`${item.path}.stack`, scale.reason);
|
|
111
|
+
const stacked = readFact(config, ['options', 'scales', scale.value, 'stacked'], isStaticValue);
|
|
112
|
+
if (stacked.known)
|
|
113
|
+
return { ...stacked, value: stacked.value === false ? 'none' : 'stacked' };
|
|
114
|
+
if (stacked.reason !== 'unset')
|
|
115
|
+
return stacked;
|
|
116
|
+
const stack = readFact(config, [...item.segments, 'stack'], isStaticValue);
|
|
117
|
+
if (stack.known)
|
|
118
|
+
return { ...stack, value: 'stacked' };
|
|
119
|
+
return stack.reason === 'unset'
|
|
120
|
+
? { known: true, value: 'none', path: stack.path, source: 'default', pointer: STACKED }
|
|
121
|
+
: stack;
|
|
122
|
+
}
|
|
123
|
+
const none = (item, reason) => ({
|
|
124
|
+
coordinateSystem: unknown(item.path, reason),
|
|
125
|
+
orientation: unknown(`${item.path}.indexAxis`, reason),
|
|
126
|
+
valueAxis: unknown(`${item.path}.yAxisID`, reason),
|
|
127
|
+
stacking: unknown(`${item.path}.stack`, reason)
|
|
128
|
+
});
|
|
129
|
+
function cartesianLayout(config, item, type, scales) {
|
|
130
|
+
const orientation = orientationOf(indexAxisOf(config, item, type.value));
|
|
131
|
+
const coordinateSystem = { ...type, value: 'cartesian' };
|
|
132
|
+
if (!orientation.known)
|
|
133
|
+
return { ...none(item, orientation.reason), coordinateSystem, orientation };
|
|
134
|
+
// The value axis is the one that is not the index axis (`axis = indexAxis === 'x' ? 'y' : 'x'`, dist/chart.js:5241).
|
|
135
|
+
const valueAxis = scaleOf(config, item, orientation.value === 'vertical' ? 'y' : 'x', scales);
|
|
136
|
+
return { coordinateSystem, orientation, valueAxis, stacking: stackingOf(config, item, valueAxis) };
|
|
137
|
+
}
|
|
138
|
+
function layoutOf(config, item, type, scales) {
|
|
139
|
+
if (!type.known)
|
|
140
|
+
return none(item, type.reason);
|
|
141
|
+
if (PIE.has(type.value))
|
|
142
|
+
return none(item, 'inapplicable');
|
|
143
|
+
if (RADIAL.has(type.value))
|
|
144
|
+
return {
|
|
145
|
+
...none(item, 'inapplicable'),
|
|
146
|
+
coordinateSystem: { ...type, value: 'polar' },
|
|
147
|
+
valueAxis: scaleOf(config, item, 'r', scales)
|
|
148
|
+
};
|
|
149
|
+
if (CARTESIAN[type.value] === undefined)
|
|
150
|
+
return none(item, 'unmodelled');
|
|
151
|
+
return cartesianLayout(config, item, type, scales);
|
|
152
|
+
}
|
|
153
|
+
/** A Chart.js colour does not depend on the colour scheme. */
|
|
154
|
+
const colors = (color) => ({
|
|
155
|
+
color,
|
|
156
|
+
shades: sameShades(color)
|
|
157
|
+
});
|
|
158
|
+
export function seriesOf(config, item, scales, colorsDefined) {
|
|
159
|
+
const type = typeOf(config, item);
|
|
160
|
+
const layout = layoutOf(config, item, type, scales);
|
|
161
|
+
const kind = kindOf(config, item, type);
|
|
162
|
+
return {
|
|
163
|
+
path: item.path,
|
|
164
|
+
type,
|
|
165
|
+
kind,
|
|
166
|
+
name: readFact(config, [...item.segments, 'label'], isString),
|
|
167
|
+
...layout,
|
|
168
|
+
base: baseOf(config, item, kind),
|
|
169
|
+
...colors(colorOf(config, item, type, colorsDefined)),
|
|
170
|
+
values: valuesOf(config, item, type, layout.orientation)
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=series.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"series.js","sourceRoot":"","sources":["../src/series.ts"],"names":[],"mappings":"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"}
|
package/dist/values.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Fact, type Item, type Orientation, type ValueSummary } from '@chartguard/quality-core';
|
|
2
|
+
/**
|
|
3
|
+
* The values of a dataset's `data`: numbers, gaps (`null`), or objects read by `objectKey`. A
|
|
4
|
+
* `parsing` option other than the default (custom keys, or `false` for pre-parsed data) is not read.
|
|
5
|
+
*/
|
|
6
|
+
export declare function valuesOf(config: unknown, item: Item, type: Fact<string>, orientation: Fact<Orientation>): Fact<ValueSummary>;
|
|
7
|
+
//# sourceMappingURL=values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,IAAI,EAIT,KAAK,IAAI,EAGT,KAAK,WAAW,EAIhB,KAAK,YAAY,EACjB,MAAM,0BAA0B,CAAC;AAelC;;;GAGG;AACH,wBAAgB,QAAQ,CACvB,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,GAC5B,IAAI,CAAC,YAAY,CAAC,CAkBpB"}
|