@equallyze/wally-cypress 0.0.1 → 0.0.3

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/LICENSE CHANGED
@@ -1,21 +1,43 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Equallyze
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ PROPRIETARY LICENSE
2
+
3
+ Copyright (c) 2024-2026 Equallyze - Soluções em Acessibilidade Digital
4
+
5
+ ALL RIGHTS RESERVED
6
+
7
+ Este software e a documentação associada são propriedade exclusiva da Equallyze.
8
+
9
+ RESTRIÇÕES DE USO:
10
+
11
+ 1. LICENÇA LIMITADA
12
+ Este pacote está disponível exclusivamente para clientes com licença ativa da
13
+ plataforma Wally (https://acessibilidade.global).
14
+
15
+ 2. PROIBIÇÕES
16
+ É expressamente PROIBIDO:
17
+ - Redistribuir, sublicenciar ou vender este software
18
+ - Modificar, fazer engenharia reversa ou criar trabalhos derivados
19
+ - Usar para fins comerciais sem autorização expressa da Equallyze
20
+ - Remover ou alterar avisos de copyright
21
+
22
+ 3. AUTORIZAÇÃO DE USO
23
+ O uso é permitido apenas para:
24
+ - Integração com a plataforma Wally em projetos autorizados
25
+ - Testes de acessibilidade dentro do escopo da licença contratada
26
+ - Desenvolvimento em ambientes aprovados pela Equallyze
27
+
28
+ 4. RESCISÃO
29
+ Esta licença é automaticamente rescindida em caso de:
30
+ - Término da licença da plataforma Wally
31
+ - Violação de qualquer termo desta licença
32
+ - Solicitação da Equallyze
33
+
34
+ 5. GARANTIAS E RESPONSABILIDADES
35
+ Este software é fornecido "NO ESTADO EM QUE SE ENCONTRA", sem garantias
36
+ de qualquer tipo, expressas ou implícitas.
37
+
38
+ 6. CONTATO
39
+ Para informações sobre licenciamento ou autorização de uso:
40
+ Email: contato@equallyze.com
41
+ Website: https://equallyze.com
42
+
43
+ EQUALLYZE - Accessibility for All
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > Plugin Cypress para integração com a plataforma **Wally** de testes automatizados de acessibilidade digital.
4
4
 
5
5
  [![npm version](https://badge.fury.io/js/@equallyze%2Fwally-cypress.svg)](https://www.npmjs.com/package/@equallyze/wally-cypress)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![License](https://img.shields.io/badge/License-Proprietary-red.svg)](https://equallyze.com)
7
7
 
8
8
  ---
9
9
 
@@ -340,7 +340,18 @@ O plugin finaliza automaticamente no hook `after:run`. Verifique se:
340
340
 
341
341
  ## 📄 Licença
342
342
 
343
- MIT © [Equallyze](https://equallyze.com)
343
+ **UNLICENSED** - Software Proprietário © [Equallyze](https://equallyze.com/)
344
+
345
+ Este software é de propriedade exclusiva da Equallyze. Todos os direitos reservados.
346
+
347
+ O uso deste pacote está restrito a:
348
+
349
+ - ✅ Clientes com licença ativa da plataforma Wally
350
+ - ✅ Projetos autorizados pela Equallyze
351
+ - ❌ Uso comercial não autorizado é proibido
352
+ - ❌ Redistribuição não é permitida
353
+
354
+ Para mais informações sobre licenciamento, entre em contato: [contato@equallyze.com](mailto:contato@equallyze.com)
344
355
 
345
356
  ---
346
357
 
@@ -411,6 +422,6 @@ O projeto requer cobertura mínima de **50%** em:
411
422
 
412
423
  ## 🔗 Links
413
424
 
414
- - [Documentação Wally](https://docs.wally.equallyze.com)
425
+ - [Documentação Wally](https://acessibilidade.global/documentacao)
415
426
  - [Dashboard Wally](https://acessibilidade.global)
416
427
  - [Suporte](mailto:suporte@equallyze.com)
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://api.acessibilidade.global/backend/services/v0.0.1",
8
+ staging: "https://api-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://api.acessibilidade.global/backend/services/v0.0.1',\n staging: 'https://api-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://api.acessibilidade.global/backend/services/v0.0.1",
6
+ staging: "https://api-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://api.acessibilidade.global/backend/services/v0.0.1',\n staging: 'https://api-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://api.acessibilidade.global/backend/services/v0.0.1",
8
+ staging: "https://api-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://api.acessibilidade.global/backend/services/v0.0.1',\n staging: 'https://api-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://api.acessibilidade.global/backend/services/v0.0.1",
6
+ staging: "https://api-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":";;;AAmBA,IAAM,YAAA,GAAe;AAAA,EACnB,UAAA,EAAY,yDAAA;AAAA,EACZ,OAAA,EAAS,6DAAA;AAAA,EACT,WAAA,EAAa;AACf,CAAA;AAKO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EAClB,MAAA;AAAA,EAER,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,cAAc,MAAA,EAA8C;AAEvE,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,eAAe,YAAY,CAAA;AAG/E,IAAA,MAAM,QAAQ,MAAM,eAAA,CAAe,cAAA,CAAe,MAAA,EAAQ,OAAO,MAAM,CAAA;AAEvE,IAAA,OAAO;AAAA,MACL,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,WAAA,EAAa,OAAO,WAAA,IAAe,YAAA;AAAA,MACnC,MAAA;AAAA,MACA,OAAA,EAAS,OAAO,OAAA,IAAW,GAAA;AAAA,MAC3B,WAAA,EAAa,OAAO,WAAA,IAAe,KAAA;AAAA,MACnC,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB,cAAA,CAAe,MAAA,EAAgB,MAAA,EAAiC;AACnF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,oBAAA,CAAA,EAAwB;AAAA,MAC5D,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,WAAA,EAAa,MAAA;AAAA,QACb,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAS,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAE,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAI,MAAM,mEAA6D,CAAA;AAAA,IAC/E;AAEA,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,OAAA,GAII,EAAC,EAC2B;AAChC,IAAA,MAAM,QAAA,GAAW,GAAG,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,cAAc,CAAA,SAAA,CAAA;AAEpE,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,MACpB,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA,kBAAA,EAAA,qBAAyB,IAAA,EAAK,EAAE,cAAA,CAAe,OAAO,CAAC,CAAA,CAAA;AAAA,MAC7E,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAA,EAAU;AAAA,QACR,cAAA,EAAgB,OAAO,OAAA,KAAY,WAAA,GAAc,QAAQ,OAAA,GAAU,SAAA;AAAA,QACnE,aAAa,OAAA,CAAQ,OAAA;AAAA,QACrB,UAAU,OAAA,CAAQ;AAAA;AACpB,KACF;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAA+B,MAAA,EAAQ,UAAU,IAAI,CAAA;AACjF,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,SAAA,EACA,QAAA,EAC0B;AAC1B,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,UAAA,EAAa,SAAS,CAAA,aAAA,CAAA;AAG1F,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAM,OAAO,CAAA;AACrD,IAAA,MAAM,gBAAA,GAAmB,SAAS,UAAU,CAAA;AAE5C,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEzC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,EAAU;AAAA,MACrC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,WAAA,EAAa,KAAK,MAAA,CAAO,MAAA;AAAA,QACzB,cAAA,EAAgB,kBAAA;AAAA,QAChB,cAAc,QAAA,CAAS,GAAA;AAAA,QACvB,cAAA,EAAgB,kBAAA,CAAmB,QAAA,CAAS,KAAK,CAAA;AAAA,QACjD,kBAAA,EAAoB;AAAA,OACtB;AAAA,MACA,IAAA,EAAM,gBAAA;AAAA,MACN,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAO;AAAA,KAChD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA0B,SAAS,MAAM,CAAA,GAAA,EAAM,SAAS,CAAA,CAAE,CAAA;AAAA,IAC5E;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAAmD;AACrE,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,UAAA,EAAa,SAAS,CAAA,OAAA,CAAA;AAE1F,IAAA,OAAO,IAAA,CAAK,OAAA,CAA+B,MAAA,EAAQ,QAAA,EAAU;AAAA,MAC3D,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAA0C;AACzD,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAsB,KAAA,EAAO,QAAQ,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,MAAA,EACA,GAAA,EACA,IAAA,EACY;AACZ,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,WAAA,EAAa,KAAK,MAAA,CAAO,MAAA;AAAA,QACzB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAO;AAAA,KACjD;AAEA,IAAA,IAAI,IAAA,IAAQ,WAAW,KAAA,EAAO;AAC5B,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AAEzC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,IAAI,YAAA;AAEJ,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACtC,QAAA,YAAA,GAAe,UAAU,OAAA,IAAW,SAAA,CAAU,KAAA,IAAS,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,CAAA;AAAA,MAChF,CAAA,CAAA,MAAQ;AACN,QAAA,YAAA,GAAe,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,IAAI,MAAM,YAAY,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AACF,CAAA;;;AC3KA,IAAM,KAAA,GAA0B;AAAA,EAC9B,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,WAAA,EAAa,KAAA;AAAA,EACb,SAAA,EAAW;AACb,CAAA;AAKA,IAAI,SAAA,GAAmC,IAAA;AAKvC,SAAS,GAAA,CAAI,YAAoB,IAAA,EAAiB;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAC3C;AAEA,SAAS,QAAA,CAAS,SAAiB,KAAA,EAAe;AAChD,EAAA,OAAA,CAAQ,MAAM,CAAA,eAAA,EAAa,OAAO,CAAA,CAAA,EAAI,KAAA,EAAO,WAAW,EAAE,CAAA;AAC1D,EAAA,KAAA,CAAM,SAAA,GAAY,OAAO,OAAA,IAAW,OAAA;AACtC;AAKA,eAAe,WAAW,MAAA,EAAuC;AAC/D,EAAA,IAAI;AACF,IAAA,GAAA,CAAI,mCAA4B,CAAA;AAGhC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,MAAM,4BAAsB,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAI,MAAM,+BAAyB,CAAA;AAAA,IAC3C;AAGA,IAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,CAAe,aAAA,CAAc,MAAM,CAAA;AAChE,IAAA,KAAA,CAAM,MAAA,GAAS,cAAA;AAGf,IAAA,SAAA,GAAY,IAAI,eAAe,cAAc,CAAA;AAE7C,IAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,IAAA,GAAA,CAAI,4BAAA,EAAyB;AAAA,MAC3B,gBAAgB,cAAA,CAAe,cAAA;AAAA,MAC/B,WAAW,cAAA,CAAe,SAAA;AAAA,MAC1B,aAAa,cAAA,CAAe;AAAA,KAC7B,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,QAAA,CAAS,+BAA+B,KAAc,CAAA;AACtD,IAAA,KAAA,CAAM,WAAA,GAAc,KAAA;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAe,aAAa,OAAA,EAAgD;AAC1E,EAAA,IAAI,CAAC,KAAA,CAAM,WAAA,IAAe,CAAC,SAAA,EAAW;AACpC,IAAA,QAAA,CAAS,4BAAyB,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,GAAA,CAAI,mDAAA,EAAqC,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AACzD,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AAEA,EAAA,IAAI;AACF,IAAA,GAAA,CAAI,mDAAmC,CAAA;AAEvC,IAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,aAAA,CAAc;AAAA,MAC7C,MAAM,CAAA,UAAA,EAAA,iBAAa,IAAI,MAAK,EAAE,cAAA,CAAe,OAAO,CAAC,CAAA,CAAA;AAAA,MACrD,WAAA,EAAa,2CAAA;AAAA,MACb;AAAA,KACD,CAAA;AAED,IAAA,KAAA,CAAM,OAAA,GAAU;AAAA,MACd,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,cAAA,EAAgB,KAAA,CAAM,MAAA,EAAQ,cAAA,IAAkB,EAAA;AAAA,MAChD,MAAA,EAAQ,QAAA;AAAA,MACR,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,OAAO;AAAC,KACV;AAEA,IAAA,GAAA,CAAI,0BAAA,EAAoB,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AACxC,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf,SAAS,KAAA,EAAO;AACd,IAAA,QAAA,CAAS,4BAAyB,KAAc,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAe,WAAA,CAAY,QAAA,EAAkB,GAAA,EAAa,IAAA,EAAyC;AACjG,EAAA,IAAI,CAAC,KAAA,CAAM,WAAA,IAAe,CAAC,SAAA,IAAa,CAAC,MAAM,OAAA,EAAS;AACtD,IAAA,QAAA,CAAS,sDAA6C,CAAA;AACtD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,GAAA,CAAI,CAAA,iCAAA,EAA0B,QAAQ,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,CAAG,CAAA;AAElD,IAAA,MAAM,WAAW,MAAM,SAAA,CAAU,aAAA,CAAc,KAAA,CAAM,QAAQ,EAAA,EAAI;AAAA,MAC/D,GAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,MAAM,IAAA,GAAkB;AAAA,MACtB,IAAI,QAAA,CAAS,MAAA;AAAA,MACb,GAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,aAAa,QAAA,CAAS;AAAA,KACxB;AAEA,IAAA,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAE7B,IAAA,GAAA,CAAI,CAAA,4BAAA,EAAuB,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,OAAA,CAAS,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,QAAA,CAAS,CAAA,6BAAA,EAA6B,QAAQ,CAAA,CAAA,EAAI,KAAc,CAAA;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAe,aAAA,GAAuD;AACpE,EAAA,IAAI,CAAC,KAAA,CAAM,WAAA,IAAe,CAAC,SAAA,EAAW;AACpC,IAAA,QAAA,CAAS,4BAAyB,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,IAAA,GAAA,CAAI,qDAAwC,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,GAAA,CAAI,oCAA0B,CAAA;AAE9B,IAAA,MAAM,WAAW,MAAM,SAAA,CAAU,aAAA,CAAc,KAAA,CAAM,QAAQ,EAAE,CAAA;AAE/D,IAAA,GAAA,CAAI,8BAAA,EAAwB;AAAA,MAC1B,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,YAAY,QAAA,CAAS;AAAA,KACtB,CAAA;AAGD,IAAA,MAAM,MAAA,GAAS,QAAA;AACf,IAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAEhB,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,QAAA,CAAS,gCAA6B,KAAc,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,UAAA,GAAkC;AACzC,EAAA,OAAO,KAAA,CAAM,OAAA;AACf;AAKA,SAAS,SAAA,GAAmC;AAC1C,EAAA,OAAO,KAAA,CAAM,MAAA;AACf;AASO,SAAS,WAAA,CACd,EAAA,EACA,MAAA,EACA,WAAA,EACM;AAEN,EAAA,EAAA,CAAG,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,IAIT,oBAAoB,YAAY;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,WAAW,CAAA;AAC5C,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,oBAAA,EAAsB,OAAO,OAAA,KAAqB;AAChD,MAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,OAAO,CAAA;AAC1C,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,mBAAA,EAAqB,OAAO,IAAA,KAA0D;AACpF,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,IAAA,CAAK,UAAU,IAAA,CAAK,GAAA,EAAK,KAAK,IAAI,CAAA;AACjE,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,uBAAuB,YAAY;AACjC,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,EAAc;AACnC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,oBAAoB,MAAM;AACxB,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,mBAAmB,MAAM;AACvB,MAAA,OAAO,SAAA,EAAU;AAAA,IACnB,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,sBAAsB,MAAM;AAC1B,MAAA,OAAO,KAAA,CAAM,SAAA;AAAA,IACf;AAAA,GACD,CAAA;AAGD,EAAA,EAAA,CAAG,cAAc,YAAY;AAC3B,IAAA,GAAA,CAAI,oDAA6C,CAAA;AACjD,IAAA,MAAM,WAAW,WAAW,CAAA;AAAA,EAC9B,CAAC,CAAA;AAGD,EAAA,EAAA,CAAG,aAAa,YAAY;AAC1B,IAAA,GAAA,CAAI,iDAA0C,CAAA;AAC9C,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,MAAM,aAAA,EAAc;AAAA,IACtB;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,EAAA,CAAG,aAAA,EAAe,OAAO,IAAA,KAAS;AAChC,IAAA,GAAA,CAAI,CAAA,6BAAA,EAAyB,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAG5C,IAAA,IAAI,CAAC,MAAM,WAAA,EAAa;AACtB,MAAA,MAAM,WAAW,WAAW,CAAA;AAAA,IAC9B;AAGA,IAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,MAAA,MAAM,YAAA,CAAa,MAAA,CAAO,OAAA,IAAW,MAAS,CAAA;AAAA,IAChD;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,EAAA,CAAG,YAAA,EAAc,OAAO,IAAA,EAAM,OAAA,KAAY;AACxC,IAAA,GAAA,CAAI,CAAA,4BAAA,EAAwB,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI;AAAA,MAC3C,KAAA,EAAO,QAAQ,KAAA,CAAM,KAAA;AAAA,MACrB,MAAA,EAAQ,QAAQ,KAAA,CAAM,MAAA;AAAA,MACtB,MAAA,EAAQ,QAAQ,KAAA,CAAM;AAAA,KACvB,CAAA;AAAA,EAIH,CAAC,CAAA;AACH","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://api.acessibilidade.global/backend/services/v0.0.1',\n staging: 'https://api-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.1",
3
+ "version": "0.0.3",
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",
@@ -72,7 +72,7 @@
72
72
  "acessibilidade"
73
73
  ],
74
74
  "author": "Equallyze <contato@equallyze.com>",
75
- "license": "MIT",
75
+ "license": "UNLICENSED",
76
76
  "repository": {
77
77
  "type": "git",
78
78
  "url": "https://gitlab.com/ucloud-tech/wally/wally-cypress.git"