{"version":3,"sources":["../../src/lib/schedulingClient.ts"],"names":[],"mappings":"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","file":"schedulingClient.mjs","sourcesContent":["// Same hostname rules as resolveAuthBasePath (per\n// feedback_authdialog_basepath.md): bffless.app subdomains use the workspace\n// /api/* namespace, custom domains use the /_bffless/* relay namespace.\nexport function resolveSchedulingBasePath(hostnameOverride?: string): string {\n  let hostname = hostnameOverride;\n  if (hostname == null) {\n    if (typeof window === 'undefined' || !window.location) {\n      return '/api/scheduling';\n    }\n    hostname = window.location.hostname;\n  }\n  const lower = hostname.toLowerCase();\n  if (lower === 'bffless.app' || lower.endsWith('.bffless.app')) {\n    return '/api/scheduling';\n  }\n  return '/_bffless/scheduling';\n}\n\nexport class SchedulingClientError extends Error {\n  readonly code: string;\n  readonly status: number | undefined;\n  readonly body: unknown;\n\n  constructor(code: string, message: string, status?: number, body?: unknown) {\n    super(message);\n    this.code = code;\n    this.status = status;\n    this.body = body;\n    this.name = 'SchedulingClientError';\n  }\n}\n\nconst HEADERS_JSON = { 'Content-Type': 'application/json' } as const;\n\nasync function readJson(res: Response): Promise<any> {\n  try {\n    return await res.json();\n  } catch {\n    return null;\n  }\n}\n\ninterface RequestOptions {\n  signal?: AbortSignal;\n  // Some admin reads (notably GET /admin/google/calendars) treat a 401 as\n  // \"not connected\" and the caller wants a structured outcome rather than\n  // an error. The default throws on any non-2xx.\n  treat401AsEmpty?: boolean;\n  // Same idea, but for endpoints that may not exist as per-site pipelines\n  // (e.g. when Google Calendar is managed in CE Settings only). 404 then\n  // means \"not configured here,\" not an error.\n  treat404AsEmpty?: boolean;\n}\n\nasync function request<T>(\n  method: string,\n  url: string,\n  body?: unknown,\n  opts: RequestOptions = {},\n): Promise<T> {\n  let res: Response;\n  try {\n    res = await fetch(url, {\n      method,\n      credentials: 'include',\n      headers: body ? HEADERS_JSON : undefined,\n      body: body ? JSON.stringify(body) : undefined,\n      signal: opts.signal,\n    });\n  } catch (err) {\n    throw new SchedulingClientError('network', 'Network error. Please try again.');\n  }\n\n  if (res.status === 401 && opts.treat401AsEmpty) {\n    return null as T;\n  }\n  if (res.status === 404 && opts.treat404AsEmpty) {\n    return null as T;\n  }\n\n  const data = await readJson(res);\n  if (!res.ok) {\n    const code =\n      (data && typeof data.code === 'string' && data.code) ||\n      (res.status === 401 ? 'unauthorized' : res.status === 403 ? 'forbidden' : 'http_error');\n    const message =\n      (data && typeof data.message === 'string' && data.message) ||\n      `Request failed (${res.status})`;\n    throw new SchedulingClientError(code, message, res.status, data);\n  }\n\n  // 204 / empty body → null. Callers that expect a value type should pick\n  // endpoints that return one.\n  return (data ?? null) as T;\n}\n\nexport function schedulingGet<T>(\n  basePath: string,\n  path: string,\n  query?: Record<string, string | number | undefined | null>,\n  opts: RequestOptions = {},\n): Promise<T> {\n  const url = buildUrl(basePath, path, query);\n  return request<T>('GET', url, undefined, opts);\n}\n\nexport function schedulingPost<T>(\n  basePath: string,\n  path: string,\n  body?: unknown,\n  opts: RequestOptions = {},\n): Promise<T> {\n  return request<T>('POST', basePath + path, body, opts);\n}\n\nexport function schedulingPatch<T>(\n  basePath: string,\n  path: string,\n  body?: unknown,\n  opts: RequestOptions = {},\n): Promise<T> {\n  return request<T>('PATCH', basePath + path, body, opts);\n}\n\nexport function schedulingDelete<T>(\n  basePath: string,\n  path: string,\n  body?: unknown,\n  opts: RequestOptions = {},\n): Promise<T> {\n  return request<T>('DELETE', basePath + path, body, opts);\n}\n\nfunction buildUrl(\n  basePath: string,\n  path: string,\n  query?: Record<string, string | number | undefined | null>,\n): string {\n  if (!query) return basePath + path;\n  const params = new URLSearchParams();\n  for (const [k, v] of Object.entries(query)) {\n    if (v === undefined || v === null) continue;\n    params.set(k, String(v));\n  }\n  const qs = params.toString();\n  return basePath + path + (qs ? `?${qs}` : '');\n}\n"]}