@najemi-software/vitest-dom 0.11.0 → 0.12.0-alpha.12.1
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.
|
@@ -4,9 +4,6 @@ var __export = (target, all) => {
|
|
|
4
4
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
-
// src/matchers/to-be-checked.js
|
|
8
|
-
import { createRequire } from "module";
|
|
9
|
-
|
|
10
7
|
// src/matchers/utils.ts
|
|
11
8
|
import isEqual from "lodash-es/isEqual.js";
|
|
12
9
|
import isFunction from "lodash-es/isFunction.js";
|
|
@@ -599,8 +596,15 @@ function getType(value) {
|
|
|
599
596
|
}
|
|
600
597
|
|
|
601
598
|
// src/matchers/to-be-checked.js
|
|
602
|
-
var
|
|
603
|
-
|
|
599
|
+
var ROLES_SUPPORTING_CHECKED = [
|
|
600
|
+
"checkbox",
|
|
601
|
+
"menuitemcheckbox",
|
|
602
|
+
"menuitemradio",
|
|
603
|
+
"option",
|
|
604
|
+
"radio",
|
|
605
|
+
"switch",
|
|
606
|
+
"treeitem"
|
|
607
|
+
];
|
|
604
608
|
function toBeChecked(element) {
|
|
605
609
|
checkHtmlElement(element, toBeChecked, this);
|
|
606
610
|
const isValidInput = () => {
|
|
@@ -635,15 +639,12 @@ function toBeChecked(element) {
|
|
|
635
639
|
}
|
|
636
640
|
function supportedRolesSentence() {
|
|
637
641
|
return toSentence(
|
|
638
|
-
|
|
642
|
+
ROLES_SUPPORTING_CHECKED.map((role) => `role="${role}"`),
|
|
639
643
|
{ lastWordConnector: " or " }
|
|
640
644
|
);
|
|
641
645
|
}
|
|
642
|
-
function supportedRoles() {
|
|
643
|
-
return roles.keys().filter(roleSupportsChecked);
|
|
644
|
-
}
|
|
645
646
|
function roleSupportsChecked(role) {
|
|
646
|
-
return
|
|
647
|
+
return ROLES_SUPPORTING_CHECKED.includes(role);
|
|
647
648
|
}
|
|
648
649
|
|
|
649
650
|
// src/matchers/to-be-disabled.js
|
|
@@ -1541,4 +1542,4 @@ export {
|
|
|
1541
1542
|
toHaveValue,
|
|
1542
1543
|
matchers_exports
|
|
1543
1544
|
};
|
|
1544
|
-
//# sourceMappingURL=chunk-
|
|
1545
|
+
//# sourceMappingURL=chunk-QCS6LD4V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/matchers/utils.ts","../src/matchers/css-parse.js","../src/matchers/to-be-checked.js","../src/matchers/to-be-disabled.js","../src/matchers/to-be-empty.js","../src/matchers/to-be-empty-dom-element.js","../src/matchers/to-be-in-the-document.js","../src/matchers/to-be-in-the-dom.js","../src/matchers/to-be-invalid.js","../src/matchers/to-be-partially-checked.js","../src/matchers/to-be-required.js","../src/matchers/to-be-visible.js","../src/matchers/to-contain-element.js","../src/matchers/to-contain-html.js","../src/matchers/to-have-accessible-description.js","../src/matchers/to-have-accessible-name.js","../src/matchers/to-have-attribute.js","../src/matchers/to-have-class.js","../src/matchers/to-have-description.js","../src/matchers/to-have-display-value.js","../src/matchers/to-have-errormessage.js","../src/matchers/to-have-focus.js","../src/matchers/to-have-form-values.ts","../src/matchers/to-have-style.js","../src/matchers/to-have-text-content.js","../src/matchers/to-have-value.js","../src/matchers/matchers.ts"],"sourcesContent":["import isEqual from \"lodash-es/isEqual.js\";\nimport isFunction from \"lodash-es/isFunction.js\";\nimport redent from \"redent\";\n\nimport cssParse from \"./css-parse\";\nimport type { MatcherFn, MatcherState } from \"./types\";\n\ntype ErrorUtils = MatcherState[\"utils\"];\n\nclass GenericTypeError<State extends MatcherState> extends Error {\n constructor(expectedString: string, received: HTMLElement, matcherFn: MatcherFn<State>, context: State) {\n super();\n\n const printWithType =\n \"printWithType\" in context.utils && isFunction(context.utils.printWithType)\n ? context.utils.printWithType\n : _printWithType;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, matcherFn);\n }\n let withType = \"\";\n try {\n withType = printWithType(\"Received\", received, context.utils.printReceived);\n } catch (e) {\n // Can throw for Document:\n // https://github.com/jsdom/jsdom/issues/2304\n }\n this.message = [\n context.utils.matcherHint(`${context.isNot ? \".not\" : \"\"}.${matcherFn.name}`, \"received\", \"\"),\n \"\",\n `${context.utils.RECEIVED_COLOR(\"received\")} value must ${expectedString}.`,\n withType,\n ].join(\"\\n\");\n }\n}\n\nclass HtmlElementTypeError<State extends MatcherState = any> extends GenericTypeError<State> {\n constructor(element: HTMLElement, matcherFn: MatcherFn<State>, context: State) {\n super(\"be an HTMLElement or an SVGElement\", element, matcherFn, context);\n }\n}\n\nclass NodeTypeError<State extends MatcherState = any> extends GenericTypeError<State> {\n constructor(element: HTMLElement, matcherFn: MatcherFn<State>, context: State) {\n super(\"be a Node\", element, matcherFn, context);\n }\n}\n\nfunction checkHasWindow<State extends MatcherState>(\n htmlElement: HTMLElement,\n ErrorClass: typeof HtmlElementTypeError<State> | typeof NodeTypeError<State>,\n matcherFn: MatcherFn<State>,\n context: State,\n): asserts htmlElement is HTMLElement & {\n ownerDocument: Document & { defaultView: Window };\n} {\n if (!htmlElement || !htmlElement.ownerDocument || !htmlElement.ownerDocument.defaultView) {\n throw new ErrorClass(htmlElement, matcherFn, context);\n }\n}\n\nfunction checkNode<State extends MatcherState = any>(\n node: HTMLElement,\n matcherFn: MatcherFn,\n context: State,\n) {\n checkHasWindow(node, NodeTypeError, matcherFn, context);\n const window = node.ownerDocument.defaultView;\n if (!(node instanceof window!.Node)) {\n throw new NodeTypeError(node, matcherFn, context);\n }\n}\n\nfunction checkHtmlElement<State extends MatcherState>(\n htmlElement: HTMLElement,\n matcher: MatcherFn<State>,\n context: State,\n) {\n checkHasWindow(htmlElement, HtmlElementTypeError, matcher, context);\n const window = htmlElement.ownerDocument.defaultView;\n\n if (\n !(htmlElement instanceof window.HTMLElement) &&\n // @ts-expect-error\n !(htmlElement instanceof window.SVGElement)\n ) {\n throw new HtmlElementTypeError(htmlElement, matcher, context);\n }\n}\n\nclass InvalidCSSError<State extends MatcherState> extends Error {\n constructor(\n received: {\n message: string;\n css: string;\n },\n matcherFn: MatcherFn,\n context: State,\n ) {\n super();\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, matcherFn);\n }\n this.message = [\n received.message,\n \"\",\n context.utils.RECEIVED_COLOR(`Failing css:`),\n context.utils.RECEIVED_COLOR(`${received.css}`),\n ].join(\"\\n\");\n }\n}\n\nfunction parseCSS<State extends MatcherState>(css: string, matcherFn: MatcherFn, context: State) {\n const ast = cssParse(`selector { ${css} }`, { silent: true }).stylesheet;\n\n if (ast.parsingErrors && ast.parsingErrors.length > 0) {\n const { reason, line } = ast.parsingErrors[0];\n\n throw new InvalidCSSError(\n {\n css,\n message: `Syntax error parsing expected css: ${reason} on line: ${line}`,\n },\n matcherFn,\n context,\n );\n }\n\n const parsedRules = (ast.rules[0].declarations as any[])\n .filter((d: any) => d.type === \"declaration\")\n .reduce(\n (obj: any, { property, value }) => Object.assign(obj, { [property]: value }),\n {} as Record<\"property\" | \"value\", string>,\n );\n return parsedRules;\n}\n\nfunction display(context: MatcherState, value: unknown) {\n return typeof value === \"string\" ? value : context.utils.stringify(value);\n}\n\nfunction getMessage(\n context: MatcherState,\n matcher: string,\n expectedLabel: string,\n expectedValue: any,\n receivedLabel: string,\n receivedValue: any,\n) {\n return [\n `${matcher}\\n`,\n `${expectedLabel}:\\n${context.utils.EXPECTED_COLOR(redent(display(context, expectedValue), 2))}`,\n `${receivedLabel}:\\n${context.utils.RECEIVED_COLOR(redent(display(context, receivedValue), 2))}`,\n ].join(\"\\n\");\n}\n\nfunction matches(textToMatch: string, matcher: MatcherFn) {\n if (matcher instanceof RegExp) {\n return matcher.test(textToMatch);\n } else {\n return textToMatch.includes(String(matcher));\n }\n}\n\nfunction deprecate(name: string, replacementText: string) {\n // Notify user that they are using deprecated functionality.\n // eslint-disable-next-line no-console\n console.warn(\n `Warning: ${name} has been deprecated and will be removed in future updates.`,\n replacementText,\n );\n}\n\nfunction normalize(text: string) {\n return text.replace(/\\s+/g, \" \").trim();\n}\n\nfunction getTag(element: Element) {\n return element.tagName && element.tagName.toLowerCase();\n}\n\nfunction getSelectValue({ multiple, options }: HTMLSelectElement) {\n const selectedOptions = [...options].filter((option) => option.selected);\n\n if (multiple) {\n return [...selectedOptions].map((opt) => opt.value);\n }\n\n if (selectedOptions.length === 0) {\n return undefined; // Couldn't make this happen, but just in case\n }\n return selectedOptions[0].value;\n}\n\nfunction getInputValue(inputElement: HTMLInputElement) {\n switch (inputElement.type) {\n case \"number\":\n return inputElement.value === \"\" ? null : Number(inputElement.value);\n case \"checkbox\":\n return inputElement.checked;\n default:\n return inputElement.value;\n }\n}\n\nfunction getSingleElementValue(element: undefined | null): undefined;\nfunction getSingleElementValue(element: HTMLInputElement): ReturnType<typeof getInputValue>;\nfunction getSingleElementValue(element: HTMLSelectElement): ReturnType<typeof getSelectValue>;\nfunction getSingleElementValue(element: HTMLMeterElement | HTMLProgressElement): number;\nfunction getSingleElementValue(\n element:\n | HTMLButtonElement\n | HTMLDataElement\n | HTMLOptionElement\n | HTMLOutputElement\n | HTMLTextAreaElement,\n): string;\nfunction getSingleElementValue(element: Element): undefined | string | string[] | number | boolean | null;\n\nfunction getSingleElementValue(element: Element | undefined | null) {\n if (!element) {\n return undefined;\n }\n switch (element.tagName.toLowerCase()) {\n case \"input\":\n return getInputValue(element as HTMLInputElement);\n case \"select\":\n return getSelectValue(element as HTMLSelectElement);\n default:\n return (element as any).value;\n }\n}\n\nfunction compareArraysAsSet(a: unknown, b: unknown) {\n if (Array.isArray(a) && Array.isArray(b)) {\n return isEqual(new Set(a), new Set(b));\n }\n return undefined;\n}\n\nfunction toSentence(array: string[], { wordConnector = \", \", lastWordConnector = \" and \" } = {}) {\n return [array.slice(0, -1).join(wordConnector), array[array.length - 1]].join(\n array.length > 1 ? lastWordConnector : \"\",\n );\n}\n\nexport {\n HtmlElementTypeError,\n NodeTypeError,\n checkHtmlElement,\n checkNode,\n parseCSS,\n deprecate,\n getMessage,\n matches,\n normalize,\n getTag,\n getSingleElementValue,\n compareArraysAsSet,\n toSentence,\n};\n\nfunction _printWithType<T>(name: string, value: T, print: (value: T) => string): string {\n const type = getType(value);\n const hasType = type !== \"null\" && type !== \"undefined\" ? `${name} has type: ${type}\\n` : \"\";\n const hasValue = `${name} has value: ${print(value)}`;\n return hasType + hasValue;\n}\n\n/**\n * https://github.com/jestjs/jest/blob/main/packages/jest-get-type/src/index.ts\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\ntype ValueType =\n | \"array\"\n | \"bigint\"\n | \"boolean\"\n | \"function\"\n | \"null\"\n | \"number\"\n | \"object\"\n | \"regexp\"\n | \"map\"\n | \"set\"\n | \"date\"\n | \"string\"\n | \"symbol\"\n | \"undefined\";\n\n// get the type of a value with handling the edge cases like `typeof []`\n// and `typeof null`\nexport function getType(value: unknown): ValueType {\n if (value === undefined) {\n return \"undefined\";\n } else if (value === null) {\n return \"null\";\n } else if (Array.isArray(value)) {\n return \"array\";\n } else if (typeof value === \"boolean\") {\n return \"boolean\";\n } else if (typeof value === \"function\") {\n return \"function\";\n } else if (typeof value === \"number\") {\n return \"number\";\n } else if (typeof value === \"string\") {\n return \"string\";\n } else if (typeof value === \"bigint\") {\n return \"bigint\";\n } else if (typeof value === \"object\") {\n if (value != null) {\n if (value.constructor === RegExp) {\n return \"regexp\";\n } else if (value.constructor === Map) {\n return \"map\";\n } else if (value.constructor === Set) {\n return \"set\";\n } else if (value.constructor === Date) {\n return \"date\";\n }\n }\n return \"object\";\n } else if (typeof value === \"symbol\") {\n return \"symbol\";\n }\n\n throw new Error(`value of unknown type: ${value}`);\n}\n\nexport const isPrimitive = (value: unknown): boolean => Object(value) !== value;\n","// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nconst commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\n\nfunction cssParse(css, options) {\n options = options || {};\n\n /**\n * Positional.\n */\n\n let lineno = 1;\n let column = 1;\n\n /**\n * Update lineno and column based on `str`.\n */\n\n function updatePosition(str) {\n let lines = str.match(/\\n/g);\n if (lines) lineno += lines.length;\n let i = str.lastIndexOf(\"\\n\");\n column = ~i ? str.length - i : column + str.length;\n }\n\n /**\n * Mark position and patch `node.position`.\n */\n\n function position() {\n let start = { line: lineno, column: column };\n return function (node) {\n node.position = new Position(start);\n whitespace();\n return node;\n };\n }\n\n /**\n * Store position information for a node\n */\n\n function Position(start) {\n this.start = start;\n this.end = { line: lineno, column: column };\n this.source = options.source;\n }\n\n /**\n * Non-enumerable source string\n */\n\n Position.prototype.content = css;\n\n /**\n * Error `msg`.\n */\n\n let errorsList = [];\n\n function error(msg) {\n let err = new Error(options.source + \":\" + lineno + \":\" + column + \": \" + msg);\n err.reason = msg;\n err.filename = options.source;\n err.line = lineno;\n err.column = column;\n err.source = css;\n\n if (options.silent) {\n errorsList.push(err);\n } else {\n throw err;\n }\n }\n\n /**\n * Parse stylesheet.\n */\n\n function stylesheet() {\n let rulesList = rules();\n\n return {\n type: \"stylesheet\",\n stylesheet: {\n source: options.source,\n rules: rulesList,\n parsingErrors: errorsList,\n },\n };\n }\n\n /**\n * Opening brace.\n */\n\n function open() {\n return match(/^{\\s*/);\n }\n\n /**\n * Closing brace.\n */\n\n function close() {\n return match(/^}/);\n }\n\n /**\n * Parse ruleset.\n */\n\n function rules() {\n let node;\n let rules = [];\n whitespace();\n comments(rules);\n while (css.length && css.charAt(0) != \"}\" && (node = atrule() || rule())) {\n if (node !== false) {\n rules.push(node);\n comments(rules);\n }\n }\n return rules;\n }\n\n /**\n * Match `re` and return captures.\n */\n\n function match(re) {\n let m = re.exec(css);\n if (!m) return;\n let str = m[0];\n updatePosition(str);\n css = css.slice(str.length);\n return m;\n }\n\n /**\n * Parse whitespace.\n */\n\n function whitespace() {\n match(/^\\s*/);\n }\n\n /**\n * Parse comments;\n */\n\n function comments(rules) {\n let c;\n rules = rules || [];\n while ((c = comment())) {\n if (c !== false) {\n rules.push(c);\n }\n }\n return rules;\n }\n\n /**\n * Parse comment.\n */\n\n function comment() {\n let pos = position();\n if (\"/\" != css.charAt(0) || \"*\" != css.charAt(1)) return;\n\n let i = 2;\n while (\"\" != css.charAt(i) && (\"*\" != css.charAt(i) || \"/\" != css.charAt(i + 1))) ++i;\n i += 2;\n\n if (\"\" === css.charAt(i - 1)) {\n return error(\"End of comment missing\");\n }\n\n let str = css.slice(2, i - 2);\n column += 2;\n updatePosition(str);\n css = css.slice(i);\n column += 2;\n\n return pos({\n type: \"comment\",\n comment: str,\n });\n }\n\n /**\n * Parse selector.\n */\n\n function selector() {\n let m = match(/^([^{]+)/);\n if (!m) return;\n /* @fix Remove all comments from selectors\n * http://ostermiller.org/findcomment.html */\n return trim(m[0])\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, \"\")\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, function (m) {\n return m.replace(/,/g, \"\\u200C\");\n })\n .split(/\\s*(?![^(]*\\)),\\s*/)\n .map(function (s) {\n return s.replace(/\\u200C/g, \",\");\n });\n }\n\n /**\n * Parse declaration.\n */\n\n function declaration() {\n let pos = position();\n\n // prop\n // eslint-disable-next-line no-useless-escape\n let prop = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\n if (!prop) return;\n prop = trim(prop[0]);\n\n // :\n if (!match(/^:\\s*/)) return error(\"property missing ':'\");\n\n // val\n // eslint-disable-next-line no-useless-escape\n let val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\n\n let ret = pos({\n type: \"declaration\",\n property: prop.replace(commentre, \"\"),\n value: val ? trim(val[0]).replace(commentre, \"\") : \"\",\n });\n\n // ;\n match(/^[;\\s]*/);\n\n return ret;\n }\n\n /**\n * Parse declarations.\n */\n\n function declarations() {\n let decls = [];\n\n if (!open()) return error(\"missing '{'\");\n comments(decls);\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n if (decl !== false) {\n decls.push(decl);\n comments(decls);\n }\n }\n\n if (!close()) return error(\"missing '}'\");\n return decls;\n }\n\n /**\n * Parse keyframe.\n */\n\n function keyframe() {\n let m;\n let vals = [];\n let pos = position();\n\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\n vals.push(m[1]);\n match(/^,\\s*/);\n }\n\n if (!vals.length) return;\n\n return pos({\n type: \"keyframe\",\n values: vals,\n declarations: declarations(),\n });\n }\n\n /**\n * Parse keyframes.\n */\n\n function atkeyframes() {\n let pos = position();\n let m = match(/^@([-\\w]+)?keyframes\\s*/);\n\n if (!m) return;\n let vendor = m[1];\n\n // identifier\n m = match(/^([-\\w]+)\\s*/);\n if (!m) return error(\"@keyframes missing name\");\n let name = m[1];\n\n if (!open()) return error(\"@keyframes missing '{'\");\n\n let frame;\n let frames = comments();\n while ((frame = keyframe())) {\n frames.push(frame);\n frames = frames.concat(comments());\n }\n\n if (!close()) return error(\"@keyframes missing '}'\");\n\n return pos({\n type: \"keyframes\",\n name: name,\n vendor: vendor,\n keyframes: frames,\n });\n }\n\n /**\n * Parse supports.\n */\n\n function atsupports() {\n let pos = position();\n let m = match(/^@supports *([^{]+)/);\n\n if (!m) return;\n let supports = trim(m[1]);\n\n if (!open()) return error(\"@supports missing '{'\");\n\n let style = comments().concat(rules());\n\n if (!close()) return error(\"@supports missing '}'\");\n\n return pos({\n type: \"supports\",\n supports: supports,\n rules: style,\n });\n }\n\n /**\n * Parse host.\n */\n\n function athost() {\n let pos = position();\n let m = match(/^@host\\s*/);\n\n if (!m) return;\n\n if (!open()) return error(\"@host missing '{'\");\n\n let style = comments().concat(rules());\n\n if (!close()) return error(\"@host missing '}'\");\n\n return pos({\n type: \"host\",\n rules: style,\n });\n }\n\n /**\n * Parse media.\n */\n\n function atmedia() {\n let pos = position();\n let m = match(/^@media *([^{]+)/);\n\n if (!m) return;\n let media = trim(m[1]);\n\n if (!open()) return error(\"@media missing '{'\");\n\n let style = comments().concat(rules());\n\n if (!close()) return error(\"@media missing '}'\");\n\n return pos({\n type: \"media\",\n media: media,\n rules: style,\n });\n }\n\n /**\n * Parse custom-media.\n */\n\n function atcustommedia() {\n let pos = position();\n let m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\n if (!m) return;\n\n return pos({\n type: \"custom-media\",\n name: trim(m[1]),\n media: trim(m[2]),\n });\n }\n\n /**\n * Parse paged media.\n */\n\n function atpage() {\n let pos = position();\n let m = match(/^@page */);\n if (!m) return;\n\n let sel = selector() || [];\n\n if (!open()) return error(\"@page missing '{'\");\n let decls = comments();\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n\n if (!close()) return error(\"@page missing '}'\");\n\n return pos({\n type: \"page\",\n selectors: sel,\n declarations: decls,\n });\n }\n\n /**\n * Parse document.\n */\n\n function atdocument() {\n let pos = position();\n let m = match(/^@([-\\w]+)?document *([^{]+)/);\n if (!m) return;\n\n let vendor = trim(m[1]);\n let doc = trim(m[2]);\n\n if (!open()) return error(\"@document missing '{'\");\n\n let style = comments().concat(rules());\n\n if (!close()) return error(\"@document missing '}'\");\n\n return pos({\n type: \"document\",\n document: doc,\n vendor: vendor,\n rules: style,\n });\n }\n\n /**\n * Parse font-face.\n */\n\n function atfontface() {\n let pos = position();\n let m = match(/^@font-face\\s*/);\n if (!m) return;\n\n if (!open()) return error(\"@font-face missing '{'\");\n let decls = comments();\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n\n if (!close()) return error(\"@font-face missing '}'\");\n\n return pos({\n type: \"font-face\",\n declarations: decls,\n });\n }\n\n /**\n * Parse import\n */\n\n let atimport = _compileAtrule(\"import\");\n\n /**\n * Parse charset\n */\n\n let atcharset = _compileAtrule(\"charset\");\n\n /**\n * Parse namespace\n */\n\n let atnamespace = _compileAtrule(\"namespace\");\n\n /**\n * Parse non-block at-rules\n */\n\n function _compileAtrule(name) {\n let re = new RegExp(\"^@\" + name + \"\\\\s*([^;]+);\");\n return function () {\n let pos = position();\n let m = match(re);\n if (!m) return;\n let ret = { type: name };\n ret[name] = m[1].trim();\n return pos(ret);\n };\n }\n\n /**\n * Parse at rule.\n */\n\n function atrule() {\n if (css[0] != \"@\") return;\n\n return (\n atkeyframes() ||\n atmedia() ||\n atcustommedia() ||\n atsupports() ||\n atimport() ||\n atcharset() ||\n atnamespace() ||\n atdocument() ||\n atpage() ||\n athost() ||\n atfontface()\n );\n }\n\n /**\n * Parse rule.\n */\n\n function rule() {\n let pos = position();\n let sel = selector();\n\n if (!sel) return error(\"selector missing\");\n comments();\n\n return pos({\n type: \"rule\",\n selectors: sel,\n declarations: declarations(),\n });\n }\n\n return addParent(stylesheet());\n}\n\n/**\n * Trim `str`.\n */\n\nfunction trim(str) {\n return str ? str.replace(/^\\s+|\\s+$/g, \"\") : \"\";\n}\n\n/**\n * Adds non-enumerable parent node reference to each node.\n */\n\nfunction addParent(obj, parent) {\n let isNode = obj && typeof obj.type === \"string\";\n let childParent = isNode ? obj : parent;\n\n for (var k in obj) {\n let value = obj[k];\n if (Array.isArray(value)) {\n value.forEach(function (v) {\n addParent(v, childParent);\n });\n } else if (value && typeof value === \"object\") {\n addParent(value, childParent);\n }\n }\n\n if (isNode) {\n Object.defineProperty(obj, \"parent\", {\n configurable: true,\n writable: true,\n enumerable: false,\n value: parent || null,\n });\n }\n\n return obj;\n}\n\nexport default cssParse;\n","import { checkHtmlElement, toSentence } from \"./utils\";\n\n// WAI-ARIA roles supporting the aria-checked state\n// (https://www.w3.org/TR/wai-aria-1.2/#aria-checked).\nconst ROLES_SUPPORTING_CHECKED = [\n \"checkbox\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"radio\",\n \"switch\",\n \"treeitem\",\n];\n\nexport function toBeChecked(element) {\n checkHtmlElement(element, toBeChecked, this);\n\n const isValidInput = () => {\n return element.tagName.toLowerCase() === \"input\" && [\"checkbox\", \"radio\"].includes(element.type);\n };\n\n const isValidAriaElement = () => {\n return (\n roleSupportsChecked(element.getAttribute(\"role\")) &&\n [\"true\", \"false\"].includes(element.getAttribute(\"aria-checked\"))\n );\n };\n\n if (!isValidInput() && !isValidAriaElement()) {\n return {\n pass: false,\n message: () =>\n `only inputs with type=\"checkbox\" or type=\"radio\" or elements with ${supportedRolesSentence()} and a valid aria-checked attribute can be used with .toBeChecked(). Use .toHaveValue() instead`,\n };\n }\n\n const isChecked = () => {\n if (isValidInput()) return element.checked;\n return element.getAttribute(\"aria-checked\") === \"true\";\n };\n\n return {\n pass: isChecked(),\n message: () => {\n const is = isChecked() ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeChecked`, \"element\", \"\"),\n \"\",\n `Received element ${is} checked:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n\nfunction supportedRolesSentence() {\n return toSentence(\n ROLES_SUPPORTING_CHECKED.map((role) => `role=\"${role}\"`),\n { lastWordConnector: \" or \" },\n );\n}\n\nfunction roleSupportsChecked(role) {\n return ROLES_SUPPORTING_CHECKED.includes(role);\n}\n","import { checkHtmlElement, getTag } from \"./utils\";\n\n// form elements that support 'disabled'\nconst FORM_TAGS = [\"fieldset\", \"input\", \"select\", \"optgroup\", \"option\", \"button\", \"textarea\"];\n\n/*\n * According to specification:\n * If <fieldset> is disabled, the form controls that are its descendants,\n * except descendants of its first optional <legend> element, are disabled\n *\n * https://html.spec.whatwg.org/multipage/form-elements.html#concept-fieldset-disabled\n *\n * This method tests whether element is first legend child of fieldset parent\n */\nfunction isFirstLegendChildOfFieldset(element, parent) {\n return (\n getTag(element) === \"legend\" &&\n getTag(parent) === \"fieldset\" &&\n element.isSameNode(Array.from(parent.children).find((child) => getTag(child) === \"legend\"))\n );\n}\n\nfunction isElementDisabledByParent(element, parent) {\n return isElementDisabled(parent) && !isFirstLegendChildOfFieldset(element, parent);\n}\n\nfunction isCustomElement(tag) {\n return tag.includes(\"-\");\n}\n\n/*\n * Only certain form elements and custom elements can actually be disabled:\n * https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements\n */\nfunction canElementBeDisabled(element) {\n const tag = getTag(element);\n return FORM_TAGS.includes(tag) || isCustomElement(tag);\n}\n\nfunction isElementDisabled(element) {\n return canElementBeDisabled(element) && element.hasAttribute(\"disabled\");\n}\n\nfunction isAncestorDisabled(element) {\n const parent = element.parentElement;\n return Boolean(parent) && (isElementDisabledByParent(element, parent) || isAncestorDisabled(parent));\n}\n\nfunction isElementOrAncestorDisabled(element) {\n return canElementBeDisabled(element) && (isElementDisabled(element) || isAncestorDisabled(element));\n}\n\nexport function toBeDisabled(element) {\n checkHtmlElement(element, toBeDisabled, this);\n\n const isDisabled = isElementOrAncestorDisabled(element);\n\n return {\n pass: isDisabled,\n message: () => {\n const is = isDisabled ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeDisabled`, \"element\", \"\"),\n \"\",\n `Received element ${is} disabled:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n\nexport function toBeEnabled(element) {\n checkHtmlElement(element, toBeEnabled, this);\n\n const isEnabled = !isElementOrAncestorDisabled(element);\n\n return {\n pass: isEnabled,\n message: () => {\n const is = isEnabled ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeEnabled`, \"element\", \"\"),\n \"\",\n `Received element ${is} enabled:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement, deprecate } from \"./utils\";\n\nexport function toBeEmpty(element) {\n deprecate(\"toBeEmpty\", \"Please use instead toBeEmptyDOMElement for finding empty nodes in the DOM.\");\n checkHtmlElement(element, toBeEmpty, this);\n\n return {\n pass: element.innerHTML === \"\",\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeEmpty`, \"element\", \"\"),\n \"\",\n \"Received:\",\n ` ${this.utils.printReceived(element.innerHTML)}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toBeEmptyDOMElement(element) {\n checkHtmlElement(element, toBeEmptyDOMElement, this);\n\n return {\n pass: isEmptyElement(element),\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeEmptyDOMElement`, \"element\", \"\"),\n \"\",\n \"Received:\",\n ` ${this.utils.printReceived(element.innerHTML)}`,\n ].join(\"\\n\");\n },\n };\n}\n\n/**\n * Identifies if an element doesn't contain child nodes (excluding comments)\n * ℹ The literal 8 is Node.COMMENT_NODE. It is used directly instead of the\n * Node constant so the matcher doesn't depend on a global Node existing in\n * the consumer's test environment (this project tests with happy-dom, but\n * consumers may run any environment; historically this guarded against\n * https://github.com/jsdom/jsdom/issues/2220 under jsdom).\n *\n * @param {*} element an HtmlElement or SVGElement\n * @return {*} true if the element only contains comments or none\n */\nfunction isEmptyElement(element) {\n const nonCommentChildNodes = [...element.childNodes].filter((node) => node.nodeType !== 8);\n return nonCommentChildNodes.length === 0;\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toBeInTheDocument(element) {\n if (element !== null || !this.isNot) {\n checkHtmlElement(element, toBeInTheDocument, this);\n }\n\n const pass = element === null ? false : element.ownerDocument === element.getRootNode({ composed: true });\n\n const errorFound = () => {\n return `expected document not to contain element, found ${this.utils.stringify(\n element.cloneNode(true),\n )} instead`;\n };\n const errorNotFound = () => {\n return `element could not be found in the document`;\n };\n\n return {\n pass,\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeInTheDocument`, \"element\", \"\"),\n \"\",\n this.utils.RECEIVED_COLOR(this.isNot ? errorFound() : errorNotFound()),\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement, deprecate } from \"./utils\";\n\nexport function toBeInTheDOM(element, container) {\n deprecate(\n \"toBeInTheDOM\",\n \"Please use toBeInTheDocument for searching the entire document and toContainElement for searching a specific container.\",\n );\n\n if (element) {\n checkHtmlElement(element, toBeInTheDOM, this);\n }\n\n if (container) {\n checkHtmlElement(container, toBeInTheDOM, this);\n }\n\n return {\n pass: container ? container.contains(element) : !!element,\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeInTheDOM`, \"element\", \"\"),\n \"\",\n \"Received:\",\n ` ${this.utils.printReceived(element ? element.cloneNode(false) : element)}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement, getTag } from \"./utils\";\n\nconst FORM_TAGS = [\"form\", \"input\", \"select\", \"textarea\"];\n\nfunction isElementHavingAriaInvalid(element) {\n return element.hasAttribute(\"aria-invalid\") && element.getAttribute(\"aria-invalid\") !== \"false\";\n}\n\nfunction isSupportsValidityMethod(element) {\n return FORM_TAGS.includes(getTag(element));\n}\n\nfunction isElementInvalid(element) {\n const isHaveAriaInvalid = isElementHavingAriaInvalid(element);\n if (isSupportsValidityMethod(element)) {\n return isHaveAriaInvalid || !element.checkValidity();\n } else {\n return isHaveAriaInvalid;\n }\n}\n\nexport function toBeInvalid(element) {\n checkHtmlElement(element, toBeInvalid, this);\n\n const isInvalid = isElementInvalid(element);\n\n return {\n pass: isInvalid,\n message: () => {\n const is = isInvalid ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeInvalid`, \"element\", \"\"),\n \"\",\n `Received element ${is} currently invalid:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n\nexport function toBeValid(element) {\n checkHtmlElement(element, toBeValid, this);\n\n const isValid = !isElementInvalid(element);\n\n return {\n pass: isValid,\n message: () => {\n const is = isValid ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeValid`, \"element\", \"\"),\n \"\",\n `Received element ${is} currently valid:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toBePartiallyChecked(element) {\n checkHtmlElement(element, toBePartiallyChecked, this);\n\n const isValidInput = () => {\n return element.tagName.toLowerCase() === \"input\" && element.type === \"checkbox\";\n };\n\n const isValidAriaElement = () => {\n return element.getAttribute(\"role\") === \"checkbox\";\n };\n\n if (!isValidInput() && !isValidAriaElement()) {\n return {\n pass: false,\n message: () =>\n 'only inputs with type=\"checkbox\" or elements with role=\"checkbox\" and a valid aria-checked attribute can be used with .toBePartiallyChecked(). Use .toHaveValue() instead',\n };\n }\n\n const isPartiallyChecked = () => {\n const isAriaMixed = element.getAttribute(\"aria-checked\") === \"mixed\";\n\n if (isValidInput()) {\n return element.indeterminate || isAriaMixed;\n }\n\n return isAriaMixed;\n };\n\n return {\n pass: isPartiallyChecked(),\n message: () => {\n const is = isPartiallyChecked() ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBePartiallyChecked`, \"element\", \"\"),\n \"\",\n `Received element ${is} partially checked:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement, getTag } from \"./utils\";\n\n// form elements that support 'required'\nconst FORM_TAGS = [\"select\", \"textarea\"];\n\nconst ARIA_FORM_TAGS = [\"input\", \"select\", \"textarea\"];\n\nconst UNSUPPORTED_INPUT_TYPES = [\"color\", \"hidden\", \"range\", \"submit\", \"image\", \"reset\"];\n\nconst SUPPORTED_ARIA_ROLES = [\"combobox\", \"gridcell\", \"radiogroup\", \"spinbutton\", \"tree\"];\n\nfunction isRequiredOnFormTagsExceptInput(element) {\n return FORM_TAGS.includes(getTag(element)) && element.hasAttribute(\"required\");\n}\n\nfunction isRequiredOnSupportedInput(element) {\n return (\n getTag(element) === \"input\" &&\n element.hasAttribute(\"required\") &&\n ((element.hasAttribute(\"type\") && !UNSUPPORTED_INPUT_TYPES.includes(element.getAttribute(\"type\"))) ||\n !element.hasAttribute(\"type\"))\n );\n}\n\nfunction isElementRequiredByARIA(element) {\n return (\n element.hasAttribute(\"aria-required\") &&\n element.getAttribute(\"aria-required\") === \"true\" &&\n (ARIA_FORM_TAGS.includes(getTag(element)) ||\n (element.hasAttribute(\"role\") && SUPPORTED_ARIA_ROLES.includes(element.getAttribute(\"role\"))))\n );\n}\n\nexport function toBeRequired(element) {\n checkHtmlElement(element, toBeRequired, this);\n\n const isRequired =\n isRequiredOnFormTagsExceptInput(element) ||\n isRequiredOnSupportedInput(element) ||\n isElementRequiredByARIA(element);\n\n return {\n pass: isRequired,\n message: () => {\n const is = isRequired ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeRequired`, \"element\", \"\"),\n \"\",\n `Received element ${is} required:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nfunction isStyleVisible(element) {\n const { getComputedStyle } = element.ownerDocument.defaultView;\n\n const { display, visibility, opacity } = getComputedStyle(element);\n return (\n display !== \"none\" &&\n visibility !== \"hidden\" &&\n visibility !== \"collapse\" &&\n opacity !== \"0\" &&\n opacity !== 0\n );\n}\n\nfunction isAttributeVisible(element, previousElement) {\n let detailsVisibility;\n\n if (previousElement) {\n detailsVisibility =\n element.nodeName === \"DETAILS\" && previousElement.nodeName !== \"SUMMARY\"\n ? element.hasAttribute(\"open\")\n : true;\n } else {\n detailsVisibility = element.nodeName === \"DETAILS\" ? element.hasAttribute(\"open\") : true;\n }\n\n return !element.hasAttribute(\"hidden\") && detailsVisibility;\n}\n\nfunction isElementVisible(element, previousElement) {\n return (\n isStyleVisible(element) &&\n isAttributeVisible(element, previousElement) &&\n (!element.parentElement || isElementVisible(element.parentElement, element))\n );\n}\n\nexport function toBeVisible(element) {\n checkHtmlElement(element, toBeVisible, this);\n const isInDocument = element.ownerDocument === element.getRootNode({ composed: true });\n const isVisible = isInDocument && isElementVisible(element);\n return {\n pass: isVisible,\n message: () => {\n const is = isVisible ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeVisible`, \"element\", \"\"),\n \"\",\n `Received element ${is} visible${isInDocument ? \"\" : \" (element is not in the document)\"}:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toContainElement(container, element) {\n checkHtmlElement(container, toContainElement, this);\n\n if (element !== null) {\n checkHtmlElement(element, toContainElement, this);\n }\n\n return {\n pass: container.contains(element),\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toContainElement`, \"element\", \"element\"),\n \"\",\n this.utils.RECEIVED_COLOR(`${this.utils.stringify(container.cloneNode(false))} ${\n this.isNot ? \"contains:\" : \"does not contain:\"\n } ${this.utils.stringify(element ? element.cloneNode(false) : element)}\n `),\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nfunction getNormalizedHtml(container, htmlText) {\n const div = container.ownerDocument.createElement(\"div\");\n div.innerHTML = htmlText;\n return div.innerHTML;\n}\n\nexport function toContainHTML(container, htmlText) {\n checkHtmlElement(container, toContainHTML, this);\n\n if (typeof htmlText !== \"string\") {\n throw new Error(`.toContainHTML() expects a string value, got ${htmlText}`);\n }\n\n return {\n pass: container.outerHTML.includes(getNormalizedHtml(container, htmlText)),\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toContainHTML`, \"element\", \"\"),\n \"Expected:\",\n ` ${this.utils.EXPECTED_COLOR(htmlText)}`,\n \"Received:\",\n ` ${this.utils.printReceived(container.cloneNode(true))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { computeAccessibleDescription } from \"dom-accessibility-api\";\n\nimport { checkHtmlElement, getMessage } from \"./utils\";\n\nexport function toHaveAccessibleDescription(htmlElement, expectedAccessibleDescription) {\n checkHtmlElement(htmlElement, toHaveAccessibleDescription, this);\n const actualAccessibleDescription = computeAccessibleDescription(htmlElement);\n const missingExpectedValue = arguments.length === 1;\n\n let pass = false;\n if (missingExpectedValue) {\n // When called without an expected value we only want to validate that the element has an\n // accessible description, whatever it may be.\n pass = actualAccessibleDescription !== \"\";\n } else {\n pass =\n expectedAccessibleDescription instanceof RegExp\n ? expectedAccessibleDescription.test(actualAccessibleDescription)\n : this.equals(actualAccessibleDescription, expectedAccessibleDescription);\n }\n\n return {\n pass,\n\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.${toHaveAccessibleDescription.name}`,\n \"element\",\n \"\",\n ),\n `Expected element ${to} have accessible description`,\n expectedAccessibleDescription,\n \"Received\",\n actualAccessibleDescription,\n );\n },\n };\n}\n","import { computeAccessibleName } from \"dom-accessibility-api\";\n\nimport { checkHtmlElement, getMessage } from \"./utils\";\n\nexport function toHaveAccessibleName(htmlElement, expectedAccessibleName) {\n checkHtmlElement(htmlElement, toHaveAccessibleName, this);\n const actualAccessibleName = computeAccessibleName(htmlElement);\n const missingExpectedValue = arguments.length === 1;\n\n let pass = false;\n if (missingExpectedValue) {\n // When called without an expected value we only want to validate that the element has an\n // accessible name, whatever it may be.\n pass = actualAccessibleName !== \"\";\n } else {\n pass =\n expectedAccessibleName instanceof RegExp\n ? expectedAccessibleName.test(actualAccessibleName)\n : this.equals(actualAccessibleName, expectedAccessibleName);\n }\n\n return {\n pass,\n\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.${toHaveAccessibleName.name}`,\n \"element\",\n \"\",\n ),\n `Expected element ${to} have accessible name`,\n expectedAccessibleName,\n \"Received\",\n actualAccessibleName,\n );\n },\n };\n}\n","import { checkHtmlElement, getMessage } from \"./utils\";\n\nfunction printAttribute(stringify, name, value) {\n return value === undefined ? name : `${name}=${stringify(value)}`;\n}\n\nfunction getAttributeComment(stringify, name, value) {\n return value === undefined\n ? `element.hasAttribute(${stringify(name)})`\n : `element.getAttribute(${stringify(name)}) === ${stringify(value)}`;\n}\n\nexport function toHaveAttribute(htmlElement, name, expectedValue) {\n checkHtmlElement(htmlElement, toHaveAttribute, this);\n const isExpectedValuePresent = expectedValue !== undefined;\n const hasAttribute = htmlElement.hasAttribute(name);\n const receivedValue = htmlElement.getAttribute(name);\n return {\n pass: isExpectedValuePresent\n ? hasAttribute && this.equals(receivedValue, expectedValue)\n : hasAttribute,\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n const receivedAttribute = hasAttribute\n ? printAttribute(this.utils.stringify, name, receivedValue)\n : null;\n const matcher = this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.toHaveAttribute`,\n \"element\",\n this.utils.printExpected(name),\n {\n secondArgument: isExpectedValuePresent\n ? this.utils.printExpected(expectedValue)\n : undefined,\n comment: getAttributeComment(this.utils.stringify, name, expectedValue),\n },\n );\n return getMessage(\n this,\n matcher,\n `Expected the element ${to} have attribute`,\n printAttribute(this.utils.stringify, name, expectedValue),\n \"Received\",\n receivedAttribute,\n );\n },\n };\n}\n","import { checkHtmlElement, getMessage } from \"./utils\";\n\nfunction getExpectedClassNamesAndOptions(params) {\n const lastParam = params.pop();\n let expectedClassNames, options;\n\n if (typeof lastParam === \"object\") {\n expectedClassNames = params;\n options = lastParam;\n } else {\n expectedClassNames = params.concat(lastParam);\n options = { exact: false };\n }\n return { expectedClassNames, options };\n}\n\nfunction splitClassNames(str) {\n if (!str) {\n return [];\n }\n return str.split(/\\s+/).filter((s) => s.length > 0);\n}\n\nfunction isSubset(subset, superset) {\n return subset.every((item) => superset.includes(item));\n}\n\nexport function toHaveClass(htmlElement, ...params) {\n checkHtmlElement(htmlElement, toHaveClass, this);\n const { expectedClassNames, options } = getExpectedClassNamesAndOptions(params);\n\n const received = splitClassNames(htmlElement.getAttribute(\"class\"));\n const expected = expectedClassNames.reduce(\n (acc, className) => acc.concat(splitClassNames(className)),\n [],\n );\n\n if (options.exact) {\n return {\n pass: isSubset(expected, received) && expected.length === received.length,\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.toHaveClass`,\n \"element\",\n this.utils.printExpected(expected.join(\" \")),\n ),\n `Expected the element ${to} have EXACTLY defined classes`,\n expected.join(\" \"),\n \"Received\",\n received.join(\" \"),\n );\n },\n };\n }\n\n return expected.length > 0\n ? {\n pass: isSubset(expected, received),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.toHaveClass`,\n \"element\",\n this.utils.printExpected(expected.join(\" \")),\n ),\n `Expected the element ${to} have class`,\n expected.join(\" \"),\n \"Received\",\n received.join(\" \"),\n );\n },\n }\n : {\n pass: this.isNot ? received.length > 0 : false,\n message: () =>\n this.isNot\n ? getMessage(\n this,\n this.utils.matcherHint(\".not.toHaveClass\", \"element\", \"\"),\n \"Expected the element to have classes\",\n \"(none)\",\n \"Received\",\n received.join(\" \"),\n )\n : [\n this.utils.matcherHint(`.toHaveClass`, \"element\"),\n \"At least one expected class must be provided.\",\n ].join(\"\\n\"),\n };\n}\n","import { checkHtmlElement, getMessage, normalize, deprecate } from \"./utils\";\n\n// See algoritm: https://www.w3.org/TR/accname-1.1/#mapping_additional_nd_description\nexport function toHaveDescription(htmlElement, checkWith) {\n deprecate(\"toHaveDescription\", \"Please use toHaveAccessibleDescription.\");\n\n checkHtmlElement(htmlElement, toHaveDescription, this);\n\n const expectsDescription = checkWith !== undefined;\n\n const descriptionIDRaw = htmlElement.getAttribute(\"aria-describedby\") || \"\";\n const descriptionIDs = descriptionIDRaw.split(/\\s+/).filter(Boolean);\n let description = \"\";\n if (descriptionIDs.length > 0) {\n const document = htmlElement.ownerDocument;\n const descriptionEls = descriptionIDs\n .map((descriptionID) => document.getElementById(descriptionID))\n .filter(Boolean);\n description = normalize(descriptionEls.map((el) => el.textContent).join(\" \"));\n }\n\n return {\n pass: expectsDescription\n ? checkWith instanceof RegExp\n ? checkWith.test(description)\n : this.equals(description, checkWith)\n : Boolean(description),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveDescription`, \"element\", \"\"),\n `Expected the element ${to} have description`,\n this.utils.printExpected(checkWith),\n \"Received\",\n this.utils.printReceived(description),\n );\n },\n };\n}\n","import { checkHtmlElement, getMessage } from \"./utils\";\n\nexport function toHaveDisplayValue(htmlElement, expectedValue) {\n checkHtmlElement(htmlElement, toHaveDisplayValue, this);\n const tagName = htmlElement.tagName.toLowerCase();\n\n if (![\"select\", \"input\", \"textarea\"].includes(tagName)) {\n throw new Error(\n \".toHaveDisplayValue() currently supports only input, textarea or select elements, try with another matcher instead.\",\n );\n }\n\n if (tagName === \"input\" && [\"radio\", \"checkbox\"].includes(htmlElement.type)) {\n throw new Error(\n `.toHaveDisplayValue() currently does not support input[type=\"${htmlElement.type}\"], try with another matcher instead.`,\n );\n }\n\n const values = getValues(tagName, htmlElement);\n const expectedValues = getExpectedValues(expectedValue);\n const numberOfMatchesWithValues = expectedValues.filter((expected) =>\n values.some((value) =>\n expected instanceof RegExp ? expected.test(value) : this.equals(value, String(expected)),\n ),\n ).length;\n\n const matchedWithAllValues = numberOfMatchesWithValues === values.length;\n const matchedWithAllExpectedValues = numberOfMatchesWithValues === expectedValues.length;\n\n return {\n pass: matchedWithAllValues && matchedWithAllExpectedValues,\n message: () =>\n getMessage(\n this,\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveDisplayValue`, \"element\", \"\"),\n `Expected element ${this.isNot ? \"not \" : \"\"}to have display value`,\n expectedValue,\n \"Received\",\n values,\n ),\n };\n}\n\nfunction getValues(tagName, htmlElement) {\n return tagName === \"select\"\n ? Array.from(htmlElement)\n .filter((option) => option.selected)\n .map((option) => option.textContent)\n : [htmlElement.value];\n}\n\nfunction getExpectedValues(expectedValue) {\n return expectedValue instanceof Array ? expectedValue : [expectedValue];\n}\n","import { checkHtmlElement, getMessage, normalize } from \"./utils\";\n\n// See aria-errormessage spec https://www.w3.org/TR/wai-aria-1.2/#aria-errormessage\nexport function toHaveErrorMessage(htmlElement, checkWith) {\n checkHtmlElement(htmlElement, toHaveErrorMessage, this);\n\n if (!htmlElement.hasAttribute(\"aria-invalid\") || htmlElement.getAttribute(\"aria-invalid\") === \"false\") {\n const not = this.isNot ? \".not\" : \"\";\n\n return {\n pass: false,\n message: () => {\n return getMessage(\n this,\n this.utils.matcherHint(`${not}.toHaveErrorMessage`, \"element\", \"\"),\n `Expected the element to have invalid state indicated by`,\n 'aria-invalid=\"true\"',\n \"Received\",\n htmlElement.hasAttribute(\"aria-invalid\")\n ? `aria-invalid=\"${htmlElement.getAttribute(\"aria-invalid\")}\"`\n : this.utils.printReceived(\"\"),\n );\n },\n };\n }\n\n const expectsErrorMessage = checkWith !== undefined;\n\n const errormessageIDRaw = htmlElement.getAttribute(\"aria-errormessage\") || \"\";\n const errormessageIDs = errormessageIDRaw.split(/\\s+/).filter(Boolean);\n\n let errormessage = \"\";\n if (errormessageIDs.length > 0) {\n const document = htmlElement.ownerDocument;\n\n const errormessageEls = errormessageIDs\n .map((errormessageID) => document.getElementById(errormessageID))\n .filter(Boolean);\n\n errormessage = normalize(errormessageEls.map((el) => el.textContent).join(\" \"));\n }\n\n return {\n pass: expectsErrorMessage\n ? checkWith instanceof RegExp\n ? checkWith.test(errormessage)\n : this.equals(errormessage, checkWith)\n : Boolean(errormessage),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveErrorMessage`, \"element\", \"\"),\n `Expected the element ${to} have error message`,\n this.utils.printExpected(checkWith),\n \"Received\",\n this.utils.printReceived(errormessage),\n );\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toHaveFocus(element) {\n checkHtmlElement(element, toHaveFocus, this);\n\n return {\n pass: element.ownerDocument.activeElement === element,\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveFocus`, \"element\", \"\"),\n \"\",\n ...(this.isNot\n ? [\"Received element is focused:\", ` ${this.utils.printReceived(element)}`]\n : [\n \"Expected element with focus:\",\n ` ${this.utils.printExpected(element)}`,\n \"Received element with focus:\",\n ` ${this.utils.printReceived(element.ownerDocument.activeElement)}`,\n ]),\n ].join(\"\\n\");\n },\n };\n}\n","import escape from \"css.escape\";\nimport { isEqualWith, uniq } from \"lodash-es\";\n\nimport type { MatcherResult } from \"./types\";\nimport { checkHtmlElement, compareArraysAsSet, getSingleElementValue } from \"./utils\";\n\n// Returns the combined value of several elements that have the same name\n// e.g. radio buttons or groups of checkboxes\nfunction getMultiElementValue(elements: (HTMLInputElement & { type: \"radio\" })[]): string | undefined;\nfunction getMultiElementValue(elements: (HTMLInputElement & { type: \"checkbox\" })[]): string[];\nfunction getMultiElementValue(elements: HTMLInputElement[]): string[];\n\nfunction getMultiElementValue(elements: HTMLInputElement[]) {\n const types = uniq(elements.map((element) => element.type));\n if (types.length !== 1) {\n throw new Error(\"Multiple form elements with the same name must be of the same type\");\n }\n switch (types[0]) {\n case \"radio\": {\n const theChosenOne = elements.find((radio) => radio.checked);\n return theChosenOne ? theChosenOne.value : undefined;\n }\n case \"checkbox\":\n return elements.filter((checkbox) => checkbox.checked).map((checkbox) => checkbox.value);\n default:\n // NOTE: Not even sure this is a valid use case, but just in case...\n return elements.map((element) => element.value);\n }\n}\n\ntype FormElement =\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement\n | HTMLButtonElement\n | HTMLMeterElement\n | HTMLProgressElement;\n\nfunction getFormValue(container: HTMLFormElement | HTMLFieldSetElement, name: string) {\n container.elements;\n const elements = [...container.querySelectorAll(`[name=\"${escape(name)}\"]`)] as FormElement[];\n if (elements.length === 0) {\n return undefined; // shouldn't happen, but just in case\n }\n switch (elements.length) {\n case 1:\n return getSingleElementValue(elements[0]);\n default:\n return getMultiElementValue(elements as HTMLInputElement[]);\n }\n}\n\n// Strips the `[]` suffix off a form value name\nfunction getPureName(name: string) {\n return /\\[\\]$/.test(name) ? name.slice(0, -2) : name;\n}\n\nfunction getAllFormValues(container: HTMLFormElement | HTMLFieldSetElement) {\n const names = Array.from(container.elements).map((element) => (element as HTMLInputElement).name);\n return names.reduce<Record<string, unknown>>(\n (obj, name) => ({\n ...obj,\n [getPureName(name)]: getFormValue(container, name),\n }),\n {},\n );\n}\n\nexport function toHaveFormValues(\n this: any,\n formElement: HTMLFormElement | HTMLFieldSetElement,\n expectedValues: Record<string, unknown>,\n): MatcherResult {\n checkHtmlElement(formElement, toHaveFormValues, this);\n if (!formElement.elements) {\n // TODO: Change condition to use instanceof against the appropriate element classes instead\n throw new Error(\"toHaveFormValues must be called on a form or a fieldset\");\n }\n const formValues = getAllFormValues(formElement);\n return {\n pass: Object.entries(expectedValues).every(([name, expectedValue]) =>\n isEqualWith(formValues[name], expectedValue, compareArraysAsSet),\n ),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n const matcher = `${this.isNot ? \".not\" : \"\"}.toHaveFormValues`;\n const commonKeyValues = Object.keys(formValues)\n .filter((key) => expectedValues.hasOwnProperty(key))\n .reduce((obj, key) => ({ ...obj, [key]: formValues[key] }), {});\n return [\n this.utils.matcherHint(matcher, \"element\", \"\"),\n `Expected the element ${to} have form values`,\n this.utils.diff(expectedValues, commonKeyValues),\n ].join(\"\\n\\n\");\n },\n };\n}\n","import chalk from \"chalk\";\n\nimport { checkHtmlElement, parseCSS } from \"./utils\";\n\nfunction getStyleDeclaration(document, css) {\n const styles = {};\n\n // The next block is necessary to normalize colors\n const copy = document.createElement(\"div\");\n Object.keys(css).forEach((property) => {\n copy.style[property] = css[property];\n // Number values default to px. jsdom's CSSOM did this coercion\n // itself; happy-dom rejects bare numbers, so retry with px appended.\n if (copy.style[property] === \"\" && typeof css[property] === \"number\") {\n copy.style[property] = `${css[property]}px`;\n }\n // Fall back to the raw value for properties the style declaration\n // swallows instead of echoing back (happy-dom does this for unknown\n // and custom properties); otherwise expected `undefined` would\n // spuriously match any element missing that property.\n styles[property] = copy.style[property] || css[property];\n });\n\n return styles;\n}\n\nfunction isSubset(styles, computedStyle) {\n return (\n !!Object.keys(styles).length &&\n Object.entries(styles).every(\n ([prop, value]) =>\n computedStyle[prop] === value || computedStyle.getPropertyValue(prop.toLowerCase()) === value,\n )\n );\n}\n\nfunction printoutStyles(styles) {\n return Object.keys(styles)\n .sort()\n .map((prop) => `${prop}: ${styles[prop]};`)\n .join(\"\\n\");\n}\n\n// Highlights only style rules that were expected but were not found in the\n// received computed styles\nfunction expectedDiff(diffFn, expected, computedStyles) {\n const received = Array.from(computedStyles)\n .filter((prop) => expected[prop] !== undefined)\n .reduce((obj, prop) => Object.assign(obj, { [prop]: computedStyles.getPropertyValue(prop) }), {});\n const diffOutput = diffFn(printoutStyles(expected), printoutStyles(received));\n // Remove the \"+ Received\" annotation because this is a one-way diff\n return diffOutput.replace(`${chalk.red(\"+ Received\")}\\n`, \"\");\n}\n\nexport function toHaveStyle(htmlElement, css) {\n checkHtmlElement(htmlElement, toHaveStyle, this);\n const parsedCSS = typeof css === \"object\" ? css : parseCSS(css, toHaveStyle, this);\n const { getComputedStyle } = htmlElement.ownerDocument.defaultView;\n\n const expected = getStyleDeclaration(htmlElement.ownerDocument, parsedCSS);\n const received = getComputedStyle(htmlElement);\n\n return {\n pass: isSubset(expected, received),\n message: () => {\n const matcher = `${this.isNot ? \".not\" : \"\"}.toHaveStyle`;\n return [\n this.utils.matcherHint(matcher, \"element\", \"\"),\n expectedDiff(this.utils.diff, expected, received),\n ].join(\"\\n\\n\");\n },\n };\n}\n","import { getMessage, checkNode, matches, normalize } from \"./utils\";\n\nexport function toHaveTextContent(node, checkWith, options = { normalizeWhitespace: true }) {\n checkNode(node, toHaveTextContent, this);\n\n const textContent = options.normalizeWhitespace\n ? normalize(node.textContent)\n : node.textContent.replace(/\\u00a0/g, \" \"); // Replace with normal spaces\n\n const checkingWithEmptyString = textContent !== \"\" && checkWith === \"\";\n\n return {\n pass: !checkingWithEmptyString && matches(textContent, checkWith),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveTextContent`, \"element\", \"\"),\n checkingWithEmptyString\n ? `Checking with empty string will always match, use .toBeEmptyDOMElement() instead`\n : `Expected element ${to} have text content`,\n checkWith,\n \"Received\",\n textContent,\n );\n },\n };\n}\n","import { isEqualWith } from \"lodash-es\";\n\nimport { checkHtmlElement, compareArraysAsSet, getMessage, getSingleElementValue } from \"./utils\";\n\nexport function toHaveValue(htmlElement, expectedValue) {\n checkHtmlElement(htmlElement, toHaveValue, this);\n\n if (htmlElement.tagName.toLowerCase() === \"input\" && [\"checkbox\", \"radio\"].includes(htmlElement.type)) {\n throw new Error(\n \"input with type=checkbox or type=radio cannot be used with .toHaveValue(). Use .toBeChecked() for type=checkbox or .toHaveFormValues() instead\",\n );\n }\n\n const receivedValue = getSingleElementValue(htmlElement);\n const expectsValue = expectedValue !== undefined;\n\n let expectedTypedValue = expectedValue;\n let receivedTypedValue = receivedValue;\n if (expectedValue == receivedValue && expectedValue !== receivedValue) {\n expectedTypedValue = `${expectedValue} (${typeof expectedValue})`;\n receivedTypedValue = `${receivedValue} (${typeof receivedValue})`;\n }\n\n return {\n pass: expectsValue\n ? isEqualWith(receivedValue, expectedValue, compareArraysAsSet)\n : Boolean(receivedValue),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n const matcher = this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.toHaveValue`,\n \"element\",\n expectedValue,\n );\n return getMessage(\n this,\n matcher,\n `Expected the element ${to} have value`,\n expectsValue ? expectedTypedValue : \"(any)\",\n \"Received\",\n receivedTypedValue,\n );\n },\n };\n}\n","import { toBeChecked } from \"./to-be-checked\";\nimport { toBeDisabled, toBeEnabled } from \"./to-be-disabled\";\nimport { toBeEmpty } from \"./to-be-empty\";\nimport { toBeEmptyDOMElement } from \"./to-be-empty-dom-element\";\nimport { toBeInTheDocument } from \"./to-be-in-the-document\";\nimport { toBeInTheDOM } from \"./to-be-in-the-dom\";\nimport { toBeInvalid, toBeValid } from \"./to-be-invalid\";\nimport { toBePartiallyChecked } from \"./to-be-partially-checked\";\nimport { toBeRequired } from \"./to-be-required\";\nimport { toBeVisible } from \"./to-be-visible\";\nimport { toContainElement } from \"./to-contain-element\";\nimport { toContainHTML } from \"./to-contain-html\";\nimport { toHaveAccessibleDescription } from \"./to-have-accessible-description\";\nimport { toHaveAccessibleName } from \"./to-have-accessible-name\";\nimport { toHaveAttribute } from \"./to-have-attribute\";\nimport { toHaveClass } from \"./to-have-class\";\nimport { toHaveDescription } from \"./to-have-description\";\nimport { toHaveDisplayValue } from \"./to-have-display-value\";\nimport { toHaveErrorMessage } from \"./to-have-errormessage\";\nimport { toHaveFocus } from \"./to-have-focus\";\nimport { toHaveFormValues } from \"./to-have-form-values\";\nimport { toHaveStyle } from \"./to-have-style\";\nimport { toHaveTextContent } from \"./to-have-text-content\";\nimport { toHaveValue } from \"./to-have-value\";\n\nexport {\n toBeInTheDOM,\n toBeInTheDocument,\n toBeEmpty,\n toBeEmptyDOMElement,\n toContainElement,\n toContainHTML,\n toHaveTextContent,\n toHaveAccessibleDescription,\n toHaveAccessibleName,\n toHaveAttribute,\n toHaveClass,\n toHaveStyle,\n toHaveFocus,\n toHaveFormValues,\n toBeVisible,\n toBeDisabled,\n toBeEnabled,\n toBeRequired,\n toBeInvalid,\n toBeValid,\n toHaveValue,\n toHaveDisplayValue,\n toBeChecked,\n toBePartiallyChecked,\n toHaveDescription,\n toHaveErrorMessage,\n};\n\nexport interface TestingLibraryMatchers<E, R> extends Record<string, any> {\n /**\n * @deprecated\n * since v1.9.0\n * @description\n * Assert whether a value is a DOM element, or not. Contrary to what its name\n * implies, this matcher only checks that you passed to it a valid DOM\n * element.\n *\n * It does not have a clear definition of what \"the DOM\" is. Therefore, it\n * does not check whether that element is contained anywhere.\n * @see [testing-library/jest-dom#toBeInTheDom](https://github.com/testing-library/jest-dom#toBeInTheDom)\n */\n toBeInTheDOM(container?: HTMLElement | SVGElement): R;\n /**\n * @description\n * Assert whether an element is present in the document or not.\n * @example\n * <svg data-testid=\"svg-element\"></svg>\n *\n * expect(queryByTestId('svg-element')).toBeInTheDocument()\n * expect(queryByTestId('does-not-exist')).not.toBeInTheDocument()\n * @see\n * [testing-library/jest-dom#tobeinthedocument](https://github.com/testing-library/jest-dom#tobeinthedocument)\n */\n toBeInTheDocument(): R;\n /**\n * @description\n * This allows you to check if an element is currently visible to the user.\n *\n * An element is visible if **all** the following conditions are met:\n * * it does not have its css property display set to none\n * * it does not have its css property visibility set to either hidden or collapse\n * * it does not have its css property opacity set to 0\n * * its parent element is also visible (and so on up to the top of the DOM tree)\n * * it does not have the hidden attribute\n * * if `<details />` it has the open attribute\n * @example\n * <div\n * data-testid=\"zero-opacity\"\n * style=\"opacity: 0\"\n * >\n * Zero Opacity\n * </div>\n *\n * <div data-testid=\"visible\">Visible Example</div>\n *\n * expect(getByTestId('zero-opacity')).not.toBeVisible()\n * expect(getByTestId('visible')).toBeVisible()\n * @see\n * [testing-library/jest-dom#tobevisible](https://github.com/testing-library/jest-dom#tobevisible)\n */\n toBeVisible(): R;\n /**\n * @deprecated\n * since v5.9.0\n * @description\n * Assert whether an element has content or not.\n * @example\n * <span data-testid=\"not-empty\">\n * <span data-testid=\"empty\"></span>\n * </span>\n *\n * expect(getByTestId('empty')).toBeEmpty()\n * expect(getByTestId('not-empty')).not.toBeEmpty()\n * @see\n * [testing-library/jest-dom#tobeempty](https://github.com/testing-library/jest-dom#tobeempty)\n */\n toBeEmpty(): R;\n /**\n * @description\n * Assert whether an element has content or not.\n * @example\n * <span data-testid=\"not-empty\">\n * <span data-testid=\"empty\"></span>\n * </span>\n *\n * expect(getByTestId('empty')).toBeEmptyDOMElement()\n * expect(getByTestId('not-empty')).not.toBeEmptyDOMElement()\n * @see\n * [testing-library/jest-dom#tobeemptydomelement](https://github.com/testing-library/jest-dom#tobeemptydomelement)\n */\n toBeEmptyDOMElement(): R;\n /**\n * @description\n * Allows you to check whether an element is disabled from the user's perspective.\n *\n * Matches if the element is a form control and the `disabled` attribute is specified on this element or the\n * element is a descendant of a form element with a `disabled` attribute.\n * @example\n * <button\n * data-testid=\"button\"\n * type=\"submit\"\n * disabled\n * >\n * submit\n * </button>\n *\n * expect(getByTestId('button')).toBeDisabled()\n * @see\n * [testing-library/jest-dom#tobedisabled](https://github.com/testing-library/jest-dom#tobedisabled)\n */\n toBeDisabled(): R;\n /**\n * @description\n * Allows you to check whether an element is not disabled from the user's perspective.\n *\n * Works like `not.toBeDisabled()`.\n *\n * Use this matcher to avoid double negation in your tests.\n * @example\n * <button\n * data-testid=\"button\"\n * type=\"submit\"\n * >\n * submit\n * </button>\n *\n * expect(getByTestId('button')).toBeEnabled()\n * @see\n * [testing-library/jest-dom#tobeenabled](https://github.com/testing-library/jest-dom#tobeenabled)\n */\n toBeEnabled(): R;\n /**\n * @description\n * Check if a form element, or the entire `form`, is currently invalid.\n *\n * An `input`, `select`, `textarea`, or `form` element is invalid if it has an `aria-invalid` attribute with no\n * value or a value of \"true\", or if the result of `checkValidity()` is false.\n * @example\n * <input data-testid=\"no-aria-invalid\" />\n *\n * <form data-testid=\"invalid-form\">\n * <input required />\n * </form>\n *\n * expect(getByTestId('no-aria-invalid')).not.toBeInvalid()\n * expect(getByTestId('invalid-form')).toBeInvalid()\n * @see\n * [testing-library/jest-dom#tobeinvalid](https://github.com/testing-library/jest-dom#tobeinvalid)\n */\n toBeInvalid(): R;\n /**\n * @description\n * This allows you to check if a form element is currently required.\n *\n * An element is required if it is having a `required` or `aria-required=\"true\"` attribute.\n * @example\n * <input data-testid=\"required-input\" required />\n * <div\n * data-testid=\"supported-role\"\n * role=\"tree\"\n * required />\n *\n * expect(getByTestId('required-input')).toBeRequired()\n * expect(getByTestId('supported-role')).not.toBeRequired()\n * @see\n * [testing-library/jest-dom#toberequired](https://github.com/testing-library/jest-dom#toberequired)\n */\n toBeRequired(): R;\n /**\n * @description\n * Allows you to check if a form element is currently required.\n *\n * An `input`, `select`, `textarea`, or `form` element is invalid if it has an `aria-invalid` attribute with no\n * value or a value of \"false\", or if the result of `checkValidity()` is true.\n * @example\n * <input data-testid=\"aria-invalid\" aria-invalid />\n *\n * <form data-testid=\"valid-form\">\n * <input />\n * </form>\n *\n * expect(getByTestId('no-aria-invalid')).not.toBeValid()\n * expect(getByTestId('invalid-form')).toBeInvalid()\n * @see\n * [testing-library/jest-dom#tobevalid](https://github.com/testing-library/jest-dom#tobevalid)\n */\n toBeValid(): R;\n /**\n * @description\n * Allows you to assert whether an element contains another element as a descendant or not.\n * @example\n * <span data-testid=\"ancestor\">\n * <span data-testid=\"descendant\"></span>\n * </span>\n *\n * const ancestor = getByTestId('ancestor')\n * const descendant = getByTestId('descendant')\n * const nonExistantElement = getByTestId('does-not-exist')\n * expect(ancestor).toContainElement(descendant)\n * expect(descendant).not.toContainElement(ancestor)\n * expect(ancestor).not.toContainElement(nonExistantElement)\n * @see\n * [testing-library/jest-dom#tocontainelement](https://github.com/testing-library/jest-dom#tocontainelement)\n */\n toContainElement(element: HTMLElement | SVGElement | null): R;\n /**\n * @description\n * Assert whether a string representing a HTML element is contained in another element.\n * @example\n * <span data-testid=\"parent\"><span data-testid=\"child\"></span></span>\n *\n * expect(getByTestId('parent')).toContainHTML('<span data-testid=\"child\"></span>')\n * @see\n * [testing-library/jest-dom#tocontainhtml](https://github.com/testing-library/jest-dom#tocontainhtml)\n */\n toContainHTML(htmlText: string): R;\n /**\n * @description\n * Allows you to check if a given element has an attribute or not.\n *\n * You can also optionally check that the attribute has a specific expected value or partial match using\n * [expect.stringContaining](https://jestjs.io/docs/en/expect.html#expectnotstringcontainingstring) or\n * [expect.stringMatching](https://jestjs.io/docs/en/expect.html#expectstringmatchingstring-regexp).\n * @example\n * <button\n * data-testid=\"ok-button\"\n * type=\"submit\"\n * disabled\n * >\n * ok\n * </button>\n *\n * expect(button).toHaveAttribute('disabled')\n * expect(button).toHaveAttribute('type', 'submit')\n * expect(button).not.toHaveAttribute('type', 'button')\n * @see\n * [testing-library/jest-dom#tohaveattribute](https://github.com/testing-library/jest-dom#tohaveattribute)\n */\n toHaveAttribute(attr: string, value?: unknown): R;\n /**\n * @description\n * Check whether the given element has certain classes within its `class` attribute.\n *\n * You must provide at least one class, unless you are asserting that an element does not have any classes.\n * @example\n * <button\n * data-testid=\"delete-button\"\n * class=\"btn xs btn-danger\"\n * >\n * delete item\n * </button>\n *\n * <div data-testid=\"no-classes\">no classes</div>\n *\n * const deleteButton = getByTestId('delete-button')\n * const noClasses = getByTestId('no-classes')\n * expect(deleteButton).toHaveClass('btn')\n * expect(deleteButton).toHaveClass('btn-danger xs')\n * expect(deleteButton).toHaveClass('btn xs btn-danger', {exact: true})\n * expect(deleteButton).not.toHaveClass('btn xs btn-danger', {exact: true})\n * expect(noClasses).not.toHaveClass()\n * @see\n * [testing-library/jest-dom#tohaveclass](https://github.com/testing-library/jest-dom#tohaveclass)\n */\n toHaveClass(...classNames: string[]): R;\n toHaveClass(classNames: string, options?: { exact: boolean }): R;\n /**\n * @description\n * This allows you to check whether the given form element has the specified displayed value (the one the\n * end user will see). It accepts <input>, <select> and <textarea> elements with the exception of <input type=\"checkbox\">\n * and <input type=\"radio\">, which can be meaningfully matched only using toBeChecked or toHaveFormValues.\n * @example\n * <label for=\"input-example\">First name</label>\n * <input type=\"text\" id=\"input-example\" value=\"Luca\" />\n *\n * <label for=\"textarea-example\">Description</label>\n * <textarea id=\"textarea-example\">An example description here.</textarea>\n *\n * <label for=\"single-select-example\">Fruit</label>\n * <select id=\"single-select-example\">\n * <option value=\"\">Select a fruit...</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"ananas\">Ananas</option>\n * <option value=\"avocado\">Avocado</option>\n * </select>\n *\n * <label for=\"mutiple-select-example\">Fruits</label>\n * <select id=\"multiple-select-example\" multiple>\n * <option value=\"\">Select a fruit...</option>\n * <option value=\"banana\" selected>Banana</option>\n * <option value=\"ananas\">Ananas</option>\n * <option value=\"avocado\" selected>Avocado</option>\n * </select>\n *\n * const input = screen.getByLabelText('First name')\n * const textarea = screen.getByLabelText('Description')\n * const selectSingle = screen.getByLabelText('Fruit')\n * const selectMultiple = screen.getByLabelText('Fruits')\n *\n * expect(input).toHaveDisplayValue('Luca')\n * expect(textarea).toHaveDisplayValue('An example description here.')\n * expect(selectSingle).toHaveDisplayValue('Select a fruit...')\n * expect(selectMultiple).toHaveDisplayValue(['Banana', 'Avocado'])\n *\n * @see\n * [testing-library/jest-dom#tohavedisplayvalue](https://github.com/testing-library/jest-dom#tohavedisplayvalue)\n */\n toHaveDisplayValue(value: string | RegExp | Array<string | RegExp>): R;\n /**\n * @description\n * Assert whether an element has focus or not.\n * @example\n * <div>\n * <input type=\"text\" data-testid=\"element-to-focus\" />\n * </div>\n *\n * const input = getByTestId('element-to-focus')\n * input.focus()\n * expect(input).toHaveFocus()\n * input.blur()\n * expect(input).not.toHaveFocus()\n * @see\n * [testing-library/jest-dom#tohavefocus](https://github.com/testing-library/jest-dom#tohavefocus)\n */\n toHaveFocus(): R;\n /**\n * @description\n * Check if a form or fieldset contains form controls for each given name, and having the specified value.\n *\n * Can only be invoked on a form or fieldset element.\n * @example\n * <form data-testid=\"login-form\">\n * <input type=\"text\" name=\"username\" value=\"jane.doe\" />\n * <input type=\"password\" name=\"password\" value=\"123\" />\n * <input type=\"checkbox\" name=\"rememberMe\" checked />\n * <button type=\"submit\">Sign in</button>\n * </form>\n *\n * expect(getByTestId('login-form')).toHaveFormValues({\n * username: 'jane.doe',\n * rememberMe: true,\n * })\n * @see\n * [testing-library/jest-dom#tohaveformvalues](https://github.com/testing-library/jest-dom#tohaveformvalues)\n */\n toHaveFormValues(expectedValues: Record<string, unknown>): R;\n /**\n * @description\n * Check if an element has specific css properties with specific values applied.\n *\n * Only matches if the element has *all* the expected properties applied, not just some of them.\n * @example\n * <button\n * data-test-id=\"submit-button\"\n * style=\"background-color: green; display: none\"\n * >\n * submit\n * </button>\n *\n * const button = getByTestId('submit-button')\n * expect(button).toHaveStyle('background-color: green')\n * expect(button).toHaveStyle({\n * 'background-color': 'green',\n * display: 'none'\n * })\n * @see\n * [testing-library/jest-dom#tohavestyle](https://github.com/testing-library/jest-dom#tohavestyle)\n */\n toHaveStyle(css: string | Record<string, unknown>): R;\n /**\n * @description\n * Check whether the given element has a text content or not.\n *\n * When a string argument is passed through, it will perform a partial case-sensitive match to the element\n * content.\n *\n * To perform a case-insensitive match, you can use a RegExp with the `/i` modifier.\n *\n * If you want to match the whole content, you can use a RegExp to do it.\n * @example\n * <span data-testid=\"text-content\">Text Content</span>\n *\n * const element = getByTestId('text-content')\n * expect(element).toHaveTextContent('Content')\n * // to match the whole content\n * expect(element).toHaveTextContent(/^Text Content$/)\n * // to use case-insentive match\n * expect(element).toHaveTextContent(/content$/i)\n * expect(element).not.toHaveTextContent('content')\n * @see\n * [testing-library/jest-dom#tohavetextcontent](https://github.com/testing-library/jest-dom#tohavetextcontent)\n */\n toHaveTextContent(text: string | RegExp, options?: { normalizeWhitespace: boolean }): R;\n /**\n * @description\n * Check whether the given form element has the specified value.\n *\n * Accepts `<input>`, `<select>`, and `<textarea>` elements with the exception of `<input type=\"checkbox\">` and\n * `<input type=\"radiobox\">`, which can be matched only using\n * [toBeChecked](https://github.com/testing-library/jest-dom#tobechecked) or\n * [toHaveFormValues](https://github.com/testing-library/jest-dom#tohaveformvalues).\n * @example\n * <input\n * type=\"number\"\n * value=\"5\"\n * data-testid=\"input-number\" />\n *\n * const numberInput = getByTestId('input-number')\n * expect(numberInput).toHaveValue(5)\n * @see\n * [testing-library/jest-dom#tohavevalue](https://github.com/testing-library/jest-dom#tohavevalue)\n */\n toHaveValue(value?: string | string[] | number | null): R;\n /**\n * @description\n * Assert whether the given element is checked.\n *\n * It accepts an `input` of type `checkbox` or `radio` and elements with a `role` of `radio` with a valid\n * `aria-checked` attribute of \"true\" or \"false\".\n * @example\n * <input\n * type=\"checkbox\"\n * checked\n * data-testid=\"input-checkbox\" />\n * <input\n * type=\"radio\"\n * value=\"foo\"\n * data-testid=\"input-radio\" />\n *\n * const inputCheckbox = getByTestId('input-checkbox')\n * const inputRadio = getByTestId('input-radio')\n * expect(inputCheckbox).toBeChecked()\n * expect(inputRadio).not.toBeChecked()\n * @see\n * [testing-library/jest-dom#tobechecked](https://github.com/testing-library/jest-dom#tobechecked)\n */\n toBeChecked(): R;\n /**\n * @deprecated\n * since v5.14.1\n * @description\n * Check the accessible description for an element.\n * This allows you to check whether the given element has a description or not.\n *\n * An element gets its description via the\n * [`aria-describedby` attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-describedby_attribute).\n * Set this to the `id` of one or more other elements. These elements may be nested\n * inside, be outside, or a sibling of the passed in element.\n *\n * Whitespace is normalized. Using multiple ids will\n * [join the referenced elements’ text content separated by a space](https://www.w3.org/TR/accname-1.1/#mapping_additional_nd_description).\n *\n * When a `string` argument is passed through, it will perform a whole\n * case-sensitive match to the description text.\n *\n * To perform a case-insensitive match, you can use a `RegExp` with the `/i`\n * modifier.\n *\n * To perform a partial match, you can pass a `RegExp` or use\n * `expect.stringContaining(\"partial string\")`.\n *\n * @example\n * <button aria-label=\"Close\" aria-describedby=\"description-close\">\n * X\n * </button>\n * <div id=\"description-close\">\n * Closing will discard any changes\n * </div>\n *\n * <button>Delete</button>\n *\n * const closeButton = getByRole('button', {name: 'Close'})\n *\n * expect(closeButton).toHaveDescription('Closing will discard any changes')\n * expect(closeButton).toHaveDescription(/will discard/) // to partially match\n * expect(closeButton).toHaveDescription(expect.stringContaining('will discard')) // to partially match\n * expect(closeButton).toHaveDescription(/^closing/i) // to use case-insensitive match\n * expect(closeButton).not.toHaveDescription('Other description')\n *\n * const deleteButton = getByRole('button', {name: 'Delete'})\n * expect(deleteButton).not.toHaveDescription()\n * expect(deleteButton).toHaveDescription('') // Missing or empty description always becomes a blank string\n * @see\n * [testing-library/jest-dom#tohavedescription](https://github.com/testing-library/jest-dom#tohavedescription)\n */\n toHaveDescription(text?: string | RegExp | E): R;\n /**\n * @description\n * This allows to assert that an element has the expected [accessible description](https://w3c.github.io/accname/).\n *\n * You can pass the exact string of the expected accessible description, or you can make a\n * partial match passing a regular expression, or by using either\n * [expect.stringContaining](https://jestjs.io/docs/en/expect.html#expectnotstringcontainingstring)\n * or [expect.stringMatching](https://jestjs.io/docs/en/expect.html#expectstringmatchingstring-regexp).\n * @example\n * <a data-testid=\"link\" href=\"/\" aria-label=\"Home page\" title=\"A link to start over\">Start</a>\n * <a data-testid=\"extra-link\" href=\"/about\" aria-label=\"About page\">About</a>\n * <img src=\"avatar.jpg\" data-testid=\"avatar\" alt=\"User profile pic\" />\n * <img src=\"logo.jpg\" data-testid=\"logo\" alt=\"Company logo\" aria-describedby=\"t1\" />\n * <span id=\"t1\" role=\"presentation\">The logo of Our Company</span>\n *\n * expect(getByTestId('link')).toHaveAccessibleDescription()\n * expect(getByTestId('link')).toHaveAccessibleDescription('A link to start over')\n * expect(getByTestId('link')).not.toHaveAccessibleDescription('Home page')\n * expect(getByTestId('extra-link')).not.toHaveAccessibleDescription()\n * expect(getByTestId('avatar')).not.toHaveAccessibleDescription()\n * expect(getByTestId('logo')).not.toHaveAccessibleDescription('Company logo')\n * expect(getByTestId('logo')).toHaveAccessibleDescription('The logo of Our Company')\n * @see\n * [testing-library/jest-dom#tohaveaccessibledescription](https://github.com/testing-library/jest-dom#tohaveaccessibledescription)\n */\n toHaveAccessibleDescription(text?: string | RegExp | E): R;\n /**\n * @description\n * This allows you to assert that an element has the expected\n * [accessible error message](https://w3c.github.io/aria/#aria-errormessage).\n *\n * You can pass the exact string of the expected accessible error message.\n * Alternatively, you can perform a partial match by passing a regular expression\n * or by using either\n * [expect.stringContaining](https://jestjs.io/docs/en/expect.html#expectnotstringcontainingstring)\n * or [expect.stringMatching](https://jestjs.io/docs/en/expect.html#expectstringmatchingstring-regexp).\n *\n * @example\n * <input aria-label=\"Has Error\" aria-invalid=\"true\" aria-errormessage=\"error-message\" />\n * <div id=\"error-message\" role=\"alert\">This field is invalid</div>\n *\n * <input aria-label=\"No Error Attributes\" />\n * <input aria-label=\"Not Invalid\" aria-invalid=\"false\" aria-errormessage=\"error-message\" />\n *\n * // Inputs with Valid Error Messages\n * expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage()\n * expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage('This field is invalid')\n * expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage(/invalid/i)\n * expect(\n * getByRole('textbox', {name: 'Has Error'}),\n * ).not.toHaveAccessibleErrorMessage('This field is absolutely correct!')\n *\n * // Inputs without Valid Error Messages\n * expect(\n * getByRole('textbox', {name: 'No Error Attributes'}),\n * ).not.toHaveAccessibleErrorMessage()\n *\n * expect(\n * getByRole('textbox', {name: 'Not Invalid'}),\n * ).not.toHaveAccessibleErrorMessage()\n *\n * @see\n * [testing-library/jest-dom#tohaveaccessibleerrormessage](https://github.com/testing-library/jest-dom#tohaveaccessibleerrormessage)\n */\n toHaveAccessibleErrorMessage(text?: string | RegExp | E): R;\n /**\n * @description\n * This allows to assert that an element has the expected [accessible name](https://w3c.github.io/accname/).\n * It is useful, for instance, to assert that form elements and buttons are properly labelled.\n *\n * You can pass the exact string of the expected accessible name, or you can make a\n * partial match passing a regular expression, or by using either\n * [expect.stringContaining](https://jestjs.io/docs/en/expect.html#expectnotstringcontainingstring)\n * or [expect.stringMatching](https://jestjs.io/docs/en/expect.html#expectstringmatchingstring-regexp).\n * @example\n * <img data-testid=\"img-alt\" src=\"\" alt=\"Test alt\" />\n * <img data-testid=\"img-empty-alt\" src=\"\" alt=\"\" />\n * <svg data-testid=\"svg-title\"><title>Test title</title></svg>\n * <button data-testid=\"button-img-alt\"><img src=\"\" alt=\"Test\" /></button>\n * <p><img data-testid=\"img-paragraph\" src=\"\" alt=\"\" /> Test content</p>\n * <button data-testid=\"svg-button\"><svg><title>Test</title></svg></p>\n * <div><svg data-testid=\"svg-without-title\"></svg></div>\n * <input data-testid=\"input-title\" title=\"test\" />\n *\n * expect(getByTestId('img-alt')).toHaveAccessibleName('Test alt')\n * expect(getByTestId('img-empty-alt')).not.toHaveAccessibleName()\n * expect(getByTestId('svg-title')).toHaveAccessibleName('Test title')\n * expect(getByTestId('button-img-alt')).toHaveAccessibleName()\n * expect(getByTestId('img-paragraph')).not.toHaveAccessibleName()\n * expect(getByTestId('svg-button')).toHaveAccessibleName()\n * expect(getByTestId('svg-without-title')).not.toHaveAccessibleName()\n * expect(getByTestId('input-title')).toHaveAccessibleName()\n * @see\n * [testing-library/jest-dom#tohaveaccessiblename](https://github.com/testing-library/jest-dom#tohaveaccessiblename)\n */\n toHaveAccessibleName(text?: string | RegExp | E): R;\n /**\n * @description\n * This allows you to check whether the given element is partially checked.\n * It accepts an input of type checkbox and elements with a role of checkbox\n * with a aria-checked=\"mixed\", or input of type checkbox with indeterminate\n * set to true\n *\n * @example\n * <input type=\"checkbox\" aria-checked=\"mixed\" data-testid=\"aria-checkbox-mixed\" />\n * <input type=\"checkbox\" checked data-testid=\"input-checkbox-checked\" />\n * <input type=\"checkbox\" data-testid=\"input-checkbox-unchecked\" />\n * <div role=\"checkbox\" aria-checked=\"true\" data-testid=\"aria-checkbox-checked\" />\n * <div\n * role=\"checkbox\"\n * aria-checked=\"false\"\n * data-testid=\"aria-checkbox-unchecked\"\n * />\n * <input type=\"checkbox\" data-testid=\"input-checkbox-indeterminate\" />\n *\n * const ariaCheckboxMixed = getByTestId('aria-checkbox-mixed')\n * const inputCheckboxChecked = getByTestId('input-checkbox-checked')\n * const inputCheckboxUnchecked = getByTestId('input-checkbox-unchecked')\n * const ariaCheckboxChecked = getByTestId('aria-checkbox-checked')\n * const ariaCheckboxUnchecked = getByTestId('aria-checkbox-unchecked')\n * const inputCheckboxIndeterminate = getByTestId('input-checkbox-indeterminate')\n *\n * expect(ariaCheckboxMixed).toBePartiallyChecked()\n * expect(inputCheckboxChecked).not.toBePartiallyChecked()\n * expect(inputCheckboxUnchecked).not.toBePartiallyChecked()\n * expect(ariaCheckboxChecked).not.toBePartiallyChecked()\n * expect(ariaCheckboxUnchecked).not.toBePartiallyChecked()\n *\n * inputCheckboxIndeterminate.indeterminate = true\n * expect(inputCheckboxIndeterminate).toBePartiallyChecked()\n * @see\n * [testing-library/jest-dom#tobepartiallychecked](https://github.com/testing-library/jest-dom#tobepartiallychecked)\n */\n toBePartiallyChecked(): R;\n /**\n * @description\n *\n * Check whether the given element has an [ARIA error message](https://www.w3.org/TR/wai-aria/#aria-errormessage) or not.\n *\n * Use the `aria-errormessage` attribute to reference another element that contains\n * custom error message text. Multiple ids is **NOT** allowed. Authors MUST use\n * `aria-invalid` in conjunction with `aria-errormessage`. Learn more from the\n * [`aria-errormessage` spec](https://www.w3.org/TR/wai-aria/#aria-errormessage).\n *\n * Whitespace is normalized.\n *\n * When a `string` argument is passed through, it will perform a whole\n * case-sensitive match to the error message text.\n *\n * To perform a case-insensitive match, you can use a `RegExp` with the `/i`\n * modifier.\n *\n * To perform a partial match, you can pass a `RegExp` or use\n * expect.stringContaining(\"partial string\")`.\n *\n * @example\n * <label for=\"startTime\"> Please enter a start time for the meeting: </label>\n * <input id=\"startTime\" type=\"text\" aria-errormessage=\"msgID\" aria-invalid=\"true\" value=\"11:30 PM\" />\n * <span id=\"msgID\" aria-live=\"assertive\" style=\"visibility:visible\">\n * Invalid time: the time must be between 9:00 AM and 5:00 PM\"\n * </span>\n *\n *\n * const timeInput = getByLabel('startTime')\n *\n * expect(timeInput).toHaveErrorMessage(\n * 'Invalid time: the time must be between 9:00 AM and 5:00 PM',\n * )\n * expect(timeInput).toHaveErrorMessage(/invalid time/i) // to partially match\n * expect(timeInput).toHaveErrorMessage(expect.stringContaining('Invalid time')) // to partially match\n * expect(timeInput).not.toHaveErrorMessage('Pikachu!')\n * @see\n * [testing-library/jest-dom#tohaveerrormessage](https://github.com/testing-library/jest-dom#tohaveerrormessage)\n */\n toHaveErrorMessage(text?: string | RegExp | E): R;\n}\n"],"mappings":"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","names":["rules","m","FORM_TAGS","FORM_TAGS","display","isSubset","isEqualWith","isEqualWith"]}
|
package/dist/extend-expect.js
CHANGED
package/dist/matchers.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@najemi-software/vitest-dom",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0-alpha.12.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Custom Vitest matchers to test the state of the DOM, forked from jest-dom.",
|
|
6
6
|
"homepage": "https://github.com/Najemi-Software/vitest-dom#readme",
|
|
@@ -54,7 +54,6 @@
|
|
|
54
54
|
"test-once": "vitest run --silent"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"aria-query": "^5.3.0",
|
|
58
57
|
"chalk": "^5.3.0",
|
|
59
58
|
"css.escape": "^1.5.1",
|
|
60
59
|
"dom-accessibility-api": "^0.6.1",
|
|
@@ -62,7 +61,6 @@
|
|
|
62
61
|
"redent": "^4.0.0"
|
|
63
62
|
},
|
|
64
63
|
"devDependencies": {
|
|
65
|
-
"@types/aria-query": "^5.0.1",
|
|
66
64
|
"@types/css.escape": "^1.5.0",
|
|
67
65
|
"@types/lodash-es": "^4.17.9",
|
|
68
66
|
"@typescript-eslint/eslint-plugin": "^6.7.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/matchers/to-be-checked.js","../src/matchers/utils.ts","../src/matchers/css-parse.js","../src/matchers/to-be-disabled.js","../src/matchers/to-be-empty.js","../src/matchers/to-be-empty-dom-element.js","../src/matchers/to-be-in-the-document.js","../src/matchers/to-be-in-the-dom.js","../src/matchers/to-be-invalid.js","../src/matchers/to-be-partially-checked.js","../src/matchers/to-be-required.js","../src/matchers/to-be-visible.js","../src/matchers/to-contain-element.js","../src/matchers/to-contain-html.js","../src/matchers/to-have-accessible-description.js","../src/matchers/to-have-accessible-name.js","../src/matchers/to-have-attribute.js","../src/matchers/to-have-class.js","../src/matchers/to-have-description.js","../src/matchers/to-have-display-value.js","../src/matchers/to-have-errormessage.js","../src/matchers/to-have-focus.js","../src/matchers/to-have-form-values.ts","../src/matchers/to-have-style.js","../src/matchers/to-have-text-content.js","../src/matchers/to-have-value.js","../src/matchers/matchers.ts"],"sourcesContent":["// import { roles } from \"aria-query\";\nimport { createRequire } from \"node:module\";\n\nimport { checkHtmlElement, toSentence } from \"./utils\";\nconst require = createRequire(import.meta.url);\nconst { roles } = require(\"aria-query\");\n\nexport function toBeChecked(element) {\n checkHtmlElement(element, toBeChecked, this);\n\n const isValidInput = () => {\n return element.tagName.toLowerCase() === \"input\" && [\"checkbox\", \"radio\"].includes(element.type);\n };\n\n const isValidAriaElement = () => {\n return (\n roleSupportsChecked(element.getAttribute(\"role\")) &&\n [\"true\", \"false\"].includes(element.getAttribute(\"aria-checked\"))\n );\n };\n\n if (!isValidInput() && !isValidAriaElement()) {\n return {\n pass: false,\n message: () =>\n `only inputs with type=\"checkbox\" or type=\"radio\" or elements with ${supportedRolesSentence()} and a valid aria-checked attribute can be used with .toBeChecked(). Use .toHaveValue() instead`,\n };\n }\n\n const isChecked = () => {\n if (isValidInput()) return element.checked;\n return element.getAttribute(\"aria-checked\") === \"true\";\n };\n\n return {\n pass: isChecked(),\n message: () => {\n const is = isChecked() ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeChecked`, \"element\", \"\"),\n \"\",\n `Received element ${is} checked:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n\nfunction supportedRolesSentence() {\n return toSentence(\n supportedRoles().map((role) => `role=\"${role}\"`),\n { lastWordConnector: \" or \" },\n );\n}\n\nfunction supportedRoles() {\n return roles.keys().filter(roleSupportsChecked);\n}\n\nfunction roleSupportsChecked(role) {\n return roles.get(role)?.props[\"aria-checked\"] !== undefined;\n}\n","import isEqual from \"lodash-es/isEqual.js\";\nimport isFunction from \"lodash-es/isFunction.js\";\nimport redent from \"redent\";\n\nimport cssParse from \"./css-parse\";\nimport type { MatcherFn, MatcherState } from \"./types\";\n\ntype ErrorUtils = MatcherState[\"utils\"];\n\nclass GenericTypeError<State extends MatcherState> extends Error {\n constructor(expectedString: string, received: HTMLElement, matcherFn: MatcherFn<State>, context: State) {\n super();\n\n const printWithType =\n \"printWithType\" in context.utils && isFunction(context.utils.printWithType)\n ? context.utils.printWithType\n : _printWithType;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, matcherFn);\n }\n let withType = \"\";\n try {\n withType = printWithType(\"Received\", received, context.utils.printReceived);\n } catch (e) {\n // Can throw for Document:\n // https://github.com/jsdom/jsdom/issues/2304\n }\n this.message = [\n context.utils.matcherHint(`${context.isNot ? \".not\" : \"\"}.${matcherFn.name}`, \"received\", \"\"),\n \"\",\n `${context.utils.RECEIVED_COLOR(\"received\")} value must ${expectedString}.`,\n withType,\n ].join(\"\\n\");\n }\n}\n\nclass HtmlElementTypeError<State extends MatcherState = any> extends GenericTypeError<State> {\n constructor(element: HTMLElement, matcherFn: MatcherFn<State>, context: State) {\n super(\"be an HTMLElement or an SVGElement\", element, matcherFn, context);\n }\n}\n\nclass NodeTypeError<State extends MatcherState = any> extends GenericTypeError<State> {\n constructor(element: HTMLElement, matcherFn: MatcherFn<State>, context: State) {\n super(\"be a Node\", element, matcherFn, context);\n }\n}\n\nfunction checkHasWindow<State extends MatcherState>(\n htmlElement: HTMLElement,\n ErrorClass: typeof HtmlElementTypeError<State> | typeof NodeTypeError<State>,\n matcherFn: MatcherFn<State>,\n context: State,\n): asserts htmlElement is HTMLElement & {\n ownerDocument: Document & { defaultView: Window };\n} {\n if (!htmlElement || !htmlElement.ownerDocument || !htmlElement.ownerDocument.defaultView) {\n throw new ErrorClass(htmlElement, matcherFn, context);\n }\n}\n\nfunction checkNode<State extends MatcherState = any>(\n node: HTMLElement,\n matcherFn: MatcherFn,\n context: State,\n) {\n checkHasWindow(node, NodeTypeError, matcherFn, context);\n const window = node.ownerDocument.defaultView;\n if (!(node instanceof window!.Node)) {\n throw new NodeTypeError(node, matcherFn, context);\n }\n}\n\nfunction checkHtmlElement<State extends MatcherState>(\n htmlElement: HTMLElement,\n matcher: MatcherFn<State>,\n context: State,\n) {\n checkHasWindow(htmlElement, HtmlElementTypeError, matcher, context);\n const window = htmlElement.ownerDocument.defaultView;\n\n if (\n !(htmlElement instanceof window.HTMLElement) &&\n // @ts-expect-error\n !(htmlElement instanceof window.SVGElement)\n ) {\n throw new HtmlElementTypeError(htmlElement, matcher, context);\n }\n}\n\nclass InvalidCSSError<State extends MatcherState> extends Error {\n constructor(\n received: {\n message: string;\n css: string;\n },\n matcherFn: MatcherFn,\n context: State,\n ) {\n super();\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, matcherFn);\n }\n this.message = [\n received.message,\n \"\",\n context.utils.RECEIVED_COLOR(`Failing css:`),\n context.utils.RECEIVED_COLOR(`${received.css}`),\n ].join(\"\\n\");\n }\n}\n\nfunction parseCSS<State extends MatcherState>(css: string, matcherFn: MatcherFn, context: State) {\n const ast = cssParse(`selector { ${css} }`, { silent: true }).stylesheet;\n\n if (ast.parsingErrors && ast.parsingErrors.length > 0) {\n const { reason, line } = ast.parsingErrors[0];\n\n throw new InvalidCSSError(\n {\n css,\n message: `Syntax error parsing expected css: ${reason} on line: ${line}`,\n },\n matcherFn,\n context,\n );\n }\n\n const parsedRules = (ast.rules[0].declarations as any[])\n .filter((d: any) => d.type === \"declaration\")\n .reduce(\n (obj: any, { property, value }) => Object.assign(obj, { [property]: value }),\n {} as Record<\"property\" | \"value\", string>,\n );\n return parsedRules;\n}\n\nfunction display(context: MatcherState, value: unknown) {\n return typeof value === \"string\" ? value : context.utils.stringify(value);\n}\n\nfunction getMessage(\n context: MatcherState,\n matcher: string,\n expectedLabel: string,\n expectedValue: any,\n receivedLabel: string,\n receivedValue: any,\n) {\n return [\n `${matcher}\\n`,\n `${expectedLabel}:\\n${context.utils.EXPECTED_COLOR(redent(display(context, expectedValue), 2))}`,\n `${receivedLabel}:\\n${context.utils.RECEIVED_COLOR(redent(display(context, receivedValue), 2))}`,\n ].join(\"\\n\");\n}\n\nfunction matches(textToMatch: string, matcher: MatcherFn) {\n if (matcher instanceof RegExp) {\n return matcher.test(textToMatch);\n } else {\n return textToMatch.includes(String(matcher));\n }\n}\n\nfunction deprecate(name: string, replacementText: string) {\n // Notify user that they are using deprecated functionality.\n // eslint-disable-next-line no-console\n console.warn(\n `Warning: ${name} has been deprecated and will be removed in future updates.`,\n replacementText,\n );\n}\n\nfunction normalize(text: string) {\n return text.replace(/\\s+/g, \" \").trim();\n}\n\nfunction getTag(element: Element) {\n return element.tagName && element.tagName.toLowerCase();\n}\n\nfunction getSelectValue({ multiple, options }: HTMLSelectElement) {\n const selectedOptions = [...options].filter((option) => option.selected);\n\n if (multiple) {\n return [...selectedOptions].map((opt) => opt.value);\n }\n\n if (selectedOptions.length === 0) {\n return undefined; // Couldn't make this happen, but just in case\n }\n return selectedOptions[0].value;\n}\n\nfunction getInputValue(inputElement: HTMLInputElement) {\n switch (inputElement.type) {\n case \"number\":\n return inputElement.value === \"\" ? null : Number(inputElement.value);\n case \"checkbox\":\n return inputElement.checked;\n default:\n return inputElement.value;\n }\n}\n\nfunction getSingleElementValue(element: undefined | null): undefined;\nfunction getSingleElementValue(element: HTMLInputElement): ReturnType<typeof getInputValue>;\nfunction getSingleElementValue(element: HTMLSelectElement): ReturnType<typeof getSelectValue>;\nfunction getSingleElementValue(element: HTMLMeterElement | HTMLProgressElement): number;\nfunction getSingleElementValue(\n element:\n | HTMLButtonElement\n | HTMLDataElement\n | HTMLOptionElement\n | HTMLOutputElement\n | HTMLTextAreaElement,\n): string;\nfunction getSingleElementValue(element: Element): undefined | string | string[] | number | boolean | null;\n\nfunction getSingleElementValue(element: Element | undefined | null) {\n if (!element) {\n return undefined;\n }\n switch (element.tagName.toLowerCase()) {\n case \"input\":\n return getInputValue(element as HTMLInputElement);\n case \"select\":\n return getSelectValue(element as HTMLSelectElement);\n default:\n return (element as any).value;\n }\n}\n\nfunction compareArraysAsSet(a: unknown, b: unknown) {\n if (Array.isArray(a) && Array.isArray(b)) {\n return isEqual(new Set(a), new Set(b));\n }\n return undefined;\n}\n\nfunction toSentence(array: string[], { wordConnector = \", \", lastWordConnector = \" and \" } = {}) {\n return [array.slice(0, -1).join(wordConnector), array[array.length - 1]].join(\n array.length > 1 ? lastWordConnector : \"\",\n );\n}\n\nexport {\n HtmlElementTypeError,\n NodeTypeError,\n checkHtmlElement,\n checkNode,\n parseCSS,\n deprecate,\n getMessage,\n matches,\n normalize,\n getTag,\n getSingleElementValue,\n compareArraysAsSet,\n toSentence,\n};\n\nfunction _printWithType<T>(name: string, value: T, print: (value: T) => string): string {\n const type = getType(value);\n const hasType = type !== \"null\" && type !== \"undefined\" ? `${name} has type: ${type}\\n` : \"\";\n const hasValue = `${name} has value: ${print(value)}`;\n return hasType + hasValue;\n}\n\n/**\n * https://github.com/jestjs/jest/blob/main/packages/jest-get-type/src/index.ts\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\ntype ValueType =\n | \"array\"\n | \"bigint\"\n | \"boolean\"\n | \"function\"\n | \"null\"\n | \"number\"\n | \"object\"\n | \"regexp\"\n | \"map\"\n | \"set\"\n | \"date\"\n | \"string\"\n | \"symbol\"\n | \"undefined\";\n\n// get the type of a value with handling the edge cases like `typeof []`\n// and `typeof null`\nexport function getType(value: unknown): ValueType {\n if (value === undefined) {\n return \"undefined\";\n } else if (value === null) {\n return \"null\";\n } else if (Array.isArray(value)) {\n return \"array\";\n } else if (typeof value === \"boolean\") {\n return \"boolean\";\n } else if (typeof value === \"function\") {\n return \"function\";\n } else if (typeof value === \"number\") {\n return \"number\";\n } else if (typeof value === \"string\") {\n return \"string\";\n } else if (typeof value === \"bigint\") {\n return \"bigint\";\n } else if (typeof value === \"object\") {\n if (value != null) {\n if (value.constructor === RegExp) {\n return \"regexp\";\n } else if (value.constructor === Map) {\n return \"map\";\n } else if (value.constructor === Set) {\n return \"set\";\n } else if (value.constructor === Date) {\n return \"date\";\n }\n }\n return \"object\";\n } else if (typeof value === \"symbol\") {\n return \"symbol\";\n }\n\n throw new Error(`value of unknown type: ${value}`);\n}\n\nexport const isPrimitive = (value: unknown): boolean => Object(value) !== value;\n","// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nconst commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\n\nfunction cssParse(css, options) {\n options = options || {};\n\n /**\n * Positional.\n */\n\n let lineno = 1;\n let column = 1;\n\n /**\n * Update lineno and column based on `str`.\n */\n\n function updatePosition(str) {\n let lines = str.match(/\\n/g);\n if (lines) lineno += lines.length;\n let i = str.lastIndexOf(\"\\n\");\n column = ~i ? str.length - i : column + str.length;\n }\n\n /**\n * Mark position and patch `node.position`.\n */\n\n function position() {\n let start = { line: lineno, column: column };\n return function (node) {\n node.position = new Position(start);\n whitespace();\n return node;\n };\n }\n\n /**\n * Store position information for a node\n */\n\n function Position(start) {\n this.start = start;\n this.end = { line: lineno, column: column };\n this.source = options.source;\n }\n\n /**\n * Non-enumerable source string\n */\n\n Position.prototype.content = css;\n\n /**\n * Error `msg`.\n */\n\n let errorsList = [];\n\n function error(msg) {\n let err = new Error(options.source + \":\" + lineno + \":\" + column + \": \" + msg);\n err.reason = msg;\n err.filename = options.source;\n err.line = lineno;\n err.column = column;\n err.source = css;\n\n if (options.silent) {\n errorsList.push(err);\n } else {\n throw err;\n }\n }\n\n /**\n * Parse stylesheet.\n */\n\n function stylesheet() {\n let rulesList = rules();\n\n return {\n type: \"stylesheet\",\n stylesheet: {\n source: options.source,\n rules: rulesList,\n parsingErrors: errorsList,\n },\n };\n }\n\n /**\n * Opening brace.\n */\n\n function open() {\n return match(/^{\\s*/);\n }\n\n /**\n * Closing brace.\n */\n\n function close() {\n return match(/^}/);\n }\n\n /**\n * Parse ruleset.\n */\n\n function rules() {\n let node;\n let rules = [];\n whitespace();\n comments(rules);\n while (css.length && css.charAt(0) != \"}\" && (node = atrule() || rule())) {\n if (node !== false) {\n rules.push(node);\n comments(rules);\n }\n }\n return rules;\n }\n\n /**\n * Match `re` and return captures.\n */\n\n function match(re) {\n let m = re.exec(css);\n if (!m) return;\n let str = m[0];\n updatePosition(str);\n css = css.slice(str.length);\n return m;\n }\n\n /**\n * Parse whitespace.\n */\n\n function whitespace() {\n match(/^\\s*/);\n }\n\n /**\n * Parse comments;\n */\n\n function comments(rules) {\n let c;\n rules = rules || [];\n while ((c = comment())) {\n if (c !== false) {\n rules.push(c);\n }\n }\n return rules;\n }\n\n /**\n * Parse comment.\n */\n\n function comment() {\n let pos = position();\n if (\"/\" != css.charAt(0) || \"*\" != css.charAt(1)) return;\n\n let i = 2;\n while (\"\" != css.charAt(i) && (\"*\" != css.charAt(i) || \"/\" != css.charAt(i + 1))) ++i;\n i += 2;\n\n if (\"\" === css.charAt(i - 1)) {\n return error(\"End of comment missing\");\n }\n\n let str = css.slice(2, i - 2);\n column += 2;\n updatePosition(str);\n css = css.slice(i);\n column += 2;\n\n return pos({\n type: \"comment\",\n comment: str,\n });\n }\n\n /**\n * Parse selector.\n */\n\n function selector() {\n let m = match(/^([^{]+)/);\n if (!m) return;\n /* @fix Remove all comments from selectors\n * http://ostermiller.org/findcomment.html */\n return trim(m[0])\n .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, \"\")\n .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, function (m) {\n return m.replace(/,/g, \"\\u200C\");\n })\n .split(/\\s*(?![^(]*\\)),\\s*/)\n .map(function (s) {\n return s.replace(/\\u200C/g, \",\");\n });\n }\n\n /**\n * Parse declaration.\n */\n\n function declaration() {\n let pos = position();\n\n // prop\n // eslint-disable-next-line no-useless-escape\n let prop = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\n if (!prop) return;\n prop = trim(prop[0]);\n\n // :\n if (!match(/^:\\s*/)) return error(\"property missing ':'\");\n\n // val\n // eslint-disable-next-line no-useless-escape\n let val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\n\n let ret = pos({\n type: \"declaration\",\n property: prop.replace(commentre, \"\"),\n value: val ? trim(val[0]).replace(commentre, \"\") : \"\",\n });\n\n // ;\n match(/^[;\\s]*/);\n\n return ret;\n }\n\n /**\n * Parse declarations.\n */\n\n function declarations() {\n let decls = [];\n\n if (!open()) return error(\"missing '{'\");\n comments(decls);\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n if (decl !== false) {\n decls.push(decl);\n comments(decls);\n }\n }\n\n if (!close()) return error(\"missing '}'\");\n return decls;\n }\n\n /**\n * Parse keyframe.\n */\n\n function keyframe() {\n let m;\n let vals = [];\n let pos = position();\n\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\n vals.push(m[1]);\n match(/^,\\s*/);\n }\n\n if (!vals.length) return;\n\n return pos({\n type: \"keyframe\",\n values: vals,\n declarations: declarations(),\n });\n }\n\n /**\n * Parse keyframes.\n */\n\n function atkeyframes() {\n let pos = position();\n let m = match(/^@([-\\w]+)?keyframes\\s*/);\n\n if (!m) return;\n let vendor = m[1];\n\n // identifier\n m = match(/^([-\\w]+)\\s*/);\n if (!m) return error(\"@keyframes missing name\");\n let name = m[1];\n\n if (!open()) return error(\"@keyframes missing '{'\");\n\n let frame;\n let frames = comments();\n while ((frame = keyframe())) {\n frames.push(frame);\n frames = frames.concat(comments());\n }\n\n if (!close()) return error(\"@keyframes missing '}'\");\n\n return pos({\n type: \"keyframes\",\n name: name,\n vendor: vendor,\n keyframes: frames,\n });\n }\n\n /**\n * Parse supports.\n */\n\n function atsupports() {\n let pos = position();\n let m = match(/^@supports *([^{]+)/);\n\n if (!m) return;\n let supports = trim(m[1]);\n\n if (!open()) return error(\"@supports missing '{'\");\n\n let style = comments().concat(rules());\n\n if (!close()) return error(\"@supports missing '}'\");\n\n return pos({\n type: \"supports\",\n supports: supports,\n rules: style,\n });\n }\n\n /**\n * Parse host.\n */\n\n function athost() {\n let pos = position();\n let m = match(/^@host\\s*/);\n\n if (!m) return;\n\n if (!open()) return error(\"@host missing '{'\");\n\n let style = comments().concat(rules());\n\n if (!close()) return error(\"@host missing '}'\");\n\n return pos({\n type: \"host\",\n rules: style,\n });\n }\n\n /**\n * Parse media.\n */\n\n function atmedia() {\n let pos = position();\n let m = match(/^@media *([^{]+)/);\n\n if (!m) return;\n let media = trim(m[1]);\n\n if (!open()) return error(\"@media missing '{'\");\n\n let style = comments().concat(rules());\n\n if (!close()) return error(\"@media missing '}'\");\n\n return pos({\n type: \"media\",\n media: media,\n rules: style,\n });\n }\n\n /**\n * Parse custom-media.\n */\n\n function atcustommedia() {\n let pos = position();\n let m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\n if (!m) return;\n\n return pos({\n type: \"custom-media\",\n name: trim(m[1]),\n media: trim(m[2]),\n });\n }\n\n /**\n * Parse paged media.\n */\n\n function atpage() {\n let pos = position();\n let m = match(/^@page */);\n if (!m) return;\n\n let sel = selector() || [];\n\n if (!open()) return error(\"@page missing '{'\");\n let decls = comments();\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n\n if (!close()) return error(\"@page missing '}'\");\n\n return pos({\n type: \"page\",\n selectors: sel,\n declarations: decls,\n });\n }\n\n /**\n * Parse document.\n */\n\n function atdocument() {\n let pos = position();\n let m = match(/^@([-\\w]+)?document *([^{]+)/);\n if (!m) return;\n\n let vendor = trim(m[1]);\n let doc = trim(m[2]);\n\n if (!open()) return error(\"@document missing '{'\");\n\n let style = comments().concat(rules());\n\n if (!close()) return error(\"@document missing '}'\");\n\n return pos({\n type: \"document\",\n document: doc,\n vendor: vendor,\n rules: style,\n });\n }\n\n /**\n * Parse font-face.\n */\n\n function atfontface() {\n let pos = position();\n let m = match(/^@font-face\\s*/);\n if (!m) return;\n\n if (!open()) return error(\"@font-face missing '{'\");\n let decls = comments();\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n\n if (!close()) return error(\"@font-face missing '}'\");\n\n return pos({\n type: \"font-face\",\n declarations: decls,\n });\n }\n\n /**\n * Parse import\n */\n\n let atimport = _compileAtrule(\"import\");\n\n /**\n * Parse charset\n */\n\n let atcharset = _compileAtrule(\"charset\");\n\n /**\n * Parse namespace\n */\n\n let atnamespace = _compileAtrule(\"namespace\");\n\n /**\n * Parse non-block at-rules\n */\n\n function _compileAtrule(name) {\n let re = new RegExp(\"^@\" + name + \"\\\\s*([^;]+);\");\n return function () {\n let pos = position();\n let m = match(re);\n if (!m) return;\n let ret = { type: name };\n ret[name] = m[1].trim();\n return pos(ret);\n };\n }\n\n /**\n * Parse at rule.\n */\n\n function atrule() {\n if (css[0] != \"@\") return;\n\n return (\n atkeyframes() ||\n atmedia() ||\n atcustommedia() ||\n atsupports() ||\n atimport() ||\n atcharset() ||\n atnamespace() ||\n atdocument() ||\n atpage() ||\n athost() ||\n atfontface()\n );\n }\n\n /**\n * Parse rule.\n */\n\n function rule() {\n let pos = position();\n let sel = selector();\n\n if (!sel) return error(\"selector missing\");\n comments();\n\n return pos({\n type: \"rule\",\n selectors: sel,\n declarations: declarations(),\n });\n }\n\n return addParent(stylesheet());\n}\n\n/**\n * Trim `str`.\n */\n\nfunction trim(str) {\n return str ? str.replace(/^\\s+|\\s+$/g, \"\") : \"\";\n}\n\n/**\n * Adds non-enumerable parent node reference to each node.\n */\n\nfunction addParent(obj, parent) {\n let isNode = obj && typeof obj.type === \"string\";\n let childParent = isNode ? obj : parent;\n\n for (var k in obj) {\n let value = obj[k];\n if (Array.isArray(value)) {\n value.forEach(function (v) {\n addParent(v, childParent);\n });\n } else if (value && typeof value === \"object\") {\n addParent(value, childParent);\n }\n }\n\n if (isNode) {\n Object.defineProperty(obj, \"parent\", {\n configurable: true,\n writable: true,\n enumerable: false,\n value: parent || null,\n });\n }\n\n return obj;\n}\n\nexport default cssParse;\n","import { checkHtmlElement, getTag } from \"./utils\";\n\n// form elements that support 'disabled'\nconst FORM_TAGS = [\"fieldset\", \"input\", \"select\", \"optgroup\", \"option\", \"button\", \"textarea\"];\n\n/*\n * According to specification:\n * If <fieldset> is disabled, the form controls that are its descendants,\n * except descendants of its first optional <legend> element, are disabled\n *\n * https://html.spec.whatwg.org/multipage/form-elements.html#concept-fieldset-disabled\n *\n * This method tests whether element is first legend child of fieldset parent\n */\nfunction isFirstLegendChildOfFieldset(element, parent) {\n return (\n getTag(element) === \"legend\" &&\n getTag(parent) === \"fieldset\" &&\n element.isSameNode(Array.from(parent.children).find((child) => getTag(child) === \"legend\"))\n );\n}\n\nfunction isElementDisabledByParent(element, parent) {\n return isElementDisabled(parent) && !isFirstLegendChildOfFieldset(element, parent);\n}\n\nfunction isCustomElement(tag) {\n return tag.includes(\"-\");\n}\n\n/*\n * Only certain form elements and custom elements can actually be disabled:\n * https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements\n */\nfunction canElementBeDisabled(element) {\n const tag = getTag(element);\n return FORM_TAGS.includes(tag) || isCustomElement(tag);\n}\n\nfunction isElementDisabled(element) {\n return canElementBeDisabled(element) && element.hasAttribute(\"disabled\");\n}\n\nfunction isAncestorDisabled(element) {\n const parent = element.parentElement;\n return Boolean(parent) && (isElementDisabledByParent(element, parent) || isAncestorDisabled(parent));\n}\n\nfunction isElementOrAncestorDisabled(element) {\n return canElementBeDisabled(element) && (isElementDisabled(element) || isAncestorDisabled(element));\n}\n\nexport function toBeDisabled(element) {\n checkHtmlElement(element, toBeDisabled, this);\n\n const isDisabled = isElementOrAncestorDisabled(element);\n\n return {\n pass: isDisabled,\n message: () => {\n const is = isDisabled ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeDisabled`, \"element\", \"\"),\n \"\",\n `Received element ${is} disabled:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n\nexport function toBeEnabled(element) {\n checkHtmlElement(element, toBeEnabled, this);\n\n const isEnabled = !isElementOrAncestorDisabled(element);\n\n return {\n pass: isEnabled,\n message: () => {\n const is = isEnabled ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeEnabled`, \"element\", \"\"),\n \"\",\n `Received element ${is} enabled:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement, deprecate } from \"./utils\";\n\nexport function toBeEmpty(element) {\n deprecate(\"toBeEmpty\", \"Please use instead toBeEmptyDOMElement for finding empty nodes in the DOM.\");\n checkHtmlElement(element, toBeEmpty, this);\n\n return {\n pass: element.innerHTML === \"\",\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeEmpty`, \"element\", \"\"),\n \"\",\n \"Received:\",\n ` ${this.utils.printReceived(element.innerHTML)}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toBeEmptyDOMElement(element) {\n checkHtmlElement(element, toBeEmptyDOMElement, this);\n\n return {\n pass: isEmptyElement(element),\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeEmptyDOMElement`, \"element\", \"\"),\n \"\",\n \"Received:\",\n ` ${this.utils.printReceived(element.innerHTML)}`,\n ].join(\"\\n\");\n },\n };\n}\n\n/**\n * Identifies if an element doesn't contain child nodes (excluding comments)\n * ℹ The literal 8 is Node.COMMENT_NODE. It is used directly instead of the\n * Node constant so the matcher doesn't depend on a global Node existing in\n * the consumer's test environment (this project tests with happy-dom, but\n * consumers may run any environment; historically this guarded against\n * https://github.com/jsdom/jsdom/issues/2220 under jsdom).\n *\n * @param {*} element an HtmlElement or SVGElement\n * @return {*} true if the element only contains comments or none\n */\nfunction isEmptyElement(element) {\n const nonCommentChildNodes = [...element.childNodes].filter((node) => node.nodeType !== 8);\n return nonCommentChildNodes.length === 0;\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toBeInTheDocument(element) {\n if (element !== null || !this.isNot) {\n checkHtmlElement(element, toBeInTheDocument, this);\n }\n\n const pass = element === null ? false : element.ownerDocument === element.getRootNode({ composed: true });\n\n const errorFound = () => {\n return `expected document not to contain element, found ${this.utils.stringify(\n element.cloneNode(true),\n )} instead`;\n };\n const errorNotFound = () => {\n return `element could not be found in the document`;\n };\n\n return {\n pass,\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeInTheDocument`, \"element\", \"\"),\n \"\",\n this.utils.RECEIVED_COLOR(this.isNot ? errorFound() : errorNotFound()),\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement, deprecate } from \"./utils\";\n\nexport function toBeInTheDOM(element, container) {\n deprecate(\n \"toBeInTheDOM\",\n \"Please use toBeInTheDocument for searching the entire document and toContainElement for searching a specific container.\",\n );\n\n if (element) {\n checkHtmlElement(element, toBeInTheDOM, this);\n }\n\n if (container) {\n checkHtmlElement(container, toBeInTheDOM, this);\n }\n\n return {\n pass: container ? container.contains(element) : !!element,\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeInTheDOM`, \"element\", \"\"),\n \"\",\n \"Received:\",\n ` ${this.utils.printReceived(element ? element.cloneNode(false) : element)}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement, getTag } from \"./utils\";\n\nconst FORM_TAGS = [\"form\", \"input\", \"select\", \"textarea\"];\n\nfunction isElementHavingAriaInvalid(element) {\n return element.hasAttribute(\"aria-invalid\") && element.getAttribute(\"aria-invalid\") !== \"false\";\n}\n\nfunction isSupportsValidityMethod(element) {\n return FORM_TAGS.includes(getTag(element));\n}\n\nfunction isElementInvalid(element) {\n const isHaveAriaInvalid = isElementHavingAriaInvalid(element);\n if (isSupportsValidityMethod(element)) {\n return isHaveAriaInvalid || !element.checkValidity();\n } else {\n return isHaveAriaInvalid;\n }\n}\n\nexport function toBeInvalid(element) {\n checkHtmlElement(element, toBeInvalid, this);\n\n const isInvalid = isElementInvalid(element);\n\n return {\n pass: isInvalid,\n message: () => {\n const is = isInvalid ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeInvalid`, \"element\", \"\"),\n \"\",\n `Received element ${is} currently invalid:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n\nexport function toBeValid(element) {\n checkHtmlElement(element, toBeValid, this);\n\n const isValid = !isElementInvalid(element);\n\n return {\n pass: isValid,\n message: () => {\n const is = isValid ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeValid`, \"element\", \"\"),\n \"\",\n `Received element ${is} currently valid:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toBePartiallyChecked(element) {\n checkHtmlElement(element, toBePartiallyChecked, this);\n\n const isValidInput = () => {\n return element.tagName.toLowerCase() === \"input\" && element.type === \"checkbox\";\n };\n\n const isValidAriaElement = () => {\n return element.getAttribute(\"role\") === \"checkbox\";\n };\n\n if (!isValidInput() && !isValidAriaElement()) {\n return {\n pass: false,\n message: () =>\n 'only inputs with type=\"checkbox\" or elements with role=\"checkbox\" and a valid aria-checked attribute can be used with .toBePartiallyChecked(). Use .toHaveValue() instead',\n };\n }\n\n const isPartiallyChecked = () => {\n const isAriaMixed = element.getAttribute(\"aria-checked\") === \"mixed\";\n\n if (isValidInput()) {\n return element.indeterminate || isAriaMixed;\n }\n\n return isAriaMixed;\n };\n\n return {\n pass: isPartiallyChecked(),\n message: () => {\n const is = isPartiallyChecked() ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBePartiallyChecked`, \"element\", \"\"),\n \"\",\n `Received element ${is} partially checked:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement, getTag } from \"./utils\";\n\n// form elements that support 'required'\nconst FORM_TAGS = [\"select\", \"textarea\"];\n\nconst ARIA_FORM_TAGS = [\"input\", \"select\", \"textarea\"];\n\nconst UNSUPPORTED_INPUT_TYPES = [\"color\", \"hidden\", \"range\", \"submit\", \"image\", \"reset\"];\n\nconst SUPPORTED_ARIA_ROLES = [\"combobox\", \"gridcell\", \"radiogroup\", \"spinbutton\", \"tree\"];\n\nfunction isRequiredOnFormTagsExceptInput(element) {\n return FORM_TAGS.includes(getTag(element)) && element.hasAttribute(\"required\");\n}\n\nfunction isRequiredOnSupportedInput(element) {\n return (\n getTag(element) === \"input\" &&\n element.hasAttribute(\"required\") &&\n ((element.hasAttribute(\"type\") && !UNSUPPORTED_INPUT_TYPES.includes(element.getAttribute(\"type\"))) ||\n !element.hasAttribute(\"type\"))\n );\n}\n\nfunction isElementRequiredByARIA(element) {\n return (\n element.hasAttribute(\"aria-required\") &&\n element.getAttribute(\"aria-required\") === \"true\" &&\n (ARIA_FORM_TAGS.includes(getTag(element)) ||\n (element.hasAttribute(\"role\") && SUPPORTED_ARIA_ROLES.includes(element.getAttribute(\"role\"))))\n );\n}\n\nexport function toBeRequired(element) {\n checkHtmlElement(element, toBeRequired, this);\n\n const isRequired =\n isRequiredOnFormTagsExceptInput(element) ||\n isRequiredOnSupportedInput(element) ||\n isElementRequiredByARIA(element);\n\n return {\n pass: isRequired,\n message: () => {\n const is = isRequired ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeRequired`, \"element\", \"\"),\n \"\",\n `Received element ${is} required:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nfunction isStyleVisible(element) {\n const { getComputedStyle } = element.ownerDocument.defaultView;\n\n const { display, visibility, opacity } = getComputedStyle(element);\n return (\n display !== \"none\" &&\n visibility !== \"hidden\" &&\n visibility !== \"collapse\" &&\n opacity !== \"0\" &&\n opacity !== 0\n );\n}\n\nfunction isAttributeVisible(element, previousElement) {\n let detailsVisibility;\n\n if (previousElement) {\n detailsVisibility =\n element.nodeName === \"DETAILS\" && previousElement.nodeName !== \"SUMMARY\"\n ? element.hasAttribute(\"open\")\n : true;\n } else {\n detailsVisibility = element.nodeName === \"DETAILS\" ? element.hasAttribute(\"open\") : true;\n }\n\n return !element.hasAttribute(\"hidden\") && detailsVisibility;\n}\n\nfunction isElementVisible(element, previousElement) {\n return (\n isStyleVisible(element) &&\n isAttributeVisible(element, previousElement) &&\n (!element.parentElement || isElementVisible(element.parentElement, element))\n );\n}\n\nexport function toBeVisible(element) {\n checkHtmlElement(element, toBeVisible, this);\n const isInDocument = element.ownerDocument === element.getRootNode({ composed: true });\n const isVisible = isInDocument && isElementVisible(element);\n return {\n pass: isVisible,\n message: () => {\n const is = isVisible ? \"is\" : \"is not\";\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toBeVisible`, \"element\", \"\"),\n \"\",\n `Received element ${is} visible${isInDocument ? \"\" : \" (element is not in the document)\"}:`,\n ` ${this.utils.printReceived(element.cloneNode(false))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toContainElement(container, element) {\n checkHtmlElement(container, toContainElement, this);\n\n if (element !== null) {\n checkHtmlElement(element, toContainElement, this);\n }\n\n return {\n pass: container.contains(element),\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toContainElement`, \"element\", \"element\"),\n \"\",\n this.utils.RECEIVED_COLOR(`${this.utils.stringify(container.cloneNode(false))} ${\n this.isNot ? \"contains:\" : \"does not contain:\"\n } ${this.utils.stringify(element ? element.cloneNode(false) : element)}\n `),\n ].join(\"\\n\");\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nfunction getNormalizedHtml(container, htmlText) {\n const div = container.ownerDocument.createElement(\"div\");\n div.innerHTML = htmlText;\n return div.innerHTML;\n}\n\nexport function toContainHTML(container, htmlText) {\n checkHtmlElement(container, toContainHTML, this);\n\n if (typeof htmlText !== \"string\") {\n throw new Error(`.toContainHTML() expects a string value, got ${htmlText}`);\n }\n\n return {\n pass: container.outerHTML.includes(getNormalizedHtml(container, htmlText)),\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toContainHTML`, \"element\", \"\"),\n \"Expected:\",\n ` ${this.utils.EXPECTED_COLOR(htmlText)}`,\n \"Received:\",\n ` ${this.utils.printReceived(container.cloneNode(true))}`,\n ].join(\"\\n\");\n },\n };\n}\n","import { computeAccessibleDescription } from \"dom-accessibility-api\";\n\nimport { checkHtmlElement, getMessage } from \"./utils\";\n\nexport function toHaveAccessibleDescription(htmlElement, expectedAccessibleDescription) {\n checkHtmlElement(htmlElement, toHaveAccessibleDescription, this);\n const actualAccessibleDescription = computeAccessibleDescription(htmlElement);\n const missingExpectedValue = arguments.length === 1;\n\n let pass = false;\n if (missingExpectedValue) {\n // When called without an expected value we only want to validate that the element has an\n // accessible description, whatever it may be.\n pass = actualAccessibleDescription !== \"\";\n } else {\n pass =\n expectedAccessibleDescription instanceof RegExp\n ? expectedAccessibleDescription.test(actualAccessibleDescription)\n : this.equals(actualAccessibleDescription, expectedAccessibleDescription);\n }\n\n return {\n pass,\n\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.${toHaveAccessibleDescription.name}`,\n \"element\",\n \"\",\n ),\n `Expected element ${to} have accessible description`,\n expectedAccessibleDescription,\n \"Received\",\n actualAccessibleDescription,\n );\n },\n };\n}\n","import { computeAccessibleName } from \"dom-accessibility-api\";\n\nimport { checkHtmlElement, getMessage } from \"./utils\";\n\nexport function toHaveAccessibleName(htmlElement, expectedAccessibleName) {\n checkHtmlElement(htmlElement, toHaveAccessibleName, this);\n const actualAccessibleName = computeAccessibleName(htmlElement);\n const missingExpectedValue = arguments.length === 1;\n\n let pass = false;\n if (missingExpectedValue) {\n // When called without an expected value we only want to validate that the element has an\n // accessible name, whatever it may be.\n pass = actualAccessibleName !== \"\";\n } else {\n pass =\n expectedAccessibleName instanceof RegExp\n ? expectedAccessibleName.test(actualAccessibleName)\n : this.equals(actualAccessibleName, expectedAccessibleName);\n }\n\n return {\n pass,\n\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.${toHaveAccessibleName.name}`,\n \"element\",\n \"\",\n ),\n `Expected element ${to} have accessible name`,\n expectedAccessibleName,\n \"Received\",\n actualAccessibleName,\n );\n },\n };\n}\n","import { checkHtmlElement, getMessage } from \"./utils\";\n\nfunction printAttribute(stringify, name, value) {\n return value === undefined ? name : `${name}=${stringify(value)}`;\n}\n\nfunction getAttributeComment(stringify, name, value) {\n return value === undefined\n ? `element.hasAttribute(${stringify(name)})`\n : `element.getAttribute(${stringify(name)}) === ${stringify(value)}`;\n}\n\nexport function toHaveAttribute(htmlElement, name, expectedValue) {\n checkHtmlElement(htmlElement, toHaveAttribute, this);\n const isExpectedValuePresent = expectedValue !== undefined;\n const hasAttribute = htmlElement.hasAttribute(name);\n const receivedValue = htmlElement.getAttribute(name);\n return {\n pass: isExpectedValuePresent\n ? hasAttribute && this.equals(receivedValue, expectedValue)\n : hasAttribute,\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n const receivedAttribute = hasAttribute\n ? printAttribute(this.utils.stringify, name, receivedValue)\n : null;\n const matcher = this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.toHaveAttribute`,\n \"element\",\n this.utils.printExpected(name),\n {\n secondArgument: isExpectedValuePresent\n ? this.utils.printExpected(expectedValue)\n : undefined,\n comment: getAttributeComment(this.utils.stringify, name, expectedValue),\n },\n );\n return getMessage(\n this,\n matcher,\n `Expected the element ${to} have attribute`,\n printAttribute(this.utils.stringify, name, expectedValue),\n \"Received\",\n receivedAttribute,\n );\n },\n };\n}\n","import { checkHtmlElement, getMessage } from \"./utils\";\n\nfunction getExpectedClassNamesAndOptions(params) {\n const lastParam = params.pop();\n let expectedClassNames, options;\n\n if (typeof lastParam === \"object\") {\n expectedClassNames = params;\n options = lastParam;\n } else {\n expectedClassNames = params.concat(lastParam);\n options = { exact: false };\n }\n return { expectedClassNames, options };\n}\n\nfunction splitClassNames(str) {\n if (!str) {\n return [];\n }\n return str.split(/\\s+/).filter((s) => s.length > 0);\n}\n\nfunction isSubset(subset, superset) {\n return subset.every((item) => superset.includes(item));\n}\n\nexport function toHaveClass(htmlElement, ...params) {\n checkHtmlElement(htmlElement, toHaveClass, this);\n const { expectedClassNames, options } = getExpectedClassNamesAndOptions(params);\n\n const received = splitClassNames(htmlElement.getAttribute(\"class\"));\n const expected = expectedClassNames.reduce(\n (acc, className) => acc.concat(splitClassNames(className)),\n [],\n );\n\n if (options.exact) {\n return {\n pass: isSubset(expected, received) && expected.length === received.length,\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.toHaveClass`,\n \"element\",\n this.utils.printExpected(expected.join(\" \")),\n ),\n `Expected the element ${to} have EXACTLY defined classes`,\n expected.join(\" \"),\n \"Received\",\n received.join(\" \"),\n );\n },\n };\n }\n\n return expected.length > 0\n ? {\n pass: isSubset(expected, received),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.toHaveClass`,\n \"element\",\n this.utils.printExpected(expected.join(\" \")),\n ),\n `Expected the element ${to} have class`,\n expected.join(\" \"),\n \"Received\",\n received.join(\" \"),\n );\n },\n }\n : {\n pass: this.isNot ? received.length > 0 : false,\n message: () =>\n this.isNot\n ? getMessage(\n this,\n this.utils.matcherHint(\".not.toHaveClass\", \"element\", \"\"),\n \"Expected the element to have classes\",\n \"(none)\",\n \"Received\",\n received.join(\" \"),\n )\n : [\n this.utils.matcherHint(`.toHaveClass`, \"element\"),\n \"At least one expected class must be provided.\",\n ].join(\"\\n\"),\n };\n}\n","import { checkHtmlElement, getMessage, normalize, deprecate } from \"./utils\";\n\n// See algoritm: https://www.w3.org/TR/accname-1.1/#mapping_additional_nd_description\nexport function toHaveDescription(htmlElement, checkWith) {\n deprecate(\"toHaveDescription\", \"Please use toHaveAccessibleDescription.\");\n\n checkHtmlElement(htmlElement, toHaveDescription, this);\n\n const expectsDescription = checkWith !== undefined;\n\n const descriptionIDRaw = htmlElement.getAttribute(\"aria-describedby\") || \"\";\n const descriptionIDs = descriptionIDRaw.split(/\\s+/).filter(Boolean);\n let description = \"\";\n if (descriptionIDs.length > 0) {\n const document = htmlElement.ownerDocument;\n const descriptionEls = descriptionIDs\n .map((descriptionID) => document.getElementById(descriptionID))\n .filter(Boolean);\n description = normalize(descriptionEls.map((el) => el.textContent).join(\" \"));\n }\n\n return {\n pass: expectsDescription\n ? checkWith instanceof RegExp\n ? checkWith.test(description)\n : this.equals(description, checkWith)\n : Boolean(description),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveDescription`, \"element\", \"\"),\n `Expected the element ${to} have description`,\n this.utils.printExpected(checkWith),\n \"Received\",\n this.utils.printReceived(description),\n );\n },\n };\n}\n","import { checkHtmlElement, getMessage } from \"./utils\";\n\nexport function toHaveDisplayValue(htmlElement, expectedValue) {\n checkHtmlElement(htmlElement, toHaveDisplayValue, this);\n const tagName = htmlElement.tagName.toLowerCase();\n\n if (![\"select\", \"input\", \"textarea\"].includes(tagName)) {\n throw new Error(\n \".toHaveDisplayValue() currently supports only input, textarea or select elements, try with another matcher instead.\",\n );\n }\n\n if (tagName === \"input\" && [\"radio\", \"checkbox\"].includes(htmlElement.type)) {\n throw new Error(\n `.toHaveDisplayValue() currently does not support input[type=\"${htmlElement.type}\"], try with another matcher instead.`,\n );\n }\n\n const values = getValues(tagName, htmlElement);\n const expectedValues = getExpectedValues(expectedValue);\n const numberOfMatchesWithValues = expectedValues.filter((expected) =>\n values.some((value) =>\n expected instanceof RegExp ? expected.test(value) : this.equals(value, String(expected)),\n ),\n ).length;\n\n const matchedWithAllValues = numberOfMatchesWithValues === values.length;\n const matchedWithAllExpectedValues = numberOfMatchesWithValues === expectedValues.length;\n\n return {\n pass: matchedWithAllValues && matchedWithAllExpectedValues,\n message: () =>\n getMessage(\n this,\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveDisplayValue`, \"element\", \"\"),\n `Expected element ${this.isNot ? \"not \" : \"\"}to have display value`,\n expectedValue,\n \"Received\",\n values,\n ),\n };\n}\n\nfunction getValues(tagName, htmlElement) {\n return tagName === \"select\"\n ? Array.from(htmlElement)\n .filter((option) => option.selected)\n .map((option) => option.textContent)\n : [htmlElement.value];\n}\n\nfunction getExpectedValues(expectedValue) {\n return expectedValue instanceof Array ? expectedValue : [expectedValue];\n}\n","import { checkHtmlElement, getMessage, normalize } from \"./utils\";\n\n// See aria-errormessage spec https://www.w3.org/TR/wai-aria-1.2/#aria-errormessage\nexport function toHaveErrorMessage(htmlElement, checkWith) {\n checkHtmlElement(htmlElement, toHaveErrorMessage, this);\n\n if (!htmlElement.hasAttribute(\"aria-invalid\") || htmlElement.getAttribute(\"aria-invalid\") === \"false\") {\n const not = this.isNot ? \".not\" : \"\";\n\n return {\n pass: false,\n message: () => {\n return getMessage(\n this,\n this.utils.matcherHint(`${not}.toHaveErrorMessage`, \"element\", \"\"),\n `Expected the element to have invalid state indicated by`,\n 'aria-invalid=\"true\"',\n \"Received\",\n htmlElement.hasAttribute(\"aria-invalid\")\n ? `aria-invalid=\"${htmlElement.getAttribute(\"aria-invalid\")}\"`\n : this.utils.printReceived(\"\"),\n );\n },\n };\n }\n\n const expectsErrorMessage = checkWith !== undefined;\n\n const errormessageIDRaw = htmlElement.getAttribute(\"aria-errormessage\") || \"\";\n const errormessageIDs = errormessageIDRaw.split(/\\s+/).filter(Boolean);\n\n let errormessage = \"\";\n if (errormessageIDs.length > 0) {\n const document = htmlElement.ownerDocument;\n\n const errormessageEls = errormessageIDs\n .map((errormessageID) => document.getElementById(errormessageID))\n .filter(Boolean);\n\n errormessage = normalize(errormessageEls.map((el) => el.textContent).join(\" \"));\n }\n\n return {\n pass: expectsErrorMessage\n ? checkWith instanceof RegExp\n ? checkWith.test(errormessage)\n : this.equals(errormessage, checkWith)\n : Boolean(errormessage),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveErrorMessage`, \"element\", \"\"),\n `Expected the element ${to} have error message`,\n this.utils.printExpected(checkWith),\n \"Received\",\n this.utils.printReceived(errormessage),\n );\n },\n };\n}\n","import { checkHtmlElement } from \"./utils\";\n\nexport function toHaveFocus(element) {\n checkHtmlElement(element, toHaveFocus, this);\n\n return {\n pass: element.ownerDocument.activeElement === element,\n message: () => {\n return [\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveFocus`, \"element\", \"\"),\n \"\",\n ...(this.isNot\n ? [\"Received element is focused:\", ` ${this.utils.printReceived(element)}`]\n : [\n \"Expected element with focus:\",\n ` ${this.utils.printExpected(element)}`,\n \"Received element with focus:\",\n ` ${this.utils.printReceived(element.ownerDocument.activeElement)}`,\n ]),\n ].join(\"\\n\");\n },\n };\n}\n","import escape from \"css.escape\";\nimport { isEqualWith, uniq } from \"lodash-es\";\n\nimport type { MatcherResult } from \"./types\";\nimport { checkHtmlElement, compareArraysAsSet, getSingleElementValue } from \"./utils\";\n\n// Returns the combined value of several elements that have the same name\n// e.g. radio buttons or groups of checkboxes\nfunction getMultiElementValue(elements: (HTMLInputElement & { type: \"radio\" })[]): string | undefined;\nfunction getMultiElementValue(elements: (HTMLInputElement & { type: \"checkbox\" })[]): string[];\nfunction getMultiElementValue(elements: HTMLInputElement[]): string[];\n\nfunction getMultiElementValue(elements: HTMLInputElement[]) {\n const types = uniq(elements.map((element) => element.type));\n if (types.length !== 1) {\n throw new Error(\"Multiple form elements with the same name must be of the same type\");\n }\n switch (types[0]) {\n case \"radio\": {\n const theChosenOne = elements.find((radio) => radio.checked);\n return theChosenOne ? theChosenOne.value : undefined;\n }\n case \"checkbox\":\n return elements.filter((checkbox) => checkbox.checked).map((checkbox) => checkbox.value);\n default:\n // NOTE: Not even sure this is a valid use case, but just in case...\n return elements.map((element) => element.value);\n }\n}\n\ntype FormElement =\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement\n | HTMLButtonElement\n | HTMLMeterElement\n | HTMLProgressElement;\n\nfunction getFormValue(container: HTMLFormElement | HTMLFieldSetElement, name: string) {\n container.elements;\n const elements = [...container.querySelectorAll(`[name=\"${escape(name)}\"]`)] as FormElement[];\n if (elements.length === 0) {\n return undefined; // shouldn't happen, but just in case\n }\n switch (elements.length) {\n case 1:\n return getSingleElementValue(elements[0]);\n default:\n return getMultiElementValue(elements as HTMLInputElement[]);\n }\n}\n\n// Strips the `[]` suffix off a form value name\nfunction getPureName(name: string) {\n return /\\[\\]$/.test(name) ? name.slice(0, -2) : name;\n}\n\nfunction getAllFormValues(container: HTMLFormElement | HTMLFieldSetElement) {\n const names = Array.from(container.elements).map((element) => (element as HTMLInputElement).name);\n return names.reduce<Record<string, unknown>>(\n (obj, name) => ({\n ...obj,\n [getPureName(name)]: getFormValue(container, name),\n }),\n {},\n );\n}\n\nexport function toHaveFormValues(\n this: any,\n formElement: HTMLFormElement | HTMLFieldSetElement,\n expectedValues: Record<string, unknown>,\n): MatcherResult {\n checkHtmlElement(formElement, toHaveFormValues, this);\n if (!formElement.elements) {\n // TODO: Change condition to use instanceof against the appropriate element classes instead\n throw new Error(\"toHaveFormValues must be called on a form or a fieldset\");\n }\n const formValues = getAllFormValues(formElement);\n return {\n pass: Object.entries(expectedValues).every(([name, expectedValue]) =>\n isEqualWith(formValues[name], expectedValue, compareArraysAsSet),\n ),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n const matcher = `${this.isNot ? \".not\" : \"\"}.toHaveFormValues`;\n const commonKeyValues = Object.keys(formValues)\n .filter((key) => expectedValues.hasOwnProperty(key))\n .reduce((obj, key) => ({ ...obj, [key]: formValues[key] }), {});\n return [\n this.utils.matcherHint(matcher, \"element\", \"\"),\n `Expected the element ${to} have form values`,\n this.utils.diff(expectedValues, commonKeyValues),\n ].join(\"\\n\\n\");\n },\n };\n}\n","import chalk from \"chalk\";\n\nimport { checkHtmlElement, parseCSS } from \"./utils\";\n\nfunction getStyleDeclaration(document, css) {\n const styles = {};\n\n // The next block is necessary to normalize colors\n const copy = document.createElement(\"div\");\n Object.keys(css).forEach((property) => {\n copy.style[property] = css[property];\n // Number values default to px. jsdom's CSSOM did this coercion\n // itself; happy-dom rejects bare numbers, so retry with px appended.\n if (copy.style[property] === \"\" && typeof css[property] === \"number\") {\n copy.style[property] = `${css[property]}px`;\n }\n // Fall back to the raw value for properties the style declaration\n // swallows instead of echoing back (happy-dom does this for unknown\n // and custom properties); otherwise expected `undefined` would\n // spuriously match any element missing that property.\n styles[property] = copy.style[property] || css[property];\n });\n\n return styles;\n}\n\nfunction isSubset(styles, computedStyle) {\n return (\n !!Object.keys(styles).length &&\n Object.entries(styles).every(\n ([prop, value]) =>\n computedStyle[prop] === value || computedStyle.getPropertyValue(prop.toLowerCase()) === value,\n )\n );\n}\n\nfunction printoutStyles(styles) {\n return Object.keys(styles)\n .sort()\n .map((prop) => `${prop}: ${styles[prop]};`)\n .join(\"\\n\");\n}\n\n// Highlights only style rules that were expected but were not found in the\n// received computed styles\nfunction expectedDiff(diffFn, expected, computedStyles) {\n const received = Array.from(computedStyles)\n .filter((prop) => expected[prop] !== undefined)\n .reduce((obj, prop) => Object.assign(obj, { [prop]: computedStyles.getPropertyValue(prop) }), {});\n const diffOutput = diffFn(printoutStyles(expected), printoutStyles(received));\n // Remove the \"+ Received\" annotation because this is a one-way diff\n return diffOutput.replace(`${chalk.red(\"+ Received\")}\\n`, \"\");\n}\n\nexport function toHaveStyle(htmlElement, css) {\n checkHtmlElement(htmlElement, toHaveStyle, this);\n const parsedCSS = typeof css === \"object\" ? css : parseCSS(css, toHaveStyle, this);\n const { getComputedStyle } = htmlElement.ownerDocument.defaultView;\n\n const expected = getStyleDeclaration(htmlElement.ownerDocument, parsedCSS);\n const received = getComputedStyle(htmlElement);\n\n return {\n pass: isSubset(expected, received),\n message: () => {\n const matcher = `${this.isNot ? \".not\" : \"\"}.toHaveStyle`;\n return [\n this.utils.matcherHint(matcher, \"element\", \"\"),\n expectedDiff(this.utils.diff, expected, received),\n ].join(\"\\n\\n\");\n },\n };\n}\n","import { getMessage, checkNode, matches, normalize } from \"./utils\";\n\nexport function toHaveTextContent(node, checkWith, options = { normalizeWhitespace: true }) {\n checkNode(node, toHaveTextContent, this);\n\n const textContent = options.normalizeWhitespace\n ? normalize(node.textContent)\n : node.textContent.replace(/\\u00a0/g, \" \"); // Replace with normal spaces\n\n const checkingWithEmptyString = textContent !== \"\" && checkWith === \"\";\n\n return {\n pass: !checkingWithEmptyString && matches(textContent, checkWith),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n return getMessage(\n this,\n this.utils.matcherHint(`${this.isNot ? \".not\" : \"\"}.toHaveTextContent`, \"element\", \"\"),\n checkingWithEmptyString\n ? `Checking with empty string will always match, use .toBeEmptyDOMElement() instead`\n : `Expected element ${to} have text content`,\n checkWith,\n \"Received\",\n textContent,\n );\n },\n };\n}\n","import { isEqualWith } from \"lodash-es\";\n\nimport { checkHtmlElement, compareArraysAsSet, getMessage, getSingleElementValue } from \"./utils\";\n\nexport function toHaveValue(htmlElement, expectedValue) {\n checkHtmlElement(htmlElement, toHaveValue, this);\n\n if (htmlElement.tagName.toLowerCase() === \"input\" && [\"checkbox\", \"radio\"].includes(htmlElement.type)) {\n throw new Error(\n \"input with type=checkbox or type=radio cannot be used with .toHaveValue(). Use .toBeChecked() for type=checkbox or .toHaveFormValues() instead\",\n );\n }\n\n const receivedValue = getSingleElementValue(htmlElement);\n const expectsValue = expectedValue !== undefined;\n\n let expectedTypedValue = expectedValue;\n let receivedTypedValue = receivedValue;\n if (expectedValue == receivedValue && expectedValue !== receivedValue) {\n expectedTypedValue = `${expectedValue} (${typeof expectedValue})`;\n receivedTypedValue = `${receivedValue} (${typeof receivedValue})`;\n }\n\n return {\n pass: expectsValue\n ? isEqualWith(receivedValue, expectedValue, compareArraysAsSet)\n : Boolean(receivedValue),\n message: () => {\n const to = this.isNot ? \"not to\" : \"to\";\n const matcher = this.utils.matcherHint(\n `${this.isNot ? \".not\" : \"\"}.toHaveValue`,\n \"element\",\n expectedValue,\n );\n return getMessage(\n this,\n matcher,\n `Expected the element ${to} have value`,\n expectsValue ? expectedTypedValue : \"(any)\",\n \"Received\",\n receivedTypedValue,\n );\n },\n };\n}\n","import { toBeChecked } from \"./to-be-checked\";\nimport { toBeDisabled, toBeEnabled } from \"./to-be-disabled\";\nimport { toBeEmpty } from \"./to-be-empty\";\nimport { toBeEmptyDOMElement } from \"./to-be-empty-dom-element\";\nimport { toBeInTheDocument } from \"./to-be-in-the-document\";\nimport { toBeInTheDOM } from \"./to-be-in-the-dom\";\nimport { toBeInvalid, toBeValid } from \"./to-be-invalid\";\nimport { toBePartiallyChecked } from \"./to-be-partially-checked\";\nimport { toBeRequired } from \"./to-be-required\";\nimport { toBeVisible } from \"./to-be-visible\";\nimport { toContainElement } from \"./to-contain-element\";\nimport { toContainHTML } from \"./to-contain-html\";\nimport { toHaveAccessibleDescription } from \"./to-have-accessible-description\";\nimport { toHaveAccessibleName } from \"./to-have-accessible-name\";\nimport { toHaveAttribute } from \"./to-have-attribute\";\nimport { toHaveClass } from \"./to-have-class\";\nimport { toHaveDescription } from \"./to-have-description\";\nimport { toHaveDisplayValue } from \"./to-have-display-value\";\nimport { toHaveErrorMessage } from \"./to-have-errormessage\";\nimport { toHaveFocus } from \"./to-have-focus\";\nimport { toHaveFormValues } from \"./to-have-form-values\";\nimport { toHaveStyle } from \"./to-have-style\";\nimport { toHaveTextContent } from \"./to-have-text-content\";\nimport { toHaveValue } from \"./to-have-value\";\n\nexport {\n toBeInTheDOM,\n toBeInTheDocument,\n toBeEmpty,\n toBeEmptyDOMElement,\n toContainElement,\n toContainHTML,\n toHaveTextContent,\n toHaveAccessibleDescription,\n toHaveAccessibleName,\n toHaveAttribute,\n toHaveClass,\n toHaveStyle,\n toHaveFocus,\n toHaveFormValues,\n toBeVisible,\n toBeDisabled,\n toBeEnabled,\n toBeRequired,\n toBeInvalid,\n toBeValid,\n toHaveValue,\n toHaveDisplayValue,\n toBeChecked,\n toBePartiallyChecked,\n toHaveDescription,\n toHaveErrorMessage,\n};\n\nexport interface TestingLibraryMatchers<E, R> extends Record<string, any> {\n /**\n * @deprecated\n * since v1.9.0\n * @description\n * Assert whether a value is a DOM element, or not. Contrary to what its name\n * implies, this matcher only checks that you passed to it a valid DOM\n * element.\n *\n * It does not have a clear definition of what \"the DOM\" is. Therefore, it\n * does not check whether that element is contained anywhere.\n * @see [testing-library/jest-dom#toBeInTheDom](https://github.com/testing-library/jest-dom#toBeInTheDom)\n */\n toBeInTheDOM(container?: HTMLElement | SVGElement): R;\n /**\n * @description\n * Assert whether an element is present in the document or not.\n * @example\n * <svg data-testid=\"svg-element\"></svg>\n *\n * expect(queryByTestId('svg-element')).toBeInTheDocument()\n * expect(queryByTestId('does-not-exist')).not.toBeInTheDocument()\n * @see\n * [testing-library/jest-dom#tobeinthedocument](https://github.com/testing-library/jest-dom#tobeinthedocument)\n */\n toBeInTheDocument(): R;\n /**\n * @description\n * This allows you to check if an element is currently visible to the user.\n *\n * An element is visible if **all** the following conditions are met:\n * * it does not have its css property display set to none\n * * it does not have its css property visibility set to either hidden or collapse\n * * it does not have its css property opacity set to 0\n * * its parent element is also visible (and so on up to the top of the DOM tree)\n * * it does not have the hidden attribute\n * * if `<details />` it has the open attribute\n * @example\n * <div\n * data-testid=\"zero-opacity\"\n * style=\"opacity: 0\"\n * >\n * Zero Opacity\n * </div>\n *\n * <div data-testid=\"visible\">Visible Example</div>\n *\n * expect(getByTestId('zero-opacity')).not.toBeVisible()\n * expect(getByTestId('visible')).toBeVisible()\n * @see\n * [testing-library/jest-dom#tobevisible](https://github.com/testing-library/jest-dom#tobevisible)\n */\n toBeVisible(): R;\n /**\n * @deprecated\n * since v5.9.0\n * @description\n * Assert whether an element has content or not.\n * @example\n * <span data-testid=\"not-empty\">\n * <span data-testid=\"empty\"></span>\n * </span>\n *\n * expect(getByTestId('empty')).toBeEmpty()\n * expect(getByTestId('not-empty')).not.toBeEmpty()\n * @see\n * [testing-library/jest-dom#tobeempty](https://github.com/testing-library/jest-dom#tobeempty)\n */\n toBeEmpty(): R;\n /**\n * @description\n * Assert whether an element has content or not.\n * @example\n * <span data-testid=\"not-empty\">\n * <span data-testid=\"empty\"></span>\n * </span>\n *\n * expect(getByTestId('empty')).toBeEmptyDOMElement()\n * expect(getByTestId('not-empty')).not.toBeEmptyDOMElement()\n * @see\n * [testing-library/jest-dom#tobeemptydomelement](https://github.com/testing-library/jest-dom#tobeemptydomelement)\n */\n toBeEmptyDOMElement(): R;\n /**\n * @description\n * Allows you to check whether an element is disabled from the user's perspective.\n *\n * Matches if the element is a form control and the `disabled` attribute is specified on this element or the\n * element is a descendant of a form element with a `disabled` attribute.\n * @example\n * <button\n * data-testid=\"button\"\n * type=\"submit\"\n * disabled\n * >\n * submit\n * </button>\n *\n * expect(getByTestId('button')).toBeDisabled()\n * @see\n * [testing-library/jest-dom#tobedisabled](https://github.com/testing-library/jest-dom#tobedisabled)\n */\n toBeDisabled(): R;\n /**\n * @description\n * Allows you to check whether an element is not disabled from the user's perspective.\n *\n * Works like `not.toBeDisabled()`.\n *\n * Use this matcher to avoid double negation in your tests.\n * @example\n * <button\n * data-testid=\"button\"\n * type=\"submit\"\n * >\n * submit\n * </button>\n *\n * expect(getByTestId('button')).toBeEnabled()\n * @see\n * [testing-library/jest-dom#tobeenabled](https://github.com/testing-library/jest-dom#tobeenabled)\n */\n toBeEnabled(): R;\n /**\n * @description\n * Check if a form element, or the entire `form`, is currently invalid.\n *\n * An `input`, `select`, `textarea`, or `form` element is invalid if it has an `aria-invalid` attribute with no\n * value or a value of \"true\", or if the result of `checkValidity()` is false.\n * @example\n * <input data-testid=\"no-aria-invalid\" />\n *\n * <form data-testid=\"invalid-form\">\n * <input required />\n * </form>\n *\n * expect(getByTestId('no-aria-invalid')).not.toBeInvalid()\n * expect(getByTestId('invalid-form')).toBeInvalid()\n * @see\n * [testing-library/jest-dom#tobeinvalid](https://github.com/testing-library/jest-dom#tobeinvalid)\n */\n toBeInvalid(): R;\n /**\n * @description\n * This allows you to check if a form element is currently required.\n *\n * An element is required if it is having a `required` or `aria-required=\"true\"` attribute.\n * @example\n * <input data-testid=\"required-input\" required />\n * <div\n * data-testid=\"supported-role\"\n * role=\"tree\"\n * required />\n *\n * expect(getByTestId('required-input')).toBeRequired()\n * expect(getByTestId('supported-role')).not.toBeRequired()\n * @see\n * [testing-library/jest-dom#toberequired](https://github.com/testing-library/jest-dom#toberequired)\n */\n toBeRequired(): R;\n /**\n * @description\n * Allows you to check if a form element is currently required.\n *\n * An `input`, `select`, `textarea`, or `form` element is invalid if it has an `aria-invalid` attribute with no\n * value or a value of \"false\", or if the result of `checkValidity()` is true.\n * @example\n * <input data-testid=\"aria-invalid\" aria-invalid />\n *\n * <form data-testid=\"valid-form\">\n * <input />\n * </form>\n *\n * expect(getByTestId('no-aria-invalid')).not.toBeValid()\n * expect(getByTestId('invalid-form')).toBeInvalid()\n * @see\n * [testing-library/jest-dom#tobevalid](https://github.com/testing-library/jest-dom#tobevalid)\n */\n toBeValid(): R;\n /**\n * @description\n * Allows you to assert whether an element contains another element as a descendant or not.\n * @example\n * <span data-testid=\"ancestor\">\n * <span data-testid=\"descendant\"></span>\n * </span>\n *\n * const ancestor = getByTestId('ancestor')\n * const descendant = getByTestId('descendant')\n * const nonExistantElement = getByTestId('does-not-exist')\n * expect(ancestor).toContainElement(descendant)\n * expect(descendant).not.toContainElement(ancestor)\n * expect(ancestor).not.toContainElement(nonExistantElement)\n * @see\n * [testing-library/jest-dom#tocontainelement](https://github.com/testing-library/jest-dom#tocontainelement)\n */\n toContainElement(element: HTMLElement | SVGElement | null): R;\n /**\n * @description\n * Assert whether a string representing a HTML element is contained in another element.\n * @example\n * <span data-testid=\"parent\"><span data-testid=\"child\"></span></span>\n *\n * expect(getByTestId('parent')).toContainHTML('<span data-testid=\"child\"></span>')\n * @see\n * [testing-library/jest-dom#tocontainhtml](https://github.com/testing-library/jest-dom#tocontainhtml)\n */\n toContainHTML(htmlText: string): R;\n /**\n * @description\n * Allows you to check if a given element has an attribute or not.\n *\n * You can also optionally check that the attribute has a specific expected value or partial match using\n * [expect.stringContaining](https://jestjs.io/docs/en/expect.html#expectnotstringcontainingstring) or\n * [expect.stringMatching](https://jestjs.io/docs/en/expect.html#expectstringmatchingstring-regexp).\n * @example\n * <button\n * data-testid=\"ok-button\"\n * type=\"submit\"\n * disabled\n * >\n * ok\n * </button>\n *\n * expect(button).toHaveAttribute('disabled')\n * expect(button).toHaveAttribute('type', 'submit')\n * expect(button).not.toHaveAttribute('type', 'button')\n * @see\n * [testing-library/jest-dom#tohaveattribute](https://github.com/testing-library/jest-dom#tohaveattribute)\n */\n toHaveAttribute(attr: string, value?: unknown): R;\n /**\n * @description\n * Check whether the given element has certain classes within its `class` attribute.\n *\n * You must provide at least one class, unless you are asserting that an element does not have any classes.\n * @example\n * <button\n * data-testid=\"delete-button\"\n * class=\"btn xs btn-danger\"\n * >\n * delete item\n * </button>\n *\n * <div data-testid=\"no-classes\">no classes</div>\n *\n * const deleteButton = getByTestId('delete-button')\n * const noClasses = getByTestId('no-classes')\n * expect(deleteButton).toHaveClass('btn')\n * expect(deleteButton).toHaveClass('btn-danger xs')\n * expect(deleteButton).toHaveClass('btn xs btn-danger', {exact: true})\n * expect(deleteButton).not.toHaveClass('btn xs btn-danger', {exact: true})\n * expect(noClasses).not.toHaveClass()\n * @see\n * [testing-library/jest-dom#tohaveclass](https://github.com/testing-library/jest-dom#tohaveclass)\n */\n toHaveClass(...classNames: string[]): R;\n toHaveClass(classNames: string, options?: { exact: boolean }): R;\n /**\n * @description\n * This allows you to check whether the given form element has the specified displayed value (the one the\n * end user will see). It accepts <input>, <select> and <textarea> elements with the exception of <input type=\"checkbox\">\n * and <input type=\"radio\">, which can be meaningfully matched only using toBeChecked or toHaveFormValues.\n * @example\n * <label for=\"input-example\">First name</label>\n * <input type=\"text\" id=\"input-example\" value=\"Luca\" />\n *\n * <label for=\"textarea-example\">Description</label>\n * <textarea id=\"textarea-example\">An example description here.</textarea>\n *\n * <label for=\"single-select-example\">Fruit</label>\n * <select id=\"single-select-example\">\n * <option value=\"\">Select a fruit...</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"ananas\">Ananas</option>\n * <option value=\"avocado\">Avocado</option>\n * </select>\n *\n * <label for=\"mutiple-select-example\">Fruits</label>\n * <select id=\"multiple-select-example\" multiple>\n * <option value=\"\">Select a fruit...</option>\n * <option value=\"banana\" selected>Banana</option>\n * <option value=\"ananas\">Ananas</option>\n * <option value=\"avocado\" selected>Avocado</option>\n * </select>\n *\n * const input = screen.getByLabelText('First name')\n * const textarea = screen.getByLabelText('Description')\n * const selectSingle = screen.getByLabelText('Fruit')\n * const selectMultiple = screen.getByLabelText('Fruits')\n *\n * expect(input).toHaveDisplayValue('Luca')\n * expect(textarea).toHaveDisplayValue('An example description here.')\n * expect(selectSingle).toHaveDisplayValue('Select a fruit...')\n * expect(selectMultiple).toHaveDisplayValue(['Banana', 'Avocado'])\n *\n * @see\n * [testing-library/jest-dom#tohavedisplayvalue](https://github.com/testing-library/jest-dom#tohavedisplayvalue)\n */\n toHaveDisplayValue(value: string | RegExp | Array<string | RegExp>): R;\n /**\n * @description\n * Assert whether an element has focus or not.\n * @example\n * <div>\n * <input type=\"text\" data-testid=\"element-to-focus\" />\n * </div>\n *\n * const input = getByTestId('element-to-focus')\n * input.focus()\n * expect(input).toHaveFocus()\n * input.blur()\n * expect(input).not.toHaveFocus()\n * @see\n * [testing-library/jest-dom#tohavefocus](https://github.com/testing-library/jest-dom#tohavefocus)\n */\n toHaveFocus(): R;\n /**\n * @description\n * Check if a form or fieldset contains form controls for each given name, and having the specified value.\n *\n * Can only be invoked on a form or fieldset element.\n * @example\n * <form data-testid=\"login-form\">\n * <input type=\"text\" name=\"username\" value=\"jane.doe\" />\n * <input type=\"password\" name=\"password\" value=\"123\" />\n * <input type=\"checkbox\" name=\"rememberMe\" checked />\n * <button type=\"submit\">Sign in</button>\n * </form>\n *\n * expect(getByTestId('login-form')).toHaveFormValues({\n * username: 'jane.doe',\n * rememberMe: true,\n * })\n * @see\n * [testing-library/jest-dom#tohaveformvalues](https://github.com/testing-library/jest-dom#tohaveformvalues)\n */\n toHaveFormValues(expectedValues: Record<string, unknown>): R;\n /**\n * @description\n * Check if an element has specific css properties with specific values applied.\n *\n * Only matches if the element has *all* the expected properties applied, not just some of them.\n * @example\n * <button\n * data-test-id=\"submit-button\"\n * style=\"background-color: green; display: none\"\n * >\n * submit\n * </button>\n *\n * const button = getByTestId('submit-button')\n * expect(button).toHaveStyle('background-color: green')\n * expect(button).toHaveStyle({\n * 'background-color': 'green',\n * display: 'none'\n * })\n * @see\n * [testing-library/jest-dom#tohavestyle](https://github.com/testing-library/jest-dom#tohavestyle)\n */\n toHaveStyle(css: string | Record<string, unknown>): R;\n /**\n * @description\n * Check whether the given element has a text content or not.\n *\n * When a string argument is passed through, it will perform a partial case-sensitive match to the element\n * content.\n *\n * To perform a case-insensitive match, you can use a RegExp with the `/i` modifier.\n *\n * If you want to match the whole content, you can use a RegExp to do it.\n * @example\n * <span data-testid=\"text-content\">Text Content</span>\n *\n * const element = getByTestId('text-content')\n * expect(element).toHaveTextContent('Content')\n * // to match the whole content\n * expect(element).toHaveTextContent(/^Text Content$/)\n * // to use case-insentive match\n * expect(element).toHaveTextContent(/content$/i)\n * expect(element).not.toHaveTextContent('content')\n * @see\n * [testing-library/jest-dom#tohavetextcontent](https://github.com/testing-library/jest-dom#tohavetextcontent)\n */\n toHaveTextContent(text: string | RegExp, options?: { normalizeWhitespace: boolean }): R;\n /**\n * @description\n * Check whether the given form element has the specified value.\n *\n * Accepts `<input>`, `<select>`, and `<textarea>` elements with the exception of `<input type=\"checkbox\">` and\n * `<input type=\"radiobox\">`, which can be matched only using\n * [toBeChecked](https://github.com/testing-library/jest-dom#tobechecked) or\n * [toHaveFormValues](https://github.com/testing-library/jest-dom#tohaveformvalues).\n * @example\n * <input\n * type=\"number\"\n * value=\"5\"\n * data-testid=\"input-number\" />\n *\n * const numberInput = getByTestId('input-number')\n * expect(numberInput).toHaveValue(5)\n * @see\n * [testing-library/jest-dom#tohavevalue](https://github.com/testing-library/jest-dom#tohavevalue)\n */\n toHaveValue(value?: string | string[] | number | null): R;\n /**\n * @description\n * Assert whether the given element is checked.\n *\n * It accepts an `input` of type `checkbox` or `radio` and elements with a `role` of `radio` with a valid\n * `aria-checked` attribute of \"true\" or \"false\".\n * @example\n * <input\n * type=\"checkbox\"\n * checked\n * data-testid=\"input-checkbox\" />\n * <input\n * type=\"radio\"\n * value=\"foo\"\n * data-testid=\"input-radio\" />\n *\n * const inputCheckbox = getByTestId('input-checkbox')\n * const inputRadio = getByTestId('input-radio')\n * expect(inputCheckbox).toBeChecked()\n * expect(inputRadio).not.toBeChecked()\n * @see\n * [testing-library/jest-dom#tobechecked](https://github.com/testing-library/jest-dom#tobechecked)\n */\n toBeChecked(): R;\n /**\n * @deprecated\n * since v5.14.1\n * @description\n * Check the accessible description for an element.\n * This allows you to check whether the given element has a description or not.\n *\n * An element gets its description via the\n * [`aria-describedby` attribute](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-describedby_attribute).\n * Set this to the `id` of one or more other elements. These elements may be nested\n * inside, be outside, or a sibling of the passed in element.\n *\n * Whitespace is normalized. Using multiple ids will\n * [join the referenced elements’ text content separated by a space](https://www.w3.org/TR/accname-1.1/#mapping_additional_nd_description).\n *\n * When a `string` argument is passed through, it will perform a whole\n * case-sensitive match to the description text.\n *\n * To perform a case-insensitive match, you can use a `RegExp` with the `/i`\n * modifier.\n *\n * To perform a partial match, you can pass a `RegExp` or use\n * `expect.stringContaining(\"partial string\")`.\n *\n * @example\n * <button aria-label=\"Close\" aria-describedby=\"description-close\">\n * X\n * </button>\n * <div id=\"description-close\">\n * Closing will discard any changes\n * </div>\n *\n * <button>Delete</button>\n *\n * const closeButton = getByRole('button', {name: 'Close'})\n *\n * expect(closeButton).toHaveDescription('Closing will discard any changes')\n * expect(closeButton).toHaveDescription(/will discard/) // to partially match\n * expect(closeButton).toHaveDescription(expect.stringContaining('will discard')) // to partially match\n * expect(closeButton).toHaveDescription(/^closing/i) // to use case-insensitive match\n * expect(closeButton).not.toHaveDescription('Other description')\n *\n * const deleteButton = getByRole('button', {name: 'Delete'})\n * expect(deleteButton).not.toHaveDescription()\n * expect(deleteButton).toHaveDescription('') // Missing or empty description always becomes a blank string\n * @see\n * [testing-library/jest-dom#tohavedescription](https://github.com/testing-library/jest-dom#tohavedescription)\n */\n toHaveDescription(text?: string | RegExp | E): R;\n /**\n * @description\n * This allows to assert that an element has the expected [accessible description](https://w3c.github.io/accname/).\n *\n * You can pass the exact string of the expected accessible description, or you can make a\n * partial match passing a regular expression, or by using either\n * [expect.stringContaining](https://jestjs.io/docs/en/expect.html#expectnotstringcontainingstring)\n * or [expect.stringMatching](https://jestjs.io/docs/en/expect.html#expectstringmatchingstring-regexp).\n * @example\n * <a data-testid=\"link\" href=\"/\" aria-label=\"Home page\" title=\"A link to start over\">Start</a>\n * <a data-testid=\"extra-link\" href=\"/about\" aria-label=\"About page\">About</a>\n * <img src=\"avatar.jpg\" data-testid=\"avatar\" alt=\"User profile pic\" />\n * <img src=\"logo.jpg\" data-testid=\"logo\" alt=\"Company logo\" aria-describedby=\"t1\" />\n * <span id=\"t1\" role=\"presentation\">The logo of Our Company</span>\n *\n * expect(getByTestId('link')).toHaveAccessibleDescription()\n * expect(getByTestId('link')).toHaveAccessibleDescription('A link to start over')\n * expect(getByTestId('link')).not.toHaveAccessibleDescription('Home page')\n * expect(getByTestId('extra-link')).not.toHaveAccessibleDescription()\n * expect(getByTestId('avatar')).not.toHaveAccessibleDescription()\n * expect(getByTestId('logo')).not.toHaveAccessibleDescription('Company logo')\n * expect(getByTestId('logo')).toHaveAccessibleDescription('The logo of Our Company')\n * @see\n * [testing-library/jest-dom#tohaveaccessibledescription](https://github.com/testing-library/jest-dom#tohaveaccessibledescription)\n */\n toHaveAccessibleDescription(text?: string | RegExp | E): R;\n /**\n * @description\n * This allows you to assert that an element has the expected\n * [accessible error message](https://w3c.github.io/aria/#aria-errormessage).\n *\n * You can pass the exact string of the expected accessible error message.\n * Alternatively, you can perform a partial match by passing a regular expression\n * or by using either\n * [expect.stringContaining](https://jestjs.io/docs/en/expect.html#expectnotstringcontainingstring)\n * or [expect.stringMatching](https://jestjs.io/docs/en/expect.html#expectstringmatchingstring-regexp).\n *\n * @example\n * <input aria-label=\"Has Error\" aria-invalid=\"true\" aria-errormessage=\"error-message\" />\n * <div id=\"error-message\" role=\"alert\">This field is invalid</div>\n *\n * <input aria-label=\"No Error Attributes\" />\n * <input aria-label=\"Not Invalid\" aria-invalid=\"false\" aria-errormessage=\"error-message\" />\n *\n * // Inputs with Valid Error Messages\n * expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage()\n * expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage('This field is invalid')\n * expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage(/invalid/i)\n * expect(\n * getByRole('textbox', {name: 'Has Error'}),\n * ).not.toHaveAccessibleErrorMessage('This field is absolutely correct!')\n *\n * // Inputs without Valid Error Messages\n * expect(\n * getByRole('textbox', {name: 'No Error Attributes'}),\n * ).not.toHaveAccessibleErrorMessage()\n *\n * expect(\n * getByRole('textbox', {name: 'Not Invalid'}),\n * ).not.toHaveAccessibleErrorMessage()\n *\n * @see\n * [testing-library/jest-dom#tohaveaccessibleerrormessage](https://github.com/testing-library/jest-dom#tohaveaccessibleerrormessage)\n */\n toHaveAccessibleErrorMessage(text?: string | RegExp | E): R;\n /**\n * @description\n * This allows to assert that an element has the expected [accessible name](https://w3c.github.io/accname/).\n * It is useful, for instance, to assert that form elements and buttons are properly labelled.\n *\n * You can pass the exact string of the expected accessible name, or you can make a\n * partial match passing a regular expression, or by using either\n * [expect.stringContaining](https://jestjs.io/docs/en/expect.html#expectnotstringcontainingstring)\n * or [expect.stringMatching](https://jestjs.io/docs/en/expect.html#expectstringmatchingstring-regexp).\n * @example\n * <img data-testid=\"img-alt\" src=\"\" alt=\"Test alt\" />\n * <img data-testid=\"img-empty-alt\" src=\"\" alt=\"\" />\n * <svg data-testid=\"svg-title\"><title>Test title</title></svg>\n * <button data-testid=\"button-img-alt\"><img src=\"\" alt=\"Test\" /></button>\n * <p><img data-testid=\"img-paragraph\" src=\"\" alt=\"\" /> Test content</p>\n * <button data-testid=\"svg-button\"><svg><title>Test</title></svg></p>\n * <div><svg data-testid=\"svg-without-title\"></svg></div>\n * <input data-testid=\"input-title\" title=\"test\" />\n *\n * expect(getByTestId('img-alt')).toHaveAccessibleName('Test alt')\n * expect(getByTestId('img-empty-alt')).not.toHaveAccessibleName()\n * expect(getByTestId('svg-title')).toHaveAccessibleName('Test title')\n * expect(getByTestId('button-img-alt')).toHaveAccessibleName()\n * expect(getByTestId('img-paragraph')).not.toHaveAccessibleName()\n * expect(getByTestId('svg-button')).toHaveAccessibleName()\n * expect(getByTestId('svg-without-title')).not.toHaveAccessibleName()\n * expect(getByTestId('input-title')).toHaveAccessibleName()\n * @see\n * [testing-library/jest-dom#tohaveaccessiblename](https://github.com/testing-library/jest-dom#tohaveaccessiblename)\n */\n toHaveAccessibleName(text?: string | RegExp | E): R;\n /**\n * @description\n * This allows you to check whether the given element is partially checked.\n * It accepts an input of type checkbox and elements with a role of checkbox\n * with a aria-checked=\"mixed\", or input of type checkbox with indeterminate\n * set to true\n *\n * @example\n * <input type=\"checkbox\" aria-checked=\"mixed\" data-testid=\"aria-checkbox-mixed\" />\n * <input type=\"checkbox\" checked data-testid=\"input-checkbox-checked\" />\n * <input type=\"checkbox\" data-testid=\"input-checkbox-unchecked\" />\n * <div role=\"checkbox\" aria-checked=\"true\" data-testid=\"aria-checkbox-checked\" />\n * <div\n * role=\"checkbox\"\n * aria-checked=\"false\"\n * data-testid=\"aria-checkbox-unchecked\"\n * />\n * <input type=\"checkbox\" data-testid=\"input-checkbox-indeterminate\" />\n *\n * const ariaCheckboxMixed = getByTestId('aria-checkbox-mixed')\n * const inputCheckboxChecked = getByTestId('input-checkbox-checked')\n * const inputCheckboxUnchecked = getByTestId('input-checkbox-unchecked')\n * const ariaCheckboxChecked = getByTestId('aria-checkbox-checked')\n * const ariaCheckboxUnchecked = getByTestId('aria-checkbox-unchecked')\n * const inputCheckboxIndeterminate = getByTestId('input-checkbox-indeterminate')\n *\n * expect(ariaCheckboxMixed).toBePartiallyChecked()\n * expect(inputCheckboxChecked).not.toBePartiallyChecked()\n * expect(inputCheckboxUnchecked).not.toBePartiallyChecked()\n * expect(ariaCheckboxChecked).not.toBePartiallyChecked()\n * expect(ariaCheckboxUnchecked).not.toBePartiallyChecked()\n *\n * inputCheckboxIndeterminate.indeterminate = true\n * expect(inputCheckboxIndeterminate).toBePartiallyChecked()\n * @see\n * [testing-library/jest-dom#tobepartiallychecked](https://github.com/testing-library/jest-dom#tobepartiallychecked)\n */\n toBePartiallyChecked(): R;\n /**\n * @description\n *\n * Check whether the given element has an [ARIA error message](https://www.w3.org/TR/wai-aria/#aria-errormessage) or not.\n *\n * Use the `aria-errormessage` attribute to reference another element that contains\n * custom error message text. Multiple ids is **NOT** allowed. Authors MUST use\n * `aria-invalid` in conjunction with `aria-errormessage`. Learn more from the\n * [`aria-errormessage` spec](https://www.w3.org/TR/wai-aria/#aria-errormessage).\n *\n * Whitespace is normalized.\n *\n * When a `string` argument is passed through, it will perform a whole\n * case-sensitive match to the error message text.\n *\n * To perform a case-insensitive match, you can use a `RegExp` with the `/i`\n * modifier.\n *\n * To perform a partial match, you can pass a `RegExp` or use\n * expect.stringContaining(\"partial string\")`.\n *\n * @example\n * <label for=\"startTime\"> Please enter a start time for the meeting: </label>\n * <input id=\"startTime\" type=\"text\" aria-errormessage=\"msgID\" aria-invalid=\"true\" value=\"11:30 PM\" />\n * <span id=\"msgID\" aria-live=\"assertive\" style=\"visibility:visible\">\n * Invalid time: the time must be between 9:00 AM and 5:00 PM\"\n * </span>\n *\n *\n * const timeInput = getByLabel('startTime')\n *\n * expect(timeInput).toHaveErrorMessage(\n * 'Invalid time: the time must be between 9:00 AM and 5:00 PM',\n * )\n * expect(timeInput).toHaveErrorMessage(/invalid time/i) // to partially match\n * expect(timeInput).toHaveErrorMessage(expect.stringContaining('Invalid time')) // to partially match\n * expect(timeInput).not.toHaveErrorMessage('Pikachu!')\n * @see\n * [testing-library/jest-dom#tohaveerrormessage](https://github.com/testing-library/jest-dom#tohaveerrormessage)\n */\n toHaveErrorMessage(text?: string | RegExp | E): R;\n}\n"],"mappings":"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","names":["rules","m","require","FORM_TAGS","FORM_TAGS","display","isSubset","isEqualWith","isEqualWith"]}
|