diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cfd08f5f..c3fabe49 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,6 +22,9 @@ jobs: - name: Install dependencies run: npm ci + - name: Run typecheck + run: npm run typecheck + - name: Run lint run: npm run lint diff --git a/capability.md b/capability.md index 010b3b36..a761a24c 100644 --- a/capability.md +++ b/capability.md @@ -2,7 +2,7 @@ ## Capability -Web-page front-end quality audit. Kilotest tests public web pages for front-end quality, namely accessibility, usability, and standards conformity, and makes structured findings available for retrieval. +Web-page front-end quality audit. Kilotest tests web pages for front-end quality, namely accessibility, usability, and standards conformity, and makes structured findings available for retrieval. ## Purpose @@ -36,7 +36,7 @@ A list of available reports. ## Side effects -Kilotest reads the specified public web page during testing. It does not modify the target site. Testing is asynchronous and may take up to approximately one day before reports are available for newly requested pages. +Kilotest reads the specified web page during testing. It does not modify the target site. Testing is asynchronous and may take up to approximately one day before reports are available for newly requested pages. ## Cost diff --git a/docs/AI-TOOLS.md b/docs/AI-TOOLS.md index 57ceea20..16075072 100644 --- a/docs/AI-TOOLS.md +++ b/docs/AI-TOOLS.md @@ -42,7 +42,7 @@ The external features that support the use of Kilotest as a collection of AI too - A [pull request](https://github.com/public-apis/public-apis/pull/6346/changes) to add Kilotest to the list of public APIs in the `public-apis` repository. - An [issue](https://github.com/APIs-guru/openapi-directory/issues/2677) to add Kilotest to `openapi-directory`. - A [pull request](https://github.com/w3c/wai-evaluation-tools-list/pull/1153) to add Kilotest to the WAI evaluation tools list. -- Registration of Kilotest as an active server in the [official MCP Registry](https://registry.modelcontextprotocol.io/v0/servers?search=kilotest) (`io.github.jrpool/kilotest`), maintained by the [Model Context Protocol](https://modelcontextprotocol.io/) project. The [PulseMCP](https://www.pulsemcp.com/servers) directory and the VS Code MCP gallery both crawl this registry, so Kilotest is discoverable through them with no separate submission. +- Registration of Kilotest as an active server in the [official MCP Registry](https://registry.modelcontextprotocol.io) (`io.github.jrpool/kilotest`), maintained by the [Model Context Protocol](https://modelcontextprotocol.io/) project. The [PulseMCP](https://www.pulsemcp.com/servers) directory and the VS Code MCP gallery both crawl this registry, so Kilotest is discoverable through them with no separate submission. - Registration of Kilotest with the [Smithery](https://smithery.ai/servers/pool/kilotest) MCP server registry. - Registration of Kilotest with the [Glama](https://glama.ai/mcp/connectors/com.kilotest/kilotest) MCP server registry, including a claim of ownership of the MCP connector by the maintainer via a `TXT` DNS record for `_glama-claim.kilotest.com`, with the value `glama_claim_gVV4HrPdcXr9TEfj1p3icEUBJ3_OVJGX`. - Registration of Kilotest with [Awesome MCP Servers](https://www.tensorblock.co/mcp/servers/github-jrpool-kilotest-f518ba36). @@ -107,7 +107,7 @@ Other future work: Capability: web-page-quality-audit Purpose: - Test a public web page for accessibility, + Test a web page for accessibility, usability, HTML and web-standards problems. Interfaces: @@ -123,7 +123,7 @@ Other future work: rule-engine diagnoses, WCAG mappings Side effects: - Reads the specified public web page. + Reads the specified web page. Does not modify the target site. Cost: diff --git a/docs/SERVICE.md b/docs/SERVICE.md index d7897acb..fb47b86a 100644 --- a/docs/SERVICE.md +++ b/docs/SERVICE.md @@ -502,7 +502,7 @@ Kilotest records basic counts of how it is used, so the maintainer can answer qu - The generic `.html` GET dispatch in `index.ts`, once per successfully served web page, recorded under the `pageViews` category by page name (for example `tutorialWeb`, `listReports`), unless the page is a manager-only page (see "Manager page activity" below), in which case it is recorded there instead. - The home page (`/` and `/index.html`), served by its own branch in `index.ts` rather than through the generic `.html` dispatch, recorded under `pageViews` as `index`. -- Each of the 8 MCP tool handlers in `mcp.ts`, once per successful tool call, recorded under the `mcpToolCalls` category by tool name (for example `listReports`, `requestTest`). +- Each of the 9 MCP tool handlers in `mcp.ts`, once per successful tool call, recorded under the `mcpToolCalls` category by tool name (for example `listReports`, `requestTest`). - The `/api/*` GET and POST service branches in `index.ts`, once per call, recorded under the `apiOperations` category by operation name. `db/metrics.json` also stores a `since` time stamp, set when the file is first created, so the counts can be read as "since this date" rather than assumed to cover Kilotest's entire history. `getMetrics()` backfills any category absent from an existing `db/metrics.json` (for example one written before a category such as `managerActivity` existed), so an older file remains readable rather than causing every subsequent request to error. diff --git a/llms-full.txt b/llms-full.txt index cf46b3c6..502432b3 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -6,7 +6,7 @@ Kilotest is an application that performs ensemble testing of web pages for front ## What Kilotest does for language models -Kilotest is deployed on the public Internet as a service at `https://kilotest.com`. Kilotest can test only web pages that can be accessed from the public Internet and that are not protected by authentication or other access controls. Kilotest has not implemented any mechanism for testing private, internal, password-protected, or otherwise restricted pages. +Kilotest is deployed on the public Internet as a service at `https://kilotest.com`. That deployment of Kilotest can test only web pages that can be accessed by its Testaro worker with a URL. Generally those are pages on the public Internet that are not protected by authentication or other access controls. Without calling any tool, an LLM can, under some conditions, load web pages and use its knowledge to assess successes and failures of front-end quality. But such an assessment is almost always: diff --git a/llms.txt b/llms.txt index 0d7152c1..bb2e889c 100644 --- a/llms.txt +++ b/llms.txt @@ -1,6 +1,6 @@ # Kilotest -Kilotest helps language models and AI platforms to give thorough, accurate and truthful answers when users ask about the front-end quality (i.e. accessibility, usability, and standards conformity) of web pages. Kilotest integrates an ensemble of twelve independent rule engines to test any public web page. Kilotest creates a structured report of the results and saves the report for future reference. Kilotest API endpoints and MCP tools can provide multipage, single-page, and element-level test results. +Kilotest helps language models and AI platforms to give thorough, accurate and truthful answers when users ask about the front-end quality (i.e. accessibility, usability, and standards conformity) of web pages. Kilotest integrates an ensemble of twelve independent rule engines to test a web page. Kilotest creates a structured report of the results and saves the report for future reference. Kilotest API endpoints and MCP tools can provide multipage, single-page, and element-level test results. ## API diff --git a/mcp.test.ts b/mcp.test.ts index d128d054..d122cc1e 100644 --- a/mcp.test.ts +++ b/mcp.test.ts @@ -11,6 +11,8 @@ import http from 'node:http'; import {mcpPath, createMCPServer, handleMCP} from './mcp.ts'; import {metricsPath} from './util.ts'; import fs from 'node:fs'; +import {Client} from '@modelcontextprotocol/sdk/client/index.js'; +import {InMemoryTransport} from '@modelcontextprotocol/sdk/inMemory.js'; // CONSTANTS @@ -35,11 +37,12 @@ test('mcpPath is /mcp', () => { assert.equal(mcpPath, '/mcp'); }); -test('createMCPServer registers all 8 tools', () => { +test('createMCPServer registers all 9 tools', () => { const server = createMCPServer(); const toolNames = Object.keys((server as any)._registeredTools); - assert.equal(toolNames.length, 8); + assert.equal(toolNames.length, 9); assert.deepEqual(toolNames, [ + 'getKilotestOverview', 'listReports', 'listIssues', 'listViolators', @@ -56,10 +59,41 @@ test('each tool has a description and a handler function', () => { const tools = (server as any)._registeredTools; for (const [name, tool] of Object.entries(tools) as [string, any][]) { assert.ok(tool.description, `${name} has a description`); + assert.ok( + tool.description.includes('front-end quality'), + `${name} description includes the shared domain context` + ); assert.equal(typeof tool.handler, 'function', `${name} has a handler function`); } }); +test('getKilotestOverview handler returns overview text and records a metric', async () => { + const server = createMCPServer(); + const countBefore = getToolCallCount('getKilotestOverview'); + const result = await (server as any)._registeredTools.getKilotestOverview.handler({}); + assert.ok(result.content); + assert.equal(result.content[0].type, 'text'); + assert.ok(result.content[0].text.includes('front-end quality')); + assert.equal(getToolCallCount('getKilotestOverview'), countBefore + 1); +}); + +test('client receives instructions, server description, and the overview resource', async () => { + const server = createMCPServer(); + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + await server.connect(serverTransport); + const client = new Client({name: 'test-client', version: '1.0.0'}); + await client.connect(clientTransport); + assert.ok(client.getInstructions()?.includes('front-end quality')); + assert.ok(client.getServerVersion()?.description?.includes('front-end quality')); + const resources = await client.listResources(); + assert.deepEqual(resources.resources.map((r: any) => r.uri), ['docs://kilotest/overview']); + const read = await client.readResource({uri: 'docs://kilotest/overview'}); + assert.equal(read.contents[0]?.mimeType, 'text/plain'); + assert.ok((read.contents[0] as any).text.includes('front-end quality')); + await client.close(); + await server.close(); +}); + test('listReports handler returns content and structuredContent', async () => { const server = createMCPServer(); const countBefore = getToolCallCount('listReports'); @@ -258,6 +292,8 @@ test('handleMCP responds to initialize with server info', async () => { assert.equal(res.statusCode, 200); const result = parseSSEResult(res.body); assert.equal(result.result.serverInfo.name, 'Kilotest'); + assert.ok(result.result.serverInfo.description.includes('front-end quality')); + assert.ok(result.result.instructions.includes('front-end quality')); assert.equal(result.result.protocolVersion, '2025-06-18'); } finally { @@ -265,7 +301,7 @@ test('handleMCP responds to initialize with server info', async () => { } }); -test('handleMCP lists all 8 tools via tools/list', async () => { +test('handleMCP lists all 9 tools via tools/list', async () => { const server = await startMCPServer(); try { const port = server.address().port; @@ -273,8 +309,9 @@ test('handleMCP lists all 8 tools via tools/list', async () => { assert.equal(res.statusCode, 200); const result = parseSSEResult(res.body); const toolNames = result.result.tools.map((t: any) => t.name); - assert.equal(toolNames.length, 8); + assert.equal(toolNames.length, 9); assert.deepEqual(toolNames, [ + 'getKilotestOverview', 'listReports', 'listIssues', 'listViolators', diff --git a/mcp.ts b/mcp.ts index bb4a866d..279f918b 100644 --- a/mcp.ts +++ b/mcp.ts @@ -41,8 +41,28 @@ import { export const mcpPath = '/mcp'; +// Shared statement of the Kilotest domain and data hierarchy, repeated in every tool +// description, in the server instructions, and in the getKilotestOverview tool description, +// because some MCP clients do not propagate server-level instructions or the server +// description to their models. +const sharedContext = 'Kilotest tests web pages for front-end quality (accessibility, usability, and standards conformity); results are organized as report, then issue, then violator element, then diagnosis.'; + +// Detailed overview of the Kilotest domain, data hierarchy, and tool workflow, returned by +// the getKilotestOverview tool and served as the docs://kilotest/overview resource. +const kilotestOverview = [ + 'Kilotest tests web pages for front-end quality: accessibility, usability, and standards conformity.', + 'Kilotest integrates an ensemble of twelve independent rule engines to test a web page and stores the results as a structured report.', + 'Results are organized as a hierarchy. A report contains issues. An issue has violators: elements of the tested page reported as exhibiting the issue. A violator has diagnoses: explanations from rule engines of how the element exhibited the issue.', + 'Typical workflow: call the listReports tool to learn whether a report about the page already exists. If it does, drill down with the listIssues, listViolators, and listDiagnoses tools, or retrieve the entire report with the getReport tool. If no report exists, request a test with the requestTest tool. If the latest report is obsolete, request a retest with the requestRetest tool.', + 'More documentation is available at https://kilotest.com/llms.txt and https://kilotest.com/llms-full.txt.' +].join('\n\n'); + // FUNCTIONS +// Returns a tool description consisting of the tool-specific summary followed by the shared +// Kilotest domain context. +const toolDoc = (summary: string): string => `${summary} ${sharedContext}`; + // Creates and returns an McpServer with Kilotest tools registered. export const createMCPServer = (): McpServer => { const server = new McpServer({ @@ -51,16 +71,34 @@ export const createMCPServer = (): McpServer => { description: 'Tools that test web pages for front-end quality (accessibility, usability, and standards conformity) and make test results available' }, { - instructions: 'Use the listReports tool to start. If it shows that there is a report available about the page you want facts about, drill down with the listIssues, listViolators, and listDiagnoses tools. If not, use the requestTest tool to request that the page be tested. If the latest report about the page is obsolete, use the requestRetest tool to request that the page be retested.' + instructions: `${sharedContext} Use the listReports tool to start. If it shows that there is a report available about the page you want facts about, drill down with the listIssues, listViolators, and listDiagnoses tools. If not, use the requestTest tool to request that the page be tested. If the latest report about the page is obsolete, use the requestRetest tool to request that the page be retested. For detailed documentation, call the getKilotestOverview tool.` }); + server.registerTool( + 'getKilotestOverview', + { + description: toolDoc('Explain what Kilotest is, what its tools do, and how its results are structured.'), + inputSchema: {}, + annotations: { + title: toolDoc('Explain what Kilotest is, what its tools do, and how its results are structured.'), + readOnlyHint: true, + idempotentHint: true, + destructiveHint: false, + openWorldHint: false + } + }, + async () => { + await recordMetric('mcpToolCalls', 'getKilotestOverview'); + return {content: [{type: 'text', text: kilotestOverview}]}; + } + ); server.registerTool( 'listReports', { - description: 'Provide basics about all available reports.', + description: toolDoc('Provide basics about all available reports.'), inputSchema: {}, outputSchema: listReportsResponseSchema, annotations: { - title: 'Provide basics about all available reports.', + title: toolDoc('Provide basics about all available reports.'), readOnlyHint: true, idempotentHint: true, destructiveHint: false, @@ -76,11 +114,11 @@ export const createMCPServer = (): McpServer => { server.registerTool( 'listIssues', { - description: 'Provide details about one report, including basics about the issues reported in it.', + description: toolDoc('Provide details about one report, including basics about the issues reported in it.'), inputSchema: listIssuesSchema, outputSchema: listIssuesResponseSchema, annotations: { - title: 'Provide details about one report, including basics about the issues reported in it.', + title: toolDoc('Provide details about one report, including basics about the issues reported in it.'), readOnlyHint: true, idempotentHint: true, destructiveHint: false, @@ -96,11 +134,11 @@ export const createMCPServer = (): McpServer => { server.registerTool( 'listViolators', { - description: 'Provide details about one issue in one report, including basics about the elements of the tested page that were reported as exhibiting the issue.', + description: toolDoc('Provide details about one issue in one report, including basics about the elements of the tested page that were reported as exhibiting the issue.'), inputSchema: listViolatorsSchema, outputSchema: listViolatorsResponseSchema, annotations: { - title: 'Provide details about one issue in one report, including basics about the elements of the tested page that were reported as exhibiting the issue.', + title: toolDoc('Provide details about one issue in one report, including basics about the elements of the tested page that were reported as exhibiting the issue.'), readOnlyHint: true, idempotentHint: true, destructiveHint: false, @@ -116,11 +154,11 @@ export const createMCPServer = (): McpServer => { server.registerTool( 'listDiagnoses', { - description: 'Provide details about one element reported as exhibiting one issue in one report, including the diagnoses provided by rule engines about how the element exhibited the issue.', + description: toolDoc('Provide details about one element reported as exhibiting one issue in one report, including the diagnoses provided by rule engines about how the element exhibited the issue.'), inputSchema: listDiagnosesSchema, outputSchema: listDiagnosesResponseSchema, annotations: { - title: 'Provide details about one element reported as exhibiting one issue in one report, including the diagnoses provided by rule engines about how the element exhibited the issue.', + title: toolDoc('Provide details about one element reported as exhibiting one issue in one report, including the diagnoses provided by rule engines about how the element exhibited the issue.'), readOnlyHint: true, idempotentHint: true, destructiveHint: false, @@ -136,11 +174,11 @@ export const createMCPServer = (): McpServer => { server.registerTool( 'getReport', { - description: 'Get one full report in JSON.', + description: toolDoc('Get one full report in JSON.'), inputSchema: getReportSchema, outputSchema: getReportResponseSchema, annotations: { - title: 'Get one full report in JSON.', + title: toolDoc('Get one full report in JSON.'), readOnlyHint: true, idempotentHint: true, destructiveHint: false, @@ -156,11 +194,11 @@ export const createMCPServer = (): McpServer => { server.registerTool( 'requestTest', { - description: 'Process my request to test a page about which no report is available yet.', + description: toolDoc('Process my request to test a page about which no report is available yet.'), inputSchema: requestTestSchema, outputSchema: requestTestResponseSchema, annotations: { - title: 'Process my request to test a page about which no report is available yet.', + title: toolDoc('Process my request to test a page about which no report is available yet.'), readOnlyHint: false, idempotentHint: false, destructiveHint: false, @@ -176,11 +214,11 @@ export const createMCPServer = (): McpServer => { server.registerTool( 'requestRetest', { - description: 'Process my request to retest a page about which a report is available.', + description: toolDoc('Process my request to retest a page about which a report is available.'), inputSchema: requestRetestSchema, outputSchema: requestRetestResponseSchema, annotations: { - title: 'Process my request to retest a page about which a report is available.', + title: toolDoc('Process my request to retest a page about which a report is available.'), readOnlyHint: false, idempotentHint: false, destructiveHint: false, @@ -196,11 +234,11 @@ export const createMCPServer = (): McpServer => { server.registerTool( 'requestFeature', { - description: 'Process my request to add or improve a feature.', + description: toolDoc('Process my request to add or improve a feature.'), inputSchema: requestFeatureSchema, outputSchema: requestFeatureResponseSchema, annotations: { - title: 'Process my request to add or improve a feature.', + title: toolDoc('Process my request to add or improve a feature.'), readOnlyHint: false, idempotentHint: false, destructiveHint: false, @@ -213,6 +251,18 @@ export const createMCPServer = (): McpServer => { return {content: [{type: 'text', text: JSON.stringify(result)}], structuredContent: result}; } ); + server.registerResource( + 'kilotest-overview', + 'docs://kilotest/overview', + { + title: 'Kilotest overview', + description: `What Kilotest is and how its tools and results are organized. ${sharedContext}`, + mimeType: 'text/plain' + }, + async () => ({ + contents: [{uri: 'docs://kilotest/overview', mimeType: 'text/plain', text: kilotestOverview}] + }) + ); return server; }; // Handles an MCP request. diff --git a/openapi.yaml b/openapi.yaml index b0877173..777fcded 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: Kilotest API - description: 'Kilotest is an ensemble testing and reporting service for front-end web quality. It uses an ensemble of 12 rule engines to test public web pages for front-end quality (accessibility, usability, and standards conformity). Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access. With this API you can request that a page be tested or retested, discover available reports, incrementally retrieve facts from a report: from what reports are available, to what issues were reported in one report, to what elements violated one issue, to what diagnoses rule engines gave for one violation.' + description: 'Kilotest is an ensemble testing and reporting service for front-end web quality. It uses an ensemble of 12 rule engines to test web pages for front-end quality (accessibility, usability, and standards conformity). Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access. With this API you can request that a page be tested or retested, discover available reports, incrementally retrieve facts from a report: from what reports are available, to what issues were reported in one report, to what elements violated one issue, to what diagnoses rule engines gave for one violation.' version: 2.1.0 license: name: MIT @@ -822,7 +822,7 @@ paths: properties: description: type: string - description: 10- to 100-character description of the page conforming to the naming convention used in the listReports output + description: 1- to 100-character description of the page conforming to the naming convention used in the listReports output URL: type: string description: 12- to 300-character URL of the page, including the https:// scheme and any query @@ -860,7 +860,7 @@ paths: properties: description: type: string - description: 10- to 100-character description of the page conforming to the naming convention used in the listReports output + description: 1- to 100-character description of the page conforming to the naming convention used in the listReports output URL: type: string description: 12- to 300-character URL of the page, including the https:// scheme and any query @@ -1099,7 +1099,7 @@ paths: properties: feature: type: string - description: description of requested feature improvement or new feature + description: 20- to 1000-character description of requested feature improvement or new feature required: - feature responses: @@ -1129,7 +1129,7 @@ paths: properties: feature: type: string - description: description of requested feature improvement or new feature + description: 20- to 1000-character description of requested feature improvement or new feature required: - feature additionalProperties: false diff --git a/package-lock.json b/package-lock.json index 998e811c..78eae757 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jrpool/kilotest", - "version": "53.0.0", + "version": "55.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jrpool/kilotest", - "version": "53.0.0", + "version": "55.0.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "*", @@ -37,6 +37,31 @@ "node": ">=24.16.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bcoe/v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", @@ -124,6 +149,72 @@ "puppeteer": ">5" } }, + "node_modules/@cliqz/adblocker-puppeteer/node_modules/tldts-core": { + "version": "5.7.112", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-5.7.112.tgz", + "integrity": "sha512-mutrEUgG2sp0e/MIAnv9TbSLR0IPbvmAImpzqul5O/HJ2XM1/I1sajchQ/fbj0fPdA31IiuWde8EUhfwyldY1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cliqz/adblocker-puppeteer/node_modules/tldts-experimental": { + "version": "5.7.112", + "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-5.7.112.tgz", + "integrity": "sha512-Nq5qWN4OiLziAOOOEoSME7cZI4Hz8Srt+9q6cl8mZ5EAhCfmeE6l7K5XjuIKN+pySuGUvthE5aPiD185YU1/lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^5.7.112" + } + }, + "node_modules/@cliqz/adblocker/node_modules/@remusao/guess-url-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.3.0.tgz", + "integrity": "sha512-SNSJGxH5ckvxb3EUHj4DqlAm/bxNxNv2kx/AESZva/9VfcBokwKNS+C4D1lQdWIDM1R3d3UG+xmVzlkNG8CPTQ==", + "dev": true, + "license": "MPL-2.0" + }, + "node_modules/@cliqz/adblocker/node_modules/@remusao/small": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.3.0.tgz", + "integrity": "sha512-bydAhJI+ywmg5xMUcbqoR8KahetcfkFywEZpsyFZ8EBofilvWxbXnMSe4vnjDI1Y+SWxnNhR4AL/2BAXkf4b8A==", + "dev": true, + "license": "MPL-2.0" + }, + "node_modules/@cliqz/adblocker/node_modules/@remusao/smaz": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.10.0.tgz", + "integrity": "sha512-GQzCxmmMpLkyZwcwNgz8TpuBEWl0RUQa8IcvKiYlPxuyYKqyqPkCr0hlHI15ckn3kDUPS68VmTVgyPnLNrdVmg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@remusao/smaz-compress": "^1.10.0", + "@remusao/smaz-decompress": "^1.10.0" + } + }, + "node_modules/@cliqz/adblocker/node_modules/@remusao/smaz-compress": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.10.0.tgz", + "integrity": "sha512-E/lC8OSU+3bQrUl64vlLyPzIxo7dxF2RvNBe9KzcM4ax43J/d+YMinmMztHyCIHqRbz7rBCtkp3c0KfeIbHmEg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@remusao/trie": "^1.5.0" + } + }, + "node_modules/@cliqz/adblocker/node_modules/@remusao/smaz-decompress": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.10.0.tgz", + "integrity": "sha512-aA5ImUH480Pcs5/cOgToKmFnzi7osSNG6ft+7DdmQTaQEEst3nLq3JLlBEk+gwidURymjbx6DYs60LHaZ415VQ==", + "dev": true, + "license": "MPL-2.0" + }, + "node_modules/@cliqz/adblocker/node_modules/@remusao/trie": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.5.0.tgz", + "integrity": "sha512-UX+3utJKgwCsg6sUozjxd38gNMVRXrY4TNX9VvCdSrlZBS1nZjRPi98ON3QjRAdf6KCguJFyQARRsulTeqQiPg==", + "dev": true, + "license": "MPL-2.0" + }, "node_modules/@cliqz/adblocker/node_modules/tldts-core": { "version": "6.1.86", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", @@ -340,6 +431,64 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, + "node_modules/@ghostery/adblocker": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/@ghostery/adblocker/-/adblocker-2.18.2.tgz", + "integrity": "sha512-x6zEkf1dHSN0t4ExLmuN6nIgH0oAi6laoKe5yGsiIB4jkEvutea1PJgxgRUIjWfNbDRmkf4GjUtuqQFZgvQG1w==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ghostery/adblocker-content": "^2.18.2", + "@ghostery/adblocker-extended-selectors": "^2.18.2", + "@ghostery/url-parser": "^1.3.1", + "@remusao/guess-url-type": "^2.1.0", + "@remusao/small": "^2.1.0", + "@remusao/smaz": "^2.2.0", + "tldts-experimental": "^7.4.9" + } + }, + "node_modules/@ghostery/adblocker-content": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/@ghostery/adblocker-content/-/adblocker-content-2.18.2.tgz", + "integrity": "sha512-TOe/b4KOBFEc9OjLG+wvgamGcSTIPSDBAL5YSa8lzjBsoSl8IDnfOjeJDldlLacsC/JEUMLkZIDDNknEolJVqg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ghostery/adblocker-extended-selectors": "^2.18.2" + } + }, + "node_modules/@ghostery/adblocker-extended-selectors": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/@ghostery/adblocker-extended-selectors/-/adblocker-extended-selectors-2.18.2.tgz", + "integrity": "sha512-doKNShBk3+czQL08UkrysHkCPeG/kNPlXvz3DH7SXxD9Y78ovWkEAhjeR+upoan3fomJJuK3dD+IrlofnjckYw==", + "dev": true, + "license": "MPL-2.0" + }, + "node_modules/@ghostery/adblocker-playwright": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/@ghostery/adblocker-playwright/-/adblocker-playwright-2.18.2.tgz", + "integrity": "sha512-5rbO7GZ9nO0t0ATzAmeYL9cJlaVl3oI85NRBac3AEJoRkknWZ05OdlZsleMr7TziB2uK9rMySCyV9lDO6bQNBA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ghostery/adblocker": "^2.18.2", + "@ghostery/adblocker-content": "^2.18.2", + "tldts-experimental": "^7.4.9" + }, + "peerDependencies": { + "playwright": "^1.x" + } + }, + "node_modules/@ghostery/url-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ghostery/url-parser/-/url-parser-1.3.1.tgz", + "integrity": "sha512-QKqGi+7aDQ4RcyHyCwgEk6B9vWnsBP4Q7htaN0zPJV3ATqTKEQDtSTb9c/AN586oJUDs24YXKcwFYwNweY/YjQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "tldts-experimental": "^7.0.8" + } + }, "node_modules/@hono/node-server": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.1.tgz", @@ -501,9 +650,9 @@ "license": "MIT" }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", - "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.1.tgz", + "integrity": "sha512-H2HxLvC3HDNybePJaLdSrU1hhUK5iQw+WvV1b01myFyI7sdVGe1u/IPTE5D9fGCiJDVtgMV/lmFkQXLmQyIFYA==", "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9 || ^2.0.5", @@ -578,165 +727,383 @@ "node": ">= 8" } }, - "node_modules/@qualweb/act-rules": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@qualweb/act-rules/-/act-rules-0.8.5.tgz", - "integrity": "sha512-wiptioiycRwXyWkiiUyotpnIsUXYhVrjFPCTBnDJ7UUpr/Yd/V3RzQf5YrhVuGfgSNXo+JSzrAVnGudjT4qWtQ==", + "node_modules/@puppeteer/browsers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", "dev": true, - "license": "ISC" + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/@qualweb/best-practices": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@qualweb/best-practices/-/best-practices-0.7.13.tgz", - "integrity": "sha512-xzcH20w9iKowA+7fHLq1/CicTuwSfm/KgbNeA2lQeid7g+zlt/vVYV3G0j5rrPgsVJBK4of2XE3bk+lG237izQ==", + "node_modules/@puppeteer/browsers/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">= 14" + } }, - "node_modules/@qualweb/core": { - "version": "0.7.43", - "resolved": "https://registry.npmjs.org/@qualweb/core/-/core-0.7.43.tgz", - "integrity": "sha512-Xd0VJ3Me/C3krSndkMBdZw539baVNuglm7amhfyj0mLY7z8iePc58vmNMU0YEN1C8Y2/a9/b1aBGhgP/U/xO2w==", + "node_modules/@puppeteer/browsers/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { - "@qualweb/crawler": "0.3.15", - "@qualweb/dom": "0.2.6", - "@qualweb/earl-reporter": "0.4.3", - "@qualweb/evaluation": "0.3.28", - "@qualweb/locale": "0.1.12", - "colors": "1.4.0", - "puppeteer": "13.5.1", - "puppeteer-cluster": "^0.23.0", - "puppeteer-extra": "^3.2.3", - "puppeteer-extra-plugin-adblocker": "^2.12.0", - "puppeteer-extra-plugin-stealth": "^2.9.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=12" } }, - "node_modules/@qualweb/counter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@qualweb/counter/-/counter-0.2.0.tgz", - "integrity": "sha512-H/bkGMnWrHQmy5t/yyT4E6MMtOcfKTWKB9PstA6TXfWRWKZ3iQeXcTyZYFsNp3E+8Fjvb+MnmVwcdUCEjaUIkg==", + "node_modules/@puppeteer/browsers/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@puppeteer/browsers/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@puppeteer/browsers/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@qualweb/act-rules": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@qualweb/act-rules/-/act-rules-0.8.6.tgz", + "integrity": "sha512-EtW2HoVozjriBs4s1ZPEXkIxEfXoOivyX0rL4RMdcNz1NbrhyYXOLM6jigEDWteAICbhw0+H8wh1blfVeuPVJw==", + "dev": true, + "license": "ISC" + }, + "node_modules/@qualweb/best-practices": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@qualweb/best-practices/-/best-practices-0.7.13.tgz", + "integrity": "sha512-xzcH20w9iKowA+7fHLq1/CicTuwSfm/KgbNeA2lQeid7g+zlt/vVYV3G0j5rrPgsVJBK4of2XE3bk+lG237izQ==", "dev": true, "license": "ISC" }, - "node_modules/@qualweb/crawler": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@qualweb/crawler/-/crawler-0.3.15.tgz", - "integrity": "sha512-du1Cmhsr4LrKHd9MefzmOefIeufnFgsGgEqzSnM/HTcrViOxXP4dQcl6jO9rwmVlZ2PbVj5Y1Cl0+w8S8bCcrQ==", + "node_modules/@qualweb/core": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@qualweb/core/-/core-0.9.5.tgz", + "integrity": "sha512-otiAqOBLV6ZB+TMht9L0W5PGQWIyFaCy1gLQjPSamnvdrHBhrKDpYRhYPcVtzQJs1FfkjbUEAh3EQmoEx5xwRA==", "dev": true, "license": "ISC", "dependencies": { - "log-update": "4.0.0" + "@qualweb/crawler": "0.5.0", + "@qualweb/locale": "0.2.3", + "@qualweb/qw-element": "0.3.6", + "@qualweb/qw-page": "0.3.8", + "@qualweb/util": "0.7.4", + "axios": "^1.7.2", + "colors": "1.4.0", + "puppeteer": "^22.12.1", + "puppeteer-cluster": "^0.24.0", + "puppeteer-extra": "^3.3.6", + "puppeteer-extra-plugin-adblocker": "^2.13.6", + "puppeteer-extra-plugin-stealth": "^2.11.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@qualweb/dom": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@qualweb/dom/-/dom-0.2.6.tgz", - "integrity": "sha512-WcAPb1gPT2AU6S3MnAqAQC/TeAtLyNKzdhSuzuMk3tl92sBRpCsls9Rvs83SS1Bpm0VmIIhuHLr8CxhpKoqRFQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "node_modules/@qualweb/crawler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@qualweb/crawler/-/crawler-0.5.0.tgz", + "integrity": "sha512-krhQSNJF4xXCg3X9ArAVXHZL63hp+Idwna4jQI8ganEWpU/DxQVS0ekbnkdy+5RnosQx6gJrW1NiriUpI8nsPg==", "dev": true, "license": "ISC", "dependencies": { - "node-fetch": "^2.6.6" + "log-update": "4.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@qualweb/earl-reporter": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@qualweb/earl-reporter/-/earl-reporter-0.4.3.tgz", - "integrity": "sha512-zW3bg0a4tJF4rfVShJmTFNjJmG80/GK4V4VudtJ7ZTZeCbg6LM7MWsFw8DR487oYu/GlPGyAXiLpy2pInyjiEw==", + "node_modules/@qualweb/locale": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@qualweb/locale/-/locale-0.2.3.tgz", + "integrity": "sha512-OTIko+SWewuBZWLUvAjMXLiraOnmciJ+MZF6hn1wzKyQanC/x63RUdkvNVu2szgI2ALBW005NQwDXeK7VEkUAw==", "dev": true, "license": "ISC", "dependencies": { "lodash.clonedeep": "^4.5.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@qualweb/evaluation": { - "version": "0.3.28", - "resolved": "https://registry.npmjs.org/@qualweb/evaluation/-/evaluation-0.3.28.tgz", - "integrity": "sha512-PGw0rhDrA+iX+NcjcdEmXhgyEXz/jJ/YKeqaLRDqA/q5SmFKjw4+zLKgJK5BNqm6S65zPVIEwW+y7Q6Zg5yeYA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "ISC", - "dependencies": { - "@qualweb/act-rules": "0.6.15", - "@qualweb/best-practices": "0.6.11", - "@qualweb/counter": "0.2.0", - "@qualweb/qw-page": "0.2.13", - "@qualweb/util": "0.5.23", - "@qualweb/wcag-techniques": "0.3.10" } }, - "node_modules/@qualweb/evaluation/node_modules/@qualweb/act-rules": { - "version": "0.6.15", - "resolved": "https://registry.npmjs.org/@qualweb/act-rules/-/act-rules-0.6.15.tgz", - "integrity": "sha512-JjM+bLcHorfierrmFHM99T8SlRONuROV7irCLkUFS9EiXddNmh7WazTnEXRq5ad9pdskUYIqhA1QbdMZ36Fh/Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/@qualweb/evaluation/node_modules/@qualweb/best-practices": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/@qualweb/best-practices/-/best-practices-0.6.11.tgz", - "integrity": "sha512-rNKqMJ8ByJni9GSXMtWIJ1jkbs3AxwWNKa55tWx/UFb7KCA+hXapXD48P3qxsATqF9NPfp+NmCiUdQa7CplkhQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@qualweb/evaluation/node_modules/@qualweb/wcag-techniques": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/@qualweb/wcag-techniques/-/wcag-techniques-0.3.10.tgz", - "integrity": "sha512-kMMRF6FIOkVnI6vTffHU+Hn6XKEe/RtI6I1ZZ9Nvd7FASD6XbNtMIVFxxuiccM6gw2468C6A4i2yKCqB+Qc2gA==", - "dev": true, - "license": "ISC" - }, - "node_modules/@qualweb/locale": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@qualweb/locale/-/locale-0.1.12.tgz", - "integrity": "sha512-9aWV6o5OxxO9t5NfBLIbn4TsLnHF4++tRwAzHcUdMsn2eTUMf+e7aP7ZNJt6KYlC8DwRCQjsm9FXsGM3x8a09A==", + "node_modules/@qualweb/playwright-driver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@qualweb/playwright-driver/-/playwright-driver-1.0.1.tgz", + "integrity": "sha512-kU2WcT8BY+0rGKE8NM5ugftkB1XvZfpYJmm3n1m8IqtSbtuvfzh1dxXMcSpXRzUNT9mHZEVTX5JMtOzGloQDOw==", "dev": true, "license": "ISC", - "dependencies": { - "lodash.clonedeep": "^4.5.0" - }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" + }, + "peerDependencies": { + "@qualweb/core": "^0.9.3", + "playwright": ">=1.40.0" } }, "node_modules/@qualweb/qw-element": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@qualweb/qw-element/-/qw-element-0.2.8.tgz", - "integrity": "sha512-NO1le8YdDjfK4LD9axxYvse5C3Yd3byyUHXVWq5HaQ9xRn8NqXA8TI6bjID1KI1OEjusQ8UNah/UNeyVutpZxQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@qualweb/qw-element/-/qw-element-0.3.6.tgz", + "integrity": "sha512-f0ir3hiqhJ9eBDOX55BIMlVlDR71Fvb0UCN89lOGkZEudhdSZkyv0evqOLkEp2H/xN/p6F8PQgkqOQqtvXzv0A==", "dev": true, "license": "ISC" }, "node_modules/@qualweb/qw-page": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/@qualweb/qw-page/-/qw-page-0.2.13.tgz", - "integrity": "sha512-zT9WIBA1HIGVsiBoIDzlmeF45MMwamDEivOZq6klHZI8YATZuioLZRVecrY8JPuG52JVQf0tvq37eHQqH9BRvQ==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@qualweb/qw-page/-/qw-page-0.3.8.tgz", + "integrity": "sha512-Hf44R4UjczPwMaTDRu2o3Z+NTqqehOqNkCV7eIfcC3hwUNFUjg+vXOaTMzfmvWf+wwqtIDdm2uVAEB+7RVAhkw==", "dev": true, "license": "ISC", "dependencies": { - "@qualweb/qw-element": "0.2.8" + "@qualweb/qw-element": "0.3.6" } }, "node_modules/@qualweb/util": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/@qualweb/util/-/util-0.5.23.tgz", - "integrity": "sha512-B6p5GTEeWSMt1xYtSIfvkEcQDaq8mtFbPpL2zxZAZOXF7T6Cnu4oePV33JAUpw5zVB/mgCjjYHtlr4U6u6OvFg==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@qualweb/util/-/util-0.7.4.tgz", + "integrity": "sha512-GFf4BXhNGBHFU95m757rvXos1ONoxbaz3fCWOC/dEOMzhjHehcuTaNESfvXpqa1Wt5OXVbLC3NSr04oR7dWTLA==", "dev": true, "license": "ISC", "dependencies": { - "franc-min": "3.1.0", + "franc-min": "^6.2.0", "string-pixel-width": "^1.10.0" } }, @@ -748,9 +1115,9 @@ "license": "ISC" }, "node_modules/@redocly/cli": { - "version": "2.54.2", - "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-2.54.2.tgz", - "integrity": "sha512-YQ53kSQV/zpYSdY3WiQvf7JxuVLD8jTEX37YOY6MS+G3tyHDCeONpUkAt6qr9n2/nmGm6m+A+PB/mGFvhkt1uQ==", + "version": "2.54.3", + "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-2.54.3.tgz", + "integrity": "sha512-tgjCjKm9NjcbN0N04dylwUw8eZzematq07JHm+dVyPkAfA/eZEN57En7jpUYrPvwOb53MJLfDB/0qJ5iz/4eHQ==", "dev": true, "license": "MIT", "bin": { @@ -763,51 +1130,51 @@ } }, "node_modules/@remusao/guess-url-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.3.0.tgz", - "integrity": "sha512-SNSJGxH5ckvxb3EUHj4DqlAm/bxNxNv2kx/AESZva/9VfcBokwKNS+C4D1lQdWIDM1R3d3UG+xmVzlkNG8CPTQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-2.1.0.tgz", + "integrity": "sha512-zI3dlTUxpjvx2GCxp9nLOSK5yEIqDCpxlAVGwb2Y49RKkS72oeNaxxo+VWS5+XQ5+Mf8Zfp9ZXIlk+G5eoEN8A==", "dev": true, "license": "MPL-2.0" }, "node_modules/@remusao/small": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.3.0.tgz", - "integrity": "sha512-bydAhJI+ywmg5xMUcbqoR8KahetcfkFywEZpsyFZ8EBofilvWxbXnMSe4vnjDI1Y+SWxnNhR4AL/2BAXkf4b8A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@remusao/small/-/small-2.1.0.tgz", + "integrity": "sha512-Y1kyjZp7JU7dXdyOdxHVNfoTr1XLZJTyQP36/esZUU/WRWq9XY0PV2HsE3CsIHuaTf4pvgWv2pvzvnZ//UHIJQ==", "dev": true, "license": "MPL-2.0" }, "node_modules/@remusao/smaz": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.10.0.tgz", - "integrity": "sha512-GQzCxmmMpLkyZwcwNgz8TpuBEWl0RUQa8IcvKiYlPxuyYKqyqPkCr0hlHI15ckn3kDUPS68VmTVgyPnLNrdVmg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-2.2.0.tgz", + "integrity": "sha512-eSd3Qs0ELP/e7tU1SI5RWXcCn9KjDgvBY+KtWbL4i2QvvHhJOfdIt4v0AA3S5BbLWAr5dCEC7C4LUfogDm6q/Q==", "dev": true, "license": "MPL-2.0", "dependencies": { - "@remusao/smaz-compress": "^1.10.0", - "@remusao/smaz-decompress": "^1.10.0" + "@remusao/smaz-compress": "^2.2.0", + "@remusao/smaz-decompress": "^2.2.0" } }, "node_modules/@remusao/smaz-compress": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.10.0.tgz", - "integrity": "sha512-E/lC8OSU+3bQrUl64vlLyPzIxo7dxF2RvNBe9KzcM4ax43J/d+YMinmMztHyCIHqRbz7rBCtkp3c0KfeIbHmEg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-2.2.0.tgz", + "integrity": "sha512-TXpTPgILRUYOt2rEe0+9PC12xULPvBqeMpmipzB9A7oM4fa9Ztvy9lLYzPTd7tiQEeoNa1pmxihpKfJtsxnM/w==", "dev": true, "license": "MPL-2.0", "dependencies": { - "@remusao/trie": "^1.5.0" + "@remusao/trie": "^2.1.0" } }, "node_modules/@remusao/smaz-decompress": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.10.0.tgz", - "integrity": "sha512-aA5ImUH480Pcs5/cOgToKmFnzi7osSNG6ft+7DdmQTaQEEst3nLq3JLlBEk+gwidURymjbx6DYs60LHaZ415VQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-2.2.0.tgz", + "integrity": "sha512-ERAPwxPaA0/yg4hkNU7T2S+lnp9jj1sApcQMtOyROvOQyo+Zuh6Hn/oRcXr8mmjlYzyRaC7E6r3mT1nrdHR6pg==", "dev": true, "license": "MPL-2.0" }, "node_modules/@remusao/trie": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.5.0.tgz", - "integrity": "sha512-UX+3utJKgwCsg6sUozjxd38gNMVRXrY4TNX9VvCdSrlZBS1nZjRPi98ON3QjRAdf6KCguJFyQARRsulTeqQiPg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-2.1.0.tgz", + "integrity": "sha512-Er3Q8q0/2OcCJPQYJOPLmCuqO0wu7cav3SPtpjlxSbjFi1x+A1pZkkLD6c9q2rGEkGW/tkrRzfrhNMt8VQjzXg==", "dev": true, "license": "MPL-2.0" }, @@ -2258,6 +2625,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/chrome": { "version": "0.0.278", "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.278.tgz", @@ -2380,9 +2754,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", - "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -2677,9 +3051,9 @@ } }, "node_modules/accessibility-checker/node_modules/@puppeteer/browsers": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.2.tgz", - "integrity": "sha512-q2BU4YfO9h/Wt7IcWPcggpOOqLk2Tbs1hDwolvKZrweRjy751OJBKMN9zO5bfD0pzU7X/tvKw/exQds4pM/LOg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.3.tgz", + "integrity": "sha512-2Bt3m6dDAJqmZehn0wiXSYyQmuhyiHHZ7FjvrVaS1W2RoFGV6eCK71UvKYkNJjkwC1Q9nobjhvTMhLQztFVINA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2723,25 +3097,25 @@ } }, "node_modules/accessibility-checker/node_modules/devtools-protocol": { - "version": "0.0.1680125", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1680125.tgz", - "integrity": "sha512-rVARKAvOFJCFkvgX01VLvYqKIvt+cRCqvUxIhB2oAqVGPalxk3w3sb5TUGDagpow/EFblBpm/Zl/29QA2dd+jA==", + "version": "0.0.1687809", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1687809.tgz", + "integrity": "sha512-t7kSb+UKYdyxcmqy98U2P86ne6rCve3DIJ4+lp54i/hhClgFuG35JrLj23rO14Jw3sWDsp7i+22QhNU0+/qk8g==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/accessibility-checker/node_modules/puppeteer": { - "version": "25.11.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.11.0.tgz", - "integrity": "sha512-n+psxZFH/qlJ3gwTZMxTLUZoE98FAOEjT/BSxHXvPmNCGAfN/kq0UnIZ8m9RB4rAVvJr7zRHUnKKg98GLMUyyQ==", + "version": "25.12.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.12.0.tgz", + "integrity": "sha512-agM9cYcxbvmU17w9qtF17s7/Vv7Dhbyig6AWwIgvQQLR2dKZdPqNvRPanac7xH4iMPcNYOCfyCkwqCnR4nVOcA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "3.2.2", + "@puppeteer/browsers": "3.2.3", "chromium-bidi": "17.0.2", - "devtools-protocol": "0.0.1680125", + "devtools-protocol": "0.0.1687809", "lilconfig": "^3.1.3", - "puppeteer-core": "25.11.0", + "puppeteer-core": "25.12.0", "typed-query-selector": "^2.12.2" }, "bin": { @@ -2752,15 +3126,15 @@ } }, "node_modules/accessibility-checker/node_modules/puppeteer-core": { - "version": "25.11.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.11.0.tgz", - "integrity": "sha512-Ujym7JbxoAqanaxGcHgmTomfhC01HfDCSuGZ8Hs9boHrDjzbNVMnFRJo2KtbDT9LCRgeJoFnkn9JQZ41eEUrLw==", + "version": "25.12.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.12.0.tgz", + "integrity": "sha512-z6LQUt5SH7jwGtGA+nMtJuEjZIsqPiwQ+EFHCYuVDQrJpvifNmmGuyDvTzAKPyFzihxgHc5f3aMzu2kn8Ps37A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "3.2.2", + "@puppeteer/browsers": "3.2.3", "chromium-bidi": "17.0.2", - "devtools-protocol": "0.0.1680125", + "devtools-protocol": "0.0.1687809", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.3", "ws": "^8.21.3" @@ -2875,9 +3249,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", "dev": true, "license": "MIT", "engines": { @@ -3023,6 +3397,21 @@ "proxy-from-env": "^2.1.0" } }, + "node_modules/b4a": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.9.0.tgz", + "integrity": "sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -3033,6 +3422,91 @@ "node": "18 || 20 || >=22" } }, + "node_modules/bare-events": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz", + "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.2.tgz", + "integrity": "sha512-+ZI68KHMUvosXfKbg/UOHK0tbCdRnegbvPEdEcZ3Nd6TetieQsJPRXBRXPdLyy8+3VSEbPXtsumTpEtt78xv9w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.28.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-path": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.2.tgz", + "integrity": "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bare-stream": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz", + "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.8.1", + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.4.tgz", + "integrity": "sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -3064,18 +3538,6 @@ "node": ">=10.0.0" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", @@ -3267,6 +3729,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -3311,17 +3783,10 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "license": "ISC" - }, "node_modules/chromedriver": { - "version": "153.0.3", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-153.0.3.tgz", - "integrity": "sha512-/1+Fr3HcPnclLYYSQoK8l4otRzzda2lN/XOME7Nwhz98U8DI+tYom1+UjHBPeiLCFyZe5FsBiHjHPOuAkj2hvA==", + "version": "154.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-154.0.0.tgz", + "integrity": "sha512-kn+ENZ2lEPAmeDTNNBbVw6Xt4KAr6M4EFcgeV4lUREgJWHVZBu4fFc+OFivtuf5Q9jM/qSmAcQ3MdWtdOE6mVA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -3341,6 +3806,31 @@ "node": ">=22" } }, + "node_modules/chromium-bidi": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", + "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/chromium-bidi/node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3442,6 +3932,17 @@ "node": ">=0.10.0" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3584,37 +4085,56 @@ "url": "https://opencollective.com/express" } }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" }, "peerDependencies": { - "encoding": "^0.1.0" + "typescript": ">=4.9.5" }, "peerDependenciesMeta": { - "encoding": { + "typescript": { "optional": true } } }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3786,12 +4306,22 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.969999", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.969999.tgz", - "integrity": "sha512-6GfzuDWU0OFAuOvBokXpXPLxjOJ5DZ157Ue3sGQQM3LgAamb8m0R0ruSfN0DDu+XG5XJgT50i6zZ/0o8RglreQ==", + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "dev": true, "license": "BSD-3-Clause" }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -3865,9 +4395,9 @@ } }, "node_modules/dotenv": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-18.0.3.tgz", - "integrity": "sha512-/8CJTyL817qPnfbQrJgOEcrU3fDrJkRIoXBE566wHuvIXKOCHUZhPqGPbCPi9SogjdGnreF0TlvnTgK6J/8zpA==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-18.0.4.tgz", + "integrity": "sha512-jGt9uI5BIxpVO15kvy+iEFqNAwxYClKWnkptLjSNPnFLC003Imd0ofr3aEVsbpHdSBdSsbcApNIlz4nbyGMwdA==", "license": "BSD-2-Clause", "bin": { "dotenv": "dist/index.cjs" @@ -3938,6 +4468,26 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4237,6 +4787,16 @@ "node": ">= 0.6" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", @@ -4347,6 +4907,13 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -4648,13 +5215,17 @@ } }, "node_modules/franc-min": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/franc-min/-/franc-min-3.1.0.tgz", - "integrity": "sha512-YFHFyxHrIQ1Qqq7cSahcCUu9kDIa/sVMA1nQz0dHEgypLxpxLVxP5jgo0WSBE7lJuVIOAPr3QAhHAHRCQZL2AQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/franc-min/-/franc-min-6.2.0.tgz", + "integrity": "sha512-1uDIEUSlUZgvJa2AKYR/dmJC66v/PvGQ9mWfI9nOr/kPpMFyvswK0gPXOwpYJYiYD008PpHLkGfG58SPjQJFxw==", "dev": true, "license": "MIT", "dependencies": { - "trigram-utils": "^0.1.0" + "trigram-utils": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/fresh": { @@ -4666,13 +5237,6 @@ "node": ">= 0.8" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "license": "MIT" - }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -4961,9 +5525,9 @@ } }, "node_modules/hono": { - "version": "4.13.8", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.8.tgz", - "integrity": "sha512-/Gng7NfoykZl2pjukW5Z6+8Yxm3BPRf86GTbQnt0SbySkvax4fyL4H3HhY1cCpBGmiW9XDRFzRV+CXK2W8QudQ==", + "version": "4.13.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.9.tgz", + "integrity": "sha512-7dMkQmZoC4E6F7AtaQSPhlWAdnBti+j7rreMZl8QB4jFiEhP9TWbGWUMi8WYzBCgmgulxuvLQupKqo+Co6Omyg==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -5089,6 +5653,23 @@ "node": ">= 4" } }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5171,6 +5752,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -5371,6 +5959,13 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.4.2.tgz", @@ -5394,6 +5989,13 @@ "js-yaml": "bin/js-yaml.mjs" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -5561,6 +6163,13 @@ "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/linkify-it": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-6.1.0.tgz", @@ -5970,9 +6579,9 @@ } }, "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.1.tgz", + "integrity": "sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==", "dev": true, "license": "MIT", "dependencies": { @@ -6056,9 +6665,9 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.3.tgz", + "integrity": "sha512-wgyJtgUkUcdU7zci7uuwc/tzoAhm0TswWhaXuvnWolqug+8jY7bgNkBBL0dYBnHgc/tHL7lCzRdPsdUxUKKBqw==", "dev": true, "license": "MIT", "dependencies": { @@ -6067,8 +6676,10 @@ "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", + "micromark-util-character": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" }, @@ -6464,9 +7075,9 @@ } }, "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.1.0.tgz", + "integrity": "sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==", "dev": true, "funding": [ { @@ -6916,13 +7527,6 @@ "node": ">=0.10.0" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "license": "MIT" - }, "node_modules/modern-tar": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.8.5.tgz", @@ -6950,11 +7554,15 @@ } }, "node_modules/n-gram": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/n-gram/-/n-gram-0.1.2.tgz", - "integrity": "sha512-7wuibLo3ebm/o4bIFKsBhAZM/GA7/jwwg3LKUjN/bllNGLLfS4rhJuLsWPPB0ncPUcofAgndaS0MR2CDgkWeFQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/n-gram/-/n-gram-2.0.2.tgz", + "integrity": "sha512-S24aGsn+HLBxUGVAUFOwGpKs7LBcG4RudKU//eWzt/mQ97/NMKQxDWHyHx63UNWk/OOdihgmzoETn1tf5nQDzQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/natural-compare": { "version": "1.4.0", @@ -7155,16 +7763,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/pac-proxy-agent": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-9.1.0.tgz", @@ -7227,6 +7825,19 @@ "quickjs-wasi": "^2.2.0" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -7254,6 +7865,25 @@ "dev": true, "license": "MIT" }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7368,75 +7998,6 @@ "node": ">=16.20.0" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/playwright": { "version": "1.63.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", @@ -7680,42 +8241,54 @@ } }, "node_modules/puppeteer": { - "version": "13.5.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.5.1.tgz", - "integrity": "sha512-wWxO//vMiqxlvuzHMAJ0pRJeDHvDtM7DQpW1GKdStz2nZo2G42kOXBDgkmQ+zqjwMCFofKGesBeeKxIkX9BO+w==", + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz", + "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==", "deprecated": "< 24.15.0 is no longer supported", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.3", - "devtools-protocol": "0.0.969999", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "@puppeteer/browsers": "2.3.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1312386", + "puppeteer-core": "22.15.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" }, "engines": { - "node": ">=10.18.1" + "node": ">=18" } }, "node_modules/puppeteer-cluster": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/puppeteer-cluster/-/puppeteer-cluster-0.23.0.tgz", - "integrity": "sha512-108terIWDzPrQopmoYSPd5yDoy3FGJ2dNnoGMkGYPs6xtkdhgaECwpfZkzaRToMQPZibUOz0/dSSGgPEdXEhkQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/puppeteer-cluster/-/puppeteer-cluster-0.24.0.tgz", + "integrity": "sha512-zHPoNsrwkFLKFtgJJv2aC13EbMASQsE048uZd7CyikEXcl+sc1Nf6PMFb9kMoZI7/zMYxvuP658o2mw079ZZyQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.3" + "debug": "^4.3.4" }, "peerDependencies": { - "puppeteer": ">=1.5.0" + "puppeteer": ">=22.0.0" + } + }, + "node_modules/puppeteer-core": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", + "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.3", + "debug": "^4.3.6", + "devtools-protocol": "0.0.1312386", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/puppeteer-extra": { @@ -7891,74 +8464,6 @@ } } }, - "node_modules/puppeteer/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/puppeteer/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/puppeteer/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/puppeteer/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/puppeteer/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "license": "MIT", - "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 - } - } - }, "node_modules/qified": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", @@ -8051,19 +8556,14 @@ "node": ">= 0.10" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, "node_modules/require-from-string": { @@ -8075,6 +8575,16 @@ "node": ">=0.10.0" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -8217,27 +8727,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -8578,14 +9067,16 @@ "node": ">= 0.8" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/streamx": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz", + "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" } }, "node_modules/string-pixel-width": { @@ -8645,33 +9136,31 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz", + "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==", "dev": true, "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.1.tgz", + "integrity": "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==", "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "node_modules/tcp-port-used": { @@ -8710,6 +9199,16 @@ "dev": true, "license": "MIT" }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, "node_modules/test-exclude": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", @@ -8726,32 +9225,38 @@ } }, "node_modules/testaro": { - "version": "76.0.0", - "resolved": "https://registry.npmjs.org/testaro/-/testaro-76.0.0.tgz", - "integrity": "sha512-S7OxMMiIU9vQPqKVOvWoezSa3zQJ2frK4JZSYz5+hIGQlx0Qwc2URtKESvOIi6n3d2/hfMEpD4iNGvibiF4+Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@qualweb/act-rules": "*", - "@qualweb/best-practices": "*", - "@qualweb/core": "*", - "@qualweb/wcag-techniques": "*", - "@siteimprove/alfa-act": "*", - "@siteimprove/alfa-playwright": "*", - "@siteimprove/alfa-rules": "*", - "accessibility-checker": "*", - "aria-query": "*", - "aslint-testaro": "*", - "axe-playwright": "*", - "dotenv": "*", - "pixelmatch": "*", - "playwright": "*", - "playwright-dompath": "*", - "playwright-extra": "*", - "playwright-extra-plugin-stealth": "*", - "pngjs": "*", - "puppeteer-extra-plugin-stealth": "*", - "vnu-jar": "*" + "version": "78.4.0", + "resolved": "https://registry.npmjs.org/testaro/-/testaro-78.4.0.tgz", + "integrity": "sha512-c84O22IfQRHdhzsLjcV30Nhy5b97dIyz+fEbiepDBvIYKJmTRveHhqEALXDQ/KQheeqCNTFo7IUq8XATiFVckA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ghostery/adblocker-playwright": "^2.18.2", + "@qualweb/act-rules": "^0.8.5", + "@qualweb/best-practices": "^0.7.13", + "@qualweb/core": "^0.9.5", + "@qualweb/playwright-driver": "^1.0.1", + "@qualweb/wcag-techniques": "^0.4.8", + "@siteimprove/alfa-act": "^0.119.0", + "@siteimprove/alfa-playwright": "^0.84.2", + "@siteimprove/alfa-rules": "^0.119.0", + "accessibility-checker": "^4.0.30", + "aria-query": "^5.3.2", + "aslint-testaro": "^1.0.1", + "axe-playwright": "^2.2.2", + "diff": "^8.0.4", + "dotenv": "^17.4.2", + "pixelmatch": "^7.2.0", + "playwright": "^1.62.1", + "playwright-dompath": "^0.0.7", + "playwright-extra": "^4.3.6", + "playwright-extra-plugin-stealth": "^0.0.1", + "pngjs": "^7.0.0", + "puppeteer-extra-plugin-stealth": "^2.11.2", + "vnu-jar": "^26.8.15" + }, + "engines": { + "node": ">=22.12" } }, "node_modules/testaro-issues": { @@ -8760,6 +9265,29 @@ "integrity": "sha512-6cj+9PVTkpL4r5NSr+6KEZfmGEOJTJucImyGsGCfhaZzVLZB9ZG0xR0+jQ4W6I1W1difJltFB94kJ1f2V74rAA==", "license": "MIT" }, + "node_modules/testaro/node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -8816,20 +9344,20 @@ } }, "node_modules/tldts-core": { - "version": "5.7.112", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-5.7.112.tgz", - "integrity": "sha512-mutrEUgG2sp0e/MIAnv9TbSLR0IPbvmAImpzqul5O/HJ2XM1/I1sajchQ/fbj0fPdA31IiuWde8EUhfwyldY1Q==", + "version": "7.4.16", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.16.tgz", + "integrity": "sha512-MDolfaSJtlSK5Y0A1xl3277ekubZwobpBjugknDizI9O5Rm60a1m8k4ICK+MRsCDzPygT81mp3BBf5RKDlFRfA==", "dev": true, "license": "MIT" }, "node_modules/tldts-experimental": { - "version": "5.7.112", - "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-5.7.112.tgz", - "integrity": "sha512-Nq5qWN4OiLziAOOOEoSME7cZI4Hz8Srt+9q6cl8mZ5EAhCfmeE6l7K5XjuIKN+pySuGUvthE5aPiD185YU1/lg==", + "version": "7.4.16", + "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-7.4.16.tgz", + "integrity": "sha512-H1gI3Toi/7PoMRmBIX9K2cyWIEdxjW0F4ygsVRtsCM1thOZwa3zFc8SowUttgd0UhVUR2ahRbgUHEKrxj7WZ3w==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^5.7.112" + "tldts-core": "^7.4.16" } }, "node_modules/to-regex-range": { @@ -8862,13 +9390,18 @@ "license": "MIT" }, "node_modules/trigram-utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/trigram-utils/-/trigram-utils-0.1.1.tgz", - "integrity": "sha512-7ZPwE/Rr2Pvi/5HDVFtm6R3E7xYG8cSbr8xTdNORX1XzTzmvxI4TB44WDQOJOH6KhOkKc7kLAa55XtkirBwLQg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/trigram-utils/-/trigram-utils-2.0.1.tgz", + "integrity": "sha512-nfWIXHEaB+HdyslAfMxSqWKDdmqY9I32jS7GnqpdWQnLH89r6A5sdk3fDVYqGAZ0CrT8ovAFSAo6HRiWcWNIGQ==", "dev": true, "license": "MIT", "dependencies": { - "n-gram": "^0.1.0" + "collapse-white-space": "^2.0.0", + "n-gram": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/ts-api-utils": { @@ -9019,9 +9552,9 @@ "license": "MIT" }, "node_modules/unicorn-magic": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", - "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.1.tgz", + "integrity": "sha512-lzlXPoVB0Uy/FvTaUgX39RbixYiSKoc3JSoSf01+0c2B6FR3qdYIPN7Qjo/AV7n6sqLCk0509cT3LRj1oSZ1+A==", "dev": true, "license": "MIT", "engines": { @@ -9134,10 +9667,10 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", "dev": true, "license": "MIT" }, @@ -9166,9 +9699,9 @@ } }, "node_modules/vnu-jar": { - "version": "26.9.16", - "resolved": "https://registry.npmjs.org/vnu-jar/-/vnu-jar-26.9.16.tgz", - "integrity": "sha512-hDdy5FbqAD+eOZjUgYNzidSzi54v/VleB/asOyzYGCPcmsA9K4av6+oKS+ZP9DI1N2s/z6bX7k8kc5wWr3lsYg==", + "version": "26.9.27", + "resolved": "https://registry.npmjs.org/vnu-jar/-/vnu-jar-26.9.27.tgz", + "integrity": "sha512-TkQd5DFfOaWC9ebtvozTsrH2Vaod3jYg+vrOeREzIXxBexLz9+rS2DNtjn7+RPUiZhgli0SghgBX6RJRNea0KA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9302,9 +9835,9 @@ } }, "node_modules/ws": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", - "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 38f9fa54..d6632fa8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jrpool/kilotest", - "version": "54.0.0", + "version": "55.0.0", "description": "Ensemble testing for front-end web quality", "type": "module", "main": "index.ts", diff --git a/scripts/generate-openapi.ts b/scripts/generate-openapi.ts index 93b725aa..6bf05a29 100644 --- a/scripts/generate-openapi.ts +++ b/scripts/generate-openapi.ts @@ -58,7 +58,7 @@ const generate = () => { openapi: '3.1.0', info: { title: 'Kilotest API', - description: 'Kilotest is an ensemble testing and reporting service for front-end web quality. It uses an ensemble of 12 rule engines to test public web pages for front-end quality (accessibility, usability, and standards conformity). Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access. With this API you can request that a page be tested or retested, discover available reports, incrementally retrieve facts from a report: from what reports are available, to what issues were reported in one report, to what elements violated one issue, to what diagnoses rule engines gave for one violation.', + description: 'Kilotest is an ensemble testing and reporting service for front-end web quality. It uses an ensemble of 12 rule engines to test web pages for front-end quality (accessibility, usability, and standards conformity). Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access. With this API you can request that a page be tested or retested, discover available reports, incrementally retrieve facts from a report: from what reports are available, to what issues were reported in one report, to what elements violated one issue, to what diagnoses rule engines gave for one violation.', version, license: { name: license,