• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1{
2  "type": "module",
3  "source": "doc/api/assert.md",
4  "modules": [
5    {
6      "textRaw": "Assert",
7      "name": "assert",
8      "introduced_in": "v0.1.21",
9      "stability": 2,
10      "stabilityText": "Stable",
11      "desc": "<p><strong>Source Code:</strong> <a href=\"https://github.com/nodejs/node/blob/v14.20.1/lib/assert.js\">lib/assert.js</a></p>\n<p>The <code>assert</code> module provides a set of assertion functions for verifying\ninvariants.</p>",
12      "modules": [
13        {
14          "textRaw": "Strict assertion mode",
15          "name": "strict_assertion_mode",
16          "meta": {
17            "added": [
18              "v9.9.0"
19            ],
20            "changes": [
21              {
22                "version": [
23                  "v13.9.0",
24                  "v12.16.2"
25                ],
26                "pr-url": "https://github.com/nodejs/node/pull/31635",
27                "description": "Changed \"strict mode\" to \"strict assertion mode\" and \"legacy mode\" to \"legacy assertion mode\" to avoid confusion with the more usual meaning of \"strict mode\"."
28              },
29              {
30                "version": "v9.9.0",
31                "pr-url": "https://github.com/nodejs/node/pull/17615",
32                "description": "Added error diffs to the strict assertion mode."
33              },
34              {
35                "version": "v9.9.0",
36                "pr-url": "https://github.com/nodejs/node/pull/17002",
37                "description": "Added strict assertion mode to the assert module."
38              }
39            ]
40          },
41          "desc": "<p>In strict assertion mode, non-strict methods behave like their corresponding\nstrict methods. For example, <a href=\"#assert_assert_deepequal_actual_expected_message\"><code>assert.deepEqual()</code></a> will behave like\n<a href=\"#assert_assert_deepstrictequal_actual_expected_message\"><code>assert.deepStrictEqual()</code></a>.</p>\n<p>In strict assertion mode, error messages for objects display a diff. In legacy\nassertion mode, error messages for objects display the objects, often truncated.</p>\n<p>To use strict assertion mode:</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n</code></pre>\n<p>Example error diff:</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]);\n// AssertionError: Expected inputs to be strictly deep-equal:\n// + actual - expected ... Lines skipped\n//\n//   [\n//     [\n// ...\n//       2,\n// +     3\n// -     '3'\n//     ],\n// ...\n//     5\n//   ]\n</code></pre>\n<p>To deactivate the colors, use the <code>NO_COLOR</code> or <code>NODE_DISABLE_COLORS</code>\nenvironment variables. This will also deactivate the colors in the REPL. For\nmore on color support in terminal environments, read the tty\n<a href=\"tty.html#tty_writestream_getcolordepth_env\">getColorDepth()</a> documentation.</p>",
42          "type": "module",
43          "displayName": "Strict assertion mode"
44        },
45        {
46          "textRaw": "Legacy assertion mode",
47          "name": "legacy_assertion_mode",
48          "desc": "<p>Legacy assertion mode uses the <a href=\"https://tc39.github.io/ecma262/#sec-abstract-equality-comparison\">Abstract Equality Comparison</a> in:</p>\n<ul>\n<li><a href=\"#assert_assert_deepequal_actual_expected_message\"><code>assert.deepEqual()</code></a></li>\n<li><a href=\"#assert_assert_equal_actual_expected_message\"><code>assert.equal()</code></a></li>\n<li><a href=\"#assert_assert_notdeepequal_actual_expected_message\"><code>assert.notDeepEqual()</code></a></li>\n<li><a href=\"#assert_assert_notequal_actual_expected_message\"><code>assert.notEqual()</code></a></li>\n</ul>\n<p>To use legacy assertion mode:</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n</code></pre>\n<p>Whenever possible, use the <a href=\"#assert_strict_assertion_mode\">strict assertion mode</a> instead. Otherwise, the\n<a href=\"https://tc39.github.io/ecma262/#sec-abstract-equality-comparison\">Abstract Equality Comparison</a> may cause surprising results. This is\nespecially true for <a href=\"#assert_assert_deepequal_actual_expected_message\"><code>assert.deepEqual()</code></a>, where the comparison rules are\nlax:</p>\n<pre><code class=\"language-js\">// WARNING: This does not throw an AssertionError!\nassert.deepEqual(/a/gi, new Date());\n</code></pre>",
49          "type": "module",
50          "displayName": "Legacy assertion mode"
51        }
52      ],
53      "classes": [
54        {
55          "textRaw": "Class: assert.AssertionError",
56          "type": "class",
57          "name": "assert.AssertionError",
58          "desc": "<ul>\n<li>Extends: <a href=\"errors.html#errors_class_error\" class=\"type\">&lt;errors.Error&gt;</a></li>\n</ul>\n<p>Indicates the failure of an assertion. All errors thrown by the <code>assert</code> module\nwill be instances of the <code>AssertionError</code> class.</p>",
59          "signatures": [
60            {
61              "params": [
62                {
63                  "textRaw": "`options` {Object}",
64                  "name": "options",
65                  "type": "Object",
66                  "options": [
67                    {
68                      "textRaw": "`message` {string} If provided, the error message is set to this value.",
69                      "name": "message",
70                      "type": "string",
71                      "desc": "If provided, the error message is set to this value."
72                    },
73                    {
74                      "textRaw": "`actual` {any} The `actual` property on the error instance.",
75                      "name": "actual",
76                      "type": "any",
77                      "desc": "The `actual` property on the error instance."
78                    },
79                    {
80                      "textRaw": "`expected` {any} The `expected` property on the error instance.",
81                      "name": "expected",
82                      "type": "any",
83                      "desc": "The `expected` property on the error instance."
84                    },
85                    {
86                      "textRaw": "`operator` {string} The `operator` property on the error instance.",
87                      "name": "operator",
88                      "type": "string",
89                      "desc": "The `operator` property on the error instance."
90                    },
91                    {
92                      "textRaw": "`stackStartFn` {Function} If provided, the generated stack trace omits frames before this function.",
93                      "name": "stackStartFn",
94                      "type": "Function",
95                      "desc": "If provided, the generated stack trace omits frames before this function."
96                    }
97                  ]
98                }
99              ],
100              "desc": "<p>A subclass of <code>Error</code> that indicates the failure of an assertion.</p>\n<p>All instances contain the built-in <code>Error</code> properties (<code>message</code> and <code>name</code>)\nand:</p>\n<ul>\n<li><code>actual</code> <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Data_types\" class=\"type\">&lt;any&gt;</a> Set to the <code>actual</code> argument for methods such as\n<a href=\"#assert_assert_strictequal_actual_expected_message\"><code>assert.strictEqual()</code></a>.</li>\n<li><code>expected</code> <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Data_types\" class=\"type\">&lt;any&gt;</a> Set to the <code>expected</code> value for methods such as\n<a href=\"#assert_assert_strictequal_actual_expected_message\"><code>assert.strictEqual()</code></a>.</li>\n<li><code>generatedMessage</code> <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type\" class=\"type\">&lt;boolean&gt;</a> Indicates if the message was auto-generated\n(<code>true</code>) or not.</li>\n<li><code>code</code> <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\" class=\"type\">&lt;string&gt;</a> Value is always <code>ERR_ASSERTION</code> to show that the error is an\nassertion error.</li>\n<li><code>operator</code> <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type\" class=\"type\">&lt;string&gt;</a> Set to the passed in operator value.</li>\n</ul>\n<pre><code class=\"language-js\">const assert = require('assert');\n\n// Generate an AssertionError to compare the error message later:\nconst { message } = new assert.AssertionError({\n  actual: 1,\n  expected: 2,\n  operator: 'strictEqual'\n});\n\n// Verify error output:\ntry {\n  assert.strictEqual(1, 2);\n} catch (err) {\n  assert(err instanceof assert.AssertionError);\n  assert.strictEqual(err.message, message);\n  assert.strictEqual(err.name, 'AssertionError');\n  assert.strictEqual(err.actual, 1);\n  assert.strictEqual(err.expected, 2);\n  assert.strictEqual(err.code, 'ERR_ASSERTION');\n  assert.strictEqual(err.operator, 'strictEqual');\n  assert.strictEqual(err.generatedMessage, true);\n}\n</code></pre>"
101            }
102          ]
103        },
104        {
105          "textRaw": "Class: `assert.CallTracker`",
106          "type": "class",
107          "name": "assert.CallTracker",
108          "meta": {
109            "added": [
110              "v14.2.0"
111            ],
112            "changes": []
113          },
114          "stability": 1,
115          "stabilityText": "Experimental",
116          "desc": "<p>This feature is currently experimental and behavior might still change.</p>",
117          "methods": [
118            {
119              "textRaw": "`tracker.calls([fn][, exact])`",
120              "type": "method",
121              "name": "calls",
122              "meta": {
123                "added": [
124                  "v14.2.0"
125                ],
126                "changes": []
127              },
128              "signatures": [
129                {
130                  "return": {
131                    "textRaw": "Returns: {Function} that wraps `fn`.",
132                    "name": "return",
133                    "type": "Function",
134                    "desc": "that wraps `fn`."
135                  },
136                  "params": [
137                    {
138                      "textRaw": "`fn` {Function} **Default** A no-op function.",
139                      "name": "fn",
140                      "type": "Function",
141                      "desc": "**Default** A no-op function."
142                    },
143                    {
144                      "textRaw": "`exact` {number} **Default** `1`.",
145                      "name": "exact",
146                      "type": "number",
147                      "desc": "**Default** `1`."
148                    }
149                  ]
150                }
151              ],
152              "desc": "<p>The wrapper function is expected to be called exactly <code>exact</code> times. If the\nfunction has not been called exactly <code>exact</code> times when\n<a href=\"#assert_tracker_verify\"><code>tracker.verify()</code></a> is called, then <a href=\"#assert_tracker_verify\"><code>tracker.verify()</code></a> will throw an\nerror.</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n\n// Creates call tracker.\nconst tracker = new assert.CallTracker();\n\nfunction func() {}\n\n// Returns a function that wraps func() that must be called exact times\n// before tracker.verify().\nconst callsfunc = tracker.calls(func);\n</code></pre>"
153            },
154            {
155              "textRaw": "`tracker.report()`",
156              "type": "method",
157              "name": "report",
158              "meta": {
159                "added": [
160                  "v14.2.0"
161                ],
162                "changes": []
163              },
164              "signatures": [
165                {
166                  "return": {
167                    "textRaw": "Returns: {Array} of objects containing information about the wrapper functions returned by [`tracker.calls()`][].",
168                    "name": "return",
169                    "type": "Array",
170                    "desc": "of objects containing information about the wrapper functions returned by [`tracker.calls()`][]."
171                  },
172                  "params": [
173                    {
174                      "textRaw": "Object {Object}",
175                      "name": "Object",
176                      "type": "Object",
177                      "options": [
178                        {
179                          "textRaw": "`message` {string}",
180                          "name": "message",
181                          "type": "string"
182                        },
183                        {
184                          "textRaw": "`actual` {number} The actual number of times the function was called.",
185                          "name": "actual",
186                          "type": "number",
187                          "desc": "The actual number of times the function was called."
188                        },
189                        {
190                          "textRaw": "`expected` {number} The number of times the function was expected to be called.",
191                          "name": "expected",
192                          "type": "number",
193                          "desc": "The number of times the function was expected to be called."
194                        },
195                        {
196                          "textRaw": "`operator` {string} The name of the function that is wrapped.",
197                          "name": "operator",
198                          "type": "string",
199                          "desc": "The name of the function that is wrapped."
200                        },
201                        {
202                          "textRaw": "`stack` {Object} A stack trace of the function.",
203                          "name": "stack",
204                          "type": "Object",
205                          "desc": "A stack trace of the function."
206                        }
207                      ]
208                    }
209                  ]
210                }
211              ],
212              "desc": "<p>The arrays contains information about the expected and actual number of calls of\nthe functions that have not been called the expected number of times.</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n\n// Creates call tracker.\nconst tracker = new assert.CallTracker();\n\nfunction func() {}\n\nfunction foo() {}\n\n// Returns a function that wraps func() that must be called exact times\n// before tracker.verify().\nconst callsfunc = tracker.calls(func, 2);\n\n// Returns an array containing information on callsfunc()\ntracker.report();\n// [\n//  {\n//    message: 'Expected the func function to be executed 2 time(s) but was\n//    executed 0 time(s).',\n//    actual: 0,\n//    expected: 2,\n//    operator: 'func',\n//    stack: stack trace\n//  }\n// ]\n</code></pre>"
213            },
214            {
215              "textRaw": "`tracker.verify()`",
216              "type": "method",
217              "name": "verify",
218              "meta": {
219                "added": [
220                  "v14.2.0"
221                ],
222                "changes": []
223              },
224              "signatures": [
225                {
226                  "params": []
227                }
228              ],
229              "desc": "<p>Iterates through the list of functions passed to\n<a href=\"#assert_tracker_calls_fn_exact\"><code>tracker.calls()</code></a> and will throw an error for functions that\nhave not been called the expected number of times.</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n\n// Creates call tracker.\nconst tracker = new assert.CallTracker();\n\nfunction func() {}\n\n// Returns a function that wraps func() that must be called exact times\n// before tracker.verify().\nconst callsfunc = tracker.calls(func, 2);\n\ncallsfunc();\n\n// Will throw an error since callsfunc() was only called once.\ntracker.verify();\n</code></pre>"
230            }
231          ],
232          "signatures": [
233            {
234              "params": [],
235              "desc": "<p>Creates a new <a href=\"#assert_class_assert_calltracker\"><code>CallTracker</code></a> object which can be used to track if functions\nwere called a specific number of times. The <code>tracker.verify()</code> must be called\nfor the verification to take place. The usual pattern would be to call it in a\n<a href=\"process.html#process_event_exit\"><code>process.on('exit')</code></a> handler.</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n\nconst tracker = new assert.CallTracker();\n\nfunction func() {}\n\n// callsfunc() must be called exactly 1 time before tracker.verify().\nconst callsfunc = tracker.calls(func, 1);\n\ncallsfunc();\n\n// Calls tracker.verify() and verifies if all tracker.calls() functions have\n// been called exact times.\nprocess.on('exit', () => {\n  tracker.verify();\n});\n</code></pre>"
236            }
237          ]
238        }
239      ],
240      "methods": [
241        {
242          "textRaw": "`assert(value[, message])`",
243          "type": "method",
244          "name": "assert",
245          "meta": {
246            "added": [
247              "v0.5.9"
248            ],
249            "changes": []
250          },
251          "signatures": [
252            {
253              "params": [
254                {
255                  "textRaw": "`value` {any} The input that is checked for being truthy.",
256                  "name": "value",
257                  "type": "any",
258                  "desc": "The input that is checked for being truthy."
259                },
260                {
261                  "textRaw": "`message` {string|Error}",
262                  "name": "message",
263                  "type": "string|Error"
264                }
265              ]
266            }
267          ],
268          "desc": "<p>An alias of <a href=\"#assert_assert_ok_value_message\"><code>assert.ok()</code></a>.</p>"
269        },
270        {
271          "textRaw": "`assert.deepEqual(actual, expected[, message])`",
272          "type": "method",
273          "name": "deepEqual",
274          "meta": {
275            "added": [
276              "v0.1.21"
277            ],
278            "changes": [
279              {
280                "version": "v14.18.0",
281                "pr-url": "https://github.com/nodejs/node/pull/38113",
282                "description": "In Legacy assertion mode, changed status from Deprecated to Legacy."
283              },
284              {
285                "version": "v14.0.0",
286                "pr-url": "https://github.com/nodejs/node/pull/30766",
287                "description": "NaN is now treated as being identical in case both sides are NaN."
288              },
289              {
290                "version": "v12.0.0",
291                "pr-url": "https://github.com/nodejs/node/pull/25008",
292                "description": "The type tags are now properly compared and there are a couple minor comparison adjustments to make the check less surprising."
293              },
294              {
295                "version": "v9.0.0",
296                "pr-url": "https://github.com/nodejs/node/pull/15001",
297                "description": "The `Error` names and messages are now properly compared."
298              },
299              {
300                "version": "v8.0.0",
301                "pr-url": "https://github.com/nodejs/node/pull/12142",
302                "description": "The `Set` and `Map` content is also compared."
303              },
304              {
305                "version": [
306                  "v6.4.0",
307                  "v4.7.1"
308                ],
309                "pr-url": "https://github.com/nodejs/node/pull/8002",
310                "description": "Typed array slices are handled correctly now."
311              },
312              {
313                "version": [
314                  "v6.1.0",
315                  "v4.5.0"
316                ],
317                "pr-url": "https://github.com/nodejs/node/pull/6432",
318                "description": "Objects with circular references can be used as inputs now."
319              },
320              {
321                "version": [
322                  "v5.10.1",
323                  "v4.4.3"
324                ],
325                "pr-url": "https://github.com/nodejs/node/pull/5910",
326                "description": "Handle non-`Uint8Array` typed arrays correctly."
327              }
328            ]
329          },
330          "signatures": [
331            {
332              "params": [
333                {
334                  "textRaw": "`actual` {any}",
335                  "name": "actual",
336                  "type": "any"
337                },
338                {
339                  "textRaw": "`expected` {any}",
340                  "name": "expected",
341                  "type": "any"
342                },
343                {
344                  "textRaw": "`message` {string|Error}",
345                  "name": "message",
346                  "type": "string|Error"
347                }
348              ]
349            }
350          ],
351          "desc": "<p><strong>Strict assertion mode</strong></p>\n<p>An alias of <a href=\"#assert_assert_deepstrictequal_actual_expected_message\"><code>assert.deepStrictEqual()</code></a>.</p>\n<p><strong>Legacy assertion mode</strong></p>\n<blockquote>\n<p>Stability: 3 - Legacy: Use <a href=\"#assert_assert_deepstrictequal_actual_expected_message\"><code>assert.deepStrictEqual()</code></a> instead.</p>\n</blockquote>\n<p>Tests for deep equality between the <code>actual</code> and <code>expected</code> parameters. Consider\nusing <a href=\"#assert_assert_deepstrictequal_actual_expected_message\"><code>assert.deepStrictEqual()</code></a> instead. <a href=\"#assert_assert_deepequal_actual_expected_message\"><code>assert.deepEqual()</code></a> can have\nsurprising results.</p>\n<p><em>Deep equality</em> means that the enumerable \"own\" properties of child objects\nare also recursively evaluated by the following rules.</p>",
352          "modules": [
353            {
354              "textRaw": "Comparison details",
355              "name": "comparison_details",
356              "desc": "<ul>\n<li>Primitive values are compared with the <a href=\"https://tc39.github.io/ecma262/#sec-abstract-equality-comparison\">Abstract Equality Comparison</a>\n( <code>==</code> ) with the exception of <code>NaN</code>. It is treated as being identical in case\nboth sides are <code>NaN</code>.</li>\n<li><a href=\"https://tc39.github.io/ecma262/#sec-object.prototype.tostring\">Type tags</a> of objects should be the same.</li>\n<li>Only <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties\">enumerable \"own\" properties</a> are considered.</li>\n<li><a href=\"errors.html#errors_class_error\"><code>Error</code></a> names and messages are always compared, even if these are not\nenumerable properties.</li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Glossary/Primitive#Primitive_wrapper_objects_in_JavaScript\">Object wrappers</a> are compared both as objects and unwrapped values.</li>\n<li><code>Object</code> properties are compared unordered.</li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\"><code>Map</code></a> keys and <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\"><code>Set</code></a> items are compared unordered.</li>\n<li>Recursion stops when both sides differ or both sides encounter a circular\nreference.</li>\n<li>Implementation does not test the <a href=\"https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots\"><code>[[Prototype]]</code></a> of\nobjects.</li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\"><code>Symbol</code></a> properties are not compared.</li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap\"><code>WeakMap</code></a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet\"><code>WeakSet</code></a> comparison does not rely on their values.</li>\n</ul>\n<p>The following example does not throw an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> because the\nprimitives are considered equal by the <a href=\"https://tc39.github.io/ecma262/#sec-abstract-equality-comparison\">Abstract Equality Comparison</a>\n( <code>==</code> ).</p>\n<pre><code class=\"language-js\">// WARNING: This does not throw an AssertionError!\nassert.deepEqual('+00000000', false);\n</code></pre>\n<p>\"Deep\" equality means that the enumerable \"own\" properties of child objects\nare evaluated also:</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n\nconst obj1 = {\n  a: {\n    b: 1\n  }\n};\nconst obj2 = {\n  a: {\n    b: 2\n  }\n};\nconst obj3 = {\n  a: {\n    b: 1\n  }\n};\nconst obj4 = Object.create(obj1);\n\nassert.deepEqual(obj1, obj1);\n// OK\n\n// Values of b are different:\nassert.deepEqual(obj1, obj2);\n// AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }\n\nassert.deepEqual(obj1, obj3);\n// OK\n\n// Prototypes are ignored:\nassert.deepEqual(obj1, obj4);\n// AssertionError: { a: { b: 1 } } deepEqual {}\n</code></pre>\n<p>If the values are not equal, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a <code>message</code>\nproperty set equal to the value of the <code>message</code> parameter. If the <code>message</code>\nparameter is undefined, a default error message is assigned. If the <code>message</code>\nparameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown instead of the\n<a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>.</p>",
357              "type": "module",
358              "displayName": "Comparison details"
359            }
360          ]
361        },
362        {
363          "textRaw": "`assert.deepStrictEqual(actual, expected[, message])`",
364          "type": "method",
365          "name": "deepStrictEqual",
366          "meta": {
367            "added": [
368              "v1.2.0"
369            ],
370            "changes": [
371              {
372                "version": "v9.0.0",
373                "pr-url": "https://github.com/nodejs/node/pull/15169",
374                "description": "Enumerable symbol properties are now compared."
375              },
376              {
377                "version": "v9.0.0",
378                "pr-url": "https://github.com/nodejs/node/pull/15036",
379                "description": "The `NaN` is now compared using the [SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero) comparison."
380              },
381              {
382                "version": "v8.5.0",
383                "pr-url": "https://github.com/nodejs/node/pull/15001",
384                "description": "The `Error` names and messages are now properly compared."
385              },
386              {
387                "version": "v8.0.0",
388                "pr-url": "https://github.com/nodejs/node/pull/12142",
389                "description": "The `Set` and `Map` content is also compared."
390              },
391              {
392                "version": [
393                  "v6.4.0",
394                  "v4.7.1"
395                ],
396                "pr-url": "https://github.com/nodejs/node/pull/8002",
397                "description": "Typed array slices are handled correctly now."
398              },
399              {
400                "version": "v6.1.0",
401                "pr-url": "https://github.com/nodejs/node/pull/6432",
402                "description": "Objects with circular references can be used as inputs now."
403              },
404              {
405                "version": [
406                  "v5.10.1",
407                  "v4.4.3"
408                ],
409                "pr-url": "https://github.com/nodejs/node/pull/5910",
410                "description": "Handle non-`Uint8Array` typed arrays correctly."
411              }
412            ]
413          },
414          "signatures": [
415            {
416              "params": [
417                {
418                  "textRaw": "`actual` {any}",
419                  "name": "actual",
420                  "type": "any"
421                },
422                {
423                  "textRaw": "`expected` {any}",
424                  "name": "expected",
425                  "type": "any"
426                },
427                {
428                  "textRaw": "`message` {string|Error}",
429                  "name": "message",
430                  "type": "string|Error"
431                }
432              ]
433            }
434          ],
435          "desc": "<p>Tests for deep equality between the <code>actual</code> and <code>expected</code> parameters.\n\"Deep\" equality means that the enumerable \"own\" properties of child objects\nare recursively evaluated also by the following rules.</p>",
436          "modules": [
437            {
438              "textRaw": "Comparison details",
439              "name": "comparison_details",
440              "desc": "<ul>\n<li>Primitive values are compared using the <a href=\"https://tc39.github.io/ecma262/#sec-samevalue\">SameValue Comparison</a>, used by\n<a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\"><code>Object.is()</code></a>.</li>\n<li><a href=\"https://tc39.github.io/ecma262/#sec-object.prototype.tostring\">Type tags</a> of objects should be the same.</li>\n<li><a href=\"https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots\"><code>[[Prototype]]</code></a> of objects are compared using\nthe <a href=\"https://tc39.github.io/ecma262/#sec-strict-equality-comparison\">Strict Equality Comparison</a>.</li>\n<li>Only <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties\">enumerable \"own\" properties</a> are considered.</li>\n<li><a href=\"errors.html#errors_class_error\"><code>Error</code></a> names and messages are always compared, even if these are not\nenumerable properties.</li>\n<li>Enumerable own <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol\"><code>Symbol</code></a> properties are compared as well.</li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Glossary/Primitive#Primitive_wrapper_objects_in_JavaScript\">Object wrappers</a> are compared both as objects and unwrapped values.</li>\n<li><code>Object</code> properties are compared unordered.</li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\"><code>Map</code></a> keys and <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\"><code>Set</code></a> items are compared unordered.</li>\n<li>Recursion stops when both sides differ or both sides encounter a circular\nreference.</li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap\"><code>WeakMap</code></a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet\"><code>WeakSet</code></a> comparison does not rely on their values. See\nbelow for further details.</li>\n</ul>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\n// This fails because 1 !== '1'.\nassert.deepStrictEqual({ a: 1 }, { a: '1' });\n// AssertionError: Expected inputs to be strictly deep-equal:\n// + actual - expected\n//\n//   {\n// +   a: 1\n// -   a: '1'\n//   }\n\n// The following objects don't have own properties\nconst date = new Date();\nconst object = {};\nconst fakeDate = {};\nObject.setPrototypeOf(fakeDate, Date.prototype);\n\n// Different [[Prototype]]:\nassert.deepStrictEqual(object, fakeDate);\n// AssertionError: Expected inputs to be strictly deep-equal:\n// + actual - expected\n//\n// + {}\n// - Date {}\n\n// Different type tags:\nassert.deepStrictEqual(date, fakeDate);\n// AssertionError: Expected inputs to be strictly deep-equal:\n// + actual - expected\n//\n// + 2018-04-26T00:49:08.604Z\n// - Date {}\n\nassert.deepStrictEqual(NaN, NaN);\n// OK, because of the SameValue comparison\n\n// Different unwrapped numbers:\nassert.deepStrictEqual(new Number(1), new Number(2));\n// AssertionError: Expected inputs to be strictly deep-equal:\n// + actual - expected\n//\n// + [Number: 1]\n// - [Number: 2]\n\nassert.deepStrictEqual(new String('foo'), Object('foo'));\n// OK because the object and the string are identical when unwrapped.\n\nassert.deepStrictEqual(-0, -0);\n// OK\n\n// Different zeros using the SameValue Comparison:\nassert.deepStrictEqual(0, -0);\n// AssertionError: Expected inputs to be strictly deep-equal:\n// + actual - expected\n//\n// + 0\n// - -0\n\nconst symbol1 = Symbol();\nconst symbol2 = Symbol();\nassert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 });\n// OK, because it is the same symbol on both objects.\n\nassert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 });\n// AssertionError [ERR_ASSERTION]: Inputs identical but not reference equal:\n//\n// {\n//   [Symbol()]: 1\n// }\n\nconst weakMap1 = new WeakMap();\nconst weakMap2 = new WeakMap([[{}, {}]]);\nconst weakMap3 = new WeakMap();\nweakMap3.unequal = true;\n\nassert.deepStrictEqual(weakMap1, weakMap2);\n// OK, because it is impossible to compare the entries\n\n// Fails because weakMap3 has a property that weakMap1 does not contain:\nassert.deepStrictEqual(weakMap1, weakMap3);\n// AssertionError: Expected inputs to be strictly deep-equal:\n// + actual - expected\n//\n//   WeakMap {\n// +   [items unknown]\n// -   [items unknown],\n// -   unequal: true\n//   }\n</code></pre>\n<p>If the values are not equal, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a <code>message</code>\nproperty set equal to the value of the <code>message</code> parameter. If the <code>message</code>\nparameter is undefined, a default error message is assigned. If the <code>message</code>\nparameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown instead of the\n<code>AssertionError</code>.</p>",
441              "type": "module",
442              "displayName": "Comparison details"
443            }
444          ]
445        },
446        {
447          "textRaw": "`assert.doesNotMatch(string, regexp[, message])`",
448          "type": "method",
449          "name": "doesNotMatch",
450          "meta": {
451            "added": [
452              "v13.6.0",
453              "v12.16.0"
454            ],
455            "changes": []
456          },
457          "stability": 1,
458          "stabilityText": "Experimental",
459          "signatures": [
460            {
461              "params": [
462                {
463                  "textRaw": "`string` {string}",
464                  "name": "string",
465                  "type": "string"
466                },
467                {
468                  "textRaw": "`regexp` {RegExp}",
469                  "name": "regexp",
470                  "type": "RegExp"
471                },
472                {
473                  "textRaw": "`message` {string|Error}",
474                  "name": "message",
475                  "type": "string|Error"
476                }
477              ]
478            }
479          ],
480          "desc": "<p>Expects the <code>string</code> input not to match the regular expression.</p>\n<p>This feature is currently experimental and the name might change or it might be\ncompletely removed again.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.doesNotMatch('I will fail', /fail/);\n// AssertionError [ERR_ASSERTION]: The input was expected to not match the ...\n\nassert.doesNotMatch(123, /pass/);\n// AssertionError [ERR_ASSERTION]: The \"string\" argument must be of type string.\n\nassert.doesNotMatch('I will pass', /different/);\n// OK\n</code></pre>\n<p>If the values do match, or if the <code>string</code> argument is of another type than\n<code>string</code>, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a <code>message</code> property set equal\nto the value of the <code>message</code> parameter. If the <code>message</code> parameter is\nundefined, a default error message is assigned. If the <code>message</code> parameter is an\ninstance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown instead of the\n<a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>.</p>"
481        },
482        {
483          "textRaw": "`assert.doesNotReject(asyncFn[, error][, message])`",
484          "type": "method",
485          "name": "doesNotReject",
486          "meta": {
487            "added": [
488              "v10.0.0"
489            ],
490            "changes": []
491          },
492          "signatures": [
493            {
494              "params": [
495                {
496                  "textRaw": "`asyncFn` {Function|Promise}",
497                  "name": "asyncFn",
498                  "type": "Function|Promise"
499                },
500                {
501                  "textRaw": "`error` {RegExp|Function}",
502                  "name": "error",
503                  "type": "RegExp|Function"
504                },
505                {
506                  "textRaw": "`message` {string}",
507                  "name": "message",
508                  "type": "string"
509                }
510              ]
511            }
512          ],
513          "desc": "<p>Awaits the <code>asyncFn</code> promise or, if <code>asyncFn</code> is a function, immediately\ncalls the function and awaits the returned promise to complete. It will then\ncheck that the promise is not rejected.</p>\n<p>If <code>asyncFn</code> is a function and it throws an error synchronously,\n<code>assert.doesNotReject()</code> will return a rejected <code>Promise</code> with that error. If\nthe function does not return a promise, <code>assert.doesNotReject()</code> will return a\nrejected <code>Promise</code> with an <a href=\"errors.html#errors_err_invalid_return_value\"><code>ERR_INVALID_RETURN_VALUE</code></a> error. In both cases\nthe error handler is skipped.</p>\n<p>Using <code>assert.doesNotReject()</code> is actually not useful because there is little\nbenefit in catching a rejection and then rejecting it again. Instead, consider\nadding a comment next to the specific code path that should not reject and keep\nerror messages as expressive as possible.</p>\n<p>If specified, <code>error</code> can be a <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes\"><code>Class</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\"><code>RegExp</code></a> or a validation\nfunction. See <a href=\"#assert_assert_throws_fn_error_message\"><code>assert.throws()</code></a> for more details.</p>\n<p>Besides the async nature to await the completion behaves identically to\n<a href=\"#assert_assert_doesnotthrow_fn_error_message\"><code>assert.doesNotThrow()</code></a>.</p>\n<!-- eslint-disable no-restricted-syntax -->\n<pre><code class=\"language-js\">(async () => {\n  await assert.doesNotReject(\n    async () => {\n      throw new TypeError('Wrong value');\n    },\n    SyntaxError\n  );\n})();\n</code></pre>\n<!-- eslint-disable no-restricted-syntax -->\n<pre><code class=\"language-js\">assert.doesNotReject(Promise.reject(new TypeError('Wrong value')))\n  .then(() => {\n    // ...\n  });\n</code></pre>"
514        },
515        {
516          "textRaw": "`assert.doesNotThrow(fn[, error][, message])`",
517          "type": "method",
518          "name": "doesNotThrow",
519          "meta": {
520            "added": [
521              "v0.1.21"
522            ],
523            "changes": [
524              {
525                "version": [
526                  "v5.11.0",
527                  "v4.4.5"
528                ],
529                "pr-url": "https://github.com/nodejs/node/pull/2407",
530                "description": "The `message` parameter is respected now."
531              },
532              {
533                "version": "v4.2.0",
534                "pr-url": "https://github.com/nodejs/node/pull/3276",
535                "description": "The `error` parameter can now be an arrow function."
536              }
537            ]
538          },
539          "signatures": [
540            {
541              "params": [
542                {
543                  "textRaw": "`fn` {Function}",
544                  "name": "fn",
545                  "type": "Function"
546                },
547                {
548                  "textRaw": "`error` {RegExp|Function}",
549                  "name": "error",
550                  "type": "RegExp|Function"
551                },
552                {
553                  "textRaw": "`message` {string}",
554                  "name": "message",
555                  "type": "string"
556                }
557              ]
558            }
559          ],
560          "desc": "<p>Asserts that the function <code>fn</code> does not throw an error.</p>\n<p>Using <code>assert.doesNotThrow()</code> is actually not useful because there\nis no benefit in catching an error and then rethrowing it. Instead, consider\nadding a comment next to the specific code path that should not throw and keep\nerror messages as expressive as possible.</p>\n<p>When <code>assert.doesNotThrow()</code> is called, it will immediately call the <code>fn</code>\nfunction.</p>\n<p>If an error is thrown and it is the same type as that specified by the <code>error</code>\nparameter, then an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown. If the error is of a\ndifferent type, or if the <code>error</code> parameter is undefined, the error is\npropagated back to the caller.</p>\n<p>If specified, <code>error</code> can be a <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes\"><code>Class</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\"><code>RegExp</code></a> or a validation\nfunction. See <a href=\"#assert_assert_throws_fn_error_message\"><code>assert.throws()</code></a> for more details.</p>\n<p>The following, for instance, will throw the <a href=\"errors.html#errors_class_typeerror\"><code>TypeError</code></a> because there is no\nmatching error type in the assertion:</p>\n<!-- eslint-disable no-restricted-syntax -->\n<pre><code class=\"language-js\">assert.doesNotThrow(\n  () => {\n    throw new TypeError('Wrong value');\n  },\n  SyntaxError\n);\n</code></pre>\n<p>However, the following will result in an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> with the message\n'Got unwanted exception...':</p>\n<!-- eslint-disable no-restricted-syntax -->\n<pre><code class=\"language-js\">assert.doesNotThrow(\n  () => {\n    throw new TypeError('Wrong value');\n  },\n  TypeError\n);\n</code></pre>\n<p>If an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown and a value is provided for the <code>message</code>\nparameter, the value of <code>message</code> will be appended to the <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>\nmessage:</p>\n<!-- eslint-disable no-restricted-syntax -->\n<pre><code class=\"language-js\">assert.doesNotThrow(\n  () => {\n    throw new TypeError('Wrong value');\n  },\n  /Wrong value/,\n  'Whoops'\n);\n// Throws: AssertionError: Got unwanted exception: Whoops\n</code></pre>"
561        },
562        {
563          "textRaw": "`assert.equal(actual, expected[, message])`",
564          "type": "method",
565          "name": "equal",
566          "meta": {
567            "added": [
568              "v0.1.21"
569            ],
570            "changes": [
571              {
572                "version": "v14.18.0",
573                "pr-url": "https://github.com/nodejs/node/pull/38113",
574                "description": "In Legacy assertion mode, changed status from Deprecated to Legacy."
575              },
576              {
577                "version": "v14.0.0",
578                "pr-url": "https://github.com/nodejs/node/pull/30766",
579                "description": "NaN is now treated as being identical in case both sides are NaN."
580              }
581            ]
582          },
583          "signatures": [
584            {
585              "params": [
586                {
587                  "textRaw": "`actual` {any}",
588                  "name": "actual",
589                  "type": "any"
590                },
591                {
592                  "textRaw": "`expected` {any}",
593                  "name": "expected",
594                  "type": "any"
595                },
596                {
597                  "textRaw": "`message` {string|Error}",
598                  "name": "message",
599                  "type": "string|Error"
600                }
601              ]
602            }
603          ],
604          "desc": "<p><strong>Strict assertion mode</strong></p>\n<p>An alias of <a href=\"#assert_assert_strictequal_actual_expected_message\"><code>assert.strictEqual()</code></a>.</p>\n<p><strong>Legacy assertion mode</strong></p>\n<blockquote>\n<p>Stability: 3 - Legacy: Use <a href=\"#assert_assert_strictequal_actual_expected_message\"><code>assert.strictEqual()</code></a> instead.</p>\n</blockquote>\n<p>Tests shallow, coercive equality between the <code>actual</code> and <code>expected</code> parameters\nusing the <a href=\"https://tc39.github.io/ecma262/#sec-abstract-equality-comparison\">Abstract Equality Comparison</a> ( <code>==</code> ). <code>NaN</code> is special handled\nand treated as being identical in case both sides are <code>NaN</code>.</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n\nassert.equal(1, 1);\n// OK, 1 == 1\nassert.equal(1, '1');\n// OK, 1 == '1'\nassert.equal(NaN, NaN);\n// OK\n\nassert.equal(1, 2);\n// AssertionError: 1 == 2\nassert.equal({ a: { b: 1 } }, { a: { b: 1 } });\n// AssertionError: { a: { b: 1 } } == { a: { b: 1 } }\n</code></pre>\n<p>If the values are not equal, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a <code>message</code>\nproperty set equal to the value of the <code>message</code> parameter. If the <code>message</code>\nparameter is undefined, a default error message is assigned. If the <code>message</code>\nparameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown instead of the\n<code>AssertionError</code>.</p>"
605        },
606        {
607          "textRaw": "`assert.fail([message])`",
608          "type": "method",
609          "name": "fail",
610          "meta": {
611            "added": [
612              "v0.1.21"
613            ],
614            "changes": []
615          },
616          "signatures": [
617            {
618              "params": [
619                {
620                  "textRaw": "`message` {string|Error} **Default:** `'Failed'`",
621                  "name": "message",
622                  "type": "string|Error",
623                  "default": "`'Failed'`"
624                }
625              ]
626            }
627          ],
628          "desc": "<p>Throws an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> with the provided error message or a default\nerror message. If the <code>message</code> parameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then\nit will be thrown instead of the <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.fail();\n// AssertionError [ERR_ASSERTION]: Failed\n\nassert.fail('boom');\n// AssertionError [ERR_ASSERTION]: boom\n\nassert.fail(new TypeError('need array'));\n// TypeError: need array\n</code></pre>\n<p>Using <code>assert.fail()</code> with more than two arguments is possible but deprecated.\nSee below for further details.</p>"
629        },
630        {
631          "textRaw": "`assert.fail(actual, expected[, message[, operator[, stackStartFn]]])`",
632          "type": "method",
633          "name": "fail",
634          "meta": {
635            "added": [
636              "v0.1.21"
637            ],
638            "changes": [
639              {
640                "version": "v10.0.0",
641                "pr-url": "https://github.com/nodejs/node/pull/18418",
642                "description": "Calling `assert.fail()` with more than one argument is deprecated and emits a warning."
643              }
644            ]
645          },
646          "stability": 0,
647          "stabilityText": "Deprecated: Use `assert.fail([message])` or other assert\nfunctions instead.",
648          "signatures": [
649            {
650              "params": [
651                {
652                  "textRaw": "`actual` {any}",
653                  "name": "actual",
654                  "type": "any"
655                },
656                {
657                  "textRaw": "`expected` {any}",
658                  "name": "expected",
659                  "type": "any"
660                },
661                {
662                  "textRaw": "`message` {string|Error}",
663                  "name": "message",
664                  "type": "string|Error"
665                },
666                {
667                  "textRaw": "`operator` {string} **Default:** `'!='`",
668                  "name": "operator",
669                  "type": "string",
670                  "default": "`'!='`"
671                },
672                {
673                  "textRaw": "`stackStartFn` {Function} **Default:** `assert.fail`",
674                  "name": "stackStartFn",
675                  "type": "Function",
676                  "default": "`assert.fail`"
677                }
678              ]
679            }
680          ],
681          "desc": "<p>If <code>message</code> is falsy, the error message is set as the values of <code>actual</code> and\n<code>expected</code> separated by the provided <code>operator</code>. If just the two <code>actual</code> and\n<code>expected</code> arguments are provided, <code>operator</code> will default to <code>'!='</code>. If\n<code>message</code> is provided as third argument it will be used as the error message and\nthe other arguments will be stored as properties on the thrown object. If\n<code>stackStartFn</code> is provided, all stack frames above that function will be\nremoved from stacktrace (see <a href=\"errors.html#errors_error_capturestacktrace_targetobject_constructoropt\"><code>Error.captureStackTrace</code></a>). If no arguments are\ngiven, the default message <code>Failed</code> will be used.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.fail('a', 'b');\n// AssertionError [ERR_ASSERTION]: 'a' != 'b'\n\nassert.fail(1, 2, undefined, '>');\n// AssertionError [ERR_ASSERTION]: 1 > 2\n\nassert.fail(1, 2, 'fail');\n// AssertionError [ERR_ASSERTION]: fail\n\nassert.fail(1, 2, 'whoops', '>');\n// AssertionError [ERR_ASSERTION]: whoops\n\nassert.fail(1, 2, new TypeError('need array'));\n// TypeError: need array\n</code></pre>\n<p>In the last three cases <code>actual</code>, <code>expected</code>, and <code>operator</code> have no\ninfluence on the error message.</p>\n<p>Example use of <code>stackStartFn</code> for truncating the exception's stacktrace:</p>\n<pre><code class=\"language-js\">function suppressFrame() {\n  assert.fail('a', 'b', undefined, '!==', suppressFrame);\n}\nsuppressFrame();\n// AssertionError [ERR_ASSERTION]: 'a' !== 'b'\n//     at repl:1:1\n//     at ContextifyScript.Script.runInThisContext (vm.js:44:33)\n//     ...\n</code></pre>"
682        },
683        {
684          "textRaw": "`assert.ifError(value)`",
685          "type": "method",
686          "name": "ifError",
687          "meta": {
688            "added": [
689              "v0.1.97"
690            ],
691            "changes": [
692              {
693                "version": "v10.0.0",
694                "pr-url": "https://github.com/nodejs/node/pull/18247",
695                "description": "Instead of throwing the original error it is now wrapped into an [`AssertionError`][] that contains the full stack trace."
696              },
697              {
698                "version": "v10.0.0",
699                "pr-url": "https://github.com/nodejs/node/pull/18247",
700                "description": "Value may now only be `undefined` or `null`. Before all falsy values were handled the same as `null` and did not throw."
701              }
702            ]
703          },
704          "signatures": [
705            {
706              "params": [
707                {
708                  "textRaw": "`value` {any}",
709                  "name": "value",
710                  "type": "any"
711                }
712              ]
713            }
714          ],
715          "desc": "<p>Throws <code>value</code> if <code>value</code> is not <code>undefined</code> or <code>null</code>. This is useful when\ntesting the <code>error</code> argument in callbacks. The stack trace contains all frames\nfrom the error passed to <code>ifError()</code> including the potential new frames for\n<code>ifError()</code> itself.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.ifError(null);\n// OK\nassert.ifError(0);\n// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 0\nassert.ifError('error');\n// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: 'error'\nassert.ifError(new Error());\n// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: Error\n\n// Create some random error frames.\nlet err;\n(function errorFrame() {\n  err = new Error('test error');\n})();\n\n(function ifErrorFrame() {\n  assert.ifError(err);\n})();\n// AssertionError [ERR_ASSERTION]: ifError got unwanted exception: test error\n//     at ifErrorFrame\n//     at errorFrame\n</code></pre>"
716        },
717        {
718          "textRaw": "`assert.match(string, regexp[, message])`",
719          "type": "method",
720          "name": "match",
721          "meta": {
722            "added": [
723              "v13.6.0",
724              "v12.16.0"
725            ],
726            "changes": []
727          },
728          "stability": 1,
729          "stabilityText": "Experimental",
730          "signatures": [
731            {
732              "params": [
733                {
734                  "textRaw": "`string` {string}",
735                  "name": "string",
736                  "type": "string"
737                },
738                {
739                  "textRaw": "`regexp` {RegExp}",
740                  "name": "regexp",
741                  "type": "RegExp"
742                },
743                {
744                  "textRaw": "`message` {string|Error}",
745                  "name": "message",
746                  "type": "string|Error"
747                }
748              ]
749            }
750          ],
751          "desc": "<p>Expects the <code>string</code> input to match the regular expression.</p>\n<p>This feature is currently experimental and the name might change or it might be\ncompletely removed again.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.match('I will fail', /pass/);\n// AssertionError [ERR_ASSERTION]: The input did not match the regular ...\n\nassert.match(123, /pass/);\n// AssertionError [ERR_ASSERTION]: The \"string\" argument must be of type string.\n\nassert.match('I will pass', /pass/);\n// OK\n</code></pre>\n<p>If the values do not match, or if the <code>string</code> argument is of another type than\n<code>string</code>, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a <code>message</code> property set equal\nto the value of the <code>message</code> parameter. If the <code>message</code> parameter is\nundefined, a default error message is assigned. If the <code>message</code> parameter is an\ninstance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown instead of the\n<a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>.</p>"
752        },
753        {
754          "textRaw": "`assert.notDeepEqual(actual, expected[, message])`",
755          "type": "method",
756          "name": "notDeepEqual",
757          "meta": {
758            "added": [
759              "v0.1.21"
760            ],
761            "changes": [
762              {
763                "version": "v14.18.0",
764                "pr-url": "https://github.com/nodejs/node/pull/38113",
765                "description": "In Legacy assertion mode, changed status from Deprecated to Legacy."
766              },
767              {
768                "version": "v14.0.0",
769                "pr-url": "https://github.com/nodejs/node/pull/30766",
770                "description": "NaN is now treated as being identical in case both sides are NaN."
771              },
772              {
773                "version": "v9.0.0",
774                "pr-url": "https://github.com/nodejs/node/pull/15001",
775                "description": "The `Error` names and messages are now properly compared."
776              },
777              {
778                "version": "v8.0.0",
779                "pr-url": "https://github.com/nodejs/node/pull/12142",
780                "description": "The `Set` and `Map` content is also compared."
781              },
782              {
783                "version": [
784                  "v6.4.0",
785                  "v4.7.1"
786                ],
787                "pr-url": "https://github.com/nodejs/node/pull/8002",
788                "description": "Typed array slices are handled correctly now."
789              },
790              {
791                "version": [
792                  "v6.1.0",
793                  "v4.5.0"
794                ],
795                "pr-url": "https://github.com/nodejs/node/pull/6432",
796                "description": "Objects with circular references can be used as inputs now."
797              },
798              {
799                "version": [
800                  "v5.10.1",
801                  "v4.4.3"
802                ],
803                "pr-url": "https://github.com/nodejs/node/pull/5910",
804                "description": "Handle non-`Uint8Array` typed arrays correctly."
805              }
806            ]
807          },
808          "signatures": [
809            {
810              "params": [
811                {
812                  "textRaw": "`actual` {any}",
813                  "name": "actual",
814                  "type": "any"
815                },
816                {
817                  "textRaw": "`expected` {any}",
818                  "name": "expected",
819                  "type": "any"
820                },
821                {
822                  "textRaw": "`message` {string|Error}",
823                  "name": "message",
824                  "type": "string|Error"
825                }
826              ]
827            }
828          ],
829          "desc": "<p><strong>Strict assertion mode</strong></p>\n<p>An alias of <a href=\"#assert_assert_notdeepstrictequal_actual_expected_message\"><code>assert.notDeepStrictEqual()</code></a>.</p>\n<p><strong>Legacy assertion mode</strong></p>\n<blockquote>\n<p>Stability: 3 - Legacy: Use <a href=\"#assert_assert_notdeepstrictequal_actual_expected_message\"><code>assert.notDeepStrictEqual()</code></a> instead.</p>\n</blockquote>\n<p>Tests for any deep inequality. Opposite of <a href=\"#assert_assert_deepequal_actual_expected_message\"><code>assert.deepEqual()</code></a>.</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n\nconst obj1 = {\n  a: {\n    b: 1\n  }\n};\nconst obj2 = {\n  a: {\n    b: 2\n  }\n};\nconst obj3 = {\n  a: {\n    b: 1\n  }\n};\nconst obj4 = Object.create(obj1);\n\nassert.notDeepEqual(obj1, obj1);\n// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }\n\nassert.notDeepEqual(obj1, obj2);\n// OK\n\nassert.notDeepEqual(obj1, obj3);\n// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }\n\nassert.notDeepEqual(obj1, obj4);\n// OK\n</code></pre>\n<p>If the values are deeply equal, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a\n<code>message</code> property set equal to the value of the <code>message</code> parameter. If the\n<code>message</code> parameter is undefined, a default error message is assigned. If the\n<code>message</code> parameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown\ninstead of the <code>AssertionError</code>.</p>"
830        },
831        {
832          "textRaw": "`assert.notDeepStrictEqual(actual, expected[, message])`",
833          "type": "method",
834          "name": "notDeepStrictEqual",
835          "meta": {
836            "added": [
837              "v1.2.0"
838            ],
839            "changes": [
840              {
841                "version": "v9.0.0",
842                "pr-url": "https://github.com/nodejs/node/pull/15398",
843                "description": "The `-0` and `+0` are not considered equal anymore."
844              },
845              {
846                "version": "v9.0.0",
847                "pr-url": "https://github.com/nodejs/node/pull/15036",
848                "description": "The `NaN` is now compared using the [SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero) comparison."
849              },
850              {
851                "version": "v9.0.0",
852                "pr-url": "https://github.com/nodejs/node/pull/15001",
853                "description": "The `Error` names and messages are now properly compared."
854              },
855              {
856                "version": "v8.0.0",
857                "pr-url": "https://github.com/nodejs/node/pull/12142",
858                "description": "The `Set` and `Map` content is also compared."
859              },
860              {
861                "version": [
862                  "v6.4.0",
863                  "v4.7.1"
864                ],
865                "pr-url": "https://github.com/nodejs/node/pull/8002",
866                "description": "Typed array slices are handled correctly now."
867              },
868              {
869                "version": "v6.1.0",
870                "pr-url": "https://github.com/nodejs/node/pull/6432",
871                "description": "Objects with circular references can be used as inputs now."
872              },
873              {
874                "version": [
875                  "v5.10.1",
876                  "v4.4.3"
877                ],
878                "pr-url": "https://github.com/nodejs/node/pull/5910",
879                "description": "Handle non-`Uint8Array` typed arrays correctly."
880              }
881            ]
882          },
883          "signatures": [
884            {
885              "params": [
886                {
887                  "textRaw": "`actual` {any}",
888                  "name": "actual",
889                  "type": "any"
890                },
891                {
892                  "textRaw": "`expected` {any}",
893                  "name": "expected",
894                  "type": "any"
895                },
896                {
897                  "textRaw": "`message` {string|Error}",
898                  "name": "message",
899                  "type": "string|Error"
900                }
901              ]
902            }
903          ],
904          "desc": "<p>Tests for deep strict inequality. Opposite of <a href=\"#assert_assert_deepstrictequal_actual_expected_message\"><code>assert.deepStrictEqual()</code></a>.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.notDeepStrictEqual({ a: 1 }, { a: '1' });\n// OK\n</code></pre>\n<p>If the values are deeply and strictly equal, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown\nwith a <code>message</code> property set equal to the value of the <code>message</code> parameter. If\nthe <code>message</code> parameter is undefined, a default error message is assigned. If\nthe <code>message</code> parameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown\ninstead of the <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>.</p>"
905        },
906        {
907          "textRaw": "`assert.notEqual(actual, expected[, message])`",
908          "type": "method",
909          "name": "notEqual",
910          "meta": {
911            "added": [
912              "v0.1.21"
913            ],
914            "changes": [
915              {
916                "version": "v14.18.0",
917                "pr-url": "https://github.com/nodejs/node/pull/38113",
918                "description": "In Legacy assertion mode, changed status from Deprecated to Legacy."
919              },
920              {
921                "version": "v14.0.0",
922                "pr-url": "https://github.com/nodejs/node/pull/30766",
923                "description": "NaN is now treated as being identical in case both sides are NaN."
924              }
925            ]
926          },
927          "signatures": [
928            {
929              "params": [
930                {
931                  "textRaw": "`actual` {any}",
932                  "name": "actual",
933                  "type": "any"
934                },
935                {
936                  "textRaw": "`expected` {any}",
937                  "name": "expected",
938                  "type": "any"
939                },
940                {
941                  "textRaw": "`message` {string|Error}",
942                  "name": "message",
943                  "type": "string|Error"
944                }
945              ]
946            }
947          ],
948          "desc": "<p><strong>Strict assertion mode</strong></p>\n<p>An alias of <a href=\"#assert_assert_notstrictequal_actual_expected_message\"><code>assert.notStrictEqual()</code></a>.</p>\n<p><strong>Legacy assertion mode</strong></p>\n<blockquote>\n<p>Stability: 3 - Legacy: Use <a href=\"#assert_assert_notstrictequal_actual_expected_message\"><code>assert.notStrictEqual()</code></a> instead.</p>\n</blockquote>\n<p>Tests shallow, coercive inequality with the <a href=\"https://tc39.github.io/ecma262/#sec-abstract-equality-comparison\">Abstract Equality Comparison</a>\n(<code>!=</code> ). <code>NaN</code> is special handled and treated as being identical in case both\nsides are <code>NaN</code>.</p>\n<pre><code class=\"language-js\">const assert = require('assert');\n\nassert.notEqual(1, 2);\n// OK\n\nassert.notEqual(1, 1);\n// AssertionError: 1 != 1\n\nassert.notEqual(1, '1');\n// AssertionError: 1 != '1'\n</code></pre>\n<p>If the values are equal, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a <code>message</code>\nproperty set equal to the value of the <code>message</code> parameter. If the <code>message</code>\nparameter is undefined, a default error message is assigned. If the <code>message</code>\nparameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown instead of the\n<code>AssertionError</code>.</p>"
949        },
950        {
951          "textRaw": "`assert.notStrictEqual(actual, expected[, message])`",
952          "type": "method",
953          "name": "notStrictEqual",
954          "meta": {
955            "added": [
956              "v0.1.21"
957            ],
958            "changes": [
959              {
960                "version": "v10.0.0",
961                "pr-url": "https://github.com/nodejs/node/pull/17003",
962                "description": "Used comparison changed from Strict Equality to `Object.is()`."
963              }
964            ]
965          },
966          "signatures": [
967            {
968              "params": [
969                {
970                  "textRaw": "`actual` {any}",
971                  "name": "actual",
972                  "type": "any"
973                },
974                {
975                  "textRaw": "`expected` {any}",
976                  "name": "expected",
977                  "type": "any"
978                },
979                {
980                  "textRaw": "`message` {string|Error}",
981                  "name": "message",
982                  "type": "string|Error"
983                }
984              ]
985            }
986          ],
987          "desc": "<p>Tests strict inequality between the <code>actual</code> and <code>expected</code> parameters as\ndetermined by the <a href=\"https://tc39.github.io/ecma262/#sec-samevalue\">SameValue Comparison</a>.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.notStrictEqual(1, 2);\n// OK\n\nassert.notStrictEqual(1, 1);\n// AssertionError [ERR_ASSERTION]: Expected \"actual\" to be strictly unequal to:\n//\n// 1\n\nassert.notStrictEqual(1, '1');\n// OK\n</code></pre>\n<p>If the values are strictly equal, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a\n<code>message</code> property set equal to the value of the <code>message</code> parameter. If the\n<code>message</code> parameter is undefined, a default error message is assigned. If the\n<code>message</code> parameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown\ninstead of the <code>AssertionError</code>.</p>"
988        },
989        {
990          "textRaw": "`assert.ok(value[, message])`",
991          "type": "method",
992          "name": "ok",
993          "meta": {
994            "added": [
995              "v0.1.21"
996            ],
997            "changes": [
998              {
999                "version": "v10.0.0",
1000                "pr-url": "https://github.com/nodejs/node/pull/18319",
1001                "description": "The `assert.ok()` (no arguments) will now use a predefined error message."
1002              }
1003            ]
1004          },
1005          "signatures": [
1006            {
1007              "params": [
1008                {
1009                  "textRaw": "`value` {any}",
1010                  "name": "value",
1011                  "type": "any"
1012                },
1013                {
1014                  "textRaw": "`message` {string|Error}",
1015                  "name": "message",
1016                  "type": "string|Error"
1017                }
1018              ]
1019            }
1020          ],
1021          "desc": "<p>Tests if <code>value</code> is truthy. It is equivalent to\n<code>assert.equal(!!value, true, message)</code>.</p>\n<p>If <code>value</code> is not truthy, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a <code>message</code>\nproperty set equal to the value of the <code>message</code> parameter. If the <code>message</code>\nparameter is <code>undefined</code>, a default error message is assigned. If the <code>message</code>\nparameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown instead of the\n<code>AssertionError</code>.\nIf no arguments are passed in at all <code>message</code> will be set to the string:\n<code>'No value argument passed to `assert.ok()`'</code>.</p>\n<p>Be aware that in the <code>repl</code> the error message will be different to the one\nthrown in a file! See below for further details.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.ok(true);\n// OK\nassert.ok(1);\n// OK\n\nassert.ok();\n// AssertionError: No value argument passed to `assert.ok()`\n\nassert.ok(false, 'it\\'s false');\n// AssertionError: it's false\n\n// In the repl:\nassert.ok(typeof 123 === 'string');\n// AssertionError: false == true\n\n// In a file (e.g. test.js):\nassert.ok(typeof 123 === 'string');\n// AssertionError: The expression evaluated to a falsy value:\n//\n//   assert.ok(typeof 123 === 'string')\n\nassert.ok(false);\n// AssertionError: The expression evaluated to a falsy value:\n//\n//   assert.ok(false)\n\nassert.ok(0);\n// AssertionError: The expression evaluated to a falsy value:\n//\n//   assert.ok(0)\n\n// Using `assert()` works the same:\nassert(0);\n// AssertionError: The expression evaluated to a falsy value:\n//\n//   assert(0)\n</code></pre>"
1022        },
1023        {
1024          "textRaw": "`assert.rejects(asyncFn[, error][, message])`",
1025          "type": "method",
1026          "name": "rejects",
1027          "meta": {
1028            "added": [
1029              "v10.0.0"
1030            ],
1031            "changes": []
1032          },
1033          "signatures": [
1034            {
1035              "params": [
1036                {
1037                  "textRaw": "`asyncFn` {Function|Promise}",
1038                  "name": "asyncFn",
1039                  "type": "Function|Promise"
1040                },
1041                {
1042                  "textRaw": "`error` {RegExp|Function|Object|Error}",
1043                  "name": "error",
1044                  "type": "RegExp|Function|Object|Error"
1045                },
1046                {
1047                  "textRaw": "`message` {string}",
1048                  "name": "message",
1049                  "type": "string"
1050                }
1051              ]
1052            }
1053          ],
1054          "desc": "<p>Awaits the <code>asyncFn</code> promise or, if <code>asyncFn</code> is a function, immediately\ncalls the function and awaits the returned promise to complete. It will then\ncheck that the promise is rejected.</p>\n<p>If <code>asyncFn</code> is a function and it throws an error synchronously,\n<code>assert.rejects()</code> will return a rejected <code>Promise</code> with that error. If the\nfunction does not return a promise, <code>assert.rejects()</code> will return a rejected\n<code>Promise</code> with an <a href=\"errors.html#errors_err_invalid_return_value\"><code>ERR_INVALID_RETURN_VALUE</code></a> error. In both cases the error\nhandler is skipped.</p>\n<p>Besides the async nature to await the completion behaves identically to\n<a href=\"#assert_assert_throws_fn_error_message\"><code>assert.throws()</code></a>.</p>\n<p>If specified, <code>error</code> can be a <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes\"><code>Class</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\"><code>RegExp</code></a>, a validation function,\nan object where each property will be tested for, or an instance of error where\neach property will be tested for including the non-enumerable <code>message</code> and\n<code>name</code> properties.</p>\n<p>If specified, <code>message</code> will be the message provided by the <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>\nif the <code>asyncFn</code> fails to reject.</p>\n<pre><code class=\"language-js\">(async () => {\n  await assert.rejects(\n    async () => {\n      throw new TypeError('Wrong value');\n    },\n    {\n      name: 'TypeError',\n      message: 'Wrong value'\n    }\n  );\n})();\n</code></pre>\n<pre><code class=\"language-js\">(async () => {\n  await assert.rejects(\n    async () => {\n      throw new TypeError('Wrong value');\n    },\n    (err) => {\n      assert.strictEqual(err.name, 'TypeError');\n      assert.strictEqual(err.message, 'Wrong value');\n      return true;\n    }\n  );\n})();\n</code></pre>\n<pre><code class=\"language-js\">assert.rejects(\n  Promise.reject(new Error('Wrong value')),\n  Error\n).then(() => {\n  // ...\n});\n</code></pre>\n<p><code>error</code> cannot be a string. If a string is provided as the second\nargument, then <code>error</code> is assumed to be omitted and the string will be used for\n<code>message</code> instead. This can lead to easy-to-miss mistakes. Please read the\nexample in <a href=\"#assert_assert_throws_fn_error_message\"><code>assert.throws()</code></a> carefully if using a string as the second\nargument gets considered.</p>"
1055        },
1056        {
1057          "textRaw": "`assert.strictEqual(actual, expected[, message])`",
1058          "type": "method",
1059          "name": "strictEqual",
1060          "meta": {
1061            "added": [
1062              "v0.1.21"
1063            ],
1064            "changes": [
1065              {
1066                "version": "v10.0.0",
1067                "pr-url": "https://github.com/nodejs/node/pull/17003",
1068                "description": "Used comparison changed from Strict Equality to `Object.is()`."
1069              }
1070            ]
1071          },
1072          "signatures": [
1073            {
1074              "params": [
1075                {
1076                  "textRaw": "`actual` {any}",
1077                  "name": "actual",
1078                  "type": "any"
1079                },
1080                {
1081                  "textRaw": "`expected` {any}",
1082                  "name": "expected",
1083                  "type": "any"
1084                },
1085                {
1086                  "textRaw": "`message` {string|Error}",
1087                  "name": "message",
1088                  "type": "string|Error"
1089                }
1090              ]
1091            }
1092          ],
1093          "desc": "<p>Tests strict equality between the <code>actual</code> and <code>expected</code> parameters as\ndetermined by the <a href=\"https://tc39.github.io/ecma262/#sec-samevalue\">SameValue Comparison</a>.</p>\n<pre><code class=\"language-js\">const assert = require('assert').strict;\n\nassert.strictEqual(1, 2);\n// AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal:\n//\n// 1 !== 2\n\nassert.strictEqual(1, 1);\n// OK\n\nassert.strictEqual('Hello foobar', 'Hello World!');\n// AssertionError [ERR_ASSERTION]: Expected inputs to be strictly equal:\n// + actual - expected\n//\n// + 'Hello foobar'\n// - 'Hello World!'\n//          ^\n\nconst apples = 1;\nconst oranges = 2;\nassert.strictEqual(apples, oranges, `apples ${apples} !== oranges ${oranges}`);\n// AssertionError [ERR_ASSERTION]: apples 1 !== oranges 2\n\nassert.strictEqual(1, '1', new TypeError('Inputs are not identical'));\n// TypeError: Inputs are not identical\n</code></pre>\n<p>If the values are not strictly equal, an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a> is thrown with a\n<code>message</code> property set equal to the value of the <code>message</code> parameter. If the\n<code>message</code> parameter is undefined, a default error message is assigned. If the\n<code>message</code> parameter is an instance of an <a href=\"errors.html#errors_class_error\"><code>Error</code></a> then it will be thrown\ninstead of the <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>.</p>"
1094        },
1095        {
1096          "textRaw": "`assert.throws(fn[, error][, message])`",
1097          "type": "method",
1098          "name": "throws",
1099          "meta": {
1100            "added": [
1101              "v0.1.21"
1102            ],
1103            "changes": [
1104              {
1105                "version": "v10.2.0",
1106                "pr-url": "https://github.com/nodejs/node/pull/20485",
1107                "description": "The `error` parameter can be an object containing regular expressions now."
1108              },
1109              {
1110                "version": "v9.9.0",
1111                "pr-url": "https://github.com/nodejs/node/pull/17584",
1112                "description": "The `error` parameter can now be an object as well."
1113              },
1114              {
1115                "version": "v4.2.0",
1116                "pr-url": "https://github.com/nodejs/node/pull/3276",
1117                "description": "The `error` parameter can now be an arrow function."
1118              }
1119            ]
1120          },
1121          "signatures": [
1122            {
1123              "params": [
1124                {
1125                  "textRaw": "`fn` {Function}",
1126                  "name": "fn",
1127                  "type": "Function"
1128                },
1129                {
1130                  "textRaw": "`error` {RegExp|Function|Object|Error}",
1131                  "name": "error",
1132                  "type": "RegExp|Function|Object|Error"
1133                },
1134                {
1135                  "textRaw": "`message` {string}",
1136                  "name": "message",
1137                  "type": "string"
1138                }
1139              ]
1140            }
1141          ],
1142          "desc": "<p>Expects the function <code>fn</code> to throw an error.</p>\n<p>If specified, <code>error</code> can be a <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes\"><code>Class</code></a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\"><code>RegExp</code></a>, a validation function,\na validation object where each property will be tested for strict deep equality,\nor an instance of error where each property will be tested for strict deep\nequality including the non-enumerable <code>message</code> and <code>name</code> properties. When\nusing an object, it is also possible to use a regular expression, when\nvalidating against a string property. See below for examples.</p>\n<p>If specified, <code>message</code> will be appended to the message provided by the\n<code>AssertionError</code> if the <code>fn</code> call fails to throw or in case the error validation\nfails.</p>\n<p>Custom validation object/error instance:</p>\n<pre><code class=\"language-js\">const err = new TypeError('Wrong value');\nerr.code = 404;\nerr.foo = 'bar';\nerr.info = {\n  nested: true,\n  baz: 'text'\n};\nerr.reg = /abc/i;\n\nassert.throws(\n  () => {\n    throw err;\n  },\n  {\n    name: 'TypeError',\n    message: 'Wrong value',\n    info: {\n      nested: true,\n      baz: 'text'\n    }\n    // Only properties on the validation object will be tested for.\n    // Using nested objects requires all properties to be present. Otherwise\n    // the validation is going to fail.\n  }\n);\n\n// Using regular expressions to validate error properties:\nassert.throws(\n  () => {\n    throw err;\n  },\n  {\n    // The `name` and `message` properties are strings and using regular\n    // expressions on those will match against the string. If they fail, an\n    // error is thrown.\n    name: /^TypeError$/,\n    message: /Wrong/,\n    foo: 'bar',\n    info: {\n      nested: true,\n      // It is not possible to use regular expressions for nested properties!\n      baz: 'text'\n    },\n    // The `reg` property contains a regular expression and only if the\n    // validation object contains an identical regular expression, it is going\n    // to pass.\n    reg: /abc/i\n  }\n);\n\n// Fails due to the different `message` and `name` properties:\nassert.throws(\n  () => {\n    const otherErr = new Error('Not found');\n    // Copy all enumerable properties from `err` to `otherErr`.\n    for (const [key, value] of Object.entries(err)) {\n      otherErr[key] = value;\n    }\n    throw otherErr;\n  },\n  // The error's `message` and `name` properties will also be checked when using\n  // an error as validation object.\n  err\n);\n</code></pre>\n<p>Validate instanceof using constructor:</p>\n<pre><code class=\"language-js\">assert.throws(\n  () => {\n    throw new Error('Wrong value');\n  },\n  Error\n);\n</code></pre>\n<p>Validate error message using <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\"><code>RegExp</code></a>:</p>\n<p>Using a regular expression runs <code>.toString</code> on the error object, and will\ntherefore also include the error name.</p>\n<pre><code class=\"language-js\">assert.throws(\n  () => {\n    throw new Error('Wrong value');\n  },\n  /^Error: Wrong value$/\n);\n</code></pre>\n<p>Custom error validation:</p>\n<p>The function must return <code>true</code> to indicate all internal validations passed.\nIt will otherwise fail with an <a href=\"#assert_class_assert_assertionerror\"><code>AssertionError</code></a>.</p>\n<pre><code class=\"language-js\">assert.throws(\n  () => {\n    throw new Error('Wrong value');\n  },\n  (err) => {\n    assert(err instanceof Error);\n    assert(/value/.test(err));\n    // Avoid returning anything from validation functions besides `true`.\n    // Otherwise, it's not clear what part of the validation failed. Instead,\n    // throw an error about the specific validation that failed (as done in this\n    // example) and add as much helpful debugging information to that error as\n    // possible.\n    return true;\n  },\n  'unexpected error'\n);\n</code></pre>\n<p><code>error</code> cannot be a string. If a string is provided as the second\nargument, then <code>error</code> is assumed to be omitted and the string will be used for\n<code>message</code> instead. This can lead to easy-to-miss mistakes. Using the same\nmessage as the thrown error message is going to result in an\n<code>ERR_AMBIGUOUS_ARGUMENT</code> error. Please read the example below carefully if using\na string as the second argument gets considered:</p>\n<!-- eslint-disable no-restricted-syntax -->\n<pre><code class=\"language-js\">function throwingFirst() {\n  throw new Error('First');\n}\n\nfunction throwingSecond() {\n  throw new Error('Second');\n}\n\nfunction notThrowing() {}\n\n// The second argument is a string and the input function threw an Error.\n// The first case will not throw as it does not match for the error message\n// thrown by the input function!\nassert.throws(throwingFirst, 'Second');\n// In the next example the message has no benefit over the message from the\n// error and since it is not clear if the user intended to actually match\n// against the error message, Node.js throws an `ERR_AMBIGUOUS_ARGUMENT` error.\nassert.throws(throwingSecond, 'Second');\n// TypeError [ERR_AMBIGUOUS_ARGUMENT]\n\n// The string is only used (as message) in case the function does not throw:\nassert.throws(notThrowing, 'Second');\n// AssertionError [ERR_ASSERTION]: Missing expected exception: Second\n\n// If it was intended to match for the error message do this instead:\n// It does not throw because the error messages match.\nassert.throws(throwingSecond, /Second$/);\n\n// If the error message does not match, an AssertionError is thrown.\nassert.throws(throwingFirst, /Second$/);\n// AssertionError [ERR_ASSERTION]\n</code></pre>\n<p>Due to the confusing error-prone notation, avoid a string as the second\nargument.</p>"
1143        }
1144      ],
1145      "type": "module",
1146      "displayName": "Assert"
1147    }
1148  ]
1149}