@matthieumordrel/chart-studio 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +402 -12
  2. package/dist/core/chart-builder-controls.mjs +141 -0
  3. package/dist/core/dashboard.types.d.mts +220 -0
  4. package/dist/core/data-label-defaults.mjs +74 -0
  5. package/dist/core/data-model.types.d.mts +196 -0
  6. package/dist/core/dataset-builder.types.d.mts +51 -0
  7. package/dist/core/dataset-chart-metadata.d.mts +8 -0
  8. package/dist/core/dataset-chart-metadata.mjs +4 -0
  9. package/dist/core/date-range-presets.mjs +1 -1
  10. package/dist/core/define-dashboard.d.mts +8 -0
  11. package/dist/core/define-dashboard.mjs +156 -0
  12. package/dist/core/define-data-model.d.mts +11 -0
  13. package/dist/core/define-data-model.mjs +327 -0
  14. package/dist/core/define-dataset.d.mts +13 -0
  15. package/dist/core/define-dataset.mjs +111 -0
  16. package/dist/core/index.d.mts +17 -0
  17. package/dist/core/infer-columns.mjs +28 -2
  18. package/dist/core/materialized-view.mjs +580 -0
  19. package/dist/core/materialized-view.types.d.mts +223 -0
  20. package/dist/core/model-chart.mjs +242 -0
  21. package/dist/core/model-chart.types.d.mts +199 -0
  22. package/dist/core/model-inference.mjs +169 -0
  23. package/dist/core/model-inference.types.d.mts +71 -0
  24. package/dist/core/pipeline.mjs +32 -1
  25. package/dist/core/schema-builder.mjs +28 -158
  26. package/dist/core/schema-builder.types.d.mts +2 -49
  27. package/dist/core/types.d.mts +59 -8
  28. package/dist/core/use-chart-options.d.mts +35 -8
  29. package/dist/core/use-chart-resolvers.mjs +13 -3
  30. package/dist/core/use-chart.d.mts +16 -12
  31. package/dist/core/use-chart.mjs +136 -34
  32. package/dist/core/use-dashboard.d.mts +190 -0
  33. package/dist/core/use-dashboard.mjs +551 -0
  34. package/dist/index.d.mts +10 -3
  35. package/dist/index.mjs +5 -2
  36. package/dist/ui/chart-canvas.d.mts +11 -4
  37. package/dist/ui/chart-canvas.mjs +45 -34
  38. package/dist/ui/chart-context.d.mts +2 -0
  39. package/dist/ui/chart-context.mjs +2 -0
  40. package/dist/ui/chart-filters-panel.d.mts +1 -1
  41. package/dist/ui/chart-filters-panel.mjs +163 -37
  42. package/dist/ui/chart-group-by-selector.mjs +4 -4
  43. package/dist/ui/chart-time-bucket-selector.mjs +1 -1
  44. package/dist/ui/chart-toolbar-overflow.mjs +5 -13
  45. package/dist/ui/chart-toolbar.mjs +1 -1
  46. package/package.json +1 -1
  47. package/dist/core/define-chart-schema.d.mts +0 -38
  48. package/dist/core/define-chart-schema.mjs +0 -39
@@ -0,0 +1,220 @@
1
+ import { DateRangePresetId } from "./date-range-presets.mjs";
2
+ import { ChartInstance, ChartInstanceFromSchemaDefinition, DateRangeFilter, ResolvedDateColumnIdFromSchema, ResolvedFilterColumnIdFromSchema } from "./types.mjs";
3
+ import { DatasetChartDefinition, DatasetRow } from "./dataset-builder.types.mjs";
4
+ import { MaterializedViewDefinition } from "./materialized-view.types.mjs";
5
+ import { AnyDefinedDataModel, DataModelDefinition, ModelAttributeDefinition, ModelDataInput, ModelDatasetId, ModelDatasets, ResolvedDataModelFromDefinition } from "./data-model.types.mjs";
6
+
7
+ //#region src/core/dashboard.types.d.ts
8
+ type UniqueId<TId extends string, TExisting extends string> = TId extends TExisting ? never : TId;
9
+ type AnyDatasetChartDefinition = DatasetChartDefinition<any, any, any, any, any, any, any, any, any, any, any>;
10
+ type ChartOwnerFromDefinition<TChart> = TChart extends DatasetChartDefinition<any, any, any, any, any, any, any, any, any, any, infer TOwner> ? TOwner : never;
11
+ type DatasetFilterColumnId<TDataset> = TDataset extends {
12
+ columns?: Record<string, unknown> | undefined;
13
+ } | undefined ? ResolvedFilterColumnIdFromSchema<DatasetRow<TDataset>, TDataset> : never;
14
+ type DatasetDateColumnId<TDataset> = TDataset extends {
15
+ columns?: Record<string, unknown> | undefined;
16
+ } | undefined ? ResolvedDateColumnIdFromSchema<DatasetRow<TDataset>, TDataset> : never;
17
+ type DatasetIdForOwner<TModel extends AnyDefinedDataModel, TOwner> = Extract<{ [TId in keyof TModel['datasets']]: TOwner extends TModel['datasets'][TId] ? TId : never }[keyof TModel['datasets']], string>;
18
+ type ResolvedDashboardChartDatasetId<TModel extends AnyDefinedDataModel, TChart extends AnyDatasetChartDefinition> = ChartOwnerFromDefinition<TChart> extends MaterializedViewDefinition<any, any, any, any, any, infer TBaseDatasetId extends string, any> ? TBaseDatasetId : DatasetIdForOwner<TModel, ChartOwnerFromDefinition<TChart>>;
19
+ type DashboardChartRegistration<TDatasetId extends string = string, TChart extends AnyDatasetChartDefinition = AnyDatasetChartDefinition, TDataSource extends DashboardChartDataSource<TDatasetId> = DashboardChartDataSource<TDatasetId>> = {
20
+ readonly id: string;
21
+ readonly datasetId: TDatasetId;
22
+ readonly schema: TChart;
23
+ readonly dataSource: TDataSource;
24
+ };
25
+ type DashboardCharts = Record<string, DashboardChartRegistration>;
26
+ type DashboardDatasetChartDataSource<TDatasetId extends string = string> = {
27
+ readonly kind: 'dataset';
28
+ readonly datasetId: TDatasetId;
29
+ };
30
+ type DashboardMaterializedViewChartDataSource<TDatasetId extends string = string, TView extends MaterializedViewDefinition<any, any, any, any> = MaterializedViewDefinition<any, any, any, any>> = {
31
+ readonly kind: 'materialized-view';
32
+ readonly datasetId: TDatasetId;
33
+ readonly view: TView;
34
+ };
35
+ type DashboardChartDataSource<TDatasetId extends string = string> = DashboardDatasetChartDataSource<TDatasetId> | DashboardMaterializedViewChartDataSource<TDatasetId>;
36
+ type DashboardChartDataSourceForOwner<TDatasetId extends string, TOwner> = TOwner extends MaterializedViewDefinition<any, any, any, any> ? DashboardMaterializedViewChartDataSource<TDatasetId, TOwner> : DashboardDatasetChartDataSource<TDatasetId>;
37
+ type ResolvedDashboardChartDataSource<TModel extends AnyDefinedDataModel, TChart extends AnyDatasetChartDefinition> = DashboardChartDataSourceForOwner<ResolvedDashboardChartDatasetId<TModel, TChart>, ChartOwnerFromDefinition<TChart>>;
38
+ type DashboardLocalSharedSelectFilterConfig<TDatasets extends ModelDatasets, TSourceDatasetId extends ModelDatasetId<TDatasets>, TSourceColumnId extends DatasetFilterColumnId<TDatasets[TSourceDatasetId]>, TTargets extends readonly DashboardSharedSelectTarget<TDatasets>[] | undefined = undefined> = {
39
+ readonly kind: 'select';
40
+ readonly label?: string;
41
+ readonly source: {
42
+ readonly dataset: TSourceDatasetId;
43
+ readonly column: TSourceColumnId;
44
+ };
45
+ readonly targets?: TTargets;
46
+ };
47
+ type DashboardSharedSelectTarget<TDatasets extends ModelDatasets, TDatasetId extends ModelDatasetId<TDatasets> = ModelDatasetId<TDatasets>> = {
48
+ readonly dataset: TDatasetId;
49
+ readonly column: DatasetFilterColumnId<TDatasets[TDatasetId]>;
50
+ };
51
+ type DashboardSharedDateRangeTarget<TDatasets extends ModelDatasets, TDatasetId extends ModelDatasetId<TDatasets> = ModelDatasetId<TDatasets>> = {
52
+ readonly dataset: TDatasetId;
53
+ readonly column: DatasetDateColumnId<TDatasets[TDatasetId]>;
54
+ };
55
+ type DashboardSharedDateRangeFilterConfig<TDatasets extends ModelDatasets, TTargets extends readonly DashboardSharedDateRangeTarget<TDatasets>[] = readonly DashboardSharedDateRangeTarget<TDatasets>[]> = {
56
+ readonly kind: 'date-range';
57
+ readonly label?: string;
58
+ readonly targets: TTargets;
59
+ };
60
+ type DashboardModelSharedFilterDefinition<TId extends string = string, TAttribute extends ModelAttributeDefinition = ModelAttributeDefinition> = {
61
+ readonly id: TId;
62
+ readonly kind: 'select';
63
+ readonly label: string;
64
+ readonly source: {
65
+ readonly kind: 'attribute';
66
+ readonly dataset: TAttribute['source']['dataset'];
67
+ readonly key: TAttribute['source']['key'];
68
+ readonly label: TAttribute['source']['label'];
69
+ };
70
+ readonly targets: TAttribute['targets'];
71
+ readonly attribute: TId;
72
+ };
73
+ type DashboardLocalSharedSelectFilterDefinition<TId extends string = string, TDatasets extends ModelDatasets = ModelDatasets> = {
74
+ readonly id: TId;
75
+ readonly kind: 'select';
76
+ readonly label: string;
77
+ readonly source: {
78
+ readonly kind: 'column';
79
+ readonly dataset: ModelDatasetId<TDatasets>;
80
+ readonly column: DatasetFilterColumnId<TDatasets[ModelDatasetId<TDatasets>]>;
81
+ };
82
+ readonly targets: readonly DashboardSharedSelectTarget<TDatasets>[];
83
+ };
84
+ type DashboardSharedDateRangeFilterDefinition<TId extends string = string, TDatasets extends ModelDatasets = ModelDatasets> = {
85
+ readonly id: TId;
86
+ readonly kind: 'date-range';
87
+ readonly label: string;
88
+ readonly targets: readonly DashboardSharedDateRangeTarget<TDatasets>[];
89
+ };
90
+ type DashboardSharedFilterDefinition<TModel extends AnyDefinedDataModel = AnyDefinedDataModel> = DashboardModelSharedFilterDefinition<string, ModelAttributeDefinition> | DashboardLocalSharedSelectFilterDefinition<string, TModel['datasets']> | DashboardSharedDateRangeFilterDefinition<string, TModel['datasets']>;
91
+ type DashboardSharedFilters<TModel extends AnyDefinedDataModel = AnyDefinedDataModel> = Record<string, DashboardSharedFilterDefinition<TModel>>;
92
+ type DefinedDashboard<TModel extends AnyDefinedDataModel = AnyDefinedDataModel, TCharts extends DashboardCharts = {}, TSharedFilters extends DashboardSharedFilters<TModel> = {}> = {
93
+ readonly model: TModel;
94
+ readonly charts: TCharts;
95
+ readonly sharedFilters: TSharedFilters;
96
+ build(): DefinedDashboard<TModel, TCharts, TSharedFilters>;
97
+ readonly __dashboardBrand: 'dashboard-definition';
98
+ };
99
+ type DashboardDefinition<TModel extends AnyDefinedDataModel = AnyDefinedDataModel, TCharts extends DashboardCharts = {}, TSharedFilters extends DashboardSharedFilters<TModel> = {}> = {
100
+ build(): DefinedDashboard<TModel, TCharts, TSharedFilters>;
101
+ };
102
+ type ResolvedDashboardFromDefinition<TDashboard> = TDashboard extends DashboardDefinition<any, any, any> ? ReturnType<TDashboard['build']> : never;
103
+ type DashboardChartIdFromDefinition<TDashboard> = Extract<keyof ResolvedDashboardFromDefinition<TDashboard>['charts'], string>;
104
+ type DashboardSharedFilterIdFromDefinition<TDashboard> = Extract<keyof ResolvedDashboardFromDefinition<TDashboard>['sharedFilters'], string>;
105
+ type DashboardDatasetIdFromDefinition<TDashboard> = Extract<keyof ResolvedDashboardFromDefinition<TDashboard>['model']['datasets'], string>;
106
+ type DashboardDataInputFromDefinition<TDashboard extends DashboardDefinition<any, any, any>> = ModelDataInput<ResolvedDashboardFromDefinition<TDashboard>['model']['datasets']>;
107
+ type DashboardChartDefinitionFromDefinition<TDashboard, TChartId extends DashboardChartIdFromDefinition<TDashboard>> = ResolvedDashboardFromDefinition<TDashboard>['charts'][TChartId]['schema'];
108
+ type DashboardChartDatasetIdFromDefinition<TDashboard, TChartId extends DashboardChartIdFromDefinition<TDashboard>> = ResolvedDashboardFromDefinition<TDashboard>['charts'][TChartId]['datasetId'];
109
+ type DashboardRelationshipsFromDefinition<TDashboard> = ResolvedDashboardFromDefinition<TDashboard>['model']['relationships'];
110
+ type StripIdSuffix<TValue extends string> = TValue extends `${infer TPrefix}Id` ? TPrefix : never;
111
+ type ProjectedLookupAliasForDataset<TRelationships, TSourceDatasetId extends string, TBaseDatasetId extends string> = Extract<{ [TRelationshipId in keyof TRelationships]: TRelationships[TRelationshipId] extends {
112
+ from: {
113
+ dataset: TSourceDatasetId;
114
+ };
115
+ to: {
116
+ dataset: TBaseDatasetId;
117
+ column: infer TColumnId extends string;
118
+ };
119
+ } ? StripIdSuffix<TColumnId> : never }[keyof TRelationships], string>;
120
+ type ProjectedOwnedColumnId<TRelationships, TSourceDatasetId extends string, TBaseDatasetId extends string, TColumnId extends string> = ProjectedLookupAliasForDataset<TRelationships, TSourceDatasetId, TBaseDatasetId> extends infer TAlias extends string ? `${TAlias}${Capitalize<TColumnId>}` : never;
121
+ type OwnedColumnIdForDatasetColumn<TRelationships, TDatasetId extends string, TBaseDatasetId extends string, TColumnId extends string> = TDatasetId extends TBaseDatasetId ? TColumnId : ProjectedOwnedColumnId<TRelationships, TDatasetId, TBaseDatasetId, TColumnId>;
122
+ type SharedFilterTargetOwnedFilterColumnIds<TRelationships, TBaseDatasetId extends string, TTargets> = TTargets extends readonly (infer TTarget)[] ? TTarget extends {
123
+ dataset: infer TDatasetId extends string;
124
+ column: infer TColumnId extends string;
125
+ } ? OwnedColumnIdForDatasetColumn<TRelationships, TDatasetId, TBaseDatasetId, TColumnId> : never : never;
126
+ type SharedFilterTargetOwnedDateColumnIds<TRelationships, TBaseDatasetId extends string, TTargets> = TTargets extends readonly (infer TTarget)[] ? TTarget extends {
127
+ dataset: infer TDatasetId extends string;
128
+ column: infer TColumnId extends string;
129
+ } ? OwnedColumnIdForDatasetColumn<TRelationships, TDatasetId, TBaseDatasetId, TColumnId> : never : never;
130
+ type DashboardOwnedFilterColumnIdsForSharedFilter<TDashboard, TChartId extends DashboardChartIdFromDefinition<TDashboard>, TFilter> = TFilter extends {
131
+ kind: 'select';
132
+ source: {
133
+ kind: 'attribute';
134
+ dataset: infer TSourceDatasetId extends string;
135
+ key: infer TSourceKey extends string;
136
+ label: infer TSourceLabel extends string;
137
+ };
138
+ targets: infer TTargets;
139
+ } ? OwnedColumnIdForDatasetColumn<DashboardRelationshipsFromDefinition<TDashboard>, TSourceDatasetId, DashboardChartDatasetIdFromDefinition<TDashboard, TChartId>, TSourceKey | TSourceLabel> | SharedFilterTargetOwnedFilterColumnIds<DashboardRelationshipsFromDefinition<TDashboard>, DashboardChartDatasetIdFromDefinition<TDashboard, TChartId>, TTargets> : TFilter extends {
140
+ kind: 'select';
141
+ source: {
142
+ kind: 'column';
143
+ dataset: infer TSourceDatasetId extends string;
144
+ column: infer TSourceColumnId extends string;
145
+ };
146
+ targets: infer TTargets;
147
+ } ? OwnedColumnIdForDatasetColumn<DashboardRelationshipsFromDefinition<TDashboard>, TSourceDatasetId, DashboardChartDatasetIdFromDefinition<TDashboard, TChartId>, TSourceColumnId> | SharedFilterTargetOwnedFilterColumnIds<DashboardRelationshipsFromDefinition<TDashboard>, DashboardChartDatasetIdFromDefinition<TDashboard, TChartId>, TTargets> : never;
148
+ type DashboardOwnedDateColumnIdsForSharedFilter<TDashboard, TChartId extends DashboardChartIdFromDefinition<TDashboard>, TFilter> = TFilter extends {
149
+ kind: 'date-range';
150
+ targets: infer TTargets;
151
+ } ? SharedFilterTargetOwnedDateColumnIds<DashboardRelationshipsFromDefinition<TDashboard>, DashboardChartDatasetIdFromDefinition<TDashboard, TChartId>, TTargets> : never;
152
+ type DashboardOwnedFilterColumnIdFromDefinition<TDashboard, TChartId extends DashboardChartIdFromDefinition<TDashboard>> = DashboardSharedFilterIdFromDefinition<TDashboard> extends infer TFilterId ? TFilterId extends DashboardSharedFilterIdFromDefinition<TDashboard> ? DashboardOwnedFilterColumnIdsForSharedFilter<TDashboard, TChartId, ResolvedDashboardFromDefinition<TDashboard>['sharedFilters'][TFilterId]> : never : never;
153
+ type DashboardOwnedDateColumnIdFromDefinition<TDashboard, TChartId extends DashboardChartIdFromDefinition<TDashboard>> = DashboardSharedFilterIdFromDefinition<TDashboard> extends infer TFilterId ? TFilterId extends DashboardSharedFilterIdFromDefinition<TDashboard> ? DashboardOwnedDateColumnIdsForSharedFilter<TDashboard, TChartId, ResolvedDashboardFromDefinition<TDashboard>['sharedFilters'][TFilterId]> : never : never;
154
+ type DashboardOwnedChartInstance<TChartInstance, TOwnedFilterColumnId extends string, TOwnedDateColumnId extends string> = TChartInstance extends ChartInstance<infer TRow, infer TColumnId, infer TChartType, infer TXAxisId, infer TGroupById, infer TMetricColumnId, infer TMetric, infer TFilterColumnId, infer TDateColumnId, infer TTimeBucket> ? ChartInstance<TRow, TColumnId, TChartType, TXAxisId, TGroupById, TMetricColumnId, TMetric, Exclude<TFilterColumnId, TOwnedFilterColumnId>, Exclude<TDateColumnId, TOwnedDateColumnId>, TTimeBucket> : never;
155
+ type DashboardChartInstanceFromDefinition<TDashboard, TChartId extends DashboardChartIdFromDefinition<TDashboard>> = DashboardChartDefinitionFromDefinition<TDashboard, TChartId> extends DatasetChartDefinition<infer TRow, any, any, any, any, any, any, any, any, any, any> ? DashboardOwnedChartInstance<ChartInstanceFromSchemaDefinition<TRow, DashboardChartDefinitionFromDefinition<TDashboard, TChartId>>, Extract<DashboardOwnedFilterColumnIdFromDefinition<TDashboard, TChartId>, string>, Extract<DashboardOwnedDateColumnIdFromDefinition<TDashboard, TChartId>, string>> : never;
156
+ type DashboardDatasetRowsFromDefinition<TDashboard, TDatasetId extends DashboardDatasetIdFromDefinition<TDashboard>> = readonly DatasetRow<ResolvedDashboardFromDefinition<TDashboard>['model']['datasets'][TDatasetId]>[];
157
+ type DashboardSharedDateRangePresetId = Exclude<DateRangePresetId, 'auto'>;
158
+ type DashboardDateRangeSelection = {
159
+ preset: DashboardSharedDateRangePresetId | null;
160
+ customFilter: DateRangeFilter | null;
161
+ };
162
+ type DashboardSharedSelectFilterRuntime = {
163
+ readonly id: string;
164
+ readonly kind: 'select';
165
+ readonly label: string;
166
+ readonly values: ReadonlySet<string>;
167
+ readonly options: Array<{
168
+ value: string;
169
+ label: string;
170
+ count: number;
171
+ }>;
172
+ toggleValue(value: string): void;
173
+ setValues(values: Iterable<string>): void;
174
+ clear(): void;
175
+ };
176
+ type DashboardSharedDateRangeFilterRuntime = {
177
+ readonly id: string;
178
+ readonly kind: 'date-range';
179
+ readonly label: string;
180
+ readonly selection: DashboardDateRangeSelection;
181
+ readonly dateRangeFilter: DateRangeFilter | null;
182
+ setSelection(selection: DashboardDateRangeSelection): void;
183
+ setDateRangePreset(preset: DashboardSharedDateRangePresetId): void;
184
+ setDateRangeFilter(filter: DateRangeFilter | null): void;
185
+ clear(): void;
186
+ };
187
+ type DashboardSharedFilterRuntime = DashboardSharedSelectFilterRuntime | DashboardSharedDateRangeFilterRuntime;
188
+ type DashboardSharedFilterRuntimeFromDefinition<TDashboard, TFilterId extends DashboardSharedFilterIdFromDefinition<TDashboard>> = ResolvedDashboardFromDefinition<TDashboard>['sharedFilters'][TFilterId] extends {
189
+ kind: 'date-range';
190
+ } ? DashboardSharedDateRangeFilterRuntime : DashboardSharedSelectFilterRuntime;
191
+ type DashboardResolvedChartOwnership = {
192
+ readonly sharedFilterIds: readonly string[];
193
+ readonly filterColumnIds: ReadonlySet<string>;
194
+ readonly dateColumnIds: ReadonlySet<string>;
195
+ };
196
+ type DashboardResolvedChart<TDashboard, TChartId extends DashboardChartIdFromDefinition<TDashboard>> = DashboardChartDefinitionFromDefinition<TDashboard, TChartId> extends DatasetChartDefinition<infer TRow, any, any, any, any, any, any, any, any, any, any> ? {
197
+ readonly id: TChartId;
198
+ readonly datasetId: ResolvedDashboardFromDefinition<TDashboard>['charts'][TChartId]['datasetId'];
199
+ readonly source: ResolvedDashboardFromDefinition<TDashboard>['charts'][TChartId]['dataSource'];
200
+ readonly data: readonly TRow[];
201
+ readonly schema: DashboardChartDefinitionFromDefinition<TDashboard, TChartId>;
202
+ readonly ownership: DashboardResolvedChartOwnership;
203
+ } : never;
204
+ type DashboardRuntime<TDashboard extends DashboardDefinition<any, any, any> = DashboardDefinition<any, any, any>> = {
205
+ readonly definition: ResolvedDashboardFromDefinition<TDashboard>;
206
+ readonly chartIds: DashboardChartIdFromDefinition<TDashboard>[];
207
+ readonly sharedFilterIds: DashboardSharedFilterIdFromDefinition<TDashboard>[];
208
+ chart<TChartId extends DashboardChartIdFromDefinition<TDashboard>>(id: TChartId): DashboardResolvedChart<TDashboard, TChartId>;
209
+ dataset<TDatasetId extends DashboardDatasetIdFromDefinition<TDashboard>>(id: TDatasetId): DashboardDatasetRowsFromDefinition<TDashboard, TDatasetId>;
210
+ sharedFilter<TFilterId extends DashboardSharedFilterIdFromDefinition<TDashboard>>(id: TFilterId): DashboardSharedFilterRuntimeFromDefinition<TDashboard, TFilterId>;
211
+ };
212
+ interface DashboardBuilder<TModel extends AnyDefinedDataModel = AnyDefinedDataModel, TCharts extends DashboardCharts = {}, TSharedFilters extends DashboardSharedFilters<TModel> = {}> extends DashboardDefinition<TModel, TCharts, TSharedFilters> {
213
+ chart<const TId extends string, const TChart extends AnyDatasetChartDefinition>(id: UniqueId<TId, Extract<keyof TCharts, string>>, chart: TChart): DashboardBuilder<TModel, TCharts & Record<TId, DashboardChartRegistration<ResolvedDashboardChartDatasetId<TModel, TChart>, TChart, ResolvedDashboardChartDataSource<TModel, TChart>>>, TSharedFilters>;
214
+ sharedFilter<const TId extends Extract<keyof TModel['attributes'], string>>(id: UniqueId<TId, Extract<keyof TSharedFilters, string>>): DashboardBuilder<TModel, TCharts, TSharedFilters & Record<TId, DashboardModelSharedFilterDefinition<TId, ModelAttributeDefinition>>>;
215
+ sharedFilter<const TId extends string, const TSourceDatasetId extends ModelDatasetId<TModel['datasets']>, const TSourceColumnId extends DatasetFilterColumnId<TModel['datasets'][TSourceDatasetId]>, const TTargets extends readonly DashboardSharedSelectTarget<TModel['datasets']>[] | undefined = undefined>(id: UniqueId<TId, Extract<keyof TSharedFilters, string>>, config: DashboardLocalSharedSelectFilterConfig<TModel['datasets'], TSourceDatasetId, TSourceColumnId, TTargets>): DashboardBuilder<TModel, TCharts, TSharedFilters & Record<TId, DashboardLocalSharedSelectFilterDefinition<TId, TModel['datasets']>>>;
216
+ sharedFilter<const TId extends string, const TTargets extends readonly DashboardSharedDateRangeTarget<TModel['datasets']>[]>(id: UniqueId<TId, Extract<keyof TSharedFilters, string>>, config: DashboardSharedDateRangeFilterConfig<TModel['datasets'], TTargets>): DashboardBuilder<TModel, TCharts, TSharedFilters & Record<TId, DashboardSharedDateRangeFilterDefinition<TId, TModel['datasets']>>>;
217
+ }
218
+ type DashboardInputModel<TModel extends DataModelDefinition<any, any, any, any>> = ResolvedDataModelFromDefinition<TModel>;
219
+ //#endregion
220
+ export { DashboardBuilder, DashboardChartIdFromDefinition, DashboardChartInstanceFromDefinition, DashboardDataInputFromDefinition, DashboardDatasetIdFromDefinition, DashboardDatasetRowsFromDefinition, DashboardDateRangeSelection, DashboardDefinition, DashboardInputModel, DashboardLocalSharedSelectFilterConfig, DashboardResolvedChart, DashboardResolvedChartOwnership, DashboardRuntime, DashboardSharedDateRangeFilterConfig, DashboardSharedDateRangeFilterDefinition, DashboardSharedDateRangeFilterRuntime, DashboardSharedDateRangePresetId, DashboardSharedDateRangeTarget, DashboardSharedFilterDefinition, DashboardSharedFilterIdFromDefinition, DashboardSharedFilterRuntime, DashboardSharedFilterRuntimeFromDefinition, DashboardSharedFilters, DashboardSharedSelectFilterRuntime, DashboardSharedSelectTarget, DefinedDashboard, ResolvedDashboardFromDefinition };
@@ -0,0 +1,74 @@
1
+ //#region src/core/data-label-defaults.ts
2
+ const STYLE_TOP = {
3
+ position: "top",
4
+ offset: 8
5
+ };
6
+ /**
7
+ * Default data-label behaviour for each chart type.
8
+ *
9
+ * This is the single source of truth consumed by `<ChartCanvas>` when the
10
+ * consumer leaves `showDataLabels` at its default `'auto'` value. Edit
11
+ * this object to change which charts show labels and how they look.
12
+ */
13
+ const DATA_LABEL_DEFAULTS = {
14
+ bar: {
15
+ showByDefault: true,
16
+ style: STYLE_TOP
17
+ },
18
+ "grouped-bar": {
19
+ showByDefault: true,
20
+ style: STYLE_TOP
21
+ },
22
+ "percent-bar": {
23
+ showByDefault: true,
24
+ style: STYLE_TOP
25
+ },
26
+ line: {
27
+ showByDefault: {
28
+ day: false,
29
+ week: false,
30
+ month: false,
31
+ quarter: true,
32
+ year: true
33
+ },
34
+ style: STYLE_TOP
35
+ },
36
+ area: {
37
+ showByDefault: {
38
+ day: false,
39
+ week: false,
40
+ month: false,
41
+ quarter: false,
42
+ year: false
43
+ },
44
+ style: STYLE_TOP
45
+ },
46
+ "percent-area": {
47
+ showByDefault: false,
48
+ style: STYLE_TOP
49
+ },
50
+ pie: {
51
+ showByDefault: true,
52
+ style: STYLE_TOP
53
+ },
54
+ donut: {
55
+ showByDefault: true,
56
+ style: STYLE_TOP
57
+ }
58
+ };
59
+ /**
60
+ * Resolve whether data labels should be shown for the current chart state.
61
+ *
62
+ * When the consumer passes `true` or `false`, their explicit choice wins.
63
+ * When `'auto'` (the default), the declarative config in
64
+ * {@link DATA_LABEL_DEFAULTS} decides based on chart type and — for
65
+ * time-series charts — the active time bucket.
66
+ */
67
+ function resolveShowDataLabels(chartType, timeBucket, override) {
68
+ if (override !== "auto") return override;
69
+ const { showByDefault } = DATA_LABEL_DEFAULTS[chartType];
70
+ if (typeof showByDefault === "boolean") return showByDefault;
71
+ return timeBucket ? showByDefault[timeBucket] ?? false : false;
72
+ }
73
+ //#endregion
74
+ export { DATA_LABEL_DEFAULTS, resolveShowDataLabels };
@@ -0,0 +1,196 @@
1
+ import { InferableFieldKey, ResolvedGroupByColumnIdFromSchema } from "./types.mjs";
2
+ import { DatasetChartDefinition, DatasetDefinition, DatasetKey, DatasetRow, DefinedDataset, ResolvedDatasetFromDefinition, SingleDatasetKeyId } from "./dataset-builder.types.mjs";
3
+ import { MaterializedViewDefinition, ModelMaterializationStartBuilder } from "./materialized-view.types.mjs";
4
+ import { CompileModelChartDefinition, InferredModelChartBuilder, ModelChartBuilder, ModelChartStartBuilder } from "./model-chart.types.mjs";
5
+ import { InferAttributesForModel, InferRelationshipsForModel } from "./model-inference.types.mjs";
6
+
7
+ //#region src/core/data-model.types.d.ts
8
+ type NonNullish<T> = Exclude<T, null | undefined>;
9
+ type UniqueId<TId extends string, TExisting extends string> = TId extends TExisting ? never : TId;
10
+ type KeyedDatasetDefinition<TRow = any, TColumns extends Record<string, unknown> | undefined = any, TKey extends DatasetKey<TRow> = DatasetKey<TRow>> = DatasetDefinition<TRow, TColumns, TKey>;
11
+ type ModelDatasets = Record<string, DefinedDataset<any, any, any>>;
12
+ type ModelDatasetId<TDatasets extends ModelDatasets> = Extract<keyof TDatasets, string>;
13
+ type ModelSingleKeyDatasetId<TDatasets extends ModelDatasets> = Extract<{ [TId in keyof TDatasets]: SingleDatasetKeyId<TDatasets[TId]> extends never ? never : TId }[keyof TDatasets], string>;
14
+ type DatasetForeignKeyColumnId<TDataset> = TDataset extends DefinedDataset<infer TRow, any, any> ? InferableFieldKey<TRow> : never;
15
+ type DatasetKeyValue<TDataset> = TDataset extends DefinedDataset<infer TRow, any, any> ? SingleDatasetKeyId<TDataset> extends infer TKeyId extends keyof TRow ? NonNullish<TRow[TKeyId]> : never : never;
16
+ type ModelRelationshipDefinition<TFromDatasetId extends string = string, TToDatasetId extends string = string, TFromKey extends string = string, TToColumn extends string = string> = {
17
+ readonly kind: 'relationship';
18
+ readonly id: string;
19
+ readonly from: {
20
+ readonly dataset: TFromDatasetId;
21
+ readonly key: TFromKey;
22
+ };
23
+ readonly to: {
24
+ readonly dataset: TToDatasetId;
25
+ readonly column: TToColumn;
26
+ };
27
+ readonly reverse: {
28
+ readonly dataset: TToDatasetId;
29
+ readonly column: TToColumn;
30
+ readonly to: {
31
+ readonly dataset: TFromDatasetId;
32
+ readonly key: TFromKey;
33
+ };
34
+ };
35
+ };
36
+ type RelationshipConfig<TDatasets extends ModelDatasets, TFromDatasetId extends ModelSingleKeyDatasetId<TDatasets>, TToDatasetId extends ModelDatasetId<TDatasets>> = {
37
+ readonly from: {
38
+ readonly dataset: TFromDatasetId;
39
+ readonly key: SingleDatasetKeyId<TDatasets[TFromDatasetId]>;
40
+ };
41
+ readonly to: {
42
+ readonly dataset: TToDatasetId;
43
+ readonly column: DatasetForeignKeyColumnId<TDatasets[TToDatasetId]>;
44
+ };
45
+ };
46
+ type AssociationEndpoints<TDatasets extends ModelDatasets, TFromDatasetId extends ModelSingleKeyDatasetId<TDatasets>, TToDatasetId extends ModelSingleKeyDatasetId<TDatasets>> = {
47
+ readonly from: {
48
+ readonly dataset: TFromDatasetId;
49
+ readonly key: SingleDatasetKeyId<TDatasets[TFromDatasetId]>;
50
+ };
51
+ readonly to: {
52
+ readonly dataset: TToDatasetId;
53
+ readonly key: SingleDatasetKeyId<TDatasets[TToDatasetId]>;
54
+ };
55
+ };
56
+ type ExplicitAssociationConfig<TDatasets extends ModelDatasets, TFromDatasetId extends ModelSingleKeyDatasetId<TDatasets>, TToDatasetId extends ModelSingleKeyDatasetId<TDatasets>, TEdgeRow extends Record<string, unknown>> = AssociationEndpoints<TDatasets, TFromDatasetId, TToDatasetId> & {
57
+ readonly data: readonly TEdgeRow[];
58
+ readonly columns: {
59
+ readonly from: Extract<keyof TEdgeRow, string>;
60
+ readonly to: Extract<keyof TEdgeRow, string>;
61
+ };
62
+ };
63
+ type DerivedAssociationConfigForSource<TDatasets extends ModelDatasets, TSourceDatasetId extends ModelSingleKeyDatasetId<TDatasets>, TOtherDatasetId extends ModelSingleKeyDatasetId<TDatasets>> = AssociationEndpoints<TDatasets, TSourceDatasetId, TOtherDatasetId> & {
64
+ readonly deriveFrom: {
65
+ readonly dataset: TSourceDatasetId;
66
+ readonly values: (row: DatasetRow<TDatasets[TSourceDatasetId]>) => readonly DatasetKeyValue<TDatasets[TOtherDatasetId]>[] | null | undefined;
67
+ };
68
+ };
69
+ type DerivedAssociationConfig<TDatasets extends ModelDatasets, TFromDatasetId extends ModelSingleKeyDatasetId<TDatasets>, TToDatasetId extends ModelSingleKeyDatasetId<TDatasets>, TDeriveDatasetId extends TFromDatasetId | TToDatasetId = TFromDatasetId | TToDatasetId> = TDeriveDatasetId extends TFromDatasetId ? DerivedAssociationConfigForSource<TDatasets, TFromDatasetId, TToDatasetId> : DerivedAssociationConfigForSource<TDatasets, TToDatasetId, TFromDatasetId>;
70
+ type ModelAssociationDefinition<TFromDatasetId extends string = string, TToDatasetId extends string = string, TFromKey extends string = string, TToKey extends string = string> = {
71
+ readonly kind: 'association';
72
+ readonly id: string;
73
+ readonly from: {
74
+ readonly dataset: TFromDatasetId;
75
+ readonly key: TFromKey;
76
+ };
77
+ readonly to: {
78
+ readonly dataset: TToDatasetId;
79
+ readonly key: TToKey;
80
+ };
81
+ readonly reverse: {
82
+ readonly dataset: TToDatasetId;
83
+ readonly key: TToKey;
84
+ readonly to: {
85
+ readonly dataset: TFromDatasetId;
86
+ readonly key: TFromKey;
87
+ };
88
+ };
89
+ readonly edge: {
90
+ readonly kind: 'explicit';
91
+ readonly data: readonly Record<string, unknown>[];
92
+ readonly columns: {
93
+ readonly from: string;
94
+ readonly to: string;
95
+ };
96
+ } | {
97
+ readonly kind: 'derived';
98
+ readonly deriveFrom: {
99
+ readonly dataset: string;
100
+ readonly values: (row: unknown) => readonly unknown[] | null | undefined;
101
+ };
102
+ };
103
+ };
104
+ type RelationshipTarget<TRelationships extends Record<string, ModelRelationshipDefinition>, TSourceDatasetId extends string> = { [TRelationshipId in keyof TRelationships]: TRelationships[TRelationshipId] extends ModelRelationshipDefinition<TSourceDatasetId, infer TTargetDatasetId extends string, any, infer TToColumn extends string> ? {
105
+ readonly dataset: TTargetDatasetId;
106
+ readonly column: TToColumn;
107
+ readonly via: Extract<TRelationshipId, string>;
108
+ } : never }[keyof TRelationships];
109
+ type AssociationTarget<TAssociations extends Record<string, ModelAssociationDefinition>, TSourceDatasetId extends string> = { [TAssociationId in keyof TAssociations]: TAssociations[TAssociationId] extends ModelAssociationDefinition<infer TFromDatasetId extends string, infer TToDatasetId extends string, any, any> ? TFromDatasetId extends TSourceDatasetId ? {
110
+ readonly dataset: TToDatasetId;
111
+ readonly through: Extract<TAssociationId, string>;
112
+ readonly mode: 'exists';
113
+ } : TToDatasetId extends TSourceDatasetId ? {
114
+ readonly dataset: TFromDatasetId;
115
+ readonly through: Extract<TAssociationId, string>;
116
+ readonly mode: 'exists';
117
+ } : never : never }[keyof TAssociations];
118
+ type ModelAttributeTarget<TRelationships extends Record<string, ModelRelationshipDefinition>, TAssociations extends Record<string, ModelAssociationDefinition>, TSourceDatasetId extends string> = RelationshipTarget<TRelationships, TSourceDatasetId> | AssociationTarget<TAssociations, TSourceDatasetId>;
119
+ type SelectAttributeConfig<TDatasets extends ModelDatasets, TRelationships extends Record<string, ModelRelationshipDefinition>, TAssociations extends Record<string, ModelAssociationDefinition>, TSourceDatasetId extends ModelSingleKeyDatasetId<TDatasets>, TTargets extends readonly ModelAttributeTarget<TRelationships, TAssociations, TSourceDatasetId>[]> = {
120
+ readonly kind: 'select';
121
+ readonly source: {
122
+ readonly dataset: TSourceDatasetId;
123
+ readonly key: SingleDatasetKeyId<TDatasets[TSourceDatasetId]>;
124
+ readonly label: ResolvedGroupByColumnIdFromSchema<DatasetRow<TDatasets[TSourceDatasetId]>, TDatasets[TSourceDatasetId]>;
125
+ };
126
+ readonly targets: TTargets;
127
+ };
128
+ type ModelAttributeDefinition<TSourceDatasetId extends string = string, TTargets extends readonly unknown[] = readonly unknown[]> = {
129
+ readonly kind: 'select';
130
+ readonly id: string;
131
+ readonly source: {
132
+ readonly dataset: TSourceDatasetId;
133
+ readonly key: string;
134
+ readonly label: string;
135
+ };
136
+ readonly targets: TTargets;
137
+ };
138
+ type ModelDataInput<TDatasets extends ModelDatasets> = { readonly [TId in keyof TDatasets]: readonly DatasetRow<TDatasets[TId]>[] };
139
+ type ModelInferExcludeId<TDatasets extends ModelDatasets> = { [TDatasetId in ModelDatasetId<TDatasets>]: `${TDatasetId}.${InferableFieldKey<DatasetRow<TDatasets[TDatasetId]>>}` }[ModelDatasetId<TDatasets>];
140
+ type ModelInferOptions<TDatasets extends ModelDatasets, TExclude extends readonly ModelInferExcludeId<TDatasets>[] | undefined = readonly ModelInferExcludeId<TDatasets>[] | undefined> = {
141
+ readonly relationships?: boolean;
142
+ readonly attributes?: boolean;
143
+ readonly exclude?: TExclude;
144
+ };
145
+ type DefinedDataModel<TDatasets extends ModelDatasets = ModelDatasets, TRelationships extends Record<string, ModelRelationshipDefinition> = Record<string, ModelRelationshipDefinition>, TAssociations extends Record<string, ModelAssociationDefinition> = Record<string, ModelAssociationDefinition>, TAttributes extends Record<string, ModelAttributeDefinition> = Record<string, ModelAttributeDefinition>> = {
146
+ readonly datasets: TDatasets;
147
+ readonly relationships: TRelationships;
148
+ readonly associations: TAssociations;
149
+ readonly attributes: TAttributes;
150
+ /**
151
+ * Define one explicit materialized view from the linked model.
152
+ *
153
+ * Use this when a chart needs a flat cross-dataset row shape such as
154
+ * `'job'`, `'job-skill'`, or `'requisition-owner'`.
155
+ */
156
+ materialize<const TId extends string, const TMaterializedView extends MaterializedViewDefinition<any, any, any, any>>(id: TId, defineView: (materialize: ModelMaterializationStartBuilder<TDatasets, TRelationships, TAssociations, TAttributes, TId>) => TMaterializedView): TMaterializedView;
157
+ chart<const TChartId extends string, const TBuilder extends ModelChartBuilder<TDatasets, TRelationships, any, any, any, any, any, any, any, any>>(id: TChartId, defineChart: (chart: ModelChartStartBuilder<TDatasets, TRelationships>) => TBuilder): CompileModelChartDefinition<TDatasets, TRelationships, TBuilder, TChartId>;
158
+ chart<const TChartId extends string, const TBuilder extends InferredModelChartBuilder<TDatasets, TRelationships, any, any, any, any, any, any, any, any>>(id: TChartId, defineChart: (chart: ModelChartStartBuilder<TDatasets, TRelationships>) => TBuilder): CompileModelChartDefinition<TDatasets, TRelationships, TBuilder, TChartId>;
159
+ validateData(data: ModelDataInput<TDatasets>): void;
160
+ build(): DefinedDataModel<TDatasets, TRelationships, TAssociations, TAttributes>;
161
+ readonly __dataModelBrand: 'data-model-definition';
162
+ };
163
+ type DataModelDefinition<TDatasets extends ModelDatasets = {}, TRelationships extends Record<string, ModelRelationshipDefinition> = {}, TAssociations extends Record<string, ModelAssociationDefinition> = {}, TAttributes extends Record<string, ModelAttributeDefinition> = {}> = {
164
+ build(): DefinedDataModel<TDatasets, TRelationships, TAssociations, TAttributes>;
165
+ };
166
+ type ResolvedDataModelFromDefinition<TModel> = TModel extends DataModelDefinition<any, any, any, any> ? ReturnType<TModel['build']> : never;
167
+ type AnyDefinedDataModel = {
168
+ readonly datasets: ModelDatasets;
169
+ readonly relationships: Record<string, ModelRelationshipDefinition>;
170
+ readonly associations: Record<string, ModelAssociationDefinition>;
171
+ readonly attributes: Record<string, ModelAttributeDefinition>;
172
+ materialize: (id: string, defineView: (materialize: ModelMaterializationStartBuilder<any, any, any, any, string>) => MaterializedViewDefinition<any, any, any, any>) => MaterializedViewDefinition<any, any, any, any>;
173
+ chart: (id: string, defineChart: (chart: ModelChartStartBuilder<any, any>) => ModelChartBuilder<any, any, any, any, any, any, any, any, any, any>) => DatasetChartDefinition<any, any, any, any, any, any, any, any, any, any, any>;
174
+ validateData(data: ModelDataInput<ModelDatasets>): void;
175
+ build(): AnyDefinedDataModel;
176
+ readonly __dataModelBrand: 'data-model-definition';
177
+ };
178
+ interface DataModelBuilder<TDatasets extends ModelDatasets = {}, TRelationships extends Record<string, ModelRelationshipDefinition> = {}, TAssociations extends Record<string, ModelAssociationDefinition> = {}, TAttributes extends Record<string, ModelAttributeDefinition> = {}> extends DataModelDefinition<TDatasets, TRelationships, TAssociations, TAttributes> {
179
+ dataset<const TId extends string, const TDataset extends KeyedDatasetDefinition>(id: UniqueId<TId, ModelDatasetId<TDatasets>>, dataset: TDataset): DataModelBuilder<TDatasets & Record<TId, ResolvedDatasetFromDefinition<TDataset>>, TRelationships, TAssociations, TAttributes>;
180
+ relationship<const TId extends string, const TFromDatasetId extends ModelSingleKeyDatasetId<TDatasets>, const TToDatasetId extends ModelDatasetId<TDatasets>>(id: UniqueId<TId, Extract<keyof TRelationships, string>>, config: RelationshipConfig<TDatasets, TFromDatasetId, TToDatasetId>): DataModelBuilder<TDatasets, TRelationships & Record<TId, ModelRelationshipDefinition<TFromDatasetId, TToDatasetId, SingleDatasetKeyId<TDatasets[TFromDatasetId]>, DatasetForeignKeyColumnId<TDatasets[TToDatasetId]>>>, TAssociations, TAttributes>;
181
+ association<const TId extends string, const TFromDatasetId extends ModelSingleKeyDatasetId<TDatasets>, const TToDatasetId extends ModelSingleKeyDatasetId<TDatasets>, const TEdgeRow extends Record<string, unknown> = Record<string, unknown>>(id: UniqueId<TId, Extract<keyof TAssociations, string>>, config: ExplicitAssociationConfig<TDatasets, TFromDatasetId, TToDatasetId, TEdgeRow>): DataModelBuilder<TDatasets, TRelationships, TAssociations & Record<TId, ModelAssociationDefinition<TFromDatasetId, TToDatasetId, SingleDatasetKeyId<TDatasets[TFromDatasetId]>, SingleDatasetKeyId<TDatasets[TToDatasetId]>>>, TAttributes>;
182
+ association<const TId extends string, const TFromDatasetId extends ModelSingleKeyDatasetId<TDatasets>, const TToDatasetId extends ModelSingleKeyDatasetId<TDatasets>, const TDeriveDatasetId extends TFromDatasetId | TToDatasetId>(id: UniqueId<TId, Extract<keyof TAssociations, string>>, config: DerivedAssociationConfig<TDatasets, TFromDatasetId, TToDatasetId, TDeriveDatasetId>): DataModelBuilder<TDatasets, TRelationships, TAssociations & Record<TId, ModelAssociationDefinition<TFromDatasetId, TToDatasetId, SingleDatasetKeyId<TDatasets[TFromDatasetId]>, SingleDatasetKeyId<TDatasets[TToDatasetId]>>>, TAttributes>;
183
+ attribute<const TId extends string, const TSourceDatasetId extends ModelSingleKeyDatasetId<TDatasets>, const TTargets extends readonly ModelAttributeTarget<TRelationships, TAssociations, TSourceDatasetId>[]>(id: UniqueId<TId, Extract<keyof TAttributes, string>>, config: SelectAttributeConfig<TDatasets, TRelationships, TAssociations, TSourceDatasetId, TTargets>): DataModelBuilder<TDatasets, TRelationships, TAssociations, TAttributes & Record<TId, ModelAttributeDefinition<TSourceDatasetId, TTargets>>>;
184
+ infer<const TOptions extends ModelInferOptions<TDatasets>>(options: TOptions): DataModelBuilder<TDatasets, TOptions['relationships'] extends true ? InferRelationshipsForModel<TDatasets, TRelationships, Extract<TOptions['exclude'], readonly string[] | undefined>> : TRelationships, TAssociations, TOptions['attributes'] extends true ? InferAttributesForModel<TDatasets, TOptions['relationships'] extends true ? InferRelationshipsForModel<TDatasets, TRelationships, Extract<TOptions['exclude'], readonly string[] | undefined>> : TRelationships, TAttributes> : TAttributes>;
185
+ chart<const TChartId extends string, const TBuilder extends ModelChartBuilder<TDatasets, TRelationships, any, any, any, any, any, any, any, any>>(id: TChartId, defineChart: (chart: ModelChartStartBuilder<TDatasets, TRelationships>) => TBuilder): CompileModelChartDefinition<TDatasets, TRelationships, TBuilder, TChartId>;
186
+ chart<const TChartId extends string, const TBuilder extends InferredModelChartBuilder<TDatasets, TRelationships, any, any, any, any, any, any, any, any>>(id: TChartId, defineChart: (chart: ModelChartStartBuilder<TDatasets, TRelationships>) => TBuilder): CompileModelChartDefinition<TDatasets, TRelationships, TBuilder, TChartId>;
187
+ /**
188
+ * Define one reusable materialized view without collapsing model, chart, and
189
+ * dashboard concerns into one abstraction.
190
+ */
191
+ materialize<const TId extends string, const TMaterializedView extends MaterializedViewDefinition<any, any, any, any>>(id: TId, defineView: (materialize: ModelMaterializationStartBuilder<TDatasets, TRelationships, TAssociations, TAttributes, TId>) => TMaterializedView): TMaterializedView;
192
+ validateData(data: ModelDataInput<TDatasets>): void;
193
+ build(): DefinedDataModel<TDatasets, TRelationships, TAssociations, TAttributes>;
194
+ }
195
+ //#endregion
196
+ export { AnyDefinedDataModel, DataModelBuilder, DataModelDefinition, DefinedDataModel, KeyedDatasetDefinition, ModelAssociationDefinition, ModelAttributeDefinition, ModelDataInput, ModelDatasetId, ModelDatasets, ModelRelationshipDefinition, ResolvedDataModelFromDefinition, SelectAttributeConfig };
@@ -0,0 +1,51 @@
1
+ import { ChartType, ChartTypeConfig, DefinedChartSchema, FiltersConfig, GroupByConfig, InferableFieldKey, MetricConfig, ResolvedFilterColumnIdFromSchema, ResolvedGroupByColumnIdFromSchema, ResolvedMetricColumnIdFromSchema, ResolvedXAxisColumnIdFromSchema, TimeBucket, TimeBucketConfig, XAxisConfig } from "./types.mjs";
2
+ import { ColumnHelper, ColumnsFromEntries, MetricBuilder, MetricBuilderConfig, SchemaColumnEntry, SchemaFromBuilder, SelectableControlBuilder, SelectableControlBuilderConfig, ValidateColumnEntries } from "./schema-builder.types.mjs";
3
+ import { DATASET_CHART_METADATA, DatasetChartMetadata } from "./dataset-chart-metadata.mjs";
4
+
5
+ //#region src/core/dataset-builder.types.d.ts
6
+ type NonEmptyReadonlyArray<TValue> = readonly [TValue, ...TValue[]];
7
+ type DatasetColumnsContext<TColumns extends Record<string, unknown> | undefined> = [TColumns] extends [undefined] ? undefined : {
8
+ columns?: TColumns;
9
+ };
10
+ type DefinedDatasetChartSchema<TRow, TColumns extends Record<string, unknown> | undefined, TXAxis extends XAxisConfig<any> | undefined, TGroupBy extends GroupByConfig<any> | undefined, TFilters extends FiltersConfig<any> | undefined, TMetric extends MetricConfig<any> | undefined, TChartType extends ChartTypeConfig | undefined, TTimeBucket extends TimeBucketConfig | undefined, TConnectNulls extends boolean | undefined, TChartId extends string | undefined = undefined, TOwner = unknown> = DefinedChartSchema<TRow, SchemaFromBuilder<TColumns, TXAxis, TGroupBy, TFilters, TMetric, TChartType, TTimeBucket, TConnectNulls>> & {
11
+ readonly [DATASET_CHART_METADATA]: DatasetChartMetadata<TChartId, TOwner>;
12
+ };
13
+ type DatasetKey<TRow> = NonEmptyReadonlyArray<InferableFieldKey<TRow>>;
14
+ type DefinedDataset<TRow, TColumns extends Record<string, unknown> | undefined = undefined, TKey extends DatasetKey<TRow> | undefined = undefined> = {
15
+ readonly key?: TKey;
16
+ readonly columns?: TColumns;
17
+ chart<const TChartId extends string | undefined = undefined>(id?: TChartId): DatasetChartBuilder<TRow, TColumns, undefined, undefined, undefined, undefined, undefined, undefined, undefined, TChartId, DefinedDataset<TRow, TColumns, TKey>>;
18
+ validateData(data: readonly TRow[]): void;
19
+ build(): DefinedDataset<TRow, TColumns, TKey>;
20
+ readonly __datasetBrand: 'dataset-definition';
21
+ };
22
+ type DatasetDefinition<TRow, TColumns extends Record<string, unknown> | undefined = undefined, TKey extends DatasetKey<TRow> | undefined = undefined> = {
23
+ build(): DefinedDataset<TRow, TColumns, TKey>;
24
+ };
25
+ type ResolvedDatasetFromDefinition<TDataset> = TDataset extends DatasetDefinition<any, any, any> ? ReturnType<TDataset['build']> : never;
26
+ type DatasetRow<TDataset> = TDataset extends DefinedDataset<infer TRow, any, any> ? TRow : never;
27
+ type DatasetColumns<TDataset> = TDataset extends DefinedDataset<any, infer TColumns, any> ? TColumns : never;
28
+ type DatasetKeyIds<TDataset> = TDataset extends DefinedDataset<any, any, infer TKey> ? TKey : never;
29
+ type SingleDatasetKeyId<TDataset> = DatasetKeyIds<TDataset> extends readonly [infer TKeyId extends string] ? TKeyId : never;
30
+ type DatasetChartBuilder<TRow, TColumns extends Record<string, unknown> | undefined = undefined, TXAxis extends XAxisConfig<any> | undefined = undefined, TGroupBy extends GroupByConfig<any> | undefined = undefined, TFilters extends FiltersConfig<any> | undefined = undefined, TMetric extends MetricConfig<any> | undefined = undefined, TChartType extends ChartTypeConfig | undefined = undefined, TTimeBucket extends TimeBucketConfig | undefined = undefined, TConnectNulls extends boolean | undefined = undefined, TChartId extends string | undefined = undefined, TOwner = unknown> = {
31
+ xAxis<const TBuilder extends SelectableControlBuilder<ResolvedXAxisColumnIdFromSchema<TRow, DatasetColumnsContext<TColumns>>, true>>(defineXAxis: (xAxis: SelectableControlBuilder<ResolvedXAxisColumnIdFromSchema<TRow, DatasetColumnsContext<TColumns>>, true>) => TBuilder): DatasetChartBuilder<TRow, TColumns, SelectableControlBuilderConfig<TBuilder>, TGroupBy, TFilters, TMetric, TChartType, TTimeBucket, TConnectNulls, TChartId, TOwner>;
32
+ groupBy<const TBuilder extends SelectableControlBuilder<ResolvedGroupByColumnIdFromSchema<TRow, DatasetColumnsContext<TColumns>>, true>>(defineGroupBy: (groupBy: SelectableControlBuilder<ResolvedGroupByColumnIdFromSchema<TRow, DatasetColumnsContext<TColumns>>, true>) => TBuilder): DatasetChartBuilder<TRow, TColumns, TXAxis, SelectableControlBuilderConfig<TBuilder>, TFilters, TMetric, TChartType, TTimeBucket, TConnectNulls, TChartId, TOwner>;
33
+ filters<const TBuilder extends SelectableControlBuilder<ResolvedFilterColumnIdFromSchema<TRow, DatasetColumnsContext<TColumns>>, false>>(defineFilters: (filters: SelectableControlBuilder<ResolvedFilterColumnIdFromSchema<TRow, DatasetColumnsContext<TColumns>>, false>) => TBuilder): DatasetChartBuilder<TRow, TColumns, TXAxis, TGroupBy, SelectableControlBuilderConfig<TBuilder>, TMetric, TChartType, TTimeBucket, TConnectNulls, TChartId, TOwner>;
34
+ metric<const TBuilder extends MetricBuilder<ResolvedMetricColumnIdFromSchema<TRow, DatasetColumnsContext<TColumns>>, any, any, any>>(defineMetric: (metric: MetricBuilder<ResolvedMetricColumnIdFromSchema<TRow, DatasetColumnsContext<TColumns>>>) => TBuilder): DatasetChartBuilder<TRow, TColumns, TXAxis, TGroupBy, TFilters, MetricBuilderConfig<TBuilder>, TChartType, TTimeBucket, TConnectNulls, TChartId, TOwner>;
35
+ chartType<const TBuilder extends SelectableControlBuilder<ChartType, true>>(defineChartType: (chartType: SelectableControlBuilder<ChartType, true>) => TBuilder): DatasetChartBuilder<TRow, TColumns, TXAxis, TGroupBy, TFilters, TMetric, SelectableControlBuilderConfig<TBuilder>, TTimeBucket, TConnectNulls, TChartId, TOwner>;
36
+ timeBucket<const TBuilder extends SelectableControlBuilder<TimeBucket, true>>(defineTimeBucket: (timeBucket: SelectableControlBuilder<TimeBucket, true>) => TBuilder): DatasetChartBuilder<TRow, TColumns, TXAxis, TGroupBy, TFilters, TMetric, TChartType, SelectableControlBuilderConfig<TBuilder>, TConnectNulls, TChartId, TOwner>;
37
+ connectNulls<const TValue extends boolean>(value: TValue): DatasetChartBuilder<TRow, TColumns, TXAxis, TGroupBy, TFilters, TMetric, TChartType, TTimeBucket, TValue, TChartId, TOwner>;
38
+ build(): DefinedDatasetChartSchema<TRow, TColumns, TXAxis, TGroupBy, TFilters, TMetric, TChartType, TTimeBucket, TConnectNulls, TChartId, TOwner>;
39
+ readonly [DATASET_CHART_METADATA]: DatasetChartMetadata<TChartId, TOwner>;
40
+ };
41
+ type DatasetChartDefinition<TRow, TColumns extends Record<string, unknown> | undefined = undefined, TXAxis extends XAxisConfig<any> | undefined = undefined, TGroupBy extends GroupByConfig<any> | undefined = undefined, TFilters extends FiltersConfig<any> | undefined = undefined, TMetric extends MetricConfig<any> | undefined = undefined, TChartType extends ChartTypeConfig | undefined = undefined, TTimeBucket extends TimeBucketConfig | undefined = undefined, TConnectNulls extends boolean | undefined = undefined, TChartId extends string | undefined = undefined, TOwner = unknown> = DatasetChartBuilder<TRow, TColumns, TXAxis, TGroupBy, TFilters, TMetric, TChartType, TTimeBucket, TConnectNulls, TChartId, TOwner> | DefinedDatasetChartSchema<TRow, TColumns, TXAxis, TGroupBy, TFilters, TMetric, TChartType, TTimeBucket, TConnectNulls, TChartId, TOwner>;
42
+ interface DatasetBuilder<TRow, TColumns extends Record<string, unknown> | undefined = undefined, TKey extends DatasetKey<TRow> | undefined = undefined> extends DatasetDefinition<TRow, TColumns, TKey> {
43
+ key<const TFieldId extends InferableFieldKey<TRow>>(id: TFieldId): DatasetBuilder<TRow, TColumns, readonly [TFieldId]>;
44
+ key<const TKeyIds extends DatasetKey<TRow>>(ids: TKeyIds): DatasetBuilder<TRow, TColumns, TKeyIds>;
45
+ columns: TColumns extends undefined ? <const TEntries extends readonly SchemaColumnEntry<TRow>[]>(defineColumns: (columns: ColumnHelper<TRow>) => TEntries & ValidateColumnEntries<TEntries>) => DatasetBuilder<TRow, ColumnsFromEntries<TRow, TEntries>, TKey> : never;
46
+ chart<const TChartId extends string | undefined = undefined>(id?: TChartId): DatasetChartBuilder<TRow, TColumns, undefined, undefined, undefined, undefined, undefined, undefined, undefined, TChartId, DefinedDataset<TRow, TColumns, TKey>>;
47
+ validateData(data: readonly TRow[]): void;
48
+ build(): DefinedDataset<TRow, TColumns, TKey>;
49
+ }
50
+ //#endregion
51
+ export { DatasetBuilder, DatasetChartBuilder, DatasetChartDefinition, DatasetColumns, DatasetDefinition, DatasetKey, DatasetKeyIds, DatasetRow, DefinedDataset, DefinedDatasetChartSchema, ResolvedDatasetFromDefinition, SingleDatasetKeyId };
@@ -0,0 +1,8 @@
1
+ //#region src/core/dataset-chart-metadata.d.ts
2
+ declare const DATASET_CHART_METADATA: unique symbol;
3
+ type DatasetChartMetadata<TChartId extends string | undefined = string | undefined, TOwner = unknown> = {
4
+ readonly dataset: TOwner;
5
+ readonly chartId: TChartId;
6
+ };
7
+ //#endregion
8
+ export { DATASET_CHART_METADATA, DatasetChartMetadata };
@@ -0,0 +1,4 @@
1
+ //#region src/core/dataset-chart-metadata.ts
2
+ const DATASET_CHART_METADATA = Symbol("dataset-chart-metadata");
3
+ //#endregion
4
+ export { DATASET_CHART_METADATA };
@@ -111,7 +111,7 @@ function autoFilterForBucket(bucket) {
111
111
  * @returns The resolved filter, or `null` for "all time".
112
112
  */
113
113
  function resolvePresetFilter(presetId, timeBucket) {
114
- if (presetId === "auto") return autoFilterForBucket(timeBucket);
114
+ if (presetId === "auto") return autoFilterForBucket(timeBucket) ?? null;
115
115
  return DATE_RANGE_PRESETS.find((p) => p.id === presetId)?.buildFilter() ?? null;
116
116
  }
117
117
  /**
@@ -0,0 +1,8 @@
1
+ import { DataModelDefinition } from "./data-model.types.mjs";
2
+ import { DashboardBuilder, DashboardDefinition, DashboardInputModel, ResolvedDashboardFromDefinition } from "./dashboard.types.mjs";
3
+
4
+ //#region src/core/define-dashboard.d.ts
5
+ declare function resolveDashboardDefinition<TDashboard extends DashboardDefinition<any, any, any>>(dashboard: TDashboard): ResolvedDashboardFromDefinition<TDashboard>;
6
+ declare function defineDashboard<TModel extends DataModelDefinition<any, any, any, any>>(model: TModel): DashboardBuilder<DashboardInputModel<TModel>>;
7
+ //#endregion
8
+ export { defineDashboard, resolveDashboardDefinition };