@stack0/sdk 0.2.4 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/http-client.ts","../src/mail/client.ts","../src/cdn/client.ts","../src/webdata/client.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * HTTP client for Stack0 API\n * Handles authentication, request/response formatting, and error handling\n */\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class HttpClient {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: HttpClientConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || \"https://api.stack0.dev/v1\";\n }\n\n private getHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n };\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.getHeaders(),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = await response.json();\n return data as T;\n } catch (error) {\n if (error instanceof Error && \"statusCode\" in error) {\n throw error; // Re-throw our custom errors\n }\n throw this.createError(\"Network error\", error);\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorBody: { message: string } | undefined;\n try {\n errorBody = (await response.json()) as { message: string };\n } catch {\n errorBody = { message: response.statusText };\n }\n\n const error = new Error(errorBody?.message || `HTTP ${response.status}`) as Error & {\n statusCode: number;\n code: string;\n response: unknown;\n };\n error.statusCode = response.status;\n error.code = (errorBody as unknown as { code: string } | undefined)?.code ?? \"\";\n error.response = errorBody;\n throw error;\n }\n\n private createError(message: string, cause?: unknown): Error {\n const error = new Error(message) as Error & { cause: unknown };\n error.cause = cause;\n return error;\n }\n\n async get<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path);\n }\n\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, body);\n }\n\n async put<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PUT\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","/**\n * Stack0 Mail Client\n * API compatible with Resend for easy migration\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type { SendEmailRequest, SendEmailResponse, GetEmailResponse } from \"./types\";\n\nexport class Mail {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Send an email\n *\n * @example\n * ```typescript\n * const result = await mail.send({\n * from: 'noreply@example.com',\n * to: 'user@example.com',\n * subject: 'Hello World',\n * html: '<p>Welcome!</p>',\n * });\n * ```\n */\n async send(request: SendEmailRequest): Promise<SendEmailResponse> {\n const response = await this.http.post<SendEmailResponse>(\"/mail/send\", request);\n\n // Convert date strings to Date objects if needed\n if (typeof response.createdAt === \"string\") {\n response.createdAt = new Date(response.createdAt);\n }\n\n return response;\n }\n\n /**\n * Get email details by ID\n *\n * @example\n * ```typescript\n * const email = await mail.get('email-id');\n * console.log(email.status); // 'delivered'\n * ```\n */\n async get(id: string): Promise<GetEmailResponse> {\n const response = await this.http.get<GetEmailResponse>(`/mail/${id}`);\n\n // Convert date strings to Date objects\n const dateFields = [\"createdAt\", \"sentAt\", \"deliveredAt\", \"openedAt\", \"clickedAt\", \"bouncedAt\"] as const;\n\n for (const field of dateFields) {\n if (response[field] && typeof response[field] === \"string\") {\n (response[field] as unknown as Date) = new Date(response[field] as string);\n }\n }\n\n return response;\n }\n}\n","/**\n * Stack0 CDN Client\n * Upload, manage, and transform assets\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n Asset,\n UploadUrlRequest,\n UploadUrlResponse,\n ConfirmUploadResponse,\n UpdateAssetRequest,\n DeleteAssetsResponse,\n ListAssetsRequest,\n ListAssetsResponse,\n MoveAssetsRequest,\n MoveAssetsResponse,\n GetTransformUrlRequest,\n GetTransformUrlResponse,\n GetFolderTreeRequest,\n FolderTreeNode,\n CreateFolderRequest,\n Folder,\n} from \"./types\";\n\nexport class CDN {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Generate a presigned URL for uploading a file\n *\n * @example\n * ```typescript\n * const { uploadUrl, assetId } = await cdn.getUploadUrl({\n * projectSlug: 'my-project',\n * filename: 'image.jpg',\n * mimeType: 'image/jpeg',\n * size: 1024 * 1024,\n * });\n *\n * // Upload file to the presigned URL\n * await fetch(uploadUrl, {\n * method: 'PUT',\n * body: file,\n * headers: { 'Content-Type': 'image/jpeg' },\n * });\n *\n * // Confirm the upload\n * const asset = await cdn.confirmUpload(assetId);\n * ```\n */\n async getUploadUrl(request: UploadUrlRequest): Promise<UploadUrlResponse> {\n const response = await this.http.post<UploadUrlResponse>(\"/cdn/assets/upload-url\", request);\n\n if (typeof response.expiresAt === \"string\") {\n response.expiresAt = new Date(response.expiresAt);\n }\n\n return response;\n }\n\n /**\n * Confirm that an upload has completed\n */\n async confirmUpload(assetId: string): Promise<Asset> {\n const response = await this.http.post<ConfirmUploadResponse>(\"/cdn/assets/confirm\", { assetId });\n return this.convertAssetDates(response.asset);\n }\n\n /**\n * Upload a file directly (handles presigned URL flow automatically)\n *\n * @example\n * ```typescript\n * const asset = await cdn.upload({\n * projectSlug: 'my-project',\n * file: fileBuffer,\n * filename: 'image.jpg',\n * mimeType: 'image/jpeg',\n * });\n * ```\n */\n async upload(options: {\n projectSlug: string;\n file: Blob | Buffer | ArrayBuffer;\n filename: string;\n mimeType: string;\n folder?: string;\n metadata?: Record<string, unknown>;\n }): Promise<Asset> {\n const { projectSlug, file, filename, mimeType, folder, metadata } = options;\n\n // Get file size\n let size: number;\n if (file instanceof Blob) {\n size = file.size;\n } else if (file instanceof ArrayBuffer) {\n size = file.byteLength;\n } else {\n // Buffer\n size = (file as Buffer).length;\n }\n\n // Get presigned URL\n const { uploadUrl, assetId } = await this.getUploadUrl({\n projectSlug,\n filename,\n mimeType,\n size,\n folder,\n metadata,\n });\n\n // Upload file\n const uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": mimeType,\n },\n });\n\n if (!uploadResponse.ok) {\n throw new Error(`Upload failed: ${uploadResponse.statusText}`);\n }\n\n // Confirm upload\n return this.confirmUpload(assetId);\n }\n\n /**\n * Get an asset by ID\n *\n * @example\n * ```typescript\n * const asset = await cdn.get('asset-id');\n * console.log(asset.cdnUrl);\n * ```\n */\n async get(id: string): Promise<Asset> {\n const response = await this.http.get<Asset>(`/cdn/assets/${id}`);\n return this.convertAssetDates(response);\n }\n\n /**\n * Update asset metadata\n *\n * @example\n * ```typescript\n * const asset = await cdn.update({\n * id: 'asset-id',\n * alt: 'A beautiful sunset',\n * tags: ['nature', 'sunset'],\n * });\n * ```\n */\n async update(request: UpdateAssetRequest): Promise<Asset> {\n const { id, ...data } = request;\n const response = await this.http.put<Asset>(`/cdn/assets/${id}`, data);\n return this.convertAssetDates(response);\n }\n\n /**\n * Delete an asset\n *\n * @example\n * ```typescript\n * await cdn.delete('asset-id');\n * ```\n */\n async delete(id: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/cdn/assets/${id}`);\n }\n\n /**\n * Delete multiple assets\n *\n * @example\n * ```typescript\n * const result = await cdn.deleteMany(['asset-1', 'asset-2']);\n * console.log(`Deleted ${result.deletedCount} assets`);\n * ```\n */\n async deleteMany(ids: string[]): Promise<DeleteAssetsResponse> {\n return this.http.post<DeleteAssetsResponse>(\"/cdn/assets/delete-many\", { ids });\n }\n\n /**\n * List assets with filters and pagination\n *\n * @example\n * ```typescript\n * const { assets, total, hasMore } = await cdn.list({\n * projectSlug: 'my-project',\n * type: 'image',\n * limit: 20,\n * });\n * ```\n */\n async list(request: ListAssetsRequest): Promise<ListAssetsResponse> {\n const params = new URLSearchParams();\n\n params.set(\"projectSlug\", request.projectSlug);\n if (request.folder !== undefined) params.set(\"folder\", request.folder ?? \"\");\n if (request.type) params.set(\"type\", request.type);\n if (request.status) params.set(\"status\", request.status);\n if (request.search) params.set(\"search\", request.search);\n if (request.tags) params.set(\"tags\", request.tags.join(\",\"));\n if (request.sortBy) params.set(\"sortBy\", request.sortBy);\n if (request.sortOrder) params.set(\"sortOrder\", request.sortOrder);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.offset) params.set(\"offset\", request.offset.toString());\n\n const response = await this.http.get<ListAssetsResponse>(`/cdn/assets?${params.toString()}`);\n\n return {\n ...response,\n assets: response.assets.map((asset) => this.convertAssetDates(asset)),\n };\n }\n\n /**\n * Move assets to a different folder\n *\n * @example\n * ```typescript\n * await cdn.move({\n * assetIds: ['asset-1', 'asset-2'],\n * folder: '/images/archive',\n * });\n * ```\n */\n async move(request: MoveAssetsRequest): Promise<MoveAssetsResponse> {\n return this.http.post<MoveAssetsResponse>(\"/cdn/assets/move\", request);\n }\n\n /**\n * Get a transformed image URL\n *\n * @example\n * ```typescript\n * const { url } = await cdn.getTransformUrl({\n * assetId: 'asset-id',\n * options: {\n * width: 800,\n * height: 600,\n * fit: 'cover',\n * format: 'webp',\n * quality: 80,\n * },\n * });\n * ```\n */\n async getTransformUrl(request: GetTransformUrlRequest): Promise<GetTransformUrlResponse> {\n const params = new URLSearchParams();\n params.set(\"assetId\", request.assetId);\n\n const { options } = request;\n if (options.width) params.set(\"width\", options.width.toString());\n if (options.height) params.set(\"height\", options.height.toString());\n if (options.fit) params.set(\"fit\", options.fit);\n if (options.format) params.set(\"format\", options.format);\n if (options.quality) params.set(\"quality\", options.quality.toString());\n\n return this.http.get<GetTransformUrlResponse>(`/cdn/assets/transform?${params.toString()}`);\n }\n\n /**\n * Get folder tree for navigation\n *\n * @example\n * ```typescript\n * const tree = await cdn.getFolderTree({\n * projectSlug: 'my-project',\n * maxDepth: 3,\n * });\n * ```\n */\n async getFolderTree(request: GetFolderTreeRequest): Promise<FolderTreeNode[]> {\n const params = new URLSearchParams();\n params.set(\"projectSlug\", request.projectSlug);\n if (request.maxDepth) params.set(\"maxDepth\", request.maxDepth.toString());\n\n return this.http.get<FolderTreeNode[]>(`/cdn/folders/tree?${params.toString()}`);\n }\n\n /**\n * Create a new folder\n *\n * @example\n * ```typescript\n * const folder = await cdn.createFolder({\n * projectSlug: 'my-project',\n * name: 'images',\n * });\n * ```\n */\n async createFolder(request: CreateFolderRequest): Promise<Folder> {\n const response = await this.http.post<Folder>(\"/cdn/folders\", request);\n return this.convertFolderDates(response);\n }\n\n /**\n * Delete a folder\n *\n * @example\n * ```typescript\n * await cdn.deleteFolder('folder-id');\n * ```\n */\n async deleteFolder(id: string, deleteContents = false): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (deleteContents) params.set(\"deleteContents\", \"true\");\n\n return this.http.delete<{ success: boolean }>(`/cdn/folders/${id}?${params.toString()}`);\n }\n\n private convertAssetDates(asset: Asset): Asset {\n if (typeof asset.createdAt === \"string\") {\n asset.createdAt = new Date(asset.createdAt);\n }\n if (asset.updatedAt && typeof asset.updatedAt === \"string\") {\n asset.updatedAt = new Date(asset.updatedAt);\n }\n return asset;\n }\n\n private convertFolderDates(folder: Folder): Folder {\n if (typeof folder.createdAt === \"string\") {\n folder.createdAt = new Date(folder.createdAt);\n }\n if (folder.updatedAt && typeof folder.updatedAt === \"string\") {\n folder.updatedAt = new Date(folder.updatedAt);\n }\n return folder;\n }\n}\n","/**\n * Stack0 Webdata Client\n * Capture screenshots and extract data from web pages\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n Screenshot,\n CreateScreenshotRequest,\n CreateScreenshotResponse,\n GetScreenshotRequest,\n ListScreenshotsRequest,\n ListScreenshotsResponse,\n Extraction,\n CreateExtractionRequest,\n CreateExtractionResponse,\n GetExtractionRequest,\n ListExtractionsRequest,\n ListExtractionsResponse,\n Schedule,\n CreateScheduleRequest,\n CreateScheduleResponse,\n UpdateScheduleRequest,\n GetScheduleRequest,\n ListSchedulesRequest,\n ListSchedulesResponse,\n Usage,\n GetUsageRequest,\n BatchJob,\n CreateBatchScreenshotsRequest,\n CreateBatchExtractionsRequest,\n CreateBatchResponse,\n GetBatchJobRequest,\n ListBatchJobsRequest,\n ListBatchJobsResponse,\n} from \"./types\";\n\nexport class Webdata {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n // ==========================================================================\n // SCREENSHOTS\n // ==========================================================================\n\n /**\n * Capture a screenshot of a URL\n *\n * @example\n * ```typescript\n * const { id, status } = await webdata.screenshot({\n * url: 'https://example.com',\n * format: 'png',\n * fullPage: true,\n * deviceType: 'desktop',\n * });\n *\n * // Poll for completion\n * const screenshot = await webdata.getScreenshot({ id });\n * console.log(screenshot.imageUrl);\n * ```\n */\n async screenshot(request: CreateScreenshotRequest): Promise<CreateScreenshotResponse> {\n return this.http.post<CreateScreenshotResponse>(\"/webdata/screenshots\", request);\n }\n\n /**\n * Get a screenshot by ID\n *\n * @example\n * ```typescript\n * const screenshot = await webdata.getScreenshot({ id: 'screenshot-id' });\n * if (screenshot.status === 'completed') {\n * console.log(screenshot.imageUrl);\n * }\n * ```\n */\n async getScreenshot(request: GetScreenshotRequest): Promise<Screenshot> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/screenshots/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<Screenshot>(path);\n return this.convertScreenshotDates(response);\n }\n\n /**\n * List screenshots with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await webdata.listScreenshots({\n * status: 'completed',\n * limit: 20,\n * });\n * ```\n */\n async listScreenshots(request: ListScreenshotsRequest = {}): Promise<ListScreenshotsResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.url) params.set(\"url\", request.url);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListScreenshotsResponse>(\n `/webdata/screenshots${query ? `?${query}` : \"\"}`\n );\n\n return {\n ...response,\n items: response.items.map((item) => this.convertScreenshotDates(item)),\n };\n }\n\n /**\n * Delete a screenshot\n *\n * @example\n * ```typescript\n * await webdata.deleteScreenshot({ id: 'screenshot-id' });\n * ```\n */\n async deleteScreenshot(request: GetScreenshotRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.delete<{ success: boolean }>(\n `/webdata/screenshots/${request.id}${query ? `?${query}` : \"\"}`\n );\n }\n\n /**\n * Capture a screenshot and wait for completion\n *\n * @example\n * ```typescript\n * const screenshot = await webdata.screenshotAndWait({\n * url: 'https://example.com',\n * format: 'png',\n * });\n * console.log(screenshot.imageUrl);\n * ```\n */\n async screenshotAndWait(\n request: CreateScreenshotRequest,\n options: { pollInterval?: number; timeout?: number } = {}\n ): Promise<Screenshot> {\n const { pollInterval = 1000, timeout = 60000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.screenshot(request);\n\n while (Date.now() - startTime < timeout) {\n const screenshot = await this.getScreenshot({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (screenshot.status === \"completed\" || screenshot.status === \"failed\") {\n if (screenshot.status === \"failed\") {\n throw new Error(screenshot.error || \"Screenshot failed\");\n }\n return screenshot;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Screenshot timed out\");\n }\n\n // ==========================================================================\n // EXTRACTIONS\n // ==========================================================================\n\n /**\n * Extract content from a URL\n *\n * @example\n * ```typescript\n * const { id, status } = await webdata.extract({\n * url: 'https://example.com/article',\n * mode: 'markdown',\n * includeMetadata: true,\n * });\n *\n * // Poll for completion\n * const extraction = await webdata.getExtraction({ id });\n * console.log(extraction.markdown);\n * ```\n */\n async extract(request: CreateExtractionRequest): Promise<CreateExtractionResponse> {\n return this.http.post<CreateExtractionResponse>(\"/webdata/extractions\", request);\n }\n\n /**\n * Get an extraction by ID\n *\n * @example\n * ```typescript\n * const extraction = await webdata.getExtraction({ id: 'extraction-id' });\n * if (extraction.status === 'completed') {\n * console.log(extraction.markdown);\n * console.log(extraction.pageMetadata);\n * }\n * ```\n */\n async getExtraction(request: GetExtractionRequest): Promise<Extraction> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/extractions/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<Extraction>(path);\n return this.convertExtractionDates(response);\n }\n\n /**\n * List extractions with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await webdata.listExtractions({\n * status: 'completed',\n * limit: 20,\n * });\n * ```\n */\n async listExtractions(request: ListExtractionsRequest = {}): Promise<ListExtractionsResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.url) params.set(\"url\", request.url);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListExtractionsResponse>(\n `/webdata/extractions${query ? `?${query}` : \"\"}`\n );\n\n return {\n ...response,\n items: response.items.map((item) => this.convertExtractionDates(item)),\n };\n }\n\n /**\n * Delete an extraction\n *\n * @example\n * ```typescript\n * await webdata.deleteExtraction({ id: 'extraction-id' });\n * ```\n */\n async deleteExtraction(request: GetExtractionRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.delete<{ success: boolean }>(\n `/webdata/extractions/${request.id}${query ? `?${query}` : \"\"}`\n );\n }\n\n /**\n * Extract content and wait for completion\n *\n * @example\n * ```typescript\n * const extraction = await webdata.extractAndWait({\n * url: 'https://example.com/article',\n * mode: 'markdown',\n * });\n * console.log(extraction.markdown);\n * ```\n */\n async extractAndWait(\n request: CreateExtractionRequest,\n options: { pollInterval?: number; timeout?: number } = {}\n ): Promise<Extraction> {\n const { pollInterval = 1000, timeout = 60000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.extract(request);\n\n while (Date.now() - startTime < timeout) {\n const extraction = await this.getExtraction({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (extraction.status === \"completed\" || extraction.status === \"failed\") {\n if (extraction.status === \"failed\") {\n throw new Error(extraction.error || \"Extraction failed\");\n }\n return extraction;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Extraction timed out\");\n }\n\n // ==========================================================================\n // SCHEDULES\n // ==========================================================================\n\n /**\n * Create a scheduled screenshot or extraction job\n *\n * @example\n * ```typescript\n * const { id } = await webdata.createSchedule({\n * name: 'Daily homepage screenshot',\n * url: 'https://example.com',\n * type: 'screenshot',\n * frequency: 'daily',\n * config: { format: 'png', fullPage: true },\n * });\n * ```\n */\n async createSchedule(request: CreateScheduleRequest): Promise<CreateScheduleResponse> {\n return this.http.post<CreateScheduleResponse>(\"/webdata/schedules\", request);\n }\n\n /**\n * Update a schedule\n *\n * @example\n * ```typescript\n * await webdata.updateSchedule({\n * id: 'schedule-id',\n * frequency: 'weekly',\n * isActive: false,\n * });\n * ```\n */\n async updateSchedule(request: UpdateScheduleRequest): Promise<{ success: boolean }> {\n const { id, environment, projectId, ...data } = request;\n\n const params = new URLSearchParams();\n if (environment) params.set(\"environment\", environment);\n if (projectId) params.set(\"projectId\", projectId);\n\n const query = params.toString();\n return this.http.post<{ success: boolean }>(\n `/webdata/schedules/${id}${query ? `?${query}` : \"\"}`,\n data\n );\n }\n\n /**\n * Get a schedule by ID\n *\n * @example\n * ```typescript\n * const schedule = await webdata.getSchedule({ id: 'schedule-id' });\n * console.log(schedule.nextRunAt);\n * ```\n */\n async getSchedule(request: GetScheduleRequest): Promise<Schedule> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/schedules/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<Schedule>(path);\n return this.convertScheduleDates(response);\n }\n\n /**\n * List schedules with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await webdata.listSchedules({\n * type: 'screenshot',\n * isActive: true,\n * });\n * ```\n */\n async listSchedules(request: ListSchedulesRequest = {}): Promise<ListSchedulesResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.type) params.set(\"type\", request.type);\n if (request.isActive !== undefined) params.set(\"isActive\", request.isActive.toString());\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListSchedulesResponse>(\n `/webdata/schedules${query ? `?${query}` : \"\"}`\n );\n\n return {\n ...response,\n items: response.items.map((item) => this.convertScheduleDates(item)),\n };\n }\n\n /**\n * Delete a schedule\n *\n * @example\n * ```typescript\n * await webdata.deleteSchedule({ id: 'schedule-id' });\n * ```\n */\n async deleteSchedule(request: GetScheduleRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.delete<{ success: boolean }>(\n `/webdata/schedules/${request.id}${query ? `?${query}` : \"\"}`\n );\n }\n\n /**\n * Toggle a schedule on or off\n *\n * @example\n * ```typescript\n * const { isActive } = await webdata.toggleSchedule({ id: 'schedule-id' });\n * console.log(`Schedule is now ${isActive ? 'active' : 'paused'}`);\n * ```\n */\n async toggleSchedule(request: GetScheduleRequest): Promise<{ isActive: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.post<{ isActive: boolean }>(\n `/webdata/schedules/${request.id}/toggle${query ? `?${query}` : \"\"}`,\n {}\n );\n }\n\n // ==========================================================================\n // USAGE\n // ==========================================================================\n\n /**\n * Get usage statistics\n *\n * @example\n * ```typescript\n * const usage = await webdata.getUsage({\n * periodStart: '2024-01-01T00:00:00Z',\n * periodEnd: '2024-01-31T23:59:59Z',\n * });\n * console.log(`Screenshots: ${usage.screenshotsTotal}`);\n * console.log(`Extractions: ${usage.extractionsTotal}`);\n * ```\n */\n async getUsage(request: GetUsageRequest = {}): Promise<Usage> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.periodStart) params.set(\"periodStart\", request.periodStart);\n if (request.periodEnd) params.set(\"periodEnd\", request.periodEnd);\n\n const query = params.toString();\n const response = await this.http.get<Usage>(\n `/webdata/usage${query ? `?${query}` : \"\"}`\n );\n\n return this.convertUsageDates(response);\n }\n\n // ==========================================================================\n // BATCH JOBS\n // ==========================================================================\n\n /**\n * Create a batch screenshot job for multiple URLs\n *\n * @example\n * ```typescript\n * const { id, totalUrls } = await webdata.batchScreenshots({\n * urls: [\n * 'https://example.com',\n * 'https://example.org',\n * ],\n * config: { format: 'png', fullPage: true },\n * });\n *\n * // Poll for completion\n * const job = await webdata.getBatchJob({ id });\n * console.log(`Progress: ${job.processedUrls}/${job.totalUrls}`);\n * ```\n */\n async batchScreenshots(request: CreateBatchScreenshotsRequest): Promise<CreateBatchResponse> {\n return this.http.post<CreateBatchResponse>(\"/webdata/batch/screenshots\", request);\n }\n\n /**\n * Create a batch extraction job for multiple URLs\n *\n * @example\n * ```typescript\n * const { id, totalUrls } = await webdata.batchExtractions({\n * urls: [\n * 'https://example.com/article1',\n * 'https://example.com/article2',\n * ],\n * config: { mode: 'markdown' },\n * });\n * ```\n */\n async batchExtractions(request: CreateBatchExtractionsRequest): Promise<CreateBatchResponse> {\n return this.http.post<CreateBatchResponse>(\"/webdata/batch/extractions\", request);\n }\n\n /**\n * Get a batch job by ID\n *\n * @example\n * ```typescript\n * const job = await webdata.getBatchJob({ id: 'batch-id' });\n * console.log(`Status: ${job.status}`);\n * console.log(`Progress: ${job.processedUrls}/${job.totalUrls}`);\n * ```\n */\n async getBatchJob(request: GetBatchJobRequest): Promise<BatchJob> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/batch/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<BatchJob>(path);\n return this.convertBatchJobDates(response);\n }\n\n /**\n * List batch jobs with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await webdata.listBatchJobs({\n * status: 'completed',\n * type: 'screenshot',\n * limit: 20,\n * });\n * ```\n */\n async listBatchJobs(request: ListBatchJobsRequest = {}): Promise<ListBatchJobsResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.type) params.set(\"type\", request.type);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListBatchJobsResponse>(\n `/webdata/batch${query ? `?${query}` : \"\"}`\n );\n\n return {\n ...response,\n items: response.items.map((item) => this.convertBatchJobDates(item)),\n };\n }\n\n /**\n * Cancel a batch job\n *\n * @example\n * ```typescript\n * await webdata.cancelBatchJob({ id: 'batch-id' });\n * ```\n */\n async cancelBatchJob(request: GetBatchJobRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.post<{ success: boolean }>(\n `/webdata/batch/${request.id}/cancel${query ? `?${query}` : \"\"}`,\n {}\n );\n }\n\n /**\n * Create a batch screenshot job and wait for completion\n *\n * @example\n * ```typescript\n * const job = await webdata.batchScreenshotsAndWait({\n * urls: ['https://example.com', 'https://example.org'],\n * config: { format: 'png' },\n * });\n * console.log(`Completed: ${job.successfulUrls} successful, ${job.failedUrls} failed`);\n * ```\n */\n async batchScreenshotsAndWait(\n request: CreateBatchScreenshotsRequest,\n options: { pollInterval?: number; timeout?: number } = {}\n ): Promise<BatchJob> {\n const { pollInterval = 2000, timeout = 300000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.batchScreenshots(request);\n\n while (Date.now() - startTime < timeout) {\n const job = await this.getBatchJob({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (job.status === \"completed\" || job.status === \"failed\" || job.status === \"cancelled\") {\n return job;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Batch job timed out\");\n }\n\n /**\n * Create a batch extraction job and wait for completion\n *\n * @example\n * ```typescript\n * const job = await webdata.batchExtractionsAndWait({\n * urls: ['https://example.com/article1', 'https://example.com/article2'],\n * config: { mode: 'markdown' },\n * });\n * console.log(`Completed: ${job.successfulUrls} successful`);\n * ```\n */\n async batchExtractionsAndWait(\n request: CreateBatchExtractionsRequest,\n options: { pollInterval?: number; timeout?: number } = {}\n ): Promise<BatchJob> {\n const { pollInterval = 2000, timeout = 300000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.batchExtractions(request);\n\n while (Date.now() - startTime < timeout) {\n const job = await this.getBatchJob({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (job.status === \"completed\" || job.status === \"failed\" || job.status === \"cancelled\") {\n return job;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Batch job timed out\");\n }\n\n // ==========================================================================\n // HELPERS\n // ==========================================================================\n\n private convertScreenshotDates(screenshot: Screenshot): Screenshot {\n if (typeof screenshot.createdAt === \"string\") {\n screenshot.createdAt = new Date(screenshot.createdAt);\n }\n if (screenshot.completedAt && typeof screenshot.completedAt === \"string\") {\n screenshot.completedAt = new Date(screenshot.completedAt);\n }\n return screenshot;\n }\n\n private convertExtractionDates(extraction: Extraction): Extraction {\n if (typeof extraction.createdAt === \"string\") {\n extraction.createdAt = new Date(extraction.createdAt);\n }\n if (extraction.completedAt && typeof extraction.completedAt === \"string\") {\n extraction.completedAt = new Date(extraction.completedAt);\n }\n return extraction;\n }\n\n private convertScheduleDates(schedule: Schedule): Schedule {\n if (typeof schedule.createdAt === \"string\") {\n schedule.createdAt = new Date(schedule.createdAt);\n }\n if (typeof schedule.updatedAt === \"string\") {\n schedule.updatedAt = new Date(schedule.updatedAt);\n }\n if (schedule.lastRunAt && typeof schedule.lastRunAt === \"string\") {\n schedule.lastRunAt = new Date(schedule.lastRunAt);\n }\n if (schedule.nextRunAt && typeof schedule.nextRunAt === \"string\") {\n schedule.nextRunAt = new Date(schedule.nextRunAt);\n }\n return schedule;\n }\n\n private convertUsageDates(usage: Usage): Usage {\n if (typeof usage.periodStart === \"string\") {\n usage.periodStart = new Date(usage.periodStart);\n }\n if (typeof usage.periodEnd === \"string\") {\n usage.periodEnd = new Date(usage.periodEnd);\n }\n return usage;\n }\n\n private convertBatchJobDates(job: BatchJob): BatchJob {\n if (typeof job.createdAt === \"string\") {\n job.createdAt = new Date(job.createdAt);\n }\n if (job.startedAt && typeof job.startedAt === \"string\") {\n job.startedAt = new Date(job.startedAt);\n }\n if (job.completedAt && typeof job.completedAt === \"string\") {\n job.completedAt = new Date(job.completedAt);\n }\n return job;\n }\n}\n","/**\n * Stack0 SDK\n * Official SDK for Stack0 services\n *\n * @example\n * ```typescript\n * import { Stack0 } from '@stack0/sdk';\n *\n * const stack0 = new Stack0({ apiKey: 'stack0_...' });\n *\n * // Send an email\n * await stack0.mail.send({\n * from: 'noreply@example.com',\n * to: 'user@example.com',\n * subject: 'Hello',\n * html: '<p>World</p>',\n * });\n *\n * // Upload a file to CDN\n * const asset = await stack0.cdn.upload({\n * projectSlug: 'my-project',\n * file: fileBuffer,\n * filename: 'image.jpg',\n * mimeType: 'image/jpeg',\n * });\n *\n * // Capture a screenshot\n * const screenshot = await stack0.webdata.screenshotAndWait({\n * url: 'https://example.com',\n * format: 'png',\n * fullPage: true,\n * });\n *\n * // Extract content from a page\n * const extraction = await stack0.webdata.extractAndWait({\n * url: 'https://example.com/article',\n * mode: 'markdown',\n * });\n * ```\n */\n\nimport { Mail } from \"./mail/client\";\nimport { CDN } from \"./cdn/client\";\nimport { Webdata } from \"./webdata/client\";\nimport type { HttpClientConfig } from \"./lib/http-client\";\n\nexport interface Stack0Config extends HttpClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\n/**\n * Main Stack0 SDK class\n * Provides access to all Stack0 services\n */\nexport class Stack0 {\n public mail: Mail;\n public cdn: CDN;\n public webdata: Webdata;\n\n constructor(config: Stack0Config) {\n const clientConfig = {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n\n // Initialize clients\n this.mail = new Mail(clientConfig);\n this.cdn = new CDN(clientConfig);\n this.webdata = new Webdata(clientConfig);\n }\n}\n\n// Export sub-modules\nexport * from \"./mail\";\nexport * from \"./cdn\";\nexport * from \"./webdata\";\n\n// Default export\nexport default Stack0;\n"]}
1
+ {"version":3,"sources":["../src/lib/http-client.ts","../src/mail/client.ts","../src/cdn/client.ts","../src/webdata/client.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * HTTP client for Stack0 API\n * Handles authentication, request/response formatting, and error handling\n */\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class HttpClient {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: HttpClientConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || \"https://api.stack0.dev/v1\";\n }\n\n private getHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n };\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.getHeaders(),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = await response.json();\n return data as T;\n } catch (error) {\n if (error instanceof Error && \"statusCode\" in error) {\n throw error; // Re-throw our custom errors\n }\n throw this.createError(\"Network error\", error);\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorBody: { message: string } | undefined;\n try {\n errorBody = (await response.json()) as { message: string };\n } catch {\n errorBody = { message: response.statusText };\n }\n\n const error = new Error(errorBody?.message || `HTTP ${response.status}`) as Error & {\n statusCode: number;\n code: string;\n response: unknown;\n };\n error.statusCode = response.status;\n error.code = (errorBody as unknown as { code: string } | undefined)?.code ?? \"\";\n error.response = errorBody;\n throw error;\n }\n\n private createError(message: string, cause?: unknown): Error {\n const error = new Error(message) as Error & { cause: unknown };\n error.cause = cause;\n return error;\n }\n\n async get<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path);\n }\n\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, body);\n }\n\n async put<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PUT\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n}\n","/**\n * Stack0 Mail Client\n * API compatible with Resend for easy migration\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type { SendEmailRequest, SendEmailResponse, GetEmailResponse } from \"./types\";\n\nexport class Mail {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Send an email\n *\n * @example\n * ```typescript\n * const result = await mail.send({\n * from: 'noreply@example.com',\n * to: 'user@example.com',\n * subject: 'Hello World',\n * html: '<p>Welcome!</p>',\n * });\n * ```\n */\n async send(request: SendEmailRequest): Promise<SendEmailResponse> {\n const response = await this.http.post<SendEmailResponse>(\"/mail/send\", request);\n\n // Convert date strings to Date objects if needed\n if (typeof response.createdAt === \"string\") {\n response.createdAt = new Date(response.createdAt);\n }\n\n return response;\n }\n\n /**\n * Get email details by ID\n *\n * @example\n * ```typescript\n * const email = await mail.get('email-id');\n * console.log(email.status); // 'delivered'\n * ```\n */\n async get(id: string): Promise<GetEmailResponse> {\n const response = await this.http.get<GetEmailResponse>(`/mail/${id}`);\n\n // Convert date strings to Date objects\n const dateFields = [\"createdAt\", \"sentAt\", \"deliveredAt\", \"openedAt\", \"clickedAt\", \"bouncedAt\"] as const;\n\n for (const field of dateFields) {\n if (response[field] && typeof response[field] === \"string\") {\n (response[field] as unknown as Date) = new Date(response[field] as string);\n }\n }\n\n return response;\n }\n}\n","/**\n * Stack0 CDN Client\n * Upload, manage, and transform assets\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n Asset,\n UploadUrlRequest,\n UploadUrlResponse,\n UpdateAssetRequest,\n DeleteAssetsResponse,\n ListAssetsRequest,\n ListAssetsResponse,\n MoveAssetsRequest,\n MoveAssetsResponse,\n GetTransformUrlRequest,\n GetTransformUrlResponse,\n GetFolderTreeRequest,\n FolderTreeNode,\n CreateFolderRequest,\n Folder,\n} from \"./types\";\n\nexport class CDN {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Generate a presigned URL for uploading a file\n *\n * @example\n * ```typescript\n * const { uploadUrl, assetId } = await cdn.getUploadUrl({\n * projectSlug: 'my-project',\n * filename: 'image.jpg',\n * mimeType: 'image/jpeg',\n * size: 1024 * 1024,\n * });\n *\n * // Upload file to the presigned URL\n * await fetch(uploadUrl, {\n * method: 'PUT',\n * body: file,\n * headers: { 'Content-Type': 'image/jpeg' },\n * });\n *\n * // Confirm the upload\n * const asset = await cdn.confirmUpload(assetId);\n * ```\n */\n async getUploadUrl(request: UploadUrlRequest): Promise<UploadUrlResponse> {\n const response = await this.http.post<UploadUrlResponse>(\"/cdn/upload\", request);\n\n if (typeof response.expiresAt === \"string\") {\n response.expiresAt = new Date(response.expiresAt);\n }\n\n return response;\n }\n\n /**\n * Confirm that an upload has completed\n */\n async confirmUpload(assetId: string): Promise<Asset> {\n const response = await this.http.post<Asset>(`/cdn/upload/${assetId}/confirm`, {});\n\n console.log(\"confirm upload response\", response);\n return this.convertAssetDates(response);\n }\n\n /**\n * Upload a file directly (handles presigned URL flow automatically)\n *\n * @example\n * ```typescript\n * const asset = await cdn.upload({\n * projectSlug: 'my-project',\n * file: fileBuffer,\n * filename: 'image.jpg',\n * mimeType: 'image/jpeg',\n * });\n * ```\n */\n async upload(options: {\n projectSlug: string;\n file: Blob | Buffer | ArrayBuffer;\n filename: string;\n mimeType: string;\n folder?: string;\n metadata?: Record<string, unknown>;\n }): Promise<Asset> {\n const { projectSlug, file, filename, mimeType, folder, metadata } = options;\n\n // Get file size\n let size: number;\n if (file instanceof Blob) {\n size = file.size;\n } else if (file instanceof ArrayBuffer) {\n size = file.byteLength;\n } else {\n // Buffer\n size = (file as Buffer).length;\n }\n\n // Get presigned URL\n const { uploadUrl, assetId } = await this.getUploadUrl({\n projectSlug,\n filename,\n mimeType,\n size,\n folder,\n metadata,\n });\n\n // Upload file\n const uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": mimeType,\n },\n });\n\n if (!uploadResponse.ok) {\n throw new Error(`Upload failed: ${uploadResponse.statusText}`);\n }\n\n // Confirm upload\n return this.confirmUpload(assetId);\n }\n\n /**\n * Get an asset by ID\n *\n * @example\n * ```typescript\n * const asset = await cdn.get('asset-id');\n * console.log(asset.cdnUrl);\n * ```\n */\n async get(id: string): Promise<Asset> {\n const response = await this.http.get<Asset>(`/cdn/assets/${id}`);\n return this.convertAssetDates(response);\n }\n\n /**\n * Update asset metadata\n *\n * @example\n * ```typescript\n * const asset = await cdn.update({\n * id: 'asset-id',\n * alt: 'A beautiful sunset',\n * tags: ['nature', 'sunset'],\n * });\n * ```\n */\n async update(request: UpdateAssetRequest): Promise<Asset> {\n const { id, ...data } = request;\n const response = await this.http.patch<Asset>(`/cdn/assets/${id}`, data);\n return this.convertAssetDates(response);\n }\n\n /**\n * Delete an asset\n *\n * @example\n * ```typescript\n * await cdn.delete('asset-id');\n * ```\n */\n async delete(id: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/cdn/assets/${id}`);\n }\n\n /**\n * Delete multiple assets\n *\n * @example\n * ```typescript\n * const result = await cdn.deleteMany(['asset-1', 'asset-2']);\n * console.log(`Deleted ${result.deletedCount} assets`);\n * ```\n */\n async deleteMany(ids: string[]): Promise<DeleteAssetsResponse> {\n return this.http.post<DeleteAssetsResponse>(\"/cdn/assets/delete\", { ids });\n }\n\n /**\n * List assets with filters and pagination\n *\n * @example\n * ```typescript\n * const { assets, total, hasMore } = await cdn.list({\n * projectSlug: 'my-project',\n * type: 'image',\n * limit: 20,\n * });\n * ```\n */\n async list(request: ListAssetsRequest): Promise<ListAssetsResponse> {\n const params = new URLSearchParams();\n\n params.set(\"projectSlug\", request.projectSlug);\n if (request.folder !== undefined) params.set(\"folder\", request.folder ?? \"\");\n if (request.type) params.set(\"type\", request.type);\n if (request.status) params.set(\"status\", request.status);\n if (request.search) params.set(\"search\", request.search);\n if (request.tags) params.set(\"tags\", request.tags.join(\",\"));\n if (request.sortBy) params.set(\"sortBy\", request.sortBy);\n if (request.sortOrder) params.set(\"sortOrder\", request.sortOrder);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.offset) params.set(\"offset\", request.offset.toString());\n\n const response = await this.http.get<ListAssetsResponse>(`/cdn/assets?${params.toString()}`);\n\n return {\n ...response,\n assets: response.assets.map((asset) => this.convertAssetDates(asset)),\n };\n }\n\n /**\n * Move assets to a different folder\n *\n * @example\n * ```typescript\n * await cdn.move({\n * assetIds: ['asset-1', 'asset-2'],\n * folder: '/images/archive',\n * });\n * ```\n */\n async move(request: MoveAssetsRequest): Promise<MoveAssetsResponse> {\n return this.http.post<MoveAssetsResponse>(\"/cdn/assets/move\", request);\n }\n\n /**\n * Get a transformed image URL\n *\n * @example\n * ```typescript\n * const { url } = await cdn.getTransformUrl({\n * assetId: 'asset-id',\n * options: {\n * width: 800,\n * height: 600,\n * fit: 'cover',\n * format: 'webp',\n * quality: 80,\n * },\n * });\n * ```\n */\n async getTransformUrl(request: GetTransformUrlRequest): Promise<GetTransformUrlResponse> {\n return this.http.post<GetTransformUrlResponse>(\"/cdn/transform\", request);\n }\n\n /**\n * Get folder tree for navigation\n *\n * @example\n * ```typescript\n * const tree = await cdn.getFolderTree({\n * projectSlug: 'my-project',\n * maxDepth: 3,\n * });\n * ```\n */\n async getFolderTree(request: GetFolderTreeRequest): Promise<FolderTreeNode[]> {\n const params = new URLSearchParams();\n params.set(\"projectSlug\", request.projectSlug);\n if (request.maxDepth) params.set(\"maxDepth\", request.maxDepth.toString());\n\n const response = await this.http.get<{ tree: FolderTreeNode[] }>(`/cdn/folders/tree?${params.toString()}`);\n return response.tree;\n }\n\n /**\n * Create a new folder\n *\n * @example\n * ```typescript\n * const folder = await cdn.createFolder({\n * projectSlug: 'my-project',\n * name: 'images',\n * });\n * ```\n */\n async createFolder(request: CreateFolderRequest): Promise<Folder> {\n const response = await this.http.post<Folder>(\"/cdn/folders\", request);\n return this.convertFolderDates(response);\n }\n\n /**\n * Delete a folder\n *\n * @example\n * ```typescript\n * await cdn.deleteFolder('folder-id');\n * ```\n */\n async deleteFolder(id: string, deleteContents = false): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (deleteContents) params.set(\"deleteContents\", \"true\");\n\n return this.http.delete<{ success: boolean }>(`/cdn/folders/${id}?${params.toString()}`);\n }\n\n private convertAssetDates(asset: Asset): Asset {\n if (typeof asset.createdAt === \"string\") {\n asset.createdAt = new Date(asset.createdAt);\n }\n if (asset.updatedAt && typeof asset.updatedAt === \"string\") {\n asset.updatedAt = new Date(asset.updatedAt);\n }\n return asset;\n }\n\n private convertFolderDates(folder: Folder): Folder {\n if (typeof folder.createdAt === \"string\") {\n folder.createdAt = new Date(folder.createdAt);\n }\n if (folder.updatedAt && typeof folder.updatedAt === \"string\") {\n folder.updatedAt = new Date(folder.updatedAt);\n }\n return folder;\n }\n}\n","/**\n * Stack0 Webdata Client\n * Capture screenshots and extract data from web pages\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n Screenshot,\n CreateScreenshotRequest,\n CreateScreenshotResponse,\n GetScreenshotRequest,\n ListScreenshotsRequest,\n ListScreenshotsResponse,\n Extraction,\n CreateExtractionRequest,\n CreateExtractionResponse,\n GetExtractionRequest,\n ListExtractionsRequest,\n ListExtractionsResponse,\n Schedule,\n CreateScheduleRequest,\n CreateScheduleResponse,\n UpdateScheduleRequest,\n GetScheduleRequest,\n ListSchedulesRequest,\n ListSchedulesResponse,\n Usage,\n GetUsageRequest,\n BatchJob,\n CreateBatchScreenshotsRequest,\n CreateBatchExtractionsRequest,\n CreateBatchResponse,\n GetBatchJobRequest,\n ListBatchJobsRequest,\n ListBatchJobsResponse,\n} from \"./types\";\n\nexport class Webdata {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n // ==========================================================================\n // SCREENSHOTS\n // ==========================================================================\n\n /**\n * Capture a screenshot of a URL\n *\n * @example\n * ```typescript\n * const { id, status } = await webdata.screenshot({\n * url: 'https://example.com',\n * format: 'png',\n * fullPage: true,\n * deviceType: 'desktop',\n * });\n *\n * // Poll for completion\n * const screenshot = await webdata.getScreenshot({ id });\n * console.log(screenshot.imageUrl);\n * ```\n */\n async screenshot(request: CreateScreenshotRequest): Promise<CreateScreenshotResponse> {\n return this.http.post<CreateScreenshotResponse>(\"/webdata/screenshots\", request);\n }\n\n /**\n * Get a screenshot by ID\n *\n * @example\n * ```typescript\n * const screenshot = await webdata.getScreenshot({ id: 'screenshot-id' });\n * if (screenshot.status === 'completed') {\n * console.log(screenshot.imageUrl);\n * }\n * ```\n */\n async getScreenshot(request: GetScreenshotRequest): Promise<Screenshot> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/screenshots/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<Screenshot>(path);\n return this.convertScreenshotDates(response);\n }\n\n /**\n * List screenshots with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await webdata.listScreenshots({\n * status: 'completed',\n * limit: 20,\n * });\n * ```\n */\n async listScreenshots(request: ListScreenshotsRequest = {}): Promise<ListScreenshotsResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.url) params.set(\"url\", request.url);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListScreenshotsResponse>(`/webdata/screenshots${query ? `?${query}` : \"\"}`);\n\n return {\n ...response,\n items: response.items.map((item) => this.convertScreenshotDates(item)),\n };\n }\n\n /**\n * Delete a screenshot\n *\n * @example\n * ```typescript\n * await webdata.deleteScreenshot({ id: 'screenshot-id' });\n * ```\n */\n async deleteScreenshot(request: GetScreenshotRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.delete<{ success: boolean }>(`/webdata/screenshots/${request.id}${query ? `?${query}` : \"\"}`);\n }\n\n /**\n * Capture a screenshot and wait for completion\n *\n * @example\n * ```typescript\n * const screenshot = await webdata.screenshotAndWait({\n * url: 'https://example.com',\n * format: 'png',\n * });\n * console.log(screenshot.imageUrl);\n * ```\n */\n async screenshotAndWait(\n request: CreateScreenshotRequest,\n options: { pollInterval?: number; timeout?: number } = {},\n ): Promise<Screenshot> {\n const { pollInterval = 1000, timeout = 60000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.screenshot(request);\n\n while (Date.now() - startTime < timeout) {\n const screenshot = await this.getScreenshot({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (screenshot.status === \"completed\" || screenshot.status === \"failed\") {\n if (screenshot.status === \"failed\") {\n throw new Error(screenshot.error || \"Screenshot failed\");\n }\n return screenshot;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Screenshot timed out\");\n }\n\n // ==========================================================================\n // EXTRACTIONS\n // ==========================================================================\n\n /**\n * Extract content from a URL\n *\n * @example\n * ```typescript\n * const { id, status } = await webdata.extract({\n * url: 'https://example.com/article',\n * mode: 'markdown',\n * includeMetadata: true,\n * });\n *\n * // Poll for completion\n * const extraction = await webdata.getExtraction({ id });\n * console.log(extraction.markdown);\n * ```\n */\n async extract(request: CreateExtractionRequest): Promise<CreateExtractionResponse> {\n return this.http.post<CreateExtractionResponse>(\"/webdata/extractions\", request);\n }\n\n /**\n * Get an extraction by ID\n *\n * @example\n * ```typescript\n * const extraction = await webdata.getExtraction({ id: 'extraction-id' });\n * if (extraction.status === 'completed') {\n * console.log(extraction.markdown);\n * console.log(extraction.pageMetadata);\n * }\n * ```\n */\n async getExtraction(request: GetExtractionRequest): Promise<Extraction> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/extractions/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<Extraction>(path);\n return this.convertExtractionDates(response);\n }\n\n /**\n * List extractions with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await webdata.listExtractions({\n * status: 'completed',\n * limit: 20,\n * });\n * ```\n */\n async listExtractions(request: ListExtractionsRequest = {}): Promise<ListExtractionsResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.url) params.set(\"url\", request.url);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListExtractionsResponse>(`/webdata/extractions${query ? `?${query}` : \"\"}`);\n\n return {\n ...response,\n items: response.items.map((item) => this.convertExtractionDates(item)),\n };\n }\n\n /**\n * Delete an extraction\n *\n * @example\n * ```typescript\n * await webdata.deleteExtraction({ id: 'extraction-id' });\n * ```\n */\n async deleteExtraction(request: GetExtractionRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.delete<{ success: boolean }>(`/webdata/extractions/${request.id}${query ? `?${query}` : \"\"}`);\n }\n\n /**\n * Extract content and wait for completion\n *\n * @example\n * ```typescript\n * const extraction = await webdata.extractAndWait({\n * url: 'https://example.com/article',\n * mode: 'markdown',\n * });\n * console.log(extraction.markdown);\n * ```\n */\n async extractAndWait(\n request: CreateExtractionRequest,\n options: { pollInterval?: number; timeout?: number } = {},\n ): Promise<Extraction> {\n const { pollInterval = 1000, timeout = 60000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.extract(request);\n\n while (Date.now() - startTime < timeout) {\n const extraction = await this.getExtraction({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (extraction.status === \"completed\" || extraction.status === \"failed\") {\n if (extraction.status === \"failed\") {\n throw new Error(extraction.error || \"Extraction failed\");\n }\n return extraction;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Extraction timed out\");\n }\n\n // ==========================================================================\n // SCHEDULES\n // ==========================================================================\n\n /**\n * Create a scheduled screenshot or extraction job\n *\n * @example\n * ```typescript\n * const { id } = await webdata.createSchedule({\n * name: 'Daily homepage screenshot',\n * url: 'https://example.com',\n * type: 'screenshot',\n * frequency: 'daily',\n * config: { format: 'png', fullPage: true },\n * });\n * ```\n */\n async createSchedule(request: CreateScheduleRequest): Promise<CreateScheduleResponse> {\n return this.http.post<CreateScheduleResponse>(\"/webdata/schedules\", request);\n }\n\n /**\n * Update a schedule\n *\n * @example\n * ```typescript\n * await webdata.updateSchedule({\n * id: 'schedule-id',\n * frequency: 'weekly',\n * isActive: false,\n * });\n * ```\n */\n async updateSchedule(request: UpdateScheduleRequest): Promise<{ success: boolean }> {\n const { id, environment, projectId, ...data } = request;\n\n const params = new URLSearchParams();\n if (environment) params.set(\"environment\", environment);\n if (projectId) params.set(\"projectId\", projectId);\n\n const query = params.toString();\n return this.http.patch<{ success: boolean }>(`/webdata/schedules/${id}${query ? `?${query}` : \"\"}`, data);\n }\n\n /**\n * Get a schedule by ID\n *\n * @example\n * ```typescript\n * const schedule = await webdata.getSchedule({ id: 'schedule-id' });\n * console.log(schedule.nextRunAt);\n * ```\n */\n async getSchedule(request: GetScheduleRequest): Promise<Schedule> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/schedules/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<Schedule>(path);\n return this.convertScheduleDates(response);\n }\n\n /**\n * List schedules with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await webdata.listSchedules({\n * type: 'screenshot',\n * isActive: true,\n * });\n * ```\n */\n async listSchedules(request: ListSchedulesRequest = {}): Promise<ListSchedulesResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.type) params.set(\"type\", request.type);\n if (request.isActive !== undefined) params.set(\"isActive\", request.isActive.toString());\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListSchedulesResponse>(`/webdata/schedules${query ? `?${query}` : \"\"}`);\n\n return {\n ...response,\n items: response.items.map((item) => this.convertScheduleDates(item)),\n };\n }\n\n /**\n * Delete a schedule\n *\n * @example\n * ```typescript\n * await webdata.deleteSchedule({ id: 'schedule-id' });\n * ```\n */\n async deleteSchedule(request: GetScheduleRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.delete<{ success: boolean }>(`/webdata/schedules/${request.id}${query ? `?${query}` : \"\"}`);\n }\n\n /**\n * Toggle a schedule on or off\n *\n * @example\n * ```typescript\n * const { isActive } = await webdata.toggleSchedule({ id: 'schedule-id' });\n * console.log(`Schedule is now ${isActive ? 'active' : 'paused'}`);\n * ```\n */\n async toggleSchedule(request: GetScheduleRequest): Promise<{ isActive: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.post<{ isActive: boolean }>(\n `/webdata/schedules/${request.id}/toggle${query ? `?${query}` : \"\"}`,\n {},\n );\n }\n\n // ==========================================================================\n // USAGE\n // ==========================================================================\n\n /**\n * Get usage statistics\n *\n * @example\n * ```typescript\n * const usage = await webdata.getUsage({\n * periodStart: '2024-01-01T00:00:00Z',\n * periodEnd: '2024-01-31T23:59:59Z',\n * });\n * console.log(`Screenshots: ${usage.screenshotsTotal}`);\n * console.log(`Extractions: ${usage.extractionsTotal}`);\n * ```\n */\n async getUsage(request: GetUsageRequest = {}): Promise<Usage> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.periodStart) params.set(\"periodStart\", request.periodStart);\n if (request.periodEnd) params.set(\"periodEnd\", request.periodEnd);\n\n const query = params.toString();\n const response = await this.http.get<Usage>(`/webdata/usage${query ? `?${query}` : \"\"}`);\n\n return this.convertUsageDates(response);\n }\n\n // ==========================================================================\n // BATCH JOBS\n // ==========================================================================\n\n /**\n * Create a batch screenshot job for multiple URLs\n *\n * @example\n * ```typescript\n * const { id, totalUrls } = await webdata.batchScreenshots({\n * urls: [\n * 'https://example.com',\n * 'https://example.org',\n * ],\n * config: { format: 'png', fullPage: true },\n * });\n *\n * // Poll for completion\n * const job = await webdata.getBatchJob({ id });\n * console.log(`Progress: ${job.processedUrls}/${job.totalUrls}`);\n * ```\n */\n async batchScreenshots(request: CreateBatchScreenshotsRequest): Promise<CreateBatchResponse> {\n return this.http.post<CreateBatchResponse>(\"/webdata/batch/screenshots\", request);\n }\n\n /**\n * Create a batch extraction job for multiple URLs\n *\n * @example\n * ```typescript\n * const { id, totalUrls } = await webdata.batchExtractions({\n * urls: [\n * 'https://example.com/article1',\n * 'https://example.com/article2',\n * ],\n * config: { mode: 'markdown' },\n * });\n * ```\n */\n async batchExtractions(request: CreateBatchExtractionsRequest): Promise<CreateBatchResponse> {\n return this.http.post<CreateBatchResponse>(\"/webdata/batch/extractions\", request);\n }\n\n /**\n * Get a batch job by ID\n *\n * @example\n * ```typescript\n * const job = await webdata.getBatchJob({ id: 'batch-id' });\n * console.log(`Status: ${job.status}`);\n * console.log(`Progress: ${job.processedUrls}/${job.totalUrls}`);\n * ```\n */\n async getBatchJob(request: GetBatchJobRequest): Promise<BatchJob> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/batch/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<BatchJob>(path);\n return this.convertBatchJobDates(response);\n }\n\n /**\n * List batch jobs with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await webdata.listBatchJobs({\n * status: 'completed',\n * type: 'screenshot',\n * limit: 20,\n * });\n * ```\n */\n async listBatchJobs(request: ListBatchJobsRequest = {}): Promise<ListBatchJobsResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.type) params.set(\"type\", request.type);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListBatchJobsResponse>(`/webdata/batch${query ? `?${query}` : \"\"}`);\n\n return {\n ...response,\n items: response.items.map((item) => this.convertBatchJobDates(item)),\n };\n }\n\n /**\n * Cancel a batch job\n *\n * @example\n * ```typescript\n * await webdata.cancelBatchJob({ id: 'batch-id' });\n * ```\n */\n async cancelBatchJob(request: GetBatchJobRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.post<{ success: boolean }>(`/webdata/batch/${request.id}/cancel${query ? `?${query}` : \"\"}`, {});\n }\n\n /**\n * Create a batch screenshot job and wait for completion\n *\n * @example\n * ```typescript\n * const job = await webdata.batchScreenshotsAndWait({\n * urls: ['https://example.com', 'https://example.org'],\n * config: { format: 'png' },\n * });\n * console.log(`Completed: ${job.successfulUrls} successful, ${job.failedUrls} failed`);\n * ```\n */\n async batchScreenshotsAndWait(\n request: CreateBatchScreenshotsRequest,\n options: { pollInterval?: number; timeout?: number } = {},\n ): Promise<BatchJob> {\n const { pollInterval = 2000, timeout = 300000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.batchScreenshots(request);\n\n while (Date.now() - startTime < timeout) {\n const job = await this.getBatchJob({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (job.status === \"completed\" || job.status === \"failed\" || job.status === \"cancelled\") {\n return job;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Batch job timed out\");\n }\n\n /**\n * Create a batch extraction job and wait for completion\n *\n * @example\n * ```typescript\n * const job = await webdata.batchExtractionsAndWait({\n * urls: ['https://example.com/article1', 'https://example.com/article2'],\n * config: { mode: 'markdown' },\n * });\n * console.log(`Completed: ${job.successfulUrls} successful`);\n * ```\n */\n async batchExtractionsAndWait(\n request: CreateBatchExtractionsRequest,\n options: { pollInterval?: number; timeout?: number } = {},\n ): Promise<BatchJob> {\n const { pollInterval = 2000, timeout = 300000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.batchExtractions(request);\n\n while (Date.now() - startTime < timeout) {\n const job = await this.getBatchJob({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (job.status === \"completed\" || job.status === \"failed\" || job.status === \"cancelled\") {\n return job;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Batch job timed out\");\n }\n\n // ==========================================================================\n // HELPERS\n // ==========================================================================\n\n private convertScreenshotDates(screenshot: Screenshot): Screenshot {\n if (typeof screenshot.createdAt === \"string\") {\n screenshot.createdAt = new Date(screenshot.createdAt);\n }\n if (screenshot.completedAt && typeof screenshot.completedAt === \"string\") {\n screenshot.completedAt = new Date(screenshot.completedAt);\n }\n return screenshot;\n }\n\n private convertExtractionDates(extraction: Extraction): Extraction {\n if (typeof extraction.createdAt === \"string\") {\n extraction.createdAt = new Date(extraction.createdAt);\n }\n if (extraction.completedAt && typeof extraction.completedAt === \"string\") {\n extraction.completedAt = new Date(extraction.completedAt);\n }\n return extraction;\n }\n\n private convertScheduleDates(schedule: Schedule): Schedule {\n if (typeof schedule.createdAt === \"string\") {\n schedule.createdAt = new Date(schedule.createdAt);\n }\n if (typeof schedule.updatedAt === \"string\") {\n schedule.updatedAt = new Date(schedule.updatedAt);\n }\n if (schedule.lastRunAt && typeof schedule.lastRunAt === \"string\") {\n schedule.lastRunAt = new Date(schedule.lastRunAt);\n }\n if (schedule.nextRunAt && typeof schedule.nextRunAt === \"string\") {\n schedule.nextRunAt = new Date(schedule.nextRunAt);\n }\n return schedule;\n }\n\n private convertUsageDates(usage: Usage): Usage {\n if (typeof usage.periodStart === \"string\") {\n usage.periodStart = new Date(usage.periodStart);\n }\n if (typeof usage.periodEnd === \"string\") {\n usage.periodEnd = new Date(usage.periodEnd);\n }\n return usage;\n }\n\n private convertBatchJobDates(job: BatchJob): BatchJob {\n if (typeof job.createdAt === \"string\") {\n job.createdAt = new Date(job.createdAt);\n }\n if (job.startedAt && typeof job.startedAt === \"string\") {\n job.startedAt = new Date(job.startedAt);\n }\n if (job.completedAt && typeof job.completedAt === \"string\") {\n job.completedAt = new Date(job.completedAt);\n }\n return job;\n }\n}\n","/**\n * Stack0 SDK\n * Official SDK for Stack0 services\n *\n * @example\n * ```typescript\n * import { Stack0 } from '@stack0/sdk';\n *\n * const stack0 = new Stack0({ apiKey: 'stack0_...' });\n *\n * // Send an email\n * await stack0.mail.send({\n * from: 'noreply@example.com',\n * to: 'user@example.com',\n * subject: 'Hello',\n * html: '<p>World</p>',\n * });\n *\n * // Upload a file to CDN\n * const asset = await stack0.cdn.upload({\n * projectSlug: 'my-project',\n * file: fileBuffer,\n * filename: 'image.jpg',\n * mimeType: 'image/jpeg',\n * });\n *\n * // Capture a screenshot\n * const screenshot = await stack0.webdata.screenshotAndWait({\n * url: 'https://example.com',\n * format: 'png',\n * fullPage: true,\n * });\n *\n * // Extract content from a page\n * const extraction = await stack0.webdata.extractAndWait({\n * url: 'https://example.com/article',\n * mode: 'markdown',\n * });\n * ```\n */\n\nimport { Mail } from \"./mail/client\";\nimport { CDN } from \"./cdn/client\";\nimport { Webdata } from \"./webdata/client\";\nimport type { HttpClientConfig } from \"./lib/http-client\";\n\nexport interface Stack0Config extends HttpClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\n/**\n * Main Stack0 SDK class\n * Provides access to all Stack0 services\n */\nexport class Stack0 {\n public mail: Mail;\n public cdn: CDN;\n public webdata: Webdata;\n\n constructor(config: Stack0Config) {\n const clientConfig = {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n };\n\n // Initialize clients\n this.mail = new Mail(clientConfig);\n this.cdn = new CDN(clientConfig);\n this.webdata = new Webdata(clientConfig);\n }\n}\n\n// Export sub-modules\nexport * from \"./mail\";\nexport * from \"./cdn\";\nexport * from \"./webdata\";\n\n// Default export\nexport default Stack0;\n"]}
package/dist/index.mjs CHANGED
@@ -62,6 +62,9 @@ var HttpClient = class {
62
62
  async delete(path) {
63
63
  return this.request("DELETE", path);
64
64
  }
65
+ async patch(path, body) {
66
+ return this.request("PATCH", path, body);
67
+ }
65
68
  };
66
69
 
67
70
  // src/mail/client.ts
@@ -141,7 +144,7 @@ var CDN = class {
141
144
  * ```
142
145
  */
143
146
  async getUploadUrl(request) {
144
- const response = await this.http.post("/cdn/assets/upload-url", request);
147
+ const response = await this.http.post("/cdn/upload", request);
145
148
  if (typeof response.expiresAt === "string") {
146
149
  response.expiresAt = new Date(response.expiresAt);
147
150
  }
@@ -151,8 +154,9 @@ var CDN = class {
151
154
  * Confirm that an upload has completed
152
155
  */
153
156
  async confirmUpload(assetId) {
154
- const response = await this.http.post("/cdn/assets/confirm", { assetId });
155
- return this.convertAssetDates(response.asset);
157
+ const response = await this.http.post(`/cdn/upload/${assetId}/confirm`, {});
158
+ console.log("confirm upload response", response);
159
+ return this.convertAssetDates(response);
156
160
  }
157
161
  /**
158
162
  * Upload a file directly (handles presigned URL flow automatically)
@@ -224,7 +228,7 @@ var CDN = class {
224
228
  */
225
229
  async update(request) {
226
230
  const { id, ...data } = request;
227
- const response = await this.http.put(`/cdn/assets/${id}`, data);
231
+ const response = await this.http.patch(`/cdn/assets/${id}`, data);
228
232
  return this.convertAssetDates(response);
229
233
  }
230
234
  /**
@@ -248,7 +252,7 @@ var CDN = class {
248
252
  * ```
249
253
  */
250
254
  async deleteMany(ids) {
251
- return this.http.post("/cdn/assets/delete-many", { ids });
255
+ return this.http.post("/cdn/assets/delete", { ids });
252
256
  }
253
257
  /**
254
258
  * List assets with filters and pagination
@@ -312,15 +316,7 @@ var CDN = class {
312
316
  * ```
313
317
  */
314
318
  async getTransformUrl(request) {
315
- const params = new URLSearchParams();
316
- params.set("assetId", request.assetId);
317
- const { options } = request;
318
- if (options.width) params.set("width", options.width.toString());
319
- if (options.height) params.set("height", options.height.toString());
320
- if (options.fit) params.set("fit", options.fit);
321
- if (options.format) params.set("format", options.format);
322
- if (options.quality) params.set("quality", options.quality.toString());
323
- return this.http.get(`/cdn/assets/transform?${params.toString()}`);
319
+ return this.http.post("/cdn/transform", request);
324
320
  }
325
321
  /**
326
322
  * Get folder tree for navigation
@@ -337,7 +333,8 @@ var CDN = class {
337
333
  const params = new URLSearchParams();
338
334
  params.set("projectSlug", request.projectSlug);
339
335
  if (request.maxDepth) params.set("maxDepth", request.maxDepth.toString());
340
- return this.http.get(`/cdn/folders/tree?${params.toString()}`);
336
+ const response = await this.http.get(`/cdn/folders/tree?${params.toString()}`);
337
+ return response.tree;
341
338
  }
342
339
  /**
343
340
  * Create a new folder
@@ -456,9 +453,7 @@ var Webdata = class {
456
453
  if (request.limit) params.set("limit", request.limit.toString());
457
454
  if (request.cursor) params.set("cursor", request.cursor);
458
455
  const query = params.toString();
459
- const response = await this.http.get(
460
- `/webdata/screenshots${query ? `?${query}` : ""}`
461
- );
456
+ const response = await this.http.get(`/webdata/screenshots${query ? `?${query}` : ""}`);
462
457
  return {
463
458
  ...response,
464
459
  items: response.items.map((item) => this.convertScreenshotDates(item))
@@ -477,9 +472,7 @@ var Webdata = class {
477
472
  if (request.environment) params.set("environment", request.environment);
478
473
  if (request.projectId) params.set("projectId", request.projectId);
479
474
  const query = params.toString();
480
- return this.http.delete(
481
- `/webdata/screenshots/${request.id}${query ? `?${query}` : ""}`
482
- );
475
+ return this.http.delete(`/webdata/screenshots/${request.id}${query ? `?${query}` : ""}`);
483
476
  }
484
477
  /**
485
478
  * Capture a screenshot and wait for completion
@@ -576,9 +569,7 @@ var Webdata = class {
576
569
  if (request.limit) params.set("limit", request.limit.toString());
577
570
  if (request.cursor) params.set("cursor", request.cursor);
578
571
  const query = params.toString();
579
- const response = await this.http.get(
580
- `/webdata/extractions${query ? `?${query}` : ""}`
581
- );
572
+ const response = await this.http.get(`/webdata/extractions${query ? `?${query}` : ""}`);
582
573
  return {
583
574
  ...response,
584
575
  items: response.items.map((item) => this.convertExtractionDates(item))
@@ -597,9 +588,7 @@ var Webdata = class {
597
588
  if (request.environment) params.set("environment", request.environment);
598
589
  if (request.projectId) params.set("projectId", request.projectId);
599
590
  const query = params.toString();
600
- return this.http.delete(
601
- `/webdata/extractions/${request.id}${query ? `?${query}` : ""}`
602
- );
591
+ return this.http.delete(`/webdata/extractions/${request.id}${query ? `?${query}` : ""}`);
603
592
  }
604
593
  /**
605
594
  * Extract content and wait for completion
@@ -671,10 +660,7 @@ var Webdata = class {
671
660
  if (environment) params.set("environment", environment);
672
661
  if (projectId) params.set("projectId", projectId);
673
662
  const query = params.toString();
674
- return this.http.post(
675
- `/webdata/schedules/${id}${query ? `?${query}` : ""}`,
676
- data
677
- );
663
+ return this.http.patch(`/webdata/schedules/${id}${query ? `?${query}` : ""}`, data);
678
664
  }
679
665
  /**
680
666
  * Get a schedule by ID
@@ -714,9 +700,7 @@ var Webdata = class {
714
700
  if (request.limit) params.set("limit", request.limit.toString());
715
701
  if (request.cursor) params.set("cursor", request.cursor);
716
702
  const query = params.toString();
717
- const response = await this.http.get(
718
- `/webdata/schedules${query ? `?${query}` : ""}`
719
- );
703
+ const response = await this.http.get(`/webdata/schedules${query ? `?${query}` : ""}`);
720
704
  return {
721
705
  ...response,
722
706
  items: response.items.map((item) => this.convertScheduleDates(item))
@@ -735,9 +719,7 @@ var Webdata = class {
735
719
  if (request.environment) params.set("environment", request.environment);
736
720
  if (request.projectId) params.set("projectId", request.projectId);
737
721
  const query = params.toString();
738
- return this.http.delete(
739
- `/webdata/schedules/${request.id}${query ? `?${query}` : ""}`
740
- );
722
+ return this.http.delete(`/webdata/schedules/${request.id}${query ? `?${query}` : ""}`);
741
723
  }
742
724
  /**
743
725
  * Toggle a schedule on or off
@@ -780,9 +762,7 @@ var Webdata = class {
780
762
  if (request.periodStart) params.set("periodStart", request.periodStart);
781
763
  if (request.periodEnd) params.set("periodEnd", request.periodEnd);
782
764
  const query = params.toString();
783
- const response = await this.http.get(
784
- `/webdata/usage${query ? `?${query}` : ""}`
785
- );
765
+ const response = await this.http.get(`/webdata/usage${query ? `?${query}` : ""}`);
786
766
  return this.convertUsageDates(response);
787
767
  }
788
768
  // ==========================================================================
@@ -866,9 +846,7 @@ var Webdata = class {
866
846
  if (request.limit) params.set("limit", request.limit.toString());
867
847
  if (request.cursor) params.set("cursor", request.cursor);
868
848
  const query = params.toString();
869
- const response = await this.http.get(
870
- `/webdata/batch${query ? `?${query}` : ""}`
871
- );
849
+ const response = await this.http.get(`/webdata/batch${query ? `?${query}` : ""}`);
872
850
  return {
873
851
  ...response,
874
852
  items: response.items.map((item) => this.convertBatchJobDates(item))
@@ -887,10 +865,7 @@ var Webdata = class {
887
865
  if (request.environment) params.set("environment", request.environment);
888
866
  if (request.projectId) params.set("projectId", request.projectId);
889
867
  const query = params.toString();
890
- return this.http.post(
891
- `/webdata/batch/${request.id}/cancel${query ? `?${query}` : ""}`,
892
- {}
893
- );
868
+ return this.http.post(`/webdata/batch/${request.id}/cancel${query ? `?${query}` : ""}`, {});
894
869
  }
895
870
  /**
896
871
  * Create a batch screenshot job and wait for completion