UNPKG

drizzle-cube

Version:

Drizzle ORM-first semantic layer with Cube.js compatibility. Type-safe analytics and dashboards with SQL injection protection.

161 lines (160 loc) 5.36 kB
import { ChartType, ChartAxisConfig, ChartDisplayConfig, CubeQuery, MultiQueryConfig } from '../types'; import { ServerFunnelQuery } from './funnel'; import { ServerFlowQuery } from './flow'; /** * Chart configuration - shared across all analysis types */ export interface ChartConfig { chartType: ChartType; chartConfig: ChartAxisConfig; displayConfig: ChartDisplayConfig; } /** * Analysis type discriminator * Future modes: 'retention', 'cohort' */ export type AnalysisType = 'query' | 'funnel' | 'flow'; /** * Base config - common to all analysis types */ interface AnalysisConfigBase { /** Version number for migration support */ version: 1; /** Which analysis mode this config represents */ analysisType: AnalysisType; /** Whether to show table or chart view */ activeView: 'table' | 'chart'; /** * Per-mode chart configuration map. * Each mode owns its own chart settings, allowing users to configure * different chart types for query mode vs funnel mode. */ charts: { [K in AnalysisType]?: ChartConfig; }; } /** * Query mode config - for single queries and multi-query analysis * * The `query` field is the actual executable query: * - Single query: CubeQuery object * - Multi-query: MultiQueryConfig with queries array and merge strategy */ export interface QueryAnalysisConfig extends AnalysisConfigBase { analysisType: 'query'; /** * The executable query. * - CubeQuery: Single query with measures, dimensions, filters * - MultiQueryConfig: Multiple queries with merge strategy */ query: CubeQuery | MultiQueryConfig; } /** * Funnel mode config - for funnel analysis * * The `query` field is the ServerFunnelQuery which can be sent * directly to the server for execution. */ export interface FunnelAnalysisConfig extends AnalysisConfigBase { analysisType: 'funnel'; /** * Server funnel query - executable as-is. * Contains bindingKey, timeDimension, steps[], and options. */ query: ServerFunnelQuery; } /** * Flow mode config - for bidirectional flow analysis * * The `query` field is the ServerFlowQuery which can be sent * directly to the server for execution. */ export interface FlowAnalysisConfig extends AnalysisConfigBase { analysisType: 'flow'; /** * Server flow query - executable as-is. * Contains bindingKey, timeDimension, eventDimension, startingStep, and depth config. */ query: ServerFlowQuery; } /** * AnalysisConfig - union of all analysis mode configurations */ export type AnalysisConfig = QueryAnalysisConfig | FunnelAnalysisConfig | FlowAnalysisConfig; /** * Check if config is for query mode */ export declare const isQueryConfig: (c: AnalysisConfig) => c is QueryAnalysisConfig; /** * Check if config is for funnel mode */ export declare const isFunnelConfig: (c: AnalysisConfig) => c is FunnelAnalysisConfig; /** * Check if config is for flow mode */ export declare const isFlowConfig: (c: AnalysisConfig) => c is FlowAnalysisConfig; /** * Check if a query config contains multiple queries */ export declare const isMultiQuery: (config: QueryAnalysisConfig) => boolean; /** * Check if a query config contains a single query */ export declare const isSingleQuery: (config: QueryAnalysisConfig) => boolean; /** * Type guard to validate if an unknown value is a valid AnalysisConfig */ export declare const isValidAnalysisConfig: (config: unknown) => config is AnalysisConfig; /** * Create a default empty query analysis config */ export declare const createDefaultQueryConfig: () => QueryAnalysisConfig; /** * Create a default empty funnel analysis config */ export declare const createDefaultFunnelConfig: () => FunnelAnalysisConfig; /** * Create a default empty flow analysis config */ export declare const createDefaultFlowConfig: () => FlowAnalysisConfig; /** * Create a default config for the given analysis type */ export declare const createDefaultConfig: (type?: AnalysisType) => AnalysisConfig; /** * AnalysisWorkspace - Multi-mode persistence format for localStorage * * Unlike AnalysisConfig (which represents a single analysis mode), * AnalysisWorkspace preserves state for ALL modes. This prevents state * loss when switching between query, funnel, and flow modes. * * Usage: * - localStorage persistence → AnalysisWorkspace (preserves all modes) * - Share URLs → AnalysisConfig (shares one specific analysis) * - Dashboard portlets → AnalysisConfig (embeds one specific analysis) */ export interface AnalysisWorkspace { /** Version number for migration support */ version: 1; /** Currently active analysis type */ activeType: AnalysisType; /** * Per-mode configurations. * Each mode stores its complete AnalysisConfig independently. * Charts are duplicated per-mode but merged on load. */ modes: { query?: QueryAnalysisConfig; funnel?: FunnelAnalysisConfig; flow?: FlowAnalysisConfig; }; } /** * Type guard to validate if an unknown value is a valid AnalysisWorkspace */ export declare const isValidAnalysisWorkspace: (data: unknown) => data is AnalysisWorkspace; /** * Create a default empty workspace with all modes initialized */ export declare const createDefaultWorkspace: () => AnalysisWorkspace; export {};