@equallyze/wally-cypress 0.0.2 → 0.0.4

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.
package/README.md CHANGED
@@ -345,6 +345,7 @@ O plugin finaliza automaticamente no hook `after:run`. Verifique se:
345
345
  Este software é de propriedade exclusiva da Equallyze. Todos os direitos reservados.
346
346
 
347
347
  O uso deste pacote está restrito a:
348
+
348
349
  - ✅ Clientes com licença ativa da plataforma Wally
349
350
  - ✅ Projetos autorizados pela Equallyze
350
351
  - ❌ Uso comercial não autorizado é proibido
package/dist/index.js CHANGED
@@ -4,8 +4,8 @@ var zlib = require('zlib');
4
4
 
5
5
  // src/api-client.ts
6
6
  var ENVIRONMENTS = {
7
- production: "https://api.wally.equallyze.com/backend/services/v0.0.1",
8
- staging: "https://api.stg.wally.equallyze.com/backend/services/v0.0.1",
7
+ production: "https://acessibilidade.global/backend/services/v0.0.1",
8
+ staging: "https://stg.acessibilidade.global/backend/services/v0.0.1",
9
9
  development: "http://localhost:3000/backend/services/v0.0.1"
10
10
  };
11
11
  var WallyApiClient = class _WallyApiClient {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-client.ts","../src/plugin.ts","../src/support.ts"],"names":["gzipSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * API Client para comunicação com o backend Wally\n *\n * Segue o mesmo padrão do wally-chrome (SessionApi)\n */\n\nimport { gzipSync } from 'zlib';\nimport type {\n AddPageResponse,\n CreateSessionResponse,\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallySession,\n} from './types';\n\n/**\n * URLs base por ambiente\n */\nconst ENVIRONMENTS = {\n production: 'https://api.wally.equallyze.com/backend/services/v0.0.1',\n staging: 'https://api.stg.wally.equallyze.com/backend/services/v0.0.1',\n development: 'http://localhost:3000/backend/services/v0.0.1',\n} as const;\n\n/**\n * Cliente HTTP para API Wally\n */\nexport class WallyApiClient {\n private config: ResolvedConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n /**\n * Resolve a configuração, extraindo organizationId da API Key\n */\n static async resolveConfig(config: WallyConfig): Promise<ResolvedConfig> {\n // Determina URL base\n const apiUrl = config.apiUrl || ENVIRONMENTS[config.environment || 'production'];\n\n // Valida API Key e extrai organizationId\n const orgId = await WallyApiClient.validateApiKey(apiUrl, config.apiKey);\n\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n normId: config.normId,\n qualityGateId: config.qualityGateId,\n environment: config.environment || 'production',\n apiUrl,\n timeout: config.timeout ?? 30000,\n failOnError: config.failOnError ?? false,\n organizationId: orgId,\n };\n }\n\n /**\n * Valida a API Key e retorna o organizationId\n */\n private static async validateApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const response = await fetch(`${apiUrl}/_/auth/api-key/info`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Falha ao validar API Key: ${response.status} - ${errorText}`);\n }\n\n const data = (await response.json()) as { organizationId?: string };\n\n if (!data.organizationId) {\n throw new Error('API Key inválida: organizationId não encontrado na resposta');\n }\n\n return data.organizationId;\n }\n\n /**\n * Cria uma nova sessão de navegação\n */\n async createSession(\n options: {\n name?: string;\n description?: string;\n baseUrl?: string;\n } = {},\n ): Promise<CreateSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions`;\n\n const body = {\n projectId: this.config.projectId,\n normId: this.config.normId,\n qualityGateId: this.config.qualityGateId,\n source: 'cypress',\n name: options.name || `Cypress Session - ${new Date().toLocaleString('pt-BR')}`,\n description: options.description,\n baseUrl: options.baseUrl,\n metadata: {\n cypressVersion: typeof Cypress !== 'undefined' ? Cypress.version : 'unknown',\n nodeVersion: process.version,\n platform: process.platform,\n },\n };\n\n const response = await this.request<CreateSessionResponse>('POST', endpoint, body);\n return response;\n }\n\n /**\n * Adiciona uma página à sessão usando upload binário comprimido (gzip)\n */\n async addPageBinary(\n sessionId: string,\n pageData: { url: string; title: string; html: string },\n ): Promise<AddPageResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/pages/binary`;\n\n // Comprime o HTML com gzip\n const htmlBuffer = Buffer.from(pageData.html, 'utf-8');\n const compressedBuffer = gzipSync(htmlBuffer);\n\n const timestamp = new Date().toISOString();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/gzip',\n 'X-Page-Url': pageData.url,\n 'X-Page-Title': encodeURIComponent(pageData.title),\n 'X-Page-Timestamp': timestamp,\n },\n body: compressedBuffer,\n signal: AbortSignal.timeout(this.config.timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Erro ao enviar página: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<AddPageResponse>;\n }\n\n /**\n * Finaliza a sessão e opcionalmente inicia análise\n */\n async finishSession(sessionId: string): Promise<FinishSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/finish`;\n\n return this.request<FinishSessionResponse>('POST', endpoint, {\n startAnalysis: true,\n });\n }\n\n /**\n * Obtém detalhes de uma sessão\n */\n async getSession(sessionId: string): Promise<WallySession> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}`;\n return this.request<WallySession>('GET', endpoint);\n }\n\n /**\n * Executa uma requisição HTTP genérica\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n body?: unknown,\n ): Promise<T> {\n const options: RequestInit = {\n method,\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(this.config.timeout),\n };\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorData.error || `Erro ${response.status}`;\n } catch {\n errorMessage = `Erro ${response.status}: ${response.statusText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * Plugin Cypress para integração com Wally\n *\n * Este módulo é executado no Node.js (setupNodeEvents) e gerencia:\n * - Sessão de navegação\n * - Comunicação com API Wally\n * - Ciclo de vida dos testes\n *\n * @example\n * // cypress.config.ts\n * import { wallyPlugin } from '@equallyze/wally-cypress/plugin';\n *\n * export default defineConfig({\n * e2e: {\n * setupNodeEvents(on, config) {\n * wallyPlugin(on, config, {\n * apiKey: process.env.WALLY_API_KEY,\n * projectId: process.env.WALLY_PROJECT_ID,\n * });\n * return config;\n * },\n * },\n * });\n */\n\nimport { WallyApiClient } from './api-client';\nimport type {\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallyPage,\n WallyPluginState,\n WallySession,\n} from './types';\n\n/**\n * Estado global do plugin\n */\nconst state: WallyPluginState = {\n config: null,\n session: null,\n initialized: false,\n lastError: null,\n};\n\n/**\n * Cliente API (inicializado no before:run)\n */\nlet apiClient: WallyApiClient | null = null;\n\n/**\n * Logger\n */\nfunction log(message: string, ...args: unknown[]) {\n console.log(`[Wally] ${message}`, ...args);\n}\n\nfunction logError(message: string, error?: Error) {\n console.error(`[Wally] ❌ ${message}`, error?.message || '');\n state.lastError = error?.message || message;\n}\n\n/**\n * Inicializa o plugin Wally\n */\nasync function initialize(config: WallyConfig): Promise<boolean> {\n try {\n log('🚀 Inicializando plugin...');\n\n // Valida configuração obrigatória\n if (!config.apiKey) {\n throw new Error('apiKey é obrigatório');\n }\n if (!config.projectId) {\n throw new Error('projectId é obrigatório');\n }\n\n // Resolve configuração (valida API Key e obtém organizationId)\n const resolvedConfig = await WallyApiClient.resolveConfig(config);\n state.config = resolvedConfig;\n\n // Cria cliente API\n apiClient = new WallyApiClient(resolvedConfig);\n\n state.initialized = true;\n log('✅ Plugin inicializado', {\n organizationId: resolvedConfig.organizationId,\n projectId: resolvedConfig.projectId,\n environment: resolvedConfig.environment,\n });\n\n return true;\n } catch (error) {\n logError('Falha ao inicializar plugin', error as Error);\n state.initialized = false;\n return false;\n }\n}\n\n/**\n * Inicia uma nova sessão de navegação\n */\nasync function startSession(baseUrl?: string): Promise<WallySession | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (state.session) {\n log('⚠️ Sessão já ativa, reutilizando:', state.session.id);\n return state.session;\n }\n\n try {\n log('🎬 Criando sessão de navegação...');\n\n const response = await apiClient.createSession({\n name: `Cypress - ${new Date().toLocaleString('pt-BR')}`,\n description: 'Sessão automática via wally-cypress',\n baseUrl,\n });\n\n state.session = {\n id: response.id,\n organizationId: state.config?.organizationId || '',\n status: 'ACTIVE',\n startedAt: new Date(),\n pages: [],\n };\n\n log('✅ Sessão criada:', state.session.id);\n return state.session;\n } catch (error) {\n logError('Falha ao criar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Captura uma página e envia para o backend\n */\nasync function capturePage(pageName: string, url: string, html: string): Promise<WallyPage | null> {\n if (!state.initialized || !apiClient || !state.session) {\n logError('Plugin não inicializado ou sessão não ativa');\n return null;\n }\n\n try {\n log(`📄 Capturando página: \"${pageName}\" (${url})`);\n\n const response = await apiClient.addPageBinary(state.session.id, {\n url,\n title: pageName,\n html,\n });\n\n const page: WallyPage = {\n id: response.pageId,\n url,\n title: pageName,\n timestamp: new Date(),\n contentSize: response.totalSize,\n };\n\n state.session.pages.push(page);\n\n log(`✅ Página capturada: ${pageName} (${response.totalPages} total)`);\n return page;\n } catch (error) {\n logError(`Falha ao capturar página: ${pageName}`, error as Error);\n return null;\n }\n}\n\n/**\n * Finaliza a sessão e inicia análise\n */\nasync function finishSession(): Promise<FinishSessionResponse | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (!state.session) {\n log('⚠️ Nenhuma sessão ativa para finalizar');\n return null;\n }\n\n try {\n log('🏁 Finalizando sessão...');\n\n const response = await apiClient.finishSession(state.session.id);\n\n log('✅ Sessão finalizada:', {\n sessionId: response.sessionId,\n totalPages: response.totalPages,\n analysisId: response.analysisId,\n });\n\n // Limpa estado\n const result = response;\n state.session = null;\n\n return result;\n } catch (error) {\n logError('Falha ao finalizar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Obtém o estado atual da sessão\n */\nfunction getSession(): WallySession | null {\n return state.session;\n}\n\n/**\n * Obtém configuração atual\n */\nfunction getConfig(): ResolvedConfig | null {\n return state.config;\n}\n\n/**\n * Plugin principal para Cypress\n *\n * @param on - Objeto de eventos Cypress\n * @param config - Configuração Cypress\n * @param wallyConfig - Configuração do plugin Wally\n */\nexport function wallyPlugin(\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n wallyConfig: WallyConfig,\n): void {\n // Registra tasks para comunicação com os comandos\n on('task', {\n /**\n * Inicializa o plugin (chamado automaticamente no before:run)\n */\n 'wally:initialize': async () => {\n const success = await initialize(wallyConfig);\n return success;\n },\n\n /**\n * Inicia uma nova sessão de navegação\n */\n 'wally:startSession': async (baseUrl?: string) => {\n const session = await startSession(baseUrl);\n return session;\n },\n\n /**\n * Captura uma página\n */\n 'wally:capturePage': async (args: { pageName: string; url: string; html: string }) => {\n const page = await capturePage(args.pageName, args.url, args.html);\n return page;\n },\n\n /**\n * Finaliza a sessão\n */\n 'wally:finishSession': async () => {\n const result = await finishSession();\n return result;\n },\n\n /**\n * Obtém a sessão atual\n */\n 'wally:getSession': () => {\n return getSession();\n },\n\n /**\n * Obtém configuração atual\n */\n 'wally:getConfig': () => {\n return getConfig();\n },\n\n /**\n * Obtém último erro\n */\n 'wally:getLastError': () => {\n return state.lastError;\n },\n });\n\n // Hook: antes de iniciar os testes\n on('before:run', async () => {\n log('📦 Hook before:run - Inicializando Wally...');\n await initialize(wallyConfig);\n });\n\n // Hook: após finalizar os testes\n on('after:run', async () => {\n log('📦 Hook after:run - Finalizando Wally...');\n if (state.session) {\n await finishSession();\n }\n });\n\n // Hook: antes de cada spec\n on('before:spec', async (spec) => {\n log(`📋 Hook before:spec - ${spec.relative}`);\n\n // Garante que plugin está inicializado\n if (!state.initialized) {\n await initialize(wallyConfig);\n }\n\n // Inicia sessão para esta spec (se não houver sessão ativa)\n if (!state.session) {\n await startSession(config.baseUrl || undefined);\n }\n });\n\n // Hook: após cada spec (opcional: pode manter sessão entre specs)\n on('after:spec', async (spec, results) => {\n log(`📋 Hook after:spec - ${spec.relative}`, {\n tests: results.stats.tests,\n passed: results.stats.passes,\n failed: results.stats.failures,\n });\n\n // Nota: Não finalizamos aqui para permitir múltiplas specs na mesma sessão\n // A sessão será finalizada no after:run\n });\n}\n\n// Export adicional para uso direto\nexport { capturePage, finishSession, getConfig, getSession, initialize, startSession };\n","/**\n * Comandos customizados Cypress para Wally\n *\n * Este módulo adiciona o comando:\n * - cy.accessibility(pageName) - Captura página atual para análise\n *\n * A sessão é iniciada automaticamente no hook `before:run` e\n * finalizada automaticamente no hook `after:run` pelo plugin.\n *\n * @example\n * // cypress/support/e2e.ts\n * import '@equallyze/wally-cypress/support';\n *\n * // Em seus testes\n * describe('Teste de Acessibilidade', () => {\n * it('deve ser acessível', () => {\n * cy.visit('/');\n * cy.accessibility('Homepage');\n * });\n * });\n */\n\nimport type { WallyPage } from './types';\n\n/**\n * Registra os comandos customizados do Wally no Cypress\n */\nexport function registerWallyCommands(): void {\n /**\n * Comando principal: cy.accessibility(pageName)\n *\n * Captura a página atual e envia para análise de acessibilidade no Wally\n */\n Cypress.Commands.add('accessibility', (pageName: string): Cypress.Chainable<WallyPage | null> => {\n // Garante que temos uma sessão ativa\n return cy.task('wally:getSession', null, { log: false }).then((session) => {\n if (!session) {\n // Inicia sessão automaticamente se não existir\n return cy.task('wally:startSession', Cypress.config('baseUrl'), { log: false }).then(() => {\n return captureAndSend(pageName);\n });\n }\n return captureAndSend(pageName);\n });\n });\n\n /**\n * Helper para capturar e enviar página\n */\n function captureAndSend(pageName: string): Cypress.Chainable<WallyPage | null> {\n return cy.url().then((url) => {\n return cy.document().then((doc) => {\n // Captura HTML completo (executado no contexto do browser)\n const doctype = doc.doctype\n ? `<!DOCTYPE ${doc.doctype.name}${doc.doctype.publicId ? ` PUBLIC \"${doc.doctype.publicId}\"` : ''}${doc.doctype.systemId ? ` \"${doc.doctype.systemId}\"` : ''}>`\n : '<!DOCTYPE html>';\n\n const html = `${doctype}\\n${doc.documentElement.outerHTML}`;\n\n // Log customizado no Cypress\n Cypress.log({\n name: 'accessibility',\n displayName: '♿ A11Y',\n message: pageName,\n consoleProps: () => ({\n 'Page Name': pageName,\n URL: url,\n 'HTML Size': `${Math.round(html.length / 1024)} KB`,\n }),\n });\n\n // Envia para o plugin via task\n return cy\n .task<WallyPage | null>('wally:capturePage', { pageName, url, html }, { log: false })\n .then((page) => {\n if (!page) {\n cy.log('⚠️ Wally: Falha ao capturar página');\n }\n return page;\n });\n });\n }) as unknown as Cypress.Chainable<WallyPage | null>;\n }\n}\n\n// Auto-registra os comandos quando o módulo é importado\nregisterWallyCommands();\n"]}
1
+ {"version":3,"sources":["../src/api-client.ts","../src/plugin.ts","../src/support.ts"],"names":["gzipSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * API Client para comunicação com o backend Wally\n *\n * Segue o mesmo padrão do wally-chrome (SessionApi)\n */\n\nimport { gzipSync } from 'zlib';\nimport type {\n AddPageResponse,\n CreateSessionResponse,\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallySession,\n} from './types';\n\n/**\n * URLs base por ambiente\n */\nconst ENVIRONMENTS = {\n production: 'https://acessibilidade.global/backend/services/v0.0.1',\n staging: 'https://stg.acessibilidade.global/backend/services/v0.0.1',\n development: 'http://localhost:3000/backend/services/v0.0.1',\n} as const;\n\n/**\n * Cliente HTTP para API Wally\n */\nexport class WallyApiClient {\n private config: ResolvedConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n /**\n * Resolve a configuração, extraindo organizationId da API Key\n */\n static async resolveConfig(config: WallyConfig): Promise<ResolvedConfig> {\n // Determina URL base\n const apiUrl = config.apiUrl || ENVIRONMENTS[config.environment || 'production'];\n\n // Valida API Key e extrai organizationId\n const orgId = await WallyApiClient.validateApiKey(apiUrl, config.apiKey);\n\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n normId: config.normId,\n qualityGateId: config.qualityGateId,\n environment: config.environment || 'production',\n apiUrl,\n timeout: config.timeout ?? 30000,\n failOnError: config.failOnError ?? false,\n organizationId: orgId,\n };\n }\n\n /**\n * Valida a API Key e retorna o organizationId\n */\n private static async validateApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const response = await fetch(`${apiUrl}/_/auth/api-key/info`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Falha ao validar API Key: ${response.status} - ${errorText}`);\n }\n\n const data = (await response.json()) as { organizationId?: string };\n\n if (!data.organizationId) {\n throw new Error('API Key inválida: organizationId não encontrado na resposta');\n }\n\n return data.organizationId;\n }\n\n /**\n * Cria uma nova sessão de navegação\n */\n async createSession(\n options: {\n name?: string;\n description?: string;\n baseUrl?: string;\n } = {},\n ): Promise<CreateSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions`;\n\n const body = {\n projectId: this.config.projectId,\n normId: this.config.normId,\n qualityGateId: this.config.qualityGateId,\n source: 'cypress',\n name: options.name || `Cypress Session - ${new Date().toLocaleString('pt-BR')}`,\n description: options.description,\n baseUrl: options.baseUrl,\n metadata: {\n cypressVersion: typeof Cypress !== 'undefined' ? Cypress.version : 'unknown',\n nodeVersion: process.version,\n platform: process.platform,\n },\n };\n\n const response = await this.request<CreateSessionResponse>('POST', endpoint, body);\n return response;\n }\n\n /**\n * Adiciona uma página à sessão usando upload binário comprimido (gzip)\n */\n async addPageBinary(\n sessionId: string,\n pageData: { url: string; title: string; html: string },\n ): Promise<AddPageResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/pages/binary`;\n\n // Comprime o HTML com gzip\n const htmlBuffer = Buffer.from(pageData.html, 'utf-8');\n const compressedBuffer = gzipSync(htmlBuffer);\n\n const timestamp = new Date().toISOString();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/gzip',\n 'X-Page-Url': pageData.url,\n 'X-Page-Title': encodeURIComponent(pageData.title),\n 'X-Page-Timestamp': timestamp,\n },\n body: compressedBuffer,\n signal: AbortSignal.timeout(this.config.timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Erro ao enviar página: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<AddPageResponse>;\n }\n\n /**\n * Finaliza a sessão e opcionalmente inicia análise\n */\n async finishSession(sessionId: string): Promise<FinishSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/finish`;\n\n return this.request<FinishSessionResponse>('POST', endpoint, {\n startAnalysis: true,\n });\n }\n\n /**\n * Obtém detalhes de uma sessão\n */\n async getSession(sessionId: string): Promise<WallySession> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}`;\n return this.request<WallySession>('GET', endpoint);\n }\n\n /**\n * Executa uma requisição HTTP genérica\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n body?: unknown,\n ): Promise<T> {\n const options: RequestInit = {\n method,\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(this.config.timeout),\n };\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorData.error || `Erro ${response.status}`;\n } catch {\n errorMessage = `Erro ${response.status}: ${response.statusText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * Plugin Cypress para integração com Wally\n *\n * Este módulo é executado no Node.js (setupNodeEvents) e gerencia:\n * - Sessão de navegação\n * - Comunicação com API Wally\n * - Ciclo de vida dos testes\n *\n * @example\n * // cypress.config.ts\n * import { wallyPlugin } from '@equallyze/wally-cypress/plugin';\n *\n * export default defineConfig({\n * e2e: {\n * setupNodeEvents(on, config) {\n * wallyPlugin(on, config, {\n * apiKey: process.env.WALLY_API_KEY,\n * projectId: process.env.WALLY_PROJECT_ID,\n * });\n * return config;\n * },\n * },\n * });\n */\n\nimport { WallyApiClient } from './api-client';\nimport type {\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallyPage,\n WallyPluginState,\n WallySession,\n} from './types';\n\n/**\n * Estado global do plugin\n */\nconst state: WallyPluginState = {\n config: null,\n session: null,\n initialized: false,\n lastError: null,\n};\n\n/**\n * Cliente API (inicializado no before:run)\n */\nlet apiClient: WallyApiClient | null = null;\n\n/**\n * Logger\n */\nfunction log(message: string, ...args: unknown[]) {\n console.log(`[Wally] ${message}`, ...args);\n}\n\nfunction logError(message: string, error?: Error) {\n console.error(`[Wally] ❌ ${message}`, error?.message || '');\n state.lastError = error?.message || message;\n}\n\n/**\n * Inicializa o plugin Wally\n */\nasync function initialize(config: WallyConfig): Promise<boolean> {\n try {\n log('🚀 Inicializando plugin...');\n\n // Valida configuração obrigatória\n if (!config.apiKey) {\n throw new Error('apiKey é obrigatório');\n }\n if (!config.projectId) {\n throw new Error('projectId é obrigatório');\n }\n\n // Resolve configuração (valida API Key e obtém organizationId)\n const resolvedConfig = await WallyApiClient.resolveConfig(config);\n state.config = resolvedConfig;\n\n // Cria cliente API\n apiClient = new WallyApiClient(resolvedConfig);\n\n state.initialized = true;\n log('✅ Plugin inicializado', {\n organizationId: resolvedConfig.organizationId,\n projectId: resolvedConfig.projectId,\n environment: resolvedConfig.environment,\n });\n\n return true;\n } catch (error) {\n logError('Falha ao inicializar plugin', error as Error);\n state.initialized = false;\n return false;\n }\n}\n\n/**\n * Inicia uma nova sessão de navegação\n */\nasync function startSession(baseUrl?: string): Promise<WallySession | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (state.session) {\n log('⚠️ Sessão já ativa, reutilizando:', state.session.id);\n return state.session;\n }\n\n try {\n log('🎬 Criando sessão de navegação...');\n\n const response = await apiClient.createSession({\n name: `Cypress - ${new Date().toLocaleString('pt-BR')}`,\n description: 'Sessão automática via wally-cypress',\n baseUrl,\n });\n\n state.session = {\n id: response.id,\n organizationId: state.config?.organizationId || '',\n status: 'ACTIVE',\n startedAt: new Date(),\n pages: [],\n };\n\n log('✅ Sessão criada:', state.session.id);\n return state.session;\n } catch (error) {\n logError('Falha ao criar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Captura uma página e envia para o backend\n */\nasync function capturePage(pageName: string, url: string, html: string): Promise<WallyPage | null> {\n if (!state.initialized || !apiClient || !state.session) {\n logError('Plugin não inicializado ou sessão não ativa');\n return null;\n }\n\n try {\n log(`📄 Capturando página: \"${pageName}\" (${url})`);\n\n const response = await apiClient.addPageBinary(state.session.id, {\n url,\n title: pageName,\n html,\n });\n\n const page: WallyPage = {\n id: response.pageId,\n url,\n title: pageName,\n timestamp: new Date(),\n contentSize: response.totalSize,\n };\n\n state.session.pages.push(page);\n\n log(`✅ Página capturada: ${pageName} (${response.totalPages} total)`);\n return page;\n } catch (error) {\n logError(`Falha ao capturar página: ${pageName}`, error as Error);\n return null;\n }\n}\n\n/**\n * Finaliza a sessão e inicia análise\n */\nasync function finishSession(): Promise<FinishSessionResponse | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (!state.session) {\n log('⚠️ Nenhuma sessão ativa para finalizar');\n return null;\n }\n\n try {\n log('🏁 Finalizando sessão...');\n\n const response = await apiClient.finishSession(state.session.id);\n\n log('✅ Sessão finalizada:', {\n sessionId: response.sessionId,\n totalPages: response.totalPages,\n analysisId: response.analysisId,\n });\n\n // Limpa estado\n const result = response;\n state.session = null;\n\n return result;\n } catch (error) {\n logError('Falha ao finalizar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Obtém o estado atual da sessão\n */\nfunction getSession(): WallySession | null {\n return state.session;\n}\n\n/**\n * Obtém configuração atual\n */\nfunction getConfig(): ResolvedConfig | null {\n return state.config;\n}\n\n/**\n * Plugin principal para Cypress\n *\n * @param on - Objeto de eventos Cypress\n * @param config - Configuração Cypress\n * @param wallyConfig - Configuração do plugin Wally\n */\nexport function wallyPlugin(\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n wallyConfig: WallyConfig,\n): void {\n // Registra tasks para comunicação com os comandos\n on('task', {\n /**\n * Inicializa o plugin (chamado automaticamente no before:run)\n */\n 'wally:initialize': async () => {\n const success = await initialize(wallyConfig);\n return success;\n },\n\n /**\n * Inicia uma nova sessão de navegação\n */\n 'wally:startSession': async (baseUrl?: string) => {\n const session = await startSession(baseUrl);\n return session;\n },\n\n /**\n * Captura uma página\n */\n 'wally:capturePage': async (args: { pageName: string; url: string; html: string }) => {\n const page = await capturePage(args.pageName, args.url, args.html);\n return page;\n },\n\n /**\n * Finaliza a sessão\n */\n 'wally:finishSession': async () => {\n const result = await finishSession();\n return result;\n },\n\n /**\n * Obtém a sessão atual\n */\n 'wally:getSession': () => {\n return getSession();\n },\n\n /**\n * Obtém configuração atual\n */\n 'wally:getConfig': () => {\n return getConfig();\n },\n\n /**\n * Obtém último erro\n */\n 'wally:getLastError': () => {\n return state.lastError;\n },\n });\n\n // Hook: antes de iniciar os testes\n on('before:run', async () => {\n log('📦 Hook before:run - Inicializando Wally...');\n await initialize(wallyConfig);\n });\n\n // Hook: após finalizar os testes\n on('after:run', async () => {\n log('📦 Hook after:run - Finalizando Wally...');\n if (state.session) {\n await finishSession();\n }\n });\n\n // Hook: antes de cada spec\n on('before:spec', async (spec) => {\n log(`📋 Hook before:spec - ${spec.relative}`);\n\n // Garante que plugin está inicializado\n if (!state.initialized) {\n await initialize(wallyConfig);\n }\n\n // Inicia sessão para esta spec (se não houver sessão ativa)\n if (!state.session) {\n await startSession(config.baseUrl || undefined);\n }\n });\n\n // Hook: após cada spec (opcional: pode manter sessão entre specs)\n on('after:spec', async (spec, results) => {\n log(`📋 Hook after:spec - ${spec.relative}`, {\n tests: results.stats.tests,\n passed: results.stats.passes,\n failed: results.stats.failures,\n });\n\n // Nota: Não finalizamos aqui para permitir múltiplas specs na mesma sessão\n // A sessão será finalizada no after:run\n });\n}\n\n// Export adicional para uso direto\nexport { capturePage, finishSession, getConfig, getSession, initialize, startSession };\n","/**\n * Comandos customizados Cypress para Wally\n *\n * Este módulo adiciona o comando:\n * - cy.accessibility(pageName) - Captura página atual para análise\n *\n * A sessão é iniciada automaticamente no hook `before:run` e\n * finalizada automaticamente no hook `after:run` pelo plugin.\n *\n * @example\n * // cypress/support/e2e.ts\n * import '@equallyze/wally-cypress/support';\n *\n * // Em seus testes\n * describe('Teste de Acessibilidade', () => {\n * it('deve ser acessível', () => {\n * cy.visit('/');\n * cy.accessibility('Homepage');\n * });\n * });\n */\n\nimport type { WallyPage } from './types';\n\n/**\n * Registra os comandos customizados do Wally no Cypress\n */\nexport function registerWallyCommands(): void {\n /**\n * Comando principal: cy.accessibility(pageName)\n *\n * Captura a página atual e envia para análise de acessibilidade no Wally\n */\n Cypress.Commands.add('accessibility', (pageName: string): Cypress.Chainable<WallyPage | null> => {\n // Garante que temos uma sessão ativa\n return cy.task('wally:getSession', null, { log: false }).then((session) => {\n if (!session) {\n // Inicia sessão automaticamente se não existir\n return cy.task('wally:startSession', Cypress.config('baseUrl'), { log: false }).then(() => {\n return captureAndSend(pageName);\n });\n }\n return captureAndSend(pageName);\n });\n });\n\n /**\n * Helper para capturar e enviar página\n */\n function captureAndSend(pageName: string): Cypress.Chainable<WallyPage | null> {\n return cy.url().then((url) => {\n return cy.document().then((doc) => {\n // Captura HTML completo (executado no contexto do browser)\n const doctype = doc.doctype\n ? `<!DOCTYPE ${doc.doctype.name}${doc.doctype.publicId ? ` PUBLIC \"${doc.doctype.publicId}\"` : ''}${doc.doctype.systemId ? ` \"${doc.doctype.systemId}\"` : ''}>`\n : '<!DOCTYPE html>';\n\n const html = `${doctype}\\n${doc.documentElement.outerHTML}`;\n\n // Log customizado no Cypress\n Cypress.log({\n name: 'accessibility',\n displayName: '♿ A11Y',\n message: pageName,\n consoleProps: () => ({\n 'Page Name': pageName,\n URL: url,\n 'HTML Size': `${Math.round(html.length / 1024)} KB`,\n }),\n });\n\n // Envia para o plugin via task\n return cy\n .task<WallyPage | null>('wally:capturePage', { pageName, url, html }, { log: false })\n .then((page) => {\n if (!page) {\n cy.log('⚠️ Wally: Falha ao capturar página');\n }\n return page;\n });\n });\n }) as unknown as Cypress.Chainable<WallyPage | null>;\n }\n}\n\n// Auto-registra os comandos quando o módulo é importado\nregisterWallyCommands();\n"]}
package/dist/index.mjs CHANGED
@@ -2,8 +2,8 @@ import { gzipSync } from 'zlib';
2
2
 
3
3
  // src/api-client.ts
4
4
  var ENVIRONMENTS = {
5
- production: "https://api.wally.equallyze.com/backend/services/v0.0.1",
6
- staging: "https://api.stg.wally.equallyze.com/backend/services/v0.0.1",
5
+ production: "https://acessibilidade.global/backend/services/v0.0.1",
6
+ staging: "https://stg.acessibilidade.global/backend/services/v0.0.1",
7
7
  development: "http://localhost:3000/backend/services/v0.0.1"
8
8
  };
9
9
  var WallyApiClient = class _WallyApiClient {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-client.ts","../src/plugin.ts","../src/support.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * API Client para comunicação com o backend Wally\n *\n * Segue o mesmo padrão do wally-chrome (SessionApi)\n */\n\nimport { gzipSync } from 'zlib';\nimport type {\n AddPageResponse,\n CreateSessionResponse,\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallySession,\n} from './types';\n\n/**\n * URLs base por ambiente\n */\nconst ENVIRONMENTS = {\n production: 'https://api.wally.equallyze.com/backend/services/v0.0.1',\n staging: 'https://api.stg.wally.equallyze.com/backend/services/v0.0.1',\n development: 'http://localhost:3000/backend/services/v0.0.1',\n} as const;\n\n/**\n * Cliente HTTP para API Wally\n */\nexport class WallyApiClient {\n private config: ResolvedConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n /**\n * Resolve a configuração, extraindo organizationId da API Key\n */\n static async resolveConfig(config: WallyConfig): Promise<ResolvedConfig> {\n // Determina URL base\n const apiUrl = config.apiUrl || ENVIRONMENTS[config.environment || 'production'];\n\n // Valida API Key e extrai organizationId\n const orgId = await WallyApiClient.validateApiKey(apiUrl, config.apiKey);\n\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n normId: config.normId,\n qualityGateId: config.qualityGateId,\n environment: config.environment || 'production',\n apiUrl,\n timeout: config.timeout ?? 30000,\n failOnError: config.failOnError ?? false,\n organizationId: orgId,\n };\n }\n\n /**\n * Valida a API Key e retorna o organizationId\n */\n private static async validateApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const response = await fetch(`${apiUrl}/_/auth/api-key/info`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Falha ao validar API Key: ${response.status} - ${errorText}`);\n }\n\n const data = (await response.json()) as { organizationId?: string };\n\n if (!data.organizationId) {\n throw new Error('API Key inválida: organizationId não encontrado na resposta');\n }\n\n return data.organizationId;\n }\n\n /**\n * Cria uma nova sessão de navegação\n */\n async createSession(\n options: {\n name?: string;\n description?: string;\n baseUrl?: string;\n } = {},\n ): Promise<CreateSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions`;\n\n const body = {\n projectId: this.config.projectId,\n normId: this.config.normId,\n qualityGateId: this.config.qualityGateId,\n source: 'cypress',\n name: options.name || `Cypress Session - ${new Date().toLocaleString('pt-BR')}`,\n description: options.description,\n baseUrl: options.baseUrl,\n metadata: {\n cypressVersion: typeof Cypress !== 'undefined' ? Cypress.version : 'unknown',\n nodeVersion: process.version,\n platform: process.platform,\n },\n };\n\n const response = await this.request<CreateSessionResponse>('POST', endpoint, body);\n return response;\n }\n\n /**\n * Adiciona uma página à sessão usando upload binário comprimido (gzip)\n */\n async addPageBinary(\n sessionId: string,\n pageData: { url: string; title: string; html: string },\n ): Promise<AddPageResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/pages/binary`;\n\n // Comprime o HTML com gzip\n const htmlBuffer = Buffer.from(pageData.html, 'utf-8');\n const compressedBuffer = gzipSync(htmlBuffer);\n\n const timestamp = new Date().toISOString();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/gzip',\n 'X-Page-Url': pageData.url,\n 'X-Page-Title': encodeURIComponent(pageData.title),\n 'X-Page-Timestamp': timestamp,\n },\n body: compressedBuffer,\n signal: AbortSignal.timeout(this.config.timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Erro ao enviar página: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<AddPageResponse>;\n }\n\n /**\n * Finaliza a sessão e opcionalmente inicia análise\n */\n async finishSession(sessionId: string): Promise<FinishSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/finish`;\n\n return this.request<FinishSessionResponse>('POST', endpoint, {\n startAnalysis: true,\n });\n }\n\n /**\n * Obtém detalhes de uma sessão\n */\n async getSession(sessionId: string): Promise<WallySession> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}`;\n return this.request<WallySession>('GET', endpoint);\n }\n\n /**\n * Executa uma requisição HTTP genérica\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n body?: unknown,\n ): Promise<T> {\n const options: RequestInit = {\n method,\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(this.config.timeout),\n };\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorData.error || `Erro ${response.status}`;\n } catch {\n errorMessage = `Erro ${response.status}: ${response.statusText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * Plugin Cypress para integração com Wally\n *\n * Este módulo é executado no Node.js (setupNodeEvents) e gerencia:\n * - Sessão de navegação\n * - Comunicação com API Wally\n * - Ciclo de vida dos testes\n *\n * @example\n * // cypress.config.ts\n * import { wallyPlugin } from '@equallyze/wally-cypress/plugin';\n *\n * export default defineConfig({\n * e2e: {\n * setupNodeEvents(on, config) {\n * wallyPlugin(on, config, {\n * apiKey: process.env.WALLY_API_KEY,\n * projectId: process.env.WALLY_PROJECT_ID,\n * });\n * return config;\n * },\n * },\n * });\n */\n\nimport { WallyApiClient } from './api-client';\nimport type {\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallyPage,\n WallyPluginState,\n WallySession,\n} from './types';\n\n/**\n * Estado global do plugin\n */\nconst state: WallyPluginState = {\n config: null,\n session: null,\n initialized: false,\n lastError: null,\n};\n\n/**\n * Cliente API (inicializado no before:run)\n */\nlet apiClient: WallyApiClient | null = null;\n\n/**\n * Logger\n */\nfunction log(message: string, ...args: unknown[]) {\n console.log(`[Wally] ${message}`, ...args);\n}\n\nfunction logError(message: string, error?: Error) {\n console.error(`[Wally] ❌ ${message}`, error?.message || '');\n state.lastError = error?.message || message;\n}\n\n/**\n * Inicializa o plugin Wally\n */\nasync function initialize(config: WallyConfig): Promise<boolean> {\n try {\n log('🚀 Inicializando plugin...');\n\n // Valida configuração obrigatória\n if (!config.apiKey) {\n throw new Error('apiKey é obrigatório');\n }\n if (!config.projectId) {\n throw new Error('projectId é obrigatório');\n }\n\n // Resolve configuração (valida API Key e obtém organizationId)\n const resolvedConfig = await WallyApiClient.resolveConfig(config);\n state.config = resolvedConfig;\n\n // Cria cliente API\n apiClient = new WallyApiClient(resolvedConfig);\n\n state.initialized = true;\n log('✅ Plugin inicializado', {\n organizationId: resolvedConfig.organizationId,\n projectId: resolvedConfig.projectId,\n environment: resolvedConfig.environment,\n });\n\n return true;\n } catch (error) {\n logError('Falha ao inicializar plugin', error as Error);\n state.initialized = false;\n return false;\n }\n}\n\n/**\n * Inicia uma nova sessão de navegação\n */\nasync function startSession(baseUrl?: string): Promise<WallySession | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (state.session) {\n log('⚠️ Sessão já ativa, reutilizando:', state.session.id);\n return state.session;\n }\n\n try {\n log('🎬 Criando sessão de navegação...');\n\n const response = await apiClient.createSession({\n name: `Cypress - ${new Date().toLocaleString('pt-BR')}`,\n description: 'Sessão automática via wally-cypress',\n baseUrl,\n });\n\n state.session = {\n id: response.id,\n organizationId: state.config?.organizationId || '',\n status: 'ACTIVE',\n startedAt: new Date(),\n pages: [],\n };\n\n log('✅ Sessão criada:', state.session.id);\n return state.session;\n } catch (error) {\n logError('Falha ao criar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Captura uma página e envia para o backend\n */\nasync function capturePage(pageName: string, url: string, html: string): Promise<WallyPage | null> {\n if (!state.initialized || !apiClient || !state.session) {\n logError('Plugin não inicializado ou sessão não ativa');\n return null;\n }\n\n try {\n log(`📄 Capturando página: \"${pageName}\" (${url})`);\n\n const response = await apiClient.addPageBinary(state.session.id, {\n url,\n title: pageName,\n html,\n });\n\n const page: WallyPage = {\n id: response.pageId,\n url,\n title: pageName,\n timestamp: new Date(),\n contentSize: response.totalSize,\n };\n\n state.session.pages.push(page);\n\n log(`✅ Página capturada: ${pageName} (${response.totalPages} total)`);\n return page;\n } catch (error) {\n logError(`Falha ao capturar página: ${pageName}`, error as Error);\n return null;\n }\n}\n\n/**\n * Finaliza a sessão e inicia análise\n */\nasync function finishSession(): Promise<FinishSessionResponse | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (!state.session) {\n log('⚠️ Nenhuma sessão ativa para finalizar');\n return null;\n }\n\n try {\n log('🏁 Finalizando sessão...');\n\n const response = await apiClient.finishSession(state.session.id);\n\n log('✅ Sessão finalizada:', {\n sessionId: response.sessionId,\n totalPages: response.totalPages,\n analysisId: response.analysisId,\n });\n\n // Limpa estado\n const result = response;\n state.session = null;\n\n return result;\n } catch (error) {\n logError('Falha ao finalizar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Obtém o estado atual da sessão\n */\nfunction getSession(): WallySession | null {\n return state.session;\n}\n\n/**\n * Obtém configuração atual\n */\nfunction getConfig(): ResolvedConfig | null {\n return state.config;\n}\n\n/**\n * Plugin principal para Cypress\n *\n * @param on - Objeto de eventos Cypress\n * @param config - Configuração Cypress\n * @param wallyConfig - Configuração do plugin Wally\n */\nexport function wallyPlugin(\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n wallyConfig: WallyConfig,\n): void {\n // Registra tasks para comunicação com os comandos\n on('task', {\n /**\n * Inicializa o plugin (chamado automaticamente no before:run)\n */\n 'wally:initialize': async () => {\n const success = await initialize(wallyConfig);\n return success;\n },\n\n /**\n * Inicia uma nova sessão de navegação\n */\n 'wally:startSession': async (baseUrl?: string) => {\n const session = await startSession(baseUrl);\n return session;\n },\n\n /**\n * Captura uma página\n */\n 'wally:capturePage': async (args: { pageName: string; url: string; html: string }) => {\n const page = await capturePage(args.pageName, args.url, args.html);\n return page;\n },\n\n /**\n * Finaliza a sessão\n */\n 'wally:finishSession': async () => {\n const result = await finishSession();\n return result;\n },\n\n /**\n * Obtém a sessão atual\n */\n 'wally:getSession': () => {\n return getSession();\n },\n\n /**\n * Obtém configuração atual\n */\n 'wally:getConfig': () => {\n return getConfig();\n },\n\n /**\n * Obtém último erro\n */\n 'wally:getLastError': () => {\n return state.lastError;\n },\n });\n\n // Hook: antes de iniciar os testes\n on('before:run', async () => {\n log('📦 Hook before:run - Inicializando Wally...');\n await initialize(wallyConfig);\n });\n\n // Hook: após finalizar os testes\n on('after:run', async () => {\n log('📦 Hook after:run - Finalizando Wally...');\n if (state.session) {\n await finishSession();\n }\n });\n\n // Hook: antes de cada spec\n on('before:spec', async (spec) => {\n log(`📋 Hook before:spec - ${spec.relative}`);\n\n // Garante que plugin está inicializado\n if (!state.initialized) {\n await initialize(wallyConfig);\n }\n\n // Inicia sessão para esta spec (se não houver sessão ativa)\n if (!state.session) {\n await startSession(config.baseUrl || undefined);\n }\n });\n\n // Hook: após cada spec (opcional: pode manter sessão entre specs)\n on('after:spec', async (spec, results) => {\n log(`📋 Hook after:spec - ${spec.relative}`, {\n tests: results.stats.tests,\n passed: results.stats.passes,\n failed: results.stats.failures,\n });\n\n // Nota: Não finalizamos aqui para permitir múltiplas specs na mesma sessão\n // A sessão será finalizada no after:run\n });\n}\n\n// Export adicional para uso direto\nexport { capturePage, finishSession, getConfig, getSession, initialize, startSession };\n","/**\n * Comandos customizados Cypress para Wally\n *\n * Este módulo adiciona o comando:\n * - cy.accessibility(pageName) - Captura página atual para análise\n *\n * A sessão é iniciada automaticamente no hook `before:run` e\n * finalizada automaticamente no hook `after:run` pelo plugin.\n *\n * @example\n * // cypress/support/e2e.ts\n * import '@equallyze/wally-cypress/support';\n *\n * // Em seus testes\n * describe('Teste de Acessibilidade', () => {\n * it('deve ser acessível', () => {\n * cy.visit('/');\n * cy.accessibility('Homepage');\n * });\n * });\n */\n\nimport type { WallyPage } from './types';\n\n/**\n * Registra os comandos customizados do Wally no Cypress\n */\nexport function registerWallyCommands(): void {\n /**\n * Comando principal: cy.accessibility(pageName)\n *\n * Captura a página atual e envia para análise de acessibilidade no Wally\n */\n Cypress.Commands.add('accessibility', (pageName: string): Cypress.Chainable<WallyPage | null> => {\n // Garante que temos uma sessão ativa\n return cy.task('wally:getSession', null, { log: false }).then((session) => {\n if (!session) {\n // Inicia sessão automaticamente se não existir\n return cy.task('wally:startSession', Cypress.config('baseUrl'), { log: false }).then(() => {\n return captureAndSend(pageName);\n });\n }\n return captureAndSend(pageName);\n });\n });\n\n /**\n * Helper para capturar e enviar página\n */\n function captureAndSend(pageName: string): Cypress.Chainable<WallyPage | null> {\n return cy.url().then((url) => {\n return cy.document().then((doc) => {\n // Captura HTML completo (executado no contexto do browser)\n const doctype = doc.doctype\n ? `<!DOCTYPE ${doc.doctype.name}${doc.doctype.publicId ? ` PUBLIC \"${doc.doctype.publicId}\"` : ''}${doc.doctype.systemId ? ` \"${doc.doctype.systemId}\"` : ''}>`\n : '<!DOCTYPE html>';\n\n const html = `${doctype}\\n${doc.documentElement.outerHTML}`;\n\n // Log customizado no Cypress\n Cypress.log({\n name: 'accessibility',\n displayName: '♿ A11Y',\n message: pageName,\n consoleProps: () => ({\n 'Page Name': pageName,\n URL: url,\n 'HTML Size': `${Math.round(html.length / 1024)} KB`,\n }),\n });\n\n // Envia para o plugin via task\n return cy\n .task<WallyPage | null>('wally:capturePage', { pageName, url, html }, { log: false })\n .then((page) => {\n if (!page) {\n cy.log('⚠️ Wally: Falha ao capturar página');\n }\n return page;\n });\n });\n }) as unknown as Cypress.Chainable<WallyPage | null>;\n }\n}\n\n// Auto-registra os comandos quando o módulo é importado\nregisterWallyCommands();\n"]}
1
+ {"version":3,"sources":["../src/api-client.ts","../src/plugin.ts","../src/support.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * API Client para comunicação com o backend Wally\n *\n * Segue o mesmo padrão do wally-chrome (SessionApi)\n */\n\nimport { gzipSync } from 'zlib';\nimport type {\n AddPageResponse,\n CreateSessionResponse,\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallySession,\n} from './types';\n\n/**\n * URLs base por ambiente\n */\nconst ENVIRONMENTS = {\n production: 'https://acessibilidade.global/backend/services/v0.0.1',\n staging: 'https://stg.acessibilidade.global/backend/services/v0.0.1',\n development: 'http://localhost:3000/backend/services/v0.0.1',\n} as const;\n\n/**\n * Cliente HTTP para API Wally\n */\nexport class WallyApiClient {\n private config: ResolvedConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n /**\n * Resolve a configuração, extraindo organizationId da API Key\n */\n static async resolveConfig(config: WallyConfig): Promise<ResolvedConfig> {\n // Determina URL base\n const apiUrl = config.apiUrl || ENVIRONMENTS[config.environment || 'production'];\n\n // Valida API Key e extrai organizationId\n const orgId = await WallyApiClient.validateApiKey(apiUrl, config.apiKey);\n\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n normId: config.normId,\n qualityGateId: config.qualityGateId,\n environment: config.environment || 'production',\n apiUrl,\n timeout: config.timeout ?? 30000,\n failOnError: config.failOnError ?? false,\n organizationId: orgId,\n };\n }\n\n /**\n * Valida a API Key e retorna o organizationId\n */\n private static async validateApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const response = await fetch(`${apiUrl}/_/auth/api-key/info`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Falha ao validar API Key: ${response.status} - ${errorText}`);\n }\n\n const data = (await response.json()) as { organizationId?: string };\n\n if (!data.organizationId) {\n throw new Error('API Key inválida: organizationId não encontrado na resposta');\n }\n\n return data.organizationId;\n }\n\n /**\n * Cria uma nova sessão de navegação\n */\n async createSession(\n options: {\n name?: string;\n description?: string;\n baseUrl?: string;\n } = {},\n ): Promise<CreateSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions`;\n\n const body = {\n projectId: this.config.projectId,\n normId: this.config.normId,\n qualityGateId: this.config.qualityGateId,\n source: 'cypress',\n name: options.name || `Cypress Session - ${new Date().toLocaleString('pt-BR')}`,\n description: options.description,\n baseUrl: options.baseUrl,\n metadata: {\n cypressVersion: typeof Cypress !== 'undefined' ? Cypress.version : 'unknown',\n nodeVersion: process.version,\n platform: process.platform,\n },\n };\n\n const response = await this.request<CreateSessionResponse>('POST', endpoint, body);\n return response;\n }\n\n /**\n * Adiciona uma página à sessão usando upload binário comprimido (gzip)\n */\n async addPageBinary(\n sessionId: string,\n pageData: { url: string; title: string; html: string },\n ): Promise<AddPageResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/pages/binary`;\n\n // Comprime o HTML com gzip\n const htmlBuffer = Buffer.from(pageData.html, 'utf-8');\n const compressedBuffer = gzipSync(htmlBuffer);\n\n const timestamp = new Date().toISOString();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/gzip',\n 'X-Page-Url': pageData.url,\n 'X-Page-Title': encodeURIComponent(pageData.title),\n 'X-Page-Timestamp': timestamp,\n },\n body: compressedBuffer,\n signal: AbortSignal.timeout(this.config.timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Erro ao enviar página: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<AddPageResponse>;\n }\n\n /**\n * Finaliza a sessão e opcionalmente inicia análise\n */\n async finishSession(sessionId: string): Promise<FinishSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/finish`;\n\n return this.request<FinishSessionResponse>('POST', endpoint, {\n startAnalysis: true,\n });\n }\n\n /**\n * Obtém detalhes de uma sessão\n */\n async getSession(sessionId: string): Promise<WallySession> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}`;\n return this.request<WallySession>('GET', endpoint);\n }\n\n /**\n * Executa uma requisição HTTP genérica\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n body?: unknown,\n ): Promise<T> {\n const options: RequestInit = {\n method,\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(this.config.timeout),\n };\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorData.error || `Erro ${response.status}`;\n } catch {\n errorMessage = `Erro ${response.status}: ${response.statusText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * Plugin Cypress para integração com Wally\n *\n * Este módulo é executado no Node.js (setupNodeEvents) e gerencia:\n * - Sessão de navegação\n * - Comunicação com API Wally\n * - Ciclo de vida dos testes\n *\n * @example\n * // cypress.config.ts\n * import { wallyPlugin } from '@equallyze/wally-cypress/plugin';\n *\n * export default defineConfig({\n * e2e: {\n * setupNodeEvents(on, config) {\n * wallyPlugin(on, config, {\n * apiKey: process.env.WALLY_API_KEY,\n * projectId: process.env.WALLY_PROJECT_ID,\n * });\n * return config;\n * },\n * },\n * });\n */\n\nimport { WallyApiClient } from './api-client';\nimport type {\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallyPage,\n WallyPluginState,\n WallySession,\n} from './types';\n\n/**\n * Estado global do plugin\n */\nconst state: WallyPluginState = {\n config: null,\n session: null,\n initialized: false,\n lastError: null,\n};\n\n/**\n * Cliente API (inicializado no before:run)\n */\nlet apiClient: WallyApiClient | null = null;\n\n/**\n * Logger\n */\nfunction log(message: string, ...args: unknown[]) {\n console.log(`[Wally] ${message}`, ...args);\n}\n\nfunction logError(message: string, error?: Error) {\n console.error(`[Wally] ❌ ${message}`, error?.message || '');\n state.lastError = error?.message || message;\n}\n\n/**\n * Inicializa o plugin Wally\n */\nasync function initialize(config: WallyConfig): Promise<boolean> {\n try {\n log('🚀 Inicializando plugin...');\n\n // Valida configuração obrigatória\n if (!config.apiKey) {\n throw new Error('apiKey é obrigatório');\n }\n if (!config.projectId) {\n throw new Error('projectId é obrigatório');\n }\n\n // Resolve configuração (valida API Key e obtém organizationId)\n const resolvedConfig = await WallyApiClient.resolveConfig(config);\n state.config = resolvedConfig;\n\n // Cria cliente API\n apiClient = new WallyApiClient(resolvedConfig);\n\n state.initialized = true;\n log('✅ Plugin inicializado', {\n organizationId: resolvedConfig.organizationId,\n projectId: resolvedConfig.projectId,\n environment: resolvedConfig.environment,\n });\n\n return true;\n } catch (error) {\n logError('Falha ao inicializar plugin', error as Error);\n state.initialized = false;\n return false;\n }\n}\n\n/**\n * Inicia uma nova sessão de navegação\n */\nasync function startSession(baseUrl?: string): Promise<WallySession | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (state.session) {\n log('⚠️ Sessão já ativa, reutilizando:', state.session.id);\n return state.session;\n }\n\n try {\n log('🎬 Criando sessão de navegação...');\n\n const response = await apiClient.createSession({\n name: `Cypress - ${new Date().toLocaleString('pt-BR')}`,\n description: 'Sessão automática via wally-cypress',\n baseUrl,\n });\n\n state.session = {\n id: response.id,\n organizationId: state.config?.organizationId || '',\n status: 'ACTIVE',\n startedAt: new Date(),\n pages: [],\n };\n\n log('✅ Sessão criada:', state.session.id);\n return state.session;\n } catch (error) {\n logError('Falha ao criar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Captura uma página e envia para o backend\n */\nasync function capturePage(pageName: string, url: string, html: string): Promise<WallyPage | null> {\n if (!state.initialized || !apiClient || !state.session) {\n logError('Plugin não inicializado ou sessão não ativa');\n return null;\n }\n\n try {\n log(`📄 Capturando página: \"${pageName}\" (${url})`);\n\n const response = await apiClient.addPageBinary(state.session.id, {\n url,\n title: pageName,\n html,\n });\n\n const page: WallyPage = {\n id: response.pageId,\n url,\n title: pageName,\n timestamp: new Date(),\n contentSize: response.totalSize,\n };\n\n state.session.pages.push(page);\n\n log(`✅ Página capturada: ${pageName} (${response.totalPages} total)`);\n return page;\n } catch (error) {\n logError(`Falha ao capturar página: ${pageName}`, error as Error);\n return null;\n }\n}\n\n/**\n * Finaliza a sessão e inicia análise\n */\nasync function finishSession(): Promise<FinishSessionResponse | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (!state.session) {\n log('⚠️ Nenhuma sessão ativa para finalizar');\n return null;\n }\n\n try {\n log('🏁 Finalizando sessão...');\n\n const response = await apiClient.finishSession(state.session.id);\n\n log('✅ Sessão finalizada:', {\n sessionId: response.sessionId,\n totalPages: response.totalPages,\n analysisId: response.analysisId,\n });\n\n // Limpa estado\n const result = response;\n state.session = null;\n\n return result;\n } catch (error) {\n logError('Falha ao finalizar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Obtém o estado atual da sessão\n */\nfunction getSession(): WallySession | null {\n return state.session;\n}\n\n/**\n * Obtém configuração atual\n */\nfunction getConfig(): ResolvedConfig | null {\n return state.config;\n}\n\n/**\n * Plugin principal para Cypress\n *\n * @param on - Objeto de eventos Cypress\n * @param config - Configuração Cypress\n * @param wallyConfig - Configuração do plugin Wally\n */\nexport function wallyPlugin(\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n wallyConfig: WallyConfig,\n): void {\n // Registra tasks para comunicação com os comandos\n on('task', {\n /**\n * Inicializa o plugin (chamado automaticamente no before:run)\n */\n 'wally:initialize': async () => {\n const success = await initialize(wallyConfig);\n return success;\n },\n\n /**\n * Inicia uma nova sessão de navegação\n */\n 'wally:startSession': async (baseUrl?: string) => {\n const session = await startSession(baseUrl);\n return session;\n },\n\n /**\n * Captura uma página\n */\n 'wally:capturePage': async (args: { pageName: string; url: string; html: string }) => {\n const page = await capturePage(args.pageName, args.url, args.html);\n return page;\n },\n\n /**\n * Finaliza a sessão\n */\n 'wally:finishSession': async () => {\n const result = await finishSession();\n return result;\n },\n\n /**\n * Obtém a sessão atual\n */\n 'wally:getSession': () => {\n return getSession();\n },\n\n /**\n * Obtém configuração atual\n */\n 'wally:getConfig': () => {\n return getConfig();\n },\n\n /**\n * Obtém último erro\n */\n 'wally:getLastError': () => {\n return state.lastError;\n },\n });\n\n // Hook: antes de iniciar os testes\n on('before:run', async () => {\n log('📦 Hook before:run - Inicializando Wally...');\n await initialize(wallyConfig);\n });\n\n // Hook: após finalizar os testes\n on('after:run', async () => {\n log('📦 Hook after:run - Finalizando Wally...');\n if (state.session) {\n await finishSession();\n }\n });\n\n // Hook: antes de cada spec\n on('before:spec', async (spec) => {\n log(`📋 Hook before:spec - ${spec.relative}`);\n\n // Garante que plugin está inicializado\n if (!state.initialized) {\n await initialize(wallyConfig);\n }\n\n // Inicia sessão para esta spec (se não houver sessão ativa)\n if (!state.session) {\n await startSession(config.baseUrl || undefined);\n }\n });\n\n // Hook: após cada spec (opcional: pode manter sessão entre specs)\n on('after:spec', async (spec, results) => {\n log(`📋 Hook after:spec - ${spec.relative}`, {\n tests: results.stats.tests,\n passed: results.stats.passes,\n failed: results.stats.failures,\n });\n\n // Nota: Não finalizamos aqui para permitir múltiplas specs na mesma sessão\n // A sessão será finalizada no after:run\n });\n}\n\n// Export adicional para uso direto\nexport { capturePage, finishSession, getConfig, getSession, initialize, startSession };\n","/**\n * Comandos customizados Cypress para Wally\n *\n * Este módulo adiciona o comando:\n * - cy.accessibility(pageName) - Captura página atual para análise\n *\n * A sessão é iniciada automaticamente no hook `before:run` e\n * finalizada automaticamente no hook `after:run` pelo plugin.\n *\n * @example\n * // cypress/support/e2e.ts\n * import '@equallyze/wally-cypress/support';\n *\n * // Em seus testes\n * describe('Teste de Acessibilidade', () => {\n * it('deve ser acessível', () => {\n * cy.visit('/');\n * cy.accessibility('Homepage');\n * });\n * });\n */\n\nimport type { WallyPage } from './types';\n\n/**\n * Registra os comandos customizados do Wally no Cypress\n */\nexport function registerWallyCommands(): void {\n /**\n * Comando principal: cy.accessibility(pageName)\n *\n * Captura a página atual e envia para análise de acessibilidade no Wally\n */\n Cypress.Commands.add('accessibility', (pageName: string): Cypress.Chainable<WallyPage | null> => {\n // Garante que temos uma sessão ativa\n return cy.task('wally:getSession', null, { log: false }).then((session) => {\n if (!session) {\n // Inicia sessão automaticamente se não existir\n return cy.task('wally:startSession', Cypress.config('baseUrl'), { log: false }).then(() => {\n return captureAndSend(pageName);\n });\n }\n return captureAndSend(pageName);\n });\n });\n\n /**\n * Helper para capturar e enviar página\n */\n function captureAndSend(pageName: string): Cypress.Chainable<WallyPage | null> {\n return cy.url().then((url) => {\n return cy.document().then((doc) => {\n // Captura HTML completo (executado no contexto do browser)\n const doctype = doc.doctype\n ? `<!DOCTYPE ${doc.doctype.name}${doc.doctype.publicId ? ` PUBLIC \"${doc.doctype.publicId}\"` : ''}${doc.doctype.systemId ? ` \"${doc.doctype.systemId}\"` : ''}>`\n : '<!DOCTYPE html>';\n\n const html = `${doctype}\\n${doc.documentElement.outerHTML}`;\n\n // Log customizado no Cypress\n Cypress.log({\n name: 'accessibility',\n displayName: '♿ A11Y',\n message: pageName,\n consoleProps: () => ({\n 'Page Name': pageName,\n URL: url,\n 'HTML Size': `${Math.round(html.length / 1024)} KB`,\n }),\n });\n\n // Envia para o plugin via task\n return cy\n .task<WallyPage | null>('wally:capturePage', { pageName, url, html }, { log: false })\n .then((page) => {\n if (!page) {\n cy.log('⚠️ Wally: Falha ao capturar página');\n }\n return page;\n });\n });\n }) as unknown as Cypress.Chainable<WallyPage | null>;\n }\n}\n\n// Auto-registra os comandos quando o módulo é importado\nregisterWallyCommands();\n"]}
package/dist/plugin.js CHANGED
@@ -4,8 +4,8 @@ var zlib = require('zlib');
4
4
 
5
5
  // src/api-client.ts
6
6
  var ENVIRONMENTS = {
7
- production: "https://api.wally.equallyze.com/backend/services/v0.0.1",
8
- staging: "https://api.stg.wally.equallyze.com/backend/services/v0.0.1",
7
+ production: "https://acessibilidade.global/backend/services/v0.0.1",
8
+ staging: "https://stg.acessibilidade.global/backend/services/v0.0.1",
9
9
  development: "http://localhost:3000/backend/services/v0.0.1"
10
10
  };
11
11
  var WallyApiClient = class _WallyApiClient {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-client.ts","../src/plugin.ts"],"names":["gzipSync"],"mappings":"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","file":"plugin.js","sourcesContent":["/**\n * API Client para comunicação com o backend Wally\n *\n * Segue o mesmo padrão do wally-chrome (SessionApi)\n */\n\nimport { gzipSync } from 'zlib';\nimport type {\n AddPageResponse,\n CreateSessionResponse,\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallySession,\n} from './types';\n\n/**\n * URLs base por ambiente\n */\nconst ENVIRONMENTS = {\n production: 'https://api.wally.equallyze.com/backend/services/v0.0.1',\n staging: 'https://api.stg.wally.equallyze.com/backend/services/v0.0.1',\n development: 'http://localhost:3000/backend/services/v0.0.1',\n} as const;\n\n/**\n * Cliente HTTP para API Wally\n */\nexport class WallyApiClient {\n private config: ResolvedConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n /**\n * Resolve a configuração, extraindo organizationId da API Key\n */\n static async resolveConfig(config: WallyConfig): Promise<ResolvedConfig> {\n // Determina URL base\n const apiUrl = config.apiUrl || ENVIRONMENTS[config.environment || 'production'];\n\n // Valida API Key e extrai organizationId\n const orgId = await WallyApiClient.validateApiKey(apiUrl, config.apiKey);\n\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n normId: config.normId,\n qualityGateId: config.qualityGateId,\n environment: config.environment || 'production',\n apiUrl,\n timeout: config.timeout ?? 30000,\n failOnError: config.failOnError ?? false,\n organizationId: orgId,\n };\n }\n\n /**\n * Valida a API Key e retorna o organizationId\n */\n private static async validateApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const response = await fetch(`${apiUrl}/_/auth/api-key/info`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Falha ao validar API Key: ${response.status} - ${errorText}`);\n }\n\n const data = (await response.json()) as { organizationId?: string };\n\n if (!data.organizationId) {\n throw new Error('API Key inválida: organizationId não encontrado na resposta');\n }\n\n return data.organizationId;\n }\n\n /**\n * Cria uma nova sessão de navegação\n */\n async createSession(\n options: {\n name?: string;\n description?: string;\n baseUrl?: string;\n } = {},\n ): Promise<CreateSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions`;\n\n const body = {\n projectId: this.config.projectId,\n normId: this.config.normId,\n qualityGateId: this.config.qualityGateId,\n source: 'cypress',\n name: options.name || `Cypress Session - ${new Date().toLocaleString('pt-BR')}`,\n description: options.description,\n baseUrl: options.baseUrl,\n metadata: {\n cypressVersion: typeof Cypress !== 'undefined' ? Cypress.version : 'unknown',\n nodeVersion: process.version,\n platform: process.platform,\n },\n };\n\n const response = await this.request<CreateSessionResponse>('POST', endpoint, body);\n return response;\n }\n\n /**\n * Adiciona uma página à sessão usando upload binário comprimido (gzip)\n */\n async addPageBinary(\n sessionId: string,\n pageData: { url: string; title: string; html: string },\n ): Promise<AddPageResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/pages/binary`;\n\n // Comprime o HTML com gzip\n const htmlBuffer = Buffer.from(pageData.html, 'utf-8');\n const compressedBuffer = gzipSync(htmlBuffer);\n\n const timestamp = new Date().toISOString();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/gzip',\n 'X-Page-Url': pageData.url,\n 'X-Page-Title': encodeURIComponent(pageData.title),\n 'X-Page-Timestamp': timestamp,\n },\n body: compressedBuffer,\n signal: AbortSignal.timeout(this.config.timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Erro ao enviar página: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<AddPageResponse>;\n }\n\n /**\n * Finaliza a sessão e opcionalmente inicia análise\n */\n async finishSession(sessionId: string): Promise<FinishSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/finish`;\n\n return this.request<FinishSessionResponse>('POST', endpoint, {\n startAnalysis: true,\n });\n }\n\n /**\n * Obtém detalhes de uma sessão\n */\n async getSession(sessionId: string): Promise<WallySession> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}`;\n return this.request<WallySession>('GET', endpoint);\n }\n\n /**\n * Executa uma requisição HTTP genérica\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n body?: unknown,\n ): Promise<T> {\n const options: RequestInit = {\n method,\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(this.config.timeout),\n };\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorData.error || `Erro ${response.status}`;\n } catch {\n errorMessage = `Erro ${response.status}: ${response.statusText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * Plugin Cypress para integração com Wally\n *\n * Este módulo é executado no Node.js (setupNodeEvents) e gerencia:\n * - Sessão de navegação\n * - Comunicação com API Wally\n * - Ciclo de vida dos testes\n *\n * @example\n * // cypress.config.ts\n * import { wallyPlugin } from '@equallyze/wally-cypress/plugin';\n *\n * export default defineConfig({\n * e2e: {\n * setupNodeEvents(on, config) {\n * wallyPlugin(on, config, {\n * apiKey: process.env.WALLY_API_KEY,\n * projectId: process.env.WALLY_PROJECT_ID,\n * });\n * return config;\n * },\n * },\n * });\n */\n\nimport { WallyApiClient } from './api-client';\nimport type {\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallyPage,\n WallyPluginState,\n WallySession,\n} from './types';\n\n/**\n * Estado global do plugin\n */\nconst state: WallyPluginState = {\n config: null,\n session: null,\n initialized: false,\n lastError: null,\n};\n\n/**\n * Cliente API (inicializado no before:run)\n */\nlet apiClient: WallyApiClient | null = null;\n\n/**\n * Logger\n */\nfunction log(message: string, ...args: unknown[]) {\n console.log(`[Wally] ${message}`, ...args);\n}\n\nfunction logError(message: string, error?: Error) {\n console.error(`[Wally] ❌ ${message}`, error?.message || '');\n state.lastError = error?.message || message;\n}\n\n/**\n * Inicializa o plugin Wally\n */\nasync function initialize(config: WallyConfig): Promise<boolean> {\n try {\n log('🚀 Inicializando plugin...');\n\n // Valida configuração obrigatória\n if (!config.apiKey) {\n throw new Error('apiKey é obrigatório');\n }\n if (!config.projectId) {\n throw new Error('projectId é obrigatório');\n }\n\n // Resolve configuração (valida API Key e obtém organizationId)\n const resolvedConfig = await WallyApiClient.resolveConfig(config);\n state.config = resolvedConfig;\n\n // Cria cliente API\n apiClient = new WallyApiClient(resolvedConfig);\n\n state.initialized = true;\n log('✅ Plugin inicializado', {\n organizationId: resolvedConfig.organizationId,\n projectId: resolvedConfig.projectId,\n environment: resolvedConfig.environment,\n });\n\n return true;\n } catch (error) {\n logError('Falha ao inicializar plugin', error as Error);\n state.initialized = false;\n return false;\n }\n}\n\n/**\n * Inicia uma nova sessão de navegação\n */\nasync function startSession(baseUrl?: string): Promise<WallySession | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (state.session) {\n log('⚠️ Sessão já ativa, reutilizando:', state.session.id);\n return state.session;\n }\n\n try {\n log('🎬 Criando sessão de navegação...');\n\n const response = await apiClient.createSession({\n name: `Cypress - ${new Date().toLocaleString('pt-BR')}`,\n description: 'Sessão automática via wally-cypress',\n baseUrl,\n });\n\n state.session = {\n id: response.id,\n organizationId: state.config?.organizationId || '',\n status: 'ACTIVE',\n startedAt: new Date(),\n pages: [],\n };\n\n log('✅ Sessão criada:', state.session.id);\n return state.session;\n } catch (error) {\n logError('Falha ao criar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Captura uma página e envia para o backend\n */\nasync function capturePage(pageName: string, url: string, html: string): Promise<WallyPage | null> {\n if (!state.initialized || !apiClient || !state.session) {\n logError('Plugin não inicializado ou sessão não ativa');\n return null;\n }\n\n try {\n log(`📄 Capturando página: \"${pageName}\" (${url})`);\n\n const response = await apiClient.addPageBinary(state.session.id, {\n url,\n title: pageName,\n html,\n });\n\n const page: WallyPage = {\n id: response.pageId,\n url,\n title: pageName,\n timestamp: new Date(),\n contentSize: response.totalSize,\n };\n\n state.session.pages.push(page);\n\n log(`✅ Página capturada: ${pageName} (${response.totalPages} total)`);\n return page;\n } catch (error) {\n logError(`Falha ao capturar página: ${pageName}`, error as Error);\n return null;\n }\n}\n\n/**\n * Finaliza a sessão e inicia análise\n */\nasync function finishSession(): Promise<FinishSessionResponse | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (!state.session) {\n log('⚠️ Nenhuma sessão ativa para finalizar');\n return null;\n }\n\n try {\n log('🏁 Finalizando sessão...');\n\n const response = await apiClient.finishSession(state.session.id);\n\n log('✅ Sessão finalizada:', {\n sessionId: response.sessionId,\n totalPages: response.totalPages,\n analysisId: response.analysisId,\n });\n\n // Limpa estado\n const result = response;\n state.session = null;\n\n return result;\n } catch (error) {\n logError('Falha ao finalizar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Obtém o estado atual da sessão\n */\nfunction getSession(): WallySession | null {\n return state.session;\n}\n\n/**\n * Obtém configuração atual\n */\nfunction getConfig(): ResolvedConfig | null {\n return state.config;\n}\n\n/**\n * Plugin principal para Cypress\n *\n * @param on - Objeto de eventos Cypress\n * @param config - Configuração Cypress\n * @param wallyConfig - Configuração do plugin Wally\n */\nexport function wallyPlugin(\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n wallyConfig: WallyConfig,\n): void {\n // Registra tasks para comunicação com os comandos\n on('task', {\n /**\n * Inicializa o plugin (chamado automaticamente no before:run)\n */\n 'wally:initialize': async () => {\n const success = await initialize(wallyConfig);\n return success;\n },\n\n /**\n * Inicia uma nova sessão de navegação\n */\n 'wally:startSession': async (baseUrl?: string) => {\n const session = await startSession(baseUrl);\n return session;\n },\n\n /**\n * Captura uma página\n */\n 'wally:capturePage': async (args: { pageName: string; url: string; html: string }) => {\n const page = await capturePage(args.pageName, args.url, args.html);\n return page;\n },\n\n /**\n * Finaliza a sessão\n */\n 'wally:finishSession': async () => {\n const result = await finishSession();\n return result;\n },\n\n /**\n * Obtém a sessão atual\n */\n 'wally:getSession': () => {\n return getSession();\n },\n\n /**\n * Obtém configuração atual\n */\n 'wally:getConfig': () => {\n return getConfig();\n },\n\n /**\n * Obtém último erro\n */\n 'wally:getLastError': () => {\n return state.lastError;\n },\n });\n\n // Hook: antes de iniciar os testes\n on('before:run', async () => {\n log('📦 Hook before:run - Inicializando Wally...');\n await initialize(wallyConfig);\n });\n\n // Hook: após finalizar os testes\n on('after:run', async () => {\n log('📦 Hook after:run - Finalizando Wally...');\n if (state.session) {\n await finishSession();\n }\n });\n\n // Hook: antes de cada spec\n on('before:spec', async (spec) => {\n log(`📋 Hook before:spec - ${spec.relative}`);\n\n // Garante que plugin está inicializado\n if (!state.initialized) {\n await initialize(wallyConfig);\n }\n\n // Inicia sessão para esta spec (se não houver sessão ativa)\n if (!state.session) {\n await startSession(config.baseUrl || undefined);\n }\n });\n\n // Hook: após cada spec (opcional: pode manter sessão entre specs)\n on('after:spec', async (spec, results) => {\n log(`📋 Hook after:spec - ${spec.relative}`, {\n tests: results.stats.tests,\n passed: results.stats.passes,\n failed: results.stats.failures,\n });\n\n // Nota: Não finalizamos aqui para permitir múltiplas specs na mesma sessão\n // A sessão será finalizada no after:run\n });\n}\n\n// Export adicional para uso direto\nexport { capturePage, finishSession, getConfig, getSession, initialize, startSession };\n"]}
1
+ {"version":3,"sources":["../src/api-client.ts","../src/plugin.ts"],"names":["gzipSync"],"mappings":"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","file":"plugin.js","sourcesContent":["/**\n * API Client para comunicação com o backend Wally\n *\n * Segue o mesmo padrão do wally-chrome (SessionApi)\n */\n\nimport { gzipSync } from 'zlib';\nimport type {\n AddPageResponse,\n CreateSessionResponse,\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallySession,\n} from './types';\n\n/**\n * URLs base por ambiente\n */\nconst ENVIRONMENTS = {\n production: 'https://acessibilidade.global/backend/services/v0.0.1',\n staging: 'https://stg.acessibilidade.global/backend/services/v0.0.1',\n development: 'http://localhost:3000/backend/services/v0.0.1',\n} as const;\n\n/**\n * Cliente HTTP para API Wally\n */\nexport class WallyApiClient {\n private config: ResolvedConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n /**\n * Resolve a configuração, extraindo organizationId da API Key\n */\n static async resolveConfig(config: WallyConfig): Promise<ResolvedConfig> {\n // Determina URL base\n const apiUrl = config.apiUrl || ENVIRONMENTS[config.environment || 'production'];\n\n // Valida API Key e extrai organizationId\n const orgId = await WallyApiClient.validateApiKey(apiUrl, config.apiKey);\n\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n normId: config.normId,\n qualityGateId: config.qualityGateId,\n environment: config.environment || 'production',\n apiUrl,\n timeout: config.timeout ?? 30000,\n failOnError: config.failOnError ?? false,\n organizationId: orgId,\n };\n }\n\n /**\n * Valida a API Key e retorna o organizationId\n */\n private static async validateApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const response = await fetch(`${apiUrl}/_/auth/api-key/info`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Falha ao validar API Key: ${response.status} - ${errorText}`);\n }\n\n const data = (await response.json()) as { organizationId?: string };\n\n if (!data.organizationId) {\n throw new Error('API Key inválida: organizationId não encontrado na resposta');\n }\n\n return data.organizationId;\n }\n\n /**\n * Cria uma nova sessão de navegação\n */\n async createSession(\n options: {\n name?: string;\n description?: string;\n baseUrl?: string;\n } = {},\n ): Promise<CreateSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions`;\n\n const body = {\n projectId: this.config.projectId,\n normId: this.config.normId,\n qualityGateId: this.config.qualityGateId,\n source: 'cypress',\n name: options.name || `Cypress Session - ${new Date().toLocaleString('pt-BR')}`,\n description: options.description,\n baseUrl: options.baseUrl,\n metadata: {\n cypressVersion: typeof Cypress !== 'undefined' ? Cypress.version : 'unknown',\n nodeVersion: process.version,\n platform: process.platform,\n },\n };\n\n const response = await this.request<CreateSessionResponse>('POST', endpoint, body);\n return response;\n }\n\n /**\n * Adiciona uma página à sessão usando upload binário comprimido (gzip)\n */\n async addPageBinary(\n sessionId: string,\n pageData: { url: string; title: string; html: string },\n ): Promise<AddPageResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/pages/binary`;\n\n // Comprime o HTML com gzip\n const htmlBuffer = Buffer.from(pageData.html, 'utf-8');\n const compressedBuffer = gzipSync(htmlBuffer);\n\n const timestamp = new Date().toISOString();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/gzip',\n 'X-Page-Url': pageData.url,\n 'X-Page-Title': encodeURIComponent(pageData.title),\n 'X-Page-Timestamp': timestamp,\n },\n body: compressedBuffer,\n signal: AbortSignal.timeout(this.config.timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Erro ao enviar página: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<AddPageResponse>;\n }\n\n /**\n * Finaliza a sessão e opcionalmente inicia análise\n */\n async finishSession(sessionId: string): Promise<FinishSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/finish`;\n\n return this.request<FinishSessionResponse>('POST', endpoint, {\n startAnalysis: true,\n });\n }\n\n /**\n * Obtém detalhes de uma sessão\n */\n async getSession(sessionId: string): Promise<WallySession> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}`;\n return this.request<WallySession>('GET', endpoint);\n }\n\n /**\n * Executa uma requisição HTTP genérica\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n body?: unknown,\n ): Promise<T> {\n const options: RequestInit = {\n method,\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(this.config.timeout),\n };\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorData.error || `Erro ${response.status}`;\n } catch {\n errorMessage = `Erro ${response.status}: ${response.statusText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * Plugin Cypress para integração com Wally\n *\n * Este módulo é executado no Node.js (setupNodeEvents) e gerencia:\n * - Sessão de navegação\n * - Comunicação com API Wally\n * - Ciclo de vida dos testes\n *\n * @example\n * // cypress.config.ts\n * import { wallyPlugin } from '@equallyze/wally-cypress/plugin';\n *\n * export default defineConfig({\n * e2e: {\n * setupNodeEvents(on, config) {\n * wallyPlugin(on, config, {\n * apiKey: process.env.WALLY_API_KEY,\n * projectId: process.env.WALLY_PROJECT_ID,\n * });\n * return config;\n * },\n * },\n * });\n */\n\nimport { WallyApiClient } from './api-client';\nimport type {\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallyPage,\n WallyPluginState,\n WallySession,\n} from './types';\n\n/**\n * Estado global do plugin\n */\nconst state: WallyPluginState = {\n config: null,\n session: null,\n initialized: false,\n lastError: null,\n};\n\n/**\n * Cliente API (inicializado no before:run)\n */\nlet apiClient: WallyApiClient | null = null;\n\n/**\n * Logger\n */\nfunction log(message: string, ...args: unknown[]) {\n console.log(`[Wally] ${message}`, ...args);\n}\n\nfunction logError(message: string, error?: Error) {\n console.error(`[Wally] ❌ ${message}`, error?.message || '');\n state.lastError = error?.message || message;\n}\n\n/**\n * Inicializa o plugin Wally\n */\nasync function initialize(config: WallyConfig): Promise<boolean> {\n try {\n log('🚀 Inicializando plugin...');\n\n // Valida configuração obrigatória\n if (!config.apiKey) {\n throw new Error('apiKey é obrigatório');\n }\n if (!config.projectId) {\n throw new Error('projectId é obrigatório');\n }\n\n // Resolve configuração (valida API Key e obtém organizationId)\n const resolvedConfig = await WallyApiClient.resolveConfig(config);\n state.config = resolvedConfig;\n\n // Cria cliente API\n apiClient = new WallyApiClient(resolvedConfig);\n\n state.initialized = true;\n log('✅ Plugin inicializado', {\n organizationId: resolvedConfig.organizationId,\n projectId: resolvedConfig.projectId,\n environment: resolvedConfig.environment,\n });\n\n return true;\n } catch (error) {\n logError('Falha ao inicializar plugin', error as Error);\n state.initialized = false;\n return false;\n }\n}\n\n/**\n * Inicia uma nova sessão de navegação\n */\nasync function startSession(baseUrl?: string): Promise<WallySession | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (state.session) {\n log('⚠️ Sessão já ativa, reutilizando:', state.session.id);\n return state.session;\n }\n\n try {\n log('🎬 Criando sessão de navegação...');\n\n const response = await apiClient.createSession({\n name: `Cypress - ${new Date().toLocaleString('pt-BR')}`,\n description: 'Sessão automática via wally-cypress',\n baseUrl,\n });\n\n state.session = {\n id: response.id,\n organizationId: state.config?.organizationId || '',\n status: 'ACTIVE',\n startedAt: new Date(),\n pages: [],\n };\n\n log('✅ Sessão criada:', state.session.id);\n return state.session;\n } catch (error) {\n logError('Falha ao criar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Captura uma página e envia para o backend\n */\nasync function capturePage(pageName: string, url: string, html: string): Promise<WallyPage | null> {\n if (!state.initialized || !apiClient || !state.session) {\n logError('Plugin não inicializado ou sessão não ativa');\n return null;\n }\n\n try {\n log(`📄 Capturando página: \"${pageName}\" (${url})`);\n\n const response = await apiClient.addPageBinary(state.session.id, {\n url,\n title: pageName,\n html,\n });\n\n const page: WallyPage = {\n id: response.pageId,\n url,\n title: pageName,\n timestamp: new Date(),\n contentSize: response.totalSize,\n };\n\n state.session.pages.push(page);\n\n log(`✅ Página capturada: ${pageName} (${response.totalPages} total)`);\n return page;\n } catch (error) {\n logError(`Falha ao capturar página: ${pageName}`, error as Error);\n return null;\n }\n}\n\n/**\n * Finaliza a sessão e inicia análise\n */\nasync function finishSession(): Promise<FinishSessionResponse | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (!state.session) {\n log('⚠️ Nenhuma sessão ativa para finalizar');\n return null;\n }\n\n try {\n log('🏁 Finalizando sessão...');\n\n const response = await apiClient.finishSession(state.session.id);\n\n log('✅ Sessão finalizada:', {\n sessionId: response.sessionId,\n totalPages: response.totalPages,\n analysisId: response.analysisId,\n });\n\n // Limpa estado\n const result = response;\n state.session = null;\n\n return result;\n } catch (error) {\n logError('Falha ao finalizar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Obtém o estado atual da sessão\n */\nfunction getSession(): WallySession | null {\n return state.session;\n}\n\n/**\n * Obtém configuração atual\n */\nfunction getConfig(): ResolvedConfig | null {\n return state.config;\n}\n\n/**\n * Plugin principal para Cypress\n *\n * @param on - Objeto de eventos Cypress\n * @param config - Configuração Cypress\n * @param wallyConfig - Configuração do plugin Wally\n */\nexport function wallyPlugin(\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n wallyConfig: WallyConfig,\n): void {\n // Registra tasks para comunicação com os comandos\n on('task', {\n /**\n * Inicializa o plugin (chamado automaticamente no before:run)\n */\n 'wally:initialize': async () => {\n const success = await initialize(wallyConfig);\n return success;\n },\n\n /**\n * Inicia uma nova sessão de navegação\n */\n 'wally:startSession': async (baseUrl?: string) => {\n const session = await startSession(baseUrl);\n return session;\n },\n\n /**\n * Captura uma página\n */\n 'wally:capturePage': async (args: { pageName: string; url: string; html: string }) => {\n const page = await capturePage(args.pageName, args.url, args.html);\n return page;\n },\n\n /**\n * Finaliza a sessão\n */\n 'wally:finishSession': async () => {\n const result = await finishSession();\n return result;\n },\n\n /**\n * Obtém a sessão atual\n */\n 'wally:getSession': () => {\n return getSession();\n },\n\n /**\n * Obtém configuração atual\n */\n 'wally:getConfig': () => {\n return getConfig();\n },\n\n /**\n * Obtém último erro\n */\n 'wally:getLastError': () => {\n return state.lastError;\n },\n });\n\n // Hook: antes de iniciar os testes\n on('before:run', async () => {\n log('📦 Hook before:run - Inicializando Wally...');\n await initialize(wallyConfig);\n });\n\n // Hook: após finalizar os testes\n on('after:run', async () => {\n log('📦 Hook after:run - Finalizando Wally...');\n if (state.session) {\n await finishSession();\n }\n });\n\n // Hook: antes de cada spec\n on('before:spec', async (spec) => {\n log(`📋 Hook before:spec - ${spec.relative}`);\n\n // Garante que plugin está inicializado\n if (!state.initialized) {\n await initialize(wallyConfig);\n }\n\n // Inicia sessão para esta spec (se não houver sessão ativa)\n if (!state.session) {\n await startSession(config.baseUrl || undefined);\n }\n });\n\n // Hook: após cada spec (opcional: pode manter sessão entre specs)\n on('after:spec', async (spec, results) => {\n log(`📋 Hook after:spec - ${spec.relative}`, {\n tests: results.stats.tests,\n passed: results.stats.passes,\n failed: results.stats.failures,\n });\n\n // Nota: Não finalizamos aqui para permitir múltiplas specs na mesma sessão\n // A sessão será finalizada no after:run\n });\n}\n\n// Export adicional para uso direto\nexport { capturePage, finishSession, getConfig, getSession, initialize, startSession };\n"]}
package/dist/plugin.mjs CHANGED
@@ -2,8 +2,8 @@ import { gzipSync } from 'zlib';
2
2
 
3
3
  // src/api-client.ts
4
4
  var ENVIRONMENTS = {
5
- production: "https://api.wally.equallyze.com/backend/services/v0.0.1",
6
- staging: "https://api.stg.wally.equallyze.com/backend/services/v0.0.1",
5
+ production: "https://acessibilidade.global/backend/services/v0.0.1",
6
+ staging: "https://stg.acessibilidade.global/backend/services/v0.0.1",
7
7
  development: "http://localhost:3000/backend/services/v0.0.1"
8
8
  };
9
9
  var WallyApiClient = class _WallyApiClient {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-client.ts","../src/plugin.ts"],"names":[],"mappings":"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","file":"plugin.mjs","sourcesContent":["/**\n * API Client para comunicação com o backend Wally\n *\n * Segue o mesmo padrão do wally-chrome (SessionApi)\n */\n\nimport { gzipSync } from 'zlib';\nimport type {\n AddPageResponse,\n CreateSessionResponse,\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallySession,\n} from './types';\n\n/**\n * URLs base por ambiente\n */\nconst ENVIRONMENTS = {\n production: 'https://api.wally.equallyze.com/backend/services/v0.0.1',\n staging: 'https://api.stg.wally.equallyze.com/backend/services/v0.0.1',\n development: 'http://localhost:3000/backend/services/v0.0.1',\n} as const;\n\n/**\n * Cliente HTTP para API Wally\n */\nexport class WallyApiClient {\n private config: ResolvedConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n /**\n * Resolve a configuração, extraindo organizationId da API Key\n */\n static async resolveConfig(config: WallyConfig): Promise<ResolvedConfig> {\n // Determina URL base\n const apiUrl = config.apiUrl || ENVIRONMENTS[config.environment || 'production'];\n\n // Valida API Key e extrai organizationId\n const orgId = await WallyApiClient.validateApiKey(apiUrl, config.apiKey);\n\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n normId: config.normId,\n qualityGateId: config.qualityGateId,\n environment: config.environment || 'production',\n apiUrl,\n timeout: config.timeout ?? 30000,\n failOnError: config.failOnError ?? false,\n organizationId: orgId,\n };\n }\n\n /**\n * Valida a API Key e retorna o organizationId\n */\n private static async validateApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const response = await fetch(`${apiUrl}/_/auth/api-key/info`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Falha ao validar API Key: ${response.status} - ${errorText}`);\n }\n\n const data = (await response.json()) as { organizationId?: string };\n\n if (!data.organizationId) {\n throw new Error('API Key inválida: organizationId não encontrado na resposta');\n }\n\n return data.organizationId;\n }\n\n /**\n * Cria uma nova sessão de navegação\n */\n async createSession(\n options: {\n name?: string;\n description?: string;\n baseUrl?: string;\n } = {},\n ): Promise<CreateSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions`;\n\n const body = {\n projectId: this.config.projectId,\n normId: this.config.normId,\n qualityGateId: this.config.qualityGateId,\n source: 'cypress',\n name: options.name || `Cypress Session - ${new Date().toLocaleString('pt-BR')}`,\n description: options.description,\n baseUrl: options.baseUrl,\n metadata: {\n cypressVersion: typeof Cypress !== 'undefined' ? Cypress.version : 'unknown',\n nodeVersion: process.version,\n platform: process.platform,\n },\n };\n\n const response = await this.request<CreateSessionResponse>('POST', endpoint, body);\n return response;\n }\n\n /**\n * Adiciona uma página à sessão usando upload binário comprimido (gzip)\n */\n async addPageBinary(\n sessionId: string,\n pageData: { url: string; title: string; html: string },\n ): Promise<AddPageResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/pages/binary`;\n\n // Comprime o HTML com gzip\n const htmlBuffer = Buffer.from(pageData.html, 'utf-8');\n const compressedBuffer = gzipSync(htmlBuffer);\n\n const timestamp = new Date().toISOString();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/gzip',\n 'X-Page-Url': pageData.url,\n 'X-Page-Title': encodeURIComponent(pageData.title),\n 'X-Page-Timestamp': timestamp,\n },\n body: compressedBuffer,\n signal: AbortSignal.timeout(this.config.timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Erro ao enviar página: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<AddPageResponse>;\n }\n\n /**\n * Finaliza a sessão e opcionalmente inicia análise\n */\n async finishSession(sessionId: string): Promise<FinishSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/finish`;\n\n return this.request<FinishSessionResponse>('POST', endpoint, {\n startAnalysis: true,\n });\n }\n\n /**\n * Obtém detalhes de uma sessão\n */\n async getSession(sessionId: string): Promise<WallySession> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}`;\n return this.request<WallySession>('GET', endpoint);\n }\n\n /**\n * Executa uma requisição HTTP genérica\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n body?: unknown,\n ): Promise<T> {\n const options: RequestInit = {\n method,\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(this.config.timeout),\n };\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorData.error || `Erro ${response.status}`;\n } catch {\n errorMessage = `Erro ${response.status}: ${response.statusText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * Plugin Cypress para integração com Wally\n *\n * Este módulo é executado no Node.js (setupNodeEvents) e gerencia:\n * - Sessão de navegação\n * - Comunicação com API Wally\n * - Ciclo de vida dos testes\n *\n * @example\n * // cypress.config.ts\n * import { wallyPlugin } from '@equallyze/wally-cypress/plugin';\n *\n * export default defineConfig({\n * e2e: {\n * setupNodeEvents(on, config) {\n * wallyPlugin(on, config, {\n * apiKey: process.env.WALLY_API_KEY,\n * projectId: process.env.WALLY_PROJECT_ID,\n * });\n * return config;\n * },\n * },\n * });\n */\n\nimport { WallyApiClient } from './api-client';\nimport type {\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallyPage,\n WallyPluginState,\n WallySession,\n} from './types';\n\n/**\n * Estado global do plugin\n */\nconst state: WallyPluginState = {\n config: null,\n session: null,\n initialized: false,\n lastError: null,\n};\n\n/**\n * Cliente API (inicializado no before:run)\n */\nlet apiClient: WallyApiClient | null = null;\n\n/**\n * Logger\n */\nfunction log(message: string, ...args: unknown[]) {\n console.log(`[Wally] ${message}`, ...args);\n}\n\nfunction logError(message: string, error?: Error) {\n console.error(`[Wally] ❌ ${message}`, error?.message || '');\n state.lastError = error?.message || message;\n}\n\n/**\n * Inicializa o plugin Wally\n */\nasync function initialize(config: WallyConfig): Promise<boolean> {\n try {\n log('🚀 Inicializando plugin...');\n\n // Valida configuração obrigatória\n if (!config.apiKey) {\n throw new Error('apiKey é obrigatório');\n }\n if (!config.projectId) {\n throw new Error('projectId é obrigatório');\n }\n\n // Resolve configuração (valida API Key e obtém organizationId)\n const resolvedConfig = await WallyApiClient.resolveConfig(config);\n state.config = resolvedConfig;\n\n // Cria cliente API\n apiClient = new WallyApiClient(resolvedConfig);\n\n state.initialized = true;\n log('✅ Plugin inicializado', {\n organizationId: resolvedConfig.organizationId,\n projectId: resolvedConfig.projectId,\n environment: resolvedConfig.environment,\n });\n\n return true;\n } catch (error) {\n logError('Falha ao inicializar plugin', error as Error);\n state.initialized = false;\n return false;\n }\n}\n\n/**\n * Inicia uma nova sessão de navegação\n */\nasync function startSession(baseUrl?: string): Promise<WallySession | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (state.session) {\n log('⚠️ Sessão já ativa, reutilizando:', state.session.id);\n return state.session;\n }\n\n try {\n log('🎬 Criando sessão de navegação...');\n\n const response = await apiClient.createSession({\n name: `Cypress - ${new Date().toLocaleString('pt-BR')}`,\n description: 'Sessão automática via wally-cypress',\n baseUrl,\n });\n\n state.session = {\n id: response.id,\n organizationId: state.config?.organizationId || '',\n status: 'ACTIVE',\n startedAt: new Date(),\n pages: [],\n };\n\n log('✅ Sessão criada:', state.session.id);\n return state.session;\n } catch (error) {\n logError('Falha ao criar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Captura uma página e envia para o backend\n */\nasync function capturePage(pageName: string, url: string, html: string): Promise<WallyPage | null> {\n if (!state.initialized || !apiClient || !state.session) {\n logError('Plugin não inicializado ou sessão não ativa');\n return null;\n }\n\n try {\n log(`📄 Capturando página: \"${pageName}\" (${url})`);\n\n const response = await apiClient.addPageBinary(state.session.id, {\n url,\n title: pageName,\n html,\n });\n\n const page: WallyPage = {\n id: response.pageId,\n url,\n title: pageName,\n timestamp: new Date(),\n contentSize: response.totalSize,\n };\n\n state.session.pages.push(page);\n\n log(`✅ Página capturada: ${pageName} (${response.totalPages} total)`);\n return page;\n } catch (error) {\n logError(`Falha ao capturar página: ${pageName}`, error as Error);\n return null;\n }\n}\n\n/**\n * Finaliza a sessão e inicia análise\n */\nasync function finishSession(): Promise<FinishSessionResponse | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (!state.session) {\n log('⚠️ Nenhuma sessão ativa para finalizar');\n return null;\n }\n\n try {\n log('🏁 Finalizando sessão...');\n\n const response = await apiClient.finishSession(state.session.id);\n\n log('✅ Sessão finalizada:', {\n sessionId: response.sessionId,\n totalPages: response.totalPages,\n analysisId: response.analysisId,\n });\n\n // Limpa estado\n const result = response;\n state.session = null;\n\n return result;\n } catch (error) {\n logError('Falha ao finalizar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Obtém o estado atual da sessão\n */\nfunction getSession(): WallySession | null {\n return state.session;\n}\n\n/**\n * Obtém configuração atual\n */\nfunction getConfig(): ResolvedConfig | null {\n return state.config;\n}\n\n/**\n * Plugin principal para Cypress\n *\n * @param on - Objeto de eventos Cypress\n * @param config - Configuração Cypress\n * @param wallyConfig - Configuração do plugin Wally\n */\nexport function wallyPlugin(\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n wallyConfig: WallyConfig,\n): void {\n // Registra tasks para comunicação com os comandos\n on('task', {\n /**\n * Inicializa o plugin (chamado automaticamente no before:run)\n */\n 'wally:initialize': async () => {\n const success = await initialize(wallyConfig);\n return success;\n },\n\n /**\n * Inicia uma nova sessão de navegação\n */\n 'wally:startSession': async (baseUrl?: string) => {\n const session = await startSession(baseUrl);\n return session;\n },\n\n /**\n * Captura uma página\n */\n 'wally:capturePage': async (args: { pageName: string; url: string; html: string }) => {\n const page = await capturePage(args.pageName, args.url, args.html);\n return page;\n },\n\n /**\n * Finaliza a sessão\n */\n 'wally:finishSession': async () => {\n const result = await finishSession();\n return result;\n },\n\n /**\n * Obtém a sessão atual\n */\n 'wally:getSession': () => {\n return getSession();\n },\n\n /**\n * Obtém configuração atual\n */\n 'wally:getConfig': () => {\n return getConfig();\n },\n\n /**\n * Obtém último erro\n */\n 'wally:getLastError': () => {\n return state.lastError;\n },\n });\n\n // Hook: antes de iniciar os testes\n on('before:run', async () => {\n log('📦 Hook before:run - Inicializando Wally...');\n await initialize(wallyConfig);\n });\n\n // Hook: após finalizar os testes\n on('after:run', async () => {\n log('📦 Hook after:run - Finalizando Wally...');\n if (state.session) {\n await finishSession();\n }\n });\n\n // Hook: antes de cada spec\n on('before:spec', async (spec) => {\n log(`📋 Hook before:spec - ${spec.relative}`);\n\n // Garante que plugin está inicializado\n if (!state.initialized) {\n await initialize(wallyConfig);\n }\n\n // Inicia sessão para esta spec (se não houver sessão ativa)\n if (!state.session) {\n await startSession(config.baseUrl || undefined);\n }\n });\n\n // Hook: após cada spec (opcional: pode manter sessão entre specs)\n on('after:spec', async (spec, results) => {\n log(`📋 Hook after:spec - ${spec.relative}`, {\n tests: results.stats.tests,\n passed: results.stats.passes,\n failed: results.stats.failures,\n });\n\n // Nota: Não finalizamos aqui para permitir múltiplas specs na mesma sessão\n // A sessão será finalizada no after:run\n });\n}\n\n// Export adicional para uso direto\nexport { capturePage, finishSession, getConfig, getSession, initialize, startSession };\n"]}
1
+ {"version":3,"sources":["../src/api-client.ts","../src/plugin.ts"],"names":[],"mappings":"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","file":"plugin.mjs","sourcesContent":["/**\n * API Client para comunicação com o backend Wally\n *\n * Segue o mesmo padrão do wally-chrome (SessionApi)\n */\n\nimport { gzipSync } from 'zlib';\nimport type {\n AddPageResponse,\n CreateSessionResponse,\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallySession,\n} from './types';\n\n/**\n * URLs base por ambiente\n */\nconst ENVIRONMENTS = {\n production: 'https://acessibilidade.global/backend/services/v0.0.1',\n staging: 'https://stg.acessibilidade.global/backend/services/v0.0.1',\n development: 'http://localhost:3000/backend/services/v0.0.1',\n} as const;\n\n/**\n * Cliente HTTP para API Wally\n */\nexport class WallyApiClient {\n private config: ResolvedConfig;\n\n constructor(config: ResolvedConfig) {\n this.config = config;\n }\n\n /**\n * Resolve a configuração, extraindo organizationId da API Key\n */\n static async resolveConfig(config: WallyConfig): Promise<ResolvedConfig> {\n // Determina URL base\n const apiUrl = config.apiUrl || ENVIRONMENTS[config.environment || 'production'];\n\n // Valida API Key e extrai organizationId\n const orgId = await WallyApiClient.validateApiKey(apiUrl, config.apiKey);\n\n return {\n apiKey: config.apiKey,\n projectId: config.projectId,\n normId: config.normId,\n qualityGateId: config.qualityGateId,\n environment: config.environment || 'production',\n apiUrl,\n timeout: config.timeout ?? 30000,\n failOnError: config.failOnError ?? false,\n organizationId: orgId,\n };\n }\n\n /**\n * Valida a API Key e retorna o organizationId\n */\n private static async validateApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const response = await fetch(`${apiUrl}/_/auth/api-key/info`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Falha ao validar API Key: ${response.status} - ${errorText}`);\n }\n\n const data = (await response.json()) as { organizationId?: string };\n\n if (!data.organizationId) {\n throw new Error('API Key inválida: organizationId não encontrado na resposta');\n }\n\n return data.organizationId;\n }\n\n /**\n * Cria uma nova sessão de navegação\n */\n async createSession(\n options: {\n name?: string;\n description?: string;\n baseUrl?: string;\n } = {},\n ): Promise<CreateSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions`;\n\n const body = {\n projectId: this.config.projectId,\n normId: this.config.normId,\n qualityGateId: this.config.qualityGateId,\n source: 'cypress',\n name: options.name || `Cypress Session - ${new Date().toLocaleString('pt-BR')}`,\n description: options.description,\n baseUrl: options.baseUrl,\n metadata: {\n cypressVersion: typeof Cypress !== 'undefined' ? Cypress.version : 'unknown',\n nodeVersion: process.version,\n platform: process.platform,\n },\n };\n\n const response = await this.request<CreateSessionResponse>('POST', endpoint, body);\n return response;\n }\n\n /**\n * Adiciona uma página à sessão usando upload binário comprimido (gzip)\n */\n async addPageBinary(\n sessionId: string,\n pageData: { url: string; title: string; html: string },\n ): Promise<AddPageResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/pages/binary`;\n\n // Comprime o HTML com gzip\n const htmlBuffer = Buffer.from(pageData.html, 'utf-8');\n const compressedBuffer = gzipSync(htmlBuffer);\n\n const timestamp = new Date().toISOString();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/gzip',\n 'X-Page-Url': pageData.url,\n 'X-Page-Title': encodeURIComponent(pageData.title),\n 'X-Page-Timestamp': timestamp,\n },\n body: compressedBuffer,\n signal: AbortSignal.timeout(this.config.timeout),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Erro ao enviar página: ${response.status} - ${errorText}`);\n }\n\n return response.json() as Promise<AddPageResponse>;\n }\n\n /**\n * Finaliza a sessão e opcionalmente inicia análise\n */\n async finishSession(sessionId: string): Promise<FinishSessionResponse> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}/finish`;\n\n return this.request<FinishSessionResponse>('POST', endpoint, {\n startAnalysis: true,\n });\n }\n\n /**\n * Obtém detalhes de uma sessão\n */\n async getSession(sessionId: string): Promise<WallySession> {\n const endpoint = `${this.config.apiUrl}/${this.config.organizationId}/sessions/${sessionId}`;\n return this.request<WallySession>('GET', endpoint);\n }\n\n /**\n * Executa uma requisição HTTP genérica\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE',\n url: string,\n body?: unknown,\n ): Promise<T> {\n const options: RequestInit = {\n method,\n headers: {\n 'x-api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n },\n signal: AbortSignal.timeout(this.config.timeout),\n };\n\n if (body && method !== 'GET') {\n options.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, options);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage: string;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorData.error || `Erro ${response.status}`;\n } catch {\n errorMessage = `Erro ${response.status}: ${response.statusText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n return response.json() as Promise<T>;\n }\n}\n","/**\n * Plugin Cypress para integração com Wally\n *\n * Este módulo é executado no Node.js (setupNodeEvents) e gerencia:\n * - Sessão de navegação\n * - Comunicação com API Wally\n * - Ciclo de vida dos testes\n *\n * @example\n * // cypress.config.ts\n * import { wallyPlugin } from '@equallyze/wally-cypress/plugin';\n *\n * export default defineConfig({\n * e2e: {\n * setupNodeEvents(on, config) {\n * wallyPlugin(on, config, {\n * apiKey: process.env.WALLY_API_KEY,\n * projectId: process.env.WALLY_PROJECT_ID,\n * });\n * return config;\n * },\n * },\n * });\n */\n\nimport { WallyApiClient } from './api-client';\nimport type {\n FinishSessionResponse,\n ResolvedConfig,\n WallyConfig,\n WallyPage,\n WallyPluginState,\n WallySession,\n} from './types';\n\n/**\n * Estado global do plugin\n */\nconst state: WallyPluginState = {\n config: null,\n session: null,\n initialized: false,\n lastError: null,\n};\n\n/**\n * Cliente API (inicializado no before:run)\n */\nlet apiClient: WallyApiClient | null = null;\n\n/**\n * Logger\n */\nfunction log(message: string, ...args: unknown[]) {\n console.log(`[Wally] ${message}`, ...args);\n}\n\nfunction logError(message: string, error?: Error) {\n console.error(`[Wally] ❌ ${message}`, error?.message || '');\n state.lastError = error?.message || message;\n}\n\n/**\n * Inicializa o plugin Wally\n */\nasync function initialize(config: WallyConfig): Promise<boolean> {\n try {\n log('🚀 Inicializando plugin...');\n\n // Valida configuração obrigatória\n if (!config.apiKey) {\n throw new Error('apiKey é obrigatório');\n }\n if (!config.projectId) {\n throw new Error('projectId é obrigatório');\n }\n\n // Resolve configuração (valida API Key e obtém organizationId)\n const resolvedConfig = await WallyApiClient.resolveConfig(config);\n state.config = resolvedConfig;\n\n // Cria cliente API\n apiClient = new WallyApiClient(resolvedConfig);\n\n state.initialized = true;\n log('✅ Plugin inicializado', {\n organizationId: resolvedConfig.organizationId,\n projectId: resolvedConfig.projectId,\n environment: resolvedConfig.environment,\n });\n\n return true;\n } catch (error) {\n logError('Falha ao inicializar plugin', error as Error);\n state.initialized = false;\n return false;\n }\n}\n\n/**\n * Inicia uma nova sessão de navegação\n */\nasync function startSession(baseUrl?: string): Promise<WallySession | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (state.session) {\n log('⚠️ Sessão já ativa, reutilizando:', state.session.id);\n return state.session;\n }\n\n try {\n log('🎬 Criando sessão de navegação...');\n\n const response = await apiClient.createSession({\n name: `Cypress - ${new Date().toLocaleString('pt-BR')}`,\n description: 'Sessão automática via wally-cypress',\n baseUrl,\n });\n\n state.session = {\n id: response.id,\n organizationId: state.config?.organizationId || '',\n status: 'ACTIVE',\n startedAt: new Date(),\n pages: [],\n };\n\n log('✅ Sessão criada:', state.session.id);\n return state.session;\n } catch (error) {\n logError('Falha ao criar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Captura uma página e envia para o backend\n */\nasync function capturePage(pageName: string, url: string, html: string): Promise<WallyPage | null> {\n if (!state.initialized || !apiClient || !state.session) {\n logError('Plugin não inicializado ou sessão não ativa');\n return null;\n }\n\n try {\n log(`📄 Capturando página: \"${pageName}\" (${url})`);\n\n const response = await apiClient.addPageBinary(state.session.id, {\n url,\n title: pageName,\n html,\n });\n\n const page: WallyPage = {\n id: response.pageId,\n url,\n title: pageName,\n timestamp: new Date(),\n contentSize: response.totalSize,\n };\n\n state.session.pages.push(page);\n\n log(`✅ Página capturada: ${pageName} (${response.totalPages} total)`);\n return page;\n } catch (error) {\n logError(`Falha ao capturar página: ${pageName}`, error as Error);\n return null;\n }\n}\n\n/**\n * Finaliza a sessão e inicia análise\n */\nasync function finishSession(): Promise<FinishSessionResponse | null> {\n if (!state.initialized || !apiClient) {\n logError('Plugin não inicializado');\n return null;\n }\n\n if (!state.session) {\n log('⚠️ Nenhuma sessão ativa para finalizar');\n return null;\n }\n\n try {\n log('🏁 Finalizando sessão...');\n\n const response = await apiClient.finishSession(state.session.id);\n\n log('✅ Sessão finalizada:', {\n sessionId: response.sessionId,\n totalPages: response.totalPages,\n analysisId: response.analysisId,\n });\n\n // Limpa estado\n const result = response;\n state.session = null;\n\n return result;\n } catch (error) {\n logError('Falha ao finalizar sessão', error as Error);\n return null;\n }\n}\n\n/**\n * Obtém o estado atual da sessão\n */\nfunction getSession(): WallySession | null {\n return state.session;\n}\n\n/**\n * Obtém configuração atual\n */\nfunction getConfig(): ResolvedConfig | null {\n return state.config;\n}\n\n/**\n * Plugin principal para Cypress\n *\n * @param on - Objeto de eventos Cypress\n * @param config - Configuração Cypress\n * @param wallyConfig - Configuração do plugin Wally\n */\nexport function wallyPlugin(\n on: Cypress.PluginEvents,\n config: Cypress.PluginConfigOptions,\n wallyConfig: WallyConfig,\n): void {\n // Registra tasks para comunicação com os comandos\n on('task', {\n /**\n * Inicializa o plugin (chamado automaticamente no before:run)\n */\n 'wally:initialize': async () => {\n const success = await initialize(wallyConfig);\n return success;\n },\n\n /**\n * Inicia uma nova sessão de navegação\n */\n 'wally:startSession': async (baseUrl?: string) => {\n const session = await startSession(baseUrl);\n return session;\n },\n\n /**\n * Captura uma página\n */\n 'wally:capturePage': async (args: { pageName: string; url: string; html: string }) => {\n const page = await capturePage(args.pageName, args.url, args.html);\n return page;\n },\n\n /**\n * Finaliza a sessão\n */\n 'wally:finishSession': async () => {\n const result = await finishSession();\n return result;\n },\n\n /**\n * Obtém a sessão atual\n */\n 'wally:getSession': () => {\n return getSession();\n },\n\n /**\n * Obtém configuração atual\n */\n 'wally:getConfig': () => {\n return getConfig();\n },\n\n /**\n * Obtém último erro\n */\n 'wally:getLastError': () => {\n return state.lastError;\n },\n });\n\n // Hook: antes de iniciar os testes\n on('before:run', async () => {\n log('📦 Hook before:run - Inicializando Wally...');\n await initialize(wallyConfig);\n });\n\n // Hook: após finalizar os testes\n on('after:run', async () => {\n log('📦 Hook after:run - Finalizando Wally...');\n if (state.session) {\n await finishSession();\n }\n });\n\n // Hook: antes de cada spec\n on('before:spec', async (spec) => {\n log(`📋 Hook before:spec - ${spec.relative}`);\n\n // Garante que plugin está inicializado\n if (!state.initialized) {\n await initialize(wallyConfig);\n }\n\n // Inicia sessão para esta spec (se não houver sessão ativa)\n if (!state.session) {\n await startSession(config.baseUrl || undefined);\n }\n });\n\n // Hook: após cada spec (opcional: pode manter sessão entre specs)\n on('after:spec', async (spec, results) => {\n log(`📋 Hook after:spec - ${spec.relative}`, {\n tests: results.stats.tests,\n passed: results.stats.passes,\n failed: results.stats.failures,\n });\n\n // Nota: Não finalizamos aqui para permitir múltiplas specs na mesma sessão\n // A sessão será finalizada no after:run\n });\n}\n\n// Export adicional para uso direto\nexport { capturePage, finishSession, getConfig, getSession, initialize, startSession };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@equallyze/wally-cypress",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Plugin Cypress para integração com Wally - Plataforma de Testes de Acessibilidade",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",