@crawlee/playwright 3.17.1-beta.8 → 3.17.1-beta.80

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
@@ -54,6 +54,7 @@ export const RequestQueue = mod.RequestQueue;
54
54
  export const RequestQueueV1 = mod.RequestQueueV1;
55
55
  export const RequestQueueV2 = mod.RequestQueueV2;
56
56
  export const RequestState = mod.RequestState;
57
+ export const RequestValidationError = mod.RequestValidationError;
57
58
  export const RetryRequestError = mod.RetryRequestError;
58
59
  export const Router = mod.Router;
59
60
  export const STATE_PERSISTENCE_KEY = mod.STATE_PERSISTENCE_KEY;
@@ -85,6 +86,7 @@ export const createEventLoopLoadSignal = mod.createEventLoopLoadSignal;
85
86
  export const createPlaywrightRouter = mod.createPlaywrightRouter;
86
87
  export const createRequestOptions = mod.createRequestOptions;
87
88
  export const createRequests = mod.createRequests;
89
+ export const defaultRoute = mod.defaultRoute;
88
90
  export const deserializeArray = mod.deserializeArray;
89
91
  export const enqueueLinks = mod.enqueueLinks;
90
92
  export const evaluateLoadSignalSample = mod.evaluateLoadSignalSample;
@@ -109,5 +111,6 @@ export const tryAbsoluteURL = mod.tryAbsoluteURL;
109
111
  export const updateEnqueueLinksPatternCache = mod.updateEnqueueLinksPatternCache;
110
112
  export const useState = mod.useState;
111
113
  export const validateGlobPattern = mod.validateGlobPattern;
114
+ export const validateUserData = mod.validateUserData;
112
115
  export const validators = mod.validators;
113
116
  export const withCheckedStorageAccess = mod.withCheckedStorageAccess;
@@ -1,4 +1,4 @@
1
- import type { BrowserHook, LoadedContext, RouterHandler } from '@crawlee/browser';
1
+ import type { BrowserHook, LoadedContext, RequestHandler, RouterHandler, RouteSchemas, RoutesFromSchemas } from '@crawlee/browser';
2
2
  import type { BaseHttpResponseData, EnqueueLinksOptions, GetUserDataFromRequest, RestrictedCrawlingContext, RouterRoutes, StatisticsOptions, StatisticState } from '@crawlee/core';
3
3
  import { Configuration, RequestHandlerResult, Statistics } from '@crawlee/core';
4
4
  import type { Awaitable, BatchAddRequestsResult, Dictionary } from '@crawlee/types';
@@ -194,6 +194,11 @@ export declare class AdaptivePlaywrightCrawler extends PlaywrightCrawler {
194
194
  */
195
195
  // @ts-ignore optional peer dependency or compatibility with es2022
196
196
  readonly router: RouterHandler<AdaptivePlaywrightCrawlerContext>;
197
+ /**
198
+ * The `requestHandler` never reaches `BrowserCrawler` here — it is kept as `adaptiveRequestHandler` and
199
+ * invoked through a proxy — so router-aware metadata has to resolve against it.
200
+ */
201
+ protected get userRequestHandler(): RequestHandler<PlaywrightCrawlingContext>;
197
202
  constructor(options?: AdaptivePlaywrightCrawlerOptions, config?: Configuration);
198
203
  /**
199
204
  * Returns the number of rendering type detections currently in progress.
@@ -211,5 +216,7 @@ export declare class AdaptivePlaywrightCrawler extends PlaywrightCrawler {
211
216
  protected enqueueLinks(options: SetRequired<EnqueueLinksOptions, 'urls'>, request: RestrictedCrawlingContext['request'], result: RequestHandlerResult): Promise<BatchAddRequestsResult>;
212
217
  private createLogProxy;
213
218
  }
214
- export declare function createAdaptivePlaywrightRouter<Context extends AdaptivePlaywrightCrawlerContext = AdaptivePlaywrightCrawlerContext, UserData extends Dictionary = GetUserDataFromRequest<Context['request']>>(routes?: RouterRoutes<Context, UserData>): RouterHandler<Context>;
219
+ export declare function createAdaptivePlaywrightRouter<Context extends AdaptivePlaywrightCrawlerContext = AdaptivePlaywrightCrawlerContext, Routes extends Record<keyof Routes, Dictionary> = Record<string, GetUserDataFromRequest<Context['request']>>>(routes?: RouterRoutes<Context, Routes>): RouterHandler<Context, Routes>;
220
+ export declare function createAdaptivePlaywrightRouter<Context extends AdaptivePlaywrightCrawlerContext = AdaptivePlaywrightCrawlerContext, UserData extends Dictionary = GetUserDataFromRequest<Context['request']>>(routes?: RouterRoutes<Context, Record<string, UserData>>): RouterHandler<Context, Record<string, UserData>>;
221
+ export declare function createAdaptivePlaywrightRouter<Context extends AdaptivePlaywrightCrawlerContext = AdaptivePlaywrightCrawlerContext, const Schemas extends RouteSchemas = RouteSchemas>(schemas: Schemas): RouterHandler<Context, RoutesFromSchemas<Schemas>>;
215
222
  export {};
@@ -94,6 +94,13 @@ const proxyLogMethods = [
94
94
  * @experimental
95
95
  */
96
96
  class AdaptivePlaywrightCrawler extends playwright_crawler_1.PlaywrightCrawler {
97
+ /**
98
+ * The `requestHandler` never reaches `BrowserCrawler` here — it is kept as `adaptiveRequestHandler` and
99
+ * invoked through a proxy — so router-aware metadata has to resolve against it.
100
+ */
101
+ get userRequestHandler() {
102
+ return this.adaptiveRequestHandler;
103
+ }
97
104
  constructor(options = {}, config = core_1.Configuration.getGlobalConfig()) {
98
105
  const { requestHandler, renderingTypeDetectionRatio = 0.1, renderingTypePredictor, resultChecker, shouldPropagateError, resultComparator, statisticsOptions, preventDirectStorageAccess = true, ...rest } = options;
99
106
  super(rest, config);
@@ -478,6 +485,6 @@ class AdaptivePlaywrightCrawler extends playwright_crawler_1.PlaywrightCrawler {
478
485
  }
479
486
  }
480
487
  exports.AdaptivePlaywrightCrawler = AdaptivePlaywrightCrawler;
481
- function createAdaptivePlaywrightRouter(routes) {
482
- return core_1.Router.create(routes);
488
+ function createAdaptivePlaywrightRouter(routesOrSchemas) {
489
+ return core_1.Router.create(routesOrSchemas);
483
490
  }
@@ -57,7 +57,7 @@ async function enqueueLinksByClickingElements(options) {
57
57
  requestQueue: ow_1.default.object.hasKeys('fetchNextRequest', 'addRequest'),
58
58
  selector: ow_1.default.string,
59
59
  userData: ow_1.default.optional.object,
60
- clickOptions: ow_1.default.optional.object.hasKeys('clickCount', 'delay'),
60
+ clickOptions: ow_1.default.optional.object,
61
61
  pseudoUrls: ow_1.default.optional.array.ofType(ow_1.default.any(ow_1.default.string, ow_1.default.object.hasKeys('purl'))),
62
62
  globs: ow_1.default.optional.array.ofType(ow_1.default.any(ow_1.default.string, ow_1.default.object.hasKeys('glob'))),
63
63
  regexps: ow_1.default.optional.array.ofType(ow_1.default.any(ow_1.default.regExp, ow_1.default.object.hasKeys('regexp'))),
@@ -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 { CommonPage, PlaywrightController, PlaywrightPlugin } from '@crawlee/browser-pool';
4
4
  import type { Dictionary } from '@crawlee/types';
@@ -295,5 +295,6 @@ export declare class PlaywrightCrawler extends BrowserCrawler<{
295
295
  * await crawler.run();
296
296
  * ```
297
297
  */
298
- // @ts-ignore optional peer dependency or compatibility with es2022
299
- export declare function createPlaywrightRouter<Context extends PlaywrightCrawlingContext = PlaywrightCrawlingContext, UserData extends Dictionary = GetUserDataFromRequest<Context['request']>>(routes?: RouterRoutes<Context, UserData>): import("@crawlee/browser").RouterHandler<Context>;
298
+ export declare function createPlaywrightRouter<Context extends PlaywrightCrawlingContext = PlaywrightCrawlingContext, Routes extends Record<keyof Routes, Dictionary> = Record<string, GetUserDataFromRequest<Context['request']>>>(routes?: RouterRoutes<Context, Routes>): RouterHandler<Context, Routes>;
299
+ export declare function createPlaywrightRouter<Context extends PlaywrightCrawlingContext = PlaywrightCrawlingContext, UserData extends Dictionary = GetUserDataFromRequest<Context['request']>>(routes?: RouterRoutes<Context, Record<string, UserData>>): RouterHandler<Context, Record<string, UserData>>;
300
+ export declare function createPlaywrightRouter<Context extends PlaywrightCrawlingContext = PlaywrightCrawlingContext, const Schemas extends RouteSchemas = RouteSchemas>(schemas: Schemas): RouterHandler<Context, RoutesFromSchemas<Schemas>>;
@@ -134,30 +134,6 @@ Object.defineProperty(PlaywrightCrawler, "optionsShape", {
134
134
  launcher: ow_1.default.optional.object,
135
135
  }
136
136
  });
137
- /**
138
- * Creates new {@link Router} instance that works based on request labels.
139
- * This instance can then serve as a `requestHandler` of your {@link PlaywrightCrawler}.
140
- * Defaults to the {@link PlaywrightCrawlingContext}.
141
- *
142
- * > Serves as a shortcut for using `Router.create<PlaywrightCrawlingContext>()`.
143
- *
144
- * ```ts
145
- * import { PlaywrightCrawler, createPlaywrightRouter } from 'crawlee';
146
- *
147
- * const router = createPlaywrightRouter();
148
- * router.addHandler('label-a', async (ctx) => {
149
- * ctx.log.info('...');
150
- * });
151
- * router.addDefaultHandler(async (ctx) => {
152
- * ctx.log.info('...');
153
- * });
154
- *
155
- * const crawler = new PlaywrightCrawler({
156
- * requestHandler: router,
157
- * });
158
- * await crawler.run();
159
- * ```
160
- */
161
- function createPlaywrightRouter(routes) {
162
- return browser_1.Router.create(routes);
137
+ function createPlaywrightRouter(routesOrSchemas) {
138
+ return browser_1.Router.create(routesOrSchemas);
163
139
  }
@@ -133,7 +133,7 @@ async function gotoExtended(page, request, gotoOptions = {}) {
133
133
  (0, ow_1.default)(gotoOptions, ow_1.default.object);
134
134
  const { url, method, headers, payload } = request;
135
135
  const isEmpty = (o) => !o || Object.keys(o).length === 0;
136
- if (method !== 'GET' || payload || !isEmpty(headers)) {
136
+ if (method !== 'GET' || payload) {
137
137
  // This is not deprecated, we use it to log only once.
138
138
  log.deprecated('Using other request methods than GET, rewriting headers and adding payloads has a high impact on performance ' +
139
139
  'in recent versions of Playwright. Use only when necessary.');
@@ -162,6 +162,9 @@ async function gotoExtended(page, request, gotoOptions = {}) {
162
162
  };
163
163
  await page.route('**/*', interceptRequestHandler);
164
164
  }
165
+ else if (!isEmpty(headers)) {
166
+ await page.setExtraHTTPHeaders(headers);
167
+ }
165
168
  return page.goto(url, gotoOptions);
166
169
  }
167
170
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crawlee/playwright",
3
- "version": "3.17.1-beta.8",
3
+ "version": "3.17.1-beta.80",
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,12 +55,12 @@
55
55
  "dependencies": {
56
56
  "@apify/datastructures": "^2.0.0",
57
57
  "@apify/log": "^2.4.0",
58
- "@apify/timeout": "^0.3.1",
59
- "@crawlee/browser": "3.17.1-beta.8",
60
- "@crawlee/browser-pool": "3.17.1-beta.8",
61
- "@crawlee/core": "3.17.1-beta.8",
62
- "@crawlee/types": "3.17.1-beta.8",
63
- "@crawlee/utils": "3.17.1-beta.8",
58
+ "@apify/timeout": "^0.4.0",
59
+ "@crawlee/browser": "3.17.1-beta.80",
60
+ "@crawlee/browser-pool": "3.17.1-beta.80",
61
+ "@crawlee/core": "3.17.1-beta.80",
62
+ "@crawlee/types": "3.17.1-beta.80",
63
+ "@crawlee/utils": "3.17.1-beta.80",
64
64
  "cheerio": "1.0.0-rc.12",
65
65
  "jquery": "^3.6.0",
66
66
  "lodash.isequal": "^4.5.0",
@@ -68,7 +68,8 @@
68
68
  "ml-matrix": "^6.11.0",
69
69
  "ow": "^0.28.1",
70
70
  "string-comparison": "^1.3.0",
71
- "tslib": "^2.4.0"
71
+ "tslib": "^2.4.0",
72
+ "type-fest": "^4.0.0"
72
73
  },
73
74
  "peerDependencies": {
74
75
  "idcac-playwright": "^0.2.0",
@@ -89,5 +90,5 @@
89
90
  }
90
91
  }
91
92
  },
92
- "gitHead": "4f4b8c1d53b9185095ac68017aff0ef2b8182b6b"
93
+ "gitHead": "5b3c2d52f128643de6f515e87eeb531d55a187f0"
93
94
  }