{"version":3,"file":"index.mjs","names":["arrayEquals","a","b","Array","isArray","length","every","val","index","getIndexLetter","String","fromCharCode","isArrayOfString","value","v","MessageOptions","isErrorLike","err","Error","name","undefined","message","parseError","color","CustomFetchOptions","Omit","RequestInit","body","BodyInit","key","urlParams","query","fetchAPI","urlObjOrString","URL","enhancedOptions","baseUrl","baseOptions","rest","options","url","origin","window","location","prefix","pathname","name","value","Object","entries","replace","toString","searchParams","set","JSON","stringify","FormData","headers","baseHeaders","baseRest","response","fetch","status","contentType","get","includes","dataJson","json","ok","errorMessage","message","error","FetchError","dataText","text","statusText","Error","constructor","data","React","PossibleRef","Ref","T","setRef","ref","value","undefined","current","composeRefs","refs","RefCallback","node","hasCleanup","cleanups","map","cleanup","i","length","useComposedRefs","useCallback","prefix","invariant","condition","message","value","Error","slugify","str","allowSlash","trimTrailing","normalized","normalize","replace","toLowerCase","allowedChars","collapsed"],"sources":["../../src/lib/arrUtil.ts","../../src/lib/error.ts","../../src/lib/fetch.ts","../../src/lib/compose-refs.ts","../../src/lib/invariant.ts","../../src/lib/strUtil.ts"],"sourcesContent":["export function arrayEquals(a: any, b: any) {\n  return (\n    Array.isArray(a) &&\n    Array.isArray(b) &&\n    a.length === b.length &&\n    a.every((val, index) => val === b[index])\n  );\n}\n\nexport function getIndexLetter(index: number) {\n  return String.fromCharCode(65 + (index % 26));\n}\n\nexport function isArrayOfString(value: unknown): value is string[] {\n  return Array.isArray(value) && value.every((v) => typeof v === \"string\");\n}\n","import { MessageOptions } from \"../types\";\n\nexport function isErrorLike(err: any): err is Error {\n  if (err instanceof Error) {\n    return true;\n  } else if (err.name !== undefined && err.message !== undefined) {\n    return true;\n  }\n\n  return false;\n}\n\nexport function parseError(err: any): [string, MessageOptions] | null {\n  if (isErrorLike(err)) {\n    return [err.message || \"An error occured\", { color: \"red\" }];\n  }\n  return null;\n}\n","export type CustomFetchOptions = Omit<RequestInit, \"body\"> & {\n  body?: BodyInit | { [key: string]: unknown };\n  urlParams?: {\n    [key: string]: string | number;\n  };\n  query?: {\n    [key: string]: unknown;\n  };\n};\n\nexport async function fetchAPI(\n  urlObjOrString: string | URL,\n  enhancedOptions: CustomFetchOptions = {},\n  baseUrl?: string,\n  baseOptions?: RequestInit,\n) {\n  const { urlParams, query, body, ...rest } = enhancedOptions;\n\n  let options: RequestInit = rest;\n\n  let url: URL;\n\n  if (urlObjOrString instanceof URL) {\n    url = urlObjOrString;\n  } else {\n    const origin = baseUrl ? new URL(baseUrl).origin : window.location.origin;\n    let prefix = baseUrl ? new URL(baseUrl).pathname : \"\";\n    if (prefix === \"/\") {\n      prefix = \"\";\n    }\n    url = new URL(`${prefix}${urlObjOrString}`, origin);\n  }\n\n  if (urlParams) {\n    for (const [name, value] of Object.entries(urlParams)) {\n      // %7B -> `{`\n      // %7D -> `}`\n      url.pathname = url.pathname.replace(`%7B${name}%7D`, value.toString());\n    }\n  }\n\n  if (query) {\n    for (const [name, value] of Object.entries(query)) {\n      url.searchParams.set(\n        name,\n        typeof value === \"object\" ? JSON.stringify(value) : (value as any).toString(),\n      );\n    }\n  }\n\n  if (body) {\n    if (typeof body !== \"string\" && !(body instanceof FormData)) {\n      options.headers = {\n        ...(options.headers = {}),\n        \"Content-Type\": \"application/json\",\n      };\n      options.body = JSON.stringify(body);\n    } else {\n      options.body = body;\n    }\n  }\n\n  if (baseOptions) {\n    const { headers: baseHeaders = {}, ...baseRest } = baseOptions;\n    options = {\n      ...baseRest,\n      ...options,\n      headers: {\n        ...baseHeaders,\n        ...options.headers,\n      },\n    };\n  }\n\n  const response = await fetch(url.toString(), options);\n\n  if (response.status === 204) {\n    return null;\n  }\n\n  const contentType = response.headers.get(\"content-type\");\n\n  if (contentType?.includes(\"application/json\") || contentType?.includes(\"application/geo+json\")) {\n    const dataJson = await response.json();\n\n    if (response.ok) {\n      return dataJson;\n    }\n\n    let errorMessage = \"request Error\";\n\n    if (dataJson.message) {\n      errorMessage = dataJson.message;\n    }\n    if (dataJson.error?.message) {\n      errorMessage = dataJson.error?.message;\n    }\n    throw new FetchError(errorMessage, response.status, dataJson);\n  }\n\n  const dataText = await response.text();\n\n  if (response.ok) {\n    return dataText;\n  }\n\n  throw new FetchError(`${response.status} ${response.statusText}`, response.status, dataText);\n}\n\nexport class FetchError extends Error {\n  constructor(\n    message: string,\n    public status: number,\n    public data?: unknown,\n  ) {\n    super(message);\n    this.name = \"FetchError\";\n  }\n}\n","/**\n * https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/compose-refs.tsx\n */\n\nimport * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n  if (typeof ref === \"function\") {\n    return ref(value);\n  } else if (ref !== null && ref !== undefined) {\n    ref.current = value;\n  }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n  return (node) => {\n    let hasCleanup = false;\n    const cleanups = refs.map((ref) => {\n      const cleanup = setRef(ref, node);\n      if (!hasCleanup && typeof cleanup == \"function\") {\n        hasCleanup = true;\n      }\n      return cleanup;\n    });\n\n    // React <19 will log an error to the console if a callback ref returns a\n    // value. We don't use ref cleanups internally so this will only happen if a\n    // user's ref callback returns a value, which we only expect if they are\n    // using the cleanup functionality added in React 19.\n    if (hasCleanup) {\n      return () => {\n        for (let i = 0; i < cleanups.length; i++) {\n          const cleanup = cleanups[i];\n          if (typeof cleanup == \"function\") {\n            cleanup();\n          } else {\n            setRef(refs[i], null);\n          }\n        }\n      };\n    }\n  };\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n","const prefix: string = \"Invariant failed\";\n\nexport function invariant(condition: any, message?: string): asserts condition {\n  if (condition) {\n    return;\n  }\n\n  const value: string = message ? `${prefix}: ${message}` : prefix;\n  throw new Error(value);\n}\n","export function slugify(str: string, allowSlash: boolean = true, trimTrailing: boolean = true) {\n  const normalized = str\n    .normalize(\"NFD\")\n    .replace(/[̀-ͯ]/g, \"\")\n    .toLowerCase();\n\n  const allowedChars = allowSlash ? /[^a-z0-9/]+/g : /[^a-z0-9]+/g;\n\n  const collapsed = normalized.replace(allowedChars, \"-\").replace(/-{2,}/g, \"-\").replace(/^-+/, \"\");\n\n  return trimTrailing ? collapsed.replace(/-+$/, \"\") : collapsed;\n}\n"],"mappings":"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"}