UNPKG

iagate-querykit

Version:

QueryKit: lightweight TypeScript query toolkit with models, views, triggers, events, scheduler and adapters (better-sqlite3).

207 lines (206 loc) 6.52 kB
import { QueryKitConfig } from './config'; /** * Gerenciador de simulação para o QueryKit. * Permite executar queries em dados simulados sem afetar o banco real. * Implementa o padrão Singleton para acesso global. * * @example * ```typescript * // Dados iniciais * const simulationManager = SimulationManager.getInstance(); * const mockData = { * users: [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }], * products: [{ id: 1, name: 'Product A', price: 100 }] * }; * * // Como usar * await simulationManager.start(mockData); * const users = simulationManager.getStateFor('users'); * * // Output: Simulação ativa com dados mock carregados * ``` */ class SimulationManager { static instance; active = false; virtualState = new Map(); constructor() { } /** * Obtém a instância única do SimulationManager (Singleton). * Cria uma nova instância se não existir. * * @returns Instância única do SimulationManager * * @example * ```typescript * // Dados iniciais * // Nenhum - método estático * * // Como usar * const manager = SimulationManager.getInstance(); * * // Output: Instância única do gerenciador de simulação * ``` */ static getInstance() { if (!SimulationManager.instance) { SimulationManager.instance = new SimulationManager(); } return SimulationManager.instance; } /** * Verifica se a simulação está ativa. * Prioriza configuração global se disponível. * * @returns true se a simulação estiver ativa, false caso contrário * * @example * ```typescript * // Dados iniciais * const simulationManager = SimulationManager.getInstance(); * * // Como usar * const isActive = simulationManager.isActive(); * * // Output: true se simulação estiver ativa * ``` */ isActive() { return QueryKitConfig.simulation?.isActive() ?? this.active; } /** * Inicia a simulação com estado inicial. * Aceita dados diretos ou QueryBuilders para carregar dados do banco. * * @param initialState - Estado inicial das tabelas (dados ou queries) * @returns Promise que resolve quando a simulação for iniciada * * @example * ```typescript * // Dados iniciais * const simulationManager = SimulationManager.getInstance(); * const initialState = { * users: [{ id: 1, name: 'John' }], * products: table('products').select('*').where('active', true) * }; * * // Como usar * await simulationManager.start(initialState); * * // Output: Simulação iniciada com dados mock e dados do banco * ``` */ async start(initialState) { if (QueryKitConfig.simulation) return QueryKitConfig.simulation.start(initialState); this.active = true; this.virtualState.clear(); for (const key in initialState) { const value = initialState[key]; if (Array.isArray(value)) { this.virtualState.set(key, JSON.parse(JSON.stringify(value))); } else { const { sql, bindings } = value.toSql(); const exec = QueryKitConfig.defaultExecutor; if (!exec) { this.virtualState.set(key, []); continue; } const result = await exec.executeQuery(sql, bindings); const data = result.data; this.virtualState.set(key, data); } } } /** * Para a simulação e limpa o estado virtual. * Restaura o comportamento normal do banco de dados. * * @example * ```typescript * // Dados iniciais * const simulationManager = SimulationManager.getInstance(); * await simulationManager.start({ users: [] }); * * // Como usar * simulationManager.stop(); * * // Output: Simulação parada e estado virtual limpo * ``` */ stop() { if (QueryKitConfig.simulation) { QueryKitConfig.simulation.stop(); } this.active = false; this.virtualState.clear(); } /** * Obtém o estado atual de uma tabela na simulação. * Retorna dados simulados se disponíveis. * * @param tableName - Nome da tabela para obter estado * @returns Array com dados da tabela ou undefined se não existir * * @example * ```typescript * // Dados iniciais * const simulationManager = SimulationManager.getInstance(); * await simulationManager.start({ users: [{ id: 1, name: 'John' }] }); * * // Como usar * const users = simulationManager.getStateFor('users'); * * // Output: [{ id: 1, name: 'John' }] * ``` */ getStateFor(tableName) { if (QueryKitConfig.simulation) return QueryKitConfig.simulation.getStateFor(tableName); return this.virtualState.get(tableName); } /** * Atualiza o estado de uma tabela na simulação. * Só funciona se a simulação estiver ativa. * * @param tableName - Nome da tabela para atualizar * @param data - Novos dados para a tabela * * @example * ```typescript * // Dados iniciais * const simulationManager = SimulationManager.getInstance(); * await simulationManager.start({ users: [] }); * * // Como usar * simulationManager.updateStateFor('users', [{ id: 1, name: 'New User' }]); * * // Output: Estado da tabela 'users' atualizado na simulação * ``` */ updateStateFor(tableName, data) { if (this.isActive()) { if (QueryKitConfig.simulation) return QueryKitConfig.simulation.updateStateFor(tableName, data); this.virtualState.set(tableName, data); } } } /** * Instância global do SimulationManager para uso em todo o QueryKit. * Permite ativar/desativar simulação de forma centralizada. * * @example * ```typescript * // Dados iniciais * import { simulationManager } from './simulation-manager'; * * // Como usar * await simulationManager.start({ users: [{ id: 1, name: 'Test User' }] }); * const isSimulating = simulationManager.isActive(); * * // Output: Simulação ativa com dados de teste * ``` */ export const simulationManager = SimulationManager.getInstance();