{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import type { URLPattern, URLPatternResult } from './types/url-pattern'\n\nconst originalFetch = globalThis.fetch\n\n/**\n * `fetch` configuration\n */\nexport interface FetchConfiguration {\n  /**\n   * change to `'pass-through'` to call the original `fetch` function, or to `'return-404'` to respond with the status 404, instead of throwing an error, if there's no matching `fetch` handler registered\n   * @default 'throw-error'\n   */\n  handleUnmockedRequests: 'pass-through' | 'return-404' | 'throw-error'\n\n  /**\n   * a time duration to delay the mocked requests by default (in milliseconds)\n   * @default 0\n   */\n  responseDelay: number\n\n  /**\n   * set to `false` to disable logging of succeeded and failed requests on the console\n   * @default true\n   */\n  logging: boolean\n}\n\nconst configuration: FetchConfiguration = {\n  handleUnmockedRequests: 'throw-error',\n  responseDelay: 0,\n  logging: true\n}\n\n/**\n * get a copy of the current `fetch` configuration\n */\nexport function getFetchConfiguration(): FetchConfiguration {\n  return { ...configuration }\n}\n\n/**\n * set one or more `fetch` configuration parameters\n */\nexport function setFetchConfiguration(options: FetchConfiguration) {\n  const { handleUnmockedRequests, responseDelay, logging } = options\n  if (handleUnmockedRequests) {\n    const unmockedRequestHandling = ['pass-through', 'return-404', 'throw-error']\n    if (!unmockedRequestHandling.includes(handleUnmockedRequests)) {\n      throw Error(`Invalid handleUnmockedRequests: ${handleUnmockedRequests}`)\n    }\n    configuration.handleUnmockedRequests = handleUnmockedRequests\n  }\n  if (responseDelay >= 0) {\n    configuration.responseDelay = responseDelay\n  }\n  if (typeof logging === 'boolean') {\n    configuration.logging = logging\n  }\n}\n\n/**\n * object literal to specify the response content in a simplified way\n */\nexport interface SimpleResponse {\n  /**\n   * a HTTP status code for the response\n   * @default 200\n   */\n  status?: number\n\n  /**\n   * a Headers object, an object literal, or an array of two-item arrays to set request headers\n   */\n  headers?: Headers | Record<string, string> | [string, string][]\n\n  /**\n   * a response body, either an object or a value accepted hy the [`Response`] constructor\n   */\n  body?: BodyInit | object\n}\n\n/**\n * specifies how to match a mocked `fetch` call\n */\nexport interface FetchSpecification {\n  /**\n   * a string convertible to `URLPattern` or a `URL` or `URLPattern` instance to match the input URL\n   */\n  url: string | URL | URLPattern\n\n  /**\n   * a HTTP method to match the input method (case-insensitively)\n   * @default 'GET'\n   */\n  method?: string\n}\n\nconst patternSymbol = Symbol('pattern')\n\n/**\n * additional parameters for the response callback of a mocked `fetch` handler\n */\nexport interface ResponseCallbackOptions {\n  /**\n   * a result of the `URLPattern` execution on the input URL\n   */\n  match: URLPatternResult\n\n  /**\n   * a `URL` instance created from the input URL\n   */\n  url: URL\n\n  /**\n   * an object describing the response, or an instance of `Response`\n   */\n  query: URLSearchParams\n}\n\nexport type ResponseCallback = (request: Request, options: ResponseCallbackOptions) => Promise<SimpleResponse | Response>\n\n/**\n * provides specification for matching a mocked `fetch` call and the way how to handle its response\n */\nexport interface FetchHandler extends FetchSpecification {\n  /**\n   * override the default time duration to delay the mocked request (in milliseconds)\n   */\n  responseDelay?: number\n\n  /**\n   * an object describing the response, or an instance of [`Response`], or a method (synchronous or asynchronous) returning a [`Response`]\n   */\n  response: SimpleResponse | Response | ResponseCallback\n\n  /**\n   * @private\n   */\n  [patternSymbol]?: URLPattern\n}\n\nconst fetchHandlers: FetchHandler[] = []\n\nfunction normalizeMethod(method?: string): string {\n  return method ? method.toUpperCase() : 'GET'\n}\n\nfunction normalizeSpecification(specification: FetchSpecification): FetchSpecification {\n  const { url, method } = specification\n  if (!url) throw Error('Mocked fetch is missing \"url\"')\n  if (url instanceof URL) {\n    specification.url = url.href\n  }\n  specification.method = normalizeMethod(method)\n  return specification\n}\n\nfunction normalizeHandler(handler: FetchHandler): void {\n  const { url, response } = normalizeSpecification(handler) as FetchHandler\n  if (!response) throw Error('Mocked fetch is missing \"response\"')\n  // @ts-expect-error\n  handler[patternSymbol] = url instanceof URLPattern\n    ? url\n    // @ts-expect-error\n    : new URLPattern(url)\n}\n\nfunction findFetchHandler(url: string | URLPattern, method: string): number {\n  for (let i = 0, l = fetchHandlers.length; i < l; ++i) {\n    const handler = fetchHandlers[i]\n    if (handler.url === url && handler.method === method) return i\n  }\n  return -1\n}\n\n/**\n * checks if a mocked `fetch` call matching the given specification has been already registered\n */\nexport function includesMockedFetch(specification: FetchSpecification): boolean {\n  const { url, method } = normalizeSpecification(specification)\n  const index = findFetchHandler(url as string | URLPattern, method as string)\n  return index >= 0\n}\n\n/**\n * registers a mock for a `fetch` call\n */\nexport function mockFetch(handler: FetchHandler): FetchHandler {\n  normalizeHandler(handler)\n  fetchHandlers.push(handler)\n  replaceFetch()\n  return handler\n}\n\n/**\n * unregisters a mock for a `fetch` call\n */\nexport function unmockFetch(specification: FetchSpecification): void {\n  const { url, method } = normalizeSpecification(specification)\n  const index = findFetchHandler(url as string | URLPattern, method as string)\n  if (index >= 0) {\n    fetchHandlers.splice(index, 1)\n    if (fetchHandlers.length === 0) {\n      restoreFetch()\n    }\n  }\n}\n\n/**\n * unregisters all `fetch` call mocks\n */\nexport function unmockAllFetches(): void {\n  const { length } = fetchHandlers\n  fetchHandlers.splice(0, length)\n  restoreFetch()\n}\n\nfunction matchFetchHandler(url: string, method: string): { handler?: FetchHandler, match?: URLPatternResult } {\n  for (const handler of fetchHandlers) {\n    if (handler.method !== method) continue\n    const match = (handler[patternSymbol] as URLPattern).exec(url)\n    if (match) {\n      return { handler, match }\n    }\n  }\n  return {}\n}\n\nfunction normalizeRequestURL(url: RequestInfo | URL): { request: Request | undefined, url: string } {\n  let request: Request | undefined\n  if (url instanceof Request) {\n    request = url\n    url = request.url\n  } else if (url instanceof URL) {\n    url = url.href\n  }\n  return { request, url }\n}\n\nfunction normalizeRequestOptions(requestOptions?: RequestInit): RequestInit {\n  let method = requestOptions?.method\n  method = normalizeMethod(method)\n  return { ...requestOptions, method }\n}\n\n/**\n * checks if a `fetch` call with the provided parameters will be mocked\n */\nexport function willMockFetch(urlOrRequest: RequestInfo | URL, requestOptions?: RequestInit): boolean {\n  const { url } = normalizeRequestURL(urlOrRequest)\n  requestOptions = normalizeRequestOptions(requestOptions)\n  const { method } = requestOptions\n\n  const { handler } = matchFetchHandler(url, method as string)\n  return !!handler\n}\n\nfunction canConstructResponseWith(body?: BodyInit | object): boolean {\n  if (body == null || typeof body === 'string') return true\n  const supportedBodyTypes = [\n    ArrayBuffer, Blob, DataView, File, FormData, URLSearchParams,\n    Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n    Int32Array, Uint32Array, /* Float16Array, */ Float32Array, Float64Array,\n    BigInt64Array, BigUint64Array, ReadableStream\n  ]\n  for (const type of supportedBodyTypes) {\n    if (body instanceof type) return true\n  }\n  return false\n}\n\nfunction waitForDelay(timeDuration: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, timeDuration))\n}\n\nfunction optionallyAddJSONContentType(responseOptions: ResponseInit) {\n  const { headers } = responseOptions\n  if (!headers) {\n    responseOptions.headers = { 'Content-Type': 'application/json' }\n  } else if (headers instanceof Headers) {\n    if (headers.get('Content-Type') == null) {\n      headers.set('Content-Type', 'application/json')\n    }\n  } else if (Array.isArray(headers)) {\n    let hasContentType = false\n    for (const [name] of headers) {\n      if (name.toLowerCase() === 'content-type') {\n        hasContentType = true\n        break\n      }\n    }\n    if (!hasContentType) {\n      headers.push(['Content-Type', 'application/json'])\n    }\n  } else {\n    let hasContentType = false\n    for (const name in headers) {\n      if (name.toLowerCase() === 'content-type') {\n        hasContentType = true\n        break\n      }\n    }\n    if (!hasContentType) {\n      headers['Content-Type'] = 'application/json'\n    }\n  }\n}\n\nasync function mockedFetch(urlOrRequest: RequestInfo | URL, requestOptions?: RequestInit): Promise<Response> {\n  let response: Response | SimpleResponse | ResponseCallback\n  let logInput: string | object | undefined\n  let logOutput: string | object | undefined\n\n  const start = performance.now()\n  let { request, url } = normalizeRequestURL(urlOrRequest)\n  requestOptions = normalizeRequestOptions(requestOptions)\n  const { method } = requestOptions\n\n  const { handler, match } = matchFetchHandler(url, method as string)\n  if (!handler) {\n    switch (configuration.handleUnmockedRequests) {\n      case 'pass-through':\n        return originalFetch(urlOrRequest, requestOptions)\n      case 'throw-error':\n        ensureRequest()\n        logError(new Error('Fetch not mocked'))\n        throw new Error(`Fetch not mocked: ${method} ${url}`)\n      case 'return-404':\n        response = new Response(null, { status: 404 })\n        ensureRequest()\n        logResponse()\n        return response\n    }\n  }\n\n  await waitForDelay(handler.responseDelay ?? configuration.responseDelay)\n\n  ensureRequest()\n  if (configuration.logging) {\n    const contentType = (request as Request).headers.get('Content-Type')\n    if (contentType) {\n      if (contentType.startsWith('text/')) {\n        logInput = await (request as Request).text()\n        request = new Request(request as Request, { body: logInput })\n      } else if (contentType.startsWith('application/json')) {\n        const text = await (request as Request).text()\n        logInput = JSON.parse(text)\n        request = new Request(request as Request, { body: text })\n      }\n    }\n  }\n\n  ({ response } = handler)\n  try {\n    if (typeof response === 'function') {\n      const urlObject = urlOrRequest instanceof URL\n        ? urlOrRequest\n        : new URL(url)\n      const matchOptions = {\n        match: match as URLPatternResult,\n        url: urlObject,\n        query: new URLSearchParams(urlObject.search)\n      }\n      response = await response(request as Request, matchOptions)\n    }\n    if (response instanceof Response) {\n      logResponse()\n      return response\n    }\n    let { body, ...responseOptions } = response\n    if (!canConstructResponseWith(body)) {\n      logOutput = body\n      body = JSON.stringify(body)\n      optionallyAddJSONContentType(responseOptions)\n    } else if (typeof body === 'string') {\n      logOutput = body\n    }\n    response = new Response(body as BodyInit, responseOptions)\n    logResponse()\n    return response\n  } catch (error: unknown) {\n    logError(error as Error)\n    throw error\n  }\n\n  function ensureRequest(): void {\n    if (!request) {\n      request = new Request(url, requestOptions)\n    }\n  }\n\n  function getDuration(): string {\n    const duration = performance.now() - start\n    return roundDuration(duration / 1000, '') ??\n      roundDuration(duration, 'm') ??\n      roundDuration(duration * 1000, 'µ') as string\n\n    function roundDuration(value: number, prefix: string): string | undefined {\n      value = Math.round(value)\n      if (value >= 1) {\n        return `${value}${prefix}s`\n      }\n    }\n  }\n\n  function objectifyHeaders(source: { headers: Headers }): Record<string, string> {\n    // @ts-expect-error\n    return Object.fromEntries(source.headers.entries())\n  }\n\n  function startRequestLog(): { logFormat: string, logArgs: any[] } {\n    let logFormat = 'MOCK %s %s\\n  Request: %o'\n    const logArgs: any[] = [method, url, objectifyHeaders(request as Request)]\n    if (logInput !== undefined) {\n      logFormat += '\\n  %o'\n      logArgs.push(logInput)\n    }\n    return { logFormat, logArgs }\n  }\n\n  function finishLog(level: 'info' | 'error', logFormat: string, ...logArgs: any[]): void {\n    console[level](`${logFormat}\\n  Duration: %s`, ...logArgs, getDuration())\n  }\n\n  function logError(error: Error): void {\n    if (configuration.logging) {\n      const { logFormat, logArgs } = startRequestLog()\n      finishLog('error', `${logFormat}\\n  %o`, logArgs, error)\n    }\n  }\n\n  function logResponse(): void {\n    if (configuration.logging) {\n      let { logFormat, logArgs } = startRequestLog()\n      logFormat += '\\n  Response: %d %o'\n      logArgs.push((response as Response).status, objectifyHeaders(response as Response))\n      if (logOutput !== undefined) {\n        logFormat += '\\n  %o'\n        logArgs.push(logOutput)\n      }\n      finishLog('info', logFormat, ...logArgs)\n    }\n  }\n}\n\n/**\n * checks if the global `fetch` function was replaced by the mock-able one\n */\nexport function isFetchReplaced(): boolean {\n  return globalThis.fetch === mockedFetch\n}\n\n/**\n * replaces the global `fetch` function by the mock-able one\n */\nexport function replaceFetch(): void {\n  globalThis.fetch = mockedFetch\n}\n\n/**\n * restores the original global `fetch` function\n */\nexport function restoreFetch(): void {\n  globalThis.fetch = originalFetch\n}\n"],"names":[],"mappings":"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"}