{"version":3,"sources":["jsdelivr-header.js","/npm/@thisisagile/easy-test@17.30.10/src/index.ts","/npm/@thisisagile/easy-test@17.30.10/src/utils/Utils.ts","/npm/@thisisagile/easy-test@17.30.10/src/utils/Types.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/Match.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/HttpMatchers.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/Check.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/ResultMatchers.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toBeArrayOf.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toBeArrayOfWithLength.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toBeAt.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toBeExactlyAt.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toFailMatcher.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toBeValid.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toMatchArray.ts","/npm/@thisisagile/easy-test@17.30.10/src/utils/Eq.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toMatchExactJson.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toMatchException.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toMatchJson.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toMatchRoute.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toMatchText.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toPassMatcher.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toBeQueriedWith.ts","/npm/@thisisagile/easy-test@17.30.10/src/matchers/toBeRoutedTo.ts","/npm/@thisisagile/easy-test@17.30.10/src/mock/Fits.ts","/npm/@thisisagile/easy-test@17.30.10/src/utils/Req.ts","/npm/@thisisagile/easy-test@17.30.10/src/mock/Mocks.ts"],"names":[],"mappings":"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","file":"/npm/@thisisagile/easy-test@17.30.10/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@thisisagile/easy-test@17.30.10/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export * from './matchers';\nexport * from './mock';\n","import { ArrayLike } from './Types';\n\nexport const isDefined = <T = unknown>(o?: T): boolean => o !== undefined && o !== null;\n\nexport const isNumber = (o?: unknown): o is number => isDefined(o) && typeof o === 'number' && !Number.isNaN(o);\nexport const isFunction = (o?: unknown): o is (...params: unknown[]) => unknown => isDefined(o) && typeof o === 'function';\n\nexport const isA = <T>(t?: unknown, ...properties: (keyof T)[]): t is T => isDefined(t) && properties.every(p => isDefined((t as T)[p]));\nexport const isAn = isA;\n\nexport const isArray = <T = any>(o?: unknown): o is Array<T> => isDefined(o) && o instanceof Array;\nexport const isObject = (o?: unknown): o is Record<string, unknown> => o != null && (typeof o === 'object' || typeof o === 'function') && !isArray(o);\n\nexport const asJson = (a?: unknown): any => ((a as any)?.toJSON ? (a as any).toJSON() : isObject(a) ? a : undefined);\nexport const asString = (a?: unknown): string => (a as any)?.toString();\n\nexport const asNumber = (num: unknown, alt?: number | (() => number)): number => {\n  const n = parseInt(asString(num));\n  return isNumber(n) ? n : isFunction(alt) ? alt() : isNumber(alt) ? alt : NaN;\n};\n\nexport const toArray = <T>(...items: ArrayLike<T>): T[] =>\n  items.length > 1 ? (items as T[]) : isArray(items[0]) ? items[0] : isDefined(items[0]) ? [items[0]] : [];\n","import { asString, isFunction } from './Utils';\n\nexport type OneOrMore<T> = T | Array<T>;\n\nexport type ArrayLike<T> = OneOrMore<T>[];\n\nexport type Constructor<T> = { new (...args: any[]): T };\n\nexport type Message<P> = Text | ((...params: P[]) => Text);\n\nexport const toMessage = <P>(g: Message<P>, ...params: P[]): string => asString(isFunction(g) ? g(...params) : g);\n\nexport type Validatable = { isValid: boolean };\n\nexport type Result = { domain?: string; location?: string; message: string };\n\nexport type Results = Validatable & { results: Result[] };\n\nexport type Uri = Text;\n\nexport type Id = string | number;\n\nexport type JsonValue = string | number | boolean | null | Json | JsonValue[];\n\nexport type Json = { [key: string]: JsonValue };\n\nexport type Exception = { id: Id; reason?: string };\n\nexport type Text = { toString: () => string };\n\nexport type Query = Text;\n\nexport type UseCase = { app: { id: Text }; id: Text };\n\nexport type Tester = { url: string };\n\nexport type CreateMutable<T> = { -readonly [P in keyof T]: T[P] };\n","import { isDefined } from '../utils/Utils';\nimport { Message, toMessage } from '../utils/Types';\n\nexport class Match<S> {\n  constructor(private readonly subject: S, private readonly failed = false, private readonly message: Message<S> = '') {}\n\n  not(p: (s: S) => boolean, message: Message<S>): Match<S> {\n    if (this.failed) {\n      return this;\n    }\n    try {\n      return new Match<S>(this.subject, !p(this.subject), toMessage(message, this.subject));\n    } catch (e: any) {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n      return new Match<S>(this.subject, true, e.message);\n    }\n  }\n\n  undefined(p: (s: S) => any, message: Message<S>): Match<S> {\n    return this.not(() => isDefined(p(this.subject)), message);\n  }\n\n  else(message: Message<S>): jest.CustomMatcherResult {\n    return {\n      pass: !this.failed,\n      message: () => (this.failed ? toMessage(this.message) : `${toMessage(message, this.subject)}, which we did not expect.`),\n    };\n  }\n}\n\nexport const match = <S>(subject: S): Match<S> => new Match<S>(subject);\n","import { Response } from '../utils/Response';\nimport { match } from './Match';\n\nexport const toHaveStatus = (res: Response, code: number): jest.CustomMatcherResult =>\n  match<Response>(res)\n    .undefined(r => r, 'Response is unknown.')\n    .undefined(\n      r => r?.status?.id,\n      () => 'Response does not have a status code'\n    )\n    .not(\n      r => r.status.id === code,\n      r => `Response does not have code '${code}', but has code '${r.status.id}' instead.`\n    )\n    .else(`Response does have status code '${code}'.`);\n\nexport const toBeOk = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 200);\n\nexport const toBeCreated = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 201);\n\nexport const toHaveNoContent = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 204);\n\nexport const toBeBadRequest = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 400);\n\nexport const toBeUnauthorized = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 401);\n\nexport const toBeForbidden = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 403);\n\nexport const toBeNotFound = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 404);\n\nexport const toBeConflict = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 409);\n\nexport const toBeInternalServerError = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 500);\n\nexport const toBeBadGateway = (res: Response): jest.CustomMatcherResult => toHaveStatus(res, 502);\n\nexport const toBeOkWithItems = (res: Response, length: number): jest.CustomMatcherResult =>\n  match<Response>(res)\n    .undefined(r => r.status?.id, 'Response did not have a status')\n    .not(\n      r => r.status.id === 200,\n      r => `Response did not have status '200'. It had status '${r.status.id}' instead.`\n    )\n    .undefined(r => r?.body?.data?.items, `Response did not have any items.`)\n    .not(\n      r => (r?.body?.data?.itemCount ?? 0) >= length,\n      r => `Response did not have at least ${length} items. It only had ${r?.body?.data?.itemCount ?? 0} items.`\n    )\n    .else(`Response had status 200 and at least ${length} items`);\n\nexpect.extend({\n  toBeOk,\n  toBeOkWithItems,\n  toBeCreated,\n  toHaveNoContent,\n  toBeNotFound,\n  toBeBadRequest,\n  toBeUnauthorized,\n  toBeForbidden,\n  toBeConflict,\n  toBeInternalServerError,\n  toHaveStatus,\n  toBeBadGateway,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toBeOk(): R;\n      toBeOkWithItems(length: number): R;\n      toBeCreated(): R;\n      toHaveNoContent(): R;\n      toBeNotFound(): R;\n      toBeUnauthorized(): R;\n      toBeForbidden(): R;\n      toBeBadRequest(): R;\n      toBeConflict(): R;\n      toBeInternalServerError(): R;\n      toBeBadGateway(): R;\n      toHaveStatus(code: number): R;\n    }\n  }\n}\n","import { isDefined } from '../utils/Utils';\n\ntype ToMessage<S> = string | ((s: S[]) => string);\n\nclass Check<S> {\n  constructor(\n    private ctx: jest.MatcherContext,\n    private readonly received: S,\n    private readonly expected: S,\n    private readonly failed = false,\n    private readonly message = ''\n  ) {}\n\n  print(message: ToMessage<S>): string {\n    return (typeof message === 'function' ? message([this.received, this.expected]) : message)\n      .replace('{r}', this.ctx.utils.printReceived(this.received))\n      .replace('{e}', this.ctx.utils.printExpected(this.expected))\n      .replace('{diff}', this.ctx.utils.diff(this.received, this.expected) ?? '');\n  }\n\n  not(p: (s: S[]) => boolean, message: ToMessage<S>): Check<S> {\n    if (this.failed) {\n      return this;\n    }\n    try {\n      return new Check<S>(this.ctx, this.received, this.expected, !p([this.received, this.expected]), this.print(message));\n    } catch (e: any) {\n      return new Check<S>(this.ctx, this.received, this.expected, true, e.message);\n    }\n  }\n\n  undefined(p: (s: S[]) => any, message: ToMessage<S>): Check<S> {\n    return this.not(() => isDefined(p([this.received, this.expected])), this.print(message));\n  }\n\n  else(message: ToMessage<S> = 'Expected {r} not to match with {e}, but it did.'): jest.CustomMatcherResult {\n    return {\n      pass: !this.failed,\n      message: () => (this.failed ? this.message : this.print(message)),\n    };\n  }\n}\n\nexport const check = <S>(ctx: jest.MatcherContext, received: S, expected?: S): Check<S> => new Check<S>(ctx, received, expected as S);\n\nexport const checkDefined = <S>(ctx: jest.MatcherContext, received: S, expected?: S): Check<S> =>\n  new Check<S>(ctx, received, expected as S).undefined(([r]) => r, 'Received array is undefined.').undefined(([, e]) => e, 'Expected array is undefined.');\n","import { match } from './Match';\nimport { Results } from '../utils/Types';\n\n// Tests for handling Results.\n\nconst notDefined = 'Results is not defined.';\nconst doesNotFail = 'Results does not fail.';\n\nconst hasMessage = (res: Results, message: string) => res.results.some((r: any) => r.message === message);\n\nconst messages = (res: Results): string => \"'\" + res?.results.map(r => r.message).join(\"', '\") + \"'\";\n\nexport const toResultWith = (results: Results, message: string): jest.CustomMatcherResult =>\n  match(results)\n    .undefined(r => r, notDefined)\n    .not(\n      r => hasMessage(r, message),\n      r => `Results does not have message '${message}', but it has messages ${messages(r)} instead.`\n    )\n    .else(`Succeeds with message ${message}`);\n\nexport const toFail = (results: Results): jest.CustomMatcherResult =>\n  match(results)\n    .undefined(r => r, notDefined)\n    .not(r => !r.isValid, doesNotFail)\n    .else('Results does not fail');\n\nexport const toFailWith = (results: Results, message: string): jest.CustomMatcherResult =>\n  match(results)\n    .undefined(r => r, notDefined)\n    .not(r => !r.isValid, doesNotFail)\n    .not(\n      r => hasMessage(r, message),\n      r => `Fails, but results does not have message '${message}', but it has messages ${messages(r)} instead.`\n    )\n    .else(`Fails with message '${message}'`);\n\nexpect.extend({\n  toResultWith,\n  toFail: toFail,\n  toFailWith: toFailWith,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toResultWith(message: string): R;\n      toFail(): R;\n      toFailWith(message: string): R;\n    }\n  }\n}\n","import { Constructor as Ctor } from '../utils/Types';\nimport { match } from './Match';\n\nexport const toBeArrayOf = <T>(items: unknown, ctor: Ctor<T>): jest.CustomMatcherResult =>\n  match<unknown>(items)\n    .undefined(it => it, 'Subject is undefined.')\n    .not(it => it instanceof Array, 'Subject is not an array.')\n    .not(it => (it as []).every((i: any) => i instanceof ctor), `Not all elements are of type '${ctor.name}'.`)\n    .else(`All elements in array are of type '${ctor.name}'`);\n\nexpect.extend({\n  toBeArrayOf,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toBeArrayOf<Z>(ctor: Ctor<Z>): R;\n    }\n  }\n}\n","import { Constructor as Ctor } from '../utils/Types';\nimport { match } from './Match';\n\nexport const toBeArrayOfWithLength = <T>(items: unknown, ctor: Ctor<T>, length: number): jest.CustomMatcherResult =>\n  match<unknown>(items)\n    .undefined(it => it, 'Subject is undefined.')\n    .not(it => it instanceof Array, 'Subject is not an array.')\n    .not(\n      it => (it as []).length === length,\n      it => `Subject does not have ${length} elements, but ${(it as []).length}.`\n    )\n    .not(it => (it as []).every((i: any) => i instanceof ctor), `Not all elements are of type '${ctor.name}'.`)\n    .else(`Subject has ${length} elements, which are all of type '${ctor.name}'`);\n\nexpect.extend({\n  toBeArrayOfWithLength,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toBeArrayOfWithLength<Z>(ctor: Ctor<Z>, length: number): R;\n    }\n  }\n}\n","import { Id, Tester, UseCase } from '../utils/Types';\nimport { match } from './Match';\n\nexport const toBeAt = (tester?: Tester, uc?: UseCase, id?: Id): jest.CustomMatcherResult => {\n  return match<Tester>(tester as Tester)\n    .undefined(t => t, 'Tester is undefined')\n    .undefined(t => t.url, 'Tester does not contain a URL')\n    .undefined(() => uc, 'Use case is undefined')\n    .not(\n      t => t.url.includes(`/${uc?.app.id}`),\n      t => `We expected the tester to be at app '${uc?.app.id}', but it is at '${t?.url}' instead.`\n    )\n    .not(\n      t => t.url.includes(`/${uc?.id}`),\n      t => `We expected the tester to be at use case '${uc?.id}', but it is at '${t?.url}' instead.`\n    )\n    .not(\n      t => t.url.includes(id ? `/${id}` : ''),\n      t => `We expected the path to contain '/42', but it is '${t?.url}' instead.`\n    )\n    .else(t => `The tester is at '${t?.url}'`);\n};\n\nexpect.extend({\n  toBeAt,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toBeAt(uc?: UseCase, id?: Id): R;\n    }\n  }\n}\n","import { Id, Tester, UseCase } from '../utils/Types';\nimport { isDefined } from '../utils/Utils';\nimport { match } from './Match';\n\nconst toUrl = (uc: UseCase, id?: Id): string => {\n  const i = isDefined(id) ? `/${id}` : '';\n  return `/${uc.app.id}/${uc.id}${i}`;\n};\n\nexport const toBeExactlyAt = (tester?: Tester, uc?: UseCase, id?: Id): jest.CustomMatcherResult => {\n  return match<Tester>(tester as Tester)\n    .undefined(t => t, 'Tester is undefined')\n    .undefined(t => t.url, 'Tester does not contain a URL')\n    .undefined(() => uc, 'Use case is undefined')\n    .not(\n      t => t.url.includes(toUrl(uc as UseCase, id)),\n      t => `We expected the tester to be at: '${toUrl(uc as UseCase, id)}', but it is at: '${t?.url}' instead.`\n    )\n    .else(t => `The tester is at '${t?.url}'`);\n};\n\nexpect.extend({\n  toBeExactlyAt,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toBeExactlyAt(uc?: UseCase, id?: Id): R;\n    }\n  }\n}\n","import { match } from './Match';\nimport { Message, toMessage } from '../utils/Types';\n\n// Handles CustomMatcherResult validations.\n\nexport const Fails = {\n  Yes: 'Match fails, instead of passes.',\n  No: (reason: string): string => `Match doesn't fail, because '${reason}'`,\n};\n\nexport const FailsWith = {\n  Yes: 'Match fails with correct message.',\n  No: (message: string, instead: string): string => `Match does fail, however not with message '${message}', but with message '${instead}' instead.`,\n};\n\nexport const toFailMatcher = (result: jest.CustomMatcherResult): jest.CustomMatcherResult =>\n  match(result)\n    .not(\n      c => !c.pass,\n      c => Fails.No(c.message())\n    )\n    .else(Fails.Yes);\n\nexport const toFailMatcherWith = (result: jest.CustomMatcherResult, message: Message<jest.CustomMatcherResult>): jest.CustomMatcherResult =>\n  match(result)\n    .not(\n      c => !c.pass,\n      c => Fails.No(c.message())\n    )\n    .not(\n      c => c.message().includes(toMessage(message)),\n      c => FailsWith.No(toMessage(message), c.message())\n    )\n    .else(FailsWith.Yes);\n\nexpect.extend({\n  toFailMatcher: toFailMatcher,\n  toFailMatcherWith: toFailMatcherWith,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toFailMatcher(): R;\n\n      toFailMatcherWith(message: string): R;\n    }\n  }\n}\n","import { Validatable } from '../utils/Types';\nimport { isA } from '../utils/Utils';\nimport { match } from './Match';\n\nexport const toBeValid = (v?: unknown): jest.CustomMatcherResult =>\n  match<Validatable>(v as Validatable)\n    .undefined(s => s, 'Subject is undefined.')\n    .not(s => isA<Validatable>(s, 'isValid'), 'Subject is not validatable.')\n    .not(s => s.isValid, `Subject is not valid.`)\n    .else(`Subject is valid`);\n\nexpect.extend({\n  toBeValid,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toBeValid(): R;\n    }\n  }\n}\n","import { checkDefined } from './Check';\n\nexport function toMatchArray(this: jest.MatcherContext, received: any[], expected: any[]) {\n  return checkDefined(this, received, expected)\n    .not(\n      ([r, e]) => r.length === e.length,\n      ([r, e]) => `Received array has length ${r.length}, while expected array has length ${e.length}.`\n    )\n    .not(([r, e]) => r.every((el, i) => this.equals(el, e[i])), 'Elements in {r} do not match elements in {e}. \\n\\n {diff}.')\n    .else();\n}\n\nexpect.extend({\n  toMatchArray,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toMatchArray(expected: any[]): R;\n    }\n  }\n}\n","import { asString } from './Utils';\nimport { equals, iterableEquality, subsetEquality } from '@jest/expect-utils';\n\nexport const eq = {\n  exact: (a?: unknown, b?: unknown): boolean => equals(a, b, []),\n  subset: (a?: unknown, b?: unknown): boolean => equals(a, b, [iterableEquality, subsetEquality]),\n  string: (a?: unknown, b?: unknown): boolean => asString(a) === asString(b),\n};\n","import { match } from './Match';\nimport { eq } from '../utils/Eq';\n\nexport const MatchesExactJson = {\n  SubjectUndefined: 'Subject is undefined.',\n  SubsetUndefined: 'Object to match with is undefined.',\n  DoesNotMatch: 'Object does not exactly match subject.',\n  Yes: 'Object matches subject exactly',\n};\n\nexport const toMatchExactJson = (value?: unknown, json?: unknown): jest.CustomMatcherResult =>\n  match<unknown>(value)\n    .undefined(v => v, MatchesExactJson.SubjectUndefined)\n    .undefined(() => json, MatchesExactJson.SubsetUndefined)\n    .not(v => eq.exact(v, json), MatchesExactJson.DoesNotMatch)\n    .else(() => MatchesExactJson.Yes);\n\nexpect.extend({\n  toMatchExactJson: toMatchExactJson,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toMatchExactJson(json?: unknown): R;\n    }\n  }\n}\n","import { Exception } from '../utils/Types';\nimport { match } from './Match';\nimport { isDefined } from '../utils/Utils';\n\nexport const toMatchException = (received: Exception, expected: unknown, reason?: string): jest.CustomMatcherResult =>\n  match<Exception>(expected as Exception)\n    .undefined(e => e.id, 'Expected value is not an exception.')\n    .not(\n      e => e.id === received.id,\n      e => `Expected exception has id '${e.id}', while the received exception has id '${received.id}'.`\n    )\n    .not(\n      () => !isDefined(reason) || (isDefined(reason) && isDefined(received.reason)),\n      () => `We expected to have reason '${reason}', but we received no reason.`\n    )\n    .not(\n      () => !isDefined(reason) || (isDefined(reason) && received.reason === reason),\n      () => `We expected to have reason '${reason}', but we received reason '${received.reason}'.`\n    )\n    .else(`Expected exception matches received exception`);\n\nexpect.extend({\n  toMatchException,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toMatchException(exception: unknown, reason?: string): R;\n    }\n  }\n}\n","import { match } from './Match';\nimport { eq } from '../utils/Eq';\nimport { asJson } from '../utils/Utils';\n\nexport const MatchesJson = {\n  SubjectUndefined: 'Subject is undefined.',\n  SubsetUndefined: 'Subset to match with is undefined.',\n  DoesNotMatch: 'Subset does not match subject.',\n  Yes: 'Subset matches subject',\n};\n\nexport const toMatchJson = (value?: unknown, subset?: unknown): jest.CustomMatcherResult =>\n  match<unknown>(value)\n    .undefined(v => v, MatchesJson.SubjectUndefined)\n    .undefined(() => subset, MatchesJson.SubsetUndefined)\n    .not(v => eq.subset(asJson(v), asJson(subset)), MatchesJson.DoesNotMatch)\n    .else(() => MatchesJson.Yes);\n\nexpect.extend({\n  toMatchJson: toMatchJson,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toMatchJson(subset?: unknown): R;\n    }\n  }\n}\n","import { Uri } from '../utils/Types';\nimport { match } from './Match';\nimport { asString } from '../utils/Utils';\n\nexport const toMatchRoute = (uri?: Uri, route?: Uri | string): jest.CustomMatcherResult =>\n  match<Uri | undefined>(uri)\n    .undefined(u => u, 'Subject is undefined.')\n    .undefined(() => route, 'Route to include is undefined.')\n    .not(\n      u => asString(u).includes(asString(route)),\n      u => `Uri '${u}' does not include '${route}'.`\n    )\n    .else(u => `Uri '${u}' includes '${route}'`);\n\nexpect.extend({\n  toMatchRoute: toMatchRoute,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toMatchRoute(route?: Uri | string): R;\n    }\n  }\n}\n","import { match } from './Match';\nimport { asString } from '../utils/Utils';\n\nexport const toMatchText = (value?: unknown, text?: unknown): jest.CustomMatcherResult =>\n  match<unknown>(value)\n    .undefined(v => v, 'Subject is undefined.')\n    .undefined(() => text, 'Text to match with is undefined.')\n    .not(\n      v => asString(v) === asString(text),\n      v => `Text '${v}' does not match with text '${text}'.`\n    )\n    .else(v => `Text '${v}' matches`);\n\nexpect.extend({\n  toMatchText: toMatchText,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toMatchText(text?: unknown): R;\n    }\n  }\n}\n","import { match } from './Match';\n\nimport { Message, toMessage } from '../utils/Types';\n\n// Handles CustomMatcherResult validations.\n\nexport const Passes = {\n  Yes: 'Match passes, instead of fails.',\n  No: (reason: string): string => `Match doesn't pass, because '${reason}'`,\n};\n\nexport const PassesWith = {\n  Yes: 'Match passes with correct message.',\n  No: (message: string, instead: string): string => `Match does pass, however not with message '${message}', but with message '${instead}' instead.`,\n};\n\nexport const toPassMatcher = (result: jest.CustomMatcherResult): jest.CustomMatcherResult =>\n  match(result)\n    .not(\n      c => c.pass,\n      c => Passes.No(c.message())\n    )\n    .else(Passes.Yes);\n\nexport const toPassMatcherWith = (result: jest.CustomMatcherResult, message: Message<jest.CustomMatcherResult>): jest.CustomMatcherResult =>\n  match(result)\n    .not(\n      c => c.pass,\n      c => Passes.No(c.message())\n    )\n    .not(\n      c => c.message().includes(toMessage(message)),\n      c => PassesWith.No(toMessage(message), c.message())\n    )\n    .else(PassesWith.Yes);\n\nexpect.extend({\n  toPassMatcher: toPassMatcher,\n  toPassMatcherWith: toPassMatcherWith,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toPassMatcher(): R;\n      toPassMatcherWith(message: string): R;\n    }\n  }\n}\n","import { match } from './Match';\nimport { Query } from '../utils/Types';\n\nexport const toBeQueriedWith = (query: jest.Mock, expected: Query): jest.CustomMatcherResult =>\n  match<any[]>(query?.mock?.calls)\n    .undefined(c => c, 'Query is unknown.')\n    .not(c => c.length === 1, 'Query did not execute.')\n    .not(\n      c => c[0][0].toString() === expected?.toString(),\n      c => `We expected query '${expected}', but we received query '${c[0][0]}' instead.`\n    )\n    .else(`Received query does match '${expected}'`);\n\nexpect.extend({\n  toBeQueriedWith: toBeQueriedWith,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toBeQueriedWith(expected: Query): R;\n    }\n  }\n}\n","import { checkDefined } from './Check';\nimport { Uri } from '../utils/Types';\nimport { asString } from '../utils/Utils';\nimport { match } from './Match';\n\nexport const weExpectedButReceivedInstead = ([r, e]: [any, any]) => `We expected ${asString(e)}, but we received '${asString(r)}' instead.`;\n\nexport function toMatchAsString(this: jest.MatcherContext, received: unknown, expected: unknown): jest.CustomMatcherResult {\n  return checkDefined(this, received, expected)\n    .not(\n      ([r, e]) => this.equals(asString(r), asString(e)),\n      ([r, e]) => weExpectedButReceivedInstead([r, e])\n    )\n    .else();\n}\n\n// export function toBeRoutedTo(this: jest.MatcherContext, query: jest.Mock, expected: Uri): jest.CustomMatcherResult {\n//   return check<any[]>(this, query?.mock?.calls)\n//     .undefined(r => r, \"Uri is unknown.\")\n//     .not(r => r.length === 1, \"Method was not called.\")\n//     .not(r => this.equals(asString(r[0][0]), asString(expected)), ([r,e]) => weExpectedButReceivedInstead([r[0][0], e]))\n//     .else();\n// }\n\nexport const toBeRoutedTo = (query: jest.Mock, expected: Uri): jest.CustomMatcherResult =>\n  match<any[]>(query?.mock?.calls)\n    .undefined(c => c, 'Uri is unknown.')\n    .not(c => c.length === 1, 'Method was not called.')\n    .not(\n      c => asString(c[0][0]) === asString(expected),\n      c => `We expected uri '${asString(expected)}', but we received uri '${asString(c[0][0])}' instead.`\n    )\n    .else(`Called uri does match '${asString(expected)}'`);\n\nexpect.extend({\n  toBeRoutedTo: toBeRoutedTo,\n});\n\ndeclare global {\n  // eslint-disable-next-line @typescript-eslint/no-namespace\n  namespace jest {\n    interface Matchers<R, T> {\n      toBeRoutedTo(uri: Uri): R;\n    }\n  }\n}\n","import { asJson, asString, toArray } from '../utils/Utils';\nimport { eq } from '../utils/Eq';\nimport { AsymmetricMatcher } from 'expect';\nimport { Uri } from '../utils/Types';\n\nexport class ObjectContainingText extends AsymmetricMatcher<string> {\n  asymmetricMatch(other: any) {\n    return asString(other).includes(asString(this.sample));\n  }\n\n  toString() {\n    return `String${this.inverse ? 'Not' : ''}Containing`;\n  }\n}\n\nexport class ObjectContainingTextExact extends AsymmetricMatcher<string> {\n  asymmetricMatch(other: any) {\n    return asString(other) === asString(this.sample);\n  }\n\n  toString() {\n    return `String${this.inverse ? 'Not' : ''}Containing`;\n  }\n}\n\nexport class ObjectContainingJson extends AsymmetricMatcher<any> {\n  asymmetricMatch(other: any) {\n    return eq.subset(asJson(other), asJson(this.sample));\n  }\n\n  toString() {\n    return `Object${this.inverse ? 'Not' : ''}Containing`;\n  }\n}\n\nexport const fits = {\n  any: (): any => expect.anything(),\n  type: (type?: unknown): any => expect.any(type),\n  with: (o: unknown): any => expect.objectContaining(o),\n  text: (s: any): any => new ObjectContainingText(s),\n  textExact: (s: any): any => new ObjectContainingTextExact(s),\n  uri: (u: Uri): any => fits.textExact(u),\n  json: (s: any): any => new ObjectContainingJson(s),\n  items: (...items: any[]): any => expect.arrayContaining(toArray(...items)),\n};\n","import { asNumber, isDefined } from './Utils';\nimport { Id, Json, JsonValue, OneOrMore, Text } from './Types';\n\nexport class Req<B = unknown> {\n  readonly skip: number | undefined;\n  readonly take: number | undefined;\n\n  constructor(readonly state: any = {}) {\n    this.skip = isDefined(this.query?.skip) ? asNumber(this.query?.skip) : undefined;\n    this.take = isDefined(this.query?.take) ? asNumber(this.query?.take) : undefined;\n  }\n\n  get id(): Id {\n    return this.state.id ?? this.path.id;\n  }\n\n  get q(): JsonValue {\n    return this.state.q ?? this.query.q;\n  }\n\n  get path(): Json {\n    return this.state?.path ?? {};\n  }\n\n  get query(): Json {\n    return this.state?.query ?? {};\n  }\n\n  get body(): B {\n    return this.state.body;\n  }\n\n  get headers(): Record<string, OneOrMore<string>> {\n    return this.state.headers;\n  }\n\n  get = (key: Text): any => this?.state[key.toString()] ?? this.path[key.toString()] ?? this.query[key.toString()];\n}\n","import { Id, Json } from '../utils/Types';\nimport { Req } from '../utils/Req';\nimport { HttpStatus, Response } from '../utils/Response';\n\nexport class Mocks {\n  req = {\n    id: (id: Id): Req => new Req({ id }),\n    q: (q: unknown): Req => new Req({ q }),\n    with: (a: Json): Req => new Req(a),\n    body: <B = unknown>(body: B): Req<B> => new Req<B>({ body }),\n    path: (path: Json): Req => new Req({ path }),\n    query: (query: Json): Req => new Req({ query }),\n  };\n  resp = {\n    items: (status: HttpStatus, items: unknown[] = []): Response => ({\n      status: status,\n      body: {\n        data: {\n          code: status.id as number,\n          itemCount: items.length,\n          items,\n        },\n      },\n    }),\n    errors: (status: HttpStatus, message: string, errors: unknown[] = []): Response => ({\n      status: status,\n      body: {\n        error: {\n          code: status.id as number,\n          message: message,\n          errorCount: errors.length,\n          errors,\n        },\n      },\n    }),\n  };\n  provider = {\n    data: (...items: any[]): { execute: jest.Mock } => ({\n      execute: jest.fn().mockResolvedValue({\n        body: {\n          data: {\n            itemCount: items.length,\n            items,\n          },\n        },\n      }),\n    }),\n  };\n\n  static readonly getArg = <T>(mock: unknown, call = 0, arg = 0): T | undefined => {\n    if (!isJestMock(mock)) throw new Error('Function provided is not a Jest mock');\n    return mock.mock.calls[call]?.[arg] as T;\n  };\n\n  clear = (): typeof jest => jest.clearAllMocks();\n\n  impl = (f?: (...args: any[]) => any): jest.Mock => jest.fn().mockImplementation(f);\n\n  property = <T extends object, P extends jest.NonFunctionPropertyNames<Required<T>>>(object: T, getter: P, value: T[P]): jest.SpyInstance =>\n    jest.spyOn(object, getter, 'get' as jest.PropertyAccessors<P, T>).mockReturnValue(value as any);\n\n  reject = (value?: unknown): jest.Mock => jest.fn().mockRejectedValue(value);\n\n  rejectWith = <T = any>(props: Partial<T> = {}): jest.Mock => jest.fn().mockRejectedValue(mock.a(props));\n\n  resolve = (value?: unknown): jest.Mock => jest.fn().mockResolvedValue(value);\n\n  resolveWith = <T = any>(props: Partial<T> = {}): jest.Mock => jest.fn().mockResolvedValue(mock.a(props));\n\n  return = (value?: unknown): jest.Mock => jest.fn().mockReturnValue(value);\n\n  returnWith = <T = any>(props: Partial<T> = {}): jest.Mock => jest.fn().mockReturnValue(mock.a(props));\n\n  this = (): jest.Mock => jest.fn().mockReturnThis();\n\n  empty = <T = any>(props: Partial<T> = {}): T => props as T;\n  a = this.empty;\n  an = this.empty;\n  date = (epoch = 1621347575): Date => {\n    const date = new Date(epoch);\n    date.toString = mock.return('Mon Jan 19 1970 19:22:27 GMT+0100 (Central European Standard Time)');\n    date.toLocaleDateString = mock.return('19/01/1970');\n    date.toDateString = mock.return('19/01/1970');\n    return date;\n  };\n  once = (...values: unknown[]): jest.Mock => values.reduce((m: jest.Mock, v: unknown) => m.mockImplementationOnce(() => v), jest.fn());\n}\n\nfunction isJestMock(fn: any): fn is jest.Mock {\n  return typeof fn === 'function' && 'mock' in fn && Array.isArray(fn.mock?.calls);\n}\n\nexport const mock = new Mocks();\n"]}