From e692213c17aa5b986f6bc7d8da93630bd9a9c6a7 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Thu, 11 Jun 2026 17:27:19 +0200 Subject: [PATCH 01/14] fix(ci): unblock e2e and PR workflows --- .github/workflows/on-pull-request.yml | 7 +++++-- .github/workflows/test-e2e.yaml | 9 ++++++++- .gitignore | 2 ++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.github/workflows/on-pull-request.yml b/.github/workflows/on-pull-request.yml index 3b02249d..06d64338 100644 --- a/.github/workflows/on-pull-request.yml +++ b/.github/workflows/on-pull-request.yml @@ -13,6 +13,7 @@ jobs: name: Build & Test if: (!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, 'docs:')) runs-on: ubuntu-22.04 + timeout-minutes: 30 steps: - name: Checkout repository @@ -21,7 +22,8 @@ jobs: - name: Use Node.js 24 uses: actions/setup-node@v6 with: - node-version: 24 + # Pinned: on Node 24.16.0 (Linux) `pnpm install` never exits after running + node-version: 24.15.0 - name: Install pnpm and dependencies uses: apify/actions/pnpm-install@v1.1.2 @@ -38,6 +40,7 @@ jobs: lint: name: Lint runs-on: ubuntu-22.04 + timeout-minutes: 30 steps: - name: Checkout repository uses: actions/checkout@v6 @@ -45,7 +48,7 @@ jobs: - name: Use Node.js 24 uses: actions/setup-node@v6 with: - node-version: 24 + node-version: 24.15.0 - name: Install pnpm and dependencies uses: apify/actions/pnpm-install@v1.1.2 diff --git a/.github/workflows/test-e2e.yaml b/.github/workflows/test-e2e.yaml index 404d2d93..0f4c55b5 100644 --- a/.github/workflows/test-e2e.yaml +++ b/.github/workflows/test-e2e.yaml @@ -13,6 +13,7 @@ jobs: build_and_test: name: Build & Test runs-on: ubuntu-22.04 + timeout-minutes: 60 steps: - name: Cancel Workflow Action @@ -26,7 +27,8 @@ jobs: - name: Use Node.js 24 uses: actions/setup-node@v6 with: - node-version: 24 + # Pinned: on Node 24.16.0 (Linux) `pnpm install` never exits after running + node-version: 24.15.0 - name: Turbo cache id: turbo-cache @@ -40,6 +42,11 @@ jobs: - name: Install pnpm and dependencies uses: apify/actions/pnpm-install@v1.1.2 + - name: Install browsers + run: | + pnpm exec puppeteer browsers install chrome + pnpm exec playwright install chromium + - name: Build run: pnpm ci:build diff --git a/.gitignore b/.gitignore index b5a464c7..0704f7e4 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ pids .vscode yarn.lock .yarn +# npm locks are generated locally in actor dirs (the monorepo uses pnpm-lock.yaml) +package-lock.json tmp jsconfig.json types From 250178a0dd58e69107e32a17bac369dc1f0dd973 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Thu, 11 Jun 2026 17:40:51 +0200 Subject: [PATCH 02/14] feat(ci): add sitemap-extractor to the release workflow --- .github/workflows/release-generic-actors.yaml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-generic-actors.yaml b/.github/workflows/release-generic-actors.yaml index 84e6a1f2..e9da596c 100644 --- a/.github/workflows/release-generic-actors.yaml +++ b/.github/workflows/release-generic-actors.yaml @@ -34,6 +34,11 @@ on: type: boolean required: false default: true + sitemap-scraper: + description: apify/sitemap-extractor + type: boolean + required: false + default: true build-channel: description: Build channel type: choice @@ -42,7 +47,8 @@ on: - stable - development - custom - default: stable + # development by default so an accidental run cannot publish to stable + default: development version: description: Custom version (only for custom build channel) type: string @@ -95,6 +101,15 @@ jobs: development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.camoufox-scraper }} + # Platform actor is apify/sitemap-extractor (name in .actor/actor.json); + # `actor` is the directory name. Stable tag is `latest` — that is how the + # actor has been published so far, unlike the version-N scheme above. + - actor: sitemap-scraper + stable-version: '0.1' + stable-build-tag: latest + development-version: '0.0' + development-build-tag: development + should-build: ${{ github.event.inputs.sitemap-scraper }} steps: - uses: actions/checkout@v6 From 9accd175b442fe168cc00bb08e46ce1e7ef63403 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Mon, 15 Jun 2026 15:37:38 +0200 Subject: [PATCH 03/14] chore: post-split fixups (crawling depth, repo metadata, docs) --- CONTRIBUTING.md | 6 +++--- package.json | 10 +++++----- packages/actor-scraper/camoufox-scraper/package.json | 4 ++-- packages/actor-scraper/cheerio-scraper/README.md | 2 +- packages/actor-scraper/cheerio-scraper/package.json | 4 ++-- packages/actor-scraper/jsdom-scraper/README.md | 2 +- packages/actor-scraper/jsdom-scraper/package.json | 4 ++-- packages/actor-scraper/playwright-scraper/package.json | 4 ++-- packages/actor-scraper/puppeteer-scraper/package.json | 4 ++-- packages/actor-scraper/web-scraper/package.json | 4 ++-- packages/scraper-tools/package.json | 5 +++-- packages/scraper-tools/src/context.ts | 2 +- 12 files changed, 26 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0342fa25..e373a9c7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,14 +14,14 @@ Please provide steps to reproduce if you found a bug or ideally fork the reposit Before you submit your pull request, consider the following guidelines: -- Search [GitHub](https://github.com/apify/apify-sdk-js/pulls) for an open or closed PR that relates to your submission. You don't want to duplicate effort. +- Search [GitHub](https://github.com/apify/actor-scraper/pulls) for an open or closed PR that relates to your submission. You don't want to duplicate effort. -- Fork the project and install NPM dependencies. +- Fork the project and install dependencies with pnpm. - Run tests before you start working, to be sure they all pass and your setup is working correctly: ```sh - npm run test + pnpm test ``` - Be sure to **include appropriate test cases**. Tests help make it clear what the PR is fixing and also make sure the changes won't break over time. diff --git a/package.json b/package.json index fa8314cc..cf3d065c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "apify-sdk-js", + "name": "actor-scraper", "private": true, - "description": "Apify SDK monorepo", + "description": "Apify generic scrapers monorepo", "keywords": [ "apify", "headless", @@ -23,12 +23,12 @@ "license": "Apache-2.0", "repository": { "type": "git", - "url": "git+https://github.com/apify/apify-ts" + "url": "git+https://github.com/apify/actor-scraper.git" }, "bugs": { - "url": "https://github.com/apify/apify-ts/issues" + "url": "https://github.com/apify/actor-scraper/issues" }, - "homepage": "https://sdk.apify.com", + "homepage": "https://github.com/apify/actor-scraper", "scripts": { "prepare": "husky", "prepublishOnly": "turbo run copy", diff --git a/packages/actor-scraper/camoufox-scraper/package.json b/packages/actor-scraper/camoufox-scraper/package.json index b109f7a1..ceb8325e 100644 --- a/packages/actor-scraper/camoufox-scraper/package.json +++ b/packages/actor-scraper/camoufox-scraper/package.json @@ -28,7 +28,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/apify/apify-sdk-js" + "url": "https://github.com/apify/actor-scraper" }, "author": { "name": "Apify Technologies", @@ -36,5 +36,5 @@ "url": "https://apify.com" }, "license": "Apache-2.0", - "homepage": "https://github.com/apify/apify-sdk-js" + "homepage": "https://github.com/apify/actor-scraper" } diff --git a/packages/actor-scraper/cheerio-scraper/README.md b/packages/actor-scraper/cheerio-scraper/README.md index 8370736d..2ade93fd 100644 --- a/packages/actor-scraper/cheerio-scraper/README.md +++ b/packages/actor-scraper/cheerio-scraper/README.md @@ -183,7 +183,7 @@ async function pageFunction(context) { } ``` -The code runs in [Node.js 16](https://nodejs.org/) and the function accepts a single argument, the `context` object, whose properties are listed below. +The code runs in [Node.js 22](https://nodejs.org/) and the function accepts a single argument, the `context` object, whose properties are listed below. The return value of the page function is an object (or an array of objects) representing the data extracted from the web page. The return value must be stringify-able to JSON, i.e. it can only contain basic types and no circular references. If you prefer not to extract any data from the page and skip it in the clean results, simply return `null` or `undefined`. diff --git a/packages/actor-scraper/cheerio-scraper/package.json b/packages/actor-scraper/cheerio-scraper/package.json index 761742d8..2a54a319 100644 --- a/packages/actor-scraper/cheerio-scraper/package.json +++ b/packages/actor-scraper/cheerio-scraper/package.json @@ -26,7 +26,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/apify/apify-sdk-js" + "url": "https://github.com/apify/actor-scraper" }, "author": { "name": "Apify Technologies", @@ -38,5 +38,5 @@ "Ondra Urban " ], "license": "Apache-2.0", - "homepage": "https://github.com/apify/apify-sdk-js" + "homepage": "https://github.com/apify/actor-scraper" } diff --git a/packages/actor-scraper/jsdom-scraper/README.md b/packages/actor-scraper/jsdom-scraper/README.md index d9162c80..d2441f7f 100644 --- a/packages/actor-scraper/jsdom-scraper/README.md +++ b/packages/actor-scraper/jsdom-scraper/README.md @@ -150,7 +150,7 @@ async function pageFunction(context) { } ``` -The code runs in [Node.js 16](https://nodejs.org/) and the function accepts a single argument, the `context` object, whose properties are listed below. +The code runs in [Node.js 22](https://nodejs.org/) and the function accepts a single argument, the `context` object, whose properties are listed below. The return value of the page function is an object (or an array of objects) representing the data extracted from the web page. The return value must be stringify-able to JSON, i.e. it can only contain basic types and no circular references. If you prefer not to extract any data from the page and skip it in the clean results, simply return `null` or `undefined`. diff --git a/packages/actor-scraper/jsdom-scraper/package.json b/packages/actor-scraper/jsdom-scraper/package.json index 71736154..686c49f6 100644 --- a/packages/actor-scraper/jsdom-scraper/package.json +++ b/packages/actor-scraper/jsdom-scraper/package.json @@ -26,7 +26,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/apify/apify-sdk-js" + "url": "https://github.com/apify/actor-scraper" }, "author": { "name": "Apify Technologies", @@ -38,5 +38,5 @@ "Ondra Urban " ], "license": "Apache-2.0", - "homepage": "https://github.com/apify/apify-sdk-js" + "homepage": "https://github.com/apify/actor-scraper" } diff --git a/packages/actor-scraper/playwright-scraper/package.json b/packages/actor-scraper/playwright-scraper/package.json index 4bc099fb..4c0b8774 100644 --- a/packages/actor-scraper/playwright-scraper/package.json +++ b/packages/actor-scraper/playwright-scraper/package.json @@ -27,7 +27,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/apify/apify-sdk-js" + "url": "https://github.com/apify/actor-scraper" }, "author": { "name": "Apify Technologies", @@ -35,5 +35,5 @@ "url": "https://apify.com" }, "license": "Apache-2.0", - "homepage": "https://github.com/apify/apify-sdk-js" + "homepage": "https://github.com/apify/actor-scraper" } diff --git a/packages/actor-scraper/puppeteer-scraper/package.json b/packages/actor-scraper/puppeteer-scraper/package.json index e1d06fae..04e89d38 100644 --- a/packages/actor-scraper/puppeteer-scraper/package.json +++ b/packages/actor-scraper/puppeteer-scraper/package.json @@ -25,7 +25,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/apify/apify-sdk-js" + "url": "https://github.com/apify/actor-scraper" }, "author": { "name": "Apify Technologies", @@ -37,5 +37,5 @@ "Ondra Urban " ], "license": "Apache-2.0", - "homepage": "https://github.com/apify/apify-sdk-js" + "homepage": "https://github.com/apify/actor-scraper" } diff --git a/packages/actor-scraper/web-scraper/package.json b/packages/actor-scraper/web-scraper/package.json index 3b7343e3..5bd4e5d4 100644 --- a/packages/actor-scraper/web-scraper/package.json +++ b/packages/actor-scraper/web-scraper/package.json @@ -30,7 +30,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/apify/apify-sdk-js" + "url": "https://github.com/apify/actor-scraper" }, "author": { "name": "Apify Technologies", @@ -42,5 +42,5 @@ "Ondra Urban " ], "license": "Apache-2.0", - "homepage": "https://github.com/apify/apify-sdk-js" + "homepage": "https://github.com/apify/actor-scraper" } diff --git a/packages/scraper-tools/package.json b/packages/scraper-tools/package.json index 4d8b4564..c5f8b0b6 100644 --- a/packages/scraper-tools/package.json +++ b/packages/scraper-tools/package.json @@ -21,9 +21,10 @@ "license": "Apache-2.0", "repository": { "type": "git", - "url": "git+https://github.com/apify/apify-sdk-js" + "url": "git+https://github.com/apify/actor-scraper.git", + "directory": "packages/scraper-tools" }, - "homepage": "https://github.com/apify/apify-sdk-js", + "homepage": "https://github.com/apify/actor-scraper", "scripts": { "build": "pnpm clean && pnpm compile && pnpm copy", "clean": "rimraf ./dist", diff --git a/packages/scraper-tools/src/context.ts b/packages/scraper-tools/src/context.ts index 4276b8b6..8e21aed0 100644 --- a/packages/scraper-tools/src/context.ts +++ b/packages/scraper-tools/src/context.ts @@ -141,7 +141,7 @@ class Context< const defaultUserData = { [META_KEY]: { parentRequestId: castedRequest.id || castedRequest.uniqueKey, - depth: (castedRequest.userData?.[META_KEY] as RequestMetadata).depth ?? 0 + 1, + depth: ((castedRequest.userData?.[META_KEY] as RequestMetadata | undefined)?.depth ?? 0) + 1, }, }; From c3f6fcee317ca239cf0a3ef94c2688d4c4819e37 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Mon, 15 Jun 2026 16:15:58 +0200 Subject: [PATCH 04/14] fix(docker): ignore local npm lock so isolated builds match the platform --- packages/actor-scraper/camoufox-scraper/.dockerignore | 3 +++ packages/actor-scraper/cheerio-scraper/.dockerignore | 3 +++ packages/actor-scraper/jsdom-scraper/.dockerignore | 3 +++ packages/actor-scraper/playwright-scraper/.dockerignore | 3 +++ packages/actor-scraper/puppeteer-scraper/.dockerignore | 3 +++ packages/actor-scraper/sitemap-scraper/.dockerignore | 3 +++ packages/actor-scraper/web-scraper/.dockerignore | 3 +++ 7 files changed, 21 insertions(+) diff --git a/packages/actor-scraper/camoufox-scraper/.dockerignore b/packages/actor-scraper/camoufox-scraper/.dockerignore index d421f7a7..ab7888bf 100644 --- a/packages/actor-scraper/camoufox-scraper/.dockerignore +++ b/packages/actor-scraper/camoufox-scraper/.dockerignore @@ -10,3 +10,6 @@ dist # installed files node_modules + +# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) +package-lock.json diff --git a/packages/actor-scraper/cheerio-scraper/.dockerignore b/packages/actor-scraper/cheerio-scraper/.dockerignore index ceb85b1c..b8a10016 100644 --- a/packages/actor-scraper/cheerio-scraper/.dockerignore +++ b/packages/actor-scraper/cheerio-scraper/.dockerignore @@ -8,3 +8,6 @@ storage # installed files node_modules + +# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) +package-lock.json diff --git a/packages/actor-scraper/jsdom-scraper/.dockerignore b/packages/actor-scraper/jsdom-scraper/.dockerignore index ceb85b1c..b8a10016 100644 --- a/packages/actor-scraper/jsdom-scraper/.dockerignore +++ b/packages/actor-scraper/jsdom-scraper/.dockerignore @@ -8,3 +8,6 @@ storage # installed files node_modules + +# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) +package-lock.json diff --git a/packages/actor-scraper/playwright-scraper/.dockerignore b/packages/actor-scraper/playwright-scraper/.dockerignore index ceb85b1c..b8a10016 100644 --- a/packages/actor-scraper/playwright-scraper/.dockerignore +++ b/packages/actor-scraper/playwright-scraper/.dockerignore @@ -8,3 +8,6 @@ storage # installed files node_modules + +# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) +package-lock.json diff --git a/packages/actor-scraper/puppeteer-scraper/.dockerignore b/packages/actor-scraper/puppeteer-scraper/.dockerignore index ceb85b1c..b8a10016 100644 --- a/packages/actor-scraper/puppeteer-scraper/.dockerignore +++ b/packages/actor-scraper/puppeteer-scraper/.dockerignore @@ -8,3 +8,6 @@ storage # installed files node_modules + +# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) +package-lock.json diff --git a/packages/actor-scraper/sitemap-scraper/.dockerignore b/packages/actor-scraper/sitemap-scraper/.dockerignore index ceb85b1c..b8a10016 100644 --- a/packages/actor-scraper/sitemap-scraper/.dockerignore +++ b/packages/actor-scraper/sitemap-scraper/.dockerignore @@ -8,3 +8,6 @@ storage # installed files node_modules + +# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) +package-lock.json diff --git a/packages/actor-scraper/web-scraper/.dockerignore b/packages/actor-scraper/web-scraper/.dockerignore index ceb85b1c..b8a10016 100644 --- a/packages/actor-scraper/web-scraper/.dockerignore +++ b/packages/actor-scraper/web-scraper/.dockerignore @@ -8,3 +8,6 @@ storage # installed files node_modules + +# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) +package-lock.json From 719da43a6d7c504a1fdb5aacbc7b85e41e2d3289 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Tue, 16 Jun 2026 11:13:18 +0200 Subject: [PATCH 05/14] chore(scraper-tools): cover crawling depth in enqueueRequest --- test/scraper-tools/context.test.ts | 56 ++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 test/scraper-tools/context.test.ts diff --git a/test/scraper-tools/context.test.ts b/test/scraper-tools/context.test.ts new file mode 100644 index 00000000..38d842a9 --- /dev/null +++ b/test/scraper-tools/context.test.ts @@ -0,0 +1,56 @@ +import { Request } from '@crawlee/core'; + +import type { CrawlerSetupOptions } from '@apify/scraper-tools'; +import { constants, createContext } from '@apify/scraper-tools'; + +const { META_KEY } = constants; + +function createTestContext(request: Request) { + const addRequest = vi.fn(async (req: unknown) => req); + const crawlerSetup = { + rawInput: '{}', + env: {}, + globalStore: new Map(), + requestQueue: { addRequest }, + keyValueStore: {}, + customData: null, + } as unknown as CrawlerSetupOptions; + const { context } = createContext({ crawlerSetup, pageFunctionArguments: { request } }); + return { context, addRequest }; +} + +describe('Context.enqueueRequest()', () => { + it('increments the crawling depth of the parent request', async () => { + const request = new Request({ url: 'https://www.example.com/parent' }); + request.userData[META_KEY] = { depth: 2, parentRequestId: null }; + const { context, addRequest } = createTestContext(request); + + await context.enqueueRequest({ url: 'https://www.example.com/child' }); + + expect(addRequest).toHaveBeenCalledTimes(1); + const enqueued = addRequest.mock.calls[0][0] as { userData: Record }; + expect(enqueued.userData[META_KEY].depth).toBe(3); + }); + + it('starts at depth 1 when the parent request has no metadata', async () => { + const request = new Request({ url: 'https://www.example.com/parent' }); + const { context, addRequest } = createTestContext(request); + + await context.enqueueRequest({ url: 'https://www.example.com/child' }); + + const enqueued = addRequest.mock.calls[0][0] as { userData: Record }; + expect(enqueued.userData[META_KEY].depth).toBe(1); + }); + + it('links the enqueued request to its parent', async () => { + const request = new Request({ url: 'https://www.example.com/parent' }); + const { context, addRequest } = createTestContext(request); + + await context.enqueueRequest({ url: 'https://www.example.com/child' }); + + const enqueued = addRequest.mock.calls[0][0] as { + userData: Record; + }; + expect(enqueued.userData[META_KEY].parentRequestId).toBe(request.uniqueKey); + }); +}); From bbb7464651ac9a9fb24c5c3d40a8fc96152a59df Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Tue, 16 Jun 2026 11:23:19 +0200 Subject: [PATCH 06/14] fix(ci): keep stable as the default release channel --- .github/workflows/release-generic-actors.yaml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release-generic-actors.yaml b/.github/workflows/release-generic-actors.yaml index e9da596c..ba6c8296 100644 --- a/.github/workflows/release-generic-actors.yaml +++ b/.github/workflows/release-generic-actors.yaml @@ -47,8 +47,7 @@ on: - stable - development - custom - # development by default so an accidental run cannot publish to stable - default: development + default: stable version: description: Custom version (only for custom build channel) type: string @@ -101,9 +100,7 @@ jobs: development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.camoufox-scraper }} - # Platform actor is apify/sitemap-extractor (name in .actor/actor.json); - # `actor` is the directory name. Stable tag is `latest` — that is how the - # actor has been published so far, unlike the version-N scheme above. + # Platform actor is apify/sitemap-extractor (name in .actor/actor.json) - actor: sitemap-scraper stable-version: '0.1' stable-build-tag: latest From 968ca46c65ec9e7eb18a9efd2fcce81c2d4cfa57 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Tue, 16 Jun 2026 14:36:48 +0200 Subject: [PATCH 07/14] revert: undo enqueueRequest depth fix --- packages/scraper-tools/src/context.ts | 2 +- test/scraper-tools/context.test.ts | 56 --------------------------- 2 files changed, 1 insertion(+), 57 deletions(-) delete mode 100644 test/scraper-tools/context.test.ts diff --git a/packages/scraper-tools/src/context.ts b/packages/scraper-tools/src/context.ts index 8e21aed0..4276b8b6 100644 --- a/packages/scraper-tools/src/context.ts +++ b/packages/scraper-tools/src/context.ts @@ -141,7 +141,7 @@ class Context< const defaultUserData = { [META_KEY]: { parentRequestId: castedRequest.id || castedRequest.uniqueKey, - depth: ((castedRequest.userData?.[META_KEY] as RequestMetadata | undefined)?.depth ?? 0) + 1, + depth: (castedRequest.userData?.[META_KEY] as RequestMetadata).depth ?? 0 + 1, }, }; diff --git a/test/scraper-tools/context.test.ts b/test/scraper-tools/context.test.ts deleted file mode 100644 index 38d842a9..00000000 --- a/test/scraper-tools/context.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Request } from '@crawlee/core'; - -import type { CrawlerSetupOptions } from '@apify/scraper-tools'; -import { constants, createContext } from '@apify/scraper-tools'; - -const { META_KEY } = constants; - -function createTestContext(request: Request) { - const addRequest = vi.fn(async (req: unknown) => req); - const crawlerSetup = { - rawInput: '{}', - env: {}, - globalStore: new Map(), - requestQueue: { addRequest }, - keyValueStore: {}, - customData: null, - } as unknown as CrawlerSetupOptions; - const { context } = createContext({ crawlerSetup, pageFunctionArguments: { request } }); - return { context, addRequest }; -} - -describe('Context.enqueueRequest()', () => { - it('increments the crawling depth of the parent request', async () => { - const request = new Request({ url: 'https://www.example.com/parent' }); - request.userData[META_KEY] = { depth: 2, parentRequestId: null }; - const { context, addRequest } = createTestContext(request); - - await context.enqueueRequest({ url: 'https://www.example.com/child' }); - - expect(addRequest).toHaveBeenCalledTimes(1); - const enqueued = addRequest.mock.calls[0][0] as { userData: Record }; - expect(enqueued.userData[META_KEY].depth).toBe(3); - }); - - it('starts at depth 1 when the parent request has no metadata', async () => { - const request = new Request({ url: 'https://www.example.com/parent' }); - const { context, addRequest } = createTestContext(request); - - await context.enqueueRequest({ url: 'https://www.example.com/child' }); - - const enqueued = addRequest.mock.calls[0][0] as { userData: Record }; - expect(enqueued.userData[META_KEY].depth).toBe(1); - }); - - it('links the enqueued request to its parent', async () => { - const request = new Request({ url: 'https://www.example.com/parent' }); - const { context, addRequest } = createTestContext(request); - - await context.enqueueRequest({ url: 'https://www.example.com/child' }); - - const enqueued = addRequest.mock.calls[0][0] as { - userData: Record; - }; - expect(enqueued.userData[META_KEY].parentRequestId).toBe(request.uniqueKey); - }); -}); From 027ea86cf6468030dc37f40fe0fe7cd679ffeb0d Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Fri, 19 Jun 2026 16:24:16 +0200 Subject: [PATCH 08/14] fix(ci): unpin node, update puppeteer & playwright to latest, deterministic pnpm --- .dockerignore | 14 + .github/workflows/on-pull-request.yml | 5 +- .github/workflows/test-e2e.yaml | 3 +- .gitignore | 1 - package.json | 6 +- .../camoufox-scraper/.actor/actor.json | 2 + .../camoufox-scraper/.dockerignore | 1 - .../actor-scraper/camoufox-scraper/Dockerfile | 45 +- .../cheerio-scraper/.actor/actor.json | 2 + .../cheerio-scraper/.dockerignore | 1 - .../actor-scraper/cheerio-scraper/Dockerfile | 37 +- .../jsdom-scraper/.actor/actor.json | 2 + .../actor-scraper/jsdom-scraper/.dockerignore | 1 - .../actor-scraper/jsdom-scraper/Dockerfile | 38 +- .../playwright-scraper/.actor/actor.json | 2 + .../playwright-scraper/.dockerignore | 1 - .../playwright-scraper/Dockerfile | 45 +- .../puppeteer-scraper/.actor/actor.json | 2 + .../puppeteer-scraper/.dockerignore | 1 - .../puppeteer-scraper/Dockerfile | 45 +- .../sitemap-scraper/.actor/actor.json | 2 + .../sitemap-scraper/.dockerignore | 1 - .../actor-scraper/sitemap-scraper/Dockerfile | 37 +- .../web-scraper/.actor/actor.json | 2 + .../actor-scraper/web-scraper/.dockerignore | 1 - packages/actor-scraper/web-scraper/Dockerfile | 45 +- pnpm-lock.yaml | 806 +++++++----------- 27 files changed, 525 insertions(+), 623 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..7c0b07ae --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +# Actor images build from the monorepo root (dockerContextDir in .actor/actor.json). +# Keep the context lean: ship sources + manifests + the pnpm lockfile only. +node_modules +**/node_modules +.git +.turbo +**/dist +**/storage +apify_storage +crawlee_storage +*.log +.DS_Store +.idea +.vscode diff --git a/.github/workflows/on-pull-request.yml b/.github/workflows/on-pull-request.yml index 06d64338..21013d40 100644 --- a/.github/workflows/on-pull-request.yml +++ b/.github/workflows/on-pull-request.yml @@ -22,8 +22,7 @@ jobs: - name: Use Node.js 24 uses: actions/setup-node@v6 with: - # Pinned: on Node 24.16.0 (Linux) `pnpm install` never exits after running - node-version: 24.15.0 + node-version: 24 - name: Install pnpm and dependencies uses: apify/actions/pnpm-install@v1.1.2 @@ -48,7 +47,7 @@ jobs: - name: Use Node.js 24 uses: actions/setup-node@v6 with: - node-version: 24.15.0 + node-version: 24 - name: Install pnpm and dependencies uses: apify/actions/pnpm-install@v1.1.2 diff --git a/.github/workflows/test-e2e.yaml b/.github/workflows/test-e2e.yaml index 0f4c55b5..4b015e3e 100644 --- a/.github/workflows/test-e2e.yaml +++ b/.github/workflows/test-e2e.yaml @@ -27,8 +27,7 @@ jobs: - name: Use Node.js 24 uses: actions/setup-node@v6 with: - # Pinned: on Node 24.16.0 (Linux) `pnpm install` never exits after running - node-version: 24.15.0 + node-version: 24 - name: Turbo cache id: turbo-cache diff --git a/.gitignore b/.gitignore index 0704f7e4..6c3c6516 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,6 @@ pids yarn.lock .yarn # npm locks are generated locally in actor dirs (the monorepo uses pnpm-lock.yaml) -package-lock.json tmp jsconfig.json types diff --git a/package.json b/package.json index cf3d065c..2f446f3b 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "@apify/tsconfig": "^0.1.2", "@commitlint/config-conventional": "^20.0.0", "@isaacs/brace-expansion": "^5.0.1", - "@playwright/browser-chromium": "^1.46.0", + "@playwright/browser-chromium": "^1.61.0", "@types/content-type": "^1.1.8", "@types/fs-extra": "^11.0.4", "@types/node": "^24.0.0", @@ -81,8 +81,8 @@ "oxfmt": "0.46.0", "oxlint": "1.62.0", "oxlint-tsgolint": "0.22.0", - "playwright": "^1.46.0", - "puppeteer": "^24.0.0", + "playwright": "^1.61.0", + "puppeteer": "^25.1.0", "rimraf": "^6.0.1", "tsx": "^4.16.5", "turbo": "2.9.1", diff --git a/packages/actor-scraper/camoufox-scraper/.actor/actor.json b/packages/actor-scraper/camoufox-scraper/.actor/actor.json index 3606f908..bdcd2843 100644 --- a/packages/actor-scraper/camoufox-scraper/.actor/actor.json +++ b/packages/actor-scraper/camoufox-scraper/.actor/actor.json @@ -3,6 +3,8 @@ "name": "camoufox-scraper", "version": "0.1", "buildTag": "latest", + "dockerContextDir": "../../../..", + "dockerfile": "../Dockerfile", "storages": { "dataset": { "actorSpecification": 1, diff --git a/packages/actor-scraper/camoufox-scraper/.dockerignore b/packages/actor-scraper/camoufox-scraper/.dockerignore index ab7888bf..2a4de256 100644 --- a/packages/actor-scraper/camoufox-scraper/.dockerignore +++ b/packages/actor-scraper/camoufox-scraper/.dockerignore @@ -12,4 +12,3 @@ dist node_modules # local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) -package-lock.json diff --git a/packages/actor-scraper/camoufox-scraper/Dockerfile b/packages/actor-scraper/camoufox-scraper/Dockerfile index a58adf7a..9bc3d550 100644 --- a/packages/actor-scraper/camoufox-scraper/Dockerfile +++ b/packages/actor-scraper/camoufox-scraper/Dockerfile @@ -1,31 +1,40 @@ +# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), +# so the build can use the pnpm workspace lockfile for a deterministic install. FROM apify/actor-node-playwright-camoufox:22 AS builder -COPY --chown=myuser package*.json ./ +# The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. +USER root +WORKDIR /app -RUN npm install --include=dev --audit=false +RUN corepack enable -COPY --chown=myuser . ./ +# Browsers ship with the base image; never let an npm postinstall download them. +# puppeteer is pulled transitively via @crawlee/browser-pool even for non-puppeteer actors. +ENV PUPPETEER_SKIP_DOWNLOAD=true \ + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 -RUN npm run build +# Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). +COPY . ./ -FROM apify/actor-node-playwright-camoufox:22 +# Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. +RUN pnpm install --frozen-lockfile --filter actor-camoufox-scraper... -COPY --from=builder --chown=myuser /home/myuser/dist ./dist +# Build the actor and its workspace dependency @apify/scraper-tools. +RUN pnpm --filter actor-camoufox-scraper... build -COPY --chown=myuser package*.json ./ +# Self-contained production bundle; inject-workspace-packages copies the built +# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. +RUN pnpm config set inject-workspace-packages true \ + && pnpm --filter actor-camoufox-scraper deploy --prod /deploy -RUN npm --quiet set progress=false \ - && npm install --omit=dev \ - && echo "Installed NPM packages:" \ - && (npm list --omit=dev --all || true) \ - && echo "Node.js version:" \ - && node --version \ - && echo "NPM version:" \ - && npm --version \ - && rm -r ~/.npm +FROM apify/actor-node-playwright-camoufox:22 -COPY --chown=myuser . ./ +# Base WORKDIR is /home/myuser and ships a template node_modules plus the Xvfb entrypoint. +# Drop the template's node_modules and overlay only the lean production bundle; the inherited +# ENTRYPOINT (xvfb-entrypoint.sh) still wraps CMD with Xvfb, and the bundled browser is reused. +RUN rm -rf node_modules +COPY --from=builder --chown=myuser /deploy ./ ENV APIFY_DISABLE_OUTDATED_WARNING=1 -CMD ./start_xvfb_and_run_cmd.sh && npm run start:prod --silent +CMD ["node", "dist/main.js"] diff --git a/packages/actor-scraper/cheerio-scraper/.actor/actor.json b/packages/actor-scraper/cheerio-scraper/.actor/actor.json index 5b6865ea..26d612ef 100644 --- a/packages/actor-scraper/cheerio-scraper/.actor/actor.json +++ b/packages/actor-scraper/cheerio-scraper/.actor/actor.json @@ -3,6 +3,8 @@ "name": "cheerio-scraper", "version": "0.1", "buildTag": "latest", + "dockerContextDir": "../../../..", + "dockerfile": "../Dockerfile", "storages": { "dataset": { "actorSpecification": 1, diff --git a/packages/actor-scraper/cheerio-scraper/.dockerignore b/packages/actor-scraper/cheerio-scraper/.dockerignore index b8a10016..2424ba3f 100644 --- a/packages/actor-scraper/cheerio-scraper/.dockerignore +++ b/packages/actor-scraper/cheerio-scraper/.dockerignore @@ -10,4 +10,3 @@ storage node_modules # local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) -package-lock.json diff --git a/packages/actor-scraper/cheerio-scraper/Dockerfile b/packages/actor-scraper/cheerio-scraper/Dockerfile index d166d657..082fcd04 100644 --- a/packages/actor-scraper/cheerio-scraper/Dockerfile +++ b/packages/actor-scraper/cheerio-scraper/Dockerfile @@ -1,32 +1,33 @@ +# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), +# so the build can use the pnpm workspace lockfile for a deterministic install. FROM apify/actor-node:22 AS builder -COPY package*.json ./ +WORKDIR /app -RUN npm install --include=dev --audit=false +RUN corepack enable +# Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). COPY . ./ -RUN npm run build +# Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. +RUN pnpm install --frozen-lockfile --filter actor-cheerio-scraper... -FROM apify/actor-node:22 +# Build the actor and its workspace dependency @apify/scraper-tools. +RUN pnpm --filter actor-cheerio-scraper... build -COPY --from=builder /usr/src/app/dist ./dist +# Self-contained production bundle. inject-workspace-packages copies the built +# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. +RUN pnpm config set inject-workspace-packages true \ + && pnpm --filter actor-cheerio-scraper deploy --prod /deploy -COPY package*.json ./ +FROM apify/actor-node:22 -RUN rm -rf node_modules \ - && npm --quiet set progress=false \ - && npm install --omit=dev --omit=optional \ - && echo "Installed NPM packages:" \ - && (npm list --omit=dev --all || true) \ - && echo "Node.js version:" \ - && node --version \ - && echo "NPM version:" \ - && npm --version \ - && rm -r ~/.npm +WORKDIR /usr/src/app -COPY . ./ +# Replace the base image's template with only the lean production bundle. +RUN find /usr/src/app -mindepth 1 -delete +COPY --from=builder /deploy ./ ENV APIFY_DISABLE_OUTDATED_WARNING=1 -CMD npm run start:prod --silent +CMD ["node", "dist/main.js"] diff --git a/packages/actor-scraper/jsdom-scraper/.actor/actor.json b/packages/actor-scraper/jsdom-scraper/.actor/actor.json index 9c0ee735..8006d165 100644 --- a/packages/actor-scraper/jsdom-scraper/.actor/actor.json +++ b/packages/actor-scraper/jsdom-scraper/.actor/actor.json @@ -3,6 +3,8 @@ "name": "jsdom-scraper", "version": "0.1", "buildTag": "latest", + "dockerContextDir": "../../../..", + "dockerfile": "../Dockerfile", "storages": { "dataset": { "actorSpecification": 1, diff --git a/packages/actor-scraper/jsdom-scraper/.dockerignore b/packages/actor-scraper/jsdom-scraper/.dockerignore index b8a10016..2424ba3f 100644 --- a/packages/actor-scraper/jsdom-scraper/.dockerignore +++ b/packages/actor-scraper/jsdom-scraper/.dockerignore @@ -10,4 +10,3 @@ storage node_modules # local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) -package-lock.json diff --git a/packages/actor-scraper/jsdom-scraper/Dockerfile b/packages/actor-scraper/jsdom-scraper/Dockerfile index 54e0f35f..40c84bce 100644 --- a/packages/actor-scraper/jsdom-scraper/Dockerfile +++ b/packages/actor-scraper/jsdom-scraper/Dockerfile @@ -1,29 +1,33 @@ +# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), +# so the build can use the pnpm workspace lockfile for a deterministic install. FROM apify/actor-node:22 AS builder -COPY package*.json ./ +WORKDIR /app -RUN npm install --include=dev --audit=false +RUN corepack enable +# Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). COPY . ./ -RUN npm run build +# Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. +RUN pnpm install --frozen-lockfile --filter actor-jsdom-scraper... -FROM apify/actor-node:22 +# Build the actor and its workspace dependency @apify/scraper-tools. +RUN pnpm --filter actor-jsdom-scraper... build + +# Self-contained production bundle; inject-workspace-packages copies the built +# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. +RUN pnpm config set inject-workspace-packages true \ + && pnpm --filter actor-jsdom-scraper deploy --prod /deploy -COPY --from=builder /usr/src/app/dist ./dist +FROM apify/actor-node:22 -COPY package*.json ./ +WORKDIR /usr/src/app -RUN npm --quiet set progress=false \ - && npm install --omit=dev --omit=optional \ - && echo "Installed NPM packages:" \ - && (npm list --omit=dev --all || true) \ - && echo "Node.js version:" \ - && node --version \ - && echo "NPM version:" \ - && npm --version \ - && rm -r ~/.npm +# Replace the base image's template with only the lean production bundle. +RUN find /usr/src/app -mindepth 1 -delete +COPY --from=builder /deploy ./ -COPY . ./ +ENV APIFY_DISABLE_OUTDATED_WARNING=1 -CMD npm run start:prod --silent +CMD ["node", "dist/main.js"] diff --git a/packages/actor-scraper/playwright-scraper/.actor/actor.json b/packages/actor-scraper/playwright-scraper/.actor/actor.json index f9eaf9ba..239f360b 100644 --- a/packages/actor-scraper/playwright-scraper/.actor/actor.json +++ b/packages/actor-scraper/playwright-scraper/.actor/actor.json @@ -3,6 +3,8 @@ "name": "playwright-scraper", "version": "0.1", "buildTag": "latest", + "dockerContextDir": "../../../..", + "dockerfile": "../Dockerfile", "storages": { "dataset": { "actorSpecification": 1, diff --git a/packages/actor-scraper/playwright-scraper/.dockerignore b/packages/actor-scraper/playwright-scraper/.dockerignore index b8a10016..2424ba3f 100644 --- a/packages/actor-scraper/playwright-scraper/.dockerignore +++ b/packages/actor-scraper/playwright-scraper/.dockerignore @@ -10,4 +10,3 @@ storage node_modules # local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) -package-lock.json diff --git a/packages/actor-scraper/playwright-scraper/Dockerfile b/packages/actor-scraper/playwright-scraper/Dockerfile index 746a0d6d..34d22f22 100644 --- a/packages/actor-scraper/playwright-scraper/Dockerfile +++ b/packages/actor-scraper/playwright-scraper/Dockerfile @@ -1,31 +1,40 @@ +# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), +# so the build can use the pnpm workspace lockfile for a deterministic install. FROM apify/actor-node-playwright:22 AS builder -COPY --chown=myuser package*.json ./ +# The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. +USER root +WORKDIR /app -RUN npm install --include=dev --audit=false +RUN corepack enable -COPY --chown=myuser . ./ +# Browsers ship with the base image; never let an npm postinstall download them. +# puppeteer is pulled transitively via @crawlee/browser-pool even for non-puppeteer actors. +ENV PUPPETEER_SKIP_DOWNLOAD=true \ + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 -RUN npm run build +# Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). +COPY . ./ -FROM apify/actor-node-playwright:22 +# Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. +RUN pnpm install --frozen-lockfile --filter actor-playwright-scraper... -COPY --from=builder --chown=myuser /home/myuser/dist ./dist +# Build the actor and its workspace dependency @apify/scraper-tools. +RUN pnpm --filter actor-playwright-scraper... build -COPY --chown=myuser package*.json ./ +# Self-contained production bundle; inject-workspace-packages copies the built +# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. +RUN pnpm config set inject-workspace-packages true \ + && pnpm --filter actor-playwright-scraper deploy --prod /deploy -RUN npm --quiet set progress=false \ - && npm install --omit=dev --omit=optional \ - && echo "Installed NPM packages:" \ - && (npm list --omit=dev --all || true) \ - && echo "Node.js version:" \ - && node --version \ - && echo "NPM version:" \ - && npm --version \ - && rm -r ~/.npm +FROM apify/actor-node-playwright:22 -COPY --chown=myuser . ./ +# Base WORKDIR is /home/myuser and ships a template node_modules plus the Xvfb entrypoint. +# Drop the template's node_modules and overlay only the lean production bundle; the inherited +# ENTRYPOINT (xvfb-entrypoint.sh) still wraps CMD with Xvfb, and the bundled browser is reused. +RUN rm -rf node_modules +COPY --from=builder --chown=myuser /deploy ./ ENV APIFY_DISABLE_OUTDATED_WARNING=1 -CMD ./start_xvfb_and_run_cmd.sh && npm run start:prod --silent +CMD ["node", "dist/main.js"] diff --git a/packages/actor-scraper/puppeteer-scraper/.actor/actor.json b/packages/actor-scraper/puppeteer-scraper/.actor/actor.json index befa39d2..d4e0190a 100644 --- a/packages/actor-scraper/puppeteer-scraper/.actor/actor.json +++ b/packages/actor-scraper/puppeteer-scraper/.actor/actor.json @@ -3,6 +3,8 @@ "name": "puppeteer-scraper", "version": "0.1", "buildTag": "latest", + "dockerContextDir": "../../../..", + "dockerfile": "../Dockerfile", "storages": { "dataset": { "actorSpecification": 1, diff --git a/packages/actor-scraper/puppeteer-scraper/.dockerignore b/packages/actor-scraper/puppeteer-scraper/.dockerignore index b8a10016..2424ba3f 100644 --- a/packages/actor-scraper/puppeteer-scraper/.dockerignore +++ b/packages/actor-scraper/puppeteer-scraper/.dockerignore @@ -10,4 +10,3 @@ storage node_modules # local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) -package-lock.json diff --git a/packages/actor-scraper/puppeteer-scraper/Dockerfile b/packages/actor-scraper/puppeteer-scraper/Dockerfile index 8f126a23..a5c21026 100644 --- a/packages/actor-scraper/puppeteer-scraper/Dockerfile +++ b/packages/actor-scraper/puppeteer-scraper/Dockerfile @@ -1,31 +1,40 @@ +# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), +# so the build can use the pnpm workspace lockfile for a deterministic install. FROM apify/actor-node-puppeteer-chrome:22 AS builder -COPY --chown=myuser package*.json ./ +# The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. +USER root +WORKDIR /app -RUN npm install --include=dev --audit=false +RUN corepack enable -COPY --chown=myuser . ./ +# Browsers ship with the base image; never let an npm postinstall download them. +# puppeteer is pulled transitively via @crawlee/browser-pool even for non-puppeteer actors. +ENV PUPPETEER_SKIP_DOWNLOAD=true \ + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 -RUN npm run build +# Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). +COPY . ./ -FROM apify/actor-node-puppeteer-chrome:22 +# Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. +RUN pnpm install --frozen-lockfile --filter actor-puppeteer-scraper... -COPY --from=builder --chown=myuser /home/myuser/dist ./dist +# Build the actor and its workspace dependency @apify/scraper-tools. +RUN pnpm --filter actor-puppeteer-scraper... build -COPY --chown=myuser package*.json ./ +# Self-contained production bundle; inject-workspace-packages copies the built +# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. +RUN pnpm config set inject-workspace-packages true \ + && pnpm --filter actor-puppeteer-scraper deploy --prod /deploy -RUN npm --quiet set progress=false \ - && npm install --omit=dev --omit=optional \ - && echo "Installed NPM packages:" \ - && (npm list --omit=dev --all || true) \ - && echo "Node.js version:" \ - && node --version \ - && echo "NPM version:" \ - && npm --version \ - && rm -r ~/.npm +FROM apify/actor-node-puppeteer-chrome:22 -COPY --chown=myuser . ./ +# Base WORKDIR is /home/myuser and ships a template node_modules plus the Xvfb entrypoint. +# Drop the template's node_modules and overlay only the lean production bundle; the inherited +# ENTRYPOINT (xvfb-entrypoint.sh) still wraps CMD with Xvfb, and the bundled browser is reused. +RUN rm -rf node_modules +COPY --from=builder --chown=myuser /deploy ./ ENV APIFY_DISABLE_OUTDATED_WARNING=1 -CMD ./start_xvfb_and_run_cmd.sh && npm run start:prod --silent +CMD ["node", "dist/main.js"] diff --git a/packages/actor-scraper/sitemap-scraper/.actor/actor.json b/packages/actor-scraper/sitemap-scraper/.actor/actor.json index a4918ed5..7102cd45 100644 --- a/packages/actor-scraper/sitemap-scraper/.actor/actor.json +++ b/packages/actor-scraper/sitemap-scraper/.actor/actor.json @@ -3,6 +3,8 @@ "name": "sitemap-extractor", "version": "0.1", "buildTag": "latest", + "dockerContextDir": "../../../..", + "dockerfile": "../Dockerfile", "output": "./output_schema.json", "defaultMemoryMbytes": 4096, "minMemoryMbytes": 256, diff --git a/packages/actor-scraper/sitemap-scraper/.dockerignore b/packages/actor-scraper/sitemap-scraper/.dockerignore index b8a10016..2424ba3f 100644 --- a/packages/actor-scraper/sitemap-scraper/.dockerignore +++ b/packages/actor-scraper/sitemap-scraper/.dockerignore @@ -10,4 +10,3 @@ storage node_modules # local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) -package-lock.json diff --git a/packages/actor-scraper/sitemap-scraper/Dockerfile b/packages/actor-scraper/sitemap-scraper/Dockerfile index 7a9a21d9..c458c157 100644 --- a/packages/actor-scraper/sitemap-scraper/Dockerfile +++ b/packages/actor-scraper/sitemap-scraper/Dockerfile @@ -1,32 +1,33 @@ +# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), +# so the build can use the pnpm workspace lockfile for a deterministic install. FROM apify/actor-node:22 AS builder -COPY package*.json ./ +WORKDIR /app -RUN npm install --include=dev --audit=false --force +RUN corepack enable +# Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). COPY . ./ -RUN npm run build +# Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. +RUN pnpm install --frozen-lockfile --filter @apify/actor-sitemap-extractor... -FROM apify/actor-node:22 +# Build the actor and its workspace dependency @apify/scraper-tools. +RUN pnpm --filter @apify/actor-sitemap-extractor... build -COPY --from=builder /usr/src/app/dist ./dist +# Self-contained production bundle; inject-workspace-packages copies the built +# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. +RUN pnpm config set inject-workspace-packages true \ + && pnpm --filter @apify/actor-sitemap-extractor deploy --prod /deploy -COPY package*.json ./ +FROM apify/actor-node:22 -RUN rm -rf node_modules \ - && npm --quiet set progress=false \ - && npm install --omit=dev --force \ - && echo "Installed NPM packages:" \ - && (npm list --omit=dev --all || true) \ - && echo "Node.js version:" \ - && node --version \ - && echo "NPM version:" \ - && npm --version \ - && rm -r ~/.npm +WORKDIR /usr/src/app -COPY . ./ +# Replace the base image's template with only the lean production bundle. +RUN find /usr/src/app -mindepth 1 -delete +COPY --from=builder /deploy ./ ENV APIFY_DISABLE_OUTDATED_WARNING=1 -CMD npm run start:prod --silent +CMD ["node", "dist/main.js"] diff --git a/packages/actor-scraper/web-scraper/.actor/actor.json b/packages/actor-scraper/web-scraper/.actor/actor.json index ac6aed72..f7fb9862 100644 --- a/packages/actor-scraper/web-scraper/.actor/actor.json +++ b/packages/actor-scraper/web-scraper/.actor/actor.json @@ -3,6 +3,8 @@ "name": "web-scraper", "version": "0.1", "buildTag": "latest", + "dockerContextDir": "../../../..", + "dockerfile": "../Dockerfile", "storages": { "dataset": { "actorSpecification": 1, diff --git a/packages/actor-scraper/web-scraper/.dockerignore b/packages/actor-scraper/web-scraper/.dockerignore index b8a10016..2424ba3f 100644 --- a/packages/actor-scraper/web-scraper/.dockerignore +++ b/packages/actor-scraper/web-scraper/.dockerignore @@ -10,4 +10,3 @@ storage node_modules # local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) -package-lock.json diff --git a/packages/actor-scraper/web-scraper/Dockerfile b/packages/actor-scraper/web-scraper/Dockerfile index 8f126a23..f20aa7b5 100644 --- a/packages/actor-scraper/web-scraper/Dockerfile +++ b/packages/actor-scraper/web-scraper/Dockerfile @@ -1,31 +1,40 @@ +# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), +# so the build can use the pnpm workspace lockfile for a deterministic install. FROM apify/actor-node-puppeteer-chrome:22 AS builder -COPY --chown=myuser package*.json ./ +# The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. +USER root +WORKDIR /app -RUN npm install --include=dev --audit=false +RUN corepack enable -COPY --chown=myuser . ./ +# Browsers ship with the base image; never let an npm postinstall download them. +# puppeteer is pulled transitively via @crawlee/browser-pool even for non-puppeteer actors. +ENV PUPPETEER_SKIP_DOWNLOAD=true \ + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 -RUN npm run build +# Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). +COPY . ./ -FROM apify/actor-node-puppeteer-chrome:22 +# Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. +RUN pnpm install --frozen-lockfile --filter actor-web-scraper... -COPY --from=builder --chown=myuser /home/myuser/dist ./dist +# Build the actor and its workspace dependency @apify/scraper-tools. +RUN pnpm --filter actor-web-scraper... build -COPY --chown=myuser package*.json ./ +# Self-contained production bundle; inject-workspace-packages copies the built +# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. +RUN pnpm config set inject-workspace-packages true \ + && pnpm --filter actor-web-scraper deploy --prod /deploy -RUN npm --quiet set progress=false \ - && npm install --omit=dev --omit=optional \ - && echo "Installed NPM packages:" \ - && (npm list --omit=dev --all || true) \ - && echo "Node.js version:" \ - && node --version \ - && echo "NPM version:" \ - && npm --version \ - && rm -r ~/.npm +FROM apify/actor-node-puppeteer-chrome:22 -COPY --chown=myuser . ./ +# Base WORKDIR is /home/myuser and ships a template node_modules plus the Xvfb entrypoint. +# Drop the template's node_modules and overlay only the lean production bundle; the inherited +# ENTRYPOINT (xvfb-entrypoint.sh) still wraps CMD with Xvfb, and the bundled browser is reused. +RUN rm -rf node_modules +COPY --from=builder --chown=myuser /deploy ./ ENV APIFY_DISABLE_OUTDATED_WARNING=1 -CMD ./start_xvfb_and_run_cmd.sh && npm run start:prod --silent +CMD ["node", "dist/main.js"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e47499bd..81cf3958 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: ^5.0.1 version: 5.0.1 '@playwright/browser-chromium': - specifier: ^1.46.0 - version: 1.59.1 + specifier: ^1.61.0 + version: 1.61.0 '@types/content-type': specifier: ^1.1.8 version: 1.1.9 @@ -61,7 +61,7 @@ importers: version: 20.5.0(@types/node@24.12.2)(conventional-commits-parser@6.4.0)(typescript@5.9.3) crawlee: specifier: ^3.16.0 - version: 3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + version: 3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) fs-extra: specifier: ^11.2.0 version: 11.3.4 @@ -90,11 +90,11 @@ importers: specifier: 0.22.0 version: 0.22.0 playwright: - specifier: ^1.46.0 - version: 1.59.1 + specifier: ^1.61.0 + version: 1.61.0 puppeteer: - specifier: ^24.0.0 - version: 24.40.0(typescript@5.9.3) + specifier: ^25.1.0 + version: 25.1.0 rimraf: specifier: ^6.0.1 version: 6.1.3 @@ -124,7 +124,7 @@ importers: version: 3.16.0 '@crawlee/playwright': specifier: ^3.14.1 - version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) '@crawlee/utils': specifier: ^3.14.1 version: 3.16.0 @@ -133,13 +133,13 @@ importers: version: 3.7.0 camoufox-js: specifier: ^0.9.0 - version: 0.9.3(playwright-core@1.59.1) + version: 0.9.3(playwright-core@1.61.0) idcac-playwright: specifier: ^0.2.0 version: 0.2.0 playwright: specifier: '*' - version: 1.59.1 + version: 1.61.0 devDependencies: '@apify/tsconfig': specifier: ^0.1.0 @@ -220,7 +220,7 @@ importers: version: 3.16.0 '@crawlee/playwright': specifier: ^3.16.0 - version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) '@crawlee/utils': specifier: ^3.16.0 version: 3.16.0 @@ -232,7 +232,7 @@ importers: version: 0.2.0 playwright: specifier: '*' - version: 1.59.1 + version: 1.61.0 devDependencies: '@apify/tsconfig': specifier: ^0.1.0 @@ -254,7 +254,7 @@ importers: version: link:../../scraper-tools '@crawlee/puppeteer': specifier: ^3.16.0 - version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) apify: specifier: ^3.2.6 version: 3.7.0 @@ -263,7 +263,7 @@ importers: version: 0.2.0 puppeteer: specifier: '*' - version: 24.40.0(typescript@5.9.3) + version: 25.1.0 devDependencies: '@apify/tsconfig': specifier: ^0.1.0 @@ -322,7 +322,7 @@ importers: version: link:../../scraper-tools '@crawlee/puppeteer': specifier: ^3.16.0 - version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) apify: specifier: ^3.2.6 version: 3.7.0 @@ -331,7 +331,7 @@ importers: version: 1.0.5 crawlee: specifier: ^3.16.0 - version: 3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + version: 3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) devtools-server: specifier: ^0.0.2 version: 0.0.2 @@ -340,7 +340,7 @@ importers: version: 0.2.0 puppeteer: specifier: '*' - version: 24.40.0(typescript@5.9.3) + version: 25.1.0 devDependencies: '@apify/tsconfig': specifier: ^0.1.0 @@ -375,7 +375,7 @@ importers: devDependencies: '@crawlee/browser-pool': specifier: ^3.8.2 - version: 3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + version: 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) '@crawlee/core': specifier: ^3.8.2 version: 3.16.0 @@ -428,12 +428,16 @@ packages: '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@asamuzakjp/css-color@5.1.10': - resolution: {integrity: sha512-02OhhkKtgNRuicQ/nF3TRnGsxL9wp0r3Y7VlKWyOHHGmGyvXv03y+PnymU8FKFJMTjIr1Bk8U2g1HWSLrpAHww==} + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@7.0.9': - resolution: {integrity: sha512-r3ElRr7y8ucyN2KdICwGsmj19RoN13CLCa/pvGydghWK6ZzeKQ+TcDjVdtEZz2ElpndM5jXw//B9CEee0mWnVg==} + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/nwsapi@2.3.9': @@ -679,8 +683,8 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-calc@3.2.0': - resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -693,8 +697,8 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-color-parser@4.1.0': - resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + '@csstools/css-color-parser@4.1.7': + resolution: {integrity: sha512-CmjJFQTFQx/U/xNJhSjCQ0ilpesPmNQ8+eOUeM/+kDOVW33qsIjeOXc27vrQDdWVkf83ZSWwtg7kXSUvKDJ8cQ==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -712,8 +716,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3': - resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + '@csstools/css-syntax-patches-for-csstree@1.1.5': + resolution: {integrity: sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: @@ -893,8 +897,8 @@ packages: cpu: [x64] os: [win32] - '@exodus/bytes@1.15.0': - resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -1571,150 +1575,155 @@ packages: cpu: [x64] os: [win32] - '@playwright/browser-chromium@1.59.1': - resolution: {integrity: sha512-XDwr0qOrzLXAuBAzg4WO/xctVMb+ldJ54yz9KCpFu8G8MVJzUVFO6BvK1tBtBl4DIoFcoFRKHgUGZT+8wOC8BQ==} + '@playwright/browser-chromium@1.61.0': + resolution: {integrity: sha512-bBGzN+jow5uQtYRDCnFv5cpyMjUYTF6WnsfRRrDXIwbaGDtdh0JdOPmlKdJH4OK7TbkrZ35cV7jhQ1zELoX5ew==} engines: {node: '>=18'} - '@puppeteer/browsers@2.13.0': - resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} - engines: {node: '>=18'} + '@puppeteer/browsers@3.0.4': + resolution: {integrity: sha512-HGM8iAmGTf+Y7t0373szVbTmt3d7vPkYL/1bpOkOFO0YUYLgSeuYBCzESklogNPvOBnZ/MRD5f07OkpqH1trtA==} + engines: {node: '>=22.12.0'} hasBin: true + peerDependencies: + proxy-agent: '>=8.0.1' + peerDependenciesMeta: + proxy-agent: + optional: true - '@rollup/rollup-android-arm-eabi@4.60.1': - resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + '@rollup/rollup-android-arm-eabi@4.62.0': + resolution: {integrity: sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.1': - resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + '@rollup/rollup-android-arm64@4.62.0': + resolution: {integrity: sha512-M6s9cr10MibETyo8JsOkq+Lo1+lU6hcvb1MApnUql5qte/5hMEgzlN8/ReIKNfRV8rrqX50W1BX9zoUhC192RA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.1': - resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + '@rollup/rollup-darwin-arm64@4.62.0': + resolution: {integrity: sha512-BqCoMoIbn0keKys+dEAdBa70EtOwV1bEsQCUgU9FdiZmmMge/Zk7LlkYGqbrdHR+Frnt0E1FOanly+rlwvvQzw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.1': - resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + '@rollup/rollup-darwin-x64@4.62.0': + resolution: {integrity: sha512-SIMzST3VFNXDAbeIWDWiFCNM5qncUBDWaEV7NfE7oZbDt2mgfW4MvbKdbYiGOLoM32gbTv608UMd0XktEYSD7w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.1': - resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} + '@rollup/rollup-freebsd-arm64@4.62.0': + resolution: {integrity: sha512-ezjfSQMP7ArdUsbBwbQIfwAlhE84I2iVnzQNCFSveqV42q+BmKlzVpf7mxv5EchLcoWU4y6/heFzVg1F+hodUQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.1': - resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + '@rollup/rollup-freebsd-x64@4.62.0': + resolution: {integrity: sha512-9+qTWGW9AZRhnUgwtTwzNwcPlL87ngkeN0LA+q1bADvmY9aNvWaF2TFW8BZgnQPYxpDI7+rMVLivcd4V737TAQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': - resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} + '@rollup/rollup-linux-arm-gnueabihf@4.62.0': + resolution: {integrity: sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.1': - resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + '@rollup/rollup-linux-arm-musleabihf@4.62.0': + resolution: {integrity: sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.1': - resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + '@rollup/rollup-linux-arm64-gnu@4.62.0': + resolution: {integrity: sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.1': - resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + '@rollup/rollup-linux-arm64-musl@4.62.0': + resolution: {integrity: sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.1': - resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} + '@rollup/rollup-linux-loong64-gnu@4.62.0': + resolution: {integrity: sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.1': - resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} + '@rollup/rollup-linux-loong64-musl@4.62.0': + resolution: {integrity: sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.1': - resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} + '@rollup/rollup-linux-ppc64-gnu@4.62.0': + resolution: {integrity: sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.1': - resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + '@rollup/rollup-linux-ppc64-musl@4.62.0': + resolution: {integrity: sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.1': - resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} + '@rollup/rollup-linux-riscv64-gnu@4.62.0': + resolution: {integrity: sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.1': - resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} + '@rollup/rollup-linux-riscv64-musl@4.62.0': + resolution: {integrity: sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.1': - resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + '@rollup/rollup-linux-s390x-gnu@4.62.0': + resolution: {integrity: sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.1': - resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + '@rollup/rollup-linux-x64-gnu@4.62.0': + resolution: {integrity: sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.1': - resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + '@rollup/rollup-linux-x64-musl@4.62.0': + resolution: {integrity: sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.1': - resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} + '@rollup/rollup-openbsd-x64@4.62.0': + resolution: {integrity: sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.1': - resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + '@rollup/rollup-openharmony-arm64@4.62.0': + resolution: {integrity: sha512-yTB9TgfWj5wHe5QgktAgXTLLot1gvEjl1NiPPAUiCs4oPrIWFl5V4nC3GrkNdj9LaAU4s94nVrGbGOCqUpyWsg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.1': - resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + '@rollup/rollup-win32-arm64-msvc@4.62.0': + resolution: {integrity: sha512-5LOhoaesY3doG1c+ac/2JtgREpKoJr5bUHH8tKY0V8di7+uSV6BwLs2PlR0/yzefGOkR+wE7ZolZphHCsyG5Rw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.1': - resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} + '@rollup/rollup-win32-ia32-msvc@4.62.0': + resolution: {integrity: sha512-yYkWHhmbhRTWTnWos5HC4GcPQfjlzzCNbM9e/+GXrLuaBXYA3qSDR9f0Vgufd5S8yX81U8jPKp7ZnAjZFMtRnw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.1': - resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + '@rollup/rollup-win32-x64-gnu@4.62.0': + resolution: {integrity: sha512-SoTb6lPg25xZlA2ibwQ++ahCCnH+FP0qmEuafMJ4gznZKOlXioKEAeJLgCrqjM98ACziXM9V1amFjICVL4IFoA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.1': - resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} + '@rollup/rollup-win32-x64-msvc@4.62.0': + resolution: {integrity: sha512-5L+T1fMX4RIEBoZzT0+sQ0PhTS36NULFmMXtl1TZo44TMAROIMHbZufSOjVWt/Y622BtxgxtaNOokbTDvfsrZA==} cpu: [x64] os: [win32] @@ -1858,6 +1867,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -1891,9 +1903,6 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@vitest/expect@4.1.4': resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==} @@ -2055,14 +2064,6 @@ packages: axios@1.15.0: resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} - b4a@1.8.0: - resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} - peerDependencies: - react-native-b4a: '*' - peerDependenciesMeta: - react-native-b4a: - optional: true - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2070,47 +2071,6 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - bare-events@2.8.2: - resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} - peerDependencies: - bare-abort-controller: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - - bare-fs@4.7.0: - resolution: {integrity: sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.8.7: - resolution: {integrity: sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.13.0: - resolution: {integrity: sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==} - peerDependencies: - bare-abort-controller: '*' - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-abort-controller: - optional: true - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.4.0: - resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2169,9 +2129,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -2273,8 +2230,9 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - chromium-bidi@14.0.0: - resolution: {integrity: sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==} + chromium-bidi@16.0.1: + resolution: {integrity: sha512-J63PGu/9PpeCwLIcKYyzWP6yaVL5pxuBc0shlYCYM8BaAkmlwiQboXO1iNbOgSDbVklEyYFfNEcHD8oOAWacUA==} + engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0'} peerDependencies: devtools-protocol: '*' @@ -2621,12 +2579,12 @@ packages: detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - devtools-protocol@0.0.1581282: - resolution: {integrity: sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==} - devtools-protocol@0.0.1612613: resolution: {integrity: sha512-hp32aOyalF3vGZiTPA3CiKCgpIH7QOj+S0dRVMmEReagtmWQYigiCQWp7OGWrgaW2IHNlSzCwfDneZe16DlBCQ==} + devtools-protocol@0.0.1624250: + resolution: {integrity: sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA==} + devtools-server@0.0.2: resolution: {integrity: sha512-ZHfQVaJelu0dwEYf26jyppuDwpC0oyOkqzoGEnHhSa4mC0Y3WiWAxsMTBzDao/iLd15+0XlYCJxLilK2uALjvQ==} @@ -2713,6 +2671,10 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -2794,9 +2756,6 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - events-universal@1.0.1: - resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - execa@5.0.0: resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} engines: {node: '>=10'} @@ -2812,11 +2771,6 @@ packages: exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2824,9 +2778,6 @@ packages: resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} engines: {node: '>=6.0.0'} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2837,9 +2788,6 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2987,10 +2935,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@6.0.0: resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} engines: {node: '>=10'} @@ -3622,6 +3566,10 @@ packages: resolution: {integrity: sha512-tNcU3cLH7toloAzhOOrBDhjzgbxpyuYvkf+BPPnnJCdc5EIcdJ8JcT+SglvCQKKyZ6m9dVXtCVlJcA6csxKdEA==} engines: {node: ^20.17.0 || >=22.9.0} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -3713,6 +3661,10 @@ packages: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -3904,6 +3856,10 @@ packages: resolution: {integrity: sha512-7e87vk0DdWT647wjcfEtWeMtjm+zVGqNohN/aeIymbUfjHQ2T4Sx5kM+1irVDBSloNC3CkGKxswdMoo8yhqTDg==} engines: {node: '>=10', npm: '>=6'} + modern-tar@0.7.6: + resolution: {integrity: sha512-sweCIVXzx1aIGTCdzcMlSZt1h8k5Tmk08VNAuRk3IU28XamGiOH5ypi11g6De2CH7PhYqSSnGy2A/EFhbWnVKg==} + engines: {node: '>=18.0.0'} + modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -3927,6 +3883,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} @@ -4245,8 +4206,8 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} @@ -4281,9 +4242,6 @@ packages: pause-stream@0.0.11: resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -4307,13 +4265,13 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - playwright-core@1.59.1: - resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + playwright-core@1.61.0: + resolution: {integrity: sha512-caX7TrY3Ml6egyDX0WUcTHDxodl/b51y5wJOdCEA36QviK/s2g081hvmGs8eaE3DWb6NYZQ6BjO/QkNRPenoPA==} engines: {node: '>=18'} hasBin: true - playwright@1.59.1: - resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + playwright@1.61.0: + resolution: {integrity: sha512-Z+7BeeqQPRRzklHsVFP4KTGIyMxKUmfeRA4WisM6G3/XW6nwGeX6fX9qYaDa+CiUqpOkb2f6X3nar05R3kSuJQ==} engines: {node: '>=18'} hasBin: true @@ -4321,8 +4279,8 @@ packages: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} - postcss@8.5.9: - resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.3: @@ -4354,10 +4312,6 @@ packages: resolution: {integrity: sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q==} engines: {node: ^18.17.0 || >=20.5.0} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} @@ -4400,13 +4354,13 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.40.0: - resolution: {integrity: sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==} - engines: {node: '>=18'} + puppeteer-core@25.1.0: + resolution: {integrity: sha512-jKzy5y4WG6uNuFbTWgW1D7mqoT9o0nllc/6a1DGF775T1mPmgw3scdFEtEq67yVFikavQmbYq6NLfbTfxHSlqQ==} + engines: {node: '>=22.12.0'} - puppeteer@24.40.0: - resolution: {integrity: sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==} - engines: {node: '>=18'} + puppeteer@25.1.0: + resolution: {integrity: sha512-7L6/0JM7XStK99lIL4xQySyNEXNfII6pk0BxkI5kKBTOhR7AsoQiv067YTsE/rIXxQiq9ajlO4WcqBjS/FWK1A==} + engines: {node: '>=22.12.0'} hasBin: true queue-microtask@1.2.3: @@ -4552,8 +4506,8 @@ packages: resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} engines: {node: '>=10.0.0'} - rollup@4.60.1: - resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} + rollup@4.62.0: + resolution: {integrity: sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4737,9 +4691,6 @@ packages: stream-json@1.9.1: resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - streamx@2.25.0: - resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -4824,26 +4775,14 @@ packages: tar-fs@2.1.4: resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - tar-fs@3.1.2: - resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} - tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar-stream@3.1.8: - resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} - tar@7.5.11: resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} engines: {node: '>=18'} - teex@1.0.1: - resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - - text-decoder@1.2.7: - resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} @@ -4880,6 +4819,10 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} @@ -5003,8 +4946,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - typed-query-selector@2.12.1: - resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} + typed-query-selector@2.12.2: + resolution: {integrity: sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==} typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -5040,6 +4983,10 @@ packages: resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} engines: {node: '>=20.18.1'} + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + engines: {node: '>=20.18.1'} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -5178,8 +5125,8 @@ packages: web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} - webdriver-bidi-protocol@0.4.1: - resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} + webdriver-bidi-protocol@0.4.2: + resolution: {integrity: sha512-VSV+fzfChirL3e7jay2yUC7B4HQCGtEWEg/MSSQbK+qWbqeGlRLlXTzPpYr3XGUvbpDHumWZBJxgesg4N7dbtA==} webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} @@ -5271,6 +5218,18 @@ packages: utf-8-validate: optional: true + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -5325,9 +5284,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -5389,20 +5345,24 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@asamuzakjp/css-color@5.1.10': + '@asamuzakjp/css-color@5.1.11': dependencies: - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.7(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@asamuzakjp/dom-selector@7.0.9': + '@asamuzakjp/dom-selector@7.1.1': dependencies: + '@asamuzakjp/generational-cache': 1.0.1 '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 + '@asamuzakjp/generational-cache@1.0.1': {} + '@asamuzakjp/nwsapi@2.3.9': {} '@babel/code-frame@7.29.0': @@ -5576,14 +5536,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/browser-pool@3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3))': + '@crawlee/browser-pool@3.16.0(playwright@1.61.0)(puppeteer@25.1.0)': dependencies: '@apify/log': 2.5.34 '@apify/timeout': 0.3.2 '@crawlee/core': 3.16.0 '@crawlee/types': 3.16.0 fingerprint-generator: 2.1.82 - fingerprint-injector: 2.1.82(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + fingerprint-injector: 2.1.82(playwright@1.61.0)(puppeteer@25.1.0) lodash.merge: 4.6.2 nanoid: 3.3.11 ow: 0.28.2 @@ -5593,24 +5553,24 @@ snapshots: tiny-typed-emitter: 2.1.0 tslib: 2.8.1 optionalDependencies: - playwright: 1.59.1 - puppeteer: 24.40.0(typescript@5.9.3) + playwright: 1.61.0 + puppeteer: 25.1.0 transitivePeerDependencies: - supports-color - '@crawlee/browser@3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3))': + '@crawlee/browser@3.16.0(playwright@1.61.0)(puppeteer@25.1.0)': dependencies: '@apify/timeout': 0.3.2 '@crawlee/basic': 3.16.0 - '@crawlee/browser-pool': 3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) '@crawlee/types': 3.16.0 '@crawlee/utils': 3.16.0 ow: 0.28.2 tslib: 2.8.1 type-fest: 4.41.0 optionalDependencies: - playwright: 1.59.1 - puppeteer: 24.40.0(typescript@5.9.3) + playwright: 1.61.0 + puppeteer: 25.1.0 transitivePeerDependencies: - supports-color @@ -5803,13 +5763,13 @@ snapshots: proper-lockfile: 4.1.2 tslib: 2.8.1 - '@crawlee/playwright@3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3))': + '@crawlee/playwright@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0)': dependencies: '@apify/datastructures': 2.0.3 '@apify/log': 2.5.34 '@apify/timeout': 0.3.2 - '@crawlee/browser': 3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) - '@crawlee/browser-pool': 3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) + '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) '@crawlee/core': 3.16.0 '@crawlee/types': 3.16.0 '@crawlee/utils': 3.16.0 @@ -5823,17 +5783,17 @@ snapshots: tslib: 2.8.1 optionalDependencies: idcac-playwright: 0.2.0 - playwright: 1.59.1 + playwright: 1.61.0 transitivePeerDependencies: - puppeteer - supports-color - '@crawlee/puppeteer@3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3))': + '@crawlee/puppeteer@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0)': dependencies: '@apify/datastructures': 2.0.3 '@apify/log': 2.5.34 - '@crawlee/browser': 3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) - '@crawlee/browser-pool': 3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) + '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) '@crawlee/types': 3.16.0 '@crawlee/utils': 3.16.0 cheerio: 1.0.0-rc.12 @@ -5843,7 +5803,7 @@ snapshots: tslib: 2.8.1 optionalDependencies: idcac-playwright: 0.2.0 - puppeteer: 24.40.0(typescript@5.9.3) + puppeteer: 25.1.0 transitivePeerDependencies: - playwright - supports-color @@ -5910,7 +5870,7 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -5922,10 +5882,10 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.1.7(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -5937,7 +5897,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.5(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 @@ -6036,7 +5996,7 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@exodus/bytes@1.15.0': {} + '@exodus/bytes@1.15.1': {} '@gar/promise-retry@1.0.3': {} @@ -6599,98 +6559,88 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.62.0': optional: true - '@playwright/browser-chromium@1.59.1': + '@playwright/browser-chromium@1.61.0': dependencies: - playwright-core: 1.59.1 + playwright-core: 1.61.0 - '@puppeteer/browsers@2.13.0': + '@puppeteer/browsers@3.0.4': dependencies: - debug: 4.4.3 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.5.0 - semver: 7.7.4 - tar-fs: 3.1.2 + modern-tar: 0.7.6 yargs: 17.7.2 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - '@rollup/rollup-android-arm-eabi@4.60.1': + '@rollup/rollup-android-arm-eabi@4.62.0': optional: true - '@rollup/rollup-android-arm64@4.60.1': + '@rollup/rollup-android-arm64@4.62.0': optional: true - '@rollup/rollup-darwin-arm64@4.60.1': + '@rollup/rollup-darwin-arm64@4.62.0': optional: true - '@rollup/rollup-darwin-x64@4.60.1': + '@rollup/rollup-darwin-x64@4.62.0': optional: true - '@rollup/rollup-freebsd-arm64@4.60.1': + '@rollup/rollup-freebsd-arm64@4.62.0': optional: true - '@rollup/rollup-freebsd-x64@4.60.1': + '@rollup/rollup-freebsd-x64@4.62.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + '@rollup/rollup-linux-arm-gnueabihf@4.62.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.1': + '@rollup/rollup-linux-arm-musleabihf@4.62.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.1': + '@rollup/rollup-linux-arm64-gnu@4.62.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.1': + '@rollup/rollup-linux-arm64-musl@4.62.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.1': + '@rollup/rollup-linux-loong64-gnu@4.62.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.1': + '@rollup/rollup-linux-loong64-musl@4.62.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.1': + '@rollup/rollup-linux-ppc64-gnu@4.62.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.1': + '@rollup/rollup-linux-ppc64-musl@4.62.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.1': + '@rollup/rollup-linux-riscv64-gnu@4.62.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.1': + '@rollup/rollup-linux-riscv64-musl@4.62.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.1': + '@rollup/rollup-linux-s390x-gnu@4.62.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.1': + '@rollup/rollup-linux-x64-gnu@4.62.0': optional: true - '@rollup/rollup-linux-x64-musl@4.60.1': + '@rollup/rollup-linux-x64-musl@4.62.0': optional: true - '@rollup/rollup-openbsd-x64@4.60.1': + '@rollup/rollup-openbsd-x64@4.62.0': optional: true - '@rollup/rollup-openharmony-arm64@4.60.1': + '@rollup/rollup-openharmony-arm64@4.62.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.1': + '@rollup/rollup-win32-arm64-msvc@4.62.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.1': + '@rollup/rollup-win32-ia32-msvc@4.62.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.1': + '@rollup/rollup-win32-x64-gnu@4.62.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.1': + '@rollup/rollup-win32-x64-msvc@4.62.0': optional: true '@sapphire/async-queue@1.5.5': {} @@ -6818,6 +6768,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 @@ -6855,11 +6807,6 @@ snapshots: dependencies: '@types/node': 24.12.2 - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 24.12.2 - optional: true - '@vitest/expect@4.1.4': dependencies: '@standard-schema/spec': 1.1.0 @@ -7067,44 +7014,10 @@ snapshots: transitivePeerDependencies: - debug - b4a@1.8.0: {} - balanced-match@1.0.2: {} balanced-match@4.0.4: {} - bare-events@2.8.2: {} - - bare-fs@4.7.0: - dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.13.0(bare-events@2.8.2) - bare-url: 2.4.0 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - bare-os@3.8.7: {} - - bare-path@3.0.0: - dependencies: - bare-os: 3.8.7 - - bare-stream@2.13.0(bare-events@2.8.2): - dependencies: - streamx: 2.25.0 - teex: 1.0.1 - optionalDependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - react-native-b4a - - bare-url@2.4.0: - dependencies: - bare-path: 3.0.0 - base64-js@1.5.1: {} baseline-browser-mapping@2.10.18: {} @@ -7169,8 +7082,6 @@ snapshots: node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) - buffer-crc32@0.2.13: {} - buffer-from@1.1.2: {} buffer@5.7.1: @@ -7236,7 +7147,7 @@ snapshots: camelcase@5.3.1: {} - camoufox-js@0.9.3(playwright-core@1.59.1): + camoufox-js@0.9.3(playwright-core@1.61.0): dependencies: adm-zip: 0.5.17 better-sqlite3: 12.9.0 @@ -7247,7 +7158,7 @@ snapshots: impit: 0.11.0 language-tags: 2.1.0 maxmind: 5.0.6 - playwright-core: 1.59.1 + playwright-core: 1.61.0 pretty-bytes: 7.1.0 ua-parser-js: 2.0.9 xml2js: 0.6.2 @@ -7313,9 +7224,9 @@ snapshots: chownr@3.0.0: {} - chromium-bidi@14.0.0(devtools-protocol@0.0.1581282): + chromium-bidi@16.0.1(devtools-protocol@0.0.1624250): dependencies: - devtools-protocol: 0.0.1581282 + devtools-protocol: 0.0.1624250 mitt: 3.0.1 zod: 3.25.76 @@ -7515,26 +7426,26 @@ snapshots: optionalDependencies: typescript: 5.9.3 - crawlee@3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)): + crawlee@3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0): dependencies: '@crawlee/basic': 3.16.0 - '@crawlee/browser': 3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) - '@crawlee/browser-pool': 3.16.0(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) + '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) '@crawlee/cheerio': 3.16.0 '@crawlee/cli': 3.16.0(@types/node@24.12.2) '@crawlee/core': 3.16.0 '@crawlee/http': 3.16.0 '@crawlee/jsdom': 3.16.0 '@crawlee/linkedom': 3.16.0 - '@crawlee/playwright': 3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) - '@crawlee/puppeteer': 3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)) + '@crawlee/playwright': 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) + '@crawlee/puppeteer': 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) '@crawlee/utils': 3.16.0 import-local: 3.2.0 tslib: 2.8.1 optionalDependencies: idcac-playwright: 0.2.0 - playwright: 1.59.1 - puppeteer: 24.40.0(typescript@5.9.3) + playwright: 1.61.0 + puppeteer: 25.1.0 transitivePeerDependencies: - '@types/node' - bufferutil @@ -7657,10 +7568,10 @@ snapshots: detect-node@2.1.0: {} - devtools-protocol@0.0.1581282: {} - devtools-protocol@0.0.1612613: {} + devtools-protocol@0.0.1624250: {} + devtools-server@0.0.2: dependencies: async-retry: 1.3.3 @@ -7750,6 +7661,8 @@ snapshots: entities@7.0.1: {} + entities@8.0.0: {} + env-paths@2.2.1: {} envinfo@7.13.0: {} @@ -7844,12 +7757,6 @@ snapshots: eventemitter3@5.0.4: {} - events-universal@1.0.1: - dependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - execa@5.0.0: dependencies: cross-spawn: 7.0.6 @@ -7868,22 +7775,10 @@ snapshots: exponential-backoff@3.1.3: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} fast-equals@5.4.0: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -7898,10 +7793,6 @@ snapshots: dependencies: reusify: 1.1.0 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -7955,13 +7846,13 @@ snapshots: header-generator: 2.1.82 tslib: 2.8.1 - fingerprint-injector@2.1.82(playwright@1.59.1)(puppeteer@24.40.0(typescript@5.9.3)): + fingerprint-injector@2.1.82(playwright@1.61.0)(puppeteer@25.1.0): dependencies: fingerprint-generator: 2.1.82 tslib: 2.8.1 optionalDependencies: - playwright: 1.59.1 - puppeteer: 24.40.0(typescript@5.9.3) + playwright: 1.61.0 + puppeteer: 25.1.0 flat@5.0.2: {} @@ -8048,10 +7939,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@5.2.0: - dependencies: - pump: 3.0.4 - get-stream@6.0.0: {} get-stream@9.0.1: @@ -8242,7 +8129,7 @@ snapshots: html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 transitivePeerDependencies: - '@noble/hashes' @@ -8614,7 +8501,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.20.0 + ws: 8.21.0 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -8623,22 +8510,22 @@ snapshots: jsdom@29.0.2: dependencies: - '@asamuzakjp/css-color': 5.1.10 - '@asamuzakjp/dom-selector': 7.0.9 + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) - '@exodus/bytes': 1.15.0 + '@csstools/css-syntax-patches-for-csstree': 1.1.5(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 css-tree: 3.2.1 data-urls: 7.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.3.5 - parse5: 8.0.0 + lru-cache: 11.5.1 + parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.24.8 + undici: 7.28.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -8785,6 +8672,8 @@ snapshots: transitivePeerDependencies: - supports-color + lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} lines-and-columns@2.0.3: {} @@ -8877,6 +8766,8 @@ snapshots: lru-cache@11.3.5: {} + lru-cache@11.5.1: {} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -9089,6 +8980,8 @@ snapshots: mmdb-lib@3.0.2: {} + modern-tar@0.7.6: {} + modify-values@1.0.1: {} ms@2.1.3: {} @@ -9101,6 +8994,8 @@ snapshots: nanoid@3.3.11: {} + nanoid@3.3.12: {} + napi-build-utils@2.0.0: {} negotiator@1.0.0: {} @@ -9589,9 +9484,9 @@ snapshots: dependencies: entities: 6.0.1 - parse5@8.0.0: + parse5@8.0.1: dependencies: - entities: 6.0.1 + entities: 8.0.0 path-exists@3.0.0: {} @@ -9618,8 +9513,6 @@ snapshots: dependencies: through: 2.3.8 - pend@1.2.0: {} - picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -9634,11 +9527,11 @@ snapshots: dependencies: find-up: 4.1.0 - playwright-core@1.59.1: {} + playwright-core@1.61.0: {} - playwright@1.59.1: + playwright@1.61.0: dependencies: - playwright-core: 1.59.1 + playwright-core: 1.61.0 optionalDependencies: fsevents: 2.3.2 @@ -9647,9 +9540,9 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.9: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -9684,8 +9577,6 @@ snapshots: proggy@3.0.0: {} - progress@2.0.3: {} - promise-all-reject-late@1.0.1: {} promise-call-limit@3.0.2: {} @@ -9739,38 +9630,30 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@24.40.0: + puppeteer-core@25.1.0: dependencies: - '@puppeteer/browsers': 2.13.0 - chromium-bidi: 14.0.0(devtools-protocol@0.0.1581282) - debug: 4.4.3 - devtools-protocol: 0.0.1581282 - typed-query-selector: 2.12.1 - webdriver-bidi-protocol: 0.4.1 - ws: 8.20.0 + '@puppeteer/browsers': 3.0.4 + chromium-bidi: 16.0.1(devtools-protocol@0.0.1624250) + devtools-protocol: 0.0.1624250 + typed-query-selector: 2.12.2 + webdriver-bidi-protocol: 0.4.2 + ws: 8.21.0 transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - bufferutil - - react-native-b4a - - supports-color + - proxy-agent - utf-8-validate - puppeteer@24.40.0(typescript@5.9.3): + puppeteer@25.1.0: dependencies: - '@puppeteer/browsers': 2.13.0 - chromium-bidi: 14.0.0(devtools-protocol@0.0.1581282) - cosmiconfig: 9.0.1(typescript@5.9.3) - devtools-protocol: 0.0.1581282 - puppeteer-core: 24.40.0 - typed-query-selector: 2.12.1 + '@puppeteer/browsers': 3.0.4 + chromium-bidi: 16.0.1(devtools-protocol@0.0.1624250) + devtools-protocol: 0.0.1624250 + lilconfig: 3.1.3 + puppeteer-core: 25.1.0 + typed-query-selector: 2.12.2 transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - bufferutil - - react-native-b4a - - supports-color - - typescript + - proxy-agent - utf-8-validate queue-microtask@1.2.3: {} @@ -9910,35 +9793,35 @@ snapshots: robots-parser@3.0.1: {} - rollup@4.60.1: + rollup@4.62.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.1 - '@rollup/rollup-android-arm64': 4.60.1 - '@rollup/rollup-darwin-arm64': 4.60.1 - '@rollup/rollup-darwin-x64': 4.60.1 - '@rollup/rollup-freebsd-arm64': 4.60.1 - '@rollup/rollup-freebsd-x64': 4.60.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 - '@rollup/rollup-linux-arm-musleabihf': 4.60.1 - '@rollup/rollup-linux-arm64-gnu': 4.60.1 - '@rollup/rollup-linux-arm64-musl': 4.60.1 - '@rollup/rollup-linux-loong64-gnu': 4.60.1 - '@rollup/rollup-linux-loong64-musl': 4.60.1 - '@rollup/rollup-linux-ppc64-gnu': 4.60.1 - '@rollup/rollup-linux-ppc64-musl': 4.60.1 - '@rollup/rollup-linux-riscv64-gnu': 4.60.1 - '@rollup/rollup-linux-riscv64-musl': 4.60.1 - '@rollup/rollup-linux-s390x-gnu': 4.60.1 - '@rollup/rollup-linux-x64-gnu': 4.60.1 - '@rollup/rollup-linux-x64-musl': 4.60.1 - '@rollup/rollup-openbsd-x64': 4.60.1 - '@rollup/rollup-openharmony-arm64': 4.60.1 - '@rollup/rollup-win32-arm64-msvc': 4.60.1 - '@rollup/rollup-win32-ia32-msvc': 4.60.1 - '@rollup/rollup-win32-x64-gnu': 4.60.1 - '@rollup/rollup-win32-x64-msvc': 4.60.1 + '@rollup/rollup-android-arm-eabi': 4.62.0 + '@rollup/rollup-android-arm64': 4.62.0 + '@rollup/rollup-darwin-arm64': 4.62.0 + '@rollup/rollup-darwin-x64': 4.62.0 + '@rollup/rollup-freebsd-arm64': 4.62.0 + '@rollup/rollup-freebsd-x64': 4.62.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.0 + '@rollup/rollup-linux-arm-musleabihf': 4.62.0 + '@rollup/rollup-linux-arm64-gnu': 4.62.0 + '@rollup/rollup-linux-arm64-musl': 4.62.0 + '@rollup/rollup-linux-loong64-gnu': 4.62.0 + '@rollup/rollup-linux-loong64-musl': 4.62.0 + '@rollup/rollup-linux-ppc64-gnu': 4.62.0 + '@rollup/rollup-linux-ppc64-musl': 4.62.0 + '@rollup/rollup-linux-riscv64-gnu': 4.62.0 + '@rollup/rollup-linux-riscv64-musl': 4.62.0 + '@rollup/rollup-linux-s390x-gnu': 4.62.0 + '@rollup/rollup-linux-x64-gnu': 4.62.0 + '@rollup/rollup-linux-x64-musl': 4.62.0 + '@rollup/rollup-openbsd-x64': 4.62.0 + '@rollup/rollup-openharmony-arm64': 4.62.0 + '@rollup/rollup-win32-arm64-msvc': 4.62.0 + '@rollup/rollup-win32-ia32-msvc': 4.62.0 + '@rollup/rollup-win32-x64-gnu': 4.62.0 + '@rollup/rollup-win32-x64-msvc': 4.62.0 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -10110,15 +9993,6 @@ snapshots: dependencies: stream-chain: 2.2.5 - streamx@2.25.0: - dependencies: - events-universal: 1.0.1 - fast-fifo: 1.3.2 - text-decoder: 1.2.7 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - string-argv@0.3.2: {} string-comparison@1.3.0: {} @@ -10199,18 +10073,6 @@ snapshots: pump: 3.0.4 tar-stream: 2.2.0 - tar-fs@3.1.2: - dependencies: - pump: 3.0.4 - tar-stream: 3.1.8 - optionalDependencies: - bare-fs: 4.7.0 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -10219,17 +10081,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - tar-stream@3.1.8: - dependencies: - b4a: 1.8.0 - bare-fs: 4.7.0 - fast-fifo: 1.3.2 - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - tar@7.5.11: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -10238,19 +10089,6 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - teex@1.0.1: - dependencies: - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - text-decoder@1.2.7: - dependencies: - b4a: 1.8.0 - transitivePeerDependencies: - - react-native-b4a - text-extensions@1.9.0: {} through2@2.0.5: @@ -10282,6 +10120,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinypool@2.1.0: {} tinyrainbow@3.1.0: {} @@ -10386,7 +10229,7 @@ snapshots: type-fest@4.41.0: {} - typed-query-selector@2.12.1: {} + typed-query-selector@2.12.2: {} typedarray@0.0.6: {} @@ -10411,6 +10254,8 @@ snapshots: undici@7.24.8: {} + undici@7.28.0: {} + unicorn-magic@0.3.0: {} universal-user-agent@6.0.1: {} @@ -10455,9 +10300,9 @@ snapshots: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.9 - rollup: 4.60.1 - tinyglobby: 0.2.16 + postcss: 8.5.15 + rollup: 4.62.0 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.12.2 fsevents: 2.3.3 @@ -10505,7 +10350,7 @@ snapshots: web-worker@1.5.0: {} - webdriver-bidi-protocol@0.4.1: {} + webdriver-bidi-protocol@0.4.2: {} webidl-conversions@7.0.0: {} @@ -10526,7 +10371,7 @@ snapshots: whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -10587,6 +10432,8 @@ snapshots: ws@8.20.0: {} + ws@8.21.0: {} + xml-name-validator@5.0.0: {} xml2js@0.6.2: @@ -10638,11 +10485,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@0.1.0: {} yocto-queue@1.2.2: {} From c1046bdf91febb9760250fa4f3f5e4df0de6869e Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Wed, 24 Jun 2026 18:01:47 +0200 Subject: [PATCH 09/14] fix(actors): deterministic monorepo builds + browser stack from digest-pinned bases --- .github/workflows/release-generic-actors.yaml | 40 +- .npmrc | 1 + .../camoufox-scraper/.dockerignore | 14 - .../actor-scraper/camoufox-scraper/Dockerfile | 49 +- .../camoufox-scraper/package.json | 5 +- .../src/internals/crawler_setup.ts | 7 +- .../cheerio-scraper/.dockerignore | 12 - .../actor-scraper/cheerio-scraper/Dockerfile | 12 +- .../actor-scraper/jsdom-scraper/.dockerignore | 12 - .../actor-scraper/jsdom-scraper/Dockerfile | 12 +- .../playwright-scraper/.dockerignore | 12 - .../playwright-scraper/Dockerfile | 41 +- .../playwright-scraper/package.json | 2 +- .../puppeteer-scraper/.dockerignore | 12 - .../puppeteer-scraper/Dockerfile | 45 +- .../puppeteer-scraper/package.json | 2 +- .../src/internals/crawler_setup.ts | 3 +- .../sitemap-scraper/.dockerignore | 12 - .../actor-scraper/sitemap-scraper/Dockerfile | 12 +- .../sitemap-scraper/package.json | 16 +- .../src/internals/crawler_setup.ts | 2 +- .../test/runtime-compat.test.ts | 8 + .../actor-scraper/web-scraper/.dockerignore | 12 - packages/actor-scraper/web-scraper/Dockerfile | 45 +- .../actor-scraper/web-scraper/package.json | 3 +- .../src/internals/crawler_setup.ts | 16 +- packages/scraper-tools/package.json | 10 +- pnpm-lock.yaml | 753 +++++++++++++----- pnpm-workspace.yaml | 9 + renovate.json | 44 + scripts/build-actor-from-current-sha.mjs | 80 ++ 31 files changed, 895 insertions(+), 408 deletions(-) create mode 100644 .npmrc delete mode 100644 packages/actor-scraper/camoufox-scraper/.dockerignore delete mode 100644 packages/actor-scraper/cheerio-scraper/.dockerignore delete mode 100644 packages/actor-scraper/jsdom-scraper/.dockerignore delete mode 100644 packages/actor-scraper/playwright-scraper/.dockerignore delete mode 100644 packages/actor-scraper/puppeteer-scraper/.dockerignore delete mode 100644 packages/actor-scraper/sitemap-scraper/.dockerignore create mode 100644 packages/actor-scraper/sitemap-scraper/test/runtime-compat.test.ts delete mode 100644 packages/actor-scraper/web-scraper/.dockerignore create mode 100644 scripts/build-actor-from-current-sha.mjs diff --git a/.github/workflows/release-generic-actors.yaml b/.github/workflows/release-generic-actors.yaml index ba6c8296..e944feeb 100644 --- a/.github/workflows/release-generic-actors.yaml +++ b/.github/workflows/release-generic-actors.yaml @@ -65,50 +65,68 @@ jobs: matrix: settings: - actor: web-scraper + apify-actor: apify/web-scraper stable-version: '3.0' stable-build-tag: version-3 development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.web-scraper }} - actor: cheerio-scraper + apify-actor: apify/cheerio-scraper stable-version: '3.0' stable-build-tag: version-3 development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.cheerio-scraper }} - actor: playwright-scraper + apify-actor: apify/playwright-scraper stable-version: '1.0' stable-build-tag: version-1 development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.playwright-scraper }} - actor: puppeteer-scraper + apify-actor: apify/puppeteer-scraper stable-version: '3.0' stable-build-tag: version-3 development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.puppeteer-scraper }} - actor: jsdom-scraper + apify-actor: apify/jsdom-scraper stable-version: '0.2' stable-build-tag: version-0 development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.jsdom-scraper }} - actor: camoufox-scraper + apify-actor: apify/camoufox-scraper stable-version: '3.0' stable-build-tag: version-3 development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.camoufox-scraper }} - # Platform actor is apify/sitemap-extractor (name in .actor/actor.json) - actor: sitemap-scraper + apify-actor: apify/sitemap-extractor stable-version: '0.1' stable-build-tag: latest development-version: '0.0' development-build-tag: development should-build: ${{ github.event.inputs.sitemap-scraper }} steps: - - uses: actions/checkout@v6 + - name: Check out current SHA + if: matrix.settings.should-build == 'true' + uses: actions/checkout@v6 + + - name: Set up Node.js + if: matrix.settings.should-build == 'true' + uses: actions/setup-node@v6 + with: + node-version: 24 + + - name: Install pnpm and dependencies + if: matrix.settings.should-build == 'true' + uses: apify/actions/pnpm-install@v1.1.2 - name: Log matrix run: | @@ -130,11 +148,15 @@ jobs: echo "build-tag=${{ github.event.inputs.build-tag }}" >> $GITHUB_ENV fi - - name: Build ${{ matrix.settings.actor }} - uses: apify/push-actor-action@master + - name: Build ${{ matrix.settings.actor }} from current Git SHA if: matrix.settings.should-build == 'true' - with: - token: ${{ secrets.APIFY_ACTOR_BUILD_TOKEN }} - build-tag: ${{ env.build-tag }} - version: ${{ env.version }} - working-directory: packages/actor-scraper/${{ matrix.settings.actor }} + env: + APIFY_TOKEN: ${{ secrets.APIFY_ACTOR_BUILD_TOKEN }} + APIFY_ACTOR: ${{ matrix.settings.apify-actor }} + BUILD_VERSION: ${{ env.version }} + BUILD_TAG: ${{ env.build-tag }} + GIT_COMMIT_SHA: ${{ github.sha }} + APIFY_RELEASE_BUILD_TIMEOUT_SECS: "900" + run: | + set -euo pipefail + node scripts/build-actor-from-current-sha.mjs diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..de20ab6b --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +inject-workspace-packages=false diff --git a/packages/actor-scraper/camoufox-scraper/.dockerignore b/packages/actor-scraper/camoufox-scraper/.dockerignore deleted file mode 100644 index 2a4de256..00000000 --- a/packages/actor-scraper/camoufox-scraper/.dockerignore +++ /dev/null @@ -1,14 +0,0 @@ -# configurations -.idea - -# crawlee and apify storage folders -apify_storage -crawlee_storage -storage -dist -!./storage/key_value_stores/default/INPUT.json - -# installed files -node_modules - -# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) diff --git a/packages/actor-scraper/camoufox-scraper/Dockerfile b/packages/actor-scraper/camoufox-scraper/Dockerfile index 9bc3d550..31dc7c25 100644 --- a/packages/actor-scraper/camoufox-scraper/Dockerfile +++ b/packages/actor-scraper/camoufox-scraper/Dockerfile @@ -1,6 +1,12 @@ -# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), -# so the build can use the pnpm workspace lockfile for a deterministic install. -FROM apify/actor-node-playwright-camoufox:22 AS builder +# Build context is the monorepo root (dockerContextDir in .actor/actor.json), so the build uses the +# root pnpm-lock.yaml for a deterministic install. +# +# Browser determinism comes from pinning the base image by DIGEST below: the Camoufox binary AND the +# playwright/camoufox-js drivers that match it both live in the base and are frozen together by the +# digest. The actor does NOT ship its own browser drivers — they're dropped from the deploy bundle +# and resolved from the base at runtime, so driver and binary can never drift. Tag 24-1.59.1 is the +# newest Camoufox base that survives page JS errors (24-1.60.0 crashes the process on them). +FROM apify/actor-node-playwright-camoufox:24-1.59.1@sha256:eadc96fa9492284eb45ef70b6b91c841fae7f142d25a22ae2887a21bb78b3469 AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. USER root @@ -9,7 +15,6 @@ WORKDIR /app RUN corepack enable # Browsers ship with the base image; never let an npm postinstall download them. -# puppeteer is pulled transitively via @crawlee/browser-pool even for non-puppeteer actors. ENV PUPPETEER_SKIP_DOWNLOAD=true \ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 @@ -19,21 +24,31 @@ COPY . ./ # Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. RUN pnpm install --frozen-lockfile --filter actor-camoufox-scraper... -# Build the actor and its workspace dependency @apify/scraper-tools. +# Build the actor and its workspace dependency @apify/scraper-tools (playwright/camoufox-js are needed +# here for type-checking only; the runtime copies come from the base — see below). RUN pnpm --filter actor-camoufox-scraper... build -# Self-contained production bundle; inject-workspace-packages copies the built -# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. -RUN pnpm config set inject-workspace-packages true \ - && pnpm --filter actor-camoufox-scraper deploy --prod /deploy - -FROM apify/actor-node-playwright-camoufox:22 - -# Base WORKDIR is /home/myuser and ships a template node_modules plus the Xvfb entrypoint. -# Drop the template's node_modules and overlay only the lean production bundle; the inherited -# ENTRYPOINT (xvfb-entrypoint.sh) still wraps CMD with Xvfb, and the bundled browser is reused. -RUN rm -rf node_modules -COPY --from=builder --chown=myuser /deploy ./ +# Self-contained production bundle; inject-workspace-packages copies the built @apify/scraper-tools +# into node_modules instead of symlinking it. +RUN pnpm --config.inject-workspace-packages=true --filter actor-camoufox-scraper deploy --prod /deploy + +# Drop the bundle's browser drivers so the runtime resolves them from the base image, where they are +# guaranteed to match the Camoufox binary. This is what keeps driver and binary in lockstep. +RUN rm -rf \ + /deploy/node_modules/playwright \ + /deploy/node_modules/playwright-core \ + /deploy/node_modules/camoufox-js \ + /deploy/node_modules/better-sqlite3 \ + /deploy/node_modules/.bin/playwright \ + /deploy/node_modules/.bin/playwright-core \ + /deploy/node_modules/.bin/camoufox-js + +FROM apify/actor-node-playwright-camoufox:24-1.59.1@sha256:eadc96fa9492284eb45ef70b6b91c841fae7f142d25a22ae2887a21bb78b3469 + +# Base WORKDIR is /home/myuser and ships the browser stack in node_modules plus the Xvfb entrypoint. +# Place the app in a child directory so the drivers dropped above resolve up to the base's copies. +COPY --from=builder --chown=myuser /deploy ./app +WORKDIR /home/myuser/app ENV APIFY_DISABLE_OUTDATED_WARNING=1 diff --git a/packages/actor-scraper/camoufox-scraper/package.json b/packages/actor-scraper/camoufox-scraper/package.json index ceb8325e..4d80079a 100644 --- a/packages/actor-scraper/camoufox-scraper/package.json +++ b/packages/actor-scraper/camoufox-scraper/package.json @@ -10,9 +10,10 @@ "@crawlee/playwright": "^3.14.1", "@crawlee/utils": "^3.14.1", "apify": "^3.2.6", - "camoufox-js": "^0.9.0", + "camoufox-js": "0.11.1", "idcac-playwright": "^0.2.0", - "playwright": "*" + "playwright": "1.59.1", + "playwright-core": "1.59.1" }, "devDependencies": { "@apify/tsconfig": "^0.1.0", diff --git a/packages/actor-scraper/camoufox-scraper/src/internals/crawler_setup.ts b/packages/actor-scraper/camoufox-scraper/src/internals/crawler_setup.ts index 88b5f9cb..032f5a21 100644 --- a/packages/actor-scraper/camoufox-scraper/src/internals/crawler_setup.ts +++ b/packages/actor-scraper/camoufox-scraper/src/internals/crawler_setup.ts @@ -18,7 +18,6 @@ import type { ApifyEnv } from 'apify'; import { Actor } from 'apify'; import { launchOptions } from 'camoufox-js'; import { getInjectableScript } from 'idcac-playwright'; -import type { Response } from 'playwright'; import { firefox } from 'playwright'; import type { CrawlerSetupOptions, RequestMetadata } from '@apify/scraper-tools'; @@ -201,7 +200,9 @@ export class CrawlerSetup implements CrawlerSetupOptions { ...this.input, humanize: this.input.humanize ? Number(this.input.humanize) : 0, }), - } as PlaywrightLaunchContext, + // camoufox-js launch options intentionally diverge from Playwright's, and the pinned + // playwright-core type identity differs from @crawlee/playwright's — cast through unknown. + } as unknown as PlaywrightLaunchContext, useSessionPool: true, persistCookiesPerSession: true, sessionPoolOptions: { @@ -392,7 +393,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { private async _handleResult( request: Request, - response?: Response, + response?: PlaywrightCrawlingContext['response'], pageFunctionResult?: Dictionary, isError?: boolean, ) { diff --git a/packages/actor-scraper/cheerio-scraper/.dockerignore b/packages/actor-scraper/cheerio-scraper/.dockerignore deleted file mode 100644 index 2424ba3f..00000000 --- a/packages/actor-scraper/cheerio-scraper/.dockerignore +++ /dev/null @@ -1,12 +0,0 @@ -# configurations -.idea - -# crawlee and apify storage folders -apify_storage -crawlee_storage -storage - -# installed files -node_modules - -# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) diff --git a/packages/actor-scraper/cheerio-scraper/Dockerfile b/packages/actor-scraper/cheerio-scraper/Dockerfile index 082fcd04..951f030d 100644 --- a/packages/actor-scraper/cheerio-scraper/Dockerfile +++ b/packages/actor-scraper/cheerio-scraper/Dockerfile @@ -1,11 +1,16 @@ # Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), # so the build can use the pnpm workspace lockfile for a deterministic install. -FROM apify/actor-node:22 AS builder +FROM apify/actor-node:24 AS builder WORKDIR /app RUN corepack enable +# Browser packages can appear transitively through workspace/dev tooling, but this actor does not +# use them. Keep the deterministic install without downloading browser binaries into the build cache. +ENV PUPPETEER_SKIP_DOWNLOAD=true \ + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 + # Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). COPY . ./ @@ -17,10 +22,9 @@ RUN pnpm --filter actor-cheerio-scraper... build # Self-contained production bundle. inject-workspace-packages copies the built # @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. -RUN pnpm config set inject-workspace-packages true \ - && pnpm --filter actor-cheerio-scraper deploy --prod /deploy +RUN pnpm --config.inject-workspace-packages=true --filter actor-cheerio-scraper deploy --prod /deploy -FROM apify/actor-node:22 +FROM apify/actor-node:24 WORKDIR /usr/src/app diff --git a/packages/actor-scraper/jsdom-scraper/.dockerignore b/packages/actor-scraper/jsdom-scraper/.dockerignore deleted file mode 100644 index 2424ba3f..00000000 --- a/packages/actor-scraper/jsdom-scraper/.dockerignore +++ /dev/null @@ -1,12 +0,0 @@ -# configurations -.idea - -# crawlee and apify storage folders -apify_storage -crawlee_storage -storage - -# installed files -node_modules - -# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) diff --git a/packages/actor-scraper/jsdom-scraper/Dockerfile b/packages/actor-scraper/jsdom-scraper/Dockerfile index 40c84bce..b656ed8e 100644 --- a/packages/actor-scraper/jsdom-scraper/Dockerfile +++ b/packages/actor-scraper/jsdom-scraper/Dockerfile @@ -1,11 +1,16 @@ # Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), # so the build can use the pnpm workspace lockfile for a deterministic install. -FROM apify/actor-node:22 AS builder +FROM apify/actor-node:24 AS builder WORKDIR /app RUN corepack enable +# Browser packages can appear transitively through workspace/dev tooling, but this actor does not +# use them. Keep the deterministic install without downloading browser binaries into the build cache. +ENV PUPPETEER_SKIP_DOWNLOAD=true \ + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 + # Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). COPY . ./ @@ -17,10 +22,9 @@ RUN pnpm --filter actor-jsdom-scraper... build # Self-contained production bundle; inject-workspace-packages copies the built # @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. -RUN pnpm config set inject-workspace-packages true \ - && pnpm --filter actor-jsdom-scraper deploy --prod /deploy +RUN pnpm --config.inject-workspace-packages=true --filter actor-jsdom-scraper deploy --prod /deploy -FROM apify/actor-node:22 +FROM apify/actor-node:24 WORKDIR /usr/src/app diff --git a/packages/actor-scraper/playwright-scraper/.dockerignore b/packages/actor-scraper/playwright-scraper/.dockerignore deleted file mode 100644 index 2424ba3f..00000000 --- a/packages/actor-scraper/playwright-scraper/.dockerignore +++ /dev/null @@ -1,12 +0,0 @@ -# configurations -.idea - -# crawlee and apify storage folders -apify_storage -crawlee_storage -storage - -# installed files -node_modules - -# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) diff --git a/packages/actor-scraper/playwright-scraper/Dockerfile b/packages/actor-scraper/playwright-scraper/Dockerfile index 34d22f22..1e818cca 100644 --- a/packages/actor-scraper/playwright-scraper/Dockerfile +++ b/packages/actor-scraper/playwright-scraper/Dockerfile @@ -1,6 +1,11 @@ -# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), -# so the build can use the pnpm workspace lockfile for a deterministic install. -FROM apify/actor-node-playwright:22 AS builder +# Build context is the monorepo root (dockerContextDir in .actor/actor.json), so the build uses the +# root pnpm-lock.yaml for a deterministic install. +# +# Browser determinism comes from pinning the base image by DIGEST below: the Chromium binary AND the +# matching Playwright driver both live in the base and are frozen together by the digest. The actor +# does NOT ship its own Playwright — it's dropped from the deploy bundle and resolved from the base at +# runtime, so driver and binary can never drift. +FROM apify/actor-node-playwright:24-1.61.0@sha256:5c0155bb5a0a90572ef021c2b4e2e195c50971e0c1ae00f081ffa47e62036c60 AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. USER root @@ -9,7 +14,6 @@ WORKDIR /app RUN corepack enable # Browsers ship with the base image; never let an npm postinstall download them. -# puppeteer is pulled transitively via @crawlee/browser-pool even for non-puppeteer actors. ENV PUPPETEER_SKIP_DOWNLOAD=true \ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 @@ -19,21 +23,28 @@ COPY . ./ # Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. RUN pnpm install --frozen-lockfile --filter actor-playwright-scraper... -# Build the actor and its workspace dependency @apify/scraper-tools. +# Build the actor and its workspace dependency @apify/scraper-tools (playwright is needed here for +# type-checking only; the runtime copy comes from the base — see below). RUN pnpm --filter actor-playwright-scraper... build -# Self-contained production bundle; inject-workspace-packages copies the built -# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. -RUN pnpm config set inject-workspace-packages true \ - && pnpm --filter actor-playwright-scraper deploy --prod /deploy +# Self-contained production bundle; inject-workspace-packages copies the built @apify/scraper-tools +# into node_modules instead of symlinking it. +RUN pnpm --config.inject-workspace-packages=true --filter actor-playwright-scraper deploy --prod /deploy -FROM apify/actor-node-playwright:22 +# Drop the bundle's Playwright so the runtime resolves it from the base image, where it matches the +# Chromium binary. This is what keeps driver and binary in lockstep. +RUN rm -rf \ + /deploy/node_modules/playwright \ + /deploy/node_modules/playwright-core \ + /deploy/node_modules/.bin/playwright \ + /deploy/node_modules/.bin/playwright-core -# Base WORKDIR is /home/myuser and ships a template node_modules plus the Xvfb entrypoint. -# Drop the template's node_modules and overlay only the lean production bundle; the inherited -# ENTRYPOINT (xvfb-entrypoint.sh) still wraps CMD with Xvfb, and the bundled browser is reused. -RUN rm -rf node_modules -COPY --from=builder --chown=myuser /deploy ./ +FROM apify/actor-node-playwright:24-1.61.0@sha256:5c0155bb5a0a90572ef021c2b4e2e195c50971e0c1ae00f081ffa47e62036c60 + +# Base WORKDIR is /home/myuser and ships the browser stack in node_modules plus the Xvfb entrypoint. +# Place the app in a child directory so the driver dropped above resolves up to the base's copy. +COPY --from=builder --chown=myuser /deploy ./app +WORKDIR /home/myuser/app ENV APIFY_DISABLE_OUTDATED_WARNING=1 diff --git a/packages/actor-scraper/playwright-scraper/package.json b/packages/actor-scraper/playwright-scraper/package.json index 4c0b8774..72c272c5 100644 --- a/packages/actor-scraper/playwright-scraper/package.json +++ b/packages/actor-scraper/playwright-scraper/package.json @@ -11,7 +11,7 @@ "@crawlee/utils": "^3.16.0", "apify": "^3.2.6", "idcac-playwright": "^0.2.0", - "playwright": "*" + "playwright": "1.61.0" }, "devDependencies": { "@apify/tsconfig": "^0.1.0", diff --git a/packages/actor-scraper/puppeteer-scraper/.dockerignore b/packages/actor-scraper/puppeteer-scraper/.dockerignore deleted file mode 100644 index 2424ba3f..00000000 --- a/packages/actor-scraper/puppeteer-scraper/.dockerignore +++ /dev/null @@ -1,12 +0,0 @@ -# configurations -.idea - -# crawlee and apify storage folders -apify_storage -crawlee_storage -storage - -# installed files -node_modules - -# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) diff --git a/packages/actor-scraper/puppeteer-scraper/Dockerfile b/packages/actor-scraper/puppeteer-scraper/Dockerfile index a5c21026..2c70e36d 100644 --- a/packages/actor-scraper/puppeteer-scraper/Dockerfile +++ b/packages/actor-scraper/puppeteer-scraper/Dockerfile @@ -1,6 +1,11 @@ -# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), -# so the build can use the pnpm workspace lockfile for a deterministic install. -FROM apify/actor-node-puppeteer-chrome:22 AS builder +# Build context is the monorepo root (dockerContextDir in .actor/actor.json), so the build uses the +# root pnpm-lock.yaml for a deterministic install. +# +# Browser determinism comes from pinning the base image by DIGEST below: the Chrome binary AND the +# matching Puppeteer driver both live in the base and are frozen together by the digest. The actor +# does NOT ship its own Puppeteer — it's dropped from the deploy bundle and resolved from the base at +# runtime, so driver and binary can never drift. +FROM apify/actor-node-puppeteer-chrome:24-25.2.0@sha256:e9f588cd827e542bdc7b476be7dd3ba87b8ca3b4136e2e081e5fa0e3c940d50d AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. USER root @@ -9,7 +14,6 @@ WORKDIR /app RUN corepack enable # Browsers ship with the base image; never let an npm postinstall download them. -# puppeteer is pulled transitively via @crawlee/browser-pool even for non-puppeteer actors. ENV PUPPETEER_SKIP_DOWNLOAD=true \ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 @@ -19,22 +23,31 @@ COPY . ./ # Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. RUN pnpm install --frozen-lockfile --filter actor-puppeteer-scraper... -# Build the actor and its workspace dependency @apify/scraper-tools. +# Build the actor and its workspace dependency @apify/scraper-tools (puppeteer is needed here for +# type-checking only; the runtime copy comes from the base — see below). RUN pnpm --filter actor-puppeteer-scraper... build -# Self-contained production bundle; inject-workspace-packages copies the built -# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. -RUN pnpm config set inject-workspace-packages true \ - && pnpm --filter actor-puppeteer-scraper deploy --prod /deploy +# Self-contained production bundle; inject-workspace-packages copies the built @apify/scraper-tools +# into node_modules instead of symlinking it. +RUN pnpm --config.inject-workspace-packages=true --filter actor-puppeteer-scraper deploy --prod /deploy -FROM apify/actor-node-puppeteer-chrome:22 +# Drop the bundle's Puppeteer so the runtime resolves it from the base image, where it matches the +# Chrome binary. This is what keeps driver and binary in lockstep. +RUN rm -rf \ + /deploy/node_modules/puppeteer \ + /deploy/node_modules/puppeteer-core \ + /deploy/node_modules/.bin/puppeteer -# Base WORKDIR is /home/myuser and ships a template node_modules plus the Xvfb entrypoint. -# Drop the template's node_modules and overlay only the lean production bundle; the inherited -# ENTRYPOINT (xvfb-entrypoint.sh) still wraps CMD with Xvfb, and the bundled browser is reused. -RUN rm -rf node_modules -COPY --from=builder --chown=myuser /deploy ./ +FROM apify/actor-node-puppeteer-chrome:24-25.2.0@sha256:e9f588cd827e542bdc7b476be7dd3ba87b8ca3b4136e2e081e5fa0e3c940d50d -ENV APIFY_DISABLE_OUTDATED_WARNING=1 +# Base WORKDIR is /home/myuser and ships Chrome plus the Xvfb entrypoint. Place the app in a child +# directory so the driver dropped above resolves up to the base's copy. +COPY --from=builder --chown=myuser /deploy ./app +WORKDIR /home/myuser/app + +# The base announces its Chrome via APIFY_CHROME_EXECUTABLE_PATH, but apify@3.7/crawlee@3.16 read only +# PUPPETEER_EXECUTABLE_PATH — mirror the base's own value so we follow whatever Chrome the base ships. +ENV PUPPETEER_EXECUTABLE_PATH=${APIFY_CHROME_EXECUTABLE_PATH} \ + APIFY_DISABLE_OUTDATED_WARNING=1 CMD ["node", "dist/main.js"] diff --git a/packages/actor-scraper/puppeteer-scraper/package.json b/packages/actor-scraper/puppeteer-scraper/package.json index 04e89d38..ace778dd 100644 --- a/packages/actor-scraper/puppeteer-scraper/package.json +++ b/packages/actor-scraper/puppeteer-scraper/package.json @@ -9,7 +9,7 @@ "@crawlee/puppeteer": "^3.16.0", "apify": "^3.2.6", "idcac-playwright": "^0.2.0", - "puppeteer": "*" + "puppeteer": "25.2.0" }, "devDependencies": { "@apify/tsconfig": "^0.1.0", diff --git a/packages/actor-scraper/puppeteer-scraper/src/internals/crawler_setup.ts b/packages/actor-scraper/puppeteer-scraper/src/internals/crawler_setup.ts index e9f5451c..4395b5ea 100644 --- a/packages/actor-scraper/puppeteer-scraper/src/internals/crawler_setup.ts +++ b/packages/actor-scraper/puppeteer-scraper/src/internals/crawler_setup.ts @@ -17,7 +17,6 @@ import { sleep } from '@crawlee/utils'; import type { ApifyEnv } from 'apify'; import { Actor } from 'apify'; import { getInjectableScript } from 'idcac-playwright'; -import type { HTTPResponse } from 'puppeteer'; import type { CrawlerSetupOptions, RequestMetadata } from '@apify/scraper-tools'; import { browserTools, constants as scraperToolsConstants, createContext, tools } from '@apify/scraper-tools'; @@ -437,7 +436,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { private async _handleResult( request: Request, - response?: HTTPResponse, + response?: PuppeteerCrawlingContext['response'], pageFunctionResult?: Dictionary, isError?: boolean, ) { diff --git a/packages/actor-scraper/sitemap-scraper/.dockerignore b/packages/actor-scraper/sitemap-scraper/.dockerignore deleted file mode 100644 index 2424ba3f..00000000 --- a/packages/actor-scraper/sitemap-scraper/.dockerignore +++ /dev/null @@ -1,12 +0,0 @@ -# configurations -.idea - -# crawlee and apify storage folders -apify_storage -crawlee_storage -storage - -# installed files -node_modules - -# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) diff --git a/packages/actor-scraper/sitemap-scraper/Dockerfile b/packages/actor-scraper/sitemap-scraper/Dockerfile index c458c157..b51b69f6 100644 --- a/packages/actor-scraper/sitemap-scraper/Dockerfile +++ b/packages/actor-scraper/sitemap-scraper/Dockerfile @@ -1,11 +1,16 @@ # Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), # so the build can use the pnpm workspace lockfile for a deterministic install. -FROM apify/actor-node:22 AS builder +FROM apify/actor-node:24 AS builder WORKDIR /app RUN corepack enable +# Browser packages can appear transitively through workspace/dev tooling, but this actor does not +# use them. Keep the deterministic install without downloading browser binaries into the build cache. +ENV PUPPETEER_SKIP_DOWNLOAD=true \ + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 + # Whole workspace (root .dockerignore keeps node_modules/.git/dist out of the context). COPY . ./ @@ -17,10 +22,9 @@ RUN pnpm --filter @apify/actor-sitemap-extractor... build # Self-contained production bundle; inject-workspace-packages copies the built # @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. -RUN pnpm config set inject-workspace-packages true \ - && pnpm --filter @apify/actor-sitemap-extractor deploy --prod /deploy +RUN pnpm --config.inject-workspace-packages=true --filter @apify/actor-sitemap-extractor deploy --prod /deploy -FROM apify/actor-node:22 +FROM apify/actor-node:24 WORKDIR /usr/src/app diff --git a/packages/actor-scraper/sitemap-scraper/package.json b/packages/actor-scraper/sitemap-scraper/package.json index 5216245f..e2b533a7 100644 --- a/packages/actor-scraper/sitemap-scraper/package.json +++ b/packages/actor-scraper/sitemap-scraper/package.json @@ -6,17 +6,17 @@ "type": "module", "dependencies": { "@apify/scraper-tools": "^1.1.4", - "@crawlee/core": "4.0.0-beta.43", - "@crawlee/http": "4.0.0-beta.43", - "@crawlee/impit-client": "4.0.0-beta.43", - "@crawlee/types": "4.0.0-beta.43", - "@crawlee/utils": "4.0.0-beta.43", + "@crawlee/core": "4.0.0-beta.25", + "@crawlee/http": "4.0.0-beta.25", + "@crawlee/impit-client": "4.0.0-beta.29", + "@crawlee/types": "4.0.0-beta.25", + "@crawlee/utils": "4.0.0-beta.25", "apify": "4.0.0-beta.12" }, "overrides": { - "@crawlee/core": "4.0.0-beta.43", - "@crawlee/types": "4.0.0-beta.43", - "@crawlee/utils": "4.0.0-beta.43" + "@crawlee/core": "4.0.0-beta.25", + "@crawlee/types": "4.0.0-beta.25", + "@crawlee/utils": "4.0.0-beta.25" }, "devDependencies": { "@apify/tsconfig": "^0.1.0", diff --git a/packages/actor-scraper/sitemap-scraper/src/internals/crawler_setup.ts b/packages/actor-scraper/sitemap-scraper/src/internals/crawler_setup.ts index cbee0c79..7930ee28 100644 --- a/packages/actor-scraper/sitemap-scraper/src/internals/crawler_setup.ts +++ b/packages/actor-scraper/sitemap-scraper/src/internals/crawler_setup.ts @@ -302,9 +302,9 @@ export class CrawlerSetup { }, // this scraper just outputs the returned status code, so we don't treat any as an error ignoreHttpErrorStatusCodes: Array.from({ length: 100 }, (_, i) => 500 + i), - blockedStatusCodes: [], persistCookiesPerSession: false, sessionPoolOptions: { + blockedStatusCodes: [], sessionOptions: { maxUsageCount: this.maxSessionUsageCount, }, diff --git a/packages/actor-scraper/sitemap-scraper/test/runtime-compat.test.ts b/packages/actor-scraper/sitemap-scraper/test/runtime-compat.test.ts new file mode 100644 index 00000000..d9d74bd5 --- /dev/null +++ b/packages/actor-scraper/sitemap-scraper/test/runtime-compat.test.ts @@ -0,0 +1,8 @@ +import { Configuration } from 'apify'; +import { describe, expect, it } from 'vitest'; + +describe('Apify and Crawlee runtime compatibility', () => { + it('initializes the global Apify configuration', () => { + expect(() => Configuration.getGlobalConfig()).not.toThrow(); + }); +}); diff --git a/packages/actor-scraper/web-scraper/.dockerignore b/packages/actor-scraper/web-scraper/.dockerignore deleted file mode 100644 index 2424ba3f..00000000 --- a/packages/actor-scraper/web-scraper/.dockerignore +++ /dev/null @@ -1,12 +0,0 @@ -# configurations -.idea - -# crawlee and apify storage folders -apify_storage -crawlee_storage -storage - -# installed files -node_modules - -# local npm lock is a workspace-link lock; it breaks the isolated build (the platform builds without it) diff --git a/packages/actor-scraper/web-scraper/Dockerfile b/packages/actor-scraper/web-scraper/Dockerfile index f20aa7b5..85a742ef 100644 --- a/packages/actor-scraper/web-scraper/Dockerfile +++ b/packages/actor-scraper/web-scraper/Dockerfile @@ -1,6 +1,11 @@ -# Build context is the monorepo root (set via dockerContextDir in .actor/actor.json), -# so the build can use the pnpm workspace lockfile for a deterministic install. -FROM apify/actor-node-puppeteer-chrome:22 AS builder +# Build context is the monorepo root (dockerContextDir in .actor/actor.json), so the build uses the +# root pnpm-lock.yaml for a deterministic install. +# +# Browser determinism comes from pinning the base image by DIGEST below: the Chrome binary AND the +# matching Puppeteer driver both live in the base and are frozen together by the digest. The actor +# does NOT ship its own Puppeteer — it's dropped from the deploy bundle and resolved from the base at +# runtime, so driver and binary can never drift. +FROM apify/actor-node-puppeteer-chrome:24-25.2.0@sha256:e9f588cd827e542bdc7b476be7dd3ba87b8ca3b4136e2e081e5fa0e3c940d50d AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. USER root @@ -9,7 +14,6 @@ WORKDIR /app RUN corepack enable # Browsers ship with the base image; never let an npm postinstall download them. -# puppeteer is pulled transitively via @crawlee/browser-pool even for non-puppeteer actors. ENV PUPPETEER_SKIP_DOWNLOAD=true \ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 @@ -19,22 +23,31 @@ COPY . ./ # Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. RUN pnpm install --frozen-lockfile --filter actor-web-scraper... -# Build the actor and its workspace dependency @apify/scraper-tools. +# Build the actor and its workspace dependency @apify/scraper-tools (puppeteer is needed here for +# type-checking only; the runtime copy comes from the base — see below). RUN pnpm --filter actor-web-scraper... build -# Self-contained production bundle; inject-workspace-packages copies the built -# @apify/scraper-tools (a runtime workspace dep) into node_modules instead of symlinking it. -RUN pnpm config set inject-workspace-packages true \ - && pnpm --filter actor-web-scraper deploy --prod /deploy +# Self-contained production bundle; inject-workspace-packages copies the built @apify/scraper-tools +# into node_modules instead of symlinking it. +RUN pnpm --config.inject-workspace-packages=true --filter actor-web-scraper deploy --prod /deploy -FROM apify/actor-node-puppeteer-chrome:22 +# Drop the bundle's Puppeteer so the runtime resolves it from the base image, where it matches the +# Chrome binary. This is what keeps driver and binary in lockstep. +RUN rm -rf \ + /deploy/node_modules/puppeteer \ + /deploy/node_modules/puppeteer-core \ + /deploy/node_modules/.bin/puppeteer -# Base WORKDIR is /home/myuser and ships a template node_modules plus the Xvfb entrypoint. -# Drop the template's node_modules and overlay only the lean production bundle; the inherited -# ENTRYPOINT (xvfb-entrypoint.sh) still wraps CMD with Xvfb, and the bundled browser is reused. -RUN rm -rf node_modules -COPY --from=builder --chown=myuser /deploy ./ +FROM apify/actor-node-puppeteer-chrome:24-25.2.0@sha256:e9f588cd827e542bdc7b476be7dd3ba87b8ca3b4136e2e081e5fa0e3c940d50d -ENV APIFY_DISABLE_OUTDATED_WARNING=1 +# Base WORKDIR is /home/myuser and ships Chrome plus the Xvfb entrypoint. Place the app in a child +# directory so the driver dropped above resolves up to the base's copy. +COPY --from=builder --chown=myuser /deploy ./app +WORKDIR /home/myuser/app + +# The base announces its Chrome via APIFY_CHROME_EXECUTABLE_PATH, but apify@3.7/crawlee@3.16 read only +# PUPPETEER_EXECUTABLE_PATH — mirror the base's own value so we follow whatever Chrome the base ships. +ENV PUPPETEER_EXECUTABLE_PATH=${APIFY_CHROME_EXECUTABLE_PATH} \ + APIFY_DISABLE_OUTDATED_WARNING=1 CMD ["node", "dist/main.js"] diff --git a/packages/actor-scraper/web-scraper/package.json b/packages/actor-scraper/web-scraper/package.json index 5bd4e5d4..147ea6cc 100644 --- a/packages/actor-scraper/web-scraper/package.json +++ b/packages/actor-scraper/web-scraper/package.json @@ -10,10 +10,9 @@ "@crawlee/puppeteer": "^3.16.0", "apify": "^3.2.6", "content-type": "^1.0.5", - "crawlee": "^3.16.0", "devtools-server": "^0.0.2", "idcac-playwright": "^0.2.0", - "puppeteer": "*" + "puppeteer": "25.2.0" }, "devDependencies": { "@apify/tsconfig": "^0.1.0", diff --git a/packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts b/packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts index 3cfa3168..ef7c9dbb 100644 --- a/packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts +++ b/packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts @@ -27,7 +27,6 @@ import contentType from 'content-type'; // @ts-expect-error no typings import DevToolsServer from 'devtools-server'; import { getInjectableScript } from 'idcac-playwright'; -import type { HTTPResponse, Page } from 'puppeteer'; import type { CrawlerSetupOptions, createContext } from '@apify/scraper-tools'; import { browserTools, constants as scraperToolsConstants, tools } from '@apify/scraper-tools'; @@ -44,6 +43,8 @@ const MAX_CONCURRENCY_IN_DEVELOPMENT = 1; const { SESSION_MAX_USAGE_COUNTS, DEFAULT_VIEWPORT, DEVTOOLS_TIMEOUT_SECS, META_KEY } = scraperToolsConstants; const SCHEMA = JSON.parse(await readFile(new URL('../../INPUT_SCHEMA.json', import.meta.url), 'utf8')); +type CrawleePuppeteerPage = PuppeteerCrawlingContext['page']; + interface PageContext { apifyNamespace: string; skipLinks: boolean; @@ -84,7 +85,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { /** * Used to store page specific data. */ - pageContexts = new WeakMap(); + pageContexts = new WeakMap(); blockedUrlPatterns: string[] = []; isDevRun: boolean; @@ -623,7 +624,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { private async _handleResult( request: Request, - response?: HTTPResponse, + response?: PuppeteerCrawlingContext['response'], pageFunctionResult?: Dictionary, isError?: boolean, ) { @@ -634,7 +635,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { tools.logPerformance(request, 'handleResult EXECUTION', start); } - private async _assertNamespace(page: Page, namespace: string) { + private async _assertNamespace(page: CrawleePuppeteerPage, namespace: string) { try { await page.waitForFunction( (nmspc: string) => !!window[nmspc], @@ -654,7 +655,10 @@ export class CrawlerSetup implements CrawlerSetupOptions { } } - private async _waitForLoadEventWhenXml(page: Page, response?: HTTPResponse) { + private async _waitForLoadEventWhenXml( + page: CrawleePuppeteerPage, + response?: PuppeteerCrawlingContext['response'], + ) { // Response can sometimes be null. if (!response) return; @@ -683,7 +687,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { } } - private async _injectBrowserHandles(page: Page, pageContext: PageContext) { + private async _injectBrowserHandles(page: CrawleePuppeteerPage, pageContext: PageContext) { const saveSnapshotP = browserTools.createBrowserHandle(page, async () => browserTools.saveSnapshot({ page })); const skipLinksP = browserTools.createBrowserHandle(page, () => { pageContext.skipLinks = true; diff --git a/packages/scraper-tools/package.json b/packages/scraper-tools/package.json index c5f8b0b6..99c46ae6 100644 --- a/packages/scraper-tools/package.json +++ b/packages/scraper-tools/package.json @@ -48,11 +48,11 @@ "apify": "^3.1.8" }, "peerDependencies": { - "@crawlee/browser-pool": "^3.8.2", - "@crawlee/core": "^3.8.2", - "@crawlee/types": "^3.8.2", - "@crawlee/utils": "^3.8.2", - "apify": "^3.1.8" + "@crawlee/browser-pool": "^3.8.2 || ^4.0.0-beta.0", + "@crawlee/core": "^3.8.2 || ^4.0.0-beta.0", + "@crawlee/types": "^3.8.2 || ^4.0.0-beta.0", + "@crawlee/utils": "^3.8.2 || ^4.0.0-beta.0", + "apify": "^3.1.8 || ^4.0.0-beta.0" }, "peerDependenciesMeta": { "@crawlee/puppeteer": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81cf3958..49754b1d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + apify@4.0.0-beta.12>@crawlee/core: 4.0.0-beta.25 + apify@4.0.0-beta.12>@crawlee/types: 4.0.0-beta.25 + apify@4.0.0-beta.12>@crawlee/utils: 4.0.0-beta.25 + importers: .: @@ -124,7 +129,7 @@ importers: version: 3.16.0 '@crawlee/playwright': specifier: ^3.14.1 - version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) + version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@25.2.0) '@crawlee/utils': specifier: ^3.14.1 version: 3.16.0 @@ -132,14 +137,17 @@ importers: specifier: ^3.2.6 version: 3.7.0 camoufox-js: - specifier: ^0.9.0 - version: 0.9.3(playwright-core@1.61.0) + specifier: 0.11.1 + version: 0.11.1(playwright-core@1.59.1) idcac-playwright: specifier: ^0.2.0 version: 0.2.0 playwright: - specifier: '*' - version: 1.61.0 + specifier: 1.59.1 + version: 1.59.1 + playwright-core: + specifier: 1.59.1 + version: 1.59.1 devDependencies: '@apify/tsconfig': specifier: ^0.1.0 @@ -220,7 +228,7 @@ importers: version: 3.16.0 '@crawlee/playwright': specifier: ^3.16.0 - version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) + version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.2.0) '@crawlee/utils': specifier: ^3.16.0 version: 3.16.0 @@ -231,7 +239,7 @@ importers: specifier: ^0.2.0 version: 0.2.0 playwright: - specifier: '*' + specifier: 1.61.0 version: 1.61.0 devDependencies: '@apify/tsconfig': @@ -254,7 +262,7 @@ importers: version: link:../../scraper-tools '@crawlee/puppeteer': specifier: ^3.16.0 - version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) + version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.2.0) apify: specifier: ^3.2.6 version: 3.7.0 @@ -262,8 +270,8 @@ importers: specifier: ^0.2.0 version: 0.2.0 puppeteer: - specifier: '*' - version: 25.1.0 + specifier: 25.2.0 + version: 25.2.0 devDependencies: '@apify/tsconfig': specifier: ^0.1.0 @@ -284,20 +292,20 @@ importers: specifier: ^1.1.4 version: link:../../scraper-tools '@crawlee/core': - specifier: 4.0.0-beta.43 - version: 4.0.0-beta.43 + specifier: 4.0.0-beta.25 + version: 4.0.0-beta.25 '@crawlee/http': - specifier: 4.0.0-beta.43 - version: 4.0.0-beta.43 + specifier: 4.0.0-beta.25 + version: 4.0.0-beta.25 '@crawlee/impit-client': - specifier: 4.0.0-beta.43 - version: 4.0.0-beta.43 + specifier: 4.0.0-beta.29 + version: 4.0.0-beta.29 '@crawlee/types': - specifier: 4.0.0-beta.43 - version: 4.0.0-beta.43 + specifier: 4.0.0-beta.25 + version: 4.0.0-beta.25 '@crawlee/utils': - specifier: 4.0.0-beta.43 - version: 4.0.0-beta.43 + specifier: 4.0.0-beta.25 + version: 4.0.0-beta.25 apify: specifier: 4.0.0-beta.12 version: 4.0.0-beta.12 @@ -322,16 +330,13 @@ importers: version: link:../../scraper-tools '@crawlee/puppeteer': specifier: ^3.16.0 - version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) + version: 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.2.0) apify: specifier: ^3.2.6 version: 3.7.0 content-type: specifier: ^1.0.5 version: 1.0.5 - crawlee: - specifier: ^3.16.0 - version: 3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) devtools-server: specifier: ^0.0.2 version: 0.0.2 @@ -339,8 +344,8 @@ importers: specifier: ^0.2.0 version: 0.2.0 puppeteer: - specifier: '*' - version: 25.1.0 + specifier: 25.2.0 + version: 25.2.0 devDependencies: '@apify/tsconfig': specifier: ^0.1.0 @@ -375,7 +380,7 @@ importers: devDependencies: '@crawlee/browser-pool': specifier: ^3.8.2 - version: 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) + version: 3.16.0(playwright@1.61.1)(puppeteer@25.2.0) '@crawlee/core': specifier: ^3.8.2 version: 3.16.0 @@ -543,8 +548,8 @@ packages: resolution: {integrity: sha512-dcqeDkYk6NoXHSBEkALD4orb7k6yTDkwZp8RtcvlmMmVZKVQTVVHh78NFInzxRkjFVmStFWE2LRHBZpe518E0Q==} engines: {node: '>=16.0.0'} - '@crawlee/basic@4.0.0-beta.43': - resolution: {integrity: sha512-UNVRxNb1pJjCxHYpCaM1WpJP6MN3UA2rmjUyZuOEODF3jUBaVM+raUN+w1zTTmrGJ6WVGZuF+R6/1N0fMFOX1g==} + '@crawlee/basic@4.0.0-beta.25': + resolution: {integrity: sha512-zy+EV6t+qu9PqZZQPONWzegLe0XpkkTpSRTs9MywH1kicG9kw10qJzkZC9zL0sp9qsirJKk83Nk9qceviIQxJQ==} engines: {node: '>=22.0.0'} '@crawlee/browser-pool@3.16.0': @@ -584,28 +589,32 @@ packages: resolution: {integrity: sha512-Yn32E5IdmENLITg36XN1ty4OLPMcqzDjkEvSdZ0dRV5jcJR89sKi47FOs2eXpW+n7IGhbzPDkGKUirPPRrRkjg==} engines: {node: '>=16.0.0'} - '@crawlee/core@4.0.0-beta.43': - resolution: {integrity: sha512-C827ZjPsL7DDj7W0ofjUMs29PNHNbGWqgndPNssD5ER4YLPJSAVzHPh7Na3BzVmiqeSCm44kr7nVvuSocqS+Wg==} + '@crawlee/core@4.0.0-beta.25': + resolution: {integrity: sha512-45nzqaIsga/4dFg4AXis5JHWhWvEMU37AIlO32pyhnZnhowrI4em5fN5GNY6hAwrcQcZ27l/WV2RUrPEvZYUug==} + engines: {node: '>=22.0.0'} + + '@crawlee/got-scraping-client@4.0.0-beta.25': + resolution: {integrity: sha512-RaQ20QiQl0cE3t4azjzTKlxb8j8NDMbeQncrYJz6zvrvfnR3I75OlOW0kGvzsJREtn0BSRhw85w63rpC05Ns7g==} engines: {node: '>=22.0.0'} - '@crawlee/got-scraping-client@4.0.0-beta.43': - resolution: {integrity: sha512-Z2CPbdIKL1D2u8MtKgqrP8edskboQDYurv+W2F1RUjEsaKfb7hjQiv0W6crKG7bH91zkREy88zerT3gJ5UU3oQ==} + '@crawlee/http-client@4.0.0-beta.25': + resolution: {integrity: sha512-P+SbnTQM/yKhELbIYuajsiElDifhhGniPZWF3Jy4W4fBdVoEjL291izs3beX5aYvREfLLkFCL9LS8FFmdHX51A==} engines: {node: '>=22.0.0'} - '@crawlee/http-client@4.0.0-beta.43': - resolution: {integrity: sha512-z63BVq6c42UZJQC7lcofsSS8JGU9GArgUZfi3XV8YmgxKliPWifjx0Uhr8ekbTdt8a1mLAeYWe3520EpzUrjJg==} + '@crawlee/http-client@4.0.0-beta.29': + resolution: {integrity: sha512-75TP3vJR8Iv6JLajZU98YWD0XNnexHAvlLKKsrzKEWalLPtOdiivUCaZ8x2A1zcPZLpaL6MexMF6ZaOR1nJafQ==} engines: {node: '>=22.0.0'} '@crawlee/http@3.16.0': resolution: {integrity: sha512-adp8fuQyW32kVKKJNPOA/HEF893ddPqldlIOcO+CdCa4EkeKTPOx74VGLVZyO4f0Zxs0QwvDL1W5O7ckD82MFQ==} engines: {node: '>=16.0.0'} - '@crawlee/http@4.0.0-beta.43': - resolution: {integrity: sha512-HbcckZsVGaQjEny3evj9nYIKMId3D5v8jw/PEEmuuNO0gB+IvXXpZ8vU6kJNjxpeS0ja6+BmFZV9YbFzMTx9fA==} + '@crawlee/http@4.0.0-beta.25': + resolution: {integrity: sha512-udcE/c/bR+VtA70+SAyM9XEgXqe7PV7cVwSpJjzNckc0W6NzoQfG8UOy75Ju4wUeuIvgXy7GdUTZHBIDVvWHlA==} engines: {node: '>=22.0.0'} - '@crawlee/impit-client@4.0.0-beta.43': - resolution: {integrity: sha512-0T+c7DM0R+zVl+vm5LB/gvgEc4+iKjbpo9uGCsXL8hzIBxKG3ayvNgjtuLlissQjWf8PXYT9NdEjf26EbqGPRA==} + '@crawlee/impit-client@4.0.0-beta.29': + resolution: {integrity: sha512-tE4r42nEjgFcNA61b+feUk9HysERv6QDHwqriSsTGSz2w6P2CYAQ8wy9Wb8j+z+VL6Q7Y5W/Dc71zj3H+HUfxQ==} engines: {node: '>=22.0.0'} '@crawlee/jsdom@3.16.0': @@ -620,8 +629,8 @@ packages: resolution: {integrity: sha512-ol1PSWj5LL1ALjEZ+zJdLaZx4bGPIP6vXly4AmbtyFg2iq+m1BudtXL+dWFdv/qN8f+N8ljPF5VwKAVxg2uy3Q==} engines: {node: '>= 16'} - '@crawlee/memory-storage@4.0.0-beta.43': - resolution: {integrity: sha512-2P9gR+3GQN57HuUHLapiYBNenCeKgFXcWXA6qL8ZgqwFF5QYjcWqpow5Qu+zfEIVALRtbXQjMS1XrSL6nSLLOQ==} + '@crawlee/memory-storage@4.0.0-beta.25': + resolution: {integrity: sha512-66o+VE23gGGTtL68c3m/QHg4lCZbVCeWnlN9S840ixzBJun7Q3op1pRT+DxYSS/8DaJWGHWZF2nwEev77NiG8Q==} engines: {node: '>=22.0.0'} '@crawlee/playwright@3.16.0': @@ -656,16 +665,20 @@ packages: resolution: {integrity: sha512-CcIM+JDVx4gzQzMPl+9RJiEeqdzTrx2RLPA7y4IMJSyfZm3J/VrEunielKA3NQrk095j9OuvS/rQL2y8mBV1qw==} engines: {node: '>=16.0.0'} - '@crawlee/types@4.0.0-beta.43': - resolution: {integrity: sha512-JQyupy953e6g4KhSfTWVF5nJ4DYXb0R/Qcbji8sammvOmYiedE4gdbgv1iW11Z8Jlwxa6vrzySIlGcXhuJe2fg==} + '@crawlee/types@4.0.0-beta.25': + resolution: {integrity: sha512-hU5Kjwp3OYPG6rQIbaGSzGEXN+Kcci48dln/5Lf/btFWKXr3EEZiZyptVIEtstMFJdViK74S2RnOWNjkZc9AiQ==} + engines: {node: '>=22.0.0'} + + '@crawlee/types@4.0.0-beta.29': + resolution: {integrity: sha512-IOBwYYHMGwKZFNwXZUeuQpzOzLuuXN7rD/qfBcKWvogZmf17glAMIS+5Iu5T0FMVCW17GfkUd+3LlYLoPjb7hg==} engines: {node: '>=22.0.0'} '@crawlee/utils@3.16.0': resolution: {integrity: sha512-rfVx/3hsFZjiD4AwT8IoQsuNLiawrsdhc893Nha22mWQMxJ0Z/KUzh8FyJDnNOHuxWGIJP96I7nBikxYeSdw5A==} engines: {node: '>=16.0.0'} - '@crawlee/utils@4.0.0-beta.43': - resolution: {integrity: sha512-LHsVNp55U8iwZKmSYYwwu6XKDX9LP8n1BI8+Rw+7iNEBcs4lUOFIi/BT4GGbrJt565g3FaUbZsckQw3IWT31oA==} + '@crawlee/utils@4.0.0-beta.25': + resolution: {integrity: sha512-5njsGdq3nzlzdcVrTFD9fbk2nwDGogZwsfGY7czGG4Ua4+WN/zDhpske9AoiBadu9D9dvWxqiNzYsOO/8cEODQ==} engines: {node: '>=22.0.0'} '@csstools/color-helpers@5.1.0': @@ -1589,6 +1602,16 @@ packages: proxy-agent: optional: true + '@puppeteer/browsers@3.0.5': + resolution: {integrity: sha512-xYXNuEQmHNIPWWcbL/skf2KF7seyp7c1xmKFRk3wmdFx7VwBsKVrtOLKs8ecaezsKPsWeF1YsgwIiElAscaryA==} + engines: {node: '>=22.12.0'} + hasBin: true + peerDependencies: + proxy-agent: '>=8.0.1' + peerDependenciesMeta: + proxy-agent: + optional: true + '@rollup/rollup-android-arm-eabi@4.62.0': resolution: {integrity: sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ==} cpu: [arm] @@ -2086,9 +2109,9 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - better-sqlite3@12.9.0: - resolution: {integrity: sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ==} - engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} + better-sqlite3@12.11.1: + resolution: {integrity: sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==} + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} bidi-js@1.0.3: resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} @@ -2183,9 +2206,9 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - camoufox-js@0.9.3: - resolution: {integrity: sha512-HKdCaUudkgJBzZZ9HxDu0JVmRFKWySnQrhhsqBGnEEuGHzsCs+Bon0bCrEePZ4Ax0BlycMOr/zxKq6kSu516sw==} - engines: {node: '>= 20'} + camoufox-js@0.11.1: + resolution: {integrity: sha512-/tSgFAgjcbxudXFLd+u5VARZHOK9fm5bg1QRAP/2NySdaq6Vf7UTk2aMEUqaXAfnV7ncf4y87KjIFVpWVbZ+RQ==} + engines: {node: '>= 22'} hasBin: true peerDependencies: playwright-core: '*' @@ -2287,6 +2310,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -2585,6 +2612,9 @@ packages: devtools-protocol@0.0.1624250: resolution: {integrity: sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA==} + devtools-protocol@0.0.1638949: + resolution: {integrity: sha512-mXwg4Fqnv0WR4iuAT/gYUmctNkjILwXFHyZ+m7Ty1dfr0ezZt2U3gnrrJTfRobJTHoXf+IbuFvFITzLrLFjwJA==} + devtools-server@0.0.2: resolution: {integrity: sha512-ZHfQVaJelu0dwEYf26jyppuDwpC0oyOkqzoGEnHhSa4mC0Y3WiWAxsMTBzDao/iLd15+0XlYCJxLilK2uALjvQ==} @@ -3163,116 +3193,116 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - impit-darwin-arm64@0.11.0: - resolution: {integrity: sha512-XZcgJQ49hVGoa+bXmXqkvSucyo99X13zggMjqg5lU1SYChpgtsmDG2OyhmKt+if07Y+HtB6EAlCBLl6HPPlbbQ==} + impit-darwin-arm64@0.14.2: + resolution: {integrity: sha512-ChvxbJj893rWAhHXJ3kkGe8Pg4lsZwQ1Dt0w/noCkNe436gm0nIQ/eBBbwIJBsY4Ev7q6fgi/QerF2trSyUXmg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - impit-darwin-arm64@0.9.2: - resolution: {integrity: sha512-YHfrBeWwwI6je3OLBK8kgxR49bLbYGLkF/HFUHjPnhZxR821zd0NNPsYMX/1Rrasx0Zpu3skhN68ofudilhHdg==} + impit-darwin-arm64@0.8.2: + resolution: {integrity: sha512-xFKLJxyGatPEz49ZUT3f2wRgKAhavWT1w5Cth27csY/Y0Rm7f6IjkjBbXk2/azsqYXNJDgNdAqWq9+/oFFm+IQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - impit-darwin-x64@0.11.0: - resolution: {integrity: sha512-lyz/HnElBkr/e13pTrBWDocfjVVR6eKrOZmnVeCEPxYlNuPCOslhHp2p+1BdgIQO/8s2X2MVeS0zVSXq3hNp+w==} + impit-darwin-x64@0.14.2: + resolution: {integrity: sha512-r1g3WkwljcRgY1V0yBCUJ0/Sy6OHLc4RUrfz3mHi2X4WvkTk7aY17K4X+baBx+tcpOfE/ME/iWAY/PesOM9JVA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - impit-darwin-x64@0.9.2: - resolution: {integrity: sha512-FPH7gE0YdHfYRjX9qGKIvfQ6hdgo9GM+/wD1ktUC2UiEwKbwjpmrBhdXt0bSudrw9D28T4KR1w4TmX4X+uBYEA==} + impit-darwin-x64@0.8.2: + resolution: {integrity: sha512-OxkbXWNvl9XcygxDUV+1sTyOYuHeORwCky9Nt/KMRlu+hOhiU2a3ZsS2zlAqYxh77Yfd5VWFJaG+mXpp3Zx8dw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - impit-linux-arm64-gnu@0.11.0: - resolution: {integrity: sha512-xdvbpoPnrAHDtetZjfD6/zqswhg9CRAd7f3YyBFzzNg3aoBRhgMFrdD2BLEWAvaq1PZkj+/emCaPZfJZJfPuJg==} + impit-linux-arm64-gnu@0.14.2: + resolution: {integrity: sha512-JZJqUnEqFiktcXVgg/AIKkSv8SGu5zoQ7lf9CSvS0eEiwSlHnLUPwBiFc9/mSHDIUQkM9qlvJyGUiGqGEt9K6A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - impit-linux-arm64-gnu@0.9.2: - resolution: {integrity: sha512-9Va4WmklAWwjJYT5M74u6HHzmRA8Tw8tdwzsrhIBmEyJ/gzCD6TJD0sE0mgFGd8v/mEB/WfMX1VnpOQmPm1gDQ==} + impit-linux-arm64-gnu@0.8.2: + resolution: {integrity: sha512-Yygo2Vfyz4+ClXivVxjcuXuffnVnoRg23Wf7MMd0tiLnbxnn+VBPBsj0/kl5GKslacoWvyFz5n997H2NawPe0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - impit-linux-arm64-musl@0.11.0: - resolution: {integrity: sha512-w7isVF4RfVynopjGSP+a3/6KJmL7MzdEw2niIi9YjRnCRDPi4XEmxDm9XScB7vUE8E4s7LT8QKa/SIb3MEpvFQ==} + impit-linux-arm64-musl@0.14.2: + resolution: {integrity: sha512-ZsL9JAFEZBP3tvT8h4pkcg/b/MtHP8mZSgsncD6z9+qKM/IjqiDYwQunKaAYMwGu0EEbjtaU4C1zTK6ipnvwbA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - impit-linux-arm64-musl@0.9.2: - resolution: {integrity: sha512-eiZs4C4vOPRi5A/V/bNTpX9Ays1m1trMfDXRH/Bnulo7XPngP6AEGW0SaKBznfDhiFOfO7hcDPupkGvSfX5rpw==} + impit-linux-arm64-musl@0.8.2: + resolution: {integrity: sha512-TB/ux8K7/BVLZlovOE6dDtS2NKgKMjkt75DmbWo2eQnEOF2aJdcKCqsxx4FolZezY1zWcpTOUM+ES+EKI/G9eQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - impit-linux-x64-gnu@0.11.0: - resolution: {integrity: sha512-Y0NBSiFn79G2CXUx2J+a8W2e53ZS7smohsZX18XY8i9LxLf2FQ6pt7e1eWVDHEdo298r5w4EFPc46Gdg6npw+A==} + impit-linux-x64-gnu@0.14.2: + resolution: {integrity: sha512-3/keeSOCiByIfbOpmvixRXDlCdcyf112ru0fNl7AcpC1RtQz48ctsAn6R4+xEEnULO63By5VK9X0HNm1O2gUdw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - impit-linux-x64-gnu@0.9.2: - resolution: {integrity: sha512-KXkc6A0jh6c1ymxbcxgMbjNwr7YCm48froJaQWzXHg9nRSepJxprHtlWoFcz9HG/D9+eBQXTpMAJMAqXMs+NtA==} + impit-linux-x64-gnu@0.8.2: + resolution: {integrity: sha512-5wVgeMai+chGsb/7KL4W8lCuyf/HcYXLR1pBzevls3/jNUQ5IoyP/XAtUe0GN2H+zCFj7UVD6VFKlbOBFp2a/A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - impit-linux-x64-musl@0.11.0: - resolution: {integrity: sha512-UmahyHiqcNTCYnAgW+SjQwfyqfALYxXeN3Likuf/aS/tzlTP/CPmtNu1O+Vl7G8dZaWRlBNtAwvLeKlkUKBL5A==} + impit-linux-x64-musl@0.14.2: + resolution: {integrity: sha512-BiUXZhj6lQOrZmeYB4HqYiBS5XvM/clrSVyZyae/CJshELUyYOLNxnTOxabd0tWR6J9ntC7bZwDrwskWD/TePA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - impit-linux-x64-musl@0.9.2: - resolution: {integrity: sha512-GWXqohv79LgOF0YUP/rwVGZ4uQZWK/NJUhGZR4PgKRMb1HHH2S2wrGtSP7AHyW+GT27Tv9yrRcyidVK+FYxOVw==} + impit-linux-x64-musl@0.8.2: + resolution: {integrity: sha512-7QN6DzhH2BlQEj/KTuxBJKFTO1aDsHaDngmJw9V5k8pOFS1s1U3EfnosVTFocgQIcuEk9viutEEEUfUnehnrng==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - impit-win32-arm64-msvc@0.11.0: - resolution: {integrity: sha512-LppsL30N+EgVx1tsBNsYz2vf8aM+RXpin/9Szzs8G82PD5QmOnrhJE6JTpzyfVYebjn/UdJcIqFzfcZRCciLOg==} + impit-win32-arm64-msvc@0.14.2: + resolution: {integrity: sha512-GQT3ITrIbh5P6FLzoHGuBpjrP/rzZoC3T0510+yCtLdQ1qQQzEIi1iCUElpCokyL4J/D4BdCRMS3wv3TzhcM4w==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - impit-win32-arm64-msvc@0.9.2: - resolution: {integrity: sha512-ta82EKAMjCXhnCs6n9jr7hzbjX3wBWhW21AdAwZEiX4RaJNmE6j0oH0ZrTZuCDJumxAV+1pJapB4q/BCuoP1IQ==} + impit-win32-arm64-msvc@0.8.2: + resolution: {integrity: sha512-KvsKB6mfCM+DAvC5wLhRwOSXdy3fN7JLub1ieazFK2POOqLN27XUc5DbmniAW9jcCew9VMjw3ipZeFvfHEFHFg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - impit-win32-x64-msvc@0.11.0: - resolution: {integrity: sha512-fXIrgD8EdxDBic90DvcJ350lbeHYTQGybNEQNW7zQrSMEht0A/r7mm9yI1VhhSOiT7glCl96CAvG3mTSGqAipA==} + impit-win32-x64-msvc@0.14.2: + resolution: {integrity: sha512-J6MpD0GzoMN9ydb2iT2oagE0Y4rbkKf8fDxrMh3/txp2sfzYDDfbcC4sySMm2b8QB4ERhB6N5YzcpGBAHbx/0w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - impit-win32-x64-msvc@0.9.2: - resolution: {integrity: sha512-S1F8b4sKYwd0FORJWir4rrU0iZbQwebY+U/lkSJOK316P46sH8wu8wHB4TLVLLNpAUI0bp4sBgXlholqtlDAQw==} + impit-win32-x64-msvc@0.8.2: + resolution: {integrity: sha512-QidL5Hgjx6l8OepoqT+X0EvP65Z636kLf4tKqd21rM/JBNLPP1jnfjr91XjLlHTS/0lawkjAPUzcpMI9LInUyQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - impit@0.11.0: - resolution: {integrity: sha512-968YrfzZN5CCgHs/n/yAbPgetq+bOreQOI9UQXmHK3srRs24g+m9CNGL8tRWUIZCK0tnc+baBJ0nw+8saHz0qw==} + impit@0.14.2: + resolution: {integrity: sha512-8JlirJDFdrZg7a7nV00Jn5WO8K+X1FJQSVFrChxRyzkSAFv6mmGgriXS33wbJFUxpiOGY/MJpHY8hhmLfDcJDw==} engines: {node: '>= 20'} - impit@0.9.2: - resolution: {integrity: sha512-flHQYxC16o7H+OKrO0zXv8Ob8Hs/E1Z1CfjGUHkN+6qqQksi1/2KMnZZEeSWfB9fM4b8SQVL6aQha/K6qVKqng==} + impit@0.8.2: + resolution: {integrity: sha512-EVC+R3GrbOjAgYW0e/ShH1FHXFJT5wFRhDnDtmLrzA68FPNsE8wsw6ZsJVW6OxVzKI1ukZ0FM5WrsQ6HK9VR5A==} engines: {node: '>= 20'} import-fresh@3.3.1: @@ -3657,10 +3687,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} - engines: {node: 20 || >=22} - lru-cache@11.5.1: resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} engines: {node: 20 || >=22} @@ -4094,10 +4120,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@6.2.0: - resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} - engines: {node: '>=18'} - p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -4265,16 +4287,36 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + engines: {node: '>=18'} + hasBin: true + playwright-core@1.61.0: resolution: {integrity: sha512-caX7TrY3Ml6egyDX0WUcTHDxodl/b51y5wJOdCEA36QviK/s2g081hvmGs8eaE3DWb6NYZQ6BjO/QkNRPenoPA==} engines: {node: '>=18'} hasBin: true + playwright-core@1.61.1: + resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.59.1: + resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + engines: {node: '>=18'} + hasBin: true + playwright@1.61.0: resolution: {integrity: sha512-Z+7BeeqQPRRzklHsVFP4KTGIyMxKUmfeRA4WisM6G3/XW6nwGeX6fX9qYaDa+CiUqpOkb2f6X3nar05R3kSuJQ==} engines: {node: '>=18'} hasBin: true + playwright@1.61.1: + resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} + engines: {node: '>=18'} + hasBin: true + postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} @@ -4358,11 +4400,20 @@ packages: resolution: {integrity: sha512-jKzy5y4WG6uNuFbTWgW1D7mqoT9o0nllc/6a1DGF775T1mPmgw3scdFEtEq67yVFikavQmbYq6NLfbTfxHSlqQ==} engines: {node: '>=22.12.0'} + puppeteer-core@25.2.0: + resolution: {integrity: sha512-jGhuGAlkgOcbyGRc0Cm9b/y4vvqoxhyAyl6a1diVe8F3sHsgTaQ60QQT5F3rGegTZV3prysgHVc+0LsvPZo3GA==} + engines: {node: '>=22.12.0'} + puppeteer@25.1.0: resolution: {integrity: sha512-7L6/0JM7XStK99lIL4xQySyNEXNfII6pk0BxkI5kKBTOhR7AsoQiv067YTsE/rIXxQiq9ajlO4WcqBjS/FWK1A==} engines: {node: '>=22.12.0'} hasBin: true + puppeteer@25.2.0: + resolution: {integrity: sha512-JPMPd/2+lgdkLhEyPqH895oR3ccMt1wSra6oewgjjTuLmo2s9zPZpKXQTFEIiA/fMKpiL01kjU3+2zPEReRWNg==} + engines: {node: '>=22.12.0'} + hasBin: true + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5276,6 +5327,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -5284,14 +5339,14 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} - engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} @@ -5519,14 +5574,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/basic@4.0.0-beta.43': + '@crawlee/basic@4.0.0-beta.25': dependencies: + '@apify/log': 2.5.34 '@apify/timeout': 0.3.2 '@apify/utilities': 2.25.6 - '@crawlee/core': 4.0.0-beta.43 - '@crawlee/got-scraping-client': 4.0.0-beta.43 - '@crawlee/types': 4.0.0-beta.43 - '@crawlee/utils': 4.0.0-beta.43 + '@crawlee/core': 4.0.0-beta.25 + '@crawlee/got-scraping-client': 4.0.0-beta.25 + '@crawlee/types': 4.0.0-beta.25 + '@crawlee/utils': 4.0.0-beta.25 csv-stringify: 6.7.0 fs-extra: 11.3.4 ow: 2.0.0 @@ -5536,6 +5592,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@crawlee/browser-pool@3.16.0(playwright@1.59.1)(puppeteer@25.2.0)': + dependencies: + '@apify/log': 2.5.34 + '@apify/timeout': 0.3.2 + '@crawlee/core': 3.16.0 + '@crawlee/types': 3.16.0 + fingerprint-generator: 2.1.82 + fingerprint-injector: 2.1.82(playwright@1.59.1)(puppeteer@25.2.0) + lodash.merge: 4.6.2 + nanoid: 3.3.11 + ow: 0.28.2 + p-limit: 3.1.0 + proxy-chain: 2.7.1 + quick-lru: 5.1.1 + tiny-typed-emitter: 2.1.0 + tslib: 2.8.1 + optionalDependencies: + playwright: 1.59.1 + puppeteer: 25.2.0 + transitivePeerDependencies: + - supports-color + '@crawlee/browser-pool@3.16.0(playwright@1.61.0)(puppeteer@25.1.0)': dependencies: '@apify/log': 2.5.34 @@ -5558,6 +5636,66 @@ snapshots: transitivePeerDependencies: - supports-color + '@crawlee/browser-pool@3.16.0(playwright@1.61.0)(puppeteer@25.2.0)': + dependencies: + '@apify/log': 2.5.34 + '@apify/timeout': 0.3.2 + '@crawlee/core': 3.16.0 + '@crawlee/types': 3.16.0 + fingerprint-generator: 2.1.82 + fingerprint-injector: 2.1.82(playwright@1.61.0)(puppeteer@25.2.0) + lodash.merge: 4.6.2 + nanoid: 3.3.11 + ow: 0.28.2 + p-limit: 3.1.0 + proxy-chain: 2.7.1 + quick-lru: 5.1.1 + tiny-typed-emitter: 2.1.0 + tslib: 2.8.1 + optionalDependencies: + playwright: 1.61.0 + puppeteer: 25.2.0 + transitivePeerDependencies: + - supports-color + + '@crawlee/browser-pool@3.16.0(playwright@1.61.1)(puppeteer@25.2.0)': + dependencies: + '@apify/log': 2.5.34 + '@apify/timeout': 0.3.2 + '@crawlee/core': 3.16.0 + '@crawlee/types': 3.16.0 + fingerprint-generator: 2.1.82 + fingerprint-injector: 2.1.82(playwright@1.61.1)(puppeteer@25.2.0) + lodash.merge: 4.6.2 + nanoid: 3.3.11 + ow: 0.28.2 + p-limit: 3.1.0 + proxy-chain: 2.7.1 + quick-lru: 5.1.1 + tiny-typed-emitter: 2.1.0 + tslib: 2.8.1 + optionalDependencies: + playwright: 1.61.1 + puppeteer: 25.2.0 + transitivePeerDependencies: + - supports-color + + '@crawlee/browser@3.16.0(playwright@1.59.1)(puppeteer@25.2.0)': + dependencies: + '@apify/timeout': 0.3.2 + '@crawlee/basic': 3.16.0 + '@crawlee/browser-pool': 3.16.0(playwright@1.59.1)(puppeteer@25.2.0) + '@crawlee/types': 3.16.0 + '@crawlee/utils': 3.16.0 + ow: 0.28.2 + tslib: 2.8.1 + type-fest: 4.41.0 + optionalDependencies: + playwright: 1.59.1 + puppeteer: 25.2.0 + transitivePeerDependencies: + - supports-color + '@crawlee/browser@3.16.0(playwright@1.61.0)(puppeteer@25.1.0)': dependencies: '@apify/timeout': 0.3.2 @@ -5574,6 +5712,38 @@ snapshots: transitivePeerDependencies: - supports-color + '@crawlee/browser@3.16.0(playwright@1.61.0)(puppeteer@25.2.0)': + dependencies: + '@apify/timeout': 0.3.2 + '@crawlee/basic': 3.16.0 + '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.2.0) + '@crawlee/types': 3.16.0 + '@crawlee/utils': 3.16.0 + ow: 0.28.2 + tslib: 2.8.1 + type-fest: 4.41.0 + optionalDependencies: + playwright: 1.61.0 + puppeteer: 25.2.0 + transitivePeerDependencies: + - supports-color + + '@crawlee/browser@3.16.0(playwright@1.61.1)(puppeteer@25.2.0)': + dependencies: + '@apify/timeout': 0.3.2 + '@crawlee/basic': 3.16.0 + '@crawlee/browser-pool': 3.16.0(playwright@1.61.1)(puppeteer@25.2.0) + '@crawlee/types': 3.16.0 + '@crawlee/utils': 3.16.0 + ow: 0.28.2 + tslib: 2.8.1 + type-fest: 4.41.0 + optionalDependencies: + playwright: 1.61.1 + puppeteer: 25.2.0 + transitivePeerDependencies: + - supports-color + '@crawlee/cheerio@3.16.0': dependencies: '@crawlee/http': 3.16.0 @@ -5624,7 +5794,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/core@4.0.0-beta.43': + '@crawlee/core@4.0.0-beta.25': dependencies: '@apify/consts': 2.52.0 '@apify/datastructures': 2.0.3 @@ -5632,9 +5802,9 @@ snapshots: '@apify/pseudo_url': 2.0.75 '@apify/timeout': 0.3.2 '@apify/utilities': 2.25.6 - '@crawlee/memory-storage': 4.0.0-beta.43 - '@crawlee/types': 4.0.0-beta.43 - '@crawlee/utils': 4.0.0-beta.43 + '@crawlee/memory-storage': 4.0.0-beta.25 + '@crawlee/types': 4.0.0-beta.25 + '@crawlee/utils': 4.0.0-beta.25 '@sapphire/async-queue': 1.5.5 '@vladfrangu/async_event_emitter': 2.4.7 csv-stringify: 6.7.0 @@ -5650,14 +5820,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/got-scraping-client@4.0.0-beta.43': + '@crawlee/got-scraping-client@4.0.0-beta.25': dependencies: - '@crawlee/http-client': 4.0.0-beta.43 + '@crawlee/http-client': 4.0.0-beta.25 got-scraping: 4.2.1 - '@crawlee/http-client@4.0.0-beta.43': + '@crawlee/http-client@4.0.0-beta.25': dependencies: - '@crawlee/types': 4.0.0-beta.43 + '@crawlee/types': 4.0.0-beta.25 + tough-cookie: 6.0.1 + + '@crawlee/http-client@4.0.0-beta.29': + dependencies: + '@apify/log': 2.5.34 + '@crawlee/types': 4.0.0-beta.29 tough-cookie: 6.0.1 '@crawlee/http@3.16.0': @@ -5679,14 +5855,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/http@4.0.0-beta.43': + '@crawlee/http@4.0.0-beta.25': dependencies: '@apify/timeout': 0.3.2 '@apify/utilities': 2.25.6 - '@crawlee/basic': 4.0.0-beta.43 - '@crawlee/http-client': 4.0.0-beta.43 - '@crawlee/types': 4.0.0-beta.43 - '@crawlee/utils': 4.0.0-beta.43 + '@crawlee/basic': 4.0.0-beta.25 + '@crawlee/http-client': 4.0.0-beta.25 + '@crawlee/types': 4.0.0-beta.25 + '@crawlee/utils': 4.0.0-beta.25 '@types/content-type': 1.1.9 cheerio: 1.2.0 content-type: 1.0.5 @@ -5698,12 +5874,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/impit-client@4.0.0-beta.43': + '@crawlee/impit-client@4.0.0-beta.29': dependencies: '@apify/datastructures': 2.0.3 - '@crawlee/http-client': 4.0.0-beta.43 - '@crawlee/types': 4.0.0-beta.43 - impit: 0.9.2 + '@crawlee/http-client': 4.0.0-beta.29 + impit: 0.8.2 tough-cookie: 6.0.1 '@crawlee/jsdom@3.16.0': @@ -5750,19 +5925,44 @@ snapshots: proper-lockfile: 4.1.2 tslib: 2.8.1 - '@crawlee/memory-storage@4.0.0-beta.43': + '@crawlee/memory-storage@4.0.0-beta.25': dependencies: - '@crawlee/types': 4.0.0-beta.43 + '@apify/log': 2.5.34 + '@crawlee/types': 4.0.0-beta.25 '@sapphire/async-queue': 1.5.5 '@sapphire/shapeshift': 4.0.0 content-type: 1.0.5 fs-extra: 11.3.4 json5: 2.2.3 mime-types: 3.0.2 - p-limit: 6.2.0 proper-lockfile: 4.1.2 tslib: 2.8.1 + '@crawlee/playwright@3.16.0(idcac-playwright@0.2.0)(playwright@1.59.1)(puppeteer@25.2.0)': + dependencies: + '@apify/datastructures': 2.0.3 + '@apify/log': 2.5.34 + '@apify/timeout': 0.3.2 + '@crawlee/browser': 3.16.0(playwright@1.59.1)(puppeteer@25.2.0) + '@crawlee/browser-pool': 3.16.0(playwright@1.59.1)(puppeteer@25.2.0) + '@crawlee/core': 3.16.0 + '@crawlee/types': 3.16.0 + '@crawlee/utils': 3.16.0 + cheerio: 1.0.0-rc.12 + jquery: 3.7.1 + lodash.isequal: 4.5.0 + ml-logistic-regression: 2.0.0 + ml-matrix: 6.12.1 + ow: 0.28.2 + string-comparison: 1.3.0 + tslib: 2.8.1 + optionalDependencies: + idcac-playwright: 0.2.0 + playwright: 1.59.1 + transitivePeerDependencies: + - puppeteer + - supports-color + '@crawlee/playwright@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0)': dependencies: '@apify/datastructures': 2.0.3 @@ -5788,6 +5988,31 @@ snapshots: - puppeteer - supports-color + '@crawlee/playwright@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.2.0)': + dependencies: + '@apify/datastructures': 2.0.3 + '@apify/log': 2.5.34 + '@apify/timeout': 0.3.2 + '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.2.0) + '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.2.0) + '@crawlee/core': 3.16.0 + '@crawlee/types': 3.16.0 + '@crawlee/utils': 3.16.0 + cheerio: 1.0.0-rc.12 + jquery: 3.7.1 + lodash.isequal: 4.5.0 + ml-logistic-regression: 2.0.0 + ml-matrix: 6.12.1 + ow: 0.28.2 + string-comparison: 1.3.0 + tslib: 2.8.1 + optionalDependencies: + idcac-playwright: 0.2.0 + playwright: 1.61.0 + transitivePeerDependencies: + - puppeteer + - supports-color + '@crawlee/puppeteer@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0)': dependencies: '@apify/datastructures': 2.0.3 @@ -5808,6 +6033,26 @@ snapshots: - playwright - supports-color + '@crawlee/puppeteer@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.2.0)': + dependencies: + '@apify/datastructures': 2.0.3 + '@apify/log': 2.5.34 + '@crawlee/browser': 3.16.0(playwright@1.61.1)(puppeteer@25.2.0) + '@crawlee/browser-pool': 3.16.0(playwright@1.61.1)(puppeteer@25.2.0) + '@crawlee/types': 3.16.0 + '@crawlee/utils': 3.16.0 + cheerio: 1.0.0-rc.12 + devtools-protocol: 0.0.1612613 + jquery: 3.7.1 + ow: 0.28.2 + tslib: 2.8.1 + optionalDependencies: + idcac-playwright: 0.2.0 + puppeteer: 25.2.0 + transitivePeerDependencies: + - playwright + - supports-color + '@crawlee/templates@3.16.0(@types/node@24.12.2)': dependencies: ansi-colors: 4.1.3 @@ -5822,7 +6067,12 @@ snapshots: dependencies: tslib: 2.8.1 - '@crawlee/types@4.0.0-beta.43': + '@crawlee/types@4.0.0-beta.25': + dependencies: + tough-cookie: 6.0.1 + tslib: 2.8.1 + + '@crawlee/types@4.0.0-beta.29': dependencies: tough-cookie: 6.0.1 tslib: 2.8.1 @@ -5844,11 +6094,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/utils@4.0.0-beta.43': + '@crawlee/utils@4.0.0-beta.25': dependencies: + '@apify/log': 2.5.34 '@apify/ps-tree': 1.2.0 - '@crawlee/http-client': 4.0.0-beta.43 - '@crawlee/types': 4.0.0-beta.43 + '@crawlee/http-client': 4.0.0-beta.25 + '@crawlee/types': 4.0.0-beta.25 '@types/sax': 1.2.7 cheerio: 1.2.0 domhandler: 5.0.3 @@ -6176,7 +6427,7 @@ snapshots: agent-base: 7.1.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 - lru-cache: 11.3.5 + lru-cache: 11.5.1 socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -6199,7 +6450,7 @@ snapshots: common-ancestor-path: 1.0.1 hosted-git-info: 9.0.2 json-stringify-nice: 1.1.4 - lru-cache: 11.3.5 + lru-cache: 11.5.1 minimatch: 10.2.5 nopt: 8.1.0 npm-install-checks: 7.1.2 @@ -6212,7 +6463,7 @@ snapshots: proggy: 3.0.0 promise-all-reject-late: 1.0.1 promise-call-limit: 3.0.2 - semver: 7.7.2 + semver: 7.7.4 ssri: 12.0.0 treeverse: 3.0.0 walk-up-path: 4.0.0 @@ -6221,11 +6472,11 @@ snapshots: '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.2 + semver: 7.7.4 '@npmcli/fs@5.0.0': dependencies: - semver: 7.7.2 + semver: 7.7.4 '@npmcli/git@6.0.3': dependencies: @@ -6235,7 +6486,7 @@ snapshots: npm-pick-manifest: 10.0.0 proc-log: 5.0.0 promise-retry: 2.0.1 - semver: 7.7.2 + semver: 7.7.4 which: 5.0.0 '@npmcli/git@7.0.2': @@ -6243,10 +6494,10 @@ snapshots: '@gar/promise-retry': 1.0.3 '@npmcli/promise-spawn': 9.0.1 ini: 6.0.0 - lru-cache: 11.3.5 + lru-cache: 11.5.1 npm-pick-manifest: 11.0.3 proc-log: 6.1.0 - semver: 7.7.2 + semver: 7.7.4 which: 6.0.1 '@npmcli/installed-package-contents@3.0.0': @@ -6272,7 +6523,7 @@ snapshots: json-parse-even-better-errors: 5.0.0 pacote: 21.5.0 proc-log: 6.1.0 - semver: 7.7.2 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -6291,7 +6542,7 @@ snapshots: hosted-git-info: 9.0.2 json-parse-even-better-errors: 5.0.0 proc-log: 6.1.0 - semver: 7.7.2 + semver: 7.7.4 validate-npm-package-license: 3.0.4 '@npmcli/promise-spawn@8.0.3': @@ -6328,7 +6579,7 @@ snapshots: enquirer: 2.3.6 minimatch: 10.2.4 nx: 22.6.5 - semver: 7.7.2 + semver: 7.7.4 tslib: 2.8.1 yargs-parser: 21.1.1 @@ -6568,6 +6819,11 @@ snapshots: modern-tar: 0.7.6 yargs: 17.7.2 + '@puppeteer/browsers@3.0.5': + dependencies: + modern-tar: 0.7.6 + yargs: 18.0.0 + '@rollup/rollup-android-arm-eabi@4.62.0': optional: true @@ -6961,9 +7217,9 @@ snapshots: '@apify/log': 2.5.34 '@apify/timeout': 0.3.2 '@apify/utilities': 2.25.6 - '@crawlee/core': 4.0.0-beta.43 - '@crawlee/types': 4.0.0-beta.43 - '@crawlee/utils': 4.0.0-beta.43 + '@crawlee/core': 4.0.0-beta.25 + '@crawlee/types': 4.0.0-beta.25 + '@crawlee/utils': 4.0.0-beta.25 apify-client: 2.22.3 fs-extra: 11.3.4 got-scraping: 4.2.1 @@ -7026,7 +7282,7 @@ snapshots: before-after-hook@2.2.3: {} - better-sqlite3@12.9.0: + better-sqlite3@12.11.1: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 @@ -7098,7 +7354,7 @@ snapshots: '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 glob: 13.0.6 - lru-cache: 11.3.5 + lru-cache: 11.5.1 minipass: 7.1.3 minipass-collect: 2.0.1 minipass-flush: 1.0.7 @@ -7147,18 +7403,18 @@ snapshots: camelcase@5.3.1: {} - camoufox-js@0.9.3(playwright-core@1.61.0): + camoufox-js@0.11.1(playwright-core@1.59.1): dependencies: adm-zip: 0.5.17 - better-sqlite3: 12.9.0 + better-sqlite3: 12.11.1 cli-progress: 3.12.0 commander: 14.0.3 fingerprint-generator: 2.1.82 glob: 13.0.6 - impit: 0.11.0 + impit: 0.14.2 language-tags: 2.1.0 maxmind: 5.0.6 - playwright-core: 1.61.0 + playwright-core: 1.59.1 pretty-bytes: 7.1.0 ua-parser-js: 2.0.9 xml2js: 0.6.2 @@ -7230,6 +7486,12 @@ snapshots: mitt: 3.0.1 zod: 3.25.76 + chromium-bidi@16.0.1(devtools-protocol@0.0.1638949): + dependencies: + devtools-protocol: 0.0.1638949 + mitt: 3.0.1 + zod: 3.25.76 + ci-info@3.9.0: {} ci-info@4.3.1: {} @@ -7273,6 +7535,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + clone@1.0.4: {} cmd-shim@6.0.3: {} @@ -7365,7 +7633,7 @@ snapshots: handlebars: 4.7.9 json-stringify-safe: 5.0.1 meow: 8.1.2 - semver: 7.7.2 + semver: 7.7.4 split: 1.0.1 conventional-commits-filter@3.0.0: @@ -7572,6 +7840,8 @@ snapshots: devtools-protocol@0.0.1624250: {} + devtools-protocol@0.0.1638949: {} + devtools-server@0.0.2: dependencies: async-retry: 1.3.3 @@ -7846,6 +8116,14 @@ snapshots: header-generator: 2.1.82 tslib: 2.8.1 + fingerprint-injector@2.1.82(playwright@1.59.1)(puppeteer@25.2.0): + dependencies: + fingerprint-generator: 2.1.82 + tslib: 2.8.1 + optionalDependencies: + playwright: 1.59.1 + puppeteer: 25.2.0 + fingerprint-injector@2.1.82(playwright@1.61.0)(puppeteer@25.1.0): dependencies: fingerprint-generator: 2.1.82 @@ -7854,6 +8132,22 @@ snapshots: playwright: 1.61.0 puppeteer: 25.1.0 + fingerprint-injector@2.1.82(playwright@1.61.0)(puppeteer@25.2.0): + dependencies: + fingerprint-generator: 2.1.82 + tslib: 2.8.1 + optionalDependencies: + playwright: 1.61.0 + puppeteer: 25.2.0 + + fingerprint-injector@2.1.82(playwright@1.61.1)(puppeteer@25.2.0): + dependencies: + fingerprint-generator: 2.1.82 + tslib: 2.8.1 + optionalDependencies: + playwright: 1.61.1 + puppeteer: 25.2.0 + flat@5.0.2: {} follow-redirects@1.16.0: {} @@ -7980,7 +8274,7 @@ snapshots: git-semver-tags@5.0.1: dependencies: meow: 8.1.2 - semver: 7.7.2 + semver: 7.7.4 git-up@7.0.0: dependencies: @@ -8121,7 +8415,7 @@ snapshots: hosted-git-info@9.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.5.1 html-encoding-sniffer@4.0.0: dependencies: @@ -8216,75 +8510,75 @@ snapshots: ignore@7.0.5: {} - impit-darwin-arm64@0.11.0: + impit-darwin-arm64@0.14.2: optional: true - impit-darwin-arm64@0.9.2: + impit-darwin-arm64@0.8.2: optional: true - impit-darwin-x64@0.11.0: + impit-darwin-x64@0.14.2: optional: true - impit-darwin-x64@0.9.2: + impit-darwin-x64@0.8.2: optional: true - impit-linux-arm64-gnu@0.11.0: + impit-linux-arm64-gnu@0.14.2: optional: true - impit-linux-arm64-gnu@0.9.2: + impit-linux-arm64-gnu@0.8.2: optional: true - impit-linux-arm64-musl@0.11.0: + impit-linux-arm64-musl@0.14.2: optional: true - impit-linux-arm64-musl@0.9.2: + impit-linux-arm64-musl@0.8.2: optional: true - impit-linux-x64-gnu@0.11.0: + impit-linux-x64-gnu@0.14.2: optional: true - impit-linux-x64-gnu@0.9.2: + impit-linux-x64-gnu@0.8.2: optional: true - impit-linux-x64-musl@0.11.0: + impit-linux-x64-musl@0.14.2: optional: true - impit-linux-x64-musl@0.9.2: + impit-linux-x64-musl@0.8.2: optional: true - impit-win32-arm64-msvc@0.11.0: + impit-win32-arm64-msvc@0.14.2: optional: true - impit-win32-arm64-msvc@0.9.2: + impit-win32-arm64-msvc@0.8.2: optional: true - impit-win32-x64-msvc@0.11.0: + impit-win32-x64-msvc@0.14.2: optional: true - impit-win32-x64-msvc@0.9.2: + impit-win32-x64-msvc@0.8.2: optional: true - impit@0.11.0: + impit@0.14.2: optionalDependencies: - impit-darwin-arm64: 0.11.0 - impit-darwin-x64: 0.11.0 - impit-linux-arm64-gnu: 0.11.0 - impit-linux-arm64-musl: 0.11.0 - impit-linux-x64-gnu: 0.11.0 - impit-linux-x64-musl: 0.11.0 - impit-win32-arm64-msvc: 0.11.0 - impit-win32-x64-msvc: 0.11.0 - - impit@0.9.2: + impit-darwin-arm64: 0.14.2 + impit-darwin-x64: 0.14.2 + impit-linux-arm64-gnu: 0.14.2 + impit-linux-arm64-musl: 0.14.2 + impit-linux-x64-gnu: 0.14.2 + impit-linux-x64-musl: 0.14.2 + impit-win32-arm64-msvc: 0.14.2 + impit-win32-x64-msvc: 0.14.2 + + impit@0.8.2: optionalDependencies: - impit-darwin-arm64: 0.9.2 - impit-darwin-x64: 0.9.2 - impit-linux-arm64-gnu: 0.9.2 - impit-linux-arm64-musl: 0.9.2 - impit-linux-x64-gnu: 0.9.2 - impit-linux-x64-musl: 0.9.2 - impit-win32-arm64-msvc: 0.9.2 - impit-win32-x64-msvc: 0.9.2 + impit-darwin-arm64: 0.8.2 + impit-darwin-x64: 0.8.2 + impit-linux-arm64-gnu: 0.8.2 + impit-linux-arm64-musl: 0.8.2 + impit-linux-x64-gnu: 0.8.2 + impit-linux-x64-musl: 0.8.2 + impit-win32-arm64-msvc: 0.8.2 + impit-win32-x64-msvc: 0.8.2 import-fresh@3.3.1: dependencies: @@ -8325,7 +8619,7 @@ snapshots: npm-package-arg: 13.0.1 promzard: 2.0.0 read: 4.1.0 - semver: 7.7.2 + semver: 7.7.4 validate-npm-package-license: 3.0.4 validate-npm-package-name: 6.0.2 @@ -8666,7 +8960,7 @@ snapshots: npm-package-arg: 13.0.1 npm-registry-fetch: 19.1.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.4 sigstore: 4.1.0 ssri: 12.0.0 transitivePeerDependencies: @@ -8764,8 +9058,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} - lru-cache@11.5.1: {} lru-cache@6.0.0: @@ -9016,7 +9308,7 @@ snapshots: make-fetch-happen: 15.0.2 nopt: 9.0.0 proc-log: 6.1.0 - semver: 7.7.2 + semver: 7.7.4 tar: 7.5.11 tinyglobby: 0.2.16 which: 6.0.1 @@ -9044,7 +9336,7 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.2 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-url@8.1.1: {} @@ -9059,11 +9351,11 @@ snapshots: npm-install-checks@7.1.2: dependencies: - semver: 7.7.2 + semver: 7.7.4 npm-install-checks@8.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.4 npm-normalize-package-bin@4.0.0: {} @@ -9073,14 +9365,14 @@ snapshots: dependencies: hosted-git-info: 8.1.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.4 validate-npm-package-name: 6.0.2 npm-package-arg@13.0.1: dependencies: hosted-git-info: 9.0.2 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.4 validate-npm-package-name: 6.0.2 npm-packlist@10.0.3: @@ -9093,14 +9385,14 @@ snapshots: npm-install-checks: 7.1.2 npm-normalize-package-bin: 4.0.0 npm-package-arg: 12.0.2 - semver: 7.7.2 + semver: 7.7.4 npm-pick-manifest@11.0.3: dependencies: npm-install-checks: 8.0.0 npm-normalize-package-bin: 5.0.0 npm-package-arg: 13.0.1 - semver: 7.7.2 + semver: 7.7.4 npm-registry-fetch@19.1.0: dependencies: @@ -9152,7 +9444,7 @@ snapshots: ora: 5.3.0 picocolors: 1.1.1 resolve.exports: 2.0.3 - semver: 7.7.2 + semver: 7.7.4 smol-toml: 1.6.1 string-width: 4.2.3 tar-stream: 2.2.0 @@ -9332,10 +9624,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@6.2.0: - dependencies: - yocto-queue: 1.2.2 - p-locate@2.0.0: dependencies: p-limit: 1.3.0 @@ -9498,7 +9786,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.5.1 minipass: 7.1.3 path-type@3.0.0: @@ -9527,14 +9815,32 @@ snapshots: dependencies: find-up: 4.1.0 + playwright-core@1.59.1: {} + playwright-core@1.61.0: {} + playwright-core@1.61.1: + optional: true + + playwright@1.59.1: + dependencies: + playwright-core: 1.59.1 + optionalDependencies: + fsevents: 2.3.2 + playwright@1.61.0: dependencies: playwright-core: 1.61.0 optionalDependencies: fsevents: 2.3.2 + playwright@1.61.1: + dependencies: + playwright-core: 1.61.1 + optionalDependencies: + fsevents: 2.3.2 + optional: true + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 @@ -9643,6 +9949,19 @@ snapshots: - proxy-agent - utf-8-validate + puppeteer-core@25.2.0: + dependencies: + '@puppeteer/browsers': 3.0.5 + chromium-bidi: 16.0.1(devtools-protocol@0.0.1638949) + devtools-protocol: 0.0.1638949 + typed-query-selector: 2.12.2 + webdriver-bidi-protocol: 0.4.2 + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - proxy-agent + - utf-8-validate + puppeteer@25.1.0: dependencies: '@puppeteer/browsers': 3.0.4 @@ -9656,6 +9975,19 @@ snapshots: - proxy-agent - utf-8-validate + puppeteer@25.2.0: + dependencies: + '@puppeteer/browsers': 3.0.5 + chromium-bidi: 16.0.1(devtools-protocol@0.0.1638949) + devtools-protocol: 0.0.1638949 + lilconfig: 3.1.3 + puppeteer-core: 25.2.0 + typed-query-selector: 2.12.2 + transitivePeerDependencies: + - bufferutil + - proxy-agent + - utf-8-validate + queue-microtask@1.2.3: {} quick-lru@4.0.1: {} @@ -10465,6 +10797,8 @@ snapshots: yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs@16.2.0: dependencies: cliui: 7.0.4 @@ -10485,9 +10819,16 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yocto-queue@0.1.0: {} + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 - yocto-queue@1.2.2: {} + yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6f7217ed..0d6c0e5b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -14,6 +14,7 @@ minimumReleaseAgeExclude: onlyBuiltDependencies: - "@playwright/browser-chromium" - "@swc/core" + - better-sqlite3 - camoufox-js - esbuild - playwright @@ -22,3 +23,11 @@ onlyBuiltDependencies: nodeLinker: hoisted linkWorkspacePackages: true preferWorkspacePackages: true + +# Sitemap Extractor is the only actor on Apify/Crawlee v4 beta. Other generic actors intentionally +# stay on Apify/Crawlee v3. apify@4 beta depends on @crawlee/* through broad beta ranges, so force +# its internal Crawlee packages to the same beta versions used directly by the sitemap actor. +overrides: + "apify@4.0.0-beta.12>@crawlee/core": "4.0.0-beta.25" + "apify@4.0.0-beta.12>@crawlee/types": "4.0.0-beta.25" + "apify@4.0.0-beta.12>@crawlee/utils": "4.0.0-beta.25" diff --git a/renovate.json b/renovate.json index 73f61b40..583d0e52 100644 --- a/renovate.json +++ b/renovate.json @@ -31,6 +31,50 @@ "got-scraping" ], "minimumReleaseAge": "0 days" + }, + { + "description": "Update the Sitemap Extractor Apify/Crawlee v4 beta stack together", + "matchManagers": ["npm", "pnpm"], + "matchFileNames": ["packages/actor-scraper/sitemap-scraper/package.json", "pnpm-workspace.yaml"], + "matchPackageNames": ["apify", "@crawlee/*"], + "groupName": "sitemap Crawlee v4 beta stack" + }, + { + "description": "Update the Camoufox image and its JS drivers as one tested stack", + "matchManagers": ["dockerfile", "npm"], + "matchFileNames": [ + "packages/actor-scraper/camoufox-scraper/Dockerfile", + "packages/actor-scraper/camoufox-scraper/package.json" + ], + "matchPackageNames": [ + "apify/actor-node-playwright-camoufox", + "camoufox-js", + "playwright", + "playwright-core" + ], + "groupName": "camoufox browser stack" + }, + { + "description": "Update the Playwright image and driver as one tested stack", + "matchManagers": ["dockerfile", "npm"], + "matchFileNames": [ + "packages/actor-scraper/playwright-scraper/Dockerfile", + "packages/actor-scraper/playwright-scraper/package.json" + ], + "matchPackageNames": ["apify/actor-node-playwright", "playwright"], + "groupName": "playwright browser stack" + }, + { + "description": "Update the Chrome image and Puppeteer drivers as one tested stack", + "matchManagers": ["dockerfile", "npm"], + "matchFileNames": [ + "packages/actor-scraper/puppeteer-scraper/Dockerfile", + "packages/actor-scraper/puppeteer-scraper/package.json", + "packages/actor-scraper/web-scraper/Dockerfile", + "packages/actor-scraper/web-scraper/package.json" + ], + "matchPackageNames": ["apify/actor-node-puppeteer-chrome", "puppeteer"], + "groupName": "puppeteer browser stack" } ], "schedule": ["every weekday"] diff --git a/scripts/build-actor-from-current-sha.mjs b/scripts/build-actor-from-current-sha.mjs new file mode 100644 index 00000000..589e3580 --- /dev/null +++ b/scripts/build-actor-from-current-sha.mjs @@ -0,0 +1,80 @@ +import { ApifyClient } from 'apify-client'; + +const TERMINAL_STATUSES = new Set(['SUCCEEDED', 'FAILED', 'TIMED-OUT', 'ABORTED']); + +function requiredEnv(name) { + const value = process.env[name]; + + if (!value) { + throw new Error(`Missing required environment variable: ${name}`); + } + + return value; +} + +const token = requiredEnv('APIFY_TOKEN'); +const actorId = requiredEnv('APIFY_ACTOR'); +const buildVersion = requiredEnv('BUILD_VERSION'); +const buildTag = requiredEnv('BUILD_TAG'); +const timeoutSecs = Number(process.env.APIFY_RELEASE_BUILD_TIMEOUT_SECS ?? 900); + +if (!Number.isInteger(timeoutSecs) || timeoutSecs <= 0) { + throw new Error(`APIFY_RELEASE_BUILD_TIMEOUT_SECS must be a positive integer, got "${timeoutSecs}"`); +} + +const client = new ApifyClient({ token }); +const actorClient = client.actor(actorId); +const versionClient = actorClient.version(buildVersion); + +const version = await versionClient.get(); + +if (!version) { + throw new Error(`Actor version "${buildVersion}" does not exist on "${actorId}"`); +} + +if (version.buildTag !== buildTag) { + throw new Error( + `Actor version "${buildVersion}" has build tag "${version.buildTag}", but the workflow requested "${buildTag}". ` + + 'Align the workflow matrix with the Actor version configuration before building.', + ); +} + +if (version.sourceType !== 'GIT_REPO') { + throw new Error( + `Actor version "${buildVersion}" uses sourceType "${version.sourceType}". This workflow only builds Git sources.`, + ); +} + +// We build the Actor's Git source EXACTLY as configured on the platform (repo + branch + folder), +// and only trigger the build + report its result here. We deliberately do NOT rewrite gitRepoUrl: +// Apify resolves the `#` fragment as a branch or tag name, never a raw commit SHA, so pinning +// to a SHA fails with "Could not find branch " (and dropping the `:` suffix builds the +// wrong directory). For exact-commit reproducibility, point the Actor's source at a release *tag*. +console.log( + `Building ${actorId} version ${buildVersion} (tag ${buildTag}) from ${version.gitRepoUrl ?? ''}`, +); + +const build = await actorClient.build(buildVersion, { tag: buildTag }); + +console.log(`Triggered build ${build.id} (${actorId}, version ${buildVersion}, tag ${buildTag})`); + +const finishedBuild = await client.build(build.id).waitForFinish({ waitSecs: timeoutSecs }); +const status = finishedBuild?.status ?? ''; + +console.log(`Build ${build.id}: ${status}`); + +if (!TERMINAL_STATUSES.has(status)) { + throw new Error(`Timed out waiting for build ${build.id}; last status was ${status}`); +} + +if (status !== 'SUCCEEDED') { + const buildLog = await client.build(build.id).log().get({ raw: true }); + + if (buildLog) { + console.log(buildLog); + } + + throw new Error(`Build ${build.id} ended as ${status}`); +} + +console.log(`Build ${build.id} SUCCEEDED`); From 21d66fc798d4243c248a69411ff929396142d148 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Thu, 25 Jun 2026 09:07:33 +0200 Subject: [PATCH 10/14] ci: clean up release workflow, drop non-schema top-level description, quote $GITHUB_ENV --- .github/workflows/release-generic-actors.yaml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release-generic-actors.yaml b/.github/workflows/release-generic-actors.yaml index e944feeb..08047723 100644 --- a/.github/workflows/release-generic-actors.yaml +++ b/.github/workflows/release-generic-actors.yaml @@ -1,5 +1,4 @@ name: Build generic Actors -description: Build generic Actors and push them to Apify on: workflow_dispatch: @@ -138,14 +137,14 @@ jobs: if: matrix.settings.should-build == 'true' run: | if [ "${{ github.event.inputs.build-channel }}" = "stable" ]; then - echo "version=${{ matrix.settings.stable-version }}" >> $GITHUB_ENV - echo "build-tag=${{ matrix.settings.stable-build-tag }}" >> $GITHUB_ENV + echo "version=${{ matrix.settings.stable-version }}" >> "$GITHUB_ENV" + echo "build-tag=${{ matrix.settings.stable-build-tag }}" >> "$GITHUB_ENV" elif [ "${{ github.event.inputs.build-channel }}" = "development" ]; then - echo "version=${{ matrix.settings.development-version }}" >> $GITHUB_ENV - echo "build-tag=${{ matrix.settings.development-build-tag }}" >> $GITHUB_ENV + echo "version=${{ matrix.settings.development-version }}" >> "$GITHUB_ENV" + echo "build-tag=${{ matrix.settings.development-build-tag }}" >> "$GITHUB_ENV" else - echo "version=${{ github.event.inputs.version }}" >> $GITHUB_ENV - echo "build-tag=${{ github.event.inputs.build-tag }}" >> $GITHUB_ENV + echo "version=${{ github.event.inputs.version }}" >> "$GITHUB_ENV" + echo "build-tag=${{ github.event.inputs.build-tag }}" >> "$GITHUB_ENV" fi - name: Build ${{ matrix.settings.actor }} from current Git SHA From cc0d0754615c0c559f76fece23a6cd926e80804a Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Thu, 25 Jun 2026 15:05:29 +0200 Subject: [PATCH 11/14] chore(ci): rename release build script to trigger-apify-build, drop SHA leftovers --- .github/workflows/release-generic-actors.yaml | 5 ++--- ...ld-actor-from-current-sha.mjs => trigger-apify-build.mjs} | 5 ----- 2 files changed, 2 insertions(+), 8 deletions(-) rename scripts/{build-actor-from-current-sha.mjs => trigger-apify-build.mjs} (82%) diff --git a/.github/workflows/release-generic-actors.yaml b/.github/workflows/release-generic-actors.yaml index 08047723..ffea7c34 100644 --- a/.github/workflows/release-generic-actors.yaml +++ b/.github/workflows/release-generic-actors.yaml @@ -147,15 +147,14 @@ jobs: echo "build-tag=${{ github.event.inputs.build-tag }}" >> "$GITHUB_ENV" fi - - name: Build ${{ matrix.settings.actor }} from current Git SHA + - name: Build ${{ matrix.settings.actor }} on Apify (Git source) if: matrix.settings.should-build == 'true' env: APIFY_TOKEN: ${{ secrets.APIFY_ACTOR_BUILD_TOKEN }} APIFY_ACTOR: ${{ matrix.settings.apify-actor }} BUILD_VERSION: ${{ env.version }} BUILD_TAG: ${{ env.build-tag }} - GIT_COMMIT_SHA: ${{ github.sha }} APIFY_RELEASE_BUILD_TIMEOUT_SECS: "900" run: | set -euo pipefail - node scripts/build-actor-from-current-sha.mjs + node scripts/trigger-apify-build.mjs diff --git a/scripts/build-actor-from-current-sha.mjs b/scripts/trigger-apify-build.mjs similarity index 82% rename from scripts/build-actor-from-current-sha.mjs rename to scripts/trigger-apify-build.mjs index 589e3580..e80b71f2 100644 --- a/scripts/build-actor-from-current-sha.mjs +++ b/scripts/trigger-apify-build.mjs @@ -45,11 +45,6 @@ if (version.sourceType !== 'GIT_REPO') { ); } -// We build the Actor's Git source EXACTLY as configured on the platform (repo + branch + folder), -// and only trigger the build + report its result here. We deliberately do NOT rewrite gitRepoUrl: -// Apify resolves the `#` fragment as a branch or tag name, never a raw commit SHA, so pinning -// to a SHA fails with "Could not find branch " (and dropping the `:` suffix builds the -// wrong directory). For exact-commit reproducibility, point the Actor's source at a release *tag*. console.log( `Building ${actorId} version ${buildVersion} (tag ${buildTag}) from ${version.gitRepoUrl ?? ''}`, ); From 8e88775cd33f51b8856fc77a324abd5cc398c381 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Fri, 26 Jun 2026 12:58:11 +0200 Subject: [PATCH 12/14] fix(deps): dedupe puppeteer to a single 25.2.0, revert type workarounds --- .gitignore | 1 - .npmrc | 1 - package.json | 2 +- .../src/internals/crawler_setup.ts | 6 +- .../src/internals/crawler_setup.ts | 3 +- .../src/internals/crawler_setup.ts | 16 +- pnpm-lock.yaml | 158 ++---------------- 7 files changed, 26 insertions(+), 161 deletions(-) delete mode 100644 .npmrc diff --git a/.gitignore b/.gitignore index 6c3c6516..b5a464c7 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ pids .vscode yarn.lock .yarn -# npm locks are generated locally in actor dirs (the monorepo uses pnpm-lock.yaml) tmp jsconfig.json types diff --git a/.npmrc b/.npmrc deleted file mode 100644 index de20ab6b..00000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -inject-workspace-packages=false diff --git a/package.json b/package.json index 2f446f3b..a9c77413 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "oxlint": "1.62.0", "oxlint-tsgolint": "0.22.0", "playwright": "^1.61.0", - "puppeteer": "^25.1.0", + "puppeteer": "25.2.0", "rimraf": "^6.0.1", "tsx": "^4.16.5", "turbo": "2.9.1", diff --git a/packages/actor-scraper/camoufox-scraper/src/internals/crawler_setup.ts b/packages/actor-scraper/camoufox-scraper/src/internals/crawler_setup.ts index 032f5a21..deb81782 100644 --- a/packages/actor-scraper/camoufox-scraper/src/internals/crawler_setup.ts +++ b/packages/actor-scraper/camoufox-scraper/src/internals/crawler_setup.ts @@ -200,8 +200,10 @@ export class CrawlerSetup implements CrawlerSetupOptions { ...this.input, humanize: this.input.humanize ? Number(this.input.humanize) : 0, }), - // camoufox-js launch options intentionally diverge from Playwright's, and the pinned - // playwright-core type identity differs from @crawlee/playwright's — cast through unknown. + // `firefox` and @crawlee/playwright's PlaywrightLaunchContext resolve to two different + // playwright-core copies (camoufox pins playwright 1.59.1 to match its base image, + // while the rest of the workspace is on 1.61.0), so the BrowserType identities don't + // line up. This is a workspace dual-install, not a camoufox-js/crawlee issue. } as unknown as PlaywrightLaunchContext, useSessionPool: true, persistCookiesPerSession: true, diff --git a/packages/actor-scraper/puppeteer-scraper/src/internals/crawler_setup.ts b/packages/actor-scraper/puppeteer-scraper/src/internals/crawler_setup.ts index 4395b5ea..e9f5451c 100644 --- a/packages/actor-scraper/puppeteer-scraper/src/internals/crawler_setup.ts +++ b/packages/actor-scraper/puppeteer-scraper/src/internals/crawler_setup.ts @@ -17,6 +17,7 @@ import { sleep } from '@crawlee/utils'; import type { ApifyEnv } from 'apify'; import { Actor } from 'apify'; import { getInjectableScript } from 'idcac-playwright'; +import type { HTTPResponse } from 'puppeteer'; import type { CrawlerSetupOptions, RequestMetadata } from '@apify/scraper-tools'; import { browserTools, constants as scraperToolsConstants, createContext, tools } from '@apify/scraper-tools'; @@ -436,7 +437,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { private async _handleResult( request: Request, - response?: PuppeteerCrawlingContext['response'], + response?: HTTPResponse, pageFunctionResult?: Dictionary, isError?: boolean, ) { diff --git a/packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts b/packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts index ef7c9dbb..88813605 100644 --- a/packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts +++ b/packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts @@ -23,6 +23,7 @@ import { } from '@crawlee/puppeteer'; import type { ApifyEnv } from 'apify'; import { Actor } from 'apify'; +import type { HTTPResponse, Page } from 'puppeteer'; import contentType from 'content-type'; // @ts-expect-error no typings import DevToolsServer from 'devtools-server'; @@ -43,8 +44,6 @@ const MAX_CONCURRENCY_IN_DEVELOPMENT = 1; const { SESSION_MAX_USAGE_COUNTS, DEFAULT_VIEWPORT, DEVTOOLS_TIMEOUT_SECS, META_KEY } = scraperToolsConstants; const SCHEMA = JSON.parse(await readFile(new URL('../../INPUT_SCHEMA.json', import.meta.url), 'utf8')); -type CrawleePuppeteerPage = PuppeteerCrawlingContext['page']; - interface PageContext { apifyNamespace: string; skipLinks: boolean; @@ -85,7 +84,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { /** * Used to store page specific data. */ - pageContexts = new WeakMap(); + pageContexts = new WeakMap(); blockedUrlPatterns: string[] = []; isDevRun: boolean; @@ -624,7 +623,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { private async _handleResult( request: Request, - response?: PuppeteerCrawlingContext['response'], + response?: HTTPResponse, pageFunctionResult?: Dictionary, isError?: boolean, ) { @@ -635,7 +634,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { tools.logPerformance(request, 'handleResult EXECUTION', start); } - private async _assertNamespace(page: CrawleePuppeteerPage, namespace: string) { + private async _assertNamespace(page: Page, namespace: string) { try { await page.waitForFunction( (nmspc: string) => !!window[nmspc], @@ -655,10 +654,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { } } - private async _waitForLoadEventWhenXml( - page: CrawleePuppeteerPage, - response?: PuppeteerCrawlingContext['response'], - ) { + private async _waitForLoadEventWhenXml(page: Page, response?: HTTPResponse) { // Response can sometimes be null. if (!response) return; @@ -687,7 +683,7 @@ export class CrawlerSetup implements CrawlerSetupOptions { } } - private async _injectBrowserHandles(page: CrawleePuppeteerPage, pageContext: PageContext) { + private async _injectBrowserHandles(page: Page, pageContext: PageContext) { const saveSnapshotP = browserTools.createBrowserHandle(page, async () => browserTools.saveSnapshot({ page })); const skipLinksP = browserTools.createBrowserHandle(page, () => { pageContext.skipLinks = true; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49754b1d..b6c47600 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,7 +66,7 @@ importers: version: 20.5.0(@types/node@24.12.2)(conventional-commits-parser@6.4.0)(typescript@5.9.3) crawlee: specifier: ^3.16.0 - version: 3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) + version: 3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.2.0) fs-extra: specifier: ^11.2.0 version: 11.3.4 @@ -98,8 +98,8 @@ importers: specifier: ^1.61.0 version: 1.61.0 puppeteer: - specifier: ^25.1.0 - version: 25.1.0 + specifier: 25.2.0 + version: 25.2.0 rimraf: specifier: ^6.0.1 version: 6.1.3 @@ -1592,16 +1592,6 @@ packages: resolution: {integrity: sha512-bBGzN+jow5uQtYRDCnFv5cpyMjUYTF6WnsfRRrDXIwbaGDtdh0JdOPmlKdJH4OK7TbkrZ35cV7jhQ1zELoX5ew==} engines: {node: '>=18'} - '@puppeteer/browsers@3.0.4': - resolution: {integrity: sha512-HGM8iAmGTf+Y7t0373szVbTmt3d7vPkYL/1bpOkOFO0YUYLgSeuYBCzESklogNPvOBnZ/MRD5f07OkpqH1trtA==} - engines: {node: '>=22.12.0'} - hasBin: true - peerDependencies: - proxy-agent: '>=8.0.1' - peerDependenciesMeta: - proxy-agent: - optional: true - '@puppeteer/browsers@3.0.5': resolution: {integrity: sha512-xYXNuEQmHNIPWWcbL/skf2KF7seyp7c1xmKFRk3wmdFx7VwBsKVrtOLKs8ecaezsKPsWeF1YsgwIiElAscaryA==} engines: {node: '>=22.12.0'} @@ -2609,9 +2599,6 @@ packages: devtools-protocol@0.0.1612613: resolution: {integrity: sha512-hp32aOyalF3vGZiTPA3CiKCgpIH7QOj+S0dRVMmEReagtmWQYigiCQWp7OGWrgaW2IHNlSzCwfDneZe16DlBCQ==} - devtools-protocol@0.0.1624250: - resolution: {integrity: sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA==} - devtools-protocol@0.0.1638949: resolution: {integrity: sha512-mXwg4Fqnv0WR4iuAT/gYUmctNkjILwXFHyZ+m7Ty1dfr0ezZt2U3gnrrJTfRobJTHoXf+IbuFvFITzLrLFjwJA==} @@ -4396,19 +4383,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@25.1.0: - resolution: {integrity: sha512-jKzy5y4WG6uNuFbTWgW1D7mqoT9o0nllc/6a1DGF775T1mPmgw3scdFEtEq67yVFikavQmbYq6NLfbTfxHSlqQ==} - engines: {node: '>=22.12.0'} - puppeteer-core@25.2.0: resolution: {integrity: sha512-jGhuGAlkgOcbyGRc0Cm9b/y4vvqoxhyAyl6a1diVe8F3sHsgTaQ60QQT5F3rGegTZV3prysgHVc+0LsvPZo3GA==} engines: {node: '>=22.12.0'} - puppeteer@25.1.0: - resolution: {integrity: sha512-7L6/0JM7XStK99lIL4xQySyNEXNfII6pk0BxkI5kKBTOhR7AsoQiv067YTsE/rIXxQiq9ajlO4WcqBjS/FWK1A==} - engines: {node: '>=22.12.0'} - hasBin: true - puppeteer@25.2.0: resolution: {integrity: sha512-JPMPd/2+lgdkLhEyPqH895oR3ccMt1wSra6oewgjjTuLmo2s9zPZpKXQTFEIiA/fMKpiL01kjU3+2zPEReRWNg==} engines: {node: '>=22.12.0'} @@ -5614,28 +5592,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/browser-pool@3.16.0(playwright@1.61.0)(puppeteer@25.1.0)': - dependencies: - '@apify/log': 2.5.34 - '@apify/timeout': 0.3.2 - '@crawlee/core': 3.16.0 - '@crawlee/types': 3.16.0 - fingerprint-generator: 2.1.82 - fingerprint-injector: 2.1.82(playwright@1.61.0)(puppeteer@25.1.0) - lodash.merge: 4.6.2 - nanoid: 3.3.11 - ow: 0.28.2 - p-limit: 3.1.0 - proxy-chain: 2.7.1 - quick-lru: 5.1.1 - tiny-typed-emitter: 2.1.0 - tslib: 2.8.1 - optionalDependencies: - playwright: 1.61.0 - puppeteer: 25.1.0 - transitivePeerDependencies: - - supports-color - '@crawlee/browser-pool@3.16.0(playwright@1.61.0)(puppeteer@25.2.0)': dependencies: '@apify/log': 2.5.34 @@ -5696,22 +5652,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/browser@3.16.0(playwright@1.61.0)(puppeteer@25.1.0)': - dependencies: - '@apify/timeout': 0.3.2 - '@crawlee/basic': 3.16.0 - '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) - '@crawlee/types': 3.16.0 - '@crawlee/utils': 3.16.0 - ow: 0.28.2 - tslib: 2.8.1 - type-fest: 4.41.0 - optionalDependencies: - playwright: 1.61.0 - puppeteer: 25.1.0 - transitivePeerDependencies: - - supports-color - '@crawlee/browser@3.16.0(playwright@1.61.0)(puppeteer@25.2.0)': dependencies: '@apify/timeout': 0.3.2 @@ -5963,31 +5903,6 @@ snapshots: - puppeteer - supports-color - '@crawlee/playwright@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0)': - dependencies: - '@apify/datastructures': 2.0.3 - '@apify/log': 2.5.34 - '@apify/timeout': 0.3.2 - '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) - '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) - '@crawlee/core': 3.16.0 - '@crawlee/types': 3.16.0 - '@crawlee/utils': 3.16.0 - cheerio: 1.0.0-rc.12 - jquery: 3.7.1 - lodash.isequal: 4.5.0 - ml-logistic-regression: 2.0.0 - ml-matrix: 6.12.1 - ow: 0.28.2 - string-comparison: 1.3.0 - tslib: 2.8.1 - optionalDependencies: - idcac-playwright: 0.2.0 - playwright: 1.61.0 - transitivePeerDependencies: - - puppeteer - - supports-color - '@crawlee/playwright@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.2.0)': dependencies: '@apify/datastructures': 2.0.3 @@ -6013,12 +5928,12 @@ snapshots: - puppeteer - supports-color - '@crawlee/puppeteer@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0)': + '@crawlee/puppeteer@3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.2.0)': dependencies: '@apify/datastructures': 2.0.3 '@apify/log': 2.5.34 - '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) - '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) + '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.2.0) + '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.2.0) '@crawlee/types': 3.16.0 '@crawlee/utils': 3.16.0 cheerio: 1.0.0-rc.12 @@ -6028,7 +5943,7 @@ snapshots: tslib: 2.8.1 optionalDependencies: idcac-playwright: 0.2.0 - puppeteer: 25.1.0 + puppeteer: 25.2.0 transitivePeerDependencies: - playwright - supports-color @@ -6814,11 +6729,6 @@ snapshots: dependencies: playwright-core: 1.61.0 - '@puppeteer/browsers@3.0.4': - dependencies: - modern-tar: 0.7.6 - yargs: 17.7.2 - '@puppeteer/browsers@3.0.5': dependencies: modern-tar: 0.7.6 @@ -7480,12 +7390,6 @@ snapshots: chownr@3.0.0: {} - chromium-bidi@16.0.1(devtools-protocol@0.0.1624250): - dependencies: - devtools-protocol: 0.0.1624250 - mitt: 3.0.1 - zod: 3.25.76 - chromium-bidi@16.0.1(devtools-protocol@0.0.1638949): dependencies: devtools-protocol: 0.0.1638949 @@ -7694,26 +7598,26 @@ snapshots: optionalDependencies: typescript: 5.9.3 - crawlee@3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0): + crawlee@3.16.0(@types/node@24.12.2)(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.2.0): dependencies: '@crawlee/basic': 3.16.0 - '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) - '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.1.0) + '@crawlee/browser': 3.16.0(playwright@1.61.0)(puppeteer@25.2.0) + '@crawlee/browser-pool': 3.16.0(playwright@1.61.0)(puppeteer@25.2.0) '@crawlee/cheerio': 3.16.0 '@crawlee/cli': 3.16.0(@types/node@24.12.2) '@crawlee/core': 3.16.0 '@crawlee/http': 3.16.0 '@crawlee/jsdom': 3.16.0 '@crawlee/linkedom': 3.16.0 - '@crawlee/playwright': 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) - '@crawlee/puppeteer': 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.1.0) + '@crawlee/playwright': 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.2.0) + '@crawlee/puppeteer': 3.16.0(idcac-playwright@0.2.0)(playwright@1.61.0)(puppeteer@25.2.0) '@crawlee/utils': 3.16.0 import-local: 3.2.0 tslib: 2.8.1 optionalDependencies: idcac-playwright: 0.2.0 playwright: 1.61.0 - puppeteer: 25.1.0 + puppeteer: 25.2.0 transitivePeerDependencies: - '@types/node' - bufferutil @@ -7838,8 +7742,6 @@ snapshots: devtools-protocol@0.0.1612613: {} - devtools-protocol@0.0.1624250: {} - devtools-protocol@0.0.1638949: {} devtools-server@0.0.2: @@ -8124,14 +8026,6 @@ snapshots: playwright: 1.59.1 puppeteer: 25.2.0 - fingerprint-injector@2.1.82(playwright@1.61.0)(puppeteer@25.1.0): - dependencies: - fingerprint-generator: 2.1.82 - tslib: 2.8.1 - optionalDependencies: - playwright: 1.61.0 - puppeteer: 25.1.0 - fingerprint-injector@2.1.82(playwright@1.61.0)(puppeteer@25.2.0): dependencies: fingerprint-generator: 2.1.82 @@ -9936,19 +9830,6 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@25.1.0: - dependencies: - '@puppeteer/browsers': 3.0.4 - chromium-bidi: 16.0.1(devtools-protocol@0.0.1624250) - devtools-protocol: 0.0.1624250 - typed-query-selector: 2.12.2 - webdriver-bidi-protocol: 0.4.2 - ws: 8.21.0 - transitivePeerDependencies: - - bufferutil - - proxy-agent - - utf-8-validate - puppeteer-core@25.2.0: dependencies: '@puppeteer/browsers': 3.0.5 @@ -9962,19 +9843,6 @@ snapshots: - proxy-agent - utf-8-validate - puppeteer@25.1.0: - dependencies: - '@puppeteer/browsers': 3.0.4 - chromium-bidi: 16.0.1(devtools-protocol@0.0.1624250) - devtools-protocol: 0.0.1624250 - lilconfig: 3.1.3 - puppeteer-core: 25.1.0 - typed-query-selector: 2.12.2 - transitivePeerDependencies: - - bufferutil - - proxy-agent - - utf-8-validate - puppeteer@25.2.0: dependencies: '@puppeteer/browsers': 3.0.5 From 9d914a003b56c363641966a8a18d39086e4835e7 Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Fri, 26 Jun 2026 13:36:06 +0200 Subject: [PATCH 13/14] refactor(docker): pin browser drivers to base image instead of stripping them --- .../actor-scraper/camoufox-scraper/Dockerfile | 36 +++++++------------ .../playwright-scraper/Dockerfile | 27 +++++--------- .../puppeteer-scraper/Dockerfile | 26 +++++--------- packages/actor-scraper/web-scraper/Dockerfile | 26 +++++--------- 4 files changed, 40 insertions(+), 75 deletions(-) diff --git a/packages/actor-scraper/camoufox-scraper/Dockerfile b/packages/actor-scraper/camoufox-scraper/Dockerfile index 31dc7c25..6a5c00f6 100644 --- a/packages/actor-scraper/camoufox-scraper/Dockerfile +++ b/packages/actor-scraper/camoufox-scraper/Dockerfile @@ -1,11 +1,11 @@ # Build context is the monorepo root (dockerContextDir in .actor/actor.json), so the build uses the # root pnpm-lock.yaml for a deterministic install. # -# Browser determinism comes from pinning the base image by DIGEST below: the Camoufox binary AND the -# playwright/camoufox-js drivers that match it both live in the base and are frozen together by the -# digest. The actor does NOT ship its own browser drivers — they're dropped from the deploy bundle -# and resolved from the base at runtime, so driver and binary can never drift. Tag 24-1.59.1 is the -# newest Camoufox base that survives page JS errors (24-1.60.0 crashes the process on them). +# The base is pinned by digest (reproducible Camoufox binary + OS deps). The actor pins playwright and +# camoufox-js to the versions this base ships (24-1.59.1 -> playwright 1.59.1, camoufox-js 0.11.1) and +# bundles them, so the bundled drivers match the Camoufox binary they drive. The binary itself lives in +# ~/.cache/camoufox (outside node_modules) and stays in the base. Tag 24-1.59.1 is the newest Camoufox +# base that survives page JS errors (24-1.60.0 crashes the process on them). FROM apify/actor-node-playwright-camoufox:24-1.59.1@sha256:eadc96fa9492284eb45ef70b6b91c841fae7f142d25a22ae2887a21bb78b3469 AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. @@ -24,31 +24,21 @@ COPY . ./ # Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. RUN pnpm install --frozen-lockfile --filter actor-camoufox-scraper... -# Build the actor and its workspace dependency @apify/scraper-tools (playwright/camoufox-js are needed -# here for type-checking only; the runtime copies come from the base — see below). +# Build the actor and its workspace dependency @apify/scraper-tools. RUN pnpm --filter actor-camoufox-scraper... build # Self-contained production bundle; inject-workspace-packages copies the built @apify/scraper-tools -# into node_modules instead of symlinking it. +# into node_modules instead of symlinking it. The native better-sqlite3 binding (a camoufox-js dep) is +# compiled here against the base's Node 24, and the runtime stage uses that same base, so it matches. RUN pnpm --config.inject-workspace-packages=true --filter actor-camoufox-scraper deploy --prod /deploy -# Drop the bundle's browser drivers so the runtime resolves them from the base image, where they are -# guaranteed to match the Camoufox binary. This is what keeps driver and binary in lockstep. -RUN rm -rf \ - /deploy/node_modules/playwright \ - /deploy/node_modules/playwright-core \ - /deploy/node_modules/camoufox-js \ - /deploy/node_modules/better-sqlite3 \ - /deploy/node_modules/.bin/playwright \ - /deploy/node_modules/.bin/playwright-core \ - /deploy/node_modules/.bin/camoufox-js - FROM apify/actor-node-playwright-camoufox:24-1.59.1@sha256:eadc96fa9492284eb45ef70b6b91c841fae7f142d25a22ae2887a21bb78b3469 -# Base WORKDIR is /home/myuser and ships the browser stack in node_modules plus the Xvfb entrypoint. -# Place the app in a child directory so the drivers dropped above resolve up to the base's copies. -COPY --from=builder --chown=myuser /deploy ./app -WORKDIR /home/myuser/app +# Base WORKDIR is /home/myuser and ships the Xvfb entrypoint plus the Camoufox binary in +# ~/.cache/camoufox (outside node_modules). Replace only the template node_modules with the lean +# production bundle (which carries the matching playwright + camoufox-js); the binary stays in the base. +RUN rm -rf node_modules +COPY --from=builder --chown=myuser /deploy ./ ENV APIFY_DISABLE_OUTDATED_WARNING=1 diff --git a/packages/actor-scraper/playwright-scraper/Dockerfile b/packages/actor-scraper/playwright-scraper/Dockerfile index 1e818cca..38fd7539 100644 --- a/packages/actor-scraper/playwright-scraper/Dockerfile +++ b/packages/actor-scraper/playwright-scraper/Dockerfile @@ -1,10 +1,9 @@ # Build context is the monorepo root (dockerContextDir in .actor/actor.json), so the build uses the # root pnpm-lock.yaml for a deterministic install. # -# Browser determinism comes from pinning the base image by DIGEST below: the Chromium binary AND the -# matching Playwright driver both live in the base and are frozen together by the digest. The actor -# does NOT ship its own Playwright — it's dropped from the deploy bundle and resolved from the base at -# runtime, so driver and binary can never drift. +# The base is pinned by digest (reproducible Chromium + OS deps). The actor pins playwright to the +# version this base ships (24-1.61.0 -> playwright 1.61.0) and bundles it, so the bundled driver +# matches the Chromium binary it drives. Renovate bumps the base digest and the playwright pin together. FROM apify/actor-node-playwright:24-1.61.0@sha256:5c0155bb5a0a90572ef021c2b4e2e195c50971e0c1ae00f081ffa47e62036c60 AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. @@ -23,28 +22,20 @@ COPY . ./ # Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. RUN pnpm install --frozen-lockfile --filter actor-playwright-scraper... -# Build the actor and its workspace dependency @apify/scraper-tools (playwright is needed here for -# type-checking only; the runtime copy comes from the base — see below). +# Build the actor and its workspace dependency @apify/scraper-tools. RUN pnpm --filter actor-playwright-scraper... build # Self-contained production bundle; inject-workspace-packages copies the built @apify/scraper-tools # into node_modules instead of symlinking it. RUN pnpm --config.inject-workspace-packages=true --filter actor-playwright-scraper deploy --prod /deploy -# Drop the bundle's Playwright so the runtime resolves it from the base image, where it matches the -# Chromium binary. This is what keeps driver and binary in lockstep. -RUN rm -rf \ - /deploy/node_modules/playwright \ - /deploy/node_modules/playwright-core \ - /deploy/node_modules/.bin/playwright \ - /deploy/node_modules/.bin/playwright-core - FROM apify/actor-node-playwright:24-1.61.0@sha256:5c0155bb5a0a90572ef021c2b4e2e195c50971e0c1ae00f081ffa47e62036c60 -# Base WORKDIR is /home/myuser and ships the browser stack in node_modules plus the Xvfb entrypoint. -# Place the app in a child directory so the driver dropped above resolves up to the base's copy. -COPY --from=builder --chown=myuser /deploy ./app -WORKDIR /home/myuser/app +# Base WORKDIR is /home/myuser and ships the browser plus the Xvfb entrypoint. Replace only the +# template node_modules with the lean production bundle (which carries the matching playwright); the +# browser binary itself stays in the base image. +RUN rm -rf node_modules +COPY --from=builder --chown=myuser /deploy ./ ENV APIFY_DISABLE_OUTDATED_WARNING=1 diff --git a/packages/actor-scraper/puppeteer-scraper/Dockerfile b/packages/actor-scraper/puppeteer-scraper/Dockerfile index 2c70e36d..733f1aca 100644 --- a/packages/actor-scraper/puppeteer-scraper/Dockerfile +++ b/packages/actor-scraper/puppeteer-scraper/Dockerfile @@ -1,10 +1,9 @@ # Build context is the monorepo root (dockerContextDir in .actor/actor.json), so the build uses the # root pnpm-lock.yaml for a deterministic install. # -# Browser determinism comes from pinning the base image by DIGEST below: the Chrome binary AND the -# matching Puppeteer driver both live in the base and are frozen together by the digest. The actor -# does NOT ship its own Puppeteer — it's dropped from the deploy bundle and resolved from the base at -# runtime, so driver and binary can never drift. +# The base is pinned by digest (reproducible Chrome + OS deps). The actor pins puppeteer to the version +# this base ships (24-25.2.0 -> puppeteer 25.2.0) and bundles it, so the bundled driver matches the +# Chrome binary it drives. Renovate bumps the base digest and the puppeteer pin together. FROM apify/actor-node-puppeteer-chrome:24-25.2.0@sha256:e9f588cd827e542bdc7b476be7dd3ba87b8ca3b4136e2e081e5fa0e3c940d50d AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. @@ -23,27 +22,20 @@ COPY . ./ # Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. RUN pnpm install --frozen-lockfile --filter actor-puppeteer-scraper... -# Build the actor and its workspace dependency @apify/scraper-tools (puppeteer is needed here for -# type-checking only; the runtime copy comes from the base — see below). +# Build the actor and its workspace dependency @apify/scraper-tools. RUN pnpm --filter actor-puppeteer-scraper... build # Self-contained production bundle; inject-workspace-packages copies the built @apify/scraper-tools # into node_modules instead of symlinking it. RUN pnpm --config.inject-workspace-packages=true --filter actor-puppeteer-scraper deploy --prod /deploy -# Drop the bundle's Puppeteer so the runtime resolves it from the base image, where it matches the -# Chrome binary. This is what keeps driver and binary in lockstep. -RUN rm -rf \ - /deploy/node_modules/puppeteer \ - /deploy/node_modules/puppeteer-core \ - /deploy/node_modules/.bin/puppeteer - FROM apify/actor-node-puppeteer-chrome:24-25.2.0@sha256:e9f588cd827e542bdc7b476be7dd3ba87b8ca3b4136e2e081e5fa0e3c940d50d -# Base WORKDIR is /home/myuser and ships Chrome plus the Xvfb entrypoint. Place the app in a child -# directory so the driver dropped above resolves up to the base's copy. -COPY --from=builder --chown=myuser /deploy ./app -WORKDIR /home/myuser/app +# Base WORKDIR is /home/myuser and ships Chrome plus the Xvfb entrypoint. Replace only the template +# node_modules with the lean production bundle (which carries the matching puppeteer); Chrome itself +# stays in the base image. +RUN rm -rf node_modules +COPY --from=builder --chown=myuser /deploy ./ # The base announces its Chrome via APIFY_CHROME_EXECUTABLE_PATH, but apify@3.7/crawlee@3.16 read only # PUPPETEER_EXECUTABLE_PATH — mirror the base's own value so we follow whatever Chrome the base ships. diff --git a/packages/actor-scraper/web-scraper/Dockerfile b/packages/actor-scraper/web-scraper/Dockerfile index 85a742ef..c7831f6c 100644 --- a/packages/actor-scraper/web-scraper/Dockerfile +++ b/packages/actor-scraper/web-scraper/Dockerfile @@ -1,10 +1,9 @@ # Build context is the monorepo root (dockerContextDir in .actor/actor.json), so the build uses the # root pnpm-lock.yaml for a deterministic install. # -# Browser determinism comes from pinning the base image by DIGEST below: the Chrome binary AND the -# matching Puppeteer driver both live in the base and are frozen together by the digest. The actor -# does NOT ship its own Puppeteer — it's dropped from the deploy bundle and resolved from the base at -# runtime, so driver and binary can never drift. +# The base is pinned by digest (reproducible Chrome + OS deps). The actor pins puppeteer to the version +# this base ships (24-25.2.0 -> puppeteer 25.2.0) and bundles it, so the bundled driver matches the +# Chrome binary it drives. Renovate bumps the base digest and the puppeteer pin together. FROM apify/actor-node-puppeteer-chrome:24-25.2.0@sha256:e9f588cd827e542bdc7b476be7dd3ba87b8ca3b4136e2e081e5fa0e3c940d50d AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. @@ -23,27 +22,20 @@ COPY . ./ # Deterministic install (frozen lockfile, honors minimumReleaseAge) of the actor + its workspace deps. RUN pnpm install --frozen-lockfile --filter actor-web-scraper... -# Build the actor and its workspace dependency @apify/scraper-tools (puppeteer is needed here for -# type-checking only; the runtime copy comes from the base — see below). +# Build the actor and its workspace dependency @apify/scraper-tools. RUN pnpm --filter actor-web-scraper... build # Self-contained production bundle; inject-workspace-packages copies the built @apify/scraper-tools # into node_modules instead of symlinking it. RUN pnpm --config.inject-workspace-packages=true --filter actor-web-scraper deploy --prod /deploy -# Drop the bundle's Puppeteer so the runtime resolves it from the base image, where it matches the -# Chrome binary. This is what keeps driver and binary in lockstep. -RUN rm -rf \ - /deploy/node_modules/puppeteer \ - /deploy/node_modules/puppeteer-core \ - /deploy/node_modules/.bin/puppeteer - FROM apify/actor-node-puppeteer-chrome:24-25.2.0@sha256:e9f588cd827e542bdc7b476be7dd3ba87b8ca3b4136e2e081e5fa0e3c940d50d -# Base WORKDIR is /home/myuser and ships Chrome plus the Xvfb entrypoint. Place the app in a child -# directory so the driver dropped above resolves up to the base's copy. -COPY --from=builder --chown=myuser /deploy ./app -WORKDIR /home/myuser/app +# Base WORKDIR is /home/myuser and ships Chrome plus the Xvfb entrypoint. Replace only the template +# node_modules with the lean production bundle (which carries the matching puppeteer); Chrome itself +# stays in the base image. +RUN rm -rf node_modules +COPY --from=builder --chown=myuser /deploy ./ # The base announces its Chrome via APIFY_CHROME_EXECUTABLE_PATH, but apify@3.7/crawlee@3.16 read only # PUPPETEER_EXECUTABLE_PATH — mirror the base's own value so we follow whatever Chrome the base ships. From 5a802cbbad99cdfb7e8457a29dc42f517fa7f2cf Mon Sep 17 00:00:00 2001 From: nikitachapovskii-dev Date: Fri, 26 Jun 2026 15:04:13 +0200 Subject: [PATCH 14/14] chore: drop the start:prod script from the package.json --- packages/actor-scraper/camoufox-scraper/package.json | 1 - packages/actor-scraper/cheerio-scraper/package.json | 1 - packages/actor-scraper/jsdom-scraper/package.json | 1 - packages/actor-scraper/playwright-scraper/package.json | 1 - packages/actor-scraper/puppeteer-scraper/package.json | 1 - packages/actor-scraper/sitemap-scraper/package.json | 1 - packages/actor-scraper/web-scraper/package.json | 1 - 7 files changed, 7 deletions(-) diff --git a/packages/actor-scraper/camoufox-scraper/package.json b/packages/actor-scraper/camoufox-scraper/package.json index 4d80079a..bafcabbf 100644 --- a/packages/actor-scraper/camoufox-scraper/package.json +++ b/packages/actor-scraper/camoufox-scraper/package.json @@ -23,7 +23,6 @@ }, "scripts": { "start": "pnpm start:dev", - "start:prod": "node dist/main.js", "start:dev": "tsx src/main.ts", "build": "tsc" }, diff --git a/packages/actor-scraper/cheerio-scraper/package.json b/packages/actor-scraper/cheerio-scraper/package.json index 2a54a319..398bf560 100644 --- a/packages/actor-scraper/cheerio-scraper/package.json +++ b/packages/actor-scraper/cheerio-scraper/package.json @@ -20,7 +20,6 @@ }, "scripts": { "start": "pnpm start:dev", - "start:prod": "node dist/main.js", "start:dev": "tsx src/main.ts", "build": "tsc" }, diff --git a/packages/actor-scraper/jsdom-scraper/package.json b/packages/actor-scraper/jsdom-scraper/package.json index 686c49f6..59b03ffd 100644 --- a/packages/actor-scraper/jsdom-scraper/package.json +++ b/packages/actor-scraper/jsdom-scraper/package.json @@ -20,7 +20,6 @@ }, "scripts": { "start": "pnpm start:dev", - "start:prod": "node dist/main.js", "start:dev": "tsx src/main.ts", "build": "tsc" }, diff --git a/packages/actor-scraper/playwright-scraper/package.json b/packages/actor-scraper/playwright-scraper/package.json index 72c272c5..590d5789 100644 --- a/packages/actor-scraper/playwright-scraper/package.json +++ b/packages/actor-scraper/playwright-scraper/package.json @@ -21,7 +21,6 @@ }, "scripts": { "start": "pnpm start:dev", - "start:prod": "node dist/main.js", "start:dev": "tsx src/main.ts", "build": "tsc" }, diff --git a/packages/actor-scraper/puppeteer-scraper/package.json b/packages/actor-scraper/puppeteer-scraper/package.json index ace778dd..6f54b5b4 100644 --- a/packages/actor-scraper/puppeteer-scraper/package.json +++ b/packages/actor-scraper/puppeteer-scraper/package.json @@ -19,7 +19,6 @@ }, "scripts": { "start": "pnpm start:dev", - "start:prod": "node dist/main.js", "start:dev": "tsx src/main.ts", "build": "tsc" }, diff --git a/packages/actor-scraper/sitemap-scraper/package.json b/packages/actor-scraper/sitemap-scraper/package.json index e2b533a7..4b2be9e9 100644 --- a/packages/actor-scraper/sitemap-scraper/package.json +++ b/packages/actor-scraper/sitemap-scraper/package.json @@ -26,7 +26,6 @@ }, "scripts": { "start": "pnpm start:dev", - "start:prod": "node dist/main.js", "start:dev": "tsx src/main.ts", "build": "tsc" }, diff --git a/packages/actor-scraper/web-scraper/package.json b/packages/actor-scraper/web-scraper/package.json index 147ea6cc..3565d48e 100644 --- a/packages/actor-scraper/web-scraper/package.json +++ b/packages/actor-scraper/web-scraper/package.json @@ -23,7 +23,6 @@ }, "scripts": { "start": "pnpm start:dev", - "start:prod": "node dist/main.js", "start:dev": "tsx src/main.ts", "build": "tsc" },