botasaurus-desktop-api 4.1.43

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/README.md ADDED
@@ -0,0 +1 @@
1
+ # Botasaurus JS Driver
@@ -0,0 +1,60 @@
1
+ declare class Api {
2
+ private _apiUrl;
3
+ private _createResponseFiles;
4
+ private readonly DEFAULT_API_URL;
5
+ constructor({ apiUrl, createResponseFiles }?: {
6
+ apiUrl?: string;
7
+ createResponseFiles?: boolean;
8
+ });
9
+ private _writeJson;
10
+ private _makeApiUrl;
11
+ isApiRunning(): Promise<boolean>;
12
+ createAsyncTask({ data, scraperName }: {
13
+ data: any;
14
+ scraperName?: string;
15
+ }): Promise<any>;
16
+ createSyncTask({ data, scraperName }: {
17
+ data: any;
18
+ scraperName?: string;
19
+ }): Promise<any>;
20
+ createAsyncTasks({ dataItems, scraperName }: {
21
+ dataItems: any[];
22
+ scraperName?: string;
23
+ }): Promise<any>;
24
+ createSyncTasks({ dataItems, scraperName }: {
25
+ dataItems: any[];
26
+ scraperName?: string;
27
+ }): Promise<any>;
28
+ getTasks({ page, perPage, withResults }?: {
29
+ page?: number;
30
+ perPage?: number;
31
+ withResults?: boolean;
32
+ }): Promise<any>;
33
+ getTask(taskId: number): Promise<any>;
34
+ getTaskResults({ taskId, filters, sort, view, page, perPage }: {
35
+ taskId: number;
36
+ filters?: any;
37
+ sort?: any;
38
+ view?: any;
39
+ page?: number;
40
+ perPage?: number;
41
+ }): Promise<any>;
42
+ downloadTaskResults({ taskId, format, filters, sort, view, convertToEnglish }: {
43
+ taskId: number;
44
+ format?: string;
45
+ filters?: any;
46
+ sort?: any;
47
+ view?: any;
48
+ convertToEnglish?: boolean;
49
+ }): Promise<[Buffer, string]>;
50
+ abortTask(taskId: number): Promise<any>;
51
+ deleteTask(taskId: number): Promise<any>;
52
+ deleteTasks({ taskIds }: {
53
+ taskIds: number[];
54
+ }): Promise<any>;
55
+ abortTasks({ taskIds }: {
56
+ taskIds: number[];
57
+ }): Promise<any>;
58
+ }
59
+ export default Api;
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const axios_1 = tslib_1.__importDefault(require("axios"));
5
+ const utils_1 = require("./utils");
6
+ class ApiException extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "ApiException";
10
+ }
11
+ }
12
+ function _createFilename(path) {
13
+ return "output/responses/" + path + ".json";
14
+ }
15
+ function raiseIfBadException(response) {
16
+ if (400 <= response.status && response.status < 500) {
17
+ const data = response.data;
18
+ const message = data === null || data === void 0 ? void 0 : data.message;
19
+ if (message) {
20
+ throw new ApiException(message);
21
+ }
22
+ }
23
+ }
24
+ // interface TaskData {
25
+ // data: any;
26
+ // scraper_name?: string;
27
+ // }
28
+ // interface PaginationParams {
29
+ // page?: number;
30
+ // per_page?: number;
31
+ // with_results?: boolean;
32
+ // }
33
+ // interface TaskResultsParams {
34
+ // filters?: any;
35
+ // sort?: any;
36
+ // view?: any;
37
+ // page?: number;
38
+ // per_page?: number;
39
+ // }
40
+ // interface DownloadParams {
41
+ // format?: string;
42
+ // filters?: any;
43
+ // sort?: any;
44
+ // view?: any;
45
+ // convert_to_english?: boolean;
46
+ // }
47
+ class Api {
48
+ constructor({ apiUrl, createResponseFiles = true } = { createResponseFiles: true }) {
49
+ Object.defineProperty(this, "_apiUrl", {
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true,
53
+ value: void 0
54
+ });
55
+ Object.defineProperty(this, "_createResponseFiles", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: void 0
60
+ });
61
+ Object.defineProperty(this, "DEFAULT_API_URL", {
62
+ enumerable: true,
63
+ configurable: true,
64
+ writable: true,
65
+ value: "http://127.0.0.1:8000"
66
+ });
67
+ /**
68
+ * Initializes the API client with a specified server URL and an option to create response files.
69
+ *
70
+ * @param apiUrl The base URL for the API server. If not specified, defaults to "http://127.0.0.1:8000".
71
+ * @param createResponseFiles Indicates if the client should create response files for each API call. This is useful for debugging or development purposes. Defaults to True.
72
+ */
73
+ this._apiUrl = apiUrl
74
+ ? (0, utils_1.removeAfterFirstSlash)(apiUrl)
75
+ : this.DEFAULT_API_URL;
76
+ this._createResponseFiles = createResponseFiles;
77
+ // Check if API is running (note: this is synchronous in the original, but should be async in TS)
78
+ this.isApiRunning().then((isRunning) => {
79
+ if (!isRunning) {
80
+ throw new ApiException(`API at ${this._apiUrl} is not running. Please check if the API is up and running.`);
81
+ }
82
+ });
83
+ }
84
+ _writeJson(filename, data) {
85
+ /**
86
+ * Writes data to a JSON file specified by the filename. This method only runs if the createResponseFiles flag is True.
87
+ *
88
+ * @param filename The filename for the JSON file to be created.
89
+ * @param data The data to be written to the file.
90
+ */
91
+ if (this._createResponseFiles) {
92
+ const path = _createFilename(filename);
93
+ (0, utils_1.writeJsonResponse)(path, data);
94
+ console.log(`View ${filename} response at: ./${path}`);
95
+ }
96
+ }
97
+ _makeApiUrl(path) {
98
+ return `${this._apiUrl}/${path}`;
99
+ }
100
+ async isApiRunning() {
101
+ /**
102
+ * Checks if the API is running by performing a health check on the "/api" endpoint.
103
+ *
104
+ * @return True if the health check is successful, otherwise False.
105
+ */
106
+ try {
107
+ const response = await axios_1.default.get(this._makeApiUrl("api"));
108
+ return response.status === 200;
109
+ }
110
+ catch (error) {
111
+ if (axios_1.default.isAxiosError(error) && error.code === "ECONNREFUSED") {
112
+ throw new ApiException(`API at ${this._apiUrl} is not running.
113
+ Check the network connection, or verify if the API is running on a different endpoint. In case the API is running on a different endpoint, you can pass the endpoint as follows:
114
+ api = new Api('https://example.com')`);
115
+ }
116
+ throw error;
117
+ }
118
+ }
119
+ async createAsyncTask({ data, scraperName }) {
120
+ /**
121
+ * Submits an asynchronous task to the server.
122
+ *
123
+ * @param data The data to be processed by the task.
124
+ * @param scraperName The name of the scraper to use for the task. If not provided, the server will use the default scraper.
125
+ * @return The created task object.
126
+ */
127
+ const url = this._makeApiUrl("tasks/create-task-async");
128
+ const payload = {
129
+ data,
130
+ scraper_name: scraperName,
131
+ };
132
+ try {
133
+ const response = await axios_1.default.post(url, payload);
134
+ this._writeJson("create_async_task", response.data);
135
+ return response.data;
136
+ }
137
+ catch (error) {
138
+ if (axios_1.default.isAxiosError(error)) {
139
+ raiseIfBadException(error.response);
140
+ }
141
+ throw error;
142
+ }
143
+ }
144
+ async createSyncTask({ data, scraperName }) {
145
+ /**
146
+ * Submits a synchronous task to the server.
147
+ *
148
+ * @param data The data to be processed by the task.
149
+ * @param scraperName The name of the scraper to use for the task. If not provided, the server will use the default scraper.
150
+ * @return The created task object.
151
+ */
152
+ const url = this._makeApiUrl("tasks/create-task-sync");
153
+ const payload = {
154
+ data,
155
+ scraper_name: scraperName,
156
+ };
157
+ try {
158
+ const response = await axios_1.default.post(url, payload);
159
+ this._writeJson("create_sync_task", response.data);
160
+ return response.data;
161
+ }
162
+ catch (error) {
163
+ if (axios_1.default.isAxiosError(error)) {
164
+ raiseIfBadException(error.response);
165
+ }
166
+ throw error;
167
+ }
168
+ }
169
+ async createAsyncTasks({ dataItems, scraperName }) {
170
+ /**
171
+ * Submits multiple asynchronous tasks to the server in a batch.
172
+ *
173
+ * @param dataItems A list of data items to be processed.
174
+ * @param scraperName The name of the scraper to use for the tasks. If not provided, the server will use the default scraper.
175
+ * @return A list of created task objects.
176
+ */
177
+ const url = this._makeApiUrl("tasks/create-task-async");
178
+ const payload = dataItems.map((data) => ({ data, scraper_name: scraperName }));
179
+ try {
180
+ const response = await axios_1.default.post(url, payload);
181
+ this._writeJson("create_async_tasks", response.data);
182
+ return response.data;
183
+ }
184
+ catch (error) {
185
+ if (axios_1.default.isAxiosError(error)) {
186
+ raiseIfBadException(error.response);
187
+ }
188
+ throw error;
189
+ }
190
+ }
191
+ async createSyncTasks({ dataItems, scraperName }) {
192
+ /**
193
+ * Submits multiple synchronous tasks to the server in a batch and waits for the results.
194
+ *
195
+ * @param dataItems A list of data items to be processed.
196
+ * @param scraperName The name of the scraper to use for the tasks. If not provided, the server will use the default scraper.
197
+ * @return A list of created task objects, each with its processing result.
198
+ */
199
+ const url = this._makeApiUrl("tasks/create-task-sync");
200
+ const payload = dataItems.map((data) => ({ data, scraper_name: scraperName }));
201
+ try {
202
+ const response = await axios_1.default.post(url, payload);
203
+ this._writeJson("create_sync_tasks", response.data);
204
+ return response.data;
205
+ }
206
+ catch (error) {
207
+ if (axios_1.default.isAxiosError(error)) {
208
+ raiseIfBadException(error.response);
209
+ }
210
+ throw error;
211
+ }
212
+ }
213
+ async getTasks({ page = 1, perPage, withResults = true } = { page: 1, withResults: true }) {
214
+ /**
215
+ * Fetches tasks from the server, with optional result inclusion, pagination, and filtering.
216
+ *
217
+ * @param page The page number for pagination.
218
+ * @param perPage The number of tasks to return per page.
219
+ * @param withResults Whether to include the task results in the response.
220
+ * @return A dictionary containing the task results and pagination information.
221
+ */
222
+ const url = this._makeApiUrl("tasks");
223
+ const params = {
224
+ with_results: withResults,
225
+ };
226
+ if (page !== undefined && page !== null)
227
+ params.page = page;
228
+ if (perPage !== undefined && perPage !== null)
229
+ params.per_page = perPage;
230
+ try {
231
+ const response = await axios_1.default.get(url, { params });
232
+ if (this._createResponseFiles) {
233
+ const hasManyPages = response.data.total_pages > 1;
234
+ const filename = hasManyPages
235
+ ? `get_tasks-page-${page}`
236
+ : "get_tasks";
237
+ const msg = hasManyPages
238
+ ? `get_tasks, page ${page}`
239
+ : "get_tasks";
240
+ const path = _createFilename(filename);
241
+ (0, utils_1.writeJsonResponse)(path, response.data);
242
+ console.log(`View ${msg} response at: ./${path}`);
243
+ }
244
+ return response.data;
245
+ }
246
+ catch (error) {
247
+ if (axios_1.default.isAxiosError(error)) {
248
+ raiseIfBadException(error.response);
249
+ }
250
+ throw error;
251
+ }
252
+ }
253
+ async getTask(taskId) {
254
+ /**
255
+ * Retrieves a specific task by ID.
256
+ *
257
+ * @param taskId The ID of the task to retrieve.
258
+ * @return The task object.
259
+ */
260
+ const url = this._makeApiUrl(`tasks/${taskId}`);
261
+ try {
262
+ const response = await axios_1.default.get(url);
263
+ this._writeJson("get_task", response.data);
264
+ return response.data;
265
+ }
266
+ catch (error) {
267
+ if (axios_1.default.isAxiosError(error)) {
268
+ raiseIfBadException(error.response);
269
+ }
270
+ throw error;
271
+ }
272
+ }
273
+ async getTaskResults({ taskId, filters, sort, view, page = 1, perPage }) {
274
+ /**
275
+ * Retrieves the results of a specific task.
276
+ *
277
+ * @param taskId The ID of the task.
278
+ * @param filters A dictionary of filters to apply to the task results, optional.
279
+ * @param sort The sort to apply to the task results, optional.
280
+ * @param view The view to apply to the task results, optional.
281
+ * @param page The page number to retrieve, default is 1.
282
+ * @param perPage The number of results to return per page. If perPage is not provided, all results are returned, optional.
283
+ * @return A dictionary containing the task results and pagination information if page and perPage are provided.
284
+ */
285
+ const url = this._makeApiUrl(`tasks/${taskId}/results`);
286
+ const payload = { page };
287
+ if (filters)
288
+ payload.filters = filters;
289
+ if (sort)
290
+ payload.sort = sort;
291
+ if (view)
292
+ payload.view = view;
293
+ if (perPage)
294
+ payload.per_page = perPage;
295
+ try {
296
+ const response = await axios_1.default.post(url, payload);
297
+ if (this._createResponseFiles) {
298
+ const hasManyPages = response.data.total_pages > 1;
299
+ const filename = hasManyPages
300
+ ? `get_task_results-page-${page}`
301
+ : "get_task_results";
302
+ const msg = hasManyPages
303
+ ? `get_task_results, page ${page}`
304
+ : "get_task_results";
305
+ const path = _createFilename(filename);
306
+ (0, utils_1.writeJsonResponse)(path, response.data);
307
+ console.log(`View ${msg} response at: ./${path}`);
308
+ }
309
+ return response.data;
310
+ }
311
+ catch (error) {
312
+ if (axios_1.default.isAxiosError(error)) {
313
+ raiseIfBadException(error.response);
314
+ }
315
+ throw error;
316
+ }
317
+ }
318
+ async downloadTaskResults({ taskId, format, filters, sort, view, convertToEnglish = true }) {
319
+ /**
320
+ * Downloads the results of a specific task in the specified format.
321
+ *
322
+ * @param taskId The ID of the task.
323
+ * @param format The format to download the task results in. Available formats are "json", "csv", "excel". The default format is "json".
324
+ * @param filters A dictionary of filters to apply to the task results, optional.
325
+ * @param sort The sort to apply to the task results, optional.
326
+ * @param view The view to apply to the task results, optional.
327
+ * @param convertToEnglish Whether to convert the task results to English, default is True, optional.
328
+ * @return A tuple containing the downloaded content as a buffer and the filename.
329
+ */
330
+ const url = this._makeApiUrl(`tasks/${taskId}/download`);
331
+ const payload = { convert_to_english: convertToEnglish };
332
+ if (format)
333
+ payload.format = format;
334
+ if (filters)
335
+ payload.filters = filters;
336
+ if (sort)
337
+ payload.sort = sort;
338
+ if (view)
339
+ payload.view = view;
340
+ try {
341
+ const response = await axios_1.default.post(url, payload, {
342
+ responseType: "arraybuffer",
343
+ });
344
+ let content;
345
+ try {
346
+ content = Buffer.from(response.data, 'utf8');
347
+ }
348
+ catch (bufferError) {
349
+ throw new ApiException("Failed to create buffer from response data. Ensure the response data is valid.");
350
+ }
351
+ // @ts-ignore
352
+ const filename = (0, utils_1.getFilenameFromResponseHeaders)(response);
353
+ if (this._createResponseFiles) {
354
+ const path = (0, utils_1.writeFileResponse)("output/responses/", filename, content);
355
+ console.log(`View downloaded file at: ./${path}`);
356
+ }
357
+ return [content, filename];
358
+ }
359
+ catch (error) {
360
+ if (axios_1.default.isAxiosError(error)) {
361
+ raiseIfBadException(error.response);
362
+ }
363
+ throw error;
364
+ }
365
+ }
366
+ async abortTask(taskId) {
367
+ /**
368
+ * Aborts a specific task.
369
+ *
370
+ * @param taskId The ID of the task to abort.
371
+ * @return A success message.
372
+ */
373
+ const url = this._makeApiUrl(`tasks/${taskId}/abort`);
374
+ try {
375
+ const response = await axios_1.default.patch(url);
376
+ this._writeJson("abort_task", response.data);
377
+ return response.data;
378
+ }
379
+ catch (error) {
380
+ if (axios_1.default.isAxiosError(error)) {
381
+ raiseIfBadException(error.response);
382
+ }
383
+ throw error;
384
+ }
385
+ }
386
+ async deleteTask(taskId) {
387
+ /**
388
+ * Deletes a specific task.
389
+ *
390
+ * @param taskId The ID of the task to delete.
391
+ * @return A success message.
392
+ */
393
+ const url = this._makeApiUrl(`tasks/${taskId}`);
394
+ try {
395
+ const response = await axios_1.default.delete(url);
396
+ this._writeJson("delete_task", response.data);
397
+ return response.data;
398
+ }
399
+ catch (error) {
400
+ if (axios_1.default.isAxiosError(error)) {
401
+ raiseIfBadException(error.response);
402
+ }
403
+ throw error;
404
+ }
405
+ }
406
+ async deleteTasks({ taskIds }) {
407
+ /**
408
+ * Bulk deletes tasks.
409
+ *
410
+ * @param taskIds A list of task IDs to be deleted.
411
+ * @return A success message.
412
+ */
413
+ const url = this._makeApiUrl("tasks/bulk-delete");
414
+ const payload = { task_ids: taskIds };
415
+ try {
416
+ const response = await axios_1.default.post(url, payload);
417
+ this._writeJson("delete_tasks", response.data);
418
+ return response.data;
419
+ }
420
+ catch (error) {
421
+ if (axios_1.default.isAxiosError(error)) {
422
+ raiseIfBadException(error.response);
423
+ }
424
+ throw error;
425
+ }
426
+ }
427
+ async abortTasks({ taskIds }) {
428
+ /**
429
+ * Bulk aborts tasks.
430
+ *
431
+ * @param taskIds A list of task IDs to be aborted.
432
+ * @return A success message.
433
+ */
434
+ const url = this._makeApiUrl("tasks/bulk-abort");
435
+ const payload = { task_ids: taskIds };
436
+ try {
437
+ const response = await axios_1.default.post(url, payload);
438
+ this._writeJson("abort_tasks", response.data);
439
+ return response.data;
440
+ }
441
+ catch (error) {
442
+ if (axios_1.default.isAxiosError(error)) {
443
+ raiseIfBadException(error.response);
444
+ }
445
+ throw error;
446
+ }
447
+ }
448
+ }
449
+ exports.default = Api;
450
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,0DAA6C;AAC7C,mCAKiB;AAEjB,MAAM,YAAa,SAAQ,KAAK;IAC5B,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC/B,CAAC;CACJ;AAED,SAAS,eAAe,CAAC,IAAY;IACjC,OAAO,mBAAmB,GAAG,IAAI,GAAG,OAAO,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAuB;IAChD,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC;QAC9B,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;AACL,CAAC;AAED,uBAAuB;AACvB,iBAAiB;AACjB,6BAA6B;AAC7B,IAAI;AAEJ,+BAA+B;AAC/B,qBAAqB;AACrB,yBAAyB;AACzB,8BAA8B;AAC9B,IAAI;AAEJ,gCAAgC;AAChC,qBAAqB;AACrB,kBAAkB;AAClB,kBAAkB;AAClB,qBAAqB;AACrB,yBAAyB;AACzB,IAAI;AAEJ,6BAA6B;AAC7B,uBAAuB;AACvB,qBAAqB;AACrB,kBAAkB;AAClB,kBAAkB;AAClB,oCAAoC;AACpC,IAAI;AAEJ,MAAM,GAAG;IAKL,YAAY,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,KAAyD,EAAE,mBAAmB,EAAE,IAAI,EAAE;QAJ9H;;;;;WAAgB;QAChB;;;;;WAA8B;QACrB;;;;mBAAkB,uBAAuB;WAAC;QAGvD;;;;;WAKG;QACH,IAAI,CAAC,OAAO,GAAG,MAAM;YACjB,CAAC,CAAC,IAAA,6BAAqB,EAAC,MAAM,CAAC;YAC/B,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QAC3B,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC;QAEhD,iGAAiG;QACjG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YACnC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,MAAM,IAAI,YAAY,CAClB,UAAU,IAAI,CAAC,OAAO,6DAA6D,CACtF,CAAC;YACN,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,UAAU,CAAC,QAAgB,EAAE,IAAS;QAC1C;;;;;WAKG;QACH,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAA,yBAAiB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,QAAQ,QAAQ,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,IAAY;QAC5B,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,YAAY;QACd;;;;WAIG;QACH,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1D,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC7D,MAAM,IAAI,YAAY,CAAC,UAAU,IAAI,CAAC,OAAO;;qCAExB,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,WAAW,EAAuC;QAC5E;;;;;;WAMG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG;YACZ,IAAI;YACJ,YAAY,EAAE,WAAW;SAC5B,CAAC;QACF,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpD,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,WAAW,EAAuC;QAC3E;;;;;;WAMG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG;YACZ,IAAI;YACJ,YAAY,EAAE,WAAW;SAC5B,CAAC;QACF,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnD,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,WAAW,EAA8C;QACzF;;;;;;WAMG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,WAAW,EAA8C;QACxF;;;;;;WAMG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpD,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,KAAiE,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;QACjJ;;;;;;;WAOG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,MAAM,GAAQ;YAChB,YAAY,EAAE,WAAW;SAC5B,CAAC;QACF,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QAC5D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;YAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC;QAEzE,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAElD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;gBACnD,MAAM,QAAQ,GAAG,YAAY;oBACzB,CAAC,CAAC,kBAAkB,IAAI,EAAE;oBAC1B,CAAC,CAAC,WAAW,CAAC;gBAClB,MAAM,GAAG,GAAG,YAAY;oBACpB,CAAC,CAAC,mBAAmB,IAAI,EAAE;oBAC3B,CAAC,CAAC,WAAW,CAAC;gBAClB,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAA,yBAAiB,EAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,mBAAmB,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QACxB;;;;;WAKG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,OAAO,EAA8F;QAC/J;;;;;;;;;;WAUG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,MAAM,UAAU,CAAC,CAAC;QACxD,MAAM,OAAO,GAAQ,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QACvC,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAC9B,IAAI,OAAO;YAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;gBACnD,MAAM,QAAQ,GAAG,YAAY;oBACzB,CAAC,CAAC,yBAAyB,IAAI,EAAE;oBACjC,CAAC,CAAC,kBAAkB,CAAC;gBACzB,MAAM,GAAG,GAAG,YAAY;oBACpB,CAAC,CAAC,0BAA0B,IAAI,EAAE;oBAClC,CAAC,CAAC,kBAAkB,CAAC;gBACzB,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAA,yBAAiB,EAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,mBAAmB,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAA0G;QAC9L;;;;;;;;;;WAUG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC;QACzD,MAAM,OAAO,GAAQ,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;QAC9D,IAAI,MAAM;YAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACpC,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QACvC,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAC9B,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAE9B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;gBAC5C,YAAY,EAAE,aAAa;aAC9B,CAAC,CAAC;YAEH,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YAChD,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACnB,MAAM,IAAI,YAAY,CAAC,gFAAgF,CAAC,CAAC;YAC7G,CAAC;YACD,aAAa;YACb,MAAM,QAAQ,GAAG,IAAA,sCAA8B,EAAC,QAAQ,CAAC,CAAC;YAE1D,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAAG,IAAA,yBAAiB,EAC1B,mBAAmB,EACnB,QAAQ,EACR,OAAO,CACV,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC1B;;;;;WAKG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,MAAM,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC3B;;;;;WAKG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAE,OAAO,EAAyB;QAChD;;;;;WAKG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAyB;QAC/C;;;;;WAKG;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,mBAAmB,CAAC,KAAK,CAAC,QAAyB,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;CACJ;AAED,kBAAe,GAAG,CAAC"}
@@ -0,0 +1,13 @@
1
+ declare function removeAfterFirstSlash(inputString: string): string;
2
+ declare function relativePath(targetPath: string, goback?: number): string;
3
+ declare function createDirectoryIfNotExists(passedPath: string): void;
4
+ declare function createOutputDirectoryIfNotExists(): void;
5
+ declare function writeJsonResponse(filePath: string, data: any, indent?: number): void;
6
+ declare function getFilenameFromResponseHeaders(response: {
7
+ headers: {
8
+ get: (header: string) => string | null;
9
+ };
10
+ }): string;
11
+ declare function writeFileResponse(filePath: string, filename: string, content: Buffer): string;
12
+ export { removeAfterFirstSlash, relativePath, createDirectoryIfNotExists, createOutputDirectoryIfNotExists, writeJsonResponse, getFilenameFromResponseHeaders, writeFileResponse };
13
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,iBAAS,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAoB1D;AAED,iBAAS,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAGpE;AAED,iBAAS,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAK5D;AAGD,iBAAS,gCAAgC,IAAI,IAAI,CAOhD;AAED,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI,CAGhF;AAED,iBAAS,8BAA8B,CAAC,QAAQ,EAAE;IAAE,OAAO,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAMjH;AAED,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKtF;AAED,OAAO,EACH,qBAAqB,EACrB,YAAY,EACZ,0BAA0B,EAC1B,gCAAgC,EAChC,iBAAiB,EACjB,8BAA8B,EAC9B,iBAAiB,EACpB,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.removeAfterFirstSlash = removeAfterFirstSlash;
4
+ exports.relativePath = relativePath;
5
+ exports.createDirectoryIfNotExists = createDirectoryIfNotExists;
6
+ exports.createOutputDirectoryIfNotExists = createOutputDirectoryIfNotExists;
7
+ exports.writeJsonResponse = writeJsonResponse;
8
+ exports.getFilenameFromResponseHeaders = getFilenameFromResponseHeaders;
9
+ exports.writeFileResponse = writeFileResponse;
10
+ const tslib_1 = require("tslib");
11
+ const fs_1 = tslib_1.__importDefault(require("fs"));
12
+ const path_1 = tslib_1.__importDefault(require("path"));
13
+ function removeAfterFirstSlash(inputString) {
14
+ let i = 0;
15
+ const strLen = inputString.length;
16
+ while (true) {
17
+ if (i < strLen) {
18
+ const char = inputString[i];
19
+ if (char === '/') {
20
+ if (i + 1 < inputString.length && inputString[i + 1] === '/') {
21
+ i += 2;
22
+ continue;
23
+ }
24
+ else {
25
+ return inputString.substring(0, i);
26
+ }
27
+ }
28
+ i++;
29
+ }
30
+ else {
31
+ break;
32
+ }
33
+ }
34
+ return inputString;
35
+ }
36
+ function relativePath(targetPath, goback = 0) {
37
+ const levels = Array(Math.max(0, goback - 1)).fill('..');
38
+ return path_1.default.resolve(process.cwd(), ...levels, targetPath.trim());
39
+ }
40
+ function createDirectoryIfNotExists(passedPath) {
41
+ const dirPath = relativePath(passedPath, 0);
42
+ if (!fs_1.default.existsSync(dirPath)) {
43
+ fs_1.default.mkdirSync(dirPath, { recursive: true });
44
+ }
45
+ }
46
+ let outputDirectoryCreated = false;
47
+ function createOutputDirectoryIfNotExists() {
48
+ // Check if output directory exists, if not, create it
49
+ if (!outputDirectoryCreated) {
50
+ createDirectoryIfNotExists("output");
51
+ createDirectoryIfNotExists("output/responses");
52
+ outputDirectoryCreated = true;
53
+ }
54
+ }
55
+ function writeJsonResponse(filePath, data, indent = 4) {
56
+ createOutputDirectoryIfNotExists();
57
+ fs_1.default.writeFileSync(filePath, JSON.stringify(data, null, indent), { encoding: 'utf-8' });
58
+ }
59
+ function getFilenameFromResponseHeaders(response) {
60
+ const contentDisposition = response.headers.get('Content-Disposition');
61
+ if (!contentDisposition)
62
+ throw new Error('Content-Disposition header not found');
63
+ const filenamePart = contentDisposition.split('filename=')[1];
64
+ if (!filenamePart)
65
+ throw new Error('Filename not found in Content-Disposition');
66
+ return filenamePart.trim().replace(/^"|"$/g, '');
67
+ }
68
+ function writeFileResponse(filePath, filename, content) {
69
+ createOutputDirectoryIfNotExists();
70
+ const fullPath = path_1.default.join(filePath, filename);
71
+ fs_1.default.writeFileSync(fullPath, content);
72
+ return fullPath;
73
+ }
74
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "botasaurus-desktop-api",
3
+ "version": "4.1.43",
4
+ "description": "The Botasaurus Desktop API Client provides programmatic access to Botasaurus Desktop scrapers with a developer-friendly API.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./utils": "./dist/utils.js"
10
+ },
11
+ "typesVersions": {
12
+ "*": {
13
+ "*": [
14
+ "dist/*"
15
+ ],
16
+ "utils": [
17
+ "dist/utils.d.ts"
18
+ ]
19
+ }
20
+ },
21
+ "engines": {
22
+ "node": ">=15.10.0"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "devDependencies": {
28
+ "@apify/eslint-config-ts": "^0.2.3",
29
+ "@apify/tsconfig": "^0.1.0",
30
+ "@types/node": "^16.4.13",
31
+ "@typescript-eslint/eslint-plugin": "^8.31.1",
32
+ "@typescript-eslint/parser": "^8.31.1",
33
+ "eslint": "^7.0.0",
34
+ "rimraf": "^3.0.2",
35
+ "ts-node": "^10.2.0",
36
+ "typescript": "^5.8.3"
37
+ },
38
+ "scripts": {
39
+ "dev": "tsc -w",
40
+ "build": "rimraf dist tsconfig.tsbuildinfo && tsc && rimraf tsconfig.tsbuildinfo",
41
+ "build-mv": "npm run build && mv -f ~/Documents/grow/botasurus-server-js/dist/* ~/Documents/google-maps-extractor-desktop/node_modules/botasaurus-desktop-api/dist/",
42
+ "build-dev": "nodemon --watch \"src/**/*.ts\" --exec \"npm run build\"",
43
+ "clean": "rimraf dist tsconfig.tsbuildinfo",
44
+ "update": "npm update botasaurus",
45
+ "clean-install": "rm -rf dist/ node_modules/ package-lock.json yarn.lock .next/* && npm install --legacy-peer-deps",
46
+ "prepublishOnly": "npm run build",
47
+ "local-proxy": "node ./dist/run_locally.js",
48
+ "mtest": "node test/test.mjs",
49
+ "upload": "python3 increment_version.py && rm -rf dist/ && npm publish",
50
+ "test": "nyc cross-env NODE_OPTIONS=--insecure-http-parser mocha --bail",
51
+ "test:watch": "nyc cross-env NODE_OPTIONS=--insecure-http-parser mocha --bail --watch",
52
+ "lint": "eslint src",
53
+ "lint-fix": "eslint src --fix"
54
+ },
55
+ "author": {
56
+ "name": "Chetan",
57
+ "url": "https://www.omkar.cloud"
58
+ },
59
+ "license": "Apache-2.0",
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "git+https://github.com/omkarcloud/botasaurus"
63
+ },
64
+ "bugs": {
65
+ "url": "https://github.com/omkarcloud/botasaurus/issues"
66
+ },
67
+ "dependencies": {
68
+ "axios": "^1.9.0"
69
+ }
70
+ }