@bluemarble/bi 0.4.0 → 0.6.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.
@@ -119,6 +119,183 @@ declare function modelMeta(model: ModelDef): ModelMeta;
119
119
  */
120
120
  declare function validateModel(model: ModelDef): string[];
121
121
  //#endregion
122
+ //#region src/types.d.ts
123
+ type FilterValue = string | number;
124
+ /** Filtros por dimensão; lista vazia (ou ausente) = sem filtro ("Todos"). */
125
+ type DashboardFilters = Record<string, FilterValue[]>;
126
+ /**
127
+ * Pedidos do devtools. O servidor só aceita quando o `runQuery` recebe `devtools` (em dev); fora
128
+ * disso `debug` é ignorado e o resto é recusado com 400.
129
+ */
130
+ type DashboardDevtoolsRequest = {
131
+ /** Devolve SQL compilado, parâmetros e tempos em `result.devtools.debug`. */
132
+ debug?: boolean;
133
+ /** Rascunho do modelo editado no devtools: substitui o modelo registrado só nesta consulta. */
134
+ model?: ModelDef;
135
+ /** Devolve a definição do modelo registrado e o que o servidor permite (`capabilities`). */
136
+ describe?: boolean;
137
+ /** Esvazia o cache de resultados do processo antes de executar. */
138
+ clearCache?: boolean;
139
+ /**
140
+ * Só compila: devolve o SQL e os parâmetros em `result.devtools.debug`, sem executar (o devtools
141
+ * usa para mostrar o SQL de uma consulta que deu erro).
142
+ */
143
+ compile?: boolean;
144
+ /** Devolve o `EXPLAIN` da consulta em vez das linhas. */
145
+ explain?: boolean;
146
+ /** Mede a agregação de cada fato usada pela consulta, isoladamente. */
147
+ profile?: boolean;
148
+ /** Tabelas e colunas do banco (`information_schema`), para o autocomplete do editor. */
149
+ schema?: boolean;
150
+ /** Colunas de cada tabela (uma linha de cada), para o diagrama do modelo. */
151
+ columns?: boolean;
152
+ /** Executa cada pedaço do modelo (`devtools.model` ou o registrado) contra o banco. */
153
+ validate?: boolean;
154
+ /** Grava o rascunho no arquivo do modelo (`preview` só devolve o conteúdo novo). */
155
+ save?: 'preview' | 'write';
156
+ /** Grava o layout de gráficos em `<layoutsDir>/<id>.json` (`preview` só devolve o conteúdo novo). */
157
+ saveLayout?: {
158
+ layout: ChartsLayout;
159
+ mode: 'preview' | 'write';
160
+ };
161
+ /** Grava o resultado da consulta (modelo registrado) como snapshot de regressão. */
162
+ snapshot?: {
163
+ name: string;
164
+ overwrite?: boolean;
165
+ };
166
+ /** Lista os snapshots salvos deste modelo. */
167
+ snapshots?: boolean;
168
+ };
169
+ type DashboardQuery = {
170
+ model: string;
171
+ /** Dimensões agrupadas (viram GROUP BY). */
172
+ dimensions?: string[];
173
+ /** Medidas calculadas para cada grupo. */
174
+ measures?: string[];
175
+ filters?: DashboardFilters;
176
+ /** Devolve só os metadados do modelo (rótulos, descrições, formatos; sem SQL) em `result.meta`. */
177
+ meta?: boolean;
178
+ devtools?: DashboardDevtoolsRequest;
179
+ };
180
+ type DashboardRow = Record<string, string | number | null>;
181
+ type DashboardQueryDebug = {
182
+ sql: string;
183
+ params: (string | number)[];
184
+ /** Tempo da execução no banco (num cache hit, o da execução original). */
185
+ durationMs: number;
186
+ cached: boolean;
187
+ /** A consulta rodou contra o rascunho do devtools, não contra o modelo registrado. */
188
+ draft: boolean;
189
+ };
190
+ type ProfileStep = {
191
+ /** `fato:<tabela>` ou `consulta` (a consulta inteira). */
192
+ name: string;
193
+ durationMs: number;
194
+ /** Linhas da agregação da fato (grupos) com os filtros aplicados. */
195
+ rows: number | null;
196
+ };
197
+ type SchemaTable = {
198
+ name: string;
199
+ type: 'table' | 'view';
200
+ columns: {
201
+ name: string;
202
+ type: string;
203
+ }[];
204
+ };
205
+ /** Colunas devolvidas por cada pedaço do modelo (vazio quando não veio nenhuma linha). */
206
+ type ModelColumns = {
207
+ /** Colunas de cada tabela. */
208
+ tables: Record<string, string[]>;
209
+ /** `tabela.coluna` com valor numérico na linha lida. */
210
+ numeric: string[];
211
+ };
212
+ type ModelValidation = {
213
+ /**
214
+ * Erro do banco por pedaço: `table:<nome>`, `relationship:<índice>`, `dimension:<nome>`,
215
+ * `measure:<nome>`.
216
+ */
217
+ errors: Record<string, string>;
218
+ warnings: Record<string, string>;
219
+ columns: ModelColumns;
220
+ };
221
+ type SaveModelResult = {
222
+ path: string;
223
+ previous: string;
224
+ content: string;
225
+ written: boolean;
226
+ warnings: string[];
227
+ };
228
+ type DashboardSnapshot = {
229
+ name: string;
230
+ createdAt: string;
231
+ query: Omit<DashboardQuery, 'devtools' | 'meta'>;
232
+ rows: DashboardRow[];
233
+ };
234
+ type DevtoolsCapabilities = {
235
+ /** O endpoint sabe onde ficam os arquivos dos modelos (`modelsDir`). */
236
+ saveModel: boolean;
237
+ /** O endpoint sabe onde gravar snapshots (`snapshotsDir`). */
238
+ snapshots: boolean;
239
+ /** O endpoint sabe onde ficam os arquivos de layout de gráficos (`layoutsDir`). */
240
+ saveLayout: boolean;
241
+ /** Tipos de gráfico do app que o endpoint conhece (`chartTypes`): só esses ele aceita salvar. */
242
+ chartTypes: string[];
243
+ };
244
+ type DashboardResult = {
245
+ rows: DashboardRow[];
246
+ meta?: ModelMeta;
247
+ devtools?: {
248
+ model?: ModelDef;
249
+ capabilities?: DevtoolsCapabilities;
250
+ debug?: DashboardQueryDebug;
251
+ explain?: DashboardRow[];
252
+ profile?: ProfileStep[];
253
+ schema?: SchemaTable[];
254
+ validation?: ModelValidation;
255
+ columns?: ModelColumns;
256
+ /** Pedaços que o banco recusou ao ler as colunas (mesmas chaves da validação). */
257
+ columnErrors?: Record<string, string>;
258
+ save?: SaveModelResult;
259
+ snapshot?: {
260
+ path: string;
261
+ };
262
+ snapshots?: DashboardSnapshot[];
263
+ };
264
+ };
265
+ //#endregion
266
+ //#region src/formatRules.d.ts
267
+ declare const COLUMN_ALIGNS: readonly ['left', 'center', 'right'];
268
+ type ColumnAlign = (typeof COLUMN_ALIGNS)[number];
269
+ declare const COLUMN_VERTICAL_ALIGNS: readonly ['top', 'middle', 'bottom'];
270
+ type ColumnVerticalAlign = (typeof COLUMN_VERTICAL_ALIGNS)[number];
271
+ declare const RULE_OPERATORS: readonly ['>', '>=', '<', '<=', '=', '!=', 'between', 'contains', 'empty', 'notEmpty'];
272
+ type RuleOperator = (typeof RULE_OPERATORS)[number];
273
+ type FormatRule = {
274
+ /**
275
+ * Dimensão ou medida avaliada. Pode estar fora da tabela: entra na consulta sem coluna (uma
276
+ * dimensão de fora divide as linhas se tiver mais de um valor por linha).
277
+ */
278
+ field: string;
279
+ operator: RuleOperator;
280
+ /** Valor comparado com o valor bruto (percentual como fração: 10% = 0.1). */
281
+ value?: number | string;
282
+ /** Fim do intervalo do `between` (inclusivo, como o `value`). */
283
+ to?: number;
284
+ /** `cell` (padrão) pinta uma célula; `row`, a linha inteira. */
285
+ target?: 'cell' | 'row';
286
+ /** Coluna pintada quando `target` é `cell`. Padrão: o próprio `field`. */
287
+ column?: string;
288
+ /** Cor do texto. */
289
+ color?: string;
290
+ /** Cor de fundo. */
291
+ background?: string;
292
+ bold?: boolean;
293
+ /** Alinhamento horizontal da célula (ou das células da linha). */
294
+ align?: ColumnAlign;
295
+ /** Alinhamento vertical da célula (ou das células da linha). */
296
+ verticalAlign?: ColumnVerticalAlign;
297
+ };
298
+ //#endregion
122
299
  //#region src/layout.d.ts
123
300
  declare const CHART_TYPES: readonly ['kpi', 'combo', 'bar', 'donut', 'table'];
124
301
  type ChartType = (typeof CHART_TYPES)[number];
@@ -206,14 +383,36 @@ type TableChartDef = BaseChartDef & ColumnsDisplay & {
206
383
  percentOf?: string[];
207
384
  /** Casas decimais das colunas de percentual. Padrão: 1. */
208
385
  percentDecimals?: number;
386
+ /**
387
+ * Ordem das colunas misturando dimensões, medidas e percentuais (`%:medida`), ex.: uma medida
388
+ * antes de uma dimensão. Ausente = dimensões e depois medidas; percentual fora da ordem vem logo
389
+ * depois da medida dele (ou no fim, se a medida não é coluna).
390
+ */
391
+ columnOrder?: string[];
209
392
  /** Formatter por dimensão (`{ mes: 'nomeMes' }`). */
210
393
  formatDimensions?: Record<string, string>;
211
394
  /** Linha de total, consultada sem as dimensões (razões saem certas, não somadas). */
212
395
  showTotal?: boolean;
213
- /** Coluna (dimensão ou medida) da ordem inicial; o usuário reordena clicando no cabeçalho. */
396
+ /**
397
+ * Dimensão ou medida da ordem inicial; o usuário reordena clicando no cabeçalho. Pode estar fora
398
+ * da tabela (ex.: número do mês para ordenar o nome do mês): entra na consulta sem coluna.
399
+ */
214
400
  sortBy?: string;
215
401
  sortDirection?: 'asc' | 'desc';
216
402
  clickToFilter?: boolean;
403
+ /** Formatação condicional: cor do texto/fundo da célula ou da linha conforme uma regra. */
404
+ formatRules?: FormatRule[];
405
+ /** Bordas entre as células (grade). Padrão: só a linha embaixo de cada linha. */
406
+ cellBorders?: boolean;
407
+ /** Cor das bordas da grade. */
408
+ borderColor?: string;
409
+ /**
410
+ * Alinhamento horizontal por coluna (`{ coluna: 'center' }`, `%:medida` para o percentual), no
411
+ * cabeçalho, nas células e no total. Padrão: dimensão à esquerda, número à direita.
412
+ */
413
+ align?: Record<string, ColumnAlign>;
414
+ /** Alinhamento vertical por coluna (`top`, `middle`, `bottom`). Padrão: `middle`. */
415
+ verticalAlign?: Record<string, ColumnVerticalAlign>;
217
416
  };
218
417
  type KpiChartDef = Omit<BaseChartDef, 'height'> & ColumnsDisplay & {
219
418
  type: 'kpi';
@@ -287,7 +486,7 @@ type FieldSpec = {
287
486
  label: string;
288
487
  hint?: string;
289
488
  /** Agrupamento no formulário do devtools. */
290
- section: 'Gráfico' | 'Dados' | 'Aparência' | 'Rótulos e formatos' | 'Filtro' | 'Tela' | 'Card';
489
+ section: 'Gráfico' | 'Dados' | 'Aparência' | 'Rótulos e formatos' | 'Formatação condicional' | 'Filtro' | 'Tela' | 'Card';
291
490
  required?: boolean;
292
491
  /** Valor que o componente usa quando o campo não está no JSON. */
293
492
  default?: unknown;
@@ -310,7 +509,15 @@ type FieldSpec = {
310
509
  {
311
510
  kind: 'dimension' | 'measure';
312
511
  } | {
313
- kind: 'dimensions' | 'measures';
512
+ kind: 'dimensions';
513
+ } |
514
+ /**
515
+ * `percent`: cada medida vira uma coluna de % do total (`%:medida`), que entra no `columnOrder`
516
+ * como as outras colunas.
517
+ */
518
+ {
519
+ kind: 'measures';
520
+ percent?: boolean;
314
521
  } |
315
522
  /** Nome de um formatter do `<DashboardCharts formatters>`. */
316
523
  {
@@ -320,9 +527,13 @@ type FieldSpec = {
320
527
  {
321
528
  kind: 'formatters';
322
529
  } |
323
- /** Uma das dimensões/medidas escolhidas no próprio gráfico. */
530
+ /**
531
+ * Uma das dimensões/medidas escolhidas no próprio gráfico. `outside`: também qualquer dimensão ou
532
+ * medida do modelo (o componente consulta o que estiver fora do gráfico, sem mostrar).
533
+ */
324
534
  {
325
535
  kind: 'column';
536
+ outside?: boolean;
326
537
  } |
327
538
  /** `{ dimensãoOuMedida: rótulo }` das colunas do gráfico. */
328
539
  {
@@ -331,6 +542,25 @@ type FieldSpec = {
331
542
  /** `{ medida: ChartNumberFormat }` das medidas do gráfico. */
332
543
  {
333
544
  kind: 'formats';
545
+ } |
546
+ /** `{ coluna: 'left' | 'center' | 'right' }`: alinhamento horizontal de cada coluna. */
547
+ {
548
+ kind: 'aligns';
549
+ } |
550
+ /** `{ coluna: 'top' | 'middle' | 'bottom' }`: alinhamento vertical de cada coluna. */
551
+ {
552
+ kind: 'verticalAligns';
553
+ } |
554
+ /**
555
+ * Ordem das colunas (dimensões e medidas misturadas). O devtools junta os campos `dimensions` e
556
+ * `measures` da mesma seção numa lista só e grava a ordem aqui quando não é a padrão.
557
+ */
558
+ {
559
+ kind: 'columnOrder';
560
+ } |
561
+ /** Regras de formatação condicional (`FormatRule[]`). */
562
+ {
563
+ kind: 'formatRules';
334
564
  });
335
565
  /**
336
566
  * Tipo de gráfico: nome no devtools e campos do JSON. Para um tipo do app, `title`, `span` e
@@ -375,149 +605,5 @@ declare function validateLayout(layout: ChartsLayout, types?: ChartTypes): strin
375
605
  */
376
606
  declare function layoutModelWarnings(layout: ChartsLayout, model: Pick<ModelDef, 'dimensions' | 'measures'>, types?: ChartTypes): string[];
377
607
  //#endregion
378
- //#region src/types.d.ts
379
- type FilterValue = string | number;
380
- /** Filtros por dimensão; lista vazia (ou ausente) = sem filtro ("Todos"). */
381
- type DashboardFilters = Record<string, FilterValue[]>;
382
- /**
383
- * Pedidos do devtools. O servidor só aceita quando o `runQuery` recebe `devtools` (em dev); fora
384
- * disso `debug` é ignorado e o resto é recusado com 400.
385
- */
386
- type DashboardDevtoolsRequest = {
387
- /** Devolve SQL compilado, parâmetros e tempos em `result.devtools.debug`. */
388
- debug?: boolean;
389
- /** Rascunho do modelo editado no devtools: substitui o modelo registrado só nesta consulta. */
390
- model?: ModelDef;
391
- /** Devolve a definição do modelo registrado e o que o servidor permite (`capabilities`). */
392
- describe?: boolean;
393
- /** Esvazia o cache de resultados do processo antes de executar. */
394
- clearCache?: boolean;
395
- /**
396
- * Só compila: devolve o SQL e os parâmetros em `result.devtools.debug`, sem executar (o devtools
397
- * usa para mostrar o SQL de uma consulta que deu erro).
398
- */
399
- compile?: boolean;
400
- /** Devolve o `EXPLAIN` da consulta em vez das linhas. */
401
- explain?: boolean;
402
- /** Mede a agregação de cada fato usada pela consulta, isoladamente. */
403
- profile?: boolean;
404
- /** Tabelas e colunas do banco (`information_schema`), para o autocomplete do editor. */
405
- schema?: boolean;
406
- /** Colunas de cada tabela (uma linha de cada), para o diagrama do modelo. */
407
- columns?: boolean;
408
- /** Executa cada pedaço do modelo (`devtools.model` ou o registrado) contra o banco. */
409
- validate?: boolean;
410
- /** Grava o rascunho no arquivo do modelo (`preview` só devolve o conteúdo novo). */
411
- save?: 'preview' | 'write';
412
- /** Grava o layout de gráficos em `<layoutsDir>/<id>.json` (`preview` só devolve o conteúdo novo). */
413
- saveLayout?: {
414
- layout: ChartsLayout;
415
- mode: 'preview' | 'write';
416
- };
417
- /** Grava o resultado da consulta (modelo registrado) como snapshot de regressão. */
418
- snapshot?: {
419
- name: string;
420
- overwrite?: boolean;
421
- };
422
- /** Lista os snapshots salvos deste modelo. */
423
- snapshots?: boolean;
424
- };
425
- type DashboardQuery = {
426
- model: string;
427
- /** Dimensões agrupadas (viram GROUP BY). */
428
- dimensions?: string[];
429
- /** Medidas calculadas para cada grupo. */
430
- measures?: string[];
431
- filters?: DashboardFilters;
432
- /** Devolve só os metadados do modelo (rótulos, descrições, formatos; sem SQL) em `result.meta`. */
433
- meta?: boolean;
434
- devtools?: DashboardDevtoolsRequest;
435
- };
436
- type DashboardRow = Record<string, string | number | null>;
437
- type DashboardQueryDebug = {
438
- sql: string;
439
- params: (string | number)[];
440
- /** Tempo da execução no banco (num cache hit, o da execução original). */
441
- durationMs: number;
442
- cached: boolean;
443
- /** A consulta rodou contra o rascunho do devtools, não contra o modelo registrado. */
444
- draft: boolean;
445
- };
446
- type ProfileStep = {
447
- /** `fato:<tabela>` ou `consulta` (a consulta inteira). */
448
- name: string;
449
- durationMs: number;
450
- /** Linhas da agregação da fato (grupos) com os filtros aplicados. */
451
- rows: number | null;
452
- };
453
- type SchemaTable = {
454
- name: string;
455
- type: 'table' | 'view';
456
- columns: {
457
- name: string;
458
- type: string;
459
- }[];
460
- };
461
- /** Colunas devolvidas por cada pedaço do modelo (vazio quando não veio nenhuma linha). */
462
- type ModelColumns = {
463
- /** Colunas de cada tabela. */
464
- tables: Record<string, string[]>;
465
- /** `tabela.coluna` com valor numérico na linha lida. */
466
- numeric: string[];
467
- };
468
- type ModelValidation = {
469
- /**
470
- * Erro do banco por pedaço: `table:<nome>`, `relationship:<índice>`, `dimension:<nome>`,
471
- * `measure:<nome>`.
472
- */
473
- errors: Record<string, string>;
474
- warnings: Record<string, string>;
475
- columns: ModelColumns;
476
- };
477
- type SaveModelResult = {
478
- path: string;
479
- previous: string;
480
- content: string;
481
- written: boolean;
482
- warnings: string[];
483
- };
484
- type DashboardSnapshot = {
485
- name: string;
486
- createdAt: string;
487
- query: Omit<DashboardQuery, 'devtools' | 'meta'>;
488
- rows: DashboardRow[];
489
- };
490
- type DevtoolsCapabilities = {
491
- /** O endpoint sabe onde ficam os arquivos dos modelos (`modelsDir`). */
492
- saveModel: boolean;
493
- /** O endpoint sabe onde gravar snapshots (`snapshotsDir`). */
494
- snapshots: boolean;
495
- /** O endpoint sabe onde ficam os arquivos de layout de gráficos (`layoutsDir`). */
496
- saveLayout: boolean;
497
- /** Tipos de gráfico do app que o endpoint conhece (`chartTypes`): só esses ele aceita salvar. */
498
- chartTypes: string[];
499
- };
500
- type DashboardResult = {
501
- rows: DashboardRow[];
502
- meta?: ModelMeta;
503
- devtools?: {
504
- model?: ModelDef;
505
- capabilities?: DevtoolsCapabilities;
506
- debug?: DashboardQueryDebug;
507
- explain?: DashboardRow[];
508
- profile?: ProfileStep[];
509
- schema?: SchemaTable[];
510
- validation?: ModelValidation;
511
- columns?: ModelColumns;
512
- /** Pedaços que o banco recusou ao ler as colunas (mesmas chaves da validação). */
513
- columnErrors?: Record<string, string>;
514
- save?: SaveModelResult;
515
- snapshot?: {
516
- path: string;
517
- };
518
- snapshots?: DashboardSnapshot[];
519
- };
520
- };
521
- //#endregion
522
- export { FilterDef as A, FormulaMeasure as B, ChartTypeSpec as C, CustomChartDef as D, ComboChartDef as E, validateLayout as F, RatioMeasure as G, MeasureMeta as H, AggregateMeasure as I, TableDef as J, RelationshipDef as K, Aggregation as L, TableChartDef as M, layoutModelWarnings as N, DonutChartDef as O, resolveChartTypes as P, DimensionDef as R, ChartType as S, ChartsLayout as T, ModelDef as U, MeasureDef as V, ModelMeta as W, modelMeta as X, ValueFormat as Y, validateModel as Z, CanvasDef as _, DashboardResult as a, ChartDef as b, DevtoolsCapabilities as c, ModelValidation as d, ProfileStep as f, BuiltinChartDef as g, BarChartDef as h, DashboardQueryDebug as i, KpiChartDef as j, FieldSpec as k, FilterValue as l, SchemaTable as m, DashboardFilters as n, DashboardRow as o, SaveModelResult as p, SumMeasure as q, DashboardQuery as r, DashboardSnapshot as s, DashboardDevtoolsRequest as t, ModelColumns as u, CardStyle as v, ChartTypes as w, ChartNumberFormat as x, CardsStyle as y, FieldMeta as z };
523
- //# sourceMappingURL=types-HXAn-3I1.d.ts.map
608
+ export { modelMeta as $, DashboardRow as A, Aggregation as B, ColumnVerticalAlign as C, DashboardQuery as D, DashboardFilters as E, ModelValidation as F, MeasureMeta as G, FieldMeta as H, ProfileStep as I, RatioMeasure as J, ModelDef as K, SaveModelResult as L, DevtoolsCapabilities as M, FilterValue as N, DashboardQueryDebug as O, ModelColumns as P, ValueFormat as Q, SchemaTable as R, ColumnAlign as S, DashboardDevtoolsRequest as T, FormulaMeasure as U, DimensionDef as V, MeasureDef as W, SumMeasure as X, RelationshipDef as Y, TableDef as Z, KpiChartDef as _, CardsStyle as a, resolveChartTypes as b, ChartType as c, ChartsLayout as d, validateModel as et, ComboChartDef as f, FilterDef as g, FieldSpec as h, CardStyle as i, DashboardSnapshot as j, DashboardResult as k, ChartTypeSpec as l, DonutChartDef as m, BuiltinChartDef as n, ChartDef as o, CustomChartDef as p, ModelMeta as q, CanvasDef as r, ChartNumberFormat as s, BarChartDef as t, ChartTypes as u, TableChartDef as v, FormatRule as w, validateLayout as x, layoutModelWarnings as y, AggregateMeasure as z };
609
+ //# sourceMappingURL=layout-B7eYgNyR.d.ts.map