@tidyjs/tidy 2.5.2 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/addRows.js.map +1 -1
- package/dist/es/arrange.js +9 -5
- package/dist/es/arrange.js.map +1 -1
- package/dist/es/complete.js.map +1 -1
- package/dist/es/count.js +6 -2
- package/dist/es/count.js.map +1 -1
- package/dist/es/debug.js +4 -2
- package/dist/es/debug.js.map +1 -1
- package/dist/es/distinct.js +3 -3
- package/dist/es/distinct.js.map +1 -1
- package/dist/es/expand.js +18 -13
- package/dist/es/expand.js.map +1 -1
- package/dist/es/fill.js +10 -3
- package/dist/es/fill.js.map +1 -1
- package/dist/es/filter.js.map +1 -1
- package/dist/es/fullJoin.js +23 -20
- package/dist/es/fullJoin.js.map +1 -1
- package/dist/es/groupBy.js +56 -28
- package/dist/es/groupBy.js.map +1 -1
- package/dist/es/helpers/assignGroupKeys.js +4 -4
- package/dist/es/helpers/assignGroupKeys.js.map +1 -1
- package/dist/es/helpers/groupMap.js +2 -2
- package/dist/es/helpers/groupMap.js.map +1 -1
- package/dist/es/helpers/groupTraversal.js +5 -4
- package/dist/es/helpers/groupTraversal.js.map +1 -1
- package/dist/es/helpers/identity.js.map +1 -1
- package/dist/es/helpers/isObject.js.map +1 -1
- package/dist/es/helpers/keysFromItems.js +1 -2
- package/dist/es/helpers/keysFromItems.js.map +1 -1
- package/dist/es/helpers/singleOrArray.js.map +1 -1
- package/dist/es/helpers/summation.js +11 -3
- package/dist/es/helpers/summation.js.map +1 -1
- package/dist/es/innerJoin.js +37 -12
- package/dist/es/innerJoin.js.map +1 -1
- package/dist/es/item/rate.js +2 -3
- package/dist/es/item/rate.js.map +1 -1
- package/dist/es/leftJoin.js +13 -8
- package/dist/es/leftJoin.js.map +1 -1
- package/dist/es/map.js.map +1 -1
- package/dist/es/math/math.js.map +1 -1
- package/dist/es/mutate.js +1 -1
- package/dist/es/mutate.js.map +1 -1
- package/dist/es/mutateWithSummary.js +1 -1
- package/dist/es/mutateWithSummary.js.map +1 -1
- package/dist/es/pivotLonger.js +31 -7
- package/dist/es/pivotLonger.js.map +1 -1
- package/dist/es/pivotWider.js +24 -19
- package/dist/es/pivotWider.js.map +1 -1
- package/dist/es/rename.js.map +1 -1
- package/dist/es/replaceNully.js +1 -1
- package/dist/es/replaceNully.js.map +1 -1
- package/dist/es/select.js +3 -3
- package/dist/es/select.js.map +1 -1
- package/dist/es/selectors/contains.js.map +1 -1
- package/dist/es/selectors/endsWith.js.map +1 -1
- package/dist/es/selectors/everything.js.map +1 -1
- package/dist/es/selectors/matches.js.map +1 -1
- package/dist/es/selectors/negate.js +2 -2
- package/dist/es/selectors/negate.js.map +1 -1
- package/dist/es/selectors/numRange.js.map +1 -1
- package/dist/es/selectors/startsWith.js.map +1 -1
- package/dist/es/sequences/fullSeq.js +5 -1
- package/dist/es/sequences/fullSeq.js.map +1 -1
- package/dist/es/slice.js +2 -3
- package/dist/es/slice.js.map +1 -1
- package/dist/es/summarize.js +6 -4
- package/dist/es/summarize.js.map +1 -1
- package/dist/es/summary/deviation.js.map +1 -1
- package/dist/es/summary/first.js.map +1 -1
- package/dist/es/summary/last.js.map +1 -1
- package/dist/es/summary/max.js.map +1 -1
- package/dist/es/summary/mean.js.map +1 -1
- package/dist/es/summary/meanRate.js.map +1 -1
- package/dist/es/summary/median.js.map +1 -1
- package/dist/es/summary/min.js.map +1 -1
- package/dist/es/summary/n.js.map +1 -1
- package/dist/es/summary/nDistinct.js +2 -2
- package/dist/es/summary/nDistinct.js.map +1 -1
- package/dist/es/summary/sum.js.map +1 -1
- package/dist/es/summary/variance.js.map +1 -1
- package/dist/es/tally.js +4 -2
- package/dist/es/tally.js.map +1 -1
- package/dist/es/tidy.js.map +1 -1
- package/dist/es/total.js.map +1 -1
- package/dist/es/transmute.js.map +1 -1
- package/dist/es/vector/cumsum.js.map +1 -1
- package/dist/es/vector/lag.js +1 -1
- package/dist/es/vector/lag.js.map +1 -1
- package/dist/es/vector/lead.js +1 -1
- package/dist/es/vector/lead.js.map +1 -1
- package/dist/es/vector/roll.js +1 -1
- package/dist/es/vector/roll.js.map +1 -1
- package/dist/es/vector/rowNumber.js.map +1 -1
- package/dist/es/when.js +1 -2
- package/dist/es/when.js.map +1 -1
- package/dist/lib/addRows.js +0 -2
- package/dist/lib/addRows.js.map +1 -1
- package/dist/lib/arrange.js +9 -7
- package/dist/lib/arrange.js.map +1 -1
- package/dist/lib/complete.js +0 -2
- package/dist/lib/complete.js.map +1 -1
- package/dist/lib/count.js +6 -4
- package/dist/lib/count.js.map +1 -1
- package/dist/lib/debug.js +4 -4
- package/dist/lib/debug.js.map +1 -1
- package/dist/lib/distinct.js +3 -5
- package/dist/lib/distinct.js.map +1 -1
- package/dist/lib/expand.js +18 -15
- package/dist/lib/expand.js.map +1 -1
- package/dist/lib/fill.js +10 -5
- package/dist/lib/fill.js.map +1 -1
- package/dist/lib/filter.js +0 -2
- package/dist/lib/filter.js.map +1 -1
- package/dist/lib/fullJoin.js +22 -21
- package/dist/lib/fullJoin.js.map +1 -1
- package/dist/lib/groupBy.js +56 -30
- package/dist/lib/groupBy.js.map +1 -1
- package/dist/lib/helpers/assignGroupKeys.js +4 -6
- package/dist/lib/helpers/assignGroupKeys.js.map +1 -1
- package/dist/lib/helpers/groupMap.js +2 -4
- package/dist/lib/helpers/groupMap.js.map +1 -1
- package/dist/lib/helpers/groupTraversal.js +5 -6
- package/dist/lib/helpers/groupTraversal.js.map +1 -1
- package/dist/lib/helpers/identity.js +0 -2
- package/dist/lib/helpers/identity.js.map +1 -1
- package/dist/lib/helpers/isObject.js +0 -2
- package/dist/lib/helpers/isObject.js.map +1 -1
- package/dist/lib/helpers/keysFromItems.js +1 -4
- package/dist/lib/helpers/keysFromItems.js.map +1 -1
- package/dist/lib/helpers/singleOrArray.js +0 -2
- package/dist/lib/helpers/singleOrArray.js.map +1 -1
- package/dist/lib/helpers/summation.js +10 -4
- package/dist/lib/helpers/summation.js.map +1 -1
- package/dist/lib/index.js +0 -2
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/innerJoin.js +38 -14
- package/dist/lib/innerJoin.js.map +1 -1
- package/dist/lib/item/rate.js +2 -5
- package/dist/lib/item/rate.js.map +1 -1
- package/dist/lib/leftJoin.js +12 -9
- package/dist/lib/leftJoin.js.map +1 -1
- package/dist/lib/map.js +0 -2
- package/dist/lib/map.js.map +1 -1
- package/dist/lib/math/math.js +0 -2
- package/dist/lib/math/math.js.map +1 -1
- package/dist/lib/mutate.js +1 -3
- package/dist/lib/mutate.js.map +1 -1
- package/dist/lib/mutateWithSummary.js +1 -3
- package/dist/lib/mutateWithSummary.js.map +1 -1
- package/dist/lib/pivotLonger.js +31 -9
- package/dist/lib/pivotLonger.js.map +1 -1
- package/dist/lib/pivotWider.js +24 -21
- package/dist/lib/pivotWider.js.map +1 -1
- package/dist/lib/rename.js +0 -2
- package/dist/lib/rename.js.map +1 -1
- package/dist/lib/replaceNully.js +1 -3
- package/dist/lib/replaceNully.js.map +1 -1
- package/dist/lib/select.js +3 -5
- package/dist/lib/select.js.map +1 -1
- package/dist/lib/selectors/contains.js +0 -2
- package/dist/lib/selectors/contains.js.map +1 -1
- package/dist/lib/selectors/endsWith.js +0 -2
- package/dist/lib/selectors/endsWith.js.map +1 -1
- package/dist/lib/selectors/everything.js +0 -2
- package/dist/lib/selectors/everything.js.map +1 -1
- package/dist/lib/selectors/matches.js +0 -2
- package/dist/lib/selectors/matches.js.map +1 -1
- package/dist/lib/selectors/negate.js +2 -4
- package/dist/lib/selectors/negate.js.map +1 -1
- package/dist/lib/selectors/numRange.js +0 -2
- package/dist/lib/selectors/numRange.js.map +1 -1
- package/dist/lib/selectors/startsWith.js +0 -2
- package/dist/lib/selectors/startsWith.js.map +1 -1
- package/dist/lib/sequences/fullSeq.js +5 -3
- package/dist/lib/sequences/fullSeq.js.map +1 -1
- package/dist/lib/slice.js +2 -5
- package/dist/lib/slice.js.map +1 -1
- package/dist/lib/summarize.js +6 -6
- package/dist/lib/summarize.js.map +1 -1
- package/dist/lib/summary/deviation.js +0 -2
- package/dist/lib/summary/deviation.js.map +1 -1
- package/dist/lib/summary/first.js +0 -2
- package/dist/lib/summary/first.js.map +1 -1
- package/dist/lib/summary/last.js +0 -2
- package/dist/lib/summary/last.js.map +1 -1
- package/dist/lib/summary/max.js +0 -2
- package/dist/lib/summary/max.js.map +1 -1
- package/dist/lib/summary/mean.js +0 -2
- package/dist/lib/summary/mean.js.map +1 -1
- package/dist/lib/summary/meanRate.js +0 -2
- package/dist/lib/summary/meanRate.js.map +1 -1
- package/dist/lib/summary/median.js +0 -2
- package/dist/lib/summary/median.js.map +1 -1
- package/dist/lib/summary/min.js +0 -2
- package/dist/lib/summary/min.js.map +1 -1
- package/dist/lib/summary/n.js +0 -2
- package/dist/lib/summary/n.js.map +1 -1
- package/dist/lib/summary/nDistinct.js +2 -4
- package/dist/lib/summary/nDistinct.js.map +1 -1
- package/dist/lib/summary/sum.js +0 -2
- package/dist/lib/summary/sum.js.map +1 -1
- package/dist/lib/summary/variance.js +0 -2
- package/dist/lib/summary/variance.js.map +1 -1
- package/dist/lib/tally.js +4 -4
- package/dist/lib/tally.js.map +1 -1
- package/dist/lib/tidy.js +0 -2
- package/dist/lib/tidy.js.map +1 -1
- package/dist/lib/total.js +0 -2
- package/dist/lib/total.js.map +1 -1
- package/dist/lib/transmute.js +0 -2
- package/dist/lib/transmute.js.map +1 -1
- package/dist/lib/vector/cumsum.js +0 -2
- package/dist/lib/vector/cumsum.js.map +1 -1
- package/dist/lib/vector/lag.js +1 -3
- package/dist/lib/vector/lag.js.map +1 -1
- package/dist/lib/vector/lead.js +1 -3
- package/dist/lib/vector/lead.js.map +1 -1
- package/dist/lib/vector/roll.js +1 -3
- package/dist/lib/vector/roll.js.map +1 -1
- package/dist/lib/vector/rowNumber.js +0 -2
- package/dist/lib/vector/rowNumber.js.map +1 -1
- package/dist/lib/when.js +1 -4
- package/dist/lib/when.js.map +1 -1
- package/dist/tidy.d.ts +217 -1775
- package/dist/umd/tidy.js +307 -184
- package/dist/umd/tidy.js.map +1 -1
- package/dist/umd/tidy.min.js +1 -1
- package/dist/umd/tidy.min.js.map +1 -1
- package/genai-docs/api-core.md +357 -0
- package/genai-docs/api-grouping.md +400 -0
- package/genai-docs/api-joins.md +118 -0
- package/genai-docs/api-other.md +238 -0
- package/genai-docs/api-pivot.md +112 -0
- package/genai-docs/api-selectors.md +159 -0
- package/genai-docs/api-sequences.md +127 -0
- package/genai-docs/api-slice.md +137 -0
- package/genai-docs/api-summarize.md +528 -0
- package/genai-docs/api-vector.md +239 -0
- package/genai-docs/gotchas.md +193 -0
- package/genai-docs/index.md +44 -0
- package/genai-docs/mental-model.md +270 -0
- package/genai-docs/patterns.md +384 -0
- package/genai-docs/quick-reference.md +125 -0
- package/package.json +16 -10
- package/LICENSE +0 -21
package/dist/es/pivotLonger.js
CHANGED
|
@@ -3,7 +3,7 @@ import { processSelectors } from './select.js';
|
|
|
3
3
|
function pivotLonger(options) {
|
|
4
4
|
const _pivotLonger = (items) => {
|
|
5
5
|
var _a;
|
|
6
|
-
const {namesTo, valuesTo, namesSep = "_"} = options;
|
|
6
|
+
const { namesTo, valuesTo, namesSep = "_" } = options;
|
|
7
7
|
const cols = (_a = options.cols) != null ? _a : [];
|
|
8
8
|
const colsKeys = processSelectors(items, cols);
|
|
9
9
|
const namesToKeys = Array.isArray(namesTo) ? namesTo : [namesTo];
|
|
@@ -11,18 +11,42 @@ function pivotLonger(options) {
|
|
|
11
11
|
const hasMultipleNamesTo = namesToKeys.length > 1;
|
|
12
12
|
const hasMultipleValuesTo = valuesToKeys.length > 1;
|
|
13
13
|
const longer = [];
|
|
14
|
+
if (!items.length) return longer;
|
|
15
|
+
const colsKeysSet = new Set(colsKeys);
|
|
16
|
+
const remainingKeys = Object.keys(items[0]).filter(
|
|
17
|
+
(key) => !colsKeysSet.has(key)
|
|
18
|
+
);
|
|
19
|
+
const nameValueKeysWithoutValuePrefix = hasMultipleValuesTo ? Array.from(
|
|
20
|
+
new Set(
|
|
21
|
+
colsKeys.map(
|
|
22
|
+
(key) => key.substring(key.indexOf(namesSep) + 1)
|
|
23
|
+
)
|
|
24
|
+
)
|
|
25
|
+
) : colsKeys;
|
|
26
|
+
const nameValuePartsMap = hasMultipleNamesTo ? new Map(
|
|
27
|
+
nameValueKeysWithoutValuePrefix.map((nv) => [
|
|
28
|
+
nv,
|
|
29
|
+
nv.split(namesSep)
|
|
30
|
+
])
|
|
31
|
+
) : null;
|
|
32
|
+
const itemKeysMap = hasMultipleValuesTo ? new Map(
|
|
33
|
+
nameValueKeysWithoutValuePrefix.map((nv) => [
|
|
34
|
+
nv,
|
|
35
|
+
valuesToKeys.map((vk) => `${String(vk)}${namesSep}${String(nv)}`)
|
|
36
|
+
])
|
|
37
|
+
) : null;
|
|
14
38
|
for (const item of items) {
|
|
15
|
-
const remainingKeys = Object.keys(item).filter((key) => !colsKeys.includes(key));
|
|
16
39
|
const baseObj = {};
|
|
17
40
|
for (const key of remainingKeys) {
|
|
18
41
|
baseObj[key] = item[key];
|
|
19
42
|
}
|
|
20
|
-
const nameValueKeysWithoutValuePrefix = hasMultipleValuesTo ? Array.from(new Set(colsKeys.map((key) => key.substring(key.indexOf(namesSep) + 1)))) : colsKeys;
|
|
21
43
|
for (const nameValue of nameValueKeysWithoutValuePrefix) {
|
|
22
|
-
const entryObj = {...baseObj};
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
44
|
+
const entryObj = { ...baseObj };
|
|
45
|
+
const nameValueParts = nameValuePartsMap ? nameValuePartsMap.get(nameValue) : [nameValue];
|
|
46
|
+
const itemKeys = itemKeysMap ? itemKeysMap.get(nameValue) : null;
|
|
47
|
+
for (let vi = 0; vi < valuesToKeys.length; vi++) {
|
|
48
|
+
const valueKey = valuesToKeys[vi];
|
|
49
|
+
const itemKey = itemKeys ? itemKeys[vi] : nameValue;
|
|
26
50
|
let i = 0;
|
|
27
51
|
for (const nameKey of namesToKeys) {
|
|
28
52
|
const nameValuePart = nameValueParts[i++];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotLonger.js","sources":["../../src/pivotLonger.ts"],"sourcesContent":["import { SingleOrArray } from './helpers/singleOrArray';\nimport { TidyFn, Key } from './types';\nimport { processSelectors } from './select';\n\ntype PivotLongerOptions = {\n cols?: any; // Typescript gives me max call stack failed if I use KeysInput from `select`\n namesTo: SingleOrArray<Key>;\n namesSep?: string;\n valuesTo: SingleOrArray<Key>;\n};\n\ntype PivotOutput = Record<Key, any>;\n\nexport function pivotLonger<T extends object>(\n options: PivotLongerOptions\n): TidyFn<T, PivotOutput> {\n const _pivotLonger: TidyFn<T, PivotOutput> = (items: T[]): PivotOutput[] => {\n const { namesTo, valuesTo, namesSep = '_' } = options;\n const cols = options.cols ?? [];\n const colsKeys = processSelectors(items, cols) as (keyof T)[];\n\n const namesToKeys = Array.isArray(namesTo) ? namesTo : [namesTo];\n const valuesToKeys = Array.isArray(valuesTo) ? valuesTo : [valuesTo];\n const hasMultipleNamesTo = namesToKeys.length > 1;\n const hasMultipleValuesTo = valuesToKeys.length > 1;\n\n const longer: PivotOutput[] = [];\n\n
|
|
1
|
+
{"version":3,"file":"pivotLonger.js","sources":["../../src/pivotLonger.ts"],"sourcesContent":["import { SingleOrArray } from './helpers/singleOrArray';\nimport { TidyFn, Key } from './types';\nimport { processSelectors } from './select';\n\ntype PivotLongerOptions = {\n cols?: any; // Typescript gives me max call stack failed if I use KeysInput from `select`\n namesTo: SingleOrArray<Key>;\n namesSep?: string;\n valuesTo: SingleOrArray<Key>;\n};\n\ntype PivotOutput = Record<Key, any>;\n\nexport function pivotLonger<T extends object>(\n options: PivotLongerOptions\n): TidyFn<T, PivotOutput> {\n const _pivotLonger: TidyFn<T, PivotOutput> = (items: T[]): PivotOutput[] => {\n const { namesTo, valuesTo, namesSep = '_' } = options;\n const cols = options.cols ?? [];\n const colsKeys = processSelectors(items, cols) as (keyof T)[];\n\n const namesToKeys = Array.isArray(namesTo) ? namesTo : [namesTo];\n const valuesToKeys = Array.isArray(valuesTo) ? valuesTo : [valuesTo];\n const hasMultipleNamesTo = namesToKeys.length > 1;\n const hasMultipleValuesTo = valuesToKeys.length > 1;\n\n const longer: PivotOutput[] = [];\n\n if (!items.length) return longer;\n\n // keys not included in colsKeys must be kept (same for all items)\n const colsKeysSet = new Set<keyof T>(colsKeys);\n const remainingKeys = Object.keys(items[0]).filter(\n (key) => !colsKeysSet.has(key as keyof T)\n ) as (keyof T)[];\n\n // remove the `${valueKey}_` prefix when we have multiple values\n // (invariant across items, compute once)\n const nameValueKeysWithoutValuePrefix = hasMultipleValuesTo\n ? Array.from(\n new Set(\n colsKeys.map((key) =>\n (key as string).substring((key as string).indexOf(namesSep) + 1)\n )\n )\n )\n : colsKeys;\n\n // pre-compute split parts for each nameValue (invariant across items)\n const nameValuePartsMap = hasMultipleNamesTo\n ? new Map(\n (nameValueKeysWithoutValuePrefix as string[]).map((nv) => [\n nv,\n nv.split(namesSep),\n ])\n )\n : null;\n\n // pre-compute item keys for each nameValue+valueKey combination\n const itemKeysMap = hasMultipleValuesTo\n ? new Map(\n (nameValueKeysWithoutValuePrefix as string[]).map((nv) => [\n nv,\n valuesToKeys.map((vk) => `${String(vk)}${namesSep}${String(nv)}`),\n ])\n )\n : null;\n\n // expand each item into multiple items\n for (const item of items) {\n // the keys not in `cols` are the same for each row\n const baseObj = {} as PivotOutput;\n for (const key of remainingKeys) {\n baseObj[key as keyof PivotOutput] = item[key];\n }\n\n // e.g. `nameValue` or `nameValue1_nameValue2`\n for (const nameValue of nameValueKeysWithoutValuePrefix) {\n const entryObj = { ...baseObj };\n const nameValueParts = nameValuePartsMap\n ? nameValuePartsMap.get(nameValue as string)!\n : [nameValue];\n const itemKeys = itemKeysMap\n ? itemKeysMap.get(nameValue as string)!\n : null;\n\n for (let vi = 0; vi < valuesToKeys.length; vi++) {\n const valueKey = valuesToKeys[vi];\n const itemKey = itemKeys ? itemKeys[vi] : nameValue;\n\n let i = 0;\n for (const nameKey of namesToKeys) {\n const nameValuePart = nameValueParts[i++];\n entryObj[nameKey] = nameValuePart;\n entryObj[valueKey] = item[itemKey as keyof T];\n }\n }\n\n longer.push(entryObj);\n }\n }\n\n return longer;\n };\n\n return _pivotLonger;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/es/pivotWider.js
CHANGED
|
@@ -13,9 +13,10 @@ function pivotWider(options) {
|
|
|
13
13
|
const namesFromKeys = Array.isArray(namesFrom) ? namesFrom : [namesFrom];
|
|
14
14
|
const valuesFromKeys = Array.isArray(valuesFrom) ? valuesFrom : [valuesFrom];
|
|
15
15
|
const wider = [];
|
|
16
|
-
if (!items.length)
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
if (!items.length) return wider;
|
|
17
|
+
const idColumns = Object.keys(items[0]).filter(
|
|
18
|
+
(key) => !namesFromKeys.includes(key) && !valuesFromKeys.includes(key)
|
|
19
|
+
);
|
|
19
20
|
const nameValuesMap = {};
|
|
20
21
|
for (const item of items) {
|
|
21
22
|
for (const nameKey of namesFromKeys) {
|
|
@@ -37,13 +38,12 @@ function pivotWider(options) {
|
|
|
37
38
|
continue;
|
|
38
39
|
}
|
|
39
40
|
for (const valueKey of valuesFromKeys) {
|
|
40
|
-
baseWideObj[`${valueKey}${namesSep}${nameKey}`] = valuesFillMap != null ? valuesFillMap[valueKey] : valuesFill;
|
|
41
|
+
baseWideObj[`${String(valueKey)}${namesSep}${nameKey}`] = valuesFillMap != null ? valuesFillMap[valueKey] : valuesFill;
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
44
|
function widenItems(items2) {
|
|
44
|
-
if (!items2.length)
|
|
45
|
-
|
|
46
|
-
const wide = {...baseWideObj};
|
|
45
|
+
if (!items2.length) return [];
|
|
46
|
+
const wide = { ...baseWideObj };
|
|
47
47
|
for (const idKey of idColumns) {
|
|
48
48
|
wide[idKey] = items2[0][idKey];
|
|
49
49
|
}
|
|
@@ -54,7 +54,7 @@ function pivotWider(options) {
|
|
|
54
54
|
continue;
|
|
55
55
|
}
|
|
56
56
|
for (const valueKey of valuesFromKeys) {
|
|
57
|
-
wide[`${valueKey}${namesSep}${nameKey}`] = item[valueKey];
|
|
57
|
+
wide[`${String(valueKey)}${namesSep}${nameKey}`] = item[valueKey];
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
return [wide];
|
|
@@ -67,20 +67,25 @@ function pivotWider(options) {
|
|
|
67
67
|
};
|
|
68
68
|
return _pivotWider;
|
|
69
69
|
}
|
|
70
|
+
const PIVOT_WARN_THRESHOLD = 1e5;
|
|
70
71
|
function makeCombinations(separator = "_", arrays) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
72
|
+
if (!arrays.length) return [];
|
|
73
|
+
const totalSize = arrays.reduce((acc, v) => acc * v.length, 1);
|
|
74
|
+
if (totalSize > PIVOT_WARN_THRESHOLD) {
|
|
75
|
+
console.warn(
|
|
76
|
+
`tidy pivotWider: generating ${totalSize.toLocaleString()} column combinations. This may be slow or use excessive memory.`
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
let result = [null];
|
|
80
|
+
for (const array of arrays) {
|
|
81
|
+
const next = [];
|
|
82
|
+
for (const prefix of result) {
|
|
83
|
+
for (const item of array) {
|
|
84
|
+
next.push(prefix == null ? item : `${prefix}${separator}${item}`);
|
|
85
|
+
}
|
|
80
86
|
}
|
|
87
|
+
result = next;
|
|
81
88
|
}
|
|
82
|
-
const result = [];
|
|
83
|
-
combine(result, null, arrays);
|
|
84
89
|
return result;
|
|
85
90
|
}
|
|
86
91
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pivotWider.js","sources":["../../src/pivotWider.ts"],"sourcesContent":["import { groupBy } from './groupBy';\nimport { SingleOrArray } from './helpers/singleOrArray';\nimport { tidy } from './tidy';\nimport { Key, TidyFn } from './types';\n\ntype PivotOutput = Record<Key, any>;\n\ntype PivotWiderOptions<T extends object> = {\n namesFrom: SingleOrArray<keyof T>;\n namesSep?: string;\n valuesFrom: SingleOrArray<keyof T>;\n valuesFill?: any;\n valuesFillMap?: Partial<Record<Key, any>>;\n};\n\nexport function pivotWider<T extends object>(\n options: PivotWiderOptions<T>\n): TidyFn<T, PivotOutput> {\n const _pivotWider: TidyFn<T, PivotOutput> = (items: T[]): PivotOutput[] => {\n const {\n namesFrom,\n valuesFrom,\n valuesFill,\n valuesFillMap,\n namesSep = '_',\n } = options;\n\n const namesFromKeys: (keyof T)[] = Array.isArray(namesFrom)\n ? namesFrom\n : [namesFrom];\n const valuesFromKeys: (keyof T)[] = Array.isArray(valuesFrom)\n ? valuesFrom\n : [valuesFrom];\n const wider: PivotOutput[] = [];\n\n if (!items.length) return wider;\n\n // get all the keys that are left (id columns)\n const idColumns = Object.keys(items[0]).filter(\n (key) =>\n !namesFromKeys.includes(key as keyof T) &&\n !valuesFromKeys.includes(key as keyof T)\n ) as (keyof T)[];\n\n // get all possibilities for the name properties so we can fill them\n const nameValuesMap: any = {};\n for (const item of items) {\n for (const nameKey of namesFromKeys) {\n if (nameValuesMap[nameKey] == null) {\n nameValuesMap[nameKey] = {};\n }\n nameValuesMap[nameKey][item[nameKey]] = true;\n }\n }\n\n const nameValuesLists: string[][] = [];\n for (const nameKey in nameValuesMap) {\n nameValuesLists.push(Object.keys(nameValuesMap[nameKey]));\n }\n\n // prefill values if valuesFill is set for each name values combination\n const baseWideObj: any = {};\n const combos = makeCombinations(namesSep, nameValuesLists);\n\n for (const nameKey of combos) {\n if (valuesFromKeys.length === 1) {\n baseWideObj[nameKey] =\n valuesFillMap != null\n ? valuesFillMap[valuesFromKeys[0] as any]\n : valuesFill;\n continue;\n }\n\n for (const valueKey of valuesFromKeys) {\n baseWideObj[`${valueKey}${namesSep}${nameKey}`] =\n valuesFillMap != null ? valuesFillMap[valueKey as any] : valuesFill;\n }\n }\n\n // given a collection of items, widen\n function widenItems(items: T[]) {\n if (!items.length) return [];\n\n const wide: PivotOutput = { ...baseWideObj };\n\n // add the id columns (same for each object, so just look at first)\n for (const idKey of idColumns) {\n wide[idKey as keyof PivotOutput] = items[0][idKey];\n }\n\n // go through each object and widen their values\n for (const item of items) {\n const nameKey = namesFromKeys.map((key) => item[key]).join(namesSep);\n\n if (valuesFromKeys.length === 1) {\n wide[nameKey] = item[valuesFromKeys[0]];\n continue;\n }\n\n for (const valueKey of valuesFromKeys) {\n wide[`${valueKey}${namesSep}${nameKey}`] = item[valueKey];\n }\n }\n return [wide];\n }\n\n // no id columns, don't do any grouping, just widen and return\n if (!idColumns.length) {\n return widenItems(items);\n }\n\n // group by the id columns\n // for each group, widen/flatten to a single value\n const finish = tidy(items, groupBy(idColumns, [widenItems]));\n return finish;\n };\n\n return _pivotWider;\n}\n\n/*\n Recursively compute key combinations\n*/\nfunction makeCombinations(separator = '_', arrays: string[][]): string[] {\n
|
|
1
|
+
{"version":3,"file":"pivotWider.js","sources":["../../src/pivotWider.ts"],"sourcesContent":["import { groupBy } from './groupBy';\nimport { SingleOrArray } from './helpers/singleOrArray';\nimport { tidy } from './tidy';\nimport { Key, TidyFn } from './types';\n\ntype PivotOutput = Record<Key, any>;\n\ntype PivotWiderOptions<T extends object> = {\n namesFrom: SingleOrArray<keyof T>;\n namesSep?: string;\n valuesFrom: SingleOrArray<keyof T>;\n valuesFill?: any;\n valuesFillMap?: Partial<Record<Key, any>>;\n};\n\nexport function pivotWider<T extends object>(\n options: PivotWiderOptions<T>\n): TidyFn<T, PivotOutput> {\n const _pivotWider: TidyFn<T, PivotOutput> = (items: T[]): PivotOutput[] => {\n const {\n namesFrom,\n valuesFrom,\n valuesFill,\n valuesFillMap,\n namesSep = '_',\n } = options;\n\n const namesFromKeys: (keyof T)[] = Array.isArray(namesFrom)\n ? namesFrom\n : [namesFrom];\n const valuesFromKeys: (keyof T)[] = Array.isArray(valuesFrom)\n ? valuesFrom\n : [valuesFrom];\n const wider: PivotOutput[] = [];\n\n if (!items.length) return wider;\n\n // get all the keys that are left (id columns)\n const idColumns = Object.keys(items[0]).filter(\n (key) =>\n !namesFromKeys.includes(key as keyof T) &&\n !valuesFromKeys.includes(key as keyof T)\n ) as (keyof T)[];\n\n // get all possibilities for the name properties so we can fill them\n const nameValuesMap: any = {};\n for (const item of items) {\n for (const nameKey of namesFromKeys) {\n if (nameValuesMap[nameKey] == null) {\n nameValuesMap[nameKey] = {};\n }\n nameValuesMap[nameKey][item[nameKey]] = true;\n }\n }\n\n const nameValuesLists: string[][] = [];\n for (const nameKey in nameValuesMap) {\n nameValuesLists.push(Object.keys(nameValuesMap[nameKey]));\n }\n\n // prefill values if valuesFill is set for each name values combination\n const baseWideObj: any = {};\n const combos = makeCombinations(namesSep, nameValuesLists);\n\n for (const nameKey of combos) {\n if (valuesFromKeys.length === 1) {\n baseWideObj[nameKey] =\n valuesFillMap != null\n ? valuesFillMap[valuesFromKeys[0] as any]\n : valuesFill;\n continue;\n }\n\n for (const valueKey of valuesFromKeys) {\n baseWideObj[`${String(valueKey)}${namesSep}${nameKey}`] =\n valuesFillMap != null ? valuesFillMap[valueKey as any] : valuesFill;\n }\n }\n\n // given a collection of items, widen\n function widenItems(items: T[]) {\n if (!items.length) return [];\n\n const wide: PivotOutput = { ...baseWideObj };\n\n // add the id columns (same for each object, so just look at first)\n for (const idKey of idColumns) {\n wide[idKey as keyof PivotOutput] = items[0][idKey];\n }\n\n // go through each object and widen their values\n for (const item of items) {\n const nameKey = namesFromKeys.map((key) => item[key]).join(namesSep);\n\n if (valuesFromKeys.length === 1) {\n wide[nameKey] = item[valuesFromKeys[0]];\n continue;\n }\n\n for (const valueKey of valuesFromKeys) {\n wide[`${String(valueKey)}${namesSep}${nameKey}`] = item[valueKey];\n }\n }\n return [wide];\n }\n\n // no id columns, don't do any grouping, just widen and return\n if (!idColumns.length) {\n return widenItems(items);\n }\n\n // group by the id columns\n // for each group, widen/flatten to a single value\n const finish = tidy(items, groupBy(idColumns, [widenItems]));\n return finish;\n };\n\n return _pivotWider;\n}\n\n/*\n Recursively compute key combinations\n*/\nconst PIVOT_WARN_THRESHOLD = 100_000;\n\n/*\n Iteratively compute key combinations (avoids recursive array slicing)\n*/\nfunction makeCombinations(separator = '_', arrays: string[][]): string[] {\n if (!arrays.length) return [];\n\n // warn if Cartesian product will be very large\n const totalSize = arrays.reduce((acc, v) => acc * v.length, 1);\n if (totalSize > PIVOT_WARN_THRESHOLD) {\n console.warn(\n `tidy pivotWider: generating ${totalSize.toLocaleString()} column combinations. ` +\n `This may be slow or use excessive memory.`\n );\n }\n\n let result: string[] = [null as any];\n for (const array of arrays) {\n const next: string[] = [];\n for (const prefix of result) {\n for (const item of array) {\n next.push(prefix == null ? item : `${prefix}${separator}${item}`);\n }\n }\n result = next;\n }\n return result;\n}\n"],"names":["items"],"mappings":"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"}
|
package/dist/es/rename.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rename.js","sources":["../../src/rename.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"rename.js","sources":["../../src/rename.ts"],"sourcesContent":["import { TidyFn } from './types';\nimport { Merge, KeysMatching } from './type-utils';\n\ntype RenameSpec<T> = Partial<{\n [K in keyof T]: string;\n}>;\n\ntype OutputT<T extends object, Spec extends RenameSpec<T>> = Merge<\n Omit<T, keyof Spec>,\n {\n [NewKey in Exclude<Spec[keyof Spec], undefined>]: T[KeysMatching<\n Spec,\n NewKey\n > &\n keyof T];\n }\n>;\n\n/**\n * Renames properties/columns in collection\n *\n * @param renameSpec Mapping of current name to new name { currKey: newKey }\n */\nexport function rename<T extends object, Spec extends RenameSpec<T>>(\n renameSpec: Spec\n): TidyFn<T, OutputT<T, Spec>> {\n type Output = OutputT<T, Spec>;\n const _rename: TidyFn<T, Output> = (items: T[]): Output[] => {\n return items.map((d) => {\n const mapped = {} as any;\n const keys = Object.keys(d) as (keyof T)[];\n for (const key of keys) {\n const newKey: keyof Output =\n (renameSpec[key] as unknown as keyof Output) ?? key;\n mapped[newKey] = d[key];\n }\n\n return mapped as Output;\n });\n };\n\n return _rename;\n}\n"],"names":[],"mappings":"AAuBO,SAAS,OACd,UAC6B,EAAA;AAE7B,EAAM,MAAA,OAAA,GAA6B,CAAC,KAAyB,KAAA;AAC3D,IAAO,OAAA,KAAA,CAAM,GAAI,CAAA,CAAC,CAAM,KAAA;AA5B5B,MAAA,IAAA,EAAA,CAAA;AA6BM,MAAA,MAAM,SAAS,EAAC,CAAA;AAChB,MAAM,MAAA,IAAA,GAAO,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAC1B,MAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,QAAA,MAAM,MACH,GAAA,CAAA,EAAA,GAAA,UAAA,CAAW,GAAG,CAAA,KAAd,IAA+C,GAAA,EAAA,GAAA,GAAA,CAAA;AAClD,QAAO,MAAA,CAAA,MAAM,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA,CAAA;AAAA,OACxB;AAEA,MAAO,OAAA,MAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
package/dist/es/replaceNully.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replaceNully.js","sources":["../../src/replaceNully.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"replaceNully.js","sources":["../../src/replaceNully.ts"],"sourcesContent":["import { TidyFn } from './types';\nimport { Merge } from './type-utils';\n\ntype Spec<T extends object> = {\n [K in keyof T]: T[K];\n};\n\ntype Output<T extends object, ReplaceSpec extends Partial<Spec<T>>> = Merge<\n Omit<T, keyof ReplaceSpec>,\n {\n [K in keyof ReplaceSpec]: K extends keyof T\n ? Exclude<T[K], null | undefined> | ReplaceSpec[K]\n : ReplaceSpec[K];\n }\n>;\n\n/**\n * Replaces nully values with what is specified in the spec\n */\nexport function replaceNully<\n T extends object,\n ReplaceSpec extends Spec<Partial<T>> = Spec<Partial<T>>\n>(replaceSpec: ReplaceSpec): TidyFn<T, Output<T, ReplaceSpec>> {\n const _replaceNully: TidyFn<T, Output<T, ReplaceSpec>> = (\n items: T[]\n ): Output<T, ReplaceSpec>[] => {\n const replacedItems: Output<T, ReplaceSpec>[] = [];\n\n for (const d of items) {\n const obj = { ...d } as any;\n for (const key in replaceSpec) {\n if (obj[key as unknown as keyof T] == null) {\n obj[key as unknown as keyof T] = replaceSpec[key] as any;\n }\n }\n replacedItems.push(obj);\n }\n\n return replacedItems;\n };\n\n return _replaceNully;\n}\n"],"names":[],"mappings":"AAmBO,SAAS,aAGd,WAA6D,EAAA;AAC7D,EAAM,MAAA,aAAA,GAAmD,CACvD,KAC6B,KAAA;AAC7B,IAAA,MAAM,gBAA0C,EAAC,CAAA;AAEjD,IAAA,KAAA,MAAW,KAAK,KAAO,EAAA;AACrB,MAAM,MAAA,GAAA,GAAM,EAAE,GAAG,CAAE,EAAA,CAAA;AACnB,MAAA,KAAA,MAAW,OAAO,WAAa,EAAA;AAC7B,QAAI,IAAA,GAAA,CAAI,GAAyB,CAAA,IAAK,IAAM,EAAA;AAC1C,UAAI,GAAA,CAAA,GAAyB,CAAI,GAAA,WAAA,CAAY,GAAG,CAAA,CAAA;AAAA,SAClD;AAAA,OACF;AACA,MAAA,aAAA,CAAc,KAAK,GAAG,CAAA,CAAA;AAAA,KACxB;AAEA,IAAO,OAAA,aAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAO,OAAA,aAAA,CAAA;AACT;;;;"}
|
package/dist/es/select.js
CHANGED
|
@@ -25,16 +25,16 @@ function processSelectors(items, selectKeys) {
|
|
|
25
25
|
negationMap[key] = false;
|
|
26
26
|
continue;
|
|
27
27
|
}
|
|
28
|
-
keysWithoutNegations.
|
|
28
|
+
keysWithoutNegations.push(key);
|
|
29
29
|
}
|
|
30
|
+
keysWithoutNegations.reverse();
|
|
30
31
|
processedSelectKeys = Array.from(new Set(keysWithoutNegations));
|
|
31
32
|
return processedSelectKeys;
|
|
32
33
|
}
|
|
33
34
|
function select(selectKeys) {
|
|
34
35
|
const _select = (items) => {
|
|
35
36
|
let processedSelectKeys = processSelectors(items, selectKeys);
|
|
36
|
-
if (!processedSelectKeys.length)
|
|
37
|
-
return items;
|
|
37
|
+
if (!processedSelectKeys.length) return items;
|
|
38
38
|
return items.map((d) => {
|
|
39
39
|
const mapped = {};
|
|
40
40
|
for (const key of processedSelectKeys) {
|
package/dist/es/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sources":["../../src/select.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"select.js","sources":["../../src/select.ts"],"sourcesContent":["import { singleOrArray } from './helpers/singleOrArray';\nimport { everything } from './selectors/everything';\nimport { Key, TidyFn } from './types';\ntype DropKey<T extends object> = keyof T extends string | number\n ? `-${keyof T}`\n : never;\n// type KeysInput1<T> = readonly (keyof T)[] | keyof T;\nexport type KeysInput<T extends object> =\n | (Key | ((items: T[]) => Key[]))[]\n | readonly DropKey<T>[]\n | readonly (keyof T)[]\n | DropKey<T>\n | keyof T;\n\ntype Output<\n T extends object,\n KS extends KeysInput<T>\n // is it an array of drop keys?\n> = KS extends readonly DropKey<T>[]\n ? Pick<\n T,\n {\n [TK in keyof T]: `-${Extract<TK, string>}` extends KS[number]\n ? never\n : TK;\n }[keyof T]\n >\n : // is an array of keys?\n KS extends readonly Key[]\n ? Pick<T, Extract<KS[number], keyof T>>\n : // is a single drop key?\n KS extends DropKey<T>\n ? Pick<\n T,\n {\n [TK in keyof T]: `-${Extract<TK, string>}` extends KS ? never : TK;\n }[keyof T]\n >\n : // is a single key?\n KS extends Key\n ? Pick<T, Extract<KS, keyof T>>\n : // any other case, just be dumb and say T was returned\n T;\n\nexport function processSelectors<T extends object, Keys extends KeysInput<T>>(\n items: T[],\n selectKeys: Keys\n): string[] {\n let processedSelectKeys: string[] = [];\n // expand them all to a flat list of keys\n for (const keyInput of singleOrArray(selectKeys as any)) {\n if (typeof keyInput === 'function') {\n processedSelectKeys.push(...(keyInput(items) as string[]));\n } else {\n processedSelectKeys.push(keyInput);\n }\n }\n\n // if the first key is negative, add in everything at the front\n if (processedSelectKeys.length && processedSelectKeys[0][0] === '-') {\n processedSelectKeys = [...everything()(items), ...processedSelectKeys];\n }\n\n const negationMap: any = {};\n const keysWithoutNegations = [];\n // go through the list backwards and remove negations\n for (let k = processedSelectKeys.length - 1; k >= 0; k--) {\n const key: any = processedSelectKeys[k];\n if (key[0] === '-') {\n negationMap[key.substring(1)] = true;\n continue;\n }\n if (negationMap[key]) {\n negationMap[key] = false;\n continue;\n }\n keysWithoutNegations.push(key);\n }\n keysWithoutNegations.reverse();\n\n // remove duplicates\n processedSelectKeys = Array.from(new Set(keysWithoutNegations));\n\n return processedSelectKeys;\n}\n\n/**\n * selects subparts of the objects (aka pick)\n * @param selectFn Returns true to keep the item, false to select out\n */\n// export function select<T extends object, Keys extends SingleOrArray<Key | ((items: T[]) => (keyof T)[])>>(\nexport function select<T extends object, Keys extends KeysInput<T>>(\n selectKeys: Keys\n): TidyFn<T, Output<T, Keys>> {\n type OutputT = Output<T, Keys>;\n const _select: TidyFn<T, OutputT> = (items: T[]): OutputT[] => {\n let processedSelectKeys: string[] = processSelectors(items, selectKeys);\n\n if (!processedSelectKeys.length) return items as OutputT[];\n\n // use the processed keys to create reduced objects\n return items.map((d: T) => {\n const mapped: any = {};\n for (const key of processedSelectKeys) {\n mapped[key] = d[key as keyof T];\n }\n\n return mapped;\n });\n };\n\n return _select;\n}\n"],"names":[],"mappings":";;;AA4CgB,SAAA,gBAAA,CACd,OACA,UACU,EAAA;AACV,EAAA,IAAI,sBAAgC,EAAC,CAAA;AAErC,EAAW,KAAA,MAAA,QAAA,IAAY,aAAc,CAAA,UAAiB,CAAG,EAAA;AACvD,IAAI,IAAA,OAAO,aAAa,UAAY,EAAA;AAClC,MAAA,mBAAA,CAAoB,IAAK,CAAA,GAAI,QAAS,CAAA,KAAK,CAAc,CAAA,CAAA;AAAA,KACpD,MAAA;AACL,MAAA,mBAAA,CAAoB,KAAK,QAAQ,CAAA,CAAA;AAAA,KACnC;AAAA,GACF;AAGA,EAAA,IAAI,oBAAoB,MAAU,IAAA,mBAAA,CAAoB,CAAC,CAAE,CAAA,CAAC,MAAM,GAAK,EAAA;AACnE,IAAA,mBAAA,GAAsB,CAAC,GAAG,UAAA,GAAa,KAAK,CAAA,EAAG,GAAG,mBAAmB,CAAA,CAAA;AAAA,GACvE;AAEA,EAAA,MAAM,cAAmB,EAAC,CAAA;AAC1B,EAAA,MAAM,uBAAuB,EAAC,CAAA;AAE9B,EAAA,KAAA,IAAS,IAAI,mBAAoB,CAAA,MAAA,GAAS,CAAG,EAAA,CAAA,IAAK,GAAG,CAAK,EAAA,EAAA;AACxD,IAAM,MAAA,GAAA,GAAW,oBAAoB,CAAC,CAAA,CAAA;AACtC,IAAI,IAAA,GAAA,CAAI,CAAC,CAAA,KAAM,GAAK,EAAA;AAClB,MAAA,WAAA,CAAY,GAAI,CAAA,SAAA,CAAU,CAAC,CAAC,CAAI,GAAA,IAAA,CAAA;AAChC,MAAA,SAAA;AAAA,KACF;AACA,IAAI,IAAA,WAAA,CAAY,GAAG,CAAG,EAAA;AACpB,MAAA,WAAA,CAAY,GAAG,CAAI,GAAA,KAAA,CAAA;AACnB,MAAA,SAAA;AAAA,KACF;AACA,IAAA,oBAAA,CAAqB,KAAK,GAAG,CAAA,CAAA;AAAA,GAC/B;AACA,EAAA,oBAAA,CAAqB,OAAQ,EAAA,CAAA;AAG7B,EAAA,mBAAA,GAAsB,KAAM,CAAA,IAAA,CAAK,IAAI,GAAA,CAAI,oBAAoB,CAAC,CAAA,CAAA;AAE9D,EAAO,OAAA,mBAAA,CAAA;AACT,CAAA;AAOO,SAAS,OACd,UAC4B,EAAA;AAE5B,EAAM,MAAA,OAAA,GAA8B,CAAC,KAA0B,KAAA;AAC7D,IAAI,IAAA,mBAAA,GAAgC,gBAAiB,CAAA,KAAA,EAAO,UAAU,CAAA,CAAA;AAEtE,IAAI,IAAA,CAAC,mBAAoB,CAAA,MAAA,EAAe,OAAA,KAAA,CAAA;AAGxC,IAAO,OAAA,KAAA,CAAM,GAAI,CAAA,CAAC,CAAS,KAAA;AACzB,MAAA,MAAM,SAAc,EAAC,CAAA;AACrB,MAAA,KAAA,MAAW,OAAO,mBAAqB,EAAA;AACrC,QAAO,MAAA,CAAA,GAAG,CAAI,GAAA,CAAA,CAAE,GAAc,CAAA,CAAA;AAAA,OAChC;AAEA,MAAO,OAAA,MAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH,CAAA;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contains.js","sources":["../../../src/selectors/contains.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that contain the specified substring\n */\nexport function contains<T extends object>(\n substring: string,\n ignoreCase: boolean = true\n) {\n return (items: T[]) => {\n const regex = new RegExp(substring, ignoreCase ? 'i' : undefined);\n const keys = keysFromItems(items);\n return keys.filter((d) => regex.test(d as string));\n };\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"contains.js","sources":["../../../src/selectors/contains.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that contain the specified substring\n */\nexport function contains<T extends object>(\n substring: string,\n ignoreCase: boolean = true\n) {\n return (items: T[]) => {\n const regex = new RegExp(substring, ignoreCase ? 'i' : undefined);\n const keys = keysFromItems(items);\n return keys.filter((d) => regex.test(d as string));\n };\n}\n"],"names":[],"mappings":";;AAKgB,SAAA,QAAA,CACd,SACA,EAAA,UAAA,GAAsB,IACtB,EAAA;AACA,EAAA,OAAO,CAAC,KAAe,KAAA;AACrB,IAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,SAAW,EAAA,UAAA,GAAa,MAAM,KAAS,CAAA,CAAA,CAAA;AAChE,IAAM,MAAA,IAAA,GAAO,cAAc,KAAK,CAAA,CAAA;AAChC,IAAA,OAAO,KAAK,MAAO,CAAA,CAAC,MAAM,KAAM,CAAA,IAAA,CAAK,CAAW,CAAC,CAAA,CAAA;AAAA,GACnD,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endsWith.js","sources":["../../../src/selectors/endsWith.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that end with the specified suffix\n */\nexport function endsWith<T extends object>(\n suffix: string,\n ignoreCase: boolean = true\n) {\n return (items: T[]) => {\n const regex = new RegExp(`${suffix}$`, ignoreCase ? 'i' : undefined);\n const keys = keysFromItems(items);\n return keys.filter((d) => regex.test(d as string));\n };\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"endsWith.js","sources":["../../../src/selectors/endsWith.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that end with the specified suffix\n */\nexport function endsWith<T extends object>(\n suffix: string,\n ignoreCase: boolean = true\n) {\n return (items: T[]) => {\n const regex = new RegExp(`${suffix}$`, ignoreCase ? 'i' : undefined);\n const keys = keysFromItems(items);\n return keys.filter((d) => regex.test(d as string));\n };\n}\n"],"names":[],"mappings":";;AAKgB,SAAA,QAAA,CACd,MACA,EAAA,UAAA,GAAsB,IACtB,EAAA;AACA,EAAA,OAAO,CAAC,KAAe,KAAA;AACrB,IAAM,MAAA,KAAA,GAAQ,IAAI,MAAO,CAAA,CAAA,EAAG,MAAM,CAAK,CAAA,CAAA,EAAA,UAAA,GAAa,MAAM,KAAS,CAAA,CAAA,CAAA;AACnE,IAAM,MAAA,IAAA,GAAO,cAAc,KAAK,CAAA,CAAA;AAChC,IAAA,OAAO,KAAK,MAAO,CAAA,CAAC,MAAM,KAAM,CAAA,IAAA,CAAK,CAAW,CAAC,CAAA,CAAA;AAAA,GACnD,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"everything.js","sources":["../../../src/selectors/everything.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys\n */\nexport function everything<T extends object>() {\n return (items: T[]) => {\n const keys = keysFromItems(items);\n return keys;\n };\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"everything.js","sources":["../../../src/selectors/everything.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys\n */\nexport function everything<T extends object>() {\n return (items: T[]) => {\n const keys = keysFromItems(items);\n return keys;\n };\n}\n"],"names":[],"mappings":";;AAKO,SAAS,UAA+B,GAAA;AAC7C,EAAA,OAAO,CAAC,KAAe,KAAA;AACrB,IAAM,MAAA,IAAA,GAAO,cAAc,KAAK,CAAA,CAAA;AAChC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matches.js","sources":["../../../src/selectors/matches.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that match the specified regex\n */\nexport function matches<T extends object>(regex: RegExp) {\n return (items: T[]) => {\n const keys = keysFromItems(items);\n return keys.filter((d) => regex.test(d as string));\n };\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"matches.js","sources":["../../../src/selectors/matches.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that match the specified regex\n */\nexport function matches<T extends object>(regex: RegExp) {\n return (items: T[]) => {\n const keys = keysFromItems(items);\n return keys.filter((d) => regex.test(d as string));\n };\n}\n"],"names":[],"mappings":";;AAKO,SAAS,QAA0B,KAAe,EAAA;AACvD,EAAA,OAAO,CAAC,KAAe,KAAA;AACrB,IAAM,MAAA,IAAA,GAAO,cAAc,KAAK,CAAA,CAAA;AAChC,IAAA,OAAO,KAAK,MAAO,CAAA,CAAC,MAAM,KAAM,CAAA,IAAA,CAAK,CAAW,CAAC,CAAA,CAAA;AAAA,GACnD,CAAA;AACF;;;;"}
|
|
@@ -2,7 +2,7 @@ import { singleOrArray } from '../helpers/singleOrArray.js';
|
|
|
2
2
|
|
|
3
3
|
function negate(selectors) {
|
|
4
4
|
return (items) => {
|
|
5
|
-
let keySet = new Set();
|
|
5
|
+
let keySet = /* @__PURE__ */ new Set();
|
|
6
6
|
for (const selector of singleOrArray(selectors)) {
|
|
7
7
|
if (typeof selector === "function") {
|
|
8
8
|
const keys2 = selector(items);
|
|
@@ -13,7 +13,7 @@ function negate(selectors) {
|
|
|
13
13
|
keySet.add(selector);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
const keys = Array.from(keySet).map((key) => `-${key}`);
|
|
16
|
+
const keys = Array.from(keySet).map((key) => `-${String(key)}`);
|
|
17
17
|
return keys;
|
|
18
18
|
};
|
|
19
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"negate.js","sources":["../../../src/selectors/negate.ts"],"sourcesContent":["import { SingleOrArray, singleOrArray } from '../helpers/singleOrArray';\n\n/**\n * Given a set of selectors, inverts their output to be drop keys. e.g.,\n * `key` becomes `-key`.\n */\nexport function negate<T extends object>(\n selectors: SingleOrArray<keyof T | ((items: T[]) => (keyof T)[])>\n) {\n return (items: T[]) => {\n let keySet = new Set<keyof T>();\n for (const selector of singleOrArray(selectors as any)) {\n if (typeof selector === 'function') {\n const keys = selector(items) as (keyof T)[];\n for (const key of keys) {\n keySet.add(key);\n }\n } else {\n keySet.add(selector);\n }\n }\n const keys = Array.from(keySet).map((key) => `-${key}`);\n return keys as (keyof T)[];\n };\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"negate.js","sources":["../../../src/selectors/negate.ts"],"sourcesContent":["import { SingleOrArray, singleOrArray } from '../helpers/singleOrArray';\n\n/**\n * Given a set of selectors, inverts their output to be drop keys. e.g.,\n * `key` becomes `-key`.\n */\nexport function negate<T extends object>(\n selectors: SingleOrArray<keyof T | ((items: T[]) => (keyof T)[])>\n) {\n return (items: T[]) => {\n let keySet = new Set<keyof T>();\n for (const selector of singleOrArray(selectors as any)) {\n if (typeof selector === 'function') {\n const keys = selector(items) as (keyof T)[];\n for (const key of keys) {\n keySet.add(key);\n }\n } else {\n keySet.add(selector);\n }\n }\n const keys = Array.from(keySet).map((key) => `-${String(key)}`);\n return keys as (keyof T)[];\n };\n}\n"],"names":["keys"],"mappings":";;AAMO,SAAS,OACd,SACA,EAAA;AACA,EAAA,OAAO,CAAC,KAAe,KAAA;AACrB,IAAI,IAAA,MAAA,uBAAa,GAAa,EAAA,CAAA;AAC9B,IAAW,KAAA,MAAA,QAAA,IAAY,aAAc,CAAA,SAAgB,CAAG,EAAA;AACtD,MAAI,IAAA,OAAO,aAAa,UAAY,EAAA;AAClC,QAAMA,MAAAA,KAAAA,GAAO,SAAS,KAAK,CAAA,CAAA;AAC3B,QAAA,KAAA,MAAW,OAAOA,KAAM,EAAA;AACtB,UAAA,MAAA,CAAO,IAAI,GAAG,CAAA,CAAA;AAAA,SAChB;AAAA,OACK,MAAA;AACL,QAAA,MAAA,CAAO,IAAI,QAAQ,CAAA,CAAA;AAAA,OACrB;AAAA,KACF;AACA,IAAA,MAAM,IAAO,GAAA,KAAA,CAAM,IAAK,CAAA,MAAM,CAAE,CAAA,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAI,CAAA,EAAA,MAAA,CAAO,GAAG,CAAC,CAAE,CAAA,CAAA,CAAA;AAC9D,IAAO,OAAA,IAAA,CAAA;AAAA,GACT,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"numRange.js","sources":["../../../src/selectors/numRange.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that match the prefix + num range.\n * e.g., wk, [10, 15], width=3 -> wk010, wk011, wk012, wk013, wk014, wk015\n */\nexport function numRange<T extends object>(\n prefix: string,\n range: [number, number],\n width?: number\n) {\n return (items: T[]) => {\n const keys = keysFromItems(items);\n const matchKeys: string[] = [];\n for (let i = range[0]; i <= range[1]; ++i) {\n const num = width == null ? i : new String('00000000' + i).slice(-width);\n matchKeys.push(`${prefix}${num}`);\n }\n\n return keys.filter((d) => (matchKeys as (keyof T)[]).includes(d));\n };\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"numRange.js","sources":["../../../src/selectors/numRange.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that match the prefix + num range.\n * e.g., wk, [10, 15], width=3 -> wk010, wk011, wk012, wk013, wk014, wk015\n */\nexport function numRange<T extends object>(\n prefix: string,\n range: [number, number],\n width?: number\n) {\n return (items: T[]) => {\n const keys = keysFromItems(items);\n const matchKeys: string[] = [];\n for (let i = range[0]; i <= range[1]; ++i) {\n const num = width == null ? i : new String('00000000' + i).slice(-width);\n matchKeys.push(`${prefix}${num}`);\n }\n\n return keys.filter((d) => (matchKeys as (keyof T)[]).includes(d));\n };\n}\n"],"names":[],"mappings":";;AAMgB,SAAA,QAAA,CACd,MACA,EAAA,KAAA,EACA,KACA,EAAA;AACA,EAAA,OAAO,CAAC,KAAe,KAAA;AACrB,IAAM,MAAA,IAAA,GAAO,cAAc,KAAK,CAAA,CAAA;AAChC,IAAA,MAAM,YAAsB,EAAC,CAAA;AAC7B,IAAS,KAAA,IAAA,CAAA,GAAI,MAAM,CAAC,CAAA,EAAG,KAAK,KAAM,CAAA,CAAC,CAAG,EAAA,EAAE,CAAG,EAAA;AACzC,MAAM,MAAA,GAAA,GAAM,KAAS,IAAA,IAAA,GAAO,CAAI,GAAA,IAAI,MAAO,CAAA,UAAA,GAAa,CAAC,CAAA,CAAE,KAAM,CAAA,CAAC,KAAK,CAAA,CAAA;AACvE,MAAA,SAAA,CAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,EAAG,GAAG,CAAE,CAAA,CAAA,CAAA;AAAA,KAClC;AAEA,IAAA,OAAO,KAAK,MAAO,CAAA,CAAC,MAAO,SAA0B,CAAA,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AAAA,GAClE,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startsWith.js","sources":["../../../src/selectors/startsWith.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that start with the specified prefix\n */\nexport function startsWith<T extends object>(\n prefix: string,\n ignoreCase: boolean = true\n) {\n return (items: T[]) => {\n const regex = new RegExp(`^${prefix}`, ignoreCase ? 'i' : undefined);\n const keys = keysFromItems(items);\n return keys.filter((d) => regex.test(d as string));\n };\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"startsWith.js","sources":["../../../src/selectors/startsWith.ts"],"sourcesContent":["import { keysFromItems } from '../helpers/keysFromItems';\n\n/**\n * Returns all keys that start with the specified prefix\n */\nexport function startsWith<T extends object>(\n prefix: string,\n ignoreCase: boolean = true\n) {\n return (items: T[]) => {\n const regex = new RegExp(`^${prefix}`, ignoreCase ? 'i' : undefined);\n const keys = keysFromItems(items);\n return keys.filter((d) => regex.test(d as string));\n };\n}\n"],"names":[],"mappings":";;AAKgB,SAAA,UAAA,CACd,MACA,EAAA,UAAA,GAAsB,IACtB,EAAA;AACA,EAAA,OAAO,CAAC,KAAe,KAAA;AACrB,IAAM,MAAA,KAAA,GAAQ,IAAI,MAAO,CAAA,CAAA,CAAA,EAAI,MAAM,CAAI,CAAA,EAAA,UAAA,GAAa,MAAM,KAAS,CAAA,CAAA,CAAA;AACnE,IAAM,MAAA,IAAA,GAAO,cAAc,KAAK,CAAA,CAAA;AAChC,IAAA,OAAO,KAAK,MAAO,CAAA,CAAC,MAAM,KAAM,CAAA,IAAA,CAAK,CAAW,CAAC,CAAA,CAAA;AAAA,GACnD,CAAA;AACF;;;;"}
|
|
@@ -54,7 +54,11 @@ function fullSeqDateISOString(key, granularity, period) {
|
|
|
54
54
|
granularity = granularity != null ? granularity : "day";
|
|
55
55
|
period = period != null ? period : 1;
|
|
56
56
|
const keyFn = typeof key === "function" ? key : (d) => d[key];
|
|
57
|
-
return vectorSeqDate(
|
|
57
|
+
return vectorSeqDate(
|
|
58
|
+
items.map((d) => new Date(keyFn(d))),
|
|
59
|
+
granularity,
|
|
60
|
+
period
|
|
61
|
+
).map((date) => date.toISOString());
|
|
58
62
|
};
|
|
59
63
|
}
|
|
60
64
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fullSeq.js","sources":["../../../src/sequences/fullSeq.ts"],"sourcesContent":["import { extent } from 'd3-array';\nimport { Granularity } from '../types';\n\n/**\n * Create a full sequence given a vector of values\n */\nexport function vectorSeq(values: number[], period: number = 1): number[] {\n let [min, max] = extent(values) as [number, number];\n\n const sequence: number[] = [];\n let value = min;\n while (value <= max) {\n sequence.push(value);\n value += period;\n }\n\n return sequence;\n}\n\n/**\n * Create a full sequence given a vector of values\n */\nexport function vectorSeqDate(\n values: Date[],\n granularity: Granularity = 'day',\n period: number = 1\n): Date[] {\n let [min, max] = extent(values) as [Date, Date];\n\n const sequence: Date[] = [];\n let value = new Date(min);\n while (value <= max) {\n sequence.push(new Date(value));\n\n // increment date\n if (\n granularity === 'second' ||\n granularity === 's' ||\n granularity === 'seconds'\n ) {\n value.setUTCSeconds(value.getUTCSeconds() + 1 * period);\n } else if (\n granularity === 'minute' ||\n granularity === 'min' ||\n granularity === 'minutes'\n ) {\n value.setUTCMinutes(value.getUTCMinutes() + 1 * period);\n } else if (\n granularity === 'day' ||\n granularity === 'd' ||\n granularity === 'days'\n ) {\n value.setUTCDate(value.getUTCDate() + 1 * period);\n } else if (\n granularity === 'week' ||\n granularity === 'w' ||\n granularity === 'weeks'\n ) {\n value.setUTCDate(value.getUTCDate() + 7 * period);\n } else if (\n granularity === 'month' ||\n granularity === 'm' ||\n granularity === 'months'\n ) {\n value.setUTCMonth(value.getUTCMonth() + 1 * period);\n } else if (\n granularity === 'year' ||\n granularity === 'y' ||\n granularity === 'years'\n ) {\n value.setUTCFullYear(value.getUTCFullYear() + 1 * period);\n } else {\n throw new Error('Invalid granularity for date sequence: ' + granularity);\n }\n }\n\n return sequence;\n}\n\n/**\n * Create a full sequence given a set of data.\n * @param items\n * @param key\n */\nexport function fullSeq<T extends object>(\n key: keyof T | ((d: T) => number),\n period?: number | null | undefined\n): (items: T[]) => number[] {\n return function fullSeqInner(items: T[]): number[] {\n period = period ?? 1;\n\n const keyFn =\n typeof key === 'function' ? key : (d: T) =>
|
|
1
|
+
{"version":3,"file":"fullSeq.js","sources":["../../../src/sequences/fullSeq.ts"],"sourcesContent":["import { extent } from 'd3-array';\nimport { Granularity } from '../types';\n\n/**\n * Create a full sequence given a vector of values\n */\nexport function vectorSeq(values: number[], period: number = 1): number[] {\n let [min, max] = extent(values) as [number, number];\n\n const sequence: number[] = [];\n let value = min;\n while (value <= max) {\n sequence.push(value);\n value += period;\n }\n\n return sequence;\n}\n\n/**\n * Create a full sequence given a vector of values\n */\nexport function vectorSeqDate(\n values: Date[],\n granularity: Granularity = 'day',\n period: number = 1\n): Date[] {\n let [min, max] = extent(values) as [Date, Date];\n\n const sequence: Date[] = [];\n let value = new Date(min);\n while (value <= max) {\n sequence.push(new Date(value));\n\n // increment date\n if (\n granularity === 'second' ||\n granularity === 's' ||\n granularity === 'seconds'\n ) {\n value.setUTCSeconds(value.getUTCSeconds() + 1 * period);\n } else if (\n granularity === 'minute' ||\n granularity === 'min' ||\n granularity === 'minutes'\n ) {\n value.setUTCMinutes(value.getUTCMinutes() + 1 * period);\n } else if (\n granularity === 'day' ||\n granularity === 'd' ||\n granularity === 'days'\n ) {\n value.setUTCDate(value.getUTCDate() + 1 * period);\n } else if (\n granularity === 'week' ||\n granularity === 'w' ||\n granularity === 'weeks'\n ) {\n value.setUTCDate(value.getUTCDate() + 7 * period);\n } else if (\n granularity === 'month' ||\n granularity === 'm' ||\n granularity === 'months'\n ) {\n value.setUTCMonth(value.getUTCMonth() + 1 * period);\n } else if (\n granularity === 'year' ||\n granularity === 'y' ||\n granularity === 'years'\n ) {\n value.setUTCFullYear(value.getUTCFullYear() + 1 * period);\n } else {\n throw new Error('Invalid granularity for date sequence: ' + granularity);\n }\n }\n\n return sequence;\n}\n\n/**\n * Create a full sequence given a set of data.\n * @param items\n * @param key\n */\nexport function fullSeq<T extends object>(\n key: keyof T | ((d: T) => number),\n period?: number | null | undefined\n): (items: T[]) => number[] {\n return function fullSeqInner(items: T[]): number[] {\n period = period ?? 1;\n\n const keyFn =\n typeof key === 'function' ? key : (d: T) => d[key] as unknown as number;\n\n return vectorSeq(items.map(keyFn), period);\n };\n}\n\nexport function fullSeqDate<T extends object>(\n key: keyof T | ((d: T) => Date),\n granularity?: Granularity | null | undefined,\n period?: number | null | undefined\n): (items: T[]) => Date[] {\n return function fullSeqDateInner(items: T[]): Date[] {\n granularity = granularity ?? 'day';\n period = period ?? 1;\n\n const keyFn =\n typeof key === 'function' ? key : (d: T) => d[key] as unknown as Date;\n\n return vectorSeqDate(items.map(keyFn), granularity, period);\n };\n}\n\nexport function fullSeqDateISOString<T extends object>(\n key: keyof T | ((d: T) => string),\n granularity?: Granularity | null | undefined,\n period?: number | null | undefined\n): (items: T[]) => string[] {\n return function fullSeqDateISOStringInner(items: T[]): string[] {\n granularity = granularity ?? 'day';\n period = period ?? 1;\n\n const keyFn =\n typeof key === 'function' ? key : (d: T) => d[key] as unknown as string;\n\n return vectorSeqDate(\n items.map((d) => new Date(keyFn(d))),\n granularity,\n period\n ).map((date) => date.toISOString());\n };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/es/slice.js
CHANGED
|
@@ -17,10 +17,9 @@ function sliceMax(n, orderBy) {
|
|
|
17
17
|
}
|
|
18
18
|
function sliceSample(n, options) {
|
|
19
19
|
options = options != null ? options : {};
|
|
20
|
-
const {replace} = options;
|
|
20
|
+
const { replace } = options;
|
|
21
21
|
const _sliceSample = (items) => {
|
|
22
|
-
if (!items.length)
|
|
23
|
-
return items.slice();
|
|
22
|
+
if (!items.length) return items.slice();
|
|
24
23
|
if (replace) {
|
|
25
24
|
const sliced = [];
|
|
26
25
|
for (let i = 0; i < n; ++i) {
|
package/dist/es/slice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slice.js","sources":["../../src/slice.ts"],"sourcesContent":["import { shuffle } from 'd3-array';\nimport { arrange, desc } from './arrange';\nimport { SingleOrArray } from './helpers/singleOrArray';\nimport { Comparator, Key, TidyFn } from './types';\n\n/**\n * Truncates the array to the specified range\n */\nexport function slice<T extends object>(\n start: number,\n end?: number\n): TidyFn<T> {\n const _slice: TidyFn<T> = (items: T[]): T[] => items.slice(start, end);\n\n return _slice;\n}\n\n// -------------------------------------------------------------------\n/**\n * Truncates the array to the first N items\n */\nexport const sliceHead = <T extends object>(n: number) => slice<T>(0, n);\n\n// -------------------------------------------------------------------\n/**\n * Truncates the array to the last N items\n */\nexport const sliceTail = <T extends object>(n: number) => slice<T>(-n);\n\n// -------------------------------------------------------------------\n\n/**\n * Truncates the array to the first N items ordered by some key\n */\nexport function sliceMin<T extends object>(\n n: number,\n orderBy: SingleOrArray<Key | Comparator<T>>\n): TidyFn<T> {\n const _sliceMin: TidyFn<T> = (items: T[]): T[] =>\n arrange<T>(orderBy)(items).slice(0, n);\n\n return _sliceMin;\n}\n\n// -------------------------------------------------------------------\n\n/**\n * Truncates the array to the last N items ordered by some key\n */\nexport function sliceMax<T extends object>(\n n: number,\n orderBy: SingleOrArray<Key | Comparator<T>>\n): TidyFn<T> {\n // note: we use desc() so we get proper handling of nullish values\n // unless they provided an explicit comparator.\n const _sliceMax: TidyFn<T> = (items: T[]): T[] =>\n typeof orderBy === 'function'\n ? arrange<T>(orderBy)(items).slice(-n).reverse()\n : arrange<T>(desc(orderBy as any))(items).slice(0, n);\n\n return _sliceMax;\n}\n\n// -------------------------------------------------------------------\n\ntype SampleOptions = {\n replace?: boolean;\n};\n/**\n * Truncates the array to the last N items ordered by some key\n */\nexport function sliceSample<T extends object>(\n n: number,\n options?: SampleOptions | null | undefined\n): TidyFn<T> {\n options = options ?? {};\n const { replace } = options;\n\n const _sliceSample: TidyFn<T> = (items: T[]) => {\n if (!items.length) return items.slice();\n\n // sample items with replacement\n if (replace) {\n const sliced = [];\n for (let i = 0; i < n; ++i) {\n sliced.push(items[Math.floor(Math.random() * items.length)]);\n }\n return sliced;\n }\n\n // sample items without replacement\n return shuffle(items.slice()).slice(0, n);\n };\n\n return _sliceSample;\n}\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"slice.js","sources":["../../src/slice.ts"],"sourcesContent":["import { shuffle } from 'd3-array';\nimport { arrange, desc } from './arrange';\nimport { SingleOrArray } from './helpers/singleOrArray';\nimport { Comparator, Key, TidyFn } from './types';\n\n/**\n * Truncates the array to the specified range\n */\nexport function slice<T extends object>(\n start: number,\n end?: number\n): TidyFn<T> {\n const _slice: TidyFn<T> = (items: T[]): T[] => items.slice(start, end);\n\n return _slice;\n}\n\n// -------------------------------------------------------------------\n/**\n * Truncates the array to the first N items\n */\nexport const sliceHead = <T extends object>(n: number) => slice<T>(0, n);\n\n// -------------------------------------------------------------------\n/**\n * Truncates the array to the last N items\n */\nexport const sliceTail = <T extends object>(n: number) => slice<T>(-n);\n\n// -------------------------------------------------------------------\n\n/**\n * Truncates the array to the first N items ordered by some key\n */\nexport function sliceMin<T extends object>(\n n: number,\n orderBy: SingleOrArray<Key | Comparator<T>>\n): TidyFn<T> {\n const _sliceMin: TidyFn<T> = (items: T[]): T[] =>\n arrange<T>(orderBy)(items).slice(0, n);\n\n return _sliceMin;\n}\n\n// -------------------------------------------------------------------\n\n/**\n * Truncates the array to the last N items ordered by some key\n */\nexport function sliceMax<T extends object>(\n n: number,\n orderBy: SingleOrArray<Key | Comparator<T>>\n): TidyFn<T> {\n // note: we use desc() so we get proper handling of nullish values\n // unless they provided an explicit comparator.\n const _sliceMax: TidyFn<T> = (items: T[]): T[] =>\n typeof orderBy === 'function'\n ? arrange<T>(orderBy)(items).slice(-n).reverse()\n : arrange<T>(desc(orderBy as any))(items).slice(0, n);\n\n return _sliceMax;\n}\n\n// -------------------------------------------------------------------\n\ntype SampleOptions = {\n replace?: boolean;\n};\n/**\n * Truncates the array to the last N items ordered by some key\n */\nexport function sliceSample<T extends object>(\n n: number,\n options?: SampleOptions | null | undefined\n): TidyFn<T> {\n options = options ?? {};\n const { replace } = options;\n\n const _sliceSample: TidyFn<T> = (items: T[]) => {\n if (!items.length) return items.slice();\n\n // sample items with replacement\n if (replace) {\n const sliced = [];\n for (let i = 0; i < n; ++i) {\n sliced.push(items[Math.floor(Math.random() * items.length)]);\n }\n return sliced;\n }\n\n // sample items without replacement\n return shuffle(items.slice()).slice(0, n);\n };\n\n return _sliceSample;\n}\n"],"names":[],"mappings":";;;AAQgB,SAAA,KAAA,CACd,OACA,GACW,EAAA;AACX,EAAA,MAAM,SAAoB,CAAC,KAAA,KAAoB,KAAM,CAAA,KAAA,CAAM,OAAO,GAAG,CAAA,CAAA;AAErE,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAMO,MAAM,SAAY,GAAA,CAAmB,CAAc,KAAA,KAAA,CAAS,GAAG,CAAC,EAAA;AAMhE,MAAM,SAAY,GAAA,CAAmB,CAAc,KAAA,KAAA,CAAS,CAAC,CAAC,EAAA;AAOrD,SAAA,QAAA,CACd,GACA,OACW,EAAA;AACX,EAAM,MAAA,SAAA,GAAuB,CAAC,KAAA,KAC5B,OAAW,CAAA,OAAO,EAAE,KAAK,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAEvC,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAOgB,SAAA,QAAA,CACd,GACA,OACW,EAAA;AAGX,EAAM,MAAA,SAAA,GAAuB,CAAC,KAAA,KAC5B,OAAO,OAAA,KAAY,UACf,GAAA,OAAA,CAAW,OAAO,CAAA,CAAE,KAAK,CAAA,CAAE,KAAM,CAAA,CAAC,CAAC,CAAE,CAAA,OAAA,EACrC,GAAA,OAAA,CAAW,IAAK,CAAA,OAAc,CAAC,CAAA,CAAE,KAAK,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAExD,EAAO,OAAA,SAAA,CAAA;AACT,CAAA;AAUgB,SAAA,WAAA,CACd,GACA,OACW,EAAA;AACX,EAAA,OAAA,GAAU,4BAAW,EAAC,CAAA;AACtB,EAAM,MAAA,EAAE,SAAY,GAAA,OAAA,CAAA;AAEpB,EAAM,MAAA,YAAA,GAA0B,CAAC,KAAe,KAAA;AAC9C,IAAA,IAAI,CAAC,KAAA,CAAM,MAAQ,EAAA,OAAO,MAAM,KAAM,EAAA,CAAA;AAGtC,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,MAAM,SAAS,EAAC,CAAA;AAChB,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,EAAE,CAAG,EAAA;AAC1B,QAAO,MAAA,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,QAAW,GAAA,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA,CAAA;AAAA,OAC7D;AACA,MAAO,OAAA,MAAA,CAAA;AAAA,KACT;AAGA,IAAA,OAAO,QAAQ,KAAM,CAAA,KAAA,EAAO,CAAE,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA;AAAA,GAC1C,CAAA;AAEA,EAAO,OAAA,YAAA,CAAA;AACT;;;;"}
|
package/dist/es/summarize.js
CHANGED
|
@@ -9,9 +9,10 @@ function summarize(summarizeSpec, options) {
|
|
|
9
9
|
summarized[key] = summarizeSpec[key](items);
|
|
10
10
|
}
|
|
11
11
|
if (options.rest && items.length) {
|
|
12
|
+
const keysSet = new Set(keys);
|
|
12
13
|
const objectKeys = Object.keys(items[0]);
|
|
13
14
|
for (const objKey of objectKeys) {
|
|
14
|
-
if (
|
|
15
|
+
if (keysSet.has(objKey)) {
|
|
15
16
|
continue;
|
|
16
17
|
}
|
|
17
18
|
summarized[objKey] = options.rest(objKey)(items);
|
|
@@ -22,8 +23,7 @@ function summarize(summarizeSpec, options) {
|
|
|
22
23
|
return _summarize;
|
|
23
24
|
}
|
|
24
25
|
function _summarizeHelper(items, summaryFn, predicateFn, keys) {
|
|
25
|
-
if (!items.length)
|
|
26
|
-
return [];
|
|
26
|
+
if (!items.length) return [];
|
|
27
27
|
const summarized = {};
|
|
28
28
|
let keysArr;
|
|
29
29
|
if (keys == null) {
|
|
@@ -45,7 +45,9 @@ function _summarizeHelper(items, summaryFn, predicateFn, keys) {
|
|
|
45
45
|
continue;
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
summarized[key] = summaryFn(key)(
|
|
48
|
+
summarized[key] = summaryFn(key)(
|
|
49
|
+
items
|
|
50
|
+
);
|
|
49
51
|
}
|
|
50
52
|
return [summarized];
|
|
51
53
|
}
|
package/dist/es/summarize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize.js","sources":["../../src/summarize.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"summarize.js","sources":["../../src/summarize.ts"],"sourcesContent":["import { Prettify } from './type-utils';\nimport { singleOrArray } from './helpers/singleOrArray';\nimport { Key, TidyFn, Vector } from './types';\n\nexport type SummarizeSpec<T> = Record<Key, (items: T[]) => any>;\n\nexport interface SummarizeOptions<T = any> {\n rest?: (key: keyof T) => (items: T[]) => any;\n}\n\ntype SummarizedT<\n T extends object,\n SumSpec extends SummarizeSpec<T>,\n Options extends SummarizeOptions<T> | undefined\n> = {\n [K in keyof SumSpec]: ReturnType<SumSpec[K]>;\n} & (NonNullable<Options>['rest'] extends Function\n ? Omit<T, keyof SumSpec>\n : {});\n\n/**\n * summarizes items\n */\nexport function summarize<\n T extends object,\n SummarizedSpec extends SummarizeSpec<T> = SummarizeSpec<T>,\n Options extends SummarizeOptions<T> = SummarizeOptions<T>\n>(\n summarizeSpec: SummarizedSpec,\n options?: Options\n): TidyFn<T, Prettify<SummarizedT<T, SummarizedSpec, Options>>> {\n type Output = SummarizedT<T, SummarizedSpec, Options>;\n\n const _summarize: TidyFn<T, Prettify<Output>> = (\n items: T[]\n ): Prettify<Output>[] => {\n options = options ?? ({} as Options);\n\n // reduce but use a loop to be more readable\n const summarized = {} as Output;\n const keys = Object.keys(summarizeSpec) as (keyof SummarizedSpec)[];\n\n for (const key of keys) {\n summarized[key as keyof Output] = summarizeSpec[key](items);\n }\n\n // if we a function to apply to the rest of the keys is supplied, use it\n // TODO: improve types for rest\n if (options.rest && items.length) {\n const keysSet = new Set<string | number | symbol>(keys);\n const objectKeys = Object.keys(items[0]) as (keyof T)[];\n for (const objKey of objectKeys) {\n if (keysSet.has(objKey as any)) {\n continue;\n }\n\n (summarized as any)[objKey] = options.rest(objKey)(items);\n }\n }\n\n return [summarized] as Prettify<Output>[];\n };\n\n return _summarize;\n}\n\n/*-------- summarize helpers ----------------------------------------*/\n\nexport type SummaryKeyFn<T, K = keyof T> = (key: K) => (items: T[]) => any;\n\nfunction _summarizeHelper<\n T extends object,\n SummarizedT extends object = { [K in keyof T]: any }\n>(\n items: T[],\n summaryFn: SummaryKeyFn<T>,\n predicateFn?: (vector: Vector<T>) => boolean,\n keys?: Array<keyof T | ((items: T[]) => (keyof T)[])>\n): SummarizedT[] {\n if (!items.length) return [];\n\n // reduce but use a loop to be more readable\n const summarized = {} as SummarizedT;\n\n // read in keys from first object if not provided\n let keysArr: (keyof T)[];\n if (keys == null) {\n keysArr = Object.keys(items[0]) as (keyof T)[];\n } else {\n // expand them all to a flat list of keys\n keysArr = [];\n for (const keyInput of singleOrArray(keys as any)) {\n if (typeof keyInput === 'function') {\n keysArr.push(...(keyInput(items) as (keyof T)[]));\n } else {\n keysArr.push(keyInput);\n }\n }\n }\n\n for (const key of keysArr) {\n if (predicateFn) {\n // inefficient to compute this vector here, wonder if it should\n // be computed prior to this func being called somehow? (TODO)\n const vector = items.map((d) => d[key]);\n if (!predicateFn(vector)) {\n continue;\n }\n }\n summarized[key as unknown as keyof SummarizedT] = summaryFn(key)(\n items\n ) as any;\n }\n\n return [summarized];\n}\n\n/*---- summarizeAll() --------------------------------------------*/\n\ntype SummaryFnOutput<T extends object, F extends SummaryKeyFn<T>> = ReturnType<\n ReturnType<F>\n>;\n\nexport function summarizeAll<T extends object, F extends SummaryKeyFn<T>>(\n summaryFn: F\n): TidyFn<T, Prettify<Record<keyof T, SummaryFnOutput<T, F>>>> {\n const _summarizeAll: TidyFn<\n T,\n Prettify<Record<keyof T, SummaryFnOutput<T, F>>>\n > = (items: T[]): Prettify<Record<keyof T, SummaryFnOutput<T, F>>>[] =>\n _summarizeHelper(items, summaryFn);\n\n return _summarizeAll;\n}\n\n/*---- summarizeIf() --------------------------------------------*/\n// type is not perfect since it returns all keys of T, but better to have more than less I figure\nexport function summarizeIf<T extends object, F extends SummaryKeyFn<T>>(\n predicateFn: (vector: Vector<T>) => boolean,\n summaryFn: F\n): TidyFn<T, Prettify<Record<keyof T, SummaryFnOutput<T, F>>>> {\n const _summarizeIf: TidyFn<\n T,\n Prettify<Record<keyof T, SummaryFnOutput<T, F>>>\n > = (items: T[]): Prettify<Record<keyof T, SummaryFnOutput<T, F>>>[] =>\n _summarizeHelper(items, summaryFn, predicateFn);\n\n return _summarizeIf;\n}\n\n/*---- summarizeAt() --------------------------------------------*/\nexport function summarizeAt<\n T extends object,\n Keys extends (keyof T)[],\n F extends SummaryKeyFn<T, Keys[number]>\n>(\n keys: Keys,\n summaryFn: F\n): TidyFn<T, Prettify<Record<Keys[number], SummaryFnOutput<T, F>>>> {\n const _summarizeAt: TidyFn<\n T,\n Prettify<Record<Keys[number], SummaryFnOutput<T, F>>>\n > = (items: T[]): Prettify<Record<Keys[number], SummaryFnOutput<T, F>>>[] =>\n _summarizeHelper(items, summaryFn, undefined, keys);\n\n return _summarizeAt;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviation.js","sources":["../../../src/summary/deviation.ts"],"sourcesContent":["import { deviation as d3deviation } from 'd3-array';\n\n/**\n * Returns a function that computes the deviation over an array of items\n * @param key A string key of the object or an accessor converting the object to a number\n */\nexport function deviation<T extends object>(\n key: keyof T | ((d: T, index: number, array: Iterable<T>) => number)\n) {\n const keyFn =\n typeof key === 'function' ? key : (d: T) =>
|
|
1
|
+
{"version":3,"file":"deviation.js","sources":["../../../src/summary/deviation.ts"],"sourcesContent":["import { deviation as d3deviation } from 'd3-array';\n\n/**\n * Returns a function that computes the deviation over an array of items\n * @param key A string key of the object or an accessor converting the object to a number\n */\nexport function deviation<T extends object>(\n key: keyof T | ((d: T, index: number, array: Iterable<T>) => number)\n) {\n const keyFn =\n typeof key === 'function' ? key : (d: T) => d[key] as unknown as number;\n\n return (items: T[]) => d3deviation(items, keyFn);\n}\n"],"names":["d3deviation"],"mappings":";;AAMO,SAAS,UACd,GACA,EAAA;AACA,EAAM,MAAA,KAAA,GACJ,OAAO,GAAQ,KAAA,UAAA,GAAa,MAAM,CAAC,CAAA,KAAS,EAAE,GAAG,CAAA,CAAA;AAEnD,EAAA,OAAO,CAAC,KAAA,KAAeA,WAAY,CAAA,KAAA,EAAO,KAAK,CAAA,CAAA;AACjD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"first.js","sources":["../../../src/summary/first.ts"],"sourcesContent":["/**\n * Returns a function that returns the first value for the specified key\n * @param key A string key of the object or an accessor converting the object to a number\n */\nexport function first<T extends object>(key: keyof T | ((d: T) => any)) {\n const keyFn = typeof key === 'function' ? key : (d: T) => d[key];\n\n return (items: T[]) => (items.length ? keyFn(items[0]) : undefined);\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"first.js","sources":["../../../src/summary/first.ts"],"sourcesContent":["/**\n * Returns a function that returns the first value for the specified key\n * @param key A string key of the object or an accessor converting the object to a number\n */\nexport function first<T extends object>(key: keyof T | ((d: T) => any)) {\n const keyFn = typeof key === 'function' ? key : (d: T) => d[key];\n\n return (items: T[]) => (items.length ? keyFn(items[0]) : undefined);\n}\n"],"names":[],"mappings":"AAIO,SAAS,MAAwB,GAAgC,EAAA;AACtE,EAAM,MAAA,KAAA,GAAQ,OAAO,GAAQ,KAAA,UAAA,GAAa,MAAM,CAAC,CAAA,KAAS,EAAE,GAAG,CAAA,CAAA;AAE/D,EAAO,OAAA,CAAC,UAAgB,KAAM,CAAA,MAAA,GAAS,MAAM,KAAM,CAAA,CAAC,CAAC,CAAI,GAAA,KAAA,CAAA,CAAA;AAC3D;;;;"}
|