import { IBarControllerDatasetOptions, ILineControllerDatasetOptions, ILineControllerChartOptions, IScatterDataPoint, IScatterControllerDatasetOptions, IScatterControllerChartOptions, IBubbleControllerDatasetOptions, IBubbleDataPoint, IDoughnutControllerChartOptions, IDoughnutControllerDatasetOptions, IDoughnutDataPoint, IPieControllerChartOptions, IPieControllerDatasetOptions, IPieDataPoint, IControllerDatasetOptions, IBarControllerChartOptions, IPolarAreaControllerChartOptions, IPolarAreaControllerDatasetOptions, IRadarControllerChartOptions, IRadarControllerDatasetOptions, } from './controllers'; import { ICoreChartOptions } from './core/interfaces'; import { IElementChartOptions } from './elements'; import { ITooltipChartOptions, IFillerControllerDatasetOptions, ILegendChartOptions, ITitleChartOptions, } from './plugins'; import { IChartAnimationOptions, IParsingOptions, IPlugin } from './core'; import { ILinearScaleOptions, ILogarithmicScaleOptions, ICategoryScaleOptions, IRadialLinearScaleOptions, ITimeScaleOptions, } from './scales'; export type DeepPartial = T extends {} ? { [K in keyof T]?: DeepPartial; } : T; export type DistributiveArray = T extends unknown ? T[] : never export interface ICartesianScaleTypeRegistry { linear: { options: ILinearScaleOptions; }; logarithmic: { options: ILogarithmicScaleOptions; }; category: { options: ICategoryScaleOptions; }; time: { options: ITimeScaleOptions; }; timeseries: { options: ITimeScaleOptions; }; } export interface IRadialScaleTypeRegistry { radialLinear: { options: IRadialLinearScaleOptions; }; } export interface IScaleTypeRegistry extends ICartesianScaleTypeRegistry, IRadialScaleTypeRegistry { } export type IScaleType = keyof IScaleTypeRegistry; export interface IChartTypeRegistry { bar: { chartOptions: IBarControllerChartOptions; datasetOptions: IBarControllerDatasetOptions; defaultDataPoint: number; scales: keyof ICartesianScaleTypeRegistry; }; line: { chartOptions: ILineControllerChartOptions; datasetOptions: ILineControllerDatasetOptions & IFillerControllerDatasetOptions; defaultDataPoint: IScatterDataPoint; scales: keyof ICartesianScaleTypeRegistry; }; scatter: { chartOptions: IScatterControllerChartOptions; datasetOptions: IScatterControllerDatasetOptions; defaultDataPoint: IScatterDataPoint; scales: keyof ICartesianScaleTypeRegistry; }; bubble: { chartOptions: {}; datasetOptions: IBubbleControllerDatasetOptions; defaultDataPoint: IBubbleDataPoint; scales: keyof ICartesianScaleTypeRegistry; }; pie: { chartOptions: IPieControllerChartOptions; datasetOptions: IPieControllerDatasetOptions; defaultDataPoint: IPieDataPoint; scales: keyof ICartesianScaleTypeRegistry; }; doughnut: { chartOptions: IDoughnutControllerChartOptions; datasetOptions: IDoughnutControllerDatasetOptions; defaultDataPoint: IDoughnutDataPoint; scales: keyof ICartesianScaleTypeRegistry; }; polarArea: { chartOptions: IPolarAreaControllerChartOptions; datasetOptions: IPolarAreaControllerDatasetOptions; defaultDataPoint: number; scales: keyof IRadialScaleTypeRegistry; }; radar: { chartOptions: IRadarControllerChartOptions; datasetOptions: IRadarControllerDatasetOptions; defaultDataPoint: number; scales: keyof IRadialScaleTypeRegistry; }; } export type IChartType = keyof IChartTypeRegistry; export type IScaleOptions = DeepPartial< { [key in IScaleType]: { type: key } & IScaleTypeRegistry[key]['options'] }[SCALES] >; export type IDatasetChartOptions = { [key in TYPE]: { datasets: IChartTypeRegistry[key]['datasetOptions']; }; }; export type IScaleChartOptions = { scales: { [key: string]: IScaleOptions; }; }; export type IChartOptions = DeepPartial< ICoreChartOptions & IParsingOptions & ITooltipChartOptions & ILegendChartOptions & ITitleChartOptions & IChartAnimationOptions & IElementChartOptions & IDatasetChartOptions & IScaleChartOptions & IChartTypeRegistry[TYPE]['chartOptions'] >; export type DefaultDataPoint = IChartType extends TYPE ? unknown[] : DistributiveArray< IChartTypeRegistry[TYPE]['defaultDataPoint'] >; export interface IChartDatasetProperties { type?: TYPE; data: DATA; } export type IChartDataset< TYPE extends IChartType = IChartType, DATA extends unknown[] = DefaultDataPoint > = DeepPartial< IParsingOptions & { [key in IChartType]: { type: key } & IChartTypeRegistry[key]['datasetOptions'] }[TYPE] > & IChartDatasetProperties; export interface IChartData< TYPE extends IChartType = IChartType, DATA extends unknown[] = DefaultDataPoint, LABEL = string > { labels: LABEL[]; datasets: IChartDataset[]; } export interface IChartConfiguration< TYPE extends IChartType = IChartType, DATA extends unknown[] = DefaultDataPoint, LABEL = string > { type: TYPE; data: IChartData; options?: IChartOptions; plugins?: IPlugin[]; }