happo 6.2.5 → 6.2.6
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/dist/browser/assertElement.d.ts +2 -0
- package/dist/browser/assertElement.d.ts.map +1 -1
- package/dist/browser/main.js +26 -14
- package/dist/browser/main.js.map +3 -3
- package/dist/browser/takeDOMSnapshot.d.ts.map +1 -1
- package/dist/cli/cancelJob-JVBWGU62.js +10 -0
- package/dist/cli/{chunk-FT5XBCZC.js → chunk-2GWYMCM5.js} +2 -2
- package/dist/cli/{startJob-OYUB63PQ.js → chunk-4SMOBHQY.js} +4 -5
- package/dist/cli/chunk-4SMOBHQY.js.map +7 -0
- package/dist/cli/{chunk-PURYA5WA.js → chunk-56XY3V7T.js} +2 -2
- package/dist/cli/{cancelJob-GOUNFBOJ.js → chunk-HFWMNEW7.js} +10 -5
- package/dist/cli/{cancelJob-GOUNFBOJ.js.map → chunk-HFWMNEW7.js.map} +2 -2
- package/dist/cli/{chunk-375RAU4V.js → chunk-Q3DT6FIT.js} +2 -2
- package/dist/cli/{chunk-375RAU4V.js.map → chunk-Q3DT6FIT.js.map} +1 -1
- package/dist/cli/{chunk-UGH275RL.js → chunk-UBNAHFZ5.js} +2 -2
- package/dist/cli/createAsyncComparison-IVFALQTJ.js +10 -0
- package/dist/cli/{createAsyncReport-3NIRYOEG.js → createAsyncReport-EAFZGNCW.js} +4 -4
- package/dist/cli/main.js +10 -10
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/package-LZDJBDUK.js +7 -0
- package/dist/cli/package-LZDJBDUK.js.map +7 -0
- package/dist/cli/{prepareSnapRequests-MHPA62SN.js → prepareSnapRequests-FQJAOJNF.js} +4 -4
- package/dist/cli/startJob-ZYTK6OMK.js +10 -0
- package/dist/cli/startJob-ZYTK6OMK.js.map +7 -0
- package/dist/cli/{wrapper-PB35T36R.js → wrapper-LPL52GIF.js} +24 -42
- package/dist/cli/wrapper-LPL52GIF.js.map +7 -0
- package/dist/cypress/index.js +25 -13
- package/dist/cypress/index.js.map +2 -2
- package/dist/cypress/task.js +1 -1
- package/dist/cypress/task.js.map +1 -1
- package/dist/e2e/wrapper.d.ts.map +1 -1
- package/dist/network/cancelJob.d.ts.map +1 -1
- package/dist/network/startJob.d.ts +1 -2
- package/dist/network/startJob.d.ts.map +1 -1
- package/dist/playwright/index.js +1 -1
- package/dist/playwright/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/createAsyncComparison-VXTOVLKN.js +0 -10
- package/dist/cli/package-4Y7MCBOA.js +0 -7
- package/dist/cli/startJob-OYUB63PQ.js.map +0 -7
- package/dist/cli/wrapper-PB35T36R.js.map +0 -7
- /package/dist/cli/{createAsyncComparison-VXTOVLKN.js.map → cancelJob-JVBWGU62.js.map} +0 -0
- /package/dist/cli/{chunk-FT5XBCZC.js.map → chunk-2GWYMCM5.js.map} +0 -0
- /package/dist/cli/{chunk-PURYA5WA.js.map → chunk-56XY3V7T.js.map} +0 -0
- /package/dist/cli/{chunk-UGH275RL.js.map → chunk-UBNAHFZ5.js.map} +0 -0
- /package/dist/cli/{package-4Y7MCBOA.js.map → createAsyncComparison-IVFALQTJ.js.map} +0 -0
- /package/dist/cli/{createAsyncReport-3NIRYOEG.js.map → createAsyncReport-EAFZGNCW.js.map} +0 -0
- /package/dist/cli/{prepareSnapRequests-MHPA62SN.js.map → prepareSnapRequests-FQJAOJNF.js.map} +0 -0
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
2
|
startServer
|
|
3
3
|
} from "./chunk-JTRP4JVC.js";
|
|
4
|
+
import {
|
|
5
|
+
startJob
|
|
6
|
+
} from "./chunk-4SMOBHQY.js";
|
|
4
7
|
import {
|
|
5
8
|
createAsyncComparison
|
|
6
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-2GWYMCM5.js";
|
|
7
10
|
import {
|
|
8
11
|
postGitHubComment
|
|
9
12
|
} from "./chunk-X4TE2VNY.js";
|
|
13
|
+
import {
|
|
14
|
+
cancelJob
|
|
15
|
+
} from "./chunk-HFWMNEW7.js";
|
|
10
16
|
import {
|
|
11
17
|
makeHappoAPIRequest
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
18
|
+
} from "./chunk-56XY3V7T.js";
|
|
19
|
+
import "./chunk-UBNAHFZ5.js";
|
|
20
|
+
import "./chunk-Q3DT6FIT.js";
|
|
15
21
|
|
|
16
22
|
// src/e2e/wrapper.ts
|
|
17
23
|
import { spawn } from "node:child_process";
|
|
@@ -86,7 +92,7 @@ async function finalizeAll({
|
|
|
86
92
|
}
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
|
-
async function finalizeHappoReport(happoConfig, environment, logger) {
|
|
95
|
+
async function finalizeHappoReport(happoConfig, environment, job, logger) {
|
|
90
96
|
if (!allRequestIds.size) {
|
|
91
97
|
logger.log(`[HAPPO] No snapshots were recorded. Ignoring.`);
|
|
92
98
|
return;
|
|
@@ -99,27 +105,7 @@ async function finalizeHappoReport(happoConfig, environment, logger) {
|
|
|
99
105
|
if (!reportResult) {
|
|
100
106
|
throw new Error("Failed to create async Happo report");
|
|
101
107
|
}
|
|
102
|
-
const {
|
|
103
|
-
const jobResult = await makeHappoAPIRequest(
|
|
104
|
-
{
|
|
105
|
-
path: `/api/jobs/${beforeSha}/${afterSha}`,
|
|
106
|
-
method: "POST",
|
|
107
|
-
json: true,
|
|
108
|
-
body: {
|
|
109
|
-
project: happoConfig.project,
|
|
110
|
-
link,
|
|
111
|
-
message
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
happoConfig,
|
|
115
|
-
{ retryCount: 2 }
|
|
116
|
-
);
|
|
117
|
-
if (!jobResult) {
|
|
118
|
-
throw new Error("Failed to create Happo job");
|
|
119
|
-
}
|
|
120
|
-
if (!("url" in jobResult) || typeof jobResult.url !== "string") {
|
|
121
|
-
throw new Error("Job result is missing url");
|
|
122
|
-
}
|
|
108
|
+
const { nonce } = environment;
|
|
123
109
|
if (!nonce) {
|
|
124
110
|
const compareResult = await createAsyncComparison(
|
|
125
111
|
happoConfig,
|
|
@@ -136,7 +122,7 @@ async function finalizeHappoReport(happoConfig, environment, logger) {
|
|
|
136
122
|
});
|
|
137
123
|
}
|
|
138
124
|
}
|
|
139
|
-
logger.log(`[HAPPO] ${
|
|
125
|
+
logger.log(`[HAPPO] ${job.url}`);
|
|
140
126
|
}
|
|
141
127
|
function startE2EServer(environment, happoConfig) {
|
|
142
128
|
function requestHandler(req, res) {
|
|
@@ -173,6 +159,10 @@ async function runWithWrapper(dashdashCommandParts, happoConfig, environment, lo
|
|
|
173
159
|
allRequestIds = /* @__PURE__ */ new Set();
|
|
174
160
|
const e2eServer = await startE2EServer(environment, happoConfig);
|
|
175
161
|
logger.log(`[HAPPO] Listening on port ${e2eServer.port}`);
|
|
162
|
+
const job = await startJob(happoConfig, environment, logger);
|
|
163
|
+
if (!job) {
|
|
164
|
+
throw new Error("Failed to create Happo job");
|
|
165
|
+
}
|
|
176
166
|
try {
|
|
177
167
|
const exitCode = await new Promise((resolve, reject) => {
|
|
178
168
|
const child = spawn(dashdashCommandParts[0], dashdashCommandParts.slice(1), {
|
|
@@ -194,7 +184,7 @@ async function runWithWrapper(dashdashCommandParts, happoConfig, environment, lo
|
|
|
194
184
|
child.on("close", async (code) => {
|
|
195
185
|
if (code === 0 || e2eIntegration.allowFailures) {
|
|
196
186
|
try {
|
|
197
|
-
await finalizeHappoReport(happoConfig, environment, logger);
|
|
187
|
+
await finalizeHappoReport(happoConfig, environment, job, logger);
|
|
198
188
|
} catch (e) {
|
|
199
189
|
logger.error("Failed to finalize Happo report", e);
|
|
200
190
|
return reject(e);
|
|
@@ -204,20 +194,12 @@ async function runWithWrapper(dashdashCommandParts, happoConfig, environment, lo
|
|
|
204
194
|
"Command failed with exit code ${code}. Cancelling Happo job."
|
|
205
195
|
);
|
|
206
196
|
try {
|
|
207
|
-
await
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
method: "POST",
|
|
211
|
-
json: true,
|
|
212
|
-
body: {
|
|
213
|
-
status: "failure",
|
|
214
|
-
project: happoConfig.project,
|
|
215
|
-
link: environment.link,
|
|
216
|
-
message: `${e2eIntegration.type} run failed`
|
|
217
|
-
}
|
|
218
|
-
},
|
|
197
|
+
await cancelJob(
|
|
198
|
+
"failure",
|
|
199
|
+
`${e2eIntegration.type} run failed`,
|
|
219
200
|
happoConfig,
|
|
220
|
-
|
|
201
|
+
environment,
|
|
202
|
+
logger
|
|
221
203
|
);
|
|
222
204
|
} catch (e) {
|
|
223
205
|
logger.error("Failed to cancel Happo job", e);
|
|
@@ -237,4 +219,4 @@ export {
|
|
|
237
219
|
runWithWrapper as default,
|
|
238
220
|
finalizeAll
|
|
239
221
|
};
|
|
240
|
-
//# sourceMappingURL=wrapper-
|
|
222
|
+
//# sourceMappingURL=wrapper-LPL52GIF.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
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 json: true,\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 json: true,\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
|
+
}
|
package/dist/cypress/index.js
CHANGED
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
} from "./chunk-RKK2MPML.js";
|
|
4
4
|
|
|
5
5
|
// src/browser/applyConstructedStylesPatch.ts
|
|
6
|
-
var recordedCSSSymbol = Symbol("recordedCssRules");
|
|
7
|
-
var hasBrokenIndexesSymbol = Symbol("hasBrokenIndexes");
|
|
8
|
-
var isInstalledSymbol = Symbol("isInstalled");
|
|
6
|
+
var recordedCSSSymbol = /* @__PURE__ */ Symbol("recordedCssRules");
|
|
7
|
+
var hasBrokenIndexesSymbol = /* @__PURE__ */ Symbol("hasBrokenIndexes");
|
|
8
|
+
var isInstalledSymbol = /* @__PURE__ */ Symbol("isInstalled");
|
|
9
9
|
function isExtendedWindow(w) {
|
|
10
10
|
return "CSSStyleSheet" in w && typeof w.CSSStyleSheet === "function";
|
|
11
11
|
}
|
|
@@ -136,6 +136,24 @@ function applyConstructedStylesPatch(win = globalThis.window) {
|
|
|
136
136
|
import { parseSrcset } from "srcset";
|
|
137
137
|
|
|
138
138
|
// src/browser/assertElement.ts
|
|
139
|
+
function isElementWithDataset(element) {
|
|
140
|
+
if (typeof element !== "object") {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
if (element == null) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (!("dataset" in element)) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
if (typeof element.dataset !== "object") {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
if (element.dataset == null) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
139
157
|
function isIterableCollection(element) {
|
|
140
158
|
if (typeof element !== "object") {
|
|
141
159
|
return false;
|
|
@@ -716,7 +734,7 @@ function inlineCanvases(element, {
|
|
|
716
734
|
}
|
|
717
735
|
replacements.push({ from: canvas, to: image });
|
|
718
736
|
} catch (e) {
|
|
719
|
-
if (e
|
|
737
|
+
if (typeof e === "object" && e !== null && "name" in e && e.name === "SecurityError") {
|
|
720
738
|
console.warn("[HAPPO] Failed to convert tainted canvas to PNG image");
|
|
721
739
|
console.warn(e);
|
|
722
740
|
} else {
|
|
@@ -785,13 +803,7 @@ function transformToElementArray(elements) {
|
|
|
785
803
|
if (Array.isArray(elements)) {
|
|
786
804
|
return elements;
|
|
787
805
|
}
|
|
788
|
-
if (elements
|
|
789
|
-
return Array.from(elements);
|
|
790
|
-
}
|
|
791
|
-
if (elements instanceof globalThis.window.Element) {
|
|
792
|
-
return [elements];
|
|
793
|
-
}
|
|
794
|
-
if (elements.length !== void 0) {
|
|
806
|
+
if (isIterableCollection(elements)) {
|
|
795
807
|
return Array.from(elements);
|
|
796
808
|
}
|
|
797
809
|
return [elements];
|
|
@@ -881,7 +893,7 @@ function takeDOMSnapshot({
|
|
|
881
893
|
)) {
|
|
882
894
|
delete e.dataset.happoFocus;
|
|
883
895
|
}
|
|
884
|
-
if (doc.activeElement && doc.activeElement !== doc.body && (doc.activeElement
|
|
896
|
+
if (doc.activeElement && doc.activeElement !== doc.body && isElementWithDataset(doc.activeElement)) {
|
|
885
897
|
doc.activeElement.dataset.happoFocus = "true";
|
|
886
898
|
}
|
|
887
899
|
inlineShadowRoots(element);
|
|
@@ -895,7 +907,7 @@ function takeDOMSnapshot({
|
|
|
895
907
|
if (strategy === "hoist") {
|
|
896
908
|
htmlParts.push(element.outerHTML);
|
|
897
909
|
} else if (strategy === "clip") {
|
|
898
|
-
if (!(element
|
|
910
|
+
if (!isElementWithDataset(element)) {
|
|
899
911
|
throw new TypeError(
|
|
900
912
|
"element does not support the dataset property, i.e. it is not an HTMLElement or SVGElement or MathMLElement"
|
|
901
913
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/browser/applyConstructedStylesPatch.ts", "../../src/browser/takeDOMSnapshot.ts", "../../src/browser/assertElement.ts", "../../src/browser/md5.ts", "../../src/cypress/chunked.ts", "../../src/cypress/index.ts"],
|
|
4
|
-
"sourcesContent": ["const recordedCSSSymbol: unique symbol = Symbol('recordedCssRules');\nconst hasBrokenIndexesSymbol: unique symbol = Symbol('hasBrokenIndexes');\nconst isInstalledSymbol: unique symbol = Symbol('isInstalled');\n\n// Extend CSSStyleSheet interface to include our custom properties\ninterface ExtendedCSSStyleSheet extends CSSStyleSheet {\n [recordedCSSSymbol]?: Array<string>;\n [hasBrokenIndexesSymbol]?: boolean;\n}\n\n// Extend CSSStyleSheet constructor to include our custom properties\ninterface ExtendedCSSStyleSheetConstructor {\n new (options?: CSSStyleSheetInit): CSSStyleSheet;\n [isInstalledSymbol]?: boolean;\n prototype: CSSStyleSheet;\n}\n\n// Extend Window interface to include CSSStyleSheet\ninterface ExtendedWindow extends Window {\n CSSStyleSheet: ExtendedCSSStyleSheetConstructor;\n}\n\nexport function isExtendedWindow(w: Window): w is ExtendedWindow {\n return (\n 'CSSStyleSheet' in w &&\n typeof (w as unknown as { CSSStyleSheet: unknown }).CSSStyleSheet === 'function'\n );\n}\n\n// Helper to ensure our custom recorded array exists on the sheet.\nfunction ensureRecord(sheet: ExtendedCSSStyleSheet): void {\n if (!sheet[recordedCSSSymbol]) {\n sheet[recordedCSSSymbol] = [];\n }\n}\n\nfunction displayError(message: string): void {\n console.error(message);\n\n const el = document.createElement('div');\n el.setAttribute(\n 'style',\n `\n position: fixed;\n display: flex;\n align-items: center;\n justify-content: center;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n padding: 30px;\n background: red;\n font-weight: bold;\n color: white;\n z-index: 1000;\n font-family: monospace;\n `,\n );\n const inner = document.createElement('div');\n inner.textContent = message;\n el.append(inner);\n document.addEventListener('DOMContentLoaded', () => {\n document.body.append(el);\n });\n}\n\nexport default function applyConstructedStylesPatch(\n win: ExtendedWindow = globalThis.window as ExtendedWindow,\n): void {\n if (win.CSSStyleSheet === undefined) {\n console.error('CSSStyleSheet is not supported in this browser');\n return;\n }\n\n const CSSStyleSheetConstructor =\n win.CSSStyleSheet as ExtendedCSSStyleSheetConstructor;\n if (CSSStyleSheetConstructor[isInstalledSymbol]) {\n return;\n }\n CSSStyleSheetConstructor[isInstalledSymbol] = true;\n\n // Patch insertRule to record each rule string.\n const originalInsertRule = win.CSSStyleSheet.prototype.insertRule;\n win.CSSStyleSheet.prototype.insertRule = function (\n rule: string,\n index: number = 0,\n ): number {\n const extendedThis = this as ExtendedCSSStyleSheet;\n ensureRecord(extendedThis);\n\n if (extendedThis[hasBrokenIndexesSymbol] && index) {\n displayError(\n 'CSSStyleSheet.prototype.insertRule with a non-zero index does not work with Happo after first having called replace/replaceSync. Reach out to support@happo.io if you need help with this.',\n );\n return originalInsertRule.call(this, rule, index);\n }\n\n // If index is not provided or invalid, default to appending.\n if (\n index === undefined ||\n index < 0 ||\n index > (extendedThis[recordedCSSSymbol]?.length || 0)\n ) {\n extendedThis[recordedCSSSymbol]?.push(rule);\n } else {\n extendedThis[recordedCSSSymbol]?.splice(index, 0, rule);\n }\n return originalInsertRule.call(this, rule, index);\n };\n\n const originalAddRule = win.CSSStyleSheet.prototype.addRule;\n win.CSSStyleSheet.prototype.addRule = function (\n selector: string,\n styleBlock: string,\n index?: number,\n ): number {\n const extendedThis = this as ExtendedCSSStyleSheet;\n ensureRecord(extendedThis);\n if (extendedThis[hasBrokenIndexesSymbol] && index) {\n displayError(\n 'CSSStyleSheet.prototype.addRule with a non-zero index does not work with Happo after first having called replace/replaceSync. Reach out to support@happo.io if you need help with this.',\n );\n return originalAddRule.call(this, selector, styleBlock, index);\n }\n\n const rule = `${selector} { ${styleBlock} }`;\n if (\n index === undefined ||\n index < 0 ||\n index > (extendedThis[recordedCSSSymbol]?.length || 0)\n ) {\n extendedThis[recordedCSSSymbol]?.push(rule);\n } else {\n extendedThis[recordedCSSSymbol]?.splice(index, 0, rule);\n }\n return originalAddRule.call(this, selector, styleBlock, index);\n };\n\n // Patch deleteRule so that removed rules are taken out of our record.\n const originalDeleteRule = win.CSSStyleSheet.prototype.deleteRule;\n win.CSSStyleSheet.prototype.deleteRule = function (index: number): void {\n const extendedThis = this as ExtendedCSSStyleSheet;\n ensureRecord(extendedThis);\n if (extendedThis[hasBrokenIndexesSymbol]) {\n displayError(\n 'CSSStyleSheet.prototype.deleteRule does not work with Happo after first having called replace/replaceSync. Reach out to support@happo.io if you need help with this.',\n );\n } else if (\n index >= 0 &&\n index < (extendedThis[recordedCSSSymbol]?.length || 0)\n ) {\n extendedThis[recordedCSSSymbol]?.splice(index, 1);\n }\n return originalDeleteRule.call(this, index);\n };\n\n const originalRemoveRule = win.CSSStyleSheet.prototype.removeRule;\n win.CSSStyleSheet.prototype.removeRule = function (index?: number): void {\n const extendedThis = this as ExtendedCSSStyleSheet;\n ensureRecord(extendedThis);\n if (extendedThis[hasBrokenIndexesSymbol]) {\n displayError(\n 'CSSStyleSheet.prototype.removeRule does not work with Happo after first having called replace/replaceSync. Reach out to support@happo.io if you need help with this.',\n );\n } else if (\n index !== undefined &&\n index >= 0 &&\n index < (extendedThis[recordedCSSSymbol]?.length || 0)\n ) {\n extendedThis[recordedCSSSymbol]?.splice(index, 1);\n }\n return originalRemoveRule.call(this, index);\n };\n\n // Patch replaceSync to capture the new CSS text.\n const originalReplaceSync = win.CSSStyleSheet.prototype.replaceSync;\n win.CSSStyleSheet.prototype.replaceSync = function (text: string): void {\n const extendedThis = this as ExtendedCSSStyleSheet;\n extendedThis[recordedCSSSymbol] = text.split('\\n').map((rule) => rule.trim());\n extendedThis[hasBrokenIndexesSymbol] = true;\n return originalReplaceSync.call(this, text);\n };\n\n // Patch replace (the asynchronous version) similarly.\n const originalReplace = win.CSSStyleSheet.prototype.replace;\n win.CSSStyleSheet.prototype.replace = function (\n text: string,\n ): Promise<CSSStyleSheet> {\n const sheet = this as ExtendedCSSStyleSheet;\n return originalReplace.call(sheet, text).then(function (result: CSSStyleSheet) {\n sheet[recordedCSSSymbol] = text.split('\\n').map((rule) => rule.trim());\n sheet[hasBrokenIndexesSymbol] = true;\n return result;\n });\n };\n}\n\nexport { recordedCSSSymbol };\n", "import { parseSrcset } from 'srcset';\n\nimport findCSSAssetUrls from '../isomorphic/findCSSAssetUrls.ts';\nimport type {\n AssetUrl,\n CSSBlock,\n DOMSnapshotResult,\n TakeDOMSnapshotOptions,\n} from '../isomorphic/types.ts';\nimport applyConstructedStylesPatch, {\n recordedCSSSymbol,\n} from './applyConstructedStylesPatch.ts';\nimport assertElement from './assertElement.ts';\nimport { MD5 } from './md5.ts';\n\nexport { applyConstructedStylesPatch };\n\nconst CSS_ELEMENTS_SELECTOR = 'style,link[rel=\"stylesheet\"][href]';\nconst COMMENT_PATTERN = /^\\/\\*.+\\*\\/$/;\n\nif (globalThis.window) {\n applyConstructedStylesPatch(globalThis.window);\n}\n\n// Extend HTMLElement and CSSStyleSheet to include our custom properties\ninterface ExtendedHTMLElement extends HTMLElement {\n [recordedCSSSymbol]?: Array<string>;\n}\n\ninterface ExtendedCSSStyleSheet extends CSSStyleSheet {\n [recordedCSSSymbol]?: Array<string>;\n}\n\nfunction getContentFromStyleSheet(element: HTMLElement | CSSStyleSheet): string {\n let lines: Array<string>;\n\n if ('textContent' in element && element.textContent) {\n // Handle <style> elements with direct textContent\n lines = element.textContent.split('\\n').map((line) => line.trim());\n } else if (\n recordedCSSSymbol in element &&\n (element as ExtendedHTMLElement | ExtendedCSSStyleSheet)[recordedCSSSymbol]\n ) {\n lines = (element as ExtendedHTMLElement | ExtendedCSSStyleSheet)[\n recordedCSSSymbol\n ]!;\n } else if (\n 'sheet' in element &&\n element.sheet &&\n (element.sheet as CSSStyleSheet).cssRules\n ) {\n // Handle <style> or <link> elements that have a sheet property\n const cssRules = (element.sheet as CSSStyleSheet).cssRules as CSSRuleList;\n lines = Array.from(cssRules).map((rule: CSSRule) => rule.cssText);\n } else if ((element as CSSStyleSheet).cssRules) {\n // Handle CSSStyleSheet objects (including adoptedStyleSheets)\n const cssRules = (element as CSSStyleSheet).cssRules as CSSRuleList;\n lines = Array.from(cssRules).map((rule: CSSRule) => rule.cssText);\n } else {\n return '';\n }\n\n return lines.filter((line) => line && !COMMENT_PATTERN.test(line)).join('\\n');\n}\n\nfunction extractCSSBlocks(doc: Document): Array<CSSBlock> {\n const blocks: Array<CSSBlock> = [];\n const styleElements = doc.querySelectorAll(CSS_ELEMENTS_SELECTOR);\n\n for (const element of styleElements) {\n if (element.closest('happo-shadow-content')) {\n // Skip if element is inside a happo-shadow-content element. These need to\n // be scoped to the shadow root and cannot be part of the global styles.\n continue;\n }\n if (element.tagName === 'LINK') {\n // <link href>\n const href = (element as HTMLLinkElement).href || element.getAttribute('href');\n blocks.push({\n key: href || '',\n href: href || undefined,\n baseUrl: element.baseURI,\n });\n } else {\n const content = getContentFromStyleSheet(element as HTMLElement);\n // Create a hash so that we can dedupe equal styles\n const key = MD5.hashStr(content);\n blocks.push({ content, key, baseUrl: element.baseURI });\n }\n }\n\n for (const sheet of doc.adoptedStyleSheets || []) {\n const content = getContentFromStyleSheet(sheet);\n const key = MD5.hashStr(content);\n blocks.push({ key, content, baseUrl: sheet.href || document.baseURI });\n }\n return blocks;\n}\n\nfunction defaultHandleBase64Image({\n base64Url,\n element,\n}: {\n base64Url: string;\n element: HTMLImageElement;\n}): void {\n // Simply make the base64Url the src of the image\n element.src = base64Url;\n}\n\n// Extend HTMLElement to include custom properties\ninterface ExtendedHTMLElementWithBase64 extends HTMLElement {\n _base64Url?: string;\n}\n\nfunction getElementAssetUrls(\n element: Element,\n {\n handleBase64Image = defaultHandleBase64Image,\n }: {\n handleBase64Image?: (params: {\n base64Url: string;\n element: HTMLImageElement;\n }) => void;\n } = {},\n): Array<AssetUrl> {\n const allUrls: Array<AssetUrl> = [];\n const allElements = [element].concat(Array.from(element.querySelectorAll('*')));\n for (const element of allElements) {\n if (element.tagName === 'SCRIPT') {\n // skip script elements\n continue;\n }\n const srcset = element.getAttribute('srcset');\n const src = element.getAttribute('src');\n const imageHref =\n element.tagName.toLowerCase() === 'image' && element.getAttribute('href');\n const linkHref =\n element.tagName.toLowerCase() === 'link' &&\n element.getAttribute('rel') === 'stylesheet' &&\n element.getAttribute('href');\n\n const style = element.getAttribute('style');\n const base64Url = (element as ExtendedHTMLElementWithBase64)._base64Url;\n if (base64Url && element.tagName === 'IMG') {\n handleBase64Image({ base64Url, element: element as HTMLImageElement });\n }\n if (src) {\n allUrls.push({ url: src, baseUrl: element.baseURI });\n }\n if (srcset) {\n allUrls.push(\n ...parseSrcset(srcset).map((p) => ({\n url: p.url,\n baseUrl: element.baseURI,\n })),\n );\n }\n if (style) {\n allUrls.push(\n ...findCSSAssetUrls(style).map((url) => ({\n url,\n baseUrl: element.baseURI,\n })),\n );\n }\n if (imageHref) {\n allUrls.push({ url: imageHref, baseUrl: element.baseURI });\n }\n if (linkHref) {\n allUrls.push({ url: linkHref, baseUrl: element.baseURI });\n }\n }\n return allUrls.filter(({ url }) => !url.startsWith('data:'));\n}\n\nfunction copyStyles(sourceElement: HTMLElement, targetElement: HTMLElement): void {\n const computedStyle = globalThis.getComputedStyle(sourceElement);\n\n for (let i = 0; i < computedStyle.length; i++) {\n const key = computedStyle[i];\n if (!key) continue;\n const value = computedStyle.getPropertyValue(key);\n if (value !== '') {\n targetElement.style.setProperty(key, value);\n }\n }\n}\n\nfunction inlineCanvases(\n element: Element,\n {\n doc,\n responsiveInlinedCanvases = false,\n }: { doc: Document; responsiveInlinedCanvases?: boolean },\n): { element: Element; cleanup: () => void } {\n const canvases: Array<HTMLCanvasElement> = [];\n if (element.tagName === 'CANVAS') {\n canvases.push(element as HTMLCanvasElement);\n }\n canvases.push(...Array.from(element.querySelectorAll('canvas')));\n\n let newElement = element;\n const replacements: Array<{ from: HTMLCanvasElement; to: HTMLImageElement }> = [];\n for (const canvas of canvases) {\n try {\n const canvasImageBase64 = canvas.toDataURL('image/png');\n if (canvasImageBase64 === 'data:,') {\n continue;\n }\n const image = doc.createElement('img');\n\n const url = `/.happo-tmp/_inlined/${MD5.hashStr(canvasImageBase64)}.png`;\n image.src = url;\n (image as ExtendedHTMLElementWithBase64)._base64Url = canvasImageBase64;\n const style = canvas.getAttribute('style');\n if (style) {\n image.setAttribute('style', style);\n }\n const className = canvas.getAttribute('class');\n if (className) {\n image.setAttribute('class', className);\n }\n if (responsiveInlinedCanvases) {\n image.style.width = '100%';\n image.style.height = 'auto';\n } else {\n const width = canvas.getAttribute('width');\n const height = canvas.getAttribute('height');\n if (width) image.setAttribute('width', width);\n if (height) image.setAttribute('height', height);\n copyStyles(canvas, image);\n }\n canvas.replaceWith(image);\n if (canvas === element) {\n // We're inlining the element. Make sure we return the modified element.\n newElement = image;\n }\n replacements.push({ from: canvas, to: image });\n } catch (e) {\n if (e instanceof Error && e.name === 'SecurityError') {\n console.warn('[HAPPO] Failed to convert tainted canvas to PNG image');\n console.warn(e);\n } else {\n throw e;\n }\n }\n }\n\n function cleanup(): void {\n for (const { from, to } of replacements) {\n to.replaceWith(from);\n }\n }\n return { element: newElement, cleanup };\n}\n\nfunction registerScrollPositions(doc: Document): void {\n const elements = doc.body.querySelectorAll<HTMLElement | SVGElement>('*');\n for (const node of elements) {\n if (node.scrollTop !== 0 || node.scrollLeft !== 0) {\n node.dataset.happoScrollposition = `${node.scrollTop},${node.scrollLeft}`;\n }\n }\n}\n\nfunction registerCheckedInputs(doc: Document): void {\n const elements = doc.body.querySelectorAll(\n 'input[type=\"checkbox\"], input[type=\"radio\"]',\n );\n for (const node of elements) {\n const input = node as HTMLInputElement;\n if (input.checked) {\n input.setAttribute('checked', 'checked');\n } else {\n input.removeAttribute('checked');\n }\n }\n}\n\nfunction extractElementAttributes(el: Element): Record<string, string> {\n const result: Record<string, string> = {};\n for (const item of el.attributes) {\n result[item.name] = item.value;\n }\n return result;\n}\n\nfunction performDOMTransform({\n doc,\n selector,\n transform,\n element,\n}: {\n doc: Document;\n selector: string;\n transform: (element: Element, doc: Document) => Element;\n element: Element;\n}): (() => void) | undefined {\n const elements = Array.from(element.querySelectorAll(selector));\n if (!elements.length) {\n return;\n }\n const replacements: Array<{ from: Element; to: Element }> = [];\n for (const element of elements) {\n const replacement = transform(element, doc);\n replacements.push({ from: element, to: replacement });\n element.replaceWith(replacement);\n }\n return () => {\n for (const { from, to } of replacements) {\n to.replaceWith(from);\n }\n };\n}\n\nfunction transformToElementArray(\n elements: Element | Array<Element> | NodeListOf<Element>,\n): Array<Element> {\n // Check if 'elements' is already an array\n if (Array.isArray(elements)) {\n return elements;\n }\n // Check if 'elements' is a NodeList\n if (elements instanceof globalThis.window.NodeList) {\n return Array.from(elements);\n }\n // Check if 'elements' is a single Element\n if (elements instanceof globalThis.window.Element) {\n return [elements];\n }\n\n // Handle array-like objects\n if ((elements as NodeListOf<Element>).length !== undefined) {\n return Array.from(elements as NodeListOf<Element>);\n }\n\n return [elements];\n}\n\n/**\n * Injects all shadow roots from the given element.\n *\n * @param {HTMLElement} element\n */\nfunction inlineShadowRoots(element: Element): void {\n const elements = [element];\n\n const elementsToProcess: Array<Element> = [];\n while (elements.length) {\n const currentElement = elements.shift();\n if (!currentElement) continue;\n\n if (currentElement.shadowRoot) {\n elementsToProcess.unshift(currentElement); // LIFO so that leaf nodes are processed first\n }\n elements.unshift(...(Array.from(currentElement.children) as Array<HTMLElement>)); // LIFO so that leaf nodes are processed first\n }\n\n for (const element of elementsToProcess) {\n const hiddenElement = document.createElement('happo-shadow-content');\n hiddenElement.style.display = 'none';\n\n // Add adopted stylesheets as <style> elements\n if (element.shadowRoot) {\n for (const styleSheet of element.shadowRoot.adoptedStyleSheets) {\n const styleElement = document.createElement('style');\n styleElement.dataset.happoInlined = 'true';\n const styleContent = getContentFromStyleSheet(styleSheet);\n styleElement.textContent = styleContent;\n hiddenElement.append(styleElement);\n }\n\n hiddenElement.innerHTML += element.shadowRoot.innerHTML;\n element.append(hiddenElement);\n }\n }\n}\n\n/**\n * Adds data-happo-modal to the first modal dialog that is open, and removes it\n * from all other dialogs.\n */\nfunction markModalDialogs(element: Element): void {\n const cleanups = element.querySelectorAll<HTMLDialogElement>(\n 'dialog[data-happo-modal]',\n );\n for (const cleanup of cleanups) {\n delete cleanup.dataset.happoModal;\n }\n\n const openModal = element.querySelector<HTMLDialogElement>('dialog:modal[open]');\n if (!openModal) {\n return;\n }\n openModal.dataset.happoModal = 'true';\n}\n\nfunction findSvgElementsWithSymbols(element: Element): Array<SVGElement> {\n return [...element.ownerDocument.querySelectorAll('svg')].filter((svg) =>\n svg.querySelector('symbol'),\n );\n}\n\nexport default function takeDOMSnapshot({\n doc,\n element: oneOrMoreElements,\n responsiveInlinedCanvases = false,\n transformDOM,\n handleBase64Image,\n strategy = 'hoist',\n}: TakeDOMSnapshotOptions): DOMSnapshotResult {\n if (doc == null) {\n throw new Error('doc cannot be null or undefined');\n }\n if (doc.defaultView == null) {\n throw new Error('doc.defaultView cannot be null or undefined');\n }\n\n assertElement(oneOrMoreElements);\n\n const allElements = transformToElementArray(oneOrMoreElements);\n const htmlParts: Array<string> = [];\n const assetUrls: Array<AssetUrl> = [];\n for (const originalElement of allElements) {\n const { element, cleanup: canvasCleanup } = inlineCanvases(originalElement, {\n doc,\n responsiveInlinedCanvases,\n });\n\n registerScrollPositions(doc);\n registerCheckedInputs(doc);\n\n const transformCleanup = transformDOM\n ? performDOMTransform({\n doc,\n element,\n ...transformDOM,\n })\n : undefined;\n\n for (const scriptEl of element.querySelectorAll('script')) {\n if (scriptEl.parentNode) {\n scriptEl.remove();\n }\n }\n\n for (const e of doc.querySelectorAll<HTMLElement | SVGElement | MathMLElement>(\n '[data-happo-focus]',\n )) {\n delete e.dataset.happoFocus;\n }\n\n if (\n doc.activeElement &&\n doc.activeElement !== doc.body &&\n (doc.activeElement instanceof globalThis.window.HTMLElement ||\n doc.activeElement instanceof globalThis.window.SVGElement ||\n doc.activeElement instanceof globalThis.window.MathMLElement)\n ) {\n doc.activeElement.dataset.happoFocus = 'true';\n }\n\n inlineShadowRoots(element);\n markModalDialogs(element);\n\n assetUrls.push(\n ...getElementAssetUrls(\n element,\n handleBase64Image ? { handleBase64Image } : {},\n ),\n );\n\n if (strategy === 'hoist') {\n htmlParts.push(element.outerHTML);\n } else if (strategy === 'clip') {\n if (\n !(element instanceof HTMLElement) &&\n !(element instanceof SVGElement) &&\n !(element instanceof MathMLElement)\n ) {\n throw new TypeError(\n 'element does not support the dataset property, i.e. it is not an HTMLElement or SVGElement or MathMLElement',\n );\n }\n\n element.dataset.happoClip = 'true';\n htmlParts.push(doc.body.outerHTML);\n } else {\n throw new Error(`Unknown strategy: ${strategy}`);\n }\n\n if (strategy === 'hoist') {\n const svgElementsWithSymbols = findSvgElementsWithSymbols(element);\n for (const svgElement of svgElementsWithSymbols) {\n htmlParts.push(`<div style=\"display: none;\">${svgElement.outerHTML}</div>`);\n }\n }\n if (canvasCleanup) canvasCleanup();\n if (transformCleanup) transformCleanup();\n }\n\n const cssBlocks = extractCSSBlocks(doc);\n const htmlElementAttrs = extractElementAttributes(doc.documentElement);\n const bodyElementAttrs = extractElementAttributes(doc.body);\n\n // Remove our shadow content elements so that they don't affect the page\n for (const e of doc.querySelectorAll('happo-shadow-content')) e.remove();\n if (strategy === 'clip') {\n for (const e of doc.querySelectorAll<HTMLElement | SVGElement>(\n '[data-happo-clip]',\n )) {\n delete e.dataset.happoClip;\n }\n }\n\n return {\n html: htmlParts.join('\\n'),\n assetUrls,\n cssBlocks,\n htmlElementAttrs,\n bodyElementAttrs,\n };\n}\n", "function isIterableCollection(\n element: NonNullable<unknown>,\n): element is Iterable<unknown> {\n if (typeof element !== 'object') {\n return false;\n }\n\n if (!('length' in element)) {\n return false;\n }\n\n if (typeof element.length !== 'number') {\n return false;\n }\n\n if (!('item' in element)) {\n return false;\n }\n\n if (typeof element.item !== 'function') {\n return false;\n }\n\n if (!(Symbol.iterator in element)) {\n return false;\n }\n\n if (typeof element[Symbol.iterator] !== 'function') {\n return false;\n }\n\n return true;\n}\n\n/**\n * Throws if the element is not a valid Element instance, an array of elements,\n * or a NodeList of elements.\n */\nexport default function assertElement(\n element: unknown,\n): asserts element is Element | Array<Element> | NodeListOf<Element> {\n if (element == null) {\n throw new Error('element cannot be null or undefined');\n }\n\n if (typeof element !== 'object') {\n throw new TypeError('element must be an object');\n }\n\n if (Array.isArray(element) || isIterableCollection(element)) {\n for (const el of element) {\n assertElement(el);\n }\n\n return;\n }\n\n if (!('nodeType' in element)) {\n throw new TypeError('element must have a nodeType property');\n }\n\n if (element.nodeType !== 1 /* ELEMENT_NODE */) {\n throw new Error('element must have a nodeType of ELEMENT_NODE');\n }\n}\n", "/* eslint-disable unicorn/prefer-math-trunc */\n\n/*\n\nTypeScript MD5\n==============\n\nBased on work by\n* Joseph Myers: http://www.myersdaily.org/joseph/javascript/md5-text.html\n* Andr\u00E9 Cruz: https://github.com/satazor/SparkMD5\n* Raymond Hill: https://github.com/gorhill/yamd5.js\n\nEffectively a TypeScrypt re-write of Raymond Hill JS Library\n\nThe MIT License (MIT)\n\nCopyright (C) 2014 Raymond Hill\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n\n DO WHAT YOU WANT TO PUBLIC LICENSE\n Version 2, December 2004\n\n Copyright (C) 2015 Andr\u00E9 Cruz <amdfcruz@gmail.com>\n\n Everyone is permitted to copy and distribute verbatim or modified\n copies of this license document, and changing it is allowed as long\n as the name is changed.\n\n DO WHAT YOU WANT TO PUBLIC LICENSE\n TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n 0. You just DO WHAT YOU WANT TO.\n\n\n*/\n\ninterface HasherState {\n buffer: string;\n buflen: number;\n length: number;\n state: Array<number>;\n}\n\nconst EMPTY_STATE = new Int32Array(4);\n\nexport class MD5 {\n /**\n * Hash a UTF-8 string on the spot\n * @param str String to hash\n * @param raw Whether to return the value as an `Int32Array`\n */\n public static hashStr(str: string, raw?: false): string;\n public static hashStr(str: string, raw: true): Int32Array;\n public static hashStr(str: string, raw: boolean = false) {\n return this.onePassHasher.start().appendStr(str).end(raw);\n }\n\n /**\n * Hash a ASCII string on the spot\n * @param str String to hash\n * @param raw Whether to return the value as an `Int32Array`\n */\n public static hashAsciiStr(str: string, raw?: false): string;\n public static hashAsciiStr(str: string, raw: true): Int32Array;\n public static hashAsciiStr(str: string, raw: boolean = false) {\n return this.onePassHasher.start().appendAsciiStr(str).end(raw);\n }\n // Private Static Variables\n private static stateIdentity = new Int32Array([\n 1_732_584_193, -271_733_879, -1_732_584_194, 271_733_878,\n ]);\n private static buffer32Identity = new Int32Array([\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n ]);\n private static hexChars = '0123456789abcdef';\n private static hexOut: Array<string> = [];\n\n // Permanent instance is to use for one-call hashing\n private static onePassHasher = new MD5();\n\n private static _hex(x: Int32Array): string {\n const hc = MD5.hexChars;\n const ho = MD5.hexOut;\n let n;\n let offset;\n let j;\n let i;\n\n for (i = 0; i < 4; i += 1) {\n offset = i * 8;\n n = x[i]!;\n for (j = 0; j < 8; j += 2) {\n ho[offset + 1 + j] = hc.charAt(n & 0x0f);\n n >>>= 4;\n ho[offset + 0 + j] = hc.charAt(n & 0x0f);\n n >>>= 4;\n }\n }\n return ho.join('');\n }\n\n private static _md5cycle(\n x: Int32Array | Uint32Array,\n k: Int32Array | Uint32Array,\n ) {\n let a = x[0]!;\n let b = x[1]!;\n let c = x[2]!;\n let d = x[3]!;\n // ff()\n a += (((b & c) | (~b & d)) + k[0]! - 680_876_936) | 0;\n a = (((a << 7) | (a >>> 25)) + b) | 0;\n d += (((a & b) | (~a & c)) + k[1]! - 389_564_586) | 0;\n d = (((d << 12) | (d >>> 20)) + a) | 0;\n c += (((d & a) | (~d & b)) + k[2]! + 606_105_819) | 0;\n c = (((c << 17) | (c >>> 15)) + d) | 0;\n b += (((c & d) | (~c & a)) + k[3]! - 1_044_525_330) | 0;\n b = (((b << 22) | (b >>> 10)) + c) | 0;\n a += (((b & c) | (~b & d)) + k[4]! - 176_418_897) | 0;\n a = (((a << 7) | (a >>> 25)) + b) | 0;\n d += (((a & b) | (~a & c)) + k[5]! + 1_200_080_426) | 0;\n d = (((d << 12) | (d >>> 20)) + a) | 0;\n c += (((d & a) | (~d & b)) + k[6]! - 1_473_231_341) | 0;\n c = (((c << 17) | (c >>> 15)) + d) | 0;\n b += (((c & d) | (~c & a)) + k[7]! - 45_705_983) | 0;\n b = (((b << 22) | (b >>> 10)) + c) | 0;\n a += (((b & c) | (~b & d)) + k[8]! + 1_770_035_416) | 0;\n a = (((a << 7) | (a >>> 25)) + b) | 0;\n d += (((a & b) | (~a & c)) + k[9]! - 1_958_414_417) | 0;\n d = (((d << 12) | (d >>> 20)) + a) | 0;\n c += (((d & a) | (~d & b)) + k[10]! - 42_063) | 0;\n c = (((c << 17) | (c >>> 15)) + d) | 0;\n b += (((c & d) | (~c & a)) + k[11]! - 1_990_404_162) | 0;\n b = (((b << 22) | (b >>> 10)) + c) | 0;\n a += (((b & c) | (~b & d)) + k[12]! + 1_804_603_682) | 0;\n a = (((a << 7) | (a >>> 25)) + b) | 0;\n d += (((a & b) | (~a & c)) + k[13]! - 40_341_101) | 0;\n d = (((d << 12) | (d >>> 20)) + a) | 0;\n c += (((d & a) | (~d & b)) + k[14]! - 1_502_002_290) | 0;\n c = (((c << 17) | (c >>> 15)) + d) | 0;\n b += (((c & d) | (~c & a)) + k[15]! + 1_236_535_329) | 0;\n b = (((b << 22) | (b >>> 10)) + c) | 0;\n // gg()\n a += (((b & d) | (c & ~d)) + k[1]! - 165_796_510) | 0;\n a = (((a << 5) | (a >>> 27)) + b) | 0;\n d += (((a & c) | (b & ~c)) + k[6]! - 1_069_501_632) | 0;\n d = (((d << 9) | (d >>> 23)) + a) | 0;\n c += (((d & b) | (a & ~b)) + k[11]! + 643_717_713) | 0;\n c = (((c << 14) | (c >>> 18)) + d) | 0;\n b += (((c & a) | (d & ~a)) + k[0]! - 373_897_302) | 0;\n b = (((b << 20) | (b >>> 12)) + c) | 0;\n a += (((b & d) | (c & ~d)) + k[5]! - 701_558_691) | 0;\n a = (((a << 5) | (a >>> 27)) + b) | 0;\n d += (((a & c) | (b & ~c)) + k[10]! + 38_016_083) | 0;\n d = (((d << 9) | (d >>> 23)) + a) | 0;\n c += (((d & b) | (a & ~b)) + k[15]! - 660_478_335) | 0;\n c = (((c << 14) | (c >>> 18)) + d) | 0;\n b += (((c & a) | (d & ~a)) + k[4]! - 405_537_848) | 0;\n b = (((b << 20) | (b >>> 12)) + c) | 0;\n a += (((b & d) | (c & ~d)) + k[9]! + 568_446_438) | 0;\n a = (((a << 5) | (a >>> 27)) + b) | 0;\n d += (((a & c) | (b & ~c)) + k[14]! - 1_019_803_690) | 0;\n d = (((d << 9) | (d >>> 23)) + a) | 0;\n c += (((d & b) | (a & ~b)) + k[3]! - 187_363_961) | 0;\n c = (((c << 14) | (c >>> 18)) + d) | 0;\n b += (((c & a) | (d & ~a)) + k[8]! + 1_163_531_501) | 0;\n b = (((b << 20) | (b >>> 12)) + c) | 0;\n a += (((b & d) | (c & ~d)) + k[13]! - 1_444_681_467) | 0;\n a = (((a << 5) | (a >>> 27)) + b) | 0;\n d += (((a & c) | (b & ~c)) + k[2]! - 51_403_784) | 0;\n d = (((d << 9) | (d >>> 23)) + a) | 0;\n c += (((d & b) | (a & ~b)) + k[7]! + 1_735_328_473) | 0;\n c = (((c << 14) | (c >>> 18)) + d) | 0;\n b += (((c & a) | (d & ~a)) + k[12]! - 1_926_607_734) | 0;\n b = (((b << 20) | (b >>> 12)) + c) | 0;\n // hh()\n a += ((b ^ c ^ d) + k[5]! - 378_558) | 0;\n a = (((a << 4) | (a >>> 28)) + b) | 0;\n d += ((a ^ b ^ c) + k[8]! - 2_022_574_463) | 0;\n d = (((d << 11) | (d >>> 21)) + a) | 0;\n c += ((d ^ a ^ b) + k[11]! + 1_839_030_562) | 0;\n c = (((c << 16) | (c >>> 16)) + d) | 0;\n b += ((c ^ d ^ a) + k[14]! - 35_309_556) | 0;\n b = (((b << 23) | (b >>> 9)) + c) | 0;\n a += ((b ^ c ^ d) + k[1]! - 1_530_992_060) | 0;\n a = (((a << 4) | (a >>> 28)) + b) | 0;\n d += ((a ^ b ^ c) + k[4]! + 1_272_893_353) | 0;\n d = (((d << 11) | (d >>> 21)) + a) | 0;\n c += ((d ^ a ^ b) + k[7]! - 155_497_632) | 0;\n c = (((c << 16) | (c >>> 16)) + d) | 0;\n b += ((c ^ d ^ a) + k[10]! - 1_094_730_640) | 0;\n b = (((b << 23) | (b >>> 9)) + c) | 0;\n a += ((b ^ c ^ d) + k[13]! + 681_279_174) | 0;\n a = (((a << 4) | (a >>> 28)) + b) | 0;\n d += ((a ^ b ^ c) + k[0]! - 358_537_222) | 0;\n d = (((d << 11) | (d >>> 21)) + a) | 0;\n c += ((d ^ a ^ b) + k[3]! - 722_521_979) | 0;\n c = (((c << 16) | (c >>> 16)) + d) | 0;\n b += ((c ^ d ^ a) + k[6]! + 76_029_189) | 0;\n b = (((b << 23) | (b >>> 9)) + c) | 0;\n a += ((b ^ c ^ d) + k[9]! - 640_364_487) | 0;\n a = (((a << 4) | (a >>> 28)) + b) | 0;\n d += ((a ^ b ^ c) + k[12]! - 421_815_835) | 0;\n d = (((d << 11) | (d >>> 21)) + a) | 0;\n c += ((d ^ a ^ b) + k[15]! + 530_742_520) | 0;\n c = (((c << 16) | (c >>> 16)) + d) | 0;\n b += ((c ^ d ^ a) + k[2]! - 995_338_651) | 0;\n b = (((b << 23) | (b >>> 9)) + c) | 0;\n // ii()\n a += ((c ^ (b | ~d)) + k[0]! - 198_630_844) | 0;\n a = (((a << 6) | (a >>> 26)) + b) | 0;\n d += ((b ^ (a | ~c)) + k[7]! + 1_126_891_415) | 0;\n d = (((d << 10) | (d >>> 22)) + a) | 0;\n c += ((a ^ (d | ~b)) + k[14]! - 1_416_354_905) | 0;\n c = (((c << 15) | (c >>> 17)) + d) | 0;\n b += ((d ^ (c | ~a)) + k[5]! - 57_434_055) | 0;\n b = (((b << 21) | (b >>> 11)) + c) | 0;\n a += ((c ^ (b | ~d)) + k[12]! + 1_700_485_571) | 0;\n a = (((a << 6) | (a >>> 26)) + b) | 0;\n d += ((b ^ (a | ~c)) + k[3]! - 1_894_986_606) | 0;\n d = (((d << 10) | (d >>> 22)) + a) | 0;\n c += ((a ^ (d | ~b)) + k[10]! - 1_051_523) | 0;\n c = (((c << 15) | (c >>> 17)) + d) | 0;\n b += ((d ^ (c | ~a)) + k[1]! - 2_054_922_799) | 0;\n b = (((b << 21) | (b >>> 11)) + c) | 0;\n a += ((c ^ (b | ~d)) + k[8]! + 1_873_313_359) | 0;\n a = (((a << 6) | (a >>> 26)) + b) | 0;\n d += ((b ^ (a | ~c)) + k[15]! - 30_611_744) | 0;\n d = (((d << 10) | (d >>> 22)) + a) | 0;\n c += ((a ^ (d | ~b)) + k[6]! - 1_560_198_380) | 0;\n c = (((c << 15) | (c >>> 17)) + d) | 0;\n b += ((d ^ (c | ~a)) + k[13]! + 1_309_151_649) | 0;\n b = (((b << 21) | (b >>> 11)) + c) | 0;\n a += ((c ^ (b | ~d)) + k[4]! - 145_523_070) | 0;\n a = (((a << 6) | (a >>> 26)) + b) | 0;\n d += ((b ^ (a | ~c)) + k[11]! - 1_120_210_379) | 0;\n d = (((d << 10) | (d >>> 22)) + a) | 0;\n c += ((a ^ (d | ~b)) + k[2]! + 718_787_259) | 0;\n c = (((c << 15) | (c >>> 17)) + d) | 0;\n b += ((d ^ (c | ~a)) + k[9]! - 343_485_551) | 0;\n b = (((b << 21) | (b >>> 11)) + c) | 0;\n\n x[0] = (a + x[0]!) | 0;\n x[1] = (b + x[1]!) | 0;\n x[2] = (c + x[2]!) | 0;\n x[3] = (d + x[3]!) | 0;\n }\n\n private _dataLength = 0;\n private _bufferLength = 0;\n\n private _state: Int32Array = new Int32Array(4);\n private _buffer: ArrayBuffer = new ArrayBuffer(68);\n private _buffer8: Uint8Array;\n private _buffer32: Uint32Array;\n\n constructor() {\n this._buffer8 = new Uint8Array(this._buffer, 0, 68);\n this._buffer32 = new Uint32Array(this._buffer, 0, 17);\n this.start();\n }\n\n /**\n * Initialise buffer to be hashed\n */\n public start(): this {\n this._dataLength = 0;\n this._bufferLength = 0;\n this._state.set(MD5.stateIdentity);\n return this;\n }\n\n // Char to code point to to array conversion:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n // #Example.3A_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown\n\n /**\n * Append a UTF-8 string to the hash buffer\n * @param str String to append\n */\n public appendStr(str: string): this {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let code;\n let i;\n\n for (i = 0; i < str.length; i += 1) {\n code = str.codePointAt(i) ?? 0;\n if (code < 128) {\n buf8[bufLen++] = code;\n } else if (code < 0x8_00) {\n buf8[bufLen++] = (code >>> 6) + 0xc0;\n buf8[bufLen++] = (code & 0x3f) | 0x80;\n } else if (code < 0xd8_00 || code > 0xdb_ff) {\n buf8[bufLen++] = (code >>> 12) + 0xe0;\n buf8[bufLen++] = ((code >>> 6) & 0x3f) | 0x80;\n buf8[bufLen++] = (code & 0x3f) | 0x80;\n } else {\n code =\n (code - 0xd8_00) * 0x4_00 +\n (str.codePointAt(++i) ?? 0 - 0xdc_00) +\n 0x1_00_00;\n if (code > 0x10_ff_ff) {\n throw new Error('Unicode standard supports code points up to U+10FFFF');\n }\n buf8[bufLen++] = (code >>> 18) + 0xf0;\n buf8[bufLen++] = ((code >>> 12) & 0x3f) | 0x80;\n buf8[bufLen++] = ((code >>> 6) & 0x3f) | 0x80;\n buf8[bufLen++] = (code & 0x3f) | 0x80;\n }\n if (bufLen >= 64) {\n this._dataLength += 64;\n MD5._md5cycle(this._state, buf32);\n bufLen -= 64;\n buf32[0] = buf32[16]!;\n }\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n /**\n * Append an ASCII string to the hash buffer\n * @param str String to append\n */\n public appendAsciiStr(str: string): this {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let i;\n let j = 0;\n\n for (;;) {\n i = Math.min(str.length - j, 64 - bufLen);\n while (i--) {\n buf8[bufLen++] = str.codePointAt(j++) ?? 0;\n }\n if (bufLen < 64) {\n break;\n }\n this._dataLength += 64;\n MD5._md5cycle(this._state, buf32);\n bufLen = 0;\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n /**\n * Append a byte array to the hash buffer\n * @param input array to append\n */\n public appendByteArray(input: Uint8Array): this {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let i;\n let j = 0;\n\n for (;;) {\n i = Math.min(input.length - j, 64 - bufLen);\n while (i--) {\n buf8[bufLen++] = input[j++]!;\n }\n if (bufLen < 64) {\n break;\n }\n this._dataLength += 64;\n MD5._md5cycle(this._state, buf32);\n bufLen = 0;\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n /**\n * Get the state of the hash buffer\n */\n public getState(): HasherState {\n const s = this._state;\n\n return {\n // eslint-disable-next-line unicorn/prefer-code-point\n buffer: String.fromCharCode.apply(null, Array.from(this._buffer8)),\n buflen: this._bufferLength,\n length: this._dataLength,\n state: [s[0]!, s[1]!, s[2]!, s[3]!],\n };\n }\n\n /**\n * Override the current state of the hash buffer\n * @param state New hash buffer state\n */\n public setState(state: HasherState): void {\n const buf = state.buffer;\n const x = state.state;\n const s = this._state;\n let i;\n\n this._dataLength = state.length;\n this._bufferLength = state.buflen;\n s[0] = x[0]!;\n s[1] = x[1]!;\n s[2] = x[2]!;\n s[3] = x[3]!;\n\n for (i = 0; i < buf.length; i += 1) {\n this._buffer8[i] = buf.codePointAt(i) ?? 0;\n }\n }\n\n /**\n * Hash the current state of the hash buffer and return the result\n * @param raw Whether to return the value as an `Int32Array`\n */\n public end(raw: boolean = false): Int32Array | string {\n const bufLen = this._bufferLength;\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n const i = (bufLen >> 2) + 1;\n\n this._dataLength += bufLen;\n const dataBitsLen = this._dataLength * 8;\n\n buf8[bufLen] = 0x80;\n buf8[bufLen + 1] = buf8[bufLen + 2] = buf8[bufLen + 3] = 0;\n buf32.set(MD5.buffer32Identity.subarray(i), i);\n\n if (bufLen > 55) {\n MD5._md5cycle(this._state, buf32);\n buf32.set(MD5.buffer32Identity);\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n if (dataBitsLen <= 0xff_ff_ff_ff) {\n buf32[14] = dataBitsLen;\n } else {\n const matches = dataBitsLen.toString(16).match(/(.*?)(.{0,8})$/);\n if (matches === null) return raw ? EMPTY_STATE : '';\n\n const lo = Number.parseInt(matches[2]!, 16);\n const hi = Number.parseInt(matches[1]!, 16) || 0;\n\n buf32[14] = lo;\n buf32[15] = hi;\n }\n\n MD5._md5cycle(this._state, buf32);\n\n return raw ? this._state : MD5._hex(this._state);\n }\n}\n\nif (MD5.hashStr('hello') !== '5d41402abc4b2a76b9719d911017c592') {\n throw new Error('MD5 self test failed.');\n}\n", "export default function chunked(\n string: string,\n charactersPerChunk: number,\n): Array<string> {\n if (string.length < charactersPerChunk) {\n // micro-optimization for small lists\n return [string];\n }\n const chunks = [];\n let i = 0;\n while (i < string.length) {\n chunks.push(string.slice(i, (i += charactersPerChunk)));\n }\n\n return chunks;\n}\n", "import applyConstructedStylesPatch, {\n isExtendedWindow,\n} from '../browser/applyConstructedStylesPatch.ts';\nimport takeDOMSnapshot from '../browser/takeDOMSnapshot.ts';\nimport type { TakeDOMSnapshotOptions } from '../isomorphic/types.ts';\nimport chunked from './chunked.ts';\n\ninterface HappoScreenshotOptions {\n component?: string;\n variant?: string;\n includeAllElements?: boolean;\n targets?: Array<string>;\n snapshotStrategy?: 'hoist' | 'clip';\n responsiveInlinedCanvases?: boolean;\n canvasChunkSize?: number;\n transformDOM?: {\n selector: string;\n transform: (element: Element, doc: Document) => Element;\n };\n\n /**\n * Options passed to the `cy.task` command\n */\n log?: boolean;\n timeout?: number;\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Cypress {\n interface Chainable {\n happoScreenshot(options?: HappoScreenshotOptions): Chainable<Element>;\n }\n }\n}\n\nCypress.on('window:before:load', (win: Window) => {\n console.log('[Happo] Applying constructed styles patch');\n if (!isExtendedWindow(win)) {\n throw new TypeError('CSSStyleSheet is not supported in this browser');\n }\n applyConstructedStylesPatch(win);\n});\n\ninterface CypressConfig {\n responsiveInlinedCanvases: boolean;\n canvasChunkSize: number;\n}\n\nlet config: CypressConfig = {\n responsiveInlinedCanvases: false,\n canvasChunkSize: 200_000, // 800 Kb per chunk\n};\n\nexport const configure = (userConfig?: Partial<CypressConfig>): void => {\n config = { ...config, ...userConfig };\n};\n\nCypress.Commands.add(\n 'happoScreenshot',\n { prevSubject: true },\n (originalSubject: Array<Element>, options: HappoScreenshotOptions = {}) => {\n const {\n // `cy.state` is an internal command not exposed in the type definitions.\n // We use it here to get the full title of the current test.\n component = cy\n // @ts-expect-error - cy.state is not exposed in the type definitions\n .state('runnable')\n .fullTitle(),\n variant = 'default',\n responsiveInlinedCanvases,\n includeAllElements,\n transformDOM,\n targets,\n snapshotStrategy = 'hoist',\n log = false,\n timeout = 10_000,\n } = options;\n\n const doc = originalSubject[0]?.ownerDocument;\n if (!doc) {\n throw new Error('ownerDocument cannot be null or undefined');\n }\n\n const taskOptions: Partial<Cypress.Loggable & Cypress.Timeoutable> = {\n log,\n timeout,\n };\n\n const resInCan =\n typeof responsiveInlinedCanvases === 'boolean'\n ? responsiveInlinedCanvases\n : config.responsiveInlinedCanvases;\n\n const element = includeAllElements\n ? Array.from(originalSubject)\n : originalSubject[0];\n if (!element) {\n throw new Error('element cannot be null or undefined');\n }\n\n const properties: TakeDOMSnapshotOptions = {\n doc,\n element,\n responsiveInlinedCanvases: resInCan,\n strategy: snapshotStrategy,\n handleBase64Image: ({ base64Url }) => {\n const rawBase64 = base64Url.replace(/^data:image\\/png;base64,/, '');\n const chunks = chunked(rawBase64, config.canvasChunkSize);\n for (let i = 0; i < chunks.length; i++) {\n const base64Chunk = chunks[i];\n const isFirst = i === 0;\n const isLast = i === chunks.length - 1;\n cy.task(\n 'happoRegisterBase64Image',\n {\n base64Chunk,\n isFirst,\n isLast,\n },\n taskOptions,\n );\n }\n },\n };\n\n if (transformDOM) {\n properties.transformDOM = transformDOM;\n }\n\n const domSnapshot = takeDOMSnapshot(properties);\n\n cy.task(\n 'happoRegisterSnapshot',\n {\n timestamp: Date.now(),\n component,\n variant,\n targets,\n ...domSnapshot,\n },\n taskOptions,\n );\n },\n);\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["const recordedCSSSymbol: unique symbol = Symbol('recordedCssRules');\nconst hasBrokenIndexesSymbol: unique symbol = Symbol('hasBrokenIndexes');\nconst isInstalledSymbol: unique symbol = Symbol('isInstalled');\n\n// Extend CSSStyleSheet interface to include our custom properties\ninterface ExtendedCSSStyleSheet extends CSSStyleSheet {\n [recordedCSSSymbol]?: Array<string>;\n [hasBrokenIndexesSymbol]?: boolean;\n}\n\n// Extend CSSStyleSheet constructor to include our custom properties\ninterface ExtendedCSSStyleSheetConstructor {\n new (options?: CSSStyleSheetInit): CSSStyleSheet;\n [isInstalledSymbol]?: boolean;\n prototype: CSSStyleSheet;\n}\n\n// Extend Window interface to include CSSStyleSheet\ninterface ExtendedWindow extends Window {\n CSSStyleSheet: ExtendedCSSStyleSheetConstructor;\n}\n\nexport function isExtendedWindow(w: Window): w is ExtendedWindow {\n return (\n 'CSSStyleSheet' in w &&\n typeof (w as unknown as { CSSStyleSheet: unknown }).CSSStyleSheet === 'function'\n );\n}\n\n// Helper to ensure our custom recorded array exists on the sheet.\nfunction ensureRecord(sheet: ExtendedCSSStyleSheet): void {\n if (!sheet[recordedCSSSymbol]) {\n sheet[recordedCSSSymbol] = [];\n }\n}\n\nfunction displayError(message: string): void {\n console.error(message);\n\n const el = document.createElement('div');\n el.setAttribute(\n 'style',\n `\n position: fixed;\n display: flex;\n align-items: center;\n justify-content: center;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n padding: 30px;\n background: red;\n font-weight: bold;\n color: white;\n z-index: 1000;\n font-family: monospace;\n `,\n );\n const inner = document.createElement('div');\n inner.textContent = message;\n el.append(inner);\n document.addEventListener('DOMContentLoaded', () => {\n document.body.append(el);\n });\n}\n\nexport default function applyConstructedStylesPatch(\n win: ExtendedWindow = globalThis.window as ExtendedWindow,\n): void {\n if (win.CSSStyleSheet === undefined) {\n console.error('CSSStyleSheet is not supported in this browser');\n return;\n }\n\n const CSSStyleSheetConstructor =\n win.CSSStyleSheet as ExtendedCSSStyleSheetConstructor;\n if (CSSStyleSheetConstructor[isInstalledSymbol]) {\n return;\n }\n CSSStyleSheetConstructor[isInstalledSymbol] = true;\n\n // Patch insertRule to record each rule string.\n const originalInsertRule = win.CSSStyleSheet.prototype.insertRule;\n win.CSSStyleSheet.prototype.insertRule = function (\n rule: string,\n index: number = 0,\n ): number {\n const extendedThis = this as ExtendedCSSStyleSheet;\n ensureRecord(extendedThis);\n\n if (extendedThis[hasBrokenIndexesSymbol] && index) {\n displayError(\n 'CSSStyleSheet.prototype.insertRule with a non-zero index does not work with Happo after first having called replace/replaceSync. Reach out to support@happo.io if you need help with this.',\n );\n return originalInsertRule.call(this, rule, index);\n }\n\n // If index is not provided or invalid, default to appending.\n if (\n index === undefined ||\n index < 0 ||\n index > (extendedThis[recordedCSSSymbol]?.length || 0)\n ) {\n extendedThis[recordedCSSSymbol]?.push(rule);\n } else {\n extendedThis[recordedCSSSymbol]?.splice(index, 0, rule);\n }\n return originalInsertRule.call(this, rule, index);\n };\n\n const originalAddRule = win.CSSStyleSheet.prototype.addRule;\n win.CSSStyleSheet.prototype.addRule = function (\n selector: string,\n styleBlock: string,\n index?: number,\n ): number {\n const extendedThis = this as ExtendedCSSStyleSheet;\n ensureRecord(extendedThis);\n if (extendedThis[hasBrokenIndexesSymbol] && index) {\n displayError(\n 'CSSStyleSheet.prototype.addRule with a non-zero index does not work with Happo after first having called replace/replaceSync. Reach out to support@happo.io if you need help with this.',\n );\n return originalAddRule.call(this, selector, styleBlock, index);\n }\n\n const rule = `${selector} { ${styleBlock} }`;\n if (\n index === undefined ||\n index < 0 ||\n index > (extendedThis[recordedCSSSymbol]?.length || 0)\n ) {\n extendedThis[recordedCSSSymbol]?.push(rule);\n } else {\n extendedThis[recordedCSSSymbol]?.splice(index, 0, rule);\n }\n return originalAddRule.call(this, selector, styleBlock, index);\n };\n\n // Patch deleteRule so that removed rules are taken out of our record.\n const originalDeleteRule = win.CSSStyleSheet.prototype.deleteRule;\n win.CSSStyleSheet.prototype.deleteRule = function (index: number): void {\n const extendedThis = this as ExtendedCSSStyleSheet;\n ensureRecord(extendedThis);\n if (extendedThis[hasBrokenIndexesSymbol]) {\n displayError(\n 'CSSStyleSheet.prototype.deleteRule does not work with Happo after first having called replace/replaceSync. Reach out to support@happo.io if you need help with this.',\n );\n } else if (\n index >= 0 &&\n index < (extendedThis[recordedCSSSymbol]?.length || 0)\n ) {\n extendedThis[recordedCSSSymbol]?.splice(index, 1);\n }\n return originalDeleteRule.call(this, index);\n };\n\n const originalRemoveRule = win.CSSStyleSheet.prototype.removeRule;\n win.CSSStyleSheet.prototype.removeRule = function (index?: number): void {\n const extendedThis = this as ExtendedCSSStyleSheet;\n ensureRecord(extendedThis);\n if (extendedThis[hasBrokenIndexesSymbol]) {\n displayError(\n 'CSSStyleSheet.prototype.removeRule does not work with Happo after first having called replace/replaceSync. Reach out to support@happo.io if you need help with this.',\n );\n } else if (\n index !== undefined &&\n index >= 0 &&\n index < (extendedThis[recordedCSSSymbol]?.length || 0)\n ) {\n extendedThis[recordedCSSSymbol]?.splice(index, 1);\n }\n return originalRemoveRule.call(this, index);\n };\n\n // Patch replaceSync to capture the new CSS text.\n const originalReplaceSync = win.CSSStyleSheet.prototype.replaceSync;\n win.CSSStyleSheet.prototype.replaceSync = function (text: string): void {\n const extendedThis = this as ExtendedCSSStyleSheet;\n extendedThis[recordedCSSSymbol] = text.split('\\n').map((rule) => rule.trim());\n extendedThis[hasBrokenIndexesSymbol] = true;\n return originalReplaceSync.call(this, text);\n };\n\n // Patch replace (the asynchronous version) similarly.\n const originalReplace = win.CSSStyleSheet.prototype.replace;\n win.CSSStyleSheet.prototype.replace = function (\n text: string,\n ): Promise<CSSStyleSheet> {\n const sheet = this as ExtendedCSSStyleSheet;\n return originalReplace.call(sheet, text).then(function (result: CSSStyleSheet) {\n sheet[recordedCSSSymbol] = text.split('\\n').map((rule) => rule.trim());\n sheet[hasBrokenIndexesSymbol] = true;\n return result;\n });\n };\n}\n\nexport { recordedCSSSymbol };\n", "import { parseSrcset } from 'srcset';\n\nimport findCSSAssetUrls from '../isomorphic/findCSSAssetUrls.ts';\nimport type {\n AssetUrl,\n CSSBlock,\n DOMSnapshotResult,\n TakeDOMSnapshotOptions,\n} from '../isomorphic/types.ts';\nimport applyConstructedStylesPatch, {\n recordedCSSSymbol,\n} from './applyConstructedStylesPatch.ts';\nimport assertElement, { isElementWithDataset, isIterableCollection } from './assertElement.ts';\nimport { MD5 } from './md5.ts';\n\nexport { applyConstructedStylesPatch };\n\nconst CSS_ELEMENTS_SELECTOR = 'style,link[rel=\"stylesheet\"][href]';\nconst COMMENT_PATTERN = /^\\/\\*.+\\*\\/$/;\n\nif (globalThis.window) {\n applyConstructedStylesPatch(globalThis.window);\n}\n\n// Extend HTMLElement and CSSStyleSheet to include our custom properties\ninterface ExtendedHTMLElement extends HTMLElement {\n [recordedCSSSymbol]?: Array<string>;\n}\n\ninterface ExtendedCSSStyleSheet extends CSSStyleSheet {\n [recordedCSSSymbol]?: Array<string>;\n}\n\nfunction getContentFromStyleSheet(element: HTMLElement | CSSStyleSheet): string {\n let lines: Array<string>;\n\n if ('textContent' in element && element.textContent) {\n // Handle <style> elements with direct textContent\n lines = element.textContent.split('\\n').map((line) => line.trim());\n } else if (\n recordedCSSSymbol in element &&\n (element as ExtendedHTMLElement | ExtendedCSSStyleSheet)[recordedCSSSymbol]\n ) {\n lines = (element as ExtendedHTMLElement | ExtendedCSSStyleSheet)[\n recordedCSSSymbol\n ]!;\n } else if (\n 'sheet' in element &&\n element.sheet &&\n (element.sheet as CSSStyleSheet).cssRules\n ) {\n // Handle <style> or <link> elements that have a sheet property\n const cssRules = (element.sheet as CSSStyleSheet).cssRules as CSSRuleList;\n lines = Array.from(cssRules).map((rule: CSSRule) => rule.cssText);\n } else if ((element as CSSStyleSheet).cssRules) {\n // Handle CSSStyleSheet objects (including adoptedStyleSheets)\n const cssRules = (element as CSSStyleSheet).cssRules as CSSRuleList;\n lines = Array.from(cssRules).map((rule: CSSRule) => rule.cssText);\n } else {\n return '';\n }\n\n return lines.filter((line) => line && !COMMENT_PATTERN.test(line)).join('\\n');\n}\n\nfunction extractCSSBlocks(doc: Document): Array<CSSBlock> {\n const blocks: Array<CSSBlock> = [];\n const styleElements = doc.querySelectorAll(CSS_ELEMENTS_SELECTOR);\n\n for (const element of styleElements) {\n if (element.closest('happo-shadow-content')) {\n // Skip if element is inside a happo-shadow-content element. These need to\n // be scoped to the shadow root and cannot be part of the global styles.\n continue;\n }\n if (element.tagName === 'LINK') {\n // <link href>\n const href = (element as HTMLLinkElement).href || element.getAttribute('href');\n blocks.push({\n key: href || '',\n href: href || undefined,\n baseUrl: element.baseURI,\n });\n } else {\n const content = getContentFromStyleSheet(element as HTMLElement);\n // Create a hash so that we can dedupe equal styles\n const key = MD5.hashStr(content);\n blocks.push({ content, key, baseUrl: element.baseURI });\n }\n }\n\n for (const sheet of doc.adoptedStyleSheets || []) {\n const content = getContentFromStyleSheet(sheet);\n const key = MD5.hashStr(content);\n blocks.push({ key, content, baseUrl: sheet.href || document.baseURI });\n }\n return blocks;\n}\n\nfunction defaultHandleBase64Image({\n base64Url,\n element,\n}: {\n base64Url: string;\n element: HTMLImageElement;\n}): void {\n // Simply make the base64Url the src of the image\n element.src = base64Url;\n}\n\n// Extend HTMLElement to include custom properties\ninterface ExtendedHTMLElementWithBase64 extends HTMLElement {\n _base64Url?: string;\n}\n\nfunction getElementAssetUrls(\n element: Element,\n {\n handleBase64Image = defaultHandleBase64Image,\n }: {\n handleBase64Image?: (params: {\n base64Url: string;\n element: HTMLImageElement;\n }) => void;\n } = {},\n): Array<AssetUrl> {\n const allUrls: Array<AssetUrl> = [];\n const allElements = [element].concat(Array.from(element.querySelectorAll('*')));\n for (const element of allElements) {\n if (element.tagName === 'SCRIPT') {\n // skip script elements\n continue;\n }\n const srcset = element.getAttribute('srcset');\n const src = element.getAttribute('src');\n const imageHref =\n element.tagName.toLowerCase() === 'image' && element.getAttribute('href');\n const linkHref =\n element.tagName.toLowerCase() === 'link' &&\n element.getAttribute('rel') === 'stylesheet' &&\n element.getAttribute('href');\n\n const style = element.getAttribute('style');\n const base64Url = (element as ExtendedHTMLElementWithBase64)._base64Url;\n if (base64Url && element.tagName === 'IMG') {\n handleBase64Image({ base64Url, element: element as HTMLImageElement });\n }\n if (src) {\n allUrls.push({ url: src, baseUrl: element.baseURI });\n }\n if (srcset) {\n allUrls.push(\n ...parseSrcset(srcset).map((p) => ({\n url: p.url,\n baseUrl: element.baseURI,\n })),\n );\n }\n if (style) {\n allUrls.push(\n ...findCSSAssetUrls(style).map((url) => ({\n url,\n baseUrl: element.baseURI,\n })),\n );\n }\n if (imageHref) {\n allUrls.push({ url: imageHref, baseUrl: element.baseURI });\n }\n if (linkHref) {\n allUrls.push({ url: linkHref, baseUrl: element.baseURI });\n }\n }\n return allUrls.filter(({ url }) => !url.startsWith('data:'));\n}\n\nfunction copyStyles(sourceElement: HTMLElement, targetElement: HTMLElement): void {\n const computedStyle = globalThis.getComputedStyle(sourceElement);\n\n for (let i = 0; i < computedStyle.length; i++) {\n const key = computedStyle[i];\n if (!key) continue;\n const value = computedStyle.getPropertyValue(key);\n if (value !== '') {\n targetElement.style.setProperty(key, value);\n }\n }\n}\n\nfunction inlineCanvases(\n element: Element,\n {\n doc,\n responsiveInlinedCanvases = false,\n }: { doc: Document; responsiveInlinedCanvases?: boolean },\n): { element: Element; cleanup: () => void } {\n const canvases: Array<HTMLCanvasElement> = [];\n if (element.tagName === 'CANVAS') {\n canvases.push(element as HTMLCanvasElement);\n }\n canvases.push(...Array.from(element.querySelectorAll('canvas')));\n\n let newElement = element;\n const replacements: Array<{ from: HTMLCanvasElement; to: HTMLImageElement }> = [];\n for (const canvas of canvases) {\n try {\n const canvasImageBase64 = canvas.toDataURL('image/png');\n if (canvasImageBase64 === 'data:,') {\n continue;\n }\n const image = doc.createElement('img');\n\n const url = `/.happo-tmp/_inlined/${MD5.hashStr(canvasImageBase64)}.png`;\n image.src = url;\n (image as ExtendedHTMLElementWithBase64)._base64Url = canvasImageBase64;\n const style = canvas.getAttribute('style');\n if (style) {\n image.setAttribute('style', style);\n }\n const className = canvas.getAttribute('class');\n if (className) {\n image.setAttribute('class', className);\n }\n if (responsiveInlinedCanvases) {\n image.style.width = '100%';\n image.style.height = 'auto';\n } else {\n const width = canvas.getAttribute('width');\n const height = canvas.getAttribute('height');\n if (width) image.setAttribute('width', width);\n if (height) image.setAttribute('height', height);\n copyStyles(canvas, image);\n }\n canvas.replaceWith(image);\n if (canvas === element) {\n // We're inlining the element. Make sure we return the modified element.\n newElement = image;\n }\n replacements.push({ from: canvas, to: image });\n } catch (e) {\n if (typeof e === 'object' && e !== null && 'name' in e && e.name === 'SecurityError') {\n console.warn('[HAPPO] Failed to convert tainted canvas to PNG image');\n console.warn(e);\n } else {\n throw e;\n }\n }\n }\n\n function cleanup(): void {\n for (const { from, to } of replacements) {\n to.replaceWith(from);\n }\n }\n return { element: newElement, cleanup };\n}\n\nfunction registerScrollPositions(doc: Document): void {\n const elements = doc.body.querySelectorAll<HTMLElement | SVGElement>('*');\n for (const node of elements) {\n if (node.scrollTop !== 0 || node.scrollLeft !== 0) {\n node.dataset.happoScrollposition = `${node.scrollTop},${node.scrollLeft}`;\n }\n }\n}\n\nfunction registerCheckedInputs(doc: Document): void {\n const elements = doc.body.querySelectorAll(\n 'input[type=\"checkbox\"], input[type=\"radio\"]',\n );\n for (const node of elements) {\n const input = node as HTMLInputElement;\n if (input.checked) {\n input.setAttribute('checked', 'checked');\n } else {\n input.removeAttribute('checked');\n }\n }\n}\n\nfunction extractElementAttributes(el: Element): Record<string, string> {\n const result: Record<string, string> = {};\n for (const item of el.attributes) {\n result[item.name] = item.value;\n }\n return result;\n}\n\nfunction performDOMTransform({\n doc,\n selector,\n transform,\n element,\n}: {\n doc: Document;\n selector: string;\n transform: (element: Element, doc: Document) => Element;\n element: Element;\n}): (() => void) | undefined {\n const elements = Array.from(element.querySelectorAll(selector));\n if (!elements.length) {\n return;\n }\n const replacements: Array<{ from: Element; to: Element }> = [];\n for (const element of elements) {\n const replacement = transform(element, doc);\n replacements.push({ from: element, to: replacement });\n element.replaceWith(replacement);\n }\n return () => {\n for (const { from, to } of replacements) {\n to.replaceWith(from);\n }\n };\n}\n\nfunction transformToElementArray(\n elements: Element | Array<Element> | NodeListOf<Element>,\n): Array<Element> {\n // Check if 'elements' is already an array\n if (Array.isArray(elements)) {\n return elements;\n }\n\n // Check if 'elements' is an iterable collection, like a NodeList\n if (isIterableCollection(elements)) {\n return Array.from(elements);\n }\n\n return [elements];\n}\n\n/**\n * Injects all shadow roots from the given element.\n *\n * @param {HTMLElement} element\n */\nfunction inlineShadowRoots(element: Element): void {\n const elements = [element];\n\n const elementsToProcess: Array<Element> = [];\n while (elements.length) {\n const currentElement = elements.shift();\n if (!currentElement) continue;\n\n if (currentElement.shadowRoot) {\n elementsToProcess.unshift(currentElement); // LIFO so that leaf nodes are processed first\n }\n elements.unshift(...(Array.from(currentElement.children) as Array<HTMLElement>)); // LIFO so that leaf nodes are processed first\n }\n\n for (const element of elementsToProcess) {\n const hiddenElement = document.createElement('happo-shadow-content');\n hiddenElement.style.display = 'none';\n\n // Add adopted stylesheets as <style> elements\n if (element.shadowRoot) {\n for (const styleSheet of element.shadowRoot.adoptedStyleSheets) {\n const styleElement = document.createElement('style');\n styleElement.dataset.happoInlined = 'true';\n const styleContent = getContentFromStyleSheet(styleSheet);\n styleElement.textContent = styleContent;\n hiddenElement.append(styleElement);\n }\n\n hiddenElement.innerHTML += element.shadowRoot.innerHTML;\n element.append(hiddenElement);\n }\n }\n}\n\n/**\n * Adds data-happo-modal to the first modal dialog that is open, and removes it\n * from all other dialogs.\n */\nfunction markModalDialogs(element: Element): void {\n const cleanups = element.querySelectorAll<HTMLDialogElement>(\n 'dialog[data-happo-modal]',\n );\n for (const cleanup of cleanups) {\n delete cleanup.dataset.happoModal;\n }\n\n const openModal = element.querySelector<HTMLDialogElement>('dialog:modal[open]');\n if (!openModal) {\n return;\n }\n openModal.dataset.happoModal = 'true';\n}\n\nfunction findSvgElementsWithSymbols(element: Element): Array<SVGElement> {\n return [...element.ownerDocument.querySelectorAll('svg')].filter((svg) =>\n svg.querySelector('symbol'),\n );\n}\n\nexport default function takeDOMSnapshot({\n doc,\n element: oneOrMoreElements,\n responsiveInlinedCanvases = false,\n transformDOM,\n handleBase64Image,\n strategy = 'hoist',\n}: TakeDOMSnapshotOptions): DOMSnapshotResult {\n if (doc == null) {\n throw new Error('doc cannot be null or undefined');\n }\n if (doc.defaultView == null) {\n throw new Error('doc.defaultView cannot be null or undefined');\n }\n\n assertElement(oneOrMoreElements);\n\n const allElements = transformToElementArray(oneOrMoreElements);\n const htmlParts: Array<string> = [];\n const assetUrls: Array<AssetUrl> = [];\n for (const originalElement of allElements) {\n const { element, cleanup: canvasCleanup } = inlineCanvases(originalElement, {\n doc,\n responsiveInlinedCanvases,\n });\n\n registerScrollPositions(doc);\n registerCheckedInputs(doc);\n\n const transformCleanup = transformDOM\n ? performDOMTransform({\n doc,\n element,\n ...transformDOM,\n })\n : undefined;\n\n for (const scriptEl of element.querySelectorAll('script')) {\n if (scriptEl.parentNode) {\n scriptEl.remove();\n }\n }\n\n for (const e of doc.querySelectorAll<HTMLElement | SVGElement | MathMLElement>(\n '[data-happo-focus]',\n )) {\n delete e.dataset.happoFocus;\n }\n\n if (\n doc.activeElement &&\n doc.activeElement !== doc.body &&\n isElementWithDataset(doc.activeElement)\n ) {\n doc.activeElement.dataset.happoFocus = 'true';\n }\n\n inlineShadowRoots(element);\n markModalDialogs(element);\n\n assetUrls.push(\n ...getElementAssetUrls(\n element,\n handleBase64Image ? { handleBase64Image } : {},\n ),\n );\n\n if (strategy === 'hoist') {\n htmlParts.push(element.outerHTML);\n } else if (strategy === 'clip') {\n if (!isElementWithDataset(element)) {\n throw new TypeError(\n 'element does not support the dataset property, i.e. it is not an HTMLElement or SVGElement or MathMLElement',\n );\n }\n\n element.dataset.happoClip = 'true';\n htmlParts.push(doc.body.outerHTML);\n } else {\n throw new Error(`Unknown strategy: ${strategy}`);\n }\n\n if (strategy === 'hoist') {\n const svgElementsWithSymbols = findSvgElementsWithSymbols(element);\n for (const svgElement of svgElementsWithSymbols) {\n htmlParts.push(`<div style=\"display: none;\">${svgElement.outerHTML}</div>`);\n }\n }\n if (canvasCleanup) canvasCleanup();\n if (transformCleanup) transformCleanup();\n }\n\n const cssBlocks = extractCSSBlocks(doc);\n const htmlElementAttrs = extractElementAttributes(doc.documentElement);\n const bodyElementAttrs = extractElementAttributes(doc.body);\n\n // Remove our shadow content elements so that they don't affect the page\n for (const e of doc.querySelectorAll('happo-shadow-content')) e.remove();\n if (strategy === 'clip') {\n for (const e of doc.querySelectorAll<HTMLElement | SVGElement>(\n '[data-happo-clip]',\n )) {\n delete e.dataset.happoClip;\n }\n }\n\n return {\n html: htmlParts.join('\\n'),\n assetUrls,\n cssBlocks,\n htmlElementAttrs,\n bodyElementAttrs,\n };\n}\n", "export function isElementWithDataset(\n element: unknown,\n): element is HTMLElement | SVGElement | MathMLElement {\n if (typeof element !== 'object') {\n return false;\n }\n\n if (element == null) {\n return false;\n }\n\n if (!('dataset' in element)) {\n return false;\n }\n\n if (typeof element.dataset !== 'object') {\n return false;\n }\n\n if (element.dataset == null) {\n return false;\n }\n\n return true;\n}\n\nexport function isIterableCollection(\n element: NonNullable<unknown>,\n): element is Iterable<unknown> {\n if (typeof element !== 'object') {\n return false;\n }\n\n if (!('length' in element)) {\n return false;\n }\n\n if (typeof element.length !== 'number') {\n return false;\n }\n\n if (!('item' in element)) {\n return false;\n }\n\n if (typeof element.item !== 'function') {\n return false;\n }\n\n if (!(Symbol.iterator in element)) {\n return false;\n }\n\n if (typeof element[Symbol.iterator] !== 'function') {\n return false;\n }\n\n return true;\n}\n\n/**\n * Throws if the element is not a valid Element instance, an array of elements,\n * or a NodeList of elements.\n */\nexport default function assertElement(\n element: unknown,\n): asserts element is Element | Array<Element> | NodeListOf<Element> {\n if (element == null) {\n throw new Error('element cannot be null or undefined');\n }\n\n if (typeof element !== 'object') {\n throw new TypeError('element must be an object');\n }\n\n if (Array.isArray(element) || isIterableCollection(element)) {\n for (const el of element) {\n assertElement(el);\n }\n\n return;\n }\n\n if (!('nodeType' in element)) {\n throw new TypeError('element must have a nodeType property');\n }\n\n if (element.nodeType !== 1 /* ELEMENT_NODE */) {\n throw new Error('element must have a nodeType of ELEMENT_NODE');\n }\n}\n", "/* eslint-disable unicorn/prefer-math-trunc */\n\n/*\n\nTypeScript MD5\n==============\n\nBased on work by\n* Joseph Myers: http://www.myersdaily.org/joseph/javascript/md5-text.html\n* Andr\u00E9 Cruz: https://github.com/satazor/SparkMD5\n* Raymond Hill: https://github.com/gorhill/yamd5.js\n\nEffectively a TypeScrypt re-write of Raymond Hill JS Library\n\nThe MIT License (MIT)\n\nCopyright (C) 2014 Raymond Hill\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n\n DO WHAT YOU WANT TO PUBLIC LICENSE\n Version 2, December 2004\n\n Copyright (C) 2015 Andr\u00E9 Cruz <amdfcruz@gmail.com>\n\n Everyone is permitted to copy and distribute verbatim or modified\n copies of this license document, and changing it is allowed as long\n as the name is changed.\n\n DO WHAT YOU WANT TO PUBLIC LICENSE\n TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n 0. You just DO WHAT YOU WANT TO.\n\n\n*/\n\ninterface HasherState {\n buffer: string;\n buflen: number;\n length: number;\n state: Array<number>;\n}\n\nconst EMPTY_STATE = new Int32Array(4);\n\nexport class MD5 {\n /**\n * Hash a UTF-8 string on the spot\n * @param str String to hash\n * @param raw Whether to return the value as an `Int32Array`\n */\n public static hashStr(str: string, raw?: false): string;\n public static hashStr(str: string, raw: true): Int32Array;\n public static hashStr(str: string, raw: boolean = false) {\n return this.onePassHasher.start().appendStr(str).end(raw);\n }\n\n /**\n * Hash a ASCII string on the spot\n * @param str String to hash\n * @param raw Whether to return the value as an `Int32Array`\n */\n public static hashAsciiStr(str: string, raw?: false): string;\n public static hashAsciiStr(str: string, raw: true): Int32Array;\n public static hashAsciiStr(str: string, raw: boolean = false) {\n return this.onePassHasher.start().appendAsciiStr(str).end(raw);\n }\n // Private Static Variables\n private static stateIdentity = new Int32Array([\n 1_732_584_193, -271_733_879, -1_732_584_194, 271_733_878,\n ]);\n private static buffer32Identity = new Int32Array([\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n ]);\n private static hexChars = '0123456789abcdef';\n private static hexOut: Array<string> = [];\n\n // Permanent instance is to use for one-call hashing\n private static onePassHasher = new MD5();\n\n private static _hex(x: Int32Array): string {\n const hc = MD5.hexChars;\n const ho = MD5.hexOut;\n let n;\n let offset;\n let j;\n let i;\n\n for (i = 0; i < 4; i += 1) {\n offset = i * 8;\n n = x[i]!;\n for (j = 0; j < 8; j += 2) {\n ho[offset + 1 + j] = hc.charAt(n & 0x0f);\n n >>>= 4;\n ho[offset + 0 + j] = hc.charAt(n & 0x0f);\n n >>>= 4;\n }\n }\n return ho.join('');\n }\n\n private static _md5cycle(\n x: Int32Array | Uint32Array,\n k: Int32Array | Uint32Array,\n ) {\n let a = x[0]!;\n let b = x[1]!;\n let c = x[2]!;\n let d = x[3]!;\n // ff()\n a += (((b & c) | (~b & d)) + k[0]! - 680_876_936) | 0;\n a = (((a << 7) | (a >>> 25)) + b) | 0;\n d += (((a & b) | (~a & c)) + k[1]! - 389_564_586) | 0;\n d = (((d << 12) | (d >>> 20)) + a) | 0;\n c += (((d & a) | (~d & b)) + k[2]! + 606_105_819) | 0;\n c = (((c << 17) | (c >>> 15)) + d) | 0;\n b += (((c & d) | (~c & a)) + k[3]! - 1_044_525_330) | 0;\n b = (((b << 22) | (b >>> 10)) + c) | 0;\n a += (((b & c) | (~b & d)) + k[4]! - 176_418_897) | 0;\n a = (((a << 7) | (a >>> 25)) + b) | 0;\n d += (((a & b) | (~a & c)) + k[5]! + 1_200_080_426) | 0;\n d = (((d << 12) | (d >>> 20)) + a) | 0;\n c += (((d & a) | (~d & b)) + k[6]! - 1_473_231_341) | 0;\n c = (((c << 17) | (c >>> 15)) + d) | 0;\n b += (((c & d) | (~c & a)) + k[7]! - 45_705_983) | 0;\n b = (((b << 22) | (b >>> 10)) + c) | 0;\n a += (((b & c) | (~b & d)) + k[8]! + 1_770_035_416) | 0;\n a = (((a << 7) | (a >>> 25)) + b) | 0;\n d += (((a & b) | (~a & c)) + k[9]! - 1_958_414_417) | 0;\n d = (((d << 12) | (d >>> 20)) + a) | 0;\n c += (((d & a) | (~d & b)) + k[10]! - 42_063) | 0;\n c = (((c << 17) | (c >>> 15)) + d) | 0;\n b += (((c & d) | (~c & a)) + k[11]! - 1_990_404_162) | 0;\n b = (((b << 22) | (b >>> 10)) + c) | 0;\n a += (((b & c) | (~b & d)) + k[12]! + 1_804_603_682) | 0;\n a = (((a << 7) | (a >>> 25)) + b) | 0;\n d += (((a & b) | (~a & c)) + k[13]! - 40_341_101) | 0;\n d = (((d << 12) | (d >>> 20)) + a) | 0;\n c += (((d & a) | (~d & b)) + k[14]! - 1_502_002_290) | 0;\n c = (((c << 17) | (c >>> 15)) + d) | 0;\n b += (((c & d) | (~c & a)) + k[15]! + 1_236_535_329) | 0;\n b = (((b << 22) | (b >>> 10)) + c) | 0;\n // gg()\n a += (((b & d) | (c & ~d)) + k[1]! - 165_796_510) | 0;\n a = (((a << 5) | (a >>> 27)) + b) | 0;\n d += (((a & c) | (b & ~c)) + k[6]! - 1_069_501_632) | 0;\n d = (((d << 9) | (d >>> 23)) + a) | 0;\n c += (((d & b) | (a & ~b)) + k[11]! + 643_717_713) | 0;\n c = (((c << 14) | (c >>> 18)) + d) | 0;\n b += (((c & a) | (d & ~a)) + k[0]! - 373_897_302) | 0;\n b = (((b << 20) | (b >>> 12)) + c) | 0;\n a += (((b & d) | (c & ~d)) + k[5]! - 701_558_691) | 0;\n a = (((a << 5) | (a >>> 27)) + b) | 0;\n d += (((a & c) | (b & ~c)) + k[10]! + 38_016_083) | 0;\n d = (((d << 9) | (d >>> 23)) + a) | 0;\n c += (((d & b) | (a & ~b)) + k[15]! - 660_478_335) | 0;\n c = (((c << 14) | (c >>> 18)) + d) | 0;\n b += (((c & a) | (d & ~a)) + k[4]! - 405_537_848) | 0;\n b = (((b << 20) | (b >>> 12)) + c) | 0;\n a += (((b & d) | (c & ~d)) + k[9]! + 568_446_438) | 0;\n a = (((a << 5) | (a >>> 27)) + b) | 0;\n d += (((a & c) | (b & ~c)) + k[14]! - 1_019_803_690) | 0;\n d = (((d << 9) | (d >>> 23)) + a) | 0;\n c += (((d & b) | (a & ~b)) + k[3]! - 187_363_961) | 0;\n c = (((c << 14) | (c >>> 18)) + d) | 0;\n b += (((c & a) | (d & ~a)) + k[8]! + 1_163_531_501) | 0;\n b = (((b << 20) | (b >>> 12)) + c) | 0;\n a += (((b & d) | (c & ~d)) + k[13]! - 1_444_681_467) | 0;\n a = (((a << 5) | (a >>> 27)) + b) | 0;\n d += (((a & c) | (b & ~c)) + k[2]! - 51_403_784) | 0;\n d = (((d << 9) | (d >>> 23)) + a) | 0;\n c += (((d & b) | (a & ~b)) + k[7]! + 1_735_328_473) | 0;\n c = (((c << 14) | (c >>> 18)) + d) | 0;\n b += (((c & a) | (d & ~a)) + k[12]! - 1_926_607_734) | 0;\n b = (((b << 20) | (b >>> 12)) + c) | 0;\n // hh()\n a += ((b ^ c ^ d) + k[5]! - 378_558) | 0;\n a = (((a << 4) | (a >>> 28)) + b) | 0;\n d += ((a ^ b ^ c) + k[8]! - 2_022_574_463) | 0;\n d = (((d << 11) | (d >>> 21)) + a) | 0;\n c += ((d ^ a ^ b) + k[11]! + 1_839_030_562) | 0;\n c = (((c << 16) | (c >>> 16)) + d) | 0;\n b += ((c ^ d ^ a) + k[14]! - 35_309_556) | 0;\n b = (((b << 23) | (b >>> 9)) + c) | 0;\n a += ((b ^ c ^ d) + k[1]! - 1_530_992_060) | 0;\n a = (((a << 4) | (a >>> 28)) + b) | 0;\n d += ((a ^ b ^ c) + k[4]! + 1_272_893_353) | 0;\n d = (((d << 11) | (d >>> 21)) + a) | 0;\n c += ((d ^ a ^ b) + k[7]! - 155_497_632) | 0;\n c = (((c << 16) | (c >>> 16)) + d) | 0;\n b += ((c ^ d ^ a) + k[10]! - 1_094_730_640) | 0;\n b = (((b << 23) | (b >>> 9)) + c) | 0;\n a += ((b ^ c ^ d) + k[13]! + 681_279_174) | 0;\n a = (((a << 4) | (a >>> 28)) + b) | 0;\n d += ((a ^ b ^ c) + k[0]! - 358_537_222) | 0;\n d = (((d << 11) | (d >>> 21)) + a) | 0;\n c += ((d ^ a ^ b) + k[3]! - 722_521_979) | 0;\n c = (((c << 16) | (c >>> 16)) + d) | 0;\n b += ((c ^ d ^ a) + k[6]! + 76_029_189) | 0;\n b = (((b << 23) | (b >>> 9)) + c) | 0;\n a += ((b ^ c ^ d) + k[9]! - 640_364_487) | 0;\n a = (((a << 4) | (a >>> 28)) + b) | 0;\n d += ((a ^ b ^ c) + k[12]! - 421_815_835) | 0;\n d = (((d << 11) | (d >>> 21)) + a) | 0;\n c += ((d ^ a ^ b) + k[15]! + 530_742_520) | 0;\n c = (((c << 16) | (c >>> 16)) + d) | 0;\n b += ((c ^ d ^ a) + k[2]! - 995_338_651) | 0;\n b = (((b << 23) | (b >>> 9)) + c) | 0;\n // ii()\n a += ((c ^ (b | ~d)) + k[0]! - 198_630_844) | 0;\n a = (((a << 6) | (a >>> 26)) + b) | 0;\n d += ((b ^ (a | ~c)) + k[7]! + 1_126_891_415) | 0;\n d = (((d << 10) | (d >>> 22)) + a) | 0;\n c += ((a ^ (d | ~b)) + k[14]! - 1_416_354_905) | 0;\n c = (((c << 15) | (c >>> 17)) + d) | 0;\n b += ((d ^ (c | ~a)) + k[5]! - 57_434_055) | 0;\n b = (((b << 21) | (b >>> 11)) + c) | 0;\n a += ((c ^ (b | ~d)) + k[12]! + 1_700_485_571) | 0;\n a = (((a << 6) | (a >>> 26)) + b) | 0;\n d += ((b ^ (a | ~c)) + k[3]! - 1_894_986_606) | 0;\n d = (((d << 10) | (d >>> 22)) + a) | 0;\n c += ((a ^ (d | ~b)) + k[10]! - 1_051_523) | 0;\n c = (((c << 15) | (c >>> 17)) + d) | 0;\n b += ((d ^ (c | ~a)) + k[1]! - 2_054_922_799) | 0;\n b = (((b << 21) | (b >>> 11)) + c) | 0;\n a += ((c ^ (b | ~d)) + k[8]! + 1_873_313_359) | 0;\n a = (((a << 6) | (a >>> 26)) + b) | 0;\n d += ((b ^ (a | ~c)) + k[15]! - 30_611_744) | 0;\n d = (((d << 10) | (d >>> 22)) + a) | 0;\n c += ((a ^ (d | ~b)) + k[6]! - 1_560_198_380) | 0;\n c = (((c << 15) | (c >>> 17)) + d) | 0;\n b += ((d ^ (c | ~a)) + k[13]! + 1_309_151_649) | 0;\n b = (((b << 21) | (b >>> 11)) + c) | 0;\n a += ((c ^ (b | ~d)) + k[4]! - 145_523_070) | 0;\n a = (((a << 6) | (a >>> 26)) + b) | 0;\n d += ((b ^ (a | ~c)) + k[11]! - 1_120_210_379) | 0;\n d = (((d << 10) | (d >>> 22)) + a) | 0;\n c += ((a ^ (d | ~b)) + k[2]! + 718_787_259) | 0;\n c = (((c << 15) | (c >>> 17)) + d) | 0;\n b += ((d ^ (c | ~a)) + k[9]! - 343_485_551) | 0;\n b = (((b << 21) | (b >>> 11)) + c) | 0;\n\n x[0] = (a + x[0]!) | 0;\n x[1] = (b + x[1]!) | 0;\n x[2] = (c + x[2]!) | 0;\n x[3] = (d + x[3]!) | 0;\n }\n\n private _dataLength = 0;\n private _bufferLength = 0;\n\n private _state: Int32Array = new Int32Array(4);\n private _buffer: ArrayBuffer = new ArrayBuffer(68);\n private _buffer8: Uint8Array;\n private _buffer32: Uint32Array;\n\n constructor() {\n this._buffer8 = new Uint8Array(this._buffer, 0, 68);\n this._buffer32 = new Uint32Array(this._buffer, 0, 17);\n this.start();\n }\n\n /**\n * Initialise buffer to be hashed\n */\n public start(): this {\n this._dataLength = 0;\n this._bufferLength = 0;\n this._state.set(MD5.stateIdentity);\n return this;\n }\n\n // Char to code point to to array conversion:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n // #Example.3A_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown\n\n /**\n * Append a UTF-8 string to the hash buffer\n * @param str String to append\n */\n public appendStr(str: string): this {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let code;\n let i;\n\n for (i = 0; i < str.length; i += 1) {\n code = str.codePointAt(i) ?? 0;\n if (code < 128) {\n buf8[bufLen++] = code;\n } else if (code < 0x8_00) {\n buf8[bufLen++] = (code >>> 6) + 0xc0;\n buf8[bufLen++] = (code & 0x3f) | 0x80;\n } else if (code < 0xd8_00 || code > 0xdb_ff) {\n buf8[bufLen++] = (code >>> 12) + 0xe0;\n buf8[bufLen++] = ((code >>> 6) & 0x3f) | 0x80;\n buf8[bufLen++] = (code & 0x3f) | 0x80;\n } else {\n code =\n (code - 0xd8_00) * 0x4_00 +\n (str.codePointAt(++i) ?? 0 - 0xdc_00) +\n 0x1_00_00;\n if (code > 0x10_ff_ff) {\n throw new Error('Unicode standard supports code points up to U+10FFFF');\n }\n buf8[bufLen++] = (code >>> 18) + 0xf0;\n buf8[bufLen++] = ((code >>> 12) & 0x3f) | 0x80;\n buf8[bufLen++] = ((code >>> 6) & 0x3f) | 0x80;\n buf8[bufLen++] = (code & 0x3f) | 0x80;\n }\n if (bufLen >= 64) {\n this._dataLength += 64;\n MD5._md5cycle(this._state, buf32);\n bufLen -= 64;\n buf32[0] = buf32[16]!;\n }\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n /**\n * Append an ASCII string to the hash buffer\n * @param str String to append\n */\n public appendAsciiStr(str: string): this {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let i;\n let j = 0;\n\n for (;;) {\n i = Math.min(str.length - j, 64 - bufLen);\n while (i--) {\n buf8[bufLen++] = str.codePointAt(j++) ?? 0;\n }\n if (bufLen < 64) {\n break;\n }\n this._dataLength += 64;\n MD5._md5cycle(this._state, buf32);\n bufLen = 0;\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n /**\n * Append a byte array to the hash buffer\n * @param input array to append\n */\n public appendByteArray(input: Uint8Array): this {\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n let bufLen = this._bufferLength;\n let i;\n let j = 0;\n\n for (;;) {\n i = Math.min(input.length - j, 64 - bufLen);\n while (i--) {\n buf8[bufLen++] = input[j++]!;\n }\n if (bufLen < 64) {\n break;\n }\n this._dataLength += 64;\n MD5._md5cycle(this._state, buf32);\n bufLen = 0;\n }\n this._bufferLength = bufLen;\n return this;\n }\n\n /**\n * Get the state of the hash buffer\n */\n public getState(): HasherState {\n const s = this._state;\n\n return {\n // eslint-disable-next-line unicorn/prefer-code-point\n buffer: String.fromCharCode.apply(null, Array.from(this._buffer8)),\n buflen: this._bufferLength,\n length: this._dataLength,\n state: [s[0]!, s[1]!, s[2]!, s[3]!],\n };\n }\n\n /**\n * Override the current state of the hash buffer\n * @param state New hash buffer state\n */\n public setState(state: HasherState): void {\n const buf = state.buffer;\n const x = state.state;\n const s = this._state;\n let i;\n\n this._dataLength = state.length;\n this._bufferLength = state.buflen;\n s[0] = x[0]!;\n s[1] = x[1]!;\n s[2] = x[2]!;\n s[3] = x[3]!;\n\n for (i = 0; i < buf.length; i += 1) {\n this._buffer8[i] = buf.codePointAt(i) ?? 0;\n }\n }\n\n /**\n * Hash the current state of the hash buffer and return the result\n * @param raw Whether to return the value as an `Int32Array`\n */\n public end(raw: boolean = false): Int32Array | string {\n const bufLen = this._bufferLength;\n const buf8 = this._buffer8;\n const buf32 = this._buffer32;\n const i = (bufLen >> 2) + 1;\n\n this._dataLength += bufLen;\n const dataBitsLen = this._dataLength * 8;\n\n buf8[bufLen] = 0x80;\n buf8[bufLen + 1] = buf8[bufLen + 2] = buf8[bufLen + 3] = 0;\n buf32.set(MD5.buffer32Identity.subarray(i), i);\n\n if (bufLen > 55) {\n MD5._md5cycle(this._state, buf32);\n buf32.set(MD5.buffer32Identity);\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n if (dataBitsLen <= 0xff_ff_ff_ff) {\n buf32[14] = dataBitsLen;\n } else {\n const matches = dataBitsLen.toString(16).match(/(.*?)(.{0,8})$/);\n if (matches === null) return raw ? EMPTY_STATE : '';\n\n const lo = Number.parseInt(matches[2]!, 16);\n const hi = Number.parseInt(matches[1]!, 16) || 0;\n\n buf32[14] = lo;\n buf32[15] = hi;\n }\n\n MD5._md5cycle(this._state, buf32);\n\n return raw ? this._state : MD5._hex(this._state);\n }\n}\n\nif (MD5.hashStr('hello') !== '5d41402abc4b2a76b9719d911017c592') {\n throw new Error('MD5 self test failed.');\n}\n", "export default function chunked(\n string: string,\n charactersPerChunk: number,\n): Array<string> {\n if (string.length < charactersPerChunk) {\n // micro-optimization for small lists\n return [string];\n }\n const chunks = [];\n let i = 0;\n while (i < string.length) {\n chunks.push(string.slice(i, (i += charactersPerChunk)));\n }\n\n return chunks;\n}\n", "import applyConstructedStylesPatch, {\n isExtendedWindow,\n} from '../browser/applyConstructedStylesPatch.ts';\nimport takeDOMSnapshot from '../browser/takeDOMSnapshot.ts';\nimport type { TakeDOMSnapshotOptions } from '../isomorphic/types.ts';\nimport chunked from './chunked.ts';\n\ninterface HappoScreenshotOptions {\n component?: string;\n variant?: string;\n includeAllElements?: boolean;\n targets?: Array<string>;\n snapshotStrategy?: 'hoist' | 'clip';\n responsiveInlinedCanvases?: boolean;\n canvasChunkSize?: number;\n transformDOM?: {\n selector: string;\n transform: (element: Element, doc: Document) => Element;\n };\n\n /**\n * Options passed to the `cy.task` command\n */\n log?: boolean;\n timeout?: number;\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace Cypress {\n interface Chainable {\n happoScreenshot(options?: HappoScreenshotOptions): Chainable<Element>;\n }\n }\n}\n\nCypress.on('window:before:load', (win: Window) => {\n console.log('[Happo] Applying constructed styles patch');\n if (!isExtendedWindow(win)) {\n throw new TypeError('CSSStyleSheet is not supported in this browser');\n }\n applyConstructedStylesPatch(win);\n});\n\ninterface CypressConfig {\n responsiveInlinedCanvases: boolean;\n canvasChunkSize: number;\n}\n\nlet config: CypressConfig = {\n responsiveInlinedCanvases: false,\n canvasChunkSize: 200_000, // 800 Kb per chunk\n};\n\nexport const configure = (userConfig?: Partial<CypressConfig>): void => {\n config = { ...config, ...userConfig };\n};\n\nCypress.Commands.add(\n 'happoScreenshot',\n { prevSubject: true },\n (originalSubject: Array<Element>, options: HappoScreenshotOptions = {}) => {\n const {\n // `cy.state` is an internal command not exposed in the type definitions.\n // We use it here to get the full title of the current test.\n component = cy\n // @ts-expect-error - cy.state is not exposed in the type definitions\n .state('runnable')\n .fullTitle(),\n variant = 'default',\n responsiveInlinedCanvases,\n includeAllElements,\n transformDOM,\n targets,\n snapshotStrategy = 'hoist',\n log = false,\n timeout = 10_000,\n } = options;\n\n const doc = originalSubject[0]?.ownerDocument;\n if (!doc) {\n throw new Error('ownerDocument cannot be null or undefined');\n }\n\n const taskOptions: Partial<Cypress.Loggable & Cypress.Timeoutable> = {\n log,\n timeout,\n };\n\n const resInCan =\n typeof responsiveInlinedCanvases === 'boolean'\n ? responsiveInlinedCanvases\n : config.responsiveInlinedCanvases;\n\n const element = includeAllElements\n ? Array.from(originalSubject)\n : originalSubject[0];\n if (!element) {\n throw new Error('element cannot be null or undefined');\n }\n\n const properties: TakeDOMSnapshotOptions = {\n doc,\n element,\n responsiveInlinedCanvases: resInCan,\n strategy: snapshotStrategy,\n handleBase64Image: ({ base64Url }) => {\n const rawBase64 = base64Url.replace(/^data:image\\/png;base64,/, '');\n const chunks = chunked(rawBase64, config.canvasChunkSize);\n for (let i = 0; i < chunks.length; i++) {\n const base64Chunk = chunks[i];\n const isFirst = i === 0;\n const isLast = i === chunks.length - 1;\n cy.task(\n 'happoRegisterBase64Image',\n {\n base64Chunk,\n isFirst,\n isLast,\n },\n taskOptions,\n );\n }\n },\n };\n\n if (transformDOM) {\n properties.transformDOM = transformDOM;\n }\n\n const domSnapshot = takeDOMSnapshot(properties);\n\n cy.task(\n 'happoRegisterSnapshot',\n {\n timestamp: Date.now(),\n component,\n variant,\n targets,\n ...domSnapshot,\n },\n taskOptions,\n );\n },\n);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["element"]
|
|
7
7
|
}
|
package/dist/cypress/task.js
CHANGED
|
@@ -18,7 +18,7 @@ import asyncRetry from "async-retry";
|
|
|
18
18
|
// package.json
|
|
19
19
|
var package_default = {
|
|
20
20
|
name: "happo",
|
|
21
|
-
version: "6.2.
|
|
21
|
+
version: "6.2.6",
|
|
22
22
|
description: "Catch unexpected visual and accessibility changes and UI bugs",
|
|
23
23
|
license: "MIT",
|
|
24
24
|
repository: {
|