@graphysdk/viz-engine 0.0.1-plugins.2 → 0.0.1-plugins.4
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/dist/index.cjs +14 -13
- package/dist/index.d.ts +126 -18
- package/dist/index.mjs +2841 -2194
- package/package.json +3 -8
- package/dist/extensions.cjs +0 -1
- package/dist/extensions.d.ts +0 -1296
- package/dist/extensions.mjs +0 -86
- package/dist/geom.utils-BbMUNkrO.js +0 -556
- package/dist/geom.utils-DbZj1kY1.cjs +0 -1
package/dist/extensions.mjs
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { D as c } from "./geom.utils-BbMUNkrO.js";
|
|
2
|
-
import { b as k, a as y, e as T, r as M, s as $, v as C } from "./geom.utils-BbMUNkrO.js";
|
|
3
|
-
function f(o, t, e) {
|
|
4
|
-
const r = o[t];
|
|
5
|
-
return typeof r == "number" ? r : e ?? null;
|
|
6
|
-
}
|
|
7
|
-
function d(o, t, e) {
|
|
8
|
-
const r = o[t];
|
|
9
|
-
return typeof r == "string" ? r : e ?? null;
|
|
10
|
-
}
|
|
11
|
-
class u {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.columnTypes = /* @__PURE__ */ new Map(), this.kindColumns = /* @__PURE__ */ new Map(), this.rows = [];
|
|
14
|
-
}
|
|
15
|
-
/** Declares a mark kind and the columns it carries. Throws if the kind repeats or a column's type conflicts. */
|
|
16
|
-
kind(t, e) {
|
|
17
|
-
if (this.kindColumns.has(t))
|
|
18
|
-
throw new Error(`createMarkTable: kind "${t}" is already declared.`);
|
|
19
|
-
for (const [r, n] of Object.entries(e)) {
|
|
20
|
-
const s = this.columnTypes.get(r);
|
|
21
|
-
if (s !== void 0 && s !== n)
|
|
22
|
-
throw new Error(`createMarkTable: column "${r}" is declared as both "${s}" and "${n}".`);
|
|
23
|
-
this.columnTypes.set(r, n);
|
|
24
|
-
}
|
|
25
|
-
return this.kindColumns.set(t, Object.keys(e)), this;
|
|
26
|
-
}
|
|
27
|
-
/** Appends one row for a declared kind. Throws if the kind is unknown, or a value misses/overshoots the kind's columns. */
|
|
28
|
-
push(t, e) {
|
|
29
|
-
const r = this.kindColumns.get(t);
|
|
30
|
-
if (!r)
|
|
31
|
-
throw new Error(`createMarkTable: cannot push to undeclared kind "${t}".`);
|
|
32
|
-
for (const n of r)
|
|
33
|
-
if (!(n in e))
|
|
34
|
-
throw new Error(`createMarkTable: row for kind "${t}" is missing column "${n}".`);
|
|
35
|
-
for (const n of Object.keys(e))
|
|
36
|
-
if (!r.includes(n))
|
|
37
|
-
throw new Error(`createMarkTable: column "${n}" is not declared for kind "${t}".`);
|
|
38
|
-
return this.rows.push({ kind: t, values: e }), this;
|
|
39
|
-
}
|
|
40
|
-
/** Materialises the rows into a {@link Dataset}, null-padding every off-kind column. */
|
|
41
|
-
toDataset(t) {
|
|
42
|
-
const { kindColumn: e } = t;
|
|
43
|
-
if (this.columnTypes.has(e))
|
|
44
|
-
throw new Error(`createMarkTable: kindColumn "${e}" collides with a declared column.`);
|
|
45
|
-
const r = {
|
|
46
|
-
[e]: { type: "categorical", values: this.rows.map((n) => n.kind) }
|
|
47
|
-
};
|
|
48
|
-
for (const [n, s] of this.columnTypes)
|
|
49
|
-
r[n] = {
|
|
50
|
-
type: s,
|
|
51
|
-
values: this.rows.map((i) => {
|
|
52
|
-
const a = i.values[n];
|
|
53
|
-
return a === void 0 ? null : a;
|
|
54
|
-
})
|
|
55
|
-
};
|
|
56
|
-
return new c(r);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
function h() {
|
|
60
|
-
return new u();
|
|
61
|
-
}
|
|
62
|
-
function m(o) {
|
|
63
|
-
return {
|
|
64
|
-
type: o.type,
|
|
65
|
-
defaultParams: o.defaultParams ?? {},
|
|
66
|
-
coordinates: o.coordinates
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
function p(o, t, e, r, n) {
|
|
70
|
-
const s = e - t;
|
|
71
|
-
return s === 0 ? r : r + (o - t) / s * (n - r);
|
|
72
|
-
}
|
|
73
|
-
export {
|
|
74
|
-
c as Dataset,
|
|
75
|
-
k as Geom,
|
|
76
|
-
h as createMarkTable,
|
|
77
|
-
m as defineAnnotation,
|
|
78
|
-
y as extractConstantValue,
|
|
79
|
-
T as extractVariableName,
|
|
80
|
-
p as interpolateInScaledInterval,
|
|
81
|
-
M as readAesthetic,
|
|
82
|
-
f as readNumber,
|
|
83
|
-
d as readString,
|
|
84
|
-
$ as sortByXIfContinuous,
|
|
85
|
-
C as variableFor
|
|
86
|
-
};
|
|
@@ -1,556 +0,0 @@
|
|
|
1
|
-
import { table as g, desc as R, op as w } from "arquero";
|
|
2
|
-
import { isValid as I } from "date-fns";
|
|
3
|
-
import { isEqual as L } from "lodash-es";
|
|
4
|
-
const J = (a) => a.length > 0;
|
|
5
|
-
function S(a) {
|
|
6
|
-
return a != null;
|
|
7
|
-
}
|
|
8
|
-
function Q(a) {
|
|
9
|
-
if (a === null || typeof a != "object") return !1;
|
|
10
|
-
const t = Object.getPrototypeOf(a);
|
|
11
|
-
return t === Object.prototype || t === null;
|
|
12
|
-
}
|
|
13
|
-
function Z(a) {
|
|
14
|
-
return { type: "mapping", mapping: a };
|
|
15
|
-
}
|
|
16
|
-
function tt(a, t) {
|
|
17
|
-
return a[t];
|
|
18
|
-
}
|
|
19
|
-
function j(a) {
|
|
20
|
-
return S(a) ? typeof a == "string" ? a : "variable" in a ? a.variable : null : null;
|
|
21
|
-
}
|
|
22
|
-
function et(a) {
|
|
23
|
-
if (!(!S(a) || typeof a == "string") && "value" in a)
|
|
24
|
-
return a.value;
|
|
25
|
-
}
|
|
26
|
-
const F = "\0graphy\0_", c = (a) => `${F}${a}`, rt = {
|
|
27
|
-
x: c("constantX")
|
|
28
|
-
}, k = {
|
|
29
|
-
count: c("count"),
|
|
30
|
-
mean: c("mean")
|
|
31
|
-
}, C = {
|
|
32
|
-
group: c("group")
|
|
33
|
-
}, at = {
|
|
34
|
-
key: c("key")
|
|
35
|
-
}, h = {
|
|
36
|
-
x: c("x"),
|
|
37
|
-
y: c("y"),
|
|
38
|
-
xMin: c("xMin"),
|
|
39
|
-
xMax: c("xMax"),
|
|
40
|
-
yMin: c("yMin"),
|
|
41
|
-
yMax: c("yMax"),
|
|
42
|
-
yRaw: c("yRaw")
|
|
43
|
-
}, $ = {
|
|
44
|
-
color: c("color"),
|
|
45
|
-
size: c("size"),
|
|
46
|
-
alpha: c("alpha"),
|
|
47
|
-
strokeWidth: c("strokeWidth"),
|
|
48
|
-
lineType: c("lineType")
|
|
49
|
-
}, nt = {
|
|
50
|
-
y: c("ruleY"),
|
|
51
|
-
x: c("ruleX")
|
|
52
|
-
};
|
|
53
|
-
({
|
|
54
|
-
...C,
|
|
55
|
-
...h,
|
|
56
|
-
...$
|
|
57
|
-
});
|
|
58
|
-
const z = new Set(Object.values(k)), ot = (a) => a.startsWith(F), st = (a) => z.has(a), B = {
|
|
59
|
-
x: { point: h.x, lower: h.xMin, upper: h.xMax },
|
|
60
|
-
y: { point: h.y, lower: h.yMin, upper: h.yMax }
|
|
61
|
-
}, A = ["point", "lower", "upper"];
|
|
62
|
-
function P(a) {
|
|
63
|
-
return a.name ?? a.role;
|
|
64
|
-
}
|
|
65
|
-
function E(a, t) {
|
|
66
|
-
return B[a][t] ?? c(`${a}_${t}`);
|
|
67
|
-
}
|
|
68
|
-
function it(a) {
|
|
69
|
-
const t = [];
|
|
70
|
-
for (const e of a) {
|
|
71
|
-
const r = P(e);
|
|
72
|
-
t.includes(r) || t.push(r);
|
|
73
|
-
}
|
|
74
|
-
return t.sort((e, r) => T(e) - T(r)), t.map((e) => [E("x", e), E("y", e)]);
|
|
75
|
-
}
|
|
76
|
-
function T(a) {
|
|
77
|
-
const t = A.indexOf(a);
|
|
78
|
-
return t === -1 ? A.length : t;
|
|
79
|
-
}
|
|
80
|
-
const U = /* @__PURE__ */ new Set(["count", "sum", "mean", "median"]);
|
|
81
|
-
function x(a, t) {
|
|
82
|
-
return U.has(a) ? "numeric" : t;
|
|
83
|
-
}
|
|
84
|
-
const N = (a) => (Array.isArray(a) ? a : [a]).map((e) => e instanceof Date ? e.toISOString() : String(e ?? "<null>")).join("\0"), G = "key", K = "value", V = "\0__rowMaskIndex", v = {
|
|
85
|
-
numeric: { type: "decimal" },
|
|
86
|
-
categorical: { type: "text" },
|
|
87
|
-
temporal: { type: "datetime" }
|
|
88
|
-
}, W = {
|
|
89
|
-
eq: (a, t) => a[t.__variableName] === t.__value,
|
|
90
|
-
neq: (a, t) => a[t.__variableName] !== t.__value,
|
|
91
|
-
// @ts-expect-error — Arquero table expression; TS can't verify the comparison types
|
|
92
|
-
gt: (a, t) => a[t.__variableName] > t.__value,
|
|
93
|
-
// @ts-expect-error — Arquero table expression; TS can't verify the comparison types
|
|
94
|
-
gte: (a, t) => a[t.__variableName] >= t.__value,
|
|
95
|
-
// @ts-expect-error — Arquero table expression; TS can't verify the comparison types
|
|
96
|
-
lt: (a, t) => a[t.__variableName] < t.__value,
|
|
97
|
-
// @ts-expect-error — Arquero table expression; TS can't verify the comparison types
|
|
98
|
-
lte: (a, t) => a[t.__variableName] <= t.__value
|
|
99
|
-
}, O = (a, t) => a === "count" ? { type: "integer" } : t;
|
|
100
|
-
class u {
|
|
101
|
-
/**
|
|
102
|
-
* Constructs a new dataset from typed columnar input.
|
|
103
|
-
* @param variables - A record mapping variable names to their type and values.
|
|
104
|
-
*
|
|
105
|
-
* @example
|
|
106
|
-
* const data = new Dataset({
|
|
107
|
-
* age: { type: 'numeric', values: [25, 30, 35] },
|
|
108
|
-
* name: { type: 'categorical', values: ['John', 'Jane', 'Jim'] },
|
|
109
|
-
* });
|
|
110
|
-
*/
|
|
111
|
-
constructor(t = {}) {
|
|
112
|
-
const { table: e, variableMetadata: r } = this.parseVariableMap(t);
|
|
113
|
-
this.table = e, this.variableMetadata = r;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Creates a new dataset, without parsing the input. This method exists for performance reasons.
|
|
117
|
-
* @internal
|
|
118
|
-
*/
|
|
119
|
-
static fromTrusted(t, e) {
|
|
120
|
-
const r = Object.create(u.prototype);
|
|
121
|
-
return r.table = t, r.variableMetadata = e, r;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Returns the number of observations in the dataset.
|
|
125
|
-
*/
|
|
126
|
-
size() {
|
|
127
|
-
return this.table.numRows();
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Returns the names of all variables in the dataset.
|
|
131
|
-
*/
|
|
132
|
-
getVariableNames() {
|
|
133
|
-
return this.table.columnNames();
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Returns true if the dataset has the given variable.
|
|
137
|
-
*/
|
|
138
|
-
hasVariable(t) {
|
|
139
|
-
return this.table.column(t) !== void 0;
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Adds a new variable to the dataset. The variable's `valueFormat` is resolved in this order:
|
|
143
|
-
* 1. explicit `valueFormat` argument,
|
|
144
|
-
* 2. the existing variable's format (when overwriting an existing variable — e.g. a stack
|
|
145
|
-
* position adjuster rewriting the user's y),
|
|
146
|
-
* 3. a type-based default (`numeric → decimal`, `categorical → text`, `temporal → date`).
|
|
147
|
-
*/
|
|
148
|
-
addVariable(t, e, r, n) {
|
|
149
|
-
const o = {
|
|
150
|
-
...this.variableMetadata,
|
|
151
|
-
[t]: { type: e, valueFormat: this.resolveAddedVariableFormat(t, e, n) }
|
|
152
|
-
}, s = this.normalizeRawValues(e, r), i = this.table.assign(g({ [t]: s }));
|
|
153
|
-
return u.fromTrusted(i, o);
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Adds a new constant variable to the dataset. Format resolution follows {@link addVariable}.
|
|
157
|
-
*/
|
|
158
|
-
addConstantVariable(t, e, r, n) {
|
|
159
|
-
const o = {
|
|
160
|
-
...this.variableMetadata,
|
|
161
|
-
[t]: { type: e, valueFormat: this.resolveAddedVariableFormat(t, e, n) }
|
|
162
|
-
}, [s] = this.normalizeRawValues(e, [r]), i = this.table.assign(g({ [t]: Array(this.size()).fill(s) }));
|
|
163
|
-
return u.fromTrusted(i, o);
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Derives a new variable based on existing variables, using a table expression. If `valueFormat`
|
|
167
|
-
* is omitted, a type-based default is used.
|
|
168
|
-
*/
|
|
169
|
-
deriveVariable(t, e, r, n) {
|
|
170
|
-
const o = Array.from({ length: this.size() }, (s, i) => r(this.table.object(i), i));
|
|
171
|
-
return this.addVariable(t, e, o, n);
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Renames a variable.
|
|
175
|
-
*/
|
|
176
|
-
renameVariable(t, e) {
|
|
177
|
-
const r = this.variableMetadata[t];
|
|
178
|
-
if (!r)
|
|
179
|
-
throw new Error(`Variable ${t} not defined`);
|
|
180
|
-
const n = this.table.rename({ [t]: e }), { [t]: o, ...s } = this.variableMetadata, i = { ...s, [e]: r };
|
|
181
|
-
return u.fromTrusted(n, i);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Selects a subset of variables from the dataset.
|
|
185
|
-
*/
|
|
186
|
-
selectVariables(...t) {
|
|
187
|
-
const e = this.table.select(...t), r = Object.fromEntries(
|
|
188
|
-
Object.entries(this.variableMetadata).filter(([n]) => t.includes(n))
|
|
189
|
-
);
|
|
190
|
-
return u.fromTrusted(e, r);
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Returns the type of a variable.
|
|
194
|
-
*/
|
|
195
|
-
getType(t) {
|
|
196
|
-
const e = this.variableMetadata[t];
|
|
197
|
-
if (!e)
|
|
198
|
-
throw new Error(`Variable ${t} not defined`);
|
|
199
|
-
return e.type;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Returns the value format of a variable. Every variable carries a format — either explicitly
|
|
203
|
-
* supplied at construction (via `Variable.valueFormat` or an `addVariable`-family `valueFormat`
|
|
204
|
-
* argument) or a type-based default.
|
|
205
|
-
*/
|
|
206
|
-
getValueFormat(t) {
|
|
207
|
-
const e = this.variableMetadata[t];
|
|
208
|
-
if (!e)
|
|
209
|
-
throw new Error(`Variable ${t} not defined`);
|
|
210
|
-
return e.valueFormat;
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Groups the variable names by their type.
|
|
214
|
-
*/
|
|
215
|
-
groupVariableNamesByType() {
|
|
216
|
-
const t = {
|
|
217
|
-
numeric: [],
|
|
218
|
-
categorical: [],
|
|
219
|
-
temporal: []
|
|
220
|
-
};
|
|
221
|
-
for (const [e, { type: r }] of Object.entries(this.variableMetadata))
|
|
222
|
-
t[r].push(e);
|
|
223
|
-
return t;
|
|
224
|
-
}
|
|
225
|
-
getValues(t, e) {
|
|
226
|
-
if (!this.hasVariable(t))
|
|
227
|
-
throw new Error(`Variable '${t}' not defined`);
|
|
228
|
-
const r = this.getType(t);
|
|
229
|
-
if (e?.type !== void 0 && r !== e.type)
|
|
230
|
-
throw new Error(`Variable '${t}' has type '${r}', expected '${e.type}'`);
|
|
231
|
-
let n = this.table.array(t);
|
|
232
|
-
return e?.distinct && (n = this.getDistinctValues(r, n)), e?.skipNulls && (n = this.skipNulls(n)), n;
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Filters the dataset using a declarative predicate.
|
|
236
|
-
*/
|
|
237
|
-
filter(t, e, r) {
|
|
238
|
-
const n = W[e], o = this.table.params({ __variableName: t, __value: r }).filter(n);
|
|
239
|
-
return u.fromTrusted(o, this.variableMetadata);
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Returns a dataset filtered to rows where `mask[i] === 1`. Underlying column
|
|
243
|
-
* storage is shared with the parent — values are not copied. The mask length
|
|
244
|
-
* must equal `size()`.
|
|
245
|
-
*/
|
|
246
|
-
filterByMask(t) {
|
|
247
|
-
if (t.length !== this.size())
|
|
248
|
-
throw new Error(`Row mask length ${t.length} does not match dataset size ${this.size()}`);
|
|
249
|
-
const e = Array.from({ length: t.length }, (n, o) => o), r = this.table.assign(g({ [V]: e })).params({ __indexColumnName: V, __mask: t }).filter((n, o) => o.__mask[n[o.__indexColumnName]] === 1).select(...this.table.columnNames());
|
|
250
|
-
return u.fromTrusted(r, this.variableMetadata);
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Orders the dataset by a variable, in ascending (default) or descending order.
|
|
254
|
-
*/
|
|
255
|
-
orderBy(t, e = "asc") {
|
|
256
|
-
const r = this.table.orderby(e === "asc" ? t : R(t));
|
|
257
|
-
return u.fromTrusted(r, this.variableMetadata);
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Returns the first observation in the dataset.
|
|
261
|
-
*/
|
|
262
|
-
getFirst() {
|
|
263
|
-
return this.size() === 0 ? null : this.table.object(0);
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Returns the last observation in the dataset.
|
|
267
|
-
*/
|
|
268
|
-
getLast() {
|
|
269
|
-
return this.size() === 0 ? null : this.table.object(this.size() - 1);
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Returns the last observation matching a predicate, scanning backwards from the end.
|
|
273
|
-
*/
|
|
274
|
-
findLast(t) {
|
|
275
|
-
for (let e = this.size() - 1; e >= 0; e--) {
|
|
276
|
-
const r = this.table.object(e);
|
|
277
|
-
if (t(r)) return r;
|
|
278
|
-
}
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Groups the dataset by one or more variables.
|
|
283
|
-
*/
|
|
284
|
-
groupBy(...t) {
|
|
285
|
-
const e = this.table.groupby(...t);
|
|
286
|
-
return new X(t, e, this.variableMetadata);
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Aggregates the dataset.
|
|
290
|
-
*/
|
|
291
|
-
rollup(t) {
|
|
292
|
-
const e = this.table.rollup(
|
|
293
|
-
Object.fromEntries(
|
|
294
|
-
Object.entries(t).map(([n, o]) => [
|
|
295
|
-
n,
|
|
296
|
-
w[o.aggregation](o.variableName)
|
|
297
|
-
])
|
|
298
|
-
)
|
|
299
|
-
), r = {};
|
|
300
|
-
for (const [n, { variableName: o, aggregation: s }] of Object.entries(t)) {
|
|
301
|
-
const i = this.variableMetadata[o], l = i?.type ?? "numeric", p = i?.valueFormat ?? v[l], d = x(s, l);
|
|
302
|
-
r[n] = { type: d, valueFormat: O(s, p) };
|
|
303
|
-
}
|
|
304
|
-
return u.fromTrusted(e, r);
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Reshapes data from wide to long format by collapsing multiple numeric variables
|
|
308
|
-
* into key–value pairs.
|
|
309
|
-
*
|
|
310
|
-
* ```
|
|
311
|
-
* ┌─────────┬──────┬──────┬──────┐ ┌─────────┬──────┬─────┐
|
|
312
|
-
* │ country │ 2020 │ 2021 │ 2022 │ │ country │ year │ gdp │
|
|
313
|
-
* ├─────────┼──────┼──────┼──────┤ ───► ├─────────┼──────┼─────┤
|
|
314
|
-
* │ US │ 100 │ 110 │ 120 │ │ US │ 2020 │ 100 │
|
|
315
|
-
* │ UK │ 200 │ 210 │ 220 │ │ US │ 2021 │ 110 │
|
|
316
|
-
* └─────────┴──────┴──────┴──────┘ │ US │ 2022 │ 120 │
|
|
317
|
-
* │ UK │ 2020 │ 200 │
|
|
318
|
-
* │ UK │ 2021 │ 210 │
|
|
319
|
-
* │ UK │ 2022 │ 220 │
|
|
320
|
-
* └─────────┴──────┴─────┘
|
|
321
|
-
* ```
|
|
322
|
-
*
|
|
323
|
-
* @param keep - Variables to carry through unchanged. Defaults to all
|
|
324
|
-
* categorical and temporal variables.
|
|
325
|
-
* @param reshape - Numeric variables to collapse into rows. Defaults to all
|
|
326
|
-
* numeric variables.
|
|
327
|
-
* @param keyName - Name of the new variable whose values are the
|
|
328
|
-
* original variable names (default: 'key').
|
|
329
|
-
* @param valueName - Name of the new variable whose values are the
|
|
330
|
-
* original values of the variables to reshape (default: 'value').
|
|
331
|
-
* @throws If `keyName` or `valueName` conflicts with a variable in `keep`.
|
|
332
|
-
* @throws If any variable in `reshape` is not numeric.
|
|
333
|
-
*
|
|
334
|
-
* @example
|
|
335
|
-
* const reshaped = data.reshapeFromWideToLong({
|
|
336
|
-
* keep: ['country'],
|
|
337
|
-
* reshape: ['2020', '2021'],
|
|
338
|
-
* keyName: 'year',
|
|
339
|
-
* valueName: 'gdp',
|
|
340
|
-
* });
|
|
341
|
-
*/
|
|
342
|
-
reshapeFromWideToLong({
|
|
343
|
-
keep: t,
|
|
344
|
-
reshape: e,
|
|
345
|
-
keyName: r = G,
|
|
346
|
-
valueName: n = K
|
|
347
|
-
} = {}) {
|
|
348
|
-
const { numeric: o, categorical: s, temporal: i } = this.groupVariableNamesByType(), l = t ?? [...s, ...i], p = e ?? o.filter((m) => !l.includes(m));
|
|
349
|
-
if (l.includes(r) || l.includes(n))
|
|
350
|
-
throw new Error(
|
|
351
|
-
`The variables to keep includes the variables '${r}' or '${n}' to create the key and value variables`
|
|
352
|
-
);
|
|
353
|
-
if (p.length === 0) {
|
|
354
|
-
const m = {};
|
|
355
|
-
for (const y of l) {
|
|
356
|
-
const M = this.variableMetadata[y];
|
|
357
|
-
M && (m[y] = { type: M.type, values: [], valueFormat: M.valueFormat });
|
|
358
|
-
}
|
|
359
|
-
return m[r] = { type: "categorical", values: [], valueFormat: { type: "text" } }, m[n] = { type: "numeric", values: [], valueFormat: { type: "decimal" } }, new u(m);
|
|
360
|
-
}
|
|
361
|
-
if (p.filter((m) => this.variableMetadata[m]?.type !== "numeric").length > 0)
|
|
362
|
-
throw new Error("Only numeric variables can be reshaped");
|
|
363
|
-
const _ = this.table.select([...l, ...p]).fold(p, { as: [r, n] }), b = {};
|
|
364
|
-
for (const m of l) {
|
|
365
|
-
const y = this.variableMetadata[m];
|
|
366
|
-
y && (b[m] = y);
|
|
367
|
-
}
|
|
368
|
-
return b[r] = { type: "categorical", valueFormat: { type: "text" } }, b[n] = {
|
|
369
|
-
type: "numeric",
|
|
370
|
-
valueFormat: q(this.variableMetadata, p, r)
|
|
371
|
-
}, u.fromTrusted(_, b);
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* Prints the dataset to the console.
|
|
375
|
-
*/
|
|
376
|
-
print() {
|
|
377
|
-
console.table(this.variableMetadata), this.table.print();
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Returns an iterator over the observations in the dataset.
|
|
381
|
-
*/
|
|
382
|
-
[Symbol.iterator]() {
|
|
383
|
-
return this.table[Symbol.iterator]();
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Resolves a freshly-added variable's `valueFormat`: explicit > existing (overwrite) > type-default.
|
|
387
|
-
*/
|
|
388
|
-
resolveAddedVariableFormat(t, e, r) {
|
|
389
|
-
if (r !== void 0) return r;
|
|
390
|
-
const n = this.variableMetadata[t];
|
|
391
|
-
return n ? n.valueFormat : v[e];
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Parses the variable map into a table and variable metadata.
|
|
395
|
-
*/
|
|
396
|
-
parseVariableMap(t) {
|
|
397
|
-
const e = {}, r = {};
|
|
398
|
-
for (const [o, { type: s, values: i, valueFormat: l }] of Object.entries(t))
|
|
399
|
-
e[o] = i, r[o] = { type: s, valueFormat: l ?? v[s] };
|
|
400
|
-
return { table: g(e), variableMetadata: r };
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Normalizes raw values into typed values.
|
|
404
|
-
*/
|
|
405
|
-
normalizeRawValues(t, e) {
|
|
406
|
-
switch (t) {
|
|
407
|
-
case "numeric":
|
|
408
|
-
return e.map((r) => typeof r != "number" || Number.isNaN(r) ? null : r);
|
|
409
|
-
case "categorical":
|
|
410
|
-
return e.map((r) => typeof r != "string" ? null : r);
|
|
411
|
-
case "temporal":
|
|
412
|
-
return e.map((r) => !(r instanceof Date) || !I(r) ? null : r);
|
|
413
|
-
default: {
|
|
414
|
-
const r = t;
|
|
415
|
-
throw new Error(`Cannot normalize raw value of unknown type: ${r}`);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* Skips nulls when retrieving values from a variable.
|
|
421
|
-
*/
|
|
422
|
-
skipNulls(t) {
|
|
423
|
-
return t.filter((e) => e !== null);
|
|
424
|
-
}
|
|
425
|
-
/**
|
|
426
|
-
* Returns distinct values.
|
|
427
|
-
*/
|
|
428
|
-
getDistinctValues(t, e) {
|
|
429
|
-
const r = t === "temporal", n = /* @__PURE__ */ new Set(), o = [];
|
|
430
|
-
for (const s of e) {
|
|
431
|
-
const i = r && s instanceof Date ? s.getTime() : s;
|
|
432
|
-
n.has(i) || (n.add(i), o.push(s));
|
|
433
|
-
}
|
|
434
|
-
return o;
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
class X {
|
|
438
|
-
constructor(t, e, r) {
|
|
439
|
-
this.groupedBy = t, this.grouped = e, this.variableMetadata = r;
|
|
440
|
-
}
|
|
441
|
-
/**
|
|
442
|
-
* Iterates over each group.
|
|
443
|
-
*/
|
|
444
|
-
forEach(t) {
|
|
445
|
-
const e = this.grouped.partitions(), r = this.grouped.columnNames(), n = this.groupedBy.map((s) => this.grouped.column(s)).filter((s) => s !== void 0);
|
|
446
|
-
let o = 0;
|
|
447
|
-
for (const s of e) {
|
|
448
|
-
const i = s[0];
|
|
449
|
-
if (i === void 0) continue;
|
|
450
|
-
const l = this.getStableKey(n, i), p = Object.fromEntries(
|
|
451
|
-
r.map((f) => {
|
|
452
|
-
const _ = this.grouped.column(f);
|
|
453
|
-
return [f, s.map((b) => _?.get(b))];
|
|
454
|
-
})
|
|
455
|
-
), d = g(p);
|
|
456
|
-
t(u.fromTrusted(d, this.variableMetadata), l, o++);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Aggregates the variables in each group.
|
|
461
|
-
*/
|
|
462
|
-
rollup(t) {
|
|
463
|
-
const e = this.grouped.rollup(
|
|
464
|
-
Object.fromEntries(
|
|
465
|
-
Object.entries(t).map(([n, o]) => [
|
|
466
|
-
n,
|
|
467
|
-
w[o.aggregation](o.variableName)
|
|
468
|
-
])
|
|
469
|
-
)
|
|
470
|
-
), r = Object.fromEntries(
|
|
471
|
-
this.groupedBy.map((n) => {
|
|
472
|
-
const o = this.variableMetadata[n], s = o?.type ?? "categorical", i = o?.valueFormat ?? v[s];
|
|
473
|
-
return [n, { type: s, valueFormat: i }];
|
|
474
|
-
})
|
|
475
|
-
);
|
|
476
|
-
for (const [n, { variableName: o, aggregation: s }] of Object.entries(t)) {
|
|
477
|
-
const i = this.variableMetadata[o], l = i?.type ?? "numeric", p = i?.valueFormat ?? v[l], d = x(s, l);
|
|
478
|
-
r[n] = { type: d, valueFormat: O(s, p) };
|
|
479
|
-
}
|
|
480
|
-
return u.fromTrusted(e, r);
|
|
481
|
-
}
|
|
482
|
-
/**
|
|
483
|
-
* Computes the group key based on the first value of the grouped variable. If multiple variables are grouped, returns a composite key.
|
|
484
|
-
*/
|
|
485
|
-
getStableKey(t, e) {
|
|
486
|
-
return N(t.map((r) => r.get(e)));
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
function q(a, t, e) {
|
|
490
|
-
const r = t.map((l) => a[l]?.valueFormat ?? { type: "decimal" }), [n, ...o] = r;
|
|
491
|
-
if (!n) return { type: "decimal" };
|
|
492
|
-
for (const l of r)
|
|
493
|
-
if (l.type === "lookup")
|
|
494
|
-
throw new Error("Cannot reshape: a source column has a lookup format and lookups cannot nest");
|
|
495
|
-
if (o.every((l) => L(l, n)) || n.type === "lookup") return n;
|
|
496
|
-
const i = {};
|
|
497
|
-
for (const [l, p] of t.entries()) {
|
|
498
|
-
const d = N([p]), f = r[l];
|
|
499
|
-
f && f.type !== "lookup" && (i[d] = f);
|
|
500
|
-
}
|
|
501
|
-
return {
|
|
502
|
-
type: "lookup",
|
|
503
|
-
byVariable: e,
|
|
504
|
-
cases: i,
|
|
505
|
-
fallback: n
|
|
506
|
-
};
|
|
507
|
-
}
|
|
508
|
-
class lt {
|
|
509
|
-
constructor() {
|
|
510
|
-
this.requiredAesthetics = [], this.defaultParams = {}, this.positionChannels = [], this.visualAesthetics = [
|
|
511
|
-
"color",
|
|
512
|
-
"size",
|
|
513
|
-
"alpha",
|
|
514
|
-
"strokeWidth",
|
|
515
|
-
"lineType"
|
|
516
|
-
], this.swatchShape = "square", this.highlightStrategy = null, this.spatialKind = "noop", this.directLabelPositions = [], this.gridPolicies = {}, this.identityKeyStrategy = "fields", this.supportedCoordTypes = ["cartesian", "flip", "polar"], this.emitsGrandTotal = !1, this.emitsStackTotals = !1, this.supportsPerGroupHeadline = !1;
|
|
517
|
-
}
|
|
518
|
-
/**
|
|
519
|
-
* Where an annotation anchored to the given observation sits, in normalised panel space, or `null`
|
|
520
|
-
* when this geom does not support anchoring (the default). The annotations compiler resolves anchors
|
|
521
|
-
* through this method rather than branching on geom name; the returned `geom` discriminant tells the
|
|
522
|
-
* renderer how to place the annotation.
|
|
523
|
-
*/
|
|
524
|
-
resolveAnchorPosition(t, e) {
|
|
525
|
-
return null;
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
const ct = (a, t) => {
|
|
529
|
-
const e = j(t.x);
|
|
530
|
-
return !e || !["numeric", "temporal"].includes(a.getType(e)) ? a : a.orderBy(e, "asc");
|
|
531
|
-
};
|
|
532
|
-
export {
|
|
533
|
-
rt as C,
|
|
534
|
-
u as D,
|
|
535
|
-
C as G,
|
|
536
|
-
at as I,
|
|
537
|
-
h as P,
|
|
538
|
-
nt as R,
|
|
539
|
-
k as S,
|
|
540
|
-
$ as V,
|
|
541
|
-
et as a,
|
|
542
|
-
lt as b,
|
|
543
|
-
S as c,
|
|
544
|
-
it as d,
|
|
545
|
-
j as e,
|
|
546
|
-
st as f,
|
|
547
|
-
N as g,
|
|
548
|
-
ot as h,
|
|
549
|
-
Q as i,
|
|
550
|
-
J as j,
|
|
551
|
-
Z as m,
|
|
552
|
-
c as p,
|
|
553
|
-
tt as r,
|
|
554
|
-
ct as s,
|
|
555
|
-
E as v
|
|
556
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const b=require("arquero"),B=require("date-fns"),j=require("lodash-es"),C=a=>a.length>0;function V(a){return a!=null}function P(a){if(a===null||typeof a!="object")return!1;const t=Object.getPrototypeOf(a);return t===Object.prototype||t===null}function k(a){return{type:"mapping",mapping:a}}function z(a,t){return a[t]}function w(a){return V(a)?typeof a=="string"?a:"variable"in a?a.variable:null:null}function U(a){if(!(!V(a)||typeof a=="string")&&"value"in a)return a.value}const F="\0graphy\0_",c=a=>`${F}${a}`,$={x:c("constantX")},N={count:c("count"),mean:c("mean")},R={group:c("group")},G={key:c("key")},h={x:c("x"),y:c("y"),xMin:c("xMin"),xMax:c("xMax"),yMin:c("yMin"),yMax:c("yMax"),yRaw:c("yRaw")},x={color:c("color"),size:c("size"),alpha:c("alpha"),strokeWidth:c("strokeWidth"),lineType:c("lineType")},K={y:c("ruleY"),x:c("ruleX")};({...R,...h,...x});const q=new Set(Object.values(N)),W=a=>a.startsWith(F),X=a=>q.has(a),D={x:{point:h.x,lower:h.xMin,upper:h.xMax},y:{point:h.y,lower:h.yMin,upper:h.yMax}},M=["point","lower","upper"];function Y(a){return a.name??a.role}function E(a,t){return D[a][t]??c(`${a}_${t}`)}function H(a){const t=[];for(const e of a){const r=Y(e);t.includes(r)||t.push(r)}return t.sort((e,r)=>S(e)-S(r)),t.map(e=>[E("x",e),E("y",e)])}function S(a){const t=M.indexOf(a);return t===-1?M.length:t}const J=new Set(["count","sum","mean","median"]);function O(a,t){return J.has(a)?"numeric":t}const T=a=>(Array.isArray(a)?a:[a]).map(e=>e instanceof Date?e.toISOString():String(e??"<null>")).join("\0"),Q="key",Z="value",I="\0__rowMaskIndex",v={numeric:{type:"decimal"},categorical:{type:"text"},temporal:{type:"datetime"}},tt={eq:(a,t)=>a[t.__variableName]===t.__value,neq:(a,t)=>a[t.__variableName]!==t.__value,gt:(a,t)=>a[t.__variableName]>t.__value,gte:(a,t)=>a[t.__variableName]>=t.__value,lt:(a,t)=>a[t.__variableName]<t.__value,lte:(a,t)=>a[t.__variableName]<=t.__value},L=(a,t)=>a==="count"?{type:"integer"}:t;class u{constructor(t={}){const{table:e,variableMetadata:r}=this.parseVariableMap(t);this.table=e,this.variableMetadata=r}static fromTrusted(t,e){const r=Object.create(u.prototype);return r.table=t,r.variableMetadata=e,r}size(){return this.table.numRows()}getVariableNames(){return this.table.columnNames()}hasVariable(t){return this.table.column(t)!==void 0}addVariable(t,e,r,n){const o={...this.variableMetadata,[t]:{type:e,valueFormat:this.resolveAddedVariableFormat(t,e,n)}},i=this.normalizeRawValues(e,r),s=this.table.assign(b.table({[t]:i}));return u.fromTrusted(s,o)}addConstantVariable(t,e,r,n){const o={...this.variableMetadata,[t]:{type:e,valueFormat:this.resolveAddedVariableFormat(t,e,n)}},[i]=this.normalizeRawValues(e,[r]),s=this.table.assign(b.table({[t]:Array(this.size()).fill(i)}));return u.fromTrusted(s,o)}deriveVariable(t,e,r,n){const o=Array.from({length:this.size()},(i,s)=>r(this.table.object(s),s));return this.addVariable(t,e,o,n)}renameVariable(t,e){const r=this.variableMetadata[t];if(!r)throw new Error(`Variable ${t} not defined`);const n=this.table.rename({[t]:e}),{[t]:o,...i}=this.variableMetadata,s={...i,[e]:r};return u.fromTrusted(n,s)}selectVariables(...t){const e=this.table.select(...t),r=Object.fromEntries(Object.entries(this.variableMetadata).filter(([n])=>t.includes(n)));return u.fromTrusted(e,r)}getType(t){const e=this.variableMetadata[t];if(!e)throw new Error(`Variable ${t} not defined`);return e.type}getValueFormat(t){const e=this.variableMetadata[t];if(!e)throw new Error(`Variable ${t} not defined`);return e.valueFormat}groupVariableNamesByType(){const t={numeric:[],categorical:[],temporal:[]};for(const[e,{type:r}]of Object.entries(this.variableMetadata))t[r].push(e);return t}getValues(t,e){if(!this.hasVariable(t))throw new Error(`Variable '${t}' not defined`);const r=this.getType(t);if(e?.type!==void 0&&r!==e.type)throw new Error(`Variable '${t}' has type '${r}', expected '${e.type}'`);let n=this.table.array(t);return e?.distinct&&(n=this.getDistinctValues(r,n)),e?.skipNulls&&(n=this.skipNulls(n)),n}filter(t,e,r){const n=tt[e],o=this.table.params({__variableName:t,__value:r}).filter(n);return u.fromTrusted(o,this.variableMetadata)}filterByMask(t){if(t.length!==this.size())throw new Error(`Row mask length ${t.length} does not match dataset size ${this.size()}`);const e=Array.from({length:t.length},(n,o)=>o),r=this.table.assign(b.table({[I]:e})).params({__indexColumnName:I,__mask:t}).filter((n,o)=>o.__mask[n[o.__indexColumnName]]===1).select(...this.table.columnNames());return u.fromTrusted(r,this.variableMetadata)}orderBy(t,e="asc"){const r=this.table.orderby(e==="asc"?t:b.desc(t));return u.fromTrusted(r,this.variableMetadata)}getFirst(){return this.size()===0?null:this.table.object(0)}getLast(){return this.size()===0?null:this.table.object(this.size()-1)}findLast(t){for(let e=this.size()-1;e>=0;e--){const r=this.table.object(e);if(t(r))return r}return null}groupBy(...t){const e=this.table.groupby(...t);return new et(t,e,this.variableMetadata)}rollup(t){const e=this.table.rollup(Object.fromEntries(Object.entries(t).map(([n,o])=>[n,b.op[o.aggregation](o.variableName)]))),r={};for(const[n,{variableName:o,aggregation:i}]of Object.entries(t)){const s=this.variableMetadata[o],l=s?.type??"numeric",d=s?.valueFormat??v[l],m=O(i,l);r[n]={type:m,valueFormat:L(i,d)}}return u.fromTrusted(e,r)}reshapeFromWideToLong({keep:t,reshape:e,keyName:r=Q,valueName:n=Z}={}){const{numeric:o,categorical:i,temporal:s}=this.groupVariableNamesByType(),l=t??[...i,...s],d=e??o.filter(p=>!l.includes(p));if(l.includes(r)||l.includes(n))throw new Error(`The variables to keep includes the variables '${r}' or '${n}' to create the key and value variables`);if(d.length===0){const p={};for(const g of l){const _=this.variableMetadata[g];_&&(p[g]={type:_.type,values:[],valueFormat:_.valueFormat})}return p[r]={type:"categorical",values:[],valueFormat:{type:"text"}},p[n]={type:"numeric",values:[],valueFormat:{type:"decimal"}},new u(p)}if(d.filter(p=>this.variableMetadata[p]?.type!=="numeric").length>0)throw new Error("Only numeric variables can be reshaped");const A=this.table.select([...l,...d]).fold(d,{as:[r,n]}),y={};for(const p of l){const g=this.variableMetadata[p];g&&(y[p]=g)}return y[r]={type:"categorical",valueFormat:{type:"text"}},y[n]={type:"numeric",valueFormat:rt(this.variableMetadata,d,r)},u.fromTrusted(A,y)}print(){console.table(this.variableMetadata),this.table.print()}[Symbol.iterator](){return this.table[Symbol.iterator]()}resolveAddedVariableFormat(t,e,r){if(r!==void 0)return r;const n=this.variableMetadata[t];return n?n.valueFormat:v[e]}parseVariableMap(t){const e={},r={};for(const[o,{type:i,values:s,valueFormat:l}]of Object.entries(t))e[o]=s,r[o]={type:i,valueFormat:l??v[i]};return{table:b.table(e),variableMetadata:r}}normalizeRawValues(t,e){switch(t){case"numeric":return e.map(r=>typeof r!="number"||Number.isNaN(r)?null:r);case"categorical":return e.map(r=>typeof r!="string"?null:r);case"temporal":return e.map(r=>!(r instanceof Date)||!B.isValid(r)?null:r);default:{const r=t;throw new Error(`Cannot normalize raw value of unknown type: ${r}`)}}}skipNulls(t){return t.filter(e=>e!==null)}getDistinctValues(t,e){const r=t==="temporal",n=new Set,o=[];for(const i of e){const s=r&&i instanceof Date?i.getTime():i;n.has(s)||(n.add(s),o.push(i))}return o}}class et{constructor(t,e,r){this.groupedBy=t,this.grouped=e,this.variableMetadata=r}forEach(t){const e=this.grouped.partitions(),r=this.grouped.columnNames(),n=this.groupedBy.map(i=>this.grouped.column(i)).filter(i=>i!==void 0);let o=0;for(const i of e){const s=i[0];if(s===void 0)continue;const l=this.getStableKey(n,s),d=Object.fromEntries(r.map(f=>{const A=this.grouped.column(f);return[f,i.map(y=>A?.get(y))]})),m=b.table(d);t(u.fromTrusted(m,this.variableMetadata),l,o++)}}rollup(t){const e=this.grouped.rollup(Object.fromEntries(Object.entries(t).map(([n,o])=>[n,b.op[o.aggregation](o.variableName)]))),r=Object.fromEntries(this.groupedBy.map(n=>{const o=this.variableMetadata[n],i=o?.type??"categorical",s=o?.valueFormat??v[i];return[n,{type:i,valueFormat:s}]}));for(const[n,{variableName:o,aggregation:i}]of Object.entries(t)){const s=this.variableMetadata[o],l=s?.type??"numeric",d=s?.valueFormat??v[l],m=O(i,l);r[n]={type:m,valueFormat:L(i,d)}}return u.fromTrusted(e,r)}getStableKey(t,e){return T(t.map(r=>r.get(e)))}}function rt(a,t,e){const r=t.map(l=>a[l]?.valueFormat??{type:"decimal"}),[n,...o]=r;if(!n)return{type:"decimal"};for(const l of r)if(l.type==="lookup")throw new Error("Cannot reshape: a source column has a lookup format and lookups cannot nest");if(o.every(l=>j.isEqual(l,n))||n.type==="lookup")return n;const s={};for(const[l,d]of t.entries()){const m=T([d]),f=r[l];f&&f.type!=="lookup"&&(s[m]=f)}return{type:"lookup",byVariable:e,cases:s,fallback:n}}class at{constructor(){this.requiredAesthetics=[],this.defaultParams={},this.positionChannels=[],this.visualAesthetics=["color","size","alpha","strokeWidth","lineType"],this.swatchShape="square",this.highlightStrategy=null,this.spatialKind="noop",this.directLabelPositions=[],this.gridPolicies={},this.identityKeyStrategy="fields",this.supportedCoordTypes=["cartesian","flip","polar"],this.emitsGrandTotal=!1,this.emitsStackTotals=!1,this.supportsPerGroupHeadline=!1}resolveAnchorPosition(t,e){return null}}const nt=(a,t)=>{const e=w(t.x);return!e||!["numeric","temporal"].includes(a.getType(e))?a:a.orderBy(e,"asc")};exports.CONSTANT_VARIABLES=$;exports.Dataset=u;exports.GROUP_VARIABLES=R;exports.Geom=at;exports.IDENTITY_VARIABLES=G;exports.POSITION_VARIABLES=h;exports.RULE_VARIABLES=K;exports.STAT_VARIABLES=N;exports.VISUAL_VARIABLES=x;exports.derivePositionColumnPairs=H;exports.extractConstantValue=U;exports.extractVariableName=w;exports.getStableKey=T;exports.isDefined=V;exports.isInternalVariable=W;exports.isNonEmptyArray=C;exports.isPlainObject=P;exports.isStatVariable=X;exports.mapping=k;exports.prefixInternalVariable=c;exports.readAesthetic=z;exports.sortByXIfContinuous=nt;exports.variableFor=E;
|