happo 6.6.0 → 6.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/cli/cancelJob-L56QEC6Y.js +10 -0
  2. package/dist/cli/{chunk-DUWOS4XT.js → chunk-BVVPJ3V6.js} +3 -2
  3. package/dist/cli/chunk-BVVPJ3V6.js.map +7 -0
  4. package/dist/cli/{chunk-OXGH6FW4.js → chunk-DOH7HISI.js} +2 -2
  5. package/dist/cli/{chunk-QC2HOKDQ.js → chunk-FW4HKJ6L.js} +2 -2
  6. package/dist/cli/{chunk-PRPDWPU3.js → chunk-INJGCQMT.js} +3 -3
  7. package/dist/cli/{chunk-AFAI3HL3.js → chunk-UCUGHOFD.js} +2 -2
  8. package/dist/cli/{chunk-LCNHMIOU.js → chunk-VCUVRXFR.js} +2 -2
  9. package/dist/cli/createAsyncComparison-CVYTHWJ7.js +10 -0
  10. package/dist/cli/{createAsyncReport-IQO7YVCA.js → createAsyncReport-FAGR4IPW.js} +4 -4
  11. package/dist/cli/{getFlakes-HICLTPZC.js → getFlakes-LUOZT4EW.js} +4 -4
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/main.js +19 -12
  14. package/dist/cli/main.js.map +2 -2
  15. package/dist/cli/package-EZWATLA4.js +7 -0
  16. package/dist/cli/parseOptions.d.ts +3 -0
  17. package/dist/cli/parseOptions.d.ts.map +1 -1
  18. package/dist/cli/{prepareSnapRequests-VFWDWE5X.js → prepareSnapRequests-RQRFL6WX.js} +16 -5
  19. package/dist/cli/{prepareSnapRequests-VFWDWE5X.js.map → prepareSnapRequests-RQRFL6WX.js.map} +3 -3
  20. package/dist/cli/startJob-LZKPRPX7.js +10 -0
  21. package/dist/cli/{wrapper-IQJTUXE4.js → wrapper-6TVXS2XH.js} +8 -9
  22. package/dist/cli/wrapper-6TVXS2XH.js.map +7 -0
  23. package/dist/cypress/task.js +14 -2
  24. package/dist/cypress/task.js.map +3 -3
  25. package/dist/e2e/wrapper.d.ts +1 -2
  26. package/dist/e2e/wrapper.d.ts.map +1 -1
  27. package/dist/environment/index.d.ts +1 -0
  28. package/dist/environment/index.d.ts.map +1 -1
  29. package/dist/network/uploadAssets.d.ts.map +1 -1
  30. package/dist/playwright/index.js +14 -2
  31. package/dist/playwright/index.js.map +3 -3
  32. package/package.json +2 -1
  33. package/dist/cli/cancelJob-HZDX6274.js +0 -10
  34. package/dist/cli/chunk-DUWOS4XT.js.map +0 -7
  35. package/dist/cli/createAsyncComparison-FQQHINTM.js +0 -10
  36. package/dist/cli/package-RZI6QOJX.js +0 -7
  37. package/dist/cli/startJob-QZA4POSE.js +0 -10
  38. package/dist/cli/wrapper-IQJTUXE4.js.map +0 -7
  39. /package/dist/cli/{cancelJob-HZDX6274.js.map → cancelJob-L56QEC6Y.js.map} +0 -0
  40. /package/dist/cli/{chunk-OXGH6FW4.js.map → chunk-DOH7HISI.js.map} +0 -0
  41. /package/dist/cli/{chunk-QC2HOKDQ.js.map → chunk-FW4HKJ6L.js.map} +0 -0
  42. /package/dist/cli/{chunk-PRPDWPU3.js.map → chunk-INJGCQMT.js.map} +0 -0
  43. /package/dist/cli/{chunk-AFAI3HL3.js.map → chunk-UCUGHOFD.js.map} +0 -0
  44. /package/dist/cli/{chunk-LCNHMIOU.js.map → chunk-VCUVRXFR.js.map} +0 -0
  45. /package/dist/cli/{createAsyncComparison-FQQHINTM.js.map → createAsyncComparison-CVYTHWJ7.js.map} +0 -0
  46. /package/dist/cli/{createAsyncReport-IQO7YVCA.js.map → createAsyncReport-FAGR4IPW.js.map} +0 -0
  47. /package/dist/cli/{getFlakes-HICLTPZC.js.map → getFlakes-LUOZT4EW.js.map} +0 -0
  48. /package/dist/cli/{package-RZI6QOJX.js.map → package-EZWATLA4.js.map} +0 -0
  49. /package/dist/cli/{startJob-QZA4POSE.js.map → startJob-LZKPRPX7.js.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happo",
3
- "version": "6.6.0",
3
+ "version": "6.7.0",
4
4
  "description": "Catch unexpected visual and accessibility changes and UI bugs",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -73,6 +73,7 @@
73
73
  "test:cypress": "pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.cypress.config.ts e2e -- cypress run -C src/cypress/__cypress__/cypress.config.ts",
74
74
  "test:cypress:open": "cypress open -C src/cypress/__cypress__/cypress.config.ts",
75
75
  "test:playwright": "pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.playwright.config.ts e2e -- playwright test",
76
+ "test:playwright:nonce": "pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.playwright-nonce.config.ts --nonce $HAPPO_NONCE e2e -- playwright test && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.playwright-nonce.config.ts --nonce $HAPPO_NONCE finalize",
76
77
  "test:storybook": "pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.storybook.config.ts",
77
78
  "test:pages": "pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.pages.config.ts",
78
79
  "tsc": "tsc --build tsconfig.json"
@@ -1,10 +0,0 @@
1
- import {
2
- cancelJob
3
- } from "./chunk-PRPDWPU3.js";
4
- import "./chunk-OXGH6FW4.js";
5
- import "./chunk-AFAI3HL3.js";
6
- import "./chunk-DUWOS4XT.js";
7
- export {
8
- cancelJob as default
9
- };
10
- //# sourceMappingURL=cancelJob-HZDX6274.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../package.json"],
4
- "sourcesContent": ["{\n \"name\": \"happo\",\n \"version\": \"6.6.0\",\n \"description\": \"Catch unexpected visual and accessibility changes and UI bugs\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/happo/happo.git\"\n },\n \"bugs\": \"https://github.com/happo/happo/issues\",\n \"homepage\": \"https://happo.io\",\n \"bin\": {\n \"happo\": \"dist/cli/main.js\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/config/index.js\",\n \"types\": \"./dist/config/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/config/index.d.ts\",\n \"default\": \"./dist/config/index.js\"\n },\n \"./cypress\": {\n \"types\": \"./dist/cypress/index.d.ts\",\n \"default\": \"./dist/cypress/index.js\"\n },\n \"./cypress/task\": {\n \"types\": \"./dist/cypress/task.d.ts\",\n \"default\": \"./dist/cypress/task.js\"\n },\n \"./playwright\": {\n \"types\": \"./dist/playwright/index.d.ts\",\n \"default\": \"./dist/playwright/index.js\"\n },\n \"./custom\": {\n \"types\": \"./dist/custom/index.d.ts\",\n \"default\": \"./dist/custom/index.js\"\n },\n \"./storybook/addon\": {\n \"types\": \"./dist/storybook/browser/addon.d.ts\",\n \"default\": \"./dist/storybook/browser/addon.js\"\n },\n \"./storybook/decorator\": {\n \"types\": \"./dist/storybook/browser/decorator.d.ts\",\n \"default\": \"./dist/storybook/browser/decorator.js\"\n },\n \"./storybook/preset\": {\n \"types\": \"./dist/storybook/preset.d.ts\",\n \"default\": \"./dist/storybook/preset.js\"\n },\n \"./storybook/register\": {\n \"types\": \"./dist/storybook/browser/register.d.ts\",\n \"default\": \"./dist/storybook/browser/register.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"preset.js\"\n ],\n \"scripts\": {\n \"all\": \"node ./scripts/allchecks.ts\",\n \"build\": \"pnpm build:types && pnpm build:dist\",\n \"build:custom\": \"esbuild src/custom/__happo__/index.ts --bundle --format=iife --global-name=happoCustom --outfile=tmp/happo-custom/bundle.js --platform=browser --target=esnext\",\n \"build:dist\": \"node ./scripts/build.ts\",\n \"build:types\": \"pnpm tsc --pretty\",\n \"build:watch\": \"tsc --build --watch\",\n \"clean\": \"node ./scripts/clean.ts\",\n \"lint\": \"eslint .\",\n \"prepublishOnly\": \"pnpm clean && pnpm build\",\n \"storybook:dev\": \"storybook dev --config-dir src/storybook/__tests__/storybook-app -p ${PORT:-6007}\",\n \"test\": \"node --env-file-if-exists=.env.local ./scripts/test.ts\",\n \"test:custom\": \"pnpm build:dist && pnpm build:custom && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.custom.config.ts\",\n \"test:cypress\": \"pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.cypress.config.ts e2e -- cypress run -C src/cypress/__cypress__/cypress.config.ts\",\n \"test:cypress:open\": \"cypress open -C src/cypress/__cypress__/cypress.config.ts\",\n \"test:playwright\": \"pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.playwright.config.ts e2e -- playwright test\",\n \"test:storybook\": \"pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.storybook.config.ts\",\n \"test:pages\": \"pnpm build:dist && node --env-file-if-exists=.env.local dist/cli/main.js -c ./happoconfigs/happo.pages.config.ts\",\n \"tsc\": \"tsc --build tsconfig.json\"\n },\n \"browserslist\": {\n \"node\": [\n \"node 22\"\n ],\n \"browser\": [\n \"last 2 Chrome major versions\",\n \"last 2 Firefox major versions\",\n \"last 2 Safari major versions\",\n \"last 2 Edge major versions\"\n ],\n \"isomorphic\": [\n \"node 22\",\n \"last 2 Chrome major versions\",\n \"last 2 Firefox major versions\",\n \"last 2 Safari major versions\",\n \"last 2 Edge major versions\"\n ]\n },\n \"prettier\": {\n \"printWidth\": 85,\n \"singleQuote\": true,\n \"trailingComma\": \"all\",\n \"arrowParens\": \"always\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^10.0.1\",\n \"@playwright/test\": \"^1.55.1\",\n \"@reporters/github\": \"^1.11.0\",\n \"@storybook/builder-vite\": \"^10.0.1\",\n \"@storybook/react-vite\": \"^10.0.1\",\n \"@types/async-retry\": \"^1.4.9\",\n \"@types/base64-stream\": \"^1.0.5\",\n \"@types/jsdom\": \"^28.0.0\",\n \"@types/mime-types\": \"^3.0.1\",\n \"@types/multiparty\": \"^4.2.1\",\n \"@types/node\": \"^24.9.1\",\n \"@types/react\": \"^19.2.0\",\n \"@types/react-dom\": \"^19.2.0\",\n \"cypress\": \"^15.5.0\",\n \"esbuild\": \"^0.27.0\",\n \"eslint\": \"^10.0.2\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-compat\": \"^7.0.1\",\n \"eslint-plugin-depend\": \"^1.4.0\",\n \"eslint-plugin-simple-import-sort\": \"^12.1.1\",\n \"eslint-plugin-unicorn\": \"^63.0.0\",\n \"jiti\": \"^2.6.1\",\n \"jsdom\": \"^29.0.0\",\n \"multiparty\": \"^4.2.3\",\n \"prettier\": \"^3.6.2\",\n \"react\": \"^19.2.0\",\n \"react-dom\": \"^19.2.0\",\n \"react-error-boundary\": \"^6.0.0\",\n \"storybook\": \"^10.0.1\",\n \"typescript\": \"^5.9.2\",\n \"typescript-eslint\": \"^8.56.1\"\n },\n \"dependencies\": {\n \"async-retry\": \"^1.3.3\",\n \"base64-stream\": \"^1.0.0\",\n \"empathic\": \"^2.0.0\",\n \"fflate\": \"^0.8.2\",\n \"jose\": \"^6.1.0\",\n \"limit-concur\": \"^4.0.0\",\n \"mime-types\": \"^3.0.1\",\n \"srcset\": \"^5.0.2\"\n },\n \"storybook\": {\n \"displayName\": \"Happo\",\n \"icon\": \"https://happo.io/static/happo-hippo.png\",\n \"supportedFrameworks\": [\n \"angular\",\n \"ember\",\n \"html\",\n \"preact\",\n \"react\",\n \"react-native\",\n \"svelte\",\n \"vue\",\n \"web-components\"\n ],\n \"unsupportedFrameworks\": []\n },\n \"keywords\": [\n \"storybook-addon\",\n \"accessibility\",\n \"cypress\",\n \"playwright\",\n \"regression\",\n \"storybook\",\n \"test\",\n \"testing\",\n \"ui\",\n \"visual-regression\",\n \"visual\",\n \"vrt\"\n ],\n \"engines\": {\n \"node\": \"^22.18.0 || ^23.6.0 || >=24.0.0\"\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,10 +0,0 @@
1
- import {
2
- createAsyncComparison
3
- } from "./chunk-QC2HOKDQ.js";
4
- import "./chunk-OXGH6FW4.js";
5
- import "./chunk-AFAI3HL3.js";
6
- import "./chunk-DUWOS4XT.js";
7
- export {
8
- createAsyncComparison as default
9
- };
10
- //# sourceMappingURL=createAsyncComparison-FQQHINTM.js.map
@@ -1,7 +0,0 @@
1
- import {
2
- package_default
3
- } from "./chunk-DUWOS4XT.js";
4
- export {
5
- package_default as default
6
- };
7
- //# sourceMappingURL=package-RZI6QOJX.js.map
@@ -1,10 +0,0 @@
1
- import {
2
- startJob
3
- } from "./chunk-LCNHMIOU.js";
4
- import "./chunk-OXGH6FW4.js";
5
- import "./chunk-AFAI3HL3.js";
6
- import "./chunk-DUWOS4XT.js";
7
- export {
8
- startJob as default
9
- };
10
- //# sourceMappingURL=startJob-QZA4POSE.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/e2e/wrapper.ts"],
4
- "sourcesContent": ["import { spawn } from 'node:child_process';\nimport http from 'node:http';\n\nimport type { ConfigWithDefaults, E2EIntegration } from '../config/index.ts';\nimport type { EnvironmentResult } from '../environment/index.ts';\nimport cancelJob from '../network/cancelJob.ts';\nimport createAsyncComparison from '../network/createAsyncComparison.ts';\nimport makeHappoAPIRequest from '../network/makeHappoAPIRequest.ts';\nimport postGitHubComment from '../network/postGitHubComment.ts';\nimport startJob, { type StartJobResult } from '../network/startJob.ts';\nimport startServer, { type ServerInfo } from '../network/startServer.ts';\n\nlet allRequestIds: Set<number>;\n\nasync function postAsyncReport(\n requestIds: Array<number>,\n environment: EnvironmentResult,\n happoConfig: ConfigWithDefaults,\n) {\n const { afterSha, nonce, link, message } = environment;\n return await makeHappoAPIRequest(\n {\n path: `/api/async-reports/${afterSha}`,\n method: 'POST',\n body: {\n requestIds,\n project: happoConfig.project,\n nonce,\n link,\n message,\n },\n },\n happoConfig,\n { retryCount: 2 },\n );\n}\n\ntype Example = {\n component: string;\n variant: string;\n target: string;\n};\n\ntype Logger = Pick<Console, 'log' | 'error'>;\n\ninterface FinalizeAllOptions {\n happoConfig: ConfigWithDefaults;\n environment: EnvironmentResult;\n skippedExamplesJSON?: string;\n logger: Logger;\n}\n\nexport async function finalizeAll({\n happoConfig,\n environment,\n skippedExamplesJSON,\n logger,\n}: FinalizeAllOptions): Promise<void> {\n const { afterSha, nonce } = environment;\n\n if (!nonce) {\n throw new Error('[HAPPO] Missing --nonce argument');\n }\n\n const body: {\n project?: string | undefined;\n nonce: string;\n skippedExamples: Array<Example>;\n } = {\n project: happoConfig.project,\n nonce,\n skippedExamples: [],\n };\n\n if (skippedExamplesJSON) {\n try {\n const skippedExamples = JSON.parse(skippedExamplesJSON);\n body.skippedExamples = skippedExamples;\n } catch (e) {\n logger.error('Error when parsing --skippedExamples', skippedExamplesJSON);\n throw e;\n }\n }\n await makeHappoAPIRequest(\n {\n path: `/api/async-reports/${afterSha}/finalize`,\n method: 'POST',\n body,\n },\n happoConfig,\n { retryCount: 3 },\n );\n\n if (environment.beforeSha !== environment.afterSha) {\n const compareResult = await createAsyncComparison(\n happoConfig,\n environment,\n logger,\n );\n\n if (environment.link && environment.githubToken && happoConfig.githubApiUrl) {\n // githubToken and githubApiUrl are set which means that we should post\n // a comment to the PR.\n // https://docs.happo.io/docs/continuous-integration#posting-statuses-without-installing-the-happo-github-app\n await postGitHubComment({\n authToken: environment.githubToken,\n link: environment.link,\n statusImageUrl: compareResult.statusImageUrl,\n compareUrl: compareResult.compareUrl,\n githubApiUrl: happoConfig.githubApiUrl,\n });\n }\n }\n}\n\nasync function finalizeHappoReport(\n happoConfig: ConfigWithDefaults,\n environment: EnvironmentResult,\n job: StartJobResult,\n logger: Logger,\n) {\n if (!allRequestIds.size) {\n logger.log(`[HAPPO] No snapshots were recorded. Ignoring.`);\n return;\n }\n const reportResult = await postAsyncReport(\n [...allRequestIds],\n environment,\n happoConfig,\n );\n\n if (!reportResult) {\n throw new Error('Failed to create async Happo report');\n }\n\n const { nonce } = environment;\n\n if (!nonce) {\n // If there is a nonce, the comparison will happen when the finalize\n // command is called.\n const compareResult = await createAsyncComparison(\n happoConfig,\n environment,\n logger,\n );\n\n if (\n compareResult &&\n environment.link &&\n environment.githubToken &&\n happoConfig.githubApiUrl\n ) {\n // githubToken and githubApiUrl is set which means that we should post\n // a comment to the PR.\n // https://docs.happo.io/docs/continuous-integration#posting-statuses-without-installing-the-happo-github-app\n await postGitHubComment({\n authToken: environment.githubToken,\n link: environment.link,\n statusImageUrl: compareResult.statusImageUrl,\n compareUrl: compareResult.compareUrl,\n githubApiUrl: happoConfig.githubApiUrl,\n });\n }\n }\n logger.log(`[HAPPO] ${job.url}`);\n}\n\nfunction startE2EServer(\n environment: EnvironmentResult,\n happoConfig: ConfigWithDefaults,\n): Promise<ServerInfo> {\n function requestHandler(req: http.IncomingMessage, res: http.ServerResponse) {\n const bodyParts: Array<string> = [];\n req.on('data', (chunk: Buffer) => {\n bodyParts.push(chunk.toString());\n });\n req.on('end', async () => {\n const potentialIds = bodyParts\n .join('')\n .split('\\n')\n .filter(Boolean)\n .map((requestId) => Number.parseInt(requestId, 10));\n\n if (potentialIds.some((id) => Number.isNaN(id))) {\n res.writeHead(400);\n res.end('invalid payload');\n return;\n }\n\n for (const requestId of potentialIds) {\n allRequestIds.add(requestId);\n }\n\n const { nonce } = environment;\n if (nonce && potentialIds.length) {\n // Associate these snapRequests with the async report as soon as possible\n await postAsyncReport(potentialIds, environment, happoConfig);\n }\n res.writeHead(200);\n res.end('');\n });\n }\n return startServer(requestHandler);\n}\n\nfunction assertE2EIntegration(\n integration: NonNullable<ConfigWithDefaults['integration']>,\n): asserts integration is E2EIntegration {\n if (integration.type !== 'cypress' && integration.type !== 'playwright') {\n throw new Error(`Unsupported integration type: ${integration.type}`);\n }\n}\n\n/**\n * Runs a command with the wrapper and returns the exit code.\n *\n * @param dashdashCommandParts The command to run with the wrapper\n * @param happoConfig The Happo config\n * @param environment The environment\n * @param port The port to listen on\n * @param logger The logger\n * @returns The exit code of the command\n */\nexport default async function runWithWrapper(\n dashdashCommandParts: Array<string>,\n happoConfig: ConfigWithDefaults,\n environment: EnvironmentResult,\n logger: Logger,\n configFilePath: string,\n): Promise<number> {\n allRequestIds = new Set<number>();\n const e2eServer = await startE2EServer(environment, happoConfig);\n logger.log(`[HAPPO] Listening on port ${e2eServer.port}`);\n\n const job = await startJob(happoConfig, environment, logger);\n if (!job) {\n throw new Error('Failed to create Happo job');\n }\n try {\n const exitCode = await new Promise<number>((resolve, reject) => {\n const child = spawn(dashdashCommandParts[0]!, dashdashCommandParts.slice(1), {\n stdio: 'inherit',\n env: {\n ...process.env,\n HAPPO_E2E_PORT: e2eServer.port.toString(),\n HAPPO_CONFIG_FILE: configFilePath,\n HAPPO_API_KEY: happoConfig.apiKey,\n HAPPO_API_SECRET: happoConfig.apiSecret,\n },\n shell: process.platform == 'win32',\n });\n\n child.on('error', (e) => {\n return reject(e);\n });\n\n const e2eIntegration = happoConfig.integration;\n assertE2EIntegration(e2eIntegration);\n child.on('close', async (code: number) => {\n if (code === 0 || e2eIntegration.allowFailures) {\n try {\n await finalizeHappoReport(happoConfig, environment, job, logger);\n } catch (e) {\n logger.error('Failed to finalize Happo report', e);\n return reject(e);\n }\n } else {\n logger.error(\n 'Command failed with exit code ${code}. Cancelling Happo job.',\n );\n try {\n await cancelJob(\n 'failure',\n `${e2eIntegration.type} run failed`,\n happoConfig,\n environment,\n logger,\n );\n } catch (e) {\n logger.error('Failed to cancel Happo job', e);\n return reject(e);\n }\n }\n resolve(code);\n });\n });\n return exitCode;\n } finally {\n allRequestIds.clear();\n await e2eServer.close();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }