export type ErrorConstructor = { readonly prototype: ErrorType; new (...args: any[]): ErrorType; }; export type ThrownError = ErrorType extends ErrorConstructor ? ErrorType['prototype'] : ErrorType; /** Specify one or more expectations the thrown error must satisfy. */ export type ThrowsExpectation = { /** If true, the thrown error is not required to be a native error. */ any?: false; /** The thrown error must have a code that equals the given string or number. */ code?: string | number; /** The thrown error must be an instance of this constructor. */ instanceOf?: ErrorType extends ErrorConstructor ? ErrorType : ErrorType extends Error ? ErrorConstructor : never; /** The thrown error must be strictly equal to this value. */ is?: ErrorType extends ErrorConstructor ? ErrorType['prototype'] : ErrorType; /** The thrown error must have a message that equals the given string, or matches the regular expression. */ message?: string | RegExp | ((message: string) => boolean); /** The thrown error must have a name that equals the given string. */ name?: string; }; export type ThrowsAnyExpectation = Omit, 'any' | 'instanceOf' | 'is'> & { /** If true, the thrown error is not required to be a native error. */ any: true; /** The thrown error must be an instance of this constructor. */ instanceOf?: new (...args: any[]) => any; /** The thrown error must be strictly equal to this value. */ is?: any; }; export type Assertions = { /** * Assert that `actual` is [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy), returning a boolean * indicating whether the assertion passed. * * Note: An `else` clause using this as a type guard will be subtly incorrect for `string` and `number` types and will not give `0` or `''` as a potential value in an `else` clause. */ assert: AssertAssertion; /** * Assert that `actual` is [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to * `expected`, returning a boolean indicating whether the assertion passed. */ deepEqual: DeepEqualAssertion; /** * Assert that `value` is like `selector`, returning a boolean indicating whether the assertion passed. */ like: LikeAssertion; /** Fail the test, always returning `false`. */ fail: FailAssertion; /** * Assert that `actual` is strictly false, returning a boolean indicating whether the assertion passed. */ false: FalseAssertion; /** * Assert that `actual` is [falsy](https://developer.mozilla.org/en-US/docs/Glossary/Falsy), returning a boolean * indicating whether the assertion passed. */ falsy: FalsyAssertion; /** * Assert that `actual` is [the same * value](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) as `expected`, * returning a boolean indicating whether the assertion passed. */ is: IsAssertion; /** * Assert that `actual` is not [the same * value](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) as `expected`, * returning a boolean indicating whether the assertion passed. */ not: NotAssertion; /** * Assert that `actual` is not [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to * `expected`, returning a boolean indicating whether the assertion passed. */ notDeepEqual: NotDeepEqualAssertion; /** * Assert that `string` does not match the regular expression, returning a boolean indicating whether the assertion * passed. */ notRegex: NotRegexAssertion; /** Assert that the function does not throw. */ notThrows: NotThrowsAssertion; /** Assert that the async function does not throw, or that the promise does not reject. Must be awaited. */ notThrowsAsync: NotThrowsAsyncAssertion; /** Count a passing assertion, always returning `true`. */ pass: PassAssertion; /** * Assert that `string` matches the regular expression, returning a boolean indicating whether the assertion passed. */ regex: RegexAssertion; /** * Assert that `expected` is [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to a * previously recorded [snapshot](https://github.com/concordancejs/concordance#serialization-details), or if * necessary record a new snapshot. */ snapshot: SnapshotAssertion; /** * Assert that the function throws a native error. If so, returns the error value. */ throws: ThrowsAssertion; /** * Assert that the async function throws a native error, or the promise rejects * with one. If so, returns a promise for the error value, which must be awaited. */ throwsAsync: ThrowsAsyncAssertion; /** * Assert that `actual` is strictly true, returning a boolean indicating whether the assertion passed. */ true: TrueAssertion; /** * Assert that `actual` is [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy), returning a boolean * indicating whether the assertion passed. * * Note: An `else` clause using this as a type guard will be subtly incorrect for `string` and `number` types and will not give `0` or `''` as a potential value in an `else` clause. */ truthy: TruthyAssertion; }; type FalsyValue = false | 0 | 0n | '' | null | undefined; // eslint-disable-line @typescript-eslint/ban-types type Falsy = T extends Exclude ? (T extends number | string | bigint ? T & FalsyValue : never) : T; export type AssertAssertion = { /** * Assert that `actual` is [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy), returning `true` if the * assertion passed and throwing otherwise. * * Note: An `else` clause using this as a type guard will be subtly incorrect for `string` and `number` types and will * not give `0` or `''` as a potential value in an `else` clause. */ (actual: T, message?: string): actual is T extends Falsy ? never : T; /** Skip this assertion. */ skip(actual: any, message?: string): void; }; export type DeepEqualAssertion = { /** * Assert that `actual` is [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to * `expected`, returning `true` if the assertion passed and throwing otherwise. */ (actual: Actual, expected: Expected, message?: string): actual is Expected; /** * Assert that `actual` is [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to * `expected`, returning `true` if the assertion passed and throwing otherwise. */ (actual: Actual, expected: Expected, message?: string): expected is Actual; /** * Assert that `actual` is [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to * `expected`, returning `true` if the assertion passed and throwing otherwise. */ (actual: Actual, expected: Expected, message?: string): boolean; /** Skip this assertion. */ skip(actual: any, expected: any, message?: string): void; }; export type LikeAssertion = { /** * Assert that `value` is like `selector`, returning `true` if the assertion passed and throwing otherwise. */ >(value: any, selector: Expected, message?: string): value is Expected; /** Skip this assertion. */ skip(value: any, selector: any, message?: string): void; }; export type FailAssertion = { /** Fail the test. */ (message?: string): never; /** Skip this assertion. */ skip(message?: string): void; }; export type FalseAssertion = { /** * Assert that `actual` is strictly false, returning `true` if the assertion passed and throwing otherwise. */ (actual: any, message?: string): actual is false; /** Skip this assertion. */ skip(actual: any, message?: string): void; }; export type FalsyAssertion = { /** * Assert that `actual` is [falsy](https://developer.mozilla.org/en-US/docs/Glossary/Falsy), returning `true` if the * assertion passed and throwing otherwise. */ (actual: T, message?: string): actual is Falsy; /** Skip this assertion. */ skip(actual: any, message?: string): void; }; export type IsAssertion = { /** * Assert that `actual` is [the same * value](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) as `expected`, * returning `true` if the assertion passed and throwing otherwise. */ (actual: Actual, expected: Expected, message?: string): actual is Expected; /** Skip this assertion. */ skip(actual: any, expected: any, message?: string): void; }; export type NotAssertion = { /** * Assert that `actual` is not [the same * value](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) as `expected`, * returning `true` if the assertion passed and throwing otherwise. */ (actual: Actual, expected: Expected, message?: string): true; /** Skip this assertion. */ skip(actual: any, expected: any, message?: string): void; }; export type NotDeepEqualAssertion = { /** * Assert that `actual` is not [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to * `expected`, returning `true` if the assertion passed and throwing otherwise. */ (actual: Actual, expected: Expected, message?: string): true; /** Skip this assertion. */ skip(actual: any, expected: any, message?: string): void; }; export type NotRegexAssertion = { /** * Assert that `string` does not match the regular expression, returning `true` if the assertion passed and throwing * otherwise. */ (string: string, regex: RegExp, message?: string): true; /** Skip this assertion. */ skip(string: string, regex: RegExp, message?: string): void; }; export type NotThrowsAssertion = { /** * Assert that the function does not throw, returning `true` if the assertion passed and throwing otherwise. */ (fn: () => any, message?: string): true; /** Skip this assertion. */ skip(fn: () => any, message?: string): void; }; export type NotThrowsAsyncAssertion = { /** * Assert that the async function does not throw, returning a promise for `true` if the assertion passesd and a * rejected promise otherwise. * * You must await the result. */ (fn: () => PromiseLike, message?: string): Promise; /** Assert that the promise does not reject, returning a promise for `true` if the assertion passesd and a * rejected promise otherwise. * * You must await the result. */ (promise: PromiseLike, message?: string): Promise; /** Skip this assertion. */ skip(nonThrower: any, message?: string): void; }; export type PassAssertion = { /** Count a passing assertion, always returning `true`. */ (message?: string): true; /** Skip this assertion. */ skip(message?: string): void; }; export type RegexAssertion = { /** * Assert that `string` matches the regular expression, returning `true` if the assertion passed and throwing * otherwise. */ (string: string, regex: RegExp, message?: string): true; /** Skip this assertion. */ skip(string: string, regex: RegExp, message?: string): void; }; export type SnapshotAssertion = { /** * Assert that `expected` is [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to a * previously recorded [snapshot](https://github.com/concordancejs/concordance#serialization-details), or if * necessary record a new snapshot. * * Returns `true` if the assertion passed and throws otherwise. */ (expected: any, message?: string): true; /** Skip this assertion. */ skip(expected: any, message?: string): void; }; export type ThrowsAssertion = { /** * Assert that the function throws a native error. The error must satisfy all expectations. Returns the error value if * the assertion passes and throws otherwise. */ (fn: () => any, expectations?: ThrowsExpectation, message?: string): ThrownError; /** * Assert that the function throws. The error must satisfy all expectations. Returns the error value if the assertion * passes and throws otherwise. */ (fn: () => any, expectations?: ThrowsAnyExpectation, message?: string): unknown; /** Skip this assertion. */ skip(fn: () => any, expectations?: any, message?: string): void; }; export type ThrowsAsyncAssertion = { /** * Assert that the async function throws a native error. You must await the result. The error must satisfy all * expectations. Returns a promise for the error value if the assertion passes and a rejected promise otherwise. */ (fn: () => PromiseLike, expectations?: ThrowsExpectation, message?: string): Promise>; /** * Assert that the promise rejects with a native error. You must await the result. The error must satisfy all * expectations. Returns a promise for the error value if the assertion passes and a rejected promise otherwise. */ (promise: PromiseLike, expectations?: ThrowsExpectation, message?: string): Promise>; /** * Assert that the async function throws. You must await the result. The error must satisfy all expectations. Returns * a promise for the error value if the assertion passes and a rejected promise otherwise. */ (fn: () => PromiseLike, expectations?: ThrowsAnyExpectation, message?: string): Promise; /** * Assert that the promise rejects. You must await the result. The error must satisfy all expectations. Returns a * promise for the error value if the assertion passes and a rejected promise otherwise. */ (promise: PromiseLike, expectations?: ThrowsAnyExpectation, message?: string): Promise; /** Skip this assertion. */ skip(thrower: any, expectations?: any, message?: string): void; }; export type TrueAssertion = { /** * Assert that `actual` is strictly true, returning `true` if the assertion passed and throwing otherwise. */ (actual: any, message?: string): actual is true; /** Skip this assertion. */ skip(actual: any, message?: string): void; }; export type TruthyAssertion = { /** * Assert that `actual` is [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy), returning `true` if the * assertion passed and throwing otherwise. * * Note: An `else` clause using this as a type guard will be subtly incorrect for `string` and `number` types and will * not give `0` or `''` as a potential value in an `else` clause. */ (actual: T, message?: string): actual is T extends Falsy ? never : T; /** Skip this assertion. */ skip(actual: any, message?: string): void; };