From 8496c824b31484edc03e195af28c75dedd2a5c08 Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Sun, 23 May 2021 15:52:40 -0400 Subject: [PATCH 01/16] feat: prepare for use grouping options --- .eslintrc.js | 2 +- examples/filter-action/src/App.tsx | 2 +- packages/hooks/src/grouping/baseGroupBy.ts | 2 +- .../hooks/src/grouping/categoricalGroupBy.ts | 2 +- .../src/grouping/categoricalSetGroupBy.ts | 3 +- .../src/grouping/columnSpecificGroupByFn.ts | 19 ++-- packages/hooks/src/grouping/dateGroupBy.ts | 9 +- packages/hooks/src/grouping/numberGroupBy.ts | 1 + packages/hooks/src/grouping/textGroupBy.ts | 12 +-- .../hooks/src/hooks/useGroupingOptions.ts | 86 +++++++++++++++++++ packages/hooks/src/hooks/useStats.ts | 35 +++----- packages/hooks/src/interfaces.ts | 21 ++--- tsconfig.eslint.json | 12 ++- 13 files changed, 146 insertions(+), 60 deletions(-) create mode 100644 packages/hooks/src/hooks/useGroupingOptions.ts diff --git a/.eslintrc.js b/.eslintrc.js index 54b3df5..40a8a88 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,7 +13,7 @@ module.exports = { 'prettier', ], parserOptions: { - project: './tsconfig.json', + project: './tsconfig.eslint.json', }, settings: { react: { diff --git a/examples/filter-action/src/App.tsx b/examples/filter-action/src/App.tsx index 392fcf5..4a2b85f 100644 --- a/examples/filter-action/src/App.tsx +++ b/examples/filter-action/src/App.tsx @@ -24,7 +24,7 @@ import '@lineup-lite/table/dist/table.css'; import { data, Row } from './data'; function MyFilterAction(props: { col: ColumnInstance; icons: ActionIcons }) { - const col = (props.col as unknown) as ColumnInstance & UseFiltersColumnProps; + const col = props.col as unknown as ColumnInstance & UseFiltersColumnProps; const [visible, setVisible] = useState(false); const showFilterDialog = useCallback(() => { diff --git a/packages/hooks/src/grouping/baseGroupBy.ts b/packages/hooks/src/grouping/baseGroupBy.ts index 9fea242..a4bd5a1 100644 --- a/packages/hooks/src/grouping/baseGroupBy.ts +++ b/packages/hooks/src/grouping/baseGroupBy.ts @@ -11,7 +11,7 @@ import { compareAsc } from '../sort/internal'; import { MISSING_GROUP } from './histGroupBy'; export default function baseGroupBy( - rows: Row[], + rows: readonly Row[], column: ColumnInstance, acc: (v: unknown) => string | null = (v) => (v ? String(v) : null) ): Record[]> { diff --git a/packages/hooks/src/grouping/categoricalGroupBy.ts b/packages/hooks/src/grouping/categoricalGroupBy.ts index d8d99ee..f1af786 100644 --- a/packages/hooks/src/grouping/categoricalGroupBy.ts +++ b/packages/hooks/src/grouping/categoricalGroupBy.ts @@ -12,7 +12,7 @@ import type { UseStatsColumnProps } from '../hooks'; import type { AnyObject, UnknownObject } from '../interfaces'; export default function categoricalGroupBy( - rows: Row[], + rows: readonly Row[], column: ColumnInstance ): Record[]> { if (rows.length === 0) { diff --git a/packages/hooks/src/grouping/categoricalSetGroupBy.ts b/packages/hooks/src/grouping/categoricalSetGroupBy.ts index ab26328..643ad88 100644 --- a/packages/hooks/src/grouping/categoricalSetGroupBy.ts +++ b/packages/hooks/src/grouping/categoricalSetGroupBy.ts @@ -13,7 +13,7 @@ import type { UseStatsColumnProps } from '../hooks'; import type { AnyObject, UnknownObject } from '../interfaces'; export default function categoricalSetGroupBy( - rows: Row[], + rows: readonly Row[], column: ColumnInstance ): Record[]> { if (rows.length === 0) { @@ -21,5 +21,6 @@ export default function categoricalSetGroupBy (d == null ? null : [...(d as string[])].sort(sorter).join(','))); } diff --git a/packages/hooks/src/grouping/columnSpecificGroupByFn.ts b/packages/hooks/src/grouping/columnSpecificGroupByFn.ts index 95f12b4..8d367bc 100644 --- a/packages/hooks/src/grouping/columnSpecificGroupByFn.ts +++ b/packages/hooks/src/grouping/columnSpecificGroupByFn.ts @@ -5,9 +5,18 @@ * Copyright (c) 2021 Samuel Gratzl */ -import { Row, IdType, defaultGroupByFn } from 'react-table'; -import type { AnyObject, UnknownObject, UseColumnGroupByColumnOptions } from '../interfaces'; +import { Row, IdType, defaultGroupByFn, Cell } from 'react-table'; +import type { AnyObject, LineUpLiteGroupByFunction, UnknownObject, UseColumnGroupByColumnOptions } from '../interfaces'; +function hasGroupByFunction( + cell?: unknown +): cell is { column: { groupBy: LineUpLiteGroupByFunction } } { + return ( + cell != null && + (cell as Cell).column != null && + typeof ((cell as Cell).column as UseColumnGroupByColumnOptions).groupBy === 'function' + ); +} /** * helper function to defer the grouping logic to the column * @param rows @@ -20,10 +29,10 @@ export default function columnSpecificGroupByFn d.column.id === columnId); - if (column && typeof (column.column as UseColumnGroupByColumnOptions).groupBy) { + const cell: Cell | undefined = rows[0].allCells.find((d) => d.column.id === columnId); + if (hasGroupByFunction(cell)) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return (column.column as UseColumnGroupByColumnOptions).groupBy!(rows, column.column); + return cell.column.groupBy(rows, cell.column); } return defaultGroupByFn(rows, columnId); } diff --git a/packages/hooks/src/grouping/dateGroupBy.ts b/packages/hooks/src/grouping/dateGroupBy.ts index fb7f4c8..86cd63c 100644 --- a/packages/hooks/src/grouping/dateGroupBy.ts +++ b/packages/hooks/src/grouping/dateGroupBy.ts @@ -6,12 +6,17 @@ */ import type { ColumnInstance, Row } from 'react-table'; -import type { AnyObject, UnknownObject } from '../interfaces'; +import type { AnyObject, LineUpLiteGroupByFunction, UnknownObject } from '../interfaces'; import { histGroupBy } from './histGroupBy'; export default function dateGroupBy( - rows: Row[], + rows: readonly Row[], column: ColumnInstance ): Record[]> { + // TODO options return histGroupBy(rows, column); } + +export function dateGroupByFactory(): LineUpLiteGroupByFunction { + return dateGroupBy; +} diff --git a/packages/hooks/src/grouping/numberGroupBy.ts b/packages/hooks/src/grouping/numberGroupBy.ts index 66ed461..7fd4a5d 100644 --- a/packages/hooks/src/grouping/numberGroupBy.ts +++ b/packages/hooks/src/grouping/numberGroupBy.ts @@ -13,5 +13,6 @@ export default function numberGroupBy( rows: Row[], column: ColumnInstance ): Record[]> { + // TODO options return histGroupBy(rows, column); } diff --git a/packages/hooks/src/grouping/textGroupBy.ts b/packages/hooks/src/grouping/textGroupBy.ts index a5d9de2..e9c0b5e 100644 --- a/packages/hooks/src/grouping/textGroupBy.ts +++ b/packages/hooks/src/grouping/textGroupBy.ts @@ -13,14 +13,6 @@ export default function textGroupBy( rows: Row[], column: ColumnInstance ): Record[]> { - const base = baseGroupBy(rows, column); - - // sort groups by value not by first come first ordered - const sorted: Record[]> = {}; - Object.entries(base) - .sort((a, b) => a[0].localeCompare(b[0])) - .forEach(([key, value]) => { - sorted[key] = value; - }); - return sorted; + // TODO options + return baseGroupBy(rows, column); } diff --git a/packages/hooks/src/hooks/useGroupingOptions.ts b/packages/hooks/src/hooks/useGroupingOptions.ts new file mode 100644 index 0000000..9b4b4ca --- /dev/null +++ b/packages/hooks/src/hooks/useGroupingOptions.ts @@ -0,0 +1,86 @@ +/** + * @lineup-lite/hooks + * https://github.com/sgratzl/lineup-lite + * + * Copyright (c) 2021 Samuel Gratzl + */ + +import { + CellProps, + ColumnInstance, + ensurePluginOrder, + HeaderProps, + Hooks, + IdType, + Renderer, + Row, + TableInstance, +} from 'react-table'; +import type { AnyObject, UnknownObject } from '../types'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface UseGroupingOptionsOptions {} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type GroupingOptionsValue = any; +export type GroupingOptions = Array<{ id: IdType; value: GroupingOptionsValue }>; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface UseGroupingOptionsState { + groupingOptions: GroupingOptions; +} + +export interface UseGroupingOptionsColumnOptions { + /** + * renderer used to render the group cell + */ + Group?: Renderer; + /** + * group by function for this column + */ + groupBy?: UseGroupingOptionGroupingFunction; +} + +export interface UseGroupingOptionGroupingFunction { + (rows: readonly Row[], column: ColumnInstance): Record[]>; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface UseGroupingOptionsInstanceProps {} + +export interface UseGroupingOptionsColumnProps { + setGroupingOptions: ( + updater: ((groupingOption: GroupingOptionsValue) => GroupingOptionsValue) | GroupingOptionsValue + ) => void; + groupingOptions: GroupingOptionsValue; +} + +export type GroupingOptionsProps = HeaderProps & { + column: UseGroupingOptionsColumnProps; + i18n?: Record; +}; +export type StatsCellProps = CellProps & { + column: UseGroupingOptionsColumnProps; + i18n?: Record; +}; + +export function useGroupingOptions(hooks: Hooks): void { + hooks.useInstance.push(useInstance); +} +useGroupingOptions.pluginName = 'useGroupingOptions'; + +function useInstance(instance: TableInstance) { + ensurePluginOrder(instance.plugins, ['useGroupBy'], 'useGroupingOptions'); + + // const extendedInstance = instance as unknown as TableInstance & UseGroupByInstanceProps; + + // instance.allColumns.forEach((col) => { + // // const extended = col as unknown as UseGroupingOptionsColumnProps & + // // UseGroupingOptionsColumnOptions & + // // UseGroupByColumnProps; + // // const flat = extendedInstance.nonGroupedFlatRows ?? instance.flatRows; + // // const values = flat.map((row) => row.values[col.id]); + // // compute current stats + // // extended.statsValue = extended.stats(values, extended.preFilterStatsValue); + // }); +} diff --git a/packages/hooks/src/hooks/useStats.ts b/packages/hooks/src/hooks/useStats.ts index eefa5d2..b6c8251 100644 --- a/packages/hooks/src/hooks/useStats.ts +++ b/packages/hooks/src/hooks/useStats.ts @@ -8,7 +8,6 @@ import { HeaderProps, Hooks, - IdType, Renderer, TableInstance, UseFiltersInstanceProps, @@ -20,20 +19,24 @@ import { } from 'react-table'; import type { AnyObject, UnknownObject } from '../types'; -export type UseStatsOptions = Partial<{ - manualStats: boolean; - autoResetStats?: boolean; -}>; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type StatsValue = any; -export interface UseStatsState { - Stats: Stats; +export interface StatsType { + (values: readonly unknown[], preFilterStats?: unknown): unknown; } -export type UseStatsColumnOptions = Partial<{ - Summary: Renderer>; - stats: StatsType; +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface UseStatsOptions {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface UseStatsState {} + +export interface UseStatsColumnOptions { + Summary?: Renderer>; + stats?: StatsType; // grouper: -}>; +} // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface UseStatsInstanceProps {} @@ -52,16 +55,6 @@ export type StatsCellProps = CellProps & column: UseStatsColumnProps; i18n?: Record; }; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type StatsValue = any; -export type Stats = Array<{ - id: IdType; - value: StatsValue; -}>; - -export interface StatsType { - (values: readonly unknown[], preFilterStats?: unknown): unknown; -} export type StatsAggregateArray = T[] & { _aggregate?: (gen: (vs: T[], preFilter?: V) => V, stats?: V) => unknown; diff --git a/packages/hooks/src/interfaces.ts b/packages/hooks/src/interfaces.ts index 180c97a..3cb04ca 100644 --- a/packages/hooks/src/interfaces.ts +++ b/packages/hooks/src/interfaces.ts @@ -7,9 +7,6 @@ import type { Column, - ColumnInstance, - Renderer, - Row, UseFiltersColumnOptions, UseGroupByColumnOptions, UseResizeColumnsColumnOptions, @@ -17,19 +14,13 @@ import type { } from 'react-table'; import type { UseStatsColumnOptions } from './hooks/useStats'; import type { AnyObject, UnknownObject } from './types'; +import type { UseGroupingOptionsColumnOptions } from './hooks/useGroupingOptions'; export type { AnyObject, UnknownObject } from './types'; - -export interface UseColumnGroupByColumnOptions { - /** - * renderer used to render the group cell - */ - Group?: Renderer; - /** - * group by function for this column - */ - groupBy?(rows: readonly Row[], column: ColumnInstance): { [key: string]: Row[] }; -} +export type { + UseGroupingOptionGroupingFunction as LineUpLiteGroupByFunction, + UseGroupingOptionsColumnOptions as UseColumnGroupByColumnOptions, +} from './hooks/useGroupingOptions'; /** * a lineup lite column description @@ -40,7 +31,7 @@ export type LineUpLiteColumn = Column & UseSortByColumnOptions & UseStatsColumnOptions & UseResizeColumnsColumnOptions & - UseColumnGroupByColumnOptions & { + UseGroupingOptionsColumnOptions & { canHide?: boolean; isSupport?: boolean; tooltip?: string; diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index aee30d0..79fab33 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,4 +1,12 @@ { "extends": "./tsconfig.json", - "include": ["src/**/*.ts", "src/**/*.tsx", "*.js"] -} + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "packages/*/src/**/*.ts", + "packages/*/src/**/*.tsx", + "examples/*/src/**/*.ts", + "examples/*/src/**/*.tsx", + "*.js" + ] +} \ No newline at end of file From 116bfb36e392f59ffe1cef0c9238a51a24fd068c Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Sun, 23 May 2021 16:39:25 -0400 Subject: [PATCH 02/16] build: another exports fix --- packages/components/package.json | 4 ++-- packages/hooks/package.json | 4 ++-- packages/table/package.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/components/package.json b/packages/components/package.json index 2506407..dee7ce5 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -33,8 +33,8 @@ "style": "./dist/components.css", "types": "./dist/index.d.ts" }, - "./src/*": "./dist/*/*.js", - "./dist/*": "./dist/*/*" + "./src/*": "./dist/*.js", + "./dist/*": "./dist/*" }, "types": "dist/index.d.ts", "sideEffects": "dist/components.css", diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 7339e31..e46dff8 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -34,8 +34,8 @@ "style": "./dist/hooks.css", "types": "./dist/index.d.ts" }, - "./src/*": "./dist/*/*.js", - "./dist/*": "./dist/*/*" + "./src/*": "./dist/*.js", + "./dist/*": "./dist/*" }, "sideEffects": "dist/hooks.css", "files": [ diff --git a/packages/table/package.json b/packages/table/package.json index 3d8ffcd..29244be 100644 --- a/packages/table/package.json +++ b/packages/table/package.json @@ -38,8 +38,8 @@ "style": "./dist/table.css", "types": "./dist/index.d.ts" }, - "./src/*": "./dist/*/*.js", - "./dist/*": "./dist/*/*" + "./src/*": "./dist/*.js", + "./dist/*": "./dist/*" }, "sideEffects": "dist/table.css", "files": [ From e69ca51d55a730fc7d2c41976b96831596f0734e Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Sun, 23 May 2021 21:58:18 -0400 Subject: [PATCH 03/16] feat: add grouping options for groupings --- packages/hooks/package.json | 3 +- packages/hooks/src/grouping/baseGroupBy.ts | 25 +- .../src/grouping/columnSpecificGroupByFn.ts | 4 +- packages/hooks/src/grouping/dateGroupBy.ts | 265 +++++++++++++++++- packages/hooks/src/grouping/index.ts | 13 +- packages/hooks/src/grouping/numberGroupBy.ts | 81 +++++- packages/hooks/src/grouping/textGroupBy.ts | 60 +++- .../hooks/src/hooks/useGroupingOptions.ts | 2 +- 8 files changed, 423 insertions(+), 30 deletions(-) diff --git a/packages/hooks/package.json b/packages/hooks/package.json index bc0b082..e4511e9 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -21,7 +21,8 @@ "url": "https://github.com/sgratzl/lineup-lite.git" }, "dependencies": { - "@lineup-lite/components": "~1.5.3" + "@lineup-lite/components": "~1.5.3", + "date-fns": "^2.21.3" }, "main": "dist/hooks.cjs", "module": "dist/index.js", diff --git a/packages/hooks/src/grouping/baseGroupBy.ts b/packages/hooks/src/grouping/baseGroupBy.ts index a4bd5a1..d849287 100644 --- a/packages/hooks/src/grouping/baseGroupBy.ts +++ b/packages/hooks/src/grouping/baseGroupBy.ts @@ -10,6 +10,24 @@ import type { AnyObject, UnknownObject } from '../interfaces'; import { compareAsc } from '../sort/internal'; import { MISSING_GROUP } from './histGroupBy'; +export function compareMissing(a: string, b: string): number { + if (a === MISSING_GROUP) { + return b === MISSING_GROUP ? 0 : 1; + } + if (b === MISSING_GROUP) { + return -1; + } + return compareAsc(a, b); +} +export function sortGroups(r: Record[]>): Record[]> { + // sort by key asc + const sorted: Record[]> = {}; + for (const key of Object.keys(r).sort(compareMissing)) { + sorted[key] = r[key]; + } + return sorted; +} + export default function baseGroupBy( rows: readonly Row[], column: ColumnInstance, @@ -25,10 +43,5 @@ export default function baseGroupBy( rValue.push(row); } } - // sort by key asc - const sorted: Record[]> = {}; - for (const key of Object.keys(r).sort(compareAsc)) { - sorted[key] = r[key]; - } - return sorted; + return sortGroups(r); } diff --git a/packages/hooks/src/grouping/columnSpecificGroupByFn.ts b/packages/hooks/src/grouping/columnSpecificGroupByFn.ts index 8d367bc..c6c8502 100644 --- a/packages/hooks/src/grouping/columnSpecificGroupByFn.ts +++ b/packages/hooks/src/grouping/columnSpecificGroupByFn.ts @@ -6,6 +6,7 @@ */ import { Row, IdType, defaultGroupByFn, Cell } from 'react-table'; +import type { UseGroupingOptionsColumnProps } from '../hooks/useGroupingOptions'; import type { AnyObject, LineUpLiteGroupByFunction, UnknownObject, UseColumnGroupByColumnOptions } from '../interfaces'; function hasGroupByFunction( @@ -31,8 +32,7 @@ export default function columnSpecificGroupByFn | undefined = rows[0].allCells.find((d) => d.column.id === columnId); if (hasGroupByFunction(cell)) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return cell.column.groupBy(rows, cell.column); + return cell.column.groupBy(rows, cell.column, (cell as Partial).groupingOptions); } return defaultGroupByFn(rows, columnId); } diff --git a/packages/hooks/src/grouping/dateGroupBy.ts b/packages/hooks/src/grouping/dateGroupBy.ts index 86cd63c..968288d 100644 --- a/packages/hooks/src/grouping/dateGroupBy.ts +++ b/packages/hooks/src/grouping/dateGroupBy.ts @@ -6,17 +6,268 @@ */ import type { ColumnInstance, Row } from 'react-table'; -import type { AnyObject, LineUpLiteGroupByFunction, UnknownObject } from '../interfaces'; -import { histGroupBy } from './histGroupBy'; +import { + format, + startOfDay, + startOfHour, + startOfMinute, + startOfMonth, + startOfQuarter, + startOfSecond, + getDayOfYear, + startOfWeek, + getWeek, + getQuarter, +} from 'date-fns'; +import type { UnknownObject } from '../interfaces'; +import { histGroupBy, MISSING_GROUP } from './histGroupBy'; +import type { AnyObject } from '../types'; + +export declare type DateGroupByGranularity = + | 'century' + | 'decade' + | 'year' + | 'quarter' + | 'month' + | 'week' + | 'day_of_week' + | 'day_of_month' + | 'day_of_year' + | 'hour' + | 'minute' + | 'second'; + +export interface DateGroupByOptions { + /** + * granularity level for the grouping + */ + granularity: DateGroupByGranularity; + /** + * whether circular occurrences should be in the same bin + * e.g. granularity = month + * circular: 01.2018 == 01.2017 + * not circular: 01.2018 != 01.2017 + */ + circular: boolean; +} + +function padLeft(v: number | string, size = 2) { + const s = String(v); + if (s.length >= size) { + return s; + } + if (typeof s.padStart === 'function') { + return s.padStart(size, '0'); + } + const rest = size - s.length; + if (rest === 1) { + return `0${s}`; + } + if (rest === 2) { + return `00${s}`; + } + return `${Array(rest).fill('0').join()}${s}`; +} + +function toGroup(value: Date | null, grouper: DateGroupByOptions): { name: string; value: number } { + if (value == null) { + return { name: MISSING_GROUP, value: Number.NaN }; + } + switch (grouper.granularity) { + case 'century': { + const centuryP = Math.floor(value.getFullYear() / 100); + if (grouper.circular) { + const century = centuryP % 10; + return { + value: century, + name: `*${century}00`, + }; + } + return { + value: centuryP, + name: `${centuryP}00`, + }; + } + case 'decade': { + const decadeP = Math.floor(value.getFullYear() / 10); + if (grouper.circular) { + const decade = decadeP % 10; + return { + value: decade, + name: `**${decade}0`, + }; + } + return { + value: decadeP, + name: `${decadeP}0`, + }; + } + case 'year': + if (grouper.circular) { + const year = value.getFullYear() % 10; + return { + value: year, + name: `***${year}`, + }; + } + return { + value: value.getFullYear(), + name: format(value, 'yyyy'), + }; + case 'quarter': + if (grouper.circular) { + return { + value: getQuarter(value), + name: format(value, 'qqq'), + }; + } + return { + value: startOfQuarter(value).getTime(), + name: format(value, 'yyyy qqq'), + }; + case 'month': + if (grouper.circular) { + return { + value: value.getMonth(), + name: format(value, 'LLLL'), + }; + } + return { + value: startOfMonth(value).getTime(), + name: format(value, 'yyyy LLLL'), + }; + case 'week': + if (grouper.circular) { + return { + value: getWeek(value), + name: format(value, 'ww'), + }; + } + return { + value: startOfWeek(value).getTime(), + name: format(value, 'yyyy ww'), + }; + case 'day_of_week': { + if (grouper.circular) { + return { + value: value.getDay(), + name: format(value, 'cccc'), + }; + } + const s = startOfDay(value); + return { + value: s.getTime(), + name: format(s, 'PPP'), + }; + } + case 'day_of_month': { + if (grouper.circular) { + return { + value: value.getDate(), + name: padLeft(value.getDate()), + }; + } + const s = startOfDay(value); + return { + value: s.getTime(), + name: format(s, 'PPP'), + }; + } + case 'day_of_year': { + if (grouper.circular) { + // %j = day of year + const v = getDayOfYear(value); + return { + value: v, + name: format(value, 'DDD'), + }; + } + const s = startOfDay(value); + return { + value: s.getTime(), + name: format(s, 'PPP'), + }; + } + case 'hour': { + if (grouper.circular) { + return { + value: value.getHours(), + name: padLeft(value.getHours(), 2), + }; + } + const s = startOfHour(value); + return { + value: s.getTime(), + name: format(s, 'PPpp'), + }; + } + case 'minute': { + if (grouper.circular) { + return { + value: value.getMinutes(), + name: padLeft(value.getMinutes()), + }; + } + const s = startOfMinute(value); + return { + value: s.getTime(), + name: format(s, 'PPpp'), + }; + } + default: { + if (grouper.circular) { + return { + value: value.getSeconds(), + name: padLeft(value.getSeconds()), + }; + } + const s = startOfSecond(value); + return { + value: s.getTime(), + name: format(s, 'PPpp'), + }; + } + } +} export default function dateGroupBy( rows: readonly Row[], - column: ColumnInstance + column: ColumnInstance, + options?: DateGroupByOptions ): Record[]> { - // TODO options - return histGroupBy(rows, column); + if (!options) { + return histGroupBy(rows, column); + } + const map = new Map[]; name: string; value: number }>(); + for (const row of rows) { + const v = (row.values[column.id] as Date) ?? null; + const group = toGroup(v, options); + const entry = map.get(group.name); + if (entry) { + entry.rows.push(row); + } else { + map.set(group.name, { rows: [row], ...group }); + } + } + const r: Record[]> = {}; + Array.from(map.values()) + .sort((a, b) => { + if (a.name === MISSING_GROUP) { + return b.name === MISSING_GROUP ? 0 : 1; + } + if (b.name === MISSING_GROUP) { + return -1; + } + return a.value - b.value; + }) + .forEach((entry) => { + r[entry.name] = entry.rows; + }); + return r; } -export function dateGroupByFactory(): LineUpLiteGroupByFunction { - return dateGroupBy; +export function dateGroupByFactory( + options: DateGroupByOptions +): (rows: readonly Row[], column: ColumnInstance, options?: DateGroupByOptions) => Record[]> { + return (rows, column, o?: DateGroupByOptions) => dateGroupBy(rows, column, o ?? options); } diff --git a/packages/hooks/src/grouping/index.ts b/packages/hooks/src/grouping/index.ts index 239e532..256834c 100644 --- a/packages/hooks/src/grouping/index.ts +++ b/packages/hooks/src/grouping/index.ts @@ -7,7 +7,14 @@ export { default as columnSpecificGroupByFn } from './columnSpecificGroupByFn'; export { default as categoricalGroupBy } from './categoricalGroupBy'; -export { default as dateGroupBy } from './dateGroupBy'; -export { default as numberGroupBy } from './numberGroupBy'; -export { default as textGroupBy } from './textGroupBy'; +export { default as dateGroupBy, DateGroupByGranularity, DateGroupByOptions, dateGroupByFactory } from './dateGroupBy'; +export { default as numberGroupBy, NumberGroupByOptions, numberGroupByFactory } from './numberGroupBy'; +export { + default as textGroupBy, + TextGroupByOptions, + TextGroupByRegexOptions, + TextGroupByStartsWithOptions, + TextGroupByValueOptions, + textGroupByFactory, +} from './textGroupBy'; export { default as categoricalSetGroupBy } from './categoricalSetGroupBy'; diff --git a/packages/hooks/src/grouping/numberGroupBy.ts b/packages/hooks/src/grouping/numberGroupBy.ts index 7fd4a5d..a3618b2 100644 --- a/packages/hooks/src/grouping/numberGroupBy.ts +++ b/packages/hooks/src/grouping/numberGroupBy.ts @@ -6,13 +6,84 @@ */ import type { ColumnInstance, Row } from 'react-table'; +import type { INumberStats } from '@lineup-lite/components'; +import type { UseStatsColumnProps } from '../hooks'; import type { AnyObject, UnknownObject } from '../interfaces'; -import { histGroupBy } from './histGroupBy'; +import { histGroupBy, MISSING_GROUP } from './histGroupBy'; + +export interface NumberGroupByOptions { + thresholds: number[]; +} export default function numberGroupBy( - rows: Row[], - column: ColumnInstance + rows: readonly Row[], + column: ColumnInstance, + options?: NumberGroupByOptions ): Record[]> { - // TODO options - return histGroupBy(rows, column); + if (!options) { + return histGroupBy(rows, column); + } + const stats = (column as unknown as UseStatsColumnProps).statsValue as INumberStats | null; + let { thresholds } = options; + if (!thresholds || thresholds.length === 0) { + // default threshold + if (stats) { + thresholds = [(stats.max - stats.min) / 2]; + } else { + thresholds = [0.5]; + } + } + if (thresholds.length === 0) { + return histGroupBy(rows, column); + } + const groups: { label: string; rows: Row[]; value: number }[] = thresholds.map((v, i) => { + if (i === 0) { + return { + label: `<= ${stats?.format(v) ?? v.toLocaleString()}`, + rows: [], + value: v, + }; + } + const prev = thresholds[i - 1]; + return { + label: `]${stats?.format(prev) ?? prev.toLocaleString()} ... ${stats?.format(v) ?? v.toLocaleString()}]`, + rows: [], + value: v, + }; + }); + const last = thresholds[thresholds.length - 1]; + const largest = { + label: `>= ${stats?.format(last) ?? last.toLocaleString()}`, + rows: [], + value: last, + }; + const r: Record[]> = {}; + for (const v of groups) { + r[v.value] = []; + } + r[largest.label] = largest.rows; + r[MISSING_GROUP] = []; + + for (const row of rows) { + const v = (row.values[column.id] as number) ?? null; + if (v == null) { + r[MISSING_GROUP].push(row); + continue; + } + const group = groups.find((g) => v < g.value) ?? largest; + group.rows.push(row); + } + + for (const key of Object.keys(r)) { + if (r[key].length === 0) { + delete r[key]; + } + } + return r; +} + +export function numberGroupByFactory( + options: NumberGroupByOptions +): (rows: readonly Row[], column: ColumnInstance, options?: NumberGroupByOptions) => Record[]> { + return (rows, column, o?: NumberGroupByOptions) => numberGroupBy(rows, column, o ?? options); } diff --git a/packages/hooks/src/grouping/textGroupBy.ts b/packages/hooks/src/grouping/textGroupBy.ts index e9c0b5e..17c5057 100644 --- a/packages/hooks/src/grouping/textGroupBy.ts +++ b/packages/hooks/src/grouping/textGroupBy.ts @@ -7,12 +7,62 @@ import type { ColumnInstance, Row } from 'react-table'; import type { AnyObject, UnknownObject } from '../interfaces'; -import baseGroupBy from './baseGroupBy'; +import baseGroupBy, { sortGroups } from './baseGroupBy'; +import { MISSING_GROUP } from './histGroupBy'; + +export interface TextGroupByValueOptions { + type: 'value'; + values: string[]; +} +export interface TextGroupByRegexOptions { + type: 'regex'; + values: RegExp[]; +} +export interface TextGroupByStartsWithOptions { + type: 'startsWith'; + values: string[]; +} + +export type TextGroupByOptions = TextGroupByValueOptions | TextGroupByStartsWithOptions | TextGroupByRegexOptions; export default function textGroupBy( - rows: Row[], - column: ColumnInstance + rows: readonly Row[], + column: ColumnInstance, + options?: TextGroupByOptions ): Record[]> { - // TODO options - return baseGroupBy(rows, column); + if (!options) { + return baseGroupBy(rows, column); + } + const r: Record[]> = {}; + + let toGroup = (v: string | null) => v || MISSING_GROUP; + switch (options.type) { + case 'regex': + toGroup = (v) => options.values.find((d) => v != null && d.test(v))?.source ?? MISSING_GROUP; + break; + case 'value': + toGroup = (v) => options.values.find((d) => v != null && d === v) ?? MISSING_GROUP; + break; + case 'startsWith': + toGroup = (v) => options.values.find((d) => v != null && v.startsWith(d)) ?? MISSING_GROUP; + break; + } + + for (const row of rows) { + const v = row.values[column.id] ?? null; + const g = toGroup(v); + const rValue = r[g]; + if (!rValue) { + r[g] = [row]; + } else { + rValue.push(row); + } + } + return sortGroups(r); +} + +export function textGroupByFactory( + options: TextGroupByOptions +): (rows: readonly Row[], column: ColumnInstance, options?: TextGroupByOptions) => Record[]> { + return (rows, column, o?: TextGroupByOptions) => textGroupBy(rows, column, o ?? options); } diff --git a/packages/hooks/src/hooks/useGroupingOptions.ts b/packages/hooks/src/hooks/useGroupingOptions.ts index 9b4b4ca..d473557 100644 --- a/packages/hooks/src/hooks/useGroupingOptions.ts +++ b/packages/hooks/src/hooks/useGroupingOptions.ts @@ -42,7 +42,7 @@ export interface UseGroupingOptionsColumnOptions { - (rows: readonly Row[], column: ColumnInstance): Record[]>; + (rows: readonly Row[], column: ColumnInstance, options?: AnyObject): Record[]>; } // eslint-disable-next-line @typescript-eslint/no-empty-interface From 229cf857747d5bf9cc9cc3110a64dd3fdcc4af5c Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Sun, 23 May 2021 22:27:01 -0400 Subject: [PATCH 04/16] feat: add useGroupingOptions --- packages/hooks/src/grouping/numberGroupBy.ts | 2 +- packages/hooks/src/hooks/index.ts | 1 + .../hooks/src/hooks/useGroupingOptions.ts | 106 +++++++++++++++--- 3 files changed, 91 insertions(+), 18 deletions(-) diff --git a/packages/hooks/src/grouping/numberGroupBy.ts b/packages/hooks/src/grouping/numberGroupBy.ts index a3618b2..416daa4 100644 --- a/packages/hooks/src/grouping/numberGroupBy.ts +++ b/packages/hooks/src/grouping/numberGroupBy.ts @@ -46,7 +46,7 @@ export default function numberGroupBy( } const prev = thresholds[i - 1]; return { - label: `]${stats?.format(prev) ?? prev.toLocaleString()} ... ${stats?.format(v) ?? v.toLocaleString()}]`, + label: `${stats?.format(prev) ?? prev.toLocaleString()} ... ${stats?.format(v) ?? v.toLocaleString()}`, rows: [], value: v, }; diff --git a/packages/hooks/src/hooks/index.ts b/packages/hooks/src/hooks/index.ts index 8109e31..9b1bdde 100644 --- a/packages/hooks/src/hooks/index.ts +++ b/packages/hooks/src/hooks/index.ts @@ -9,4 +9,5 @@ export * from './useStats'; export * from './useRowSelectColumn'; export * from './useRowExpandColumn'; export * from './useRowRankColumn'; +export * from './useGroupingOptions'; export { default as IndeterminateCheckbox } from './IndeterminateCheckbox'; diff --git a/packages/hooks/src/hooks/useGroupingOptions.ts b/packages/hooks/src/hooks/useGroupingOptions.ts index d473557..88bd3eb 100644 --- a/packages/hooks/src/hooks/useGroupingOptions.ts +++ b/packages/hooks/src/hooks/useGroupingOptions.ts @@ -5,16 +5,19 @@ * Copyright (c) 2021 Samuel Gratzl */ +import React from 'react'; import { + actions, + ActionType, CellProps, ColumnInstance, - ensurePluginOrder, HeaderProps, Hooks, IdType, Renderer, Row, TableInstance, + TableState, } from 'react-table'; import type { AnyObject, UnknownObject } from '../types'; @@ -57,30 +60,99 @@ export interface UseGroupingOptionsColumnProps { export type GroupingOptionsProps = HeaderProps & { column: UseGroupingOptionsColumnProps; - i18n?: Record; }; -export type StatsCellProps = CellProps & { +export type GroupingOptionsCellProps = CellProps & { column: UseGroupingOptionsColumnProps; - i18n?: Record; }; export function useGroupingOptions(hooks: Hooks): void { + hooks.stateReducers.push(reducer); hooks.useInstance.push(useInstance); } useGroupingOptions.pluginName = 'useGroupingOptions'; +// Actions +actions.setGroupingOptions = 'setGroupingOptions'; + +function reducer( + state: TableState & Partial>, + action: ActionType, + _previousState?: TableState, + instance?: TableInstance +): (TableState & UseGroupingOptionsState) | undefined { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const { allColumns } = instance!; + + if (action.type === actions.init) { + return { + groupingOptions: [], + ...state, + }; + } + + if (action.type === actions.setRowState) { + const { columnId, groupingOptions } = action as unknown as { + columnId: string; + groupingOptions: Record; + }; + + const column = allColumns.find((d) => d.id === columnId); + + if (!column) { + throw new Error(`React-Table: Could not find a column with id: ${columnId}`); + } + const previousFilter = state.groupingOptions?.find((d) => d.id === columnId); + // + if (groupingOptions == null) { + return { + ...state, + groupingOptions: state.groupingOptions?.filter((d) => d.id !== columnId) ?? [], + }; + } + + if (previousFilter) { + return { + ...state, + groupingOptions: + state.groupingOptions?.map((d) => { + if (d.id === columnId) { + return { id: columnId, value: groupingOptions }; + } + return d; + }) ?? [], + }; + } + + return { + ...state, + groupingOptions: [...(state.groupingOptions ?? []), { id: columnId, value: groupingOptions }], + }; + } + + return undefined; +} + function useInstance(instance: TableInstance) { - ensurePluginOrder(instance.plugins, ['useGroupBy'], 'useGroupingOptions'); - - // const extendedInstance = instance as unknown as TableInstance & UseGroupByInstanceProps; - - // instance.allColumns.forEach((col) => { - // // const extended = col as unknown as UseGroupingOptionsColumnProps & - // // UseGroupingOptionsColumnOptions & - // // UseGroupByColumnProps; - // // const flat = extendedInstance.nonGroupedFlatRows ?? instance.flatRows; - // // const values = flat.map((row) => row.values[col.id]); - // // compute current stats - // // extended.statsValue = extended.stats(values, extended.preFilterStatsValue); - // }); + const { dispatch, allColumns, state } = instance; + const { groupingOptions = [] } = state as Partial>; + + const setGroupingOptions = React.useCallback( + (columnId: string, value: Record) => { + dispatch({ type: actions.setGroupingOptions, columnId, groupingOptions: value }); + }, + [dispatch] + ); + allColumns.forEach((column) => { + const cc = column as Partial; + // Provide the column a way of updating the filter value + cc.setGroupingOptions = (val: Record) => setGroupingOptions(column.id, val); + // Provide the current filter value to the column for + // convenience + const found = groupingOptions.find((d) => d.id === column.id); + cc.groupingOptions = found && found.value; + }); + + Object.assign(instance, { + setGroupingOptions, + }); } From 5c19bdfb525971696ed4500934e533553b8c5700 Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Sun, 23 May 2021 22:31:43 -0400 Subject: [PATCH 05/16] feat: enable grouping options plugin --- packages/table/src/components/useLineUpLite.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/table/src/components/useLineUpLite.ts b/packages/table/src/components/useLineUpLite.ts index 00ab524..cb954c5 100644 --- a/packages/table/src/components/useLineUpLite.ts +++ b/packages/table/src/components/useLineUpLite.ts @@ -17,6 +17,9 @@ import { useRowSelectColumn, UseSelectColumnTableOptions, useStats, + useGroupingOptions, + UseGroupingOptionsInstanceProps, + UseGroupingOptionsState, } from '@lineup-lite/hooks'; import { PluginHook, @@ -75,6 +78,7 @@ export interface LineUpLiteState UseGroupByState, UseRowSelectState, UseSortByState, + UseGroupingOptionsState, UseResizeColumnsState {} export interface LineUpLiteTableInstance @@ -83,6 +87,7 @@ export interface LineUpLiteTableInstance UseExpandedInstanceProps, UseGroupByInstanceProps, UseRowSelectInstanceProps, + UseGroupingOptionsInstanceProps, UseSortByInstanceProps {} export interface UseLineUpLiteOptions extends UseLineUpLiteTableOptions { @@ -98,7 +103,7 @@ export function featureRowSelect(): PluginH } export function featureSortAndGroupBy(): PluginHook[] { - return [useGroupByImpl, useSortBy, useExpanded, useRowExpandColumn]; + return [useGroupingOptions, useGroupByImpl, useSortBy, useExpanded, useRowExpandColumn]; } /** From c206920ae0304d8f7956691fdb50fa5d7f79cb4e Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Mon, 24 May 2021 08:54:45 -0400 Subject: [PATCH 06/16] feat: add useSortingOptions --- packages/_playground/src/App.tsx | 24 ++++ packages/hooks/src/hooks/index.ts | 1 + .../hooks/src/hooks/useGroupingOptions.ts | 12 +- packages/hooks/src/hooks/useSortingOptions.ts | 127 ++++++++++++++++++ 4 files changed, 156 insertions(+), 8 deletions(-) create mode 100644 packages/hooks/src/hooks/useSortingOptions.ts diff --git a/packages/_playground/src/App.tsx b/packages/_playground/src/App.tsx index 9276074..3f48510 100644 --- a/packages/_playground/src/App.tsx +++ b/packages/_playground/src/App.tsx @@ -58,6 +58,30 @@ function MyFilterAction(props: { col: ColumnInstance; icons: ActionIcons }) ); } + +function MyGroupingOptionAction(props: { col: ColumnInstance; icons: ActionIcons }) { + const col = props.col as unknown as ColumnInstance & UseFiltersColumnProps; + + const [visible, setVisible] = useState(false); + const showGroupingDialog = useCallback(() => { + setVisible(!visible); + }, [visible, setVisible]); + + return ( + <> + + {visible && ( +
+ {col.render('Summary')} + +
+ )} + + ); +} + function Table({ isDarkTheme }: { isDarkTheme: boolean }) { const columns: LineUpLiteColumn[] = useMemo( () => [ diff --git a/packages/hooks/src/hooks/index.ts b/packages/hooks/src/hooks/index.ts index 9b1bdde..24e5b58 100644 --- a/packages/hooks/src/hooks/index.ts +++ b/packages/hooks/src/hooks/index.ts @@ -10,4 +10,5 @@ export * from './useRowSelectColumn'; export * from './useRowExpandColumn'; export * from './useRowRankColumn'; export * from './useGroupingOptions'; +export * from './useSortingOptions'; export { default as IndeterminateCheckbox } from './IndeterminateCheckbox'; diff --git a/packages/hooks/src/hooks/useGroupingOptions.ts b/packages/hooks/src/hooks/useGroupingOptions.ts index 88bd3eb..291ffcf 100644 --- a/packages/hooks/src/hooks/useGroupingOptions.ts +++ b/packages/hooks/src/hooks/useGroupingOptions.ts @@ -21,14 +21,10 @@ import { } from 'react-table'; import type { AnyObject, UnknownObject } from '../types'; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface UseGroupingOptionsOptions {} - // eslint-disable-next-line @typescript-eslint/no-explicit-any export type GroupingOptionsValue = any; export type GroupingOptions = Array<{ id: IdType; value: GroupingOptionsValue }>; -// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface UseGroupingOptionsState { groupingOptions: GroupingOptions; } @@ -49,12 +45,12 @@ export interface UseGroupingOptionGroupingFunction void; +} export interface UseGroupingOptionsColumnProps { - setGroupingOptions: ( - updater: ((groupingOption: GroupingOptionsValue) => GroupingOptionsValue) | GroupingOptionsValue - ) => void; + setGroupingOptions: (value: GroupingOptionsValue) => void; groupingOptions: GroupingOptionsValue; } diff --git a/packages/hooks/src/hooks/useSortingOptions.ts b/packages/hooks/src/hooks/useSortingOptions.ts new file mode 100644 index 0000000..97966d1 --- /dev/null +++ b/packages/hooks/src/hooks/useSortingOptions.ts @@ -0,0 +1,127 @@ +/** + * @lineup-lite/hooks + * https://github.com/sgratzl/lineup-lite + * + * Copyright (c) 2021 Samuel Gratzl + */ + +import React from 'react'; +import { actions, ActionType, CellProps, HeaderProps, Hooks, IdType, TableInstance, TableState } from 'react-table'; +import type { AnyObject, UnknownObject } from '../types'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type SortingOptionsValue = any; +export type SortingOptions = Array<{ id: IdType; value: SortingOptionsValue }>; + +export interface UseSortingOptionsState { + sortingOptions: SortingOptions; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface UseSortingOptionsInstanceProps { + setSortingOptions: (columnId: string, value: SortingOptionsValue) => void; +} + +export interface UseSortingOptionsColumnProps { + setSortingOptions: (value: SortingOptionsValue) => void; + sortingOptions: SortingOptionsValue; +} + +export type SortingOptionsProps = HeaderProps & { + column: UseSortingOptionsColumnProps; +}; +export type SortingOptionsCellProps = CellProps & { + column: UseSortingOptionsColumnProps; +}; + +export function useSortingOptions(hooks: Hooks): void { + hooks.stateReducers.push(reducer); + hooks.useInstance.push(useInstance); +} +useSortingOptions.pluginName = 'useSortingOptions'; + +// Actions +actions.setSortingOptions = 'setSortingOptions'; + +function reducer( + state: TableState & Partial>, + action: ActionType, + _previousState?: TableState, + instance?: TableInstance +): (TableState & UseSortingOptionsState) | undefined { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const { allColumns } = instance!; + + if (action.type === actions.init) { + return { + sortingOptions: [], + ...state, + }; + } + + if (action.type === actions.setRowState) { + const { columnId, sortingOptions } = action as unknown as { + columnId: string; + sortingOptions: Record; + }; + + const column = allColumns.find((d) => d.id === columnId); + + if (!column) { + throw new Error(`React-Table: Could not find a column with id: ${columnId}`); + } + const previousFilter = state.sortingOptions?.find((d) => d.id === columnId); + // + if (sortingOptions == null) { + return { + ...state, + sortingOptions: state.sortingOptions?.filter((d) => d.id !== columnId) ?? [], + }; + } + + if (previousFilter) { + return { + ...state, + sortingOptions: + state.sortingOptions?.map((d) => { + if (d.id === columnId) { + return { id: columnId, value: sortingOptions }; + } + return d; + }) ?? [], + }; + } + + return { + ...state, + sortingOptions: [...(state.sortingOptions ?? []), { id: columnId, value: sortingOptions }], + }; + } + + return undefined; +} + +function useInstance(instance: TableInstance) { + const { dispatch, allColumns, state } = instance; + const { sortingOptions = [] } = state as Partial>; + + const setSortingOptions = React.useCallback( + (columnId: string, value: Record) => { + dispatch({ type: actions.setSortingOptions, columnId, sortingOptions: value }); + }, + [dispatch] + ); + allColumns.forEach((column) => { + const cc = column as Partial; + // Provide the column a way of updating the filter value + cc.setSortingOptions = (val: Record) => setSortingOptions(column.id, val); + // Provide the current filter value to the column for + // convenience + const found = sortingOptions.find((d) => d.id === column.id); + cc.sortingOptions = found && found.value; + }); + + Object.assign(instance, { + setSortingOptions, + }); +} From 16001ce7020438ec559cb2d40102430775d55fe9 Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Mon, 24 May 2021 09:12:48 -0400 Subject: [PATCH 07/16] feat: add sort options --- packages/hooks/src/sort/dateGroupCompare.ts | 19 ++++++++++-- packages/hooks/src/sort/index.ts | 2 +- packages/hooks/src/sort/interfaces.ts | 8 ++++- packages/hooks/src/sort/numberSort.ts | 34 ++++++++++++++++++--- packages/hooks/src/sort/sortSplitter.ts | 25 ++++++++++++--- 5 files changed, 76 insertions(+), 12 deletions(-) diff --git a/packages/hooks/src/sort/dateGroupCompare.ts b/packages/hooks/src/sort/dateGroupCompare.ts index 19bd1bc..0a861e2 100644 --- a/packages/hooks/src/sort/dateGroupCompare.ts +++ b/packages/hooks/src/sort/dateGroupCompare.ts @@ -9,12 +9,27 @@ import type { Row } from 'react-table'; import { IDateStats, isDateStats } from '@lineup-lite/components'; import { compareAsc } from './internal'; import type { UnknownObject } from '../interfaces'; +import type { RowCompareFunction } from './interfaces'; -export default function dateGroupCompare(a: Row, b: Row, columnId: string): number { +export interface DateSortOptions { + group: 'median' | 'min' | 'max'; +} + +export default function dateGroupCompare( + a: Row, + b: Row, + columnId: string, + options?: DateSortOptions +): number { + const group = options?.group ?? 'min'; const av: IDateStats = a.values[columnId]; const bv: IDateStats = b.values[columnId]; if (isDateStats(av) && isDateStats(bv)) { - return compareAsc(av.min, bv.min); + return compareAsc(av[group], bv[group]); } return compareAsc(av, bv); } + +export function dateGroupCompareFactory(options: DateSortOptions): RowCompareFunction { + return (a, b, columId, o) => dateGroupCompare(a, b, columId, o ?? options); +} diff --git a/packages/hooks/src/sort/index.ts b/packages/hooks/src/sort/index.ts index 344e0b5..872b32d 100644 --- a/packages/hooks/src/sort/index.ts +++ b/packages/hooks/src/sort/index.ts @@ -12,4 +12,4 @@ export * from './categoricalSort'; export * from './categoricalSetSort'; export * from './numberSort'; export { default as textGroupCompare } from './textGroupCompare'; -export { default as dateGroupCompare } from './dateGroupCompare'; +export { default as dateGroupCompare, DateSortOptions, dateGroupCompareFactory } from './dateGroupCompare'; diff --git a/packages/hooks/src/sort/interfaces.ts b/packages/hooks/src/sort/interfaces.ts index 732209e..6f5665c 100644 --- a/packages/hooks/src/sort/interfaces.ts +++ b/packages/hooks/src/sort/interfaces.ts @@ -7,5 +7,11 @@ import type { Row } from 'react-table'; import type { UnknownObject } from '../interfaces'; +import type { AnyObject } from '../types'; -export type RowCompareFunction = (a: Row, b: Row, columnId: string) => number; +export type RowCompareFunction = ( + a: Row, + b: Row, + columnId: string, + options?: O +) => number; diff --git a/packages/hooks/src/sort/numberSort.ts b/packages/hooks/src/sort/numberSort.ts index 8d2c21c..1c0a793 100644 --- a/packages/hooks/src/sort/numberSort.ts +++ b/packages/hooks/src/sort/numberSort.ts @@ -9,23 +9,49 @@ import { INumberStats, isNumberStats } from '@lineup-lite/components'; import type { Row } from 'react-table'; import type { UnknownObject } from '../interfaces'; import { computeArrayNumberStats } from '../stats'; +import type { RowCompareFunction } from './interfaces'; import { compareAsc } from './internal'; -export function numberGroupCompare(a: Row, b: Row, columnId: string): number { +export interface NumberSortOptions { + group: 'median' | 'min' | 'max' | 'mean' | 'q1' | 'q3'; + array: 'median' | 'min' | 'max' | 'mean' | 'q1' | 'q3'; +} + +export function numberGroupCompare( + a: Row, + b: Row, + columnId: string, + options?: NumberSortOptions +): number { + const group = options?.group ?? 'median'; const av: INumberStats = a.values[columnId]; const bv: INumberStats = b.values[columnId]; if (isNumberStats(av) && isNumberStats(bv)) { - return compareAsc(av.median, bv.median); + return compareAsc(av[group], bv[group]); } return compareAsc(av, bv); } -export function numbersCompare(a: Row, b: Row, columnId: string): number { +export function numbersCompare( + a: Row, + b: Row, + columnId: string, + options?: NumberSortOptions +): number { + const group = options?.group ?? 'median'; const column = a.allCells.find((d) => d.column.id === columnId)?.column; const av = computeArrayNumberStats(a.values[columnId], column); const bv = computeArrayNumberStats(b.values[columnId], column); if (isNumberStats(av) && isNumberStats(bv)) { - return compareAsc(av.median, bv.median); + return compareAsc(av[group], bv[group]); } return compareAsc(av, bv); } + +export function numberGroupCompareFactory(options: NumberSortOptions): RowCompareFunction { + return (a, b, columId, o) => numberGroupCompare(a, b, columId, o ?? options); +} + +export function numbersCompareFactory(options: NumberSortOptions): RowCompareFunction { + return (a, b, columId, o) => numbersCompare(a, b, columId, o ?? options); +} diff --git a/packages/hooks/src/sort/sortSplitter.ts b/packages/hooks/src/sort/sortSplitter.ts index 8170033..47be71f 100644 --- a/packages/hooks/src/sort/sortSplitter.ts +++ b/packages/hooks/src/sort/sortSplitter.ts @@ -6,7 +6,9 @@ */ import type { UseGroupByRowProps, Row } from 'react-table'; +import type { UseSortingOptionsColumnProps } from '../hooks'; import type { UnknownObject } from '../interfaces'; +import type { AnyObject } from '../types'; import type { RowCompareFunction } from './interfaces'; function resolveGroupByColumn(a: Row) { @@ -19,23 +21,38 @@ function resolveGroupByColumn(a: Row) { return (a as any).groupByID; } +function resolveSortOptions( + a: Row, + columnId: string +): undefined | O { + const column = a.allCells.find((d) => d.column.id === columnId)?.column; + if (!column) { + return undefined; + } + return (column as Partial).sortingOptions; +} + /** * sort helper to compare by a given column id * @param a first row * @param b second row * @param columnId column id */ -export default function sortSplitter(rows: RowCompareFunction, group: RowCompareFunction): RowCompareFunction { +export default function sortSplitter( + rows: RowCompareFunction, + group: RowCompareFunction +): RowCompareFunction { return (a, b, columnId) => { const aGroupByColumn = resolveGroupByColumn(a); const bGroupByColumn = resolveGroupByColumn(b); + const options = resolveSortOptions(a, columnId); if ((!aGroupByColumn || aGroupByColumn === columnId) && (!bGroupByColumn || bGroupByColumn === columnId)) { - return rows(a, b, columnId); + return rows(a, b, columnId, options); } if (aGroupByColumn && bGroupByColumn) { - return group(a, b, columnId); + return group(a, b, columnId, options); } - return rows(a, b, columnId); + return rows(a, b, columnId, options); }; } From ea6b52404b6566a37fb8b0ac9ea34c8f2dccc888 Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Tue, 25 May 2021 09:03:27 -0400 Subject: [PATCH 08/16] feat: add custom sort/group actions --- examples/filter-action/src/App.tsx | 6 ++- packages/_playground/src/App.tsx | 51 +++++++++++-------- packages/_playground/tsconfig.c.json | 10 ++++ packages/_playground/tsconfig.eslint.json | 4 ++ packages/table/src/components/interfaces.ts | 10 ++++ .../toolbar/LineUpLiteFilterAction.tsx | 17 ++++--- .../toolbar/LineUpLiteGroupByAction.tsx | 49 +++++++++++------- .../toolbar/LineUpLiteHideAction.tsx | 20 ++++---- .../toolbar/LineUpLiteSortByAction.tsx | 51 ++++++++++++------- .../components/toolbar/LineUpLiteToolbar.tsx | 11 ++-- 10 files changed, 149 insertions(+), 80 deletions(-) create mode 100644 packages/_playground/tsconfig.c.json create mode 100644 packages/_playground/tsconfig.eslint.json diff --git a/examples/filter-action/src/App.tsx b/examples/filter-action/src/App.tsx index 4a2b85f..287e767 100644 --- a/examples/filter-action/src/App.tsx +++ b/examples/filter-action/src/App.tsx @@ -33,7 +33,11 @@ function MyFilterAction(props: { col: ColumnInstance; icons: ActionIcons }) return ( <> - + {visible && (
{col.render('Summary')} diff --git a/packages/_playground/src/App.tsx b/packages/_playground/src/App.tsx index 3f48510..34f1468 100644 --- a/packages/_playground/src/App.tsx +++ b/packages/_playground/src/App.tsx @@ -45,7 +45,11 @@ function MyFilterAction(props: { col: ColumnInstance; icons: ActionIcons }) return ( <> - + {visible && (
{col.render('Summary')} @@ -58,29 +62,32 @@ function MyFilterAction(props: { col: ColumnInstance; icons: ActionIcons }) ); } +// function MyGroupingOptionAction(props: { col: ColumnInstance; icons: ActionIcons }) { +// const col = props.col as unknown as ColumnInstance & UseFiltersColumnProps; -function MyGroupingOptionAction(props: { col: ColumnInstance; icons: ActionIcons }) { - const col = props.col as unknown as ColumnInstance & UseFiltersColumnProps; - - const [visible, setVisible] = useState(false); - const showGroupingDialog = useCallback(() => { - setVisible(!visible); - }, [visible, setVisible]); +// const [visible, setVisible] = useState(false); +// const showGroupingDialog = useCallback(() => { +// setVisible(!visible); +// }, [visible, setVisible]); - return ( - <> - - {visible && ( -
- {col.render('Summary')} - -
- )} - - ); -} +// return ( +// <> +// +// {visible && ( +//
+// {col.render('Summary')} +// +//
+// )} +// +// ); +// } function Table({ isDarkTheme }: { isDarkTheme: boolean }) { const columns: LineUpLiteColumn[] = useMemo( diff --git a/packages/_playground/tsconfig.c.json b/packages/_playground/tsconfig.c.json new file mode 100644 index 0000000..3045e40 --- /dev/null +++ b/packages/_playground/tsconfig.c.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "declarationMap": false, + "noEmit": false, + "composite": true + } +} diff --git a/packages/_playground/tsconfig.eslint.json b/packages/_playground/tsconfig.eslint.json new file mode 100644 index 0000000..237bc80 --- /dev/null +++ b/packages/_playground/tsconfig.eslint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.c.json", + "include": ["src/**/*.ts", "src/**/*.tsx", "*.js"] +} diff --git a/packages/table/src/components/interfaces.ts b/packages/table/src/components/interfaces.ts index 6c8f29a..f46203e 100644 --- a/packages/table/src/components/interfaces.ts +++ b/packages/table/src/components/interfaces.ts @@ -12,6 +12,7 @@ import type { AnyObject, UnknownObject } from '@lineup-lite/hooks'; import type { ActionIcons } from '../icons'; import type { LineUpLiteI18N } from '../i18n'; import type { UseLineUpLiteOptions } from './useLineUpLite'; +import type { CustomGroupByClickHandler, CustomSortByClickHandler } from './toolbar'; export type { ColumnInstance, HeaderGroup, Row, Column } from 'react-table'; export type { AnyObject, UnknownObject } from '@lineup-lite/hooks'; @@ -47,6 +48,15 @@ export interface ActionLineUpProps { * callback for generating extra toolbar actions for a column */ actions?: (column: ColumnInstance, icons: ActionIcons) => ReactNode; + + /** + * custom handler for sort by action click + */ + actionSortBy?: CustomSortByClickHandler; + /** + * custom handler for group by action click + */ + actionGroupBy?: CustomGroupByClickHandler; } export interface LineUpLiteProps diff --git a/packages/table/src/components/toolbar/LineUpLiteFilterAction.tsx b/packages/table/src/components/toolbar/LineUpLiteFilterAction.tsx index bb1be7a..168a39b 100644 --- a/packages/table/src/components/toolbar/LineUpLiteFilterAction.tsx +++ b/packages/table/src/components/toolbar/LineUpLiteFilterAction.tsx @@ -16,15 +16,16 @@ import type { AnyObject, UnknownObject } from '../interfaces'; export type { UseFiltersColumnProps } from 'react-table'; export function LineUpLiteFilterAction( - props: UseFiltersColumnProps & - CommonProps & { - children?: ReactNode; - // eslint-disable-next-line react/no-unused-prop-types - iconFilter: ComponentType; - toggleFilterColumn: (e: MouseEvent) => void; - } + props: CommonProps & { + column: UseFiltersColumnProps; + children?: ReactNode; + // eslint-disable-next-line react/no-unused-prop-types + iconFilter: ComponentType; + toggleFilterColumn: (e: MouseEvent) => void; + } ): JSX.Element { - const { canFilter, filterValue, toggleFilterColumn } = props; + const { toggleFilterColumn } = props; + const { canFilter, filterValue } = props.column; const c = useLineUpLiteTableContext(); const i18n = c?.i18n ?? LINEUP_LITE_I18N_EN; const filter = useCallback((e: MouseEvent) => toggleFilterColumn(e), [toggleFilterColumn]); diff --git a/packages/table/src/components/toolbar/LineUpLiteGroupByAction.tsx b/packages/table/src/components/toolbar/LineUpLiteGroupByAction.tsx index 44ba54e..c7cc9d7 100644 --- a/packages/table/src/components/toolbar/LineUpLiteGroupByAction.tsx +++ b/packages/table/src/components/toolbar/LineUpLiteGroupByAction.tsx @@ -15,19 +15,38 @@ import type { AnyObject, UnknownObject } from '../interfaces'; export type { UseGroupByColumnProps } from 'react-table'; -export function LineUpLiteGroupByAction( - props: UseGroupByColumnProps & - ColumnInstance & - CommonProps & { - children?: ReactNode; - icon: ComponentType; +export interface CustomGroupByClickHandler { + ( + column: ColumnInstance & UseGroupByColumnProps, + event: MouseEvent, + helper: { + toggleGroupBy(): void; + setGroupBy(): void; } + ): void; +} + +export function LineUpLiteGroupByAction( + props: CommonProps & { + column: UseGroupByColumnProps & ColumnInstance; + children?: ReactNode; + icon: ComponentType; + onClick?: CustomGroupByClickHandler; + } ): JSX.Element { const c = useLineUpLiteTableContext(); const dispatch = c?.dispatch; - const { toggleGroupBy, isGrouped, id } = props; + const { onClick, column } = props; + const { toggleGroupBy, isGrouped, id, canGroupBy } = column; const group = useCallback( (e: MouseEvent) => { + if (onClick) { + onClick(column, e, { + toggleGroupBy, + setGroupBy: () => dispatch?.({ type: 'setGroupBy', value: [id] }), + }); + return; + } if (e.shiftKey || e.ctrlKey || isGrouped || !dispatch) { // multi is the default toggleGroupBy(); @@ -36,24 +55,20 @@ export function LineUpLiteGroupByAction( dispatch({ type: 'setGroupBy', value: [id] }); } }, - [toggleGroupBy, dispatch, isGrouped, id] + [toggleGroupBy, dispatch, isGrouped, id, onClick, column] ); const i18n = c?.i18n ?? LINEUP_LITE_I18N_EN; const groupBys = c?.groupByColumnCount ?? 0; - const title = props.isGrouped - ? i18n.groupByRemoveColumn - : groupBys > 0 - ? i18n.groupByAnotherColumn - : i18n.groupByColumn; - return props.canGroupBy ? ( + const title = isGrouped ? i18n.groupByRemoveColumn : groupBys > 0 ? i18n.groupByAnotherColumn : i18n.groupByColumn; + return canGroupBy ? ( ) : ( diff --git a/packages/table/src/components/toolbar/LineUpLiteToolbar.tsx b/packages/table/src/components/toolbar/LineUpLiteToolbar.tsx index e85a89e..deae64b 100644 --- a/packages/table/src/components/toolbar/LineUpLiteToolbar.tsx +++ b/packages/table/src/components/toolbar/LineUpLiteToolbar.tsx @@ -47,11 +47,16 @@ export function LineUpLiteToolbar( ); return (
- - + + {props.actions && props.actions(column, icons)} {props.children} - +
); } From ba66de76e8a0bb1a73b486736dbb69bef1a69d2a Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Tue, 25 May 2021 09:03:41 -0400 Subject: [PATCH 09/16] build: update dependencies --- examples/animation/package.json | 2 +- examples/basic/package.json | 2 +- examples/column-resizing/package.json | 2 +- examples/components/package.json | 2 +- examples/controlled-state/package.json | 2 +- examples/filter-action/package.json | 2 +- examples/flex-layout/package.json | 2 +- examples/fontawesome/package.json | 2 +- examples/i18n/package.json | 2 +- examples/multi-sorting/package.json | 2 +- examples/numbers/package.json | 2 +- examples/pagination/package.json | 2 +- examples/sets/package.json | 2 +- examples/sidepanel/package.json | 2 +- examples/stackedbar/package.json | 2 +- examples/virtualized-rows/package.json | 2 +- package.json | 12 +- packages/_playground/package.json | 2 +- packages/components/package.json | 20 +- packages/docs/package.json | 10 +- packages/hooks/package.json | 24 +- packages/table/package.json | 22 +- yarn.lock | 1399 ++++++++++++++++++++---- 23 files changed, 1262 insertions(+), 259 deletions(-) diff --git a/examples/animation/package.json b/examples/animation/package.json index ce1c5a4..78a3cbd 100644 --- a/examples/animation/package.json +++ b/examples/animation/package.json @@ -39,7 +39,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/basic/package.json b/examples/basic/package.json index d59281a..6097dbf 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/column-resizing/package.json b/examples/column-resizing/package.json index aaa17d3..a11eb94 100644 --- a/examples/column-resizing/package.json +++ b/examples/column-resizing/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/components/package.json b/examples/components/package.json index 50a9fea..1a781b0 100644 --- a/examples/components/package.json +++ b/examples/components/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/controlled-state/package.json b/examples/controlled-state/package.json index 2a92bd0..d9b43ac 100644 --- a/examples/controlled-state/package.json +++ b/examples/controlled-state/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/filter-action/package.json b/examples/filter-action/package.json index 1846e60..e93b1e8 100644 --- a/examples/filter-action/package.json +++ b/examples/filter-action/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/flex-layout/package.json b/examples/flex-layout/package.json index f71276a..665d60c 100644 --- a/examples/flex-layout/package.json +++ b/examples/flex-layout/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/fontawesome/package.json b/examples/fontawesome/package.json index c95f6ac..f2496fe 100644 --- a/examples/fontawesome/package.json +++ b/examples/fontawesome/package.json @@ -40,7 +40,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/i18n/package.json b/examples/i18n/package.json index 0dde5b3..c8c4788 100644 --- a/examples/i18n/package.json +++ b/examples/i18n/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/multi-sorting/package.json b/examples/multi-sorting/package.json index 4dd8822..efc26c0 100644 --- a/examples/multi-sorting/package.json +++ b/examples/multi-sorting/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/numbers/package.json b/examples/numbers/package.json index 556a301..bf6451a 100644 --- a/examples/numbers/package.json +++ b/examples/numbers/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/pagination/package.json b/examples/pagination/package.json index d08c229..d5e5f3c 100644 --- a/examples/pagination/package.json +++ b/examples/pagination/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/sets/package.json b/examples/sets/package.json index 1669412..81e40fa 100644 --- a/examples/sets/package.json +++ b/examples/sets/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/sidepanel/package.json b/examples/sidepanel/package.json index da0557b..569b5e1 100644 --- a/examples/sidepanel/package.json +++ b/examples/sidepanel/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/stackedbar/package.json b/examples/stackedbar/package.json index c25a2c3..ab14787 100644 --- a/examples/stackedbar/package.json +++ b/examples/stackedbar/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/examples/virtualized-rows/package.json b/examples/virtualized-rows/package.json index 101b988..f18aa17 100644 --- a/examples/virtualized-rows/package.json +++ b/examples/virtualized-rows/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/package.json b/package.json index bec6f48..ba1a915 100644 --- a/package.json +++ b/package.json @@ -43,23 +43,23 @@ "release:npm": "yarn workspaces foreach --verbose --no-private npm publish --access public" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^4.23.0", - "@typescript-eslint/parser": "^4.23.0", - "@typescript-eslint/typescript-estree": "^4.23.0", + "@typescript-eslint/eslint-plugin": "^4.25.0", + "@typescript-eslint/parser": "^4.25.0", + "@typescript-eslint/typescript-estree": "^4.25.0", "@yarnpkg/pnpify": "^2.4.0", "babel-eslint": "^10.1.0", - "eslint": "^7.26.0", + "eslint": "^7.27.0", "eslint-config-airbnb-typescript": "^12.3.1", "eslint-config-prettier": "^8.3.0", "eslint-config-react-app": "^6.0.0", "eslint-plugin-flowtype": "^5.7.2", - "eslint-plugin-import": "^2.22.1", + "eslint-plugin-import": "^2.23.3", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-react": "^7.23.2", "eslint-plugin-react-hooks": "^4.2.0", "prettier": "^2.3.0", - "release-it": "^14.6.2", + "release-it": "^14.7.0", "shx": "^0.3.3", "typescript": "^4.2.4" }, diff --git a/packages/_playground/package.json b/packages/_playground/package.json index fc5451e..639ff3a 100644 --- a/packages/_playground/package.json +++ b/packages/_playground/package.json @@ -37,7 +37,7 @@ "@rescripts/cli": "^0.0.16", "@rescripts/utilities": "^0.0.8", "@types/jest": "^26.0.23", - "@types/react": "^17.0.5", + "@types/react": "^17.0.7", "@types/react-dom": "^17.0.5", "react-refresh": "^0.10.0", "react-scripts": "^4.0.3", diff --git a/packages/components/package.json b/packages/components/package.json index 9c3236d..c737647 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -67,35 +67,35 @@ "react": ">=17" }, "devDependencies": { - "@babel/core": "^7.14.2", + "@babel/core": "^7.14.3", "@babel/preset-env": "^7.14.2", "@rollup/plugin-babel": "^5.3.0", "@rollup/plugin-commonjs": "^19.0.0", "@rollup/plugin-node-resolve": "^13.0.0", "@rollup/plugin-replace": "^2.4.2", "@rollup/plugin-typescript": "^8.2.1", - "@testing-library/react": "^11.2.6", + "@testing-library/react": "^11.2.7", "@types/jest": "^26.0.23", "@types/react": "^17.0.0", - "@typescript-eslint/eslint-plugin": "^4.23.0", - "@typescript-eslint/parser": "^4.23.0", - "eslint": "^7.26.0", + "@typescript-eslint/eslint-plugin": "^4.25.0", + "@typescript-eslint/parser": "^4.25.0", + "eslint": "^7.27.0", "eslint-config-airbnb-typescript": "^12.3.1", "eslint-config-prettier": "^8.3.0", "eslint-config-react-app": "^6.0.0", "eslint-plugin-flowtype": "^5.7.2", - "eslint-plugin-import": "^2.22.1", + "eslint-plugin-import": "^2.23.3", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-react": "^7.23.2", "eslint-plugin-react-hooks": "^4.2.0", - "eslint-plugin-testing-library": "^4.3.0", - "jest": "^26.6.3", + "eslint-plugin-testing-library": "^4.6.0", + "jest": "^27.0.1", "prettier": "^2.3.0", "react": "^16.13.0", - "rollup": "^2.47.0", + "rollup": "^2.50.0", "rollup-plugin-css-only": "github:sgratzl/rollup-plugin-css-only#sgratzl/imports", - "rollup-plugin-dts": "^3.0.1", + "rollup-plugin-dts": "^3.0.2", "rollup-plugin-terser": "^7.0.2", "shx": "^0.3.3", "ts-jest": "^26.5.6", diff --git a/packages/docs/package.json b/packages/docs/package.json index c6f70cf..51a4b7c 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -46,7 +46,7 @@ "@lineup-lite/table": "~1.5.3", "@mdx-js/react": "^1.6.22", "@types/d3-scale-chromatic": "^2.0.0", - "@types/react-table": "^7.7.0", + "@types/react-table": "^7.7.1", "@types/seedrandom": "^3.0.0", "clsx": "^1.1.1", "d3-scale-chromatic": "^2.0.0", @@ -71,16 +71,16 @@ "devDependencies": { "@docusaurus/module-type-aliases": "^2.0.0-beta.0", "@tsconfig/docusaurus": "^1.0.2", - "@types/node": "^15.0.3", - "@types/react": "^17.0.5", + "@types/node": "^15.6.1", + "@types/react": "^17.0.7", "@types/react-helmet": "^6.1.1", "@types/react-router-dom": "^5.1.7", - "eslint": "^7.26.0", + "eslint": "^7.27.0", "eslint-config-airbnb-typescript": "^12.3.1", "eslint-config-prettier": "^8.3.0", "eslint-config-react-app": "^6.0.0", "eslint-plugin-flowtype": "^5.7.2", - "eslint-plugin-import": "^2.22.1", + "eslint-plugin-import": "^2.23.3", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-react": "^7.23.2", diff --git a/packages/hooks/package.json b/packages/hooks/package.json index e4511e9..4fa8ee9 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -65,12 +65,12 @@ }, "peerDependencies": { "@types/react": ">=17", - "@types/react-table": "^7.7.0", + "@types/react-table": "^7.7.1", "react": ">=17", "react-table": "^7.7.0" }, "devDependencies": { - "@babel/core": "^7.14.2", + "@babel/core": "^7.14.3", "@babel/preset-env": "^7.14.2", "@rollup/plugin-babel": "^5.3.0", "@rollup/plugin-commonjs": "^19.0.0", @@ -78,30 +78,30 @@ "@rollup/plugin-replace": "^2.4.2", "@rollup/plugin-typescript": "^8.2.1", "@testing-library/jest-dom": "^5.12.0", - "@testing-library/react": "^11.2.6", + "@testing-library/react": "^11.2.7", "@types/jest": "^26.0.23", "@types/react": "^17.0.0", - "@types/react-table": "^7.7.0", - "@typescript-eslint/eslint-plugin": "^4.23.0", - "@typescript-eslint/parser": "^4.23.0", - "eslint": "^7.26.0", + "@types/react-table": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^4.25.0", + "@typescript-eslint/parser": "^4.25.0", + "eslint": "^7.27.0", "eslint-config-airbnb-typescript": "^12.3.1", "eslint-config-prettier": "^8.3.0", "eslint-config-react-app": "^6.0.0", "eslint-plugin-flowtype": "^5.7.2", - "eslint-plugin-import": "^2.22.1", + "eslint-plugin-import": "^2.23.3", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-react": "^7.23.2", "eslint-plugin-react-hooks": "^4.2.0", - "eslint-plugin-testing-library": "^4.3.0", - "jest": "^26.6.3", + "eslint-plugin-testing-library": "^4.6.0", + "jest": "^27.0.1", "prettier": "^2.3.0", "react": "^17.0.1", "react-table": "^7.7.0", - "rollup": "^2.47.0", + "rollup": "^2.50.0", "rollup-plugin-css-only": "github:sgratzl/rollup-plugin-css-only#sgratzl/imports", - "rollup-plugin-dts": "^3.0.1", + "rollup-plugin-dts": "^3.0.2", "rollup-plugin-terser": "^7.0.2", "shx": "^0.3.3", "ts-jest": "^26.5.6", diff --git a/packages/table/package.json b/packages/table/package.json index 3be9ba8..78f903d 100644 --- a/packages/table/package.json +++ b/packages/table/package.json @@ -23,7 +23,7 @@ "dependencies": { "@lineup-lite/components": "~1.5.3", "@lineup-lite/hooks": "~1.5.3", - "@types/react-table": "^7.7.0", + "@types/react-table": "^7.7.1", "react-table": "^7.7.0", "react-virtual": "^2.7.1" }, @@ -71,36 +71,36 @@ "react": ">=17" }, "devDependencies": { - "@babel/core": "^7.14.2", + "@babel/core": "^7.14.3", "@babel/preset-env": "^7.14.2", "@rollup/plugin-babel": "^5.3.0", "@rollup/plugin-commonjs": "^19.0.0", "@rollup/plugin-node-resolve": "^13.0.0", "@rollup/plugin-replace": "^2.4.2", "@rollup/plugin-typescript": "^8.2.1", - "@testing-library/react": "^11.2.6", + "@testing-library/react": "^11.2.7", "@types/jest": "^26.0.23", "@types/react": "^17.0.0", - "@typescript-eslint/eslint-plugin": "^4.23.0", - "@typescript-eslint/parser": "^4.23.0", + "@typescript-eslint/eslint-plugin": "^4.25.0", + "@typescript-eslint/parser": "^4.25.0", "core-js": "^3.12.1", - "eslint": "^7.26.0", + "eslint": "^7.27.0", "eslint-config-airbnb-typescript": "^12.3.1", "eslint-config-prettier": "^8.3.0", "eslint-config-react-app": "^6.0.0", "eslint-plugin-flowtype": "^5.7.2", - "eslint-plugin-import": "^2.22.1", + "eslint-plugin-import": "^2.23.3", "eslint-plugin-jsx-a11y": "^6.4.1", "eslint-plugin-prettier": "^3.4.0", "eslint-plugin-react": "^7.23.2", "eslint-plugin-react-hooks": "^4.2.0", - "eslint-plugin-testing-library": "^4.3.0", - "jest": "^26.6.3", + "eslint-plugin-testing-library": "^4.6.0", + "jest": "^27.0.1", "prettier": "^2.3.0", "react": "^16.13.0", - "rollup": "^2.47.0", + "rollup": "^2.50.0", "rollup-plugin-css-only": "github:sgratzl/rollup-plugin-css-only#sgratzl/imports", - "rollup-plugin-dts": "^3.0.1", + "rollup-plugin-dts": "^3.0.2", "rollup-plugin-terser": "^7.0.2", "shx": "^0.3.3", "ts-jest": "^26.5.6", diff --git a/yarn.lock b/yarn.lock index 525049d..bd76614 100644 --- a/yarn.lock +++ b/yarn.lock @@ -295,16 +295,16 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.14.2, @babel/core@npm:^7.14.2": - version: 7.14.2 - resolution: "@babel/core@npm:7.14.2" +"@babel/core@npm:7.14.3, @babel/core@npm:^7.14.3, @babel/core@npm:^7.7.2": + version: 7.14.3 + resolution: "@babel/core@npm:7.14.3" dependencies: "@babel/code-frame": ^7.12.13 - "@babel/generator": ^7.14.2 + "@babel/generator": ^7.14.3 "@babel/helper-compilation-targets": ^7.13.16 "@babel/helper-module-transforms": ^7.14.2 "@babel/helpers": ^7.14.0 - "@babel/parser": ^7.14.2 + "@babel/parser": ^7.14.3 "@babel/template": ^7.12.13 "@babel/traverse": ^7.14.2 "@babel/types": ^7.14.2 @@ -314,7 +314,7 @@ __metadata: json5: ^2.1.2 semver: ^6.3.0 source-map: ^0.5.0 - checksum: 16dc0a52484da794afc69ac7f13721b7cf2f7e17db6467a36f19fef24fa59a8cea1524faa260d0c05f5a99836fb65acf076cf15abf6846fc66f6c142a94a8327 + checksum: 4bc2d1abf53e8d1399d5fe159f4f6d275feb64cdfb3a975e903edcbbd98b71ba4a216af28f43db0a5303691a291590837964934acaf673b024563f3acad919f6 languageName: node linkType: hard @@ -340,6 +340,17 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.14.3, @babel/generator@npm:^7.7.2": + version: 7.14.3 + resolution: "@babel/generator@npm:7.14.3" + dependencies: + "@babel/types": ^7.14.2 + jsesc: ^2.5.1 + source-map: ^0.5.0 + checksum: 519fce36f3663dd346522d50d13b8549c02c0a340650c62db1bee0595a47f910b433f3bbdb513cc582bd932c5045b2673c8ef6a97913f9335fb16aa06085f274 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.10.4, @babel/helper-annotate-as-pure@npm:^7.12.13": version: 7.12.13 resolution: "@babel/helper-annotate-as-pure@npm:7.12.13" @@ -691,6 +702,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.14.3, @babel/parser@npm:^7.7.2": + version: 7.14.3 + resolution: "@babel/parser@npm:7.14.3" + bin: + parser: ./bin/babel-parser.js + checksum: 5e8d1b2bfc53b59c7476c32adee20c8a4d19fdab58b04b6b177d89319bd76526219dad2f6ab6f51a80a518d0cbcdc3980b73c18bde16017aeee2dd8a50687fe3 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.13.12": version: 7.13.12 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.13.12" @@ -1311,7 +1331,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.12.13": +"@babel/plugin-syntax-typescript@npm:^7.12.13, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.12.13 resolution: "@babel/plugin-syntax-typescript@npm:7.12.13" dependencies: @@ -2290,7 +2310,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.14.2": +"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.14.2, @babel/traverse@npm:^7.7.2": version: 7.14.2 resolution: "@babel/traverse@npm:7.14.2" dependencies: @@ -3003,6 +3023,20 @@ __metadata: languageName: node linkType: hard +"@jest/console@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/console@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^27.0.1 + jest-util: ^27.0.1 + slash: ^3.0.0 + checksum: 87cb0410f33a959ea6ba567d838823b221f90171cb731eab59db574e1b319dd0653bf20b54b53a051292189de1ab6d0ae9957a1ba5dda9977ce8471319901dea + languageName: node + linkType: hard + "@jest/core@npm:^26.6.0, @jest/core@npm:^26.6.3": version: 26.6.3 resolution: "@jest/core@npm:26.6.3" @@ -3039,6 +3073,48 @@ __metadata: languageName: node linkType: hard +"@jest/core@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/core@npm:27.0.1" + dependencies: + "@jest/console": ^27.0.1 + "@jest/reporters": ^27.0.1 + "@jest/test-result": ^27.0.1 + "@jest/transform": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.8.1 + exit: ^0.1.2 + graceful-fs: ^4.2.4 + jest-changed-files: ^27.0.1 + jest-config: ^27.0.1 + jest-haste-map: ^27.0.1 + jest-message-util: ^27.0.1 + jest-regex-util: ^27.0.1 + jest-resolve: ^27.0.1 + jest-resolve-dependencies: ^27.0.1 + jest-runner: ^27.0.1 + jest-runtime: ^27.0.1 + jest-snapshot: ^27.0.1 + jest-util: ^27.0.1 + jest-validate: ^27.0.1 + jest-watcher: ^27.0.1 + micromatch: ^4.0.4 + p-each-series: ^2.1.0 + rimraf: ^3.0.0 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 57810b062016cb8b1ae72e7c507e882e694befeee5d65791cb4d74abde5a97d0f0484e38e9156c753c620c2acdff8c83c743d76e4edb47e4fb32fde9a0918ced + languageName: node + linkType: hard + "@jest/environment@npm:^26.6.0, @jest/environment@npm:^26.6.2": version: 26.6.2 resolution: "@jest/environment@npm:26.6.2" @@ -3051,6 +3127,18 @@ __metadata: languageName: node linkType: hard +"@jest/environment@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/environment@npm:27.0.1" + dependencies: + "@jest/fake-timers": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/node": "*" + jest-mock: ^27.0.1 + checksum: 2857566bfbd7397eb677d7c5b6625d6a96010b7df872d66888d0dc93a94fa3ed3bd44a63eceb0134f33cda05e9b564e6b1b7e7117ff9242e03497a68dcfe1c62 + languageName: node + linkType: hard + "@jest/fake-timers@npm:^26.6.2": version: 26.6.2 resolution: "@jest/fake-timers@npm:26.6.2" @@ -3065,6 +3153,20 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/fake-timers@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + "@sinonjs/fake-timers": ^7.0.2 + "@types/node": "*" + jest-message-util: ^27.0.1 + jest-mock: ^27.0.1 + jest-util: ^27.0.1 + checksum: e5581156cd1fec4f560b80b22e00d031420c4b988be50953c291a416c464ab3dea56f635b2bdae90579ea60c406e95a26ce46db428690e0ae27415bceec4a2b5 + languageName: node + linkType: hard + "@jest/globals@npm:^26.6.2": version: 26.6.2 resolution: "@jest/globals@npm:26.6.2" @@ -3076,6 +3178,17 @@ __metadata: languageName: node linkType: hard +"@jest/globals@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/globals@npm:27.0.1" + dependencies: + "@jest/environment": ^27.0.1 + "@jest/types": ^27.0.1 + expect: ^27.0.1 + checksum: 887de4dff2d306b74502879295aa5c3dacacdc01495a73fbd604a885177b1e1ab07a7b87fd27d7d055f63d51893df48e5a348337431deb36ace98326ed52811a + languageName: node + linkType: hard + "@jest/reporters@npm:^26.6.2": version: 26.6.2 resolution: "@jest/reporters@npm:26.6.2" @@ -3112,6 +3225,43 @@ __metadata: languageName: node linkType: hard +"@jest/reporters@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/reporters@npm:27.0.1" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^27.0.1 + "@jest/test-result": ^27.0.1 + "@jest/transform": ^27.0.1 + "@jest/types": ^27.0.1 + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.2 + graceful-fs: ^4.2.4 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^4.0.3 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.0.2 + jest-haste-map: ^27.0.1 + jest-resolve: ^27.0.1 + jest-util: ^27.0.1 + jest-worker: ^27.0.1 + slash: ^3.0.0 + source-map: ^0.6.0 + string-length: ^4.0.1 + terminal-link: ^2.0.0 + v8-to-istanbul: ^7.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: fda25c9224a866f3f804b20e914559ff8e677f9c2853345278f82125b769cf1e3bd28ced7077cf11393b8541387a45ca3fcc9ee787c683405ec58ff780eb1015 + languageName: node + linkType: hard + "@jest/source-map@npm:^26.6.2": version: 26.6.2 resolution: "@jest/source-map@npm:26.6.2" @@ -3123,6 +3273,17 @@ __metadata: languageName: node linkType: hard +"@jest/source-map@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/source-map@npm:27.0.1" + dependencies: + callsites: ^3.0.0 + graceful-fs: ^4.2.4 + source-map: ^0.6.0 + checksum: 0c69ae000ef7bc20474381721e4d76f3270789b50a66af3124cdff24bc9feefaf203442bf82d5d29f5e7baba10f859cafdd2268bc0d023d07b7aa8b3468fc894 + languageName: node + linkType: hard + "@jest/test-result@npm:^26.6.0, @jest/test-result@npm:^26.6.2": version: 26.6.2 resolution: "@jest/test-result@npm:26.6.2" @@ -3135,6 +3296,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-result@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/test-result@npm:27.0.1" + dependencies: + "@jest/console": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: f57820933e940fb717a7c0abc65730ed301e093fbf23eafaadea504d2ca134a34c79fed1fd9e942e7e90a29ffdbf4b7ae7fa1e15e3910a5d42e6c8039c99fa72 + languageName: node + linkType: hard + "@jest/test-sequencer@npm:^26.6.3": version: 26.6.3 resolution: "@jest/test-sequencer@npm:26.6.3" @@ -3148,6 +3321,19 @@ __metadata: languageName: node linkType: hard +"@jest/test-sequencer@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/test-sequencer@npm:27.0.1" + dependencies: + "@jest/test-result": ^27.0.1 + graceful-fs: ^4.2.4 + jest-haste-map: ^27.0.1 + jest-runner: ^27.0.1 + jest-runtime: ^27.0.1 + checksum: 10da27227d4771cdcaf58bb6d1b9730a9832dcf51c752db334ef612db60616609dea9272f3aa7a18cfefc9075bbb30069bdd8d14ad96ac8ab385d6459553d4f6 + languageName: node + linkType: hard + "@jest/transform@npm:^26.6.2": version: 26.6.2 resolution: "@jest/transform@npm:26.6.2" @@ -3171,6 +3357,29 @@ __metadata: languageName: node linkType: hard +"@jest/transform@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/transform@npm:27.0.1" + dependencies: + "@babel/core": ^7.1.0 + "@jest/types": ^27.0.1 + babel-plugin-istanbul: ^6.0.0 + chalk: ^4.0.0 + convert-source-map: ^1.4.0 + fast-json-stable-stringify: ^2.0.0 + graceful-fs: ^4.2.4 + jest-haste-map: ^27.0.1 + jest-regex-util: ^27.0.1 + jest-util: ^27.0.1 + micromatch: ^4.0.4 + pirates: ^4.0.1 + slash: ^3.0.0 + source-map: ^0.6.1 + write-file-atomic: ^3.0.0 + checksum: eb905be2314f2a6141add8127f54176520bbf8f04fbe99f6ce883c7253819461cc8af96b236735c5a4df505304829a96b3964e018d586d433b996e76ea4e39e3 + languageName: node + linkType: hard + "@jest/types@npm:^26.6.0, @jest/types@npm:^26.6.2": version: 26.6.2 resolution: "@jest/types@npm:26.6.2" @@ -3184,6 +3393,19 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^27.0.1": + version: 27.0.1 + resolution: "@jest/types@npm:27.0.1" + dependencies: + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^16.0.0 + chalk: ^4.0.0 + checksum: cc70fdeaacdcb4d3195f82cbdfb44e22ff5b2b7921e4201aabac21342b2bc24b3c31fa9c4e569752f0eb696b6385d034a134f39976aa2e05d5705b865668dbc3 + languageName: node + linkType: hard + "@lineup-lite/_playground@workspace:packages/_playground": version: 0.0.0-use.local resolution: "@lineup-lite/_playground@workspace:packages/_playground" @@ -3194,7 +3416,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3208,7 +3430,7 @@ __metadata: version: 0.0.0-use.local resolution: "@lineup-lite/components@workspace:packages/components" dependencies: - "@babel/core": ^7.14.2 + "@babel/core": ^7.14.3 "@babel/preset-env": ^7.14.2 "@rollup/plugin-babel": ^5.3.0 "@rollup/plugin-commonjs": ^19.0.0 @@ -3216,28 +3438,28 @@ __metadata: "@rollup/plugin-replace": ^2.4.2 "@rollup/plugin-typescript": ^8.2.1 "@sgratzl/boxplots": ^1.2.2 - "@testing-library/react": ^11.2.6 + "@testing-library/react": ^11.2.7 "@types/jest": ^26.0.23 "@types/react": ^17.0.0 - "@typescript-eslint/eslint-plugin": ^4.23.0 - "@typescript-eslint/parser": ^4.23.0 - eslint: ^7.26.0 + "@typescript-eslint/eslint-plugin": ^4.25.0 + "@typescript-eslint/parser": ^4.25.0 + eslint: ^7.27.0 eslint-config-airbnb-typescript: ^12.3.1 eslint-config-prettier: ^8.3.0 eslint-config-react-app: ^6.0.0 eslint-plugin-flowtype: ^5.7.2 - eslint-plugin-import: ^2.22.1 + eslint-plugin-import: ^2.23.3 eslint-plugin-jsx-a11y: ^6.4.1 eslint-plugin-prettier: ^3.4.0 eslint-plugin-react: ^7.23.2 eslint-plugin-react-hooks: ^4.2.0 - eslint-plugin-testing-library: ^4.3.0 - jest: ^26.6.3 + eslint-plugin-testing-library: ^4.6.0 + jest: ^27.0.1 prettier: ^2.3.0 react: ^16.13.0 - rollup: ^2.47.0 + rollup: ^2.50.0 rollup-plugin-css-only: "github:sgratzl/rollup-plugin-css-only#sgratzl/imports" - rollup-plugin-dts: ^3.0.1 + rollup-plugin-dts: ^3.0.2 rollup-plugin-terser: ^7.0.2 shx: ^0.3.3 ts-jest: ^26.5.6 @@ -3260,7 +3482,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3284,20 +3506,20 @@ __metadata: "@mdx-js/react": ^1.6.22 "@tsconfig/docusaurus": ^1.0.2 "@types/d3-scale-chromatic": ^2.0.0 - "@types/node": ^15.0.3 - "@types/react": ^17.0.5 + "@types/node": ^15.6.1 + "@types/react": ^17.0.7 "@types/react-helmet": ^6.1.1 "@types/react-router-dom": ^5.1.7 - "@types/react-table": ^7.7.0 + "@types/react-table": ^7.7.1 "@types/seedrandom": ^3.0.0 clsx: ^1.1.1 d3-scale-chromatic: ^2.0.0 - eslint: ^7.26.0 + eslint: ^7.27.0 eslint-config-airbnb-typescript: ^12.3.1 eslint-config-prettier: ^8.3.0 eslint-config-react-app: ^6.0.0 eslint-plugin-flowtype: ^5.7.2 - eslint-plugin-import: ^2.22.1 + eslint-plugin-import: ^2.23.3 eslint-plugin-jsx-a11y: ^6.4.1 eslint-plugin-prettier: ^3.4.0 eslint-plugin-react: ^7.23.2 @@ -3323,7 +3545,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 "@types/react-flip-move": ^2.9.12 react: ^17.0.2 @@ -3345,7 +3567,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3365,7 +3587,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3385,7 +3607,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3405,7 +3627,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3425,7 +3647,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3448,7 +3670,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3468,7 +3690,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3488,7 +3710,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3508,7 +3730,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3528,7 +3750,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3548,7 +3770,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3568,7 +3790,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3588,7 +3810,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3608,7 +3830,7 @@ __metadata: "@rescripts/cli": ^0.0.16 "@rescripts/utilities": ^0.0.8 "@types/jest": ^26.0.23 - "@types/react": ^17.0.5 + "@types/react": ^17.0.7 "@types/react-dom": ^17.0.5 react: ^17.0.2 react-dom: ^17.0.2 @@ -3622,7 +3844,7 @@ __metadata: version: 0.0.0-use.local resolution: "@lineup-lite/hooks@workspace:packages/hooks" dependencies: - "@babel/core": ^7.14.2 + "@babel/core": ^7.14.3 "@babel/preset-env": ^7.14.2 "@lineup-lite/components": ~1.5.3 "@rollup/plugin-babel": ^5.3.0 @@ -3631,30 +3853,31 @@ __metadata: "@rollup/plugin-replace": ^2.4.2 "@rollup/plugin-typescript": ^8.2.1 "@testing-library/jest-dom": ^5.12.0 - "@testing-library/react": ^11.2.6 + "@testing-library/react": ^11.2.7 "@types/jest": ^26.0.23 "@types/react": ^17.0.0 - "@types/react-table": ^7.7.0 - "@typescript-eslint/eslint-plugin": ^4.23.0 - "@typescript-eslint/parser": ^4.23.0 - eslint: ^7.26.0 + "@types/react-table": ^7.7.1 + "@typescript-eslint/eslint-plugin": ^4.25.0 + "@typescript-eslint/parser": ^4.25.0 + date-fns: ^2.21.3 + eslint: ^7.27.0 eslint-config-airbnb-typescript: ^12.3.1 eslint-config-prettier: ^8.3.0 eslint-config-react-app: ^6.0.0 eslint-plugin-flowtype: ^5.7.2 - eslint-plugin-import: ^2.22.1 + eslint-plugin-import: ^2.23.3 eslint-plugin-jsx-a11y: ^6.4.1 eslint-plugin-prettier: ^3.4.0 eslint-plugin-react: ^7.23.2 eslint-plugin-react-hooks: ^4.2.0 - eslint-plugin-testing-library: ^4.3.0 - jest: ^26.6.3 + eslint-plugin-testing-library: ^4.6.0 + jest: ^27.0.1 prettier: ^2.3.0 react: ^17.0.1 react-table: ^7.7.0 - rollup: ^2.47.0 + rollup: ^2.50.0 rollup-plugin-css-only: "github:sgratzl/rollup-plugin-css-only#sgratzl/imports" - rollup-plugin-dts: ^3.0.1 + rollup-plugin-dts: ^3.0.2 rollup-plugin-terser: ^7.0.2 shx: ^0.3.3 ts-jest: ^26.5.6 @@ -3663,7 +3886,7 @@ __metadata: typescript: ^4.2.4 peerDependencies: "@types/react": ">=17" - "@types/react-table": ^7.7.0 + "@types/react-table": ^7.7.1 react: ">=17" react-table: ^7.7.0 languageName: unknown @@ -3673,7 +3896,7 @@ __metadata: version: 0.0.0-use.local resolution: "@lineup-lite/table@workspace:packages/table" dependencies: - "@babel/core": ^7.14.2 + "@babel/core": ^7.14.3 "@babel/preset-env": ^7.14.2 "@lineup-lite/components": ~1.5.3 "@lineup-lite/hooks": ~1.5.3 @@ -3682,32 +3905,32 @@ __metadata: "@rollup/plugin-node-resolve": ^13.0.0 "@rollup/plugin-replace": ^2.4.2 "@rollup/plugin-typescript": ^8.2.1 - "@testing-library/react": ^11.2.6 + "@testing-library/react": ^11.2.7 "@types/jest": ^26.0.23 "@types/react": ^17.0.0 - "@types/react-table": ^7.7.0 - "@typescript-eslint/eslint-plugin": ^4.23.0 - "@typescript-eslint/parser": ^4.23.0 + "@types/react-table": ^7.7.1 + "@typescript-eslint/eslint-plugin": ^4.25.0 + "@typescript-eslint/parser": ^4.25.0 core-js: ^3.12.1 - eslint: ^7.26.0 + eslint: ^7.27.0 eslint-config-airbnb-typescript: ^12.3.1 eslint-config-prettier: ^8.3.0 eslint-config-react-app: ^6.0.0 eslint-plugin-flowtype: ^5.7.2 - eslint-plugin-import: ^2.22.1 + eslint-plugin-import: ^2.23.3 eslint-plugin-jsx-a11y: ^6.4.1 eslint-plugin-prettier: ^3.4.0 eslint-plugin-react: ^7.23.2 eslint-plugin-react-hooks: ^4.2.0 - eslint-plugin-testing-library: ^4.3.0 - jest: ^26.6.3 + eslint-plugin-testing-library: ^4.6.0 + jest: ^27.0.1 prettier: ^2.3.0 react: ^16.13.0 react-table: ^7.7.0 react-virtual: ^2.7.1 - rollup: ^2.47.0 + rollup: ^2.50.0 rollup-plugin-css-only: "github:sgratzl/rollup-plugin-css-only#sgratzl/imports" - rollup-plugin-dts: ^3.0.1 + rollup-plugin-dts: ^3.0.2 rollup-plugin-terser: ^7.0.2 shx: ^0.3.3 ts-jest: ^26.5.6 @@ -4237,6 +4460,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^7.0.2": + version: 7.1.0 + resolution: "@sinonjs/fake-timers@npm:7.1.0" + dependencies: + "@sinonjs/commons": ^1.7.0 + checksum: a16fdefd9c420cef70b710ac21bb498deeec68d6dfc614aeea590632b89faed274d9e282f8be612386f9c33c7c652c4e5128b43ca484c5477d17a8453d37a580 + languageName: node + linkType: hard + "@surma/rollup-plugin-off-main-thread@npm:^1.1.1": version: 1.4.2 resolution: "@surma/rollup-plugin-off-main-thread@npm:1.4.2" @@ -4428,16 +4660,16 @@ __metadata: languageName: node linkType: hard -"@testing-library/react@npm:^11.2.6": - version: 11.2.6 - resolution: "@testing-library/react@npm:11.2.6" +"@testing-library/react@npm:^11.2.7": + version: 11.2.7 + resolution: "@testing-library/react@npm:11.2.7" dependencies: "@babel/runtime": ^7.12.5 "@testing-library/dom": ^7.28.1 peerDependencies: react: "*" react-dom: "*" - checksum: 3ad25d7b88650b83d54990665fabac4f75ff8229773ae877c18ec7a431c17773832d4c3279cecc229815660ffc8be2c86f39de9930777b4dbc1519fb7bca63a5 + checksum: 389c9f3e83f59677f5283783788d18f8cd499342a0e5c1f67821c292860afe5f282ff8b5ced795b9c2f7d78132005d8b6b33e1b3e3a9004e240e3569f8e168ef languageName: node linkType: hard @@ -4476,7 +4708,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.7": +"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.1.7": version: 7.1.14 resolution: "@types/babel__core@npm:7.1.14" dependencies: @@ -4731,10 +4963,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^15.0.3": - version: 15.0.3 - resolution: "@types/node@npm:15.0.3" - checksum: 72bfbac4282443a7b5d5b43c7c39fe855aa1687b5fa5629b735fd2ceacf371b711ccfc956c8af1b1cbd9c74c79be845a801a4c7275048f340aa0df3beec6b10f +"@types/node@npm:^15.6.1": + version: 15.6.1 + resolution: "@types/node@npm:15.6.1" + checksum: 07b3855bc0a1ba2215455a3ef4ed5e88711321b3cdc0ba1ea0286f6facbdf61530970b9fa7eec79eb1d46231f986c21ef3b7c1f1e0c365cf1b887d76b0addb86 languageName: node linkType: hard @@ -4759,7 +4991,7 @@ __metadata: languageName: node linkType: hard -"@types/prettier@npm:^2.0.0": +"@types/prettier@npm:^2.0.0, @types/prettier@npm:^2.1.5": version: 2.2.3 resolution: "@types/prettier@npm:2.2.3" checksum: b7e80288f9f776caca84391a7a217b8baac6b4fce00bb9701af69299d465cb8faf17466f0af0803970c74d2c191767ca729a6d21a2f7e2ce552d1ef6cc0d653a @@ -4828,12 +5060,12 @@ __metadata: languageName: node linkType: hard -"@types/react-table@npm:^7.7.0": - version: 7.7.0 - resolution: "@types/react-table@npm:7.7.0" +"@types/react-table@npm:^7.7.1": + version: 7.7.1 + resolution: "@types/react-table@npm:7.7.1" dependencies: "@types/react": "*" - checksum: af373b925625408ad1b3abdf9449e3ebe6769b5f91f7ca51b6509f04b1083b7ff9632fb4c49a141d79676e64e91c55de032ebd57c6ebb64227aad8be153873c9 + checksum: a9b75a418337195a6a2243a14c9aac6b5e7d0a61fb4fe15d366a76bc103bc769f5514c82b709a8c512917437376863d71e8182b8140a852d2a0b3cbf04a5f5f0 languageName: node linkType: hard @@ -4848,14 +5080,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^17.0.5": - version: 17.0.5 - resolution: "@types/react@npm:17.0.5" +"@types/react@npm:^17.0.7": + version: 17.0.7 + resolution: "@types/react@npm:17.0.7" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: f9793e8113f14122d6ed20643b4fe27d30e10d7c80571a1d238c13f8171864f2a7b337194bf41310724498586ed4560fffd081a2d21e488afbb1aca33534189b + checksum: 0b550ae747c254c8117cf92b99fb1e98ad71d073f0661d4119aa422487da06ab2f3e6e3523389ff3c54a0f2c59d9fb8f03e729001839490fcc473b0f7e275ff3 languageName: node linkType: hard @@ -5010,12 +5242,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^4.23.0": - version: 4.23.0 - resolution: "@typescript-eslint/eslint-plugin@npm:4.23.0" +"@types/yargs@npm:^16.0.0": + version: 16.0.3 + resolution: "@types/yargs@npm:16.0.3" dependencies: - "@typescript-eslint/experimental-utils": 4.23.0 - "@typescript-eslint/scope-manager": 4.23.0 + "@types/yargs-parser": "*" + checksum: 84b8f617742b4a86f334838152cbc8d2fae4cc2568a81c4d54a9a9c7a6dc926f4fb21c3cb9d34cad895ab4f020041e28bcfe16348a34d370a2833450750ccd66 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^4.25.0": + version: 4.25.0 + resolution: "@typescript-eslint/eslint-plugin@npm:4.25.0" + dependencies: + "@typescript-eslint/experimental-utils": 4.25.0 + "@typescript-eslint/scope-manager": 4.25.0 debug: ^4.1.1 functional-red-black-tree: ^1.0.1 lodash: ^4.17.15 @@ -5028,7 +5269,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 846ecf021aaa7de34ac306866e2aca5ffa89711bc2c4ffe916fc632dde880eb94f0665009161086d3d91ccc21f2600a27271e041de505363758548511c463907 + checksum: 3bab84b7770485ed0c56d315c0052758908293724b477f4e4a5546c1e1ce17dc2759af0ea5756b09edbf42d82a13436f9a24d563b1222653ec96a79eccb916f9 languageName: node linkType: hard @@ -5054,7 +5295,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:4.22.0, @typescript-eslint/experimental-utils@npm:^4.0.1, @typescript-eslint/experimental-utils@npm:^4.21.0": +"@typescript-eslint/experimental-utils@npm:4.22.0, @typescript-eslint/experimental-utils@npm:^4.0.1": version: 4.22.0 resolution: "@typescript-eslint/experimental-utils@npm:4.22.0" dependencies: @@ -5070,19 +5311,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:4.23.0": - version: 4.23.0 - resolution: "@typescript-eslint/experimental-utils@npm:4.23.0" +"@typescript-eslint/experimental-utils@npm:4.25.0, @typescript-eslint/experimental-utils@npm:^4.24.0": + version: 4.25.0 + resolution: "@typescript-eslint/experimental-utils@npm:4.25.0" dependencies: "@types/json-schema": ^7.0.3 - "@typescript-eslint/scope-manager": 4.23.0 - "@typescript-eslint/types": 4.23.0 - "@typescript-eslint/typescript-estree": 4.23.0 + "@typescript-eslint/scope-manager": 4.25.0 + "@typescript-eslint/types": 4.25.0 + "@typescript-eslint/typescript-estree": 4.25.0 eslint-scope: ^5.0.0 eslint-utils: ^2.0.0 peerDependencies: eslint: "*" - checksum: 8583b9f016c08199789e0439af3a77bc46304165d3878a5d0851dfbeee8d89807ceda9d33a74b8854022f7dfe82cbe1eb4debb59ce7085d7f376d79abf78d09d + checksum: 4b83a4cadbf6dbad9d822748e90403f40a749a8f213c92a26f29ce7deab10ee4adc1066f58ec49050a5fafc6fda593f3d672512b787872fae263de81b5ee4faa languageName: node linkType: hard @@ -5101,20 +5342,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^4.23.0": - version: 4.23.0 - resolution: "@typescript-eslint/parser@npm:4.23.0" +"@typescript-eslint/parser@npm:^4.25.0": + version: 4.25.0 + resolution: "@typescript-eslint/parser@npm:4.25.0" dependencies: - "@typescript-eslint/scope-manager": 4.23.0 - "@typescript-eslint/types": 4.23.0 - "@typescript-eslint/typescript-estree": 4.23.0 + "@typescript-eslint/scope-manager": 4.25.0 + "@typescript-eslint/types": 4.25.0 + "@typescript-eslint/typescript-estree": 4.25.0 debug: ^4.1.1 peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 364874cf13b50e8e7adf5a424f5b0364689046ebdffaa715146b5b2f25e008ed99bd52d190e33d1b06378bfa35f0c9140c26ccb943a01732e952ee2032bd715c + checksum: deab7d5edb21e267bc5db41dbfcd7cce5c779d639c5cbc1f2ecc2e9fc08a9d35b66697f090d01d17d2e82dd75ebe0385aef1ed90916ae5051b5541453d9407fa languageName: node linkType: hard @@ -5145,13 +5386,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:4.23.0": - version: 4.23.0 - resolution: "@typescript-eslint/scope-manager@npm:4.23.0" +"@typescript-eslint/scope-manager@npm:4.25.0": + version: 4.25.0 + resolution: "@typescript-eslint/scope-manager@npm:4.25.0" dependencies: - "@typescript-eslint/types": 4.23.0 - "@typescript-eslint/visitor-keys": 4.23.0 - checksum: d51c7efa22946bc0d7d9d330b51fe114df1f8a9a64194d403043d6e3ed7564fea8452d8b57cbc74a92b03894fd6cc12e64445220961edbee2348421608e5fdc6 + "@typescript-eslint/types": 4.25.0 + "@typescript-eslint/visitor-keys": 4.25.0 + checksum: 26b41cf95eb6e0de7dc409bef6b78ad16c44e5f3c1fe727769093cd0cd41ca1f86b3f1755710e2a72c2b823adfbdd78cdac2427911b80ca0c7aabbbf6a6caccf languageName: node linkType: hard @@ -5169,10 +5410,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:4.23.0": - version: 4.23.0 - resolution: "@typescript-eslint/types@npm:4.23.0" - checksum: b0ddf4ca0176566f27388ea6b74a32d7efe585c79db998ec1d51515ab7ef88de651d4b531410a763ef73a04a645b181d78559960c08e6c9d0e21796cc0708888 +"@typescript-eslint/types@npm:4.25.0": + version: 4.25.0 + resolution: "@typescript-eslint/types@npm:4.25.0" + checksum: b40d8bcbfcd862b0c857ecb899e6933fdadafc95633aa1ea94dd9c2b2960d6d1abcbf0662ba8d4a36307f76123f964949a00c429901f8ac523f1520cc2a5e05f languageName: node linkType: hard @@ -5213,12 +5454,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:4.23.0, @typescript-eslint/typescript-estree@npm:^4.23.0": - version: 4.23.0 - resolution: "@typescript-eslint/typescript-estree@npm:4.23.0" +"@typescript-eslint/typescript-estree@npm:4.25.0, @typescript-eslint/typescript-estree@npm:^4.25.0": + version: 4.25.0 + resolution: "@typescript-eslint/typescript-estree@npm:4.25.0" dependencies: - "@typescript-eslint/types": 4.23.0 - "@typescript-eslint/visitor-keys": 4.23.0 + "@typescript-eslint/types": 4.25.0 + "@typescript-eslint/visitor-keys": 4.25.0 debug: ^4.1.1 globby: ^11.0.1 is-glob: ^4.0.1 @@ -5227,7 +5468,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: dec87f62c7301f7f6dec1cd8b30c0d4ba6c86cb78c3acb2070ee7ca2fcf9e2d1613fbbfb64561c2f4a6267217d435f7a48b3b1189ada8c938e2814b2e9b05b09 + checksum: 89c5fa4362636eff8a003414fe9c4c8f84f0f927593e779035535ea3518c45f0145fcb3eb02c2df171b8d3ab046bd0e17ada70ff566fc163b66a55c3dfa6ca51 languageName: node linkType: hard @@ -5250,13 +5491,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:4.23.0": - version: 4.23.0 - resolution: "@typescript-eslint/visitor-keys@npm:4.23.0" +"@typescript-eslint/visitor-keys@npm:4.25.0": + version: 4.25.0 + resolution: "@typescript-eslint/visitor-keys@npm:4.25.0" dependencies: - "@typescript-eslint/types": 4.23.0 + "@typescript-eslint/types": 4.25.0 eslint-visitor-keys: ^2.0.0 - checksum: a5e86b76e37fa11d061c5b1dcbc77e8faca6afb112c93240880563cc26306c7ba52d9baa824fd8b75b9deda1736340f93f38cae1782d3fe9e4e46d335b6236d1 + checksum: 53369ad5faa8f9f597ef1cdbe87cdaf078065ff0c488c2f31324605cce952aa4ef54cd643ed76c78502964ac84b8e910191924bde5bf7273a12ec67437de69c9 languageName: node linkType: hard @@ -5842,7 +6083,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.2.1": +"acorn@npm:^8.2.1, acorn@npm:^8.2.4": version: 8.2.4 resolution: "acorn@npm:8.2.4" bin: @@ -6081,6 +6322,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10b01465c7a49cbfcc055188e3b79b00db6283319bb53c0d20ca9ad114d1477d6f48c1d01a3ed9678f616566ec33f11116926dfaa162fa7be9ee7d5d2c2ea7e1 + languageName: node + linkType: hard + "any-promise@npm:^1.1.0, any-promise@npm:~1.3.0": version: 1.3.0 resolution: "any-promise@npm:1.3.0" @@ -6264,7 +6512,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.3": +"array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.2.4": version: 1.2.4 resolution: "array.prototype.flat@npm:1.2.4" dependencies: @@ -6537,6 +6785,24 @@ __metadata: languageName: node linkType: hard +"babel-jest@npm:^27.0.1": + version: 27.0.1 + resolution: "babel-jest@npm:27.0.1" + dependencies: + "@jest/transform": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.0.0 + babel-preset-jest: ^27.0.1 + chalk: ^4.0.0 + graceful-fs: ^4.2.4 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 456e2892ef0855ab0d9917d564097ef1e9f79c1bef0b123198f365c78be471a588c83c1245e7df395cc3ac46d27950083e6208085f6b28304377476fece52d8b + languageName: node + linkType: hard + "babel-loader@npm:8.1.0": version: 8.1.0 resolution: "babel-loader@npm:8.1.0" @@ -6632,6 +6898,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-jest-hoist@npm:^27.0.1": + version: 27.0.1 + resolution: "babel-plugin-jest-hoist@npm:27.0.1" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.0.0 + "@types/babel__traverse": ^7.0.6 + checksum: d8c17b65b484e6534de2af411268292b463a6a1d98f02f3cf735100401862cbf3e487f9b84e288aac1dcedfe413fed1f5e7ac9b00d3ef7e655a83079fd9ff27f + languageName: node + linkType: hard + "babel-plugin-macros@npm:2.8.0": version: 2.8.0 resolution: "babel-plugin-macros@npm:2.8.0" @@ -6746,6 +7024,18 @@ __metadata: languageName: node linkType: hard +"babel-preset-jest@npm:^27.0.1": + version: 27.0.1 + resolution: "babel-preset-jest@npm:27.0.1" + dependencies: + babel-plugin-jest-hoist: ^27.0.1 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 46a36c790f9158d60953f64fffbeaf82bf27e306003db519121cfc15fe02d6ae6c676d39d75055a594927a9eabdf2fe678a39f3b3dd5709f3009e2d0c591dc95 + languageName: node + linkType: hard + "babel-preset-react-app@npm:^10.0.0": version: 10.0.0 resolution: "babel-preset-react-app@npm:10.0.0" @@ -7524,7 +7814,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:4.1.1, chalk@npm:^4.0.0, chalk@npm:^4.1.0": +"chalk@npm:4.1.1, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": version: 4.1.1 resolution: "chalk@npm:4.1.1" dependencies: @@ -7704,6 +7994,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.0.0": + version: 1.2.1 + resolution: "cjs-module-lexer@npm:1.2.1" + checksum: 5c41324f072e70bb6fd0be6e7d28905231cbf71a62f96fec79d232df51226cb9a0750cd785933d5afdecd8efebb50327fb395d6e0fc3b67fb370b8025b980c17 + languageName: node + linkType: hard + "class-utils@npm:^0.3.5": version: 0.3.6 resolution: "class-utils@npm:0.3.6" @@ -7827,6 +8124,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^7.0.0 + checksum: c49ac1d13f6dda4beaa11b26f62867e0e9892eb985951187d7c691793e0fe08b9bc15cedfaf4dc6d2e9a4d1516704c0c9dcb671ebcd758dbabb18b5d757fbdb5 + languageName: node + linkType: hard + "clone-deep@npm:^4.0.1": version: 4.0.1 resolution: "clone-deep@npm:4.0.1" @@ -9020,6 +9328,13 @@ __metadata: languageName: node linkType: hard +"date-fns@npm:^2.21.3": + version: 2.21.3 + resolution: "date-fns@npm:2.21.3" + checksum: a88c9da180cde3a3426c09cacf3f6bffb615e31d73e458da90e9d5304432eea2e0b360f40ee4fd5ca187659e8a7f8f667db902a3eb033e8d2d1522b1cc1b9e32 + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.0, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -9053,7 +9368,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.1, debug@npm:^3.2.5, debug@npm:^3.2.6": +"debug@npm:^3.1.1, debug@npm:^3.2.5, debug@npm:^3.2.6, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -9362,6 +9677,13 @@ __metadata: languageName: node linkType: hard +"diff-sequences@npm:^27.0.1": + version: 27.0.1 + resolution: "diff-sequences@npm:27.0.1" + checksum: 7dc8775043a368d94c2b7c9e4c06d6761275039a8304c8fc67ff9a8aa5f3c28c4932105e098968520ad3e5b8ce702cba126ed1e8c93499c6644142550153550f + languageName: node + linkType: hard + "diff@npm:^4.0.1": version: 4.0.2 resolution: "diff@npm:4.0.2" @@ -9708,6 +10030,13 @@ __metadata: languageName: node linkType: hard +"emittery@npm:^0.8.1": + version: 0.8.1 + resolution: "emittery@npm:0.8.1" + checksum: 1c9cd9a1045ce8e50e41b4433a6d3adf109cbb7585fe5d504399f2a035f423adb9b9bc6735aad672368575532007948d4483645e188fe99759c302a39542479d + languageName: node + linkType: hard + "emoji-regex@npm:>=6.0.0 <=6.1.1": version: 6.1.1 resolution: "emoji-regex@npm:6.1.1" @@ -10112,6 +10441,16 @@ __metadata: languageName: node linkType: hard +"eslint-module-utils@npm:^2.6.1": + version: 2.6.1 + resolution: "eslint-module-utils@npm:2.6.1" + dependencies: + debug: ^3.2.7 + pkg-dir: ^2.0.0 + checksum: 3de93ecfd7a0b803a2cd91afd5cbb32dca559f58c22e92f95ec4700ff75e008035587ee032b9196d6565fbd73f799992122a8dc8ea0b979c07229b51735a8bed + languageName: node + linkType: hard + "eslint-plugin-flowtype@npm:^5.2.0": version: 5.7.1 resolution: "eslint-plugin-flowtype@npm:5.7.1" @@ -10159,6 +10498,31 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-import@npm:^2.23.3": + version: 2.23.3 + resolution: "eslint-plugin-import@npm:2.23.3" + dependencies: + array-includes: ^3.1.3 + array.prototype.flat: ^1.2.4 + debug: ^2.6.9 + doctrine: ^2.1.0 + eslint-import-resolver-node: ^0.3.4 + eslint-module-utils: ^2.6.1 + find-up: ^2.0.0 + has: ^1.0.3 + is-core-module: ^2.4.0 + minimatch: ^3.0.4 + object.values: ^1.1.3 + pkg-up: ^2.0.0 + read-pkg-up: ^3.0.0 + resolve: ^1.20.0 + tsconfig-paths: ^3.9.0 + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 + checksum: 25f2ec03f1a3b12b98e4e9787dca9023fffd7e7df6c3a08d514476a861a028d9299546f6b09e3d80cfa370aaffd52179cbb6ef397c6397a321a94525d4e009df + languageName: node + linkType: hard + "eslint-plugin-jest@npm:^24.1.0": version: 24.3.5 resolution: "eslint-plugin-jest@npm:24.3.5" @@ -10252,14 +10616,14 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-testing-library@npm:^4.3.0": - version: 4.3.0 - resolution: "eslint-plugin-testing-library@npm:4.3.0" +"eslint-plugin-testing-library@npm:^4.6.0": + version: 4.6.0 + resolution: "eslint-plugin-testing-library@npm:4.6.0" dependencies: - "@typescript-eslint/experimental-utils": ^4.21.0 + "@typescript-eslint/experimental-utils": ^4.24.0 peerDependencies: eslint: ^7.5.0 - checksum: 3cade3c1ebcbc51a17f0c907bc9477d696766241b6d018f639954e2f0e74acf9fbdb66c47733b4c7813203fc86162d738c46163011957f48ee8dd1bac948f2a8 + checksum: aa7dc0272f5f7edfdf8afcb83e6e42e9ffa21079babf362ea3dc16efb078dfb2a190896ad7ff481ada05abb56c2327df828c7a56b01a866710fc36982a23464c languageName: node linkType: hard @@ -10370,9 +10734,9 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^7.26.0": - version: 7.26.0 - resolution: "eslint@npm:7.26.0" +"eslint@npm:^7.27.0": + version: 7.27.0 + resolution: "eslint@npm:7.27.0" dependencies: "@babel/code-frame": 7.12.11 "@eslint/eslintrc": ^0.4.1 @@ -10382,12 +10746,14 @@ __metadata: debug: ^4.0.1 doctrine: ^3.0.0 enquirer: ^2.3.5 + escape-string-regexp: ^4.0.0 eslint-scope: ^5.1.1 eslint-utils: ^2.1.0 eslint-visitor-keys: ^2.0.0 espree: ^7.3.1 esquery: ^1.4.0 esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 file-entry-cache: ^6.0.1 functional-red-black-tree: ^1.0.1 glob-parent: ^5.0.0 @@ -10399,7 +10765,7 @@ __metadata: js-yaml: ^3.13.1 json-stable-stringify-without-jsonify: ^1.0.1 levn: ^0.4.1 - lodash: ^4.17.21 + lodash.merge: ^4.6.2 minimatch: ^3.0.4 natural-compare: ^1.4.0 optionator: ^0.9.1 @@ -10408,12 +10774,12 @@ __metadata: semver: ^7.2.1 strip-ansi: ^6.0.0 strip-json-comments: ^3.1.0 - table: ^6.0.4 + table: ^6.0.9 text-table: ^0.2.0 v8-compile-cache: ^2.0.3 bin: eslint: bin/eslint.js - checksum: 08f99befd764fbd6ea811e9eec27d5c6b9dc9d1bbfe5ffa1016e4f1fe526a4f45ea127c4e30c554c423ee55eb290ce9af4fb7fedf9b7af3f84076a444c2bbdf6 + checksum: c91a9a88091fb2654ec599b452f6d8aff22daa4a21761e762536877ec8b65cd6386c29ea2e0fec2668125a07c62973bc23922f924c999e140c1042b8cffca030 languageName: node linkType: hard @@ -10654,6 +11020,20 @@ __metadata: languageName: node linkType: hard +"expect@npm:^27.0.1": + version: 27.0.1 + resolution: "expect@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + ansi-styles: ^5.0.0 + jest-get-type: ^27.0.1 + jest-matcher-utils: ^27.0.1 + jest-message-util: ^27.0.1 + jest-regex-util: ^27.0.1 + checksum: dfe575e2e18fd58ebf7dfbd40ea0b7b357df7d1baf158bd839a89ff82b1746e26b4ee189dd3d8f260f598f2ce80cae91ecc8e17133ad014f193ad786ee5b8bbd + languageName: node + linkType: hard + "express@npm:^4.17.1": version: 4.17.1 resolution: "express@npm:4.17.1" @@ -10768,7 +11148,7 @@ __metadata: languageName: node linkType: hard -"fast-deep-equal@npm:^3.1.1": +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" checksum: 451526766b219503131d11e823eaadd1533080b0be4860e316670b039dcaf31cd1007c2fe036a9b922abba7c040dfad5e942ed79d21f2ff849e50049f36e0fb7 @@ -11187,6 +11567,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^3.0.0": + version: 3.0.1 + resolution: "form-data@npm:3.0.1" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 6574ff4d2d845c47ba288151a6e0573767eefdee9da358be199e0f0b66aa5c454e7d62ed5e0daef6f84167ba1e9596e064f36f206488e460ef449ef7b653cdfc + languageName: node + linkType: hard + "form-data@npm:~2.3.2": version: 2.3.3 resolution: "form-data@npm:2.3.3" @@ -11317,7 +11708,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.1": +"fsevents@^2.1.2, fsevents@^2.1.3, fsevents@^2.3.2, fsevents@~2.3.1": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: @@ -11336,7 +11727,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.1.2#builtin, fsevents@patch:fsevents@^2.1.3#builtin, fsevents@patch:fsevents@~2.3.1#builtin": +"fsevents@patch:fsevents@^2.1.2#builtin, fsevents@patch:fsevents@^2.1.3#builtin, fsevents@patch:fsevents@^2.3.2#builtin, fsevents@patch:fsevents@~2.3.1#builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#builtin::version=2.3.2&hash=11e9ea" dependencies: @@ -11382,7 +11773,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"get-caller-file@npm:^2.0.1": +"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" checksum: 9dd9e1e2591039ee4c38c897365b904f66f1e650a8c1cb7b7db8ce667fa63e88cc8b13282b74df9d93de481114b3304a0487880d31cd926dfda6efe71455855d @@ -12656,24 +13047,25 @@ fsevents@^1.2.7: languageName: node linkType: hard -"inquirer@npm:8.0.0": - version: 8.0.0 - resolution: "inquirer@npm:8.0.0" +"inquirer@npm:8.1.0": + version: 8.1.0 + resolution: "inquirer@npm:8.1.0" dependencies: ansi-escapes: ^4.2.1 - chalk: ^4.1.0 + chalk: ^4.1.1 cli-cursor: ^3.1.0 cli-width: ^3.0.0 external-editor: ^3.0.3 figures: ^3.0.0 lodash: ^4.17.21 mute-stream: 0.0.8 + ora: ^5.3.0 run-async: ^2.4.0 rxjs: ^6.6.6 string-width: ^4.1.0 strip-ansi: ^6.0.0 through: ^2.3.6 - checksum: 7dbe4461f5b217e53e8ba1b81a10b88033ecb814678c23e9e8286600a9c055887e6b8fae1c0ce5c4da56b8301d199bab668a00618ba174332066d1ca927f16ea + checksum: 386a465a5045d2968a7eaae8d84fed3c4fcec7cbf8bfd030541e8ea82b8f7a2132f98935b1321a3d0af39c196a09f38bb3cfd3105d7812799062235e45839b11 languageName: node linkType: hard @@ -12853,7 +13245,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-ci@npm:3.0.0": +"is-ci@npm:3.0.0, is-ci@npm:^3.0.0": version: 3.0.0 resolution: "is-ci@npm:3.0.0" dependencies: @@ -12898,6 +13290,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-core-module@npm:^2.4.0": + version: 2.4.0 + resolution: "is-core-module@npm:2.4.0" + dependencies: + has: ^1.0.3 + checksum: caa2b30873ed14dff76e5351e3c55a677b890cf19cc4263e9894702eb4bd64f81ce78552daad878ba72adcdc9e62cad45ca57928fc8b4bdc84a7ff8acf934389 + languageName: node + linkType: hard + "is-data-descriptor@npm:^0.1.4": version: 0.1.4 resolution: "is-data-descriptor@npm:0.1.4" @@ -13190,7 +13591,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-potential-custom-element-name@npm:^1.0.0": +"is-potential-custom-element-name@npm:^1.0.0, is-potential-custom-element-name@npm:^1.0.1": version: 1.0.1 resolution: "is-potential-custom-element-name@npm:1.0.1" checksum: 25520ce8de393b87c8a2ce4d410c424d16baab0d5a43cbf76af148940725e489dbf3541a43371bcc0881fcb186d9a4ed18b774a11ac8743dd064303cea8de50d @@ -13454,6 +13855,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-changed-files@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-changed-files@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + execa: ^5.0.0 + throat: ^6.0.1 + checksum: 1cd64482c0a22df6c96a0da55f374975c4479c47048b967732cf4fdd0af593e51d1a0c57d69ca6dd53efaf718ea73401349cf2a8f5933088bbc0134802343b44 + languageName: node + linkType: hard + "jest-circus@npm:26.6.0": version: 26.6.0 resolution: "jest-circus@npm:26.6.0" @@ -13483,7 +13895,34 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-cli@npm:^26.6.0, jest-cli@npm:^26.6.3": +"jest-circus@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-circus@npm:27.0.1" + dependencies: + "@jest/environment": ^27.0.1 + "@jest/test-result": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^0.7.0 + expect: ^27.0.1 + is-generator-fn: ^2.0.0 + jest-each: ^27.0.1 + jest-matcher-utils: ^27.0.1 + jest-message-util: ^27.0.1 + jest-runner: ^27.0.1 + jest-runtime: ^27.0.1 + jest-snapshot: ^27.0.1 + jest-util: ^27.0.1 + pretty-format: ^27.0.1 + stack-utils: ^2.0.3 + throat: ^6.0.1 + checksum: 8539b9604de6e0afa6b2c9cc526ae13ec7f45087d3fc6da331e5c6a53a2a7d10e859ca1b3a127d65132cf603c71c0046ba4d8dc3b693602b271c967225d19e58 + languageName: node + linkType: hard + +"jest-cli@npm:^26.6.0": version: 26.6.3 resolution: "jest-cli@npm:26.6.3" dependencies: @@ -13506,21 +13945,48 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-config@npm:^26.6.3": - version: 26.6.3 - resolution: "jest-config@npm:26.6.3" +"jest-cli@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-cli@npm:27.0.1" dependencies: - "@babel/core": ^7.1.0 - "@jest/test-sequencer": ^26.6.3 - "@jest/types": ^26.6.2 - babel-jest: ^26.6.3 + "@jest/core": ^27.0.1 + "@jest/test-result": ^27.0.1 + "@jest/types": ^27.0.1 chalk: ^4.0.0 - deepmerge: ^4.2.2 - glob: ^7.1.1 + exit: ^0.1.2 graceful-fs: ^4.2.4 - jest-environment-jsdom: ^26.6.2 - jest-environment-node: ^26.6.2 - jest-get-type: ^26.3.0 + import-local: ^3.0.2 + jest-config: ^27.0.1 + jest-util: ^27.0.1 + jest-validate: ^27.0.1 + prompts: ^2.0.1 + yargs: ^16.0.3 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: eaf0e6e15c81bad85a07ba61c00194e94d63ed6eeef3377228d0346d90692ace4ea289a5b7e7668d7602d41a7bdf2f2d6ebca4cab712ef9428b35c468f523e3b + languageName: node + linkType: hard + +"jest-config@npm:^26.6.3": + version: 26.6.3 + resolution: "jest-config@npm:26.6.3" + dependencies: + "@babel/core": ^7.1.0 + "@jest/test-sequencer": ^26.6.3 + "@jest/types": ^26.6.2 + babel-jest: ^26.6.3 + chalk: ^4.0.0 + deepmerge: ^4.2.2 + glob: ^7.1.1 + graceful-fs: ^4.2.4 + jest-environment-jsdom: ^26.6.2 + jest-environment-node: ^26.6.2 + jest-get-type: ^26.3.0 jest-jasmine2: ^26.6.3 jest-regex-util: ^26.0.0 jest-resolve: ^26.6.2 @@ -13537,6 +14003,39 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-config@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-config@npm:27.0.1" + dependencies: + "@babel/core": ^7.1.0 + "@jest/test-sequencer": ^27.0.1 + "@jest/types": ^27.0.1 + babel-jest: ^27.0.1 + chalk: ^4.0.0 + deepmerge: ^4.2.2 + glob: ^7.1.1 + graceful-fs: ^4.2.4 + is-ci: ^3.0.0 + jest-circus: ^27.0.1 + jest-environment-jsdom: ^27.0.1 + jest-environment-node: ^27.0.1 + jest-get-type: ^27.0.1 + jest-jasmine2: ^27.0.1 + jest-regex-util: ^27.0.1 + jest-resolve: ^27.0.1 + jest-util: ^27.0.1 + jest-validate: ^27.0.1 + micromatch: ^4.0.4 + pretty-format: ^27.0.1 + peerDependencies: + ts-node: ">=9.0.0" + peerDependenciesMeta: + ts-node: + optional: true + checksum: 2e409785f59a88ee4fec3a080a09d3926bd40e7440309514666e50c826bfc38f6452251f564614c66f002de00a21cf5aac8a0e1a132b8f7371e4d718a9fbfd04 + languageName: node + linkType: hard + "jest-diff@npm:^26.0.0, jest-diff@npm:^26.6.2": version: 26.6.2 resolution: "jest-diff@npm:26.6.2" @@ -13549,6 +14048,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-diff@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-diff@npm:27.0.1" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^27.0.1 + jest-get-type: ^27.0.1 + pretty-format: ^27.0.1 + checksum: 7bde7d03737027b8031005f82ab8b9cc5f6c06461ac3487a217a912fb6d48313e1cfd31b3b82e58a7fe8ee05682d313400e80b3bf094d33d59def786f3d34d0a + languageName: node + linkType: hard + "jest-docblock@npm:^26.0.0": version: 26.0.0 resolution: "jest-docblock@npm:26.0.0" @@ -13558,6 +14069,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-docblock@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-docblock@npm:27.0.1" + dependencies: + detect-newline: ^3.0.0 + checksum: 64a346c2648a3d5a192b3ec00af26d3d0fab28fb547b8fdce8106ea6f6dd99b0f81095d388244d1bb1be3704541873eee3c5104862f6f27a45b6d5616667fc2b + languageName: node + linkType: hard + "jest-each@npm:^26.6.0, jest-each@npm:^26.6.2": version: 26.6.2 resolution: "jest-each@npm:26.6.2" @@ -13571,6 +14091,19 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-each@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-each@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + chalk: ^4.0.0 + jest-get-type: ^27.0.1 + jest-util: ^27.0.1 + pretty-format: ^27.0.1 + checksum: 68723be4feb2a358335ccca696aef276240691f0a3f7eb376eaca14a6df1a038831d8d469efa408ab35c5751c5359e64efe781c8824a96f30d4cf5deea28a513 + languageName: node + linkType: hard + "jest-environment-jsdom@npm:^26.6.2": version: 26.6.2 resolution: "jest-environment-jsdom@npm:26.6.2" @@ -13586,6 +14119,21 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-environment-jsdom@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-environment-jsdom@npm:27.0.1" + dependencies: + "@jest/environment": ^27.0.1 + "@jest/fake-timers": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/node": "*" + jest-mock: ^27.0.1 + jest-util: ^27.0.1 + jsdom: ^16.6.0 + checksum: 2dc5fee2c63115f9013f2243f9513a26763b21b0cde0ac5360b40b751f49c1fe168e9f895b6f344cca0e2cd7d4f518194eaaf557d9d54bcacc14e38babb6898c + languageName: node + linkType: hard + "jest-environment-node@npm:^26.6.2": version: 26.6.2 resolution: "jest-environment-node@npm:26.6.2" @@ -13600,6 +14148,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-environment-node@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-environment-node@npm:27.0.1" + dependencies: + "@jest/environment": ^27.0.1 + "@jest/fake-timers": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/node": "*" + jest-mock: ^27.0.1 + jest-util: ^27.0.1 + checksum: 374e091d7969eeac0f4f0f595decf0a2b5139522cdf0026f0f0eabcd2d1ca058290c9a0ae91771f690403387069a0cbbe015df64a59144e7b37e64ec35c4c551 + languageName: node + linkType: hard + "jest-get-type@npm:^26.3.0": version: 26.3.0 resolution: "jest-get-type@npm:26.3.0" @@ -13607,6 +14169,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-get-type@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-get-type@npm:27.0.1" + checksum: bb816bd1e5bf64848448cceb8c441cd5a41881eb744a255ee76833b5bac3e32e4f3ac2735b7af2f5f541cabe4d8eb72937c50bc54349a3db2477969c01f92f54 + languageName: node + linkType: hard + "jest-haste-map@npm:^26.6.2": version: 26.6.2 resolution: "jest-haste-map@npm:26.6.2" @@ -13632,6 +14201,30 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-haste-map@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-haste-map@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + "@types/graceful-fs": ^4.1.2 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.4 + jest-regex-util: ^27.0.1 + jest-serializer: ^27.0.1 + jest-util: ^27.0.1 + jest-worker: ^27.0.1 + micromatch: ^4.0.4 + walker: ^1.0.7 + dependenciesMeta: + fsevents: + optional: true + checksum: 561f024ae659edeb60040609e2dd01b7db5b48a7b6f2ec171d936684042d8f6bbfe25afb73231c209d0618738053b11618ea8a734acc2361f748fc25b0690fcd + languageName: node + linkType: hard + "jest-jasmine2@npm:^26.6.3": version: 26.6.3 resolution: "jest-jasmine2@npm:26.6.3" @@ -13658,6 +14251,32 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-jasmine2@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-jasmine2@npm:27.0.1" + dependencies: + "@babel/traverse": ^7.1.0 + "@jest/environment": ^27.0.1 + "@jest/source-map": ^27.0.1 + "@jest/test-result": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + expect: ^27.0.1 + is-generator-fn: ^2.0.0 + jest-each: ^27.0.1 + jest-matcher-utils: ^27.0.1 + jest-message-util: ^27.0.1 + jest-runtime: ^27.0.1 + jest-snapshot: ^27.0.1 + jest-util: ^27.0.1 + pretty-format: ^27.0.1 + throat: ^6.0.1 + checksum: 58a1e96a2be32beb82e22697a822db2965283756ea0f29e3c67bf3afdd423d6b4d605ae456800606db305bee008d05ca567c81375e396ec0976b7c7cb428cb4b + languageName: node + linkType: hard + "jest-leak-detector@npm:^26.6.2": version: 26.6.2 resolution: "jest-leak-detector@npm:26.6.2" @@ -13668,6 +14287,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-leak-detector@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-leak-detector@npm:27.0.1" + dependencies: + jest-get-type: ^27.0.1 + pretty-format: ^27.0.1 + checksum: 02388bc061e349af095fe6beefba953a5d05c12b3ec3c15abf462b06fe38731d7562cbbaec7783765ce2933e667ca8d12931a27ac0f14533a0ecd29f6a2f2f5b + languageName: node + linkType: hard + "jest-matcher-utils@npm:^26.6.0, jest-matcher-utils@npm:^26.6.2": version: 26.6.2 resolution: "jest-matcher-utils@npm:26.6.2" @@ -13680,6 +14309,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-matcher-utils@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-matcher-utils@npm:27.0.1" + dependencies: + chalk: ^4.0.0 + jest-diff: ^27.0.1 + jest-get-type: ^27.0.1 + pretty-format: ^27.0.1 + checksum: 94be902e1295e5c3bd22573ff1de29567411b846df2cdcb7accff3a80fcbda381a44fbb86aa26e95cb2551662eadd2e76970702e906329d633b3b63ce6b1fe42 + languageName: node + linkType: hard + "jest-message-util@npm:^26.6.0, jest-message-util@npm:^26.6.2": version: 26.6.2 resolution: "jest-message-util@npm:26.6.2" @@ -13697,6 +14338,23 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-message-util@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-message-util@npm:27.0.1" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^27.0.1 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.4 + micromatch: ^4.0.4 + pretty-format: ^27.0.1 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 61bae0ea44107ea486b08a674298c4cd541451aed4c5eac13b61b1f1d70ec03eab6078d609de344e4ac3a41c5d8f8ca670b476733bec1cb08978ed0e686d070e + languageName: node + linkType: hard + "jest-mock@npm:^26.6.2": version: 26.6.2 resolution: "jest-mock@npm:26.6.2" @@ -13707,6 +14365,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-mock@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-mock@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + "@types/node": "*" + checksum: 33a0874659726d1bf2de40fe50d3a04064542e481836239096f75c02c2ad9722d6f37a5693518587ae79d4ad886ba9913280618fe3a512ffd0f956acb8062502 + languageName: node + linkType: hard + "jest-pnp-resolver@npm:^1.2.2": version: 1.2.2 resolution: "jest-pnp-resolver@npm:1.2.2" @@ -13726,6 +14394,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-regex-util@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-regex-util@npm:27.0.1" + checksum: 8240b7ca4a240eb5a28149e11b3a559f39f5067ff27032ed20ded5e50d91334ade58a616ddf7803eda85dd36c8ea39c9aa99430cb7a08f814ef67fa1a89e9f68 + languageName: node + linkType: hard + "jest-resolve-dependencies@npm:^26.6.3": version: 26.6.3 resolution: "jest-resolve-dependencies@npm:26.6.3" @@ -13737,6 +14412,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-resolve-dependencies@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-resolve-dependencies@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + jest-regex-util: ^27.0.1 + jest-snapshot: ^27.0.1 + checksum: 6718aca7e25973b2533cbf1ba707b576ca80b07a8dd41ebf332e874e82268769559da1bd4c935494857c86eb24086aa43e4c4b8de2ce4e1c8666ffa9276b7d01 + languageName: node + linkType: hard + "jest-resolve@npm:26.6.0": version: 26.6.0 resolution: "jest-resolve@npm:26.6.0" @@ -13769,6 +14455,22 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-resolve@npm:27.0.1, jest-resolve@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-resolve@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + chalk: ^4.0.0 + escalade: ^3.1.1 + graceful-fs: ^4.2.4 + jest-pnp-resolver: ^1.2.2 + jest-util: ^27.0.1 + resolve: ^1.20.0 + slash: ^3.0.0 + checksum: d62835c92aa4a89c72a5cb062a27ea86b0278d261d283b4ef08eee990df8a3229f9ed40b0c16f5a314f3ebb76f5f05d367a4955679cce61f9ccc3e9736c550f6 + languageName: node + linkType: hard + "jest-runner@npm:^26.6.0, jest-runner@npm:^26.6.3": version: 26.6.3 resolution: "jest-runner@npm:26.6.3" @@ -13797,6 +14499,35 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-runner@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-runner@npm:27.0.1" + dependencies: + "@jest/console": ^27.0.1 + "@jest/environment": ^27.0.1 + "@jest/test-result": ^27.0.1 + "@jest/transform": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.8.1 + exit: ^0.1.2 + graceful-fs: ^4.2.4 + jest-config: ^27.0.1 + jest-docblock: ^27.0.1 + jest-haste-map: ^27.0.1 + jest-leak-detector: ^27.0.1 + jest-message-util: ^27.0.1 + jest-resolve: ^27.0.1 + jest-runtime: ^27.0.1 + jest-util: ^27.0.1 + jest-worker: ^27.0.1 + source-map-support: ^0.5.6 + throat: ^6.0.1 + checksum: d995589a37cdbb82cbdd956927193f76800b2c744cc4908dae475882d83a34b13c8d2e8af639ca153414582d36371c7884a773e937fcbb915bc30924d73e836b + languageName: node + linkType: hard + "jest-runtime@npm:^26.6.0, jest-runtime@npm:^26.6.3": version: 26.6.3 resolution: "jest-runtime@npm:26.6.3" @@ -13834,6 +14565,40 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-runtime@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-runtime@npm:27.0.1" + dependencies: + "@jest/console": ^27.0.1 + "@jest/environment": ^27.0.1 + "@jest/fake-timers": ^27.0.1 + "@jest/globals": ^27.0.1 + "@jest/source-map": ^27.0.1 + "@jest/test-result": ^27.0.1 + "@jest/transform": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/yargs": ^16.0.0 + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.4 + jest-haste-map: ^27.0.1 + jest-message-util: ^27.0.1 + jest-mock: ^27.0.1 + jest-regex-util: ^27.0.1 + jest-resolve: ^27.0.1 + jest-snapshot: ^27.0.1 + jest-util: ^27.0.1 + jest-validate: ^27.0.1 + slash: ^3.0.0 + strip-bom: ^4.0.0 + yargs: ^16.0.3 + checksum: ae422674e07ebac79dd935ddc8d2f9db4cafc3d28815ebdc7daad5401ea48ddacb6226b9ed9eab88f70d9c241e5cc67f90d76a071593eb9a30f4dfa51196b914 + languageName: node + linkType: hard + "jest-serializer@npm:^26.6.2": version: 26.6.2 resolution: "jest-serializer@npm:26.6.2" @@ -13844,6 +14609,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-serializer@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-serializer@npm:27.0.1" + dependencies: + "@types/node": "*" + graceful-fs: ^4.2.4 + checksum: 4f8812fdae263382887ad1fa75547191cb1e8ce4a840e813732eaf0ab8768e8897d92e96af1340c6ad3ebb8cd88ca6ef0a6d3607f1e7be169b592bc438d4a163 + languageName: node + linkType: hard + "jest-snapshot@npm:^26.6.0, jest-snapshot@npm:^26.6.2": version: 26.6.2 resolution: "jest-snapshot@npm:26.6.2" @@ -13868,6 +14643,38 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-snapshot@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-snapshot@npm:27.0.1" + dependencies: + "@babel/core": ^7.7.2 + "@babel/generator": ^7.7.2 + "@babel/parser": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.0.0 + "@jest/transform": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/babel__traverse": ^7.0.4 + "@types/prettier": ^2.1.5 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^27.0.1 + graceful-fs: ^4.2.4 + jest-diff: ^27.0.1 + jest-get-type: ^27.0.1 + jest-haste-map: ^27.0.1 + jest-matcher-utils: ^27.0.1 + jest-message-util: ^27.0.1 + jest-resolve: ^27.0.1 + jest-util: ^27.0.1 + natural-compare: ^1.4.0 + pretty-format: ^27.0.1 + semver: ^7.3.2 + checksum: 3ae996aca0f323e988f4c1d706def783c8661affd933811942ed5e2808de8d39f8ae59af9400b12242df4ae6a75c0bdee1806aec46979eebf02571a97033d952 + languageName: node + linkType: hard + "jest-util@npm:^26.1.0, jest-util@npm:^26.6.0, jest-util@npm:^26.6.2": version: 26.6.2 resolution: "jest-util@npm:26.6.2" @@ -13882,6 +14689,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-util@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-util@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + "@types/node": "*" + chalk: ^4.0.0 + graceful-fs: ^4.2.4 + is-ci: ^3.0.0 + picomatch: ^2.2.3 + checksum: a395978f7f0599508ff4d7738ddb62cdcb24350e8ddded59727300a3892318f984f035534ecfc5c7c4af85f26eea4754796aa41903a552b433d876ff08c9c9f3 + languageName: node + linkType: hard + "jest-validate@npm:^26.6.2": version: 26.6.2 resolution: "jest-validate@npm:26.6.2" @@ -13896,6 +14717,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-validate@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-validate@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^27.0.1 + leven: ^3.1.0 + pretty-format: ^27.0.1 + checksum: c0c2e418aa083405a463bfa70a7c526481f63c109efcf2c8d53b5fb3de037a8ba2431e9df7e42f8217c4669035f019f798a064c4ff9b9d22ba3125524b7ff040 + languageName: node + linkType: hard + "jest-watch-typeahead@npm:0.6.1": version: 0.6.1 resolution: "jest-watch-typeahead@npm:0.6.1" @@ -13928,6 +14763,21 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-watcher@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-watcher@npm:27.0.1" + dependencies: + "@jest/test-result": ^27.0.1 + "@jest/types": ^27.0.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + jest-util: ^27.0.1 + string-length: ^4.0.1 + checksum: 9402f466716fb14a4fcf9c30883b574cd4e465a5320531c943d7f71c4713c8aacb644193417796e517b62f54e477be93aba5465db9b9b7f64aa943b146b8fa0c + languageName: node + linkType: hard + "jest-worker@npm:^24.9.0": version: 24.9.0 resolution: "jest-worker@npm:24.9.0" @@ -13949,6 +14799,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-worker@npm:^27.0.1": + version: 27.0.1 + resolution: "jest-worker@npm:27.0.1" + dependencies: + "@types/node": "*" + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: c99fcfd6bf2ef0c9fef30e08fb00d7fe951be84d2cff37a3d8983d683857b150a7ac60829ed30893c69277a1d74b57fc2b8aae83ded208fd574985fd9b04162f + languageName: node + linkType: hard + "jest@npm:26.6.0": version: 26.6.0 resolution: "jest@npm:26.6.0" @@ -13962,16 +14823,21 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest@npm:^26.6.3": - version: 26.6.3 - resolution: "jest@npm:26.6.3" +"jest@npm:^27.0.1": + version: 27.0.1 + resolution: "jest@npm:27.0.1" dependencies: - "@jest/core": ^26.6.3 + "@jest/core": ^27.0.1 import-local: ^3.0.2 - jest-cli: ^26.6.3 + jest-cli: ^27.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 + peerDependenciesMeta: + node-notifier: + optional: true bin: jest: bin/jest.js - checksum: 4ffcfefa2b30999a71c205e1aacf2b3d7af10f36c17ba1baf45677684116ad5aa6a5bb162ad2dd418f9ea99d18f24b70d8c83fb317b765a3acac361a50e9db9f + checksum: dde998f5f410a47c3c3a7fb7a83046b1a5d50134794981849aa6969722faf59f93dae1be24086cf3a79eb7f128480eac1a9a25d7c68d673f712d7ed7d32c00b7 languageName: node linkType: hard @@ -14064,6 +14930,46 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jsdom@npm:^16.6.0": + version: 16.6.0 + resolution: "jsdom@npm:16.6.0" + dependencies: + abab: ^2.0.5 + acorn: ^8.2.4 + acorn-globals: ^6.0.0 + cssom: ^0.4.4 + cssstyle: ^2.3.0 + data-urls: ^2.0.0 + decimal.js: ^10.2.1 + domexception: ^2.0.1 + escodegen: ^2.0.0 + form-data: ^3.0.0 + html-encoding-sniffer: ^2.0.1 + http-proxy-agent: ^4.0.1 + https-proxy-agent: ^5.0.0 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.0 + parse5: 6.0.1 + saxes: ^5.0.1 + symbol-tree: ^3.2.4 + tough-cookie: ^4.0.0 + w3c-hr-time: ^1.0.2 + w3c-xmlserializer: ^2.0.0 + webidl-conversions: ^6.1.0 + whatwg-encoding: ^1.0.5 + whatwg-mimetype: ^2.3.0 + whatwg-url: ^8.5.0 + ws: ^7.4.5 + xml-name-validator: ^3.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: ee0c9ef2cf499d01d6186622a3788df72fa970a2eb695a237efebace6d99875a3402062842420badddad02cf1e90a0de88c65a266366721a45732144f7616db6 + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -14385,23 +15291,23 @@ fsevents@^1.2.7: version: 0.0.0-use.local resolution: "lineup-lite@workspace:." dependencies: - "@typescript-eslint/eslint-plugin": ^4.23.0 - "@typescript-eslint/parser": ^4.23.0 - "@typescript-eslint/typescript-estree": ^4.23.0 + "@typescript-eslint/eslint-plugin": ^4.25.0 + "@typescript-eslint/parser": ^4.25.0 + "@typescript-eslint/typescript-estree": ^4.25.0 "@yarnpkg/pnpify": ^2.4.0 babel-eslint: ^10.1.0 - eslint: ^7.26.0 + eslint: ^7.27.0 eslint-config-airbnb-typescript: ^12.3.1 eslint-config-prettier: ^8.3.0 eslint-config-react-app: ^6.0.0 eslint-plugin-flowtype: ^5.7.2 - eslint-plugin-import: ^2.22.1 + eslint-plugin-import: ^2.23.3 eslint-plugin-jsx-a11y: ^6.4.1 eslint-plugin-prettier: ^3.4.0 eslint-plugin-react: ^7.23.2 eslint-plugin-react-hooks: ^4.2.0 prettier: ^2.3.0 - release-it: ^14.6.2 + release-it: ^14.7.0 shx: ^0.3.3 typescript: ^4.2.4 dependenciesMeta: @@ -14422,6 +15328,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.2 + parse-json: ^4.0.0 + pify: ^3.0.0 + strip-bom: ^3.0.0 + checksum: 692f33387be2439e920e394a70754499c22eabe567f55fee7c0a8994c050e27360c1b39c5375d214539ebb7d609d28e69f6bd6e3c070d30bc202c99289e27f96 + languageName: node + linkType: hard + "loader-runner@npm:^2.4.0": version: 2.4.0 resolution: "loader-runner@npm:2.4.0" @@ -14598,7 +15516,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lodash.merge@npm:^4.4.0": +"lodash.merge@npm:^4.4.0, lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" checksum: 4e2bb42a87a148991458d7c384bc197e96f7115e9536fc8e2c86ae9e99ce1c1f693ff15eb85761952535f48d72253aed8e673d9f32dde3e671cd91e3fde220a7 @@ -15027,7 +15945,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"micromatch@npm:^4.0.2": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": version: 4.0.4 resolution: "micromatch@npm:4.0.4" dependencies: @@ -16042,7 +16960,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"ora@npm:5.4.0": +"ora@npm:5.4.0, ora@npm:^5.3.0": version: 5.4.0 resolution: "ora@npm:5.4.0" dependencies: @@ -16616,7 +17534,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pkg-up@npm:2.0.0": +"pkg-up@npm:2.0.0, pkg-up@npm:^2.0.0": version: 2.0.0 resolution: "pkg-up@npm:2.0.0" dependencies: @@ -18005,6 +18923,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"pretty-format@npm:^27.0.1": + version: 27.0.1 + resolution: "pretty-format@npm:27.0.1" + dependencies: + "@jest/types": ^27.0.1 + ansi-regex: ^5.0.0 + ansi-styles: ^5.0.0 + react-is: ^17.0.1 + checksum: b31005351d7a1bee307f4fc7652f716cc5278427addcd3982ce1f1705bab11d140feb38644d30102b0aa440dbe9bd1988751f260dc3787241ba45d70bc321083 + languageName: node + linkType: hard + "pretty-time@npm:^1.1.0": version: 1.1.0 resolution: "pretty-time@npm:1.1.0" @@ -18876,6 +19806,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"read-pkg-up@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg-up@npm:3.0.0" + dependencies: + find-up: ^2.0.0 + read-pkg: ^3.0.0 + checksum: 3ef50bea6df7ee0153b41f2bd2dda66ccd1fd06117a312b940b4158801c5b3cd2e4d9e9e2a81486f3197412385d7b52f17f70012e35ddb1e30acd7b425e00e38 + languageName: node + linkType: hard + "read-pkg-up@npm:^7.0.1": version: 7.0.1 resolution: "read-pkg-up@npm:7.0.1" @@ -18898,6 +19838,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: ^4.0.0 + normalize-package-data: ^2.3.2 + path-type: ^3.0.0 + checksum: 8cc577b41ddd70a0037d6c0414acfab8db3a25a30c7854decf3d613f1f4240c8a47e20fddbd82724e02d4eb5a0c489e2621b4a5bb3558e09ce81f53306d1b850 + languageName: node + linkType: hard + "read-pkg@npm:^5.2.0": version: 5.2.0 resolution: "read-pkg@npm:5.2.0" @@ -19132,9 +20083,9 @@ fsevents@^1.2.7: languageName: node linkType: hard -"release-it@npm:^14.6.2": - version: 14.6.2 - resolution: "release-it@npm:14.6.2" +"release-it@npm:^14.7.0": + version: 14.7.0 + resolution: "release-it@npm:14.7.0" dependencies: "@iarna/toml": 2.2.5 "@octokit/rest": 18.5.3 @@ -19150,7 +20101,7 @@ fsevents@^1.2.7: globby: 11.0.3 got: 11.8.2 import-cwd: 3.0.0 - inquirer: 8.0.0 + inquirer: 8.1.0 is-ci: 3.0.0 lodash: 4.17.21 mime-types: 2.1.30 @@ -19166,7 +20117,7 @@ fsevents@^1.2.7: yargs-parser: 20.2.7 bin: release-it: bin/release-it.js - checksum: e645603d6360eaf619e8d249f06cba2b0d924ba15c050639368d0d8ed1c94d5328b04f58717113f74e2d1200d4b0c3fc09a5de27244ead4989239b572c316448 + checksum: f73e94db7f43d5ef8cc36992c221c5cc8ca852b3a3f309b99b6ed2c21b5d3021942262f36d5efb35ca64ae658161860d5115111976afe80d24338c15ee3a0fde languageName: node linkType: hard @@ -19466,7 +20417,7 @@ resolve@1.18.1: languageName: node linkType: hard -"resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.3.2, resolve@^1.8.1": +"resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1": version: 1.20.0 resolution: "resolve@npm:1.20.0" dependencies: @@ -19496,7 +20447,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#builtin, resolve@patch:resolve@^1.10.0#builtin, resolve@patch:resolve@^1.12.0#builtin, resolve@patch:resolve@^1.13.1#builtin, resolve@patch:resolve@^1.14.2#builtin, resolve@patch:resolve@^1.17.0#builtin, resolve@patch:resolve@^1.18.1#builtin, resolve@patch:resolve@^1.19.0#builtin, resolve@patch:resolve@^1.3.2#builtin, resolve@patch:resolve@^1.8.1#builtin": +"resolve@patch:resolve@^1.1.6#builtin, resolve@patch:resolve@^1.10.0#builtin, resolve@patch:resolve@^1.12.0#builtin, resolve@patch:resolve@^1.13.1#builtin, resolve@patch:resolve@^1.14.2#builtin, resolve@patch:resolve@^1.17.0#builtin, resolve@patch:resolve@^1.18.1#builtin, resolve@patch:resolve@^1.19.0#builtin, resolve@patch:resolve@^1.20.0#builtin, resolve@patch:resolve@^1.3.2#builtin, resolve@patch:resolve@^1.8.1#builtin": version: 1.20.0 resolution: "resolve@patch:resolve@npm%3A1.20.0#builtin::version=1.20.0&hash=3388aa" dependencies: @@ -19662,19 +20613,19 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"rollup-plugin-dts@npm:^3.0.1": - version: 3.0.1 - resolution: "rollup-plugin-dts@npm:3.0.1" +"rollup-plugin-dts@npm:^3.0.2": + version: 3.0.2 + resolution: "rollup-plugin-dts@npm:3.0.2" dependencies: "@babel/code-frame": ^7.12.13 magic-string: ^0.25.7 peerDependencies: - rollup: ^2.40.0 - typescript: ^4.2.3 + rollup: ^2.48.0 + typescript: ^4.2.4 dependenciesMeta: "@babel/code-frame": optional: true - checksum: 742ac01358bfa730435247da72f6925541184534b53d9407063f5ad4e2ce8254f71f83c1617a1768b0bab90e650d4a994468a4057d5e7224deea8cbf43eb2ba6 + checksum: 11e32d247652210bbf052ef8d09551a031f774ee7dfd4f3c7d11e3fd6ee60f1856ebebdbd041104ea049f86ab1e413c3f8db6c1bab015895fe82707b9f1ce251 languageName: node linkType: hard @@ -19729,9 +20680,9 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"rollup@npm:^2.47.0": - version: 2.47.0 - resolution: "rollup@npm:2.47.0" +"rollup@npm:^2.50.0": + version: 2.50.0 + resolution: "rollup@npm:2.50.0" dependencies: fsevents: ~2.3.1 dependenciesMeta: @@ -19739,7 +20690,7 @@ resolve@^2.0.0-next.3: optional: true bin: rollup: dist/bin/rollup - checksum: bab2079fea72ebb6457e88717f64f3bd8ff52556827f77485708274aa94f2dfa19f555c022643957d604ff7329be5d010234346d28e13dcfed33d742d3e468b0 + checksum: 4f196f8987e32be3070cdac4544a3f002bec9971e81711d9ddd2fead627a39035e9c148f7828859df572a2b2bfa0b8d240efcc46a401137cd250c957a1922dfa languageName: node linkType: hard @@ -20695,7 +21646,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"stack-utils@npm:^2.0.2": +"stack-utils@npm:^2.0.2, stack-utils@npm:^2.0.3": version: 2.0.3 resolution: "stack-utils@npm:2.0.3" dependencies: @@ -21140,6 +22091,15 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: 0219f5c91753fea8dc8046cd4b18d39458b5dc0c6421c67c1072209faae9ba93b89283252e3b05d5c18901fd9f8b95001e3247fb93e2265f66d584a676522c75 + languageName: node + linkType: hard + "supports-hyperlinks@npm:^2.0.0": version: 2.2.0 resolution: "supports-hyperlinks@npm:2.2.0" @@ -21221,6 +22181,20 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"table@npm:^6.0.9": + version: 6.7.1 + resolution: "table@npm:6.7.1" + dependencies: + ajv: ^8.0.1 + lodash.clonedeep: ^4.5.0 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + checksum: 66107046b7226051552d53c1260facfed03f4050373d3888620af7b1353f6a5429d9a4a5fb796c56c29b9dd5ffca7b661a815f42ec392cb5956432585578772a + languageName: node + linkType: hard + "tapable@npm:^1.0.0, tapable@npm:^1.1.3": version: 1.1.3 resolution: "tapable@npm:1.1.3" @@ -21408,6 +22382,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"throat@npm:^6.0.1": + version: 6.0.1 + resolution: "throat@npm:6.0.1" + checksum: c984a40b4725bbd6e8c49d57b2bd36ab36c5534e8a1bed0d278d480171fdf908f16ba343d61c3e9c2e3ed4b327a59c28432cfa44594453b756ec219a772395a8 + languageName: node + linkType: hard + "through2@npm:^2.0.0": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -23309,7 +24290,7 @@ typescript@^4.2.4: languageName: node linkType: hard -"ws@npm:^7.3.1, ws@npm:^7.4.4": +"ws@npm:^7.3.1, ws@npm:^7.4.4, ws@npm:^7.4.5": version: 7.4.5 resolution: "ws@npm:7.4.5" peerDependencies: @@ -23370,6 +24351,13 @@ typescript@^4.2.4: languageName: node linkType: hard +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 56275bfa72a8a585c4d2905b086862fb881dfe7871adcefe4ecf4c1a6a78c6389b459b427c0a8672ccdb09731a78143acc71f0bcc8dc8d8427869fafe7f18b95 + languageName: node + linkType: hard + "yallist@npm:^3.0.2": version: 3.1.1 resolution: "yallist@npm:3.1.1" @@ -23391,7 +24379,7 @@ typescript@^4.2.4: languageName: node linkType: hard -"yargs-parser@npm:20.2.7, yargs-parser@npm:20.x": +"yargs-parser@npm:20.2.7, yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2": version: 20.2.7 resolution: "yargs-parser@npm:20.2.7" checksum: 124e7f1c24c9609d5d1c343f14b83289634e19bb43770708ebb6a19852647aaa0f89edcbf0e5b18a21bee77f54513ab5051518b2950cda69eb607a7c6251aa4f @@ -23455,6 +24443,21 @@ typescript@^4.2.4: languageName: node linkType: hard +"yargs@npm:^16.0.3": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: ^7.0.2 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.0 + y18n: ^5.0.5 + yargs-parser: ^20.2.2 + checksum: a79ce1f043021cd645de1ffebb6149541d382ba68f4a6b5eca5d2ad65af51893371bbd78e240dc3b6cf0cbb419511ba5bda715dec992e4266e6863ea49f14feb + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" From c5ff0245130bd942f5a77592ccf7b896b044aae8 Mon Sep 17 00:00:00 2001 From: Samuel Gratzl Date: Tue, 25 May 2021 11:24:30 -0400 Subject: [PATCH 10/16] feat: improve custom filter/sortby/groupby actions --- packages/_playground/src/App.tsx | 213 ++++++++++++------ packages/_playground/src/styles.css | 16 +- packages/hooks/src/grouping/baseGroupBy.ts | 22 +- .../src/grouping/columnSpecificGroupByFn.ts | 6 +- packages/hooks/src/grouping/histGroupBy.ts | 2 +- packages/hooks/src/grouping/textGroupBy.ts | 10 +- .../hooks/src/hooks/useGroupingOptions.ts | 2 +- packages/hooks/src/hooks/useSortingOptions.ts | 2 +- packages/table/src/components/LineUpLite.tsx | 9 +- .../table/src/components/LineUpLiteTH.tsx | 11 +- .../table/src/components/LineUpLiteTHead.tsx | 12 +- packages/table/src/components/interfaces.ts | 18 +- .../toolbar/LineUpLiteFilterAction.tsx | 52 +++-- .../toolbar/LineUpLiteGroupByAction.tsx | 54 +++-- .../toolbar/LineUpLiteHideAction.tsx | 35 +-- .../toolbar/LineUpLiteSortByAction.tsx | 63 +++--- .../components/toolbar/LineUpLiteToolbar.tsx | 43 +++- .../table/src/components/useLineUpLite.ts | 8 +- 18 files changed, 395 insertions(+), 183 deletions(-) diff --git a/packages/_playground/src/App.tsx b/packages/_playground/src/App.tsx index 34f1468..c3b596a 100644 --- a/packages/_playground/src/App.tsx +++ b/packages/_playground/src/App.tsx @@ -1,3 +1,4 @@ +/* eslint-disable jsx-a11y/label-has-associated-control */ /** * @lineup-lite/example-basic * https://github.com/sgratzl/lineup-lite @@ -10,23 +11,23 @@ import '@lineup-lite/components/src/style.css'; import '@lineup-lite/hooks/src/style.css'; import LineUpLite, { actionIconsRemixicon, - asTextColumn, + ActionLineUpProps, asDivergingNumberColumn, + asTextColumn, + featureFilterColumns, + featureFlexLayout, + featureRowRank, + featureRowSelect, + featureSortAndGroupBy, LineUpLiteColumn, LineUpLitePanel, LineUpLiteStateContextProvider, - ColumnInstance, - LineUpLiteFilterAction, UseFiltersColumnProps, - featureFlexLayout, - featureFilterColumns, - featureRowRank, - featureSortAndGroupBy, - featureRowSelect, - ActionIcons, + ColumnInstance, } from '@lineup-lite/table'; +import type { TextGroupByOptions } from '@lineup-lite/hooks'; import '@lineup-lite/table/src/style.css'; -import React, { useMemo, useCallback, useState } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { data, Row } from './data'; import './styles.css'; @@ -35,59 +36,138 @@ function MyCheckBox({ indeterminate, ...rest }: any) { return ; } -function MyFilterAction(props: { col: ColumnInstance; icons: ActionIcons }) { - const col = props.col as unknown as ColumnInstance & UseFiltersColumnProps; +function useVisibleHelper() { + const [visible, setVisible] = useState([] as string[]); - const [visible, setVisible] = useState(false); - const showFilterDialog = useCallback(() => { - setVisible(!visible); - }, [visible, setVisible]); + const toggleVisibility = useCallback( + (col: { id: string }) => { + setVisible((v) => (v.indexOf(col.id) >= 0 ? v.filter((d) => d !== col.id) : [...v, col.id])); + }, + [setVisible] + ); + const isVisible = useCallback((col: { id: string }) => visible.indexOf(col.id) >= 0, [visible]); + return { toggleVisibility, isVisible }; +} - return ( - <> - - {visible && ( -
- {col.render('Summary')} - -
- )} - +function useFilterAction() { + const { toggleVisibility, isVisible } = useVisibleHelper(); + const r: ActionLineUpProps['actionFilter'] = useCallback( + (col: ColumnInstance & UseFiltersColumnProps) => { + if (!col.canFilter) { + return undefined; + } + const handler = () => toggleVisibility(col); + return { + handler, + children: isVisible(col) ? ( +
+ {col.render('Summary')} + +
+ ) : undefined, + }; + }, + [isVisible, toggleVisibility] ); + return r; } -// function MyGroupingOptionAction(props: { col: ColumnInstance; icons: ActionIcons }) { -// const col = props.col as unknown as ColumnInstance & UseFiltersColumnProps; +function TextGroupByOptionsBlock({ + setGroupingOptions, + groupingOptions, + onClose, +}: { + groupingOptions?: TextGroupByOptions; + setGroupingOptions(v: TextGroupByOptions | undefined): void; + onClose(): void; +}) { + const values = (groupingOptions?.values ?? []) as (RegExp | string)[]; + + const onSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + const fData = new FormData(e.currentTarget); + const type = fData.get('type') as TextGroupByOptions['type']; + if (!type) { + setGroupingOptions(undefined); + onClose(); + return; + } + + const currentValues = (fData.get('values') ?? '') + .toString() + .split('\n') + .map((d) => d.trim()) + .filter(Boolean); + if (type === 'regex') { + setGroupingOptions({ + type, + values: currentValues.map((d) => new RegExp(d)), + }); + } else { + setGroupingOptions({ + type, + values: currentValues, + }); + } + onClose(); + }, + [onClose, setGroupingOptions] + ); -// const [visible, setVisible] = useState(false); -// const showGroupingDialog = useCallback(() => { -// setVisible(!visible); -// }, [visible, setVisible]); + return ( +
+ + + +