{"version":3,"sources":["../src/exceptions.ts","../src/client.ts"],"names":["cheerio","url"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for GmodStore-related errors\n */\nexport class GmodStoreError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'GmodStoreError';\n    Object.setPrototypeOf(this, GmodStoreError.prototype);\n  }\n}\n\n/**\n * Error raised when an API request fails\n */\nexport class APIError extends GmodStoreError {\n  public readonly statusCode?: number;\n  public readonly response?: string;\n\n  constructor(message: string, statusCode?: number, response?: string) {\n    super(message);\n    this.name = 'APIError';\n    this.statusCode = statusCode;\n    this.response = response;\n    Object.setPrototypeOf(this, APIError.prototype);\n  }\n}\n\n/**\n * Error raised when there's a network-related issue\n */\nexport class NetworkError extends GmodStoreError {\n  public readonly cause?: Error;\n\n  constructor(message: string, cause?: Error) {\n    super(message);\n    this.name = 'NetworkError';\n    this.cause = cause;\n    Object.setPrototypeOf(this, NetworkError.prototype);\n  }\n}\n\n/**\n * Error raised when response data doesn't match expected format\n */\nexport class ValidationError extends GmodStoreError {\n  public readonly data?: any;\n\n  constructor(message: string, data?: any) {\n    super(message);\n    this.name = 'ValidationError';\n    this.data = data;\n    Object.setPrototypeOf(this, ValidationError.prototype);\n  }\n}\n","import type { Job, GetJobsOptions, ClientConfig } from './types';\nimport { APIError, NetworkError, ValidationError } from './exceptions';\nimport * as cheerio from 'cheerio';\n\n/**\n * Client for interacting with the GmodStore API\n * \n * @example\n * ```typescript\n * const client = new GmodStoreClient();\n * const jobs = await client.getJobs({ limit: 10 });\n * console.log(jobs);\n * ```\n */\nexport class GmodStoreClient {\n  private readonly baseUrl: string;\n  private readonly userAgent: string;\n  private readonly timeout: number;\n\n  /**\n   * Create a new GmodStore client\n   * \n   * @param config - Optional configuration\n   */\n  constructor(config: ClientConfig = {}) {\n    this.baseUrl = config.baseUrl ?? 'https://www.gmodstore.com';\n    this.userAgent = config.userAgent ?? 'gmodstore-ts/0.1.0';\n    this.timeout = config.timeout ?? 10000;\n  }\n\n  /**\n   * Fetch job listings from GmodStore\n   * \n   * @param options - Options for fetching jobs\n   * @returns Array of Job objects\n   * @throws {APIError} If the API request fails\n   * @throws {NetworkError} If there's a network error\n   * @throws {ValidationError} If response validation fails\n   * \n   * @example\n   * ```typescript\n   * // Get all jobs\n   * const jobs = await client.getJobs();\n   * \n   * // Get up to 5 jobs\n   * const jobs = await client.getJobs({ limit: 5 });\n   * ```\n   */\n  async getJobs(options: GetJobsOptions = {}): Promise<Job[]> {\n    const { limit } = options;\n\n    try {\n      const url = `${this.baseUrl}/jobmarket/jobs/browse`;\n      \n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n      const response = await fetch(url, {\n        method: 'GET',\n        headers: {\n          'User-Agent': this.userAgent,\n          'Accept': 'text/html',\n        },\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      if (!response.ok) {\n        throw new APIError(\n          `Request failed with status ${response.status}`,\n          response.status,\n          await response.text()\n        );\n      }\n\n      const html = await response.text();\n      const $ = cheerio.load(html);\n      \n      const jobs: Job[] = [];\n      \n      // GmodStore uses: <div class=\"item-listing item-listing--job\">\n      $('.item-listing--job').each((_, element) => {\n        try {\n          const $el = $(element);\n          \n          // Extract job URL and ID\n          const url = $el.find('.item-listing__link').attr('href') || '';\n          const jobId = url.split('/').pop() || '';\n          \n          // Extract title\n          const title = $el.find('.item-listing__name').text().trim();\n          \n          // Extract category and applicants from card body\n          const cardBody = $el.find('.card-body p').text().trim();\n          const parts = cardBody.split(' - ');\n          const category = parts[0] || null;\n          const applicantsText = parts[1] || '';\n          const applications = applicantsText.match(/(\\d+)\\s+applicants?/) \n            ? parseInt(applicantsText.match(/(\\d+)\\s+applicants?/)![1]) \n            : null;\n          \n          // Extract budget\n          const budget = $el.find('.item-listing__bottom__right__price').text().trim() || null;\n          \n          // Extract date (though it's in <v-date-time> component)\n          const dateText = $el.find('v-date-time').attr('time');\n          const createdAt = dateText ? new Date(dateText) : null;\n          \n          if (jobId && title) {\n            jobs.push({\n              id: `gmodstore_${jobId}`,\n              title,\n              url: url.startsWith('http') ? url : `${this.baseUrl}${url}`,\n              source: 'gmodstore',\n              description: null, // Not available in list view\n              budget,\n              category,\n              applications,\n              createdAt,\n            });\n          }\n        } catch (e) {\n          // Skip malformed job entries\n        }\n      });\n\n      if (jobs.length === 0) {\n        throw new ValidationError('No jobs found in HTML response. Page structure may have changed.');\n      }\n\n      return limit ? jobs.slice(0, limit) : jobs;\n\n    } catch (error) {\n      if (error instanceof APIError || error instanceof ValidationError) {\n        throw error;\n      }\n\n      if (error instanceof Error && error.name === 'AbortError') {\n        throw new NetworkError(`Request timeout after ${this.timeout}ms`);\n      }\n\n      throw new NetworkError(\n        `Network error: ${error instanceof Error ? error.message : String(error)}`,\n        error instanceof Error ? error : undefined\n      );\n    }\n  }\n\n  /**\n   * Get a single job by ID\n   * \n   * @param jobId - The job ID\n   * @returns Job object or null if not found\n   * @throws {APIError} If the API request fails\n   * @throws {NetworkError} If there's a network error\n   * \n   * @example\n   * ```typescript\n   * const job = await client.getJobById('gmodstore_12345');\n   * if (job) {\n   *   console.log(job.title);\n   * }\n   * ```\n   */\n  async getJobById(jobId: string): Promise<Job | null> {\n    // Remove source prefix if present\n    const rawId = jobId.replace('gmodstore_', '');\n\n    try {\n      const url = `${this.baseUrl}/jobmarket/jobs/${rawId}`;\n      \n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n      const response = await fetch(url, {\n        method: 'GET',\n        headers: {\n          'User-Agent': this.userAgent,\n          'Accept': 'text/html',\n        },\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeoutId);\n\n      if (response.status === 404) {\n        return null;\n      }\n\n      if (!response.ok) {\n        throw new APIError(\n          `Request failed with status ${response.status}`,\n          response.status,\n          await response.text()\n        );\n      }\n\n      const html = await response.text();\n      const $ = cheerio.load(html);\n      \n      // Try to extract job details from the page\n      const title = $('.job-title, h1.title, .job-header h1').first().text().trim();\n      const description = $('.job-description, .description, .content').first().text().trim() || null;\n      const budget = $('.budget, .price, .job-budget').first().text().trim() || null;\n      const category = $('.category, .job-category').first().text().trim() || null;\n      \n      if (!title) {\n        return null;\n      }\n\n      return {\n        id: `gmodstore_${rawId}`,\n        title,\n        url,\n        source: 'gmodstore',\n        description,\n        budget,\n        category,\n        applications: null,\n        createdAt: null,\n      };\n\n    } catch (error) {\n      if (error instanceof APIError) {\n        throw error;\n      }\n\n      if (error instanceof Error && error.name === 'AbortError') {\n        throw new NetworkError(`Request timeout after ${this.timeout}ms`);\n      }\n\n      throw new NetworkError(\n        `Network error: ${error instanceof Error ? error.message : String(error)}`,\n        error instanceof Error ? error : undefined\n      );\n    }\n  }\n\n\n}\n"]}