{"version":3,"file":"index.cjs","sources":["../src/client/base-client.ts","../src/types/errors.ts","../src/client/http-client.ts","../src/client/rate-limiter.ts","../src/auth/oauth.ts","../src/utils/validation.ts","../src/resources/accounts.ts","../src/resources/analytics.ts","../src/resources/campaigns.ts","../src/resources/line-items.ts","../src/resources/media.ts","../src/resources/targeting.ts","../src/types/auth.ts","../src/utils/config.ts","../src/client/x-ads-client.ts"],"sourcesContent":["import type {\n  AuthenticationContext,\n  BaseResponse,\n  ListResponse,\n  QueryParams,\n  RequestData,\n  RequestOptions,\n} from '../types';\nimport type { HttpClient } from './http-client';\n\nexport abstract class BaseClient {\n  protected http: HttpClient;\n  protected context: AuthenticationContext;\n\n  constructor(http: HttpClient, context: AuthenticationContext) {\n    this.http = http;\n    this.context = context;\n  }\n\n  protected async get<T>(path: string, params?: QueryParams): Promise<BaseResponse<T>> {\n    const options: RequestOptions = {\n      method: 'GET',\n      url: `${this.context.baseUrl}${path}`,\n      params,\n    };\n\n    return this.http.request<BaseResponse<T>>(options);\n  }\n\n  protected async getList<T>(path: string, params?: QueryParams): Promise<ListResponse<T>> {\n    const options: RequestOptions = {\n      method: 'GET',\n      url: `${this.context.baseUrl}${path}`,\n      params,\n    };\n\n    return this.http.request<ListResponse<T>>(options);\n  }\n\n  protected async post<T>(\n    path: string,\n    data?: RequestData,\n    params?: QueryParams\n  ): Promise<BaseResponse<T>> {\n    const options: RequestOptions = {\n      method: 'POST',\n      url: `${this.context.baseUrl}${path}`,\n      data,\n      params,\n    };\n\n    return this.http.request<BaseResponse<T>>(options);\n  }\n\n  protected async put<T>(\n    path: string,\n    data?: RequestData,\n    params?: QueryParams\n  ): Promise<BaseResponse<T>> {\n    const options: RequestOptions = {\n      method: 'PUT',\n      url: `${this.context.baseUrl}${path}`,\n      data,\n      params,\n    };\n\n    return this.http.request<BaseResponse<T>>(options);\n  }\n\n  protected async deleteRequest<T>(path: string, params?: QueryParams): Promise<BaseResponse<T>> {\n    const options: RequestOptions = {\n      method: 'DELETE',\n      url: `${this.context.baseUrl}${path}`,\n      params,\n    };\n\n    return this.http.request<BaseResponse<T>>(options);\n  }\n}\n","export class XAdsError extends Error {\n  public code: string;\n  public details?: string;\n  public parameter?: string;\n\n  constructor(code: string, message: string, details?: string, parameter?: string) {\n    super(message);\n    this.name = 'XAdsError';\n    this.code = code;\n    this.details = details;\n    this.parameter = parameter;\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, XAdsError);\n    }\n  }\n}\n\nexport class AuthenticationError extends XAdsError {\n  constructor(message: string, details?: string) {\n    super('AUTHENTICATION_ERROR', message, details);\n    this.name = 'AuthenticationError';\n  }\n}\n\nexport class RateLimitError extends XAdsError {\n  public retryAfter: number;\n\n  constructor(message: string, retryAfter: number, details?: string) {\n    super('RATE_LIMIT_ERROR', message, details);\n    this.name = 'RateLimitError';\n    this.retryAfter = retryAfter;\n  }\n}\n\nexport class ValidationError extends XAdsError {\n  constructor(message: string, parameter?: string, details?: string) {\n    super('VALIDATION_ERROR', message, details, parameter);\n    this.name = 'ValidationError';\n  }\n}\n\nexport class NetworkError extends XAdsError {\n  constructor(message: string, details?: string) {\n    super('NETWORK_ERROR', message, details);\n    this.name = 'NetworkError';\n  }\n}\n","import type { OAuthService } from '../auth/oauth';\nimport type { APIError, AuthenticationContext, RequestOptions } from '../types';\nimport {\n  AuthenticationError,\n  NetworkError,\n  RateLimitError,\n  ValidationError,\n  XAdsError,\n} from '../types/errors';\nimport type { RateLimiter } from './rate-limiter';\n\nexport class HttpClient {\n  private authService: OAuthService;\n  private rateLimiter: RateLimiter;\n  private context: AuthenticationContext;\n  private timeout: number;\n\n  constructor(\n    authService: OAuthService,\n    rateLimiter: RateLimiter,\n    context: AuthenticationContext,\n    timeout: number = 60000\n  ) {\n    this.authService = authService;\n    this.rateLimiter = rateLimiter;\n    this.context = context;\n    this.timeout = timeout;\n  }\n\n  public async request<T>(options: RequestOptions): Promise<T> {\n    await this.rateLimiter.wait();\n\n    const signedOptions = await this.authService.signRequest(options);\n    const url = new URL(signedOptions.url);\n\n    if (signedOptions.params) {\n      Object.entries(signedOptions.params).forEach(([key, value]) => {\n        if (value !== undefined && value !== null) {\n          url.searchParams.set(key, String(value));\n        }\n      });\n    }\n\n    const isFormData = signedOptions.data instanceof FormData;\n\n    const requestInit: RequestInit = {\n      method: signedOptions.method,\n      headers: {\n        'User-Agent': 'x-ads-sdk/0.1.0',\n        ...signedOptions.headers,\n      },\n      signal: AbortSignal.timeout(signedOptions.timeout || this.timeout),\n    };\n\n    // Don't set Content-Type for FormData, let the browser set it with boundary\n    if (!isFormData) {\n      (requestInit.headers as Record<string, string>)['Content-Type'] = 'application/json';\n    }\n\n    if (signedOptions.data && ['POST', 'PUT'].includes(signedOptions.method)) {\n      if (isFormData) {\n        requestInit.body = signedOptions.data as BodyInit;\n      } else {\n        requestInit.body = JSON.stringify(signedOptions.data);\n      }\n    }\n\n    if (this.context.debug) {\n      console.log('X Ads SDK Request:', {\n        method: signedOptions.method,\n        url: url.toString(),\n        headers: requestInit.headers,\n        body: isFormData ? '[FormData]' : requestInit.body,\n      });\n    }\n\n    try {\n      const response = await fetch(url.toString(), requestInit);\n\n      if (this.context.debug) {\n        console.log('X Ads SDK Response:', {\n          status: response.status,\n          statusText: response.statusText,\n          headers: Object.fromEntries(response.headers.entries()),\n        });\n      }\n\n      const responseText = await response.text();\n      let responseData: unknown;\n\n      try {\n        responseData = responseText ? JSON.parse(responseText) : null;\n      } catch {\n        responseData = { raw: responseText };\n      }\n\n      if (!response.ok) {\n        await this.handleErrorResponse(response, responseData);\n      }\n\n      return responseData as T;\n    } catch (error) {\n      if (error instanceof XAdsError) {\n        throw error;\n      }\n\n      if (error instanceof TypeError && error.message.includes('fetch')) {\n        throw new NetworkError('Network request failed', error.message);\n      }\n\n      if (error instanceof Error && error.name === 'AbortError') {\n        throw new NetworkError('Request timeout', `Request exceeded ${this.timeout}ms`);\n      }\n\n      throw new NetworkError(\n        'Unknown network error',\n        error instanceof Error ? error.message : String(error)\n      );\n    }\n  }\n\n  private async handleErrorResponse(response: Response, responseData: unknown): Promise<never> {\n    const status = response.status;\n\n    if (status === 401) {\n      throw new AuthenticationError(\n        'Authentication failed',\n        this.extractErrorMessage(responseData)\n      );\n    }\n\n    if (status === 429) {\n      const retryAfter = this.extractRetryAfter(response);\n      throw new RateLimitError(\n        'Rate limit exceeded',\n        retryAfter,\n        this.extractErrorMessage(responseData)\n      );\n    }\n\n    if (status >= 400 && status < 500) {\n      const errors = this.extractAPIErrors(responseData);\n      if (errors.length > 0) {\n        const firstError = errors[0];\n        throw new ValidationError(firstError.message, firstError.parameter, firstError.details);\n      }\n      throw new ValidationError(`Client error: ${status}`, undefined, response.statusText);\n    }\n\n    if (status >= 500) {\n      throw new NetworkError('Server error', `HTTP ${status}: ${response.statusText}`);\n    }\n\n    throw new XAdsError(\n      'UNKNOWN_ERROR',\n      `HTTP ${status}: ${response.statusText}`,\n      this.extractErrorMessage(responseData)\n    );\n  }\n\n  private extractRetryAfter(response: Response): number {\n    const retryAfter = response.headers.get('Retry-After');\n    if (retryAfter) {\n      const seconds = parseInt(retryAfter, 10);\n      return Number.isNaN(seconds) ? 60 : seconds;\n    }\n\n    const resetTime = response.headers.get('X-Rate-Limit-Reset');\n    if (resetTime) {\n      const resetTimestamp = parseInt(resetTime, 10);\n      const now = Math.floor(Date.now() / 1000);\n      return Math.max(0, resetTimestamp - now);\n    }\n\n    return 60;\n  }\n\n  private extractErrorMessage(responseData: unknown): string {\n    if (this.isErrorResponseData(responseData)) {\n      if (Array.isArray(responseData.errors) && responseData.errors.length > 0) {\n        const firstError = responseData.errors[0];\n        if (\n          firstError &&\n          typeof firstError === 'object' &&\n          'message' in firstError &&\n          typeof firstError.message === 'string'\n        ) {\n          return firstError.message || 'Unknown error';\n        }\n      }\n\n      if (typeof responseData.message === 'string') {\n        return responseData.message;\n      }\n\n      if (typeof responseData.error === 'string') {\n        return responseData.error;\n      }\n    }\n\n    return 'Unknown error';\n  }\n\n  private isErrorResponseData(data: unknown): data is {\n    errors?: unknown[];\n    message?: string;\n    error?: string;\n  } {\n    return typeof data === 'object' && data !== null;\n  }\n\n  private extractAPIErrors(responseData: unknown): APIError[] {\n    if (this.isErrorResponseData(responseData) && Array.isArray(responseData.errors)) {\n      return responseData.errors.map((error: unknown) => {\n        if (this.isAPIErrorData(error)) {\n          return {\n            code: error.code || 'UNKNOWN_ERROR',\n            message: error.message || 'Unknown error',\n            parameter: error.parameter,\n            details: error.details,\n          };\n        }\n        return {\n          code: 'UNKNOWN_ERROR',\n          message: 'Unknown error',\n        };\n      });\n    }\n\n    return [];\n  }\n\n  private isAPIErrorData(data: unknown): data is {\n    code?: string;\n    message?: string;\n    parameter?: string;\n    details?: string;\n  } {\n    return typeof data === 'object' && data !== null;\n  }\n\n  public updateTimeout(timeout: number): void {\n    if (timeout <= 0 || timeout > 300000) {\n      throw new ValidationError('Timeout must be between 1ms and 300000ms (5 minutes)');\n    }\n    this.timeout = timeout;\n  }\n\n  public updateContext(context: AuthenticationContext): void {\n    this.context = context;\n  }\n}\n","export class RateLimiter {\n  private tokens: number;\n  private lastRefill: number;\n  private readonly maxTokens: number;\n  private readonly refillRate: number;\n  private readonly refillInterval: number;\n  private waitQueue: Array<{\n    resolve: () => void;\n    timestamp: number;\n  }> = [];\n\n  constructor(\n    maxTokens: number = 300,\n    refillRate: number = 300,\n    refillIntervalMs: number = 900000\n  ) {\n    this.maxTokens = maxTokens;\n    this.refillRate = refillRate;\n    this.refillInterval = refillIntervalMs;\n    this.tokens = maxTokens;\n    this.lastRefill = Date.now();\n  }\n\n  public async wait(): Promise<void> {\n    this.refillTokens();\n\n    if (this.tokens > 0) {\n      this.tokens--;\n      return Promise.resolve();\n    }\n\n    return new Promise<void>((resolve) => {\n      this.waitQueue.push({\n        resolve,\n        timestamp: Date.now(),\n      });\n      this.scheduleNextRelease();\n    });\n  }\n\n  private refillTokens(): void {\n    const now = Date.now();\n    const timePassed = now - this.lastRefill;\n\n    if (timePassed >= this.refillInterval) {\n      const periods = Math.floor(timePassed / this.refillInterval);\n      const tokensToAdd = periods * this.refillRate;\n      this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);\n      this.lastRefill = now - (timePassed % this.refillInterval);\n    }\n\n    this.processWaitQueue();\n  }\n\n  private processWaitQueue(): void {\n    while (this.waitQueue.length > 0 && this.tokens > 0) {\n      const waiter = this.waitQueue.shift();\n      if (waiter) {\n        this.tokens--;\n        waiter.resolve();\n      }\n    }\n  }\n\n  private scheduleNextRelease(): void {\n    if (this.waitQueue.length === 0) return;\n\n    const timeToNextRefill = this.refillInterval - (Date.now() - this.lastRefill);\n    const delayMs = Math.max(100, timeToNextRefill);\n\n    setTimeout(() => {\n      this.refillTokens();\n      if (this.waitQueue.length > 0 && this.tokens === 0) {\n        this.scheduleNextRelease();\n      }\n    }, delayMs);\n  }\n\n  public getStatus(): {\n    tokens: number;\n    maxTokens: number;\n    queueLength: number;\n    nextRefillIn: number;\n  } {\n    const nextRefillIn = Math.max(0, this.refillInterval - (Date.now() - this.lastRefill));\n    return {\n      tokens: this.tokens,\n      maxTokens: this.maxTokens,\n      queueLength: this.waitQueue.length,\n      nextRefillIn,\n    };\n  }\n\n  public reset(): void {\n    this.tokens = this.maxTokens;\n    this.lastRefill = Date.now();\n\n    while (this.waitQueue.length > 0) {\n      const waiter = this.waitQueue.shift();\n      if (waiter) {\n        waiter.resolve();\n      }\n    }\n  }\n\n  public setBuffer(bufferRatio: number): void {\n    if (bufferRatio < 0 || bufferRatio > 1) {\n      throw new Error('Buffer ratio must be between 0 and 1');\n    }\n\n    this.tokens = Math.floor(this.tokens * (1 - bufferRatio));\n  }\n}\n","import type { OAuthCredentials, RequestOptions } from '../types';\n\ninterface OAuthParams {\n  oauth_consumer_key: string;\n  oauth_nonce: string;\n  oauth_signature_method: string;\n  oauth_timestamp: string;\n  oauth_token: string;\n  oauth_version: string;\n  oauth_signature: string;\n}\n\nexport class OAuthService {\n  private credentials: OAuthCredentials;\n\n  constructor(credentials: OAuthCredentials) {\n    this.credentials = credentials;\n  }\n\n  public async signRequest(requestOptions: RequestOptions): Promise<RequestOptions> {\n    const authHeader = await this.getAuthorizationHeader(requestOptions);\n\n    return {\n      ...requestOptions,\n      headers: {\n        ...requestOptions.headers,\n        Authorization: authHeader,\n      },\n    };\n  }\n\n  public async getAuthorizationHeader(requestOptions: RequestOptions): Promise<string> {\n    const oauthParams: Omit<OAuthParams, 'oauth_signature'> = {\n      oauth_consumer_key: this.credentials.consumerKey,\n      oauth_nonce: this.generateNonce(),\n      oauth_signature_method: 'HMAC-SHA1',\n      oauth_timestamp: Math.floor(Date.now() / 1000).toString(),\n      oauth_token: this.credentials.accessToken,\n      oauth_version: '1.0',\n    };\n\n    const signature = await this.generateSignature(requestOptions.method, requestOptions.url, {\n      ...oauthParams,\n      ...(requestOptions.params || {}),\n    });\n\n    const fullOAuthParams: OAuthParams = {\n      ...oauthParams,\n      oauth_signature: signature,\n    };\n\n    return this.buildAuthorizationHeader(fullOAuthParams);\n  }\n\n  public validateCredentials(): void {\n    if (!this.credentials.consumerKey) {\n      throw new Error('Consumer key is required');\n    }\n    if (!this.credentials.consumerSecret) {\n      throw new Error('Consumer secret is required');\n    }\n    if (!this.credentials.accessToken) {\n      throw new Error('Access token is required');\n    }\n    if (!this.credentials.accessTokenSecret) {\n      throw new Error('Access token secret is required');\n    }\n\n    if (!/^[a-zA-Z0-9\\-_]+$/.test(this.credentials.accessToken)) {\n      throw new Error('Invalid token format');\n    }\n  }\n\n  public updateCredentials(newCredentials: OAuthCredentials): void {\n    this.credentials = newCredentials;\n  }\n\n  private generateNonce(): string {\n    const array = new Uint8Array(32);\n    crypto.getRandomValues(array);\n    return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');\n  }\n\n  private percentEncode(value: string): string {\n    return encodeURIComponent(value).replace(\n      /[!'()*]/g,\n      (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`\n    );\n  }\n\n  private buildAuthorizationHeader(oauthParams: OAuthParams): string {\n    const headerParams = Object.entries(oauthParams)\n      .map(([key, value]) => `${key}=\"${this.percentEncode(value)}\"`)\n      .join(', ');\n\n    return `OAuth ${headerParams}`;\n  }\n\n  private async generateSignature(\n    method: string,\n    url: string,\n    params: Record<string, unknown>\n  ): Promise<string> {\n    const normalizedParams = this.normalizeParams(params);\n    const baseString = this.createSignatureBaseString(method, url, normalizedParams);\n    const signingKey = this.createSigningKey();\n\n    return this.hmacSha1(baseString, signingKey);\n  }\n\n  private normalizeParams(params: Record<string, unknown>): string {\n    const encodedParams = Object.entries(params)\n      .filter(([_, value]) => value !== undefined && value !== null)\n      .map(([key, value]) => [this.percentEncode(key), this.percentEncode(String(value))])\n      .sort(([a], [b]) => a.localeCompare(b))\n      .map(([key, value]) => `${key}=${value}`)\n      .join('&');\n\n    return encodedParams;\n  }\n\n  private createSignatureBaseString(method: string, url: string, normalizedParams: string): string {\n    const baseUrl = url.split('?')[0];\n    return [\n      method.toUpperCase(),\n      this.percentEncode(baseUrl),\n      this.percentEncode(normalizedParams),\n    ].join('&');\n  }\n\n  private createSigningKey(): string {\n    return [\n      this.percentEncode(this.credentials.consumerSecret),\n      this.percentEncode(this.credentials.accessTokenSecret),\n    ].join('&');\n  }\n\n  private async hmacSha1(data: string, key: string): Promise<string> {\n    const encoder = new TextEncoder();\n    const keyData = encoder.encode(key);\n    const dataToSign = encoder.encode(data);\n\n    const cryptoKey = await crypto.subtle.importKey(\n      'raw',\n      keyData,\n      { name: 'HMAC', hash: 'SHA-1' },\n      false,\n      ['sign']\n    );\n\n    const signature = await crypto.subtle.sign('HMAC', cryptoKey, dataToSign);\n\n    // Convert to base64\n    const signatureArray = new Uint8Array(signature);\n    let binary = '';\n    for (let i = 0; i < signatureArray.byteLength; i++) {\n      binary += String.fromCharCode(signatureArray[i]);\n    }\n    return btoa(binary);\n  }\n}\n","import type { QueryParams } from '../types';\n\n/**\n * Validates that all required fields are present in the data object\n */\nexport function validateRequired<T extends Record<string, unknown>>(\n  data: T,\n  requiredFields: string[]\n): void {\n  const missingFields = requiredFields.filter(\n    (field) => data[field] === undefined || data[field] === null || data[field] === ''\n  );\n\n  if (missingFields.length > 0) {\n    throw new Error(`Missing required fields: ${missingFields.join(', ')}`);\n  }\n}\n\n/**\n * Validates a date range for API requests\n */\nexport function validateDateRange(startTime: string, endTime: string): void {\n  const start = new Date(startTime);\n  const end = new Date(endTime);\n\n  if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) {\n    throw new Error('Invalid date format. Use ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)');\n  }\n\n  if (start >= end) {\n    throw new Error('Date range is invalid: start time must be before end time');\n  }\n\n  const now = new Date();\n  if (start > now) {\n    throw new Error('Start time cannot be in the future');\n  }\n\n  const maxRangeMs = 365 * 24 * 60 * 60 * 1000;\n  if (end.getTime() - start.getTime() > maxRangeMs) {\n    throw new Error('Date range exceeds maximum allowed period (365 days)');\n  }\n}\n\n/**\n * Validates budget amount in micro currency units\n */\nexport function validateBudget(amount: number, minAmount: number = 50000000): void {\n  if (!Number.isInteger(amount) || amount < minAmount) {\n    throw new Error(`Budget amount must be at least ${minAmount} micro currency units`);\n  }\n}\n\n/**\n * Validates string length\n */\nexport function validateStringLength(value: string, field: string, maxLength: number = 280): void {\n  if (value.length > maxLength) {\n    throw new Error(`${field} cannot exceed ${maxLength} characters`);\n  }\n}\n\n/**\n * Removes undefined and null values from parameters\n */\nexport function sanitizeParams<T extends Record<string, unknown>>(params: T): T {\n  const sanitized = { ...params };\n\n  Object.keys(sanitized).forEach((key) => {\n    if (sanitized[key] === undefined || sanitized[key] === null) {\n      delete sanitized[key];\n    }\n  });\n\n  return sanitized;\n}\n\n/**\n * Builds query string from parameters object\n */\nexport function buildQueryString(params: QueryParams): string {\n  const filteredParams = Object.entries(params).filter(\n    ([_, value]) => value !== undefined && value !== null\n  );\n\n  if (filteredParams.length === 0) return '';\n\n  const searchParams = new URLSearchParams();\n  for (const [key, value] of filteredParams) {\n    if (Array.isArray(value)) {\n      for (const item of value) {\n        searchParams.append(key, String(item));\n      }\n    } else {\n      searchParams.set(key, String(value));\n    }\n  }\n\n  return `?${searchParams.toString()}`;\n}\n","import { BaseClient } from '../client/base-client';\nimport type {\n  AccountListResponse,\n  AdsAccount,\n  BaseResponse,\n  FundingInstrument,\n  FundingInstrumentListResponse,\n} from '../types';\nimport { validateRequired } from '../utils/validation';\n\nexport class AccountsClient extends BaseClient {\n  public async list(): Promise<AccountListResponse> {\n    return this.getList<AdsAccount>('/accounts');\n  }\n\n  public async getAccount(accountId: string): Promise<BaseResponse<AdsAccount>> {\n    validateRequired({ accountId }, ['accountId']);\n    return this.get<AdsAccount>(`/accounts/${accountId}`);\n  }\n}\n\nexport class FundingInstrumentsClient extends BaseClient {\n  public async list(accountId: string): Promise<FundingInstrumentListResponse> {\n    validateRequired({ accountId }, ['accountId']);\n    return this.getList<FundingInstrument>(`/accounts/${accountId}/funding_instruments`);\n  }\n\n  public async getFundingInstrument(\n    accountId: string,\n    fundingInstrumentId: string\n  ): Promise<BaseResponse<FundingInstrument>> {\n    validateRequired({ accountId, fundingInstrumentId }, ['accountId', 'fundingInstrumentId']);\n    return this.get<FundingInstrument>(\n      `/accounts/${accountId}/funding_instruments/${fundingInstrumentId}`\n    );\n  }\n}\n","import { BaseClient } from '../client/base-client';\nimport type {\n  AnalyticsJobListOptions,\n  AnalyticsRequest,\n  AnalyticsResponse,\n  AsyncAnalyticsJob,\n  AsyncAnalyticsJobListResponse,\n  AsyncAnalyticsJobResponse,\n} from '../types';\nimport { sanitizeParams, validateDateRange, validateRequired } from '../utils/validation';\n\nexport class AnalyticsClient extends BaseClient {\n  public async getStats(accountId: string, request: AnalyticsRequest): Promise<AnalyticsResponse> {\n    validateRequired(request, [\n      'entity',\n      'entity_ids',\n      'start_time',\n      'end_time',\n      'granularity',\n      'placement',\n      'metrics',\n    ]);\n    validateDateRange(request.start_time, request.end_time);\n\n    if (request.entity_ids.length === 0) {\n      throw new Error('At least one entity ID is required');\n    }\n\n    if (request.metrics.length === 0) {\n      throw new Error('At least one metric is required');\n    }\n\n    this.validateEntityGranularityCompatibility(request.entity, request.granularity);\n\n    const sanitizedParams = sanitizeParams(request) as import('../types').QueryParams;\n    return this.get<AnalyticsResponse>(\n      `/stats/accounts/${accountId}`,\n      sanitizedParams\n    ) as unknown as Promise<AnalyticsResponse>;\n  }\n\n  public async createJob(\n    accountId: string,\n    request: AnalyticsRequest\n  ): Promise<AsyncAnalyticsJobResponse> {\n    validateRequired(request, [\n      'entity',\n      'entity_ids',\n      'start_time',\n      'end_time',\n      'granularity',\n      'placement',\n      'metrics',\n    ]);\n    validateDateRange(request.start_time, request.end_time);\n\n    const startDate = new Date(request.start_time);\n    const endDate = new Date(request.end_time);\n    const daysDiff = Math.ceil((endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24));\n\n    if (daysDiff > 365) {\n      throw new Error('Date range exceeds maximum allowed period for async jobs (365 days)');\n    }\n\n    const sanitizedData = sanitizeParams(request) as import('../types').RequestData;\n    return this.post<AsyncAnalyticsJob>(`/stats/jobs/accounts/${accountId}`, sanitizedData);\n  }\n\n  public async getJob(accountId: string, jobId: string): Promise<AsyncAnalyticsJobResponse> {\n    return this.get<AsyncAnalyticsJob>(`/stats/jobs/accounts/${accountId}/${jobId}`);\n  }\n\n  public async listJobs(\n    accountId: string,\n    options?: AnalyticsJobListOptions\n  ): Promise<AsyncAnalyticsJobListResponse> {\n    const params = options ? (sanitizeParams(options) as import('../types').QueryParams) : {};\n    return this.getList<AsyncAnalyticsJob>(`/stats/jobs/accounts/${accountId}`, params);\n  }\n\n  private validateEntityGranularityCompatibility(entity: string, granularity: string): void {\n    if (entity === 'ACCOUNT' && granularity === 'HOUR') {\n      throw new Error('HOUR granularity is not supported for ACCOUNT entity');\n    }\n  }\n}\n","import { BaseClient } from '../client/base-client';\nimport type {\n  Campaign,\n  CampaignCreateData,\n  CampaignListOptions,\n  CampaignListResponse,\n  CampaignResponse,\n  CampaignUpdateData,\n} from '../types';\nimport {\n  sanitizeParams,\n  validateBudget,\n  validateDateRange,\n  validateRequired,\n  validateStringLength,\n} from '../utils/validation';\n\nexport class CampaignsClient extends BaseClient {\n  public async create(accountId: string, data: CampaignCreateData): Promise<CampaignResponse> {\n    validateRequired(data, ['name', 'funding_instrument_id', 'start_time']);\n    validateStringLength(data.name, 'Campaign name');\n\n    if (data.daily_budget_amount_local_micro) {\n      validateBudget(data.daily_budget_amount_local_micro);\n    }\n\n    if (data.total_budget_amount_local_micro) {\n      validateBudget(data.total_budget_amount_local_micro);\n    }\n\n    if (data.end_time) {\n      validateDateRange(data.start_time, data.end_time);\n    }\n\n    const sanitizedData = sanitizeParams(data);\n    return this.post<Campaign>(`/accounts/${accountId}/campaigns`, sanitizedData);\n  }\n\n  public async list(\n    accountId: string,\n    options?: CampaignListOptions\n  ): Promise<CampaignListResponse> {\n    const params = options ? sanitizeParams(options) : {};\n    return this.getList<Campaign>(`/accounts/${accountId}/campaigns`, params);\n  }\n\n  public async getCampaign(accountId: string, campaignId: string): Promise<CampaignResponse> {\n    return this.get<Campaign>(`/accounts/${accountId}/campaigns/${campaignId}`);\n  }\n\n  public async update(\n    accountId: string,\n    campaignId: string,\n    data: CampaignUpdateData\n  ): Promise<CampaignResponse> {\n    if (data.name) {\n      validateStringLength(data.name, 'Campaign name');\n    }\n\n    if (data.daily_budget_amount_local_micro !== undefined) {\n      validateBudget(data.daily_budget_amount_local_micro);\n    }\n\n    if (data.total_budget_amount_local_micro !== undefined) {\n      validateBudget(data.total_budget_amount_local_micro);\n    }\n\n    if (data.start_time && data.end_time) {\n      validateDateRange(data.start_time, data.end_time);\n    }\n\n    const sanitizedData = sanitizeParams(data);\n    return this.put<Campaign>(`/accounts/${accountId}/campaigns/${campaignId}`, sanitizedData);\n  }\n\n  public async delete(accountId: string, campaignId: string): Promise<CampaignResponse> {\n    return this.deleteRequest<Campaign>(`/accounts/${accountId}/campaigns/${campaignId}`);\n  }\n}\n","import { BaseClient } from '../client/base-client';\nimport type {\n  LineItem,\n  LineItemCreateData,\n  LineItemListOptions,\n  LineItemListResponse,\n  LineItemResponse,\n  LineItemUpdateData,\n} from '../types';\nimport {\n  sanitizeParams,\n  validateBudget,\n  validateDateRange,\n  validateRequired,\n  validateStringLength,\n} from '../utils/validation';\n\nexport class LineItemsClient extends BaseClient {\n  public async create(accountId: string, data: LineItemCreateData): Promise<LineItemResponse> {\n    validateRequired(data, [\n      'name',\n      'campaign_id',\n      'objective',\n      'product_type',\n      'bid_unit',\n      'start_time',\n    ]);\n    validateStringLength(data.name, 'Line item name');\n\n    if (!data.automatically_select_bid && !data.bid_amount_local_micro) {\n      throw new Error('bid_amount_local_micro is required when automatically_select_bid is false');\n    }\n\n    if (data.bid_amount_local_micro) {\n      validateBudget(data.bid_amount_local_micro, 1000000);\n    }\n\n    if (data.end_time) {\n      validateDateRange(data.start_time, data.end_time);\n    }\n\n    this.validateObjectiveProductTypeCompatibility(data.objective, data.product_type);\n\n    const sanitizedData = sanitizeParams(data);\n    return this.post<LineItem>(`/accounts/${accountId}/line_items`, sanitizedData);\n  }\n\n  public async list(\n    accountId: string,\n    options?: LineItemListOptions\n  ): Promise<LineItemListResponse> {\n    const params = options ? sanitizeParams(options) : {};\n    return this.getList<LineItem>(`/accounts/${accountId}/line_items`, params);\n  }\n\n  public async getLineItem(accountId: string, lineItemId: string): Promise<LineItemResponse> {\n    return this.get<LineItem>(`/accounts/${accountId}/line_items/${lineItemId}`);\n  }\n\n  public async update(\n    accountId: string,\n    lineItemId: string,\n    data: LineItemUpdateData\n  ): Promise<LineItemResponse> {\n    if (data.name) {\n      validateStringLength(data.name, 'Line item name');\n    }\n\n    if (data.bid_amount_local_micro !== undefined) {\n      validateBudget(data.bid_amount_local_micro, 1000000);\n    }\n\n    if (data.start_time && data.end_time) {\n      validateDateRange(data.start_time, data.end_time);\n    }\n\n    const sanitizedData = sanitizeParams(data);\n    return this.put<LineItem>(`/accounts/${accountId}/line_items/${lineItemId}`, sanitizedData);\n  }\n\n  public async delete(accountId: string, lineItemId: string): Promise<LineItemResponse> {\n    return this.deleteRequest<LineItem>(`/accounts/${accountId}/line_items/${lineItemId}`);\n  }\n\n  private validateObjectiveProductTypeCompatibility(\n    objective: LineItem['objective'],\n    productType: LineItem['product_type']\n  ): void {\n    const incompatibleCombinations: Array<[LineItem['objective'], LineItem['product_type']]> = [\n      ['APP_INSTALLS', 'PROMOTED_ACCOUNT'],\n      ['APP_CLICKS', 'PROMOTED_ACCOUNT'],\n      ['FOLLOWERS', 'PROMOTED_TWEETS'],\n    ];\n\n    const isIncompatible = incompatibleCombinations.some(\n      ([obj, prod]) => obj === objective && prod === productType\n    );\n\n    if (isIncompatible) {\n      throw new Error(\n        `Objective '${objective}' is not compatible with product type '${productType}'`\n      );\n    }\n  }\n}\n","import { BaseClient } from '../client/base-client';\nimport type {\n  MediaLibrary,\n  MediaListOptions,\n  MediaListResponse,\n  MediaResponse,\n  MediaUploadData,\n} from '../types';\nimport { sanitizeParams, validateRequired, validateStringLength } from '../utils/validation';\n\nexport class MediaClient extends BaseClient {\n  public async upload(accountId: string, data: MediaUploadData): Promise<MediaResponse> {\n    validateRequired({ accountId }, ['accountId']);\n    validateRequired(data, ['file', 'media_category']);\n\n    if (data.name) {\n      validateStringLength(data.name, 'Media name');\n    }\n\n    const formData = new FormData();\n\n    if (typeof data.file === 'string') {\n      throw new Error('File path uploads not supported in browser environment');\n    }\n\n    formData.append('media', data.file);\n    formData.append('media_category', data.media_category);\n\n    if (data.name) {\n      formData.append('name', data.name);\n    }\n\n    return this.post<MediaLibrary>(`/accounts/${accountId}/media_library`, formData);\n  }\n\n  public async list(accountId: string, options?: MediaListOptions): Promise<MediaListResponse> {\n    validateRequired({ accountId }, ['accountId']);\n    const params = options ? sanitizeParams(options) : {};\n    return this.getList<MediaLibrary>(`/accounts/${accountId}/media_library`, params);\n  }\n\n  public async getMedia(accountId: string, mediaId: string): Promise<MediaResponse> {\n    validateRequired({ accountId, mediaId }, ['accountId', 'mediaId']);\n    return this.get<MediaLibrary>(`/accounts/${accountId}/media_library/${mediaId}`);\n  }\n\n  public async delete(accountId: string, mediaId: string): Promise<MediaResponse> {\n    validateRequired({ accountId, mediaId }, ['accountId', 'mediaId']);\n    return this.deleteRequest<MediaLibrary>(`/accounts/${accountId}/media_library/${mediaId}`);\n  }\n}\n","import { BaseClient } from '../client/base-client';\nimport type {\n  TailoredAudience,\n  TailoredAudienceListResponse,\n  TailoredAudienceResponse,\n  TargetingCriteria,\n  TargetingCriteriaCreateData,\n  TargetingCriteriaListOptions,\n  TargetingCriteriaListResponse,\n  TargetingCriteriaOptionsResponse,\n  TargetingCriteriaResponse,\n} from '../types';\nimport { sanitizeParams, validateRequired, validateStringLength } from '../utils/validation';\n\nexport class TargetingClient extends BaseClient {\n  public async create(\n    accountId: string,\n    lineItemId: string,\n    data: TargetingCriteriaCreateData\n  ): Promise<TargetingCriteriaResponse> {\n    validateRequired({ accountId, lineItemId }, ['accountId', 'lineItemId']);\n    validateRequired(data, ['line_item_id', 'targeting_type', 'targeting_value']);\n\n    if (data.name) {\n      validateStringLength(data.name, 'Targeting criteria name');\n    }\n\n    const sanitizedData = sanitizeParams({ ...data, line_item_id: lineItemId });\n    return this.post<TargetingCriteria>(`/accounts/${accountId}/targeting_criteria`, sanitizedData);\n  }\n\n  public async list(\n    accountId: string,\n    options?: TargetingCriteriaListOptions\n  ): Promise<TargetingCriteriaListResponse> {\n    validateRequired({ accountId }, ['accountId']);\n    const params = options ? sanitizeParams(options) : {};\n    return this.getList<TargetingCriteria>(`/accounts/${accountId}/targeting_criteria`, params);\n  }\n\n  public async delete(\n    accountId: string,\n    targetingCriteriaId: string\n  ): Promise<TargetingCriteriaResponse> {\n    validateRequired({ accountId, targetingCriteriaId }, ['accountId', 'targetingCriteriaId']);\n    return this.deleteRequest<TargetingCriteria>(\n      `/accounts/${accountId}/targeting_criteria/${targetingCriteriaId}`\n    );\n  }\n\n  public async getCriteria(_accountId: string): Promise<TargetingCriteriaOptionsResponse> {\n    return this.get<import('../types').BaseResponse<TargetingCriteriaOptionsResponse>>(\n      `/targeting_criteria/locations`\n    ) as Promise<TargetingCriteriaOptionsResponse>;\n  }\n\n  public async getTailoredAudiences(accountId: string): Promise<TailoredAudienceListResponse> {\n    validateRequired({ accountId }, ['accountId']);\n    return this.getList<TailoredAudience>(`/accounts/${accountId}/tailored_audiences`);\n  }\n\n  public async getTailoredAudience(\n    accountId: string,\n    audienceId: string\n  ): Promise<TailoredAudienceResponse> {\n    validateRequired({ accountId, audienceId }, ['accountId', 'audienceId']);\n    return this.get<TailoredAudience>(`/accounts/${accountId}/tailored_audiences/${audienceId}`);\n  }\n}\n","export interface OAuthCredentials {\n  consumerKey: string;\n  consumerSecret: string;\n  accessToken: string;\n  accessTokenSecret: string;\n}\n\nexport interface SDKConfig {\n  credentials: OAuthCredentials;\n  environment: 'sandbox' | 'production';\n  timeout?: number;\n  rateLimitBuffer?: number;\n  debug?: boolean;\n}\n\nexport interface OAuthSignature {\n  oauth_consumer_key: string;\n  oauth_nonce: string;\n  oauth_signature_method: string;\n  oauth_timestamp: string;\n  oauth_token: string;\n  oauth_version: string;\n  oauth_signature: string;\n}\n\nexport interface AuthenticationContext {\n  credentials: OAuthCredentials;\n  environment: 'sandbox' | 'production';\n  baseUrl: string;\n  debug: boolean;\n}\n\nexport const ENVIRONMENTS = {\n  sandbox: 'https://ads-api-sandbox.twitter.com/12',\n  production: 'https://ads-api.twitter.com/12',\n} as const;\n\nexport type Environment = keyof typeof ENVIRONMENTS;\n","import type { OAuthCredentials, SDKConfig } from '../types';\nimport { ENVIRONMENTS } from '../types/auth';\nimport { ValidationError } from '../types/errors';\n\nexport function validateConfig(config: SDKConfig): void {\n  if (!config) {\n    throw new ValidationError('Configuration is required');\n  }\n\n  if (!config.credentials) {\n    throw new ValidationError('Credentials are required');\n  }\n\n  validateCredentials(config.credentials);\n  validateEnvironment(config.environment);\n\n  if (config.timeout !== undefined) {\n    validateTimeout(config.timeout);\n  }\n\n  if (config.rateLimitBuffer !== undefined) {\n    validateRateLimitBuffer(config.rateLimitBuffer);\n  }\n}\n\nfunction validateCredentials(credentials: OAuthCredentials): void {\n  if (!credentials.consumerKey) {\n    throw new ValidationError('Consumer key is required');\n  }\n\n  if (!credentials.consumerSecret) {\n    throw new ValidationError('Consumer secret is required');\n  }\n\n  if (!credentials.accessToken) {\n    throw new ValidationError('Access token is required');\n  }\n\n  if (!credentials.accessTokenSecret) {\n    throw new ValidationError('Access token secret is required');\n  }\n\n  // Reject tokens that contain obvious invalid patterns like \"invalid-token-format\"\n  if (credentials.accessToken.includes('invalid') || credentials.accessToken.length < 10) {\n    throw new ValidationError('Invalid token format');\n  }\n\n  if (\n    credentials.accessTokenSecret.includes('invalid') ||\n    credentials.accessTokenSecret.length < 10\n  ) {\n    throw new ValidationError('Invalid token secret format');\n  }\n}\n\nfunction validateEnvironment(environment: string): void {\n  if (!environment || !['sandbox', 'production'].includes(environment)) {\n    throw new ValidationError('Invalid environment. Must be \"sandbox\" or \"production\"');\n  }\n}\n\nfunction validateTimeout(timeout: number): void {\n  if (!Number.isInteger(timeout) || timeout <= 0) {\n    throw new ValidationError('Timeout must be positive integer');\n  }\n\n  if (timeout >= 300000) {\n    throw new ValidationError('Timeout cannot exceed 300000ms (5 minutes)');\n  }\n}\n\nfunction validateRateLimitBuffer(buffer: number): void {\n  if (typeof buffer !== 'number' || buffer < 0 || buffer > 1) {\n    throw new ValidationError('Rate limit buffer must be between 0 and 1');\n  }\n}\n\nexport class ConfigManager {\n  private config: SDKConfig;\n\n  constructor(config: SDKConfig) {\n    validateConfig(config);\n    this.config = { ...config };\n    this.applyDefaults();\n  }\n\n  public getConfig(): SDKConfig {\n    return { ...this.config };\n  }\n\n  public updateConfig(updates: Partial<SDKConfig>): void {\n    const newConfig = { ...this.config, ...updates };\n    validateConfig(newConfig);\n    this.config = newConfig;\n    this.applyDefaults();\n  }\n\n  public getBaseUrl(): string {\n    return ENVIRONMENTS[this.config.environment];\n  }\n\n  public getTimeout(): number {\n    return this.config.timeout || 60000;\n  }\n\n  public getRateLimitBuffer(): number {\n    return this.config.rateLimitBuffer || 0.1;\n  }\n\n  public isDebugMode(): boolean {\n    return this.config.debug || false;\n  }\n\n  private applyDefaults(): void {\n    this.config.timeout = this.config.timeout || 60000;\n    this.config.rateLimitBuffer = this.config.rateLimitBuffer || 0.1;\n    this.config.debug = this.config.debug || false;\n  }\n}\n","import { OAuthService } from '../auth/oauth';\nimport {\n  AccountsClient,\n  AnalyticsClient,\n  CampaignsClient,\n  FundingInstrumentsClient,\n  LineItemsClient,\n  MediaClient,\n  TargetingClient,\n} from '../resources';\nimport type { AuthenticationContext, Environment, SDKConfig } from '../types';\nimport { ENVIRONMENTS } from '../types/auth';\nimport { ConfigManager } from '../utils/config';\nimport { HttpClient } from './http-client';\nimport { RateLimiter } from './rate-limiter';\n\nexport class XAdsClient {\n  private configManager: ConfigManager;\n  private authService: OAuthService;\n  private rateLimiter: RateLimiter;\n  private httpClient: HttpClient;\n\n  public readonly campaigns: CampaignsClient;\n  public readonly lineItems: LineItemsClient;\n  public readonly analytics: AnalyticsClient;\n  public readonly accounts: AccountsClient;\n  public readonly fundingInstruments: FundingInstrumentsClient;\n  public readonly media: MediaClient;\n  public readonly targeting: TargetingClient;\n\n  constructor(config: SDKConfig) {\n    this.configManager = new ConfigManager(config);\n\n    const validatedConfig = this.configManager.getConfig();\n\n    this.authService = new OAuthService(validatedConfig.credentials);\n    this.authService.validateCredentials();\n\n    this.rateLimiter = new RateLimiter();\n    this.rateLimiter.setBuffer(this.configManager.getRateLimitBuffer());\n\n    const context: AuthenticationContext = {\n      credentials: validatedConfig.credentials,\n      environment: validatedConfig.environment,\n      baseUrl: this.configManager.getBaseUrl(),\n      debug: this.configManager.isDebugMode(),\n    };\n\n    this.httpClient = new HttpClient(\n      this.authService,\n      this.rateLimiter,\n      context,\n      this.configManager.getTimeout()\n    );\n\n    this.campaigns = new CampaignsClient(this.httpClient, context);\n    this.lineItems = new LineItemsClient(this.httpClient, context);\n    this.analytics = new AnalyticsClient(this.httpClient, context);\n    this.accounts = new AccountsClient(this.httpClient, context);\n    this.fundingInstruments = new FundingInstrumentsClient(this.httpClient, context);\n    this.media = new MediaClient(this.httpClient, context);\n    this.targeting = new TargetingClient(this.httpClient, context);\n  }\n\n  public setEnvironment(environment: Environment): void {\n    const currentConfig = this.configManager.getConfig();\n    this.configManager.updateConfig({ ...currentConfig, environment });\n\n    const context: AuthenticationContext = {\n      credentials: currentConfig.credentials,\n      environment,\n      baseUrl: ENVIRONMENTS[environment],\n      debug: this.configManager.isDebugMode(),\n    };\n\n    this.httpClient.updateContext(context);\n  }\n\n  public setDebug(debug: boolean): void {\n    const currentConfig = this.configManager.getConfig();\n    this.configManager.updateConfig({ ...currentConfig, debug });\n\n    const context: AuthenticationContext = {\n      credentials: currentConfig.credentials,\n      environment: currentConfig.environment,\n      baseUrl: this.configManager.getBaseUrl(),\n      debug,\n    };\n\n    this.httpClient.updateContext(context);\n  }\n\n  public setTimeout(timeout: number): void {\n    const currentConfig = this.configManager.getConfig();\n    this.configManager.updateConfig({ ...currentConfig, timeout });\n    this.httpClient.updateTimeout(timeout);\n  }\n\n  public getRateLimitStatus() {\n    return this.rateLimiter.getStatus();\n  }\n\n  public resetRateLimit(): void {\n    this.rateLimiter.reset();\n  }\n}\n"],"names":["BaseClient","http","context","path","params","options","data","XAdsError","code","message","details","parameter","AuthenticationError","RateLimitError","retryAfter","ValidationError","NetworkError","HttpClient","authService","rateLimiter","timeout","signedOptions","url","key","value","isFormData","requestInit","response","responseText","responseData","error","status","errors","firstError","seconds","resetTime","resetTimestamp","now","RateLimiter","maxTokens","refillRate","refillIntervalMs","resolve","timePassed","tokensToAdd","waiter","timeToNextRefill","delayMs","nextRefillIn","bufferRatio","OAuthService","credentials","requestOptions","authHeader","oauthParams","signature","fullOAuthParams","newCredentials","array","byte","char","method","normalizedParams","baseString","signingKey","_","a","b","baseUrl","encoder","keyData","dataToSign","cryptoKey","signatureArray","binary","i","validateRequired","requiredFields","missingFields","field","validateDateRange","startTime","endTime","start","end","maxRangeMs","validateBudget","amount","minAmount","validateStringLength","maxLength","sanitizeParams","sanitized","buildQueryString","filteredParams","searchParams","item","AccountsClient","accountId","FundingInstrumentsClient","fundingInstrumentId","AnalyticsClient","request","sanitizedParams","startDate","endDate","sanitizedData","jobId","entity","granularity","CampaignsClient","campaignId","LineItemsClient","lineItemId","objective","productType","obj","prod","MediaClient","formData","mediaId","TargetingClient","targetingCriteriaId","_accountId","audienceId","ENVIRONMENTS","validateConfig","config","validateCredentials","validateEnvironment","validateTimeout","validateRateLimitBuffer","environment","buffer","ConfigManager","updates","newConfig","XAdsClient","validatedConfig","currentConfig","debug"],"mappings":"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"}