diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index f06235c..0000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 9bfb89f..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,74 +0,0 @@ -// eslint-disable-next-line no-undef -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint', 'unicorn', 'import'], - extends: ['eslint:recommended'], - env: { - browser: true, - es6: true, - }, - parserOptions: { - ecmaVersion: 2020, - sourceType: 'module', - }, - rules: { - quotes: ['error', 'single', { avoidEscape: true }], - camelcase: ['error', { properties: 'never' }], - semi: ['error', 'never'], - indent: 'off', - eqeqeq: ['error', 'always'], - - 'prefer-const': 'error', - 'no-multiple-empty-lines': [2, { max: 1, maxEOF: 1 }], - 'array-bracket-spacing': ['error', 'never'], - 'brace-style': ['error', '1tbs', { allowSingleLine: true }], - 'comma-spacing': ['error', { before: false, after: true }], - 'no-lonely-if': 'error', - 'dot-notation': 'error', - 'no-else-return': 'error', - 'no-tabs': 'error', - 'no-trailing-spaces': [ - 'error', - { - skipBlankLines: false, - ignoreComments: false, - }, - ], - 'no-var': 'error', - 'unicode-bom': ['error', 'never'], - curly: ['error', 'all'], - 'object-curly-spacing': ['error', 'always'], - 'keyword-spacing': ['error'], - 'require-atomic-updates': 0, - 'linebreak-style': ['error', 'unix'], - 'unicorn/prefer-node-protocol': ['error'], - 'unicorn/template-indent': ['error'], - 'import/extensions': ['error', 'ignorePackages'], - 'no-restricted-syntax': [ - 'error', - 'IfStatement > ExpressionStatement > AssignmentExpression', - ], - 'unicorn/prefer-ternary': 'error', - }, - overrides: [ - { - files: ['*.ts'], - rules: { - // see https://stackoverflow.com/questions/55280555/typescript-eslint-eslint-plugin-error-route-is-defined-but-never-used-no-un - 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': 'error', - '@typescript-eslint/consistent-type-imports': 'error', - 'no-undef': 'off', - // allow overloads - 'no-redeclare': 'off', - }, - }, - { - files: ['*.test.ts'], - rules: { - 'dot-notation': 'off', - }, - }, - ], -} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0905e08..4d8449b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,8 +34,10 @@ jobs: with: version: 8.8.0 run_install: false + - name: Install dependencies + run: pnpm install - name: ๐Ÿ“ฆ Bundle - run: pnpm test + run: pnpm -r --workspace-concurrency=1 build - name: ๐Ÿงช Run Tests run: pnpm test - name: ๐Ÿ› Debug Build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 303c6ed..cecb7cd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,9 +50,13 @@ jobs: - name: Install Dependencies run: pnpm install - name: Build - run: pnpm -r --workspace-concurrency=1 build + run: | + pnpm --filter "@wdio/devtools-backend" build + pnpm --filter "@wdio/devtools-script" build + pnpm --filter "@wdio/devtools-service" build + pnpm --filter "@wdio/devtools-app" build - name: Release - run: pnpm run release:ci -- ${{github.event.inputs.releaseType}} + run: pnpm -r publish --access public --no-git-checks env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/eslint.config.cjs b/eslint.config.cjs new file mode 100644 index 0000000..0119fee --- /dev/null +++ b/eslint.config.cjs @@ -0,0 +1,96 @@ +const js = require('@eslint/js') +const tsParser = require('@typescript-eslint/parser') +const tsPlugin = require('@typescript-eslint/eslint-plugin') +const importPlugin = require('eslint-plugin-import') +const unicorn = require('eslint-plugin-unicorn') +const prettierConfig = require('eslint-config-prettier') +const prettierPlugin = require('eslint-plugin-prettier') + +module.exports = [ + { + ignores: ['node_modules/**', '**/dist/**'] + }, + // Base JS config + { + ...js.configs.recommended, + plugins: { + unicorn, + import: importPlugin, + prettier: prettierPlugin + }, + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module' + }, + rules: { + ...prettierConfig.rules, + 'prettier/prettier': [ + 'error', + { + bracketSpacing: true, + semi: false, + singleQuote: true, + trailingComma: 'none' + } + ], + quotes: ['error', 'single', { avoidEscape: true }], + camelcase: ['error', { properties: 'never' }], + semi: ['error', 'never'], + eqeqeq: ['error', 'always'], + 'prefer-const': 'error', + 'no-multiple-empty-lines': [2, { max: 1, maxEOF: 1 }], + 'array-bracket-spacing': ['error', 'never'], + 'brace-style': ['error', '1tbs', { allowSingleLine: true }], + 'comma-spacing': ['error', { before: false, after: true }], + 'no-lonely-if': 'error', + 'dot-notation': 'error', + 'no-else-return': 'error', + 'no-tabs': 'error', + 'no-trailing-spaces': [ + 'error', + { skipBlankLines: false, ignoreComments: false } + ], + 'no-var': 'error', + 'unicode-bom': ['error', 'never'], + curly: ['error', 'all'], + 'object-curly-spacing': ['error', 'always'], + 'keyword-spacing': ['error'], + 'require-atomic-updates': 0, + 'linebreak-style': ['error', 'unix'], + 'import/extensions': ['error', 'ignorePackages'], + 'no-restricted-syntax': [ + 'error', + 'IfStatement > ExpressionStatement > AssignmentExpression' + ] + } + }, + + // TypeScript files + { + files: ['**/*.ts'], + plugins: { + '@typescript-eslint': tsPlugin + }, + languageOptions: { + parser: tsParser + }, + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_' } + ], + '@typescript-eslint/consistent-type-imports': 'error', + 'no-unused-vars': 'off', + 'no-undef': 'off', + 'no-redeclare': 'off' + } + }, + + // TypeScript test files + { + files: ['**/*.test.ts'], + rules: { + 'dot-notation': 'off' + } + } +] diff --git a/example/features/pageobjects/login.page.ts b/example/features/pageobjects/login.page.ts index e3f0680..faf94cb 100644 --- a/example/features/pageobjects/login.page.ts +++ b/example/features/pageobjects/login.page.ts @@ -5,37 +5,37 @@ import Page from './page.js' * sub page containing specific selectors and methods for a specific page */ class LoginPage extends Page { - /** - * define selectors using getter methods - */ - public get inputUsername () { - return $('#username') - } + /** + * define selectors using getter methods + */ + public get inputUsername() { + return $('#username') + } - public get inputPassword () { - return $('#password') - } + public get inputPassword() { + return $('#password') + } - public get btnSubmit () { - return $('button[type="submit"]') - } + public get btnSubmit() { + return $('button[type="submit"]') + } - /** - * a method to encapsule automation code to interact with the page - * e.g. to login using username and password - */ - public async login (username: string, password: string) { - await this.inputUsername.setValue(username) - await this.inputPassword.setValue(password) - await this.btnSubmit.click() - } + /** + * a method to encapsule automation code to interact with the page + * e.g. to login using username and password + */ + public async login(username: string, password: string) { + await this.inputUsername.setValue(username) + await this.inputPassword.setValue(password) + await this.btnSubmit.click() + } - /** - * overwrite specific options to adapt it to page object - */ - public open () { - return super.open('login') - } + /** + * overwrite specific options to adapt it to page object + */ + public open() { + return super.open('login') + } } export default new LoginPage() diff --git a/example/features/pageobjects/page.ts b/example/features/pageobjects/page.ts index 6a20f1c..0ac627c 100644 --- a/example/features/pageobjects/page.ts +++ b/example/features/pageobjects/page.ts @@ -1,15 +1,15 @@ import { browser } from '@wdio/globals' /** -* main page object containing all methods, selectors and functionality -* that is shared across all page objects -*/ + * main page object containing all methods, selectors and functionality + * that is shared across all page objects + */ export default class Page { - /** - * Opens a sub page of the page - * @param path path of the sub page (e.g. /path/to/page.html) - */ - public open (path: string) { - return browser.url(`https://the-internet.herokuapp.com/${path}`) - } + /** + * Opens a sub page of the page + * @param path path of the sub page (e.g. /path/to/page.html) + */ + public open(path: string) { + return browser.url(`https://the-internet.herokuapp.com/${path}`) + } } diff --git a/example/features/pageobjects/secure.page.ts b/example/features/pageobjects/secure.page.ts index 0f0cfcc..d907382 100644 --- a/example/features/pageobjects/secure.page.ts +++ b/example/features/pageobjects/secure.page.ts @@ -5,12 +5,12 @@ import Page from './page.js' * sub page containing specific selectors and methods for a specific page */ class SecurePage extends Page { - /** - * define selectors using getter methods - */ - public get flashAlert () { - return $('#flash') - } + /** + * define selectors using getter methods + */ + public get flashAlert() { + return $('#flash') + } } export default new SecurePage() diff --git a/example/features/step-definitions/steps.ts b/example/features/step-definitions/steps.ts index e1ecc40..2a386b0 100644 --- a/example/features/step-definitions/steps.ts +++ b/example/features/step-definitions/steps.ts @@ -5,25 +5,24 @@ import LoginPage from '../pageobjects/login.page.js' import SecurePage from '../pageobjects/secure.page.js' const pages = { - login: LoginPage + login: LoginPage } as const After(async () => { - await browser.reloadSession() + await browser.reloadSession() }) Given(/^I am on the (\w+) page$/, async (page: keyof typeof pages) => { - await pages[page].open() + await pages[page].open() }) When(/^I login with (\w+) and (.+)$/, async (username, password) => { - await LoginPage.login(username, password) + await LoginPage.login(username, password) }) Then(/^I should see a flash message saying (.*)$/, async (message) => { - const el = await SecurePage.flashAlert - await expect(el).toBeExisting() - await expect(el).toHaveText(expect.stringContaining(message)) - await browser.pause(15000) + const el = await SecurePage.flashAlert + await expect(el).toBeExisting() + await expect(el).toHaveText(expect.stringContaining(message)) + // await browser.pause(15000) }) - diff --git a/example/wdio.conf.ts b/example/wdio.conf.ts index 2719e28..3fe790c 100644 --- a/example/wdio.conf.ts +++ b/example/wdio.conf.ts @@ -4,337 +4,339 @@ import type { Options } from '@wdio/types' const __dirname = path.resolve(path.dirname(new URL(import.meta.url).pathname)) export const config: Options.Testrunner = { - // - // ==================== - // Runner Configuration - // ==================== - // WebdriverIO supports running e2e tests as well as unit and component tests. - runner: 'local', - autoCompileOpts: { - autoCompile: true, - tsNodeOpts: { - project: './tsconfig.json', - transpileOnly: true - } - }, - // - // ================== - // Specify Test Files - // ================== - // Define which test specs should run. The pattern is relative to the directory - // of the configuration file being run. - // - // The specs are defined as an array of spec files (optionally using wildcards - // that will be expanded). The test for each spec file will be run in a separate - // worker process. In order to have a group of spec files run in the same worker - // process simply enclose them in an array within the specs array. - // - // If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script), - // then the current working directory is where your `package.json` resides, so `wdio` - // will be called from there. - // - specs: [ - './features/**/*.feature' - ], - // Patterns to exclude. - exclude: [ - // 'path/to/excluded/files' - ], - // - // ============ - // Capabilities - // ============ - // Define your capabilities here. WebdriverIO can run multiple capabilities at the same - // time. Depending on the number of capabilities, WebdriverIO launches several test - // sessions. Within your capabilities you can overwrite the spec and exclude options in - // order to group specific specs to a specific capability. - // - // First, you can define how many instances should be started at the same time. Let's - // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have - // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec - // files and you set maxInstances to 10, all spec files will get tested at the same time - // and 30 processes will get spawned. The property handles how many capabilities - // from the same test should run tests. - // - maxInstances: 10, - // - // If you have trouble getting all important capabilities together, check out the - // Sauce Labs platform configurator - a great tool to configure your capabilities: - // https://saucelabs.com/platform/platform-configurator - // - capabilities: [{ - browserName: 'chrome', - 'goog:chromeOptions': { - args: ['--headless', '--disable-gpu', '--window-size=1280,800'] - } - // }, { - // browserName: 'firefox', - // 'moz:firefoxOptions': { - // args: ['-headless'] - // } - }], + // + // ==================== + // Runner Configuration + // ==================== + // WebdriverIO supports running e2e tests as well as unit and component tests. + runner: 'local', + autoCompileOpts: { + autoCompile: true, + tsNodeOpts: { + project: './tsconfig.json', + transpileOnly: true + } + }, + // + // ================== + // Specify Test Files + // ================== + // Define which test specs should run. The pattern is relative to the directory + // of the configuration file being run. + // + // The specs are defined as an array of spec files (optionally using wildcards + // that will be expanded). The test for each spec file will be run in a separate + // worker process. In order to have a group of spec files run in the same worker + // process simply enclose them in an array within the specs array. + // + // If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script), + // then the current working directory is where your `package.json` resides, so `wdio` + // will be called from there. + // + specs: ['./features/**/*.feature'], + // Patterns to exclude. + exclude: [ + // 'path/to/excluded/files' + ], + // + // ============ + // Capabilities + // ============ + // Define your capabilities here. WebdriverIO can run multiple capabilities at the same + // time. Depending on the number of capabilities, WebdriverIO launches several test + // sessions. Within your capabilities you can overwrite the spec and exclude options in + // order to group specific specs to a specific capability. + // + // First, you can define how many instances should be started at the same time. Let's + // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have + // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec + // files and you set maxInstances to 10, all spec files will get tested at the same time + // and 30 processes will get spawned. The property handles how many capabilities + // from the same test should run tests. + // + maxInstances: 10, + // + // If you have trouble getting all important capabilities together, check out the + // Sauce Labs platform configurator - a great tool to configure your capabilities: + // https://saucelabs.com/platform/platform-configurator + // + capabilities: [ + { + browserName: 'chrome', + 'goog:chromeOptions': { + args: ['--headless', '--disable-gpu', '--window-size=1280,800'] + } + // }, { + // browserName: 'firefox', + // 'moz:firefoxOptions': { + // args: ['-headless'] + // } + } + ], - // - // =================== - // Test Configurations - // =================== - // Define all options that are relevant for the WebdriverIO instance here - // - // Level of logging verbosity: trace | debug | info | warn | error | silent - logLevel: 'info', - // - // Set specific log levels per logger - // loggers: - // - webdriver, webdriverio - // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service - // - @wdio/mocha-framework, @wdio/jasmine-framework - // - @wdio/local-runner - // - @wdio/sumologic-reporter - // - @wdio/cli, @wdio/config, @wdio/utils - // Level of logging verbosity: trace | debug | info | warn | error | silent - // logLevels: { - // webdriver: 'info', - // '@wdio/appium-service': 'info' - // }, - // - // If you only want to run your tests until a specific amount of tests have failed use - // bail (default is 0 - don't bail, run all tests). - bail: 0, - // - // Set a base URL in order to shorten url command calls. If your `url` parameter starts - // with `/`, the base url gets prepended, not including the path portion of your baseUrl. - // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url - // gets prepended directly. - baseUrl: 'http://localhost', - // - // Default timeout for all waitFor* commands. - waitforTimeout: 10000, - // - // Default timeout in milliseconds for request - // if browser driver or grid doesn't send response - connectionRetryTimeout: 120000, - // - // Default request retries count - connectionRetryCount: 3, - // - // Test runner services - // Services take over a specific job you don't want to take care of. They enhance - // your test setup with almost no effort. Unlike plugins, they don't add new - // commands. Instead, they hook themselves up into the test process. - services: ['devtools'], - // - // Framework you want to run your specs with. - // The following are supported: Mocha, Jasmine, and Cucumber - // see also: https://webdriver.io/docs/frameworks - // - // Make sure you have the wdio adapter package for the specific framework installed - // before running any tests. - framework: 'cucumber', + // + // =================== + // Test Configurations + // =================== + // Define all options that are relevant for the WebdriverIO instance here + // + // Level of logging verbosity: trace | debug | info | warn | error | silent + logLevel: 'debug', + // + // Set specific log levels per logger + // loggers: + // - webdriver, webdriverio + // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service + // - @wdio/mocha-framework, @wdio/jasmine-framework + // - @wdio/local-runner + // - @wdio/sumologic-reporter + // - @wdio/cli, @wdio/config, @wdio/utils + // Level of logging verbosity: trace | debug | info | warn | error | silent + // logLevels: { + // webdriver: 'info', + // '@wdio/appium-service': 'info' + // }, + // + // If you only want to run your tests until a specific amount of tests have failed use + // bail (default is 0 - don't bail, run all tests). + bail: 0, + // + // Set a base URL in order to shorten url command calls. If your `url` parameter starts + // with `/`, the base url gets prepended, not including the path portion of your baseUrl. + // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url + // gets prepended directly. + baseUrl: 'http://localhost', + // + // Default timeout for all waitFor* commands. + waitforTimeout: 10000, + // + // Default timeout in milliseconds for request + // if browser driver or grid doesn't send response + connectionRetryTimeout: 120000, + // + // Default request retries count + connectionRetryCount: 3, + // + // Test runner services + // Services take over a specific job you don't want to take care of. They enhance + // your test setup with almost no effort. Unlike plugins, they don't add new + // commands. Instead, they hook themselves up into the test process. + services: ['devtools'], + // + // Framework you want to run your specs with. + // The following are supported: Mocha, Jasmine, and Cucumber + // see also: https://webdriver.io/docs/frameworks + // + // Make sure you have the wdio adapter package for the specific framework installed + // before running any tests. + framework: 'cucumber', - // - // The number of times to retry the entire spec file when it fails as a whole - // specFileRetries: 1, - // - // Delay in seconds between the spec file retry attempts - // specFileRetriesDelay: 0, - // - // Whether or not retried spec files should be retried immediately or deferred to the end of the queue - // specFileRetriesDeferred: false, - // - // Test reporter for stdout. - // The only one supported by default is 'dot' - // see also: https://webdriver.io/docs/dot-reporter - reporters: ['spec'], + // + // The number of times to retry the entire spec file when it fails as a whole + // specFileRetries: 1, + // + // Delay in seconds between the spec file retry attempts + // specFileRetriesDelay: 0, + // + // Whether or not retried spec files should be retried immediately or deferred to the end of the queue + // specFileRetriesDeferred: false, + // + // Test reporter for stdout. + // The only one supported by default is 'dot' + // see also: https://webdriver.io/docs/dot-reporter + reporters: ['spec'], - // If you are using Cucumber you need to specify the location of your step definitions. - cucumberOpts: { - // (file/dir) require files before executing features - require: [path.resolve(__dirname, 'features', 'step-definitions', 'steps.ts')], - // show full backtrace for errors - backtrace: false, - // ("extension:module") require files with the given EXTENSION after requiring MODULE (repeatable) - requireModule: [], - // invoke formatters without executing steps - dryRun: false, - // abort the run on first failure - failFast: false, - // hide step definition snippets for pending steps - snippets: true, - // hide source uris - source: true, - // fail if there are any undefined or pending steps - strict: false, - // (expression) only execute the features or scenarios with tags matching the expression - tagExpression: '', - // timeout for step definitions - timeout: 60000, - // Enable this config to treat undefined definitions as warnings. - ignoreUndefinedDefinitions: false - }, + // If you are using Cucumber you need to specify the location of your step definitions. + cucumberOpts: { + // (file/dir) require files before executing features + require: [ + path.resolve(__dirname, 'features', 'step-definitions', 'steps.ts') + ], + // show full backtrace for errors + backtrace: false, + // ("extension:module") require files with the given EXTENSION after requiring MODULE (repeatable) + requireModule: [], + // invoke formatters without executing steps + dryRun: false, + // abort the run on first failure + failFast: false, + // hide step definition snippets for pending steps + snippets: true, + // hide source uris + source: true, + // fail if there are any undefined or pending steps + strict: false, + // (expression) only execute the features or scenarios with tags matching the expression + tagExpression: '', + // timeout for step definitions + timeout: 60000, + // Enable this config to treat undefined definitions as warnings. + ignoreUndefinedDefinitions: false + }, - // - // ===== - // Hooks - // ===== - // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance - // it and to build services around it. You can either apply a single function or an array of - // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got - // resolved to continue. - /** - * Gets executed once before all workers get launched. - * @param {object} config wdio configuration object - * @param {Array.} capabilities list of capabilities details - */ - // onPrepare: function (config, capabilities) { - // }, - /** - * Gets executed before a worker process is spawned and can be used to initialize specific service - * for that worker as well as modify runtime environments in an async fashion. - * @param {string} cid capability id (e.g 0-0) - * @param {object} caps object containing capabilities for session that will be spawn in the worker - * @param {object} specs specs to be run in the worker process - * @param {object} args object that will be merged with the main configuration once worker is initialized - * @param {object} execArgv list of string arguments passed to the worker process - */ - // onWorkerStart: function (cid, caps, specs, args, execArgv) { - // }, - /** - * Gets executed just after a worker process has exited. - * @param {string} cid capability id (e.g 0-0) - * @param {number} exitCode 0 - success, 1 - fail - * @param {object} specs specs to be run in the worker process - * @param {number} retries number of retries used - */ - // onWorkerEnd: function (cid, exitCode, specs, retries) { - // }, - /** - * Gets executed just before initializing the webdriver session and test framework. It allows you - * to manipulate configurations depending on the capability or spec. - * @param {object} config wdio configuration object - * @param {Array.} capabilities list of capabilities details - * @param {Array.} specs List of spec file paths that are to be run - * @param {string} cid worker id (e.g. 0-0) - */ - // beforeSession: function (config, capabilities) { - // }, - /** - * Gets executed before test execution begins. At this point you can access to all global - * variables like `browser`. It is the perfect place to define custom commands. - * @param {Array.} capabilities list of capabilities details - * @param {Array.} specs List of spec file paths that are to be run - * @param {object} browser instance of created browser/device session - */ - before: async function () { - await browser.pause(5000) - }, - /** - * Runs before a WebdriverIO command gets executed. - * @param {string} commandName hook command name - * @param {Array} args arguments that command would receive - */ - // beforeCommand: function (commandName, args) { - // }, - /** - * Cucumber Hooks - * - * Runs before a Cucumber Feature. - * @param {string} uri path to feature file - * @param {GherkinDocument.IFeature} feature Cucumber feature object - */ - // beforeFeature: function (uri, feature) { - // }, - /** - * - * Runs before a Cucumber Scenario. - * @param {ITestCaseHookParameter} world world object containing information on pickle and test step - * @param {object} context Cucumber World object - */ - // beforeScenario: function (world, context) { - // }, - /** - * - * Runs before a Cucumber Step. - * @param {Pickle.IPickleStep} step step data - * @param {IPickle} scenario scenario pickle - * @param {object} context Cucumber World object - */ - // beforeStep: function (step, scenario, context) { - // }, - /** - * - * Runs after a Cucumber Step. - * @param {Pickle.IPickleStep} step step data - * @param {IPickle} scenario scenario pickle - * @param {object} result results object containing scenario results - * @param {boolean} result.passed true if scenario has passed - * @param {string} result.error error stack if scenario failed - * @param {number} result.duration duration of scenario in milliseconds - * @param {object} context Cucumber World object - */ - // afterStep: function (step, scenario, result, context) { - // }, - /** - * - * Runs after a Cucumber Scenario. - * @param {ITestCaseHookParameter} world world object containing information on pickle and test step - * @param {object} result results object containing scenario results - * @param {boolean} result.passed true if scenario has passed - * @param {string} result.error error stack if scenario failed - * @param {number} result.duration duration of scenario in milliseconds - * @param {object} context Cucumber World object - */ - // afterScenario: function (world, result, context) { - // }, - /** - * - * Runs after a Cucumber Feature. - * @param {string} uri path to feature file - * @param {GherkinDocument.IFeature} feature Cucumber feature object - */ - // afterFeature: function (uri, feature) { - // }, + // + // ===== + // Hooks + // ===== + // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance + // it and to build services around it. You can either apply a single function or an array of + // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got + // resolved to continue. + /** + * Gets executed once before all workers get launched. + * @param {object} config wdio configuration object + * @param {Array.} capabilities list of capabilities details + */ + // onPrepare: function (config, capabilities) { + // }, + /** + * Gets executed before a worker process is spawned and can be used to initialize specific service + * for that worker as well as modify runtime environments in an async fashion. + * @param {string} cid capability id (e.g 0-0) + * @param {object} caps object containing capabilities for session that will be spawn in the worker + * @param {object} specs specs to be run in the worker process + * @param {object} args object that will be merged with the main configuration once worker is initialized + * @param {object} execArgv list of string arguments passed to the worker process + */ + // onWorkerStart: function (cid, caps, specs, args, execArgv) { + // }, + /** + * Gets executed just after a worker process has exited. + * @param {string} cid capability id (e.g 0-0) + * @param {number} exitCode 0 - success, 1 - fail + * @param {object} specs specs to be run in the worker process + * @param {number} retries number of retries used + */ + // onWorkerEnd: function (cid, exitCode, specs, retries) { + // }, + /** + * Gets executed just before initializing the webdriver session and test framework. It allows you + * to manipulate configurations depending on the capability or spec. + * @param {object} config wdio configuration object + * @param {Array.} capabilities list of capabilities details + * @param {Array.} specs List of spec file paths that are to be run + * @param {string} cid worker id (e.g. 0-0) + */ + // beforeSession: function (config, capabilities) { + // }, + /** + * Gets executed before test execution begins. At this point you can access to all global + * variables like `browser`. It is the perfect place to define custom commands. + * @param {Array.} capabilities list of capabilities details + * @param {Array.} specs List of spec file paths that are to be run + * @param {object} browser instance of created browser/device session + */ + before: async function () { + await browser.pause(5000) + } + /** + * Runs before a WebdriverIO command gets executed. + * @param {string} commandName hook command name + * @param {Array} args arguments that command would receive + */ + // beforeCommand: function (commandName, args) { + // }, + /** + * Cucumber Hooks + * + * Runs before a Cucumber Feature. + * @param {string} uri path to feature file + * @param {GherkinDocument.IFeature} feature Cucumber feature object + */ + // beforeFeature: function (uri, feature) { + // }, + /** + * + * Runs before a Cucumber Scenario. + * @param {ITestCaseHookParameter} world world object containing information on pickle and test step + * @param {object} context Cucumber World object + */ + // beforeScenario: function (world, context) { + // }, + /** + * + * Runs before a Cucumber Step. + * @param {Pickle.IPickleStep} step step data + * @param {IPickle} scenario scenario pickle + * @param {object} context Cucumber World object + */ + // beforeStep: function (step, scenario, context) { + // }, + /** + * + * Runs after a Cucumber Step. + * @param {Pickle.IPickleStep} step step data + * @param {IPickle} scenario scenario pickle + * @param {object} result results object containing scenario results + * @param {boolean} result.passed true if scenario has passed + * @param {string} result.error error stack if scenario failed + * @param {number} result.duration duration of scenario in milliseconds + * @param {object} context Cucumber World object + */ + // afterStep: function (step, scenario, result, context) { + // }, + /** + * + * Runs after a Cucumber Scenario. + * @param {ITestCaseHookParameter} world world object containing information on pickle and test step + * @param {object} result results object containing scenario results + * @param {boolean} result.passed true if scenario has passed + * @param {string} result.error error stack if scenario failed + * @param {number} result.duration duration of scenario in milliseconds + * @param {object} context Cucumber World object + */ + // afterScenario: function (world, result, context) { + // }, + /** + * + * Runs after a Cucumber Feature. + * @param {string} uri path to feature file + * @param {GherkinDocument.IFeature} feature Cucumber feature object + */ + // afterFeature: function (uri, feature) { + // }, - /** - * Runs after a WebdriverIO command gets executed - * @param {string} commandName hook command name - * @param {Array} args arguments that command would receive - * @param {number} result 0 - command success, 1 - command error - * @param {object} error error object if any - */ - // afterCommand: function (commandName, args, result, error) { - // }, - /** - * Gets executed after all tests are done. You still have access to all global variables from - * the test. - * @param {number} result 0 - test pass, 1 - test fail - * @param {Array.} capabilities list of capabilities details - * @param {Array.} specs List of spec file paths that ran - */ - // after: function (result, capabilities, specs) { - // }, - /** - * Gets executed right after terminating the webdriver session. - * @param {object} config wdio configuration object - * @param {Array.} capabilities list of capabilities details - * @param {Array.} specs List of spec file paths that ran - */ - // afterSession: function (config, capabilities, specs) { - // }, - /** - * Gets executed after all workers got shut down and the process is about to exit. An error - * thrown in the onComplete hook will result in the test run failing. - * @param {object} exitCode 0 - success, 1 - fail - * @param {object} config wdio configuration object - * @param {Array.} capabilities list of capabilities details - * @param {} results object containing test results - */ - // onComplete: function(exitCode, config, capabilities, results) { - // }, - /** - * Gets executed when a refresh happens. - * @param {string} oldSessionId session ID of the old session - * @param {string} newSessionId session ID of the new session - */ - // onReload: function(oldSessionId, newSessionId) { - // } + /** + * Runs after a WebdriverIO command gets executed + * @param {string} commandName hook command name + * @param {Array} args arguments that command would receive + * @param {number} result 0 - command success, 1 - command error + * @param {object} error error object if any + */ + // afterCommand: function (commandName, args, result, error) { + // }, + /** + * Gets executed after all tests are done. You still have access to all global variables from + * the test. + * @param {number} result 0 - test pass, 1 - test fail + * @param {Array.} capabilities list of capabilities details + * @param {Array.} specs List of spec file paths that ran + */ + // after: function (result, capabilities, specs) { + // }, + /** + * Gets executed right after terminating the webdriver session. + * @param {object} config wdio configuration object + * @param {Array.} capabilities list of capabilities details + * @param {Array.} specs List of spec file paths that ran + */ + // afterSession: function (config, capabilities, specs) { + // }, + /** + * Gets executed after all workers got shut down and the process is about to exit. An error + * thrown in the onComplete hook will result in the test run failing. + * @param {object} exitCode 0 - success, 1 - fail + * @param {object} config wdio configuration object + * @param {Array.} capabilities list of capabilities details + * @param {} results object containing test results + */ + // onComplete: function(exitCode, config, capabilities, results) { + // }, + /** + * Gets executed when a refresh happens. + * @param {string} oldSessionId session ID of the old session + * @param {string} newSessionId session ID of the new session + */ + // onReload: function(oldSessionId, newSessionId) { + // } } diff --git a/package.json b/package.json index 19dd628..bdd6fc0 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,14 @@ "@vitest/browser": "^3.2.4", "autoprefixer": "^10.4.21", "eslint": "^9.33.0", + "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-unicorn": "^59.0.1", "npm-run-all": "^4.1.5", "postcss": "^8.5.6", "postcss-lit": "^1.2.0", + "prettier": "^3.6.2", "tailwindcss": "^4.1.12", "ts-node": "^10.9.2", "tsx": "^4.20.4", diff --git a/packages/app/package.json b/packages/app/package.json index 138e6b5..9eea2e4 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -21,13 +21,13 @@ "lit": "^3.3.1", "placeholder-loading": "^0.7.0", "pointer-tracker": "^2.5.3", - "preact": "^10.27.1" + "preact": "^10.27.1", + "@wdio/devtools-service": "workspace:*" }, "author": "Christian Bromann ", "license": "MIT", "devDependencies": { "@tailwindcss/postcss": "^4.1.12", - "@wdio/devtools-service": "workspace:*", "@wdio/reporter": "9.18.0", "autoprefixer": "^10.4.21", "postcss": "^8.5.6", diff --git a/packages/app/postcss.config.cjs b/packages/app/postcss.config.cjs index 33ad091..85f717c 100644 --- a/packages/app/postcss.config.cjs +++ b/packages/app/postcss.config.cjs @@ -1,6 +1,6 @@ module.exports = { plugins: { tailwindcss: {}, - autoprefixer: {}, - }, + autoprefixer: {} + } } diff --git a/packages/app/src/app.ts b/packages/app/src/app.ts index 7296fae..ddd5568 100644 --- a/packages/app/src/app.ts +++ b/packages/app/src/app.ts @@ -17,20 +17,23 @@ const SIDEBAR_MIN_WIDTH = 250 export class WebdriverIODevtoolsApplication extends Element { dataManager = new DataManagerController(this) - static styles = [...Element.styles, css` - :host { - display: flex; - width: 100%; - height: 100vh; - flex-wrap: wrap; - overflow: hidden; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + width: 100%; + height: 100vh; + flex-wrap: wrap; + overflow: hidden; + } + ` + ] #drag = new DragController(this, { localStorageKey: 'sidebarWidth', minPosition: SIDEBAR_MIN_WIDTH, - initialPosition: window.innerWidth * .2, + initialPosition: window.innerWidth * 0.2, getContainerEl: () => this.#getWindow(), direction: Direction.horizontal }) @@ -58,22 +61,27 @@ export class WebdriverIODevtoolsApplication extends Element { ` } - #loadTrace ({ detail }: { detail: TraceLog }) { + #loadTrace({ detail }: { detail: TraceLog }) { this.dataManager.loadTraceFile(detail) this.requestUpdate() } - #mainContent () { + #mainContent() { if (!this.dataManager.hasConnection) { return html`` } return html` -
+
${ // only render sidebar if trace file is captured using testrunner this.dataManager.traceType === TraceType.Testrunner - ? html`` + ? html`` : nothing } ${this.#drag.getSlider('z-10 h-full')} diff --git a/packages/app/src/components/browser/snapshot.ts b/packages/app/src/components/browser/snapshot.ts index 5f93996..41f9d04 100644 --- a/packages/app/src/components/browser/snapshot.ts +++ b/packages/app/src/components/browser/snapshot.ts @@ -6,14 +6,19 @@ import { type ComponentChildren, h, render, type VNode } from 'preact' import { customElement, query } from 'lit/decorators.js' import type { SimplifiedVNode } from '../../../../script/types' -import { mutationContext, type TraceMutation, metadataContext, type Metadata } from '../../controller/DataManager.js' +import { + mutationContext, + type TraceMutation, + metadataContext, + type Metadata +} from '../../controller/DataManager.js' import '~icons/mdi/world.js' import '../placeholder.js' const MUTATION_SELECTOR = '__mutation-highlight__' -function transform (node: any): VNode<{}> { +function transform(node: any): VNode<{}> { if (typeof node !== 'object') { return node as VNode<{}> } @@ -45,33 +50,36 @@ export class DevtoolsBrowser extends Element { @consume({ context: mutationContext, subscribe: true }) mutations: TraceMutation[] = [] - static styles = [...Element.styles, css` - :host { - width: 100%; - height: 100%; - display: flex; - padding: 2rem; - align-items: center; - justify-content: center; - } + static styles = [ + ...Element.styles, + css` + :host { + width: 100%; + height: 100%; + display: flex; + padding: 2rem; + align-items: center; + justify-content: center; + } - section { - box-sizing: border-box; - width: calc(100% - 0px); /* host padding already applied */ - height: calc(100% - 0px); - display: flex; - flex-direction: column; - overflow: hidden; - } + section { + box-sizing: border-box; + width: calc(100% - 0px); /* host padding already applied */ + height: calc(100% - 0px); + display: flex; + flex-direction: column; + overflow: hidden; + } - .frame-dot { - border-radius: 50%; - height: 12px; - width: 12px; - margin: 1em .25em; - flex-shrink: 0; - } - `] + .frame-dot { + border-radius: 50%; + height: 12px; + width: 12px; + margin: 1em 0.25em; + flex-shrink: 0; + } + ` + ] @query('iframe') iframe?: HTMLIFrameElement @@ -86,12 +94,17 @@ export class DevtoolsBrowser extends Element { super.connectedCallback() window.addEventListener('resize', this.#setIframeSize.bind(this)) window.addEventListener('window-drag', this.#setIframeSize.bind(this)) - window.addEventListener('app-mutation-highlight', this.#highlightMutation.bind(this)) - window.addEventListener('app-mutation-select', (ev) => this.#renderBrowserState(ev.detail)) + window.addEventListener( + 'app-mutation-highlight', + this.#highlightMutation.bind(this) + ) + window.addEventListener('app-mutation-select', (ev) => + this.#renderBrowserState(ev.detail) + ) await this.updateComplete } - #setIframeSize () { + #setIframeSize() { const metadata = this.metadata if (!this.section || !this.iframe || !this.header || !metadata) { return @@ -110,18 +123,18 @@ export class DevtoolsBrowser extends Element { * we keep the aspect ratio. We substract 0.05 to have a bit of a * padding */ - scale = (frameSize.height / viewportHeight) - 0.05 + scale = frameSize.height / viewportHeight - 0.05 } this.section.style.width = `${viewportWidth * scale}px` this.section.style.height = `${Math.min(frameSize.height, viewportHeight * scale)}px` this.iframe.style.width = `${viewportWidth}px` // this.iframe.style.height = `${(Math.min(frameSize.height, viewportHeight * scale) - headerSize.height)}px` - this.iframe.style.height = `${viewportHeight - (headerSize.height / scale)}px` + this.iframe.style.height = `${viewportHeight - headerSize.height / scale}px` this.iframe.style.transform = `scale(${scale})` } - async #renderNewDocument (doc: SimplifiedVNode, baseUrl: string) { + async #renderNewDocument(doc: SimplifiedVNode, baseUrl: string) { const root = transform(doc) const baseTag = h('base', { href: baseUrl }) const head: VNode<{}> | undefined = (root.props.children as VNode[]) @@ -130,17 +143,17 @@ export class DevtoolsBrowser extends Element { if (head) { head.props.children = [ baseTag, - ...head.props.children as ComponentChildren[] + ...(head.props.children as ComponentChildren[]) ] } else { const head = h('head', {}, baseTag) - const docChildren = root.props.children as ComponentChildren[] || [] + const docChildren = (root.props.children as ComponentChildren[]) || [] docChildren.unshift(head) } render(root, this.#vdom) } - #renderVdom () { + #renderVdom() { const docEl = this.iframe?.contentDocument?.documentElement if (!docEl) { return @@ -150,11 +163,11 @@ export class DevtoolsBrowser extends Element { * remove script tags from application as we are only interested in the static * representation of the page */ - [...this.#vdom.querySelectorAll('script')].forEach((el) => el.remove()) + ;[...this.#vdom.querySelectorAll('script')].forEach((el) => el.remove()) docEl.ownerDocument.replaceChild(this.#vdom, docEl) } - async #handleMutation (mutation: TraceMutation) { + async #handleMutation(mutation: TraceMutation) { if (!this.iframe) { await this.updateComplete } @@ -170,7 +183,7 @@ export class DevtoolsBrowser extends Element { } } - #handleCharacterDataMutation (mutation: TraceMutation) { + #handleCharacterDataMutation(mutation: TraceMutation) { const el = this.#queryElement(mutation.target!) if (!el) { return @@ -179,7 +192,7 @@ export class DevtoolsBrowser extends Element { el.textContent = mutation.newTextContent || '' } - #handleAttributeMutation (mutation: TraceMutation) { + #handleAttributeMutation(mutation: TraceMutation) { if (!mutation.attributeName || !mutation.attributeValue) { return } @@ -192,10 +205,13 @@ export class DevtoolsBrowser extends Element { el.setAttribute(mutation.attributeName, mutation.attributeValue || '') } - #handleChildListMutation (mutation: TraceMutation) { + #handleChildListMutation(mutation: TraceMutation) { if (mutation.addedNodes.length === 1 && !mutation.target) { const baseUrl = this.metadata?.url || 'unknown' - this.#renderNewDocument(mutation.addedNodes[0] as SimplifiedVNode, baseUrl) + this.#renderNewDocument( + mutation.addedNodes[0] as SimplifiedVNode, + baseUrl + ) return this.#renderVdom() } @@ -221,7 +237,7 @@ export class DevtoolsBrowser extends Element { }) } - #queryElement (ref: string, el?: HTMLElement) { + #queryElement(ref: string, el?: HTMLElement) { const rootElement = el || this.iframe?.contentDocument if (!rootElement) { return @@ -229,9 +245,11 @@ export class DevtoolsBrowser extends Element { return rootElement.querySelector(`*[data-wdio-ref="${ref}"]`) as HTMLElement } - #highlightMutation (ev: CustomEvent) { + #highlightMutation(ev: CustomEvent) { if (!ev.detail) { - this.iframe?.contentDocument?.querySelector(`.${MUTATION_SELECTOR}`)?.remove() + this.iframe?.contentDocument + ?.querySelector(`.${MUTATION_SELECTOR}`) + ?.remove() return } @@ -252,36 +270,46 @@ export class DevtoolsBrowser extends Element { const highlight = document.createElement('div') highlight.setAttribute('class', MUTATION_SELECTOR) - highlight.setAttribute('style', `position: absolute; background: #38bdf8; outline: 2px dotted red; opacity: .2; top: ${scrollY + rect.top}px; left: ${scrollX + rect.left}px; width: ${rect.width}px; height: ${rect.height}px; z-index: 10000;`) + highlight.setAttribute( + 'style', + `position: absolute; background: #38bdf8; outline: 2px dotted red; opacity: .2; top: ${scrollY + rect.top}px; left: ${scrollX + rect.left}px; width: ${rect.width}px; height: ${rect.height}px; z-index: 10000;` + ) docEl.querySelector(`.${MUTATION_SELECTOR}`)?.remove() docEl.body.appendChild(highlight) } - async #renderBrowserState (mutationEntry?: TraceMutation) { + async #renderBrowserState(mutationEntry?: TraceMutation) { const mutations = this.mutations if (!mutations || !mutations.length) { return } - const mutationIndex = mutationEntry - ? mutations.indexOf(mutationEntry) - : 0 + const mutationIndex = mutationEntry ? mutations.indexOf(mutationEntry) : 0 this.#vdom = document.createDocumentFragment() - const rootIndex = mutations - .map((m, i) => [ - // is document loaded - m.addedNodes.length === 1 && Boolean(m.url), - // index - i - ] as const) - .filter(([isDocLoaded, docLoadedIndex]) => isDocLoaded && docLoadedIndex <= mutationIndex) - .map(([, i]) => i) - .pop() || 0 - - this.#activeUrl = mutations[rootIndex].url || this.metadata?.url || 'unknown' + const rootIndex = + mutations + .map( + (m, i) => + [ + // is document loaded + m.addedNodes.length === 1 && Boolean(m.url), + // index + i + ] as const + ) + .filter( + ([isDocLoaded, docLoadedIndex]) => + isDocLoaded && docLoadedIndex <= mutationIndex + ) + .map(([, i]) => i) + .pop() || 0 + + this.#activeUrl = + mutations[rootIndex].url || this.metadata?.url || 'unknown' for (let i = rootIndex; i <= mutationIndex; i++) { - await this.#handleMutation(mutations[i]).catch( - (err) => console.warn(`Failed to render mutation: ${err.message}`)) + await this.#handleMutation(mutations[i]).catch((err) => + console.warn(`Failed to render mutation: ${err.message}`) + ) } /** @@ -308,20 +336,25 @@ export class DevtoolsBrowser extends Element { } return html` -
+
-
+
${this.#activeUrl}
${this.mutations && this.mutations.length ? html`` - : html`` - } + : html``}
` } diff --git a/packages/app/src/components/header.ts b/packages/app/src/components/header.ts index 551bbe9..6d15f2b 100644 --- a/packages/app/src/components/header.ts +++ b/packages/app/src/components/header.ts @@ -14,11 +14,10 @@ const darkModeInitValue = localStorage.getItem(DARK_MODE_KEY) @customElement('wdio-devtools-header') export class DevtoolsHeader extends Element { - #darkMode = ( + #darkMode = typeof darkModeInitValue === 'string' ? darkModeInitValue === 'true' : window.matchMedia('(prefers-color-scheme: dark)').matches - ) constructor() { super() @@ -27,15 +26,18 @@ export class DevtoolsHeader extends Element { } } - static styles = [...Element.styles, css` - :host { - display: flex; - align-items: center; - background: black; - height: 40px; - width: 100%; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + align-items: center; + background: black; + height: 40px; + width: 100%; + } + ` + ] render() { return html` @@ -44,8 +46,12 @@ export class DevtoolsHeader extends Element { ` diff --git a/packages/app/src/components/inputs/traceLoader.ts b/packages/app/src/components/inputs/traceLoader.ts index 2e56672..bdefc5b 100644 --- a/packages/app/src/components/inputs/traceLoader.ts +++ b/packages/app/src/components/inputs/traceLoader.ts @@ -11,7 +11,12 @@ export class DevtoolsTraceLoader extends Element { render() { if (this.as === 'button') { return html` - + - - - + + + @@ -171,11 +195,12 @@ export class DevtoolsSidebarExplorer extends CollapseableEntry { ${suites.length ? repeat( suites, - suite => suite.uid, - suite => this.#renderEntry(suite) + (suite) => suite.uid, + (suite) => this.#renderEntry(suite) ) - : html`

No tests found

` - } + : html`

+ No tests found +

`} ` } @@ -187,7 +212,7 @@ declare global { } } -function getSearchableLabel (entry: TestEntry): string[] { +function getSearchableLabel(entry: TestEntry): string[] { if (entry.children.length === 0) { return [entry.label] } diff --git a/packages/app/src/components/sidebar/filter.ts b/packages/app/src/components/sidebar/filter.ts index 2827614..0127b05 100644 --- a/packages/app/src/components/sidebar/filter.ts +++ b/packages/app/src/components/sidebar/filter.ts @@ -16,19 +16,22 @@ export class DevtoolsSidebarFilter extends Element { #filterQuery = '' #isStateFilterOpen = false - static styles = [...Element.styles, css` - :host { - width: 100%; - display: flex; - align-items: top; - font-size: 0.8em; - padding-right: 1em; - } + static styles = [ + ...Element.styles, + css` + :host { + width: 100%; + display: flex; + align-items: top; + font-size: 0.8em; + padding-right: 1em; + } - label { - cursor: pointer; - } - `] + label { + cursor: pointer; + } + ` + ] @query('input[name="filter"]') queryInput?: HTMLInputElement @@ -44,7 +47,7 @@ export class DevtoolsSidebarFilter extends Element { this.#emitState() } - #updateQuery () { + #updateQuery() { if (!this.queryInput) { return } @@ -57,40 +60,56 @@ export class DevtoolsSidebarFilter extends Element { this.requestUpdate() } - #emitState () { - window.dispatchEvent(new CustomEvent('app-test-filter', { - bubbles: true, - composed: true, - detail: this - })) + #emitState() { + window.dispatchEvent( + new CustomEvent('app-test-filter', { + bubbles: true, + composed: true, + detail: this + }) + ) } - get filtersPassed () { + get filtersPassed() { return this.#filterState & FilterState.PASSED } - get filtersFailed () { + get filtersFailed() { return this.#filterState & FilterState.FAILED } - get filtersSkipped () { + get filtersSkipped() { return this.#filterState & FilterState.SKIPPED } - get filterStatus () { + get filterStatus() { if (this.filtersPassed && this.filtersFailed && this.filtersSkipped) { return 'all' } - return ['passed', 'failed', 'skipped'] - .filter((filter) => this[`filters${filter.charAt(0).toUpperCase() + filter.slice(1)}` as keyof typeof this]) - .join(', ') || 'none' + return ( + ['passed', 'failed', 'skipped'] + .filter( + (filter) => + this[ + `filters${filter.charAt(0).toUpperCase() + filter.slice(1)}` as keyof typeof this + ] + ) + .join(', ') || 'none' + ) } - get filterQuery () { + get filterQuery() { return this.#filterQuery } render() { return html` -
- Status: ${this.filterStatus} + Status: + ${this.filterStatus}
-
+
  • - +
  • - +
  • - +
diff --git a/packages/app/src/components/sidebar/test-suite.ts b/packages/app/src/components/sidebar/test-suite.ts index 972f4ae..3fa86cd 100644 --- a/packages/app/src/components/sidebar/test-suite.ts +++ b/packages/app/src/components/sidebar/test-suite.ts @@ -19,13 +19,16 @@ import '~icons/mdi/checkbox-blank-circle-outline.js' const TEST_SUITE = 'wdio-test-suite' @customElement(TEST_SUITE) export class ExplorerTestSuite extends Element { - static styles = [...Element.styles, css` - :host { - width: 100%; - height: 100%; - display: block; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + width: 100%; + height: 100%; + display: block; + } + ` + ] render() { return html`` @@ -51,23 +54,28 @@ export class ExplorerTestEntry extends CollapseableEntry { @property({ type: String, attribute: 'call-source' }) callSource?: string - static styles = [...Element.styles, css` - :host { - display: block; - font-size: 0.8em; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: block; + font-size: 0.8em; + } + ` + ] #toggleEntry() { this.setAttribute('is-collapsed', `${!(this.isCollapsed === 'true')}`) const isCollapsed = this.isCollapsed === 'true' - this.dispatchEvent(new CustomEvent('entry-collapse-change', { - detail: { - isCollapsed: isCollapsed, - entry: this - }, - bubbles: true - })) + this.dispatchEvent( + new CustomEvent('entry-collapse-change', { + detail: { + isCollapsed: isCollapsed, + entry: this + }, + bubbles: true + }) + ) if (isCollapsed) { this.allowCollapseAll = false } @@ -75,75 +83,120 @@ export class ExplorerTestEntry extends CollapseableEntry { } #viewSource() { - if (!this.callSource) return - window.dispatchEvent(new CustomEvent('app-source-highlight', { - detail: this.callSource - })) + if (!this.callSource) { + return + } + window.dispatchEvent( + new CustomEvent('app-source-highlight', { + detail: this.callSource + }) + ) } - get hasPassed () { + get hasPassed() { return this.state === TestState.PASSED } - get hasFailed () { + get hasFailed() { return this.state === TestState.FAILED } - get hasSkipped () { + get hasSkipped() { return this.state === TestState.SKIPPED } - get isRunning () { + get isRunning() { return this.state === TestState.RUNNING } - get testStateIcon () { + get testStateIcon() { if (this.isRunning) { - return html`` + return html`` } if (this.hasPassed) { - return html`` + return html`` } if (this.hasFailed) { - return html`` + return html`` } if (this.hasSkipped) { - return html`` + return html`` } - return html`` + return html`` } render() { - const hasNoChildren = this.querySelectorAll('[slot="children"]').length === 0 + const hasNoChildren = + this.querySelectorAll('[slot="children"]').length === 0 const isCollapsed = this.isCollapsed === 'true' return html`
- - + ${this.testStateIcon} -
diff --git a/packages/app/src/components/tabs.ts b/packages/app/src/components/tabs.ts index 26f1e04..4a5ca62 100644 --- a/packages/app/src/components/tabs.ts +++ b/packages/app/src/components/tabs.ts @@ -11,35 +11,42 @@ export class DevtoolsTabs extends Element { @property({ type: String }) cacheId?: string - static styles = [...Element.styles, css` - :host { - width: 100%; - flex-grow: 1; - min-height: 0; - display: flex; - flex-direction: column; - color: var(--vscode-foreground); - background-color: var(--vscode-editor-background); - } - `] + static styles = [ + ...Element.styles, + css` + :host { + width: 100%; + flex-grow: 1; + min-height: 0; + display: flex; + flex-direction: column; + color: var(--vscode-foreground); + background-color: var(--vscode-editor-background); + } + ` + ] - #getTabButton (tabId: string) { + #getTabButton(tabId: string) { return html` ` } - get tabs () { + get tabs() { if (!this.shadowRoot) { return [] } - const slot = [...Array.from(this.shadowRoot.querySelectorAll('slot'))] - .find((s) => !s.hasAttribute('name')) + const slot = [...Array.from(this.shadowRoot.querySelectorAll('slot'))].find( + (s) => !s.hasAttribute('name') + ) if (!slot) { return [] } @@ -56,7 +63,7 @@ export class DevtoolsTabs extends Element { }) } - activateTab (tabId: string) { + activateTab(tabId: string) { const activeTab = this.tabs.find((el) => el.getAttribute('label') === tabId) if (!activeTab) { return @@ -76,23 +83,23 @@ export class DevtoolsTabs extends Element { connectedCallback() { super.connectedCallback() - setTimeout(() => { // wait till innerHTML is parsed - this.#tabList = this.tabs - .map((el) => el.getAttribute('label') as string) - .filter(Boolean) || [] + setTimeout(() => { + // wait till innerHTML is parsed + this.#tabList = + this.tabs + .map((el) => el.getAttribute('label') as string) + .filter(Boolean) || [] /** * get tab id either from local storage or a tab element that * has an "active" attribute */ - this.#activeTab = ( - ( - this.cacheId && localStorage.getItem(this.cacheId) - ) || - this.tabs.find( - (el) => el.hasAttribute('active') - )?.getAttribute('label') || undefined - ) + this.#activeTab = + (this.cacheId && localStorage.getItem(this.cacheId)) || + this.tabs + .find((el) => el.hasAttribute('active')) + ?.getAttribute('label') || + undefined /** * set active tab or first tab as active @@ -112,13 +119,12 @@ export class DevtoolsTabs extends Element { return html` ${this.#tabList.length ? html` - - ` - : nothing - } + + ` + : nothing} ` } @@ -127,24 +133,25 @@ export class DevtoolsTabs extends Element { const TAB_COMPONENT = 'wdio-devtools-tab' @customElement(TAB_COMPONENT) export class DevtoolsTab extends Element { - static styles = [...Element.styles, css` - :host { - display: none; - flex-grow: 1; - min-height: 0; - overflow-y: auto; - scrollbar-width: none; - } + static styles = [ + ...Element.styles, + css` + :host { + display: none; + flex-grow: 1; + min-height: 0; + overflow-y: auto; + scrollbar-width: none; + } - :host([active]) { - display: flex; - } - `] + :host([active]) { + display: flex; + } + ` + ] render() { - return html` - - ` + return html` ` } } diff --git a/packages/app/src/components/workbench.ts b/packages/app/src/components/workbench.ts index f8c390f..66cd020 100644 --- a/packages/app/src/components/workbench.ts +++ b/packages/app/src/components/workbench.ts @@ -25,27 +25,31 @@ const COMPONENT = 'wdio-devtools-workbench' @customElement(COMPONENT) export class DevtoolsWorkbench extends Element { #toolbarCollapsed = localStorage.getItem('toolbar') === 'true' - #workbenchSidebarCollapsed = localStorage.getItem('workbenchSidebar') === 'true' - - static styles = [...Element.styles, css` - :host { - display: flex; - flex-direction: column; - flex-grow: 1; - height: 100vh; - min-height: 0; - overflow: hidden; - color: var(--vscode-foreground); - background-color: var(--vscode-editor-background); - position: relative; - } - `] + #workbenchSidebarCollapsed = + localStorage.getItem('workbenchSidebar') === 'true' + + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + flex-direction: column; + flex-grow: 1; + height: 100vh; + min-height: 0; + overflow: hidden; + color: var(--vscode-foreground); + background-color: var(--vscode-editor-background); + position: relative; + } + ` + ] #dragVertical = new DragController(this, { localStorageKey: 'toolbarHeight', minPosition: MIN_WORKBENCH_HEIGHT, - maxPosition: (window.innerHeight * 0.7), - initialPosition: window.innerHeight * .7, // initial height of browser window is 70% of window + maxPosition: window.innerHeight * 0.7, + initialPosition: window.innerHeight * 0.7, // initial height of browser window is 70% of window getContainerEl: () => this.getShadowRootAsync() as any as Element, direction: Direction.vertical }) @@ -63,7 +67,7 @@ export class DevtoolsWorkbench extends Element { return this.horizontalResizerWindow as Element } - #toggle (key: 'toolbar' | 'workbenchSidebar') { + #toggle(key: 'toolbar' | 'workbenchSidebar') { if (key === 'toolbar') { this.#toolbarCollapsed = !this.#toolbarCollapsed localStorage.setItem(key, `${this.#toolbarCollapsed}`) @@ -79,28 +83,36 @@ export class DevtoolsWorkbench extends Element { /** * send drag event to make iframe rerender it's size */ - setTimeout(() => window.dispatchEvent(new CustomEvent('window-drag', { - bubbles: true, - composed: true - })), RERENDER_TIMEOUT) + setTimeout( + () => + window.dispatchEvent( + new CustomEvent('window-drag', { + bubbles: true, + composed: true + }) + ), + RERENDER_TIMEOUT + ) } @query('section[data-horizontal-resizer-window]') horizontalResizerWindow?: HTMLElement render() { - // When collapsed keep previous full behavior; when expanded no fixed height class + // When collapsed keep previous full behavior; when expanded no fixed height class const heightWorkbench = this.#toolbarCollapsed ? 'h-full flex-1' : '' - const styleWorkbench = this.#toolbarCollapsed ? '' : (() => { - const m = this.#dragVertical.getPosition().match(/(\d+(?:\.\d+)?)px/) - const raw = m ? parseFloat(m[1]) : window.innerHeight * 0.7 - const capped = Math.min(raw, window.innerHeight * 0.7) - const paneHeight = Math.max(MIN_WORKBENCH_HEIGHT, capped) - return `flex:0 0 ${paneHeight}px; height:${paneHeight}px; max-height:70vh; min-height:0;` - })() + const styleWorkbench = this.#toolbarCollapsed + ? '' + : (() => { + const m = this.#dragVertical.getPosition().match(/(\d+(?:\.\d+)?)px/) + const raw = m ? parseFloat(m[1]) : window.innerHeight * 0.7 + const capped = Math.min(raw, window.innerHeight * 0.7) + const paneHeight = Math.max(MIN_WORKBENCH_HEIGHT, capped) + return `flex:0 0 ${paneHeight}px; height:${paneHeight}px; max-height:70vh; min-height:0;` + })() - const sidebarStyle = this.#workbenchSidebarCollapsed + const sidebarStyle = this.#workbenchSidebarCollapsed ? 'width:0; flex:0 0 0; overflow:hidden;' : (() => { const pos = this.#dragHorizontal.getPosition() @@ -110,9 +122,19 @@ export class DevtoolsWorkbench extends Element { })() return html` -
+
- + @@ -120,29 +142,44 @@ export class DevtoolsWorkbench extends Element { - ${this.#workbenchSidebarCollapsed ? - html` - - ` - : nothing - } + ${this.#workbenchSidebarCollapsed + ? html` + + ` + : nothing}
- ${!this.#workbenchSidebarCollapsed ? this.#dragHorizontal.getSlider('z-30') : nothing} -
+ ${!this.#workbenchSidebarCollapsed + ? this.#dragHorizontal.getSlider('z-30') + : nothing} +
- ${!this.#toolbarCollapsed ? this.#dragVertical.getSlider('z-[999] -mt-[5px] pointer-events-auto') : nothing} - + ${!this.#toolbarCollapsed + ? this.#dragVertical.getSlider('z-[999] -mt-[5px] pointer-events-auto') + : nothing} + @@ -153,31 +190,38 @@ export class DevtoolsWorkbench extends Element { -
Network tab not yet implemented!
+
+ Network tab not yet implemented! +
- ${this.#toolbarCollapsed ? - html` - - ` - : nothing - } + ${this.#toolbarCollapsed + ? html` + + ` + : nothing} ` } } declare global { interface HTMLElementTagNameMap { - [COMPONENT]: DevtoolsWorkbench; + [COMPONENT]: DevtoolsWorkbench } } diff --git a/packages/app/src/components/workbench/actionItems/command.ts b/packages/app/src/components/workbench/actionItems/command.ts index 49a845f..a9cb764 100644 --- a/packages/app/src/components/workbench/actionItems/command.ts +++ b/packages/app/src/components/workbench/actionItems/command.ts @@ -22,16 +22,21 @@ export class CommandItem extends ActionItem { window.dispatchEvent(event) } - render () { + render() { if (!this.entry) { return } const entry = this.entry return html` - ` diff --git a/packages/app/src/components/workbench/actionItems/item.ts b/packages/app/src/components/workbench/actionItems/item.ts index a783ac1..08fdf54 100644 --- a/packages/app/src/components/workbench/actionItems/item.ts +++ b/packages/app/src/components/workbench/actionItems/item.ts @@ -13,15 +13,18 @@ export class ActionItem extends Element { @property({ type: Number }) elapsedTime?: number - static styles = [...Element.styles, css` - :host { - display: flex; - flex-grow: 0; - width: 100%; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + flex-grow: 0; + width: 100%; + } + ` + ] - protected renderTime () { + protected renderTime() { if (!this.elapsedTime) { return } @@ -36,7 +39,10 @@ export class ActionItem extends Element { } return html` - ${diffLabel} + ${diffLabel} ` } } diff --git a/packages/app/src/components/workbench/actionItems/mutation.ts b/packages/app/src/components/workbench/actionItems/mutation.ts index 142078f..c059f2c 100644 --- a/packages/app/src/components/workbench/actionItems/mutation.ts +++ b/packages/app/src/components/workbench/actionItems/mutation.ts @@ -23,7 +23,10 @@ export class MutationItem extends ActionItem { #getAttributeMutationLabel(mutation: TraceMutation) { return html` - element attribute "${mutation.attributeName}" changed + element attribute "${mutation.attributeName}" + changed ${this.renderTime()} ` } @@ -49,7 +52,10 @@ export class MutationItem extends ActionItem { ` } - #renderNodeAmount (nodes: (string | SimplifiedVNode)[], operationType: 'added' | 'removed') { + #renderNodeAmount( + nodes: (string | SimplifiedVNode)[], + operationType: 'added' | 'removed' + ) { if (!nodes.length) { return nothing } @@ -73,7 +79,7 @@ export class MutationItem extends ActionItem { window.dispatchEvent(event) } - render () { + render() { if (!this.entry) { return } diff --git a/packages/app/src/components/workbench/actions.ts b/packages/app/src/components/workbench/actions.ts index e8ae857..b52e9cb 100644 --- a/packages/app/src/components/workbench/actions.ts +++ b/packages/app/src/components/workbench/actions.ts @@ -3,7 +3,12 @@ import { html, css } from 'lit' import { customElement } from 'lit/decorators.js' import { consume } from '@lit/context' -import { mutationContext, type TraceMutation, commandContext, type CommandLog } from '../../controller/DataManager.js' +import { + mutationContext, + type TraceMutation, + commandContext, + type CommandLog +} from '../../controller/DataManager.js' import '~icons/mdi/pencil.js' import '~icons/mdi/family-tree.js' @@ -19,13 +24,16 @@ const SOURCE_COMPONENT = 'wdio-devtools-actions' @customElement(SOURCE_COMPONENT) export class DevtoolsActions extends Element { - static styles = [...Element.styles, css` - :host { - display: flex; - flex-direction: column; - width: 100%; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + flex-direction: column; + width: 100%; + } + ` + ] @consume({ context: mutationContext, subscribe: true }) mutations: TraceMutation[] = [] @@ -36,8 +44,9 @@ export class DevtoolsActions extends Element { render() { const mutations = this.mutations || [] const commands = this.commands || [] - const entries = [...mutations, ...commands] - .sort((a, b) => a.timestamp - b.timestamp) + const entries = [...mutations, ...commands].sort( + (a, b) => a.timestamp - b.timestamp + ) if (!entries.length || !mutations.length) { return html`` diff --git a/packages/app/src/components/workbench/console.ts b/packages/app/src/components/workbench/console.ts index e653dcd..48d0610 100644 --- a/packages/app/src/components/workbench/console.ts +++ b/packages/app/src/components/workbench/console.ts @@ -9,25 +9,28 @@ import '~icons/mdi/chevron-right.js' import '../placeholder.js' const BG: Record = { - 'warn': 'editorOverviewRulerWarningForeground', - 'info': 'editorOverviewRulerInfoForeground', - 'error': 'editorOverviewRulerErrorForeground', - 'log': 'panelBorder' + warn: 'editorOverviewRulerWarningForeground', + info: 'editorOverviewRulerInfoForeground', + error: 'editorOverviewRulerErrorForeground', + log: 'panelBorder' } const SOURCE_COMPONENT = 'wdio-devtools-console-logs' @customElement(SOURCE_COMPONENT) export class DevtoolsConsoleLogs extends Element { - static styles = [...Element.styles, css` - :host { - display: flex; - width: 100%; - height: 100%; - flex-direction: column; - padding: 5px; - min-height: 200px; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + padding: 5px; + min-height: 200px; + } + ` + ] @consume({ context: consoleLogContext, subscribe: true }) logs: ConsoleLogs[] | undefined = undefined @@ -37,20 +40,29 @@ export class DevtoolsConsoleLogs extends Element { return html`` } - const logs = this.logs.length === 0 - ? [{ args: '' }] - : this.logs + const logs = this.logs.length === 0 ? [{ args: '' }] : this.logs return html` - ${Object.values(logs).map((log: any) => html` -
-
- - ${log.type ? html`${log.type}` : nothing} -
-
${log.args}
-
- `)} + ${Object.values(logs).map( + (log: any) => html` +
+
+ + ${log.type + ? html`${log.type}` + : nothing} +
+
${log.args}
+
+ ` + )} ` } } diff --git a/packages/app/src/components/workbench/list.ts b/packages/app/src/components/workbench/list.ts index 9eb7227..06a3a39 100644 --- a/packages/app/src/components/workbench/list.ts +++ b/packages/app/src/components/workbench/list.ts @@ -16,80 +16,99 @@ export class DevtoolsList extends Element { @property({ type: Object }) list: Record | unknown[] = {} - static styles = [...Element.styles, css` - :host { - display:block; - width:100%; - } - dl { - width:100%; - } - dt { - font-weight:600; - font-size:11px; - letter-spacing:.5px; - text-transform:uppercase; - opacity:.75; - white-space:nowrap; - overflow:hidden; - text-overflow:ellipsis; - } - pre { - margin:0; - font-family: var(--vscode-editor-font-family, monospace); - font-size:11px; - line-height:1.25; - white-space:pre-wrap; - word-break:break-word; - overflow-wrap:anywhere; - background: var(--vscode-editorInlayHint-background, transparent); - padding:2px 4px; - border-radius:3px; - max-height:16rem; - overflow:auto; - } - .row { - transition: max-height .18s ease; - box-sizing:border-box; - } - .collapse { - max-height:0 !important; - overflow:hidden !important; - padding-top:0 !important; - padding-bottom:0 !important; - border-bottom-width:0 !important; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: block; + width: 100%; + } + dl { + width: 100%; + } + dt { + font-weight: 600; + font-size: 11px; + letter-spacing: 0.5px; + text-transform: uppercase; + opacity: 0.75; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + pre { + margin: 0; + font-family: var(--vscode-editor-font-family, monospace); + font-size: 11px; + line-height: 1.25; + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: anywhere; + background: var(--vscode-editorInlayHint-background, transparent); + padding: 2px 4px; + border-radius: 3px; + max-height: 16rem; + overflow: auto; + } + .row { + transition: max-height 0.18s ease; + box-sizing: border-box; + } + .collapse { + max-height: 0 !important; + overflow: hidden !important; + padding-top: 0 !important; + padding-bottom: 0 !important; + border-bottom-width: 0 !important; + } + ` + ] #renderMetadataProp(prop: any) { if (typeof prop === 'object' && prop !== null) { return html`
${JSON.stringify(prop, null, 2)}
` } - return html`${String(prop)}` + return html`${String(prop)}` } - #toggleCollapseState () { + #toggleCollapseState() { this.isCollapsed = !this.isCollapsed this.requestUpdate() } - #renderSectionHeader (label: string) { + #renderSectionHeader(label: string) { return html` ` } - render () { + render() { const isArrayList = Array.isArray(this.list) - if (this.list == null) return null - if (isArrayList && (this.list as unknown[]).length === 0) return null - if (!isArrayList && Object.keys(this.list as Record).length === 0) return null + if (this.list === null) { + return null + } + if (isArrayList && (this.list as unknown[]).length === 0) { + return null + } + if ( + !isArrayList && + Object.keys(this.list as Record).length === 0 + ) { + return null + } const entries: unknown[] | [string, unknown][] = isArrayList ? (this.list as unknown[]) @@ -118,11 +137,13 @@ export class DevtoolsList extends Element { val = (entry as [string, unknown])[1] } - const stringForMeasure = (val && typeof val === 'object') - ? JSON.stringify(val, null, 2) - : String(val) + const stringForMeasure = + val && typeof val === 'object' + ? JSON.stringify(val, null, 2) + : String(val) - const isMultiline = /\n/.test(stringForMeasure) || + const isMultiline = + /\n/.test(stringForMeasure) || stringForMeasure.length > 40 || (val && typeof val === 'object') @@ -133,7 +154,9 @@ export class DevtoolsList extends Element { if (key === undefined) { return html` -
+
${this.#renderMetadataProp(val)}
` diff --git a/packages/app/src/components/workbench/logs.ts b/packages/app/src/components/workbench/logs.ts index aa483e2..89f7445 100644 --- a/packages/app/src/components/workbench/logs.ts +++ b/packages/app/src/components/workbench/logs.ts @@ -18,14 +18,17 @@ export class DevtoolsSource extends Element { @property({ type: Number }) elapsedTime?: number - static styles = [...Element.styles, css` - :host { - display: block; - width: 100%; - height: 100%; - min-height: 200px; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: block; + width: 100%; + height: 100%; + min-height: 200px; + } + ` + ] connectedCallback(): void { super.connectedCallback() @@ -34,24 +37,41 @@ export class DevtoolsSource extends Element { this.elapsedTime = ev.detail.elapsedTime const { - WebDriverProtocol, MJsonWProtocol, AppiumProtocol, ChromiumProtocol, - SauceLabsProtocol, SeleniumProtocol, GeckoProtocol, WebDriverBidiProtocol + WebDriverProtocol, + MJsonWProtocol, + AppiumProtocol, + ChromiumProtocol, + SauceLabsProtocol, + SeleniumProtocol, + GeckoProtocol, + WebDriverBidiProtocol } = await import('@wdio/protocols') const endpoints = Object.values({ - ...WebDriverProtocol, ...MJsonWProtocol, ...AppiumProtocol, ...ChromiumProtocol, - ...SauceLabsProtocol, ...SeleniumProtocol, ...GeckoProtocol, ...WebDriverBidiProtocol - }).reduce((acc, endpoint) => { - for (const cmdDesc of Object.values(endpoint)) { - acc[cmdDesc.command] = cmdDesc as CommandEndpoint - } - return acc - }, {} as Record) + ...WebDriverProtocol, + ...MJsonWProtocol, + ...AppiumProtocol, + ...ChromiumProtocol, + ...SauceLabsProtocol, + ...SeleniumProtocol, + ...GeckoProtocol, + ...WebDriverBidiProtocol + }).reduce( + (acc, endpoint) => { + for (const cmdDesc of Object.values(endpoint)) { + acc[cmdDesc.command] = cmdDesc as CommandEndpoint + } + return acc + }, + {} as Record + ) this.#commandDefinition = endpoints[command.command] this.command = command - window.dispatchEvent(new CustomEvent('app-source-highlight', { - detail: this.command?.callSource - })) + window.dispatchEvent( + new CustomEvent('app-source-highlight', { + detail: this.command?.callSource + }) + ) this.closest('wdio-devtools-tabs')?.activateTab('Log') }) } @@ -66,30 +86,47 @@ export class DevtoolsSource extends Element { } return html` -
+

${this.command.command}

- ${this.#commandDefinition && html`Reference`} + ${this.#commandDefinition && + html`Reference`}
- ${this.#commandDefinition && html` + ${this.#commandDefinition && + html` + .list="${[this.#commandDefinition.description]}" + > `} + .list="${(this.command.args || []).reduce( + (acc: Record, val: unknown, i: number) => { + const def = this.#commandDefinition + const paramName = def?.parameters?.[i]?.name ?? i + acc[paramName] = val + return acc + }, + {} as Record + )}" + > + .list="${typeof this.command.result === 'object' + ? this.command.result + : [this.command.result]}" + > ` } } diff --git a/packages/app/src/components/workbench/metadata.ts b/packages/app/src/components/workbench/metadata.ts index 79a881c..f154be2 100644 --- a/packages/app/src/components/workbench/metadata.ts +++ b/packages/app/src/components/workbench/metadata.ts @@ -15,15 +15,18 @@ export class DevtoolsMetadata extends Element { @consume({ context: metadataContext, subscribe: true }) metadata: Partial | undefined = undefined - static styles = [...Element.styles, css` - :host { - display: flex; - flex-direction: column; - width: 100%; - height: 100%; - font-size: .8em; - } - `] + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + font-size: 0.8em; + } + ` + ] render() { if (!this.metadata) { @@ -34,13 +37,16 @@ export class DevtoolsMetadata extends Element { return html` + .list="${{ url }}" + > + .list="${this.metadata.capabilities}" + > + .list="${this.metadata.options}" + > ` } } diff --git a/packages/app/src/components/workbench/source.ts b/packages/app/src/components/workbench/source.ts index 78dd53e..3798b63 100644 --- a/packages/app/src/components/workbench/source.ts +++ b/packages/app/src/components/workbench/source.ts @@ -15,38 +15,52 @@ import '../placeholder.js' const SOURCE_COMPONENT = 'wdio-devtools-source' @customElement(SOURCE_COMPONENT) export class DevtoolsSource extends Element { - static styles = [...Element.styles, css` - :host { - display: flex; - width: 100%; - height: 100%; - } + static styles = [ + ...Element.styles, + css` + :host { + display: flex; + width: 100%; + height: 100%; + } - .cm-editor { - width: 100%; - height: 100%; - padding: 10px 0px; - } - .cm-content { - padding: 0!important; - } - `] + .cm-editor { + width: 100%; + height: 100%; + padding: 10px 0px; + } + .cm-content { + padding: 0 !important; + } + ` + ] @consume({ context: sourceContext, subscribe: true }) sources: Record = {} connectedCallback(): void { super.connectedCallback() - window.addEventListener('app-source-highlight', this.#highlightCallSource.bind(this)) + window.addEventListener( + 'app-source-highlight', + this.#highlightCallSource.bind(this) + ) } - #renderEditor (filePath: string, highlightLine?: number) { - if (!this.sources) return + #renderEditor(filePath: string, highlightLine?: number) { + if (!this.sources) { + return + } const source = this.sources[filePath] - if (!source) return + if (!source) { + return + } - const container = this.shadowRoot?.querySelector('section') || this.shadowRoot?.querySelector('.cm-editor') - if (!container) return + const container = + this.shadowRoot?.querySelector('section') || + this.shadowRoot?.querySelector('.cm-editor') + if (!container) { + return + } const opts: EditorViewConfig = { root: this.shadowRoot!, @@ -66,11 +80,13 @@ export class DevtoolsSource extends Element { effects: EditorView.scrollIntoView(lineInfo.from, { y: 'center' }) }) }) - } catch { /* ignore */ } + } catch { + /* ignore */ + } } } - #highlightCallSource (ev: CustomEvent) { + #highlightCallSource(ev: CustomEvent) { const [filePath, line] = ev.detail.split(':') this.#renderEditor(filePath, parseInt(line, 10)) this.closest('wdio-devtools-tabs')?.activateTab('Source') @@ -83,9 +99,7 @@ export class DevtoolsSource extends Element { } this.#renderEditor(sourceFileNames[0]) - return html` -
loading...
- ` + return html`
loading...
` } } diff --git a/packages/app/src/controller/DataManager.ts b/packages/app/src/controller/DataManager.ts index 541eab2..65045f7 100644 --- a/packages/app/src/controller/DataManager.ts +++ b/packages/app/src/controller/DataManager.ts @@ -1,16 +1,32 @@ import { createContext, ContextProvider } from '@lit/context' import type { ReactiveController, ReactiveControllerHost } from 'lit' -import type { Metadata, CommandLog, TraceLog } from '@wdio/devtools-service/types' +import type { + Metadata, + CommandLog, + TraceLog +} from '@wdio/devtools-service/types' const CACHE_ID = 'wdio-trace-cache' -export const mutationContext = createContext(Symbol('mutationContext')) +export const mutationContext = createContext( + Symbol('mutationContext') +) export const logContext = createContext(Symbol('logContext')) -export const consoleLogContext = createContext(Symbol('consoleLogContext')) -export const metadataContext = createContext(Symbol('metadataContext')) -export const commandContext = createContext(Symbol('commandContext')) -export const sourceContext = createContext>(Symbol('sourceContext')) -export const suiteContext = createContext[]>(Symbol('suiteContext')) +export const consoleLogContext = createContext( + Symbol('consoleLogContext') +) +export const metadataContext = createContext( + Symbol('metadataContext') +) +export const commandContext = createContext( + Symbol('commandContext') +) +export const sourceContext = createContext>( + Symbol('sourceContext') +) +export const suiteContext = createContext[]>( + Symbol('suiteContext') +) const hasConnection = createContext(Symbol('hasConnection')) @@ -34,7 +50,7 @@ export class DataManagerController implements ReactiveController { hasConnectionProvider: ContextProvider constructor(host: ReactiveControllerHost & HTMLElement) { - (this.#host = host).addController(this) + ;(this.#host = host).addController(this) this.mutationsContextProvider = new ContextProvider(this.#host, { context: mutationContext, initialValue: [] @@ -66,11 +82,11 @@ export class DataManagerController implements ReactiveController { }) } - get hasConnection () { + get hasConnection() { return this.hasConnectionProvider.value } - get traceType () { + get traceType() { return this.metadataContextProvider.value?.type } @@ -83,7 +99,7 @@ export class DataManagerController implements ReactiveController { */ const wsUrl = `ws://${window.location.host}/client` console.log(`Connecting to ${wsUrl}`) - const ws = this.#ws = new WebSocket(wsUrl) + const ws = (this.#ws = new WebSocket(wsUrl)) /** * if a connection to the backend is established we can @@ -100,10 +116,14 @@ export class DataManagerController implements ReactiveController { */ ws.addEventListener('error', () => { try { - const localStorageValue = JSON.parse(localStorage.getItem(CACHE_ID) || '') as TraceLog + const localStorageValue = JSON.parse( + localStorage.getItem(CACHE_ID) || '' + ) as TraceLog this.loadTraceFile(localStorageValue) } catch (e: unknown) { - console.warn(`Failed to parse cached trace file: ${(e as Error).message}`) + console.warn( + `Failed to parse cached trace file: ${(e as Error).message}` + ) } }) } @@ -114,7 +134,7 @@ export class DataManagerController implements ReactiveController { } } - #handleSocketMessage (event: MessageEvent) { + #handleSocketMessage(event: MessageEvent) { try { const { scope, data } = JSON.parse(event.data) as SocketMessage if (!data) { @@ -124,25 +144,24 @@ export class DataManagerController implements ReactiveController { if (scope === 'mutations') { this.mutationsContextProvider.setValue([ ...this.mutationsContextProvider.value, - ...data as TraceMutation[] + ...(data as TraceMutation[]) ]) } else if (scope === 'commands') { this.commandsContextProvider.setValue([ ...this.commandsContextProvider.value, - ...data as CommandLog[] + ...(data as CommandLog[]) ]) } else if (scope === 'metadata') { this.metadataContextProvider.setValue({ ...this.metadataContextProvider.value, - ...data as Metadata + ...(data as Metadata) }) } else if (scope === 'consoleLogs') { this.consoleLogsContextProvider.setValue([ ...this.consoleLogsContextProvider.value, - ...data as string[] + ...(data as string[]) ]) - } - else if (scope === 'sources') { + } else if (scope === 'sources') { const merged = { ...(this.sourcesContextProvider.value || {}), ...(data as Record) @@ -150,8 +169,19 @@ export class DataManagerController implements ReactiveController { this.sourcesContextProvider.setValue(merged) console.debug('Merged sources keys', Object.keys(merged)) } else { - const provider = this[`${scope}ContextProvider`] - provider.setValue(data as any) + const providerMap = { + mutations: this.mutationsContextProvider, + logs: this.logsContextProvider, + consoleLogs: this.consoleLogsContextProvider, + metadata: this.metadataContextProvider, + commands: this.commandsContextProvider, + sources: this.sourcesContextProvider, + suites: this.suitesContextProvider + } as const + const provider = providerMap[scope as keyof typeof providerMap] + if (provider) { + provider.setValue(data as any) + } } this.#host.requestUpdate() @@ -160,7 +190,7 @@ export class DataManagerController implements ReactiveController { } } - loadTraceFile (traceFile: TraceLog) { + loadTraceFile(traceFile: TraceLog) { localStorage.setItem(CACHE_ID, JSON.stringify(traceFile)) this.mutationsContextProvider.setValue(traceFile.mutations) this.logsContextProvider.setValue(traceFile.logs) diff --git a/packages/app/src/core/element.ts b/packages/app/src/core/element.ts index 68776ee..9576e75 100644 --- a/packages/app/src/core/element.ts +++ b/packages/app/src/core/element.ts @@ -9,7 +9,7 @@ export class Element extends LitElement { * get shadow root of element as promise which gets resolved once the element * is connected to the DOM */ - async getShadowRootAsync () { + async getShadowRootAsync() { await this.updateComplete return this.shadowRoot } diff --git a/packages/app/src/utils/DragController.ts b/packages/app/src/utils/DragController.ts index 67efea7..b83e97a 100644 --- a/packages/app/src/utils/DragController.ts +++ b/packages/app/src/utils/DragController.ts @@ -48,48 +48,48 @@ export class DragController implements ReactiveController { #state: State = 'idle' #pointerTracker: PointerTracker | null = null - constructor( - host: DragControllerHost, - options: DragControllerOptions - ) { + constructor(host: DragControllerHost, options: DragControllerOptions) { this.#host = host this.#host.addController(this) this.#options = Object.assign({}, defaultOptions, options) this.#localStorageKey = options.localStorageKey - Promise.all([ - this.#getDraggableEl(), - options.getContainerEl() - ]).then(([draggableEl, containerEl]) => { - if (!draggableEl || !containerEl) { - // Retry after a short delay - setTimeout(async () => { - const [retryDraggableEl, retryContainerEl] = await Promise.all([ - this.#getDraggableEl(), - options.getContainerEl() - ]) - if (!retryDraggableEl) { - console.warn('getDraggableEl() did not return an element HTMLElement') - } - if (!retryContainerEl) { - console.warn('getContainerEl() did not return an element HTMLElement') - } - if (retryDraggableEl && retryContainerEl) { - this.#draggableEl = retryDraggableEl as HTMLElement - this.#containerEl = retryContainerEl as HTMLElement - this.#init() - } - }, 50) - return + Promise.all([this.#getDraggableEl(), options.getContainerEl()]).then( + ([draggableEl, containerEl]) => { + if (!draggableEl || !containerEl) { + // Retry after a short delay + setTimeout(async () => { + const [retryDraggableEl, retryContainerEl] = await Promise.all([ + this.#getDraggableEl(), + options.getContainerEl() + ]) + if (!retryDraggableEl) { + console.warn( + 'getDraggableEl() did not return an element HTMLElement' + ) + } + if (!retryContainerEl) { + console.warn( + 'getContainerEl() did not return an element HTMLElement' + ) + } + if (retryDraggableEl && retryContainerEl) { + this.#draggableEl = retryDraggableEl as HTMLElement + this.#containerEl = retryContainerEl as HTMLElement + this.#init() + } + }, 50) + return + } + + window.onresize = () => this.#adjustPosition() + + // TODO Add typeguard to check if HTMLElement + this.#draggableEl = draggableEl as HTMLElement + this.#containerEl = containerEl as HTMLElement + this.#init() } - - window.onresize = () => this.#adjustPosition() - - // TODO Add typeguard to check if HTMLElement - this.#draggableEl = draggableEl as HTMLElement - this.#containerEl = containerEl as HTMLElement - this.#init() - }) + ) const storageValue = this.#localStorageKey ? localStorage.getItem(this.#localStorageKey) @@ -100,30 +100,34 @@ export class DragController implements ReactiveController { this.#setPosition(initialPosition, initialPosition) } - async #getDraggableEl () { + async #getDraggableEl() { await this.#host.updateComplete - return this.#host.shadowRoot!.querySelector(`button[data-draggable-id="${this.#id}"]`) + return this.#host.shadowRoot!.querySelector( + `button[data-draggable-id="${this.#id}"]` + ) } #setPosition(x: number, y: number) { if (this.#options.direction === Direction.horizontal) { let nx = Math.max(x, this.#options.minPosition || 0) - if (this.#options.maxPosition !== undefined) nx = Math.min(nx, this.#options.maxPosition) + if (this.#options.maxPosition !== undefined) { + nx = Math.min(nx, this.#options.maxPosition) + } this.#x = nx } else { let ny = Math.max(y, this.#options.minPosition || 0) - if (this.#options.maxPosition !== undefined) ny = Math.min(ny, this.#options.maxPosition) + if (this.#options.maxPosition !== undefined) { + ny = Math.min(ny, this.#options.maxPosition) + } this.#y = ny } } #getPosition() { - return this.#options.direction === Direction.horizontal - ? this.#x - : this.#y + return this.#options.direction === Direction.horizontal ? this.#x : this.#y } - getPosition () { + getPosition() { return `flex-basis: ${this.#getPosition()}px` } @@ -156,7 +160,7 @@ export class DragController implements ReactiveController { updateState('idle') host.requestUpdate() adjustPosition() - }, + } }) this.#adjustPosition() @@ -217,15 +221,17 @@ export class DragController implements ReactiveController { #onDrag = (_previousPointers: Pointer[], pointers: Pointer[]) => { const [pointer] = pointers - window.dispatchEvent(new CustomEvent('window-drag', { - bubbles: true, - composed: true, - detail: { - pointer, - containerEl: this.#containerEl, - draggableEl: this.#draggableEl - } - })) + window.dispatchEvent( + new CustomEvent('window-drag', { + bubbles: true, + composed: true, + detail: { + pointer, + containerEl: this.#containerEl, + draggableEl: this.#draggableEl + } + }) + ) this.#handleWindowMove(pointer) } @@ -236,7 +242,9 @@ export class DragController implements ReactiveController { async #maybeReinit() { const draggableEl = await this.#getDraggableEl() - if (!draggableEl) return + if (!draggableEl) { + return + } // if slider was removed (collapsed) and re-added, re-init pointer tracker if (this.#draggableEl !== draggableEl) { this.#draggableEl = draggableEl as HTMLElement @@ -245,23 +253,26 @@ export class DragController implements ReactiveController { } getSlider(className = '') { - const anchor = this.#options.direction === Direction.horizontal - ? 'left' - : this.#options.direction === Direction.vertical - ? 'top' - : '' - className += this.#options.direction === Direction.horizontal - ? ' cursor-col-resize left-0 h-full w-[10px]' - : this.#options.direction === Direction.vertical - ? ' cursor-row-resize top-0 w-full h-[10px]' - : '' + const anchor = + this.#options.direction === Direction.horizontal + ? 'left' + : this.#options.direction === Direction.vertical + ? 'top' + : '' + className += + this.#options.direction === Direction.horizontal + ? ' cursor-col-resize left-0 h-full w-[10px]' + : this.#options.direction === Direction.vertical + ? ' cursor-row-resize top-0 w-full h-[10px]' + : '' return html` + class="absolute ${className}" + > ` } @@ -272,15 +283,15 @@ export class DragController implements ReactiveController { } // allow matching when additional inline styles are present - const slidingElem = (draggableEl.parentElement || this.#host.shadowRoot) - ?.querySelector(`*[style*="flex-basis: ${this.#getPosition()}px"]`) + const slidingElem = ( + draggableEl.parentElement || this.#host.shadowRoot + )?.querySelector(`*[style*="flex-basis: ${this.#getPosition()}px"]`) if (!slidingElem) { return } const rect = (slidingElem as HTMLElement).getBoundingClientRect() - const direction = this.#options.direction === Direction.horizontal - ? 'width' - : 'height' + const direction = + this.#options.direction === Direction.horizontal ? 'width' : 'height' const compareVal = rect[direction] if (this.#getPosition() !== compareVal) { this.#setPosition(rect.width, rect.height) diff --git a/packages/app/src/vite-env.d.ts b/packages/app/src/vite-env.d.ts index b3cee84..5c16f2b 100644 --- a/packages/app/src/vite-env.d.ts +++ b/packages/app/src/vite-env.d.ts @@ -1,7 +1,7 @@ +/* eslint-disable @typescript-eslint/consistent-type-imports */ /// interface CommandEventProps { - // eslint-disable-next-line @typescript-eslint/consistent-type-imports command: import('@wdio/devtools-service/types').CommandLog elapsedTime: number } @@ -10,8 +10,10 @@ interface GlobalEventHandlersEventMap { 'app-mutation-highlight': CustomEvent 'app-mutation-select': CustomEvent 'app-source-highlight': CustomEvent - // eslint-disable-next-line @typescript-eslint/consistent-type-imports - 'app-test-filter': CustomEvent + + 'app-test-filter': CustomEvent< + import('./components/sidebar/filter').DevtoolsSidebarFilter + > 'app-logs': CustomEvent 'load-trace': CustomEvent 'show-command': CustomEvent diff --git a/packages/app/tailwind.config.js b/packages/app/tailwind.config.js index 242cfcc..8ab5a51 100644 --- a/packages/app/tailwind.config.js +++ b/packages/app/tailwind.config.js @@ -4,12 +4,11 @@ import fs from 'node:fs' * parse `./src/core/colors.css` and apply them to the theme */ const cssContent = fs.readFileSync('./src/core/colors.css', 'utf-8') -const cssVars = cssContent.match(/--vscode-[^:]+/g) +const cssVars = cssContent + .match(/--vscode-[^:]+/g) .map((c) => [ c, - c - .slice('--vscode-'.length) - .replace(/-(\w)/g, (_, m) => m.toUpperCase()) + c.slice('--vscode-'.length).replace(/-(\w)/g, (_, m) => m.toUpperCase()) ]) .reduce((acc, [key, value]) => { acc[value] = `var(${key})` @@ -19,22 +18,18 @@ const cssVars = cssContent.match(/--vscode-[^:]+/g) /** @type {import('tailwindcss').Config} */ export default { darkMode: ['class', ':host-context(.dark)'], - content: [ - './index.html', - './src/**/*.{js,ts,jsx,tsx}', - ], + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], theme: { extend: {}, colors: { transparent: 'transparent', current: 'currentColor', - 'white': '#ffffff', - 'black': '#000000', + white: '#ffffff', + black: '#000000', - 'wdio': '#ea5907', + wdio: '#ea5907', ...cssVars - }, + } }, - plugins: [], + plugins: [] } - diff --git a/packages/app/vite.config.ts b/packages/app/vite.config.ts index 4617331..e582ab5 100644 --- a/packages/app/vite.config.ts +++ b/packages/app/vite.config.ts @@ -6,23 +6,28 @@ import { FileSystemIconLoader } from 'unplugin-icons/loaders' const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) -// https://vitejs.dev/config/ export default defineConfig({ resolve: { alias: { '@': path.resolve(__dirname, './src'), '@core': path.resolve(__dirname, './src/core'), '@components': path.resolve(__dirname, './src/components'), - }, - }, - plugins: [Icons({ - compiler: 'web-components', - webComponents: { - autoDefine: true, - shadow: false - }, - customCollections: { - custom: FileSystemIconLoader('./src/assets/icons') + '@wdio/devtools-service/types': path.resolve( + __dirname, + '../service/src/types.js' + ) } - })] + }, + plugins: [ + Icons({ + compiler: 'web-components', + webComponents: { + autoDefine: true, + shadow: false + }, + customCollections: { + custom: FileSystemIconLoader('./src/assets/icons') + } + }) + ] }) diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 94951bf..385f27d 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -20,9 +20,9 @@ interface DevtoolsBackendOptions { const log = logger('@wdio/devtools-backend') const clients = new Set() -export async function start (opts: DevtoolsBackendOptions = {}) { +export async function start(opts: DevtoolsBackendOptions = {}) { const host = opts.hostname || 'localhost' - const port = opts.port || await getPort({ port: DEFAULT_PORT }) + const port = opts.port || (await getPort({ port: DEFAULT_PORT })) const appPath = await getDevtoolsApp() server = Fastify({ logger: true }) @@ -31,29 +31,39 @@ export async function start (opts: DevtoolsBackendOptions = {}) { root: appPath }) - server.get('/client', { websocket: true }, (socket: WebSocket, _req: FastifyRequest) => { + server.get( + '/client', + { websocket: true }, + (socket: WebSocket, _req: FastifyRequest) => { log.info('client connected') clients.add(socket) socket.on('close', () => clients.delete(socket)) - }) + } + ) - server.get('/worker', { websocket: true }, (socket: WebSocket, _req: FastifyRequest) => { + server.get( + '/worker', + { websocket: true }, + (socket: WebSocket, _req: FastifyRequest) => { socket.on('message', (message: Buffer) => { - log.info(`received ${message.length} byte message from worker to ${clients.size} client${clients.size > 1 ? 's' : ''}`) - clients.forEach((client) => { - if (client.readyState === WebSocket.OPEN) { - client.send(message.toString()) - } - }) + log.info( + `received ${message.length} byte message from worker to ${clients.size} client${clients.size > 1 ? 's' : ''}` + ) + clients.forEach((client) => { + if (client.readyState === WebSocket.OPEN) { + client.send(message.toString()) + } + }) }) - }) + } + ) log.info(`Starting WebdriverIO Devtools application on port ${port}`) await server.listen({ port, host }) return server } -export async function stop () { +export async function stop() { if (!server) { return } diff --git a/packages/backend/src/utils.ts b/packages/backend/src/utils.ts index 4beffba..0ae2cab 100644 --- a/packages/backend/src/utils.ts +++ b/packages/backend/src/utils.ts @@ -2,11 +2,13 @@ import url from 'node:url' import path from 'node:path' import { resolve } from 'import-meta-resolve' -export async function getDevtoolsApp () { +export async function getDevtoolsApp() { try { const appPkg = await resolve('@wdio/devtools-app', import.meta.url) return path.resolve(url.fileURLToPath(appPkg), '..', '..', 'dist') - } catch (err) { - throw new Error('Couldn\'t find @wdio/devtools-app package, do you have it installed?') + } catch { + throw new Error( + "Couldn't find @wdio/devtools-app package, do you have it installed?" + ) } } diff --git a/packages/script/src/collector.ts b/packages/script/src/collector.ts index 83bc645..43cdb38 100644 --- a/packages/script/src/collector.ts +++ b/packages/script/src/collector.ts @@ -10,33 +10,33 @@ class DataCollector { #mutations: TraceMutation[] = [] #consoleLogs = new ConsoleLogCollector() - captureError (err: Error) { + captureError(err: Error) { const error = err.stack || err.message this.#errors.push(error) } - captureMutation (mutations: TraceMutation[]) { + captureMutation(mutations: TraceMutation[]) { this.#mutations.push(...mutations) } - reset () { + reset() { this.#errors = [] this.#mutations = [] this.#consoleLogs.clear() clearLogs() } - getMetadata () { + getMetadata() { return this.#metadata } - getTraceData () { + getTraceData() { const data = { errors: this.#errors, mutations: this.#mutations, consoleLogs: this.#consoleLogs.getArtifacts(), traceLogs: getLogs(), - metadata: this.getMetadata(), + metadata: this.getMetadata() } as const this.reset() return data @@ -44,4 +44,4 @@ class DataCollector { } export type DataCollectorType = DataCollector -export const collector = window.wdioTraceCollector = new DataCollector() +export const collector = (window.wdioTraceCollector = new DataCollector()) diff --git a/packages/script/src/collectors/consoleLogs.ts b/packages/script/src/collectors/consoleLogs.ts index 954bf54..6443f5c 100644 --- a/packages/script/src/collectors/consoleLogs.ts +++ b/packages/script/src/collectors/consoleLogs.ts @@ -9,11 +9,11 @@ export interface ConsoleLogs { export class ConsoleLogCollector implements Collector { #logs: ConsoleLogs[] = [] - constructor () { + constructor() { consoleMethods.forEach(this.#consolePatch.bind(this)) } - getArtifacts () { + getArtifacts() { return this.#logs } @@ -21,7 +21,7 @@ export class ConsoleLogCollector implements Collector { this.#logs = [] } - #consolePatch (type: (typeof consoleMethods)[number]) { + #consolePatch(type: (typeof consoleMethods)[number]) { const orig = console[type] console[type] = (...args) => { this.#logs.push({ diff --git a/packages/script/src/index.ts b/packages/script/src/index.ts index 6e51dbb..0e7ad33 100644 --- a/packages/script/src/index.ts +++ b/packages/script/src/index.ts @@ -1,4 +1,10 @@ -import { waitForBody, parseFragment, parseDocument, getRef, assignRef } from './utils.js' +import { + waitForBody, + parseFragment, + parseDocument, + getRef, + assignRef +} from './utils.js' import { log } from './logger.js' import { collector } from './collector.js' @@ -11,13 +17,15 @@ try { log('applied wdio ref ids') const timestamp = Date.now() - collector.captureMutation([{ - type: 'childList', - url: document.location.href, - timestamp, - addedNodes: [parseDocument(document.documentElement)], - removedNodes: [] - }]) + collector.captureMutation([ + { + type: 'childList', + url: document.location.href, + timestamp, + addedNodes: [parseDocument(document.documentElement)], + removedNodes: [] + } + ]) log('added initial page structure') const config = { attributes: true, childList: true, subtree: true } @@ -27,33 +35,56 @@ try { log(`observed ${mutationList.length} mutations`) try { - collector.captureMutation(mutationList.map(({ target: t, addedNodes: an, removedNodes: rn, type, attributeName, attributeNamespace, previousSibling: ps, nextSibling: ns, oldValue }) => { - const addedNodes = Array.from(an).map((node) => { - assignRef(node as Element) - return parseFragment(node as Element) - }) + collector.captureMutation( + mutationList.map( + ({ + target: t, + addedNodes: an, + removedNodes: rn, + type, + attributeName, + attributeNamespace, + previousSibling: ps, + nextSibling: ns, + oldValue + }) => { + const addedNodes = Array.from(an).map((node) => { + assignRef(node as Element) + return parseFragment(node as Element) + }) - const removedNodes = Array.from(rn).map((node) => getRef(node)) - const target = getRef(t) - const previousSibling = ps ? getRef(ps) : null - const nextSibling = ns ? getRef(ns) : null + const removedNodes = Array.from(rn).map((node) => getRef(node)) + const target = getRef(t) + const previousSibling = ps ? getRef(ps) : null + const nextSibling = ns ? getRef(ns) : null - let attributeValue: string | undefined - if (type === 'attributes') { - attributeValue = (t as Element).getAttribute(attributeName!) || '' - } - let newTextContent: string | undefined - if (type === 'characterData') { - newTextContent = (t as Element).textContent || '' - } + let attributeValue: string | undefined + if (type === 'attributes') { + attributeValue = (t as Element).getAttribute(attributeName!) || '' + } + let newTextContent: string | undefined + if (type === 'characterData') { + newTextContent = (t as Element).textContent || '' + } - log(`added mutation: ${type}`) - return { - type, attributeName, attributeNamespace, oldValue, addedNodes, target, - removedNodes, previousSibling, nextSibling, timestamp, attributeValue, - newTextContent - } as TraceMutation - })) + log(`added mutation: ${type}`) + return { + type, + attributeName, + attributeNamespace, + oldValue, + addedNodes, + target, + removedNodes, + previousSibling, + nextSibling, + timestamp, + attributeValue, + newTextContent + } as TraceMutation + } + ) + ) } catch (err: any) { collector.captureError(err) } diff --git a/packages/script/src/logger.ts b/packages/script/src/logger.ts index cf7b199..2228463 100644 --- a/packages/script/src/logger.ts +++ b/packages/script/src/logger.ts @@ -1,13 +1,13 @@ let logs: string[] = [] -export function log (...args: any[]) { +export function log(...args: any[]) { logs.push(args.map((a) => JSON.stringify(a)).join(' ')) } -export function getLogs () { +export function getLogs() { return logs } -export function clearLogs () { +export function clearLogs() { logs = [] } diff --git a/packages/script/src/utils.ts b/packages/script/src/utils.ts index cd776e0..579d2d2 100644 --- a/packages/script/src/utils.ts +++ b/packages/script/src/utils.ts @@ -1,4 +1,8 @@ -import { parse, parseFragment as parseFragmentImport, type DefaultTreeAdapterMap } from 'parse5' +import { + parse, + parseFragment as parseFragmentImport, + type DefaultTreeAdapterMap +} from 'parse5' import { h } from 'htm/preact' import type { SimplifiedVNode } from '../types.ts' @@ -10,12 +14,14 @@ export type vElement = DefaultTreeAdapterMap['element'] export type vText = DefaultTreeAdapterMap['textNode'] export type vChildNode = DefaultTreeAdapterMap['childNode'] -function createVNode (elem: any) { +function createVNode(elem: any) { const { type, props } = elem return { type, props } as SimplifiedVNode } -export function parseNode (fragment: vFragment | vComment | vText | vChildNode): SimplifiedVNode | string { +export function parseNode( + fragment: vFragment | vComment | vText | vChildNode +): SimplifiedVNode | string { const props: Record = {} if (fragment.nodeName === '#comment') { @@ -26,18 +32,20 @@ export function parseNode (fragment: vFragment | vComment | vText | vChildNode): } const { childNodes, attrs, tagName } = fragment as vElement - for (const p of (attrs || [])) { - props[p.name] = p.value + for (const p of attrs || []) { + props[p.name] = p.value } try { - return createVNode(h(tagName, props, ...(childNodes || []).map((cn) => parseNode(cn))) as any) + return createVNode( + h(tagName, props, ...(childNodes || []).map((cn) => parseNode(cn))) as any + ) } catch (err: any) { return createVNode(h('div', { class: 'parseNode' }, err.stack)) } } -export function parseDocument (node: HTMLElement) { +export function parseDocument(node: HTMLElement) { try { const fragment = parse(node.outerHTML) return parseNode(fragment.childNodes[0]) @@ -46,7 +54,7 @@ export function parseDocument (node: HTMLElement) { } } -export function parseFragment (node: Element) { +export function parseFragment(node: Element) { try { const fragment = parseFragmentImport(node.outerHTML) return parseNode(fragment) @@ -55,7 +63,7 @@ export function parseFragment (node: Element) { } } -export async function waitForBody () { +export async function waitForBody() { let raf = 0 let resolve: () => void let reject: (err: Error) => void @@ -69,7 +77,7 @@ export async function waitForBody () { 10000 ) - function run () { + function run() { if (!document.body) { return } @@ -84,12 +92,15 @@ export async function waitForBody () { } let refId = 0 - /** - * assign a uid to each element so we can reference it later in the vdom - */ -export function assignRef (elem: Element) { +/** + * assign a uid to each element so we can reference it later in the vdom + */ +export function assignRef(elem: Element) { if (typeof elem.querySelectorAll !== 'function') { - log('assignRef: elem has no querySelectorAll', elem.nodeType || elem.nodeName || elem.textContent || Object.keys(elem)) + log( + 'assignRef: elem has no querySelectorAll', + elem.nodeType || elem.nodeName || elem.textContent || Object.keys(elem) + ) return } @@ -97,14 +108,14 @@ export function assignRef (elem: Element) { elem.setAttribute('data-wdio-ref', `${++refId}`) } - Array.from(elem.querySelectorAll('*')).forEach( - (el) => { el.setAttribute('data-wdio-ref', `${++refId}`) }) + Array.from(elem.querySelectorAll('*')).forEach((el) => { + el.setAttribute('data-wdio-ref', `${++refId}`) + }) } -export function getRef (elem: Node) { +export function getRef(elem: Node) { if (!elem || !(elem as Element).getAttribute) { return null } return (elem as Element).getAttribute('data-wdio-ref') } - diff --git a/packages/script/tsconfig.json b/packages/script/tsconfig.json index 0b83d03..29f8400 100644 --- a/packages/script/tsconfig.json +++ b/packages/script/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "moduleResolution": "Node16", + "moduleResolution": "NodeNext", "module": "NodeNext" } } diff --git a/packages/script/types.d.ts b/packages/script/types.d.ts index 1ac51cd..69631ac 100644 --- a/packages/script/types.d.ts +++ b/packages/script/types.d.ts @@ -8,7 +8,9 @@ export interface TraceMetadata { export interface SimplifiedVNode { type: string - props: Record & { children?: SimplifiedVNode | SimplifiedVNode[] } + props: Record & { + children?: SimplifiedVNode | SimplifiedVNode[] + } } declare global { diff --git a/packages/service/package.json b/packages/service/package.json index 6939adf..15199ec 100644 --- a/packages/service/package.json +++ b/packages/service/package.json @@ -5,16 +5,20 @@ "author": "Christian Bromann ", "type": "module", "exports": { - ".": "./dist/index.js", + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.js" + }, "./types": { - "import": "./dist/types.js", "types": "./dist/types.d.ts", - "node": "./dist/types.js" + "import": "./dist/types.js", + "require": "./dist/types.js" }, "./launcher": { - "import": "./dist/launcher.js", "types": "./dist/launcher.d.ts", - "node": "./dist/launcher.js" + "import": "./dist/launcher.js", + "require": "./dist/launcher.js" } }, "types": "./dist/index.d.ts", diff --git a/packages/service/src/constants.ts b/packages/service/src/constants.ts index dde972d..fa55aee 100644 --- a/packages/service/src/constants.ts +++ b/packages/service/src/constants.ts @@ -15,14 +15,34 @@ export const DEFAULT_LAUNCH_CAPS: WebdriverIO.Capabilities = { } export const INTERNAL_COMMANDS = [ - 'emit', 'browsingContextLocateNodes', 'browsingContextNavigate', - 'waitUntil', 'getTitle', 'getUrl', 'getWindowSize', 'setWindowSize', 'deleteSession', - 'findElementFromShadowRoot', 'findElementsFromShadowRoot', 'waitForExist', 'browsingContextGetTree', - 'scriptCallFunction', 'getElement', 'execute', 'findElement' + 'emit', + 'browsingContextLocateNodes', + 'browsingContextNavigate', + 'waitUntil', + 'getTitle', + 'getUrl', + 'getWindowSize', + 'setWindowSize', + 'deleteSession', + 'findElementFromShadowRoot', + 'findElementsFromShadowRoot', + 'waitForExist', + 'browsingContextGetTree', + 'scriptCallFunction', + 'getElement', + 'execute', + 'findElement' ] export const CONTEXT_CHANGE_COMMANDS = [ - 'url', 'back', 'forward', 'refresh', 'switchFrame', 'newWindow', 'createWindow', 'closeWindow' + 'url', + 'back', + 'forward', + 'refresh', + 'switchFrame', + 'newWindow', + 'createWindow', + 'closeWindow' ] /** @@ -46,13 +66,21 @@ export const PARSE_PLUGINS = [ */ export const TEST_FN_NAMES = ['it', 'test', 'specify', 'fit', 'xit'] as const export const SUITE_FN_NAMES = ['describe', 'context', 'suite'] as const -export const STEP_FN_NAMES = ['Given', 'When', 'Then', 'And', 'But', 'defineStep'] as const +export const STEP_FN_NAMES = [ + 'Given', + 'When', + 'Then', + 'And', + 'But', + 'defineStep' +] as const /** * File/type recognizers */ export const STEP_FILE_RE = /\.(?:steps?)\.[cm]?[jt]sx?$/i -export const STEP_DIR_RE = /(?:^|\/)(?:step[-_]?definitions|steps)\/.+\.[cm]?[jt]sx?$/i +export const STEP_DIR_RE = + /(?:^|\/)(?:step[-_]?definitions|steps)\/.+\.[cm]?[jt]sx?$/i export const SPEC_FILE_RE = /\.(?:test|spec)\.[cm]?[jt]sx?$/i export const FEATURE_FILE_RE = /\.feature$/i export const SOURCE_FILE_EXT_RE = /\.(?:[cm]?js|[cm]?ts)x?$/ @@ -60,17 +88,24 @@ export const SOURCE_FILE_EXT_RE = /\.(?:[cm]?js|[cm]?ts)x?$/ /** * Gherkin Feature/Scenario line */ -export const FEATURE_OR_SCENARIO_LINE_RE = /^\s*(Feature|Scenario(?: Outline)?):\s*(.+)\s*$/i +export const FEATURE_OR_SCENARIO_LINE_RE = + /^\s*(Feature|Scenario(?: Outline)?):\s*(.+)\s*$/i /** * Step definition textual scan regexes */ -export const STEP_DEF_REGEX_LITERAL_RE = /\b(Given|When|Then|And|But)\s*\(\s*(\/(?:\\.|[^/\\])+\/[gimsuy]*)/ -export const STEP_DEF_STRING_RE = /\b(Given|When|Then|And|But)\s*\(\s*(['`])([^'`\\]*(?:\\.[^'`\\]*)*)\2/ +export const STEP_DEF_REGEX_LITERAL_RE = + /\b(Given|When|Then|And|But)\s*\(\s*(\/(?:\\.|[^/\\])+\/[gimsuy]*)/ +export const STEP_DEF_STRING_RE = + /\b(Given|When|Then|And|But)\s*\(\s*(['`])([^'`\\]*(?:\\.[^'`\\]*)*)\2/ /** * Step directories discovery */ -export const STEPS_DIR_CANDIDATES = ['step-definitions', 'step_definitions', 'steps'] as const +export const STEPS_DIR_CANDIDATES = [ + 'step-definitions', + 'step_definitions', + 'steps' +] as const export const STEPS_DIR_ASCENT_MAX = 6 export const STEPS_GLOBAL_SEARCH_MAX_DEPTH = 5 diff --git a/packages/service/src/index.ts b/packages/service/src/index.ts index cf42afb..c1fd585 100644 --- a/packages/service/src/index.ts +++ b/packages/service/src/index.ts @@ -10,11 +10,15 @@ import type { WebDriverCommands } from '@wdio/protocols' import { SessionCapturer } from './session.js' import { TestReporter } from './reporter.js' import { DevToolsAppLauncher } from './launcher.js' -import { getBrowserObject } from './utils.ts' +import { getBrowserObject } from './utils.js' import { parse } from 'stack-trace' -import { type TraceLog, TraceType } from './types.ts' -import { INTERNAL_COMMANDS, SPEC_FILE_PATTERN, CONTEXT_CHANGE_COMMANDS } from './constants.ts' - +import { type TraceLog, TraceType } from './types.js' +import { + INTERNAL_COMMANDS, + SPEC_FILE_PATTERN, + CONTEXT_CHANGE_COMMANDS +} from './constants.js' +export * from './types.js' export const launcher = DevToolsAppLauncher const log = logger('@wdio/devtools-service') @@ -23,242 +27,295 @@ const log = logger('@wdio/devtools-service') * Setup WebdriverIO Devtools hook for standalone instances */ export function setupForDevtools(opts: Options.WebdriverIO) { - let browserCaptured = false - const service = new DevToolsHookService() - service.captureType = TraceType.Standalone - - // In v9, the `opts` object itself contains the capabilities. - // The `beforeSession` hook expects the config and the capabilities. - service.beforeSession(opts, opts as Capabilities.W3CCapabilities) - - opts.beforeCommand = Array.isArray(opts.beforeCommand) - ? opts.beforeCommand - : opts.beforeCommand ? [opts.beforeCommand] : [] - opts.beforeCommand.push( - async function captureBrowserInstance(this: WebdriverIO.Browser, command: keyof WebDriverCommands) { - if (!browserCaptured) { - browserCaptured = true - service.before(this.capabilities as Capabilities.W3CCapabilities, [], this) - } - - /** - * capture trace on `deleteSession` since we can't do it in `afterCommand` as the session - * would be terminated by then - */ - if (command === 'deleteSession') { - await service.after() - } - }, - service.beforeCommand.bind(service) - ) - - /** - * register after command hook - */ - opts.afterCommand = Array.isArray(opts.afterCommand) - ? opts.afterCommand - : opts.afterCommand ? [opts.afterCommand] : [] - opts.afterCommand.push(service.afterCommand.bind(service)) + let browserCaptured = false + const service = new DevToolsHookService() + service.captureType = TraceType.Standalone + + // In v9, the `opts` object itself contains the capabilities. + // The `beforeSession` hook expects the config and the capabilities. + service.beforeSession(opts, opts as Capabilities.W3CCapabilities) + + opts.beforeCommand = Array.isArray(opts.beforeCommand) + ? opts.beforeCommand + : opts.beforeCommand + ? [opts.beforeCommand] + : [] + opts.beforeCommand.push(async function captureBrowserInstance( + this: WebdriverIO.Browser, + command: keyof WebDriverCommands + ) { + if (!browserCaptured) { + browserCaptured = true + service.before( + this.capabilities as Capabilities.W3CCapabilities, + [], + this + ) + } /** - * return modified session configuration + * capture trace on `deleteSession` since we can't do it in `afterCommand` as the session + * would be terminated by then */ - return opts + if (command === 'deleteSession') { + await service.after() + } + }, service.beforeCommand.bind(service)) + + /** + * register after command hook + */ + opts.afterCommand = Array.isArray(opts.afterCommand) + ? opts.afterCommand + : opts.afterCommand + ? [opts.afterCommand] + : [] + opts.afterCommand.push(service.afterCommand.bind(service)) + + /** + * return modified session configuration + */ + return opts } export default class DevToolsHookService implements Services.ServiceInstance { - #testReporters: TestReporter[] = [] - #sessionCapturer = new SessionCapturer() - #browser?: WebdriverIO.Browser + #testReporters: TestReporter[] = [] + #sessionCapturer = new SessionCapturer() + #browser?: WebdriverIO.Browser + + /** + * This is used to capture the command stack to ensure that we only capture + * commands that are top-level user commands. + */ + #commandStack: string[] = [] + + // This is used to capture the last command signature to avoid duplicate captures + #lastCommandSig: string | null = null + + /** + * allows to define the type of data being captured to hint the + * devtools app which data to expect + */ + captureType = TraceType.Testrunner + + // This is used to track if the injection script is currently being injected + #injecting = false + + before( + caps: Capabilities.W3CCapabilities, + __: string[], + browser: WebdriverIO.Browser + ) { + this.#browser = browser /** - * This is used to capture the command stack to ensure that we only capture - * commands that are top-level user commands. + * propagate session metadata at the beginning of the session */ - #commandStack: string[] = [] - - // This is used to capture the last command signature to avoid duplicate captures - #lastCommandSig: string | null = null; + browser + .execute(() => window.visualViewport) + .then((viewport) => + this.#sessionCapturer.sendUpstream('metadata', { + viewport: viewport || undefined, + type: this.captureType, + options: browser.options, + capabilities: browser.capabilities as Capabilities.W3CCapabilities + }) + ) + this.#ensureInjected('session-start') /** - * allows to define the type of data being captured to hint the - * devtools app which data to expect + * create a new session capturer instance with the devtools options */ - captureType = TraceType.Testrunner - - // This is used to track if the injection script is currently being injected - #injecting = false - - before(caps: Capabilities.W3CCapabilities, __: string[], browser: WebdriverIO.Browser) { - this.#browser = browser - - /** - * propagate session metadata at the beginning of the session - */ - browser.execute(() => window.visualViewport) - .then((viewport) => this.#sessionCapturer.sendUpstream('metadata', { - viewport: viewport || undefined, - type: this.captureType, - options: browser.options, - capabilities: browser.capabilities as Capabilities.W3CCapabilities, - })) - this.#ensureInjected('session-start') + const wdioCaps = caps as Capabilities.W3CCapabilities & { + 'wdio:devtoolsOptions'?: any + } + this.#sessionCapturer = new SessionCapturer( + wdioCaps['wdio:devtoolsOptions'] + ) + } + + // The method signature is corrected to use W3CCapabilities + beforeSession( + config: Options.Testrunner, + capabilities: Capabilities.W3CCapabilities + ) { + const isMultiRemote = + !('browserName' in capabilities) && !('platformName' in capabilities) + if (isMultiRemote) { + throw new SevereServiceError( + 'The DevTools hook does not support multiremote yet' + ) + } + if ('reporters' in config) { + const self = this + config.reporters = [ + ...(config.reporters || []), /** - * create a new session capturer instance with the devtools options + * class wrapper to make sure we can access the reporter instance */ - const wdioCaps = caps as Capabilities.W3CCapabilities & { 'wdio:devtoolsOptions'?: any } - this.#sessionCapturer = new SessionCapturer(wdioCaps['wdio:devtoolsOptions']) - } - - // The method signature is corrected to use W3CCapabilities - beforeSession(config: Options.Testrunner, capabilities: Capabilities.W3CCapabilities) { - const isMultiRemote = !('browserName' in capabilities) && !('platformName' in capabilities) - if (isMultiRemote) { - throw new SevereServiceError('The DevTools hook does not support multiremote yet') - } - - if ('reporters' in config) { - const self = this - config.reporters = [ - ...(config.reporters || []), - /** - * class wrapper to make sure we can access the reporter instance - */ - class DevToolsReporter extends TestReporter { - constructor (options: Reporters.Options) { - super(options, (upstreamData: any) => self.#sessionCapturer.sendUpstream('suites', upstreamData)) - self.#testReporters.push(this) - } - } - ] + class DevToolsReporter extends TestReporter { + constructor(options: Reporters.Options) { + super(options, (upstreamData: any) => + self.#sessionCapturer.sendUpstream('suites', upstreamData) + ) + self.#testReporters.push(this) + } } + ] + } + } + + /** + * Hook for Cucumber framework. + * beforeScenario is triggered at the beginning of every worker session, therefore + * we can use it to reset the command stack and last command signature + */ + beforeScenario() { + this.resetStack() + } + + /** + * Hook for Mocha/Jasmine frameworks. + * It does the exact same thing as beforeScenario. + */ + beforeTest() { + this.resetStack() + } + + private resetStack() { + this.#lastCommandSig = null + this.#commandStack = [] + } + + async beforeCommand(command: string, args: string[]) { + if (!this.#browser) { + return } /** - * Hook for Cucumber framework. - * beforeScenario is triggered at the beginning of every worker session, therefore - * we can use it to reset the command stack and last command signature + * propagate url change to devtools app */ - beforeScenario() { - this.resetStack() + if (command === 'url') { + this.#sessionCapturer.sendUpstream('metadata', { url: args[0] }) } /** - * Hook for Mocha/Jasmine frameworks. - * It does the exact same thing as beforeScenario. + * Smart stack filtering to detect top-level user commands */ - beforeTest() { - this.resetStack() + Error.stackTraceLimit = 20 + const stack = parse(new Error('')).reverse() + const source = stack.find((frame) => { + const file = frame.getFileName() + // Only consider command frames from user spec/test files + return file && SPEC_FILE_PATTERN.test(file) + }) + + if ( + source && + this.#commandStack.length === 0 && + !INTERNAL_COMMANDS.includes(command) + ) { + const cmdSig = JSON.stringify({ + command, + args, + src: source.getFileName() + ':' + source.getLineNumber() + }) + + if (this.#lastCommandSig !== cmdSig) { + this.#commandStack.push(command) + this.#lastCommandSig = cmdSig + } } - - private resetStack() { - this.#lastCommandSig = null - this.#commandStack = [] + } + + afterCommand( + command: keyof WebDriverCommands, + args: any[], + result: any, + error?: Error + ) { + // Skip bookkeeping for internal injection calls + if (this.#injecting) { + return } - async beforeCommand(command: string, args: string[]) { - if (!this.#browser) { return } - - /** - * propagate url change to devtools app - */ - if (command === 'url') { - this.#sessionCapturer.sendUpstream('metadata', { url: args[0] }) - } - - /** - * Smart stack filtering to detect top-level user commands - */ - Error.stackTraceLimit = 20 - const stack = parse(new Error('')).reverse() - const source = stack.find((frame) => { - const file = frame.getFileName() - // Only consider command frames from user spec/test files - return file && SPEC_FILE_PATTERN.test(file) - }) - - if (source && this.#commandStack.length === 0 && !INTERNAL_COMMANDS.includes(command)) { - const cmdSig = JSON.stringify({ - command, - args, - src: source.getFileName() + ':' + source.getLineNumber() - }); - - if (this.#lastCommandSig !== cmdSig) { - this.#commandStack.push(command); - this.#lastCommandSig = cmdSig; - } - } + /* Ensure that the command is captured only if it matches the last command in the stack. + * This prevents capturing commands that are not top-level user commands. + */ + if (this.#commandStack[this.#commandStack.length - 1] === command) { + this.#commandStack.pop() + if (this.#browser) { + return this.#sessionCapturer.afterCommand( + this.#browser, + command, + args, + result, + error + ) + } } - afterCommand(command: keyof WebDriverCommands, args: any[], result: any, error?: Error) { - // Skip bookkeeping for internal injection calls - if (this.#injecting) return - - /* Ensure that the command is captured only if it matches the last command in the stack. - * This prevents capturing commands that are not top-level user commands. - */ - if (this.#commandStack[this.#commandStack.length - 1] === command) { - this.#commandStack.pop() - if (this.#browser) { - return this.#sessionCapturer.afterCommand(this.#browser, command, args, result, error) - } - } - - // Re-inject AFTER context-changing commands complete so new documents/frames are instrumented - if (CONTEXT_CHANGE_COMMANDS.includes(command)) { - void this.#ensureInjected(`context-change:${command}`) - } + // Re-inject AFTER context-changing commands complete so new documents/frames are instrumented + if (CONTEXT_CHANGE_COMMANDS.includes(command)) { + void this.#ensureInjected(`context-change:${command}`) + } + } + + /** + * after hook is triggered at the end of every worker session, therefore + * we can use it to write all trace information to a file + */ + async after() { + if (!this.#browser) { + return + } + const outputDir = this.#browser.options.outputDir || process.cwd() + const { ...options } = this.#browser.options + const traceLog: TraceLog = { + mutations: this.#sessionCapturer.mutations, + logs: this.#sessionCapturer.traceLogs, + consoleLogs: this.#sessionCapturer.consoleLogs, + metadata: { + type: this.captureType, + ...this.#sessionCapturer.metadata!, + options, + capabilities: this.#browser.capabilities as Capabilities.W3CCapabilities + }, + commands: this.#sessionCapturer.commandsLog, + sources: Object.fromEntries(this.#sessionCapturer.sources), + suites: this.#testReporters.map((reporter) => reporter.report) } - /** - * after hook is triggered at the end of every worker session, therefore - * we can use it to write all trace information to a file - */ - async after () { - if (!this.#browser) { - return - } - const outputDir = this.#browser.options.outputDir || process.cwd() - const { ...options } = this.#browser.options - const traceLog: TraceLog = { - mutations: this.#sessionCapturer.mutations, - logs: this.#sessionCapturer.traceLogs, - consoleLogs: this.#sessionCapturer.consoleLogs, - metadata: { - type: this.captureType, - ...this.#sessionCapturer.metadata!, - options, - capabilities: this.#browser.capabilities as Capabilities.W3CCapabilities - }, - commands: this.#sessionCapturer.commandsLog, - sources: Object.fromEntries(this.#sessionCapturer.sources), - suites: this.#testReporters.map((reporter) => reporter.report) - } + const traceFilePath = path.join( + outputDir, + `wdio-trace-${this.#browser.sessionId}.json` + ) + await fs.writeFile(traceFilePath, JSON.stringify(traceLog)) + log.info(`DevTools trace saved to ${traceFilePath}`) + } - const traceFilePath = path.join(outputDir, `wdio-trace-${this.#browser.sessionId}.json`) - await fs.writeFile(traceFilePath, JSON.stringify(traceLog)) - log.info(`DevTools trace saved to ${traceFilePath}`) + async #ensureInjected(reason: string) { + if (!this.#browser) { + return } - - async #ensureInjected(reason: string) { - if (!this.#browser) return - if (this.#injecting) return - try { - this.#injecting = true - // Cheap marker check (no heavy stack work) - const markerPresent = await this.#browser.execute(() => { - return Boolean((window as any).__WDIO_DEVTOOLS_MARK) - }) - if (markerPresent) { - return - } - await this.#sessionCapturer.injectScript(getBrowserObject(this.#browser)) - } catch (err) { - log.warn(`[inject] failed (reason=${reason}): ${(err as Error).message}`) - } finally { - this.#injecting = false - } + if (this.#injecting) { + return + } + try { + this.#injecting = true + // Cheap marker check (no heavy stack work) + const markerPresent = await this.#browser.execute(() => { + return Boolean((window as any).__WDIO_DEVTOOLS_MARK) + }) + if (markerPresent) { + return + } + await this.#sessionCapturer.injectScript(getBrowserObject(this.#browser)) + } catch (err) { + log.warn(`[inject] failed (reason=${reason}): ${(err as Error).message}`) + } finally { + this.#injecting = false } + } } diff --git a/packages/service/src/launcher.ts b/packages/service/src/launcher.ts index 61c3513..687e804 100644 --- a/packages/service/src/launcher.ts +++ b/packages/service/src/launcher.ts @@ -1,7 +1,7 @@ import { remote } from 'webdriverio' import { start } from '@wdio/devtools-backend' import logger from '@wdio/logger' -import { DEFAULT_LAUNCH_CAPS } from './constants.ts' +import { DEFAULT_LAUNCH_CAPS } from './constants.js' import type { ServiceOptions, ExtendedCapabilities } from './types.js' const log = logger('@wdio/devtools-service:Launcher') @@ -9,20 +9,19 @@ export class DevToolsAppLauncher { #options: ServiceOptions #browser?: WebdriverIO.Browser - constructor (options: ServiceOptions) { + constructor(options: ServiceOptions) { this.#options = options } - async onPrepare (_: never, caps: ExtendedCapabilities[]) { + async onPrepare(_: never, caps: ExtendedCapabilities[]) { try { const { server } = await start({ port: this.#options.port, hostname: this.#options.hostname }) const address = server.address() - const port = address && typeof address === 'object' - ? address.port - : undefined + const port = + address && typeof address === 'object' ? address.port : undefined if (!port) { return console.log(`Failed to start server on port ${port}`) @@ -42,28 +41,31 @@ export class DevToolsAppLauncher { } } - async onComplete () { + async onComplete() { if (this.#browser) { logger.setLevel('devtools', 'warn') - log.info('Please close the browser window to finish...'); + log.info('Please close the browser window to finish...') while (true) { try { - await this.#browser.getTitle(); - await new Promise(res => setTimeout(res, 1000)); - } catch (e) { - log.info('Browser window closed, stopping DevTools app'); - break; + await this.#browser.getTitle() + await new Promise((res) => setTimeout(res, 1000)) + } catch { + log.info('Browser window closed, stopping DevTools app') + break } } try { - await this.#browser.deleteSession(); + await this.#browser.deleteSession() } catch (err: any) { - log.warn('Session already closed or could not be deleted:', err.message); + log.warn('Session already closed or could not be deleted:', err.message) } } } - #updateCapabilities (caps: ExtendedCapabilities[], devtoolsApp: { port: number }) { + #updateCapabilities( + caps: ExtendedCapabilities[], + devtoolsApp: { port: number } + ) { /** * we don't support multiremote yet */ diff --git a/packages/service/src/reporter.ts b/packages/service/src/reporter.ts index 10e5ca1..45d44ac 100644 --- a/packages/service/src/reporter.ts +++ b/packages/service/src/reporter.ts @@ -1,12 +1,19 @@ -import WebdriverIOReporter, { type SuiteStats, type TestStats } from '@wdio/reporter' -import { mapTestToSource, setCurrentSpecFile, mapSuiteToSource } from './utils.js' +import WebdriverIOReporter, { + type SuiteStats, + type TestStats +} from '@wdio/reporter' +import { + mapTestToSource, + setCurrentSpecFile, + mapSuiteToSource +} from './utils.js' export class TestReporter extends WebdriverIOReporter { #report: (data: any) => void #currentSpecFile?: string #suitePath: string[] = [] - constructor (options: any, report: (data: any) => void) { + constructor(options: any, report: (data: any) => void) { super(options) this.#report = report } @@ -17,12 +24,15 @@ export class TestReporter extends WebdriverIOReporter { setCurrentSpecFile(suiteStats.file) // Push title if non-empty - if (suiteStats.title) this.#suitePath.push(suiteStats.title) + if (suiteStats.title) { + this.#suitePath.push(suiteStats.title) + } // Enrich and set callSource for suites mapSuiteToSource(suiteStats as any, this.#currentSpecFile, this.#suitePath) - if ((suiteStats as any).file && (suiteStats as any).line != null) { - ;(suiteStats as any).callSource = `${(suiteStats as any).file}:${(suiteStats as any).line}` + if ((suiteStats as any).file && (suiteStats as any).line !== null) { + ;(suiteStats as any).callSource = + `${(suiteStats as any).file}:${(suiteStats as any).line}` } this.#sendUpstream() @@ -31,8 +41,9 @@ export class TestReporter extends WebdriverIOReporter { onTestStart(testStats: TestStats): void { // Enrich testStats with callSource info mapTestToSource(testStats, this.#currentSpecFile) - if ((testStats as any).file && (testStats as any).line != null) { - ;(testStats as any).callSource = `${(testStats as any).file}:${(testStats as any).line}` + if ((testStats as any).file && (testStats as any).line !== null) { + ;(testStats as any).callSource = + `${(testStats as any).file}:${(testStats as any).line}` } super.onTestStart(testStats) this.#sendUpstream() @@ -46,7 +57,10 @@ export class TestReporter extends WebdriverIOReporter { onSuiteEnd(suiteStats: SuiteStats): void { super.onSuiteEnd(suiteStats) // Pop the suite we pushed on start - if (suiteStats.title && this.#suitePath[this.#suitePath.length - 1] === suiteStats.title) { + if ( + suiteStats.title && + this.#suitePath[this.#suitePath.length - 1] === suiteStats.title + ) { this.#suitePath.pop() } // Only clear when the last suite ends @@ -57,7 +71,7 @@ export class TestReporter extends WebdriverIOReporter { this.#sendUpstream() } - #sendUpstream () { + #sendUpstream() { if (!this.suites) { return } @@ -75,7 +89,7 @@ export class TestReporter extends WebdriverIOReporter { } } - get report () { + get report() { return this.suites } } diff --git a/packages/service/src/session.ts b/packages/service/src/session.ts index 08364d2..873aea6 100644 --- a/packages/service/src/session.ts +++ b/packages/service/src/session.ts @@ -10,7 +10,7 @@ import type { WebDriverCommands } from '@wdio/protocols' import { PAGE_TRANSITION_COMMANDS } from './constants.js' import { type CommandLog } from './types.js' -import { type TraceLog } from './types.ts' +import { type TraceLog } from './types.js' const log = logger('@wdio/devtools-service:SessionCapturer') @@ -23,19 +23,23 @@ export class SessionCapturer { traceLogs: string[] = [] consoleLogs: ConsoleLogs[] = [] metadata?: { - url: string; - viewport: VisualViewport; + url: string + viewport: VisualViewport } - constructor (devtoolsOptions: { hostname?: string, port?: number } = {}) { + constructor(devtoolsOptions: { hostname?: string; port?: number } = {}) { const { port, hostname } = devtoolsOptions if (hostname && port) { this.#ws = new WebSocket(`ws://${hostname}:${port}/worker`) - this.#ws.on('error', (err: unknown) => log.error(`Couldn't connect to devtools backend: ${(err as Error).message}`)) + this.#ws.on('error', (err: unknown) => + log.error( + `Couldn't connect to devtools backend: ${(err as Error).message}` + ) + ) } } - get isReportingUpstream () { + get isReportingUpstream() { return Boolean(this.#ws) && this.#ws?.readyState === WebSocket.OPEN } @@ -51,29 +55,53 @@ export class SessionCapturer { * @param {object} result command result * @param {Error} error command error */ - async afterCommand (browser: WebdriverIO.Browser, command: keyof WebDriverCommands, args: any[], result: any, error: Error | undefined) { + async afterCommand( + browser: WebdriverIO.Browser, + command: keyof WebDriverCommands, + args: any[], + result: any, + error: Error | undefined + ) { const timestamp = Date.now() - const sourceFile = parse(new Error('')) - .filter((frame) => Boolean(frame.getFileName())) - .map((frame) => [frame.getFileName(), frame.getLineNumber(), frame.getColumnNumber()].join(':')) - .filter((fileName) => ( - !fileName.includes('/node_modules/') && - !fileName.includes(')') && - !fileName.includes('node:internal') && - !fileName.includes('/dist/') - )) - .shift() || '' + const sourceFile = + parse(new Error('')) + .filter((frame) => Boolean(frame.getFileName())) + .map((frame) => + [ + frame.getFileName(), + frame.getLineNumber(), + frame.getColumnNumber() + ].join(':') + ) + .filter( + (fileName) => + !fileName.includes('/node_modules/') && + !fileName.includes(')') && + !fileName.includes('node:internal') && + !fileName.includes('/dist/') + ) + .shift() || '' const absPath = sourceFile.startsWith('file://') ? url.fileURLToPath(sourceFile) : sourceFile const sourceFilePath = absPath.split(':')[0] - const fileExist = await fs.access(sourceFilePath).then(() => true, () => false) + const fileExist = await fs.access(sourceFilePath).then( + () => true, + () => false + ) if (sourceFile && !this.sources.has(sourceFile) && fileExist) { const sourceCode = await fs.readFile(sourceFilePath, 'utf-8') this.sources.set(sourceFilePath, sourceCode.toString()) this.sendUpstream('sources', { [sourceFilePath]: sourceCode.toString() }) } - const newCommand: CommandLog = { command, args, result, error, timestamp, callSource: absPath } + const newCommand: CommandLog = { + command, + args, + result, + error, + timestamp, + callSource: absPath + } this.commandsLog.push(newCommand) this.sendUpstream('commands', [newCommand]) @@ -85,13 +113,15 @@ export class SessionCapturer { } } - async injectScript (browser: WebdriverIO.Browser) { + async injectScript(browser: WebdriverIO.Browser) { if (this.#isInjected) { return } if (!browser.isBidi) { - throw new SevereServiceError(`Can not set up devtools for session with id "${browser.sessionId}" because it doesn't support WebDriver Bidi`) + throw new SevereServiceError( + `Can not set up devtools for session with id "${browser.sessionId}" because it doesn't support WebDriver Bidi` + ) } this.#isInjected = true @@ -100,11 +130,11 @@ export class SessionCapturer { const functionDeclaration = `async () => { ${source} }` await browser.scriptAddPreloadScript({ - functionDeclaration + functionDeclaration }) } - async #captureTrace (browser: WebdriverIO.Browser) { + async #captureTrace(browser: WebdriverIO.Browser) { /** * only capture trace if script was injected */ @@ -112,11 +142,12 @@ export class SessionCapturer { return } - const { mutations, traceLogs, consoleLogs, metadata } = await browser.execute(() => window.wdioTraceCollector.getTraceData()) + const { mutations, traceLogs, consoleLogs, metadata } = + await browser.execute(() => window.wdioTraceCollector.getTraceData()) this.metadata = metadata if (Array.isArray(mutations)) { - this.mutations.push(...mutations as TraceMutation[]) + this.mutations.push(...(mutations as TraceMutation[])) this.sendUpstream('mutations', mutations) } if (Array.isArray(traceLogs)) { @@ -124,12 +155,15 @@ export class SessionCapturer { this.sendUpstream('logs', traceLogs) } if (Array.isArray(consoleLogs)) { - this.consoleLogs.push(...consoleLogs as ConsoleLogs[]) + this.consoleLogs.push(...(consoleLogs as ConsoleLogs[])) this.sendUpstream('consoleLogs', consoleLogs) } } - sendUpstream (scope: Scope, data: Partial) { + sendUpstream( + scope: Scope, + data: Partial + ) { if (!this.#ws || this.#ws.readyState !== WebSocket.OPEN) { return } diff --git a/packages/service/src/utils.ts b/packages/service/src/utils.ts index 36c881c..c2c65e3 100644 --- a/packages/service/src/utils.ts +++ b/packages/service/src/utils.ts @@ -25,16 +25,22 @@ import { } from './constants.js' const require = createRequire(import.meta.url) +// eslint-disable-next-line @typescript-eslint/consistent-type-imports const stackTrace = require('stack-trace') as typeof import('stack-trace') const _astCache = new Map() -let CE: { CucumberExpression: any, ParameterTypeRegistry: any } | undefined +let CE: { CucumberExpression: any; ParameterTypeRegistry: any } | undefined try { - // eslint-disable-next-line @typescript-eslint/no-var-requires const ce = require('@cucumber/cucumber-expressions') - CE = { CucumberExpression: ce.CucumberExpression, ParameterTypeRegistry: ce.ParameterTypeRegistry } -} catch { /* optional */ } + CE = { + CucumberExpression: ce.CucumberExpression, + ParameterTypeRegistry: ce.ParameterTypeRegistry + } +} catch { + /* optional */ +} +// eslint-disable-next-line @typescript-eslint/consistent-type-imports const traverse: (typeof import('@babel/traverse'))['default'] = (babelTraverse as any).default ?? (babelTraverse as any) @@ -49,7 +55,9 @@ export function setCurrentSpecFile(file?: string) { /** * Get the top-level browser object from an element/browser */ -export function getBrowserObject (elem: WebdriverIO.Element | WebdriverIO.Browser): WebdriverIO.Browser { +export function getBrowserObject( + elem: WebdriverIO.Element | WebdriverIO.Browser +): WebdriverIO.Browser { const elemObject = elem as WebdriverIO.Element return (elemObject as WebdriverIO.Element).parent ? getBrowserObject(elemObject.parent) @@ -60,8 +68,12 @@ export function getBrowserObject (elem: WebdriverIO.Element | WebdriverIO.Browse * Get root callee name (handles Identifier and MemberExpression like it.only) */ function rootCalleeName(callee: any): string | undefined { - if (!callee) return - if (callee.type === 'Identifier') return callee.name + if (!callee) { + return + } + if (callee.type === 'Identifier') { + return callee.name + } if (callee.type === 'MemberExpression') { const obj: any = callee.object return obj && obj.type === 'Identifier' ? obj.name : undefined @@ -73,14 +85,16 @@ function rootCalleeName(callee: any): string | undefined { * Parse a JS/TS test/spec file to collect suite/test calls (Mocha/Jasmine) with full title path */ export function findTestLocations(filePath: string) { - if (!fs.existsSync(filePath)) return [] + if (!fs.existsSync(filePath)) { + return [] + } const src = fs.readFileSync(filePath, 'utf-8') const ast = parse(src, { sourceType: 'module', plugins: PARSE_PLUGINS as any, errorRecovery: true, - allowReturnOutsideFunction: true, + allowReturnOutsideFunction: true }) type Loc = { @@ -94,12 +108,19 @@ export function findTestLocations(filePath: string) { const out: Loc[] = [] const suiteStack: string[] = [] - const isSuite = (n?: string) => !!n && (SUITE_FN_NAMES as readonly string[]).includes(n) || n === 'Feature' - const isTest = (n?: string) => !!n && (TEST_FN_NAMES as readonly string[]).includes(n) + const isSuite = (n?: string) => + (!!n && (SUITE_FN_NAMES as readonly string[]).includes(n)) || + n === 'Feature' + const isTest = (n?: string) => + !!n && (TEST_FN_NAMES as readonly string[]).includes(n) const staticTitle = (node: any): string | undefined => { - if (!node) return - if (node.type === 'StringLiteral') return node.value + if (!node) { + return + } + if (node.type === 'StringLiteral') { + return node.value + } if (node.type === 'TemplateLiteral' && node.expressions.length === 0) { return node.quasis.map((q: any) => q.value.cooked).join('') } @@ -108,10 +129,14 @@ export function findTestLocations(filePath: string) { traverse(ast, { enter(p) { - if (!p.isCallExpression()) return + if (!p.isCallExpression()) { + return + } const callee: any = p.node.callee const root = rootCalleeName(callee) - if (!root) return + if (!root) { + return + } if (isSuite(root)) { const ttl = staticTitle(p.node.arguments?.[0] as any) @@ -139,13 +164,19 @@ export function findTestLocations(filePath: string) { } }, exit(p) { - if (!p.isCallExpression()) return + if (!p.isCallExpression()) { + return + } const callee: any = p.node.callee const root = rootCalleeName(callee) - if (!root || !isSuite(root)) return + if (!root || !isSuite(root)) { + return + } const ttl = ((): string | undefined => { const a0: any = p.node.arguments?.[0] - if (a0?.type === 'StringLiteral') return a0.value + if (a0?.type === 'StringLiteral') { + return a0.value + } if (a0?.type === 'TemplateLiteral' && a0.expressions.length === 0) { return a0.quasis.map((q: any) => q.value.cooked).join('') } @@ -185,13 +216,19 @@ export function getCurrentTestLocation() { const fn = fr.getFileName() as string return STEP_FILE_RE.test(fn) || STEP_DIR_RE.test(fn) }) - if (step) return step + if (step) { + return step + } const spec = pick((fr) => SPEC_FILE_RE.test(fr.getFileName() as string)) - if (spec) return spec + if (spec) { + return spec + } const feature = pick((fr) => FEATURE_FILE_RE.test(fr.getFileName() as string)) - if (feature) return feature + if (feature) { + return feature + } return null } @@ -216,10 +253,14 @@ function _findStepsDir(startDir: string): string | undefined { for (let i = 0; i < STEPS_DIR_ASCENT_MAX; i++) { for (const c of STEPS_DIR_CANDIDATES) { const p = path.join(dir, c) - if (fs.existsSync(p) && fs.statSync(p).isDirectory()) return p + if (fs.existsSync(p) && fs.statSync(p).isDirectory()) { + return p + } } const up = path.dirname(dir) - if (up === dir) break + if (up === dir) { + break + } dir = up } return undefined @@ -228,14 +269,18 @@ function _findStepsDir(startDir: string): string | undefined { // Global fallback (find a features/*/(step-definitions|steps) directory under cwd) let _globalStepsDir: string | undefined function _findStepsDirGlobal(): string | undefined { - if (_globalStepsDir && fs.existsSync(_globalStepsDir)) return _globalStepsDir + if (_globalStepsDir && fs.existsSync(_globalStepsDir)) { + return _globalStepsDir + } const root = process.cwd() const queue: { dir: string; depth: number }[] = [{ dir: root, depth: 0 }] const maxDepth = STEPS_GLOBAL_SEARCH_MAX_DEPTH while (queue.length) { const { dir, depth } = queue.shift()! - if (depth > maxDepth) continue + if (depth > maxDepth) { + continue + } // Look for a features folder here const featuresDir = path.join(dir, 'features') @@ -251,10 +296,16 @@ function _findStepsDirGlobal(): string | undefined { // BFS into subdirs for (const entry of fs.readdirSync(dir)) { - if (entry.startsWith('.')) continue + if (entry.startsWith('.')) { + continue + } const full = path.join(dir, entry) let st: fs.Stats - try { st = fs.statSync(full) } catch { continue } + try { + st = fs.statSync(full) + } catch { + continue + } if (st.isDirectory() && !full.includes('node_modules')) { queue.push({ dir: full, depth: depth + 1 }) } @@ -269,8 +320,11 @@ function _listFiles(dir: string): string[] { for (const entry of fs.readdirSync(dir)) { const full = path.join(dir, entry) const st = fs.statSync(full) - if (st.isDirectory()) out.push(..._listFiles(full)) - else if (SOURCE_FILE_EXT_RE.test(entry)) out.push(full) + if (st.isDirectory()) { + out.push(..._listFiles(full)) + } else if (SOURCE_FILE_EXT_RE.test(entry)) { + out.push(full) + } } return out } @@ -323,7 +377,9 @@ function _collectStepDefsFromText(file: string): StepDef[] { const _stepsCache = new Map() function _collectStepDefs(stepsDir: string): StepDef[] { const cached = _stepsCache.get(stepsDir) - if (cached) return cached + if (cached) { + return cached + } const files = _listFiles(stepsDir) const defs: StepDef[] = [] @@ -332,7 +388,11 @@ function _collectStepDefs(stepsDir: string): StepDef[] { let pushed = 0 try { const src = fs.readFileSync(file, 'utf-8') - const ast = parse(src, { sourceType: 'module', plugins: PARSE_PLUGINS as any, errorRecovery: true }) + const ast = parse(src, { + sourceType: 'module', + plugins: PARSE_PLUGINS as any, + errorRecovery: true + }) traverse(ast, { CallExpression(p: NodePath) { @@ -343,23 +403,43 @@ function _collectStepDefs(stepsDir: string): StepDef[] { name = callee.name } else if (callee?.type === 'MemberExpression') { const prop = (callee as any).property - if (prop?.type === 'Identifier') name = prop.name + if (prop?.type === 'Identifier') { + name = prop.name + } + } + if (!name || !(STEP_FN_NAMES as readonly string[]).includes(name)) { + return } - if (!name || !(STEP_FN_NAMES as readonly string[]).includes(name)) return const arg = p.node.arguments?.[0] as any - const loc = { file, line: p.node.loc?.start.line ?? 1, column: p.node.loc?.start.column ?? 0 } + const loc = { + file, + line: p.node.loc?.start.line ?? 1, + column: p.node.loc?.start.column ?? 0 + } if (arg?.type === 'RegExpLiteral') { - defs.push({ kind: 'regex', regex: new RegExp(arg.pattern, arg.flags ?? ''), ...loc }) + defs.push({ + kind: 'regex', + regex: new RegExp(arg.pattern, arg.flags ?? ''), + ...loc + }) pushed++ } else if (arg?.type === 'StringLiteral') { // If Cucumber Expressions is available and pattern contains {...}, treat as expression if (CE && arg.value.includes('{')) { - const expr = new CE!.CucumberExpression(arg.value, new CE!.ParameterTypeRegistry()) + const expr = new CE!.CucumberExpression( + arg.value, + new CE!.ParameterTypeRegistry() + ) defs.push({ kind: 'expression', expr, ...loc }) } else { - defs.push({ kind: 'string', keyword: name, text: arg.value, ...loc }) + defs.push({ + kind: 'string', + keyword: name, + text: arg.value, + ...loc + }) } pushed++ } @@ -383,12 +463,18 @@ function _collectStepDefs(stepsDir: string): StepDef[] { function findStepDefinitionLocation(stepTitle: string, hintPath?: string) { const baseDir = hintPath - ? (path.extname(hintPath) ? path.dirname(hintPath) : hintPath) + ? path.extname(hintPath) + ? path.dirname(hintPath) + : hintPath : undefined let stepsDir = baseDir ? _findStepsDir(baseDir) : undefined - if (!stepsDir) stepsDir = _findStepsDirGlobal() - if (!stepsDir) return + if (!stepsDir) { + stepsDir = _findStepsDirGlobal() + } + if (!stepsDir) { + return + } const defs = _collectStepDefs(stepsDir) @@ -396,24 +482,42 @@ function findStepDefinitionLocation(stepTitle: string, hintPath?: string) { const titleNoKw = title.replace(/^(Given|When|Then|And|But)\s+/i, '').trim() // String match - const s = defs.find(d => - d.kind === 'string' && - (titleNoKw.localeCompare(d.text!, 'en', { sensitivity: 'base' }) === 0 || - title.localeCompare(`${d.keyword} ${d.text}`, 'en', { sensitivity: 'base' }) === 0) + const s = defs.find( + (d) => + d.kind === 'string' && + (titleNoKw.localeCompare(d.text!, 'en', { sensitivity: 'base' }) === 0 || + title.localeCompare(`${d.keyword} ${d.text}`, 'en', { + sensitivity: 'base' + }) === 0) ) - if (s) return { file: s.file, line: s.line, column: s.column } + if (s) { + return { file: s.file, line: s.line, column: s.column } + } // Cucumber expression match - const e = defs.find(d => d.kind === 'expression' && (() => { - try { return !!d.expr!.match(titleNoKw) || !!d.expr!.match(title) } catch { return false } - })()) - if (e) return { file: e.file, line: e.line, column: e.column } + const e = defs.find( + (d) => + d.kind === 'expression' && + (() => { + try { + return !!d.expr!.match(titleNoKw) || !!d.expr!.match(title) + } catch { + return false + } + })() + ) + if (e) { + return { file: e.file, line: e.line, column: e.column } + } // Regex match - const r = defs.find(d => - d.kind === 'regex' && (d.regex!.test(titleNoKw) || d.regex!.test(title)) + const r = defs.find( + (d) => + d.kind === 'regex' && (d.regex!.test(titleNoKw) || d.regex!.test(title)) ) - if (r) return { file: r.file, line: r.line, column: r.column } + if (r) { + return { file: r.file, line: r.line, column: r.column } + } return } @@ -433,9 +537,15 @@ function escapeRegExp(s: string) { } function offsetToLineCol(src: string, offset: number) { - let line = 1, col = 1 + let line = 1, + col = 1 for (let i = 0; i < offset && i < src.length; i++) { - if (src.charCodeAt(i) === 10) { line++; col = 1 } else { col++ } + if (src.charCodeAt(i) === 10) { + line++ + col = 1 + } else { + col++ + } } return { line, column: col } } @@ -486,7 +596,9 @@ export function mapTestToSource(testStats: any, hintFile?: string) { // Hint for locating related files const hint = - (Array.isArray((testStats as any).specs) ? (testStats as any).specs[0] : undefined) || + (Array.isArray((testStats as any).specs) + ? (testStats as any).specs[0] + : undefined) || (testStats as any).file || (testStats as any).specFile || hintFile || @@ -494,7 +606,10 @@ export function mapTestToSource(testStats: any, hintFile?: string) { // Cucumber-like step: resolve step-definition location if (/^(Given|When|Then|And|But)\b/i.test(title)) { - const stepLoc = findStepDefinitionLocation(title, FEATURE_FILE_RE.test(String(hint)) ? hint : undefined) + const stepLoc = findStepDefinitionLocation( + title, + FEATURE_FILE_RE.test(String(hint)) ? hint : undefined + ) if (stepLoc) { Object.assign(testStats, stepLoc) return @@ -504,7 +619,9 @@ export function mapTestToSource(testStats: any, hintFile?: string) { // Mocha/Jasmine static mapping via AST const file = (testStats as any).file || - (Array.isArray((testStats as any).specs) ? (testStats as any).specs[0] : undefined) || + (Array.isArray((testStats as any).specs) + ? (testStats as any).specs[0] + : undefined) || (testStats as any).specFile || hintFile || CURRENT_SPEC_FILE @@ -519,12 +636,20 @@ export function mapTestToSource(testStats: any, hintFile?: string) { } const locs = _astCache.get(file) as any[] | undefined if (locs?.length) { - let match = - locs.find(l => l.type === 'test' && l.name === title && fullTitle.includes(l.titlePath.join(' '))) || - locs.find(l => l.type === 'test' && l.name === title) + const match = + locs.find( + (l) => + l.type === 'test' && + l.name === title && + fullTitle.includes(l.titlePath.join(' ')) + ) || locs.find((l) => l.type === 'test' && l.name === title) if (match) { - Object.assign(testStats, { file, line: match.line, column: match.column }) + Object.assign(testStats, { + file, + line: match.line, + column: match.column + }) return } } @@ -556,7 +681,9 @@ export function mapSuiteToSource( ) { const title = String(suiteStats?.title ?? '').trim() const file = (suiteStats as any).file || hintFile || CURRENT_SPEC_FILE - if (!title || !file) return + if (!title || !file) { + return + } // Cucumber: feature/scenario line if (FEATURE_FILE_RE.test(file)) { @@ -577,18 +704,27 @@ export function mapSuiteToSource( // Mocha/Jasmine: AST first try { - if (!_astCache.has(file)) _astCache.set(file, findTestLocations(file)) + if (!_astCache.has(file)) { + _astCache.set(file, findTestLocations(file)) + } const locs = _astCache.get(file) as any[] | undefined if (locs?.length) { const match = - locs.find(l => l.type === 'suite' - && Array.isArray(l.titlePath) - && l.titlePath.length === suitePath.length - && l.titlePath.every((t: string, i: number) => t === suitePath[i])) || - locs.find(l => l.type === 'suite' && l.titlePath.at(-1) === title) + locs.find( + (l) => + l.type === 'suite' && + Array.isArray(l.titlePath) && + l.titlePath.length === suitePath.length && + l.titlePath.every((t: string, i: number) => t === suitePath[i]) + ) || + locs.find((l) => l.type === 'suite' && l.titlePath.at(-1) === title) if (match?.line) { - Object.assign(suiteStats, { file, line: match.line, column: match.column }) + Object.assign(suiteStats, { + file, + line: match.line, + column: match.column + }) return } } diff --git a/packages/service/tsconfig.json b/packages/service/tsconfig.json index 98041ef..9ea6b94 100644 --- a/packages/service/tsconfig.json +++ b/packages/service/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "moduleResolution": "Node16", + "moduleResolution": "NodeNext", "module": "NodeNext", "types": ["@wdio/globals/types"] }, diff --git a/packages/service/vite.config.ts b/packages/service/vite.config.ts index 221240f..3b9cd72 100644 --- a/packages/service/vite.config.ts +++ b/packages/service/vite.config.ts @@ -9,14 +9,14 @@ const __dirname = url.fileURLToPath(new URL('.', import.meta.url)) export default defineConfig({ optimizeDeps: { esbuildOptions: { - target: 'esnext', - }, + target: 'esnext' + } }, build: { lib: { entry: path.resolve(__dirname, 'src', 'index.ts'), name: 'hook', - formats: ['es'], + formats: ['es'] }, target: 'esnext', outDir: 'dist', @@ -31,13 +31,16 @@ export default defineConfig({ types: path.resolve(__dirname, 'src', 'types.ts') }, output: { - entryFileNames: '[name].js', + entryFileNames: '[name].js' }, - external: (id) => !id.startsWith(path.resolve(__dirname, 'src')) && !id.startsWith('./') + external: (id) => + !id.startsWith(path.resolve(__dirname, 'src')) && !id.startsWith('./') } }, - plugins: [dts({ - root: __dirname, - entryRoot: 'src' - })] + plugins: [ + dts({ + root: __dirname, + entryRoot: 'src' + }) + ] }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ba32c4..48975d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,35 +10,41 @@ importers: dependencies: '@wdio/cli': specifier: 9.18.0 - version: 9.18.0(@types/node@24.3.0)(expect-webdriverio@5.4.0)(puppeteer-core@21.11.0) + version: 9.18.0(@types/node@24.9.1)(expect-webdriverio@5.4.3)(puppeteer-core@21.11.0) devDependencies: '@types/node': specifier: ^24.3.0 - version: 24.3.0 + version: 24.9.1 '@typescript-eslint/eslint-plugin': specifier: ^8.40.0 - version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.40.0 - version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': specifier: ^8.40.0 - version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0))(vitest@3.2.4)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + version: 3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(puppeteer-core@21.11.0)) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) eslint: specifier: ^9.33.0 - version: 9.33.0(jiti@2.5.1) + version: 9.38.0(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) + version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-prettier: + specifier: ^5.5.4 + version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)))(eslint@9.38.0(jiti@2.6.1))(prettier@3.6.2) eslint-plugin-unicorn: specifier: ^59.0.1 - version: 59.0.1(eslint@9.33.0(jiti@2.5.1)) + version: 59.0.1(eslint@9.38.0(jiti@2.6.1)) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -47,37 +53,40 @@ importers: version: 8.5.6 postcss-lit: specifier: ^1.2.0 - version: 1.2.0(postcss@8.5.6) + version: 1.3.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) + prettier: + specifier: ^3.6.2 + version: 3.6.2 tailwindcss: specifier: ^4.1.12 - version: 4.1.12 + version: 4.1.16 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@24.3.0)(typescript@5.9.2) + version: 10.9.2(@types/node@24.9.1)(typescript@5.9.3) tsx: specifier: ^4.20.4 - version: 4.20.4 + version: 4.20.6 typescript: specifier: ^5.9.2 - version: 5.9.2 + version: 5.9.3 unplugin-icons: specifier: ^22.2.0 - version: 22.2.0(vue-template-compiler@2.7.15) + version: 22.5.0 vite: specifier: ^7.1.3 - version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) + version: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.0)(@vitest/browser@3.2.4)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) + version: 3.2.4(@types/node@24.9.1)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: ^9.19.1 - version: 9.19.1(puppeteer-core@21.11.0) + version: 9.20.0(puppeteer-core@21.11.0) example: devDependencies: '@wdio/cli': specifier: 9.18.0 - version: 9.18.0(@types/node@24.3.0)(expect-webdriverio@5.4.0)(puppeteer-core@21.11.0) + version: 9.18.0(@types/node@24.9.1)(expect-webdriverio@5.4.3)(puppeteer-core@21.11.0) '@wdio/cucumber-framework': specifier: 9.18.0 version: 9.18.0 @@ -86,10 +95,10 @@ importers: version: link:../packages/service '@wdio/globals': specifier: 9.17.0 - version: 9.17.0(expect-webdriverio@5.4.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + version: 9.17.0(expect-webdriverio@5.4.3)(webdriverio@9.20.0(puppeteer-core@21.11.0)) '@wdio/local-runner': specifier: 9.18.0 - version: 9.18.0(@wdio/globals@9.17.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + version: 9.18.0(@wdio/globals@9.17.0)(webdriverio@9.20.0(puppeteer-core@21.11.0)) '@wdio/spec-reporter': specifier: 9.18.0 version: 9.18.0 @@ -98,19 +107,19 @@ importers: version: 9.16.2 expect-webdriverio: specifier: ^5.4.0 - version: 5.4.0(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + version: 5.4.3(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.20.0(puppeteer-core@21.11.0)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@24.3.0)(typescript@5.8.3) + version: 10.9.2(@types/node@24.9.1)(typescript@5.9.3) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 tsx: specifier: ^4.20.3 - version: 4.20.3 + version: 4.20.6 typescript: specifier: ^5.8.3 - version: 5.8.3 + version: 5.9.3 packages/app: dependencies: @@ -122,13 +131,16 @@ importers: version: 6.1.3 '@codemirror/view': specifier: ^6.38.1 - version: 6.38.1 + version: 6.38.6 '@iconify-json/mdi': specifier: ^1.2.3 version: 1.2.3 '@lit/context': specifier: ^1.1.6 version: 1.1.6 + '@wdio/devtools-service': + specifier: workspace:* + version: link:../service '@wdio/protocols': specifier: 9.16.2 version: 9.16.2 @@ -146,14 +158,11 @@ importers: version: 2.5.3 preact: specifier: ^10.27.1 - version: 10.27.1 + version: 10.27.2 devDependencies: '@tailwindcss/postcss': specifier: ^4.1.12 - version: 4.1.12 - '@wdio/devtools-service': - specifier: workspace:* - version: link:../service + version: 4.1.16 '@wdio/reporter': specifier: 9.18.0 version: 9.18.0 @@ -165,25 +174,25 @@ importers: version: 8.5.6 rollup: specifier: ^4.47.0 - version: 4.47.0 + version: 4.52.5 stylelint: specifier: ^16.24.0 - version: 16.24.0(typescript@5.9.2) + version: 16.25.0(typescript@5.9.3) stylelint-config-recommended: specifier: ^17.0.0 - version: 17.0.0(stylelint@16.24.0(typescript@5.9.2)) + version: 17.0.0(stylelint@16.25.0(typescript@5.9.3)) stylelint-config-tailwindcss: specifier: ^1.0.0 - version: 1.0.0(stylelint@16.24.0(typescript@5.9.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))) + version: 1.0.0(stylelint@16.25.0(typescript@5.9.3))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)) tailwindcss: specifier: ~3.4.17 - version: 3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + version: 3.4.18(tsx@4.20.6)(yaml@2.8.1) packages/backend: dependencies: '@fastify/static': specifier: ^8.2.0 - version: 8.2.0 + version: 8.3.0 '@fastify/websocket': specifier: ^11.2.0 version: 11.2.0 @@ -195,13 +204,13 @@ importers: version: 9.18.0 fastify: specifier: ^5.5.0 - version: 5.5.0 + version: 5.6.1 get-port: specifier: ^7.1.0 version: 7.1.0 import-meta-resolve: specifier: ^4.1.0 - version: 4.1.0 + version: 4.2.0 devDependencies: '@types/ws': specifier: ^8.18.1 @@ -223,16 +232,16 @@ importers: version: 8.0.0 preact: specifier: ^10.27.1 - version: 10.27.1 + version: 10.27.2 vite-plugin-singlefile: specifier: ^2.3.0 - version: 2.3.0(rollup@4.47.0)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0)) + version: 2.3.0(rollup@4.52.5)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) packages/service: dependencies: '@babel/types': specifier: ^7.28.4 - version: 7.28.4 + version: 7.28.5 '@wdio/devtools-backend': specifier: workspace:^ version: link:../backend @@ -253,20 +262,20 @@ importers: version: 8.42.0 import-meta-resolve: specifier: ^4.1.0 - version: 4.1.0 + version: 4.2.0 webdriverio: specifier: ^9.19.1 - version: 9.19.1(puppeteer-core@21.11.0) + version: 9.20.0(puppeteer-core@21.11.0) ws: specifier: ^8.18.3 version: 8.18.3 devDependencies: '@babel/parser': specifier: ^7.28.4 - version: 7.28.4 + version: 7.28.5 '@babel/traverse': specifier: ^7.28.4 - version: 7.28.4 + version: 7.28.5 '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 @@ -281,7 +290,7 @@ importers: version: 8.18.1 '@wdio/globals': specifier: 9.17.0 - version: 9.17.0(expect-webdriverio@5.4.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + version: 9.17.0(expect-webdriverio@5.4.3)(webdriverio@9.20.0(puppeteer-core@21.11.0)) '@wdio/protocols': specifier: 9.16.2 version: 9.16.2 @@ -290,7 +299,7 @@ importers: version: 1.0.0-pre2 vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@24.3.0)(rollup@4.47.0)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0)) + version: 4.5.4(@types/node@24.9.1)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) packages: @@ -301,15 +310,15 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@antfu/utils@8.1.1': - resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + '@antfu/utils@9.3.0': + resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==} '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} '@babel/helper-globals@7.28.0': @@ -320,45 +329,45 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.3': - resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.28.3': - resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.3': - resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} + '@cacheable/memoize@2.0.3': + resolution: {integrity: sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==} + + '@cacheable/memory@2.0.3': + resolution: {integrity: sha512-R3UKy/CKOyb1LZG/VRCTMcpiMDyLH7SH3JrraRdK6kf3GweWCOU3sgvE13W3TiDRbxnDKylzKJvhUAvWl9LQOA==} - '@codemirror/autocomplete@6.18.6': - resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} + '@cacheable/utils@2.1.0': + resolution: {integrity: sha512-ZdxfOiaarMqMj+H7qwlt5EBKWaeGihSYVHdQv5lUsbn8MJJOTW82OIwirQ39U5tMZkNvy3bQE+ryzC+xTAb9/g==} - '@codemirror/commands@6.8.1': - resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} + '@codemirror/autocomplete@6.19.1': + resolution: {integrity: sha512-q6NenYkEy2fn9+JyjIxMWcNjzTL/IhwqfzOut1/G3PrIFkrbl4AL7Wkse5tLrQUUyqGoAKU5+Pi5jnnXxH5HGw==} + + '@codemirror/commands@6.10.0': + resolution: {integrity: sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==} '@codemirror/lang-javascript@6.2.4': resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==} @@ -366,8 +375,8 @@ packages: '@codemirror/language@6.11.3': resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} - '@codemirror/lint@6.8.5': - resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} + '@codemirror/lint@6.9.1': + resolution: {integrity: sha512-te7To1EQHePBQQzasDKWmK2xKINIXpk+xAiSYr9ZN+VB4KaT+/Hi2PEkeErTk5BV3PTz1TLyQL4MtJfPkKZ9sw==} '@codemirror/search@6.5.11': resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} @@ -378,8 +387,8 @@ packages: '@codemirror/theme-one-dark@6.1.3': resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} - '@codemirror/view@6.38.1': - resolution: {integrity: sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==} + '@codemirror/view@6.38.6': + resolution: {integrity: sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==} '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -466,369 +475,213 @@ packages: '@dual-bundle/import-meta-resolve@4.2.1': resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + '@eslint/config-helpers@0.4.1': + resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.13.0': resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.33.0': - resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} + '@eslint/js@9.38.0': + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.2.8': resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/accept-negotiator@2.0.1': resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} - '@fastify/ajv-compiler@4.0.2': - resolution: {integrity: sha512-Rkiu/8wIjpsf46Rr+Fitd3HRP+VsxUFDDeag0hs9L0ksfnwx2g7SPQQTFL0E8Qv+rfXzQOxBJnjUB9ITUDjfWQ==} + '@fastify/ajv-compiler@4.0.5': + resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} '@fastify/error@4.2.0': resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} @@ -836,20 +689,20 @@ packages: '@fastify/fast-json-stringify-compiler@5.0.3': resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} - '@fastify/forwarded@3.0.0': - resolution: {integrity: sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==} + '@fastify/forwarded@3.0.1': + resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==} '@fastify/merge-json-schemas@0.2.1': resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} - '@fastify/proxy-addr@5.0.0': - resolution: {integrity: sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==} + '@fastify/proxy-addr@5.1.0': + resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} '@fastify/send@4.1.0': resolution: {integrity: sha512-TMYeQLCBSy2TOFmV95hQWkiTYgC/SEx7vMdV+wnZVX4tt8VBLKzmH8vV9OzJehV0+XBfg+WxPMt5wp+JBUKsVw==} - '@fastify/static@8.2.0': - resolution: {integrity: sha512-PejC/DtT7p1yo3p+W7LiUtLMsV8fEvxAK15sozHy9t8kwo5r0uLYmhV/inURmGz1SkHZFz/8CNtHLPyhKcx4SQ==} + '@fastify/static@8.3.0': + resolution: {integrity: sha512-yKxviR5PH1OKNnisIzZKmgZSus0r2OZb8qCSbqmw34aolT4g3UlzYfeBRym+HJ1J471CR8e2ldNub4PubD1coA==} '@fastify/websocket@11.2.0': resolution: {integrity: sha512-3HrDPbAG1CzUCqnslgJxppvzaAZffieOVbLp1DAy1huCSynUWPifSvfdEDUR8HlJLp3sp1A36uOM2tJogADS8w==} @@ -858,18 +711,14 @@ packages: resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -880,11 +729,15 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@2.3.0': - resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + '@iconify/utils@3.0.2': + resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} - '@inquirer/checkbox@4.2.1': - resolution: {integrity: sha512-bevKGO6kX1eM/N+pdh9leS5L7TBF4ICrzi9a+cbWkrxeAeIcwlo/7OfWGCDERdRCI2/Q6tjltX4bt07ALHDwFw==} + '@inquirer/ansi@1.0.1': + resolution: {integrity: sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.0': + resolution: {integrity: sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -892,8 +745,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.15': - resolution: {integrity: sha512-SwHMGa8Z47LawQN0rog0sT+6JpiL0B7eW9p1Bb7iCeKDGTI5Ez25TSc2l8kw52VV7hA4sX/C78CGkMrKXfuspA==} + '@inquirer/confirm@5.1.19': + resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -901,8 +754,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.15': - resolution: {integrity: sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==} + '@inquirer/core@10.3.0': + resolution: {integrity: sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -910,8 +763,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.17': - resolution: {integrity: sha512-r6bQLsyPSzbWrZZ9ufoWL+CztkSatnJ6uSxqd6N+o41EZC51sQeWOzI6s5jLb+xxTWxl7PlUppqm8/sow241gg==} + '@inquirer/editor@4.2.21': + resolution: {integrity: sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -919,8 +772,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.17': - resolution: {integrity: sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==} + '@inquirer/expand@4.0.21': + resolution: {integrity: sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -928,8 +781,8 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@1.0.1': - resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -937,12 +790,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.13': - resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + '@inquirer/figures@1.0.14': + resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==} engines: {node: '>=18'} - '@inquirer/input@4.2.1': - resolution: {integrity: sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==} + '@inquirer/input@4.2.5': + resolution: {integrity: sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -950,8 +803,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.17': - resolution: {integrity: sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==} + '@inquirer/number@3.0.21': + resolution: {integrity: sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -959,8 +812,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.17': - resolution: {integrity: sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==} + '@inquirer/password@4.0.21': + resolution: {integrity: sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -968,8 +821,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.8.3': - resolution: {integrity: sha512-iHYp+JCaCRktM/ESZdpHI51yqsDgXu+dMs4semzETftOaF8u5hwlqnbIsuIR/LrWZl8Pm1/gzteK9I7MAq5HTA==} + '@inquirer/prompts@7.9.0': + resolution: {integrity: sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -977,8 +830,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.5': - resolution: {integrity: sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==} + '@inquirer/rawlist@4.1.9': + resolution: {integrity: sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -986,8 +839,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.1.0': - resolution: {integrity: sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==} + '@inquirer/search@3.2.0': + resolution: {integrity: sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -995,8 +848,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.3.1': - resolution: {integrity: sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==} + '@inquirer/select@4.4.0': + resolution: {integrity: sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1004,8 +857,8 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.8': - resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + '@inquirer/type@3.0.9': + resolution: {integrity: sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1025,32 +878,28 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - '@jest/diff-sequences@30.0.1': resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.0.4': - resolution: {integrity: sha512-EgXecHDNfANeqOkcak0DxsoVI4qkDUsR7n/Lr2vtmTBjwLPBnnPOF71S11Q8IObWzxm2QgQoY6f9hzrRD3gHRA==} + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/get-type@30.0.1': - resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.0.1': resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/schemas@30.0.1': - resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@30.0.1': - resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jridgewell/gen-mapping@0.3.13': @@ -1066,23 +915,29 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@keyv/serialize@1.1.0': - resolution: {integrity: sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==} + '@keyv/bigmap@1.1.0': + resolution: {integrity: sha512-MX7XIUNwVRK+hjZcAbNJ0Z8DREo+Weu9vinBOjGU1thEi9F6vPhICzBbk4CCf3eEefKRz7n6TfZXwUFZTSgj8Q==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.5.3 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@lezer/common@1.2.3': - resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + '@lezer/common@1.3.0': + resolution: {integrity: sha512-L9X8uHCYU310o99L3/MpJKYxPzXPOS7S0NmBaM7UO/x2Kb2WbmMLSkfvdr1KxRIFYOpbY0Jhn7CfLSUDzL8arQ==} - '@lezer/highlight@1.2.1': - resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + '@lezer/highlight@1.2.2': + resolution: {integrity: sha512-z8TQwaBXXQIvG6i2g3e9cgMwUUXu9Ib7jo2qRRggdhwKpM56Dw3PM3wmexn+EGaaOZ7az0K7sjc3/gcGW7sz7A==} - '@lezer/javascript@1.5.1': - resolution: {integrity: sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==} + '@lezer/javascript@1.5.4': + resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} '@lezer/lr@1.4.2': resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} @@ -1103,11 +958,11 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@microsoft/api-extractor-model@7.30.7': - resolution: {integrity: sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==} + '@microsoft/api-extractor-model@7.31.3': + resolution: {integrity: sha512-dv4quQI46p0U03TCEpasUf6JrJL3qjMN7JUAobsPElxBv4xayYYvWW9aPpfYV+Jx6hqUcVaLVOeV7+5hxsyoFQ==} - '@microsoft/api-extractor@7.52.11': - resolution: {integrity: sha512-IKQ7bHg6f/Io3dQds6r9QPYk4q0OlR9A4nFDtNhUt3UUIhyitbxAqRN1CLjUVtk6IBk3xzyCMOdwwtIXQ7AlGg==} + '@microsoft/api-extractor@7.53.3': + resolution: {integrity: sha512-p2HmQaMSVqMBj3bH3643f8xApKAqrF1jNpPsMCTQOYCYgfwLnvzsve8c+bgBWzCOBBgLK54PB6ZLIWMGLg8CZA==} hasBin: true '@microsoft/tsdoc-config@0.17.1': @@ -1128,10 +983,17 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -1143,13 +1005,13 @@ packages: engines: {node: '>=16.3.0'} hasBin: true - '@puppeteer/browsers@2.10.7': - resolution: {integrity: sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==} + '@puppeteer/browsers@2.10.12': + resolution: {integrity: sha512-mP9iLFZwH+FapKJLeA7/fLqOlSUwYpMwjR1P5J23qd4e7qGJwecJccJqHYrjw33jmIZYV4dtiTHPD/J+1e7cEw==} engines: {node: '>=18'} hasBin: true - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1157,200 +1019,218 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.47.0': - resolution: {integrity: sha512-Weap5hVbZs/yIvUZcFpAmIso8rLmwkO1LesddNjeX28tIhQkAKjRuVgAJ2xpj8wXTny7IZro9aBIgGov0qsL4A==} + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.47.0': - resolution: {integrity: sha512-XcnlqvG5riTJByKX7bZ1ehe48GiF+eNkdnzV0ziLp85XyJ6tLPfhkXHv3e0h3cpZESTQa8IB+ZHhV/r02+8qKw==} + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.47.0': - resolution: {integrity: sha512-kZzTIzmzAUOKteh688kN88HNaL7wxwTz9XB5dDK94AQdf9nD+lxm/H5uPKQaawUFS+klBEowqPMUPjBRKGbo/g==} + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.47.0': - resolution: {integrity: sha512-WaMrgHRbFspYjvycbsbqheBmlsQBLwfZVWv/KFsT212Yz/RjEQ/9KEp1/p0Ef3ZNwbWsylmgf69St66D9NQNHw==} + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.47.0': - resolution: {integrity: sha512-umfYslurvSmAK5MEyOcOGooQ6EBB2pYePQaTVlrOkIfG6uuwu9egYOlxr35lwsp6XG0NzmXW0/5o150LUioMkQ==} + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.47.0': - resolution: {integrity: sha512-EFXhIykAl8//4ihOjGNirF89HEUbOB8ev2aiw8ST8wFGwDdIPARh3enDlbp8aFnScl4CDK4DZLQYXaM6qpxzZw==} + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.47.0': - resolution: {integrity: sha512-EwkC5N61ptruQ9wNkYfLgUWEGh+F3JZSGHkUWhaK2ISAK0d0xmiMKF0trFhRqPQFov5d9DmFiFIhWB5IC79OUA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.47.0': - resolution: {integrity: sha512-Iz/g1X94vIjppA4H9hN3VEedw4ObC+u+aua2J/VPJnENEJ0GeCAPBN15nJc5pS5M8JPlUhOd3oqhOWX6Un4RHA==} + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.47.0': - resolution: {integrity: sha512-eYEYHYjFo/vb6k1l5uq5+Af9yuo9WaST/z+/8T5gkee+A0Sfx1NIPZtKMEQOLjm/oaeHFGpWaAO97gTPhouIfQ==} + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.47.0': - resolution: {integrity: sha512-LX2x0/RszFEmDfjzL6kG/vihD5CkpJ+0K6lcbqX0jAopkkXeY2ZjStngdFMFW+BK7pyrqryJgy6Jt3+oyDxrSA==} + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.47.0': - resolution: {integrity: sha512-0U+56rJmJvqBCwlPFz/BcxkvdiRdNPamBfuFHrOGQtGajSMJ2OqzlvOgwj5vReRQnSA6XMKw/JL1DaBhceil+g==} + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.47.0': - resolution: {integrity: sha512-2VKOsnNyvS05HFPKtmAWtef+nZyKCot/V3Jh/A5sYMhUvtthNjp6CjakYTtc5xZ8J8Fp5FKrUWGxptVtZ2OzEA==} + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.47.0': - resolution: {integrity: sha512-uY5UP7YZM4DMQiiP9Fl4/7O3UbT2p3uI0qvqLXZSGWBfyYuqi2DYQ48ExylgBN3T8AJork+b+mLGq6VXsxBfuw==} + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.47.0': - resolution: {integrity: sha512-qpcN2+/ivq3TcrXtZoHrS9WZplV3Nieh0gvnGb+SFZg7h/YkWsOXINJnjJRWHp9tEur7T8lMnMeQMPS7s9MjUg==} + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.47.0': - resolution: {integrity: sha512-XfuI+o7a2/KA2tBeP+J1CT3siyIQyjpGEL6fFvtUdoHJK1k5iVI3qeGT2i5y6Bb+xQu08AHKBsUGJ2GsOZzXbQ==} + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.47.0': - resolution: {integrity: sha512-ylkLO6G7oUiN28mork3caDmgXHqRuopAxjYDaOqs4CoU9pkfR0R/pGQb2V1x2Zg3tlFj4b/DvxZroxC3xALX6g==} + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.47.0': - resolution: {integrity: sha512-1L72a+ice8xKqJ2afsAVW9EfECOhNMAOC1jH65TgghLaHSFwNzyEdeye+1vRFDNy52OGKip/vajj0ONtX7VpAg==} + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.47.0': - resolution: {integrity: sha512-wluhdd1uNLk/S+ex2Yj62WFw3un2cZo2ZKXy9cOuoti5IhaPXSDSvxT3os+SJ1cjNorE1PwAOfiJU7QUH6n3Zw==} + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.47.0': - resolution: {integrity: sha512-0SMTA6AeG7u2rfwdkKSo6aZD/obmA7oyhR+4ePwLzlwxNE8sfSI9zmjZXtchvBAZmtkVQNt/lZ6RxSl9wBj4pw==} + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.47.0': - resolution: {integrity: sha512-mw1/7kAGxLcfzoG7DIKFHvKr2ZUQasKOPCgT2ubkNZPgIDZOJPymqThtRWEeAlXBoipehP4BUFpBAZIrPhFg8Q==} + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} cpu: [x64] os: [win32] '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/node-core-library@5.14.0': - resolution: {integrity: sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==} + '@rushstack/node-core-library@5.18.0': + resolution: {integrity: sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/rig-package@0.5.3': - resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} + '@rushstack/problem-matcher@0.1.1': + resolution: {integrity: sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.6.0': + resolution: {integrity: sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==} - '@rushstack/terminal@0.15.4': - resolution: {integrity: sha512-OQSThV0itlwVNHV6thoXiAYZlQh4Fgvie2CzxFABsbO2MWQsI4zOh3LRNigYSTrmS+ba2j0B3EObakPzf/x6Zg==} + '@rushstack/terminal@0.19.3': + resolution: {integrity: sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@5.0.2': - resolution: {integrity: sha512-+AkJDbu1GFMPIU8Sb7TLVXDv/Q7Mkvx+wAjEl8XiXVVq+p1FmWW6M3LYpJMmoHNckSofeMecgWg5lfMwNAAsEQ==} + '@rushstack/ts-command-line@5.1.3': + resolution: {integrity: sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==} '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sinclair/typebox@0.34.38': - resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@tailwindcss/node@4.1.12': - resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} + '@tailwindcss/node@4.1.16': + resolution: {integrity: sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==} - '@tailwindcss/oxide-android-arm64@4.1.12': - resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} + '@tailwindcss/oxide-android-arm64@4.1.16': + resolution: {integrity: sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.12': - resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} + '@tailwindcss/oxide-darwin-arm64@4.1.16': + resolution: {integrity: sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.12': - resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} + '@tailwindcss/oxide-darwin-x64@4.1.16': + resolution: {integrity: sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.12': - resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} + '@tailwindcss/oxide-freebsd-x64@4.1.16': + resolution: {integrity: sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': - resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + resolution: {integrity: sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': - resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + resolution: {integrity: sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.12': - resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + resolution: {integrity: sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.12': - resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + resolution: {integrity: sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.12': - resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} + '@tailwindcss/oxide-linux-x64-musl@4.1.16': + resolution: {integrity: sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.12': - resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} + '@tailwindcss/oxide-wasm32-wasi@4.1.16': + resolution: {integrity: sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1361,24 +1241,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': - resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + resolution: {integrity: sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.12': - resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + resolution: {integrity: sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.12': - resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} + '@tailwindcss/oxide@4.1.16': + resolution: {integrity: sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==} engines: {node: '>= 10'} - '@tailwindcss/postcss@4.1.12': - resolution: {integrity: sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==} + '@tailwindcss/postcss@4.1.16': + resolution: {integrity: sha512-Qn3SFGPXYQMKR/UtqS+dqvPrzEeBZHrFA92maT4zijCVggdsXnDBMsPFJo1eArX3J+O+Gi+8pV4PkqjLCNBk3A==} '@teppeis/multimaps@3.0.0': resolution: {integrity: sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==} @@ -1427,8 +1307,8 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -1451,14 +1331,14 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@20.19.11': - resolution: {integrity: sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==} + '@types/node@20.19.23': + resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} - '@types/node@22.17.2': - resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} + '@types/node@22.18.12': + resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/node@24.9.1': + resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1490,69 +1370,69 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@types/yargs@17.0.34': + resolution: {integrity: sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.40.0': - resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} + '@typescript-eslint/eslint-plugin@8.46.2': + resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.40.0 + '@typescript-eslint/parser': ^8.46.2 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.40.0': - resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} + '@typescript-eslint/parser@8.46.2': + resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.40.0': - resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.40.0': - resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.40.0': - resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.40.0': - resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} + '@typescript-eslint/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.40.0': - resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.40.0': - resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.40.0': - resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} + '@typescript-eslint/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.40.0': - resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/browser@3.2.4': @@ -1614,11 +1494,11 @@ packages: '@volar/typescript@2.4.23': resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} - '@vue/compiler-core@3.5.19': - resolution: {integrity: sha512-/afpyvlkrSNYbPo94Qu8GtIOWS+g5TRdOvs6XZNw6pWQQmj5pBgSZvEPOIZlqWq0YvoUhDDQaQ2TnzuJdOV4hA==} + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} - '@vue/compiler-dom@3.5.19': - resolution: {integrity: sha512-Drs6rPHQZx/pN9S6ml3Z3K/TWCIRPvzG2B/o5kFK9X0MNHt8/E+38tiRfojufrYBfA6FQUFB2qBBRXlcSXWtOA==} + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -1631,8 +1511,8 @@ packages: typescript: optional: true - '@vue/shared@3.5.19': - resolution: {integrity: sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q==} + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} '@wdio/cli@9.18.0': resolution: {integrity: sha512-gdIEqDdAHwrPlS+2v7eEYIjWsu2sCmwLZG3USXMKoCX8x9hsUhTl7FPqzgyMySt6gh0b68vWaMhCsPqqbhu/Kg==} @@ -1647,8 +1527,8 @@ packages: resolution: {integrity: sha512-fN+Z7SkKjb0u3UUMSxMN4d+CCZQKZhm/tx3eX7Rv+3T78LtpOjlesBYQ7Ax3tQ3tp8hgEo+CoOXU0jHEYubFrg==} engines: {node: '>=18.20.0'} - '@wdio/config@9.19.1': - resolution: {integrity: sha512-BeTB2paSjaij3cf1NXQzX9CZmdj5jz2/xdUhkJlCeGmGn1KjWu5BjMO+exuiy+zln7dOJjev8f0jlg8e8f1EbQ==} + '@wdio/config@9.20.0': + resolution: {integrity: sha512-ggwd3EMsVj/LTcbYw2h+hma+/7fQ1cTXMuy9B5WTkLjDlOtbLjsqs9QLt4BLIo1cdsxvAw/UVpRVUuYy7rTmtQ==} engines: {node: '>=18.20.0'} '@wdio/cucumber-framework@9.18.0': @@ -1711,8 +1591,8 @@ packages: resolution: {integrity: sha512-P86FvM/4XQGpJKwlC2RKF3I21TglPvPOozJGG9HoL0Jmt6jRF20ggO/nRTxU0XiWkRdqESUTmfA87bdCO4GRkQ==} engines: {node: '>=18.20.0'} - '@wdio/types@9.19.1': - resolution: {integrity: sha512-Q1HVcXiWMHp3ze2NN1BvpsfEh/j6GtAeMHhHW4p2IWUfRZlZqTfiJ+95LmkwXOG2gw9yndT8NkJigAz8v7WVYQ==} + '@wdio/types@9.20.0': + resolution: {integrity: sha512-zMmAtse2UMCSOW76mvK3OejauAdcFGuKopNRH7crI0gwKTZtvV89yXWRziz9cVXpFgfmJCjf9edxKFWdhuF5yw==} engines: {node: '>=18.20.0'} '@wdio/utils@8.41.0': @@ -1723,13 +1603,13 @@ packages: resolution: {integrity: sha512-M+QH05FUw25aFXZfjb+V16ydKoURgV61zeZrMjQdW2aAiks3F5iiI9pgqYT5kr1kHZcMy8gawGqQQ+RVfKYscQ==} engines: {node: '>=18.20.0'} - '@wdio/utils@9.19.1': - resolution: {integrity: sha512-wWx5uPCgdZQxFIemAFVk/aa3JLwqrTsvEJsPlV3lCRpLeQ67V8aUPvvNAzE+RhX67qvelwwsvX8RrPdLDfnnYw==} + '@wdio/utils@9.20.0': + resolution: {integrity: sha512-T1ze005kncUTocYImSBQc/FAVcOwP/vOU4MDJFgzz/RTcps600qcKX98sVdWM5/ukXCVkjOufWteDHIbX5/tEA==} engines: {node: '>=18.20.0'} - '@zip.js/zip.js@2.7.72': - resolution: {integrity: sha512-3/A4JwrgkvGBlCxtItjxs8HrNbuTAAl/zlGkV6tC5Fb5k5nk4x2Dqxwl/YnUys5Ch+QB01eJ8Q5K/J2uXfy9Vw==} - engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} + '@zip.js/zip.js@2.8.8': + resolution: {integrity: sha512-v0KutehhSAuaoFAFGLp+V4+UiZ1mIxQ8vNOYMD7k9ZJaBbtQV49MYlg568oRLiuwWDg2Di58Iw3Q0ESNWR+5JA==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -1787,10 +1667,6 @@ packages: alien-signals@0.4.14: resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} @@ -1799,8 +1675,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.0: - resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -1815,8 +1691,8 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} any-promise@1.3.0: @@ -1925,8 +1801,13 @@ packages: avvio@9.1.0: resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1934,11 +1815,16 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - bare-events@2.6.1: - resolution: {integrity: sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==} + bare-events@2.8.1: + resolution: {integrity: sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true - bare-fs@4.2.1: - resolution: {integrity: sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==} + bare-fs@4.5.0: + resolution: {integrity: sha512-GljgCjeupKZJNetTqxKaQArLK10vpmK28or0+RwWjEl5Rk+/xG3wkpmkv+WrcBm3q1BwHKlnhXzR8O37kcvkXQ==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -1964,9 +1850,16 @@ packages: bare-events: optional: true + bare-url@2.3.1: + resolution: {integrity: sha512-v2yl0TnaZTdEnelkKtXZGnotiV6qATBlnNuUMrHl6v9Lmmrh9mw9RYyImPU7/4RahumSwQS1k2oKXcRfXcbjJw==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.8.20: + resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==} + hasBin: true + basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} @@ -1998,8 +1891,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.3: - resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2035,8 +1928,8 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cacheable@1.10.4: - resolution: {integrity: sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==} + cacheable@2.1.1: + resolution: {integrity: sha512-LmF4AXiSNdiRbI2UjH8pAp9NIXxeQsTotpEaegPiDcnN0YPygDJDV3l/Urc0mL72JWdATEorKqIHEx55nDlONg==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -2058,14 +1951,14 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001736: - resolution: {integrity: sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==} + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - chai@5.3.1: - resolution: {integrity: sha512-48af6xm9gQK8rhIcOxWwdGzIervm8BVTin+yRp9HEvU20BtVZ2lBywlIJBzwaDtvo0FvjeL7QdCADoUoqIbV3A==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} chainsaw@0.1.0: @@ -2079,12 +1972,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.0: - resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} chardet@2.1.0: @@ -2109,12 +1998,8 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - - chrome-launcher@1.2.0: - resolution: {integrity: sha512-JbuGuBNss258bvGil7FT4HKdC3SC2K7UAEUqiPy3ACS3Yxo3hAW6bvFpCu2HsIJLgTqxgEX6BkujvzZfLpUD0Q==} + chrome-launcher@1.2.1: + resolution: {integrity: sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A==} engines: {node: '>=12.13.0'} hasBin: true @@ -2123,8 +2008,8 @@ packages: peerDependencies: devtools-protocol: '*' - ci-info@4.3.0: - resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} class-transformer@0.5.1: @@ -2177,8 +2062,8 @@ packages: resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} engines: {node: '>=18'} - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} commander@4.1.1: @@ -2217,8 +2102,8 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} - core-js-compat@3.45.1: - resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2329,8 +2214,8 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2380,8 +2265,8 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} devtools-protocol@0.0.1232444: @@ -2429,8 +2314,8 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv@17.2.1: - resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -2467,8 +2352,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.207: - resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} + electron-to-chromium@1.5.240: + resolution: {integrity: sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2498,8 +2383,8 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -2535,13 +2420,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} engines: {node: '>=18'} hasBin: true @@ -2569,6 +2449,12 @@ packages: engines: {node: '>=6.0'} hasBin: true + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -2603,6 +2489,20 @@ packages: '@typescript-eslint/parser': optional: true + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-plugin-unicorn@59.0.1: resolution: {integrity: sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==} engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} @@ -2621,8 +2521,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.33.0: - resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} + eslint@9.38.0: + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2666,6 +2566,9 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -2682,16 +2585,16 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} - expect-webdriverio@5.4.0: - resolution: {integrity: sha512-vI0/xsX20VwkzCBNGjIfhZ6D2fMJiykuYSacjghzTZbOh/LkZQTSSrkZk3fRJZXmzXdr6B/eDTkjm6QqGoe9TA==} + expect-webdriverio@5.4.3: + resolution: {integrity: sha512-/XxRRR90gNSuNf++w1jOQjhC5LE9Ixf/iAQctVb/miEI3dwzPZTuG27/omoh5REfSLDoPXofM84vAH/ULtz35g==} engines: {node: '>=18 || >=20 || >=22'} peerDependencies: '@wdio/globals': ^9.0.0 '@wdio/logger': ^9.0.0 webdriverio: ^9.0.0 - expect@30.0.4: - resolution: {integrity: sha512-dDLGjnP2cKbEppxVICxI/Uf4YemmGMPNy0QytCbfafbpYk9AFQsxb8Uyrxii0RPK7FWgLGlSem+07WirwS3cFQ==} + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} exsolve@1.0.7: @@ -2711,6 +2614,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} @@ -2721,8 +2627,8 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-json-stringify@6.0.1: - resolution: {integrity: sha512-s7SJE83QKBZwg54dIbD5rCtzOBVD43V1ReWXXYqBgwCwHLYAAT0RQc/FmrQglXqWPpz6omtryJQOau5jI4Nrvg==} + fast-json-stringify@6.1.1: + resolution: {integrity: sha512-DbgptncYEXZqDUOEl4krff4mUiVrTZZVI7BBrQR/T3BqMj/eM1flTC1Uk2uUoLcWCxjT95xKulV/Lc6hhOZsBQ==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -2730,30 +2636,26 @@ packages: fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} - - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-xml-parser@4.5.3: resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + fast-xml-parser@5.3.0: + resolution: {integrity: sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==} hasBin: true fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastify-plugin@5.0.1: - resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} + fastify-plugin@5.1.0: + resolution: {integrity: sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==} - fastify@5.5.0: - resolution: {integrity: sha512-ZWSWlzj3K/DcULCnCjEiC2zn2FBPdlZsSA/pnPa/dbUfLvxkD/Nqmb0XXMXLrWkeM4uQPUvjdJpwtXmTfriXqw==} + fastify@5.6.1: + resolution: {integrity: sha512-WjjlOciBF0K8pDUPZoGPhqhKrQJ02I8DKaDIfO51EL0kbSMwQFl85cRwhOvmSDWoukNOdTo27gLN549pLCcH7Q==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -2820,8 +2722,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.13: - resolution: {integrity: sha512-gmtS2PaUjSPa4zjObEIn4WWliKyZzYljgxODBfxugpK6q6HU9ClXzgCJ+nlcPKY9Bt090ypTOLIFWkV0jbKFjw==} + flat-cache@6.1.18: + resolution: {integrity: sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -2841,8 +2743,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fs-extra@11.3.1: - resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} fs.realpath@1.0.0: @@ -2878,6 +2780,10 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2906,8 +2812,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} @@ -2954,8 +2860,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} globalthis@1.0.4: @@ -3021,8 +2927,8 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hookified@1.12.0: - resolution: {integrity: sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==} + hookified@1.12.2: + resolution: {integrity: sha512-aokUX1VdTpI0DUsndvW+OiwmBpKCu/NgRsSSkuSY0zq8PY6Q6a+lmOfAFDXAAOtBqJELvcWY9L1EVtzjbQcMdg==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -3068,6 +2974,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3093,8 +3003,8 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -3122,8 +3032,8 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} - inquirer@12.9.3: - resolution: {integrity: sha512-Hpw2JWdrYY8xJSmhU05Idd5FPshQ1CZErH00WO+FK6fKxkBeqj+E+yFXSlERZLKtzWeQYFCMfl8U2TK9SvVbtQ==} + inquirer@12.10.0: + resolution: {integrity: sha512-K/epfEnDBZj2Q3NMDcgXWZye3nhSPeoJnOh8lcKWrldw54UEZfS4EmAMsAsmVbl7qKi+vjAsy39Sz4fbgRMewg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -3203,8 +3113,8 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -3320,36 +3230,36 @@ packages: engines: {node: '>=10'} hasBin: true - jest-diff@30.0.4: - resolution: {integrity: sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==} + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.0.4: - resolution: {integrity: sha512-ubCewJ54YzeAZ2JeHHGVoU+eDIpQFsfPQs0xURPWoNiO42LGJ+QGgfSf+hFIRplkZDkhH5MOvuxHKXRTUU3dUQ==} + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@30.0.2: - resolution: {integrity: sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw==} + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@30.0.2: - resolution: {integrity: sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA==} + jest-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-regex-util@30.0.1: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@30.0.2: - resolution: {integrity: sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg==} + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true jju@1.4.0: @@ -3388,8 +3298,8 @@ packages: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - json-schema-ref-resolver@2.0.1: - resolution: {integrity: sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==} + json-schema-ref-resolver@3.0.0: + resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==} json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -3418,8 +3328,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.0: - resolution: {integrity: sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==} + keyv@5.5.3: + resolution: {integrity: sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==} kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} @@ -3451,74 +3361,76 @@ packages: lighthouse-logger@2.0.2: resolution: {integrity: sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==} - lightningcss-darwin-arm64@1.30.1: - resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.1: - resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.1: - resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.1: - resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.30.1: - resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.30.1: - resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.30.1: - resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.30.1: - resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.1: - resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.1: - resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -3571,10 +3483,6 @@ packages: lodash.flattendeep@4.4.0: resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -3603,8 +3511,8 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} - loupe@3.2.0: - resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -3612,8 +3520,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -3632,8 +3540,8 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -3672,10 +3580,6 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - minimatch@10.0.3: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} @@ -3698,10 +3602,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.2: - resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} - engines: {node: '>= 18'} - mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} @@ -3717,13 +3617,8 @@ packages: engines: {node: '>=10'} hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -3781,8 +3676,8 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.26: + resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} nodemon@3.1.10: resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} @@ -3906,8 +3801,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.3.0: - resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + package-manager-detector@1.5.0: + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} pad-right@0.2.2: resolution: {integrity: sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==} @@ -4037,8 +3932,8 @@ packages: pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.9.0: - resolution: {integrity: sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ==} + pino@9.14.0: + resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} hasBin: true pirates@4.0.7: @@ -4071,27 +3966,33 @@ packages: peerDependencies: postcss: ^8.0.0 - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 - postcss-lit@1.2.0: - resolution: {integrity: sha512-PV1wC6MttgaA0w0P2nMCw4SyF/awtH2PgDTIuPVc+L8UHcy28DBQ2pUEqw12Ux342Y/E/cJU6Bq+gZHwBaHs0g==} + postcss-lit@1.3.1: + resolution: {integrity: sha512-rroJObC/RmZKauDPWIPxjFhAcUzmHT8SiCsiw9F+gVmJb6KrFH2OGwlfHZ2wEn+QDRcvkH0KBMrOFGnGu0aHnA==} peerDependencies: postcss: ^8.3.11 - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: + jiti: '>=1.21.0' postcss: '>=8.0.9' - ts-node: '>=9.0.0' + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: + optional: true + yaml: optional: true postcss-nested@6.2.0: @@ -4124,23 +4025,32 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - preact@10.27.1: - resolution: {integrity: sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==} + preact@10.27.2: + resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@30.0.2: - resolution: {integrity: sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - pretty-ms@9.2.0: - resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} process-nextick-args@2.0.1: @@ -4188,6 +4098,10 @@ packages: resolution: {integrity: sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==} engines: {node: '>=16.13.2'} + qified@0.5.1: + resolution: {integrity: sha512-+BtFN3dCP+IaFA6IYNOu/f/uK1B8xD2QWyOeCse0rjtAebBmkzgd2d1OAXi3ikAzJMIBSdzZDNZ3wZKEUDQs5w==} + engines: {node: '>=20'} + quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -4312,8 +4226,8 @@ packages: resolution: {integrity: sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==} engines: {node: '>=8'} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true @@ -4339,8 +4253,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.47.0: - resolution: {integrity: sha512-jZVxJwlAptA83ftdZK1kjLZfi0f6o+vVX7ub3HaRzkehLO3l4VB4vYpMHyunhBt1sawv9fiRWPA8Qi/sbg9Kcw==} + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4389,8 +4303,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - secure-json-parse@4.0.0: - resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} seed-random@2.2.0: resolution: {integrity: sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==} @@ -4413,8 +4327,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -4490,8 +4404,8 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} - sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} slash@3.0.0: @@ -4568,8 +4482,8 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -4582,8 +4496,8 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamx@2.22.1: - resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} @@ -4627,8 +4541,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -4639,16 +4553,16 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} @@ -4656,8 +4570,8 @@ packages: strnum@2.1.1: resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} - style-mod@4.1.2: - resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + style-mod@4.1.3: + resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} stylelint-config-recommended@17.0.0: resolution: {integrity: sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==} @@ -4671,8 +4585,8 @@ packages: stylelint: '>=13.13.1' tailwindcss: '>=2.2.16' - stylelint@16.24.0: - resolution: {integrity: sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==} + stylelint@16.25.0: + resolution: {integrity: sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -4704,35 +4618,35 @@ packages: svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + tailwindcss@3.4.18: + resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.1.12: - resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} + tailwindcss@4.1.16: + resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tar-fs@3.0.4: resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} - tar-fs@3.1.0: - resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==} + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} - text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -4761,8 +4675,8 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} tinypool@1.1.1: @@ -4777,8 +4691,8 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} tmp@0.2.3: @@ -4847,13 +4761,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.20.3: - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} - engines: {node: '>=18.0.0'} - hasBin: true - - tsx@4.20.4: - resolution: {integrity: sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==} + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} engines: {node: '>=18.0.0'} hasBin: true @@ -4861,10 +4770,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -4910,13 +4815,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -4940,15 +4840,15 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@6.21.3: - resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} + undici@6.22.0: + resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} engines: {node: '>=18.17'} - undici@7.14.0: - resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} engines: {node: '>=20.18.1'} unicorn-magic@0.3.0: @@ -4959,8 +4859,8 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unplugin-icons@22.2.0: - resolution: {integrity: sha512-OdrXCiXexC1rFd0QpliAgcd4cMEEEQtoCf2WIrRIGu4iW6auBPpQKMCBeWxoe55phYdRyZLUWNOtzyTX+HOFSA==} + unplugin-icons@22.5.0: + resolution: {integrity: sha512-MBlMtT5RuMYZy4TZgqUL2OTtOdTUVsS1Mhj6G1pEzMlFJlEnq6mhUfoIt45gBWxHcsOdXJDWLg3pRZ+YmvAVWQ==} peerDependencies: '@svgr/core': '>=7.0.0' '@svgx/core': ^1.0.1 @@ -4982,15 +4882,15 @@ packages: vue-template-es2015-compiler: optional: true - unplugin@2.3.8: - resolution: {integrity: sha512-lkaSIlxceytPyt9yfb1h7L9jDFqwMqvUZeGsKB7Z8QrvAO3xZv2S+xMQQYzxk0AGJHcQhbcvhKEstrMy99jnuQ==} + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} engines: {node: '>=18.12.0'} unzipper@0.10.14: resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -5052,8 +4952,8 @@ packages: rollup: ^4.44.1 vite: ^5.4.11 || ^6.0.0 || ^7.0.0 - vite@7.1.3: - resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} + vite@7.1.12: + resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -5123,9 +5023,6 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vue-template-compiler@2.7.15: - resolution: {integrity: sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==} - w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} @@ -5145,8 +5042,8 @@ packages: resolution: {integrity: sha512-07lC4FLj45lHJo0FvLjUp5qkjzEGWJWKGsxLoe9rQ2Fg88iYsqgr9JfSj8qxHpazBaBd+77+ZtpmMZ2X2D1Zuw==} engines: {node: '>=18.20.0'} - webdriver@9.19.1: - resolution: {integrity: sha512-cvccIZ3QaUZxxrA81a3rqqgxKt6VzVrZupMc+eX9J40qfGrV3NtdLb/m4AA1PmeTPGN5O3/4KrzDpnVZM4WUnA==} + webdriver@9.20.0: + resolution: {integrity: sha512-Kk+AGV1xWLNHVpzUynQJDULMzbcO3IjXo3s0BzfC30OpGxhpaNmoazMQodhtv0Lp242Mb1VYXD89dCb4oAHc4w==} engines: {node: '>=18.20.0'} webdriverio@9.18.0: @@ -5158,8 +5055,8 @@ packages: puppeteer-core: optional: true - webdriverio@9.19.1: - resolution: {integrity: sha512-hpGgK6d9QNi3AaLFWIPQaEMqJhXF048XAIsV5i5mkL0kjghV1opcuhKgbbG+7pcn8JSpiq6mh7o3MDYtapw90w==} + webdriverio@9.20.0: + resolution: {integrity: sha512-cqaXfahTzCFaQLlk++feZaze6tAsW8OSdaVRgmOGJRII1z2A4uh4YGHtusTpqOiZAST7OBPqycOwfh01G/Ktbg==} engines: {node: '>=18.20.0'} peerDependencies: puppeteer-core: '>=22.x || <=24.x' @@ -5282,12 +5179,8 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -5335,119 +5228,119 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 1.3.0 + package-manager-detector: 1.5.0 tinyexec: 1.0.1 - '@antfu/utils@8.1.1': {} + '@antfu/utils@9.3.0': {} '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.28.3': + '@babel/generator@7.28.5': dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-globals@7.28.0': {} '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.3': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 - '@babel/parser@7.28.4': - dependencies: - '@babel/types': 7.28.4 - - '@babel/runtime@7.28.3': {} + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/traverse@7.28.3': + '@babel/traverse@7.28.5': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.3 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - debug: 4.4.1 + '@babel/types': 7.28.5 + debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/traverse@7.28.4': + '@babel/types@7.28.5': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.28.4': + '@cacheable/memoize@2.0.3': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@cacheable/utils': 2.1.0 + + '@cacheable/memory@2.0.3': + dependencies: + '@cacheable/memoize': 2.0.3 + '@cacheable/utils': 2.1.0 + '@keyv/bigmap': 1.1.0(keyv@5.5.3) + hookified: 1.12.2 + keyv: 5.5.3 + + '@cacheable/utils@2.1.0': + dependencies: + keyv: 5.5.3 - '@codemirror/autocomplete@6.18.6': + '@codemirror/autocomplete@6.19.1': dependencies: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 - '@codemirror/commands@6.8.1': + '@codemirror/commands@6.10.0': dependencies: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 '@codemirror/lang-javascript@6.2.4': dependencies: - '@codemirror/autocomplete': 6.18.6 + '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 - '@codemirror/lint': 6.8.5 + '@codemirror/lint': 6.9.1 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 - '@lezer/javascript': 1.5.1 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 + '@lezer/javascript': 1.5.4 '@codemirror/language@6.11.3': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.2 '@lezer/lr': 1.4.2 - style-mod: 4.1.2 + style-mod: 4.1.3 - '@codemirror/lint@6.8.5': + '@codemirror/lint@6.9.1': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 crelt: 1.0.6 '@codemirror/search@6.5.11': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 crelt: 1.0.6 '@codemirror/state@6.5.2': @@ -5458,14 +5351,14 @@ snapshots: dependencies: '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 - '@lezer/highlight': 1.2.1 + '@codemirror/view': 6.38.6 + '@lezer/highlight': 1.2.2 - '@codemirror/view@6.38.1': + '@codemirror/view@6.38.6': dependencies: '@codemirror/state': 6.5.2 crelt: 1.0.6 - style-mod: 4.1.2 + style-mod: 4.1.3 w3c-keyname: 2.2.8 '@colors/colors@1.5.0': @@ -5512,7 +5405,7 @@ snapshots: chalk: 4.1.2 cli-table3: 0.6.3 commander: 10.0.1 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) error-stack-parser: 2.1.4 figures: 3.2.0 glob: 10.4.5 @@ -5538,7 +5431,7 @@ snapshots: type-fest: 4.41.0 util-arity: 1.1.0 xmlbuilder: 15.1.1 - yaml: 2.8.0 + yaml: 2.8.1 yup: 1.2.0 '@cucumber/gherkin-streams@5.0.1(@cucumber/gherkin@28.0.0)(@cucumber/message-streams@4.0.1(@cucumber/messages@24.1.0))(@cucumber/messages@24.1.0)': @@ -5598,191 +5491,115 @@ snapshots: '@dual-bundle/import-meta-resolve@4.2.1': {} - '@esbuild/aix-ppc64@0.25.6': - optional: true - - '@esbuild/aix-ppc64@0.25.9': - optional: true - - '@esbuild/android-arm64@0.25.6': - optional: true - - '@esbuild/android-arm64@0.25.9': - optional: true - - '@esbuild/android-arm@0.25.6': - optional: true - - '@esbuild/android-arm@0.25.9': - optional: true - - '@esbuild/android-x64@0.25.6': - optional: true - - '@esbuild/android-x64@0.25.9': - optional: true - - '@esbuild/darwin-arm64@0.25.6': - optional: true - - '@esbuild/darwin-arm64@0.25.9': + '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.6': + '@esbuild/android-arm64@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.9': + '@esbuild/android-arm@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.6': + '@esbuild/android-x64@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.9': + '@esbuild/darwin-arm64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.6': + '@esbuild/darwin-x64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.9': + '@esbuild/freebsd-arm64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.6': + '@esbuild/freebsd-x64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/linux-arm64@0.25.11': optional: true - '@esbuild/linux-arm@0.25.6': + '@esbuild/linux-arm@0.25.11': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/linux-ia32@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.6': + '@esbuild/linux-loong64@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/linux-mips64el@0.25.11': optional: true - '@esbuild/linux-loong64@0.25.6': + '@esbuild/linux-ppc64@0.25.11': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/linux-riscv64@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.6': + '@esbuild/linux-s390x@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/linux-x64@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.6': + '@esbuild/netbsd-arm64@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/netbsd-x64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.6': + '@esbuild/openbsd-arm64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/openbsd-x64@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.6': + '@esbuild/openharmony-arm64@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/sunos-x64@0.25.11': optional: true - '@esbuild/linux-x64@0.25.6': + '@esbuild/win32-arm64@0.25.11': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/win32-ia32@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.6': + '@esbuild/win32-x64@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.9': - optional: true - - '@esbuild/netbsd-x64@0.25.6': - optional: true - - '@esbuild/netbsd-x64@0.25.9': - optional: true - - '@esbuild/openbsd-arm64@0.25.6': - optional: true - - '@esbuild/openbsd-arm64@0.25.9': - optional: true - - '@esbuild/openbsd-x64@0.25.6': - optional: true - - '@esbuild/openbsd-x64@0.25.9': - optional: true - - '@esbuild/openharmony-arm64@0.25.6': - optional: true - - '@esbuild/openharmony-arm64@0.25.9': - optional: true - - '@esbuild/sunos-x64@0.25.6': - optional: true - - '@esbuild/sunos-x64@0.25.9': - optional: true - - '@esbuild/win32-arm64@0.25.6': - optional: true - - '@esbuild/win32-arm64@0.25.9': - optional: true - - '@esbuild/win32-ia32@0.25.6': - optional: true - - '@esbuild/win32-ia32@0.25.9': - optional: true - - '@esbuild/win32-x64@0.25.6': - optional: true - - '@esbuild/win32-x64@0.25.9': - optional: true - - '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.38.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.1': {} + '@eslint/config-helpers@0.4.1': + dependencies: + '@eslint/core': 0.16.0 '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.15.2': + '@eslint/core@0.16.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -5793,43 +5610,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.33.0': {} + '@eslint/js@9.38.0': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} '@eslint/plugin-kit@0.2.8': dependencies: '@eslint/core': 0.13.0 levn: 0.4.1 - '@eslint/plugin-kit@0.3.5': + '@eslint/plugin-kit@0.4.0': dependencies: - '@eslint/core': 0.15.2 + '@eslint/core': 0.16.0 levn: 0.4.1 '@fastify/accept-negotiator@2.0.1': {} - '@fastify/ajv-compiler@4.0.2': + '@fastify/ajv-compiler@4.0.5': dependencies: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) - fast-uri: 3.0.6 + fast-uri: 3.1.0 '@fastify/error@4.2.0': {} '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: - fast-json-stringify: 6.0.1 + fast-json-stringify: 6.1.1 - '@fastify/forwarded@3.0.0': {} + '@fastify/forwarded@3.0.1': {} '@fastify/merge-json-schemas@0.2.1': dependencies: dequal: 2.0.3 - '@fastify/proxy-addr@5.0.0': + '@fastify/proxy-addr@5.1.0': dependencies: - '@fastify/forwarded': 3.0.0 + '@fastify/forwarded': 3.0.1 ipaddr.js: 2.2.0 '@fastify/send@4.1.0': @@ -5840,19 +5657,19 @@ snapshots: http-errors: 2.0.0 mime: 3.0.0 - '@fastify/static@8.2.0': + '@fastify/static@8.3.0': dependencies: '@fastify/accept-negotiator': 2.0.1 '@fastify/send': 4.1.0 content-disposition: 0.5.4 - fastify-plugin: 5.0.1 + fastify-plugin: 5.1.0 fastq: 1.19.1 glob: 11.0.3 '@fastify/websocket@11.2.0': dependencies: duplexify: 4.1.3 - fastify-plugin: 5.0.1 + fastify-plugin: 5.1.0 ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -5860,15 +5677,13 @@ snapshots: '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} '@iconify-json/mdi@1.2.3': @@ -5877,141 +5692,143 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@2.3.0': + '@iconify/utils@3.0.2': dependencies: '@antfu/install-pkg': 1.1.0 - '@antfu/utils': 8.1.1 + '@antfu/utils': 9.3.0 '@iconify/types': 2.0.0 - debug: 4.4.1 + debug: 4.4.3 globals: 15.15.0 kolorist: 1.8.0 local-pkg: 1.1.2 - mlly: 1.7.4 + mlly: 1.8.0 transitivePeerDependencies: - supports-color - '@inquirer/checkbox@4.2.1(@types/node@24.3.0)': + '@inquirer/ansi@1.0.1': {} + + '@inquirer/checkbox@4.3.0(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@24.9.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/confirm@5.1.15(@types/node@24.3.0)': + '@inquirer/confirm@5.1.19(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/core@10.1.15(@types/node@24.3.0)': + '@inquirer/core@10.3.0(@types/node@24.9.1)': dependencies: - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@24.9.1) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/editor@4.2.17(@types/node@24.3.0)': + '@inquirer/editor@4.2.21(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/external-editor': 1.0.1(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/external-editor': 1.0.2(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/expand@4.0.17(@types/node@24.3.0)': + '@inquirer/expand@4.0.21(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/external-editor@1.0.1(@types/node@24.3.0)': + '@inquirer/external-editor@1.0.2(@types/node@24.9.1)': dependencies: chardet: 2.1.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/figures@1.0.13': {} + '@inquirer/figures@1.0.14': {} - '@inquirer/input@4.2.1(@types/node@24.3.0)': + '@inquirer/input@4.2.5(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/number@3.0.17(@types/node@24.3.0)': + '@inquirer/number@3.0.21(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/password@4.0.17(@types/node@24.3.0)': + '@inquirer/password@4.0.21(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.3.0 - - '@inquirer/prompts@7.8.3(@types/node@24.3.0)': - dependencies: - '@inquirer/checkbox': 4.2.1(@types/node@24.3.0) - '@inquirer/confirm': 5.1.15(@types/node@24.3.0) - '@inquirer/editor': 4.2.17(@types/node@24.3.0) - '@inquirer/expand': 4.0.17(@types/node@24.3.0) - '@inquirer/input': 4.2.1(@types/node@24.3.0) - '@inquirer/number': 3.0.17(@types/node@24.3.0) - '@inquirer/password': 4.0.17(@types/node@24.3.0) - '@inquirer/rawlist': 4.1.5(@types/node@24.3.0) - '@inquirer/search': 3.1.0(@types/node@24.3.0) - '@inquirer/select': 4.3.1(@types/node@24.3.0) + '@types/node': 24.9.1 + + '@inquirer/prompts@7.9.0(@types/node@24.9.1)': + dependencies: + '@inquirer/checkbox': 4.3.0(@types/node@24.9.1) + '@inquirer/confirm': 5.1.19(@types/node@24.9.1) + '@inquirer/editor': 4.2.21(@types/node@24.9.1) + '@inquirer/expand': 4.0.21(@types/node@24.9.1) + '@inquirer/input': 4.2.5(@types/node@24.9.1) + '@inquirer/number': 3.0.21(@types/node@24.9.1) + '@inquirer/password': 4.0.21(@types/node@24.9.1) + '@inquirer/rawlist': 4.1.9(@types/node@24.9.1) + '@inquirer/search': 3.2.0(@types/node@24.9.1) + '@inquirer/select': 4.4.0(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/rawlist@4.1.5(@types/node@24.3.0)': + '@inquirer/rawlist@4.1.9(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/search@3.1.0(@types/node@24.3.0)': + '@inquirer/search@3.2.0(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@24.9.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/select@4.3.1(@types/node@24.3.0)': + '@inquirer/select@4.4.0(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@24.9.1) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@inquirer/type@3.0.8(@types/node@24.3.0)': + '@inquirer/type@3.0.9(@types/node@24.9.1)': optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 '@isaacs/balanced-match@4.0.1': {} @@ -6023,57 +5840,53 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - '@jest/diff-sequences@30.0.1': {} - '@jest/expect-utils@30.0.4': + '@jest/expect-utils@30.2.0': dependencies: - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 - '@jest/get-type@30.0.1': {} + '@jest/get-type@30.1.0': {} '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 jest-regex-util: 30.0.1 - '@jest/schemas@30.0.1': + '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.38 + '@sinclair/typebox': 0.34.41 - '@jest/types@30.0.1': + '@jest/types@30.2.0': dependencies: '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.1 + '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.3.0 - '@types/yargs': 17.0.33 + '@types/node': 24.9.1 + '@types/yargs': 17.0.34 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 @@ -6083,23 +5896,28 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@keyv/serialize@1.1.0': {} + '@keyv/bigmap@1.1.0(keyv@5.5.3)': + dependencies: + hookified: 1.12.2 + keyv: 5.5.3 + + '@keyv/serialize@1.1.1': {} - '@lezer/common@1.2.3': {} + '@lezer/common@1.3.0': {} - '@lezer/highlight@1.2.1': + '@lezer/highlight@1.2.2': dependencies: - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 - '@lezer/javascript@1.5.1': + '@lezer/javascript@1.5.4': dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 + '@lezer/common': 1.3.0 + '@lezer/highlight': 1.2.2 '@lezer/lr': 1.4.2 '@lezer/lr@1.4.2': dependencies: - '@lezer/common': 1.2.3 + '@lezer/common': 1.3.0 '@lit-labs/ssr-dom-shim@1.4.0': {} @@ -6115,26 +5933,26 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} - '@microsoft/api-extractor-model@7.30.7(@types/node@24.3.0)': + '@microsoft/api-extractor-model@7.31.3(@types/node@24.9.1)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.14.0(@types/node@24.3.0) + '@rushstack/node-core-library': 5.18.0(@types/node@24.9.1) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.11(@types/node@24.3.0)': + '@microsoft/api-extractor@7.53.3(@types/node@24.9.1)': dependencies: - '@microsoft/api-extractor-model': 7.30.7(@types/node@24.3.0) + '@microsoft/api-extractor-model': 7.31.3(@types/node@24.9.1) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.14.0(@types/node@24.3.0) - '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.4(@types/node@24.3.0) - '@rushstack/ts-command-line': 5.0.2(@types/node@24.3.0) + '@rushstack/node-core-library': 5.18.0(@types/node@24.9.1) + '@rushstack/rig-package': 0.6.0 + '@rushstack/terminal': 0.19.3(@types/node@24.9.1) + '@rushstack/ts-command-line': 5.1.3(@types/node@24.9.1) lodash: 4.17.21 minimatch: 10.0.3 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 source-map: 0.6.1 typescript: 5.8.2 @@ -6146,7 +5964,7 @@ snapshots: '@microsoft/tsdoc': 0.15.1 ajv: 8.12.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 '@microsoft/tsdoc@0.15.1': {} @@ -6162,9 +5980,13 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@pinojs/redact@0.4.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.2.9': {} + '@polka/url@1.0.0-next.29': {} '@promptbook/utils@0.69.5': @@ -6181,119 +6003,134 @@ snapshots: unbzip2-stream: 1.4.3 yargs: 17.7.2 transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - supports-color - '@puppeteer/browsers@2.10.7': + '@puppeteer/browsers@2.10.12': dependencies: - debug: 4.4.1 + debug: 4.4.3 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.7.2 - tar-fs: 3.1.0 + semver: 7.7.3 + tar-fs: 3.1.1 yargs: 17.7.2 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color - '@rollup/pluginutils@5.2.0(rollup@4.47.0)': + '@rollup/pluginutils@5.3.0(rollup@4.52.5)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.47.0 + rollup: 4.52.5 + + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true - '@rollup/rollup-android-arm-eabi@4.47.0': + '@rollup/rollup-darwin-arm64@4.52.5': optional: true - '@rollup/rollup-android-arm64@4.47.0': + '@rollup/rollup-darwin-x64@4.52.5': optional: true - '@rollup/rollup-darwin-arm64@4.47.0': + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-x64@4.47.0': + '@rollup/rollup-freebsd-x64@4.52.5': optional: true - '@rollup/rollup-freebsd-arm64@4.47.0': + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': optional: true - '@rollup/rollup-freebsd-x64@4.47.0': + '@rollup/rollup-linux-arm-musleabihf@4.52.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.47.0': + '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.47.0': + '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.47.0': + '@rollup/rollup-linux-loong64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.47.0': + '@rollup/rollup-linux-ppc64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.47.0': + '@rollup/rollup-linux-riscv64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.47.0': + '@rollup/rollup-linux-riscv64-musl@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.47.0': + '@rollup/rollup-linux-s390x-gnu@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-musl@4.47.0': + '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.47.0': + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.47.0': + '@rollup/rollup-openharmony-arm64@4.52.5': optional: true - '@rollup/rollup-linux-x64-musl@4.47.0': + '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.47.0': + '@rollup/rollup-win32-ia32-msvc@4.52.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.47.0': + '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.47.0': + '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true '@rtsao/scc@1.1.0': {} - '@rushstack/node-core-library@5.14.0(@types/node@24.3.0)': + '@rushstack/node-core-library@5.18.0(@types/node@24.9.1)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 11.3.1 + fs-extra: 11.3.2 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@rushstack/rig-package@0.5.3': + '@rushstack/problem-matcher@0.1.1(@types/node@24.9.1)': + optionalDependencies: + '@types/node': 24.9.1 + + '@rushstack/rig-package@0.6.0': dependencies: - resolve: 1.22.10 + resolve: 1.22.11 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.4(@types/node@24.3.0)': + '@rushstack/terminal@0.19.3(@types/node@24.9.1)': dependencies: - '@rushstack/node-core-library': 5.14.0(@types/node@24.3.0) + '@rushstack/node-core-library': 5.18.0(@types/node@24.9.1) + '@rushstack/problem-matcher': 0.1.1(@types/node@24.9.1) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 - '@rushstack/ts-command-line@5.0.2(@types/node@24.3.0)': + '@rushstack/ts-command-line@5.1.3(@types/node@24.9.1)': dependencies: - '@rushstack/terminal': 0.15.4(@types/node@24.3.0) + '@rushstack/terminal': 0.19.3(@types/node@24.9.1) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -6302,88 +6139,85 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@sinclair/typebox@0.34.38': {} + '@sinclair/typebox@0.34.41': {} '@sindresorhus/merge-streams@4.0.0': {} - '@tailwindcss/node@4.1.12': + '@tailwindcss/node@4.1.16': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.18.3 - jiti: 2.5.1 - lightningcss: 1.30.1 - magic-string: 0.30.17 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.12 + tailwindcss: 4.1.16 - '@tailwindcss/oxide-android-arm64@4.1.12': + '@tailwindcss/oxide-android-arm64@4.1.16': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.12': + '@tailwindcss/oxide-darwin-arm64@4.1.16': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.12': + '@tailwindcss/oxide-darwin-x64@4.1.16': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.12': + '@tailwindcss/oxide-freebsd-x64@4.1.16': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.12': + '@tailwindcss/oxide-linux-x64-musl@4.1.16': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.12': + '@tailwindcss/oxide-wasm32-wasi@4.1.16': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': optional: true - '@tailwindcss/oxide@4.1.12': - dependencies: - detect-libc: 2.0.4 - tar: 7.4.3 + '@tailwindcss/oxide@4.1.16': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.12 - '@tailwindcss/oxide-darwin-arm64': 4.1.12 - '@tailwindcss/oxide-darwin-x64': 4.1.12 - '@tailwindcss/oxide-freebsd-x64': 4.1.12 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 - '@tailwindcss/oxide-linux-x64-musl': 4.1.12 - '@tailwindcss/oxide-wasm32-wasi': 4.1.12 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 - - '@tailwindcss/postcss@4.1.12': + '@tailwindcss/oxide-android-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-x64': 4.1.16 + '@tailwindcss/oxide-freebsd-x64': 4.1.16 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.16 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.16 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-x64-musl': 4.1.16 + '@tailwindcss/oxide-wasm32-wasi': 4.1.16 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.16 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.16 + + '@tailwindcss/postcss@4.1.16': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.12 - '@tailwindcss/oxide': 4.1.12 + '@tailwindcss/node': 4.1.16 + '@tailwindcss/oxide': 4.1.16 postcss: 8.5.6 - tailwindcss: 4.1.12 + tailwindcss: 4.1.16 '@teppeis/multimaps@3.0.0': {} '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -6411,28 +6245,29 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 - '@types/chai@5.2.2': + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 '@types/deep-eql@4.0.2': {} @@ -6452,17 +6287,17 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@20.19.11': + '@types/node@20.19.23': dependencies: undici-types: 6.21.0 - '@types/node@22.17.2': + '@types/node@22.18.12': dependencies: undici-types: 6.21.0 - '@types/node@24.3.0': + '@types/node@24.9.1': dependencies: - undici-types: 7.10.0 + undici-types: 7.16.0 '@types/normalize-package-data@2.4.4': {} @@ -6482,125 +6317,125 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.33': + '@types/yargs@17.0.34': dependencies: '@types/yargs-parser': 21.0.3 '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 optional: true - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/type-utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.40.0 - eslint: 9.33.0(jiti@2.5.1) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 9.38.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.40.0 - debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) - typescript: 5.9.2 + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3 + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.40.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) - '@typescript-eslint/types': 8.40.0 - debug: 4.4.1 - typescript: 5.9.2 + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.40.0': + '@typescript-eslint/scope-manager@8.46.2': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 - '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.38.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.40.0': {} + '@typescript-eslint/types@8.46.2': {} - '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.40.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/visitor-keys': 8.40.0 - debug: 4.4.1 + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) - typescript: 5.9.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.40.0': + '@typescript-eslint/visitor-keys@8.46.2': dependencies: - '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/types': 8.46.2 eslint-visitor-keys: 4.2.1 - '@vitest/browser@3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0))(vitest@3.2.4)(webdriverio@9.19.1(puppeteer-core@21.11.0))': + '@vitest/browser@3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(puppeteer-core@21.11.0))': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 - magic-string: 0.30.17 - sirv: 3.0.1 + magic-string: 0.30.21 + sirv: 3.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.0)(@vitest/browser@3.2.4)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) + vitest: 3.2.4(@types/node@24.9.1)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 optionalDependencies: - webdriverio: 9.19.1(puppeteer-core@21.11.0) + webdriverio: 9.20.0(puppeteer-core@21.11.0) transitivePeerDependencies: - bufferutil - msw @@ -6609,19 +6444,19 @@ snapshots: '@vitest/expect@3.2.4': dependencies: - '@types/chai': 5.2.2 + '@types/chai': 5.2.3 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.3.1 + chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) + vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@2.1.9': dependencies: @@ -6635,28 +6470,28 @@ snapshots: dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 - strip-literal: 3.0.0 + strip-literal: 3.1.0 '@vitest/snapshot@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 - magic-string: 0.30.17 + magic-string: 0.30.21 pathe: 1.1.2 '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + magic-string: 0.30.21 pathe: 2.0.3 '@vitest/spy@3.2.4': dependencies: - tinyspy: 4.0.3 + tinyspy: 4.0.4 '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - loupe: 3.2.0 + loupe: 3.2.1 tinyrainbow: 2.0.0 '@volar/language-core@2.4.23': @@ -6671,67 +6506,69 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.19': + '@vue/compiler-core@3.5.22': dependencies: - '@babel/parser': 7.28.4 - '@vue/shared': 3.5.19 + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.22 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.19': + '@vue/compiler-dom@3.5.22': dependencies: - '@vue/compiler-core': 3.5.19 - '@vue/shared': 3.5.19 + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.9.2)': + '@vue/language-core@2.2.0(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.23 - '@vue/compiler-dom': 3.5.19 + '@vue/compiler-dom': 3.5.22 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.19 + '@vue/shared': 3.5.22 alien-signals: 0.4.14 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@vue/shared@3.5.19': {} + '@vue/shared@3.5.22': {} - '@wdio/cli@9.18.0(@types/node@24.3.0)(expect-webdriverio@5.4.0)(puppeteer-core@21.11.0)': + '@wdio/cli@9.18.0(@types/node@24.9.1)(expect-webdriverio@5.4.3)(puppeteer-core@21.11.0)': dependencies: '@vitest/snapshot': 2.1.9 '@wdio/config': 9.18.0 - '@wdio/globals': 9.17.0(expect-webdriverio@5.4.0)(webdriverio@9.18.0(puppeteer-core@21.11.0)) + '@wdio/globals': 9.17.0(expect-webdriverio@5.4.3)(webdriverio@9.18.0(puppeteer-core@21.11.0)) '@wdio/logger': 9.18.0 '@wdio/protocols': 9.16.2 '@wdio/types': 9.16.2 '@wdio/utils': 9.18.0 async-exit-hook: 2.0.1 - chalk: 5.6.0 + chalk: 5.6.2 chokidar: 4.0.3 - create-wdio: 9.18.0(@types/node@24.3.0) - dotenv: 17.2.1 - import-meta-resolve: 4.1.0 + create-wdio: 9.18.0(@types/node@24.9.1) + dotenv: 17.2.3 + import-meta-resolve: 4.2.0 lodash.flattendeep: 4.4.0 lodash.pickby: 4.6.0 lodash.union: 4.6.0 read-pkg-up: 10.1.0 - tsx: 4.20.4 + tsx: 4.20.6 webdriverio: 9.18.0(puppeteer-core@21.11.0) yargs: 17.7.2 transitivePeerDependencies: - '@types/node' + - bare-abort-controller - bare-buffer - bufferutil - expect-webdriverio - puppeteer-core + - react-native-b4a - supports-color - utf-8-validate @@ -6743,9 +6580,11 @@ snapshots: decamelize: 6.0.1 deepmerge-ts: 5.1.0 glob: 10.4.5 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color '@wdio/config@9.18.0': @@ -6755,21 +6594,26 @@ snapshots: '@wdio/utils': 9.18.0 deepmerge-ts: 7.1.5 glob: 10.4.5 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color - '@wdio/config@9.19.1': + '@wdio/config@9.20.0': dependencies: '@wdio/logger': 9.18.0 - '@wdio/types': 9.19.1 - '@wdio/utils': 9.19.1 + '@wdio/types': 9.20.0 + '@wdio/utils': 9.20.0 deepmerge-ts: 7.1.5 glob: 10.4.5 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 + jiti: 2.6.1 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color '@wdio/cucumber-framework@9.18.0': @@ -6777,66 +6621,70 @@ snapshots: '@cucumber/cucumber': 10.9.0 '@cucumber/gherkin': 29.0.0 '@cucumber/messages': 26.0.1 - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@wdio/logger': 9.18.0 '@wdio/types': 9.16.2 '@wdio/utils': 9.18.0 glob: 10.4.5 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 is-glob: 4.0.3 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color '@wdio/dot-reporter@9.18.0': dependencies: '@wdio/reporter': 9.18.0 '@wdio/types': 9.16.2 - chalk: 5.6.0 + chalk: 5.6.2 - '@wdio/globals@9.17.0(expect-webdriverio@5.4.0)(webdriverio@9.18.0(puppeteer-core@21.11.0))': + '@wdio/globals@9.17.0(expect-webdriverio@5.4.3)(webdriverio@9.18.0(puppeteer-core@21.11.0))': dependencies: - expect-webdriverio: 5.4.0(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + expect-webdriverio: 5.4.3(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.20.0(puppeteer-core@21.11.0)) webdriverio: 9.18.0(puppeteer-core@21.11.0) - '@wdio/globals@9.17.0(expect-webdriverio@5.4.0)(webdriverio@9.19.1(puppeteer-core@21.11.0))': + '@wdio/globals@9.17.0(expect-webdriverio@5.4.3)(webdriverio@9.20.0(puppeteer-core@21.11.0))': dependencies: - expect-webdriverio: 5.4.0(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) - webdriverio: 9.19.1(puppeteer-core@21.11.0) + expect-webdriverio: 5.4.3(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.20.0(puppeteer-core@21.11.0)) + webdriverio: 9.20.0(puppeteer-core@21.11.0) - '@wdio/local-runner@9.18.0(@wdio/globals@9.17.0)(webdriverio@9.19.1(puppeteer-core@21.11.0))': + '@wdio/local-runner@9.18.0(@wdio/globals@9.17.0)(webdriverio@9.20.0(puppeteer-core@21.11.0))': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@wdio/logger': 9.18.0 '@wdio/repl': 9.16.2 - '@wdio/runner': 9.18.0(expect-webdriverio@5.4.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + '@wdio/runner': 9.18.0(expect-webdriverio@5.4.3)(webdriverio@9.20.0(puppeteer-core@21.11.0)) '@wdio/types': 9.16.2 exit-hook: 4.0.0 - expect-webdriverio: 5.4.0(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + expect-webdriverio: 5.4.3(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.20.0(puppeteer-core@21.11.0)) split2: 4.2.0 stream-buffers: 3.0.3 transitivePeerDependencies: - '@wdio/globals' + - bare-abort-controller - bare-buffer - bufferutil + - react-native-b4a - supports-color - utf-8-validate - webdriverio '@wdio/logger@8.38.0': dependencies: - chalk: 5.6.0 + chalk: 5.6.2 loglevel: 1.9.2 loglevel-plugin-prefix: 0.8.4 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 '@wdio/logger@9.18.0': dependencies: - chalk: 5.6.0 + chalk: 5.6.2 loglevel: 1.9.2 loglevel-plugin-prefix: 0.8.4 safe-regex2: 5.0.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 '@wdio/protocols@8.40.3': {} @@ -6844,32 +6692,34 @@ snapshots: '@wdio/repl@9.16.2': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@wdio/reporter@9.18.0': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@wdio/logger': 9.18.0 '@wdio/types': 9.16.2 diff: 8.0.2 object-inspect: 1.13.4 - '@wdio/runner@9.18.0(expect-webdriverio@5.4.0)(webdriverio@9.19.1(puppeteer-core@21.11.0))': + '@wdio/runner@9.18.0(expect-webdriverio@5.4.3)(webdriverio@9.20.0(puppeteer-core@21.11.0))': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@wdio/config': 9.18.0 '@wdio/dot-reporter': 9.18.0 - '@wdio/globals': 9.17.0(expect-webdriverio@5.4.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + '@wdio/globals': 9.17.0(expect-webdriverio@5.4.3)(webdriverio@9.20.0(puppeteer-core@21.11.0)) '@wdio/logger': 9.18.0 '@wdio/types': 9.16.2 '@wdio/utils': 9.18.0 deepmerge-ts: 7.1.5 - expect-webdriverio: 5.4.0(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + expect-webdriverio: 5.4.3(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.20.0(puppeteer-core@21.11.0)) webdriver: 9.18.0 - webdriverio: 9.19.1(puppeteer-core@21.11.0) + webdriverio: 9.20.0(puppeteer-core@21.11.0) transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil + - react-native-b4a - supports-color - utf-8-validate @@ -6877,21 +6727,21 @@ snapshots: dependencies: '@wdio/reporter': 9.18.0 '@wdio/types': 9.16.2 - chalk: 5.4.1 + chalk: 5.6.2 easy-table: 1.2.0 - pretty-ms: 9.2.0 + pretty-ms: 9.3.0 '@wdio/types@8.41.0': dependencies: - '@types/node': 22.17.2 + '@types/node': 22.18.12 '@wdio/types@9.16.2': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 - '@wdio/types@9.19.1': + '@wdio/types@9.20.0': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@wdio/utils@8.41.0': dependencies: @@ -6903,18 +6753,20 @@ snapshots: edgedriver: 5.6.1 geckodriver: 4.2.1 get-port: 7.1.0 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 locate-app: 2.5.0 safaridriver: 0.1.2 split2: 4.2.0 wait-port: 1.1.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color '@wdio/utils@9.18.0': dependencies: - '@puppeteer/browsers': 2.10.7 + '@puppeteer/browsers': 2.10.12 '@wdio/logger': 9.18.0 '@wdio/types': 9.16.2 decamelize: 6.0.1 @@ -6922,37 +6774,41 @@ snapshots: edgedriver: 6.1.2 geckodriver: 5.0.0 get-port: 7.1.0 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 locate-app: 2.5.0 mitt: 3.0.1 safaridriver: 1.0.0 split2: 4.2.0 wait-port: 1.1.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color - '@wdio/utils@9.19.1': + '@wdio/utils@9.20.0': dependencies: - '@puppeteer/browsers': 2.10.7 + '@puppeteer/browsers': 2.10.12 '@wdio/logger': 9.18.0 - '@wdio/types': 9.19.1 + '@wdio/types': 9.20.0 decamelize: 6.0.1 deepmerge-ts: 7.1.5 edgedriver: 6.1.2 geckodriver: 5.0.0 get-port: 7.1.0 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 locate-app: 2.5.0 mitt: 3.0.1 safaridriver: 1.0.0 split2: 4.2.0 wait-port: 1.1.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color - '@zip.js/zip.js@2.7.72': {} + '@zip.js/zip.js@2.8.8': {} abort-controller@3.0.0: dependencies: @@ -7008,21 +6864,17 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 alien-signals@0.4.14: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@4.1.1: {} ansi-regex@5.0.1: {} - ansi-regex@6.2.0: {} + ansi-regex@6.2.2: {} ansi-styles@3.2.1: dependencies: @@ -7034,7 +6886,7 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} any-promise@1.3.0: {} @@ -7062,6 +6914,9 @@ snapshots: readdir-glob: 1.1.3 tar-stream: 3.1.7 zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a arg@4.1.3: {} @@ -7155,8 +7010,8 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.3 - caniuse-lite: 1.0.30001736 + browserslist: 4.27.0 + caniuse-lite: 1.0.30001751 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -7172,20 +7027,24 @@ snapshots: '@fastify/error': 4.2.0 fastq: 1.19.1 - b4a@1.6.7: {} + b4a@1.7.3: {} balanced-match@1.0.2: {} balanced-match@2.0.0: {} - bare-events@2.6.1: - optional: true + bare-events@2.8.1: {} - bare-fs@4.2.1: + bare-fs@4.5.0: dependencies: - bare-events: 2.6.1 + bare-events: 2.8.1 bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.6.1) + bare-stream: 2.7.0(bare-events@2.8.1) + bare-url: 2.3.1 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a optional: true bare-os@3.6.2: @@ -7196,15 +7055,25 @@ snapshots: bare-os: 3.6.2 optional: true - bare-stream@2.7.0(bare-events@2.6.1): + bare-stream@2.7.0(bare-events@2.8.1): dependencies: - streamx: 2.22.1 + streamx: 2.23.0 optionalDependencies: - bare-events: 2.6.1 + bare-events: 2.8.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-url@2.3.1: + dependencies: + bare-path: 3.0.0 optional: true base64-js@1.5.1: {} + baseline-browser-mapping@2.8.20: {} + basic-ftp@5.0.5: {} big-integer@1.6.52: {} @@ -7233,12 +7102,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.25.3: + browserslist@4.27.0: dependencies: - caniuse-lite: 1.0.30001736 - electron-to-chromium: 1.5.207 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.3) + baseline-browser-mapping: 2.8.20 + caniuse-lite: 1.0.30001751 + electron-to-chromium: 1.5.240 + node-releases: 2.0.26 + update-browserslist-db: 1.1.4(browserslist@4.27.0) buffer-crc32@0.2.13: {} @@ -7264,10 +7134,14 @@ snapshots: cac@6.7.14: {} - cacheable@1.10.4: + cacheable@2.1.1: dependencies: - hookified: 1.12.0 - keyv: 5.5.0 + '@cacheable/memoize': 2.0.3 + '@cacheable/memory': 2.0.3 + '@cacheable/utils': 2.1.0 + hookified: 1.12.2 + keyv: 5.5.3 + qified: 0.5.1 call-bind-apply-helpers@1.0.2: dependencies: @@ -7290,7 +7164,7 @@ snapshots: camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001736: {} + caniuse-lite@1.0.30001751: {} capital-case@1.0.4: dependencies: @@ -7298,12 +7172,12 @@ snapshots: tslib: 2.8.1 upper-case-first: 2.0.2 - chai@5.3.1: + chai@5.3.3: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.2.0 + loupe: 3.2.1 pathval: 2.0.1 chainsaw@0.1.0: @@ -7321,9 +7195,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: {} - - chalk@5.6.0: {} + chalk@5.6.2: {} chardet@2.1.0: {} @@ -7349,7 +7221,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.14.0 + undici: 7.16.0 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -7368,11 +7240,9 @@ snapshots: dependencies: readdirp: 4.1.2 - chownr@3.0.0: {} - - chrome-launcher@1.2.0: + chrome-launcher@1.2.1: dependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.2 @@ -7385,7 +7255,7 @@ snapshots: mitt: 3.0.1 urlpattern-polyfill: 10.0.0 - ci-info@4.3.0: {} + ci-info@4.3.1: {} class-transformer@0.5.1: {} @@ -7412,13 +7282,13 @@ snapshots: codemirror@6.0.2: dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/commands': 6.8.1 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/commands': 6.10.0 '@codemirror/language': 6.11.3 - '@codemirror/lint': 6.8.5 + '@codemirror/lint': 6.9.1 '@codemirror/search': 6.5.11 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 color-convert@1.9.3: dependencies: @@ -7438,7 +7308,7 @@ snapshots: commander@12.0.0: {} - commander@14.0.0: {} + commander@14.0.1: {} commander@4.1.1: {} @@ -7468,20 +7338,20 @@ snapshots: cookie@1.0.2: {} - core-js-compat@3.45.1: + core-js-compat@3.46.0: dependencies: - browserslist: 4.25.3 + browserslist: 4.27.0 core-util-is@1.0.3: {} - cosmiconfig@9.0.0(typescript@5.9.2): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 crc-32@1.2.2: {} @@ -7492,19 +7362,19 @@ snapshots: create-require@1.1.1: {} - create-wdio@9.18.0(@types/node@24.3.0): + create-wdio@9.18.0(@types/node@24.9.1): dependencies: - chalk: 5.6.0 - commander: 14.0.0 + chalk: 5.6.2 + commander: 14.0.1 cross-spawn: 7.0.6 ejs: 3.1.10 execa: 9.6.0 - import-meta-resolve: 4.1.0 - inquirer: 12.9.3(@types/node@24.3.0) + import-meta-resolve: 4.2.0 + inquirer: 12.10.0(@types/node@24.9.1) normalize-package-data: 7.0.1 read-pkg-up: 10.1.0 recursive-readdir: 2.2.3 - semver: 7.7.2 + semver: 7.7.3 type-fest: 4.41.0 yargs: 17.7.2 transitivePeerDependencies: @@ -7587,17 +7457,17 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.4.1: + debug@4.4.3: dependencies: ms: 2.1.3 - debug@4.4.1(supports-color@5.5.0): + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - debug@4.4.1(supports-color@8.1.1): + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: @@ -7640,30 +7510,32 @@ snapshots: dequal@2.0.3: {} - detect-libc@2.0.4: {} + detect-libc@2.1.2: {} devtools-protocol@0.0.1232444: {} devtools@8.42.0: dependencies: - '@types/node': 22.17.2 + '@types/node': 22.18.12 '@wdio/config': 8.41.0 '@wdio/logger': 8.38.0 '@wdio/protocols': 8.40.3 '@wdio/types': 8.41.0 '@wdio/utils': 8.41.0 - chrome-launcher: 1.2.0 + chrome-launcher: 1.2.1 edge-paths: 3.0.5 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 puppeteer-core: 21.11.0 query-selector-shadow-dom: 1.0.1 ua-parser-js: 1.0.41 uuid: 10.0.0 which: 4.0.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil - encoding + - react-native-b4a - supports-color - utf-8-validate @@ -7703,7 +7575,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv@17.2.1: {} + dotenv@17.2.3: {} dunder-proto@1.0.1: dependencies: @@ -7738,7 +7610,7 @@ snapshots: edgedriver@5.6.1: dependencies: '@wdio/logger': 8.38.0 - '@zip.js/zip.js': 2.7.72 + '@zip.js/zip.js': 2.8.8 decamelize: 6.0.1 edge-paths: 3.0.5 fast-xml-parser: 4.5.3 @@ -7748,10 +7620,10 @@ snapshots: edgedriver@6.1.2: dependencies: '@wdio/logger': 9.18.0 - '@zip.js/zip.js': 2.7.72 + '@zip.js/zip.js': 2.8.8 decamelize: 6.0.1 edge-paths: 3.0.5 - fast-xml-parser: 5.2.5 + fast-xml-parser: 5.3.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 node-fetch: 3.3.2 @@ -7763,7 +7635,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.207: {} + electron-to-chromium@1.5.240: {} emoji-regex@8.0.0: {} @@ -7781,7 +7653,7 @@ snapshots: enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.3.0 entities@4.5.0: {} @@ -7789,7 +7661,7 @@ snapshots: env-paths@2.2.1: {} - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -7881,63 +7753,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.6: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 - - esbuild@0.25.9: + esbuild@0.25.11: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 escalade@3.2.0: {} @@ -7957,25 +7800,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 + eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)): + dependencies: + eslint: 9.38.0(jiti@2.6.1) + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.10 + resolve: 1.22.11 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -7984,9 +7831,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -7998,32 +7845,41 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-unicorn@59.0.1(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)))(eslint@9.38.0(jiti@2.6.1))(prettier@3.6.2): + dependencies: + eslint: 9.38.0(jiti@2.6.1) + prettier: 3.6.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.11 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@9.38.0(jiti@2.6.1)) + + eslint-plugin-unicorn@59.0.1(eslint@9.38.0(jiti@2.6.1)): dependencies: - '@babel/helper-validator-identifier': 7.27.1 - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@babel/helper-validator-identifier': 7.28.5 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) '@eslint/plugin-kit': 0.2.8 - ci-info: 4.3.0 + ci-info: 4.3.1 clean-regexp: 1.0.0 - core-js-compat: 3.45.1 - eslint: 9.33.0(jiti@2.5.1) + core-js-compat: 3.46.0 + eslint: 9.38.0(jiti@2.6.1) esquery: 1.6.0 find-up-simple: 1.0.1 - globals: 16.3.0 + globals: 16.4.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 jsesc: 3.1.0 pluralize: 8.0.0 regexp-tree: 0.1.27 regjsparser: 0.12.0 - semver: 7.7.2 - strip-indent: 4.0.0 + semver: 7.7.3 + strip-indent: 4.1.1 eslint-scope@8.4.0: dependencies: @@ -8034,25 +7890,24 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.33.0(jiti@2.5.1): + eslint@9.38.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.1 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.33.0 - '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.38.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -8072,7 +7927,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -8104,6 +7959,12 @@ snapshots: event-target-shim@5.0.1: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.1 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} execa@9.6.0: @@ -8116,7 +7977,7 @@ snapshots: is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 - pretty-ms: 9.2.0 + pretty-ms: 9.3.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 yoctocolors: 2.1.2 @@ -8125,30 +7986,30 @@ snapshots: expect-type@1.2.2: {} - expect-webdriverio@5.4.0(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)): + expect-webdriverio@5.4.3(@wdio/globals@9.17.0)(@wdio/logger@9.18.0)(webdriverio@9.20.0(puppeteer-core@21.11.0)): dependencies: '@vitest/snapshot': 3.2.4 - '@wdio/globals': 9.17.0(expect-webdriverio@5.4.0)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + '@wdio/globals': 9.17.0(expect-webdriverio@5.4.3)(webdriverio@9.20.0(puppeteer-core@21.11.0)) '@wdio/logger': 9.18.0 - expect: 30.0.4 - jest-matcher-utils: 30.0.4 - lodash.isequal: 4.5.0 - webdriverio: 9.19.1(puppeteer-core@21.11.0) + deep-eql: 5.0.2 + expect: 30.2.0 + jest-matcher-utils: 30.2.0 + webdriverio: 9.20.0(puppeteer-core@21.11.0) - expect@30.0.4: + expect@30.2.0: dependencies: - '@jest/expect-utils': 30.0.4 - '@jest/get-type': 30.0.1 - jest-matcher-utils: 30.0.4 - jest-message-util: 30.0.2 - jest-mock: 30.0.2 - jest-util: 30.0.2 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 exsolve@1.0.7: {} extract-zip@2.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -8162,6 +8023,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-fifo@1.3.2: {} fast-glob@3.3.3: @@ -8174,13 +8037,13 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-json-stringify@6.0.1: + fast-json-stringify@6.1.1: dependencies: '@fastify/merge-json-schemas': 0.2.1 ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) - fast-uri: 3.0.6 - json-schema-ref-resolver: 2.0.1 + fast-uri: 3.1.0 + json-schema-ref-resolver: 3.0.0 rfdc: 1.4.1 fast-levenshtein@2.0.6: {} @@ -8189,38 +8052,36 @@ snapshots: dependencies: fast-decode-uri-component: 1.0.1 - fast-redact@3.5.0: {} - - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fast-xml-parser@4.5.3: dependencies: strnum: 1.1.2 - fast-xml-parser@5.2.5: + fast-xml-parser@5.3.0: dependencies: strnum: 2.1.1 fastest-levenshtein@1.0.16: {} - fastify-plugin@5.0.1: {} + fastify-plugin@5.1.0: {} - fastify@5.5.0: + fastify@5.6.1: dependencies: - '@fastify/ajv-compiler': 4.0.2 + '@fastify/ajv-compiler': 4.0.5 '@fastify/error': 4.2.0 '@fastify/fast-json-stringify-compiler': 5.0.3 - '@fastify/proxy-addr': 5.0.0 + '@fastify/proxy-addr': 5.1.0 abstract-logging: 2.0.1 avvio: 9.1.0 - fast-json-stringify: 6.0.1 + fast-json-stringify: 6.1.1 find-my-way: 9.3.0 light-my-request: 6.6.0 - pino: 9.9.0 + pino: 9.14.0 process-warning: 5.0.0 rfdc: 1.4.1 - secure-json-parse: 4.0.0 - semver: 7.7.2 + secure-json-parse: 4.1.0 + semver: 7.7.3 toad-cache: 3.7.0 fastq@1.19.1: @@ -8250,7 +8111,7 @@ snapshots: file-entry-cache@10.1.4: dependencies: - flat-cache: 6.1.13 + flat-cache: 6.1.18 file-entry-cache@8.0.0: dependencies: @@ -8292,11 +8153,11 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.13: + flat-cache@6.1.18: dependencies: - cacheable: 1.10.4 + cacheable: 2.1.1 flatted: 3.3.3 - hookified: 1.12.0 + hookified: 1.12.2 flatted@3.3.3: {} @@ -8315,7 +8176,7 @@ snapshots: fraction.js@4.3.7: {} - fs-extra@11.3.1: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 @@ -8353,27 +8214,33 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 node-fetch: 3.3.2 - tar-fs: 3.1.0 + tar-fs: 3.1.1 unzipper: 0.10.14 which: 4.0.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color geckodriver@5.0.0: dependencies: '@wdio/logger': 9.18.0 - '@zip.js/zip.js': 2.7.72 + '@zip.js/zip.js': 2.8.8 decamelize: 6.0.1 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 node-fetch: 3.3.2 - tar-fs: 3.1.0 + tar-fs: 3.1.1 which: 5.0.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a - supports-color + generator-function@2.0.1: {} + get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -8411,7 +8278,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.1: + get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -8419,7 +8286,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8476,7 +8343,7 @@ snapshots: globals@15.15.0: {} - globals@16.3.0: {} + globals@16.4.0: {} globalthis@1.0.4: dependencies: @@ -8532,7 +8399,7 @@ snapshots: he@1.2.0: {} - hookified@1.12.0: {} + hookified@1.12.2: {} hosted-git-info@2.8.9: {} @@ -8568,14 +8435,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8585,6 +8452,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore-by-default@1.0.1: {} @@ -8602,7 +8473,7 @@ snapshots: import-lazy@4.0.0: {} - import-meta-resolve@4.1.0: {} + import-meta-resolve@4.2.0: {} imurmurhash@0.1.4: {} @@ -8621,17 +8492,17 @@ snapshots: ini@2.0.0: {} - inquirer@12.9.3(@types/node@24.3.0): + inquirer@12.10.0(@types/node@24.9.1): dependencies: - '@inquirer/core': 10.1.15(@types/node@24.3.0) - '@inquirer/prompts': 7.8.3(@types/node@24.3.0) - '@inquirer/type': 3.0.8(@types/node@24.3.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@24.9.1) + '@inquirer/prompts': 7.9.0(@types/node@24.9.1) + '@inquirer/type': 3.0.9(@types/node@24.9.1) mute-stream: 2.0.0 run-async: 4.0.6 rxjs: 7.8.2 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 internal-slot@1.1.0: dependencies: @@ -8703,9 +8574,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -8809,52 +8681,52 @@ snapshots: filelist: 1.0.4 picocolors: 1.1.1 - jest-diff@30.0.4: + jest-diff@30.2.0: dependencies: '@jest/diff-sequences': 30.0.1 - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 chalk: 4.1.2 - pretty-format: 30.0.2 + pretty-format: 30.2.0 - jest-matcher-utils@30.0.4: + jest-matcher-utils@30.2.0: dependencies: - '@jest/get-type': 30.0.1 + '@jest/get-type': 30.1.0 chalk: 4.1.2 - jest-diff: 30.0.4 - pretty-format: 30.0.2 + jest-diff: 30.2.0 + pretty-format: 30.2.0 - jest-message-util@30.0.2: + jest-message-util@30.2.0: dependencies: '@babel/code-frame': 7.27.1 - '@jest/types': 30.0.1 + '@jest/types': 30.2.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 - pretty-format: 30.0.2 + pretty-format: 30.2.0 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@30.0.2: + jest-mock@30.2.0: dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.3.0 - jest-util: 30.0.2 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 + jest-util: 30.2.0 jest-regex-util@30.0.1: {} - jest-util@30.0.2: + jest-util@30.2.0: dependencies: - '@jest/types': 30.0.1 - '@types/node': 24.3.0 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 chalk: 4.1.2 - ci-info: 4.3.0 + ci-info: 4.3.1 graceful-fs: 4.2.11 picomatch: 4.0.3 jiti@1.21.7: {} - jiti@2.5.1: {} + jiti@2.6.1: {} jju@1.4.0: {} @@ -8878,7 +8750,7 @@ snapshots: json-parse-even-better-errors@3.0.2: {} - json-schema-ref-resolver@2.0.1: + json-schema-ref-resolver@3.0.0: dependencies: dequal: 2.0.3 @@ -8911,9 +8783,9 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.5.0: + keyv@5.5.3: dependencies: - '@keyv/serialize': 1.1.0 + '@keyv/serialize': 1.1.1 kind-of@6.0.3: {} @@ -8946,57 +8818,59 @@ snapshots: lighthouse-logger@2.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 marky: 1.3.0 transitivePeerDependencies: - supports-color - lightningcss-darwin-arm64@1.30.1: + lightningcss-android-arm64@1.30.2: optional: true - lightningcss-darwin-x64@1.30.1: + lightningcss-darwin-arm64@1.30.2: optional: true - lightningcss-freebsd-x64@1.30.1: + lightningcss-darwin-x64@1.30.2: optional: true - lightningcss-linux-arm-gnueabihf@1.30.1: + lightningcss-freebsd-x64@1.30.2: optional: true - lightningcss-linux-arm64-gnu@1.30.1: + lightningcss-linux-arm-gnueabihf@1.30.2: optional: true - lightningcss-linux-arm64-musl@1.30.1: + lightningcss-linux-arm64-gnu@1.30.2: optional: true - lightningcss-linux-x64-gnu@1.30.1: + lightningcss-linux-arm64-musl@1.30.2: optional: true - lightningcss-linux-x64-musl@1.30.1: + lightningcss-linux-x64-gnu@1.30.2: optional: true - lightningcss-win32-arm64-msvc@1.30.1: + lightningcss-linux-x64-musl@1.30.2: optional: true - lightningcss-win32-x64-msvc@1.30.1: + lightningcss-win32-arm64-msvc@1.30.2: optional: true - lightningcss@1.30.1: + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 optionalDependencies: - lightningcss-darwin-arm64: 1.30.1 - lightningcss-darwin-x64: 1.30.1 - lightningcss-freebsd-x64: 1.30.1 - lightningcss-linux-arm-gnueabihf: 1.30.1 - lightningcss-linux-arm64-gnu: 1.30.1 - lightningcss-linux-arm64-musl: 1.30.1 - lightningcss-linux-x64-gnu: 1.30.1 - lightningcss-linux-x64-musl: 1.30.1 - lightningcss-win32-arm64-msvc: 1.30.1 - lightningcss-win32-x64-msvc: 1.30.1 - - lilconfig@2.1.0: {} + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 lilconfig@3.1.3: {} @@ -9031,7 +8905,7 @@ snapshots: local-pkg@1.1.2: dependencies: - mlly: 1.7.4 + mlly: 1.8.0 pkg-types: 2.3.0 quansync: 0.2.11 @@ -9057,8 +8931,6 @@ snapshots: lodash.flattendeep@4.4.0: {} - lodash.isequal@4.5.0: {} - lodash.merge@4.6.2: {} lodash.mergewith@4.6.2: {} @@ -9077,7 +8949,7 @@ snapshots: loglevel@1.9.2: {} - loupe@3.2.0: {} + loupe@3.2.1: {} lower-case@2.0.2: dependencies: @@ -9085,7 +8957,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.2: {} lru-cache@6.0.0: dependencies: @@ -9097,7 +8969,7 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.17: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -9124,8 +8996,6 @@ snapshots: mime@3.0.0: {} - min-indent@1.0.1: {} - minimatch@10.0.3: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -9146,10 +9016,6 @@ snapshots: minipass@7.1.2: {} - minizlib@3.0.2: - dependencies: - minipass: 7.1.2 - mitt@3.0.1: {} mkdirp-classic@0.5.3: {} @@ -9160,9 +9026,7 @@ snapshots: mkdirp@2.1.6: {} - mkdirp@3.0.1: {} - - mlly@1.7.4: + mlly@1.8.0: dependencies: acorn: 8.15.0 pathe: 2.0.3 @@ -9210,16 +9074,16 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-releases@2.0.19: {} + node-releases@2.0.26: {} nodemon@3.1.10: dependencies: chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 7.7.2 + semver: 7.7.3 simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.1 @@ -9228,20 +9092,20 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.10 + resolve: 1.22.11 semver: 5.7.2 validate-npm-package-license: 3.0.4 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-package-data@7.0.1: dependencies: hosted-git-info: 8.1.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -9357,7 +9221,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -9373,7 +9237,7 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@1.3.0: {} + package-manager-detector@1.5.0: {} pad-right@0.2.2: dependencies: @@ -9387,20 +9251,20 @@ snapshots: parse-json@4.0.0: dependencies: - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-better-errors: 1.0.2 parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@7.1.1: dependencies: '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-even-better-errors: 3.0.2 lines-and-columns: 2.0.4 type-fest: 3.13.1 @@ -9447,7 +9311,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.2 minipass: 7.1.2 path-type@3.0.0: @@ -9482,10 +9346,10 @@ snapshots: pino-std-serializers@7.0.0: {} - pino@9.9.0: + pino@9.14.0: dependencies: + '@pinojs/redact': 0.4.0 atomic-sleep: 1.0.0 - fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 @@ -9501,7 +9365,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 pkg-types@2.3.0: @@ -9523,30 +9387,44 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.11 - postcss-js@4.0.1(postcss@8.5.6): + postcss-js@4.1.0(postcss@8.5.6): dependencies: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-lit@1.2.0(postcss@8.5.6): + postcss-lit@1.3.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.3 - '@babel/traverse': 7.28.3 - lilconfig: 2.1.0 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + lilconfig: 3.1.3 postcss: 8.5.6 + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: + - jiti - supports-color + - tsx + - yaml + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.6 + tsx: 4.20.6 + yaml: 2.8.1 - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 - yaml: 2.8.0 optionalDependencies: + jiti: 2.6.1 postcss: 8.5.6 - ts-node: 10.9.2(@types/node@24.3.0)(typescript@5.9.2) + tsx: 4.20.6 + yaml: 2.8.1 postcss-nested@6.2.0(postcss@8.5.6): dependencies: @@ -9577,23 +9455,29 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.27.1: {} + preact@10.27.2: {} prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.6.2: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@30.0.2: + pretty-format@30.2.0: dependencies: - '@jest/schemas': 30.0.1 + '@jest/schemas': 30.0.5 ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-ms@9.2.0: + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -9612,7 +9496,7 @@ snapshots: proxy-agent@6.3.1: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.3.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -9625,7 +9509,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -9655,11 +9539,17 @@ snapshots: devtools-protocol: 0.0.1232444 ws: 8.16.0 transitivePeerDependencies: + - bare-abort-controller - bufferutil - encoding + - react-native-b4a - supports-color - utf-8-validate + qified@0.5.1: + dependencies: + hookified: 1.12.2 + quansync@0.2.11: {} query-selector-shadow-dom@1.0.1: {} @@ -9798,7 +9688,7 @@ snapshots: dependencies: resolve-from: 5.0.0 - resolve@1.22.10: + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 @@ -9820,30 +9710,32 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.47.0: + rollup@4.52.5: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.47.0 - '@rollup/rollup-android-arm64': 4.47.0 - '@rollup/rollup-darwin-arm64': 4.47.0 - '@rollup/rollup-darwin-x64': 4.47.0 - '@rollup/rollup-freebsd-arm64': 4.47.0 - '@rollup/rollup-freebsd-x64': 4.47.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.47.0 - '@rollup/rollup-linux-arm-musleabihf': 4.47.0 - '@rollup/rollup-linux-arm64-gnu': 4.47.0 - '@rollup/rollup-linux-arm64-musl': 4.47.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.47.0 - '@rollup/rollup-linux-ppc64-gnu': 4.47.0 - '@rollup/rollup-linux-riscv64-gnu': 4.47.0 - '@rollup/rollup-linux-riscv64-musl': 4.47.0 - '@rollup/rollup-linux-s390x-gnu': 4.47.0 - '@rollup/rollup-linux-x64-gnu': 4.47.0 - '@rollup/rollup-linux-x64-musl': 4.47.0 - '@rollup/rollup-win32-arm64-msvc': 4.47.0 - '@rollup/rollup-win32-ia32-msvc': 4.47.0 - '@rollup/rollup-win32-x64-msvc': 4.47.0 + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 run-async@4.0.6: {} @@ -9891,7 +9783,7 @@ snapshots: safer-buffer@2.1.2: {} - secure-json-parse@4.0.0: {} + secure-json-parse@4.1.0: {} seed-random@2.2.0: {} @@ -9907,7 +9799,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.2: {} + semver@7.7.3: {} serialize-error@12.0.0: dependencies: @@ -9989,9 +9881,9 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 - sirv@3.0.1: + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 @@ -10010,7 +9902,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -10065,7 +9957,7 @@ snapshots: statuses@2.0.1: {} - std-env@3.9.0: {} + std-env@3.10.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -10076,12 +9968,14 @@ snapshots: stream-shift@1.0.3: {} - streamx@2.22.1: + streamx@2.23.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.6.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a string-argv@0.3.1: {} @@ -10097,7 +9991,7 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string.prototype.padend@3.1.6: dependencies: @@ -10141,21 +10035,19 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.2.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} strip-final-newline@4.0.0: {} - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 + strip-indent@4.1.1: {} strip-json-comments@3.1.1: {} - strip-literal@3.0.0: + strip-literal@3.1.0: dependencies: js-tokens: 9.0.1 @@ -10163,18 +10055,18 @@ snapshots: strnum@2.1.1: {} - style-mod@4.1.2: {} + style-mod@4.1.3: {} - stylelint-config-recommended@17.0.0(stylelint@16.24.0(typescript@5.9.2)): + stylelint-config-recommended@17.0.0(stylelint@16.25.0(typescript@5.9.3)): dependencies: - stylelint: 16.24.0(typescript@5.9.2) + stylelint: 16.25.0(typescript@5.9.3) - stylelint-config-tailwindcss@1.0.0(stylelint@16.24.0(typescript@5.9.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2))): + stylelint-config-tailwindcss@1.0.0(stylelint@16.25.0(typescript@5.9.3))(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)): dependencies: - stylelint: 16.24.0(typescript@5.9.2) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + stylelint: 16.25.0(typescript@5.9.3) + tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1) - stylelint@16.24.0(typescript@5.9.2): + stylelint@16.25.0(typescript@5.9.3): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -10183,10 +10075,10 @@ snapshots: '@dual-bundle/import-meta-resolve': 4.2.1 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.9.2) + cosmiconfig: 9.0.0(typescript@5.9.3) css-functions-list: 3.2.3 css-tree: 3.1.0 - debug: 4.4.1 + debug: 4.4.3 fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 file-entry-cache: 10.1.4 @@ -10249,6 +10141,10 @@ snapshots: svg-tags@1.0.0: {} + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + table@6.9.0: dependencies: ajv: 8.17.1 @@ -10257,7 +10153,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)): + tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -10275,53 +10171,55 @@ snapshots: picocolors: 1.1.1 postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2)) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 - resolve: 1.22.10 + resolve: 1.22.11 sucrase: 3.35.0 transitivePeerDependencies: - - ts-node + - tsx + - yaml - tailwindcss@4.1.12: {} + tailwindcss@4.1.16: {} - tapable@2.2.2: {} + tapable@2.3.0: {} tar-fs@3.0.4: dependencies: mkdirp-classic: 0.5.3 pump: 3.0.3 tar-stream: 3.1.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - tar-fs@3.1.0: + tar-fs@3.1.1: dependencies: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.2.1 + bare-fs: 4.5.0 bare-path: 3.0.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer + - react-native-b4a tar-stream@3.1.7: dependencies: - b4a: 1.6.7 + b4a: 1.7.3 fast-fifo: 1.3.2 - streamx: 2.22.1 - - tar@7.4.3: - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.2 - mkdirp: 3.0.1 - yallist: 5.0.0 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a text-decoder@1.2.3: dependencies: - b4a: 1.6.7 + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a thenify-all@1.6.0: dependencies: @@ -10345,7 +10243,7 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 @@ -10356,7 +10254,7 @@ snapshots: tinyrainbow@2.0.0: {} - tinyspy@4.0.3: {} + tinyspy@4.0.4: {} tmp@0.2.3: {} @@ -10378,45 +10276,27 @@ snapshots: traverse@0.3.9: {} - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 24.3.0 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.8.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - ts-node@10.9.2(@types/node@24.3.0)(typescript@5.9.2): + ts-node@10.9.2(@types/node@24.9.1)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.3.0 + '@types/node': 24.9.1 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.2 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -10435,17 +10315,10 @@ snapshots: tslib@2.8.1: {} - tsx@4.20.3: + tsx@4.20.6: dependencies: - esbuild: 0.25.6 - get-tsconfig: 4.10.1 - optionalDependencies: - fsevents: 2.3.3 - - tsx@4.20.4: - dependencies: - esbuild: 0.25.9 - get-tsconfig: 4.10.1 + esbuild: 0.25.11 + get-tsconfig: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -10453,8 +10326,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.21.3: {} - type-fest@0.6.0: {} type-fest@0.8.1: {} @@ -10502,9 +10373,7 @@ snapshots: typescript@5.8.2: {} - typescript@5.8.3: {} - - typescript@5.9.2: {} + typescript@5.9.3: {} ua-parser-js@1.0.41: {} @@ -10526,29 +10395,27 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.10.0: {} + undici-types@7.16.0: {} - undici@6.21.3: {} + undici@6.22.0: {} - undici@7.14.0: {} + undici@7.16.0: {} unicorn-magic@0.3.0: {} universalify@2.0.1: {} - unplugin-icons@22.2.0(vue-template-compiler@2.7.15): + unplugin-icons@22.5.0: dependencies: '@antfu/install-pkg': 1.1.0 - '@iconify/utils': 2.3.0 - debug: 4.4.1 + '@iconify/utils': 3.0.2 + debug: 4.4.3 local-pkg: 1.1.2 - unplugin: 2.3.8 - optionalDependencies: - vue-template-compiler: 2.7.15 + unplugin: 2.3.10 transitivePeerDependencies: - supports-color - unplugin@2.3.8: + unplugin@2.3.10: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.15.0 @@ -10568,9 +10435,9 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - update-browserslist-db@1.1.3(browserslist@4.25.3): + update-browserslist-db@1.1.4(browserslist@4.27.0): dependencies: - browserslist: 4.25.3 + browserslist: 4.27.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -10603,13 +10470,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1 + debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) + vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -10624,75 +10491,75 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@24.3.0)(rollup@4.47.0)(typescript@5.9.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0)): + vite-plugin-dts@4.5.4(@types/node@24.9.1)(rollup@4.52.5)(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.52.11(@types/node@24.3.0) - '@rollup/pluginutils': 5.2.0(rollup@4.47.0) + '@microsoft/api-extractor': 7.53.3(@types/node@24.9.1) + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) '@volar/typescript': 2.4.23 - '@vue/language-core': 2.2.0(typescript@5.9.2) + '@vue/language-core': 2.2.0(typescript@5.9.3) compare-versions: 6.1.1 - debug: 4.4.1 + debug: 4.4.3 kolorist: 1.8.0 local-pkg: 1.1.2 - magic-string: 0.30.17 - typescript: 5.9.2 + magic-string: 0.30.21 + typescript: 5.9.3 optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) + vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-singlefile@2.3.0(rollup@4.47.0)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0)): + vite-plugin-singlefile@2.3.0(rollup@4.52.5)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)): dependencies: micromatch: 4.0.8 - rollup: 4.47.0 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) + rollup: 4.52.5 + vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0): + vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.47.0 - tinyglobby: 0.2.14 + rollup: 4.52.5 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 fsevents: 2.3.3 - jiti: 2.5.1 - lightningcss: 1.30.1 - tsx: 4.20.4 - yaml: 2.8.0 + jiti: 2.6.1 + lightningcss: 1.30.2 + tsx: 4.20.6 + yaml: 2.8.1 - vitest@3.2.4(@types/node@24.3.0)(@vitest/browser@3.2.4)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0): + vitest@3.2.4(@types/node@24.9.1)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@types/chai': 5.2.2 + '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.3.1 - debug: 4.4.1 + chai: 5.3.3 + debug: 4.4.3 expect-type: 1.2.2 - magic-string: 0.30.17 + magic-string: 0.30.21 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.9.0 + std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0) + vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.3.0 - '@vitest/browser': 3.2.4(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.4)(yaml@2.8.0))(vitest@3.2.4)(webdriverio@9.19.1(puppeteer-core@21.11.0)) + '@types/node': 24.9.1 + '@vitest/browser': 3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(puppeteer-core@21.11.0)) transitivePeerDependencies: - jiti - less @@ -10709,19 +10576,13 @@ snapshots: vscode-uri@3.1.0: {} - vue-template-compiler@2.7.15: - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - optional: true - w3c-keyname@2.2.8: {} wait-port@1.1.0: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -10734,7 +10595,7 @@ snapshots: webdriver@9.18.0: dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@types/ws': 8.18.1 '@wdio/config': 9.18.0 '@wdio/logger': 9.18.0 @@ -10743,36 +10604,40 @@ snapshots: '@wdio/utils': 9.18.0 deepmerge-ts: 7.1.5 https-proxy-agent: 7.0.6 - undici: 6.21.3 + undici: 6.22.0 ws: 8.18.3 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil + - react-native-b4a - supports-color - utf-8-validate - webdriver@9.19.1: + webdriver@9.20.0: dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@types/ws': 8.18.1 - '@wdio/config': 9.19.1 + '@wdio/config': 9.20.0 '@wdio/logger': 9.18.0 '@wdio/protocols': 9.16.2 - '@wdio/types': 9.19.1 - '@wdio/utils': 9.19.1 + '@wdio/types': 9.20.0 + '@wdio/utils': 9.20.0 deepmerge-ts: 7.1.5 https-proxy-agent: 7.0.6 - undici: 6.21.3 + undici: 6.22.0 ws: 8.18.3 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil + - react-native-b4a - supports-color - utf-8-validate webdriverio@9.18.0(puppeteer-core@21.11.0): dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@types/sinonjs__fake-timers': 8.1.5 '@wdio/config': 9.18.0 '@wdio/logger': 9.18.0 @@ -10800,21 +10665,23 @@ snapshots: optionalDependencies: puppeteer-core: 21.11.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil + - react-native-b4a - supports-color - utf-8-validate - webdriverio@9.19.1(puppeteer-core@21.11.0): + webdriverio@9.20.0(puppeteer-core@21.11.0): dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.23 '@types/sinonjs__fake-timers': 8.1.5 - '@wdio/config': 9.19.1 + '@wdio/config': 9.20.0 '@wdio/logger': 9.18.0 '@wdio/protocols': 9.16.2 '@wdio/repl': 9.16.2 - '@wdio/types': 9.19.1 - '@wdio/utils': 9.19.1 + '@wdio/types': 9.20.0 + '@wdio/utils': 9.20.0 archiver: 7.0.1 aria-query: 5.3.2 cheerio: 1.1.2 @@ -10831,12 +10698,14 @@ snapshots: rgb2hex: 0.2.5 serialize-error: 12.0.0 urlpattern-polyfill: 10.1.0 - webdriver: 9.19.1 + webdriver: 9.20.0 optionalDependencies: puppeteer-core: 21.11.0 transitivePeerDependencies: + - bare-abort-controller - bare-buffer - bufferutil + - react-native-b4a - supports-color - utf-8-validate @@ -10871,7 +10740,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 @@ -10933,9 +10802,9 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -10954,9 +10823,7 @@ snapshots: yallist@4.0.0: {} - yallist@5.0.0: {} - - yaml@2.8.0: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6234325..8b4edab 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,7 @@ # pnpm-workspace.yaml packages: - - 'packages/*' + - 'packages/backend' + - 'packages/script' + - 'packages/service' + - 'packages/app' - 'example' diff --git a/tsconfig.json b/tsconfig.json index c9a94d2..c3e1ffc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,6 +24,9 @@ "@/*": ["packages/app/src/*"], "@components/*": ["packages/app/src/components/*"], "@core/*": ["packages/app/src/core/*"], + + "@wdio/devtools-service": ["packages/service/src/index.ts"], + "@wdio/devtools-service/*": ["packages/service/src/*"] } } }