@stack0/sdk 0.5.11 → 0.5.12

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.
@@ -0,0 +1,176 @@
1
+ // src/lib/http-client.ts
2
+ var HttpClient = class {
3
+ apiKey;
4
+ baseUrl;
5
+ constructor(config) {
6
+ this.apiKey = config.apiKey;
7
+ this.baseUrl = config.baseUrl || "https://api.stack0.dev/v1";
8
+ }
9
+ getHeaders(includeContentType = true) {
10
+ const headers = {
11
+ Authorization: `Bearer ${this.apiKey}`
12
+ };
13
+ if (includeContentType) {
14
+ headers["Content-Type"] = "application/json";
15
+ }
16
+ return headers;
17
+ }
18
+ async request(method, path, body) {
19
+ const url = `${this.baseUrl}${path}`;
20
+ const bodyString = body === void 0 ? void 0 : JSON.stringify(body);
21
+ const hasBody = bodyString !== void 0;
22
+ try {
23
+ const response = await fetch(url, {
24
+ method,
25
+ headers: this.getHeaders(hasBody),
26
+ body: hasBody ? bodyString : void 0
27
+ });
28
+ if (!response.ok) {
29
+ await this.handleErrorResponse(response);
30
+ }
31
+ const data = await response.json();
32
+ return data;
33
+ } catch (error) {
34
+ if (error instanceof Error && "statusCode" in error) {
35
+ throw error;
36
+ }
37
+ throw this.createError("Network error", error);
38
+ }
39
+ }
40
+ async handleErrorResponse(response) {
41
+ let errorBody;
42
+ try {
43
+ errorBody = await response.json();
44
+ } catch {
45
+ errorBody = { message: response.statusText };
46
+ }
47
+ const error = new Error(errorBody?.message || `HTTP ${response.status}`);
48
+ error.statusCode = response.status;
49
+ error.code = errorBody?.code ?? "";
50
+ error.response = errorBody;
51
+ throw error;
52
+ }
53
+ createError(message, cause) {
54
+ const error = new Error(message);
55
+ error.cause = cause;
56
+ return error;
57
+ }
58
+ async get(path) {
59
+ return this.request("GET", path);
60
+ }
61
+ async post(path, body) {
62
+ return this.request("POST", path, body);
63
+ }
64
+ async put(path, body) {
65
+ return this.request("PUT", path, body);
66
+ }
67
+ async delete(path) {
68
+ return this.request("DELETE", path);
69
+ }
70
+ async deleteWithBody(path, body) {
71
+ return this.request("DELETE", path, body);
72
+ }
73
+ async patch(path, body) {
74
+ return this.request("PATCH", path, body);
75
+ }
76
+ };
77
+
78
+ // src/crawl/client.ts
79
+ var Crawl$ = class {
80
+ http;
81
+ constructor(config) {
82
+ this.http = new HttpClient(config);
83
+ }
84
+ /**
85
+ * Start a crawl.
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const { id } = await stack0.crawl.start({
90
+ * url: 'https://docs.example.com',
91
+ * maxDepth: 3,
92
+ * maxPages: 200,
93
+ * formats: ['markdown', 'links'],
94
+ * });
95
+ * ```
96
+ */
97
+ async start(request) {
98
+ return this.http.post("/webdata/crawl", request);
99
+ }
100
+ /**
101
+ * Get a crawl by ID. Pass `includePages: true` to include the scraped pages.
102
+ */
103
+ async get(request) {
104
+ const params = new URLSearchParams();
105
+ if (request.environment) params.set("environment", request.environment);
106
+ if (request.projectId) params.set("projectId", request.projectId);
107
+ if (request.includePages) params.set("includePages", "true");
108
+ const query = params.toString();
109
+ return this.http.get(`/webdata/crawl/${request.id}${query ? `?${query}` : ""}`);
110
+ }
111
+ async list(request = {}) {
112
+ const params = new URLSearchParams();
113
+ if (request.environment) params.set("environment", request.environment);
114
+ if (request.projectId) params.set("projectId", request.projectId);
115
+ if (request.status) params.set("status", request.status);
116
+ if (request.url) params.set("url", request.url);
117
+ if (request.limit) params.set("limit", String(request.limit));
118
+ if (request.cursor) params.set("cursor", request.cursor);
119
+ const query = params.toString();
120
+ return this.http.get(`/webdata/crawl${query ? `?${query}` : ""}`);
121
+ }
122
+ async listPages(request) {
123
+ const params = new URLSearchParams();
124
+ if (request.environment) params.set("environment", request.environment);
125
+ if (request.projectId) params.set("projectId", request.projectId);
126
+ if (request.limit) params.set("limit", String(request.limit));
127
+ if (request.cursor) params.set("cursor", request.cursor);
128
+ const query = params.toString();
129
+ return this.http.get(
130
+ `/webdata/crawl/${request.crawlId}/pages${query ? `?${query}` : ""}`
131
+ );
132
+ }
133
+ async cancel(request) {
134
+ return this.http.post(`/webdata/crawl/${request.id}/cancel`, {
135
+ environment: request.environment,
136
+ projectId: request.projectId
137
+ });
138
+ }
139
+ async delete(request) {
140
+ const params = new URLSearchParams();
141
+ if (request.environment) params.set("environment", request.environment);
142
+ if (request.projectId) params.set("projectId", request.projectId);
143
+ const query = params.toString();
144
+ return this.http.deleteWithBody(
145
+ `/webdata/crawl/${request.id}${query ? `?${query}` : ""}`,
146
+ request
147
+ );
148
+ }
149
+ /**
150
+ * Start a crawl and poll until it completes. Returns the full Crawl record
151
+ * with pages included.
152
+ */
153
+ async startAndWait(request, options = {}) {
154
+ const { pollInterval = 2e3, timeout = 6e5, includePages = true } = options;
155
+ const { id } = await this.start(request);
156
+ const start = Date.now();
157
+ while (Date.now() - start < timeout) {
158
+ const crawl = await this.get({
159
+ id,
160
+ environment: request.environment,
161
+ projectId: request.projectId,
162
+ includePages
163
+ });
164
+ if (crawl.status === "completed" || crawl.status === "failed" || crawl.status === "cancelled") {
165
+ if (crawl.status === "failed") throw new Error(crawl.error || "Crawl failed");
166
+ return crawl;
167
+ }
168
+ await new Promise((r) => setTimeout(r, pollInterval));
169
+ }
170
+ throw new Error("Crawl timed out");
171
+ }
172
+ };
173
+
174
+ export { Crawl$ as Crawl, Crawl$ };
175
+ //# sourceMappingURL=index.mjs.map
176
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/http-client.ts","../../src/crawl/client.ts"],"names":[],"mappings":"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","file":"index.mjs","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(includeContentType = true): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n return headers;\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const bodyString = body === undefined ? undefined : JSON.stringify(body);\n const hasBody = bodyString !== undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.getHeaders(hasBody),\n body: hasBody ? bodyString : 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 deleteWithBody<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"DELETE\", path, body);\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 Crawl Client\n * Recursively crawl a website and extract content from every page.\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n CancelCrawlRequest,\n Crawl,\n CreateCrawlRequest,\n CreateCrawlResponse,\n GetCrawlRequest,\n ListCrawlPagesRequest,\n ListCrawlPagesResponse,\n ListCrawlsRequest,\n ListCrawlsResponse,\n} from \"./types\";\n\nexport class Crawl$ {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Start a crawl.\n *\n * @example\n * ```typescript\n * const { id } = await stack0.crawl.start({\n * url: 'https://docs.example.com',\n * maxDepth: 3,\n * maxPages: 200,\n * formats: ['markdown', 'links'],\n * });\n * ```\n */\n async start(request: CreateCrawlRequest): Promise<CreateCrawlResponse> {\n return this.http.post<CreateCrawlResponse>(\"/webdata/crawl\", request);\n }\n\n /**\n * Get a crawl by ID. Pass `includePages: true` to include the scraped pages.\n */\n async get(request: GetCrawlRequest): Promise<Crawl> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.includePages) params.set(\"includePages\", \"true\");\n const query = params.toString();\n return this.http.get<Crawl>(`/webdata/crawl/${request.id}${query ? `?${query}` : \"\"}`);\n }\n\n async list(request: ListCrawlsRequest = {}): Promise<ListCrawlsResponse> {\n const params = new URLSearchParams();\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\", String(request.limit));\n if (request.cursor) params.set(\"cursor\", request.cursor);\n const query = params.toString();\n return this.http.get<ListCrawlsResponse>(`/webdata/crawl${query ? `?${query}` : \"\"}`);\n }\n\n async listPages(request: ListCrawlPagesRequest): Promise<ListCrawlPagesResponse> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.limit) params.set(\"limit\", String(request.limit));\n if (request.cursor) params.set(\"cursor\", request.cursor);\n const query = params.toString();\n return this.http.get<ListCrawlPagesResponse>(\n `/webdata/crawl/${request.crawlId}/pages${query ? `?${query}` : \"\"}`,\n );\n }\n\n async cancel(request: CancelCrawlRequest): Promise<{ success: boolean }> {\n return this.http.post<{ success: boolean }>(`/webdata/crawl/${request.id}/cancel`, {\n environment: request.environment,\n projectId: request.projectId,\n });\n }\n\n async delete(request: CancelCrawlRequest): 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 const query = params.toString();\n return this.http.deleteWithBody<{ success: boolean }>(\n `/webdata/crawl/${request.id}${query ? `?${query}` : \"\"}`,\n request,\n );\n }\n\n /**\n * Start a crawl and poll until it completes. Returns the full Crawl record\n * with pages included.\n */\n async startAndWait(\n request: CreateCrawlRequest,\n options: { pollInterval?: number; timeout?: number; includePages?: boolean } = {},\n ): Promise<Crawl> {\n const { pollInterval = 2000, timeout = 600_000, includePages = true } = options;\n const { id } = await this.start(request);\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n const crawl = await this.get({\n id,\n environment: request.environment,\n projectId: request.projectId,\n includePages,\n });\n if (crawl.status === \"completed\" || crawl.status === \"failed\" || crawl.status === \"cancelled\") {\n if (crawl.status === \"failed\") throw new Error(crawl.error || \"Crawl failed\");\n return crawl;\n }\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n throw new Error(\"Crawl timed out\");\n }\n}\n\nexport { Crawl$ as Crawl };\n"]}
@@ -0,0 +1,84 @@
1
+ import { a as HttpClientConfig } from '../http-client-Cgie_Rv6.mjs';
2
+ import { E as Environment } from '../shared-types-CjKSP5Xc.mjs';
3
+
4
+ type DocumentStatus = "pending" | "processing" | "completed" | "failed";
5
+ interface CreateDocumentRequest {
6
+ environment?: Environment;
7
+ projectId?: string;
8
+ url?: string;
9
+ fileUrl?: string;
10
+ contentType?: "pdf" | "docx" | "auto";
11
+ webhookUrl?: string;
12
+ webhookSecret?: string;
13
+ metadata?: Record<string, unknown>;
14
+ }
15
+ interface CreateDocumentResponse {
16
+ id: string;
17
+ status: DocumentStatus;
18
+ }
19
+ interface WebdataDocument {
20
+ id: string;
21
+ organizationId: string;
22
+ projectId?: string;
23
+ environment: Environment;
24
+ source: "url" | "upload";
25
+ sourceUrl?: string;
26
+ fileUrl?: string;
27
+ contentType?: string;
28
+ fileSize?: number;
29
+ status: DocumentStatus;
30
+ markdown?: string;
31
+ pageCount?: number;
32
+ error?: string;
33
+ processingTimeMs?: number;
34
+ createdAt: Date | string;
35
+ completedAt?: Date | string;
36
+ }
37
+ interface GetDocumentRequest {
38
+ id: string;
39
+ environment?: Environment;
40
+ projectId?: string;
41
+ }
42
+ interface ListDocumentsRequest {
43
+ environment?: Environment;
44
+ projectId?: string;
45
+ status?: DocumentStatus;
46
+ limit?: number;
47
+ cursor?: string;
48
+ }
49
+ interface ListDocumentsResponse {
50
+ items: WebdataDocument[];
51
+ nextCursor?: string;
52
+ }
53
+
54
+ /**
55
+ * Stack0 Documents Client
56
+ * Parse PDF and DOCX documents into clean markdown.
57
+ */
58
+
59
+ declare class Documents {
60
+ private http;
61
+ constructor(config: HttpClientConfig);
62
+ /**
63
+ * Parse a document from a URL or a previously-uploaded file URL.
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const { id } = await stack0.documents.parse({
68
+ * url: 'https://example.com/whitepaper.pdf',
69
+ * });
70
+ * ```
71
+ */
72
+ parse(request: CreateDocumentRequest): Promise<CreateDocumentResponse>;
73
+ get(request: GetDocumentRequest): Promise<WebdataDocument>;
74
+ list(request?: ListDocumentsRequest): Promise<ListDocumentsResponse>;
75
+ delete(request: GetDocumentRequest): Promise<{
76
+ success: boolean;
77
+ }>;
78
+ parseAndWait(request: CreateDocumentRequest, options?: {
79
+ pollInterval?: number;
80
+ timeout?: number;
81
+ }): Promise<WebdataDocument>;
82
+ }
83
+
84
+ export { type CreateDocumentRequest, type CreateDocumentResponse, type DocumentStatus, Documents, type GetDocumentRequest, type ListDocumentsRequest, type ListDocumentsResponse, type WebdataDocument };
@@ -0,0 +1,84 @@
1
+ import { a as HttpClientConfig } from '../http-client-Cgie_Rv6.js';
2
+ import { E as Environment } from '../shared-types-CjKSP5Xc.js';
3
+
4
+ type DocumentStatus = "pending" | "processing" | "completed" | "failed";
5
+ interface CreateDocumentRequest {
6
+ environment?: Environment;
7
+ projectId?: string;
8
+ url?: string;
9
+ fileUrl?: string;
10
+ contentType?: "pdf" | "docx" | "auto";
11
+ webhookUrl?: string;
12
+ webhookSecret?: string;
13
+ metadata?: Record<string, unknown>;
14
+ }
15
+ interface CreateDocumentResponse {
16
+ id: string;
17
+ status: DocumentStatus;
18
+ }
19
+ interface WebdataDocument {
20
+ id: string;
21
+ organizationId: string;
22
+ projectId?: string;
23
+ environment: Environment;
24
+ source: "url" | "upload";
25
+ sourceUrl?: string;
26
+ fileUrl?: string;
27
+ contentType?: string;
28
+ fileSize?: number;
29
+ status: DocumentStatus;
30
+ markdown?: string;
31
+ pageCount?: number;
32
+ error?: string;
33
+ processingTimeMs?: number;
34
+ createdAt: Date | string;
35
+ completedAt?: Date | string;
36
+ }
37
+ interface GetDocumentRequest {
38
+ id: string;
39
+ environment?: Environment;
40
+ projectId?: string;
41
+ }
42
+ interface ListDocumentsRequest {
43
+ environment?: Environment;
44
+ projectId?: string;
45
+ status?: DocumentStatus;
46
+ limit?: number;
47
+ cursor?: string;
48
+ }
49
+ interface ListDocumentsResponse {
50
+ items: WebdataDocument[];
51
+ nextCursor?: string;
52
+ }
53
+
54
+ /**
55
+ * Stack0 Documents Client
56
+ * Parse PDF and DOCX documents into clean markdown.
57
+ */
58
+
59
+ declare class Documents {
60
+ private http;
61
+ constructor(config: HttpClientConfig);
62
+ /**
63
+ * Parse a document from a URL or a previously-uploaded file URL.
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const { id } = await stack0.documents.parse({
68
+ * url: 'https://example.com/whitepaper.pdf',
69
+ * });
70
+ * ```
71
+ */
72
+ parse(request: CreateDocumentRequest): Promise<CreateDocumentResponse>;
73
+ get(request: GetDocumentRequest): Promise<WebdataDocument>;
74
+ list(request?: ListDocumentsRequest): Promise<ListDocumentsResponse>;
75
+ delete(request: GetDocumentRequest): Promise<{
76
+ success: boolean;
77
+ }>;
78
+ parseAndWait(request: CreateDocumentRequest, options?: {
79
+ pollInterval?: number;
80
+ timeout?: number;
81
+ }): Promise<WebdataDocument>;
82
+ }
83
+
84
+ export { type CreateDocumentRequest, type CreateDocumentResponse, type DocumentStatus, Documents, type GetDocumentRequest, type ListDocumentsRequest, type ListDocumentsResponse, type WebdataDocument };
@@ -0,0 +1,144 @@
1
+ 'use strict';
2
+
3
+ // src/lib/http-client.ts
4
+ var HttpClient = class {
5
+ apiKey;
6
+ baseUrl;
7
+ constructor(config) {
8
+ this.apiKey = config.apiKey;
9
+ this.baseUrl = config.baseUrl || "https://api.stack0.dev/v1";
10
+ }
11
+ getHeaders(includeContentType = true) {
12
+ const headers = {
13
+ Authorization: `Bearer ${this.apiKey}`
14
+ };
15
+ if (includeContentType) {
16
+ headers["Content-Type"] = "application/json";
17
+ }
18
+ return headers;
19
+ }
20
+ async request(method, path, body) {
21
+ const url = `${this.baseUrl}${path}`;
22
+ const bodyString = body === void 0 ? void 0 : JSON.stringify(body);
23
+ const hasBody = bodyString !== void 0;
24
+ try {
25
+ const response = await fetch(url, {
26
+ method,
27
+ headers: this.getHeaders(hasBody),
28
+ body: hasBody ? bodyString : void 0
29
+ });
30
+ if (!response.ok) {
31
+ await this.handleErrorResponse(response);
32
+ }
33
+ const data = await response.json();
34
+ return data;
35
+ } catch (error) {
36
+ if (error instanceof Error && "statusCode" in error) {
37
+ throw error;
38
+ }
39
+ throw this.createError("Network error", error);
40
+ }
41
+ }
42
+ async handleErrorResponse(response) {
43
+ let errorBody;
44
+ try {
45
+ errorBody = await response.json();
46
+ } catch {
47
+ errorBody = { message: response.statusText };
48
+ }
49
+ const error = new Error(errorBody?.message || `HTTP ${response.status}`);
50
+ error.statusCode = response.status;
51
+ error.code = errorBody?.code ?? "";
52
+ error.response = errorBody;
53
+ throw error;
54
+ }
55
+ createError(message, cause) {
56
+ const error = new Error(message);
57
+ error.cause = cause;
58
+ return error;
59
+ }
60
+ async get(path) {
61
+ return this.request("GET", path);
62
+ }
63
+ async post(path, body) {
64
+ return this.request("POST", path, body);
65
+ }
66
+ async put(path, body) {
67
+ return this.request("PUT", path, body);
68
+ }
69
+ async delete(path) {
70
+ return this.request("DELETE", path);
71
+ }
72
+ async deleteWithBody(path, body) {
73
+ return this.request("DELETE", path, body);
74
+ }
75
+ async patch(path, body) {
76
+ return this.request("PATCH", path, body);
77
+ }
78
+ };
79
+
80
+ // src/documents/client.ts
81
+ var Documents = class {
82
+ http;
83
+ constructor(config) {
84
+ this.http = new HttpClient(config);
85
+ }
86
+ /**
87
+ * Parse a document from a URL or a previously-uploaded file URL.
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const { id } = await stack0.documents.parse({
92
+ * url: 'https://example.com/whitepaper.pdf',
93
+ * });
94
+ * ```
95
+ */
96
+ async parse(request) {
97
+ return this.http.post("/webdata/documents", request);
98
+ }
99
+ async get(request) {
100
+ const params = new URLSearchParams();
101
+ if (request.environment) params.set("environment", request.environment);
102
+ if (request.projectId) params.set("projectId", request.projectId);
103
+ const q = params.toString();
104
+ return this.http.get(`/webdata/documents/${request.id}${q ? `?${q}` : ""}`);
105
+ }
106
+ async list(request = {}) {
107
+ const params = new URLSearchParams();
108
+ if (request.environment) params.set("environment", request.environment);
109
+ if (request.projectId) params.set("projectId", request.projectId);
110
+ if (request.status) params.set("status", request.status);
111
+ if (request.limit) params.set("limit", String(request.limit));
112
+ if (request.cursor) params.set("cursor", request.cursor);
113
+ const q = params.toString();
114
+ return this.http.get(`/webdata/documents${q ? `?${q}` : ""}`);
115
+ }
116
+ async delete(request) {
117
+ const params = new URLSearchParams();
118
+ if (request.environment) params.set("environment", request.environment);
119
+ if (request.projectId) params.set("projectId", request.projectId);
120
+ const q = params.toString();
121
+ return this.http.deleteWithBody(
122
+ `/webdata/documents/${request.id}${q ? `?${q}` : ""}`,
123
+ request
124
+ );
125
+ }
126
+ async parseAndWait(request, options = {}) {
127
+ const { pollInterval = 2e3, timeout = 18e4 } = options;
128
+ const { id } = await this.parse(request);
129
+ const start = Date.now();
130
+ while (Date.now() - start < timeout) {
131
+ const doc = await this.get({ id, environment: request.environment, projectId: request.projectId });
132
+ if (doc.status === "completed" || doc.status === "failed") {
133
+ if (doc.status === "failed") throw new Error(doc.error || "Document parsing failed");
134
+ return doc;
135
+ }
136
+ await new Promise((r) => setTimeout(r, pollInterval));
137
+ }
138
+ throw new Error("Document parsing timed out");
139
+ }
140
+ };
141
+
142
+ exports.Documents = Documents;
143
+ //# sourceMappingURL=index.js.map
144
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/http-client.ts","../../src/documents/client.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(includeContentType = true): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n return headers;\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const bodyString = body === undefined ? undefined : JSON.stringify(body);\n const hasBody = bodyString !== undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.getHeaders(hasBody),\n body: hasBody ? bodyString : 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 deleteWithBody<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"DELETE\", path, body);\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 Documents Client\n * Parse PDF and DOCX documents into clean markdown.\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n CreateDocumentRequest,\n CreateDocumentResponse,\n GetDocumentRequest,\n ListDocumentsRequest,\n ListDocumentsResponse,\n WebdataDocument,\n} from \"./types\";\n\nexport class Documents {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Parse a document from a URL or a previously-uploaded file URL.\n *\n * @example\n * ```typescript\n * const { id } = await stack0.documents.parse({\n * url: 'https://example.com/whitepaper.pdf',\n * });\n * ```\n */\n async parse(request: CreateDocumentRequest): Promise<CreateDocumentResponse> {\n return this.http.post<CreateDocumentResponse>(\"/webdata/documents\", request);\n }\n\n async get(request: GetDocumentRequest): Promise<WebdataDocument> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n const q = params.toString();\n return this.http.get<WebdataDocument>(`/webdata/documents/${request.id}${q ? `?${q}` : \"\"}`);\n }\n\n async list(request: ListDocumentsRequest = {}): Promise<ListDocumentsResponse> {\n const params = new URLSearchParams();\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.limit) params.set(\"limit\", String(request.limit));\n if (request.cursor) params.set(\"cursor\", request.cursor);\n const q = params.toString();\n return this.http.get<ListDocumentsResponse>(`/webdata/documents${q ? `?${q}` : \"\"}`);\n }\n\n async delete(request: GetDocumentRequest): 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 const q = params.toString();\n return this.http.deleteWithBody<{ success: boolean }>(\n `/webdata/documents/${request.id}${q ? `?${q}` : \"\"}`,\n request,\n );\n }\n\n async parseAndWait(\n request: CreateDocumentRequest,\n options: { pollInterval?: number; timeout?: number } = {},\n ): Promise<WebdataDocument> {\n const { pollInterval = 2000, timeout = 180_000 } = options;\n const { id } = await this.parse(request);\n const start = Date.now();\n while (Date.now() - start < timeout) {\n const doc = await this.get({ id, environment: request.environment, projectId: request.projectId });\n if (doc.status === \"completed\" || doc.status === \"failed\") {\n if (doc.status === \"failed\") throw new Error(doc.error || \"Document parsing failed\");\n return doc;\n }\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n throw new Error(\"Document parsing timed out\");\n }\n}\n"]}