@crawlee/puppeteer 3.17.1-beta.6 → 3.17.1-beta.60

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/index.mjs CHANGED
@@ -52,6 +52,7 @@ export const RequestQueue = mod.RequestQueue;
52
52
  export const RequestQueueV1 = mod.RequestQueueV1;
53
53
  export const RequestQueueV2 = mod.RequestQueueV2;
54
54
  export const RequestState = mod.RequestState;
55
+ export const RequestValidationError = mod.RequestValidationError;
55
56
  export const RetryRequestError = mod.RetryRequestError;
56
57
  export const Router = mod.Router;
57
58
  export const STATE_PERSISTENCE_KEY = mod.STATE_PERSISTENCE_KEY;
@@ -82,6 +83,7 @@ export const createEventLoopLoadSignal = mod.createEventLoopLoadSignal;
82
83
  export const createPuppeteerRouter = mod.createPuppeteerRouter;
83
84
  export const createRequestOptions = mod.createRequestOptions;
84
85
  export const createRequests = mod.createRequests;
86
+ export const defaultRoute = mod.defaultRoute;
85
87
  export const deserializeArray = mod.deserializeArray;
86
88
  export const enqueueLinks = mod.enqueueLinks;
87
89
  export const evaluateLoadSignalSample = mod.evaluateLoadSignalSample;
@@ -107,5 +109,6 @@ export const tryAbsoluteURL = mod.tryAbsoluteURL;
107
109
  export const updateEnqueueLinksPatternCache = mod.updateEnqueueLinksPatternCache;
108
110
  export const useState = mod.useState;
109
111
  export const validateGlobPattern = mod.validateGlobPattern;
112
+ export const validateUserData = mod.validateUserData;
110
113
  export const validators = mod.validators;
111
114
  export const withCheckedStorageAccess = mod.withCheckedStorageAccess;
@@ -212,5 +212,7 @@ export declare function isTargetRelevant(page: Page, target: Target): boolean;
212
212
  * for large element sets, this will take considerable amount of time.
213
213
  * @ignore
214
214
  */
215
- export declare function clickElements(page: Page, selector: string, clickOptions?: ClickOptions): Promise<void>;
215
+ export declare function clickElements(page: Page, selector: string, clickOptions?: ClickOptions & {
216
+ clickCount?: number;
217
+ }): Promise<void>;
216
218
  export {};
@@ -59,7 +59,7 @@ async function enqueueLinksByClickingElements(options) {
59
59
  requestQueue: ow_1.default.object.hasKeys('fetchNextRequest', 'addRequest'),
60
60
  selector: ow_1.default.string,
61
61
  userData: ow_1.default.optional.object,
62
- clickOptions: ow_1.default.optional.object.hasKeys('clickCount', 'delay'),
62
+ clickOptions: ow_1.default.optional.object,
63
63
  pseudoUrls: ow_1.default.optional.array.ofType(ow_1.default.any(ow_1.default.string, ow_1.default.object.hasKeys('purl'))),
64
64
  globs: ow_1.default.optional.array.ofType(ow_1.default.any(ow_1.default.string, ow_1.default.object.hasKeys('glob'))),
65
65
  regexps: ow_1.default.optional.array.ofType(ow_1.default.any(ow_1.default.regExp, ow_1.default.object.hasKeys('regexp'))),
@@ -237,6 +237,10 @@ async function preventHistoryNavigation(page) {
237
237
  * @ignore
238
238
  */
239
239
  async function clickElements(page, selector, clickOptions) {
240
+ // Puppeteer 25 removed the deprecated `clickCount` option in favor of `count`, older versions ignore `count`, so we pass both.
241
+ if (clickOptions?.clickCount !== undefined && clickOptions.count === undefined) {
242
+ clickOptions = { ...clickOptions, count: clickOptions.clickCount };
243
+ }
240
244
  const elementHandles = await page.$$(selector);
241
245
  log.debug(`enqueueLinksByClickingElements: There are ${elementHandles.length} elements to click.`);
242
246
  let clickedElementsCount = 0;
@@ -1,4 +1,4 @@
1
- import type { BrowserCrawlerOptions, BrowserCrawlingContext, BrowserHook, BrowserRequestHandler, GetUserDataFromRequest, LoadedContext, RouterRoutes } from '@crawlee/browser';
1
+ import type { BrowserCrawlerOptions, BrowserCrawlingContext, BrowserHook, BrowserRequestHandler, GetUserDataFromRequest, LoadedContext, RouterHandler, RouterRoutes, RouteSchemas, RoutesFromSchemas } from '@crawlee/browser';
2
2
  import { BrowserCrawler, Configuration } from '@crawlee/browser';
3
3
  import type { PuppeteerController, PuppeteerPlugin } from '@crawlee/browser-pool';
4
4
  import type { Dictionary } from '@crawlee/types';
@@ -239,5 +239,6 @@ export declare class PuppeteerCrawler extends BrowserCrawler<{
239
239
  * await crawler.run();
240
240
  * ```
241
241
  */
242
- // @ts-ignore optional peer dependency or compatibility with es2022
243
- export declare function createPuppeteerRouter<Context extends PuppeteerCrawlingContext = PuppeteerCrawlingContext, UserData extends Dictionary = GetUserDataFromRequest<Context['request']>>(routes?: RouterRoutes<Context, UserData>): import("@crawlee/browser").RouterHandler<Context>;
242
+ export declare function createPuppeteerRouter<Context extends PuppeteerCrawlingContext = PuppeteerCrawlingContext, Routes extends Record<keyof Routes, Dictionary> = Record<string, GetUserDataFromRequest<Context['request']>>>(routes?: RouterRoutes<Context, Routes>): RouterHandler<Context, Routes>;
243
+ export declare function createPuppeteerRouter<Context extends PuppeteerCrawlingContext = PuppeteerCrawlingContext, UserData extends Dictionary = GetUserDataFromRequest<Context['request']>>(routes?: RouterRoutes<Context, Record<string, UserData>>): RouterHandler<Context, Record<string, UserData>>;
244
+ export declare function createPuppeteerRouter<Context extends PuppeteerCrawlingContext = PuppeteerCrawlingContext, const Schemas extends RouteSchemas = RouteSchemas>(schemas: Schemas): RouterHandler<Context, RoutesFromSchemas<Schemas>>;
@@ -127,30 +127,6 @@ Object.defineProperty(PuppeteerCrawler, "optionsShape", {
127
127
  browserPoolOptions: ow_1.default.optional.object,
128
128
  }
129
129
  });
130
- /**
131
- * Creates new {@link Router} instance that works based on request labels.
132
- * This instance can then serve as a `requestHandler` of your {@link PuppeteerCrawler}.
133
- * Defaults to the {@link PuppeteerCrawlingContext}.
134
- *
135
- * > Serves as a shortcut for using `Router.create<PuppeteerCrawlingContext>()`.
136
- *
137
- * ```ts
138
- * import { PuppeteerCrawler, createPuppeteerRouter } from 'crawlee';
139
- *
140
- * const router = createPuppeteerRouter();
141
- * router.addHandler('label-a', async (ctx) => {
142
- * ctx.log.info('...');
143
- * });
144
- * router.addDefaultHandler(async (ctx) => {
145
- * ctx.log.info('...');
146
- * });
147
- *
148
- * const crawler = new PuppeteerCrawler({
149
- * requestHandler: router,
150
- * });
151
- * await crawler.run();
152
- * ```
153
- */
154
- function createPuppeteerRouter(routes) {
155
- return browser_1.Router.create(routes);
130
+ function createPuppeteerRouter(routesOrSchemas) {
131
+ return browser_1.Router.create(routesOrSchemas);
156
132
  }
@@ -373,7 +373,7 @@ async function gotoExtended(page, request, gotoOptions = {}) {
373
373
  }
374
374
  const { url, method, headers, payload } = request;
375
375
  const isEmpty = (o) => !o || Object.keys(o).length === 0;
376
- if (method !== 'GET' || payload || !isEmpty(headers)) {
376
+ if (method !== 'GET' || payload) {
377
377
  // This is not deprecated, we use it to log only once.
378
378
  log.deprecated('Using other request methods than GET, rewriting headers and adding payloads has a high impact on performance ' +
379
379
  'in recent versions of Puppeteer. Use only when necessary.');
@@ -398,6 +398,19 @@ async function gotoExtended(page, request, gotoOptions = {}) {
398
398
  };
399
399
  await (0, puppeteer_request_interception_1.addInterceptRequestHandler)(page, interceptRequestHandler);
400
400
  }
401
+ else if (!isEmpty(headers)) {
402
+ const extraHeaders = { ...headers };
403
+ // Chrome bundled with Puppeteer 25+ ignores a `User-Agent` passed via `setExtraHTTPHeaders()`, it has to be set explicitly.
404
+ for (const name of Object.keys(extraHeaders)) {
405
+ if (name.toLowerCase() === 'user-agent') {
406
+ await page.setUserAgent(extraHeaders[name]);
407
+ delete extraHeaders[name];
408
+ }
409
+ }
410
+ if (!isEmpty(extraHeaders)) {
411
+ await page.setExtraHTTPHeaders(extraHeaders);
412
+ }
413
+ }
401
414
  return page.goto(url, gotoOptions);
402
415
  }
403
416
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crawlee/puppeteer",
3
- "version": "3.17.1-beta.6",
3
+ "version": "3.17.1-beta.60",
4
4
  "description": "The scalable web crawling and scraping library for JavaScript/Node.js. Enables development of data extraction and web automation jobs (not only) with headless Chrome and Puppeteer.",
5
5
  "engines": {
6
6
  "node": ">=16.0.0"
@@ -55,10 +55,10 @@
55
55
  "dependencies": {
56
56
  "@apify/datastructures": "^2.0.0",
57
57
  "@apify/log": "^2.4.0",
58
- "@crawlee/browser": "3.17.1-beta.6",
59
- "@crawlee/browser-pool": "3.17.1-beta.6",
60
- "@crawlee/types": "3.17.1-beta.6",
61
- "@crawlee/utils": "3.17.1-beta.6",
58
+ "@crawlee/browser": "3.17.1-beta.60",
59
+ "@crawlee/browser-pool": "3.17.1-beta.60",
60
+ "@crawlee/types": "3.17.1-beta.60",
61
+ "@crawlee/utils": "3.17.1-beta.60",
62
62
  "cheerio": "1.0.0-rc.12",
63
63
  "devtools-protocol": "*",
64
64
  "idcac-playwright": "^0.2.0",
@@ -85,5 +85,5 @@
85
85
  }
86
86
  }
87
87
  },
88
- "gitHead": "eda1d0870cfa01cfd7d2a4a9d0e4e6b99d18dea1"
88
+ "gitHead": "5ba2517b5f3bc6ef868b860c6c783a3e7e7d4a93"
89
89
  }