diff --git a/.github/workflows/prod-test.yml b/.github/workflows/prod-test.yml index 6107e4906..8e4a4b014 100644 --- a/.github/workflows/prod-test.yml +++ b/.github/workflows/prod-test.yml @@ -145,6 +145,55 @@ jobs: working-directory: dist/prettier run: node bin/prettier.cjs --debug-benchmark package.json 2>&1 >/dev/null | grep "Latency avg" || exit 1 + browser-test: + timeout-minutes: 15 + strategy: + fail-fast: false + matrix: + os: + - "ubuntu-latest" + # - "macos-latest" + - "windows-latest" + browser: + - "chrome" + - "firefox" + env: + FULL_TEST: ${{ matrix.os == 'ubuntu-latest' && true || '' }} + TEST_RUNTIME_BROWSER: ${{ matrix.browser }} + name: ${{ matrix.os == 'ubuntu-latest' && '[Full Test] ' || '' }} Browser(${{ matrix.browser }}) on ${{ startsWith(matrix.os, 'macos') && 'MacOS' || startsWith(matrix.os, 'windows') && 'Windows' || 'Linux' }} + runs-on: ${{ matrix.os }} + needs: [build] + steps: + - name: Checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + + - name: Setup Node.js + uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + with: + cache: "yarn" + + - name: Puppeteer cache + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1 + with: + path: .tmp/puppeteer/ + key: v1 + + # https://chromium.googlesource.com/chromium/src/+/main/docs/security/apparmor-userns-restrictions.md + - run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns + if: matrix.os == 'ubuntu-latest' + + - name: Install Dependencies + run: yarn install --immutable + + - name: Download Artifact + uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + with: + name: dist + path: dist + + - name: Run Tests + run: yarn test:production-browser + cli: name: CLI runs-on: ubuntu-latest diff --git a/eslint.config.js b/eslint.config.js index 0844df824..178f0e1fa 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -320,6 +320,7 @@ const configs = [ "scripts/**/*", "benchmarks/**", "tests/config/install-prettier.js", + "tests/config/browser/**/*", ], rules: { "no-console": "off", diff --git a/jest.config.js b/jest.config.js index 03d125ac4..49fbbb8a7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,6 @@ import path from "node:path"; import createEsmUtils from "esm-utils"; +import installBrowser from "./tests/config/install-browser.js"; import installPrettier from "./tests/config/install-prettier.js"; const { dirname: PROJECT_ROOT } = createEsmUtils(import.meta); @@ -8,6 +9,7 @@ const isProduction = process.env.NODE_ENV === "production"; // const ENABLE_CODE_COVERAGE = Boolean(process.env.ENABLE_CODE_COVERAGE); const TEST_STANDALONE = Boolean(process.env.TEST_STANDALONE); const INSTALL_PACKAGE = Boolean(process.env.INSTALL_PACKAGE); +const TEST_RUNTIME = process.env.TEST_RUNTIME ?? "nodejs"; // When debugging production test, this flag can skip installing package const SKIP_PRODUCTION_INSTALL = Boolean(process.env.SKIP_PRODUCTION_INSTALL); const nodejsMajorVersion = Number(process.versions.node.split(".")[0]); @@ -18,45 +20,61 @@ let PRETTIER_DIR = isProduction let PRETTIER_INSTALLED_DIR = ""; if ( INSTALL_PACKAGE || - (isProduction && !TEST_STANDALONE && !SKIP_PRODUCTION_INSTALL) + (isProduction && + !TEST_STANDALONE && + !SKIP_PRODUCTION_INSTALL && + TEST_RUNTIME === "nodejs") ) { PRETTIER_INSTALLED_DIR = installPrettier(PRETTIER_DIR); PRETTIER_DIR = path.join(PRETTIER_INSTALLED_DIR, "node_modules/prettier"); } +if (TEST_RUNTIME === "browser") { + installBrowser(); +} process.env.PRETTIER_INSTALLED_DIR = PRETTIER_INSTALLED_DIR; process.env.PRETTIER_DIR = PRETTIER_DIR; const testPathIgnorePatterns = []; -if (TEST_STANDALONE) { - testPathIgnorePatterns.push("/tests/integration/"); +if (TEST_STANDALONE || TEST_RUNTIME !== "nodejs") { + testPathIgnorePatterns.push("tests/integration/"); } if (isProduction) { // Only run unit test for development - testPathIgnorePatterns.push("/tests/unit/"); + testPathIgnorePatterns.push("tests/unit/"); } else { // Only test bundles for production + testPathIgnorePatterns.push("tests/integration/__tests__/bundle.js"); +} + +// Currently can't load plugins in browser +if (TEST_RUNTIME === "browser") { testPathIgnorePatterns.push( - "/tests/integration/__tests__/bundle.js", + "tests/format/misc/front-matter/with-plugins/format.test.js", + "tests/format/misc/plugins/embed-async-printer/format.test.js", + "tests/format/misc/errors/broken-plugin/format.test.js", + "tests/format/vue/with-plugins/format.test.js", + "tests/format/misc/plugins/async-printer/format.test.js", + "tests/format/handlebars/front-matter/toml/format.test.js", + "tests/format/markdown/broken-plugins/format.test.js", + "tests/format/vue/broken-plugins/format.test.js", ); } if (nodejsMajorVersion <= 18) { // Uses import attributes and `Array#toSorted()` - testPathIgnorePatterns.push( - "/tests/integration/__tests__/help-options.js", - ); + testPathIgnorePatterns.push("tests/integration/__tests__/help-options.js"); } if (nodejsMajorVersion <= 14) { testPathIgnorePatterns.push( - "/tests/integration/__tests__/plugin-parsers.js", - "/tests/integration/__tests__/normalize-doc.js", - "/tests/integration/__tests__/doc-utilities-clean-doc.js", - "/tests/integration/__tests__/config-invalid.js", + "tests/integration/__tests__/plugin-parsers.js", + "tests/integration/__tests__/normalize-doc.js", + "tests/integration/__tests__/doc-utilities-clean-doc.js", + "tests/integration/__tests__/config-invalid.js", // `@prettier/cli` uses `node:stream/consumers`, not available on Node.js v14 - "/tests/integration/__tests__/experimental-cli.js", + "tests/integration/__tests__/experimental-cli.js", // Fails on Node.js v14 - "/tests/dts/unit/run.js", + "tests/dts/unit/run.js", ); } @@ -76,7 +94,9 @@ const config = { "/tests/unit/**/*.js", "/tests/dts/unit/**/*.js", ], - testPathIgnorePatterns, + testPathIgnorePatterns: testPathIgnorePatterns.map( + (file) => `/${file}`, + ), // collectCoverage: ENABLE_CODE_COVERAGE, collectCoverageFrom: ["/src/**/*.js", "/bin/**/*.js"], coveragePathIgnorePatterns: [ diff --git a/knip.config.js b/knip.config.js index c463d3123..3f639525f 100644 --- a/knip.config.js +++ b/knip.config.js @@ -7,14 +7,20 @@ const config = { workspaces: { ".": { entry: [ + // Production plugin entries "src/plugins/*", + "packages/plugin-oxc/index.js", + "packages/plugin-hermes/index.js", + "scripts/**", + // We use `new Function()` to create `import()` in our `bin` file (bin/prettier.cjs) // so there is no actual use of the CLI files "src/cli/index.js", "src/experimental-cli/index.js", - "packages/plugin-oxc/index.js", - "packages/plugin-hermes/index.js", + + // Tests + "tests/config/browser/**", ], project: ["src/**", "scripts/**"], ignore: [ diff --git a/package.json b/package.json index 7a399acd5..7de727987 100644 --- a/package.json +++ b/package.json @@ -150,6 +150,7 @@ "eslint-plugin-simple-import-sort": "12.1.1", "eslint-plugin-unicorn": "62.0.0", "esm-utils": "4.4.2", + "get-port": "7.1.0", "gfm-test-suite": "0.0.2", "globals": "16.5.0", "jest": "30.2.0", @@ -169,6 +170,7 @@ "prettier": "3.7.4", "pretty-bytes": "7.1.0", "pretty-ms": "9.3.0", + "puppeteer": "24.34.0", "rollup-plugin-license": "3.6.0", "semver": "7.7.3", "serialize-javascript": "7.0.2", @@ -189,6 +191,9 @@ "test:production-node14": "cross-env NODE_ENV=production yarn test:node14", "test:production-standalone": "cross-env TEST_STANDALONE=1 yarn test:production", "test:production-standalone-node14": "cross-env TEST_STANDALONE=1 yarn test:production-node14", + "test:production-browser": "cross-env NODE_ENV=production TEST_RUNTIME=browser yarn test", + "test:production-browser:chrome": "cross-env TEST_RUNTIME_BROWSER=chrome yarn test:production-browser", + "test:production-browser:firefox": "cross-env TEST_RUNTIME_BROWSER=firefox yarn test:production-browser", "test:production-lint": "eslint dist --config=./scripts/production-eslint-config.js --quiet --format friendly", "perf": "yarn && yarn build && cross-env NODE_ENV=production node ./dist/prettier/bin/prettier.cjs", "perf:inspect": "yarn && yarn build && cross-env NODE_ENV=production node --inspect-brk ./dist/prettier/bin/prettier.cjs", diff --git a/puppeteer.config.cjs b/puppeteer.config.cjs new file mode 100644 index 000000000..ae613ce6d --- /dev/null +++ b/puppeteer.config.cjs @@ -0,0 +1,10 @@ +"use strict"; + +const path = require("node:path"); +const IS_CI = Boolean(process.env.CI); + +module.exports = { + // Will download when execute + skipDownload: false, + cacheDirectory: IS_CI ? path.join(__dirname, "./.tmp/puppeteer/") : undefined, +}; diff --git a/tests/config/browser/browser.js b/tests/config/browser/browser.js new file mode 100644 index 000000000..d648c306e --- /dev/null +++ b/tests/config/browser/browser.js @@ -0,0 +1,75 @@ +import assert from "node:assert/strict"; +import puppeteer from "puppeteer"; + +const puppeteerBrowsers = ["chrome", "chrome-headless-shell", "firefox"]; + +async function downloadBrowser({ browser }) { + const { downloadBrowsers } = + await import("puppeteer/internal/node/install.js"); + const originalEnv = { ...process.env }; + + const envOverrides = { + npm_config_loglevel: "silent", + PUPPETEER_SKIP_DOWNLOAD: JSON.stringify(false), + ...Object.fromEntries( + puppeteerBrowsers.map((name) => [ + `PUPPETEER_${name.replaceAll("-", "_").toUpperCase()}_SKIP_DOWNLOAD`, + JSON.stringify(name !== browser), + ]), + ), + }; + + Object.assign(process.env, envOverrides); + + try { + await downloadBrowsers(); + } finally { + for (const env of Object.keys(envOverrides)) { + if (Object.hasOwn(originalEnv)) { + process.env[env] = originalEnv[env]; + } else { + delete process.env[env]; + } + } + } +} + +async function isBrowserInstalled({ browser: browserName }) { + try { + const browser = await launchBrowser({ browser: browserName }); + await browser.close(); + return true; + } catch { + // Noop + } + + return false; +} + +async function launchBrowser({ browser: browserName }) { + const browser = await puppeteer.launch({ + browser: browserName, + enableExtensions: false, + waitForInitialPage: false, + }); + + try { + const version = await browser.version(); + assert.ok(version.toLowerCase().startsWith(`${browserName}/`)); + } catch (error) { + await browser.close(); + throw error; + } + + return browser; +} + +async function installBrowser({ browser }) { + if (await isBrowserInstalled({ browser })) { + return; + } + + await downloadBrowser({ browser }); +} + +export { downloadBrowser, installBrowser, isBrowserInstalled, launchBrowser }; diff --git a/tests/config/browser/esm.html b/tests/config/browser/esm.html new file mode 100644 index 000000000..ad94d922d --- /dev/null +++ b/tests/config/browser/esm.html @@ -0,0 +1,12 @@ + + + + + + Document + + +
Use __prettier to debug in console.
+ + + diff --git a/tests/config/browser/get-browser-prettier.js b/tests/config/browser/get-browser-prettier.js new file mode 100644 index 000000000..85bf3a47e --- /dev/null +++ b/tests/config/browser/get-browser-prettier.js @@ -0,0 +1,52 @@ +import { launchBrowser } from "./browser.js"; +import { startServer } from "./server.js"; +import { requestFromNode } from "./utilities.js"; + +async function getBrowserPrettier() { + const browserName = process.env.TEST_RUNTIME_BROWSER ?? "chrome"; + const browser = await launchBrowser({ browser: browserName }); + + process.once("exit", async () => { + await browser.close(); + }); + + const server = await startServer({ silent: true }); + process.once("exit", async () => { + await server.close(); + }); + + const page = await browser.newPage(); + await page.goto(server.url + "/esm.html"); + + const proxyFunction = (accessPath, optionsIndex = 1) => + requestFromNode( + (...arguments_) => + page.evaluate( + ([arguments_, accessPath]) => { + const prettier = globalThis.__prettier; + let function_ = prettier; + for (const property of accessPath.split(".")) { + function_ = function_[property]; + } + + return function_(...arguments_); + }, + [arguments_, accessPath], + ), + { + browser: browserName, + accessPath, + optionsIndex, + }, + ); + + return { + formatWithCursor: proxyFunction("formatWithCursor"), + getSupportInfo: proxyFunction("getSupportInfo", /* optionsIndex */ 0), + __debug: { + parse: proxyFunction("__debug.parse"), + }, + }; +} + +export { getBrowserPrettier }; diff --git a/tests/config/browser/main.js b/tests/config/browser/main.js new file mode 100644 index 000000000..94c775693 --- /dev/null +++ b/tests/config/browser/main.js @@ -0,0 +1,71 @@ +import { responseInBrowser } from "./utilities.js"; + +const browser = navigator.userAgent.includes("Firefox/") ? "firefox" : "chrome"; + +const esmFiles = { + prettier: "prettier/standalone.mjs", + plugins: [ + "prettier/plugins/angular.mjs", + "prettier/plugins/graphql.mjs", + "prettier/plugins/typescript.mjs", + "prettier/plugins/estree.mjs", + "prettier/plugins/markdown.mjs", + "prettier/plugins/acorn.mjs", + "prettier/plugins/glimmer.mjs", + "prettier/plugins/postcss.mjs", + "prettier/plugins/babel.mjs", + "prettier/plugins/html.mjs", + "prettier/plugins/yaml.mjs", + "prettier/plugins/flow.mjs", + "prettier/plugins/meriyah.mjs", + "plugin-hermes/index.mjs", + "plugin-oxc/index.browser.mjs", + ], +}; + +let prettier; +let builtinPlugins; + +function proxyFunction(accessPath, optionsIndex = 1) { + let function_; + return responseInBrowser( + async (...arguments_) => { + if (!prettier) { + [prettier, ...builtinPlugins] = await Promise.all( + [esmFiles.prettier, ...esmFiles.plugins].map( + (file) => import(`/${file}`), + ), + ); + } + + if (!function_) { + function_ = prettier; + for (const property of accessPath.split(".")) { + function_ = function_[property]; + } + } + + const options = arguments_[optionsIndex] ?? {}; + + arguments_[optionsIndex] = { + ...options, + plugins: [...builtinPlugins, ...(options.plugins || [])], + }; + + return function_(...arguments_); + }, + { + browser, + accessPath, + optionsIndex, + }, + ); +} + +globalThis.__prettier = { + formatWithCursor: proxyFunction("formatWithCursor"), + getSupportInfo: proxyFunction("getSupportInfo", /* optionsIndex */ 0), + __debug: { + parse: proxyFunction("__debug.parse"), + }, +}; diff --git a/tests/config/browser/server.js b/tests/config/browser/server.js new file mode 100644 index 000000000..0abaeec29 --- /dev/null +++ b/tests/config/browser/server.js @@ -0,0 +1,83 @@ +import assert from "node:assert"; +import fs from "node:fs/promises"; +import http from "node:http"; +import getPort from "get-port"; + +const distDirectory = new URL("../../../dist/", import.meta.url); + +async function getContent(url) { + assert.ok(url.startsWith("/")); + url = url.slice(1); + + if (url === "esm.html" || url === "main.js" || url === "utilities.js") { + return await fs.readFile(new URL(url, import.meta.url), "utf8"); + } + + const file = new URL(url, distDirectory); + assert.ok(file.href.startsWith(distDirectory.href)); + + return await fs.readFile(file, "utf8"); +} + +async function startServer({ silent = false, port: preferredPort } = {}) { + const port = await getPort({ port: preferredPort }); + + const server = http.createServer(async (request, response) => { + let { url } = request; + if (!silent) { + console.debug(url); + } + + if (url === "/") { + url = "/esm.html"; + } + + // Only allow `.mjs`, `.js` and `.html` + if (!/\.(?:html|js|mjs)$/.test(url)) { + response.statusCode = 404; + return; + } + + let content; + + try { + content = await getContent(url); + } catch (error) { + if (!silent) { + console.error(error); + } + + response.statusCode = error.code === "ENOENT" ? 404 : 500; + response.end("Error occurred"); + return; + } + + response.statusCode = 200; + response.setHeader( + "Content-Type", + url.endsWith(".mjs") || url.endsWith(".js") + ? "application/javascript" + : "text/html", + ); + + response.end(content); + }); + + // https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts + const hostname = "127.0.0.1"; + server.listen(port, hostname); + + const url = `http://${hostname}:${port}`; + + const close = () => + new Promise((resolve) => { + server.close(resolve); + }); + + return { + url, + close, + }; +} + +export { startServer }; diff --git a/tests/config/browser/start.js b/tests/config/browser/start.js new file mode 100644 index 000000000..275c39e41 --- /dev/null +++ b/tests/config/browser/start.js @@ -0,0 +1,10 @@ +import process from "node:process"; +import { startServer } from "./server.js"; + +const server = await startServer({ port: 3000 }); + +console.log(`Server started, navigate to ${server.url} start debug.`); + +process.once("exit", async () => { + await server.close(); +}); diff --git a/tests/config/browser/utilities.js b/tests/config/browser/utilities.js new file mode 100644 index 000000000..9cdddb83c --- /dev/null +++ b/tests/config/browser/utilities.js @@ -0,0 +1,160 @@ +function responseInBrowser(function_, context) { + const { accessPath, optionsIndex, browser } = context; + + function resolve(value) { + // Comments in `graphql` can't be serialized, and we are not using it in format test + if (accessPath === "formatWithCursor") { + value.comments = []; + } + + // `BigInt` can't be serialized in chrome + if (accessPath === "__debug.parse" && browser === "chrome") { + value.ast = serializeAst(value.ast); + } + + return { status: "fulfilled", value }; + } + + function reject(error) { + const response = { status: "rejected", reason: error }; + + // Firefox can't serialize `Error` + if (browser === "firefox") { + delete response.reason; + } + + response.serializedError = serializeError(error); + return response; + } + + return async function (...arguments_) { + // `Infinity` can't be serialized in chrome + if (browser === "chrome") { + const options = deserializeOptions(arguments_[optionsIndex]); + arguments_[optionsIndex] = options; + } + + try { + return resolve(await function_(...arguments_)); + } catch (error) { + return reject(error); + } + }; +} + +function requestFromNode(function_, context) { + const { accessPath, optionsIndex, browser } = context; + + function resolve({ value }) { + // `BigInt` can't be serialized in chrome + if (accessPath === "__debug.parse" && browser === "chrome") { + value.ast = deserializeAst(value.ast); + } + + return value; + } + + function reject(response) { + const error = deserializeError(response.serializedError); + throw error; + } + + return async function (...arguments_) { + // `Infinity` can't be serialized in chrome + if (browser === "chrome") { + const options = arguments_[optionsIndex]; + arguments_[optionsIndex] = serializeOptions(options); + } + + const response = await function_(...arguments_); + + if (response.status === "rejected") { + return reject(response); + } + + return resolve(response); + }; +} + +function deserializeError(serialized) { + const error = new Error(serialized.message); + + Object.assign(error, serialized); + + if (serialized.cause) { + error.cause = deserializeError(serialized.cause); + } + + return error; +} + +function serializeError(originalError) { + const error = { message: originalError.message, ...originalError }; + delete error.cause; + if (originalError.cause instanceof Error) { + error.cause = serializeError(originalError.cause); + } + return error; +} + +function serializeOptions(options = {}) { + return { + ...options, + printWidth: serializeValue(options?.printWidth), + }; +} + +function deserializeOptions(options = {}) { + return { + ...options, + printWidth: deserializeValue(options?.printWidth), + }; +} + +function serializeAst(ast) { + let shouldSerialize = false; + + const serialized = JSON.stringify(ast, (_, value) => { + const serialized = serializeValue(value); + if (serialized !== value) { + shouldSerialize ||= true; + } + return serialized; + }); + + return shouldSerialize ? serialized : ast; +} + +function deserializeAst(ast) { + if (typeof ast !== "string") { + return ast; + } + + return JSON.parse(ast, (_, value) => deserializeValue(value)); +} + +const INTERNAL_VALUE_KIND = "[[INTERNAL_VALUE_KIND]]"; +function deserializeValue(value) { + switch (value?.[INTERNAL_VALUE_KIND]) { + case "Number.POSITIVE_INFINITY": + return Number.POSITIVE_INFINITY; + case "bigint": + return BigInt(value.bigint); + } + + return value; +} + +function serializeValue(value) { + if (value === Number.POSITIVE_INFINITY) { + return { [INTERNAL_VALUE_KIND]: "Number.POSITIVE_INFINITY" }; + } + + if (typeof value === "bigint") { + return { [INTERNAL_VALUE_KIND]: "bigint", bigint: String(value) }; + } + + return value; +} + +export { requestFromNode, responseInBrowser }; diff --git a/tests/config/get-prettier.js b/tests/config/get-prettier.js index ea9ea97b8..7252098ed 100644 --- a/tests/config/get-prettier.js +++ b/tests/config/get-prettier.js @@ -2,6 +2,12 @@ import path from "node:path"; import { pathToFileURL } from "node:url"; function getPrettierInternal() { + if (process.env.TEST_RUNTIME === "browser") { + return import("./browser/get-browser-prettier.js").then( + ({ getBrowserPrettier }) => getBrowserPrettier(), + ); + } + if (process.env.TEST_STANDALONE) { const entry = new URL("./require-standalone.cjs", import.meta.url); return import(entry).then((module) => module.default); diff --git a/tests/config/install-browser.js b/tests/config/install-browser.js new file mode 100644 index 000000000..2c7d9153d --- /dev/null +++ b/tests/config/install-browser.js @@ -0,0 +1,16 @@ +import { createRequire } from "node:module"; + +function installBrowserSync() { + const { default: makeSynchronized } = createRequire(import.meta.url)( + "make-synchronized", + ); + const { installBrowser } = makeSynchronized( + new URL("./browser/browser.js", import.meta.url), + ); + + const browser = process.env.TEST_RUNTIME_BROWSER || "chrome"; + + installBrowser({ browser }); +} + +export default installBrowserSync; diff --git a/tests/config/run-format-test.js b/tests/config/run-format-test.js index 6367eaf23..aac912e5c 100644 --- a/tests/config/run-format-test.js +++ b/tests/config/run-format-test.js @@ -11,7 +11,7 @@ import visualizeEndOfLine from "./utilities/visualize-end-of-line.js"; const { __dirname } = createEsmUtils(import.meta); -const { FULL_TEST, TEST_STANDALONE, NODE_ENV } = process.env; +const { FULL_TEST, TEST_STANDALONE, NODE_ENV, TEST_RUNTIME } = process.env; const isProduction = NODE_ENV === "production"; const BOM = "\uFEFF"; @@ -599,7 +599,7 @@ async function getExternalPlugins() { let externalParsers; async function loadPlugins(options) { - if (!isProduction || !options.parser) { + if (!isProduction || !options.parser || TEST_RUNTIME === "browser") { return options; } diff --git a/yarn.lock b/yarn.lock index 42ec1f078..fdfe73875 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2235,6 +2235,23 @@ __metadata: languageName: node linkType: hard +"@puppeteer/browsers@npm:2.11.0": + version: 2.11.0 + resolution: "@puppeteer/browsers@npm:2.11.0" + dependencies: + debug: "npm:^4.4.3" + extract-zip: "npm:^2.0.1" + progress: "npm:^2.0.3" + proxy-agent: "npm:^6.5.0" + semver: "npm:^7.7.3" + tar-fs: "npm:^3.1.1" + yargs: "npm:^17.7.2" + bin: + browsers: lib/cjs/main-cli.js + checksum: 10/2bd0f6fce5923a04e040217b2bcf8b54de202d24bad3fa3b8f5577617cdbb1eb165a782b2dcbe30782aa7b47655dbf86abd10eb0da16fe84f8879a635c33c0f3 + languageName: node + linkType: hard + "@sec-ant/readable-stream@npm:^0.4.1": version: 0.4.1 resolution: "@sec-ant/readable-stream@npm:0.4.1" @@ -2297,6 +2314,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/quickjs-emscripten@npm:^0.23.0": + version: 0.23.0 + resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" + checksum: 10/95cbad451d195b9d8f312103abafcc010741eb9256e98d7953e7c026d4c1ed4abb2248a14018bf49e3201c350104fc643137b23aa0bbed2744c795c39dc48a28 + languageName: node + linkType: hard + "@tybys/wasm-util@npm:^0.10.0, @tybys/wasm-util@npm:^0.10.1": version: 0.10.1 resolution: "@tybys/wasm-util@npm:0.10.1" @@ -2439,6 +2463,15 @@ __metadata: languageName: node linkType: hard +"@types/yauzl@npm:^2.9.1": + version: 2.10.3 + resolution: "@types/yauzl@npm:2.10.3" + dependencies: + "@types/node": "npm:*" + checksum: 10/5ee966ea7bd6b2802f31ad4281c92c4c0b6dfa593c378a2582c58541fa113bec3d70eb0696b34ad95e8e6861a884cba6c3e351285816693ed176222f840a8c08 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:8.48.1": version: 8.48.1 resolution: "@typescript-eslint/eslint-plugin@npm:8.48.1" @@ -2920,6 +2953,15 @@ __metadata: languageName: node linkType: hard +"ast-types@npm:^0.13.4": + version: 0.13.4 + resolution: "ast-types@npm:0.13.4" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10/c55b375b9aaf44713d8c0f77a08215ab6d44f368b13e44f2141c421022af3c62b615a30c8ea629457f0cbaec409c713401c0188a124552c8fe4a5ad6b17ff3c3 + languageName: node + linkType: hard + "atomically@npm:^2.1.0": version: 2.1.0 resolution: "atomically@npm:2.1.0" @@ -2930,6 +2972,18 @@ __metadata: languageName: node linkType: hard +"b4a@npm:^1.6.4": + version: 1.7.3 + resolution: "b4a@npm:1.7.3" + peerDependencies: + react-native-b4a: "*" + peerDependenciesMeta: + react-native-b4a: + optional: true + checksum: 10/048ddd0eeec6a75e6f8dee07d52354e759032f0ef678b556e05bf5a137d7a4102002cadb953b3fb37a635995a1013875d715d115dbafaf12bcad6528d2166054 + languageName: node + linkType: hard + "babel-jest@npm:30.2.0": version: 30.2.0 resolution: "babel-jest@npm:30.2.0" @@ -3020,6 +3074,78 @@ __metadata: languageName: node linkType: hard +"bare-events@npm:^2.5.4, bare-events@npm:^2.7.0": + version: 2.8.2 + resolution: "bare-events@npm:2.8.2" + peerDependencies: + bare-abort-controller: "*" + peerDependenciesMeta: + bare-abort-controller: + optional: true + checksum: 10/f31848ea2f5627c3a50aadfc17e518a602629f7a6671da1352975cc6c8a520441fcc9d93c0a21f8f95de65b1a5133fcd5f766d312f3d5a326dde4fe7d2fc575f + languageName: node + linkType: hard + +"bare-fs@npm:^4.0.1": + version: 4.5.2 + resolution: "bare-fs@npm:4.5.2" + dependencies: + bare-events: "npm:^2.5.4" + bare-path: "npm:^3.0.0" + bare-stream: "npm:^2.6.4" + bare-url: "npm:^2.2.2" + fast-fifo: "npm:^1.3.2" + peerDependencies: + bare-buffer: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + checksum: 10/d544cb23e954d474b8301220a84545a22dec0023c8510dd440e18f361792a59353ae9e4bd4d5a9ee8696c976db696c3a19f91cf7adddeb856ba602dbf17c2683 + languageName: node + linkType: hard + +"bare-os@npm:^3.0.1": + version: 3.6.2 + resolution: "bare-os@npm:3.6.2" + checksum: 10/11e127cdce86444be2039a28f1e25a5635f3e4ada09aeb35b33d524766b51c5f71db3dc1e8d8d88018ea5255e9f6663a55174960ca45f002132d7808b9b34e29 + languageName: node + linkType: hard + +"bare-path@npm:^3.0.0": + version: 3.0.0 + resolution: "bare-path@npm:3.0.0" + dependencies: + bare-os: "npm:^3.0.1" + checksum: 10/712d90e9cd8c3263cc11b0e0d386d1531a452706d7840c081ee586b34b00d72544e65df7a40013d47c1b177277495225deeede65cb2984db88a979cb65aaa2ff + languageName: node + linkType: hard + +"bare-stream@npm:^2.6.4": + version: 2.7.0 + resolution: "bare-stream@npm:2.7.0" + dependencies: + streamx: "npm:^2.21.0" + peerDependencies: + bare-buffer: "*" + bare-events: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + checksum: 10/fe8f6e5a8e6d66e9210b4810060e8a25c6e78f9a8ee230c7dd2083b3ad48a79b1993e98eecc8ebd7890b336c66796da457aa8a2253bbb7a31e0e3a0f06bb1f5e + languageName: node + linkType: hard + +"bare-url@npm:^2.2.2": + version: 2.3.2 + resolution: "bare-url@npm:2.3.2" + dependencies: + bare-path: "npm:^3.0.0" + checksum: 10/aa203d79e2dafdb47a4e3bee398cb7db5c7eabcf0b3adf1e1530a21ac69806d1ca05b3343666e3aeda9fc3568c995272deea8ae3cead77ad00f66a7e415de0ef + languageName: node + linkType: hard + "base64-arraybuffer-es6@npm:3.1.0": version: 3.1.0 resolution: "base64-arraybuffer-es6@npm:3.1.0" @@ -3043,6 +3169,13 @@ __metadata: languageName: node linkType: hard +"basic-ftp@npm:^5.0.2": + version: 5.0.5 + resolution: "basic-ftp@npm:5.0.5" + checksum: 10/3dc56b2092b10d67e84621f5b9bbb0430469499178e857869194184d46fbdd367a9aa9fad660084388744b074b5f540e6ac8c22c0826ebba4fcc86a9d1c324e2 + languageName: node + linkType: hard + "binary-extensions@npm:^3.0.0": version: 3.1.0 resolution: "binary-extensions@npm:3.1.0" @@ -3115,6 +3248,13 @@ __metadata: languageName: node linkType: hard +"buffer-crc32@npm:~0.2.3": + version: 0.2.13 + resolution: "buffer-crc32@npm:0.2.13" + checksum: 10/06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -3327,6 +3467,18 @@ __metadata: languageName: node linkType: hard +"chromium-bidi@npm:12.0.1": + version: 12.0.1 + resolution: "chromium-bidi@npm:12.0.1" + dependencies: + mitt: "npm:^3.0.1" + zod: "npm:^3.24.1" + peerDependencies: + devtools-protocol: "*" + checksum: 10/09cdf03af745200f01268179e785a6fbb4227b9dea6670ae0d173f05c28fa9387f19ef0f023260074b9088e49cd40c87cfd05b1b4ed24a06aebcfa3a61ca8e1b + languageName: node + linkType: hard + "ci-info@npm:4.3.1, ci-info@npm:^4.2.0, ci-info@npm:^4.3.1": version: 4.3.1 resolution: "ci-info@npm:4.3.1" @@ -3510,6 +3662,23 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^9.0.0": + version: 9.0.0 + resolution: "cosmiconfig@npm:9.0.0" + dependencies: + env-paths: "npm:^2.2.1" + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/8bdf1dfbb6fdb3755195b6886dc0649a3c742ec75afa4cb8da7b070936aed22a4f4e5b7359faafe03180358f311dbc300d248fd6586c458203d376a40cc77826 + languageName: node + linkType: hard + "cross-env@npm:10.1.0": version: 10.1.0 resolution: "cross-env@npm:10.1.0" @@ -3696,7 +3865,14 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": +"data-uri-to-buffer@npm:^6.0.2": + version: 6.0.2 + resolution: "data-uri-to-buffer@npm:6.0.2" + checksum: 10/8b6927c33f9b54037f442856be0aa20e5fd49fa6c9c8ceece408dc306445d593ad72d207d57037c529ce65f413b421da800c6827b1dbefb607b8056f17123a61 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -3765,6 +3941,17 @@ __metadata: languageName: node linkType: hard +"degenerator@npm:^5.0.0": + version: 5.0.1 + resolution: "degenerator@npm:5.0.1" + dependencies: + ast-types: "npm:^0.13.4" + escodegen: "npm:^2.1.0" + esprima: "npm:^4.0.1" + checksum: 10/a64fa39cdf6c2edd75188157d32338ee9de7193d7dbb2aeb4acb1eb30fa4a15ed80ba8dae9bd4d7b085472cf174a5baf81adb761aaa8e326771392c922084152 + languageName: node + linkType: hard + "deno-path-from-file-url@npm:0.0.4": version: 0.0.4 resolution: "deno-path-from-file-url@npm:0.0.4" @@ -3786,6 +3973,13 @@ __metadata: languageName: node linkType: hard +"devtools-protocol@npm:0.0.1534754": + version: 0.0.1534754 + resolution: "devtools-protocol@npm:0.0.1534754" + checksum: 10/7d4facd4f9c811d16ecb6bfb3d976ae210277f0bfce96eb0d337e3b47db885aa9e6630acf4dd3bc6a583f32e58ae368b5b501e6c9474d28f43d587458beaa5b5 + languageName: node + linkType: hard + "diff@npm:8.0.2": version: 8.0.2 resolution: "diff@npm:8.0.2" @@ -3858,6 +4052,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0": + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" + dependencies: + once: "npm:^1.4.0" + checksum: 10/1e0cfa6e7f49887544e03314f9dfc56a8cb6dde910cbb445983ecc2ff426fc05946df9d75d8a21a3a64f2cecfe1bf88f773952029f46756b2ed64a24e95b1fb8 + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.17.1": version: 5.18.3 resolution: "enhanced-resolve@npm:5.18.3" @@ -3885,7 +4088,7 @@ __metadata: languageName: node linkType: hard -"env-paths@npm:^2.2.0": +"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" checksum: 10/65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e @@ -4059,6 +4262,24 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.1.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 10/47719a65b2888b4586e3fa93769068b275961c13089e90d5d01a96a6e8e95871b1c3893576814c8fbf08a4a31a496f37e7b2c937cf231270f4d81de012832c7c + languageName: node + linkType: hard + "eslint-compat-utils@npm:^0.5.1": version: 0.5.1 resolution: "eslint-compat-utils@npm:0.5.1" @@ -4370,6 +4591,15 @@ __metadata: languageName: node linkType: hard +"events-universal@npm:^1.0.0": + version: 1.0.1 + resolution: "events-universal@npm:1.0.1" + dependencies: + bare-events: "npm:^2.7.0" + checksum: 10/71b2e6079b4dc030c613ef73d99f1acb369dd3ddb6034f49fd98b3e2c6632cde9f61c15fb1351004339d7c79672252a4694ecc46a6124dc794b558be50a83867 + languageName: node + linkType: hard + "execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -4442,6 +4672,23 @@ __metadata: languageName: node linkType: hard +"extract-zip@npm:^2.0.1": + version: 2.0.1 + resolution: "extract-zip@npm:2.0.1" + dependencies: + "@types/yauzl": "npm:^2.9.1" + debug: "npm:^4.1.1" + get-stream: "npm:^5.1.0" + yauzl: "npm:^2.10.0" + dependenciesMeta: + "@types/yauzl": + optional: true + bin: + extract-zip: cli.js + checksum: 10/8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -4456,6 +4703,13 @@ __metadata: languageName: node linkType: hard +"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": + version: 1.3.2 + resolution: "fast-fifo@npm:1.3.2" + checksum: 10/6bfcba3e4df5af7be3332703b69a7898a8ed7020837ec4395bb341bd96cc3a6d86c3f6071dd98da289618cf2234c70d84b2a6f09a33dd6f988b1ff60d8e54275 + languageName: node + linkType: hard + "fast-glob@npm:3.3.3, fast-glob@npm:^3.3.3": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" @@ -4536,6 +4790,15 @@ __metadata: languageName: node linkType: hard +"fd-slicer@npm:~1.1.0": + version: 1.1.0 + resolution: "fd-slicer@npm:1.1.0" + dependencies: + pend: "npm:~1.2.0" + checksum: 10/db3e34fa483b5873b73f248e818f8a8b59a6427fd8b1436cd439c195fdf11e8659419404826059a642b57d18075c856d06d6a50a1413b714f12f833a9341ead3 + languageName: node + linkType: hard + "fdir@npm:^6.4.3, fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" @@ -4795,6 +5058,13 @@ __metadata: languageName: node linkType: hard +"get-port@npm:7.1.0": + version: 7.1.0 + resolution: "get-port@npm:7.1.0" + checksum: 10/f4d23b43026124007663a899578cc87ff37bfcf645c5c72651e9810ebafc759857784e409fb8e0ada9b90e5c5db089b0ae2f5f6b49fba1ce2e0aff86094ab17d + languageName: node + linkType: hard + "get-stdin@npm:9.0.0": version: 9.0.0 resolution: "get-stdin@npm:9.0.0" @@ -4802,6 +5072,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: "npm:^3.0.0" + checksum: 10/13a73148dca795e41421013da6e3ebff8ccb7fba4d2f023fd0c6da2c166ec4e789bec9774a73a7b49c08daf2cae552f8a3e914042ac23b5f59dd278cc8f9cbfb + languageName: node + linkType: hard + "get-stream@npm:^6.0.0": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -4828,6 +5107,17 @@ __metadata: languageName: node linkType: hard +"get-uri@npm:^6.0.1": + version: 6.0.5 + resolution: "get-uri@npm:6.0.5" + dependencies: + basic-ftp: "npm:^5.0.2" + data-uri-to-buffer: "npm:^6.0.2" + debug: "npm:^4.3.4" + checksum: 10/6daa56eb367dc030ae7bf6db4b5d36f200c9bb47ab00593c142176e4f33f22e129a294ac94329c6bcaebda19b7506080267a336742d20a915fb2bef9c400347f + languageName: node + linkType: hard + "gfm-test-suite@npm:0.0.2": version: 0.0.2 resolution: "gfm-test-suite@npm:0.0.2" @@ -5054,7 +5344,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0": +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -5064,7 +5354,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -5125,7 +5415,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.1": +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0, import-fresh@npm:^3.3.1": version: 3.3.1 resolution: "import-fresh@npm:3.3.1" dependencies: @@ -6335,6 +6625,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10/6029ca5aba3aacb554e919d7ef804fffd4adfc4c83db00fac8248c7c78811fb6d4b6f70f7fd9d55032b3823446546a007edaa66ad1f2377ae833bd983fac5d98 + languageName: node + linkType: hard + "magic-string@npm:0.30.21, magic-string@npm:~0.30.0": version: 0.30.21 resolution: "magic-string@npm:0.30.21" @@ -6566,6 +6863,13 @@ __metadata: languageName: node linkType: hard +"mitt@npm:^3.0.1": + version: 3.0.1 + resolution: "mitt@npm:3.0.1" + checksum: 10/287c70d8e73ffc25624261a4989c783768aed95ecb60900f051d180cf83e311e3e59865bfd6e9d029cdb149dc20ba2f128a805e9429c5c4ce33b1416c65bbd14 + languageName: node + linkType: hard + "moment@npm:~2.30.1": version: 2.30.1 resolution: "moment@npm:2.30.1" @@ -6626,6 +6930,13 @@ __metadata: languageName: node linkType: hard +"netmask@npm:^2.0.2": + version: 2.0.2 + resolution: "netmask@npm:2.0.2" + checksum: 10/375cabe898a5832816958664f26206f0a1e9f3605aa1816bfce803e060ff20f9d6ce56a2377e46f1470938358c31c27b3a8086f4a5e3ef678896147884d63ffa + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 12.1.0 resolution: "node-gyp@npm:12.1.0" @@ -6732,7 +7043,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -6991,6 +7302,32 @@ __metadata: languageName: node linkType: hard +"pac-proxy-agent@npm:^7.1.0": + version: 7.2.0 + resolution: "pac-proxy-agent@npm:7.2.0" + dependencies: + "@tootallnate/quickjs-emscripten": "npm:^0.23.0" + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + get-uri: "npm:^6.0.1" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.6" + pac-resolver: "npm:^7.0.1" + socks-proxy-agent: "npm:^8.0.5" + checksum: 10/187656be62d5a6b983d90a86d64106a38b1a9ee78f591fabb27b3cf0d51e5d528456a9faaaf981c93dd54dc9c9ee8d33e35a51072b73a19ec1a8e0d0c36a2b99 + languageName: node + linkType: hard + +"pac-resolver@npm:^7.0.1": + version: 7.0.1 + resolution: "pac-resolver@npm:7.0.1" + dependencies: + degenerator: "npm:^5.0.0" + netmask: "npm:^2.0.2" + checksum: 10/839134328781b80d49f9684eae1f5c74f50a1d4482076d44c84fc2f3ca93da66fa11245a4725a057231e06b311c20c989fd0681e662a0792d17f644d8fe62a5e + languageName: node + linkType: hard + "package-json-from-dist@npm:^1.0.0": version: 1.0.1 resolution: "package-json-from-dist@npm:1.0.1" @@ -7115,6 +7452,13 @@ __metadata: languageName: node linkType: hard +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: 10/6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d + languageName: node + linkType: hard + "picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -7341,6 +7685,7 @@ __metadata: find-cache-directory: "npm:6.0.0" flow-parser: "npm:0.295.0" get-east-asian-width: "npm:1.4.0" + get-port: "npm:7.1.0" get-stdin: "npm:9.0.0" gfm-test-suite: "npm:0.0.2" globals: "npm:16.5.0" @@ -7388,6 +7733,7 @@ __metadata: prettier: "npm:3.7.4" pretty-bytes: "npm:7.1.0" pretty-ms: "npm:9.3.0" + puppeteer: "npm:24.34.0" regexp-util: "npm:2.0.3" remark-footnotes: "npm:2.0.0" remark-math: "npm:3.0.1" @@ -7452,6 +7798,13 @@ __metadata: languageName: node linkType: hard +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: 10/e6f0bcb71f716eee9dfac0fe8a2606e3704d6a64dd93baaf49fbadbc8499989a610fe14cf1bc6f61b6d6653c49408d94f4a94e124538084efd8e4cf525e0293d + languageName: node + linkType: hard + "promise-make-counter@npm:^1.0.2": version: 1.0.2 resolution: "promise-make-counter@npm:1.0.2" @@ -7485,6 +7838,39 @@ __metadata: languageName: node linkType: hard +"proxy-agent@npm:^6.5.0": + version: 6.5.0 + resolution: "proxy-agent@npm:6.5.0" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + http-proxy-agent: "npm:^7.0.1" + https-proxy-agent: "npm:^7.0.6" + lru-cache: "npm:^7.14.1" + pac-proxy-agent: "npm:^7.1.0" + proxy-from-env: "npm:^1.1.0" + socks-proxy-agent: "npm:^8.0.5" + checksum: 10/56d5a494d96dafad94868870af776939e7b9aaca172465a5c251d2523496a8353b029c32d2a72a012bd62622cdc9a43ba3df59b5738ab7b740bc6b362e9f9477 + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: 10/f0bb4a87cfd18f77bc2fba23ae49c3b378fb35143af16cc478171c623eebe181678f09439707ad80081d340d1593cd54a33a0113f3ccb3f4bc9451488780ee23 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.3 + resolution: "pump@npm:3.0.3" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10/52843fc933b838c0330f588388115a1b28ef2a5ffa7774709b142e35431e8ab0c2edec90de3fa34ebb72d59fef854f151eea7dfc211b6dcf586b384556bd2f39 + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -7492,6 +7878,37 @@ __metadata: languageName: node linkType: hard +"puppeteer-core@npm:24.34.0": + version: 24.34.0 + resolution: "puppeteer-core@npm:24.34.0" + dependencies: + "@puppeteer/browsers": "npm:2.11.0" + chromium-bidi: "npm:12.0.1" + debug: "npm:^4.4.3" + devtools-protocol: "npm:0.0.1534754" + typed-query-selector: "npm:^2.12.0" + webdriver-bidi-protocol: "npm:0.3.10" + ws: "npm:^8.18.3" + checksum: 10/5f39b401dffd381a9ec5b3ca0163b4510868f1e135293c87c65e87292edfb5bba68804cc59b83b5a137bd35ffd42496da530043e741da7bb3dcaf9bd0f6cb860 + languageName: node + linkType: hard + +"puppeteer@npm:24.34.0": + version: 24.34.0 + resolution: "puppeteer@npm:24.34.0" + dependencies: + "@puppeteer/browsers": "npm:2.11.0" + chromium-bidi: "npm:12.0.1" + cosmiconfig: "npm:^9.0.0" + devtools-protocol: "npm:0.0.1534754" + puppeteer-core: "npm:24.34.0" + typed-query-selector: "npm:^2.12.0" + bin: + puppeteer: lib/cjs/puppeteer/node/cli.js + checksum: 10/f096ef61d097811744480186d7bcf98f8ce43674c8ae6c367bf40050916ff86478f77cb8c935d74f8555abc434f5f15eb4b14088a679d2a1a9ca8786cb29a19b + languageName: node + linkType: hard + "pure-rand@npm:^7.0.0": version: 7.0.1 resolution: "pure-rand@npm:7.0.1" @@ -7847,7 +8264,7 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.3": +"socks-proxy-agent@npm:^8.0.3, socks-proxy-agent@npm:^8.0.5": version: 8.0.5 resolution: "socks-proxy-agent@npm:8.0.5" dependencies: @@ -7885,7 +8302,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0": +"source-map@npm:^0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff @@ -8005,6 +8422,17 @@ __metadata: languageName: node linkType: hard +"streamx@npm:^2.15.0, streamx@npm:^2.21.0": + version: 2.23.0 + resolution: "streamx@npm:2.23.0" + dependencies: + events-universal: "npm:^1.0.0" + fast-fifo: "npm:^1.3.2" + text-decoder: "npm:^1.1.0" + checksum: 10/4969d7032b16497172afa2f8ac889d137764963ae564daf1611a03225dd62d9316d51de8098b5866d21722babde71353067184e7a3e9795d6dc17c902904a780 + languageName: node + linkType: hard + "string-escape-regex@npm:^1.0.0": version: 1.0.1 resolution: "string-escape-regex@npm:1.0.1" @@ -8188,6 +8616,34 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^3.1.1": + version: 3.1.1 + resolution: "tar-fs@npm:3.1.1" + dependencies: + bare-fs: "npm:^4.0.1" + bare-path: "npm:^3.0.0" + pump: "npm:^3.0.0" + tar-stream: "npm:^3.1.5" + dependenciesMeta: + bare-fs: + optional: true + bare-path: + optional: true + checksum: 10/f7f7540b563e10541dc0b95f710c68fc1fccde0c1177b4d3bab2023c6d18da19d941a8697fdc1abff54914b71b6e5f2dfb0455572b5c8993b2ab76571cbbc923 + languageName: node + linkType: hard + +"tar-stream@npm:^3.1.5": + version: 3.1.7 + resolution: "tar-stream@npm:3.1.7" + dependencies: + b4a: "npm:^1.6.4" + fast-fifo: "npm:^1.2.0" + streamx: "npm:^2.15.0" + checksum: 10/b21a82705a72792544697c410451a4846af1f744176feb0ff11a7c3dd0896961552e3def5e1c9a6bbee4f0ae298b8252a1f4c9381e9f991553b9e4847976f05c + languageName: node + linkType: hard + "tar@npm:^7.5.2": version: 7.5.2 resolution: "tar@npm:7.5.2" @@ -8242,6 +8698,15 @@ __metadata: languageName: node linkType: hard +"text-decoder@npm:^1.1.0": + version: 1.2.3 + resolution: "text-decoder@npm:1.2.3" + dependencies: + b4a: "npm:^1.6.4" + checksum: 10/bcdec33c0f070aeac38e46e4cafdcd567a58473ed308bdf75260bfbd8f7dc76acbc0b13226afaec4a169d0cb44cec2ab89c57b6395ccf02e941eaebbe19e124a + languageName: node + linkType: hard + "text-table@npm:0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -8460,7 +8925,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.3.0, tslib@npm:^2.4.0": +"tslib@npm:^2.0.1, tslib@npm:^2.3.0, tslib@npm:^2.4.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 @@ -8511,6 +8976,13 @@ __metadata: languageName: node linkType: hard +"typed-query-selector@npm:^2.12.0": + version: 2.12.0 + resolution: "typed-query-selector@npm:2.12.0" + checksum: 10/e65b646830315e63282883acb44ea48ef8da3e9a044aa69e03f3bd876d7a69baae85f71c0918456b43f7c1bc2b448f2d64a424280f9699d34be2bae582121bc9 + languageName: node + linkType: hard + "typescript@npm:5.9.3": version: 5.9.3 resolution: "typescript@npm:5.9.3" @@ -8849,6 +9321,13 @@ __metadata: languageName: node linkType: hard +"webdriver-bidi-protocol@npm:0.3.10": + version: 0.3.10 + resolution: "webdriver-bidi-protocol@npm:0.3.10" + checksum: 10/31c4fe122981c9c5fb8caaf901f7d806f832431771cca340d9af8e291749f1c263e7576550cdc4ef697a1d61ecdc4cb536c91d776caf2d79af1b58056466d531 + languageName: node + linkType: hard + "webworker-shim@npm:^1.1.4": version: 1.1.4 resolution: "webworker-shim@npm:1.1.4" @@ -8954,6 +9433,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.18.3": + version: 8.18.3 + resolution: "ws@npm:8.18.3" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 + languageName: node + linkType: hard + "wsl-utils@npm:^0.3.0": version: 0.3.0 resolution: "wsl-utils@npm:0.3.0" @@ -9060,6 +9554,16 @@ __metadata: languageName: node linkType: hard +"yauzl@npm:^2.10.0": + version: 2.10.0 + resolution: "yauzl@npm:2.10.0" + dependencies: + buffer-crc32: "npm:~0.2.3" + fd-slicer: "npm:~1.1.0" + checksum: 10/1e4c311050dc0cf2ee3dbe8854fe0a6cde50e420b3e561a8d97042526b4cf7a0718d6c8d89e9e526a152f4a9cec55bcea9c3617264115f48bd6704cf12a04445 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -9119,6 +9623,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:^3.24.1": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10/f0c963ec40cd96858451d1690404d603d36507c1fc9682f2dae59ab38b578687d542708a7fdbf645f77926f78c9ed558f57c3d3aa226c285f798df0c4da16995 + languageName: node + linkType: hard + "zod@npm:^4.1.11": version: 4.1.13 resolution: "zod@npm:4.1.13"