diff --git a/.gitignore b/.gitignore index 9f563c044..d0a3f6275 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ test/auth/* /chai.js /chai.cjs +/lib diff --git a/index.js b/index.js deleted file mode 100644 index ea4874863..000000000 --- a/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './lib/chai.js'; diff --git a/lib/chai/assertion.js b/lib/chai/assertion.js deleted file mode 100644 index 54a9d77ff..000000000 --- a/lib/chai/assertion.js +++ /dev/null @@ -1,165 +0,0 @@ -/*! - * chai - * http://chaijs.com - * Copyright(c) 2011-2014 Jake Luer - * MIT Licensed - */ - -import {config} from './config.js'; -import {AssertionError} from 'assertion-error'; -import * as util from './utils/index.js'; - -/*! - * Assertion Constructor - * - * Creates object for chaining. - * - * `Assertion` objects contain metadata in the form of flags. Three flags can - * be assigned during instantiation by passing arguments to this constructor: - * - * - `object`: This flag contains the target of the assertion. For example, in - * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will - * contain `numKittens` so that the `equal` assertion can reference it when - * needed. - * - * - `message`: This flag contains an optional custom error message to be - * prepended to the error message that's generated by the assertion when it - * fails. - * - * - `ssfi`: This flag stands for "start stack function indicator". It - * contains a function reference that serves as the starting point for - * removing frames from the stack trace of the error that's created by the - * assertion when it fails. The goal is to provide a cleaner stack trace to - * end users by removing Chai's internal functions. Note that it only works - * in environments that support `Error.captureStackTrace`, and only when - * `Chai.config.includeStack` hasn't been set to `false`. - * - * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag - * should retain its current value, even as assertions are chained off of - * this object. This is usually set to `true` when creating a new assertion - * from within another assertion. It's also temporarily set to `true` before - * an overwritten assertion gets called by the overwriting assertion. - * - * - `eql`: This flag contains the deepEqual function to be used by the assertion. - * - * @param {Mixed} obj target of the assertion - * @param {String} msg (optional) custom error message - * @param {Function} ssfi (optional) starting point for removing stack frames - * @param {Boolean} lockSsfi (optional) whether or not the ssfi flag is locked - * @api private - */ - -export function Assertion (obj, msg, ssfi, lockSsfi) { - util.flag(this, 'ssfi', ssfi || Assertion); - util.flag(this, 'lockSsfi', lockSsfi); - util.flag(this, 'object', obj); - util.flag(this, 'message', msg); - util.flag(this, 'eql', config.deepEqual ?? util.eql); - - return util.proxify(this); -} - -Object.defineProperty(Assertion, 'includeStack', { - get: function() { - console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); - return config.includeStack; - }, - set: function(value) { - console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); - config.includeStack = value; - } -}); - -Object.defineProperty(Assertion, 'showDiff', { - get: function() { - console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); - return config.showDiff; - }, - set: function(value) { - console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); - config.showDiff = value; - } -}); - -Assertion.addProperty = function (name, fn) { - util.addProperty(this.prototype, name, fn); -}; - -Assertion.addMethod = function (name, fn) { - util.addMethod(this.prototype, name, fn); -}; - -Assertion.addChainableMethod = function (name, fn, chainingBehavior) { - util.addChainableMethod(this.prototype, name, fn, chainingBehavior); -}; - -Assertion.overwriteProperty = function (name, fn) { - util.overwriteProperty(this.prototype, name, fn); -}; - -Assertion.overwriteMethod = function (name, fn) { - util.overwriteMethod(this.prototype, name, fn); -}; - -Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { - util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); -}; - -/** - * ### .assert(expression, message, negateMessage, expected, actual, showDiff) - * - * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. - * - * @name assert - * @param {Philosophical} expression to be tested - * @param {String|Function} message or function that returns message to display if expression fails - * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails - * @param {Mixed} expected value (remember to check for negation) - * @param {Mixed} actual (optional) will default to `this.obj` - * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails - * @api private - */ - -Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) { - var ok = util.test(this, arguments); - if (false !== showDiff) showDiff = true; - if (undefined === expected && undefined === _actual) showDiff = false; - if (true !== config.showDiff) showDiff = false; - - if (!ok) { - msg = util.getMessage(this, arguments); - var actual = util.getActual(this, arguments); - var assertionErrorObjectProperties = { - actual: actual - , expected: expected - , showDiff: showDiff - }; - - var operator = util.getOperator(this, arguments); - if (operator) { - assertionErrorObjectProperties.operator = operator; - } - - throw new AssertionError( - msg, - assertionErrorObjectProperties, - (config.includeStack) ? this.assert : util.flag(this, 'ssfi')); - } -}; - -/*! - * ### ._obj - * - * Quick reference to stored `actual` value for plugin developers. - * - * @api private - */ - -Object.defineProperty(Assertion.prototype, '_obj', - { get: function () { - return util.flag(this, 'object'); - } - , set: function (val) { - util.flag(this, 'object', val); - } -}); diff --git a/lib/chai/interface/expect.js b/lib/chai/interface/expect.js deleted file mode 100644 index 70a9416c2..000000000 --- a/lib/chai/interface/expect.js +++ /dev/null @@ -1,50 +0,0 @@ -/*! - * chai - * Copyright(c) 2011-2014 Jake Luer - * MIT Licensed - */ - -import * as chai from '../../../index.js'; -import {Assertion} from '../assertion.js'; -import {AssertionError} from 'assertion-error'; - -function expect(val, message) { - return new Assertion(val, message); -} - -export {expect}; -/** - * ### .fail([message]) - * ### .fail(actual, expected, [message], [operator]) - * - * Throw a failure. - * - * expect.fail(); - * expect.fail("custom error message"); - * expect.fail(1, 2); - * expect.fail(1, 2, "custom error message"); - * expect.fail(1, 2, "custom error message", ">"); - * expect.fail(1, 2, undefined, ">"); - * - * @name fail - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @param {String} operator - * @namespace BDD - * @api public - */ - -expect.fail = function (actual, expected, message, operator) { - if (arguments.length < 2) { - message = actual; - actual = undefined; - } - - message = message || 'expect.fail()'; - throw new AssertionError(message, { - actual: actual - , expected: expected - , operator: operator - }, chai.expect.fail); -}; diff --git a/lib/chai/utils/flag.js b/lib/chai/utils/flag.js deleted file mode 100644 index 79637ad3c..000000000 --- a/lib/chai/utils/flag.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! - * Chai - flag utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - -/** - * ### .flag(object, key, [value]) - * - * Get or set a flag value on an object. If a - * value is provided it will be set, else it will - * return the currently set value or `undefined` if - * the value is not set. - * - * utils.flag(this, 'foo', 'bar'); // setter - * utils.flag(this, 'foo'); // getter, returns `bar` - * - * @param {Object} object constructed Assertion - * @param {String} key - * @param {Mixed} value (optional) - * @namespace Utils - * @name flag - * @api private - */ - -export function flag(obj, key, value) { - var flags = obj.__flags || (obj.__flags = Object.create(null)); - if (arguments.length === 3) { - flags[key] = value; - } else { - return flags[key]; - } -} diff --git a/package-lock.json b/package-lock.json index 4b71f8d22..f6ef94f52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,9 @@ "version": "5.0.0", "license": "MIT", "dependencies": { + "@types/check-error": "^1.0.3", + "@types/deep-eql": "^4.0.2", + "@types/pathval": "^1.1.2", "assertion-error": "^2.0.1", "check-error": "^2.0.0", "deep-eql": "^5.0.1", @@ -21,7 +24,8 @@ "@web/test-runner": "^0.18.0", "@web/test-runner-playwright": "^0.11.0", "esbuild": "^0.19.10", - "mocha": "^10.2.0" + "mocha": "^10.2.0", + "typescript": "^5.3.3" }, "engines": { "node": ">=12" @@ -86,9 +90,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz", - "integrity": "sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", "cpu": [ "ppc64" ], @@ -102,9 +106,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.10.tgz", - "integrity": "sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", "cpu": [ "arm" ], @@ -118,9 +122,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz", - "integrity": "sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", "cpu": [ "arm64" ], @@ -134,9 +138,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.10.tgz", - "integrity": "sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", "cpu": [ "x64" ], @@ -150,9 +154,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz", - "integrity": "sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", "cpu": [ "arm64" ], @@ -166,9 +170,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz", - "integrity": "sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", "cpu": [ "x64" ], @@ -182,9 +186,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz", - "integrity": "sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", "cpu": [ "arm64" ], @@ -198,9 +202,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz", - "integrity": "sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", "cpu": [ "x64" ], @@ -214,9 +218,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz", - "integrity": "sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", "cpu": [ "arm" ], @@ -230,9 +234,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz", - "integrity": "sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", "cpu": [ "arm64" ], @@ -246,9 +250,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz", - "integrity": "sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", "cpu": [ "ia32" ], @@ -262,9 +266,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz", - "integrity": "sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", "cpu": [ "loong64" ], @@ -278,9 +282,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz", - "integrity": "sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", "cpu": [ "mips64el" ], @@ -294,9 +298,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz", - "integrity": "sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", "cpu": [ "ppc64" ], @@ -310,9 +314,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz", - "integrity": "sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", "cpu": [ "riscv64" ], @@ -326,9 +330,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz", - "integrity": "sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", "cpu": [ "s390x" ], @@ -342,9 +346,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz", - "integrity": "sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", "cpu": [ "x64" ], @@ -358,9 +362,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz", - "integrity": "sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", "cpu": [ "x64" ], @@ -374,9 +378,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz", - "integrity": "sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", "cpu": [ "x64" ], @@ -390,9 +394,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz", - "integrity": "sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", "cpu": [ "x64" ], @@ -406,9 +410,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz", - "integrity": "sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", "cpu": [ "arm64" ], @@ -422,9 +426,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz", - "integrity": "sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", "cpu": [ "ia32" ], @@ -438,9 +442,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz", - "integrity": "sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", "cpu": [ "x64" ], @@ -542,21 +546,6 @@ } } }, - "node_modules/@puppeteer/browsers/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@puppeteer/browsers/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -571,41 +560,6 @@ "node": ">=12" } }, - "node_modules/@puppeteer/browsers/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@puppeteer/browsers/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@puppeteer/browsers/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@puppeteer/browsers/node_modules/yargs": { "version": "17.7.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", @@ -658,6 +612,37 @@ } } }, + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", @@ -684,9 +669,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -706,9 +691,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.1.tgz", - "integrity": "sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz", + "integrity": "sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==", "cpu": [ "arm" ], @@ -719,9 +704,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.1.tgz", - "integrity": "sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz", + "integrity": "sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==", "cpu": [ "arm64" ], @@ -732,9 +717,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.1.tgz", - "integrity": "sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz", + "integrity": "sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==", "cpu": [ "arm64" ], @@ -745,9 +730,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.1.tgz", - "integrity": "sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz", + "integrity": "sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==", "cpu": [ "x64" ], @@ -758,9 +743,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.1.tgz", - "integrity": "sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz", + "integrity": "sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==", "cpu": [ "arm" ], @@ -771,9 +756,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz", - "integrity": "sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz", + "integrity": "sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==", "cpu": [ "arm64" ], @@ -784,9 +769,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.1.tgz", - "integrity": "sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz", + "integrity": "sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==", "cpu": [ "arm64" ], @@ -797,9 +782,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz", - "integrity": "sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz", + "integrity": "sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==", "cpu": [ "riscv64" ], @@ -810,9 +795,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz", - "integrity": "sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz", + "integrity": "sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==", "cpu": [ "x64" ], @@ -823,9 +808,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.1.tgz", - "integrity": "sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz", + "integrity": "sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==", "cpu": [ "x64" ], @@ -836,9 +821,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.1.tgz", - "integrity": "sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz", + "integrity": "sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==", "cpu": [ "arm64" ], @@ -849,9 +834,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.1.tgz", - "integrity": "sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz", + "integrity": "sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==", "cpu": [ "ia32" ], @@ -862,9 +847,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.1.tgz", - "integrity": "sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz", + "integrity": "sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==", "cpu": [ "x64" ], @@ -905,6 +890,11 @@ "@types/node": "*" } }, + "node_modules/@types/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-xq2qg/lG9b/73i4id0YJPILVK/5W2yZV/LkMzY5BKQ27n0GJqY6HFtaLyK2ff0qnxa03W7AerOhhnAM68DUAZw==" + }, "node_modules/@types/co-body": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.3.tgz", @@ -960,10 +950,15 @@ "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", "dev": true }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==" + }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", "dev": true }, "node_modules/@types/express": { @@ -1064,9 +1059,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1078,6 +1073,11 @@ "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", "dev": true }, + "node_modules/@types/pathval": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/pathval/-/pathval-1.1.2.tgz", + "integrity": "sha512-Lecyi0eLLv4ERUAXtmqvYfoy+VxtLwYqitXfAwCJk8IY0t0OWQu2ptJNEFTr6v8qUFhq41on7UFfdvSV+wB8RQ==" + }, "node_modules/@types/qs": { "version": "6.9.11", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", @@ -1232,6 +1232,49 @@ "node": ">=18.0.0" } }, + "node_modules/@web/dev-server-rollup/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@web/dev-server-rollup/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-rollup/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-rollup/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@web/parse5-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-2.1.0.tgz", @@ -1443,15 +1486,18 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { @@ -1737,21 +1783,6 @@ "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/chalk-template/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/chalk-template/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1768,24 +1799,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk-template/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk-template/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/chalk-template/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1807,6 +1820,42 @@ "node": ">=8" } }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/check-error": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.0.0.tgz", @@ -1860,18 +1909,6 @@ "node": ">=12.13.0" } }, - "node_modules/chrome-launcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/chromium-bidi": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", @@ -1907,56 +1944,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -1989,18 +1976,21 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/command-line-args": { @@ -2091,9 +2081,9 @@ "dev": true }, "node_modules/cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-mtyMqy14RsH7+IRJglGcKtRLOq0SRt0DdXVrLgc+v1e/o0TNJUpdElhgr3AAi638LO0xZwEPcRRkJ3afxvGhUw==", "dev": true, "dependencies": { "depd": "~2.0.0", @@ -2171,9 +2161,9 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2257,9 +2247,9 @@ "dev": true }, "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true, "engines": { "node": ">=0.3.1" @@ -2320,9 +2310,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.10.tgz", - "integrity": "sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", "dev": true, "hasInstallScript": true, "bin": { @@ -2332,29 +2322,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.10", - "@esbuild/android-arm": "0.19.10", - "@esbuild/android-arm64": "0.19.10", - "@esbuild/android-x64": "0.19.10", - "@esbuild/darwin-arm64": "0.19.10", - "@esbuild/darwin-x64": "0.19.10", - "@esbuild/freebsd-arm64": "0.19.10", - "@esbuild/freebsd-x64": "0.19.10", - "@esbuild/linux-arm": "0.19.10", - "@esbuild/linux-arm64": "0.19.10", - "@esbuild/linux-ia32": "0.19.10", - "@esbuild/linux-loong64": "0.19.10", - "@esbuild/linux-mips64el": "0.19.10", - "@esbuild/linux-ppc64": "0.19.10", - "@esbuild/linux-riscv64": "0.19.10", - "@esbuild/linux-s390x": "0.19.10", - "@esbuild/linux-x64": "0.19.10", - "@esbuild/netbsd-x64": "0.19.10", - "@esbuild/openbsd-x64": "0.19.10", - "@esbuild/sunos-x64": "0.19.10", - "@esbuild/win32-arm64": "0.19.10", - "@esbuild/win32-ia32": "0.19.10", - "@esbuild/win32-x64": "0.19.10" + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" } }, "node_modules/escalade": { @@ -2373,12 +2363,15 @@ "dev": true }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -2500,9 +2493,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2516,9 +2509,9 @@ } }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -2612,9 +2605,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, @@ -2694,19 +2687,20 @@ } }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=12" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2724,6 +2718,28 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -2762,6 +2778,18 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2946,9 +2974,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -3013,12 +3041,12 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3099,15 +3127,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -3262,16 +3281,16 @@ } }, "node_modules/koa": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", - "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.0.tgz", + "integrity": "sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==", "dev": true, "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", "content-type": "^1.0.4", - "cookies": "~0.8.0", + "cookies": "~0.9.0", "debug": "^4.3.2", "delegates": "^1.0.0", "depd": "^2.0.0", @@ -3433,21 +3452,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3464,24 +3468,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3521,10 +3507,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loupe": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.0.1.tgz", - "integrity": "sha512-phbaE2fPsRe8cQ7Cy5Ze5p9JLmpiaqGT45RCUWYYjZgYPBoeC3vqrlYPj4BQ82ln60ZtM3Iq00PPC3FyUdS4Kw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.0.2.tgz", + "integrity": "sha512-Tzlkbynv7dtqxTROe54Il+J4e/zG2iehtJGZUYpTv8WzlkW9qyEcE83UhGJCeuF3SCfzHuM5VWhBi47phV3+AQ==", "dependencies": { "get-func-name": "^2.0.1" } @@ -3565,6 +3565,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/marky": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", @@ -3633,9 +3660,9 @@ } }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -3645,9 +3672,9 @@ } }, "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3717,69 +3744,6 @@ "url": "https://opencollective.com/mochajs" } }, - "node_modules/mocha/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3789,18 +3753,6 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3902,28 +3854,6 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4139,12 +4069,12 @@ } }, "node_modules/playwright": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", - "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", + "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", "dev": true, "dependencies": { - "playwright-core": "1.40.1" + "playwright-core": "1.39.0" }, "bin": { "playwright": "cli.js" @@ -4157,9 +4087,9 @@ } }, "node_modules/playwright-core": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", - "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", + "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -4168,20 +4098,6 @@ "node": ">=16" } }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/portfinder": { "version": "1.0.32", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", @@ -4270,15 +4186,6 @@ "once": "^1.3.1" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/puppeteer-core": { "version": "20.9.0", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", @@ -4526,9 +4433,9 @@ } }, "node_modules/rollup": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.1.tgz", - "integrity": "sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.2.tgz", + "integrity": "sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -4538,19 +4445,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.1", - "@rollup/rollup-android-arm64": "4.9.1", - "@rollup/rollup-darwin-arm64": "4.9.1", - "@rollup/rollup-darwin-x64": "4.9.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.1", - "@rollup/rollup-linux-arm64-gnu": "4.9.1", - "@rollup/rollup-linux-arm64-musl": "4.9.1", - "@rollup/rollup-linux-riscv64-gnu": "4.9.1", - "@rollup/rollup-linux-x64-gnu": "4.9.1", - "@rollup/rollup-linux-x64-musl": "4.9.1", - "@rollup/rollup-win32-arm64-msvc": "4.9.1", - "@rollup/rollup-win32-ia32-msvc": "4.9.1", - "@rollup/rollup-win32-x64-msvc": "4.9.1", + "@rollup/rollup-android-arm-eabi": "4.9.2", + "@rollup/rollup-android-arm64": "4.9.2", + "@rollup/rollup-darwin-arm64": "4.9.2", + "@rollup/rollup-darwin-x64": "4.9.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.2", + "@rollup/rollup-linux-arm64-gnu": "4.9.2", + "@rollup/rollup-linux-arm64-musl": "4.9.2", + "@rollup/rollup-linux-riscv64-gnu": "4.9.2", + "@rollup/rollup-linux-x64-gnu": "4.9.2", + "@rollup/rollup-linux-x64-musl": "4.9.2", + "@rollup/rollup-win32-arm64-msvc": "4.9.2", + "@rollup/rollup-win32-ia32-msvc": "4.9.2", + "@rollup/rollup-win32-x64-msvc": "4.9.2", "fsevents": "~2.3.2" } }, @@ -4603,33 +4510,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -4706,39 +4586,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -4971,16 +4818,10 @@ } }, "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/tslib": { "version": "2.6.2", @@ -5022,6 +4863,19 @@ "node": ">= 0.6" } }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/typical": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", @@ -5089,25 +4943,19 @@ } }, "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/wordwrapjs": { @@ -5126,9 +4974,9 @@ "dev": true }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -5136,42 +4984,12 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -5256,6 +5074,15 @@ "node": ">=10" } }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index a53097a02..f60e80d59 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,11 @@ "name": "chai", "type": "module", "description": "BDD/TDD assertion library for node.js and the browser. Test framework agnostic.", + "files": [ + "lib", + "/chai.js", + "/register-*" + ], "keywords": [ "test", "assertion", @@ -29,13 +34,14 @@ "main": "./chai.js", "scripts": { "prebuild": "npm run clean", - "build": "npm run build:esm", - "build:esm": "esbuild --bundle --format=esm --keep-names --outfile=chai.js index.js", + "build": "npm run build:ts && npm run build:esm", + "build:ts": "tsc", + "build:esm": "esbuild --bundle --format=esm --keep-names --outfile=chai.js src/chai.ts", "pretest": "npm run build", "test": "npm run test-node && npm run test-chrome", "test-node": "mocha --require ./test/bootstrap/index.js --reporter dot test/*.js", "test-chrome": "web-test-runner --playwright", - "clean": "rm -f chai.js coverage" + "clean": "rm -rf chai.js coverage lib" }, "engines": { "node": ">=12" @@ -45,7 +51,10 @@ "check-error": "^2.0.0", "deep-eql": "^5.0.1", "loupe": "^3.0.0", - "pathval": "^2.0.0" + "pathval": "^2.0.0", + "@types/check-error": "^1.0.3", + "@types/deep-eql": "^4.0.2", + "@types/pathval": "^1.1.2" }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.7", @@ -53,6 +62,7 @@ "@web/test-runner": "^0.18.0", "@web/test-runner-playwright": "^0.11.0", "esbuild": "^0.19.10", - "mocha": "^10.2.0" + "mocha": "^10.2.0", + "typescript": "^5.3.3" } } diff --git a/register-assert.js b/register-assert.js index f593717e0..9061dc6dd 100644 --- a/register-assert.js +++ b/register-assert.js @@ -1,3 +1,3 @@ -import {assert} from './index.js'; +import {assert} from './lib/chai.js'; globalThis.assert = assert; diff --git a/register-expect.js b/register-expect.js index 2807b89be..0f38da5a1 100644 --- a/register-expect.js +++ b/register-expect.js @@ -1,3 +1,3 @@ -import {expect} from './index.js'; +import {expect} from './lib/chai.js'; globalThis.expect = expect; diff --git a/register-should.js b/register-should.js index 1339ee4c4..a3340b816 100644 --- a/register-should.js +++ b/register-should.js @@ -1,3 +1,3 @@ -import {should} from './index.js'; +import {should} from './lib/chai.js'; globalThis.should = should(); diff --git a/lib/chai.js b/src/chai.ts similarity index 88% rename from lib/chai.js rename to src/chai.ts index 7569595c9..5801ea234 100644 --- a/lib/chai.js +++ b/src/chai.ts @@ -13,7 +13,9 @@ import {Assertion} from './chai/assertion.js'; import * as should from './chai/interface/should.js'; import {assert} from './chai/interface/assert.js'; -const used = []; +type UseFn = (exports: Record, u: typeof util) => void; + +const used: Array = []; /*! * Assertion Error @@ -31,7 +33,7 @@ export {AssertionError}; * @api public */ -export function use(fn) { +export function use(fn: UseFn): Record { const exports = { AssertionError, util, diff --git a/src/chai/assertion.ts b/src/chai/assertion.ts new file mode 100644 index 000000000..1dfb2dce5 --- /dev/null +++ b/src/chai/assertion.ts @@ -0,0 +1,226 @@ +/*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +import {config} from './config.js'; +import {AssertionError} from 'assertion-error'; +import * as util from './utils/index.js'; +import {ChainableBehavior} from './utils/chainableBehavior.js'; + +export interface AssertionFlags { + ssfi: Function; + lockSsfi?: boolean; + object: unknown; + message?: string | null; + eql: (a: unknown, b: unknown) => boolean; + [key: PropertyKey]: unknown; +} + +type MethodNames = { + [k in keyof T]: T[k] extends (...args: never) => void ? k : never; +}[keyof T]; + +const getDefaultValue = (assertion: Assertion): Assertion => { + var newAssertion = Assertion.create(); + util.transferFlags(assertion, newAssertion); + return newAssertion; +}; + +/*! + * Assertion Constructor + * + * Creates object for chaining. + * + * `Assertion` objects contain metadata in the form of flags. Three flags can + * be assigned during instantiation by passing arguments to this constructor: + * + * - `object`: This flag contains the target of the assertion. For example, in + * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will + * contain `numKittens` so that the `equal` assertion can reference it when + * needed. + * + * - `message`: This flag contains an optional custom error message to be + * prepended to the error message that's generated by the assertion when it + * fails. + * + * - `ssfi`: This flag stands for "start stack function indicator". It + * contains a function reference that serves as the starting point for + * removing frames from the stack trace of the error that's created by the + * assertion when it fails. The goal is to provide a cleaner stack trace to + * end users by removing Chai's internal functions. Note that it only works + * in environments that support `Error.captureStackTrace`, and only when + * `Chai.config.includeStack` hasn't been set to `false`. + * + * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag + * should retain its current value, even as assertions are chained off of + * this object. This is usually set to `true` when creating a new assertion + * from within another assertion. It's also temporarily set to `true` before + * an overwritten assertion gets called by the overwriting assertion. + * + * - `eql`: This flag contains the deepEqual function to be used by the assertion. + * + * @param {Mixed} obj target of the assertion + * @param {String} msg (optional) custom error message + * @param {Function} ssfi (optional) starting point for removing stack frames + * @param {Boolean} lockSsfi (optional) whether or not the ssfi flag is locked + * @api private + */ +export class Assertion { + declare public __flags: AssertionFlags; + public __methods: Record = {}; + + public constructor( + obj?: unknown, + msg?: string | null, + ssfi?: Function, + lockSsfi?: boolean + ) { + util.flag(this, 'ssfi', ssfi || Assertion); + util.flag(this, 'lockSsfi', lockSsfi); + util.flag(this, 'object', obj); + util.flag(this, 'message', msg); + util.flag(this, 'eql', config.deepEqual ?? util.eql); + } + + public static create( + obj?: unknown, + msg?: string | null, + ssfi?: Function, + lockSsfi?: boolean + ): Assertion { + return util.proxify(new Assertion( + obj, + msg, + ssfi, + lockSsfi + )); + } + + public static get includeStack(): boolean { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + return config.includeStack; + } + + public static set includeStack(value: boolean) { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + config.includeStack = value; + } + + public static get showDiff(): boolean { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + return config.showDiff; + } + + public static set showDiff(value: boolean) { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + config.showDiff = value; + } + + public static addProperty(name: string, fn?: (this: Assertion) => unknown): void { + util.addProperty(this.prototype, name, fn, getDefaultValue); + } + + public static addMethod< + TKey extends PropertyKey + >( + name: TKey, + fn: TKey extends MethodNames ? + (this: Assertion, ...args: Parameters) => (ReturnType extends Assertion ? (Assertion | void) : ReturnType) : + ((this: Assertion, ...args: never) => unknown) + ): void { + util.addMethod(this.prototype, name, fn, getDefaultValue); + } + + public static addChainableMethod( + name: string, + fn: (this: Assertion, ...args: T) => unknown, + chainingBehavior?: () => void + ): void { + util.addChainableMethod( + this.prototype, + name, + fn as (...args: unknown[]) => unknown, + chainingBehavior, + getDefaultValue + ); + } + + public static overwriteProperty(name: string, fn: Function): void { + util.overwriteProperty(this.prototype, name, fn, getDefaultValue); + } + + public static overwriteMethod(name: string, fn: Function): void { + util.overwriteMethod(this.prototype, name, fn, getDefaultValue); + } + + public static overwriteChainableMethod(name: string, fn: Function, chainingBehavior: Function): void { + util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior, getDefaultValue); + } + + /** + * ### .assert(expression, message, negateMessage, expected, actual, showDiff) + * + * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. + * + * @name assert + * @param {Philosophical} expression to be tested + * @param {String|Function} message or function that returns message to display if expression fails + * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails + * @param {Mixed} expected value (remember to check for negation) + * @param {Mixed} actual (optional) will default to `this.obj` + * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails + * @api private + */ + public assert( + _expr: unknown, + msg?: string | (() => string), + _negateMsg?: string | (() => string), + expected?: unknown, + _actual?: unknown, + showDiff?: boolean + ): void { + var ok = util.test(this, arguments); + if (false !== showDiff) showDiff = true; + if (undefined === expected && undefined === _actual) showDiff = false; + if (true !== config.showDiff) showDiff = false; + + if (!ok) { + msg = util.getMessage(this, arguments); + var actual = util.getActual(this, arguments); + var assertionErrorObjectProperties: Record = { + actual: actual + , expected: expected + , showDiff: showDiff + , operator: undefined + }; + + var operator = util.getOperator(this, arguments); + if (operator) { + assertionErrorObjectProperties.operator = operator; + } + + throw new AssertionError( + msg, + assertionErrorObjectProperties, + (config.includeStack) ? this.assert : util.flag(this, 'ssfi')); + } + } + + /*! + * ### ._obj + * + * Quick reference to stored `actual` value for plugin developers. + * + * @api private + */ + public get _obj(): unknown { + return util.flag(this, 'object'); + } + + public set _obj(val: unknown) { + util.flag(this, 'object', val); + } +} diff --git a/lib/chai/config.js b/src/chai/config.ts similarity index 100% rename from lib/chai/config.js rename to src/chai/config.ts diff --git a/lib/chai/core/assertions.js b/src/chai/core/assertions.ts similarity index 87% rename from lib/chai/core/assertions.js rename to src/chai/core/assertions.ts index 4da999273..9751bcd2a 100644 --- a/lib/chai/core/assertions.js +++ b/src/chai/core/assertions.ts @@ -11,6 +11,151 @@ import * as _ from '../utils/index.js'; const {flag} = _; +type ChainedMethod = Assertion & { + (...args: T): Assertion; +}; + +type AssertionMethod = (...args: TParams) => TReturn; + +type Constructor = {new(): T}; + +declare module '../assertion.js' { + interface Assertion { + Arguments: Assertion; + NaN: Assertion; + all: Assertion; + also: Assertion; + and: Assertion; + any: Assertion; + arguments: Assertion; + at: Assertion; + be: Assertion; + been: Assertion; + but: Assertion; + deep: Assertion; + does: Assertion; + empty: Assertion; + exist: Assertion; + exists: Assertion; + extensible: Assertion; + false: Assertion; + finite: Assertion; + frozen: Assertion; + has: Assertion; + have: Assertion; + is: Assertion; + itself: Assertion; + nested: Assertion; + not: Assertion; + null: Assertion; + of: Assertion; + ok: Assertion; + ordered: Assertion; + own: Assertion; + same: Assertion; + sealed: Assertion; + still: Assertion; + that: Assertion; + to: Assertion; + true: Assertion; + undefined: Assertion; + which: Assertion; + with: Assertion; + + a: ChainedMethod<[type: string, msg?: string]>; + an: ChainedMethod<[type: string, msg?: string]>; + + above: AssertionMethod<[val: unknown, msg?: string]>; + gt: AssertionMethod<[val: number, msg?: string]>; + greaterThan: AssertionMethod<[val: number, msg?: string]>; + + approximately: AssertionMethod<[expected: number, delta: number, msg?: string]>; + closeTo: AssertionMethod<[expected: number, delta: number, msg?: string]>; + + below: AssertionMethod<[val: unknown, msg?: string]>; + lt: AssertionMethod<[val: number, msg?: string]>; + lessThan: AssertionMethod<[val: number, msg?: string]>; + + by: AssertionMethod<[delta: number, msg?: string]>; + + change: AssertionMethod<[subject: object, prop: PropertyKey, msg?: string]> & + AssertionMethod<[subject: Function]>; + changes: AssertionMethod<[subject: object, prop: PropertyKey, msg?: string]> & + AssertionMethod<[subject: Function]>; + + contain: ChainedMethod<[val: unknown, msg?: string]>; + contains: ChainedMethod<[val: unknown, msg?: string]>; + include: ChainedMethod<[val: unknown, msg?: string]>; + includes: ChainedMethod<[val: unknown, msg?: string]>; + + decrease: AssertionMethod<[subject: Function]> & + AssertionMethod<[subject: object, prop: PropertyKey, msg?: string]>; + decreases: AssertionMethod<[subject: Function]> & + AssertionMethod<[subject: object, prop: PropertyKey, msg?: string]>; + + eq: AssertionMethod<[val: unknown, msg?: string]>; + equal: AssertionMethod<[val: unknown, msg?: string]>; + equals: AssertionMethod<[val: unknown, msg?: string]>; + + eql: AssertionMethod<[val: unknown, msg?: string]>; + eqls: AssertionMethod<[val: unknown, msg?: string]>; + + greaterThanOrEqual: AssertionMethod<[val: number, msg?: string]>; + least: AssertionMethod<[val: unknown, msg?: string]>; + gte: AssertionMethod<[val: number, msg?: string]>; + + haveOwnProperty: AssertionMethod<[name: PropertyKey, val?: unknown, msg?: string]>; + ownProperty: AssertionMethod<[name: PropertyKey, val?: unknown, msg?: string]>; + + haveOwnPropertyDescriptor: AssertionMethod<[name: PropertyKey, descriptor: PropertyDescriptor, msg?: string]>; + ownPropertyDescriptor: AssertionMethod<[name: PropertyKey, descriptor: PropertyDescriptor, msg?: string]>; + + increase: AssertionMethod<[subject: Function]> & + AssertionMethod<[subject: object, prop: PropertyKey, msg?: string]>; + increases: AssertionMethod<[subject: Function]> & + AssertionMethod<[subject: object, prop: PropertyKey, msg?: string]>; + + instanceOf: AssertionMethod<[ctor: Constructor, msg?: string]>; + instanceof: AssertionMethod<[ctor: Constructor, msg?: string]>; + + key: AssertionMethod<[keys: Array | Record]>; + keys: AssertionMethod<[keys: Array | Record]>; + + length: ChainedMethod<[n?: number, msg?: string]>; + lengthOf: ChainedMethod<[n?: number, msg?: string]>; + + lessThanOrEqual: AssertionMethod<[val: number, msg?: string]>; + lte: AssertionMethod<[val: number, msg?: string]>; + most: AssertionMethod<[val: unknown, msg?: string]>; + + match: AssertionMethod<[re: RegExp, msg?: string]>; + matches: AssertionMethod<[re: RegExp, msg?: string]>; + + members: AssertionMethod<[subset: unknown[], msg?: string]>; + + oneOf: AssertionMethod<[list: unknown[], msg?: string]>; + + property: AssertionMethod<[name: PropertyKey, val?: unknown, msg?: string]>; + + respondTo: AssertionMethod<[method: string, msg?: string]>; + respondsTo: AssertionMethod<[method: string, msg?: string]>; + + satifies: AssertionMethod<[matcher: Function, msg?: string]>; + satisfy: AssertionMethod<[matcher: Function, msg?: string]>; + + string: AssertionMethod<[str: string, msg?: string]>; + + Throw: AssertionMethod<[errMsgMatcher: string | RegExp]> & + AssertionMethod<[errorLike: Error | Constructor, errMsgMatcher: string | RegExp, msg?: string]>; + throws: AssertionMethod<[errMsgMatcher: string | RegExp]> & + AssertionMethod<[errorLike: Error | Constructor, errMsgMatcher: string | RegExp, msg?: string]>; + throw: AssertionMethod<[errMsgMatcher: string | RegExp]> & + AssertionMethod<[errorLike: Error | Constructor, errMsgMatcher: string | RegExp, msg?: string]>; + + within: AssertionMethod<[start: number, finish: number, msg?: string]>; + } +} + /** * ### Language Chains * @@ -299,7 +444,7 @@ Assertion.addProperty('all', function () { * @api public */ -function an (type, msg) { +function an (this: Assertion, type: string, msg?: string) { if (msg) flag(this, 'message', msg); type = type.toLowerCase(); var obj = flag(this, 'object') @@ -462,15 +607,15 @@ Assertion.addChainableMethod('a', an); * @api public */ -function SameValueZero(a, b) { +function SameValueZero(a: unknown, b: unknown) { return (_.isNaN(a) && _.isNaN(b)) || a === b; } -function includeChainingBehavior () { +function includeChainingBehavior (this: Assertion): void { flag(this, 'contains', true); } -function include (val, msg) { +function include (this: Assertion, val: unknown, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') @@ -488,7 +633,7 @@ function include (val, msg) { switch (objType) { case 'string': - included = obj.indexOf(val) !== -1; + included = (obj as string).indexOf(val as string) !== -1; break; case 'weakset': @@ -500,32 +645,32 @@ function include (val, msg) { ); } - included = obj.has(val); + included = (obj as WeakSet).has(val as object); break; case 'map': - obj.forEach(function (item) { + (obj as Map).forEach(function (item) { included = included || isEql(item, val); }); break; case 'set': if (isDeep) { - obj.forEach(function (item) { + (obj as Set).forEach(function (item) { included = included || isEql(item, val); }); } else { - included = obj.has(val); + included = (obj as Set).has(val); } break; case 'array': if (isDeep) { - included = obj.some(function (item) { + included = (obj as Array).some(function (item) { return isEql(item, val); }) } else { - included = obj.indexOf(val) !== -1; + included = (obj as Array).indexOf(val) !== -1; } break; @@ -547,24 +692,24 @@ function include (val, msg) { ); } - var props = Object.keys(val) - , firstErr = null + var props = Object.keys(val as object) + , firstErr: unknown = null , numErrs = 0; - props.forEach(function (prop) { - var propAssertion = new Assertion(obj); + props.forEach(function (this: Assertion, prop) { + var propAssertion = Assertion.create(obj); _.transferFlags(this, propAssertion, true); flag(propAssertion, 'lockSsfi', true); if (!negate || props.length === 1) { - propAssertion.property(prop, val[prop]); + propAssertion.property(prop, (val as Record)[prop]); return; } try { - propAssertion.property(prop, val[prop]); + propAssertion.property(prop, (val as Record)[prop]); } catch (err) { - if (!_.checkError.compatibleConstructor(err, AssertionError)) { + if (!_.checkError.compatibleConstructor(err as Error, AssertionError)) { throw err; } if (firstErr === null) firstErr = err; @@ -833,7 +978,7 @@ Assertion.addProperty('NaN', function () { * @api public */ -function assertExist () { +function assertExist (this: Assertion) { var val = flag(this, 'object'); this.assert( val !== null && val !== undefined @@ -905,11 +1050,11 @@ Assertion.addProperty('empty', function () { switch (_.type(val).toLowerCase()) { case 'array': case 'string': - itemsCount = val.length; + itemsCount = (val as Array | string).length; break; case 'map': case 'set': - itemsCount = val.size; + itemsCount = (val as Map | Set).size; break; case 'weakmap': case 'weakset': @@ -919,7 +1064,7 @@ Assertion.addProperty('empty', function () { ssfi ); case 'function': - var msg = flagMsg + '.empty was passed a function ' + _.getName(val); + var msg = flagMsg + '.empty was passed a function ' + _.getName(val as Function); throw new AssertionError(msg.trim(), undefined, ssfi); default: if (val !== Object(val)) { @@ -929,7 +1074,7 @@ Assertion.addProperty('empty', function () { ssfi ); } - itemsCount = Object.keys(val).length; + itemsCount = Object.keys(val as object).length; } this.assert( @@ -969,7 +1114,7 @@ Assertion.addProperty('empty', function () { * @api public */ -function checkArguments () { +function checkArguments (this: Assertion) { var obj = flag(this, 'object') , type = _.type(obj); this.assert( @@ -1027,7 +1172,7 @@ Assertion.addProperty('Arguments', checkArguments); * @api public */ -function assertEqual (val, msg) { +function assertEqual (this: Assertion, val: unknown, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); if (flag(this, 'deep')) { @@ -1092,7 +1237,7 @@ Assertion.addMethod('eq', assertEqual); * @api public */ -function assertEql(obj, msg) { +function assertEql(this: Assertion, obj: unknown, msg?: string) { if (msg) flag(this, 'message', msg); var eql = flag(this, 'eql'); this.assert( @@ -1151,7 +1296,7 @@ Assertion.addMethod('eqls', assertEql); * @api public */ -function assertAbove (n, msg) { +function assertAbove (this: Assertion, n: unknown, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , doLength = flag(this, 'doLength') @@ -1160,11 +1305,11 @@ function assertAbove (n, msg) { , ssfi = flag(this, 'ssfi') , objType = _.type(obj).toLowerCase() , nType = _.type(n).toLowerCase() - , errorMessage + , errorMessage = 'unknown error' , shouldThrow = true; if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + Assertion.create(obj, flagMsg, ssfi, true).to.have.property('length'); } if (!doLength && (objType === 'date' && nType !== 'date')) { @@ -1187,12 +1332,12 @@ function assertAbove (n, msg) { , itemsCount; if (objType === 'map' || objType === 'set') { descriptor = 'size'; - itemsCount = obj.size; + itemsCount = (obj as Set | Map).size; } else { - itemsCount = obj.length; + itemsCount = (obj as Array).length; } this.assert( - itemsCount > n + itemsCount > (n as number) , 'expected #{this} to have a ' + descriptor + ' above #{exp} but got #{act}' , 'expected #{this} to not have a ' + descriptor + ' above #{exp}' , n @@ -1200,7 +1345,7 @@ function assertAbove (n, msg) { ); } else { this.assert( - obj > n + (obj as number) > (n as number) , 'expected #{this} to be above #{exp}' , 'expected #{this} to be at most #{exp}' , n @@ -1256,7 +1401,7 @@ Assertion.addMethod('greaterThan', assertAbove); * @api public */ -function assertLeast (n, msg) { +function assertLeast (this: Assertion, n: unknown, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , doLength = flag(this, 'doLength') @@ -1265,11 +1410,11 @@ function assertLeast (n, msg) { , ssfi = flag(this, 'ssfi') , objType = _.type(obj).toLowerCase() , nType = _.type(n).toLowerCase() - , errorMessage + , errorMessage = 'unknown error' , shouldThrow = true; if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + Assertion.create(obj, flagMsg, ssfi, true).to.have.property('length'); } if (!doLength && (objType === 'date' && nType !== 'date')) { @@ -1292,12 +1437,12 @@ function assertLeast (n, msg) { , itemsCount; if (objType === 'map' || objType === 'set') { descriptor = 'size'; - itemsCount = obj.size; + itemsCount = (obj as Set | Map).size; } else { - itemsCount = obj.length; + itemsCount = (obj as Array).length; } this.assert( - itemsCount >= n + itemsCount >= (n as number) , 'expected #{this} to have a ' + descriptor + ' at least #{exp} but got #{act}' , 'expected #{this} to have a ' + descriptor + ' below #{exp}' , n @@ -1305,7 +1450,7 @@ function assertLeast (n, msg) { ); } else { this.assert( - obj >= n + (obj as number) >= (n as number) , 'expected #{this} to be at least #{exp}' , 'expected #{this} to be below #{exp}' , n @@ -1360,7 +1505,7 @@ Assertion.addMethod('greaterThanOrEqual', assertLeast); * @api public */ -function assertBelow (n, msg) { +function assertBelow (this: Assertion, n: unknown, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , doLength = flag(this, 'doLength') @@ -1369,11 +1514,11 @@ function assertBelow (n, msg) { , ssfi = flag(this, 'ssfi') , objType = _.type(obj).toLowerCase() , nType = _.type(n).toLowerCase() - , errorMessage + , errorMessage = 'unknown error' , shouldThrow = true; if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + Assertion.create(obj, flagMsg, ssfi, true).to.have.property('length'); } if (!doLength && (objType === 'date' && nType !== 'date')) { @@ -1396,12 +1541,12 @@ function assertBelow (n, msg) { , itemsCount; if (objType === 'map' || objType === 'set') { descriptor = 'size'; - itemsCount = obj.size; + itemsCount = (obj as Set | Map).size; } else { - itemsCount = obj.length; + itemsCount = (obj as Array).length; } this.assert( - itemsCount < n + itemsCount < (n as number) , 'expected #{this} to have a ' + descriptor + ' below #{exp} but got #{act}' , 'expected #{this} to not have a ' + descriptor + ' below #{exp}' , n @@ -1409,7 +1554,7 @@ function assertBelow (n, msg) { ); } else { this.assert( - obj < n + (obj as number) < (n as number) , 'expected #{this} to be below #{exp}' , 'expected #{this} to be at least #{exp}' , n @@ -1465,7 +1610,7 @@ Assertion.addMethod('lessThan', assertBelow); * @api public */ -function assertMost (n, msg) { +function assertMost (this: Assertion, n: unknown, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , doLength = flag(this, 'doLength') @@ -1474,11 +1619,11 @@ function assertMost (n, msg) { , ssfi = flag(this, 'ssfi') , objType = _.type(obj).toLowerCase() , nType = _.type(n).toLowerCase() - , errorMessage + , errorMessage = 'unknown error' , shouldThrow = true; if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + Assertion.create(obj, flagMsg, ssfi, true).to.have.property('length'); } if (!doLength && (objType === 'date' && nType !== 'date')) { @@ -1501,12 +1646,12 @@ function assertMost (n, msg) { , itemsCount; if (objType === 'map' || objType === 'set') { descriptor = 'size'; - itemsCount = obj.size; + itemsCount = (obj as Set | Map).size; } else { - itemsCount = obj.length; + itemsCount = (obj as Array).length; } this.assert( - itemsCount <= n + itemsCount <= (n as number) , 'expected #{this} to have a ' + descriptor + ' at most #{exp} but got #{act}' , 'expected #{this} to have a ' + descriptor + ' above #{exp}' , n @@ -1514,7 +1659,7 @@ function assertMost (n, msg) { ); } else { this.assert( - obj <= n + (obj as number) <= (n as number) , 'expected #{this} to be at most #{exp}' , 'expected #{this} to be above #{exp}' , n @@ -1569,7 +1714,9 @@ Assertion.addMethod('lessThanOrEqual', assertMost); * @api public */ -Assertion.addMethod('within', function (start, finish, msg) { +function assertWithin(start: number, finish: number, msg?: string): void; +function assertWithin(start: Date, finish: Date, msg?: string): void; +function assertWithin(this: Assertion, start: number | Date, finish: number | Date, msg?: string): void { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , doLength = flag(this, 'doLength') @@ -1579,14 +1726,14 @@ Assertion.addMethod('within', function (start, finish, msg) { , objType = _.type(obj).toLowerCase() , startType = _.type(start).toLowerCase() , finishType = _.type(finish).toLowerCase() - , errorMessage + , errorMessage = 'unknown error' , shouldThrow = true , range = (startType === 'date' && finishType === 'date') - ? start.toISOString() + '..' + finish.toISOString() + ? (start as Date).toISOString() + '..' + (finish as Date).toISOString() : start + '..' + finish; if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + Assertion.create(obj, flagMsg, ssfi, true).to.have.property('length'); } if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) { @@ -1609,23 +1756,25 @@ Assertion.addMethod('within', function (start, finish, msg) { , itemsCount; if (objType === 'map' || objType === 'set') { descriptor = 'size'; - itemsCount = obj.size; + itemsCount = (obj as Set | Map).size; } else { - itemsCount = obj.length; + itemsCount = (obj as Array).length; } this.assert( - itemsCount >= start && itemsCount <= finish + itemsCount >= (start as number) && itemsCount <= (finish as number) , 'expected #{this} to have a ' + descriptor + ' within ' + range , 'expected #{this} to not have a ' + descriptor + ' within ' + range ); } else { this.assert( - obj >= start && obj <= finish + (obj as number) >= (start as number) && (obj as number) <= (finish as number) , 'expected #{this} to be within ' + range , 'expected #{this} to not be within ' + range ); } -}); +} + +Assertion.addMethod('within', assertWithin); /** * ### .instanceof(constructor[, msg]) @@ -1666,7 +1815,7 @@ Assertion.addMethod('within', function (start, finish, msg) { * @api public */ -function assertInstanceOf (constructor, msg) { +function assertInstanceOf (this: Assertion, constructor: {new(): unknown}, msg?: string) { if (msg) flag(this, 'message', msg); var target = flag(this, 'object') @@ -1815,7 +1964,7 @@ Assertion.addMethod('instanceOf', assertInstanceOf); * @api public */ -function assertProperty (name, val, msg) { +function assertProperty (this: Assertion, name: PropertyKey, val?: unknown, msg?: string) { if (msg) flag(this, 'message', msg); var isNested = flag(this, 'nested') @@ -1863,9 +2012,17 @@ function assertProperty (name, val, msg) { var isDeep = flag(this, 'deep') , negate = flag(this, 'negate') - , pathInfo = isNested ? _.getPathInfo(obj, name) : null - , value = isNested ? pathInfo.value : obj[name] - , isEql = isDeep ? flag(this, 'eql') : (val1, val2) => val1 === val2; + , isEql = isDeep ? flag(this, 'eql') : (val1: unknown, val2: unknown): boolean => val1 === val2; + let pathInfo; + let value; + + if (isNested) { + pathInfo = _.getPathInfo(obj, name as string); + value = pathInfo.value; + } else { + pathInfo = null; + value = (obj as Record)[name]; + } var descriptor = ''; if (isDeep) descriptor += 'deep '; @@ -1875,7 +2032,7 @@ function assertProperty (name, val, msg) { var hasProperty; if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name); - else if (isNested) hasProperty = pathInfo.exists; + else if (isNested && pathInfo) hasProperty = pathInfo.exists; else hasProperty = _.hasProperty(obj, name); // When performing a negated assertion for both name and val, merely having @@ -1905,9 +2062,10 @@ function assertProperty (name, val, msg) { Assertion.addMethod('property', assertProperty); -function assertOwnProperty (name, value, msg) { +function assertOwnProperty (this: Assertion) { flag(this, 'own', true); - assertProperty.apply(this, arguments); + // TODO (43081j): remove this highly questionable cast + assertProperty.apply(this, arguments as unknown as Parameters); } Assertion.addMethod('ownProperty', assertOwnProperty); @@ -2032,7 +2190,7 @@ Assertion.addMethod('haveOwnProperty', assertOwnProperty); * @api public */ -function assertOwnPropertyDescriptor (name, descriptor, msg) { +function assertOwnPropertyDescriptor (this: Assertion, name: PropertyKey, descriptor?: unknown, msg?: string) { if (typeof descriptor === 'string') { msg = descriptor; descriptor = null; @@ -2121,11 +2279,11 @@ Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor); * @api public */ -function assertLengthChain () { +function assertLengthChain (this: Assertion) { flag(this, 'doLength', true); } -function assertLength (n, msg) { +function assertLength (this: Assertion, n: number, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , objType = _.type(obj).toLowerCase() @@ -2138,11 +2296,11 @@ function assertLength (n, msg) { case 'map': case 'set': descriptor = 'size'; - itemsCount = obj.size; + itemsCount = (obj as Set | Map).size; break; default: - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); - itemsCount = obj.length; + Assertion.create(obj, flagMsg, ssfi, true).to.have.property('length'); + itemsCount = (obj as Array).length; } this.assert( @@ -2184,11 +2342,11 @@ Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain); * @namespace BDD * @api public */ -function assertMatch(re, msg) { +function assertMatch(this: Assertion, re: RegExp, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); this.assert( - re.exec(obj) + re.exec(obj as string) , 'expected #{this} to match ' + re , 'expected #{this} not to match ' + re ); @@ -2222,15 +2380,15 @@ Assertion.addMethod('matches', assertMatch); * @api public */ -Assertion.addMethod('string', function (str, msg) { +Assertion.addMethod('string', function (str: string, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , flagMsg = flag(this, 'message') , ssfi = flag(this, 'ssfi'); - new Assertion(obj, flagMsg, ssfi, true).is.a('string'); + Assertion.create(obj, flagMsg, ssfi, true).is.a('string'); this.assert( - ~obj.indexOf(str) + ~(obj as string).indexOf(str) , 'expected #{this} to contain ' + _.inspect(str) , 'expected #{this} to not contain ' + _.inspect(str) ); @@ -2340,7 +2498,7 @@ Assertion.addMethod('string', function (str, msg) { * @api public */ -function assertKeys (keys) { +function assertKeys (this: Assertion, keys: Array|Record) { var obj = flag(this, 'object') , objType = _.type(obj) , keysType = _.type(keys) @@ -2348,9 +2506,10 @@ function assertKeys (keys) { , isDeep = flag(this, 'deep') , str , deepStr = '' - , actual + , actual: PropertyKey[] = [] , ok = true - , flagMsg = flag(this, 'message'); + , flagMsg = flag(this, 'message') + , normalisedKeys: PropertyKey[] = []; flagMsg = flagMsg ? flagMsg + ': ' : ''; var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments'; @@ -2360,45 +2519,50 @@ function assertKeys (keys) { actual = []; // Map and Set '.keys' aren't supported in IE 11. Therefore, use .forEach. - obj.forEach(function (val, key) { actual.push(key) }); + (obj as Set | Map).forEach(function (_val, key) { + (actual as Array).push(key); + }); if (keysType !== 'Array') { - keys = Array.prototype.slice.call(arguments); + normalisedKeys = Array.prototype.slice.call(arguments); + } else { + normalisedKeys = keys as PropertyKey[]; } } else { - actual = _.getOwnEnumerableProperties(obj); + actual = _.getOwnEnumerableProperties(obj as object); switch (keysType) { case 'Array': if (arguments.length > 1) { throw new AssertionError(mixedArgsMsg, undefined, ssfi); } + normalisedKeys = keys as PropertyKey[]; break; case 'Object': if (arguments.length > 1) { throw new AssertionError(mixedArgsMsg, undefined, ssfi); } - keys = Object.keys(keys); + normalisedKeys = Object.keys(keys); break; default: - keys = Array.prototype.slice.call(arguments); + normalisedKeys = Array.prototype.slice.call(arguments); } // Only stringify non-Symbols because Symbols would become "Symbol()" - keys = keys.map(function (val) { + normalisedKeys = normalisedKeys.map(function (val) { return typeof val === 'symbol' ? val : String(val); }); } - if (!keys.length) { + if (!normalisedKeys.length) { throw new AssertionError(flagMsg + 'keys required', undefined, ssfi); } - var len = keys.length + var len = normalisedKeys.length , any = flag(this, 'any') , all = flag(this, 'all') - , expected = keys - , isEql = isDeep ? flag(this, 'eql') : (val1, val2) => val1 === val2; + , expected = normalisedKeys + , isEql = isDeep ? flag(this, 'eql') : (val1: unknown, val2: unknown): boolean => val1 === val2; if (!any && !all) { all = true; @@ -2422,24 +2586,24 @@ function assertKeys (keys) { }); if (!flag(this, 'contains')) { - ok = ok && keys.length == actual.length; + ok = ok && normalisedKeys.length == actual.length; } } // Key string if (len > 1) { - keys = keys.map(function(key) { + normalisedKeys = normalisedKeys.map(function(key) { return _.inspect(key); }); - var last = keys.pop(); + var last = normalisedKeys.pop(); if (all) { - str = keys.join(', ') + ', and ' + last; + str = normalisedKeys.join(', ') + ', and ' + String(last); } if (any) { - str = keys.join(', ') + ', or ' + last; + str = normalisedKeys.join(', ') + ', or ' + String(last); } } else { - str = _.inspect(keys[0]); + str = _.inspect(normalisedKeys[0]); } // Form @@ -2627,22 +2791,41 @@ Assertion.addMethod('key', assertKeys); * @api public */ -function assertThrows (errorLike, errMsgMatcher, msg) { +function assertThrows( + this: Assertion, + errMsgMatcher: string | RegExp +): void; +function assertThrows( + this: Assertion, + errorLike: Error | Constructor, + errMsgMatcher: string | RegExp, + msg?: string +): void; +function assertThrows( + this: Assertion, + errorLikeOrMatcher: Error | Constructor | string | RegExp, + errMsgMatcher?: string|RegExp, + msg?: string +): void { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , ssfi = flag(this, 'ssfi') , flagMsg = flag(this, 'message') , negate = flag(this, 'negate') || false; - new Assertion(obj, flagMsg, ssfi, true).is.a('function'); + Assertion.create(obj, flagMsg, ssfi, true).is.a('function'); - if (errorLike instanceof RegExp || typeof errorLike === 'string') { - errMsgMatcher = errorLike; + let errorLike: Error | Constructor | null; + + if (errorLikeOrMatcher instanceof RegExp || typeof errorLikeOrMatcher === 'string') { + errMsgMatcher = errorLikeOrMatcher; errorLike = null; + } else { + errorLike = errorLikeOrMatcher; } var caughtErr; try { - obj(); + (obj as () => void)(); } catch (err) { caughtErr = err; } @@ -2674,14 +2857,14 @@ function assertThrows (errorLike, errMsgMatcher, msg) { , errorLike && errorLike.toString() , (caughtErr instanceof Error ? caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr && - _.checkError.getConstructorName(caughtErr))) + _.checkError.getConstructorName(caughtErr as Error))) ); } if (errorLike && caughtErr) { // We should compare instances only if `errorLike` is an instance of `Error` if (errorLike instanceof Error) { - var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike); + var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr as Error, errorLike); if (isCompatibleInstance === negate) { // These checks were created to ensure we won't fail too soon when we've got both args and a negate @@ -2700,7 +2883,7 @@ function assertThrows (errorLike, errMsgMatcher, msg) { } } - var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike); + var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr as Error, errorLike); if (isCompatibleConstructor === negate) { if (everyArgIsDefined && negate) { errorLikeFail = true; @@ -2710,7 +2893,7 @@ function assertThrows (errorLike, errMsgMatcher, msg) { , 'expected #{this} to throw #{exp} but #{act} was thrown' , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) - , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) + , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr as Error)) ); } } @@ -2723,7 +2906,7 @@ function assertThrows (errorLike, errMsgMatcher, msg) { placeholder = 'matching' } - var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher); + var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr as Error, errMsgMatcher); if (isCompatibleMessage === negate) { if (everyArgIsDefined && negate) { errMsgMatcherFail = true; @@ -2733,7 +2916,7 @@ function assertThrows (errorLike, errMsgMatcher, msg) { , 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}' , 'expected #{this} to throw error not ' + placeholder + ' #{exp}' , errMsgMatcher - , _.checkError.getMessage(caughtErr) + , _.checkError.getMessage(caughtErr as Error) ); } } @@ -2746,7 +2929,7 @@ function assertThrows (errorLike, errMsgMatcher, msg) { , 'expected #{this} to throw #{exp} but #{act} was thrown' , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) - , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) + , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr as Error)) ); } @@ -2822,13 +3005,13 @@ Assertion.addMethod('Throw', assertThrows); * @api public */ -function respondTo (method, msg) { +function respondTo (this: Assertion, method: PropertyKey, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , itself = flag(this, 'itself') , context = ('function' === typeof obj && !itself) ? obj.prototype[method] - : obj[method]; + : (obj as Record)[method]; this.assert( 'function' === typeof context @@ -2902,7 +3085,7 @@ Assertion.addProperty('itself', function () { * @api public */ -function satisfy (matcher, msg) { +function satisfy (this: Assertion, matcher: Function, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); var result = matcher(obj); @@ -2956,13 +3139,13 @@ Assertion.addMethod('satisfies', satisfy); * @api public */ -function closeTo(expected, delta, msg) { +function closeTo(this: Assertion, expected: number, delta: number, msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , flagMsg = flag(this, 'message') , ssfi = flag(this, 'ssfi'); - new Assertion(obj, flagMsg, ssfi, true).is.a('number'); + Assertion.create(obj, flagMsg, ssfi, true).is.a('number'); if (typeof expected !== 'number' || typeof delta !== 'number') { flagMsg = flagMsg ? flagMsg + ': ' : ''; var deltaMessage = delta === undefined ? ", and a delta is required" : ""; @@ -2974,7 +3157,7 @@ function closeTo(expected, delta, msg) { } this.assert( - Math.abs(obj - expected) <= delta + Math.abs((obj as number) - expected) <= delta , 'expected #{this} to be close to ' + expected + ' +/- ' + delta , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta ); @@ -2984,7 +3167,13 @@ Assertion.addMethod('closeTo', closeTo); Assertion.addMethod('approximately', closeTo); // Note: Duplicates are ignored if testing for inclusion instead of sameness. -function isSubsetOf(subset, superset, cmp, contains, ordered) { +function isSubsetOf( + subset: unknown[], + superset: unknown[], + cmp: ((a: unknown, b: unknown) => boolean) | undefined, + contains: boolean, + ordered: boolean +) { if (!contains) { if (subset.length !== superset.length) return false; superset = superset.slice(); @@ -3081,17 +3270,17 @@ function isSubsetOf(subset, superset, cmp, contains, ordered) { * @api public */ -Assertion.addMethod('members', function (subset, msg) { +Assertion.addMethod('members', function (subset: unknown[], msg?: string) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object') , flagMsg = flag(this, 'message') , ssfi = flag(this, 'ssfi'); - new Assertion(obj, flagMsg, ssfi, true).to.be.an('array'); - new Assertion(subset, flagMsg, ssfi, true).to.be.an('array'); + Assertion.create(obj, flagMsg, ssfi, true).to.be.an('array'); + Assertion.create(subset, flagMsg, ssfi, true).to.be.an('array'); - var contains = flag(this, 'contains'); - var ordered = flag(this, 'ordered'); + var contains = flag(this, 'contains') === true; + var ordered = flag(this, 'ordered') === true; var subject, failMsg, failNegateMsg; @@ -3108,7 +3297,7 @@ Assertion.addMethod('members', function (subset, msg) { var cmp = flag(this, 'deep') ? flag(this, 'eql') : undefined; this.assert( - isSubsetOf(subset, obj, cmp, contains, ordered) + isSubsetOf(subset, (obj as unknown[]), cmp, contains, ordered) , failMsg , failNegateMsg , subset @@ -3155,7 +3344,7 @@ Assertion.addMethod('members', function (subset, msg) { * @api public */ -function oneOf (list, msg) { +function oneOf (this: Assertion, list: unknown[], msg?: string) { if (msg) flag(this, 'message', msg); var expected = flag(this, 'object') , flagMsg = flag(this, 'message') @@ -3163,11 +3352,11 @@ function oneOf (list, msg) { , contains = flag(this, 'contains') , isDeep = flag(this, 'deep') , eql = flag(this, 'eql'); - new Assertion(list, flagMsg, ssfi, true).to.be.an('array'); + Assertion.create(list, flagMsg, ssfi, true).to.be.an('array'); if (contains) { this.assert( - list.some(function(possibility) { return expected.indexOf(possibility) > -1 }) + list.some(function(possibility) { return (expected as Array).indexOf(possibility) > -1 }) , 'expected #{this} to contain one of #{exp}' , 'expected #{this} to not contain one of #{exp}' , list @@ -3291,26 +3480,42 @@ Assertion.addMethod('oneOf', oneOf); * @api public */ -function assertChanges (subject, prop, msg) { +function assertChanges( + this: Assertion, + subject: object, + prop: PropertyKey, + msg?: string +): void; +function assertChanges( + this: Assertion, + subject: Function +): void; +function assertChanges( + this: Assertion, + subject: Function | object, + prop?: PropertyKey, + msg?: string +) { if (msg) flag(this, 'message', msg); - var fn = flag(this, 'object') + var fn = flag(this, 'object') as () => void , flagMsg = flag(this, 'message') , ssfi = flag(this, 'ssfi'); - new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + Assertion.create(fn, flagMsg, ssfi, true).is.a('function'); var initial; if (!prop) { - new Assertion(subject, flagMsg, ssfi, true).is.a('function'); - initial = subject(); + Assertion.create(subject, flagMsg, ssfi, true).is.a('function'); + initial = (subject as () => void)(); } else { - new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); - initial = subject[prop]; + Assertion.create(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = (subject as Record)[prop]; } fn(); - var final = prop === undefined || prop === null ? subject() : subject[prop]; - var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + var final = prop === undefined || prop === null ? + (subject as () => void)() : (subject as Record)[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + String(prop); // This gets flagged because of the .by(delta) assertion flag(this, 'deltaMsgObj', msgObj); @@ -3408,29 +3613,45 @@ Assertion.addMethod('changes', assertChanges); * @api public */ -function assertIncreases (subject, prop, msg) { +function assertIncreases( + this: Assertion, + subject: () => void +): void; +function assertIncreases( + this: Assertion, + subject: object, + prop: PropertyKey, + msg?: string +): void; +function assertIncreases( + this: Assertion, + subject: object | (() => number), + prop?: PropertyKey, + msg?: string +): void { if (msg) flag(this, 'message', msg); - var fn = flag(this, 'object') + var fn = flag(this, 'object') as () => void , flagMsg = flag(this, 'message') , ssfi = flag(this, 'ssfi'); - new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + Assertion.create(fn, flagMsg, ssfi, true).is.a('function'); var initial; if (!prop) { - new Assertion(subject, flagMsg, ssfi, true).is.a('function'); - initial = subject(); + Assertion.create(subject, flagMsg, ssfi, true).is.a('function'); + initial = (subject as () => number)(); } else { - new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); - initial = subject[prop]; + Assertion.create(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = (subject as Record)[prop]; } // Make sure that the target is a number - new Assertion(initial, flagMsg, ssfi, true).is.a('number'); + Assertion.create(initial, flagMsg, ssfi, true).is.a('number'); fn(); - var final = prop === undefined || prop === null ? subject() : subject[prop]; - var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + var final = prop === undefined || prop === null ? + (subject as () => number)() : (subject as Record)[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + String(prop); flag(this, 'deltaMsgObj', msgObj); flag(this, 'initialDeltaValue', initial); @@ -3527,29 +3748,45 @@ Assertion.addMethod('increases', assertIncreases); * @api public */ -function assertDecreases (subject, prop, msg) { +function assertDecreases( + this: Assertion, + subject: () => number +): void; +function assertDecreases( + this: Assertion, + subject: object, + prop: PropertyKey, + msg?: string +): void; +function assertDecreases( + this: Assertion, + subject: object | (() => number), + prop?: PropertyKey, + msg?: string +): void { if (msg) flag(this, 'message', msg); - var fn = flag(this, 'object') + var fn = flag(this, 'object') as () => void , flagMsg = flag(this, 'message') , ssfi = flag(this, 'ssfi'); - new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + Assertion.create(fn, flagMsg, ssfi, true).is.a('function'); var initial; if (!prop) { - new Assertion(subject, flagMsg, ssfi, true).is.a('function'); - initial = subject(); + Assertion.create(subject, flagMsg, ssfi, true).is.a('function'); + initial = (subject as () => number)(); } else { - new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); - initial = subject[prop]; + Assertion.create(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = (subject as Record)[prop]; } // Make sure that the target is a number - new Assertion(initial, flagMsg, ssfi, true).is.a('number'); + Assertion.create(initial, flagMsg, ssfi, true).is.a('number'); fn(); - var final = prop === undefined || prop === null ? subject() : subject[prop]; - var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + var final = prop === undefined || prop === null ? + (subject as () => number)() : (subject as Record)[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + String(prop); flag(this, 'deltaMsgObj', msgObj); flag(this, 'initialDeltaValue', initial); @@ -3633,12 +3870,12 @@ Assertion.addMethod('decreases', assertDecreases); * @api public */ -function assertDelta(delta, msg) { +function assertDelta(this: Assertion, delta: number, msg?: string) { if (msg) flag(this, 'message', msg); var msgObj = flag(this, 'deltaMsgObj'); - var initial = flag(this, 'initialDeltaValue'); - var final = flag(this, 'finalDeltaValue'); + var initial = flag(this, 'initialDeltaValue') as number; + var final = flag(this, 'finalDeltaValue') as number; var behavior = flag(this, 'deltaBehavior'); var realDelta = flag(this, 'realDelta'); @@ -3839,7 +4076,7 @@ Assertion.addProperty('frozen', function() { * @api public */ -Assertion.addProperty('finite', function(msg) { +Assertion.addProperty('finite', function() { var obj = flag(this, 'object'); this.assert( diff --git a/lib/chai/interface/assert.js b/src/chai/interface/assert.ts similarity index 63% rename from lib/chai/interface/assert.js rename to src/chai/interface/assert.ts index 77af8eadc..965736b66 100644 --- a/lib/chai/interface/assert.js +++ b/src/chai/interface/assert.ts @@ -4,11 +4,356 @@ * MIT Licensed */ -import * as chai from '../../../index.js'; +import * as chai from '../../chai.js'; import {Assertion} from '../assertion.js'; import {flag, inspect} from '../utils/index.js'; import {AssertionError} from 'assertion-error'; +type Constructor = {new(): T}; + +export interface AssertInterface { + (expr: unknown, msg?: string): void; + fail(actual: unknown, expected: unknown, message: string, operator: string): void; + isOk(val: unknown, msg?: string): void; + ok(val: unknown, msg?: string): void; + isNotOk(val: unknown, msg?: string): void; + notOk(val: unknown, msg?: string): void; + equal(actual: unknown, expected: unknown, msg?: string): void; + notEqual(actual: unknown, expected: unknown, msg?: string): void; + strictEqual(actual: unknown, expected: unknown, msg?: string): void; + notStrictEqual(actual: unknown, expected: unknown, msg?: string): void; + deepEqual(actual: unknown, expected: unknown, msg?: string): void; + deepStrictEqual(actual: unknown, expected: unknown, msg?: string): void; + notDeepEqual(actual: unknown, expected: unknown, msg?: string): void; + isAbove(val: unknown, abv: unknown, msg?: string): void; + isAtLeast(val: unknown, atlst: unknown, msg?: string): void; + isBelow(val: unknown, blw: unknown, msg?: string): void; + isAtMost(val: unknown, atmst: unknown, msg?: string): void; + isTrue(val: unknown, msg?: string): void; + isNotTrue(val: unknown, msg?: string): void; + isFalse(val: unknown, msg?: string): void; + isNotFalse(val: unknown, msg?: string): void; + isNull(val: unknown, msg?: string): void; + isNotNull(val: unknown, msg?: string): void; + isNaN(val: unknown, msg?: string): void; + isNotNaN(val: unknown, msg?: string): void; + exists(val: unknown, msg?: string): void; + notExists(val: unknown, msg?: string): void; + isUndefined(val: unknown, msg?: string): void; + isDefined(val: unknown, msg?: string): void; + isFunction(val: unknown, msg?: string): void; + isNotFunction(val: unknown, msg?: string): void; + isObject(val: unknown, msg?: string): void; + isNotObject(val: unknown, msg?: string): void; + isArray(val: unknown, msg?: string): void; + isNotArray(val: unknown, msg?: string): void; + isString(val: unknown, msg?: string): void; + isNotString(val: unknown, msg?: string): void; + isNumber(val: unknown, msg?: string): void; + isNotNumber(val: unknown, msg?: string): void; + isFinite(val: number, msg?: string): void; + isBoolean(val: unknown, msg?: string): void; + isNotBoolean(val: unknown, msg?: string): void; + typeOf(val: unknown, type: string, msg?: string): void; + notTypeOf(val: unknown, type: string, msg?: string): void; + instanceOf(val: object, type: Constructor, msg?: string): void; + notInstanceOf(val: object, type: Constructor, msg?: string): void; + include(expr: string | Array, inc: unknown, msg?: string): void; + notInclude(expr: string | Array, inc: unknown, msg?: string): void; + deepInclude(expr: string | Array, inc: unknown, msg?: string): void; + notDeepInclude(expr: string | Array, inc: unknown, msg?: string): void; + nestedInclude(expr: unknown, inc: unknown, msg?: string): void; + notNestedInclude(expr: unknown, inc: unknown, msg?: string): void; + deepNestedInclude(expr: unknown, inc: unknown, msg?: string): void; + notDeepNestedInclude(expr: unknown, inc: unknown, msg?: string): void; + ownInclude(expr: unknown, inc: unknown, msg?: string): void; + notOwnInclude(expr: unknown, inc: unknown, msg?: string): void; + deepOwnInclude(expr: unknown, inc: unknown, msg?: string): void; + notDeepOwnInclude(expr: unknown, inc: unknown, msg?: string): void; + match(expr: unknown, re: RegExp, msg?: string): void; + notMatch(expr: unknown, re: RegExp, msg?: string): void; + property(obj: unknown, prop: PropertyKey, msg?: string): void; + notProperty(obj: unknown, prop: PropertyKey, msg?: string): void; + propertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + notPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + deepPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + notDeepPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + ownProperty(obj: unknown, prop: PropertyKey, msg?: string): void; + notOwnProperty(obj: unknown, prop: PropertyKey, msg?: string): void; + ownPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + notOwnPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + deepOwnPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + notDeepOwnPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + nestedProperty(obj: unknown, prop: PropertyKey, msg?: string): void; + notNestedProperty(obj: unknown, prop: PropertyKey, msg?: string): void; + nestedPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + notNestedPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + deepNestedPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + notDeepNestedPropertyVal(obj: unknown, prop: PropertyKey, val: unknown, msg?: string): void; + lengthOf(expr: unknown, len: number, msg?: string): void; + hasAnyKeys(obj: unknown, keys: Array | Record, msg?: string): void; + hasAllKeys(obj: unknown, keys: Array | Record, msg?: string): void; + containsAllKeys(obj: unknown, keys: Array | Record, msg?: string): void; + doesNotHaveAnyKeys(obj: unknown, keys: Array | Record, msg?: string): void; + doesNotHaveAllKeys(obj: unknown, keys: Array | Record, msg?: string): void; + hasAnyDeepKeys(obj: unknown, keys: Array | Record, msg?: string): void; + hasAllDeepKeys(obj: unknown, keys: Array | Record, msg?: string): void; + containsAllDeepKeys(obj: unknown, keys: Array | Record, msg?: string): void; + doesNotHaveAnyDeepKeys(obj: unknown, keys: Array | Record, msg?: string): void; + doesNotHaveAllDeepKeys(obj: unknown, keys: Array | Record, msg?: string): void; + + Throw( + fn: Function, + errorLike: Error | Constructor, + errMsgMatcher: RegExp | string, + msg?: string + ): void; + Throw( + fn: Function, + errMsgMatcher: RegExp | string + ): void; + throw( + fn: Function, + errorLike: Error | Constructor, + errMsgMatcher: RegExp | string, + msg?: string + ): void; + throw( + fn: Function, + errMsgMatcher: RegExp | string + ): void; + throws( + fn: Function, + errorLike: Error | Constructor, + errMsgMatcher: RegExp | string, + msg?: string + ): void; + throws( + fn: Function, + errMsgMatcher: RegExp | string + ): void; + + doesNotThrow( + fn: Function, + errMsgMatcher: RegExp | string + ): void; + doesNotThrow( + fn: Function, + errorLike: Error | Constructor, + errMsgMatcher: RegExp | string, + msg?: string + ): void; + + operator(val: unknown, operator: string, val2: unknown, msg?: string): void; + closeTo(actual: number, expected: number, delta: number, msg?: string): void; + approximately(actual: number, expected: number, delta: number, msg?: string): void; + sameMembers(set1: unknown[], set2: unknown[], msg?: string): void; + notSameMembers(set1: unknown[], set2: unknown[], msg?: string): void; + sameDeepMembers(set1: unknown[], set2: unknown[], msg?: string): void; + notSameDeepMembers(set1: unknown[], set2: unknown[], msg?: string): void; + sameOrderedMembers(set1: unknown[], set2: unknown[], msg?: string): void; + notSameOrderedMembers(set1: unknown[], set2: unknown[], msg?: string): void; + sameDeepOrderedMembers(set1: unknown[], set2: unknown[], msg?: string): void; + notSameDeepOrderedMembers(set1: unknown[], set2: unknown[], msg?: string): void; + includeMembers(superset: unknown[], subset: unknown[], msg?: string): void; + notIncludeMembers(superset: unknown[], subset: unknown[], msg?: string): void; + includeDeepMembers(superset: unknown[], subset: unknown[], msg?: string): void; + notIncludeDeepMembers(superset: unknown[], subset: unknown[], msg?: string): void; + includeOrderedMembers(superset: unknown[], subset: unknown[], msg?: string): void; + notIncludeOrderedMembers(superset: unknown[], subset: unknown[], msg?: string): void; + includeDeepOrderedMembers(superset: unknown[], subset: unknown[], msg?: string): void; + notIncludeDeepOrderedMembers(superset: unknown[], subset: unknown[], msg?: string): void; + oneOf(inList: unknown, list: unknown[], msg?: string): void; + + changes( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string + ): void; + changes( + fn: Function, + obj: () => void, + msg?: string + ): void; + + changesBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string + ): void; + changesBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string + ): void; + + doesNotChange( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string + ): Assertion; + doesNotChange( + fn: Function, + obj: () => void, + msg?: string + ): Assertion; + + changesButNotBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string + ): void; + changesButNotBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string + ): void; + + increases( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string + ): Assertion; + increases( + fn: Function, + obj: () => void, + msg?: string + ): Assertion; + + increasesBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string + ): void; + increasesBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string + ): void; + + doesNotIncrease( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string + ): Assertion; + doesNotIncrease( + fn: Function, + obj: () => void, + msg?: string + ): Assertion; + + increasesButNotBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string + ): void; + increasesButNotBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string + ): void; + + decreases( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string + ): Assertion; + decreases( + fn: Function, + obj: () => void, + msg?: string + ): Assertion; + + decreasesBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string + ): void; + decreasesBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string + ): void; + + doesNotDecrease( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string + ): Assertion; + doesNotDecrease( + fn: Function, + obj: () => void, + msg?: string + ): Assertion; + + doesNotDecreaseBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string + ): Assertion; + doesNotDecreaseBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string + ): Assertion; + + decreasesButNotBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string + ): void; + decreasesButNotBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string + ): void; + + ifError(val: unknown): void; + isExtensible(obj: object, msg?: string): void; + extensible(obj: object, msg?: string): void; + isNotExtensible(obj: object, msg?: string): void; + notExtensible(obj: object, msg?: string): void; + isSealed(obj: object, msg?: string): void; + sealed(obj: object, msg?: string): void; + isNotSealed(obj: object, msg?: string): void; + notSealed(obj: object, msg?: string): void; + isFrozen(obj: object, msg?: string): void; + frozen(obj: object, msg?: string): void; + isNotFrozen(obj: object, msg?: string): void; + notFrozen(obj: object, msg?: string): void; + isEmpty(val: unknown, msg?: string): void; + empty(val: unknown, msg?: string): void; + isNotEmpty(val: unknown, msg?: string): void; + notEmpty(val: unknown, msg?: string): void; +} + /** * ### assert(expression, message) * @@ -24,14 +369,14 @@ import {AssertionError} from 'assertion-error'; * @api public */ -function assert(express, errmsg) { - var test = new Assertion(null, null, chai.assert, true); +const assert: AssertInterface = function assert(express: unknown, errmsg?: string) { + var test = Assertion.create(null, null, chai.assert, true); test.assert( express , errmsg , '[ negation message unavailable ]' ); -} +} as AssertInterface; export {assert}; @@ -57,11 +402,11 @@ export {assert}; * @api public */ -assert.fail = function (actual, expected, message, operator) { +assert.fail = function (actual: unknown, expected: unknown, message: string, operator: string) { if (arguments.length < 2) { // Comply with Node's fail([message]) interface - message = actual; + message = actual as string; actual = undefined; } @@ -89,8 +434,8 @@ assert.fail = function (actual, expected, message, operator) { * @api public */ -assert.isOk = function (val, msg) { - new Assertion(val, msg, assert.isOk, true).is.ok; +assert.isOk = assert.ok = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isOk, true).is.ok; }; /** @@ -109,8 +454,8 @@ assert.isOk = function (val, msg) { * @api public */ -assert.isNotOk = function (val, msg) { - new Assertion(val, msg, assert.isNotOk, true).is.not.ok; +assert.isNotOk = assert.notOk = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotOk, true).is.not.ok; }; /** @@ -128,8 +473,8 @@ assert.isNotOk = function (val, msg) { * @api public */ -assert.equal = function (act, exp, msg) { - var test = new Assertion(act, msg, assert.equal, true); +assert.equal = function (act: unknown, exp: unknown, msg?: string) { + var test = Assertion.create(act, msg, assert.equal, true); test.assert( exp == flag(test, 'object') @@ -156,8 +501,8 @@ assert.equal = function (act, exp, msg) { * @api public */ -assert.notEqual = function (act, exp, msg) { - var test = new Assertion(act, msg, assert.notEqual, true); +assert.notEqual = function (act: unknown, exp: unknown, msg?: string) { + var test = Assertion.create(act, msg, assert.notEqual, true); test.assert( exp != flag(test, 'object') @@ -184,8 +529,8 @@ assert.notEqual = function (act, exp, msg) { * @api public */ -assert.strictEqual = function (act, exp, msg) { - new Assertion(act, msg, assert.strictEqual, true).to.equal(exp); +assert.strictEqual = function (act: unknown, exp: unknown, msg?: string) { + Assertion.create(act, msg, assert.strictEqual, true).to.equal(exp); }; /** @@ -203,8 +548,8 @@ assert.strictEqual = function (act, exp, msg) { * @api public */ -assert.notStrictEqual = function (act, exp, msg) { - new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp); +assert.notStrictEqual = function (act: unknown, exp: unknown, msg?: string) { + Assertion.create(act, msg, assert.notStrictEqual, true).to.not.equal(exp); }; /** @@ -223,8 +568,8 @@ assert.notStrictEqual = function (act, exp, msg) { * @api public */ -assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) { - new Assertion(act, msg, assert.deepEqual, true).to.eql(exp); +assert.deepEqual = assert.deepStrictEqual = function (act: unknown, exp: unknown, msg?: string) { + Assertion.create(act, msg, assert.deepEqual, true).to.eql(exp); }; /** @@ -242,8 +587,8 @@ assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) { * @api public */ -assert.notDeepEqual = function (act, exp, msg) { - new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp); +assert.notDeepEqual = function (act: unknown, exp: unknown, msg?: string) { + Assertion.create(act, msg, assert.notDeepEqual, true).to.not.eql(exp); }; /** @@ -261,8 +606,8 @@ assert.notDeepEqual = function (act, exp, msg) { * @api public */ -assert.isAbove = function (val, abv, msg) { - new Assertion(val, msg, assert.isAbove, true).to.be.above(abv); +assert.isAbove = function (val: unknown, abv: unknown, msg?: string) { + Assertion.create(val, msg, assert.isAbove, true).to.be.above(abv); }; /** @@ -281,8 +626,8 @@ assert.isAbove = function (val, abv, msg) { * @api public */ -assert.isAtLeast = function (val, atlst, msg) { - new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst); +assert.isAtLeast = function (val: unknown, atlst?: unknown, msg?: string) { + Assertion.create(val, msg, assert.isAtLeast, true).to.be.least(atlst); }; /** @@ -300,8 +645,8 @@ assert.isAtLeast = function (val, atlst, msg) { * @api public */ -assert.isBelow = function (val, blw, msg) { - new Assertion(val, msg, assert.isBelow, true).to.be.below(blw); +assert.isBelow = function (val: unknown, blw: unknown, msg?: string) { + Assertion.create(val, msg, assert.isBelow, true).to.be.below(blw); }; /** @@ -320,8 +665,8 @@ assert.isBelow = function (val, blw, msg) { * @api public */ -assert.isAtMost = function (val, atmst, msg) { - new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst); +assert.isAtMost = function (val: unknown, atmst: unknown, msg?: string) { + Assertion.create(val, msg, assert.isAtMost, true).to.be.most(atmst); }; /** @@ -339,8 +684,8 @@ assert.isAtMost = function (val, atmst, msg) { * @api public */ -assert.isTrue = function (val, msg) { - new Assertion(val, msg, assert.isTrue, true).is['true']; +assert.isTrue = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isTrue, true).is['true']; }; /** @@ -358,8 +703,8 @@ assert.isTrue = function (val, msg) { * @api public */ -assert.isNotTrue = function (val, msg) { - new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true); +assert.isNotTrue = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotTrue, true).to.not.equal(true); }; /** @@ -377,8 +722,8 @@ assert.isNotTrue = function (val, msg) { * @api public */ -assert.isFalse = function (val, msg) { - new Assertion(val, msg, assert.isFalse, true).is['false']; +assert.isFalse = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isFalse, true).is['false']; }; /** @@ -396,8 +741,8 @@ assert.isFalse = function (val, msg) { * @api public */ -assert.isNotFalse = function (val, msg) { - new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false); +assert.isNotFalse = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotFalse, true).to.not.equal(false); }; /** @@ -414,8 +759,8 @@ assert.isNotFalse = function (val, msg) { * @api public */ -assert.isNull = function (val, msg) { - new Assertion(val, msg, assert.isNull, true).to.equal(null); +assert.isNull = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNull, true).to.equal(null); }; /** @@ -433,8 +778,8 @@ assert.isNull = function (val, msg) { * @api public */ -assert.isNotNull = function (val, msg) { - new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null); +assert.isNotNull = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotNull, true).to.not.equal(null); }; /** @@ -451,8 +796,8 @@ assert.isNotNull = function (val, msg) { * @api public */ -assert.isNaN = function (val, msg) { - new Assertion(val, msg, assert.isNaN, true).to.be.NaN; +assert.isNaN = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNaN, true).to.be.NaN; }; /** @@ -468,8 +813,8 @@ assert.isNaN = function (val, msg) { * @namespace Assert * @api public */ -assert.isNotNaN = function (val, msg) { - new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN; +assert.isNotNaN = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotNaN, true).not.to.be.NaN; }; /** @@ -488,8 +833,8 @@ assert.isNotNaN = function (val, msg) { * @api public */ -assert.exists = function (val, msg) { - new Assertion(val, msg, assert.exists, true).to.exist; +assert.exists = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.exists, true).to.exist; }; /** @@ -510,8 +855,8 @@ assert.exists = function (val, msg) { * @api public */ -assert.notExists = function (val, msg) { - new Assertion(val, msg, assert.notExists, true).to.not.exist; +assert.notExists = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.notExists, true).to.not.exist; }; /** @@ -529,8 +874,8 @@ assert.notExists = function (val, msg) { * @api public */ -assert.isUndefined = function (val, msg) { - new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined); +assert.isUndefined = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isUndefined, true).to.equal(undefined); }; /** @@ -548,8 +893,8 @@ assert.isUndefined = function (val, msg) { * @api public */ -assert.isDefined = function (val, msg) { - new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined); +assert.isDefined = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isDefined, true).to.not.equal(undefined); }; /** @@ -567,8 +912,8 @@ assert.isDefined = function (val, msg) { * @api public */ -assert.isFunction = function (val, msg) { - new Assertion(val, msg, assert.isFunction, true).to.be.a('function'); +assert.isFunction = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isFunction, true).to.be.a('function'); }; /** @@ -586,8 +931,8 @@ assert.isFunction = function (val, msg) { * @api public */ -assert.isNotFunction = function (val, msg) { - new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function'); +assert.isNotFunction = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotFunction, true).to.not.be.a('function'); }; /** @@ -606,8 +951,8 @@ assert.isNotFunction = function (val, msg) { * @api public */ -assert.isObject = function (val, msg) { - new Assertion(val, msg, assert.isObject, true).to.be.a('object'); +assert.isObject = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isObject, true).to.be.a('object'); }; /** @@ -626,8 +971,8 @@ assert.isObject = function (val, msg) { * @api public */ -assert.isNotObject = function (val, msg) { - new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object'); +assert.isNotObject = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotObject, true).to.not.be.a('object'); }; /** @@ -645,8 +990,8 @@ assert.isNotObject = function (val, msg) { * @api public */ -assert.isArray = function (val, msg) { - new Assertion(val, msg, assert.isArray, true).to.be.an('array'); +assert.isArray = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isArray, true).to.be.an('array'); }; /** @@ -664,8 +1009,8 @@ assert.isArray = function (val, msg) { * @api public */ -assert.isNotArray = function (val, msg) { - new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array'); +assert.isNotArray = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotArray, true).to.not.be.an('array'); }; /** @@ -683,8 +1028,8 @@ assert.isNotArray = function (val, msg) { * @api public */ -assert.isString = function (val, msg) { - new Assertion(val, msg, assert.isString, true).to.be.a('string'); +assert.isString = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isString, true).to.be.a('string'); }; /** @@ -702,8 +1047,8 @@ assert.isString = function (val, msg) { * @api public */ -assert.isNotString = function (val, msg) { - new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string'); +assert.isNotString = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotString, true).to.not.be.a('string'); }; /** @@ -721,8 +1066,8 @@ assert.isNotString = function (val, msg) { * @api public */ -assert.isNumber = function (val, msg) { - new Assertion(val, msg, assert.isNumber, true).to.be.a('number'); +assert.isNumber = function (val: number, msg?: string) { + Assertion.create(val, msg, assert.isNumber, true).to.be.a('number'); }; /** @@ -740,8 +1085,8 @@ assert.isNumber = function (val, msg) { * @api public */ -assert.isNotNumber = function (val, msg) { - new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number'); +assert.isNotNumber = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotNumber, true).to.not.be.a('number'); }; /** @@ -761,8 +1106,8 @@ assert.isNotNumber = function (val, msg) { * @api public */ -assert.isFinite = function (val, msg) { - new Assertion(val, msg, assert.isFinite, true).to.be.finite; +assert.isFinite = function (val: number, msg?: string) { + Assertion.create(val, msg, assert.isFinite, true).to.be.finite; }; /** @@ -783,8 +1128,8 @@ assert.isFinite = function (val, msg) { * @api public */ -assert.isBoolean = function (val, msg) { - new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean'); +assert.isBoolean = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isBoolean, true).to.be.a('boolean'); }; /** @@ -805,8 +1150,8 @@ assert.isBoolean = function (val, msg) { * @api public */ -assert.isNotBoolean = function (val, msg) { - new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean'); +assert.isNotBoolean = function (val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean'); }; /** @@ -830,8 +1175,8 @@ assert.isNotBoolean = function (val, msg) { * @api public */ -assert.typeOf = function (val, type, msg) { - new Assertion(val, msg, assert.typeOf, true).to.be.a(type); +assert.typeOf = function (val: unknown, type: string, msg?: string) { + Assertion.create(val, msg, assert.typeOf, true).to.be.a(type); }; /** @@ -850,8 +1195,8 @@ assert.typeOf = function (val, type, msg) { * @api public */ -assert.notTypeOf = function (val, type, msg) { - new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type); +assert.notTypeOf = function (val: unknown, type: string, msg?: string) { + Assertion.create(val, msg, assert.notTypeOf, true).to.not.be.a(type); }; /** @@ -872,8 +1217,8 @@ assert.notTypeOf = function (val, type, msg) { * @api public */ -assert.instanceOf = function (val, type, msg) { - new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type); +assert.instanceOf = function (val: object, type: Constructor, msg?: string) { + Assertion.create(val, msg, assert.instanceOf, true).to.be.instanceOf(type); }; /** @@ -894,8 +1239,8 @@ assert.instanceOf = function (val, type, msg) { * @api public */ -assert.notInstanceOf = function (val, type, msg) { - new Assertion(val, msg, assert.notInstanceOf, true) +assert.notInstanceOf = function (val: object, type: Constructor, msg?: string) { + Assertion.create(val, msg, assert.notInstanceOf, true) .to.not.be.instanceOf(type); }; @@ -930,8 +1275,8 @@ assert.notInstanceOf = function (val, type, msg) { * @api public */ -assert.include = function (exp, inc, msg) { - new Assertion(exp, msg, assert.include, true).include(inc); +assert.include = function (exp: string|Array, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.include, true).include(inc); }; /** @@ -966,8 +1311,8 @@ assert.include = function (exp, inc, msg) { * @api public */ -assert.notInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.notInclude, true).not.include(inc); +assert.notInclude = function (exp: string|Array, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.notInclude, true).not.include(inc); }; /** @@ -991,8 +1336,8 @@ assert.notInclude = function (exp, inc, msg) { * @api public */ -assert.deepInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc); +assert.deepInclude = function (exp: string|Array, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.deepInclude, true).deep.include(inc); }; /** @@ -1016,8 +1361,8 @@ assert.deepInclude = function (exp, inc, msg) { * @api public */ -assert.notDeepInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc); +assert.notDeepInclude = function (exp: string|Array, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.notDeepInclude, true).not.deep.include(inc); }; /** @@ -1041,8 +1386,8 @@ assert.notDeepInclude = function (exp, inc, msg) { * @api public */ -assert.nestedInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc); +assert.nestedInclude = function (exp: unknown, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.nestedInclude, true).nested.include(inc); }; /** @@ -1066,8 +1411,8 @@ assert.nestedInclude = function (exp, inc, msg) { * @api public */ -assert.notNestedInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.notNestedInclude, true) +assert.notNestedInclude = function (exp: unknown, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.notNestedInclude, true) .not.nested.include(inc); }; @@ -1092,8 +1437,8 @@ assert.notNestedInclude = function (exp, inc, msg) { * @api public */ -assert.deepNestedInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.deepNestedInclude, true) +assert.deepNestedInclude = function(exp: unknown, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.deepNestedInclude, true) .deep.nested.include(inc); }; @@ -1118,8 +1463,8 @@ assert.deepNestedInclude = function(exp, inc, msg) { * @api public */ -assert.notDeepNestedInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.notDeepNestedInclude, true) +assert.notDeepNestedInclude = function(exp: unknown, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.notDeepNestedInclude, true) .not.deep.nested.include(inc); }; @@ -1140,8 +1485,8 @@ assert.notDeepNestedInclude = function(exp, inc, msg) { * @api public */ -assert.ownInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.ownInclude, true).own.include(inc); +assert.ownInclude = function(exp: unknown, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.ownInclude, true).own.include(inc); }; /** @@ -1163,8 +1508,8 @@ assert.ownInclude = function(exp, inc, msg) { * @api public */ -assert.notOwnInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc); +assert.notOwnInclude = function(exp: unknown, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.notOwnInclude, true).not.own.include(inc); }; /** @@ -1184,8 +1529,8 @@ assert.notOwnInclude = function(exp, inc, msg) { * @api public */ -assert.deepOwnInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.deepOwnInclude, true) +assert.deepOwnInclude = function(exp: unknown, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.deepOwnInclude, true) .deep.own.include(inc); }; @@ -1206,8 +1551,8 @@ assert.deepOwnInclude = function(exp, inc, msg) { * @api public */ -assert.notDeepOwnInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.notDeepOwnInclude, true) +assert.notDeepOwnInclude = function(exp: unknown, inc: unknown, msg?: string) { + Assertion.create(exp, msg, assert.notDeepOwnInclude, true) .not.deep.own.include(inc); }; @@ -1226,8 +1571,8 @@ assert.notDeepOwnInclude = function(exp, inc, msg) { * @api public */ -assert.match = function (exp, re, msg) { - new Assertion(exp, msg, assert.match, true).to.match(re); +assert.match = function (exp: unknown, re: RegExp, msg?: string) { + Assertion.create(exp, msg, assert.match, true).to.match(re); }; /** @@ -1245,8 +1590,8 @@ assert.match = function (exp, re, msg) { * @api public */ -assert.notMatch = function (exp, re, msg) { - new Assertion(exp, msg, assert.notMatch, true).to.not.match(re); +assert.notMatch = function (exp: unknown, re: RegExp, msg?: string) { + Assertion.create(exp, msg, assert.notMatch, true).to.not.match(re); }; /** @@ -1266,8 +1611,8 @@ assert.notMatch = function (exp, re, msg) { * @api public */ -assert.property = function (obj, prop, msg) { - new Assertion(obj, msg, assert.property, true).to.have.property(prop); +assert.property = function (obj: unknown, prop: string, msg?: string) { + Assertion.create(obj, msg, assert.property, true).to.have.property(prop); }; /** @@ -1286,8 +1631,8 @@ assert.property = function (obj, prop, msg) { * @api public */ -assert.notProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.notProperty, true) +assert.notProperty = function (obj: unknown, prop: string, msg?: string) { + Assertion.create(obj, msg, assert.notProperty, true) .to.not.have.property(prop); }; @@ -1309,8 +1654,8 @@ assert.notProperty = function (obj, prop, msg) { * @api public */ -assert.propertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.propertyVal, true) +assert.propertyVal = function (obj: unknown, prop: string, val: unknown, msg?: string) { + Assertion.create(obj, msg, assert.propertyVal, true) .to.have.property(prop, val); }; @@ -1333,8 +1678,8 @@ assert.propertyVal = function (obj, prop, val, msg) { * @api public */ -assert.notPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.notPropertyVal, true) +assert.notPropertyVal = function (obj: unknown, prop: string, val: unknown, msg?: string) { + Assertion.create(obj, msg, assert.notPropertyVal, true) .to.not.have.property(prop, val); }; @@ -1355,8 +1700,8 @@ assert.notPropertyVal = function (obj, prop, val, msg) { * @api public */ -assert.deepPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.deepPropertyVal, true) +assert.deepPropertyVal = function (obj: unknown, prop: string, val: unknown, msg?: string) { + Assertion.create(obj, msg, assert.deepPropertyVal, true) .to.have.deep.property(prop, val); }; @@ -1379,8 +1724,8 @@ assert.deepPropertyVal = function (obj, prop, val, msg) { * @api public */ -assert.notDeepPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.notDeepPropertyVal, true) +assert.notDeepPropertyVal = function (obj: unknown, prop: string, val: unknown, msg?: string) { + Assertion.create(obj, msg, assert.notDeepPropertyVal, true) .to.not.have.deep.property(prop, val); }; @@ -1399,8 +1744,8 @@ assert.notDeepPropertyVal = function (obj, prop, val, msg) { * @api public */ -assert.ownProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.ownProperty, true) +assert.ownProperty = function (obj: unknown, prop: string, msg?: string) { + Assertion.create(obj, msg, assert.ownProperty, true) .to.have.own.property(prop); }; @@ -1420,8 +1765,8 @@ assert.ownProperty = function (obj, prop, msg) { * @api public */ -assert.notOwnProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.notOwnProperty, true) +assert.notOwnProperty = function (obj: unknown, prop: string, msg?: string) { + Assertion.create(obj, msg, assert.notOwnProperty, true) .to.not.have.own.property(prop); }; @@ -1442,8 +1787,8 @@ assert.notOwnProperty = function (obj, prop, msg) { * @api public */ -assert.ownPropertyVal = function (obj, prop, value, msg) { - new Assertion(obj, msg, assert.ownPropertyVal, true) +assert.ownPropertyVal = function (obj: unknown, prop: string, value: unknown, msg?: string) { + Assertion.create(obj, msg, assert.ownPropertyVal, true) .to.have.own.property(prop, value); }; @@ -1465,8 +1810,8 @@ assert.ownPropertyVal = function (obj, prop, value, msg) { * @api public */ -assert.notOwnPropertyVal = function (obj, prop, value, msg) { - new Assertion(obj, msg, assert.notOwnPropertyVal, true) +assert.notOwnPropertyVal = function (obj: unknown, prop: string, value: unknown, msg?: string) { + Assertion.create(obj, msg, assert.notOwnPropertyVal, true) .to.not.have.own.property(prop, value); }; @@ -1487,8 +1832,8 @@ assert.notOwnPropertyVal = function (obj, prop, value, msg) { * @api public */ -assert.deepOwnPropertyVal = function (obj, prop, value, msg) { - new Assertion(obj, msg, assert.deepOwnPropertyVal, true) +assert.deepOwnPropertyVal = function (obj: unknown, prop: string, value: unknown, msg?: string) { + Assertion.create(obj, msg, assert.deepOwnPropertyVal, true) .to.have.deep.own.property(prop, value); }; @@ -1512,8 +1857,8 @@ assert.deepOwnPropertyVal = function (obj, prop, value, msg) { * @api public */ -assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) { - new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true) +assert.notDeepOwnPropertyVal = function (obj: unknown, prop: string, value: unknown, msg?: string) { + Assertion.create(obj, msg, assert.notDeepOwnPropertyVal, true) .to.not.have.deep.own.property(prop, value); }; @@ -1534,8 +1879,8 @@ assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) { * @api public */ -assert.nestedProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.nestedProperty, true) +assert.nestedProperty = function (obj: unknown, prop: string, msg?: string) { + Assertion.create(obj, msg, assert.nestedProperty, true) .to.have.nested.property(prop); }; @@ -1556,8 +1901,8 @@ assert.nestedProperty = function (obj, prop, msg) { * @api public */ -assert.notNestedProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.notNestedProperty, true) +assert.notNestedProperty = function (obj: unknown, prop: string, msg?: string) { + Assertion.create(obj, msg, assert.notNestedProperty, true) .to.not.have.nested.property(prop); }; @@ -1579,8 +1924,8 @@ assert.notNestedProperty = function (obj, prop, msg) { * @api public */ -assert.nestedPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.nestedPropertyVal, true) +assert.nestedPropertyVal = function (obj: unknown, prop: string, val: unknown, msg?: string) { + Assertion.create(obj, msg, assert.nestedPropertyVal, true) .to.have.nested.property(prop, val); }; @@ -1603,8 +1948,8 @@ assert.nestedPropertyVal = function (obj, prop, val, msg) { * @api public */ -assert.notNestedPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.notNestedPropertyVal, true) +assert.notNestedPropertyVal = function (obj: unknown, prop: string, val: unknown, msg?: string) { + Assertion.create(obj, msg, assert.notNestedPropertyVal, true) .to.not.have.nested.property(prop, val); }; @@ -1626,8 +1971,8 @@ assert.notNestedPropertyVal = function (obj, prop, val, msg) { * @api public */ -assert.deepNestedPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.deepNestedPropertyVal, true) +assert.deepNestedPropertyVal = function (obj: unknown, prop: string, val: unknown, msg?: string) { + Assertion.create(obj, msg, assert.deepNestedPropertyVal, true) .to.have.deep.nested.property(prop, val); }; @@ -1651,8 +1996,8 @@ assert.deepNestedPropertyVal = function (obj, prop, val, msg) { * @api public */ -assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true) +assert.notDeepNestedPropertyVal = function (obj: unknown, prop: string, val: unknown, msg?: string) { + Assertion.create(obj, msg, assert.notDeepNestedPropertyVal, true) .to.not.have.deep.nested.property(prop, val); } @@ -1674,8 +2019,8 @@ assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) { * @api public */ -assert.lengthOf = function (exp, len, msg) { - new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len); +assert.lengthOf = function (exp: unknown, len: number, msg?: string) { + Assertion.create(exp, msg, assert.lengthOf, true).to.have.lengthOf(len); }; /** @@ -1698,8 +2043,8 @@ assert.lengthOf = function (exp, len, msg) { * @api public */ -assert.hasAnyKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys); +assert.hasAnyKeys = function (obj: unknown, keys: Array|Record, msg?: string) { + Assertion.create(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys); } /** @@ -1722,8 +2067,8 @@ assert.hasAnyKeys = function (obj, keys, msg) { * @api public */ -assert.hasAllKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys); +assert.hasAllKeys = function (obj: unknown, keys: string[], msg?: string) { + Assertion.create(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys); } /** @@ -1750,8 +2095,8 @@ assert.hasAllKeys = function (obj, keys, msg) { * @api public */ -assert.containsAllKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.containsAllKeys, true) +assert.containsAllKeys = function (obj: unknown, keys: string[], msg?: string) { + Assertion.create(obj, msg, assert.containsAllKeys, true) .to.contain.all.keys(keys); } @@ -1775,8 +2120,8 @@ assert.containsAllKeys = function (obj, keys, msg) { * @api public */ -assert.doesNotHaveAnyKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true) +assert.doesNotHaveAnyKeys = function (obj: unknown, keys: string[], msg?: string) { + Assertion.create(obj, msg, assert.doesNotHaveAnyKeys, true) .to.not.have.any.keys(keys); } @@ -1800,8 +2145,8 @@ assert.doesNotHaveAnyKeys = function (obj, keys, msg) { * @api public */ -assert.doesNotHaveAllKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.doesNotHaveAllKeys, true) +assert.doesNotHaveAllKeys = function (obj: unknown, keys: string[], msg?: string) { + Assertion.create(obj, msg, assert.doesNotHaveAllKeys, true) .to.not.have.all.keys(keys); } @@ -1829,8 +2174,8 @@ assert.doesNotHaveAllKeys = function (obj, keys, msg) { * @api public */ -assert.hasAnyDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.hasAnyDeepKeys, true) +assert.hasAnyDeepKeys = function (obj: unknown, keys: Array|Record, msg?: string) { + Assertion.create(obj, msg, assert.hasAnyDeepKeys, true) .to.have.any.deep.keys(keys); } @@ -1856,8 +2201,8 @@ assert.hasAnyDeepKeys = function (obj, keys, msg) { * @api public */ -assert.hasAllDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.hasAllDeepKeys, true) +assert.hasAllDeepKeys = function (obj: unknown, keys: Array|Record, msg?: string) { + Assertion.create(obj, msg, assert.hasAllDeepKeys, true) .to.have.all.deep.keys(keys); } @@ -1883,8 +2228,8 @@ assert.hasAllDeepKeys = function (obj, keys, msg) { * @api public */ -assert.containsAllDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.containsAllDeepKeys, true) +assert.containsAllDeepKeys = function (obj: unknown, keys: Array|Record, msg?: string) { + Assertion.create(obj, msg, assert.containsAllDeepKeys, true) .to.contain.all.deep.keys(keys); } @@ -1910,8 +2255,8 @@ assert.containsAllDeepKeys = function (obj, keys, msg) { * @api public */ -assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true) +assert.doesNotHaveAnyDeepKeys = function (obj: unknown, keys: Array|Record, msg?: string) { + Assertion.create(obj, msg, assert.doesNotHaveAnyDeepKeys, true) .to.not.have.any.deep.keys(keys); } @@ -1937,8 +2282,8 @@ assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) { * @api public */ -assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true) +assert.doesNotHaveAllDeepKeys = function (obj: unknown, keys: Array|Record, msg?: string) { + Assertion.create(obj, msg, assert.doesNotHaveAllDeepKeys, true) .to.not.have.all.deep.keys(keys); } @@ -1973,17 +2318,37 @@ assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) { * @api public */ -assert.throws = function (fn, errorLike, errMsgMatcher, msg) { - if ('string' === typeof errorLike || errorLike instanceof RegExp) { - errMsgMatcher = errorLike; - errorLike = null; +function assertThrows( + fn: Function, + errorLike: Error | Constructor, + errMsgMatcher: RegExp | string, + msg?: string +): unknown; +function assertThrows( + fn: Function, + errMsgMatcher: RegExp | string +): unknown; +function assertThrows( + fn: Function, + errorOrMatcher: Error | Constructor | RegExp | string, + errMsgMatcher?: RegExp | string, + msg?: string +): unknown { + let assertErr: Assertion; + + if ('string' === typeof errorOrMatcher || errorOrMatcher instanceof RegExp) { + assertErr = Assertion.create(fn, msg, assertThrows, true) + .to.throw(errorOrMatcher); + } else { + assertErr = Assertion.create(fn, msg, assertThrows, true) + .to.throw(errorOrMatcher, errMsgMatcher as RegExp | string); } - var assertErr = new Assertion(fn, msg, assert.throws, true) - .to.throw(errorLike, errMsgMatcher); return flag(assertErr, 'object'); }; +assert.throws = assert.Throw = assert.throw = assertThrows; + /** * ### .doesNotThrow(fn, [errorLike/string/regexp], [string/regexp], [message]) * @@ -2013,16 +2378,33 @@ assert.throws = function (fn, errorLike, errMsgMatcher, msg) { * @api public */ -assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) { - if ('string' === typeof errorLike || errorLike instanceof RegExp) { - errMsgMatcher = errorLike; - errorLike = null; +function assertDoesNotThrow( + fn: Function, + errMsgMatcher: RegExp | string +): void; +function assertDoesNotThrow( + fn: Function, + errorLike: Error | Constructor, + errMsgMatcher: RegExp | string, + msg?: string +): void; +function assertDoesNotThrow( + fn: Function, + errorOrMatcher: Error | Constructor | RegExp | string, + errMsgMatcher?: RegExp | string, + msg?: string +): void { + if ('string' === typeof errorOrMatcher || errorOrMatcher instanceof RegExp) { + Assertion.create(fn, msg, assertDoesNotThrow, true) + .to.not.throw(errorOrMatcher); + } else { + Assertion.create(fn, msg, assertDoesNotThrow, true) + .to.not.throw(errorOrMatcher, errMsgMatcher as RegExp | string); } - - new Assertion(fn, msg, assert.doesNotThrow, true) - .to.not.throw(errorLike, errMsgMatcher); }; +assert.doesNotThrow = assertDoesNotThrow; + /** * ### .operator(val1, operator, val2, [message]) * @@ -2040,7 +2422,7 @@ assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) { * @api public */ -assert.operator = function (val, operator, val2, msg) { +assert.operator = function (val: unknown, operator: string, val2: unknown, msg?: string) { var ok; switch(operator) { case '==': @@ -2050,16 +2432,16 @@ assert.operator = function (val, operator, val2, msg) { ok = val === val2; break; case '>': - ok = val > val2; + ok = (val as number) > (val2 as number); break; case '>=': - ok = val >= val2; + ok = (val as number) >= (val2 as number); break; case '<': - ok = val < val2; + ok = (val as number) < (val2 as number); break; case '<=': - ok = val <= val2; + ok = (val as number) <= (val2 as number); break; case '!=': ok = val != val2; @@ -2075,7 +2457,7 @@ assert.operator = function (val, operator, val2, msg) { assert.operator ); } - var test = new Assertion(ok, msg, assert.operator, true); + var test = Assertion.create(ok, msg, assert.operator, true); test.assert( true === flag(test, 'object') , 'expected ' + inspect(val) + ' to be ' + operator + ' ' + inspect(val2) @@ -2098,8 +2480,8 @@ assert.operator = function (val, operator, val2, msg) { * @api public */ -assert.closeTo = function (act, exp, delta, msg) { - new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta); +assert.closeTo = function (act: number, exp: number, delta: number, msg?: string) { + Assertion.create(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta); }; /** @@ -2118,8 +2500,8 @@ assert.closeTo = function (act, exp, delta, msg) { * @api public */ -assert.approximately = function (act, exp, delta, msg) { - new Assertion(act, msg, assert.approximately, true) +assert.approximately = function (act: number, exp: number, delta: number, msg?: string) { + Assertion.create(act, msg, assert.approximately, true) .to.be.approximately(exp, delta); }; @@ -2139,8 +2521,8 @@ assert.approximately = function (act, exp, delta, msg) { * @api public */ -assert.sameMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.sameMembers, true) +assert.sameMembers = function (set1: unknown[], set2: unknown[], msg?: string) { + Assertion.create(set1, msg, assert.sameMembers, true) .to.have.same.members(set2); } @@ -2160,8 +2542,8 @@ assert.sameMembers = function (set1, set2, msg) { * @api public */ -assert.notSameMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.notSameMembers, true) +assert.notSameMembers = function (set1: unknown[], set2: unknown[], msg?: string) { + Assertion.create(set1, msg, assert.notSameMembers, true) .to.not.have.same.members(set2); } @@ -2181,8 +2563,8 @@ assert.notSameMembers = function (set1, set2, msg) { * @api public */ -assert.sameDeepMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.sameDeepMembers, true) +assert.sameDeepMembers = function (set1: unknown[], set2: unknown[], msg?: string) { + Assertion.create(set1, msg, assert.sameDeepMembers, true) .to.have.same.deep.members(set2); } @@ -2202,8 +2584,8 @@ assert.sameDeepMembers = function (set1, set2, msg) { * @api public */ -assert.notSameDeepMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.notSameDeepMembers, true) +assert.notSameDeepMembers = function (set1: unknown[], set2: unknown[], msg?: string) { + Assertion.create(set1, msg, assert.notSameDeepMembers, true) .to.not.have.same.deep.members(set2); } @@ -2223,8 +2605,8 @@ assert.notSameDeepMembers = function (set1, set2, msg) { * @api public */ -assert.sameOrderedMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.sameOrderedMembers, true) +assert.sameOrderedMembers = function (set1: unknown[], set2: unknown[], msg?: string) { + Assertion.create(set1, msg, assert.sameOrderedMembers, true) .to.have.same.ordered.members(set2); } @@ -2244,8 +2626,8 @@ assert.sameOrderedMembers = function (set1, set2, msg) { * @api public */ -assert.notSameOrderedMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.notSameOrderedMembers, true) +assert.notSameOrderedMembers = function (set1: unknown[], set2: unknown[], msg?: string) { + Assertion.create(set1, msg, assert.notSameOrderedMembers, true) .to.not.have.same.ordered.members(set2); } @@ -2265,8 +2647,8 @@ assert.notSameOrderedMembers = function (set1, set2, msg) { * @api public */ -assert.sameDeepOrderedMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.sameDeepOrderedMembers, true) +assert.sameDeepOrderedMembers = function (set1: unknown[], set2: unknown[], msg?: string) { + Assertion.create(set1, msg, assert.sameDeepOrderedMembers, true) .to.have.same.deep.ordered.members(set2); } @@ -2287,8 +2669,8 @@ assert.sameDeepOrderedMembers = function (set1, set2, msg) { * @api public */ -assert.notSameDeepOrderedMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true) +assert.notSameDeepOrderedMembers = function (set1: unknown[], set2: unknown[], msg?: string) { + Assertion.create(set1, msg, assert.notSameDeepOrderedMembers, true) .to.not.have.same.deep.ordered.members(set2); } @@ -2308,8 +2690,8 @@ assert.notSameDeepOrderedMembers = function (set1, set2, msg) { * @api public */ -assert.includeMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.includeMembers, true) +assert.includeMembers = function (superset: unknown[], subset: unknown[], msg?: string) { + Assertion.create(superset, msg, assert.includeMembers, true) .to.include.members(subset); } @@ -2329,8 +2711,8 @@ assert.includeMembers = function (superset, subset, msg) { * @api public */ -assert.notIncludeMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.notIncludeMembers, true) +assert.notIncludeMembers = function (superset: unknown[], subset: unknown[], msg?: string) { + Assertion.create(superset, msg, assert.notIncludeMembers, true) .to.not.include.members(subset); } @@ -2350,8 +2732,8 @@ assert.notIncludeMembers = function (superset, subset, msg) { * @api public */ -assert.includeDeepMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.includeDeepMembers, true) +assert.includeDeepMembers = function (superset: unknown[], subset: unknown[], msg?: string) { + Assertion.create(superset, msg, assert.includeDeepMembers, true) .to.include.deep.members(subset); } @@ -2371,8 +2753,8 @@ assert.includeDeepMembers = function (superset, subset, msg) { * @api public */ -assert.notIncludeDeepMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.notIncludeDeepMembers, true) +assert.notIncludeDeepMembers = function (superset: unknown[], subset: unknown[], msg?: string) { + Assertion.create(superset, msg, assert.notIncludeDeepMembers, true) .to.not.include.deep.members(subset); } @@ -2393,8 +2775,8 @@ assert.notIncludeDeepMembers = function (superset, subset, msg) { * @api public */ -assert.includeOrderedMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.includeOrderedMembers, true) +assert.includeOrderedMembers = function (superset: unknown[], subset: unknown[], msg?: string) { + Assertion.create(superset, msg, assert.includeOrderedMembers, true) .to.include.ordered.members(subset); } @@ -2416,8 +2798,8 @@ assert.includeOrderedMembers = function (superset, subset, msg) { * @api public */ -assert.notIncludeOrderedMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.notIncludeOrderedMembers, true) +assert.notIncludeOrderedMembers = function (superset: unknown[], subset: unknown[], msg?: string) { + Assertion.create(superset, msg, assert.notIncludeOrderedMembers, true) .to.not.include.ordered.members(subset); } @@ -2438,8 +2820,8 @@ assert.notIncludeOrderedMembers = function (superset, subset, msg) { * @api public */ -assert.includeDeepOrderedMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.includeDeepOrderedMembers, true) +assert.includeDeepOrderedMembers = function (superset: unknown[], subset: unknown[], msg?: string) { + Assertion.create(superset, msg, assert.includeDeepOrderedMembers, true) .to.include.deep.ordered.members(subset); } @@ -2462,8 +2844,8 @@ assert.includeDeepOrderedMembers = function (superset, subset, msg) { * @api public */ -assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true) +assert.notIncludeDeepOrderedMembers = function (superset: unknown[], subset: unknown[], msg?: string) { + Assertion.create(superset, msg, assert.notIncludeDeepOrderedMembers, true) .to.not.include.deep.ordered.members(subset); } @@ -2482,8 +2864,8 @@ assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) { * @api public */ -assert.oneOf = function (inList, list, msg) { - new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list); +assert.oneOf = function (inList: unknown, list: unknown[], msg?: string) { + Assertion.create(inList, msg, assert.oneOf, true).to.be.oneOf(list); } /** @@ -2504,15 +2886,32 @@ assert.oneOf = function (inList, list, msg) { * @api public */ -assert.changes = function (fn, obj, prop, msg) { +function assertChanges( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string +): void; +function assertChanges( + fn: Function, + obj: () => void, + msg?: string +): void; +function assertChanges( + fn: Function, + obj: object | (() => void), + propOrMsg?: PropertyKey | string, + msg?: string +): void { if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; + Assertion.create(fn, propOrMsg as string, assertChanges, true).to.change(obj); + } else { + Assertion.create(fn, msg, assertChanges, true).to.change(obj, propOrMsg as PropertyKey); } - - new Assertion(fn, msg, assert.changes, true).to.change(obj, prop); } +assert.changes = assertChanges; + /** * ### .changesBy(function, object, property, delta, [message]) * @@ -2532,20 +2931,40 @@ assert.changes = function (fn, obj, prop, msg) { * @api public */ -assert.changesBy = function (fn, obj, prop, delta, msg) { +function assertChangesBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string +): void; +function assertChangesBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string +): void; +function assertChangesBy( + fn: Function, + obj: object | (() => void), + deltaOrProp: number | PropertyKey, + msgOrDelta?: string | number, + msg?: string +): void { if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; + Assertion.create(fn, msgOrDelta as string, assertChangesBy, true) + .to.change(obj).by(deltaOrProp as number); } else if (arguments.length === 3) { - delta = prop; - prop = null; + Assertion.create(fn, msg, assertChangesBy, true) + .to.change(obj as Function).by(deltaOrProp as number); + } else { + Assertion.create(fn, msg, assertChangesBy, true) + .to.change(obj as object, deltaOrProp as PropertyKey).by(msgOrDelta as number); } - - new Assertion(fn, msg, assert.changesBy, true) - .to.change(obj, prop).by(delta); } +assert.changesBy = assertChangesBy; + /** * ### .doesNotChange(function, object, property, [message]) * @@ -2564,16 +2983,34 @@ assert.changesBy = function (fn, obj, prop, delta, msg) { * @api public */ -assert.doesNotChange = function (fn, obj, prop, msg) { +function assertDoesNotChange( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string +): Assertion; +function assertDoesNotChange( + fn: Function, + obj: () => void, + msg?: string +): Assertion; +function assertDoesNotChange( + fn: Function, + obj: object | (() => void), + propOrMsg?: PropertyKey | string, + msg?: string +): Assertion { if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; + return Assertion.create(fn, propOrMsg as string, assertDoesNotChange, true) + .to.not.change(obj); + } else { + return Assertion.create(fn, msg, assertDoesNotChange, true) + .to.not.change(obj as object, propOrMsg as PropertyKey); } - - return new Assertion(fn, msg, assert.doesNotChange, true) - .to.not.change(obj, prop); } +assert.doesNotChange = assertDoesNotChange; + /** * ### .changesButNotBy(function, object, property, delta, [message]) * @@ -2593,20 +3030,40 @@ assert.doesNotChange = function (fn, obj, prop, msg) { * @api public */ -assert.changesButNotBy = function (fn, obj, prop, delta, msg) { +function assertChangesButNotBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string +): void; +function assertChangesButNotBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string +): void; +function assertChangesButNotBy( + fn: Function, + obj: object | (() => void), + deltaOrProp: number | PropertyKey, + msgOrDelta?: string | number, + msg?: string +): void { if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; + Assertion.create(fn, msgOrDelta as string, assertChangesButNotBy, true) + .to.change(obj).but.not.by(deltaOrProp as number); } else if (arguments.length === 3) { - delta = prop; - prop = null; + Assertion.create(fn, msg, assertChangesButNotBy, true) + .to.change(obj as Function).but.not.by(deltaOrProp as number); + } else { + Assertion.create(fn, msg, assertChangesButNotBy, true) + .to.change(obj as object, deltaOrProp as PropertyKey).but.not.by(msgOrDelta as number); } - - new Assertion(fn, msg, assert.changesButNotBy, true) - .to.change(obj, prop).but.not.by(delta); } +assert.changesButNotBy = assertChangesButNotBy; + /** * ### .increases(function, object, property, [message]) * @@ -2625,16 +3082,34 @@ assert.changesButNotBy = function (fn, obj, prop, delta, msg) { * @api public */ -assert.increases = function (fn, obj, prop, msg) { +function assertIncreases( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string +): Assertion; +function assertIncreases( + fn: Function, + obj: () => void, + msg?: string +): Assertion; +function assertIncreases( + fn: Function, + obj: object | (() => void), + propOrMsg?: PropertyKey | string, + msg?: string +): Assertion { if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; + return Assertion.create(fn, propOrMsg as string, assertIncreases, true) + .to.increase(obj); + } else { + return Assertion.create(fn, msg, assertIncreases, true) + .to.increase(obj, propOrMsg as PropertyKey); } - - return new Assertion(fn, msg, assert.increases, true) - .to.increase(obj, prop); } +assert.increases = assertIncreases; + /** * ### .increasesBy(function, object, property, delta, [message]) * @@ -2654,20 +3129,40 @@ assert.increases = function (fn, obj, prop, msg) { * @api public */ -assert.increasesBy = function (fn, obj, prop, delta, msg) { +function assertIncreasesBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string +): void; +function assertIncreasesBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string +): void; +function assertIncreasesBy( + fn: Function, + obj: object | (() => void), + deltaOrProp: number | PropertyKey, + msgOrDelta?: string | number, + msg?: string +): void { if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; + Assertion.create(fn, msgOrDelta as string, assertIncreasesBy, true) + .to.increase(obj).by(deltaOrProp as number); } else if (arguments.length === 3) { - delta = prop; - prop = null; + Assertion.create(fn, msg, assertIncreasesBy, true) + .to.increase(obj as Function).by(deltaOrProp as number); + } else { + Assertion.create(fn, msg, assertIncreasesBy, true) + .to.increase(obj, deltaOrProp as PropertyKey).by(msgOrDelta as number); } - - new Assertion(fn, msg, assert.increasesBy, true) - .to.increase(obj, prop).by(delta); } +assert.increasesBy = assertIncreasesBy; + /** * ### .doesNotIncrease(function, object, property, [message]) * @@ -2686,16 +3181,34 @@ assert.increasesBy = function (fn, obj, prop, delta, msg) { * @api public */ -assert.doesNotIncrease = function (fn, obj, prop, msg) { +function assertDoesNotIncrease( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string +): Assertion; +function assertDoesNotIncrease( + fn: Function, + obj: () => void, + msg?: string +): Assertion; +function assertDoesNotIncrease( + fn: Function, + obj: object | (() => void), + propOrMsg?: PropertyKey | string, + msg?: string +): Assertion { if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; + return Assertion.create(fn, propOrMsg as string, assertDoesNotIncrease, true) + .to.not.increase(obj); + } else { + return Assertion.create(fn, msg, assertDoesNotIncrease, true) + .to.not.increase(obj, propOrMsg as PropertyKey); } - - return new Assertion(fn, msg, assert.doesNotIncrease, true) - .to.not.increase(obj, prop); } +assert.doesNotIncrease = assertDoesNotIncrease; + /** * ### .increasesButNotBy(function, object, property, delta, [message]) * @@ -2715,20 +3228,40 @@ assert.doesNotIncrease = function (fn, obj, prop, msg) { * @api public */ -assert.increasesButNotBy = function (fn, obj, prop, delta, msg) { +function assertIncreasesButNotBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string +): void; +function assertIncreasesButNotBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string +): void; +function assertIncreasesButNotBy( + fn: Function, + obj: object | (() => void), + deltaOrProp: number | PropertyKey, + msgOrDelta?: string | number, + msg?: string +): void { if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; + Assertion.create(fn, msgOrDelta as string, assertIncreasesButNotBy, true) + .to.increase(obj).but.not.by(deltaOrProp as number); } else if (arguments.length === 3) { - delta = prop; - prop = null; + Assertion.create(fn, msg, assertIncreasesButNotBy, true) + .to.increase(obj as Function).but.not.by(deltaOrProp as number); + } else { + Assertion.create(fn, msg, assertIncreasesButNotBy, true) + .to.increase(obj, deltaOrProp as PropertyKey).but.not.by(msgOrDelta as number); } - - new Assertion(fn, msg, assert.increasesButNotBy, true) - .to.increase(obj, prop).but.not.by(delta); } +assert.increasesButNotBy = assertIncreasesButNotBy; + /** * ### .decreases(function, object, property, [message]) * @@ -2747,16 +3280,34 @@ assert.increasesButNotBy = function (fn, obj, prop, delta, msg) { * @api public */ -assert.decreases = function (fn, obj, prop, msg) { +function assertDecreases( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string +): Assertion; +function assertDecreases( + fn: Function, + obj: () => void, + msg?: string +): Assertion; +function assertDecreases( + fn: Function, + obj: object | (() => void), + propOrMsg?: PropertyKey | string, + msg?: string +): Assertion { if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; + return Assertion.create(fn, propOrMsg as string, assertDecreases, true) + .to.decrease(obj); + } else { + return Assertion.create(fn, msg, assertDecreases, true) + .to.decrease(obj, propOrMsg as PropertyKey); } - - return new Assertion(fn, msg, assert.decreases, true) - .to.decrease(obj, prop); } +assert.decreases = assertDecreases; + /** * ### .decreasesBy(function, object, property, delta, [message]) * @@ -2776,20 +3327,40 @@ assert.decreases = function (fn, obj, prop, msg) { * @api public */ -assert.decreasesBy = function (fn, obj, prop, delta, msg) { +function assertDecreasesBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string +): void; +function assertDecreasesBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string +): void; +function assertDecreasesBy( + fn: Function, + obj: object | (() => void), + deltaOrProp: number | PropertyKey, + msgOrDelta?: string | number, + msg?: string +): void { if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; + Assertion.create(fn, msgOrDelta as string, assertDecreasesBy, true) + .to.decrease(obj).by(deltaOrProp as number); } else if (arguments.length === 3) { - delta = prop; - prop = null; + Assertion.create(fn, msg, assertDecreasesBy, true) + .to.decrease(obj as Function).by(deltaOrProp as number); + } else { + Assertion.create(fn, msg, assertDecreasesBy, true) + .to.decrease(obj, deltaOrProp as PropertyKey).by(msgOrDelta as number); } - - new Assertion(fn, msg, assert.decreasesBy, true) - .to.decrease(obj, prop).by(delta); } +assert.decreasesBy = assertDecreasesBy; + /** * ### .doesNotDecrease(function, object, property, [message]) * @@ -2808,16 +3379,34 @@ assert.decreasesBy = function (fn, obj, prop, delta, msg) { * @api public */ -assert.doesNotDecrease = function (fn, obj, prop, msg) { +function assertDoesNotDecrease( + fn: Function, + obj: object, + prop: PropertyKey, + msg?: string +): Assertion; +function assertDoesNotDecrease( + fn: Function, + obj: () => void, + msg?: string +): Assertion; +function assertDoesNotDecrease( + fn: Function, + obj: object | (() => void), + propOrMsg?: PropertyKey | string, + msg?: string +): Assertion { if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; + return Assertion.create(fn, propOrMsg as string, assertDoesNotDecrease, true) + .to.not.decrease(obj); + } else { + return Assertion.create(fn, msg, assertDoesNotDecrease, true) + .to.not.decrease(obj, propOrMsg as PropertyKey); } - - return new Assertion(fn, msg, assert.doesNotDecrease, true) - .to.not.decrease(obj, prop); } +assert.doesNotDecrease = assertDoesNotDecrease; + /** * ### .doesNotDecreaseBy(function, object, property, delta, [message]) * @@ -2837,20 +3426,40 @@ assert.doesNotDecrease = function (fn, obj, prop, msg) { * @api public */ -assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) { +function assertDoesNotDecreaseBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string +): Assertion; +function assertDoesNotDecreaseBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string +): Assertion; +function assertDoesNotDecreaseBy( + fn: Function, + obj: object | (() => void), + deltaOrProp: number | PropertyKey, + msgOrDelta?: string | number, + msg?: string +): Assertion { if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; + return Assertion.create(fn, msgOrDelta as string, assertDoesNotDecreaseBy, true) + .to.not.decrease(obj as Function).by(deltaOrProp as number); } else if (arguments.length === 3) { - delta = prop; - prop = null; + return Assertion.create(fn, msg, assertDoesNotDecreaseBy, true) + .to.not.decrease(obj as Function).by(deltaOrProp as number); + } else { + return Assertion.create(fn, msg, assertDoesNotDecreaseBy, true) + .to.not.decrease(obj, deltaOrProp as PropertyKey).by(msgOrDelta as number); } - - return new Assertion(fn, msg, assert.doesNotDecreaseBy, true) - .to.not.decrease(obj, prop).by(delta); } +assert.doesNotDecreaseBy = assertDoesNotDecreaseBy; + /** * ### .decreasesButNotBy(function, object, property, delta, [message]) * @@ -2870,20 +3479,40 @@ assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) { * @api public */ -assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) { +function assertDecreasesButNotBy( + fn: Function, + obj: object, + prop: PropertyKey, + delta: number, + msg?: string +): void; +function assertDecreasesButNotBy( + fn: Function, + obj: () => void, + delta: number, + msg?: string +): void; +function assertDecreasesButNotBy( + fn: Function, + obj: object | (() => void), + deltaOrProp: number | PropertyKey, + msgOrDelta?: string | number, + msg?: string +): void { if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; + Assertion.create(fn, msgOrDelta as string, assertDecreasesButNotBy, true) + .to.decrease(obj).but.not.by(deltaOrProp as number); } else if (arguments.length === 3) { - delta = prop; - prop = null; + Assertion.create(fn, msg, assertDecreasesButNotBy, true) + .to.decrease(obj as Function).but.not.by(deltaOrProp as number); + } else { + Assertion.create(fn, msg, assertDecreasesButNotBy, true) + .to.decrease(obj, deltaOrProp as PropertyKey).but.not.by(msgOrDelta as number); } - - new Assertion(fn, msg, assert.decreasesButNotBy, true) - .to.decrease(obj, prop).but.not.by(delta); } +assert.decreasesButNotBy = assertDecreasesButNotBy; + /*! * ### .ifError(object) * @@ -2900,7 +3529,7 @@ assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) { * @api public */ -assert.ifError = function (val) { +assert.ifError = function (val: unknown) { if (val) { throw(val); } @@ -2921,8 +3550,8 @@ assert.ifError = function (val) { * @api public */ -assert.isExtensible = function (obj, msg) { - new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible; +assert.isExtensible = assert.extensible = function (obj: object, msg?: string) { + Assertion.create(obj, msg, assert.isExtensible, true).to.be.extensible; }; /** @@ -2946,8 +3575,8 @@ assert.isExtensible = function (obj, msg) { * @api public */ -assert.isNotExtensible = function (obj, msg) { - new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible; +assert.isNotExtensible = assert.notExtensible = function (obj: object, msg?: string) { + Assertion.create(obj, msg, assert.isNotExtensible, true).to.not.be.extensible; }; /** @@ -2970,8 +3599,8 @@ assert.isNotExtensible = function (obj, msg) { * @api public */ -assert.isSealed = function (obj, msg) { - new Assertion(obj, msg, assert.isSealed, true).to.be.sealed; +assert.isSealed = assert.sealed = function (obj: object, msg?: string) { + Assertion.create(obj, msg, assert.isSealed, true).to.be.sealed; }; /** @@ -2989,8 +3618,8 @@ assert.isSealed = function (obj, msg) { * @api public */ -assert.isNotSealed = function (obj, msg) { - new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed; +assert.isNotSealed = assert.notSealed = function (obj: object, msg?: string) { + Assertion.create(obj, msg, assert.isNotSealed, true).to.not.be.sealed; }; /** @@ -3010,8 +3639,8 @@ assert.isNotSealed = function (obj, msg) { * @api public */ -assert.isFrozen = function (obj, msg) { - new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen; +assert.isFrozen = assert.frozen = function (obj: object, msg?: string) { + Assertion.create(obj, msg, assert.isFrozen, true).to.be.frozen; }; /** @@ -3029,8 +3658,8 @@ assert.isFrozen = function (obj, msg) { * @api public */ -assert.isNotFrozen = function (obj, msg) { - new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen; +assert.isNotFrozen = assert.notFrozen = function (obj: object, msg?: string) { + Assertion.create(obj, msg, assert.isNotFrozen, true).to.not.be.frozen; }; /** @@ -3055,8 +3684,8 @@ assert.isNotFrozen = function (obj, msg) { * @api public */ -assert.isEmpty = function(val, msg) { - new Assertion(val, msg, assert.isEmpty, true).to.be.empty; +assert.isEmpty = assert.empty = function(val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isEmpty, true).to.be.empty; }; /** @@ -3081,27 +3710,6 @@ assert.isEmpty = function(val, msg) { * @api public */ -assert.isNotEmpty = function(val, msg) { - new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty; +assert.isNotEmpty = assert.notEmpty = function(val: unknown, msg?: string) { + Assertion.create(val, msg, assert.isNotEmpty, true).to.not.be.empty; }; - -/*! - * Aliases. - */ - -(function alias(name, as){ - assert[as] = assert[name]; - return alias; -}) -('isOk', 'ok') -('isNotOk', 'notOk') -('throws', 'throw') -('throws', 'Throw') -('isExtensible', 'extensible') -('isNotExtensible', 'notExtensible') -('isSealed', 'sealed') -('isNotSealed', 'notSealed') -('isFrozen', 'frozen') -('isNotFrozen', 'notFrozen') -('isEmpty', 'empty') -('isNotEmpty', 'notEmpty'); diff --git a/src/chai/interface/expect.ts b/src/chai/interface/expect.ts new file mode 100644 index 000000000..23fa63b77 --- /dev/null +++ b/src/chai/interface/expect.ts @@ -0,0 +1,78 @@ +/*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + +import * as chai from '../../chai.js'; +import {Assertion} from '../assertion.js'; +import {AssertionError} from 'assertion-error'; + +export interface ExpectInterface { + (val: unknown, message?: string): Assertion; + fail(actual: unknown, expected: unknown, message: string, operator: string): void; +} + +const expect: ExpectInterface = function expect(val: unknown, message?: string): Assertion { + return Assertion.create(val, message); +} as ExpectInterface; + +export {expect}; + +/** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * expect.fail(); + * expect.fail("custom error message"); + * expect.fail(1, 2); + * expect.fail(1, 2, "custom error message"); + * expect.fail(1, 2, "custom error message", ">"); + * expect.fail(1, 2, undefined, ">"); + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace BDD + * @api public + */ + +function expectFail( + message?: string +): void; +function expectFail( + actual: unknown, + expected: unknown, + message?: string, + operator?: string +): void; +function expectFail( + actualOrMessage?: unknown, + expected?: unknown, + message?: string, + operator?: string +): void { + let msg: string | undefined; + let actual; + + if (arguments.length < 2) { + msg = actualOrMessage as string | undefined; + actual = undefined; + } else { + msg = message; + actual = actualOrMessage; + } + + msg = msg || 'expect.fail()'; + throw new AssertionError(msg, { + actual: actual + , expected: expected + , operator: operator + }, chai.expect.fail); +}; + +expect.fail = expectFail; diff --git a/lib/chai/interface/should.js b/src/chai/interface/should.ts similarity index 65% rename from lib/chai/interface/should.js rename to src/chai/interface/should.ts index 8269a58bd..c8e190bc3 100644 --- a/lib/chai/interface/should.js +++ b/src/chai/interface/should.ts @@ -7,19 +7,39 @@ import {Assertion} from '../assertion.js'; import {AssertionError} from 'assertion-error'; -function loadShould () { +export interface ShouldAssertions { + fail(actual: unknown, expected: unknown, message: string, operator: string): void; + equal(val1: unknown, val2: unknown, msg: string): void; + Throw(fn: Function, errt: unknown, errs: RegExp, msg: string): void; + throw(fn: Function, errt: unknown, errs: RegExp, msg: string): void; + exist(val: unknown, msg: string): void; +} + +export interface ShouldInterface extends ShouldAssertions { + not: ShouldAssertions; +} + +declare global { + interface Object { + should: Assertion; + } +} + +type Constructor = {new(): T}; + +function loadShould (): ShouldInterface { // explicitly define this method as function as to have it's name to include as `ssfi` - function shouldGetter() { + function shouldGetter(this: unknown) { if (this instanceof String || this instanceof Number || this instanceof Boolean || typeof Symbol === 'function' && this instanceof Symbol || typeof BigInt === 'function' && this instanceof BigInt) { - return new Assertion(this.valueOf(), null, shouldGetter); + return Assertion.create(this.valueOf(), null, shouldGetter); } - return new Assertion(this, null, shouldGetter); + return Assertion.create(this, null, shouldGetter); } - function shouldSetter(value) { + function shouldSetter(this: unknown, value: unknown) { // See https://github.com/chaijs/chai/issues/86: this makes // `whatever.should = someValue` actually set `someValue`, which is // especially useful for `global.should = require('chai').should()`. @@ -40,8 +60,6 @@ function loadShould () { , configurable: true }); - var should = {}; - /** * ### .fail([message]) * ### .fail(actual, expected, [message], [operator]) @@ -65,18 +83,39 @@ function loadShould () { * @api public */ - should.fail = function (actual, expected, message, operator) { + function shouldFail( + message?: string + ): void; + function shouldFail( + actual: unknown, + expected: unknown, + message: string, + operator: string + ): void; + function shouldFail( + actualOrMessage?: unknown, + expected?: unknown, + message?: string, + operator?: string + ): void { + let actual; + let msg: string|undefined; + if (arguments.length < 2) { - message = actual; - actual = undefined; + msg = actualOrMessage as string | undefined; + actual = undefined; + } else { + msg = message; + actual = actualOrMessage; } - message = message || 'should.fail()'; - throw new AssertionError(message, { + msg = msg || 'should.fail()'; + + throw new AssertionError(msg, { actual: actual , expected: expected , operator: operator - }, should.fail); + }, shouldFail); }; /** @@ -94,8 +133,8 @@ function loadShould () { * @api public */ - should.equal = function (val1, val2, msg) { - new Assertion(val1, msg).to.equal(val2); + const shouldEqual = function (val1: unknown, val2: unknown, msg: string) { + Assertion.create(val1, msg).to.equal(val2); }; /** @@ -122,8 +161,8 @@ function loadShould () { * @api public */ - should.Throw = function (fn, errt, errs, msg) { - new Assertion(fn, msg).to.Throw(errt, errs); + const shouldThrow = function (fn: Function, errt: Constructor, errs: RegExp, msg: string) { + Assertion.create(fn, msg).to.Throw(errt, errs); }; /** @@ -140,13 +179,10 @@ function loadShould () { * @api public */ - should.exist = function (val, msg) { - new Assertion(val, msg).to.exist; + const shouldExist = function (val: unknown, msg: string) { + Assertion.create(val, msg).to.exist; } - // negation - should.not = {} - /** * ### .not.equal(actual, expected, [message]) * @@ -162,8 +198,8 @@ function loadShould () { * @api public */ - should.not.equal = function (val1, val2, msg) { - new Assertion(val1, msg).to.not.equal(val2); + const shouldNotEqual = function (val1: unknown, val2: unknown, msg: string) { + Assertion.create(val1, msg).to.not.equal(val2); }; /** @@ -186,8 +222,8 @@ function loadShould () { * @api public */ - should.not.Throw = function (fn, errt, errs, msg) { - new Assertion(fn, msg).to.not.Throw(errt, errs); + const shouldNotThrow = function (fn: Function, errt: Constructor, errs: RegExp, msg: string) { + Assertion.create(fn, msg).to.not.Throw(errt, errs); }; /** @@ -204,14 +240,24 @@ function loadShould () { * @api public */ - should.not.exist = function (val, msg) { - new Assertion(val, msg).to.not.exist; - } - - should['throw'] = should['Throw']; - should.not['throw'] = should.not['Throw']; + const shouldNotExist = function (val: unknown, msg: string) { + Assertion.create(val, msg).to.not.exist; + }; - return should; + return { + equal: shouldEqual, + exist: shouldExist, + fail: shouldFail, + throw: shouldThrow, + Throw: shouldThrow, + not: { + equal: shouldNotEqual, + exist: shouldNotExist, + fail: () => {}, // Nonsensical, so make it noop + throw: shouldNotThrow, + Throw: shouldNotThrow + } + }; }; export const should = loadShould; diff --git a/lib/chai/utils/addChainableMethod.js b/src/chai/utils/addChainableMethod.ts similarity index 84% rename from lib/chai/utils/addChainableMethod.js rename to src/chai/utils/addChainableMethod.ts index aaf8baaa2..c46c1d6e7 100644 --- a/lib/chai/utils/addChainableMethod.js +++ b/src/chai/utils/addChainableMethod.ts @@ -8,11 +8,11 @@ * Module dependencies */ -import {Assertion} from '../assertion.js'; import {addLengthGuard} from './addLengthGuard.js'; import {flag} from './flag.js'; import {proxify} from './proxify.js'; import {transferFlags} from './transferFlags.js'; +import {ChainableBehavior} from './chainableBehavior.js'; /*! * Module variables @@ -70,27 +70,35 @@ var call = Function.prototype.call, * @api public */ -export function addChainableMethod(ctx, name, method, chainingBehavior) { +export function addChainableMethod( + ctx: T, + name: string, + method: (...args: unknown[]) => unknown, + chainingBehavior?: () => void, + createDefaultValue?: (ctx: T) => unknown +) { + const ctxChainable = ctx as {__methods: Record}; + if (typeof chainingBehavior !== 'function') { chainingBehavior = function () { }; } - var chainableBehavior = { + var chainableBehavior: ChainableBehavior = { method: method , chainingBehavior: chainingBehavior }; // save the methods so we can overwrite them later, if we need to. - if (!ctx.__methods) { - ctx.__methods = {}; + if (!ctxChainable.__methods) { + ctxChainable.__methods = {}; } - ctx.__methods[name] = chainableBehavior; + ctxChainable.__methods[name] = chainableBehavior; Object.defineProperty(ctx, name, { get: function chainableMethodGetter() { chainableBehavior.chainingBehavior.call(this); - var chainableMethodWrapper = function () { + var chainableMethodWrapper = function (this: T) { // Setting the `ssfi` flag to `chainableMethodWrapper` causes this // function to be the starting point for removing implementation // frames from the stack trace of a failed assertion. @@ -110,14 +118,16 @@ export function addChainableMethod(ctx, name, method, chainingBehavior) { flag(this, 'ssfi', chainableMethodWrapper); } - var result = chainableBehavior.method.apply(this, arguments); + var result = chainableBehavior.method.call(this, ...arguments); if (result !== undefined) { return result; } - var newAssertion = new Assertion(); - transferFlags(this, newAssertion); - return newAssertion; + if (createDefaultValue) { + return createDefaultValue(this); + } + + return undefined; }; addLengthGuard(chainableMethodWrapper, name, true); @@ -140,7 +150,9 @@ export function addChainableMethod(ctx, name, method, chainingBehavior) { } var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); - Object.defineProperty(chainableMethodWrapper, asserterName, pd); + if (pd) { + Object.defineProperty(chainableMethodWrapper, asserterName, pd); + } }); } diff --git a/lib/chai/utils/addLengthGuard.js b/src/chai/utils/addLengthGuard.ts similarity index 79% rename from lib/chai/utils/addLengthGuard.js rename to src/chai/utils/addLengthGuard.ts index 630b64ae5..5a7560f01 100644 --- a/lib/chai/utils/addLengthGuard.js +++ b/src/chai/utils/addLengthGuard.ts @@ -40,19 +40,20 @@ const fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length'); * @name addLengthGuard */ -export function addLengthGuard(fn, assertionName, isChainable) { - if (!fnLengthDesc.configurable) return fn; +export function addLengthGuard(fn: Function, assertionName: PropertyKey, isChainable: boolean) { + if (!fnLengthDesc?.configurable) return fn; + const assertionNameStr = String(assertionName); Object.defineProperty(fn, 'length', { get: function () { if (isChainable) { - throw Error('Invalid Chai property: ' + assertionName + '.length. Due' + + throw Error('Invalid Chai property: ' + assertionNameStr + '.length. Due' + ' to a compatibility issue, "length" cannot directly follow "' + - assertionName + '". Use "' + assertionName + '.lengthOf" instead.'); + assertionNameStr + '". Use "' + assertionNameStr + '.lengthOf" instead.'); } - throw Error('Invalid Chai property: ' + assertionName + '.length. See' + - ' docs for proper usage of "' + assertionName + '".'); + throw Error('Invalid Chai property: ' + assertionNameStr + '.length. See' + + ' docs for proper usage of "' + assertionNameStr + '".'); } }); diff --git a/lib/chai/utils/addMethod.js b/src/chai/utils/addMethod.ts similarity index 83% rename from lib/chai/utils/addMethod.js rename to src/chai/utils/addMethod.ts index 02fc7bdb1..2402a00d8 100644 --- a/lib/chai/utils/addMethod.js +++ b/src/chai/utils/addMethod.ts @@ -7,8 +7,6 @@ import {addLengthGuard} from './addLengthGuard.js'; import {flag} from './flag.js'; import {proxify} from './proxify.js'; -import {transferFlags} from './transferFlags.js'; -import {Assertion} from '../assertion.js'; /** * ### .addMethod(ctx, name, method) @@ -36,8 +34,13 @@ import {Assertion} from '../assertion.js'; * @api public */ -export function addMethod(ctx, name, method) { - var methodWrapper = function () { +export function addMethod( + ctx: T, + name: PropertyKey, + method: Function, + createDefaultValue?: (ctx: T) => unknown +) { + var methodWrapper = function (this: T) { // Setting the `ssfi` flag to `methodWrapper` causes this function to be the // starting point for removing implementation frames from the stack trace of // a failed assertion. @@ -58,11 +61,13 @@ export function addMethod(ctx, name, method) { if (result !== undefined) return result; - var newAssertion = new Assertion(); - transferFlags(this, newAssertion); - return newAssertion; + if (createDefaultValue) { + return createDefaultValue(this); + } + + return undefined; }; addLengthGuard(methodWrapper, name, false); - ctx[name] = proxify(methodWrapper, name); + (ctx as Record)[name] = proxify(methodWrapper, name); } diff --git a/lib/chai/utils/addProperty.js b/src/chai/utils/addProperty.ts similarity index 85% rename from lib/chai/utils/addProperty.js rename to src/chai/utils/addProperty.ts index 7bdfb520a..e1f0df0a6 100644 --- a/lib/chai/utils/addProperty.js +++ b/src/chai/utils/addProperty.ts @@ -4,10 +4,8 @@ * MIT Licensed */ -import {Assertion} from '../assertion.js'; import {flag} from './flag.js'; import {isProxyEnabled} from './isProxyEnabled.js'; -import {transferFlags} from './transferFlags.js'; /** * ### .addProperty(ctx, name, getter) @@ -35,8 +33,13 @@ import {transferFlags} from './transferFlags.js'; * @api public */ -export function addProperty(ctx, name, getter) { - getter = getter === undefined ? function () {} : getter; +export function addProperty( + ctx: T, + name: PropertyKey, + getter?: Function, + getDefaultValue?: (ctx: T) => unknown +) { + const getterFn = getter === undefined ? function () {} : getter; Object.defineProperty(ctx, name, { get: function propertyGetter() { @@ -59,13 +62,15 @@ export function addProperty(ctx, name, getter) { flag(this, 'ssfi', propertyGetter); } - var result = getter.call(this); + var result = getterFn.call(this); if (result !== undefined) return result; - var newAssertion = new Assertion(); - transferFlags(this, newAssertion); - return newAssertion; + if (getDefaultValue) { + return getDefaultValue(this); + } + + return undefined; } , configurable: true }); diff --git a/src/chai/utils/chainableBehavior.ts b/src/chai/utils/chainableBehavior.ts new file mode 100644 index 000000000..8923065c0 --- /dev/null +++ b/src/chai/utils/chainableBehavior.ts @@ -0,0 +1,4 @@ +export interface ChainableBehavior { + chainingBehavior: () => void; + method: (...args: unknown[]) => unknown; +} diff --git a/lib/chai/utils/compareByInspect.js b/src/chai/utils/compareByInspect.ts similarity index 92% rename from lib/chai/utils/compareByInspect.js rename to src/chai/utils/compareByInspect.ts index ff9f98177..af083a75f 100644 --- a/lib/chai/utils/compareByInspect.js +++ b/src/chai/utils/compareByInspect.ts @@ -26,6 +26,6 @@ import {inspect} from './inspect.js'; * @api public */ -export function compareByInspect(a, b) { +export function compareByInspect(a: unknown, b: unknown) { return inspect(a) < inspect(b) ? -1 : 1; } diff --git a/lib/chai/utils/expectTypes.js b/src/chai/utils/expectTypes.ts similarity index 90% rename from lib/chai/utils/expectTypes.js rename to src/chai/utils/expectTypes.ts index 4a80d06a4..7a6dff4d6 100644 --- a/lib/chai/utils/expectTypes.js +++ b/src/chai/utils/expectTypes.ts @@ -22,13 +22,13 @@ import {AssertionError} from 'assertion-error'; import {flag} from './flag.js'; import {type} from './type-detect.js'; -export function expectTypes(obj, types) { +export function expectTypes(obj: object, types: string[]) { var flagMsg = flag(obj, 'message'); - var ssfi = flag(obj, 'ssfi'); + var ssfi = flag(obj, 'ssfi') as Function; flagMsg = flagMsg ? flagMsg + ': ' : ''; - obj = flag(obj, 'object'); + obj = flag(obj, 'object') as object; types = types.map(function (t) { return t.toLowerCase(); }); types.sort(); diff --git a/src/chai/utils/flag.ts b/src/chai/utils/flag.ts new file mode 100644 index 000000000..fd96d1c99 --- /dev/null +++ b/src/chai/utils/flag.ts @@ -0,0 +1,68 @@ +/*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### .flag(object, key, [value]) + * + * Get or set a flag value on an object. If a + * value is provided it will be set, else it will + * return the currently set value or `undefined` if + * the value is not set. + * + * utils.flag(this, 'foo', 'bar'); // setter + * utils.flag(this, 'foo'); // getter, returns `bar` + * + * @param {Object} object constructed Assertion + * @param {String} key + * @param {Mixed} value (optional) + * @namespace Utils + * @name flag + * @api private + */ + +function flag< + T extends {__flags: unknown}, + TKey extends keyof T['__flags'] +>( + obj: T, + key: TKey +): T['__flags'][TKey]; +function flag< + T extends {__flags: unknown}, + TKey extends keyof T['__flags'] +>( + obj: T, + key: TKey, + value: T['__flags'][TKey] +): void; +function flag< + T extends object +>( + obj: T, + key: PropertyKey +): unknown; +function flag< + T extends object +>( + obj: T, + key: PropertyKey, + value: unknown +): void; +function flag( + obj: object, + key: PropertyKey, + value?: unknown +): unknown { + const objWithFlags = obj as {__flags?: Record}; + const flags = objWithFlags.__flags || (objWithFlags.__flags = Object.create(null)); + if (arguments.length === 3) { + (flags as Record)[key] = value; + } else { + return (flags as Record)[key]; + } +} + +export {flag}; diff --git a/lib/chai/utils/getActual.js b/src/chai/utils/getActual.ts similarity index 74% rename from lib/chai/utils/getActual.js rename to src/chai/utils/getActual.ts index e96046798..80599ba1b 100644 --- a/lib/chai/utils/getActual.js +++ b/src/chai/utils/getActual.ts @@ -15,6 +15,6 @@ * @name getActual */ -export function getActual(obj, args) { - return args.length > 4 ? args[4] : obj._obj; +export function getActual(obj: object, args: IArguments) { + return args.length > 4 ? args[4] : (obj as {_obj: unknown})._obj; } diff --git a/lib/chai/utils/getEnumerableProperties.js b/src/chai/utils/getEnumerableProperties.ts similarity index 89% rename from lib/chai/utils/getEnumerableProperties.js rename to src/chai/utils/getEnumerableProperties.ts index a84252cfd..0c7ba9c35 100644 --- a/lib/chai/utils/getEnumerableProperties.js +++ b/src/chai/utils/getEnumerableProperties.ts @@ -17,7 +17,7 @@ * @api public */ -module.exports = function getEnumerableProperties(object) { +export function getEnumerableProperties(object: object) { var result = []; for (var name in object) { result.push(name); diff --git a/lib/chai/utils/getMessage.js b/src/chai/utils/getMessage.ts similarity index 95% rename from lib/chai/utils/getMessage.js rename to src/chai/utils/getMessage.ts index 97c4826e5..ab574da2a 100644 --- a/lib/chai/utils/getMessage.js +++ b/src/chai/utils/getMessage.ts @@ -31,7 +31,7 @@ import {objDisplay} from './objDisplay.js'; * @api public */ -export function getMessage(obj, args) { +export function getMessage(obj: object, args: IArguments): string { var negate = flag(obj, 'negate') , val = flag(obj, 'object') , expected = args[3] diff --git a/lib/chai/utils/getOperator.js b/src/chai/utils/getOperator.ts similarity index 92% rename from lib/chai/utils/getOperator.js rename to src/chai/utils/getOperator.ts index a2afa5050..370ac600c 100644 --- a/lib/chai/utils/getOperator.js +++ b/src/chai/utils/getOperator.ts @@ -1,7 +1,7 @@ import {flag} from './flag.js'; import {type} from './type-detect.js'; -function isObjectType(obj) { +function isObjectType(obj: object) { var objectType = type(obj); var objectTypes = ['Array', 'Object', 'Function']; @@ -24,7 +24,7 @@ function isObjectType(obj) { * @api public */ -export function getOperator(obj, args) { +export function getOperator(obj: object, args: IArguments) { var operator = flag(obj, 'operator'); var negate = flag(obj, 'negate'); var expected = args[3]; diff --git a/lib/chai/utils/getOwnEnumerableProperties.js b/src/chai/utils/getOwnEnumerableProperties.ts similarity index 82% rename from lib/chai/utils/getOwnEnumerableProperties.js rename to src/chai/utils/getOwnEnumerableProperties.ts index a54b11000..1d77d523b 100644 --- a/lib/chai/utils/getOwnEnumerableProperties.js +++ b/src/chai/utils/getOwnEnumerableProperties.ts @@ -24,6 +24,9 @@ import {getOwnEnumerablePropertySymbols} from './getOwnEnumerablePropertySymbols * @api public */ -export function getOwnEnumerableProperties(obj) { - return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj)); +export function getOwnEnumerableProperties(obj: object) { + return [ + ...Object.keys(obj), + ...getOwnEnumerablePropertySymbols(obj) + ]; } diff --git a/lib/chai/utils/getOwnEnumerablePropertySymbols.js b/src/chai/utils/getOwnEnumerablePropertySymbols.ts similarity index 84% rename from lib/chai/utils/getOwnEnumerablePropertySymbols.js rename to src/chai/utils/getOwnEnumerablePropertySymbols.ts index 99571c647..e04568be0 100644 --- a/lib/chai/utils/getOwnEnumerablePropertySymbols.js +++ b/src/chai/utils/getOwnEnumerablePropertySymbols.ts @@ -18,10 +18,10 @@ * @api public */ -export function getOwnEnumerablePropertySymbols(obj) { +export function getOwnEnumerablePropertySymbols(obj: object) { if (typeof Object.getOwnPropertySymbols !== 'function') return []; return Object.getOwnPropertySymbols(obj).filter(function (sym) { - return Object.getOwnPropertyDescriptor(obj, sym).enumerable; + return Object.getOwnPropertyDescriptor(obj, sym)?.enumerable; }); } diff --git a/lib/chai/utils/getProperties.js b/src/chai/utils/getProperties.ts similarity index 88% rename from lib/chai/utils/getProperties.js rename to src/chai/utils/getProperties.ts index 99f40a447..d163ceada 100644 --- a/lib/chai/utils/getProperties.js +++ b/src/chai/utils/getProperties.ts @@ -17,10 +17,10 @@ * @api public */ -export function getProperties(object) { +export function getProperties(object: object) { var result = Object.getOwnPropertyNames(object); - function addProperty(property) { + function addProperty(property: string) { if (result.indexOf(property) === -1) { result.push(property); } diff --git a/lib/chai/utils/index.js b/src/chai/utils/index.ts similarity index 98% rename from lib/chai/utils/index.js rename to src/chai/utils/index.ts index 4b9eba8be..2365f3204 100644 --- a/lib/chai/utils/index.js +++ b/src/chai/utils/index.ts @@ -79,7 +79,7 @@ export {getPathInfo, hasProperty} from 'pathval'; * Function name */ -export function getName(fn) { +export function getName(fn: Function) { return fn.name } diff --git a/lib/chai/utils/inspect.js b/src/chai/utils/inspect.ts similarity index 91% rename from lib/chai/utils/inspect.js rename to src/chai/utils/inspect.ts index 3100c1aa6..47309f353 100644 --- a/lib/chai/utils/inspect.js +++ b/src/chai/utils/inspect.ts @@ -19,7 +19,7 @@ import {config} from '../config.js'; * @namespace Utils * @name inspect */ -export function inspect(obj, showHidden, depth, colors) { +export function inspect(obj: unknown, showHidden?: boolean, depth?: number, colors?: boolean) { var options = { colors: colors, depth: (typeof depth === 'undefined' ? 2 : depth), diff --git a/lib/chai/utils/isNaN.js b/src/chai/utils/isNaN.ts similarity index 94% rename from lib/chai/utils/isNaN.js rename to src/chai/utils/isNaN.ts index 7b1e0f069..9f362b6c8 100644 --- a/lib/chai/utils/isNaN.js +++ b/src/chai/utils/isNaN.ts @@ -16,7 +16,7 @@ * @api private */ -function _isNaN(value) { +function _isNaN(value: unknown) { // Refer http://www.ecma-international.org/ecma-262/6.0/#sec-isnan-number // section's NOTE. return value !== value; diff --git a/lib/chai/utils/isProxyEnabled.js b/src/chai/utils/isProxyEnabled.ts similarity index 100% rename from lib/chai/utils/isProxyEnabled.js rename to src/chai/utils/isProxyEnabled.ts diff --git a/lib/chai/utils/objDisplay.js b/src/chai/utils/objDisplay.ts similarity index 78% rename from lib/chai/utils/objDisplay.js rename to src/chai/utils/objDisplay.ts index 5a8383c05..572668512 100644 --- a/lib/chai/utils/objDisplay.js +++ b/src/chai/utils/objDisplay.ts @@ -25,19 +25,19 @@ import {config} from '../config.js'; * @api public */ -export function objDisplay(obj) { +export function objDisplay(obj: unknown) { var str = inspect(obj) , type = Object.prototype.toString.call(obj); if (config.truncateThreshold && str.length >= config.truncateThreshold) { if (type === '[object Function]') { - return !obj.name || obj.name === '' + return !(obj as Function).name || (obj as Function).name === '' ? '[Function]' - : '[Function: ' + obj.name + ']'; + : '[Function: ' + (obj as Function).name + ']'; } else if (type === '[object Array]') { - return '[ Array(' + obj.length + ') ]'; + return '[ Array(' + (obj as unknown[]).length + ') ]'; } else if (type === '[object Object]') { - var keys = Object.keys(obj) + var keys = Object.keys(obj as Record) , kstr = keys.length > 2 ? keys.splice(0, 2).join(', ') + ', ...' : keys.join(', '); diff --git a/lib/chai/utils/overwriteChainableMethod.js b/src/chai/utils/overwriteChainableMethod.ts similarity index 74% rename from lib/chai/utils/overwriteChainableMethod.js rename to src/chai/utils/overwriteChainableMethod.ts index a7f3f6a15..0b4031244 100644 --- a/lib/chai/utils/overwriteChainableMethod.js +++ b/src/chai/utils/overwriteChainableMethod.ts @@ -4,8 +4,7 @@ * MIT Licensed */ -import {Assertion} from '../assertion.js'; -import {transferFlags} from './transferFlags.js'; +import {ChainableBehavior} from './chainableBehavior.js'; /** * ### .overwriteChainableMethod(ctx, name, method, chainingBehavior) @@ -40,30 +39,40 @@ import {transferFlags} from './transferFlags.js'; * @api public */ -export function overwriteChainableMethod(ctx, name, method, chainingBehavior) { - var chainableBehavior = ctx.__methods[name]; +export function overwriteChainableMethod( + ctx: T, + name: string, + method: Function, + chainingBehavior: Function, + createDefaultValue?: (ctx: T) => unknown +) { + var chainableBehavior = (ctx as {__methods: Record}).__methods[name]; var _chainingBehavior = chainableBehavior.chainingBehavior; - chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() { + chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter(this: T) { var result = chainingBehavior(_chainingBehavior).call(this); if (result !== undefined) { return result; } - var newAssertion = new Assertion(); - transferFlags(this, newAssertion); - return newAssertion; + if (createDefaultValue) { + return createDefaultValue(this); + } + + return undefined; }; var _method = chainableBehavior.method; - chainableBehavior.method = function overwritingChainableMethodWrapper() { + chainableBehavior.method = function overwritingChainableMethodWrapper(this: T) { var result = method(_method).apply(this, arguments); if (result !== undefined) { return result; } - var newAssertion = new Assertion(); - transferFlags(this, newAssertion); - return newAssertion; + if (createDefaultValue) { + return createDefaultValue(this); + } + + return undefined; }; } diff --git a/lib/chai/utils/overwriteMethod.js b/src/chai/utils/overwriteMethod.ts similarity index 82% rename from lib/chai/utils/overwriteMethod.js rename to src/chai/utils/overwriteMethod.ts index 17cb0d916..6311ede3a 100644 --- a/lib/chai/utils/overwriteMethod.js +++ b/src/chai/utils/overwriteMethod.ts @@ -4,11 +4,9 @@ * MIT Licensed */ -import {Assertion} from '../assertion.js'; import {addLengthGuard} from './addLengthGuard.js'; import {flag} from './flag.js'; import {proxify} from './proxify.js'; -import {transferFlags} from './transferFlags.js'; /** * ### .overwriteMethod(ctx, name, fn) @@ -44,16 +42,21 @@ import {transferFlags} from './transferFlags.js'; * @api public */ -export function overwriteMethod(ctx, name, method) { - var _method = ctx[name] - , _super = function () { - throw new Error(name + ' is not a function'); +export function overwriteMethod( + ctx: T, + name: PropertyKey, + method: Function, + createDefaultValue?: (ctx: T) => unknown +) { + var _method = (ctx as Record)[name] + , _super: Function = function () { + throw new Error(String(name) + ' is not a function'); }; if (_method && 'function' === typeof _method) _super = _method; - var overwritingMethodWrapper = function () { + var overwritingMethodWrapper = function (this: T) { // Setting the `ssfi` flag to `overwritingMethodWrapper` causes this // function to be the starting point for removing implementation frames from // the stack trace of a failed assertion. @@ -82,11 +85,13 @@ export function overwriteMethod(ctx, name, method) { return result; } - var newAssertion = new Assertion(); - transferFlags(this, newAssertion); - return newAssertion; + if (createDefaultValue) { + return createDefaultValue(this); + } + + return undefined; } addLengthGuard(overwritingMethodWrapper, name, false); - ctx[name] = proxify(overwritingMethodWrapper, name); + (ctx as Record)[name] = proxify(overwritingMethodWrapper, name); } diff --git a/lib/chai/utils/overwriteProperty.js b/src/chai/utils/overwriteProperty.ts similarity index 91% rename from lib/chai/utils/overwriteProperty.js rename to src/chai/utils/overwriteProperty.ts index defeee257..5cb29b60b 100644 --- a/lib/chai/utils/overwriteProperty.js +++ b/src/chai/utils/overwriteProperty.ts @@ -4,10 +4,8 @@ * MIT Licensed */ -import {Assertion} from '../assertion.js'; import {flag} from './flag.js'; import {isProxyEnabled} from './isProxyEnabled.js'; -import {transferFlags} from './transferFlags.js'; /** * ### .overwriteProperty(ctx, name, fn) @@ -43,7 +41,12 @@ import {transferFlags} from './transferFlags.js'; * @api public */ -export function overwriteProperty(ctx, name, getter) { +export function overwriteProperty( + ctx: T, + name: PropertyKey, + getter: Function, + createDefaultValue?: (ctx: T) => unknown +) { var _get = Object.getOwnPropertyDescriptor(ctx, name) , _super = function () {}; @@ -83,9 +86,11 @@ export function overwriteProperty(ctx, name, getter) { return result; } - var newAssertion = new Assertion(); - transferFlags(this, newAssertion); - return newAssertion; + if (createDefaultValue) { + return createDefaultValue(this); + } + + return undefined; } , configurable: true }); diff --git a/lib/chai/utils/proxify.js b/src/chai/utils/proxify.ts similarity index 91% rename from lib/chai/utils/proxify.js rename to src/chai/utils/proxify.ts index ca1a2c2b1..2712a6325 100644 --- a/lib/chai/utils/proxify.js +++ b/src/chai/utils/proxify.ts @@ -28,9 +28,9 @@ import {isProxyEnabled} from './isProxyEnabled.js'; * @name proxify */ -const builtins = ['__flags', '__methods', '_obj', 'assert']; +const builtins: PropertyKey[] = ['__flags', '__methods', '_obj', 'assert']; -export function proxify(obj ,nonChainableMethodName) { +export function proxify(obj: T, nonChainableMethodName?: PropertyKey): T { if (!isProxyEnabled()) return obj; return new Proxy(obj, { @@ -44,9 +44,9 @@ export function proxify(obj ,nonChainableMethodName) { !Reflect.has(target, property)) { // Special message for invalid property access of non-chainable methods. if (nonChainableMethodName) { - throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' + + throw Error('Invalid Chai property: ' + String(nonChainableMethodName) + '.' + property + '. See docs for proper usage of "' + - nonChainableMethodName + '".'); + String(nonChainableMethodName) + '".'); } // If the property is reasonably close to an existing Chai property, @@ -92,7 +92,7 @@ export function proxify(obj ,nonChainableMethodName) { // being called from within another assertion. In that case, the `ssfi` // flag is already set to the outer assertion's starting point. if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) { - flag(target, 'ssfi', proxyGetter); + flag(target as object, 'ssfi', proxyGetter); } return Reflect.get(target, property); @@ -110,7 +110,7 @@ export function proxify(obj ,nonChainableMethodName) { * @api private */ -function stringDistanceCapped(strA, strB, cap) { +function stringDistanceCapped(strA: string, strB: string, cap: number) { if (Math.abs(strA.length - strB.length) >= cap) { return cap; } diff --git a/lib/chai/utils/test.js b/src/chai/utils/test.ts similarity index 90% rename from lib/chai/utils/test.js rename to src/chai/utils/test.ts index 19a47dbe8..7ee4b72a8 100644 --- a/lib/chai/utils/test.js +++ b/src/chai/utils/test.ts @@ -21,7 +21,7 @@ import {flag} from './flag.js'; * @name test */ -export function test(obj, args) { +export function test(obj: object, args: IArguments) { var negate = flag(obj, 'negate') , expr = args[0]; return negate ? !expr : expr; diff --git a/lib/chai/utils/transferFlags.js b/src/chai/utils/transferFlags.ts similarity index 70% rename from lib/chai/utils/transferFlags.js rename to src/chai/utils/transferFlags.ts index a1a7d3ef4..d9c13b3d5 100644 --- a/lib/chai/utils/transferFlags.js +++ b/src/chai/utils/transferFlags.ts @@ -27,19 +27,19 @@ * @api private */ -export function transferFlags(assertion, object, includeAll) { - var flags = assertion.__flags || (assertion.__flags = Object.create(null)); +export function transferFlags(assertion: object, object: object, includeAll?: boolean) { + const assertionWithFlags = assertion as {__flags?: Record}; + const objWithFlags = object as {__flags?: Record}; - if (!object.__flags) { - object.__flags = Object.create(null); - } + var flags = assertionWithFlags.__flags || (assertionWithFlags.__flags = Object.create(null)); + const objFlags = objWithFlags.__flags || (objWithFlags.__flags = Object.create(null)); includeAll = arguments.length === 3 ? includeAll : true; for (var flag in flags) { if (includeAll || (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) { - object.__flags[flag] = flags[flag]; + objFlags[flag] = flags[flag]; } } } diff --git a/lib/chai/utils/type-detect.js b/src/chai/utils/type-detect.ts similarity index 68% rename from lib/chai/utils/type-detect.js rename to src/chai/utils/type-detect.ts index 5a86a6ab2..1db741bb3 100644 --- a/lib/chai/utils/type-detect.js +++ b/src/chai/utils/type-detect.ts @@ -1,13 +1,13 @@ -export function type(obj) { +export function type(obj: unknown) { if (typeof obj === 'undefined') { return 'undefined'; } - + if (obj === null) { return 'null'; } - const stringTag = obj[Symbol.toStringTag]; + const stringTag = (obj as Record)[Symbol.toStringTag]; if (typeof stringTag === 'string') { return stringTag; } diff --git a/test/assert.js b/test/assert.js index 8462fd5ee..ce3061412 100644 --- a/test/assert.js +++ b/test/assert.js @@ -1,4 +1,4 @@ -import * as chai from '../index.js'; +import * as chai from '../lib/chai.js'; import {globalErr as err} from './bootstrap/index.js'; describe('assert', function () { diff --git a/test/bootstrap/index.js b/test/bootstrap/index.js index a6cb371e3..877b3346d 100644 --- a/test/bootstrap/index.js +++ b/test/bootstrap/index.js @@ -1,4 +1,4 @@ -import * as chai from '../../index.js'; +import * as chai from '../../lib/chai.js'; var isStackSupported = false; if (typeof Error.captureStackTrace !== 'undefined') { diff --git a/test/configuration.js b/test/configuration.js index 09e1b4982..b2d853403 100644 --- a/test/configuration.js +++ b/test/configuration.js @@ -1,4 +1,4 @@ -import * as chai from '../index.js'; +import * as chai from '../lib/chai.js'; import {globalErr as err} from './bootstrap/index.js'; import '../register-should.js'; diff --git a/test/display/errors.js b/test/display/errors.js index cef1b7023..c49b66730 100644 --- a/test/display/errors.js +++ b/test/display/errors.js @@ -1,4 +1,4 @@ -import * as chai from '../../index.js'; +import * as chai from '../../lib/chai.js'; var expect = chai.expect; diff --git a/test/display/message.js b/test/display/message.js index 7ce281252..e300b5e6b 100644 --- a/test/display/message.js +++ b/test/display/message.js @@ -1,4 +1,4 @@ -import * as chai from '../../index.js' +import * as chai from '../../lib/chai.js' const expect = chai.expect diff --git a/test/expect.js b/test/expect.js index 2dd08ef26..bbc4e91f5 100644 --- a/test/expect.js +++ b/test/expect.js @@ -1,4 +1,4 @@ -import * as chai from '../index.js'; +import * as chai from '../lib/chai.js'; import {globalErr as err} from './bootstrap/index.js'; describe('expect', function () { @@ -11,29 +11,34 @@ describe('expect', function () { describe('safeguards', function () { before(function () { + const getDefaultValue = (assertion) => { + var newAssertion = chai.Assertion.create(); + chai.util.transferFlags(assertion, newAssertion); + return newAssertion; + }; chai.util.addProperty(chai.Assertion.prototype, 'tmpProperty', function () { new chai.Assertion(42).equal(42); - }); + }, getDefaultValue); chai.util.overwriteProperty(chai.Assertion.prototype, 'tmpProperty', function (_super) { return function () { _super.call(this); }; - }); + }, getDefaultValue); chai.util.addMethod(chai.Assertion.prototype, 'tmpMethod', function () { new chai.Assertion(42).equal(42); - }); + }, getDefaultValue); chai.util.overwriteMethod(chai.Assertion.prototype, 'tmpMethod', function (_super) { return function () { _super.call(this); }; - }); + }, getDefaultValue); chai.util.addChainableMethod(chai.Assertion.prototype, 'tmpChainableMethod', function () { new chai.Assertion(42).equal(42); }, function () { new chai.Assertion(42).equal(42); - }); + }, getDefaultValue); chai.util.overwriteChainableMethod(chai.Assertion.prototype, 'tmpChainableMethod', function (_super) { return function () { _super.call(this); @@ -42,7 +47,7 @@ describe('expect', function () { return function () { _super.call(this); }; - }); + }, getDefaultValue); }); after(function () { diff --git a/test/globalErr.js b/test/globalErr.js index a93f77387..ed02b5742 100644 --- a/test/globalErr.js +++ b/test/globalErr.js @@ -1,4 +1,4 @@ -import * as chai from '../index.js'; +import * as chai from '../lib/chai.js'; import {globalErr as err} from './bootstrap/index.js'; describe('globalErr', function () { diff --git a/test/globalShould.js b/test/globalShould.js index 5fb11eaf0..5f8651dc8 100644 --- a/test/globalShould.js +++ b/test/globalShould.js @@ -1,4 +1,4 @@ -import * as chai from '../index.js'; +import * as chai from '../lib/chai.js'; describe('global should', function () { it('works', function () { diff --git a/test/plugins.js b/test/plugins.js index 4db1f44df..bc733d488 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -1,4 +1,4 @@ -import * as chai from '../index.js'; +import * as chai from '../lib/chai.js'; describe('plugins', function () { diff --git a/test/should.js b/test/should.js index 17429961f..eb233c48f 100644 --- a/test/should.js +++ b/test/should.js @@ -1,4 +1,4 @@ -import * as chai from '../index.js'; +import * as chai from '../lib/chai.js'; import {globalErr as err} from './bootstrap/index.js'; describe('should', function() { @@ -12,29 +12,34 @@ describe('should', function() { describe('safeguards', function () { before(function () { + const getDefaultValue = (assertion) => { + var newAssertion = chai.Assertion.create(); + chai.util.transferFlags(assertion, newAssertion); + return newAssertion; + }; chai.util.addProperty(chai.Assertion.prototype, 'tmpProperty', function () { new chai.Assertion(42).equal(42); - }); + }, getDefaultValue); chai.util.overwriteProperty(chai.Assertion.prototype, 'tmpProperty', function (_super) { return function () { _super.call(this); }; - }); + }, getDefaultValue); chai.util.addMethod(chai.Assertion.prototype, 'tmpMethod', function () { new chai.Assertion(42).equal(42); - }); + }, getDefaultValue); chai.util.overwriteMethod(chai.Assertion.prototype, 'tmpMethod', function (_super) { return function () { _super.call(this); }; - }); + }, getDefaultValue); chai.util.addChainableMethod(chai.Assertion.prototype, 'tmpChainableMethod', function () { new chai.Assertion(42).equal(42); }, function () { new chai.Assertion(42).equal(42); - }); + }, getDefaultValue); chai.util.overwriteChainableMethod(chai.Assertion.prototype, 'tmpChainableMethod', function (_super) { return function () { _super.call(this); @@ -43,7 +48,7 @@ describe('should', function() { return function () { _super.call(this); }; - }); + }, getDefaultValue); }); after(function () { diff --git a/test/type-detect/dom.js b/test/type-detect/dom.js index bda6bdc3d..4c0f8882d 100644 --- a/test/type-detect/dom.js +++ b/test/type-detect/dom.js @@ -1,4 +1,4 @@ -import * as chai from '../../index.js'; +import * as chai from '../../lib/chai.js'; function assert (expr, msg) { if (!expr) { diff --git a/test/type-detect/index.js b/test/type-detect/index.js index 983800d12..07ef8eb22 100644 --- a/test/type-detect/index.js +++ b/test/type-detect/index.js @@ -1,4 +1,4 @@ -import * as chai from '../../index.js'; +import * as chai from '../../lib/chai.js'; function assert (expr, msg) { if (!expr) { diff --git a/test/type-detect/new-ecmascript-types.js b/test/type-detect/new-ecmascript-types.js index 256c998e6..b9fba5d17 100644 --- a/test/type-detect/new-ecmascript-types.js +++ b/test/type-detect/new-ecmascript-types.js @@ -1,4 +1,4 @@ -import * as chai from '../../index.js'; +import * as chai from '../../lib/chai.js'; function assert (expr, msg) { if (!expr) { diff --git a/test/type-detect/node.js b/test/type-detect/node.js index 185525484..ca0a6facd 100644 --- a/test/type-detect/node.js +++ b/test/type-detect/node.js @@ -1,4 +1,4 @@ -import * as chai from '../../index.js'; +import * as chai from '../../lib/chai.js'; function assert (expr, msg) { if (!expr) { diff --git a/test/type-detect/tostringtag-extras.js b/test/type-detect/tostringtag-extras.js index 3a0f7deba..23543ee8f 100644 --- a/test/type-detect/tostringtag-extras.js +++ b/test/type-detect/tostringtag-extras.js @@ -1,4 +1,4 @@ -import * as chai from '../../index.js'; +import * as chai from '../../lib/chai.js'; function assert (expr, msg) { if (!expr) { diff --git a/test/utilities.js b/test/utilities.js index 5a00da46a..b28dc32cf 100644 --- a/test/utilities.js +++ b/test/utilities.js @@ -1,4 +1,4 @@ -import * as chai from '../index.js'; +import * as chai from '../lib/chai.js'; describe('utilities', function () { const expect = chai.expect; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..beea32811 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es2021", + "module": "nodenext", + "moduleResolution": "nodenext", + "types": [], + "declaration": true, + "sourceMap": true, + "outDir": "./lib", + "isolatedModules": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true + }, + "include": [ + "src/**/*.ts" + ] +}