import { BarControllerDatasetOptions, LineControllerDatasetOptions, LineControllerChartOptions, ScatterDataPoint, ScatterControllerDatasetOptions, ScatterControllerChartOptions, BubbleControllerDatasetOptions, BubbleDataPoint, DoughnutControllerChartOptions, DoughnutControllerDatasetOptions, DoughnutDataPoint, PieControllerChartOptions, PieControllerDatasetOptions, PieDataPoint, ControllerDatasetOptions, BarControllerChartOptions, PolarAreaControllerChartOptions, PolarAreaControllerDatasetOptions, RadarControllerChartOptions, RadarControllerDatasetOptions, } from './controllers'; import { CoreChartOptions } from './core/interfaces'; import { ElementChartOptions } from './elements'; import { FillerControllerDatasetOptions, PluginChartOptions } from './plugins'; import { Plugin } from './core'; import { LinearScaleOptions, LogarithmicScaleOptions, CategoryScaleOptions, RadialLinearScaleOptions as RadialLinearScaleOptions, TimeScaleOptions, } from './scales'; export type DeepPartial = T extends {} ? { [K in keyof T]?: DeepPartial; } : T; export type DistributiveArray = T extends unknown ? T[] : never export interface CartesianScaleTypeRegistry { linear: { options: LinearScaleOptions; }; logarithmic: { options: LogarithmicScaleOptions; }; category: { options: CategoryScaleOptions; }; time: { options: TimeScaleOptions; }; timeseries: { options: TimeScaleOptions; }; } export interface RadialScaleTypeRegistry { radialLinear: { options: RadialLinearScaleOptions; }; } export interface ScaleTypeRegistry extends CartesianScaleTypeRegistry, RadialScaleTypeRegistry { } export type ScaleType = keyof ScaleTypeRegistry; export interface ChartTypeRegistry { bar: { chartOptions: BarControllerChartOptions; datasetOptions: BarControllerDatasetOptions; defaultDataPoint: number; scales: keyof CartesianScaleTypeRegistry; }; line: { chartOptions: LineControllerChartOptions; datasetOptions: LineControllerDatasetOptions & FillerControllerDatasetOptions; defaultDataPoint: ScatterDataPoint; scales: keyof CartesianScaleTypeRegistry; }; scatter: { chartOptions: ScatterControllerChartOptions; datasetOptions: ScatterControllerDatasetOptions; defaultDataPoint: ScatterDataPoint; scales: keyof CartesianScaleTypeRegistry; }; bubble: { chartOptions: {}; datasetOptions: BubbleControllerDatasetOptions; defaultDataPoint: BubbleDataPoint; scales: keyof CartesianScaleTypeRegistry; }; pie: { chartOptions: PieControllerChartOptions; datasetOptions: PieControllerDatasetOptions; defaultDataPoint: PieDataPoint; scales: keyof CartesianScaleTypeRegistry; }; doughnut: { chartOptions: DoughnutControllerChartOptions; datasetOptions: DoughnutControllerDatasetOptions; defaultDataPoint: DoughnutDataPoint; scales: keyof CartesianScaleTypeRegistry; }; polarArea: { chartOptions: PolarAreaControllerChartOptions; datasetOptions: PolarAreaControllerDatasetOptions; defaultDataPoint: number; scales: keyof RadialScaleTypeRegistry; }; radar: { chartOptions: RadarControllerChartOptions; datasetOptions: RadarControllerDatasetOptions; defaultDataPoint: number; scales: keyof RadialScaleTypeRegistry; }; } export type ChartType = keyof ChartTypeRegistry; export type ScaleOptions = DeepPartial< { [key in ScaleType]: { type: key } & ScaleTypeRegistry[key]['options'] }[SCALES] >; export type DatasetChartOptions = { [key in TYPE]: { datasets: ChartTypeRegistry[key]['datasetOptions']; }; }; export type ScaleChartOptions = { scales: { [key: string]: ScaleOptions; }; }; export type ChartOptions = DeepPartial< CoreChartOptions & PluginChartOptions & ElementChartOptions & DatasetChartOptions & ScaleChartOptions & ChartTypeRegistry[TYPE]['chartOptions'] >; export type DefaultDataPoint = ChartType extends TYPE ? unknown[] : DistributiveArray< ChartTypeRegistry[TYPE]['defaultDataPoint'] >; export interface ChartDatasetProperties { type?: TYPE; data: DATA; } export type ChartDataset< TYPE extends ChartType = ChartType, DATA extends unknown[] = DefaultDataPoint > = DeepPartial< { [key in ChartType]: { type: key } & ChartTypeRegistry[key]['datasetOptions'] }[TYPE] > & ChartDatasetProperties; export interface ChartData< TYPE extends ChartType = ChartType, DATA extends unknown[] = DefaultDataPoint, LABEL = unknown > { labels: LABEL[]; datasets: ChartDataset[]; } export interface ChartConfiguration< TYPE extends ChartType = ChartType, DATA extends unknown[] = DefaultDataPoint, LABEL = string > { type: TYPE; data: ChartData; options?: ChartOptions; plugins?: Plugin[]; }