crawlee-one 1.0.0

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.
Files changed (131) hide show
  1. package/README.md +81 -0
  2. package/dist/cjs/cli/cli.d.ts +1 -0
  3. package/dist/cjs/cli/cli.js +61 -0
  4. package/dist/cjs/cli/cli.js.map +1 -0
  5. package/dist/cjs/cli/index.d.ts +2 -0
  6. package/dist/cjs/cli/index.js +6 -0
  7. package/dist/cjs/cli/index.js.map +1 -0
  8. package/dist/cjs/index.d.ts +24 -0
  9. package/dist/cjs/index.js +43 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/lib/actions/dom.d.ts +102 -0
  12. package/dist/cjs/lib/actions/dom.js +743 -0
  13. package/dist/cjs/lib/actions/dom.js.map +1 -0
  14. package/dist/cjs/lib/actions/domUtils.d.ts +42 -0
  15. package/dist/cjs/lib/actions/domUtils.js +126 -0
  16. package/dist/cjs/lib/actions/domUtils.js.map +1 -0
  17. package/dist/cjs/lib/actions/page.d.ts +69 -0
  18. package/dist/cjs/lib/actions/page.js +205 -0
  19. package/dist/cjs/lib/actions/page.js.map +1 -0
  20. package/dist/cjs/lib/actions/scrapeListing.d.ts +78 -0
  21. package/dist/cjs/lib/actions/scrapeListing.js +242 -0
  22. package/dist/cjs/lib/actions/scrapeListing.js.map +1 -0
  23. package/dist/cjs/lib/actor/actor.d.ts +90 -0
  24. package/dist/cjs/lib/actor/actor.js +306 -0
  25. package/dist/cjs/lib/actor/actor.js.map +1 -0
  26. package/dist/cjs/lib/actor/types.d.ts +162 -0
  27. package/dist/cjs/lib/actor/types.js +3 -0
  28. package/dist/cjs/lib/actor/types.js.map +1 -0
  29. package/dist/cjs/lib/actor.d.ts +189 -0
  30. package/dist/cjs/lib/actor.js +225 -0
  31. package/dist/cjs/lib/actor.js.map +1 -0
  32. package/dist/cjs/lib/actorSpec.d.ts +20 -0
  33. package/dist/cjs/lib/actorSpec.js +3 -0
  34. package/dist/cjs/lib/actorSpec.js.map +1 -0
  35. package/dist/cjs/lib/config.d.ts +561 -0
  36. package/dist/cjs/lib/config.js +707 -0
  37. package/dist/cjs/lib/config.js.map +1 -0
  38. package/dist/cjs/lib/dataset/maxCount.d.ts +30 -0
  39. package/dist/cjs/lib/dataset/maxCount.js +55 -0
  40. package/dist/cjs/lib/dataset/maxCount.js.map +1 -0
  41. package/dist/cjs/lib/dataset/pushData.d.ts +123 -0
  42. package/dist/cjs/lib/dataset/pushData.js +182 -0
  43. package/dist/cjs/lib/dataset/pushData.js.map +1 -0
  44. package/dist/cjs/lib/dataset.d.ts +98 -0
  45. package/dist/cjs/lib/dataset.js +122 -0
  46. package/dist/cjs/lib/dataset.js.map +1 -0
  47. package/dist/cjs/lib/dom.d.ts +78 -0
  48. package/dist/cjs/lib/dom.js +243 -0
  49. package/dist/cjs/lib/dom.js.map +1 -0
  50. package/dist/cjs/lib/error/errorHandler.d.ts +112 -0
  51. package/dist/cjs/lib/error/errorHandler.js +164 -0
  52. package/dist/cjs/lib/error/errorHandler.js.map +1 -0
  53. package/dist/cjs/lib/error/sentry.d.ts +11 -0
  54. package/dist/cjs/lib/error/sentry.js +60 -0
  55. package/dist/cjs/lib/error/sentry.js.map +1 -0
  56. package/dist/cjs/lib/integrations/apify.d.ts +67 -0
  57. package/dist/cjs/lib/integrations/apify.js +106 -0
  58. package/dist/cjs/lib/integrations/apify.js.map +1 -0
  59. package/dist/cjs/lib/integrations/types.d.ts +274 -0
  60. package/dist/cjs/lib/integrations/types.js +3 -0
  61. package/dist/cjs/lib/integrations/types.js.map +1 -0
  62. package/dist/cjs/lib/io/dataset.d.ts +67 -0
  63. package/dist/cjs/lib/io/dataset.js +86 -0
  64. package/dist/cjs/lib/io/dataset.js.map +1 -0
  65. package/dist/cjs/lib/io/maxCount.d.ts +30 -0
  66. package/dist/cjs/lib/io/maxCount.js +55 -0
  67. package/dist/cjs/lib/io/maxCount.js.map +1 -0
  68. package/dist/cjs/lib/io/pushData.d.ts +124 -0
  69. package/dist/cjs/lib/io/pushData.js +193 -0
  70. package/dist/cjs/lib/io/pushData.js.map +1 -0
  71. package/dist/cjs/lib/io/pushRequests.d.ts +38 -0
  72. package/dist/cjs/lib/io/pushRequests.js +63 -0
  73. package/dist/cjs/lib/io/pushRequests.js.map +1 -0
  74. package/dist/cjs/lib/io/requestQueue.d.ts +28 -0
  75. package/dist/cjs/lib/io/requestQueue.js +40 -0
  76. package/dist/cjs/lib/io/requestQueue.js.map +1 -0
  77. package/dist/cjs/lib/log.d.ts +38 -0
  78. package/dist/cjs/lib/log.js +54 -0
  79. package/dist/cjs/lib/log.js.map +1 -0
  80. package/dist/cjs/lib/migrate/localMigrator.d.ts +10 -0
  81. package/dist/cjs/lib/migrate/localMigrator.js +57 -0
  82. package/dist/cjs/lib/migrate/localMigrator.js.map +1 -0
  83. package/dist/cjs/lib/migrate/localState.d.ts +7 -0
  84. package/dist/cjs/lib/migrate/localState.js +43 -0
  85. package/dist/cjs/lib/migrate/localState.js.map +1 -0
  86. package/dist/cjs/lib/migrate/types.d.ts +6 -0
  87. package/dist/cjs/lib/migrate/types.js +3 -0
  88. package/dist/cjs/lib/migrate/types.js.map +1 -0
  89. package/dist/cjs/lib/readme/readme.d.ts +65 -0
  90. package/dist/cjs/lib/readme/readme.js +534 -0
  91. package/dist/cjs/lib/readme/readme.js.map +1 -0
  92. package/dist/cjs/lib/readme/types.d.ts +260 -0
  93. package/dist/cjs/lib/readme/types.js +54 -0
  94. package/dist/cjs/lib/readme/types.js.map +1 -0
  95. package/dist/cjs/lib/router.d.ts +132 -0
  96. package/dist/cjs/lib/router.js +165 -0
  97. package/dist/cjs/lib/router.js.map +1 -0
  98. package/dist/cjs/lib/scraper/scrapeListing.d.ts +78 -0
  99. package/dist/cjs/lib/scraper/scrapeListing.js +242 -0
  100. package/dist/cjs/lib/scraper/scrapeListing.js.map +1 -0
  101. package/dist/cjs/lib/test/actor.d.ts +21 -0
  102. package/dist/cjs/lib/test/actor.js +56 -0
  103. package/dist/cjs/lib/test/actor.js.map +1 -0
  104. package/dist/cjs/lib/test/mockApifyClient.d.ts +32 -0
  105. package/dist/cjs/lib/test/mockApifyClient.js +176 -0
  106. package/dist/cjs/lib/test/mockApifyClient.js.map +1 -0
  107. package/dist/cjs/types.d.ts +31 -0
  108. package/dist/cjs/types.js +3 -0
  109. package/dist/cjs/types.js.map +1 -0
  110. package/dist/cjs/utils/async.d.ts +19 -0
  111. package/dist/cjs/utils/async.js +74 -0
  112. package/dist/cjs/utils/async.js.map +1 -0
  113. package/dist/cjs/utils/error.d.ts +1 -0
  114. package/dist/cjs/utils/error.js +10 -0
  115. package/dist/cjs/utils/error.js.map +1 -0
  116. package/dist/cjs/utils/format.d.ts +9 -0
  117. package/dist/cjs/utils/format.js +19 -0
  118. package/dist/cjs/utils/format.js.map +1 -0
  119. package/dist/cjs/utils/package.d.ts +15 -0
  120. package/dist/cjs/utils/package.js +25 -0
  121. package/dist/cjs/utils/package.js.map +1 -0
  122. package/dist/cjs/utils/types.d.ts +6 -0
  123. package/dist/cjs/utils/types.js +9 -0
  124. package/dist/cjs/utils/types.js.map +1 -0
  125. package/dist/cjs/utils/url.d.ts +9 -0
  126. package/dist/cjs/utils/url.js +32 -0
  127. package/dist/cjs/utils/url.js.map +1 -0
  128. package/dist/cjs/utils/valueMonitor.d.ts +31 -0
  129. package/dist/cjs/utils/valueMonitor.js +91 -0
  130. package/dist/cjs/utils/valueMonitor.js.map +1 -0
  131. package/package.json +85 -0
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createMockStorageDataset = exports.createMockStorageClient = exports.createMockDatasetCollectionClient = exports.createMockRequestQueueClient = exports.createMockKeyValueStoreClient = exports.createMockClientRequestQueue = exports.createMockClientDataset = void 0;
13
+ const createMockClientDataset = (overrides) => (Object.assign({ id: 'MockClientDataset.id', name: 'MockClientDataset.name', title: 'MockClientDataset.title', userId: 'MockClientDataset.id.userId', createdAt: new Date('2023-04-17'), modifiedAt: new Date('2023-04-17'), accessedAt: new Date('2023-04-17'), itemCount: 10, cleanItemCount: 10, actId: 'MockClientDataset.actId', actRunId: 'MockClientDataset.actRunId', stats: {}, fields: [] }, overrides));
14
+ exports.createMockClientDataset = createMockClientDataset;
15
+ const createMockClientRequestQueue = (overrides) => (Object.assign({ id: 'MockClientRequestQueue.id', name: 'MockClientRequestQueue.name', title: 'MockClientRequestQueue.title', userId: 'MockClientRequestQueue.userId', createdAt: new Date('2023-04-17'), modifiedAt: new Date('2023-04-17'), accessedAt: new Date('2023-04-17'),
16
+ // expireAt?: string;
17
+ totalRequestCount: 0, handledRequestCount: 0, pendingRequestCount: 0,
18
+ // actId?: string;
19
+ // actRunId?: string;
20
+ hadMultipleClients: false, stats: {} }, overrides));
21
+ exports.createMockClientRequestQueue = createMockClientRequestQueue;
22
+ const createMockKeyValueStoreClient = ({ log, } = {}) => {
23
+ return {
24
+ getRecord: (...args) => {
25
+ const [key] = args;
26
+ log === null || log === void 0 ? void 0 : log(`Called MockKeyValueStoreClient.getRecord with ${JSON.stringify(args)}`);
27
+ return Promise.resolve({
28
+ key,
29
+ value: null,
30
+ // contentType?: string;
31
+ });
32
+ },
33
+ setRecord: (...args) => {
34
+ log === null || log === void 0 ? void 0 : log(`Called MockKeyValueStoreClient.setRecord with ${JSON.stringify(args)}`);
35
+ return Promise.resolve();
36
+ },
37
+ // get(): Promise<KeyValueStoreInfo | undefined>;
38
+ // update(newFields: KeyValueStoreClientUpdateOptions): Promise<Partial<KeyValueStoreInfo>>;
39
+ // delete(): Promise<void>;
40
+ // listKeys(options?: KeyValueStoreClientListOptions): Promise<KeyValueStoreClientListData>;
41
+ // getRecord(key: string, options?: KeyValueStoreClientGetRecordOptions): Promise<KeyValueStoreRecord | undefined>;
42
+ // setRecord(record: KeyValueStoreRecord): Promise<void>;
43
+ // deleteRecord(key: string): Promise<void>;
44
+ };
45
+ };
46
+ exports.createMockKeyValueStoreClient = createMockKeyValueStoreClient;
47
+ const createMockRequestQueueClient = ({ log, onBatchAddRequests, } = {}) => {
48
+ const requestQueue = [];
49
+ return {
50
+ batchAddRequests: (...args) => __awaiter(void 0, void 0, void 0, function* () {
51
+ const [requests, options] = args;
52
+ log === null || log === void 0 ? void 0 : log(`Called MockRequestQueueClient.batchAddRequests with ${JSON.stringify(args)}`);
53
+ const reqsWithIds = requests.map((r) => (Object.assign(Object.assign({}, r), { id: Math.random() + '' })));
54
+ requestQueue.push(...reqsWithIds);
55
+ const reqsAddedToQueue = reqsWithIds.map((r) => ({
56
+ uniqueKey: r.uniqueKey,
57
+ requestId: r.id,
58
+ wasAlreadyPresent: false,
59
+ wasAlreadyHandled: false,
60
+ }));
61
+ yield (onBatchAddRequests === null || onBatchAddRequests === void 0 ? void 0 : onBatchAddRequests(requests, options));
62
+ return Promise.resolve({
63
+ unprocessedRequests: [],
64
+ processedRequests: reqsAddedToQueue,
65
+ });
66
+ }),
67
+ get: (...args) => {
68
+ log === null || log === void 0 ? void 0 : log(`Called MockRequestQueueClient.get with ${JSON.stringify(args)}`);
69
+ return Promise.resolve((0, exports.createMockClientRequestQueue)());
70
+ },
71
+ getRequest: (...args) => __awaiter(void 0, void 0, void 0, function* () {
72
+ const [id] = args;
73
+ log === null || log === void 0 ? void 0 : log(`Called MockRequestQueueClient.getRequest with ${JSON.stringify(args)}`);
74
+ log === null || log === void 0 ? void 0 : log(`requestQueue: ${JSON.stringify(requestQueue.map((r) => r.id))}`);
75
+ const indexOfNextRequest = requestQueue.findIndex((r) => r.id === id);
76
+ if (indexOfNextRequest === -1)
77
+ return undefined;
78
+ const [req] = requestQueue.splice(indexOfNextRequest, 1);
79
+ return req;
80
+ }),
81
+ updateRequest: (...args) => {
82
+ const [request, options] = args;
83
+ log === null || log === void 0 ? void 0 : log(`Called MockRequestQueueClient.updateRequest with ${JSON.stringify(args)}`);
84
+ log === null || log === void 0 ? void 0 : log(`requestQueue: ${JSON.stringify(requestQueue)}`);
85
+ const indexOfUpdatedRequest = requestQueue.findIndex((r) => r.id === request.id);
86
+ const wasAlreadyPresent = indexOfUpdatedRequest !== -1;
87
+ if (wasAlreadyPresent) {
88
+ const req = requestQueue[indexOfUpdatedRequest];
89
+ Object.assign(req, request);
90
+ }
91
+ else {
92
+ const req = Object.assign({}, request);
93
+ requestQueue.push(req);
94
+ }
95
+ log === null || log === void 0 ? void 0 : log(`requestQueue: ${JSON.stringify(requestQueue)}`);
96
+ // [{"id":"0.9121846955138175","url":"https://profesia.sk/partneri","loadedUrl":"https://www.profesia.sk/partneri","uniqueKey":"https://profesia.sk/partneri","method":"GET","noRetry":false,"retryCount":0,"errorMessages":[],"headers":{},"userData":{"__crawlee":{"state":4}},"handledAt":"2023-04-17T12:15:57.350Z"}]
97
+ return Promise.resolve({
98
+ requestId: request.id,
99
+ wasAlreadyPresent,
100
+ wasAlreadyHandled: false,
101
+ });
102
+ },
103
+ listHead: (...args) => {
104
+ var _a;
105
+ const [options] = args;
106
+ log === null || log === void 0 ? void 0 : log(`Called MockRequestQueueClient.listHead with ${JSON.stringify(args)}`);
107
+ return Promise.resolve({
108
+ items: [],
109
+ queueModifiedAt: new Date('2023-04-17'),
110
+ hadMultipleClients: false,
111
+ limit: (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : 100,
112
+ });
113
+ },
114
+ };
115
+ };
116
+ exports.createMockRequestQueueClient = createMockRequestQueueClient;
117
+ const createMockDatasetCollectionClient = ({ log, } = {}) => {
118
+ const dataset = [];
119
+ return {
120
+ list: (options) => {
121
+ var _a, _b, _c, _d;
122
+ let items = dataset.slice();
123
+ if (options === null || options === void 0 ? void 0 : options.desc)
124
+ items = items.reverse();
125
+ if (options === null || options === void 0 ? void 0 : options.offset)
126
+ items = items.slice(options.offset);
127
+ return Promise.resolve({
128
+ total: dataset.length,
129
+ count: (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : items.length,
130
+ offset: (_b = options === null || options === void 0 ? void 0 : options.offset) !== null && _b !== void 0 ? _b : 0,
131
+ limit: (_c = options === null || options === void 0 ? void 0 : options.limit) !== null && _c !== void 0 ? _c : items.length,
132
+ desc: (_d = options === null || options === void 0 ? void 0 : options.desc) !== null && _d !== void 0 ? _d : false,
133
+ items,
134
+ });
135
+ },
136
+ getOrCreate: (name, options) => Promise.resolve((0, exports.createMockClientDataset)()),
137
+ // _list, _create, _getOrCreate, baseUrl
138
+ };
139
+ };
140
+ exports.createMockDatasetCollectionClient = createMockDatasetCollectionClient;
141
+ const createMockStorageClient = ({ log, onBatchAddRequests, } = {}) => {
142
+ return {
143
+ datasets: (...args) => {
144
+ log === null || log === void 0 ? void 0 : log(`Called MockStorageClient.datasets with ${JSON.stringify(args)}`);
145
+ return (0, exports.createMockDatasetCollectionClient)({ log });
146
+ },
147
+ requestQueue: (...args) => {
148
+ log === null || log === void 0 ? void 0 : log(`Called MockStorageClient.requestQueue with ${JSON.stringify(args)}`);
149
+ return (0, exports.createMockRequestQueueClient)({ log, onBatchAddRequests });
150
+ },
151
+ keyValueStore: (...args) => {
152
+ log === null || log === void 0 ? void 0 : log(`Called MockStorageClient.keyValueStore with ${JSON.stringify(args)}`);
153
+ return (0, exports.createMockKeyValueStoreClient)({ log });
154
+ },
155
+ // dataset, keyValueStores, requestQueues
156
+ };
157
+ };
158
+ exports.createMockStorageClient = createMockStorageClient;
159
+ const createMockStorageDataset = (...args) => {
160
+ const origArgs = args.slice().slice(0, 2);
161
+ const [datasetId, __, custom] = args;
162
+ const { log, onPushData, onGetInfo } = custom || {};
163
+ log === null || log === void 0 ? void 0 : log(`Called MockStorageDataset with ${JSON.stringify(origArgs)}`);
164
+ return Promise.resolve({
165
+ pushData: (...args) => __awaiter(void 0, void 0, void 0, function* () {
166
+ log === null || log === void 0 ? void 0 : log(`Called MockStorageDataset.pushData (instance ${datasetId}) with ${JSON.stringify(args)}`); // prettier-ignore
167
+ yield (onPushData === null || onPushData === void 0 ? void 0 : onPushData(...args));
168
+ }),
169
+ getInfo: (...args) => __awaiter(void 0, void 0, void 0, function* () {
170
+ log === null || log === void 0 ? void 0 : log(`Called MockStorageDataset.getInfo (instance ${datasetId}) with ${JSON.stringify(args)}`); // prettier-ignore
171
+ return onGetInfo ? onGetInfo(...args) : { itemCount: 10 };
172
+ }),
173
+ });
174
+ };
175
+ exports.createMockStorageDataset = createMockStorageDataset;
176
+ //# sourceMappingURL=mockApifyClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockApifyClient.js","sourceRoot":"","sources":["../../../../src/lib/test/mockApifyClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAiCO,MAAM,uBAAuB,GAAG,CAAC,SAAyB,EAAiB,EAAE,CAAC,iBACnF,EAAE,EAAE,sBAAsB,EAC1B,IAAI,EAAE,wBAAwB,EAC9B,KAAK,EAAE,yBAAyB,EAChC,MAAM,EAAE,6BAA6B,EACrC,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EACjC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAClC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAClC,SAAS,EAAE,EAAE,EACb,cAAc,EAAE,EAAE,EAClB,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,4BAA4B,EACtC,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,IACP,SAAS,EACZ,CAAC;AAfU,QAAA,uBAAuB,2BAejC;AAEI,MAAM,4BAA4B,GAAG,CAC1C,SAA8B,EACV,EAAE,CAAC,iBACvB,EAAE,EAAE,2BAA2B,EAC/B,IAAI,EAAE,6BAA6B,EACnC,KAAK,EAAE,8BAA8B,EACrC,MAAM,EAAE,+BAA+B,EACvC,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EACjC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAClC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IAClC,qBAAqB;IACrB,iBAAiB,EAAE,CAAC,EACpB,mBAAmB,EAAE,CAAC,EACtB,mBAAmB,EAAE,CAAC;IACtB,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB,EAAE,KAAK,EACzB,KAAK,EAAE,EAAE,IACN,SAAS,EACZ,CAAC;AAnBU,QAAA,4BAA4B,gCAmBtC;AAEI,MAAM,6BAA6B,GAAG,CAAC,EAC5C,GAAG,MAC8B,EAAE,EAAuB,EAAE;IAC5D,OAAO;QACL,SAAS,EAAE,CAAC,GAAG,IAAc,EAAiD,EAAE;YAC9E,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACnB,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,iDAAiD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/E,OAAO,OAAO,CAAC,OAAO,CAAC;gBACrB,GAAG;gBACH,KAAK,EAAE,IAAI;gBACX,wBAAwB;aACzB,CAAC,CAAC;QACL,CAAC;QACD,SAAS,EAAE,CAAC,GAAG,IAAwC,EAAiB,EAAE;YACxE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,iDAAiD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/E,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,iDAAiD;QACjD,4FAA4F;QAC5F,2BAA2B;QAC3B,4FAA4F;QAC5F,mHAAmH;QACnH,yDAAyD;QACzD,4CAA4C;KACtC,CAAC;AACX,CAAC,CAAC;AAzBW,QAAA,6BAA6B,iCAyBxC;AAEK,MAAM,4BAA4B,GAAG,CAAC,EAC3C,GAAG,EACH,kBAAkB,MAIhB,EAAE,EAAsB,EAAE;IAC5B,MAAM,YAAY,GAAU,EAAE,CAAC;IAE/B,OAAO;QACL,gBAAgB,EAAE,CAChB,GAAG,IAA0B,EAC4B,EAAE;YAC3D,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;YACjC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,uDAAuD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iCAAM,CAAC,KAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAG,CAAC,CAAC;YAC5E,YAAY,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YAElC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/C,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,SAAS,EAAE,CAAC,CAAC,EAAE;gBACf,iBAAiB,EAAE,KAAK;gBACxB,iBAAiB,EAAE,KAAK;aACzB,CAAC,CAAC,CAAC;YAEJ,MAAM,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAG,QAAQ,EAAE,OAAO,CAAC,CAAA,CAAC;YAE9C,OAAO,OAAO,CAAC,OAAO,CAAC;gBACrB,mBAAmB,EAAE,EAAE;gBACvB,iBAAiB,EAAE,gBAAgB;aACpC,CAAC,CAAC;QACL,CAAC,CAAA;QAED,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YACf,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,0CAA0C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAA,oCAA4B,GAAE,CAAC,CAAC;QACzD,CAAC;QAED,UAAU,EAAE,CACV,GAAG,IAAkB,EACoC,EAAE;YAC3D,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;YAClB,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,iDAAiD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/E,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAExE,MAAM,kBAAkB,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,IAAI,kBAAkB,KAAK,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC;YAEhD,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,GAAG,CAAC;QACb,CAAC,CAAA;QAED,aAAa,EAAE,CACb,GAAG,IAGF,EAC4C,EAAE;YAC/C,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;YAChC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,oDAAoD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClF,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEvD,MAAM,qBAAqB,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;YACjF,MAAM,iBAAiB,GAAG,qBAAqB,KAAK,CAAC,CAAC,CAAC;YACvD,IAAI,iBAAiB,EAAE;gBACrB,MAAM,GAAG,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;gBAChD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;aAC7B;iBAAM;gBACL,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBACvC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACxB;YAED,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAEvD,yTAAyT;YACzT,OAAO,OAAO,CAAC,OAAO,CAAC;gBACrB,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,iBAAiB;gBACjB,iBAAiB,EAAE,KAAK;aACzB,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,EAAE,CACR,GAAG,IAAmD,EACX,EAAE;;YAC7C,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;YACvB,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,+CAA+C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,OAAO,CAAC,OAAO,CAAC;gBACrB,KAAK,EAAE,EAAE;gBACT,eAAe,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;gBACvC,kBAAkB,EAAE,KAAK;gBACzB,KAAK,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,GAAG;aAC7B,CAAC,CAAC;QACL,CAAC;KACK,CAAC;AACX,CAAC,CAAC;AA/FW,QAAA,4BAA4B,gCA+FvC;AAEK,MAAM,iCAAiC,GAAG,CAAC,EAChD,GAAG,MAC8B,EAAE,EAA2B,EAAE;IAChE,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,OAAO;QACL,IAAI,EAAE,CACJ,OAA4C,EACA,EAAE;;YAC9C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI;gBAAE,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM;gBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEzD,OAAO,OAAO,CAAC,OAAO,CAAC;gBACrB,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,KAAK,CAAC,MAAM;gBACrC,MAAM,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,CAAC;gBAC5B,KAAK,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,KAAK,CAAC,MAAM;gBACrC,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,KAAK;gBAC5B,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,WAAW,EAAE,CACX,IAAa,EACb,OAAmD,EAC3B,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAA,+BAAuB,GAAE,CAAC;QAEvE,wCAAwC;KAClC,CAAC;AACX,CAAC,CAAC;AA9BW,QAAA,iCAAiC,qCA8B5C;AAEK,MAAM,uBAAuB,GAAG,CAAC,EACtC,GAAG,EACH,kBAAkB,MAIhB,EAAE,EAAiB,EAAE;IACvB,OAAO;QACL,QAAQ,EAAE,CAAC,GAAG,IAAI,EAA2B,EAAE;YAC7C,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,0CAA0C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,OAAO,IAAA,yCAAiC,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YACxB,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,8CAA8C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO,IAAA,oCAA4B,EAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,aAAa,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YACzB,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,+CAA+C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,IAAA,qCAA6B,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,yCAAyC;KACnC,CAAC;AACX,CAAC,CAAC;AAvBW,QAAA,uBAAuB,2BAuBlC;AAEK,MAAM,wBAAwB,GAAG,CACtC,GAAG,IAQF,EACsB,EAAE;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;IACpD,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,kCAAkC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEpE,OAAO,OAAO,CAAC,OAAO,CAAC;QACrB,QAAQ,EAAE,CAAO,GAAG,IAAI,EAAE,EAAE;YAC1B,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,gDAAgD,SAAS,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB;YACpH,MAAM,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,GAAG,IAAI,CAAC,CAAA,CAAC;QAC9B,CAAC,CAAA;QACD,OAAO,EAAE,CAAO,GAAG,IAAI,EAAE,EAAE;YACzB,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAG,+CAA+C,SAAS,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB;YACnH,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC5D,CAAC,CAAA;KACS,CAAC,CAAC;AAChB,CAAC,CAAC;AA1BW,QAAA,wBAAwB,4BA0BnC","sourcesContent":["import type { Dataset, OpenStorageOptions } from 'apify';\nimport type {\n RequestQueue as ClientRequestQueue,\n RequestQueueClientAddRequestOptions,\n RequestQueueClientAddRequestResult,\n RequestQueueClientBatchAddRequestWithRetriesOptions,\n RequestQueueClientBatchRequestsOperationResult,\n RequestQueueClientGetRequestResult,\n RequestQueueClientListHeadOptions,\n RequestQueueClientListHeadResult,\n RequestQueueClientRequestSchema,\n} from 'apify-client';\nimport type {\n Dataset as ClientDataset,\n DatasetCollectionClient,\n DatasetCollectionClientGetOrCreateOptions,\n DatasetCollectionClientListOptions,\n DatasetCollectionClientListResult,\n KeyValueStoreClient,\n KeyValueStoreRecord,\n RequestQueueClient,\n} from 'apify-client';\nimport type { StorageClient } from 'crawlee';\n\nimport type { MaybePromise } from '../../utils/types';\n\ntype BatchAddRequestsArgs = [\n requests: Omit<RequestQueueClientRequestSchema, 'id'>[],\n options?: RequestQueueClientBatchAddRequestWithRetriesOptions\n];\n\nexport type OnBatchAddRequests = (...args: BatchAddRequestsArgs) => MaybePromise<void>;\n\nexport const createMockClientDataset = (overrides?: ClientDataset): ClientDataset => ({\n id: 'MockClientDataset.id',\n name: 'MockClientDataset.name',\n title: 'MockClientDataset.title',\n userId: 'MockClientDataset.id.userId',\n createdAt: new Date('2023-04-17'),\n modifiedAt: new Date('2023-04-17'),\n accessedAt: new Date('2023-04-17'),\n itemCount: 10,\n cleanItemCount: 10,\n actId: 'MockClientDataset.actId',\n actRunId: 'MockClientDataset.actRunId',\n stats: {},\n fields: [],\n ...overrides,\n});\n\nexport const createMockClientRequestQueue = (\n overrides?: ClientRequestQueue\n): ClientRequestQueue => ({\n id: 'MockClientRequestQueue.id',\n name: 'MockClientRequestQueue.name',\n title: 'MockClientRequestQueue.title',\n userId: 'MockClientRequestQueue.userId',\n createdAt: new Date('2023-04-17'),\n modifiedAt: new Date('2023-04-17'),\n accessedAt: new Date('2023-04-17'),\n // expireAt?: string;\n totalRequestCount: 0,\n handledRequestCount: 0,\n pendingRequestCount: 0,\n // actId?: string;\n // actRunId?: string;\n hadMultipleClients: false,\n stats: {},\n ...overrides,\n});\n\nexport const createMockKeyValueStoreClient = ({\n log,\n}: { log?: (args: any) => void } = {}): KeyValueStoreClient => {\n return {\n getRecord: (...args: [string]): Promise<KeyValueStoreRecord<any> | undefined> => {\n const [key] = args;\n log?.(`Called MockKeyValueStoreClient.getRecord with ${JSON.stringify(args)}`);\n return Promise.resolve({\n key,\n value: null,\n // contentType?: string;\n });\n },\n setRecord: (...args: [record: KeyValueStoreRecord<any>]): Promise<void> => {\n log?.(`Called MockKeyValueStoreClient.setRecord with ${JSON.stringify(args)}`);\n return Promise.resolve();\n },\n // get(): Promise<KeyValueStoreInfo | undefined>;\n // update(newFields: KeyValueStoreClientUpdateOptions): Promise<Partial<KeyValueStoreInfo>>;\n // delete(): Promise<void>;\n // listKeys(options?: KeyValueStoreClientListOptions): Promise<KeyValueStoreClientListData>;\n // getRecord(key: string, options?: KeyValueStoreClientGetRecordOptions): Promise<KeyValueStoreRecord | undefined>;\n // setRecord(record: KeyValueStoreRecord): Promise<void>;\n // deleteRecord(key: string): Promise<void>;\n } as any;\n};\n\nexport const createMockRequestQueueClient = ({\n log,\n onBatchAddRequests,\n}: {\n log?: (args: any) => void;\n onBatchAddRequests?: OnBatchAddRequests;\n} = {}): RequestQueueClient => {\n const requestQueue: any[] = [];\n\n return {\n batchAddRequests: async (\n ...args: BatchAddRequestsArgs\n ): Promise<RequestQueueClientBatchRequestsOperationResult> => {\n const [requests, options] = args;\n log?.(`Called MockRequestQueueClient.batchAddRequests with ${JSON.stringify(args)}`);\n const reqsWithIds = requests.map((r) => ({ ...r, id: Math.random() + '' }));\n requestQueue.push(...reqsWithIds);\n\n const reqsAddedToQueue = reqsWithIds.map((r) => ({\n uniqueKey: r.uniqueKey,\n requestId: r.id,\n wasAlreadyPresent: false,\n wasAlreadyHandled: false,\n }));\n\n await onBatchAddRequests?.(requests, options);\n\n return Promise.resolve({\n unprocessedRequests: [],\n processedRequests: reqsAddedToQueue,\n });\n },\n\n get: (...args) => {\n log?.(`Called MockRequestQueueClient.get with ${JSON.stringify(args)}`);\n return Promise.resolve(createMockClientRequestQueue());\n },\n\n getRequest: async (\n ...args: [id: string]\n ): Promise<RequestQueueClientGetRequestResult | undefined> => {\n const [id] = args;\n log?.(`Called MockRequestQueueClient.getRequest with ${JSON.stringify(args)}`);\n log?.(`requestQueue: ${JSON.stringify(requestQueue.map((r) => r.id))}`);\n\n const indexOfNextRequest = requestQueue.findIndex((r) => r.id === id);\n if (indexOfNextRequest === -1) return undefined;\n\n const [req] = requestQueue.splice(indexOfNextRequest, 1);\n return req;\n },\n\n updateRequest: (\n ...args: [\n request: RequestQueueClientRequestSchema,\n options?: RequestQueueClientAddRequestOptions\n ]\n ): Promise<RequestQueueClientAddRequestResult> => {\n const [request, options] = args;\n log?.(`Called MockRequestQueueClient.updateRequest with ${JSON.stringify(args)}`);\n log?.(`requestQueue: ${JSON.stringify(requestQueue)}`);\n\n const indexOfUpdatedRequest = requestQueue.findIndex((r) => r.id === request.id);\n const wasAlreadyPresent = indexOfUpdatedRequest !== -1;\n if (wasAlreadyPresent) {\n const req = requestQueue[indexOfUpdatedRequest];\n Object.assign(req, request);\n } else {\n const req = Object.assign({}, request);\n requestQueue.push(req);\n }\n\n log?.(`requestQueue: ${JSON.stringify(requestQueue)}`);\n\n // [{\"id\":\"0.9121846955138175\",\"url\":\"https://profesia.sk/partneri\",\"loadedUrl\":\"https://www.profesia.sk/partneri\",\"uniqueKey\":\"https://profesia.sk/partneri\",\"method\":\"GET\",\"noRetry\":false,\"retryCount\":0,\"errorMessages\":[],\"headers\":{},\"userData\":{\"__crawlee\":{\"state\":4}},\"handledAt\":\"2023-04-17T12:15:57.350Z\"}]\n return Promise.resolve({\n requestId: request.id,\n wasAlreadyPresent,\n wasAlreadyHandled: false,\n });\n },\n\n listHead: (\n ...args: [options?: RequestQueueClientListHeadOptions]\n ): Promise<RequestQueueClientListHeadResult> => {\n const [options] = args;\n log?.(`Called MockRequestQueueClient.listHead with ${JSON.stringify(args)}`);\n return Promise.resolve({\n items: [],\n queueModifiedAt: new Date('2023-04-17'),\n hadMultipleClients: false,\n limit: options?.limit ?? 100,\n });\n },\n } as any;\n};\n\nexport const createMockDatasetCollectionClient = ({\n log,\n}: { log?: (args: any) => void } = {}): DatasetCollectionClient => {\n const dataset = [];\n\n return {\n list: (\n options?: DatasetCollectionClientListOptions\n ): Promise<DatasetCollectionClientListResult> => {\n let items = dataset.slice();\n if (options?.desc) items = items.reverse();\n if (options?.offset) items = items.slice(options.offset);\n\n return Promise.resolve({\n total: dataset.length,\n count: options?.limit ?? items.length,\n offset: options?.offset ?? 0,\n limit: options?.limit ?? items.length,\n desc: options?.desc ?? false,\n items,\n });\n },\n\n getOrCreate: (\n name?: string,\n options?: DatasetCollectionClientGetOrCreateOptions\n ): Promise<ClientDataset> => Promise.resolve(createMockClientDataset()),\n\n // _list, _create, _getOrCreate, baseUrl\n } as any;\n};\n\nexport const createMockStorageClient = ({\n log,\n onBatchAddRequests,\n}: {\n log?: (args: any) => void;\n onBatchAddRequests?: OnBatchAddRequests;\n} = {}): StorageClient => {\n return {\n datasets: (...args): DatasetCollectionClient => {\n log?.(`Called MockStorageClient.datasets with ${JSON.stringify(args)}`);\n return createMockDatasetCollectionClient({ log });\n },\n requestQueue: (...args) => {\n log?.(`Called MockStorageClient.requestQueue with ${JSON.stringify(args)}`);\n return createMockRequestQueueClient({ log, onBatchAddRequests });\n },\n keyValueStore: (...args) => {\n log?.(`Called MockStorageClient.keyValueStore with ${JSON.stringify(args)}`);\n return createMockKeyValueStoreClient({ log });\n },\n\n // dataset, keyValueStores, requestQueues\n } as any;\n};\n\nexport const createMockStorageDataset = (\n ...args: [\n datasetId?: string | null,\n options?: OpenStorageOptions,\n custom?: {\n log?: (...args: any[]) => void;\n onPushData?: (...args: any[]) => MaybePromise<void>;\n onGetInfo?: (...args: any[]) => MaybePromise<void>;\n }\n ]\n): Promise<Dataset<any>> => {\n const origArgs = args.slice().slice(0, 2);\n const [datasetId, __, custom] = args;\n const { log, onPushData, onGetInfo } = custom || {};\n log?.(`Called MockStorageDataset with ${JSON.stringify(origArgs)}`);\n\n return Promise.resolve({\n pushData: async (...args) => {\n log?.(`Called MockStorageDataset.pushData (instance ${datasetId}) with ${JSON.stringify(args)}`); // prettier-ignore\n await onPushData?.(...args);\n },\n getInfo: async (...args) => {\n log?.(`Called MockStorageDataset.getInfo (instance ${datasetId}) with ${JSON.stringify(args)}`); // prettier-ignore\n return onGetInfo ? onGetInfo(...args) : { itemCount: 10 };\n },\n } as Dataset);\n};\n"]}
@@ -0,0 +1,31 @@
1
+ import type { BasicCrawler, CrawlingContext, BasicCrawlerOptions, BasicCrawlingContext, HttpCrawler, HttpCrawlingContext, HttpCrawlerOptions, InternalHttpCrawlingContext, JSDOMCrawler, JSDOMCrawlingContext, JSDOMCrawlerOptions, CheerioCrawler, CheerioCrawlingContext, CheerioCrawlerOptions, PlaywrightCrawler, PlaywrightCrawlingContext, PlaywrightCrawlerOptions, PuppeteerCrawler, PuppeteerCrawlerOptions, PuppeteerCrawlingContext } from 'crawlee';
2
+ export type CrawlerType = 'basic' | 'http' | 'jsdom' | 'cheerio' | 'playwright' | 'puppeteer';
3
+ export type CrawlerMeta<T extends 'basic' | 'http' | 'jsdom' | 'cheerio' | 'playwright' | 'puppeteer', Ctx extends CrawlingContext = CrawlingContext, TData extends Record<string, any> = Record<string, any>> = T extends 'basic' ? Ctx extends CrawlingContext ? {
4
+ crawler: BasicCrawler<Ctx>;
5
+ context: BasicCrawlingContext<TData>;
6
+ options: BasicCrawlerOptions<Ctx>;
7
+ } : never : T extends 'http' ? Ctx extends InternalHttpCrawlingContext ? {
8
+ crawler: HttpCrawler<Ctx>;
9
+ context: HttpCrawlingContext<TData>;
10
+ options: HttpCrawlerOptions<Ctx>;
11
+ } : never : T extends 'jsdom' ? {
12
+ crawler: JSDOMCrawler;
13
+ context: JSDOMCrawlingContext<TData>;
14
+ options: JSDOMCrawlerOptions<TData>;
15
+ } : T extends 'cheerio' ? {
16
+ crawler: CheerioCrawler;
17
+ context: CheerioCrawlingContext<TData>;
18
+ options: CheerioCrawlerOptions<TData>;
19
+ } : T extends 'playwright' ? {
20
+ crawler: PlaywrightCrawler;
21
+ context: PlaywrightCrawlingContext<TData>;
22
+ options: PlaywrightCrawlerOptions;
23
+ } : T extends 'puppeteer' ? {
24
+ crawler: PuppeteerCrawler;
25
+ context: PuppeteerCrawlingContext<TData>;
26
+ options: PuppeteerCrawlerOptions;
27
+ } : never;
28
+ type OrigRunCrawler<T extends CrawlingContext<any, any>> = BasicCrawler<T>['run'];
29
+ /** URL string or object passed to Crawler.run */
30
+ export type CrawlerUrl = NonNullable<Parameters<OrigRunCrawler<any>>[0]>[0];
31
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n BasicCrawler,\n CrawlingContext,\n BasicCrawlerOptions,\n BasicCrawlingContext,\n HttpCrawler,\n HttpCrawlingContext,\n HttpCrawlerOptions,\n InternalHttpCrawlingContext,\n JSDOMCrawler,\n JSDOMCrawlingContext,\n JSDOMCrawlerOptions,\n CheerioCrawler,\n CheerioCrawlingContext,\n CheerioCrawlerOptions,\n PlaywrightCrawler,\n PlaywrightCrawlingContext,\n PlaywrightCrawlerOptions,\n PuppeteerCrawler,\n PuppeteerCrawlerOptions,\n PuppeteerCrawlingContext,\n} from 'crawlee';\n\nexport type CrawlerType = 'basic' | 'http' | 'jsdom' | 'cheerio' | 'playwright' | 'puppeteer';\n\nexport type CrawlerMeta<\n T extends 'basic' | 'http' | 'jsdom' | 'cheerio' | 'playwright' | 'puppeteer',\n Ctx extends CrawlingContext = CrawlingContext,\n TData extends Record<string, any> = Record<string, any>\n> = T extends 'basic'\n ? Ctx extends CrawlingContext\n ? { crawler: BasicCrawler<Ctx>, context: BasicCrawlingContext<TData>, options: BasicCrawlerOptions<Ctx> } // prettier-ignore\n : never\n : T extends 'http'\n ? Ctx extends InternalHttpCrawlingContext\n ? { crawler: HttpCrawler<Ctx>, context: HttpCrawlingContext<TData>, options: HttpCrawlerOptions<Ctx> } // prettier-ignore\n : never\n : T extends 'jsdom'\n ? { crawler: JSDOMCrawler, context: JSDOMCrawlingContext<TData>, options: JSDOMCrawlerOptions<TData> } // prettier-ignore\n : T extends 'cheerio'\n ? { crawler: CheerioCrawler, context: CheerioCrawlingContext<TData>, options: CheerioCrawlerOptions<TData> } // prettier-ignore\n : T extends 'playwright'\n ? { crawler: PlaywrightCrawler, context: PlaywrightCrawlingContext<TData>, options: PlaywrightCrawlerOptions } // prettier-ignore\n : T extends 'puppeteer'\n ? { crawler: PuppeteerCrawler, context: PuppeteerCrawlingContext<TData>, options: PuppeteerCrawlerOptions } // prettier-ignore\n : never;\n\ntype OrigRunCrawler<T extends CrawlingContext<any, any>> = BasicCrawler<T>['run'];\n\n/** URL string or object passed to Crawler.run */\nexport type CrawlerUrl = NonNullable<Parameters<OrigRunCrawler<any>>[0]>[0];\n"]}
@@ -0,0 +1,19 @@
1
+ import type { MaybePromise } from '../utils/types';
2
+ export declare const serialAsyncMap: <T, R>(inputArr: T[], fn: (item: T, index: number) => MaybePromise<R>) => Promise<R[]>;
3
+ export declare const serialAsyncFilter: <T>(inputArr: T[], fn: (item: T, index: number) => MaybePromise<any>) => Promise<T[]>;
4
+ export declare const serialAsyncFind: <T>(inputArr: T[], fn: (item: T, index: number) => MaybePromise<any>) => Promise<T | undefined>;
5
+ export interface RetryAsyncOptions {
6
+ /** Number of retries after the function call fails */
7
+ maxRetries?: number;
8
+ /** Delay between retries in milliseconds */
9
+ delay?: number;
10
+ /** Callback called with error if the function call errors */
11
+ onError?: (error: unknown, retryIndex: number) => MaybePromise<void>;
12
+ }
13
+ /** @param {number} ms Number of ms to wait */
14
+ export declare const wait: (ms?: number) => Promise<unknown>;
15
+ /** Call async function, and retry to call it `maxRetries` times if it fails. */
16
+ export declare const retryAsync: <T>(fn: (retries: number) => Promise<T>, { maxRetries, delay, onError }?: RetryAsyncOptions) => Promise<{
17
+ result: T | null;
18
+ errors: unknown[];
19
+ }>;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.retryAsync = exports.wait = exports.serialAsyncFind = exports.serialAsyncFilter = exports.serialAsyncMap = void 0;
13
+ const serialAsyncMap = (inputArr, fn) => __awaiter(void 0, void 0, void 0, function* () {
14
+ const results = yield inputArr.reduce((aggResultPromise, input, index) => __awaiter(void 0, void 0, void 0, function* () {
15
+ const agg = yield aggResultPromise;
16
+ const result = yield fn(input, index);
17
+ agg.push(result);
18
+ return agg;
19
+ }), Promise.resolve([]));
20
+ return results;
21
+ });
22
+ exports.serialAsyncMap = serialAsyncMap;
23
+ const serialAsyncFilter = (inputArr, fn) => __awaiter(void 0, void 0, void 0, function* () {
24
+ const results = yield inputArr.reduce((aggResultPromise, input, index) => __awaiter(void 0, void 0, void 0, function* () {
25
+ const agg = yield aggResultPromise;
26
+ const result = yield fn(input, index);
27
+ if (result)
28
+ agg.push(input);
29
+ return agg;
30
+ }), Promise.resolve([]));
31
+ return results;
32
+ });
33
+ exports.serialAsyncFilter = serialAsyncFilter;
34
+ const serialAsyncFind = (inputArr, fn) => __awaiter(void 0, void 0, void 0, function* () {
35
+ let index = 0;
36
+ for (const input of inputArr) {
37
+ const result = yield fn(input, index);
38
+ if (result)
39
+ return input;
40
+ index++;
41
+ }
42
+ });
43
+ exports.serialAsyncFind = serialAsyncFind;
44
+ /** @param {number} ms Number of ms to wait */
45
+ const wait = (ms) => new Promise((res) => setTimeout(res, ms));
46
+ exports.wait = wait;
47
+ /** Call async function, and retry to call it `maxRetries` times if it fails. */
48
+ const retryAsync = (fn, { maxRetries = 1, delay = 0, onError = () => { } } = {}) => __awaiter(void 0, void 0, void 0, function* () {
49
+ if (typeof maxRetries !== 'number' || maxRetries < 0) {
50
+ throw Error(`Invalid input for maxRetries in retryAsync(fn, maxRetries). maxRetries must be a non-negative number. Got ${maxRetries}`);
51
+ }
52
+ let result = null;
53
+ const errors = [];
54
+ let retries = 0;
55
+ while (retries <= maxRetries) {
56
+ try {
57
+ result = yield fn(retries);
58
+ }
59
+ catch (err) {
60
+ errors.push(err);
61
+ yield onError(err, retries);
62
+ yield (0, exports.wait)(delay);
63
+ retries++;
64
+ continue; // Retry if failed
65
+ }
66
+ break; // Exit loop and continue flow if success
67
+ }
68
+ return {
69
+ result,
70
+ errors,
71
+ };
72
+ });
73
+ exports.retryAsync = retryAsync;
74
+ //# sourceMappingURL=async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../../../src/utils/async.ts"],"names":[],"mappings":"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","sourcesContent":["import type { MaybePromise } from '../utils/types';\n\nexport const serialAsyncMap = async <T, R>(\n inputArr: T[],\n fn: (item: T, index: number) => MaybePromise<R>\n) => {\n const results = await inputArr.reduce(async (aggResultPromise, input, index) => {\n const agg = await aggResultPromise;\n const result = await fn(input, index);\n agg.push(result);\n return agg;\n }, Promise.resolve([] as R[]));\n\n return results;\n};\n\nexport const serialAsyncFilter = async <T>(\n inputArr: T[],\n fn: (item: T, index: number) => MaybePromise<any>\n) => {\n const results = await inputArr.reduce(async (aggResultPromise, input, index) => {\n const agg = await aggResultPromise;\n const result = await fn(input, index);\n if (result) agg.push(input);\n return agg;\n }, Promise.resolve([] as T[]));\n\n return results;\n};\n\nexport const serialAsyncFind = async <T>(\n inputArr: T[],\n fn: (item: T, index: number) => MaybePromise<any>\n) => {\n let index = 0;\n for (const input of inputArr) {\n const result = await fn(input, index);\n if (result) return input;\n index++;\n }\n};\n\nexport interface RetryAsyncOptions {\n /** Number of retries after the function call fails */\n maxRetries?: number;\n /** Delay between retries in milliseconds */\n delay?: number;\n /** Callback called with error if the function call errors */\n onError?: (error: unknown, retryIndex: number) => MaybePromise<void>;\n}\n\n/** @param {number} ms Number of ms to wait */\nexport const wait = (ms?: number) => new Promise((res) => setTimeout(res, ms));\n\n/** Call async function, and retry to call it `maxRetries` times if it fails. */\nexport const retryAsync = async <T>(\n fn: (retries: number) => Promise<T>,\n { maxRetries = 1, delay = 0, onError = () => {} }: RetryAsyncOptions = {}\n) => {\n if (typeof maxRetries !== 'number' || maxRetries < 0) {\n throw Error(\n `Invalid input for maxRetries in retryAsync(fn, maxRetries). maxRetries must be a non-negative number. Got ${maxRetries}`\n );\n }\n\n let result: T | null = null;\n const errors: unknown[] = [];\n let retries = 0;\n while (retries <= maxRetries) {\n try {\n result = await fn(retries);\n } catch (err) {\n errors.push(err);\n await onError(err, retries);\n await wait(delay);\n retries++;\n continue; // Retry if failed\n }\n break; // Exit loop and continue flow if success\n }\n return {\n result,\n errors,\n };\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const logAndRethrow: (e: any, log?: ((e: any) => any) | undefined) => never;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logAndRethrow = void 0;
4
+ const logAndRethrow = (e, log) => {
5
+ const logger = log !== null && log !== void 0 ? log : console.error;
6
+ logger(e);
7
+ throw e;
8
+ };
9
+ exports.logAndRethrow = logAndRethrow;
10
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../../src/utils/error.ts"],"names":[],"mappings":";;;AAAO,MAAM,aAAa,GAAG,CAAC,CAAM,EAAE,GAAqB,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,OAAO,CAAC,KAAK,CAAC;IACpC,MAAM,CAAC,CAAC,CAAC,CAAC;IACV,MAAM,CAAC,CAAC;AACV,CAAC,CAAC;AAJW,QAAA,aAAa,iBAIxB","sourcesContent":["export const logAndRethrow = (e: any, log?: (e: any) => any) => {\n const logger = log ?? console.error;\n logger(e);\n throw e;\n};\n"]}
@@ -0,0 +1,9 @@
1
+ export declare const strOrNull: (s: string | null, allowEmpty?: boolean) => string | null;
2
+ export interface StrAsNumOptions {
3
+ allowEmpty?: boolean;
4
+ removeWhitespace?: boolean;
5
+ mode: 'int' | 'float';
6
+ separator?: string;
7
+ decimal?: string;
8
+ }
9
+ export declare const strAsNumber: (s: string | null, options?: StrAsNumOptions) => number | null;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.strAsNumber = exports.strOrNull = void 0;
4
+ const strOrNull = (s, allowEmpty) => s ? s : typeof s === 'string' && allowEmpty ? s : null; // prettier-ignore
5
+ exports.strOrNull = strOrNull;
6
+ const strAsNumber = (s, options) => {
7
+ var _a, _b, _c;
8
+ const { removeWhitespace, allowEmpty, separator, decimal, mode = 'float' } = options || {};
9
+ let content = removeWhitespace ? (_a = s === null || s === void 0 ? void 0 : s.replace(/\s+/g, '')) !== null && _a !== void 0 ? _a : null : s;
10
+ content = (0, exports.strOrNull)(content, allowEmpty);
11
+ if (content === null)
12
+ return null;
13
+ content = separator ? (_b = content === null || content === void 0 ? void 0 : content.replace(new RegExp(separator, 'g'), '')) !== null && _b !== void 0 ? _b : null : content;
14
+ content = decimal ? (_c = content === null || content === void 0 ? void 0 : content.replace(new RegExp(decimal, 'g'), '.')) !== null && _c !== void 0 ? _c : null : content;
15
+ const num = mode === 'int' ? Number.parseInt(content) : Number.parseFloat(content);
16
+ return Number.isNaN(num) ? null : num;
17
+ };
18
+ exports.strAsNumber = strAsNumber;
19
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":";;;AAAO,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAE,UAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,kBAAkB;AAAlI,QAAA,SAAS,aAAsG;AAUrH,MAAM,WAAW,GAAG,CAAC,CAAgB,EAAE,OAAyB,EAAiB,EAAE;;IACxF,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAC3F,IAAI,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,mCAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,GAAG,IAAA,iBAAS,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,mCAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IACzF,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,mCAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IACtF,MAAM,GAAG,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC,CAAC;AAVW,QAAA,WAAW,eAUtB","sourcesContent":["export const strOrNull = (s: string | null, allowEmpty?: boolean) => s ? s : typeof s === 'string' && allowEmpty ? s : null; // prettier-ignore\n\nexport interface StrAsNumOptions {\n allowEmpty?: boolean;\n removeWhitespace?: boolean;\n mode: 'int' | 'float';\n separator?: string;\n decimal?: string;\n}\n\nexport const strAsNumber = (s: string | null, options?: StrAsNumOptions): number | null => {\n const { removeWhitespace, allowEmpty, separator, decimal, mode = 'float' } = options || {};\n let content = removeWhitespace ? s?.replace(/\\s+/g, '') ?? null : s;\n content = strOrNull(content, allowEmpty);\n if (content === null) return null;\n\n content = separator ? content?.replace(new RegExp(separator, 'g'), '') ?? null : content;\n content = decimal ? content?.replace(new RegExp(decimal, 'g'), '.') ?? null : content;\n const num = mode === 'int' ? Number.parseInt(content) : Number.parseFloat(content);\n return Number.isNaN(num) ? null : num;\n};\n"]}
@@ -0,0 +1,15 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * `pkginfo` is an npm package that finds closest package.json
4
+ * and returns only the fields that we request. While it works
5
+ * well, the usage is strange. Hence we wrap it to contain the magic.
6
+ *
7
+ * See https://www.npmjs.com/package/pkginfo
8
+ * */
9
+ export declare const getPackageJsonInfo: <TFields extends string = string>(filenameOrModule: {
10
+ filename: string;
11
+ id?: string;
12
+ } | {
13
+ id: string;
14
+ filename?: string;
15
+ } | NodeModule, fields: TFields[]) => Record<TFields, any>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPackageJsonInfo = void 0;
7
+ const pkginfo_1 = __importDefault(require("pkginfo"));
8
+ /**
9
+ * `pkginfo` is an npm package that finds closest package.json
10
+ * and returns only the fields that we request. While it works
11
+ * well, the usage is strange. Hence we wrap it to contain the magic.
12
+ *
13
+ * See https://www.npmjs.com/package/pkginfo
14
+ * */
15
+ const getPackageJsonInfo = (filenameOrModule, fields) => {
16
+ const obj = {
17
+ filename: filenameOrModule === null || filenameOrModule === void 0 ? void 0 : filenameOrModule.filename,
18
+ id: filenameOrModule === null || filenameOrModule === void 0 ? void 0 : filenameOrModule.id,
19
+ exports: {}, // This is where the fields will be written
20
+ };
21
+ (0, pkginfo_1.default)(obj, { include: fields });
22
+ return obj.exports;
23
+ };
24
+ exports.getPackageJsonInfo = getPackageJsonInfo;
25
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/utils/package.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA8B;AAE9B;;;;;;KAMK;AACE,MAAM,kBAAkB,GAAG,CAChC,gBAGc,EACd,MAAiB,EACjB,EAAE;IACF,MAAM,GAAG,GAAG;QACV,QAAQ,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,QAAQ;QACpC,EAAE,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,EAAE;QACxB,OAAO,EAAE,EAAE,EAAE,2CAA2C;KACzD,CAAC;IACF,IAAA,iBAAO,EAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC,OAA+B,CAAC;AAC7C,CAAC,CAAC;AAdW,QAAA,kBAAkB,sBAc7B","sourcesContent":["import pkginfo from 'pkginfo';\n\n/**\n * `pkginfo` is an npm package that finds closest package.json\n * and returns only the fields that we request. While it works\n * well, the usage is strange. Hence we wrap it to contain the magic.\n *\n * See https://www.npmjs.com/package/pkginfo\n * */\nexport const getPackageJsonInfo = <TFields extends string = string>(\n filenameOrModule:\n | { filename: string; id?: string }\n | { id: string; filename?: string }\n | NodeModule,\n fields: TFields[]\n) => {\n const obj = {\n filename: filenameOrModule?.filename,\n id: filenameOrModule?.id,\n exports: {}, // This is where the fields will be written\n };\n pkginfo(obj, { include: fields });\n return obj.exports as Record<TFields, any>;\n};\n"]}
@@ -0,0 +1,6 @@
1
+ export type MaybePromise<T> = T | Promise<T>;
2
+ export type MaybeArray<T> = T | T[];
3
+ export type ArrVal<T extends any[] | readonly any[]> = T[number];
4
+ export declare const enumFromArray: <T extends readonly any[]>(arr: T) => { [Key in ArrVal<T>]: Key; };
5
+ export type PickPartial<T extends object, Keys extends keyof T> = Omit<T, Keys> & Partial<Pick<T, Keys>>;
6
+ export type PickRequired<T extends object, Keys extends keyof T> = Omit<T, Keys> & Required<Pick<T, Keys>>;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enumFromArray = void 0;
4
+ const lodash_1 = require("lodash");
5
+ const enumFromArray = (arr) => {
6
+ return (0, lodash_1.fromPairs)(arr.map((k) => [k, k]));
7
+ };
8
+ exports.enumFromArray = enumFromArray;
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AAO5B,MAAM,aAAa,GAAG,CAA2B,GAAM,EAAE,EAAE;IAChE,OAAO,IAAA,kBAAS,EAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAgC,CAAC;AAC1E,CAAC,CAAC;AAFW,QAAA,aAAa,iBAExB","sourcesContent":["import { fromPairs } from 'lodash';\n\nexport type MaybePromise<T> = T | Promise<T>;\nexport type MaybeArray<T> = T | T[];\n\nexport type ArrVal<T extends any[] | readonly any[]> = T[number];\n\nexport const enumFromArray = <T extends readonly any[]>(arr: T) => {\n return fromPairs(arr.map((k) => [k, k])) as { [Key in ArrVal<T>]: Key };\n};\n\nexport type PickPartial<T extends object, Keys extends keyof T> = Omit<T, Keys> &\n Partial<Pick<T, Keys>>;\n\nexport type PickRequired<T extends object, Keys extends keyof T> = Omit<T, Keys> &\n Required<Pick<T, Keys>>;\n"]}
@@ -0,0 +1,9 @@
1
+ /** Validate correctness of a URL */
2
+ export declare const validateUrl: (url: string) => void;
3
+ /** Transform relative URL paths to absolute URLs */
4
+ export declare const resolveUrlPath: (urlBase: string, urlPath: string) => string;
5
+ export interface FormatUrlOptions {
6
+ allowRelative?: boolean;
7
+ baseUrl?: string | null;
8
+ }
9
+ export declare const formatUrl: <T>(maybeUrl: string | T, { allowRelative, baseUrl }?: FormatUrlOptions) => string | T;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatUrl = exports.resolveUrlPath = exports.validateUrl = void 0;
4
+ /** Validate correctness of a URL */
5
+ const validateUrl = (url) => {
6
+ try {
7
+ new URL(url);
8
+ }
9
+ catch (err) {
10
+ err.message += `\nURL: "${url}"`;
11
+ throw err;
12
+ }
13
+ };
14
+ exports.validateUrl = validateUrl;
15
+ /** Transform relative URL paths to absolute URLs */
16
+ const resolveUrlPath = (urlBase, urlPath) => {
17
+ const url = new URL(urlBase);
18
+ url.pathname = urlPath;
19
+ return url.href;
20
+ };
21
+ exports.resolveUrlPath = resolveUrlPath;
22
+ const formatUrl = (maybeUrl, { allowRelative, baseUrl } = {}) => {
23
+ if (typeof maybeUrl !== 'string')
24
+ return maybeUrl;
25
+ if (!maybeUrl.startsWith('/') || allowRelative)
26
+ return maybeUrl;
27
+ if (!baseUrl)
28
+ throw Error('Cannot convert URL from relative to absolute path - baseUrl is missing'); // prettier-ignore
29
+ return (0, exports.resolveUrlPath)(baseUrl, maybeUrl);
30
+ };
31
+ exports.formatUrl = formatUrl;
32
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/utils/url.ts"],"names":[],"mappings":";;;AAAA,oCAAoC;AAC7B,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE;IACzC,IAAI;QACF,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;KACd;IAAC,OAAO,GAAG,EAAE;QACX,GAAa,CAAC,OAAO,IAAI,WAAW,GAAG,GAAG,CAAC;QAC5C,MAAM,GAAG,CAAC;KACX;AACH,CAAC,CAAC;AAPW,QAAA,WAAW,eAOtB;AAEF,oDAAoD;AAC7C,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,EAAE;IACjE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC;IACvB,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC,CAAC;AAJW,QAAA,cAAc,kBAIzB;AAOK,MAAM,SAAS,GAAG,CACvB,QAAoB,EACpB,EAAE,aAAa,EAAE,OAAO,KAAuB,EAAE,EACjD,EAAE;IACF,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAClD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,aAAa;QAAE,OAAO,QAAQ,CAAC;IAEhE,IAAI,CAAC,OAAO;QAAE,MAAM,KAAK,CAAC,wEAAwE,CAAC,CAAC,CAAC,kBAAkB;IACvH,OAAO,IAAA,sBAAc,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC,CAAC;AATW,QAAA,SAAS,aASpB","sourcesContent":["/** Validate correctness of a URL */\nexport const validateUrl = (url: string) => {\n try {\n new URL(url);\n } catch (err) {\n (err as Error).message += `\\nURL: \"${url}\"`;\n throw err;\n }\n};\n\n/** Transform relative URL paths to absolute URLs */\nexport const resolveUrlPath = (urlBase: string, urlPath: string) => {\n const url = new URL(urlBase);\n url.pathname = urlPath;\n return url.href;\n};\n\nexport interface FormatUrlOptions {\n allowRelative?: boolean;\n baseUrl?: string | null;\n}\n\nexport const formatUrl = <T>(\n maybeUrl: string | T,\n { allowRelative, baseUrl }: FormatUrlOptions = {}\n) => {\n if (typeof maybeUrl !== 'string') return maybeUrl;\n if (!maybeUrl.startsWith('/') || allowRelative) return maybeUrl;\n\n if (!baseUrl) throw Error('Cannot convert URL from relative to absolute path - baseUrl is missing'); // prettier-ignore\n return resolveUrlPath(baseUrl, maybeUrl);\n};\n"]}
@@ -0,0 +1,31 @@
1
+ import type { MaybePromise } from './types';
2
+ export type ValueCallback<T> = (value: T, oldValue: T | null) => MaybePromise<any>;
3
+ export interface ValueMonitorOptions {
4
+ /** How long (in milliseconds) after fetching the value can we use it before we have to re-fetch it. */
5
+ ttlInMs?: number;
6
+ }
7
+ /**
8
+ * ValueMonitor checks and caches a (maybe remote) value, and triggers callbacks
9
+ * based on the value.
10
+ *
11
+ * You can think of it as a light replacement for reactivity (Vue) feature.
12
+ */
13
+ export declare const createValueMonitor: <T>(fetchValueFn: (oldValue: T | null) => MaybePromise<T>, options?: ValueMonitorOptions) => {
14
+ value: () => T | Promise<T> | null;
15
+ isStale: () => boolean;
16
+ refresh: () => Promise<T>;
17
+ onValue: (callback: ValueCallback<T>) => () => void;
18
+ };
19
+ /**
20
+ * Variant of ValueMonitor that is used for monitoring size of stores like Apify Dataset or RequestQueue.
21
+ * - Pass an array of items to `shortenToSize` to shorten the array to the size
22
+ * that still fits the store.
23
+ */
24
+ export declare const createSizeMonitor: (maxSize: number, sizeGetter: () => MaybePromise<number>, onMaxSizeReached: () => MaybePromise<void>, options?: ValueMonitorOptions) => {
25
+ shortenToSize: <T>(arr: T[]) => Promise<T[]>;
26
+ isFull: () => Promise<boolean>;
27
+ value: () => number | Promise<number> | null;
28
+ isStale: () => boolean;
29
+ refresh: () => Promise<number>;
30
+ onValue: (callback: ValueCallback<number>) => () => void;
31
+ };