{"version":3,"sources":["../../src/developer-hub/index.ts","../../src/http/errors.ts","../../src/http/client.ts","../../src/regions/endpoints.ts","../../src/regions/resolver.ts","../../src/auth/oauth-client.ts","../../src/cma/pagination.ts","../../src/developer-hub/response.ts","../../src/developer-hub/apps.ts","../../src/developer-hub/authorizations.ts","../../src/developer-hub/hosting.ts","../../src/developer-hub/installations.ts","../../src/developer-hub/oauth.ts","../../src/developer-hub/requests.ts","../../src/developer-hub/client.ts"],"sourcesContent":["export { createDeveloperHubClient } from \"./client.js\"\nexport type {\n  DeveloperHubClient,\n  DeveloperHubClientAuth,\n  DeveloperHubClientConfig,\n} from \"./client.js\"\nexport type {\n  AppAuthorization,\n  AppHostingConfig,\n  AppInstallation,\n  AppOAuthConfig,\n  AppRequest,\n  AppUILocation,\n  AppWebhookConfig,\n  AuthorizeAppData,\n  CreateAppData,\n  CreateAppRequestData,\n  DeveloperHubCreateDeploymentData,\n  DeveloperHubApp,\n  DisconnectHostingData,\n  HostingDeployment,\n  HostingDeploymentLog,\n  HostingStatus,\n  InstallAppData,\n  ListAppInstallationsOptions,\n  ListAppsOptions,\n  ListAuthorizationsOptions,\n  DeveloperHubListDeploymentsOptions,\n  ListInstallationsOptions,\n  ListRequestsOptions,\n  OAuthScope,\n  ReinstallAppData,\n  SetExternalHostingData,\n  UpdateAppData,\n  UpdateOAuthConfigData,\n  WebhookExecution,\n} from \"./types.js\"\n","/**\n * Base error class for all Contentstack SDK errors.\n * Every error includes an actionable message and relevant context.\n */\nexport class ContentstackError extends Error {\n  override readonly name: string = \"ContentstackError\"\n  readonly status?: number\n  readonly errorCode?: number\n  readonly errors?: Record<string, string[]>\n  readonly requestPath?: string\n\n  constructor(\n    message: string,\n    options?: {\n      status?: number\n      errorCode?: number\n      errors?: Record<string, string[]>\n      requestPath?: string\n      cause?: Error\n    },\n  ) {\n    super(message, options?.cause ? { cause: options.cause } : undefined)\n    this.status = options?.status\n    this.errorCode = options?.errorCode\n    this.errors = options?.errors\n    this.requestPath = options?.requestPath\n  }\n}\n\nexport class ContentstackAuthError extends ContentstackError {\n  override readonly name = \"ContentstackAuthError\"\n  override readonly status = 401\n}\n\nexport class ContentstackForbiddenError extends ContentstackError {\n  override readonly name = \"ContentstackForbiddenError\"\n  override readonly status = 403\n}\n\nexport class ContentstackNotFoundError extends ContentstackError {\n  override readonly name = \"ContentstackNotFoundError\"\n  override readonly status = 404\n}\n\nexport class ContentstackValidationError extends ContentstackError {\n  override readonly name = \"ContentstackValidationError\"\n  override readonly status: number\n\n  constructor(\n    message: string,\n    options?: {\n      status?: number\n      errorCode?: number\n      errors?: Record<string, string[]>\n      requestPath?: string\n      cause?: Error\n    },\n  ) {\n    super(message, options)\n    this.status = options?.status ?? 400\n  }\n}\n\nexport class ContentstackInvalidApiKeyError extends ContentstackError {\n  override readonly name = \"ContentstackInvalidApiKeyError\"\n  override readonly status = 412\n}\n\nexport class ContentstackRateLimitError extends ContentstackError {\n  override readonly name = \"ContentstackRateLimitError\"\n  override readonly status = 429\n  readonly retryAfter?: number\n\n  constructor(\n    message: string,\n    options?: {\n      errorCode?: number\n      errors?: Record<string, string[]>\n      requestPath?: string\n      cause?: Error\n      retryAfter?: number\n    },\n  ) {\n    super(message, { ...options, status: 429 })\n    this.retryAfter = options?.retryAfter\n  }\n}\n\nexport class ContentstackServerError extends ContentstackError {\n  override readonly name = \"ContentstackServerError\"\n}\n\nexport class ContentstackConfigError extends ContentstackError {\n  override readonly name = \"ContentstackConfigError\"\n}\n","import {\n  ContentstackAuthError,\n  ContentstackConfigError,\n  ContentstackError,\n  ContentstackForbiddenError,\n  ContentstackInvalidApiKeyError,\n  ContentstackNotFoundError,\n  ContentstackRateLimitError,\n  ContentstackServerError,\n  ContentstackValidationError,\n} from \"./errors.js\"\nimport type { HttpClientConfig, HttpResponse } from \"./types.js\"\n\nconst DEFAULT_TIMEOUT = 30_000\nconst DEFAULT_RETRY_LIMIT = 5\nconst DEFAULT_RETRY_DELAY = 300\nconst MAX_JITTER = 100\n\nexport class ContentstackHttpClient {\n  private readonly config: Required<\n    Pick<HttpClientConfig, \"baseUrl\" | \"timeout\" | \"retryOnError\" | \"retryLimit\" | \"retryDelay\">\n  > & {\n    headers: Record<string, string>\n    fetch: typeof globalThis.fetch\n    resolveHeaders?: HttpClientConfig[\"resolveHeaders\"]\n  }\n\n  constructor(config: HttpClientConfig) {\n    this.config = {\n      baseUrl: config.baseUrl,\n      headers: config.headers ?? {},\n      timeout: config.timeout ?? DEFAULT_TIMEOUT,\n      retryOnError: config.retryOnError ?? true,\n      retryLimit: config.retryLimit ?? DEFAULT_RETRY_LIMIT,\n      retryDelay: config.retryDelay ?? DEFAULT_RETRY_DELAY,\n      fetch: config.fetch ?? globalThis.fetch.bind(globalThis),\n      resolveHeaders: config.resolveHeaders,\n    }\n  }\n\n  async get<T>(path: string, params?: Record<string, string>): Promise<HttpResponse<T>> {\n    let url = `${this.config.baseUrl}${path}`\n    if (params) {\n      const searchParams = new URLSearchParams(params)\n      url += `?${searchParams.toString()}`\n    }\n    return this.request<T>(url, { method: \"GET\" }, path)\n  }\n\n  async post<T>(path: string, body?: unknown): Promise<HttpResponse<T>> {\n    const url = `${this.config.baseUrl}${path}`\n    return this.request<T>(\n      url,\n      {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: body !== undefined ? JSON.stringify(body) : undefined,\n      },\n      path,\n    )\n  }\n\n  async put<T>(path: string, body?: unknown): Promise<HttpResponse<T>> {\n    const url = `${this.config.baseUrl}${path}`\n    return this.request<T>(\n      url,\n      {\n        method: \"PUT\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: body !== undefined ? JSON.stringify(body) : undefined,\n      },\n      path,\n    )\n  }\n\n  async patch<T>(path: string, body?: unknown): Promise<HttpResponse<T>> {\n    const url = `${this.config.baseUrl}${path}`\n    return this.request<T>(\n      url,\n      {\n        method: \"PATCH\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: body !== undefined ? JSON.stringify(body) : undefined,\n      },\n      path,\n    )\n  }\n\n  async delete<T>(path: string): Promise<HttpResponse<T>> {\n    const url = `${this.config.baseUrl}${path}`\n    return this.request<T>(url, { method: \"DELETE\" }, path)\n  }\n\n  async postForm<T>(path: string, params: URLSearchParams): Promise<HttpResponse<T>> {\n    const url = `${this.config.baseUrl}${path}`\n    return this.request<T>(\n      url,\n      {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n        body: params.toString(),\n      },\n      path,\n    )\n  }\n\n  async upload<T>(path: string, form: FormData): Promise<HttpResponse<T>> {\n    const url = `${this.config.baseUrl}${path}`\n    return this.request<T>(url, { method: \"POST\", body: form }, path)\n  }\n\n  /** Return a new client with additional headers merged */\n  withHeaders(headers: Record<string, string>): ContentstackHttpClient {\n    return new ContentstackHttpClient({\n      ...this.config,\n      headers: { ...this.config.headers, ...headers },\n    })\n  }\n\n  /** Return a new client with a different base URL */\n  withBaseUrl(baseUrl: string): ContentstackHttpClient {\n    return new ContentstackHttpClient({\n      ...this.config,\n      baseUrl,\n    })\n  }\n\n  private async request<T>(url: string, init: RequestInit, path: string): Promise<HttpResponse<T>> {\n    const headers = new Headers(this.config.headers)\n    const resolvedHeaders = await this.config.resolveHeaders?.()\n\n    if (resolvedHeaders) {\n      for (const [key, value] of Object.entries(resolvedHeaders)) {\n        headers.set(key, value)\n      }\n    }\n\n    if (init.headers) {\n      const initHeaders =\n        init.headers instanceof Headers\n          ? init.headers\n          : new Headers(init.headers as Record<string, string>)\n      initHeaders.forEach((value, key) => headers.set(key, value))\n    }\n\n    let lastError: Error | undefined\n    const maxAttempts = this.config.retryOnError ? this.config.retryLimit + 1 : 1\n\n    for (let attempt = 0; attempt < maxAttempts; attempt++) {\n      const controller = new AbortController()\n      const timeoutId = setTimeout(() => controller.abort(), this.config.timeout)\n\n      try {\n        const response = await this.config.fetch(url, {\n          ...init,\n          headers,\n          signal: controller.signal,\n        })\n\n        if (response.ok) {\n          const data = (await response.json().catch(() => ({}))) as T\n          return { data, status: response.status, headers: response.headers }\n        }\n\n        // Check if retryable\n        const isRetryable = response.status === 429 || response.status >= 500\n        if (isRetryable && this.config.retryOnError && attempt < maxAttempts - 1) {\n          const delay = this.calculateDelay(response, attempt)\n          await sleep(delay)\n          lastError = await this.createError(response, path)\n          continue\n        }\n\n        throw await this.createError(response, path)\n      } catch (error) {\n        if (error instanceof ContentstackError) {\n          throw error\n        }\n\n        if (error instanceof ContentstackConfigError) {\n          throw error\n        }\n\n        if (error instanceof DOMException && error.name === \"AbortError\") {\n          throw new ContentstackError(`Request timed out after ${this.config.timeout}ms`, {\n            requestPath: path,\n            cause: error,\n          })\n        }\n\n        throw new ContentstackError(\"Network request failed\", {\n          requestPath: path,\n          cause: error instanceof Error ? error : new Error(String(error)),\n        })\n      } finally {\n        clearTimeout(timeoutId)\n      }\n    }\n\n    // Should not reach here, but just in case\n    throw lastError ?? new ContentstackError(\"Request failed after retries\", { requestPath: path })\n  }\n\n  private calculateDelay(response: Response, attempt: number): number {\n    const retryAfter = response.headers.get(\"Retry-After\")\n    if (retryAfter) {\n      const seconds = Number.parseFloat(retryAfter)\n      if (!Number.isNaN(seconds)) {\n        return seconds * 1000\n      }\n    }\n\n    const jitter = Math.random() * MAX_JITTER\n    return this.config.retryDelay * 2 ** attempt + jitter\n  }\n\n  private async createError(response: Response, path: string): Promise<ContentstackError> {\n    let body: Record<string, unknown> = {}\n    try {\n      body = (await response.json()) as Record<string, unknown>\n    } catch {\n      // Response body may not be JSON\n    }\n\n    const message =\n      (body.error_message as string | undefined) ??\n      (body.error_description as string | undefined) ??\n      (body.message as string | undefined) ??\n      `HTTP ${response.status} error`\n    const errorCode = body.error_code as number | undefined\n    const errors = body.errors as Record<string, string[]> | undefined\n    const retryAfter = response.headers.get(\"Retry-After\")\n\n    const opts = { status: response.status, errorCode, errors, requestPath: path }\n\n    switch (response.status) {\n      case 400:\n        return new ContentstackValidationError(message, { ...opts, status: 400 })\n      case 401:\n        return new ContentstackAuthError(message, opts)\n      case 403:\n        return new ContentstackForbiddenError(message, opts)\n      case 404:\n        return new ContentstackNotFoundError(message, opts)\n      case 412:\n        return new ContentstackInvalidApiKeyError(message, opts)\n      case 422:\n        return new ContentstackValidationError(message, { ...opts, status: 422 })\n      case 429:\n        return new ContentstackRateLimitError(message, {\n          ...opts,\n          retryAfter: retryAfter ? Number.parseFloat(retryAfter) : undefined,\n        })\n      default:\n        if (response.status >= 500) {\n          return new ContentstackServerError(message, opts)\n        }\n        return new ContentstackError(message, opts)\n    }\n  }\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import {\n  type ContentstackEndpoints as UpstreamEndpoints,\n  getContentstackEndpoints,\n  getRegionForString,\n} from \"@timbenniks/contentstack-endpoints\"\nimport type { ContentstackEndpoints, ContentstackRegion } from \"./resolver.js\"\n\n/** Brand Kit endpoints not available in upstream package — maintained locally */\nconst BRAND_KIT_URLS: Record<ContentstackRegion, { brandKit: string; brandKitAI: string }> = {\n  us: {\n    brandKit: \"https://brand-kits-api.contentstack.com\",\n    brandKitAI: \"https://ai.contentstack.com/brand-kits\",\n  },\n  eu: {\n    brandKit: \"https://eu-brand-kits-api.contentstack.com\",\n    brandKitAI: \"https://eu-ai.contentstack.com/brand-kits\",\n  },\n  au: {\n    brandKit: \"https://au-brand-kits-api.contentstack.com\",\n    brandKitAI: \"https://au-ai.contentstack.com/brand-kits\",\n  },\n  \"azure-na\": {\n    brandKit: \"https://azure-na-brand-kits-api.contentstack.com\",\n    brandKitAI: \"https://azure-na-ai.contentstack.com/brand-kits\",\n  },\n  \"azure-eu\": {\n    brandKit: \"https://azure-eu-brand-kits-api.contentstack.com\",\n    brandKitAI: \"https://azure-eu-ai.contentstack.com/brand-kits\",\n  },\n  \"gcp-na\": {\n    brandKit: \"https://gcp-na-brand-kits-api.contentstack.com\",\n    brandKitAI: \"https://gcp-na-ai.contentstack.com/brand-kits\",\n  },\n  \"gcp-eu\": {\n    brandKit: \"https://gcp-eu-brand-kits-api.contentstack.com\",\n    brandKitAI: \"https://gcp-eu-ai.contentstack.com/brand-kits\",\n  },\n}\n\nfunction mapEndpoints(\n  upstream: UpstreamEndpoints,\n  region: ContentstackRegion,\n  hostsOnly: boolean,\n): ContentstackEndpoints {\n  const bk = BRAND_KIT_URLS[region]\n  const stripProtocol = (url: string) => url.replace(/^https?:\\/\\//, \"\")\n\n  return Object.freeze({\n    cma: upstream.contentManagement ?? \"\",\n    cda: upstream.contentDelivery ?? \"\",\n    graphql: upstream.graphqlDelivery ?? \"\",\n    images: upstream.images ?? \"\",\n    app: upstream.application ?? \"\",\n    preview: upstream.preview ?? \"\",\n    graphqlPreview: upstream.graphqlPreview ?? \"\",\n    launch: upstream.launch ?? \"\",\n    personalizeEdge: upstream.personalizeEdge ?? \"\",\n    brandKit: hostsOnly ? stripProtocol(bk.brandKit) : bk.brandKit,\n    brandKitAI: hostsOnly ? stripProtocol(bk.brandKitAI) : bk.brandKitAI,\n    developerHub: hostsOnly\n      ? stripProtocol(upstream.developerHub ?? \"\")\n      : (upstream.developerHub ?? \"\"),\n  })\n}\n\nconst ALL_REGIONS: ContentstackRegion[] = [\n  \"us\",\n  \"eu\",\n  \"au\",\n  \"azure-na\",\n  \"azure-eu\",\n  \"gcp-na\",\n  \"gcp-eu\",\n]\n\nfunction buildEndpointMap(): Record<ContentstackRegion, ContentstackEndpoints> {\n  const map = {} as Record<ContentstackRegion, ContentstackEndpoints>\n  for (const region of ALL_REGIONS) {\n    map[region] = mapEndpoints(getContentstackEndpoints(region), region, false)\n  }\n  return Object.freeze(map)\n}\n\nfunction buildHostMap(): Record<ContentstackRegion, ContentstackEndpoints> {\n  const map = {} as Record<ContentstackRegion, ContentstackEndpoints>\n  for (const region of ALL_REGIONS) {\n    map[region] = mapEndpoints(getContentstackEndpoints(region, true), region, true)\n  }\n  return Object.freeze(map)\n}\n\nexport const ENDPOINT_MAP = buildEndpointMap()\nexport const HOST_MAP = buildHostMap()\n\n/** Check if a string is a valid region via the upstream package */\nexport function isValidRegion(input: string): boolean {\n  return getRegionForString(input) !== undefined\n}\n\n/** Map of extra aliases our SDK supports beyond what the upstream package handles */\nexport const EXTRA_ALIASES: Record<string, ContentstackRegion> = {\n  \"north-america\": \"us\",\n  europe: \"eu\",\n  australia: \"au\",\n}\n","import { ContentstackConfigError } from \"../http/errors.js\"\nimport { ENDPOINT_MAP, EXTRA_ALIASES, HOST_MAP, isValidRegion } from \"./endpoints.js\"\n\n/** All 7 Contentstack regions */\nexport type ContentstackRegion = \"us\" | \"eu\" | \"au\" | \"azure-na\" | \"azure-eu\" | \"gcp-na\" | \"gcp-eu\"\n\n/** Resolved endpoint URLs for a region */\nexport interface ContentstackEndpoints {\n  /** CMA base URL, e.g. \"https://api.contentstack.io\" */\n  cma: string\n  /** CDA REST base URL, e.g. \"https://cdn.contentstack.io\" */\n  cda: string\n  /** GraphQL CDA endpoint */\n  graphql: string\n  /** Asset/image delivery base URL */\n  images: string\n  /** Application URL (for OAuth), e.g. \"https://app.contentstack.com\" */\n  app: string\n  /** Preview API base URL */\n  preview: string\n  /** GraphQL preview endpoint */\n  graphqlPreview: string\n  /** Launch API base URL */\n  launch: string\n  /** Personalize edge endpoint */\n  personalizeEdge: string\n  /** Brand Kit Management API base URL */\n  brandKit: string\n  /** Brand Kit GenAI and Knowledge Vault base URL */\n  brandKitAI: string\n  /** Developer Hub (Marketplace) API base URL */\n  developerHub: string\n}\n\nconst VALID_REGIONS = new Set<string>(Object.keys(ENDPOINT_MAP))\n\n/**\n * Resolve all API endpoints for a Contentstack region.\n *\n * @example\n * ```ts\n * const endpoints = resolveEndpoints(\"eu\");\n * // endpoints.cma === \"https://eu-api.contentstack.com\"\n * // endpoints.app === \"https://eu-app.contentstack.com\"\n * ```\n */\nexport function resolveEndpoints(region: ContentstackRegion): ContentstackEndpoints {\n  return ENDPOINT_MAP[region]\n}\n\n/**\n * Resolve endpoints with https:// stripped (for SDK host parameters).\n *\n * @example\n * ```ts\n * const hosts = resolveHosts(\"eu\");\n * // hosts.cda === \"eu-cdn.contentstack.com\"\n * ```\n */\nexport function resolveHosts(region: ContentstackRegion): ContentstackEndpoints {\n  return HOST_MAP[region]\n}\n\n/**\n * Normalize region aliases: \"na\" → \"us\", \"NA\" → \"us\", etc.\n * Case-insensitive. Throws ContentstackConfigError for unknown regions.\n */\nexport function normalizeRegion(input: string): ContentstackRegion {\n  const lower = input.toLowerCase().trim()\n\n  if (VALID_REGIONS.has(lower)) {\n    return lower as ContentstackRegion\n  }\n\n  // Check extra aliases our SDK supports (north-america, europe, australia)\n  const extraAlias = EXTRA_ALIASES[lower]\n  if (extraAlias) {\n    return extraAlias\n  }\n\n  // Check aliases handled by the upstream package (na, us, aws-na, etc.)\n  if (isValidRegion(lower)) {\n    // The upstream package recognized it — map back to our canonical region\n    // \"na\" and \"us\" both map to the NA region which we call \"us\"\n    if (lower === \"na\" || lower === \"aws-na\" || lower === \"aws_na\") return \"us\"\n    if (lower === \"aws-eu\" || lower === \"aws_eu\") return \"eu\"\n    if (lower === \"aws-au\" || lower === \"aws_au\") return \"au\"\n    if (lower === \"azure_na\") return \"azure-na\"\n    if (lower === \"azure_eu\") return \"azure-eu\"\n    if (lower === \"gcp_na\") return \"gcp-na\"\n    if (lower === \"gcp_eu\") return \"gcp-eu\"\n  }\n\n  const validRegions = [...VALID_REGIONS].join(\", \")\n  const validAliases = [...Object.keys(EXTRA_ALIASES), \"na\", \"aws-na\", \"aws-eu\", \"aws-au\"].join(\n    \", \",\n  )\n  throw new ContentstackConfigError(\n    `Unknown region \"${input}\". Valid regions: ${validRegions}. Aliases: ${validAliases}.`,\n  )\n}\n\nexport { ContentstackConfigError }\n","import { ContentstackHttpClient } from \"../http/client.js\"\nimport {\n  ContentstackAuthError,\n  ContentstackConfigError,\n  ContentstackError,\n} from \"../http/errors.js\"\nimport type { ContentstackRegion } from \"../regions/index.js\"\nimport { resolveEndpoints } from \"../regions/index.js\"\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\"\nimport type { AuthHttpOptions, ContentstackUser, OAuthConfig, OAuthTokens } from \"./types.js\"\n\ninterface AuthorizationUrlOptions {\n  state?: string\n  usePKCE?: boolean\n}\n\ninterface AuthorizationUrlResult {\n  url: string\n  state: string\n  codeVerifier?: string\n}\n\ninterface ExchangeCodeOptions {\n  codeVerifier?: string\n  httpOptions?: AuthHttpOptions\n}\n\nfunction validateConfig(config: OAuthConfig): void {\n  if (!config.appId) {\n    throw new ContentstackConfigError(\n      \"appId is required for OAuth. This is your Contentstack app's UID, not the client ID.\",\n    )\n  }\n  if (config.appId === config.clientId) {\n    throw new ContentstackConfigError(\n      \"appId and clientId must be different. appId is your Contentstack app UID; clientId is the OAuth client identifier.\",\n    )\n  }\n}\n\n/**\n * Build a Contentstack OAuth authorization URL.\n *\n * @example\n * ```ts\n * const { url, state, codeVerifier } = await buildAuthorizationUrl({\n *   region: \"us\",\n *   appId: \"app-uid\",\n *   clientId: \"client-id\",\n *   clientSecret: \"secret\",\n *   scopes: [\"user:read\"],\n *   redirectUri: \"http://localhost:3000/api/auth/callback/contentstack\",\n * }, { usePKCE: true })\n * ```\n */\nexport async function buildAuthorizationUrl(\n  config: OAuthConfig,\n  options?: AuthorizationUrlOptions,\n): Promise<AuthorizationUrlResult> {\n  validateConfig(config)\n\n  const endpoints = resolveEndpoints(config.region)\n  const authorizationUrl = `${endpoints.app}/apps/${config.appId}/authorize`\n\n  const state = options?.state ?? generateCodeVerifier()\n\n  const params = new URLSearchParams({\n    response_type: \"code\",\n    client_id: config.clientId,\n    redirect_uri: config.redirectUri,\n    scope: config.scopes.join(\" \"),\n    state,\n  })\n\n  let codeVerifier: string | undefined\n  if (options?.usePKCE) {\n    codeVerifier = generateCodeVerifier()\n    const codeChallenge = await generateCodeChallenge(codeVerifier)\n    params.set(\"code_challenge\", codeChallenge)\n    params.set(\"code_challenge_method\", \"S256\")\n  }\n\n  return {\n    url: `${authorizationUrl}?${params.toString()}`,\n    state,\n    codeVerifier,\n  }\n}\n\nfunction mapTokenResponse(data: Record<string, unknown>): OAuthTokens {\n  return {\n    accessToken: data.access_token as string,\n    refreshToken: (data.refresh_token as string | undefined) ?? \"\",\n    expiresIn: data.expires_in as number,\n    tokenType: data.token_type as string,\n  }\n}\n\nasync function makeTokenRequest(\n  appBaseUrl: string,\n  body: URLSearchParams,\n  errorMessage: string,\n  httpOptions?: AuthHttpOptions,\n): Promise<OAuthTokens> {\n  const client = new ContentstackHttpClient({ ...httpOptions, baseUrl: appBaseUrl })\n  try {\n    const { data } = await client.postForm<Record<string, unknown>>(\"/apps-api/token\", body)\n    return mapTokenResponse(data)\n  } catch (err) {\n    if (err instanceof ContentstackError) {\n      throw new ContentstackAuthError(err.message || errorMessage, {\n        status: err.status,\n        requestPath: \"/apps-api/token\",\n        cause: err,\n      })\n    }\n    throw new ContentstackAuthError(errorMessage, {\n      requestPath: \"/apps-api/token\",\n      cause: err instanceof Error ? err : undefined,\n    })\n  }\n}\n\n/**\n * Exchange an authorization code for OAuth tokens.\n */\nexport async function exchangeCode(\n  config: OAuthConfig,\n  code: string,\n  options?: ExchangeCodeOptions,\n): Promise<OAuthTokens> {\n  const endpoints = resolveEndpoints(config.region)\n\n  const body = new URLSearchParams({\n    grant_type: \"authorization_code\",\n    code,\n    redirect_uri: config.redirectUri,\n    client_id: config.clientId,\n    client_secret: config.clientSecret,\n  })\n\n  if (options?.codeVerifier) {\n    body.set(\"code_verifier\", options.codeVerifier)\n  }\n\n  return makeTokenRequest(\n    endpoints.app,\n    body,\n    \"Failed to exchange authorization code\",\n    options?.httpOptions,\n  )\n}\n\n/**\n * Refresh an expired access token using a refresh token.\n */\nexport async function refreshToken(\n  config: OAuthConfig,\n  token: string,\n  options?: { httpOptions?: AuthHttpOptions },\n): Promise<OAuthTokens> {\n  const endpoints = resolveEndpoints(config.region)\n\n  const body = new URLSearchParams({\n    grant_type: \"refresh_token\",\n    refresh_token: token,\n    client_id: config.clientId,\n    client_secret: config.clientSecret,\n  })\n\n  return makeTokenRequest(endpoints.app, body, \"Failed to refresh token\", options?.httpOptions)\n}\n\nexport interface AppTokenCredentials {\n  clientId: string\n  clientSecret: string\n}\n\n/**\n * Obtain an app token (client credentials grant) for machine-to-machine integrations.\n * Requires the app's `app_token_config` to be enabled with the needed scopes.\n */\nexport async function exchangeAppToken(\n  region: ContentstackRegion,\n  credentials: AppTokenCredentials,\n  options?: { httpOptions?: AuthHttpOptions },\n): Promise<OAuthTokens> {\n  const endpoints = resolveEndpoints(region)\n\n  const body = new URLSearchParams({\n    grant_type: \"client_credentials\",\n    client_id: credentials.clientId,\n    client_secret: credentials.clientSecret,\n  })\n\n  return makeTokenRequest(endpoints.app, body, \"Failed to obtain app token\", options?.httpOptions)\n}\n\nfunction mapUser(user: Record<string, unknown>): ContentstackUser {\n  return {\n    uid: user.uid as string,\n    email: user.email as string,\n    firstName: (user.first_name as string) ?? undefined,\n    lastName: (user.last_name as string) ?? undefined,\n    username: (user.username as string) ?? undefined,\n    profileImage: (user.profile_image as string) ?? undefined,\n  }\n}\n\n/**\n * Fetch the authenticated user's profile from Contentstack.\n * Unwraps the nested `user` key and maps snake_case → camelCase.\n */\nexport async function getUser(\n  region: ContentstackRegion,\n  accessToken: string,\n  options?: { httpOptions?: AuthHttpOptions },\n): Promise<ContentstackUser> {\n  const endpoints = resolveEndpoints(region)\n  const client = new ContentstackHttpClient({\n    ...options?.httpOptions,\n    baseUrl: `${endpoints.cma}/v3`,\n    headers: { Authorization: `Bearer ${accessToken}` },\n  })\n\n  try {\n    const { data } = await client.get<{ user: Record<string, unknown> }>(\"/user\")\n    return mapUser(data.user)\n  } catch (err) {\n    if (err instanceof ContentstackError) {\n      throw new ContentstackAuthError(err.message || \"Failed to fetch user profile\", {\n        status: err.status,\n        requestPath: \"/v3/user\",\n        cause: err,\n      })\n    }\n    throw new ContentstackAuthError(\"Failed to fetch user profile\", {\n      requestPath: \"/v3/user\",\n      cause: err instanceof Error ? err : undefined,\n    })\n  }\n}\n\n/**\n * Create an Auth.js v5 provider config object for Contentstack.\n *\n * No Auth.js dependency is required in this package — the returned object\n * conforms to the Auth.js OAuthConfig shape and can be passed directly to\n * `next-auth` or `@auth/core`.\n *\n * @example\n * ```ts\n * // app/api/auth/[...nextauth]/route.ts\n * import NextAuth from \"next-auth\"\n * import { createAuthProvider } from \"@timbenniks/contentstack-platform-sdk/auth\"\n *\n * export const { handlers, signIn, signOut, auth } = NextAuth({\n *   providers: [createAuthProvider({ region: \"us\", appId: \"...\", ... })],\n * })\n * ```\n */\nexport function createAuthProvider(config: OAuthConfig): Record<string, unknown> {\n  validateConfig(config)\n\n  const endpoints = resolveEndpoints(config.region)\n  const userClient = new ContentstackHttpClient({ baseUrl: `${endpoints.cma}/v3` })\n\n  return {\n    id: \"contentstack\",\n    name: \"Contentstack\",\n    type: \"oauth\",\n    checks: [\"state\"],\n    authorization: {\n      url: `${endpoints.app}/apps/${config.appId}/authorize`,\n      params: {\n        response_type: \"code\",\n        scope: config.scopes.join(\" \"),\n      },\n    },\n    token: `${endpoints.app}/apps-api/token`,\n    userinfo: {\n      url: `${endpoints.cma}/v3/user`,\n      async request({ tokens }: { tokens: { access_token: string } }) {\n        const authedClient = userClient.withHeaders({\n          Authorization: `Bearer ${tokens.access_token}`,\n        })\n        const { data } = await authedClient.get<Record<string, unknown>>(\"/user\")\n        return data\n      },\n    },\n    profile(profile: { user: Record<string, unknown> }) {\n      const user = profile.user\n      return {\n        id: user.uid as string,\n        name:\n          [user.first_name, user.last_name].filter(Boolean).join(\" \") || (user.username as string),\n        email: user.email as string,\n        image: (user.profile_image as string) ?? null,\n      }\n    },\n    clientId: config.clientId,\n    clientSecret: config.clientSecret,\n  }\n}\n\n/**\n * Create Auth.js v5 callbacks for token persistence and automatic refresh.\n *\n * The `jwt` callback persists OAuth tokens on initial sign-in and attempts\n * to refresh expired tokens (with a 60-second safety window).\n *\n * The `session` callback exposes the access token and any refresh errors\n * on the session object.\n *\n * @example\n * ```ts\n * import NextAuth from \"next-auth\"\n * import { createAuthProvider, contentstackAuthCallbacks } from \"@timbenniks/contentstack-platform-sdk/auth\"\n *\n * export const { handlers, auth } = NextAuth({\n *   providers: [createAuthProvider({ ... })],\n *   callbacks: contentstackAuthCallbacks({ region: \"us\", ... }),\n * })\n * ```\n */\nexport function contentstackAuthCallbacks(config: OAuthConfig) {\n  return {\n    async jwt({\n      token,\n      account,\n    }: { token: Record<string, unknown>; account?: Record<string, unknown> | null }) {\n      // Initial sign-in: persist tokens from the OAuth account\n      if (account) {\n        token.accessToken = account.access_token\n        token.refreshToken = account.refresh_token\n        token.accessTokenExpiresAt = Date.now() + ((account.expires_in as number) ?? 3600) * 1000\n        return token\n      }\n\n      // Subsequent calls: check if token needs refresh (60s safety window)\n      const expiresAt = token.accessTokenExpiresAt as number | undefined\n      if (expiresAt && Date.now() < expiresAt - 60_000) {\n        return token\n      }\n\n      // Token is expired or about to expire — attempt refresh\n      const currentRefreshToken = token.refreshToken as string | undefined\n      if (!currentRefreshToken) {\n        token.error = \"RefreshAccessTokenError\"\n        return token\n      }\n\n      try {\n        const tokens = await refreshToken(config, currentRefreshToken)\n        token.accessToken = tokens.accessToken\n        token.refreshToken = tokens.refreshToken\n        token.accessTokenExpiresAt = Date.now() + tokens.expiresIn * 1000\n        token.error = undefined\n      } catch {\n        token.error = \"RefreshAccessTokenError\"\n      }\n\n      return token\n    },\n    async session({\n      session,\n      token,\n    }: { session: Record<string, unknown>; token: Record<string, unknown> }) {\n      session.accessToken = token.accessToken\n      if (token.error) {\n        session.error = token.error\n      }\n      return session\n    },\n  }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA pagination helper\n\nconst DEFAULT_PAGE_SIZE = 25\n\n/**\n * Create an AsyncIterable that lazily paginates through CMA results.\n * Pages are fetched on demand — only when items are consumed.\n */\nexport function paginate<T>(\n  fetchPage: (skip: number, limit: number) => Promise<{ items: T[]; count?: number }>,\n  options?: { limit?: number },\n): AsyncIterable<T> {\n  const pageSize = options?.limit ?? DEFAULT_PAGE_SIZE\n\n  return {\n    [Symbol.asyncIterator]() {\n      let skip = 0\n      let done = false\n      let buffer: T[] = []\n      let bufferIndex = 0\n      let totalCount: number | undefined\n\n      return {\n        async next(): Promise<IteratorResult<T>> {\n          if (bufferIndex < buffer.length) {\n            return { value: buffer[bufferIndex++] as T, done: false }\n          }\n\n          if (done) {\n            return { value: undefined as unknown as T, done: true }\n          }\n\n          const page = await fetchPage(skip, pageSize)\n          buffer = page.items\n          bufferIndex = 0\n          skip += page.items.length\n\n          if (typeof page.count === \"number\") {\n            totalCount = page.count\n          }\n\n          if (page.items.length === 0) {\n            done = true\n            return { value: undefined as unknown as T, done: true }\n          }\n\n          if (typeof totalCount === \"number\" && skip >= totalCount) {\n            done = true\n          }\n\n          return { value: buffer[bufferIndex++] as T, done: false }\n        },\n      }\n    },\n  }\n}\n\n/**\n * Collect all items from an AsyncIterable into an array.\n * Replaces the repeated listAll() pattern across sub-clients.\n */\nexport async function collectAll<T>(iterable: AsyncIterable<T>): Promise<T[]> {\n  const items: T[] = []\n  for await (const item of iterable) {\n    items.push(item)\n  }\n  return items\n}\n","/**\n * Developer Hub API response helpers.\n *\n * The Developer Hub API returns responses in varying formats:\n *   - `{ data: T }` for single items\n *   - `{ data: T[] }` for lists with optional `count`\n *   - Direct object for some endpoints\n *\n * These helpers normalise the response into shapes the paginator expects.\n */\n\n/**\n * Extract a list from a Developer Hub API response.\n *\n * Handles:\n * - `{ data: T[], count? }` — standard list format\n * - Plain arrays `T[]`\n * - `{ [key]: T[], count? }` — keyed list format\n */\nexport function extractList<T>(body: unknown, key?: string): { items: T[]; count?: number } {\n  if (Array.isArray(body)) {\n    return { items: body as T[] }\n  }\n\n  if (body && typeof body === \"object\") {\n    const obj = body as Record<string, unknown>\n\n    // Keyed format: { [key]: [...], count? }\n    if (key && key in obj && Array.isArray(obj[key])) {\n      return { items: obj[key] as T[], count: obj.count as number | undefined }\n    }\n\n    // Standard format: { data: [...], count? }\n    if (\"data\" in obj && Array.isArray(obj.data)) {\n      return { items: obj.data as T[], count: obj.count as number | undefined }\n    }\n  }\n\n  return { items: [] }\n}\n\n/** Extract a single item from a response that may be `{ data: T }` or a plain object. */\nexport function extractItem<T>(body: unknown): T {\n  if (body && typeof body === \"object\" && \"data\" in body) {\n    return (body as { data: T }).data\n  }\n\n  return body as T\n}\n","import { collectAll, paginate } from \"../cma/pagination.js\"\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { extractItem, extractList } from \"./response.js\"\nimport type {\n  AppInstallation,\n  AuthorizeAppData,\n  CreateAppData,\n  DeveloperHubApp,\n  InstallAppData,\n  ListAppInstallationsOptions,\n  ListAppsOptions,\n  ReinstallAppData,\n  UpdateAppData,\n} from \"./types.js\"\n\nexport class AppsClient {\n  constructor(private readonly http: ContentstackHttpClient) {}\n\n  list(options?: ListAppsOptions): AsyncIterable<DeveloperHubApp> {\n    return paginate<DeveloperHubApp>(\n      async (skip, limit) => {\n        const params: Record<string, string> = {\n          skip: String(skip),\n          limit: String(limit),\n        }\n        if (options?.sort) params.sort = options.sort\n        if (options?.order) params.order = options.order\n        if (options?.search) params.search = options.search\n        if (options?.target_type) params.target_type = options.target_type\n        if (options?.include_update_details) params.include_update_details = \"true\"\n\n        const response = await this.http.get<unknown>(\"/manifests\", params)\n        return extractList<DeveloperHubApp>(response.data, \"data\")\n      },\n      { limit: options?.limit },\n    )\n  }\n\n  async listAll(options?: ListAppsOptions): Promise<DeveloperHubApp[]> {\n    return collectAll(this.list(options))\n  }\n\n  async search(\n    term: string,\n    options?: Omit<ListAppsOptions, \"search\">,\n  ): Promise<DeveloperHubApp[]> {\n    const params: Record<string, string> = { term }\n    if (options?.limit) params.limit = String(options.limit)\n    if (options?.skip) params.skip = String(options.skip)\n    if (options?.sort) params.sort = options.sort\n    if (options?.order) params.order = options.order\n    if (options?.target_type) params.target_type = options.target_type\n\n    const response = await this.http.get<unknown>(\"/manifests\", params)\n    return extractList<DeveloperHubApp>(response.data, \"data\").items\n  }\n\n  async get(appUid: string): Promise<DeveloperHubApp> {\n    const response = await this.http.get<unknown>(`/manifests/${appUid}`)\n    return extractItem<DeveloperHubApp>(response.data)\n  }\n\n  async create(data: CreateAppData): Promise<DeveloperHubApp> {\n    const response = await this.http.post<unknown>(\"/manifests\", data)\n    return extractItem<DeveloperHubApp>(response.data)\n  }\n\n  async update(appUid: string, data: UpdateAppData): Promise<DeveloperHubApp> {\n    const response = await this.http.put<unknown>(`/manifests/${appUid}`, data)\n    return extractItem<DeveloperHubApp>(response.data)\n  }\n\n  async delete(appUid: string): Promise<void> {\n    await this.http.delete(`/manifests/${appUid}`)\n  }\n\n  async install(appUid: string, data: InstallAppData): Promise<AppInstallation> {\n    const response = await this.http.post<unknown>(`/manifests/${appUid}/install`, data)\n    return extractItem<AppInstallation>(response.data)\n  }\n\n  async reinstall(appUid: string, data: ReinstallAppData): Promise<AppInstallation> {\n    const response = await this.http.put<unknown>(`/manifests/${appUid}/reinstall`, data)\n    return extractItem<AppInstallation>(response.data)\n  }\n\n  async authorize(appUid: string, data: AuthorizeAppData): Promise<{ redirect_uri: string }> {\n    const response = await this.http.post<unknown>(`/manifests/${appUid}/authorize`, data)\n    return extractItem<{ redirect_uri: string }>(response.data)\n  }\n\n  async listAuthorized(): Promise<DeveloperHubApp[]> {\n    const response = await this.http.get<unknown>(\"/authorized-apps\")\n    return extractList<DeveloperHubApp>(response.data, \"data\").items\n  }\n\n  listInstallations(\n    appUid: string,\n    options?: ListAppInstallationsOptions,\n  ): AsyncIterable<AppInstallation> {\n    return paginate<AppInstallation>(\n      async (skip, limit) => {\n        const response = await this.http.get<unknown>(`/manifests/${appUid}/installations`, {\n          skip: String(skip),\n          limit: String(limit),\n        })\n        return extractList<AppInstallation>(response.data, \"data\")\n      },\n      { limit: options?.limit },\n    )\n  }\n\n  async listInstallationsAll(\n    appUid: string,\n    options?: ListAppInstallationsOptions,\n  ): Promise<AppInstallation[]> {\n    return collectAll(this.listInstallations(appUid, options))\n  }\n\n  async listRequests(appUid: string): Promise<unknown[]> {\n    const response = await this.http.get<unknown>(`/manifests/${appUid}/requests`)\n    return extractList<unknown>(response.data, \"data\").items\n  }\n}\n","import type { ContentstackHttpClient } from \"../http/client.js\"\nimport { extractList } from \"./response.js\"\nimport type { AppAuthorization, ListAuthorizationsOptions } from \"./types.js\"\n\nexport class AuthorizationsClient {\n  constructor(private readonly http: ContentstackHttpClient) {}\n\n  async list(appUid: string, options?: ListAuthorizationsOptions): Promise<AppAuthorization[]> {\n    const params: Record<string, string> = {}\n    if (options?.limit) params.limit = String(options.limit)\n    if (options?.skip) params.skip = String(options.skip)\n\n    const response = await this.http.get<unknown>(`/manifests/${appUid}/authorizations`, params)\n    return extractList<AppAuthorization>(response.data, \"data\").items\n  }\n\n  async revokeAll(appUid: string): Promise<void> {\n    await this.http.delete(`/manifests/${appUid}/authorizations`)\n  }\n\n  async revoke(appUid: string, authorizationUid: string): Promise<void> {\n    await this.http.delete(`/manifests/${appUid}/authorizations/${authorizationUid}`)\n  }\n}\n","import { collectAll, paginate } from \"../cma/pagination.js\"\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { ContentstackConfigError } from \"../http/errors.js\"\nimport type { AppsClient } from \"./apps.js\"\nimport { extractItem, extractList } from \"./response.js\"\nimport type {\n  DeveloperHubApp,\n  DeveloperHubCreateDeploymentData,\n  DeveloperHubListDeploymentsOptions,\n  DisconnectHostingData,\n  HostingDeployment,\n  HostingDeploymentLog,\n  HostingStatus,\n  SetExternalHostingData,\n} from \"./types.js\"\n\nexport class HostingClient {\n  constructor(\n    private readonly http: ContentstackHttpClient,\n    private readonly apps?: AppsClient,\n  ) {}\n\n  private hostingPath(appUid: string): string {\n    return `/manifests/${appUid}/hosting`\n  }\n\n  private deploymentsPath(appUid: string): string {\n    return `${this.hostingPath(appUid)}/deployments`\n  }\n\n  // ── Hosting status ─────────────────────────────────────\n\n  async getStatus(appUid: string): Promise<HostingStatus> {\n    const response = await this.http.get<unknown>(this.hostingPath(appUid))\n    return extractItem<HostingStatus>(response.data)\n  }\n\n  async enable(appUid: string): Promise<void> {\n    await this.http.patch(`${this.hostingPath(appUid)}/enable`, {})\n  }\n\n  async disable(appUid: string): Promise<void> {\n    await this.http.patch(`${this.hostingPath(appUid)}/disable`, {})\n  }\n\n  async disconnect(appUid: string, data?: DisconnectHostingData): Promise<void> {\n    await this.http.patch(`${this.hostingPath(appUid)}/disconnect`, data ?? {})\n  }\n\n  /**\n   * Set custom/external hosting (\"App URL\" in Developer Hub). Updates the manifest's\n   * `hosting.deployment_url` field — distinct from Launch-backed hosting (`enable`, etc.).\n   */\n  async setExternal(appUid: string, data: SetExternalHostingData): Promise<DeveloperHubApp> {\n    if (!this.apps) {\n      throw new ContentstackConfigError(\"HostingClient requires AppsClient for setExternal()\")\n    }\n\n    return this.apps.update(appUid, {\n      hosting: {\n        provider: data.provider ?? \"external\",\n        deployment_url: data.deployment_url,\n      },\n    })\n  }\n\n  async createUploadUrl(appUid: string): Promise<{ upload_uid: string; upload_url: string }> {\n    const response = await this.http.post<unknown>(\n      `${this.hostingPath(appUid)}/signedUploadUrl`,\n      {},\n    )\n    return extractItem<{ upload_uid: string; upload_url: string }>(response.data)\n  }\n\n  async getLatestLiveDeployment(appUid: string): Promise<HostingDeployment> {\n    const response = await this.http.get<unknown>(\n      `${this.hostingPath(appUid)}/latestLiveDeployment`,\n    )\n    return extractItem<HostingDeployment>(response.data)\n  }\n\n  // ── Deployments ────────────────────────────────────────\n\n  listDeployments(\n    appUid: string,\n    options?: DeveloperHubListDeploymentsOptions,\n  ): AsyncIterable<HostingDeployment> {\n    return paginate<HostingDeployment>(\n      async (skip, limit) => {\n        const response = await this.http.get<unknown>(this.deploymentsPath(appUid), {\n          skip: String(skip),\n          limit: String(limit),\n        })\n        return extractList<HostingDeployment>(response.data, \"data\")\n      },\n      { limit: options?.limit },\n    )\n  }\n\n  async listDeploymentsAll(\n    appUid: string,\n    options?: DeveloperHubListDeploymentsOptions,\n  ): Promise<HostingDeployment[]> {\n    return collectAll(this.listDeployments(appUid, options))\n  }\n\n  async getDeployment(appUid: string, deploymentUid: string): Promise<HostingDeployment> {\n    const response = await this.http.get<unknown>(\n      `${this.deploymentsPath(appUid)}/${deploymentUid}`,\n    )\n    return extractItem<HostingDeployment>(response.data)\n  }\n\n  async createDeployment(\n    appUid: string,\n    data: DeveloperHubCreateDeploymentData,\n  ): Promise<HostingDeployment> {\n    const response = await this.http.post<unknown>(this.deploymentsPath(appUid), data)\n    return extractItem<HostingDeployment>(response.data)\n  }\n\n  async getDeploymentLogs(appUid: string, deploymentUid: string): Promise<HostingDeploymentLog[]> {\n    const response = await this.http.get<unknown>(\n      `${this.deploymentsPath(appUid)}/${deploymentUid}/logs`,\n    )\n    return extractList<HostingDeploymentLog>(response.data, \"data\").items\n  }\n\n  async getDeploymentDownloadUrl(\n    appUid: string,\n    deploymentUid: string,\n  ): Promise<{ download_url: string }> {\n    const response = await this.http.post<unknown>(\n      `${this.deploymentsPath(appUid)}/${deploymentUid}/signedDownloadUrl`,\n      {},\n    )\n    return extractItem<{ download_url: string }>(response.data)\n  }\n}\n","import { collectAll, paginate } from \"../cma/pagination.js\"\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { extractItem, extractList } from \"./response.js\"\nimport type { AppInstallation, ListInstallationsOptions, WebhookExecution } from \"./types.js\"\n\nexport class InstallationsClient {\n  constructor(private readonly http: ContentstackHttpClient) {}\n\n  // ── CRUD ───────────────────────────────────────────────\n\n  list(options?: ListInstallationsOptions): AsyncIterable<AppInstallation> {\n    return paginate<AppInstallation>(\n      async (skip, limit) => {\n        const params: Record<string, string> = {\n          skip: String(skip),\n          limit: String(limit),\n        }\n        if (options?.app_uids) params.app_uids = options.app_uids.join(\",\")\n        if (options?.installation_uids)\n          params.installation_uids = options.installation_uids.join(\",\")\n        if (options?.target_uids) params.target_uids = options.target_uids.join(\",\")\n\n        const response = await this.http.get<unknown>(\"/installations\", params)\n        return extractList<AppInstallation>(response.data, \"data\")\n      },\n      { limit: options?.limit },\n    )\n  }\n\n  async listAll(options?: ListInstallationsOptions): Promise<AppInstallation[]> {\n    return collectAll(this.list(options))\n  }\n\n  async get(installationUid: string): Promise<AppInstallation> {\n    const response = await this.http.get<unknown>(`/installations/${installationUid}`)\n    return extractItem<AppInstallation>(response.data)\n  }\n\n  async update(installationUid: string, data: Partial<AppInstallation>): Promise<AppInstallation> {\n    const response = await this.http.put<unknown>(`/installations/${installationUid}`, data)\n    return extractItem<AppInstallation>(response.data)\n  }\n\n  async delete(installationUid: string): Promise<void> {\n    await this.http.delete(`/installations/${installationUid}`)\n  }\n\n  // ── Configuration ──────────────────────────────────────\n\n  async getConfiguration(installationUid: string): Promise<Record<string, unknown>> {\n    const response = await this.http.get<unknown>(`/installations/${installationUid}/configuration`)\n    return extractItem<Record<string, unknown>>(response.data)\n  }\n\n  async setConfiguration(\n    installationUid: string,\n    data: Record<string, unknown>,\n  ): Promise<Record<string, unknown>> {\n    const response = await this.http.put<unknown>(\n      `/installations/${installationUid}/configuration`,\n      data,\n    )\n    return extractItem<Record<string, unknown>>(response.data)\n  }\n\n  async getServerConfiguration(installationUid: string): Promise<Record<string, unknown>> {\n    const response = await this.http.get<unknown>(\n      `/installations/${installationUid}/server-configuration`,\n    )\n    return extractItem<Record<string, unknown>>(response.data)\n  }\n\n  async setServerConfiguration(\n    installationUid: string,\n    data: Record<string, unknown>,\n  ): Promise<Record<string, unknown>> {\n    const response = await this.http.put<unknown>(\n      `/installations/${installationUid}/server-configuration`,\n      data,\n    )\n    return extractItem<Record<string, unknown>>(response.data)\n  }\n\n  async getInstallationData(installationUid: string): Promise<Record<string, unknown>> {\n    const response = await this.http.get<unknown>(\n      `/installations/${installationUid}/installationData`,\n    )\n    return extractItem<Record<string, unknown>>(response.data)\n  }\n\n  async getConfigLocation(installationUid: string): Promise<Record<string, unknown>> {\n    const response = await this.http.get<unknown>(\n      `/installations/${installationUid}/locations/configuration`,\n    )\n    return extractItem<Record<string, unknown>>(response.data)\n  }\n\n  // ── View endpoints ─────────────────────────────────────\n\n  async listInstalledApps(): Promise<unknown[]> {\n    const response = await this.http.get<unknown>(\"/installations/view/apps\")\n    return extractList<unknown>(response.data, \"data\").items\n  }\n\n  async listInstalledUsers(): Promise<unknown[]> {\n    const response = await this.http.get<unknown>(\"/installations/view/users\")\n    return extractList<unknown>(response.data, \"data\").items\n  }\n\n  async listInstalledStacks(): Promise<unknown[]> {\n    const response = await this.http.get<unknown>(\"/installations/view/stacks\")\n    return extractList<unknown>(response.data, \"data\").items\n  }\n\n  // ── Webhook executions ─────────────────────────────────\n\n  async listWebhookExecutions(\n    installationUid: string,\n    webhookUid: string,\n  ): Promise<WebhookExecution[]> {\n    const response = await this.http.get<unknown>(\n      `/installations/${installationUid}/webhooks/${webhookUid}/executions`,\n    )\n    return extractList<WebhookExecution>(response.data, \"data\").items\n  }\n\n  async getWebhookExecution(\n    installationUid: string,\n    webhookUid: string,\n    executionUid: string,\n  ): Promise<WebhookExecution> {\n    const response = await this.http.get<unknown>(\n      `/installations/${installationUid}/webhooks/${webhookUid}/executions/${executionUid}`,\n    )\n    return extractItem<WebhookExecution>(response.data)\n  }\n\n  async retryWebhookExecution(\n    installationUid: string,\n    webhookUid: string,\n    executionUid: string,\n  ): Promise<void> {\n    await this.http.post(\n      `/installations/${installationUid}/webhooks/${webhookUid}/executions/${executionUid}/retry`,\n      {},\n    )\n  }\n}\n","import type { ContentstackHttpClient } from \"../http/client.js\"\nimport { extractItem, extractList } from \"./response.js\"\nimport type { AppOAuthConfig, OAuthScope, UpdateOAuthConfigData } from \"./types.js\"\n\nexport class OAuthClient {\n  constructor(private readonly http: ContentstackHttpClient) {}\n\n  async get(appUid: string): Promise<AppOAuthConfig> {\n    const response = await this.http.get<unknown>(`/manifests/${appUid}/oauth`)\n    return extractItem<AppOAuthConfig>(response.data)\n  }\n\n  async update(appUid: string, data: UpdateOAuthConfigData): Promise<AppOAuthConfig> {\n    const response = await this.http.put<unknown>(`/manifests/${appUid}/oauth`, data)\n    return extractItem<AppOAuthConfig>(response.data)\n  }\n\n  async listScopes(): Promise<OAuthScope[]> {\n    const response = await this.http.get<unknown>(\"/manifests/oauth/scopes\")\n    return extractList<OAuthScope>(response.data, \"data\").items\n  }\n}\n","import type { ContentstackHttpClient } from \"../http/client.js\"\nimport { extractItem, extractList } from \"./response.js\"\nimport type { AppRequest, CreateAppRequestData, ListRequestsOptions } from \"./types.js\"\n\nexport class RequestsClient {\n  constructor(private readonly http: ContentstackHttpClient) {}\n\n  async list(options?: ListRequestsOptions): Promise<AppRequest[]> {\n    const params: Record<string, string> = {}\n    if (options?.limit) params.limit = String(options.limit)\n    if (options?.skip) params.skip = String(options.skip)\n\n    const response = await this.http.get<unknown>(\"/requests\", params)\n    return extractList<AppRequest>(response.data, \"data\").items\n  }\n\n  async create(data: CreateAppRequestData): Promise<AppRequest> {\n    const response = await this.http.post<unknown>(\"/requests\", data)\n    return extractItem<AppRequest>(response.data)\n  }\n\n  async delete(requestUid: string): Promise<void> {\n    await this.http.delete(`/requests/${requestUid}`)\n  }\n}\n","import { exchangeAppToken } from \"../auth/oauth-client.js\"\nimport { ContentstackHttpClient } from \"../http/client.js\"\nimport { ContentstackConfigError } from \"../http/errors.js\"\nimport type { HttpClientConfig } from \"../http/types.js\"\nimport type { ContentstackRegion } from \"../regions/resolver.js\"\nimport { resolveEndpoints } from \"../regions/resolver.js\"\nimport { AppsClient } from \"./apps.js\"\nimport { AuthorizationsClient } from \"./authorizations.js\"\nimport { HostingClient } from \"./hosting.js\"\nimport { InstallationsClient } from \"./installations.js\"\nimport { OAuthClient } from \"./oauth.js\"\nimport { RequestsClient } from \"./requests.js\"\n\nexport type DeveloperHubClientAuth =\n  | { type: \"oauth\"; accessToken: string }\n  | { type: \"authtoken\"; token: string }\n  | { type: \"app-token\"; accessToken: string }\n  | { type: \"app-token\"; clientId: string; clientSecret: string }\n\nexport interface DeveloperHubClientConfig {\n  region: ContentstackRegion\n  organizationUid: string\n  auth: DeveloperHubClientAuth\n  httpOptions?: Partial<HttpClientConfig>\n}\n\nexport interface DeveloperHubClient {\n  apps: AppsClient\n  oauth: OAuthClient\n  authorizations: AuthorizationsClient\n  hosting: HostingClient\n  installations: InstallationsClient\n  requests: RequestsClient\n}\n\nexport function createDeveloperHubClient(config: DeveloperHubClientConfig): DeveloperHubClient {\n  const endpoints = resolveEndpoints(config.region)\n\n  const headers: Record<string, string> = {\n    organization_uid: config.organizationUid,\n  }\n\n  let resolveHeaders: HttpClientConfig[\"resolveHeaders\"]\n\n  switch (config.auth.type) {\n    case \"oauth\":\n      headers.authorization = `Bearer ${config.auth.accessToken}`\n      break\n    case \"authtoken\":\n      headers.authtoken = config.auth.token\n      break\n    case \"app-token\": {\n      if (\"accessToken\" in config.auth) {\n        headers.authorization = `Bearer ${config.auth.accessToken}`\n        break\n      }\n\n      if (!(\"clientId\" in config.auth) || !(\"clientSecret\" in config.auth)) {\n        throw new ContentstackConfigError(\n          \"app-token auth requires accessToken or clientId + clientSecret\",\n        )\n      }\n\n      const { clientId, clientSecret } = config.auth\n      let cachedAccessToken: string | undefined\n      let tokenPromise: Promise<string> | undefined\n\n      resolveHeaders = async () => {\n        if (cachedAccessToken) {\n          return { authorization: `Bearer ${cachedAccessToken}` }\n        }\n\n        if (!tokenPromise) {\n          tokenPromise = exchangeAppToken(\n            config.region,\n            { clientId, clientSecret },\n            { httpOptions: config.httpOptions },\n          )\n            .then((tokens) => {\n              cachedAccessToken = tokens.accessToken\n              return cachedAccessToken\n            })\n            .finally(() => {\n              tokenPromise = undefined\n            })\n        }\n\n        return { authorization: `Bearer ${await tokenPromise}` }\n      }\n      break\n    }\n  }\n\n  const http = new ContentstackHttpClient({\n    ...config.httpOptions,\n    baseUrl: config.httpOptions?.baseUrl ?? endpoints.developerHub,\n    headers: {\n      ...config.httpOptions?.headers,\n      ...headers,\n    },\n    resolveHeaders,\n  })\n\n  const apps = new AppsClient(http)\n\n  return {\n    apps,\n    oauth: new OAuthClient(http),\n    authorizations: new AuthorizationsClient(http),\n    hosting: new HostingClient(http, apps),\n    installations: new InstallationsClient(http),\n    requests: new RequestsClient(http),\n  }\n}\n"],"mappings":"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","names":[]}