diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index d100808276fe..687ee7a35c4e 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,3 +1,8 @@ -01dd06acceb957ae824d346a5ff8736ee7320c8a -b6dc0edc94cebdee74d67f5919f46c28cd96b9f8 -a62b707f3d893f424458b9453e938071e4271c6e +01dd06acceb957ae824d346a5ff8736ee7320c8a # ESM imports +b6dc0edc94cebdee74d67f5919f46c28cd96b9f8 # imports/functions +a62b707f3d893f424458b9453e938071e4271c6e # prettier CSS/GQL +321cd93154ea24874e77af803c167e28e8db86b6 # dprint Svelte +969c06f9b981819f0ba943a98afe7f0148d9a5e3 # dprint CSS +c0e15f48290869d944227bcb4dab5b31e3473e90 # dprint TS +3dd997a0edb7428086c708fd9f52ff99f26478f4 # sort imports +938bc983da8f3f8e1caadce18fa47d67c5d7a22a # sort imports diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 318e62807556..fe5cf88839eb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -67,7 +67,7 @@ jobs: steps: - uses: actions/download-artifact@v8 - name: Create release notes - run: echo "{\"release_notes\":{\"en-US\":\"https://github.com/${{ github.repository }}/releases/tag/${{ needs.Version.outputs.version }}\"}}" > /tmp/amo-metadata.json + run: echo "{\"version\":{\"release_notes\":{\"en-US\":\"https://github.com/${{ github.repository }}/releases/tag/${{ needs.Version.outputs.version }}\"}}}" > /tmp/amo-metadata.json - name: Upload build and source code run: npx web-ext@9 sign --channel listed --amo-metadata /tmp/amo-metadata.json env: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5ffc6a325c7a..bc988e0afa82 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -64,7 +64,8 @@ jobs: node-version-file: package.json cache: npm - run: npm ci - - run: npm run lint + - run: npm run lint:eslint + - run: npm run lint:biome - uses: codespell-project/actions-codespell@v2 with: ignore_words_list: eror,usera @@ -82,6 +83,19 @@ jobs: - run: npm ci - run: npm run build:typescript + Format: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version-file: package.json + cache: npm + - run: npm ci + - run: npm run format:check + Build: strategy: matrix: diff --git a/.ncurc.json b/.ncurc.json index 2deb23dcf7e7..1913fa584153 100644 --- a/.ncurc.json +++ b/.ncurc.json @@ -1,3 +1,3 @@ { - "reject": ["@types/react", "fit-textarea"] + "reject": ["@types/react"] } diff --git a/.prettierignore b/.prettierignore index 59922da7af85..01b5dbbe7b03 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,2 @@ # Ensure Prettier is not automatically run by editors on unwanted files *.* -# Only svelte files are covered -# TODO: After https://github.com/biomejs/biome/issues/6657 -!*.svelte diff --git a/build/__snapshots__/features-meta.json b/build/__snapshots__/features-meta.json index 3d48ade8b331..4be0629f4eac 100644 --- a/build/__snapshots__/features-meta.json +++ b/build/__snapshots__/features-meta.json @@ -52,6 +52,13 @@ "css": true, "screenshot": "https://github-production-user-asset-6210df.s3.amazonaws.com/1402241/237923995-5e14a272-0bf2-4fe4-b409-8c05378aa4fd.png" }, + { + "id": "clean-checks-list", + "description": "Prioritizes failing and pending checks in the merge checks list, and untruncates long check names.", + "css": true, + "cssOnly": true, + "screenshot": null + }, { "id": "clean-conversation-filters", "description": "Hides Projects filter in issue/PR lists if it is empty.", @@ -69,6 +76,20 @@ "css": true, "screenshot": "https://github-production-user-asset-6210df.s3.amazonaws.com/83146190/253054419-48c38c01-b1dc-42ca-9ff6-fd63392b5921.png" }, + { + "id": "clean-footer", + "description": "Dims the site footer so it's less prominent.", + "css": true, + "cssOnly": true, + "screenshot": null + }, + { + "id": "clean-notifications", + "description": "Makes the notifications list more compact when grouped by repo.", + "css": true, + "cssOnly": true, + "screenshot": null + }, { "id": "clean-pinned-issues", "description": "Changes the layout of pinned issues from side-by-side to a standard list.", @@ -128,6 +149,11 @@ "description": "Shows the first Git tag a merged PR was included in or suggests creating a release if not yet released.", "screenshot": "https://user-images.githubusercontent.com/1402241/169497171-85d4a97f-413a-41b4-84ba-885dca2b51cf.png" }, + { + "id": "cmd-enter", + "description": "Fixes cmd enter to submit comments on closed PRs, which is broken.", + "screenshot": "https://github.com/user-attachments/assets/e972239b-6a28-42a4-9bac-fd71aa5a465f" + }, { "id": "collapsible-content-button", "description": "Adds a button in the text editor to insert collapsible content (via <details>).", @@ -247,7 +273,7 @@ }, { "id": "esc-to-cancel", - "description": "Adds a shortcut to cancel editing a issue/PR title: esc.", + "description": "Adds a shortcut to cancel editing a PR title: esc.", "screenshot": "https://user-images.githubusercontent.com/35100156/98303086-d81d2200-1fbd-11eb-8529-70d48d889bcf.gif" }, { @@ -292,6 +318,13 @@ "description": "In the workflows sidebar, shows an indicator that a workflow can be triggered manually, and its next scheduled time if relevant.", "screenshot": "https://github-production-user-asset-6210df.s3.amazonaws.com/83146190/252181237-a1d809b1-e5d4-4747-9654-7dde5ab5c61a.png" }, + { + "id": "github-bugs", + "description": "Applies various CSS fixes to GitHub's interface.", + "css": true, + "cssOnly": true, + "screenshot": null + }, { "id": "global-conversation-list-filters", "description": "Adds filters for PRs in your repos and commented on by you in the global PR search.", @@ -421,14 +454,9 @@ "description": "Makes certain text clickable, like issue references in the issue title and discussion sidebar.", "screenshot": "https://github.com/user-attachments/assets/1d31f695-c198-477e-a3ae-cc0687417a90" }, - { - "id": "linkify-user-edit-history-popup", - "description": "Linkifies the username in the edit history popup.", - "screenshot": "https://user-images.githubusercontent.com/1402241/88917988-9ebb7480-d260-11ea-8690-0a3440f1ebbc.png" - }, { "id": "linkify-user-labels", - "description": "Links the \"Contributor\", \"Member\" and \"Collaborator\" labels on comments to the author’s commits on the repo.", + "description": "Links the \"Contributor\", \"Member\" and \"Collaborator\" labels on comments and PRs to the author’s commits on the repo.", "css": true, "screenshot": "https://user-images.githubusercontent.com/1402241/177033344-4d4eea63-e075-4096-b2d4-f4b879f1df31.png" }, @@ -465,10 +493,25 @@ "screenshot": "https://github.com/user-attachments/assets/145a7a97-7b8c-4ac4-8288-f72dcb4613ea" }, { - "id": "mobile-tabs", - "description": "Makes the tabs more compact on mobile so more of them can be seen.", + "id": "mark-private-repos", + "description": "Highlights private repositories in the repository list with a distinct color.", + "css": true, + "cssOnly": true, + "screenshot": null + }, + { + "id": "mobile-tabs-pr", + "description": "Makes the PR tabs smaller so they fit in the screen without scrolling.", + "css": true, + "cssOnly": true, + "screenshot": null + }, + { + "id": "monospace-textareas", + "description": "Uses a monospace font in commit message, description, release body, and other fields that benefit from it.", "css": true, - "screenshot": "https://user-images.githubusercontent.com/1402241/245446231-28f44b59-0151-4986-8cb9-05b5645592d8.png" + "cssOnly": true, + "screenshot": null }, { "id": "more-dropdown-links", @@ -501,6 +544,13 @@ "description": "Automatically disables projects and wikis when creating a repository.", "screenshot": "https://github.com/user-attachments/assets/2537e5a0-f537-4901-8d11-96c1f536663e" }, + { + "id": "night-not-found", + "description": "Adds dark mode to the global 404 page.", + "css": true, + "cssOnly": true, + "screenshot": null + }, { "id": "no-duplicate-list-update-time", "description": "Hides the update time of issues/PRs in lists when it matches the open/closed/merged time.", @@ -524,8 +574,8 @@ }, { "id": "one-click-diff-options", - "description": "Adds one-click buttons to change diff style and to ignore the whitespace and a keyboard shortcut to ignore the whitespace: dw.", - "screenshot": "https://user-images.githubusercontent.com/46634000/156766044-18c9ff50-aead-4c40-ba16-7428b3742b6c.png" + "description": "Adds \"Hide whitespace\" button to Compare pages and a keyboard shortcut to PRs and Compare pages: dw.", + "screenshot": "https://github.com/user-attachments/assets/0b92992a-69a4-4de1-ab2a-cb6508870b4a" }, { "id": "one-click-pr-or-gist", @@ -579,6 +629,7 @@ "id": "pr-approvals-count", "description": "Shows color-coded review counts in PR lists.", "css": true, + "cssOnly": true, "screenshot": "https://github-production-user-asset-6210df.s3.amazonaws.com/83146190/253125143-d10d95df-4a89-4692-b218-5eba5cd79906.png" }, { @@ -690,11 +741,6 @@ "css": true, "screenshot": "https://github-production-user-asset-6210df.s3.amazonaws.com/83146190/261158402-5a79cc3e-4331-475f-8063-5ed81fefcf10.gif" }, - { - "id": "quick-new-issue", - "description": "Adds a link to create issues from anywhere in a repository.", - "screenshot": "https://github-production-user-asset-6210df.s3.amazonaws.com/1402241/274816033-820ec518-049d-4248-9f8a-27b9423e350b.png" - }, { "id": "quick-repo-deletion", "description": "Simplifies the deletion of repositories. Adds \"Delete fork\" button on 0-star repos. Enables shift alt clicks to delete repos in 2 clicks.", @@ -716,6 +762,20 @@ "css": true, "screenshot": "https://user-images.githubusercontent.com/1402241/236628453-8b646178-b838-44a3-9541-0a9b5f54a84a.png" }, + { + "id": "reactions-popup", + "description": "Improves the usability of the comment reactions popup by making it smaller.", + "css": true, + "cssOnly": true, + "screenshot": null + }, + { + "id": "readable-title-change-events", + "description": "Stacks the old and new titles in title change timeline events for better readability.", + "css": true, + "cssOnly": true, + "screenshot": null + }, { "id": "refined-github.css", "description": "Reduces tabs’ size to 4 spaces instead of 8 where GitHub doesn't follow the user’s preferences.", @@ -865,12 +925,28 @@ "id": "sticky-conversation-list-toolbar", "description": "Makes the issue/PR list’s filters toolbar sticky.", "css": true, + "cssOnly": true, "screenshot": "https://github-production-user-asset-6210df.s3.amazonaws.com/83146190/261164103-875b70f7-5adc-4bb2-b158-8d5231d47da2.gif" }, + { + "id": "sticky-csv-header", + "description": "Makes the first column of CSV/TSV file previews sticky while scrolling horizontally.", + "css": true, + "cssOnly": true, + "screenshot": null + }, + { + "id": "sticky-file-header", + "description": "Makes the file header sticky when scrolling through code diffs.", + "css": true, + "cssOnly": true, + "screenshot": null + }, { "id": "sticky-notifications-actions", "description": "Make the notifications action bar sticky.", "css": true, + "cssOnly": true, "screenshot": "https://github.com/refined-github/refined-github/assets/1402241/5b370430-2319-4c78-88e7-c2c06cd1c30f" }, { @@ -900,6 +976,13 @@ "description": "Uses the PR’s title as the default squash commit title and updates the PR’s title to match the commit title, if changed.", "screenshot": "https://github-production-user-asset-6210df.s3.amazonaws.com/140871606/257011579-25332762-b25f-407b-b6d2-bbfc13de2be7.png" }, + { + "id": "tab-size", + "description": "Reduces the default tab indent width from 8 to 4 characters in code views where GitHub doesn't follow the user's preferences.", + "css": true, + "cssOnly": true, + "screenshot": null + }, { "id": "tab-to-indent", "description": "Enables tab and shifttab for indentation in comment fields.", @@ -941,6 +1024,7 @@ { "id": "unread-anywhere", "description": "Adds a button to the global header to open your unread notifications from any page.", + "css": true, "screenshot": "https://github.com/user-attachments/assets/978ac1fe-db98-40f9-9b56-7d289849aa2f" }, { @@ -955,8 +1039,8 @@ }, { "id": "update-pr-from-base-branch", - "description": "Adds an \"Update branch\" button to every PR. GitHub has the same feature, but it must be manually configured with protected branches.", - "screenshot": "https://user-images.githubusercontent.com/1402241/234483592-4867cb2e-21cb-436d-9ea0-aedadf834f19.png" + "description": "Adds an \"Update branch | Rebase\" button to every PR. GitHub has the same feature, but it must be manually configured for each repo.", + "screenshot": "https://github.com/user-attachments/assets/7bd2745b-c57c-4c26-bbb8-b05e9cf089db" }, { "id": "useful-not-found-page", @@ -976,8 +1060,8 @@ }, { "id": "view-last-pr-deployment", - "description": "Adds a link to open the latest deployment from the header of a PR.", - "screenshot": "https://user-images.githubusercontent.com/44045911/232313171-b54ac9cc-ebb1-43ef-bd41-5d81ec9f9588.png" + "description": "Adds a link to open the latest deployment to the PR header.", + "screenshot": "https://github.com/user-attachments/assets/90d2498d-ef65-45b9-96eb-07e7988bea61" }, { "id": "visit-tag", diff --git a/build/__snapshots__/imported-features.json b/build/__snapshots__/imported-features.json index 9c3d37179aaf..7ca8da0ba1a4 100644 --- a/build/__snapshots__/imported-features.json +++ b/build/__snapshots__/imported-features.json @@ -23,6 +23,7 @@ "close-as-unplanned", "close-out-of-view-modals", "closing-remarks", + "cmd-enter", "collapsible-content-button", "command-palette-navigation-shortcuts", "comment-excess", @@ -78,7 +79,6 @@ "linkify-line-numbers", "linkify-symbolic-links", "linkify-text", - "linkify-user-edit-history-popup", "linkify-user-labels", "linkify-user-location", "list-prs-for-branch", @@ -127,7 +127,6 @@ "quick-file-edit", "quick-label-removal", "quick-mention", - "quick-new-issue", "quick-repo-deletion", "quick-review", "quick-review-comment-deletion", diff --git a/build/features.test.ts b/build/features.test.ts index a0d7d5847e7c..2e4e3e23f4b3 100755 --- a/build/features.test.ts +++ b/build/features.test.ts @@ -1,11 +1,11 @@ +import fastIgnore from 'fast-ignore'; import {existsSync, readdirSync, readFileSync} from 'node:fs'; import path from 'node:path'; -import {test, describe, assert} from 'vitest'; import {regexJoinWithSeparator} from 'regex-join'; -import fastIgnore from 'fast-ignore'; +import {assert, describe, test} from 'vitest'; import {isFeaturePrivate} from '../source/helpers/feature-utils.js'; -import {getImportedFeatures, getFeaturesMeta} from './readme-parser.js'; +import {getFeaturesMeta, getImportedFeatures} from './readme-parser.js'; // Re-run tests when these files change https://github.com/vitest-dev/vitest/discussions/5864 void import.meta.glob([ @@ -28,11 +28,26 @@ const noScreenshotExceptions = new Set([ 'selection-in-new-tab', 'click-outside-modal', 'same-page-links', + 'github-bugs', + 'tab-size', + 'monospace-textareas', 'hide-navigation-hover-highlight', // TODO: Add side-by-side gif 'hide-inactive-deployments', // TODO: side-by-side png 'esc-to-deselect-line', // TODO Add gif with key overlay 'scrollable-areas', // TODO: Add side-by-side png + + // CSS-only features without screenshots yet + 'reactions-popup', + 'clean-checks-list', + 'clean-footer', + 'clean-notifications', + 'mark-private-repos', + 'mobile-tabs-pr', + 'night-not-found', + 'readable-title-change-events', + 'sticky-csv-header', + 'sticky-file-header', ]); const entryPoint = 'source/refined-github.ts'; @@ -102,6 +117,11 @@ function validateCss(file: FeatureFile): void { ); assert(/test url/i.test(file.contents().toString()), 'Should have test URLs'); + + if (!isFeaturePrivate(file.name)) { + validateReadme(file.id); + } + return; } @@ -156,7 +176,10 @@ function validateTsx(file: FeatureFile): void { assert(/test url/i.test(file.contents().toString()), 'Should have test URLs'); - if (/api\.v4|getDefaultBranch|getPrInfo/.test(String(file.contents())) && /observe\(|delegate\(/.test(String(file.contents()))) { + if ( + /api\.v4|getDefaultBranch|getPrInfo/.test(String(file.contents())) + && /observe\(|delegate\(/.test(String(file.contents())) + ) { assert( /await expectToken|hasToken/.test(String(file.contents())), `${file.id} uses the v4 API, so it should include \`await expectToken()\` in its init function or, if the token is optional, \`hasToken\` anywhere`, @@ -216,6 +239,8 @@ describe('features', () => { return; } - assert.fail(`The \`/source/features\` folder should only contain .css, .tsx and .gql files. Found \`source/features/${filename}\``); + assert.fail( + `The \`/source/features\` folder should only contain .css, .tsx and .gql files. Found \`source/features/${filename}\``, + ); }); }); diff --git a/build/readme-parser.test.ts b/build/readme-parser.test.ts index 081c4ed06d7e..d86a18a5da8f 100644 --- a/build/readme-parser.test.ts +++ b/build/readme-parser.test.ts @@ -1,9 +1,6 @@ -import {test, expect} from 'vitest'; +import {expect, test} from 'vitest'; -import { - getFeaturesMeta, - getImportedFeatures, -} from './readme-parser.js'; +import {getFeaturesMeta, getImportedFeatures} from './readme-parser.js'; // Re-run tests when these files change https://github.com/vitest-dev/vitest/discussions/5864 void import.meta.glob([ diff --git a/build/readme-parser.ts b/build/readme-parser.ts index b9282f682098..7a65f9752a27 100644 --- a/build/readme-parser.ts +++ b/build/readme-parser.ts @@ -1,12 +1,13 @@ /// -import {regexJoinWithSeparator} from 'regex-join'; import {existsSync, readFileSync} from 'node:fs'; +import {regexJoinWithSeparator} from 'regex-join'; import parseMarkdown from 'snarkdown'; // Group names must be unique because they will be merged const simpleFeatureRegex = /^- \[\]\(# "(?[^"]+)"\)(?: 🔥)? (?.+)$/gm; -const highlightedFeatureRegex = /

<\/a> (?.+)\n\t+

/g; +const highlightedFeatureRegex + = /

<\/a> (?.+)\n\t+

/g; const featureRegex = regexJoinWithSeparator('|', [simpleFeatureRegex, highlightedFeatureRegex]); const imageRegex = /\.\w{3}$/; // 3 since .png and .gif have 3 letters const rghUploadsRegex = /refined-github[/]refined-github[/]assets[/]/; @@ -36,11 +37,15 @@ function extractDataFromMatch(match: RegExpMatchArray): FeatureMeta { } const linkLessMarkdownDescription = simpleDescription.replaceAll(/\[(.+?)\]\((.+?)\)/g, urlExtracter); + const hasCss = existsSync(`source/features/${simpleId}.css`); + const hasTsx = existsSync(`source/features/${simpleId}.tsx`); return { id: simpleId as FeatureId, description: parseMarkdown(linkLessMarkdownDescription), // `undefined` hides the key when CSS is missing - css: existsSync(`source/features/${simpleId}.css`) || undefined, + css: hasCss || undefined, + // `undefined` hides the key for features that have a .tsx file + cssOnly: (hasCss && !hasTsx) || undefined, // `null` makes the keys visible in the JSON file screenshot: urls.find(url => screenshotRegex.test(url)) ?? null, }; diff --git a/dprint.json b/dprint.json new file mode 100644 index 000000000000..32cb24a5a023 --- /dev/null +++ b/dprint.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://dprint.dev/schemas/v0.json", + "plugins": [ + "./node_modules/dprint-plugin-markup/plugin.wasm", + "./node_modules/dprint-plugin-malva/plugin.wasm", + "./node_modules/dprint-plugin-graphql/plugin.wasm", + "./node_modules/@dprint/json/plugin.wasm", + "./node_modules/dprint-plugin-yaml/plugin.wasm" + ], + "includes": [ + "**/*.{svelte,css,gql,yml}", + "dprint.json" + ], + "useTabs": true, + "markup": { + "whitespaceSensitivity": "strict", + "scriptIndent": true, + "styleIndent": true + }, + "malva": { + "linebreakInPseudoParens": true, + "quotes": "alwaysSingle" + }, + "graphql": {}, + "yaml": { + "quotes": "preferSingle" + } +} diff --git a/eslint-rules/no-optional-chaining.js b/eslint-rules/no-optional-chaining.js new file mode 100644 index 000000000000..63198ad95521 --- /dev/null +++ b/eslint-rules/no-optional-chaining.js @@ -0,0 +1,32 @@ +/** @type {import('eslint').Rule.RuleModule} */ +const noOptionalChaining = { + create(context) { + const {sourceCode} = context; + return { + 'MemberExpression[optional=true]'(node) { + // Exception: usage is on a line with an inline comment, or preceded by a comment explaining why + const currentLine = (sourceCode.lines[node.loc.start.line - 1] ?? ''); + const hasInlineComment = /\/\//.test(currentLine.slice(currentLine.indexOf('?.') + 2)); + const previousLine = (sourceCode.lines[node.loc.start.line - 2] ?? '').trim(); + if (hasInlineComment || previousLine.startsWith('//') || previousLine.endsWith('*/')) { + return; + } + + if (node.object.type === 'CallExpression' && node.object.callee.name === '$') { + context.report({ + node, + message: 'Either use $optional() with `?.` or $() without. $() will throw when the element is not found.', + }); + return; + } + + context.report({ + node, + message: 'Use `!.` instead of `?.`. Add a comment on the same or preceding line describing in which scenario the value can CURRENTLY be null. If you cannot find such a scenario, use `!.` instead.', + }); + }, + }; + }, +}; + +export default noOptionalChaining; diff --git a/eslint-rules/select-dom.js b/eslint-rules/select-dom.js new file mode 100644 index 000000000000..acdffa933c77 --- /dev/null +++ b/eslint-rules/select-dom.js @@ -0,0 +1,89 @@ +/** @type {import('eslint').Rule.RuleModule} */ +const rule = { + meta: { + type: 'suggestion', + fixable: 'code', + messages: { + useSelectDom: 'Use select-dom\'s {{replacement}}() instead of .{{method}}()', + }, + schema: [], + }, + create(context) { + const {sourceCode} = context; + return { + // X.closest(sel) → $closest(sel, x) or $closestOptional(sel, x) + 'CallExpression[callee.type=MemberExpression][callee.property.name=closest]'(node) { + const {object} = node.callee; + + // Determine parent, skipping over ChainExpression wrappers + const parent = node.parent?.type === 'ChainExpression' ? node.parent.parent : node.parent; + + const isNonNull = parent?.type === 'TSNonNullExpression'; + const replacement = isNonNull ? '$closest' : '$closestOptional'; + + // The node to replace: for non-null, replace the whole `x.closest(sel)!`; otherwise just the call + const nodeToReplace = isNonNull ? parent : node; + + context.report({ + node, + messageId: 'useSelectDom', + data: {replacement, method: 'closest'}, + fix(fixer) { + const selector = sourceCode.getText(node.arguments[0]); + const objectText = sourceCode.getText(object); + return fixer.replaceText(nodeToReplace, `${replacement}(${selector}, ${objectText})`); + }, + }); + }, + + // X.querySelector(sel) with a simple receiver → $(sel, x) + 'CallExpression[callee.type=MemberExpression]:matches([callee.property.name=querySelector], [callee.property.name=querySelectorAll])'(node) { + const {object} = node.callee; + // Only flag simple cases: bare variable or `this` + // Allow traversals: x.firstChild.querySelector, x.closest().querySelector, x!.querySelector, etc. + if (object.type !== 'Identifier' && object.type !== 'ThisExpression') { + return; + } + + const methodName = node.callee.property.name; + const isQueryAll = methodName === 'querySelectorAll'; + const replacement = isQueryAll ? '$$' : '$'; + + // Treat `document` as global only if it's not shadowed by a local variable + const isGlobalDocument = (() => { + if (object.type !== 'Identifier' || object.name !== 'document') { + return false; + } + + // Walk up the scope chain to check for a local `document` binding + let scope = sourceCode.getScope(node); + while (scope) { + if (scope.variables.some(v => v.name === 'document')) { + return false; // Locally declared, not the global + } + + scope = scope.upper; + } + + return true; + })(); + + context.report({ + node, + messageId: 'useSelectDom', + data: {replacement, method: methodName}, + fix(fixer) { + const arguments_ = node.arguments.map(argument => sourceCode.getText(argument)); + if (!isGlobalDocument) { + arguments_.push(sourceCode.getText(object)); + } + + return fixer.replaceText(node, `${replacement}(${arguments_.join(', ')})`); + }, + }); + }, + }; + }, +}; + +export default rule; diff --git a/eslint-suppressions.json b/eslint-suppressions.json new file mode 100644 index 000000000000..083a2caba370 --- /dev/null +++ b/eslint-suppressions.json @@ -0,0 +1,167 @@ +{ + "source/features/bugs-tab.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/clean-conversation-filters.tsx": { + "refined-github/no-optional-chaining": { + "count": 4 + } + }, + "source/features/clean-readme-url.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/clean-repo-sidebar.tsx": { + "refined-github/no-optional-chaining": { + "count": 3 + } + }, + "source/features/conversation-activity-filter.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/cross-deleted-pr-branches.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/easy-toggle-commit-messages.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/expand-all-hidden-comments.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/extend-conversation-status-filters.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/github-actions-indicators.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/highest-rated-comment.tsx": { + "refined-github/no-optional-chaining": { + "count": 2 + } + }, + "source/features/keyboard-navigation.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/link-to-github-io.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/linkify-symbolic-links.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/list-prs-for-file.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/netiquette.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/new-or-deleted-file.tsx": { + "refined-github/no-optional-chaining": { + "count": 2 + } + }, + "source/features/new-repo-disable-projects-and-wikis.tsx": { + "refined-github/no-optional-chaining": { + "count": 4 + } + }, + "source/features/pr-first-commit-title.tsx": { + "refined-github/no-optional-chaining": { + "count": 2 + } + }, + "source/features/reactions-avatars.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/releases-tab.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/rgh-deduplicator.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/rgh-feature-descriptions.tsx": { + "refined-github/no-optional-chaining": { + "count": 2 + } + }, + "source/features/rgh-improve-new-issue-form.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/show-names.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/sort-conversations-by-update-time.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/status-subscription.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/sync-pr-commit-title.tsx": { + "refined-github/no-optional-chaining": { + "count": 3 + } + }, + "source/features/unread-anywhere.tsx": { + "refined-github/no-optional-chaining": { + "count": 2 + } + }, + "source/features/unreleased-commits.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/update-pr-from-base-branch.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + }, + "source/features/useful-not-found-page.tsx": { + "refined-github/no-optional-chaining": { + "count": 2 + } + }, + "source/features/visit-tag.tsx": { + "refined-github/no-optional-chaining": { + "count": 1 + } + } +} \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 70726d6ec77a..2878134cf546 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,17 +1,33 @@ import xo from 'xo'; import sveltePlugin from 'eslint-plugin-svelte'; -import svelteParser from 'svelte-eslint-parser'; +import eslintConfigPrettier from 'eslint-config-prettier/flat'; import {includeIgnoreFile} from '@eslint/compat'; +import {defineConfig} from 'eslint/config'; import {fileURLToPath} from 'node:url'; +import css from '@eslint/css'; +import pluginPromise from 'eslint-plugin-promise'; -const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url)); +import noOptionalChaining from './eslint-rules/no-optional-chaining.js'; + +import selectDomRule from './eslint-rules/select-dom.js'; + +const refinedGithubPlugin = { + rules: { + 'select-dom': selectDomRule, + 'no-optional-chaining': noOptionalChaining, + }, +}; -export default [ +const gitignorePath = fileURLToPath(new URL('.gitignore', import.meta.url)); +export default defineConfig([ includeIgnoreFile(gitignorePath, 'Imported .gitignore patterns'), ...xo.xoToEslintConfig([ { semicolon: true, prettier: false, + plugins: { + promise: pluginPromise, + }, languageOptions: { globals: { browser: 'readonly', @@ -39,6 +55,8 @@ export default [ }, ], + 'require-unicode-regexp': 'off', // Too many violations to fix at once; enforce separately + // Restore errors 'no-await-in-loop': 'error', 'new-cap': [ @@ -69,29 +87,16 @@ export default [ ], }], - 'no-restricted-imports': [ - 'error', - { - paths: [ - { - name: 'select-dom', - importNames: ['$', 'expectElement'], - message: 'Import $ or $optional from `select-dom/strict.js` instead', - }, - ], - }, - - ], 'no-restricted-syntax': [ 'error', { selector: - ':matches([callee.name=delegate], [callee.name=$], [callee.name=$$], [callee.name=$optional], [callee.name=observe], [callee.property.name=querySelector], [callee.property.name=querySelectorAll], [callee.property.name=closest])[arguments.0.value=/,/][arguments.0.value.length>=20]:not([arguments.0.value=/:has|:is/])', + ':matches([callee.name=delegate], [callee.name=$], [callee.name=$$], [callee.name=$optional], [callee.name=$closest], [callee.name=$closestOptional], [callee.name=observe], [callee.property.name=querySelector], [callee.property.name=querySelectorAll])[arguments.0.value=/,/][arguments.0.value.length>=20]:not([arguments.0.value=/:has|:is/])', message: 'Instead of a single string, pass an array of selectors and add comments to each selector', }, { selector: - ':matches([callee.name=delegate], [callee.name=$], [callee.name=$$], [callee.name=$optional], [callee.name=observe], [callee.property.name=querySelector], [callee.property.name=querySelectorAll], [callee.property.name=closest])[arguments.0.type=ArrayExpression][arguments.0.elements.length=1]:not([arguments.0.value=/:has|:is/])', + ':matches([callee.name=delegate], [callee.name=$], [callee.name=$$], [callee.name=$optional], [callee.name=$closest], [callee.name=$closestOptional], [callee.name=observe], [callee.property.name=querySelector], [callee.property.name=querySelectorAll])[arguments.0.type=ArrayExpression][arguments.0.elements.length=1]:not([arguments.0.value=/:has|:is/])', message: 'If it\'s a single selector, use a single string instead of an array', }, { @@ -103,8 +108,8 @@ export default [ message: 'Unused null expression: !', }, { - selector: 'MemberExpression[optional=true][object.callee.name=$]', - message: 'Either use $optional() with `?.` or $() without. $() will throw when the element is not found.', + selector: 'TSNonNullExpression > CallExpression > [name=$closest]', + message: 'Unused null expression: ! — $closest() already throws when the element is not found', }, { message: 'Init functions wrapped with onetime() must have a name ending with "Once"', @@ -131,6 +136,7 @@ export default [ ], 'no-alert': 'off', 'n/prefer-global/process': 'off', + 'no-use-extend-native/no-use-extend-native': 'off', // False positives on ES2024 static methods (Map.groupBy, Object.groupBy, etc.) // Import-x rules customization 'import-x/consistent-type-specifier-style': 'off', @@ -187,6 +193,8 @@ export default [ '@typescript-eslint/no-unsafe-member-access': 'off', '@typescript-eslint/no-unsafe-return': 'off', '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-type-assertion': 'off', + '@typescript-eslint/strict-void-return': 'off', // Too many violations to fix at once '@typescript-eslint/method-signature-style': 'off', // Disagree and it breaks types https://github.com/typescript-eslint/typescript-eslint/issues/1991 '@typescript-eslint/consistent-type-definitions': 'off', // Review later '@typescript-eslint/consistent-type-imports': [ @@ -269,14 +277,21 @@ export default [ ]), { // Disable on markdown files, which are somehow being read as JS files - ignores: ['**/*.md'], + // Other JSON files shouldn't be linted as JS (package.json is handled by xo with json/json language) + ignores: ['**/*.md', '**/*.json', '!**/package.json'], + }, + { + // Allow empty blocks like `catch {}` or `function noop() {}` + files: ['**/*.{js,jsx,mjs,cjs,ts,tsx,cts,mts,vue,svelte,astro}'], + rules: { + '@stylistic/curly-newline': ['error', {minElements: 1}], + }, }, - // Svelte support - ...sveltePlugin.configs['flat/recommended'], { files: ['**/*.svelte'], + plugins: {svelte: sveltePlugin}, + extends: [sveltePlugin.configs['flat/recommended']], languageOptions: { - parser: svelteParser, parserOptions: { parser: '@typescript-eslint/parser', }, @@ -286,5 +301,36 @@ export default [ location: 'readonly', }, }, + + // TODO: Use global `/flat` config. Currently limited to svelte files because dprint is applied to their JS + rules: eslintConfigPrettier.rules, + }, + { + plugins: { + 'refined-github': refinedGithubPlugin, + }, + rules: { + 'refined-github/select-dom': 'error', + }, + }, + { + files: ['source/features/**'], + rules: { + 'refined-github/no-optional-chaining': 'error', + }, + }, + { + files: ['**/*.css'], + language: 'css/css', + plugins: {css}, + extends: ['css/recommended'], + languageOptions: { + tolerant: true, // Required for @container + }, + rules: { + 'css/no-important': 'off', // Intentionally used to override GitHub styles + 'css/use-baseline': 'off', // We support the latest browsers only + 'css/no-invalid-properties': 'off', // https://github.com/eslint/css/issues/434 + }, }, -]; +]); diff --git a/package-lock.json b/package-lock.json index d97bfafb7a03..5eac4afe121c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,93 +16,99 @@ "dom-loaded": "^3.1.0", "doma": "^4.0.0", "element-ready": "^9.0.2", + "eslint-plugin-promise": "^7.3.0", "filter-altered-clicks": "^2.1.1", - "fit-textarea": "^2.0.0", "flat-zip": "^1.0.1", - "github-reserved-names": "^2.1.1", - "github-url-detection": "^11.1.3", + "github-reserved-names": "^2.1.4", + "github-url-detection": "^11.2.1", "indent-textarea": "^4.0.0", "js-abbreviation-number": "^1.4.0", "linkify-issues": "^4.2.0", "linkify-urls": "^5.2.0", - "memoize": "^10.2.0", - "octicons-plain-react": "^19.21.2", + "memoize": "^11.0.0", + "octicons-plain-react": "^19.25.0", "one-event": "^4.4.0", "one-mutation": "^3.0.1", "pretty-bytes": "^7.1.0", "regex-join": "^2.1.0", - "select-dom": "^9.5.0", + "select-dom": "^10.0.0", "shorten-repo-url": "^6.0.0", "strip-indent": "^4.0.0", "text-field-edit": "^4.1.1", "tiny-version-compare": "^4.0.0", - "ts-extras": "^0.16.1", + "ts-extras": "^1.0.0", "twas": "^2.1.3", "uint8array-extras": "^1.5.0", "webext-alert": "^1.1.0", "webext-base-css": "^2.1.0", - "webext-bugs": "^1.1.1", - "webext-content-scripts": "^2.7.2", + "webext-bugs": "^2.0.1", + "webext-content-scripts": "^2.7.3", "webext-detect": "^5.3.1", "webext-dynamic-content-scripts": "^10.0.4", "webext-msg": "^1.0.0", "webext-options-sync": "^4.3.0", "webext-options-sync-per-domain": "^4.3.1", "webext-permission-toggle": "^6.0.1", - "webext-storage": "^2.0.1", + "webext-storage": "^3.1.0", "webext-storage-cache": "^6.0.3", - "webext-tools": "^3.0.0", + "webext-tools": "^4.0.0", "zip-text-nodes": "^1.0.0" }, "devDependencies": { - "@biomejs/biome": "^2.3.12", - "@eslint-react/eslint-plugin": "^2.7.2", - "@eslint/compat": "^2.0.1", + "@biomejs/biome": "^2.4.13", + "@dprint/json": "^0.21.3", + "@eslint-react/eslint-plugin": "^5.6.4", + "@eslint/compat": "^2.0.5", + "@eslint/css": "^1.1.0", "@rollup/plugin-alias": "^6.0.0", - "@rollup/plugin-commonjs": "^29.0.0", + "@rollup/plugin-commonjs": "^29.0.2", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", - "@rollup/plugin-sucrase": "^5.0.2", + "@rollup/plugin-sucrase": "^5.1.0", "@sindresorhus/tsconfig": "^8.1.0", - "@types/chrome": "^0.1.36", + "@types/chrome": "^0.1.40", "@types/codemirror": "^5.60.17", - "@types/dom-navigation": "^1.0.6", - "@types/node": "^24.10.1", + "@types/dom-navigation": "^1.0.7", + "@types/node": "^25.6.0", "@types/react": "^17.0.52", - "browserslist": "^4.28.1", + "browserslist": "^4.28.2", "daily-version": "^2.0.0", "dot-json": "^1.3.0", - "eslint": "^9.39.2", + "dprint": "^0.54.0", + "dprint-plugin-graphql": "^0.2.3", + "dprint-plugin-malva": "^0.15.3", + "dprint-plugin-markup": "^0.27.0", + "dprint-plugin-yaml": "^0.6.0", + "eslint": "^10.2.1", + "eslint-config-prettier": "^10.1.8", "eslint-formatter-unix": "^9.0.1", "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-import-x": "^4.16.1", - "eslint-plugin-svelte": "^3.14.0", - "fast-ignore": "^1.1.3", + "eslint-plugin-import-x": "^4.16.2", + "eslint-plugin-svelte": "^3.17.1", + "fast-ignore": "^2.0.0", "filenamify": "^7.0.1", "highlight.js": "^11.11.1", - "lightningcss": "^1.31.1", + "lightningcss": "^1.32.0", "linkedom": "^0.18.12", "npm-run-all2": "^8.0.4", "p-memoize": "^8.0.0", - "prettier": "^3.8.1", - "prettier-plugin-svelte": "^3.4.1", - "rollup": "^4.56.0", + "rollup": "^4.60.2", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-copy": "^3.5.0", "rollup-plugin-delete": "^3.0.2", "rollup-plugin-string": "^3.0.0", "rollup-plugin-styles": "^4.0.0", "rollup-plugin-svelte": "^7.2.3", - "rollup-plugin-webpack-stats": "^2.1.9", + "rollup-plugin-webpack-stats": "^3.1.2", "snarkdown": "^2.0.0", - "svelte": "^5.48.1", - "svelte-eslint-parser": "^1.4.1", + "svelte": "^5.55.5", + "svelte-eslint-parser": "^1.6.0", "type-fest": "^5.4.1", - "typed-query-selector": "^2.12.0", - "typescript": "^5.9.3", + "typed-query-selector": "^2.12.2", + "typescript": "^6.0.3", "unplugin-lightningcss": "^0.4.5", - "vitest": "^4.0.18", - "xo": "^1.2.3" + "vitest": "^4.1.5", + "xo": "^2.0.2" }, "engines": { "node": ">= 20", @@ -110,9 +116,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { @@ -124,506 +130,418 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@biomejs/biome": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.12.tgz", - "integrity": "sha512-AR7h4aSlAvXj7TAajW/V12BOw2EiS0AqZWV5dGozf4nlLoUF/ifvD0+YgKSskT0ylA6dY1A8AwgP8kZ6yaCQnA==", + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, - "license": "MIT OR Apache-2.0", - "bin": { - "biome": "bin/biome" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.12", - "@biomejs/cli-darwin-x64": "2.3.12", - "@biomejs/cli-linux-arm64": "2.3.12", - "@biomejs/cli-linux-arm64-musl": "2.3.12", - "@biomejs/cli-linux-x64": "2.3.12", - "@biomejs/cli-linux-x64-musl": "2.3.12", - "@biomejs/cli-win32-arm64": "2.3.12", - "@biomejs/cli-win32-x64": "2.3.12" - } - }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.12.tgz", - "integrity": "sha512-cO6fn+KiMBemva6EARDLQBxeyvLzgidaFRJi8G7OeRqz54kWK0E+uSjgFaiHlc3DZYoa0+1UFE8mDxozpc9ieg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.12.tgz", - "integrity": "sha512-/fiF/qmudKwSdvmSrSe/gOTkW77mHHkH8Iy7YC2rmpLuk27kbaUOPa7kPiH5l+3lJzTUfU/t6x1OuIq/7SGtxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.12.tgz", - "integrity": "sha512-nbOsuQROa3DLla5vvsTZg+T5WVPGi9/vYxETm9BOuLHBJN3oWQIg3MIkE2OfL18df1ZtNkqXkH6Yg9mdTPem7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.12.tgz", - "integrity": "sha512-aqkeSf7IH+wkzFpKeDVPSXy9uDjxtLpYA6yzkYsY+tVjwFFirSuajHDI3ul8en90XNs1NA0n8kgBrjwRi5JeyA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" + "url": "https://opencollective.com/babel" } }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.12.tgz", - "integrity": "sha512-CQtqrJ+qEEI8tgRSTjjzk6wJAwfH3wQlkIGsM5dlecfRZaoT+XCms/mf7G4kWNexrke6mnkRzNy6w8ebV177ow==", - "cpu": [ - "x64" - ], + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.12.tgz", - "integrity": "sha512-kVGWtupRRsOjvw47YFkk5mLiAdpCPMWBo1jOwAzh+juDpUb2sWarIp+iq+CPL1Wt0LLZnYtP7hH5kD6fskcxmg==", - "cpu": [ - "x64" - ], + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.12.tgz", - "integrity": "sha512-Re4I7UnOoyE4kHMqpgtG6UvSBGBbbtvsOvBROgCCoH7EgANN6plSQhvo2W7OCITvTp7gD6oZOyZy72lUdXjqZg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=14.21.3" + "node": ">=6.9.0" } }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.12.tgz", - "integrity": "sha512-qqGVWqNNek0KikwPZlOIoxtXgsNGsX+rgdEzgw82Re8nF02W+E2WokaQhpF5TdBh/D/RQ3TLppH+otp6ztN0lw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "cpu": [ - "arm" - ], + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", - "cpu": [ - "arm" - ], + "node_modules/@biomejs/biome": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.13.tgz", + "integrity": "sha512-gLXOwkOBBg0tr7bDsqlkIh4uFeKuMjxvqsrb1Tukww1iDmHcfr4Uu8MoQxp0Rcte+69+osRNWXwHsu/zxT6XqA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, "engines": { - "node": ">=18" + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.4.13", + "@biomejs/cli-darwin-x64": "2.4.13", + "@biomejs/cli-linux-arm64": "2.4.13", + "@biomejs/cli-linux-arm64-musl": "2.4.13", + "@biomejs/cli-linux-x64": "2.4.13", + "@biomejs/cli-linux-x64-musl": "2.4.13", + "@biomejs/cli-win32-arm64": "2.4.13", + "@biomejs/cli-win32-x64": "2.4.13" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.13.tgz", + "integrity": "sha512-2KImO1jhNFBa2oWConyr0x6flxbQpGKv6902uGXpYM62Xyem8U80j441SyUJ8KyngsmKbQjeIv1q2CQfDkNnYg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=14.21.3" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.13.tgz", + "integrity": "sha512-BKrJklbaFN4p1Ts4kPBczo+PkbsHQg57kmJ+vON9u2t6uN5okYHaSr7h/MutPCWQgg2lglaWoSmm+zhYW+oOkg==", "cpu": [ - "ia32" + "x64" ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": ">=18" + "node": ">=14.21.3" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.13.tgz", + "integrity": "sha512-NzkUDSqfvMBrPplKgVr3aXLHZ2NEELvvF4vZxXulEylKWIGqlvNEcwUcj9OLrn75TD3lJ/GIqCVlBwd1MZCuYQ==", "cpu": [ - "loong64" + "arm64" ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=14.21.3" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.13.tgz", + "integrity": "sha512-U5MsuBQW25dXaYtqWWSPM3P96H6Y+fHuja3TQpMNnylocHW0tEbtFTDlUj6oM+YJLntvEkQy4grBvQNUD4+RCg==", "cpu": [ - "mips64el" + "arm64" ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=14.21.3" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.13.tgz", + "integrity": "sha512-Az3ZZedYRBo9EQzNnD9SxFcR1G5QsGo6VEc2hIyVPZ1rdKwee/7E9oeBBZFpE8Z44ekxsDQBqbiWGW5ShOhUSQ==", "cpu": [ - "ppc64" + "x64" ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=14.21.3" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.13.tgz", + "integrity": "sha512-Z601MienRgTBDza/+u2CH3RSrWoXo9rtr8NK6A4KJzqGgfxx+H3VlyLgTJ4sRo40T3pIsqpTmiOQEvYzQvBRvQ==", "cpu": [ - "riscv64" + "x64" ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=18" + "node": ">=14.21.3" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.13.tgz", + "integrity": "sha512-Px9PS2B5/Q183bUwy/5VHqp3J2lzdOCeVGzMpphYfl8oSa7VDCqenBdqWpy6DCy/en4Rbf/Y1RieZF6dJPcc9A==", "cpu": [ - "s390x" + "arm64" ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=18" + "node": ">=14.21.3" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.13.tgz", + "integrity": "sha512-tTcMkXyBrmHi9BfrD2VNHs/5rYIUKETqsBlYOvSAABwBkJhSDVb5e7wPukftsQbO3WzQkXe6kaztC6WtUOXSoQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=18" + "node": ">=14.21.3" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "node_modules/@dprint/darwin-arm64": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/darwin-arm64/-/darwin-arm64-0.54.0.tgz", + "integrity": "sha512-yqRI4enH+BDp+4+ZsPVdZM5h873JK1lN7li9l9A5u4C4cvh1oEsiBWAzEPccRkJ2ctF8LgaizBSxO38sqEVYbw==", "cpu": [ "arm64" ], @@ -631,16 +549,13 @@ "license": "MIT", "optional": true, "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } + "darwin" + ] }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "node_modules/@dprint/darwin-x64": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/darwin-x64/-/darwin-x64-0.54.0.tgz", + "integrity": "sha512-W9BARpgHypcQwatg5mnHaCpX6pLX5dBxxiv+tZKruhOmq8MKYOrAYDXlceMuHSowmWREfUF5yL4SRgXDGI6WQw==", "cpu": [ "x64" ], @@ -648,16 +563,20 @@ "license": "MIT", "optional": true, "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } + "darwin" + ] + }, + "node_modules/@dprint/json": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@dprint/json/-/json-0.21.3.tgz", + "integrity": "sha512-fOmRKstf4kVZunnJcrGg1SNzoU6Y11mnLR1SbHQ7PwVvOUQTTUeCtxm3oLy/56nf69kaZmrdeegWXyxnTM5WDQ==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "node_modules/@dprint/linux-arm64-glibc": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/linux-arm64-glibc/-/linux-arm64-glibc-0.54.0.tgz", + "integrity": "sha512-VhM7p70VFuNqxZMdiv1e+nMboPj/hMFlTIBWrRaX7+6VThs9mJr9+94wrUeXgfnfsyaEKSbRFa/dru1PINoSNw==", "cpu": [ "arm64" ], @@ -665,50 +584,69 @@ "license": "MIT", "optional": true, "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } + "linux" + ] }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "node_modules/@dprint/linux-arm64-musl": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/linux-arm64-musl/-/linux-arm64-musl-0.54.0.tgz", + "integrity": "sha512-QS1A74Lv60/L9oemHCzbHgOLbV2smSJG5IxS5fjf8ZWetyUt918WDzIHBilz/+uiB+OlW2UVTsm952UG0YOrLw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" + ] + }, + "node_modules/@dprint/linux-loong64-glibc": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/linux-loong64-glibc/-/linux-loong64-glibc-0.54.0.tgz", + "integrity": "sha512-8Myka2/0KbhuZnEKL6jagPXTgDKVpd/tfXDRa0oibUBgaqOSku6iRMzHGa/PhqHL+s14Gcp+/cIHz0zU3Tkgug==", + "cpu": [ + "loong64" ], - "engines": { - "node": ">=18" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "node_modules/@dprint/linux-loong64-musl": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/linux-loong64-musl/-/linux-loong64-musl-0.54.0.tgz", + "integrity": "sha512-/AN3xCuMhC4PK7Pbj7/4zBuhFGr4m0OHV/5uGTfzpkKX/3+AXoyKl7PbT2VlNMGXAK0kuRThfjtx23gIwlWk7Q==", "cpu": [ - "arm64" + "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "openharmony" + "linux" + ] + }, + "node_modules/@dprint/linux-riscv64-glibc": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/linux-riscv64-glibc/-/linux-riscv64-glibc-0.54.0.tgz", + "integrity": "sha512-Aw2vXzzwFDpPbXh6ajsSabVCkCc66C3hCyMKprR/IxYvFtjYX80nh1ox0c7iaw6c4HacHMRLGw7FUSXvomPaEQ==", + "cpu": [ + "riscv64" ], - "engines": { - "node": ">=18" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "node_modules/@dprint/linux-x64-glibc": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/linux-x64-glibc/-/linux-x64-glibc-0.54.0.tgz", + "integrity": "sha512-zZqj3wQELOX8n6QfT2uuWoMf64Wv0lMXNyam3btm+PKkg0P6a54TPL09Bs9XsViOdxgTcamsiQ7HlErt/LEjIA==", "cpu": [ "x64" ], @@ -716,50 +654,41 @@ "license": "MIT", "optional": true, "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } + "linux" + ] }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "node_modules/@dprint/linux-x64-musl": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/linux-x64-musl/-/linux-x64-musl-0.54.0.tgz", + "integrity": "sha512-it6Qdt06dyW2adbAXpOCb7/KQLxlm4i1UphUAWqWsZk4t3EYetyAza9J0g3Vu9itIWSEIo9MnccgANckQJ6+qw==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } + "linux" + ] }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "node_modules/@dprint/win32-arm64": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/win32-arm64/-/win32-arm64-0.54.0.tgz", + "integrity": "sha512-F5kjV/6I9YtNOTDWHUpTqM2HHHS510BPL7z4NJuU0nDnaVeks7GwNEltGr56CcsG8XQYhkiAsqZytPu6AhA2hQ==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=18" - } + ] }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "node_modules/@dprint/win32-x64": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@dprint/win32-x64/-/win32-x64-0.54.0.tgz", + "integrity": "sha512-AAr2ye/DtgYXDplRoPS+5U++x7T6W4a3I9FvTFWFxziFmUptvAg5G2c4FcXoAduSruhYZJvjDZrLseR2c3IwXg==", "cpu": [ "x64" ], @@ -768,15 +697,46 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=18" + ] + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.6.0.tgz", - "integrity": "sha512-2EX2bBQq1ez++xz2o9tEeEQkyvfieWgUFMH4rtJJri2q0Azvhja3hZGXsjPXs31R4fQkZDtWzNDDK2zQn5UE5g==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.7.1.tgz", + "integrity": "sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -790,7 +750,7 @@ "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments/node_modules/ignore": { @@ -807,7 +767,6 @@ "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -833,145 +792,169 @@ } }, "node_modules/@eslint-react/ast": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@eslint-react/ast/-/ast-2.7.2.tgz", - "integrity": "sha512-RB8AVNjboN6/md9Da4rUG4WqxLT+DqUR+qXIR6iAD0+xxp6Dtihu541+lKLZ3GCstunbBcDwu7gdhSbz+BHSuQ==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@eslint-react/ast/-/ast-5.6.4.tgz", + "integrity": "sha512-AtkRMfHDdSG7BI+ZIt7BRXqIfhOXxRZtia6cBW1qH0xVeKGko7SUS3D4bYy8Vq7RVxYkMwOXxWin3Y/ccT7POA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/eff": "2.7.2", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/typescript-estree": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/typescript-estree": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1", "string-ts": "^2.3.1" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, "node_modules/@eslint-react/core": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@eslint-react/core/-/core-2.7.2.tgz", - "integrity": "sha512-QOYh8OWwUGMYLhuvb8WcmoS2jYXb0SJbpX+Ozk+Ht2G9XGRAahl+8PDy/o2l2lLnFXv5JQGfLrN+m2WPTi104g==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@eslint-react/core/-/core-5.6.4.tgz", + "integrity": "sha512-R0wi0bGslQPsZlpNjqt9SXMvqXa6mSpk6Lue3Te9/G+66/9hKRGKHHftwB2n70rsOmP7xRDVfEwp1Bis2HGszg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@eslint-react/var": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "birecord": "^0.1.1", + "@eslint-react/ast": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@eslint-react/jsx": "5.6.4", + "@eslint-react/shared": "5.6.4", + "@eslint-react/var": "5.6.4", + "@typescript-eslint/scope-manager": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1", "ts-pattern": "^5.9.0" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, - "node_modules/@eslint-react/eff": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@eslint-react/eff/-/eff-2.7.2.tgz", - "integrity": "sha512-AzQGbidoI8g8izka/1H9xCKW56NR7xWGGPMccBCUZwbCoJZ4wyRKcE10E7ot7LwBv5kBoUQp3GJ9UXCcg/Er0w==", + "node_modules/@eslint-react/eslint": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@eslint-react/eslint/-/eslint-5.6.4.tgz", + "integrity": "sha512-wjCnX6/URIuV3JRsrmJOJHHgEB6YI46t3DKG848KNoZbwQ6xx1g+Vzl/5zygfbdQvfdlDfHS+TBqiZ/PuFaj9A==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.59.1" + }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "^10.2.1", + "typescript": "*" } }, "node_modules/@eslint-react/eslint-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@eslint-react/eslint-plugin/-/eslint-plugin-2.7.2.tgz", - "integrity": "sha512-h9T5cc2TxsKMv/8iO63KKamXyJjHHAmeG2MJVjeIm4FaZdsX0/2Bx254B3Fa8IDqQi4X81AMyJ8ohtbxsn6pOw==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@eslint-react/eslint-plugin/-/eslint-plugin-5.6.4.tgz", + "integrity": "sha512-YHYrrPJOFa/Jbd8EYYn9KgQCJ0NduQEdjanncyUAOs2WMXcagwocphRSsE2JvoVxUEpp7+44yHoKgBykIyuZsw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/type-utils": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "eslint-plugin-react-dom": "2.7.2", - "eslint-plugin-react-hooks-extra": "2.7.2", - "eslint-plugin-react-naming-convention": "2.7.2", - "eslint-plugin-react-web-api": "2.7.2", - "eslint-plugin-react-x": "2.7.2", - "ts-api-utils": "^2.4.0" + "@eslint-react/shared": "5.6.4", + "eslint-plugin-react-dom": "5.6.4", + "eslint-plugin-react-jsx": "5.6.4", + "eslint-plugin-react-naming-convention": "5.6.4", + "eslint-plugin-react-rsc": "5.6.4", + "eslint-plugin-react-web-api": "5.6.4", + "eslint-plugin-react-x": "5.6.4" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "^10.2.1", + "typescript": "*" + } + }, + "node_modules/@eslint-react/jsx": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@eslint-react/jsx/-/jsx-5.6.4.tgz", + "integrity": "sha512-Hx9Oo32OlqHNCUwCK61b3dvBMMyIb7tdQav7Xs7XfJ6xVmsJPPTJA4aXAy/RMjx1WA5/9I7RQb+jsaQYaTaMFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@eslint-react/shared": "5.6.4", + "@eslint-react/var": "5.6.4", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, "node_modules/@eslint-react/shared": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@eslint-react/shared/-/shared-2.7.2.tgz", - "integrity": "sha512-U1H3dLaTj7kvEbyJyJEgn6xX3BmrCH1f9f+tg9gLWlN7askgWT5NF56wfX1l+jtwiEAZD/78W1TfICKkMnZDxQ==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@eslint-react/shared/-/shared-5.6.4.tgz", + "integrity": "sha512-Wz4sQ6D887OcywPizXKfMIw9D1BJaB/orI/PwRgluFUNe7K9XptHRPPyS/qIoiBjSGO6Hq39kpJ7YM8CfE8SPw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/eff": "2.7.2", - "@typescript-eslint/utils": "^8.53.0", + "@eslint-react/eslint": "5.6.4", + "@typescript-eslint/utils": "^8.59.1", "ts-pattern": "^5.9.0", - "zod": "^3.25.0 || ^4.0.0" + "zod": "^4.4.1" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, "node_modules/@eslint-react/var": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@eslint-react/var/-/var-2.7.2.tgz", - "integrity": "sha512-sPnXmikpzmAdIWh6lqqKm4Bu0ypKTCAQ7WxGuR5ejxtrA/HjQQuKMBIyPkBdjHWlF9ADdh9pKuo1j2RQwUWiqA==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/@eslint-react/var/-/var-5.6.4.tgz", + "integrity": "sha512-g8H9+7dqJxeOWpaJlSRPAgNHVRWJHtb9Ut9YmbmOLkrai6yFhMFLI+n/SlmdXb+LhLvzjKoweoAkGKaVRlO+5A==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", + "@eslint-react/ast": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@typescript-eslint/scope-manager": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1", "ts-pattern": "^5.9.0" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, "node_modules/@eslint/compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.0.1.tgz", - "integrity": "sha512-yl/JsgplclzuvGFNqwNYV4XNPhP3l62ZOP9w/47atNAdmDtIFCx6X7CSk/SlWUuBGkT4Et/5+UD+WyvX2iiIWA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.0.5.tgz", + "integrity": "sha512-IbHDbHJfkVNv6xjlET8AIVo/K1NQt7YT4Rp6ok/clyBGcpRx1l6gv0Rq3vBvYfPJIZt6ODf66Zq08FJNDpnzgg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.0.1" + "@eslint/core": "^1.2.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, "peerDependencies": { - "eslint": "^8.40 || 9" + "eslint": "^8.40 || 9 || 10" }, "peerDependenciesMeta": { "eslint": { @@ -980,179 +963,113 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.7", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "minimatch": "^10.2.4" }, "engines": { - "node": "*" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0" + "@eslint/core": "^1.2.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.0.1.tgz", - "integrity": "sha512-r18fEAj9uCk+VjzGt2thsbOmychS+4kxI14spVNibUO2vqKX7obOG+ymZljAwuPZl+S3clPGwCwTDtrdqTiY6Q==", + "node_modules/@eslint/css": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@eslint/css/-/css-1.1.0.tgz", + "integrity": "sha512-sNwfLcU3nKXv/v2YglqujwMU4Iv3BDhxldNUd/2FckVab0zdvc9pPlKWxjR6Ap/EU+Y8Pdu853iwvcUpemRhRw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@types/json-schema": "^7.0.15" + "@eslint/core": "^1.1.1", + "@eslint/css-tree": "^3.6.9", + "@eslint/plugin-kit": "^0.6.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "node_modules/@eslint/css-tree": { + "version": "3.6.9", + "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.9.tgz", + "integrity": "sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "mdn-data": "2.23.0", + "source-map-js": "^1.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@eslint/json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/json/-/json-1.2.0.tgz", + "integrity": "sha512-CEFEyNgvzu8zn5QwVYDg3FaG+ZKUeUsNYitFpMYJAqoAlnw68EQgNbUfheSmexZr4n0wZPrAkPLuvsLaXO6wRw==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanwhocodes/momoa": "^3.3.10", + "natural-compare": "^1.4.0" }, "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0", + "@eslint/core": "^1.1.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@fregante/mi-cron": { @@ -1162,29 +1079,43 @@ "license": "ISC" }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1199,6 +1130,16 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@humanwhocodes/momoa": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.10.tgz", + "integrity": "sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", @@ -1321,6 +1262,23 @@ "dev": true, "license": "MIT" }, + "node_modules/@oxc-project/types": { + "version": "0.127.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", + "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@package-json/types": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@package-json/types/-/types-0.0.12.tgz", + "integrity": "sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==", + "dev": true, + "license": "MIT" + }, "node_modules/@pkgr/core": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", @@ -1334,6 +1292,289 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz", + "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz", + "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz", + "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz", + "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz", + "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz", + "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz", + "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz", + "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-alias": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-6.0.0.tgz", @@ -1353,9 +1594,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.0.tgz", - "integrity": "sha512-U2YHaxR2cU/yAiwKJtJRhnyLk7cifnQw0zUpISsocBDoHDJn+HTV74ABqnwr5bEgWUwFZC9oFL6wLe21lHu5eQ==", + "version": "29.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.2.tgz", + "integrity": "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg==", "dev": true, "license": "MIT", "dependencies": { @@ -1426,9 +1667,9 @@ } }, "node_modules/@rollup/plugin-sucrase": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-sucrase/-/plugin-sucrase-5.0.2.tgz", - "integrity": "sha512-4MhIVH9Dy2Hwose1/x5QMs0XF7yn9jDd/yozHqzdIrMWIolgFpGnrnVhQkqTaK1RALY/fpyrEKmwH/04vr1THA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-sucrase/-/plugin-sucrase-5.1.0.tgz", + "integrity": "sha512-/S4cJnfnjmaH0RqjvZtKOCx8WRnL14f3+tIieL5Ty0YkRpUPW2S/tgHCplWsHEmuZAWYoPJ4KN5eIxWtQw95Qw==", "dev": true, "license": "MIT", "dependencies": { @@ -1471,9 +1712,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", - "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", "cpu": [ "arm" ], @@ -1485,9 +1726,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", - "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", "cpu": [ "arm64" ], @@ -1499,9 +1740,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", - "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", "cpu": [ "arm64" ], @@ -1513,9 +1754,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", - "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", "cpu": [ "x64" ], @@ -1527,9 +1768,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", - "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", "cpu": [ "arm64" ], @@ -1541,9 +1782,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", - "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", "cpu": [ "x64" ], @@ -1555,9 +1796,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", - "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", "cpu": [ "arm" ], @@ -1569,9 +1810,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", - "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", "cpu": [ "arm" ], @@ -1583,9 +1824,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", - "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", "cpu": [ "arm64" ], @@ -1597,9 +1838,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", - "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", "cpu": [ "arm64" ], @@ -1611,9 +1852,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", - "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", "cpu": [ "loong64" ], @@ -1625,9 +1866,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", - "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", "cpu": [ "loong64" ], @@ -1639,9 +1880,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", - "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", "cpu": [ "ppc64" ], @@ -1653,9 +1894,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", - "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", "cpu": [ "ppc64" ], @@ -1667,9 +1908,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", - "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", "cpu": [ "riscv64" ], @@ -1681,9 +1922,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", - "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", "cpu": [ "riscv64" ], @@ -1695,9 +1936,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", - "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", "cpu": [ "s390x" ], @@ -1709,9 +1950,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", - "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", "cpu": [ "x64" ], @@ -1723,9 +1964,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", - "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", "cpu": [ "x64" ], @@ -1737,9 +1978,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", - "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", "cpu": [ "x64" ], @@ -1751,9 +1992,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", - "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", "cpu": [ "arm64" ], @@ -1765,9 +2006,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", - "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", "cpu": [ "arm64" ], @@ -1779,9 +2020,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", - "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", "cpu": [ "ia32" ], @@ -1793,9 +2034,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", - "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", "cpu": [ "x64" ], @@ -1807,9 +2048,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", - "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", "cpu": [ "x64" ], @@ -1873,23 +2114,24 @@ "license": "MIT" }, "node_modules/@stylistic/eslint-plugin": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz", - "integrity": "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.32.1", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "estraverse": "^5.3.0", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=9.0.0" + "eslint": "^9.0.0 || ^10.0.0" } }, "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { @@ -1905,26 +2147,34 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@stylistic/eslint-plugin/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", - "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^8.9.0" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -1948,9 +2198,9 @@ } }, "node_modules/@types/chrome": { - "version": "0.1.36", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.1.36.tgz", - "integrity": "sha512-BvHbuyGttYXnGt5Gpwa4769KIinKHY1iLjlAPrrMBS2GI9m/XNMPtdsq0NgQalyuUdxvlMN/0OyGw0shFVIoUQ==", + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.1.40.tgz", + "integrity": "sha512-UnfyRAe8ORu9HSuTH0EqyOEUin3JrWW9Nl/gDXezNfTUrfIoxw+WRZgKOxGz0t5BnjbfXBnS2eCYfW2PxH1wcA==", "dev": true, "license": "MIT", "dependencies": { @@ -1986,16 +2236,16 @@ "license": "MIT" }, "node_modules/@types/dom-navigation": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/dom-navigation/-/dom-navigation-1.0.6.tgz", - "integrity": "sha512-4srBpebg8rFDm0LafYuWhZMgLoSr5J4gx4q1uaTqOXwVk00y+CkTdJ4SC57sR1cMhP0ZRjApMRdHVcFYOvPGTw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/dom-navigation/-/dom-navigation-1.0.7.tgz", + "integrity": "sha512-Di4W+i2faYquHUnyWUg3bBQp5pTNvjDDA7mIYfD/1WlLgan6sKkeVjGbdL78K0CuNEk5Pfc/c0rfelwkz10mnQ==", "dev": true, "license": "MIT" }, "node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", "dependencies": { @@ -2003,6 +2253,13 @@ "@types/json-schema": "*" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -2070,13 +2327,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", - "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.19.0" } }, "node_modules/@types/parse-json": { @@ -2093,9 +2350,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "17.0.90", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.90.tgz", - "integrity": "sha512-P9beVR/x06U9rCJzSxtENnOr4BrbJ6VrsrDTc+73TtHv9XHhryXKbjGRB+6oooB2r0G/pQkD/S4dHo/7jUfwFw==", + "version": "17.0.91", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.91.tgz", + "integrity": "sha512-xauZca6qMeCU3Moy0KxCM9jtf1vyk6qRYK39Ryf3afUqwgNUjRIGoDdS9BcGWgAMGSg1hvP4XcmlYrM66PtqeA==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2126,21 +2383,28 @@ "@types/estree": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz", - "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz", + "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/type-utils": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/type-utils": "8.59.1", + "@typescript-eslint/utils": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2150,9 +2414,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.53.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "@typescript-eslint/parser": "^8.59.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -2166,16 +2430,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz", - "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", + "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3" }, "engines": { @@ -2186,19 +2450,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz", - "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", + "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.53.1", - "@typescript-eslint/types": "^8.53.1", + "@typescript-eslint/tsconfig-utils": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", "debug": "^4.4.3" }, "engines": { @@ -2209,18 +2473,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz", - "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", + "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1" + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2231,9 +2495,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz", - "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", + "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", "dev": true, "license": "MIT", "engines": { @@ -2244,21 +2508,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz", - "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz", + "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/utils": "8.59.1", "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2268,14 +2532,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz", - "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", "dev": true, "license": "MIT", "engines": { @@ -2287,21 +2551,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz", - "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", + "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.53.1", - "@typescript-eslint/tsconfig-utils": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/project-service": "8.59.1", + "@typescript-eslint/tsconfig-utils": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2311,20 +2575,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz", - "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", + "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1" + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2334,19 +2598,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz", - "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", + "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.59.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2357,13 +2621,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2639,31 +2903,31 @@ ] }, "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", + "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.0.0", + "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", + "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.18", + "@vitest/spy": "4.1.5", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -2672,7 +2936,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "msw": { @@ -2694,26 +2958,26 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", + "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^3.0.3" + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", + "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.18", + "@vitest/utils": "4.1.5", "pathe": "^2.0.3" }, "funding": { @@ -2721,13 +2985,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", + "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.18", + "@vitest/pretty-format": "4.1.5", + "@vitest/utils": "4.1.5", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -2736,9 +3001,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", + "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", "dev": true, "license": "MIT", "funding": { @@ -2746,14 +3011,15 @@ } }, "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", + "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.18", - "tinyrainbow": "^3.0.3" + "@vitest/pretty-format": "4.1.5", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -2772,9 +3038,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -2795,9 +3061,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -2812,13 +3078,16 @@ } }, "node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2838,16 +3107,13 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -2868,9 +3134,9 @@ "license": "Python-2.0" }, "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2991,20 +3257,26 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.17", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", - "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "version": "2.10.24", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz", + "integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/batched-function": { @@ -3031,13 +3303,16 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -3054,9 +3329,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ { @@ -3074,11 +3349,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -3088,9 +3363,9 @@ } }, "node_modules/builtin-modules": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", - "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.1.0.tgz", + "integrity": "sha512-c5JxaDrzwRjq3WyJkI1AGR5xy6Gr6udlt7sQPbl09+3ckB+Zo2qqQ2KhCTBr7Q8dHB43bENGYEk4xddrFH/b7A==", "dev": true, "license": "MIT", "engines": { @@ -3140,9 +3415,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", "dev": true, "funding": [ { @@ -3171,26 +3446,29 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -3248,26 +3526,6 @@ "url": "https://github.com/sponsors/fregante" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -3293,9 +3551,9 @@ } }, "node_modules/comment-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", - "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz", + "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==", "dev": true, "license": "MIT", "engines": { @@ -3351,10 +3609,17 @@ "url": "https://github.com/sponsors/fregante" } }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/core-js-compat": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", - "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", "dependencies": { @@ -3471,6 +3736,13 @@ "node": ">=8.0.0" } }, + "node_modules/css-tree/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/css-what": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", @@ -3676,9 +3948,9 @@ } }, "node_modules/default-browser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", - "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -3810,6 +4082,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/del/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delegate-it": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/delegate-it/-/delegate-it-6.3.0.tgz", @@ -3843,9 +4128,9 @@ } }, "node_modules/devalue": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", - "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz", + "integrity": "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA==", "dev": true, "license": "MIT" }, @@ -4013,10 +4298,62 @@ "dot-json": "bin/dot-json.js" } }, + "node_modules/dprint": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/dprint/-/dprint-0.54.0.tgz", + "integrity": "sha512-sIy25poR2gRP/tWPTgP0MPeJoJcpv0xzYDcsboapvthbEt1Qw3Al252CA0xFyIh2cYEGGKyBJtKokryv4ERlJw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "dprint": "bin.cjs" + }, + "optionalDependencies": { + "@dprint/darwin-arm64": "0.54.0", + "@dprint/darwin-x64": "0.54.0", + "@dprint/linux-arm64-glibc": "0.54.0", + "@dprint/linux-arm64-musl": "0.54.0", + "@dprint/linux-loong64-glibc": "0.54.0", + "@dprint/linux-loong64-musl": "0.54.0", + "@dprint/linux-riscv64-glibc": "0.54.0", + "@dprint/linux-x64-glibc": "0.54.0", + "@dprint/linux-x64-musl": "0.54.0", + "@dprint/win32-arm64": "0.54.0", + "@dprint/win32-x64": "0.54.0" + } + }, + "node_modules/dprint-plugin-graphql": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/dprint-plugin-graphql/-/dprint-plugin-graphql-0.2.3.tgz", + "integrity": "sha512-ZF5CW1H06ptfQxez5oyCTkyaoMUUTF09iudR2sNNBsyaVOqk6/4Ij/UkuiCW9u5U1pSeUgvle/U6HthIXNa24Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/dprint-plugin-malva": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/dprint-plugin-malva/-/dprint-plugin-malva-0.15.3.tgz", + "integrity": "sha512-rDBVztvpSa5Y2wqlYPvAP8kCEZdab2RovEWXPO+pE2gu3F8jJg/IjV0cKVSO7blIzP8iKmlD9u/TDnsZUHPoFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dprint-plugin-markup": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/dprint-plugin-markup/-/dprint-plugin-markup-0.27.0.tgz", + "integrity": "sha512-scC2pesWfc4sAzeE+kPyO+h+pxHJUC1EBBS1oP8lu+AxUjhURm4svn76WinXH8VVyxXwdJaI238vgN8GG6P5Fw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dprint-plugin-yaml": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/dprint-plugin-yaml/-/dprint-plugin-yaml-0.6.0.tgz", + "integrity": "sha512-jFCM6LxutTjfiSR7BtDhbZA2OvuqYY9xksULg0vdu0nZV1hiaupvRfJHGZSiQS9aLmqMNc+5WcHpOBSwxCK7qQ==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { - "version": "1.5.278", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", - "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", + "version": "1.5.345", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.345.tgz", + "integrity": "sha512-F9JXQGiMrz6yVNPI2qOVPvB9HzjH5cGzhs8oJ6A28V5L/YnzN/0KsuiibqF+F1Fd9qxFzD1BUnYSd8JfULxTwg==", "dev": true, "license": "ISC" }, @@ -4037,13 +4374,6 @@ "url": "https://github.com/sindresorhus/element-ready?sponsor=1" } }, - "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, "node_modules/enhance-visitors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/enhance-visitors/-/enhance-visitors-1.0.0.tgz", @@ -4058,14 +4388,14 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -4107,6 +4437,19 @@ "node": ">=6" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -4117,6 +4460,16 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { "name": "@nolyfill/es-iterator-helpers", "version": "1.0.21", @@ -4139,54 +4492,12 @@ "license": "MIT" }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true, "license": "MIT" }, - "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4223,33 +4534,30 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz", + "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", + "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -4259,8 +4567,7 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -4268,7 +4575,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -4315,35 +4622,37 @@ } }, "node_modules/eslint-config-xo": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.46.0.tgz", - "integrity": "sha512-mjQUhdTCLQwHUFKf1hhSx1FFhm2jllr4uG2KjaW7gZHGAbjKoSypvo1eQvFk17lHx3bztYjZDDXQmkAZyaSlAg==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.50.0.tgz", + "integrity": "sha512-IC+G7r8cIZkspJX5Ug97Si3aHyLatx+eZ5w/dyLuBo0HDZj13uIsZy+mlbXM18aN2/MLarIn0vq4R/a75Gmfcg==", "dev": true, "license": "MIT", "dependencies": { - "@stylistic/eslint-plugin": "^2.6.1", + "@eslint/css": "^0.14.1", + "@eslint/json": "^1.0.0", + "@stylistic/eslint-plugin": "^5.7.1", "confusing-browser-globals": "1.0.11", - "globals": "^15.3.0" + "globals": "^17.3.0" }, "engines": { - "node": ">=18.18" + "node": ">=20.19" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" }, "peerDependencies": { - "eslint": ">=9.8.0" + "eslint": ">=10" } }, "node_modules/eslint-config-xo-react": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo-react/-/eslint-config-xo-react-0.28.0.tgz", - "integrity": "sha512-dKvxB9kxMNLhWKsh6yiptACet+/WwKcN7ID2hIBAmjH6le4tt8um4sJ0/aAH6y+xle9tPrasX1Wnz90muCoz9A==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo-react/-/eslint-config-xo-react-0.29.0.tgz", + "integrity": "sha512-OiA3fnGu5tkQkcFhXV1J9ZTUr25DDVoGpBdA2dowH6rNZFDed+WtxzcoUNwQNFXqWRAjsFjuxAzw3c1iAHom0Q==", "dev": true, "license": "MIT", "dependencies": { - "eslint-plugin-react": "^7.37.4", - "eslint-plugin-react-hooks": "^5.1.0" + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1" }, "engines": { "node": ">=18.18" @@ -4356,97 +4665,73 @@ } }, "node_modules/eslint-config-xo-typescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-7.0.0.tgz", - "integrity": "sha512-Mvy5eo6PW2BWPpxLsG7Y28LciZhLhiXFZAw/H3kdia34Efudk2aWMWwAKqkEFamo/SHiyMYkqUx6DYO+YJeVVg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-10.0.0.tgz", + "integrity": "sha512-WoyK93F9WCoEv4teY+Ah6PttfS+ckRkpTeasWJ/VYD5IfONzAx9muRrn3VQXf0zUJUEPGrujz02ghgGKdpsTfw==", "dev": true, "license": "MIT", "dependencies": { - "@stylistic/eslint-plugin": "^2.6.1", - "eslint-config-xo": "^0.46.0", - "typescript-eslint": "^8.3.0" + "@stylistic/eslint-plugin": "^5.10.0", + "eslint-config-xo": "^0.50.0", + "typescript-eslint": "^8.57.0" }, "engines": { - "node": ">=18.18" + "node": ">=20.19" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" }, "peerDependencies": { - "eslint": ">=9.8.0", - "typescript": ">=5.5.0" + "eslint": ">=10", + "typescript": ">=5.9.0" } }, - "node_modules/eslint-config-xo-typescript/node_modules/@stylistic/eslint-plugin": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", - "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==", + "node_modules/eslint-config-xo/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/utils": "^8.13.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.2" + "@types/json-schema": "^7.0.15" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" } }, - "node_modules/eslint-config-xo-typescript/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/eslint-config-xo/node_modules/@eslint/css": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@eslint/css/-/css-0.14.1.tgz", + "integrity": "sha512-NXiteSacmpaXqgyIW3+GcNzexXyfC0kd+gig6WTjD4A74kBGJeNx1tV0Hxa0v7x0+mnIyKfGPhGNs1uhRFdh+w==", "dev": true, "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-xo/node_modules/@stylistic/eslint-plugin": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", - "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==", - "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.13.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.2" + "@eslint/core": "^0.17.0", + "@eslint/css-tree": "^3.6.6", + "@eslint/plugin-kit": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" } }, - "node_modules/eslint-config-xo/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/eslint-config-xo/node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-xo/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", + "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", "dev": true, "license": "MIT", "engines": { @@ -4457,20 +4742,20 @@ } }, "node_modules/eslint-formatter-pretty": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-6.0.1.tgz", - "integrity": "sha512-znAUcXmBthdIUmlnRkPSxz3zSJHFUhfHF/nJPcCMVKg/mOa4yUie2Olqg1Ghbi5JJRBZVU3rIgzWSObvIspxMA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-7.1.0.tgz", + "integrity": "sha512-iyPrgpwKC3MMM75Wxn0VouD89HolpG+BL95NOxgwOWO0R+Omapo7gFX2xcGVsUDS7KiXLtDuynLbNbOARSE7YA==", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint": "^8.44.6", - "ansi-escapes": "^6.2.0", - "chalk": "^5.3.0", + "@types/eslint": "^9.6.1", + "ansi-escapes": "^7.1.0", + "chalk": "^5.6.2", "eslint-rule-docs": "^1.1.235", - "log-symbols": "^6.0.0", + "log-symbols": "^7.0.1", "plur": "^5.1.0", - "string-width": "^7.0.0", - "supports-hyperlinks": "^3.0.0" + "string-width": "^8.1.0", + "supports-hyperlinks": "^4.3.0" }, "engines": { "node": ">=18" @@ -4479,19 +4764,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-formatter-pretty/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/eslint-formatter-unix": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/eslint-formatter-unix/-/eslint-formatter-unix-9.0.1.tgz", @@ -4563,44 +4835,25 @@ } }, "node_modules/eslint-plugin-ava": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-15.1.0.tgz", - "integrity": "sha512-+6Zxk1uYW3mf7lxCLWIQsFYgn3hfuCMbsKc0MtqfloOz1F6fiV5/PaWEaLgkL1egrSQmnyR7vOFP1wSPJbVUbw==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-16.0.1.tgz", + "integrity": "sha512-1QsYwUulr9m9o6EFndkI0J10wZyVimmrQ1epB8zEowulW0o8fW/ahIHrPwTMT53AWbObD+8S78Uz9aKM3zS9+A==", "dev": true, "license": "MIT", "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@eslint/json": "^1.0.0", "enhance-visitors": "^1.0.0", - "eslint-utils": "^3.0.0", - "espree": "^9.0.0", - "espurify": "^2.1.1", - "import-modules": "^2.1.0", + "espree": "^11.1.0", + "espurify": "^3.2.0", "micro-spelling-correcter": "^1.1.1", - "pkg-dir": "^5.0.0", "resolve-from": "^5.0.0" }, "engines": { - "node": "^18.18 || >=20" + "node": ">=20.19" }, "peerDependencies": { - "eslint": ">=9" - } - }, - "node_modules/eslint-plugin-ava/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "eslint": ">=10" } }, "node_modules/eslint-plugin-ava/node_modules/resolve-from": { @@ -4636,18 +4889,19 @@ } }, "node_modules/eslint-plugin-import-x": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", - "integrity": "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.2.tgz", + "integrity": "sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "^8.35.0", + "@package-json/types": "^0.0.12", + "@typescript-eslint/types": "^8.56.0", "comment-parser": "^1.4.1", "debug": "^4.4.1", "eslint-import-context": "^0.1.9", "is-glob": "^4.0.3", - "minimatch": "^9.0.3 || ^10.0.1", + "minimatch": "^9.0.3 || ^10.1.2", "semver": "^7.7.2", "stable-hash-x": "^0.2.0", "unrs-resolver": "^1.9.2" @@ -4659,8 +4913,8 @@ "url": "https://opencollective.com/eslint-plugin-import-x" }, "peerDependencies": { - "@typescript-eslint/utils": "^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", + "@typescript-eslint/utils": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "eslint-import-resolver-node": "*" }, "peerDependenciesMeta": { @@ -4673,9 +4927,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "17.23.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.2.tgz", - "integrity": "sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==", + "version": "17.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz", + "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==", "dev": true, "license": "MIT", "dependencies": { @@ -4712,25 +4966,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-no-use-extend-native": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.7.2.tgz", - "integrity": "sha512-hUBlwaTXIO1GzTwPT6pAjvYwmSHe4XduDhAiQvur4RUujmBUFjd8Nb2+e7WQdsQ+nGHWGRlogcUWXJRGqizTWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-get-set-prop": "^2.0.0", - "is-js-type": "^3.0.0", - "is-obj-prop": "^2.0.0", - "is-proto-prop": "^3.0.1" - }, - "engines": { - "node": ">=18.18.0" - }, - "peerDependencies": { - "eslint": "^9.3.0" - } - }, "node_modules/eslint-plugin-prettier": { "version": "5.5.5", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", @@ -4763,10 +4998,9 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", - "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", - "dev": true, + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.3.0.tgz", + "integrity": "sha512-6uGiOR0INuujr6PEQmeSSP7GbIMJ/ebEXXiEzb/nOj68LknH5Pxzb/AbZivmr6VE6TkTE8rTjRK9zhKpK6HsRA==", "license": "ISC", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0" @@ -4778,7 +5012,7 @@ "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/eslint-plugin-react": { @@ -4815,160 +5049,184 @@ } }, "node_modules/eslint-plugin-react-dom": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-dom/-/eslint-plugin-react-dom-2.7.2.tgz", - "integrity": "sha512-Qzd4HAFwsxvOJoAycLIRxziOTJwEZ6EGAA6jEFFBSD1BbFVnDlozMvOLp9/+GrZW3cE0FGmAS6QXnjuMf0QYLQ==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-dom/-/eslint-plugin-react-dom-5.6.4.tgz", + "integrity": "sha512-M4yqFc88kD3D1k2chHTE1l+55uR9oXaoJfNrzGeMrd1YmLnjG7VWGQfWwG+sizyOp3+lLc1Nr3/A95pCfIY8aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@eslint-react/jsx": "5.6.4", + "@eslint-react/shared": "5.6.4", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1", + "compare-versions": "^6.1.1" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "eslint": "^10.2.1", + "typescript": "*" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/core": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@eslint-react/var": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "compare-versions": "^6.1.1", - "string-ts": "^2.3.1", - "ts-pattern": "^5.9.0" + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" }, "engines": { - "node": ">=20.19.0" + "node": ">=18" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "node_modules/eslint-plugin-react-jsx": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-jsx/-/eslint-plugin-react-jsx-5.6.4.tgz", + "integrity": "sha512-S44anDxpDGRXrRkQmFH0WzfcXRQDh7QFyk1OC9CANp+fpmdwJdJ42jbpmrhE21A7pu+QgFKU/yZQb1MpP4JxgQ==", "dev": true, "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.6.4", + "@eslint-react/core": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@eslint-react/jsx": "5.6.4", + "@eslint-react/shared": "5.6.4", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1" + }, "engines": { - "node": ">=10" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, - "node_modules/eslint-plugin-react-hooks-extra": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks-extra/-/eslint-plugin-react-hooks-extra-2.7.2.tgz", - "integrity": "sha512-wcjQeBO1naCFPV47osw7nnK2p81eudCE2PhasKLtBV+GcAEi34jbt9QGULzQYueP+zd1aW53SmnVrTinY4DC6w==", + "node_modules/eslint-plugin-react-naming-convention": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-5.6.4.tgz", + "integrity": "sha512-HWUHU5o5NRBui6pkLzlzoY2KoE4TYxjSQTJ91//ZmCKYhvmI5BjzoIqosY9o5WkMKZ2gPdKXsA0HSOI1i++hgg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/core": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@eslint-react/var": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/type-utils": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "string-ts": "^2.3.1", + "@eslint-react/ast": "5.6.4", + "@eslint-react/core": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@eslint-react/var": "5.6.4", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1", "ts-pattern": "^5.9.0" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, - "node_modules/eslint-plugin-react-naming-convention": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-2.7.2.tgz", - "integrity": "sha512-T+/RQFEda3AgCzBHguE3isLQetn8KUOZ14SnDBQSOZSWS/GjgQn+gmqHi3EVHX/sDdL+LsIUKRsRR6KmmYWMiw==", + "node_modules/eslint-plugin-react-rsc": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-rsc/-/eslint-plugin-react-rsc-5.6.4.tgz", + "integrity": "sha512-HXe5fTrFeRKstyJdAwqQ/0YXCgqJXrwrxsTbLkPqToVuxi005MnUuZvOHlUQdxtihXMDhMnMwtJThnlFz96AYg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/core": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@eslint-react/var": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/type-utils": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "compare-versions": "^6.1.1", - "string-ts": "^2.3.1", - "ts-pattern": "^5.9.0" + "@eslint-react/ast": "5.6.4", + "@eslint-react/core": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@eslint-react/shared": "5.6.4", + "@eslint-react/var": "5.6.4", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, "node_modules/eslint-plugin-react-web-api": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-2.7.2.tgz", - "integrity": "sha512-iA3D8jbwasMeeUfK8XucGkgrjQvZowCTi1+TzA43U7IFsWzyQWQpbN/I9B0BY/g6/JU9falC5b7qv6HB7P5JhA==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-5.6.4.tgz", + "integrity": "sha512-L65S4Z0dxhSuKd6gkt+uzKLlqa6/ZqphwZcX0lT++wpwp2RrJDZtU4f+6jJxt/kh4cGaXCNP/cIx02NDT/k7qg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/core": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@eslint-react/var": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "string-ts": "^2.3.1", + "@eslint-react/ast": "5.6.4", + "@eslint-react/core": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@eslint-react/shared": "5.6.4", + "@eslint-react/var": "5.6.4", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1", + "birecord": "^0.1.1", "ts-pattern": "^5.9.0" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, "node_modules/eslint-plugin-react-x": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-x/-/eslint-plugin-react-x-2.7.2.tgz", - "integrity": "sha512-0NbYqJhc3tZQVluaFMVCOg6HEFarlNNXe+DHa/JrLAR0PVb9AtJGk8FBEDdxaUZO8ph0sAekUNLB7gymftj4Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/core": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@eslint-react/var": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/type-utils": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-x/-/eslint-plugin-react-x-5.6.4.tgz", + "integrity": "sha512-RR3YvZLnQC8jiH7SLKNaU0cTUCraXpKV/bTXXuwqKQ7wi/4bg3EJfiYtf18chHzWm2zg0pU9HGp5f6bGw7RGIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "5.6.4", + "@eslint-react/core": "5.6.4", + "@eslint-react/eslint": "5.6.4", + "@eslint-react/jsx": "5.6.4", + "@eslint-react/shared": "5.6.4", + "@eslint-react/var": "5.6.4", + "@typescript-eslint/scope-manager": "^8.59.1", + "@typescript-eslint/type-utils": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/typescript-estree": "^8.59.1", + "@typescript-eslint/utils": "^8.59.1", "compare-versions": "^6.1.1", - "is-immutable-type": "^5.0.1", "string-ts": "^2.3.1", - "ts-api-utils": "^2.4.0", + "ts-api-utils": "^2.5.0", "ts-pattern": "^5.9.0" }, "engines": { - "node": ">=20.19.0" + "node": ">=22.0.0" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^10.2.1", + "typescript": "*" } }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -4977,9 +5235,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -4990,19 +5248,25 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5018,9 +5282,9 @@ } }, "node_modules/eslint-plugin-svelte": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.14.0.tgz", - "integrity": "sha512-Isw0GvaMm0yHxAj71edAdGFh28ufYs+6rk2KlbbZphnqZAzrH3Se3t12IFh2H9+1F/jlDhBBL4oiOJmLqmYX0g==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.17.1.tgz", + "integrity": "sha512-NyiXHtS3Ni7e532RBwS9OXlMKDIrENg3gY+/+ODjZzQx2xhU3NlJ+nIl1a93iUUQeiJL3lS8KLmY+W8hklzweQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5042,7 +5306,7 @@ "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "eslint": "^8.57.1 || ^9.0.0", + "eslint": "^8.57.1 || ^9.0.0 || ^10.0.0", "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { @@ -5051,92 +5315,38 @@ } } }, - "node_modules/eslint-plugin-svelte/node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-unicorn": { - "version": "59.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz", - "integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==", + "version": "63.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-63.0.0.tgz", + "integrity": "sha512-Iqecl9118uQEXYh7adylgEmGfkn5es3/mlQTLLkd4pXkIk9CTGrAbeUux+YljSa2ohXCBmQQ0+Ej1kZaFgcfkA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "@eslint-community/eslint-utils": "^4.5.1", - "@eslint/plugin-kit": "^0.2.7", - "ci-info": "^4.2.0", + "@babel/helper-validator-identifier": "^7.28.5", + "@eslint-community/eslint-utils": "^4.9.0", + "change-case": "^5.4.4", + "ci-info": "^4.3.1", "clean-regexp": "^1.0.0", - "core-js-compat": "^3.41.0", - "esquery": "^1.6.0", + "core-js-compat": "^3.46.0", "find-up-simple": "^1.0.1", - "globals": "^16.0.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.1", - "strip-indent": "^4.0.0" + "regjsparser": "^0.13.0", + "semver": "^7.7.3", + "strip-indent": "^4.1.1" }, "engines": { - "node": "^18.20.0 || ^20.10.0 || >=21.0.0" + "node": "^20.10.0 || >=21.0.0" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=9.22.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.13.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "eslint": ">=9.38.0" } }, "node_modules/eslint-rule-docs": { @@ -5147,56 +5357,28 @@ "license": "MIT" }, "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5205,56 +5387,33 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/eslint/node_modules/@eslint/plugin-kit": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@types/json-schema": "^7.0.15" + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/esm-env": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", @@ -5263,40 +5422,40 @@ "license": "MIT" }, "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espurify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.1.1.tgz", - "integrity": "sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-3.2.0.tgz", + "integrity": "sha512-+jfGpC1eUu7s4M8sXnnoUsQfEQ1qqkEr/S+V47QR+GC/NODe98s4iPYq/2KrNaS1guTjHBhMS4j9N3NOObT1WQ==", "dev": true, "license": "MIT" }, @@ -5314,13 +5473,21 @@ } }, "node_modules/esrap": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.2.tgz", - "integrity": "sha512-zA6497ha+qKvoWIK+WM9NAh5ni17sKZKhbS5B3PoYbBvaYHZWoS33zmFybmyqpn07RLUxSmn+RCls2/XF+d0oQ==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.5.tgz", + "integrity": "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "peerDependencies": { + "@typescript-eslint/types": "^8.2.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/types": { + "optional": true + } } }, "node_modules/esrecurse": { @@ -5452,13 +5619,14 @@ } }, "node_modules/fast-ignore": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-ignore/-/fast-ignore-1.1.3.tgz", - "integrity": "sha512-xTo4UbrOKfEQgOFlPaqFScodTV/Wf3KATEqCZZSMh6OP4bcez0lTsqww3n3/Fve1q9u0jmfDP0q0nOhH4POZEg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-ignore/-/fast-ignore-2.0.0.tgz", + "integrity": "sha512-41OOPBgTDyVjF2oytGXvmqm56a38znzWLTQhvD3gp3FPCs37+j7qYjWDnL2WEA0P/Z80W53MKAXNJxc0JT8Tpw==", "dev": true, + "license": "MIT", "dependencies": { - "grammex": "^3.1.2", - "string-escape-regex": "^1.0.0" + "grammex": "^3.1.12", + "string-escape-regex": "^1.0.1" } }, "node_modules/fast-json-stable-stringify": { @@ -5519,19 +5687,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/figures/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -5623,22 +5778,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-directory/node_modules/pkg-dir": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", - "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up-simple": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5669,12 +5808,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fit-textarea": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fit-textarea/-/fit-textarea-2.0.0.tgz", - "integrity": "sha512-3Nm69derMr/9EIwIuOqU8yR/SbYI7xBkJ4Vd35AVv1Xto0pQTDPa0lEe5cULrgIEUbPu/lhXBd2eus5cZTqkPA==", - "license": "MIT" - }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -5696,9 +5829,9 @@ "license": "MIT" }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -5739,37 +5872,37 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/get-set-props": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.2.0.tgz", - "integrity": "sha512-YCmOj+4YAeEB5Dd9jfp6ETdejMet4zSxXjNkgaa4npBEKRI9uDOGB5MmAdAgi2OoFGAKshYhCbmLq2DS03CgVA==", + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-10.0.0.tgz", + "integrity": "sha512-eWSePJ4zXFdqz+/Lyfopob4rIcoF/U2XfE8nJc7iZV6lnebWc9k7DoQQpX+2a9jc0AOvBsXvbe5YkjXl/MHbpg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5793,9 +5926,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", "dev": true, "license": "MIT", "dependencies": { @@ -5806,18 +5939,18 @@ } }, "node_modules/github-reserved-names": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/github-reserved-names/-/github-reserved-names-2.1.1.tgz", - "integrity": "sha512-p8eMxZksQzh/z1awZz7NniSODL2QphpmpKNfGqPiN+BA/YjUaNtHkZoxK+kk/GP6go4imM1jprU0JAQG4tJ2mg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/github-reserved-names/-/github-reserved-names-2.1.4.tgz", + "integrity": "sha512-vYX2BF5FbuU4ZAnItSCPNCWFpwJzc1tncw3DTp0FmQXsyAKKaVmWwnatvYt5dLppgS4lGaKczq/LN2rbJ0rx0A==", "license": "MIT" }, "node_modules/github-url-detection": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/github-url-detection/-/github-url-detection-11.1.3.tgz", - "integrity": "sha512-yIi7NJ34EYfwX7o3GhxlJKqflQsVq/CiOI8Q1DtQgQ22kaaodua4+efJ51GSLynhVx/fCweW8BIKVHvtBQV/WQ==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/github-url-detection/-/github-url-detection-11.2.1.tgz", + "integrity": "sha512-lxmDkx8v/uGB7u1hCgT5udLgnxNhhahE0ehYlbrM+T23aTU5fPfzfx2jswmuvcoW2Mdf7deYi6fZ4PmN6Zam/Q==", "license": "MIT", "dependencies": { - "github-reserved-names": "^2.1.1" + "github-reserved-names": "^2.1.3" }, "engines": { "node": ">=22.18" @@ -5830,7 +5963,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -5861,10 +5994,17 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -5873,9 +6013,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -5886,9 +6026,9 @@ } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -5940,13 +6080,16 @@ "license": "MIT" }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", + "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/hasown": { @@ -5960,6 +6103,23 @@ "node": ">=12.4.0" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/highlight.js": { "version": "11.11.1", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", @@ -6072,19 +6232,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-modules": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.1.0.tgz", - "integrity": "sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6217,23 +6364,9 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-get-set-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-get-set-prop/-/is-get-set-prop-2.0.0.tgz", - "integrity": "sha512-C32bqXfHJfRwa0U5UIMqSGziZhALszXDJZ8n8mz8WZ6c6V7oYGHEWwJvftliBswypY3P3EQqdY5lpDSEKvTS1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-set-props": "^0.2.0", - "lowercase-keys": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": "> 18.0.0" + "node": ">=0.10.0" } }, "node_modules/is-glob": { @@ -6249,20 +6382,17 @@ "node": ">=0.10.0" } }, - "node_modules/is-immutable-type": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/is-immutable-type/-/is-immutable-type-5.0.1.tgz", - "integrity": "sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==", + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@typescript-eslint/type-utils": "^8.0.0", - "ts-api-utils": "^2.0.0", - "ts-declaration-location": "^1.0.4" + "license": "MIT", + "engines": { + "node": ">=20" }, - "peerDependencies": { - "eslint": "*", - "typescript": ">=4.7.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-inside-container": { @@ -6284,19 +6414,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-js-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-js-type/-/is-js-type-3.0.0.tgz", - "integrity": "sha512-IbPf3g3vxm1D902xaBaYp2TUHiXZWwWRu5bM9hgKN9oAQcFaKALV6Gd13PGhXjKE5u2n8s1PhLhdke/E1fchxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-types": "^4.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -6314,20 +6431,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-obj-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj-prop/-/is-obj-prop-2.0.0.tgz", - "integrity": "sha512-2/VFrbzXSZVJIscazpxoB+pOQx2jBOAAL9Gui4cRKxflznUNBpsr8IDvBA4UGol3e40sltLNiY3qnZv/7qSUxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0", - "obj-props": "^2.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/is-path-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", @@ -6377,20 +6480,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-proto-prop": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-proto-prop/-/is-proto-prop-3.0.1.tgz", - "integrity": "sha512-S8xSxNMGJO4eZD86kO46zrq2gLIhA+rN9443lQEvt8Mz/l8cxk72p/AWFmofY6uL9g9ILD6cXW6j8QQj4F3Hcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0", - "prototype-properties": "^5.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -6415,22 +6504,22 @@ } }, "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -6500,19 +6589,6 @@ "dev": true, "license": "MIT" }, - "node_modules/js-types": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-types/-/js-types-4.0.0.tgz", - "integrity": "sha512-/c+n06zvqFQGxdz1BbElF7S3nEghjNchLN1TjQnk2j10HYDaUc57rcvl6BbnziTx8NQmrg0JOs/iwRpvcYaxjQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -6570,6 +6646,19 @@ "dev": true, "license": "MIT" }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -6628,9 +6717,9 @@ } }, "node_modules/lightningcss": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", - "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -6644,23 +6733,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.31.1", - "lightningcss-darwin-arm64": "1.31.1", - "lightningcss-darwin-x64": "1.31.1", - "lightningcss-freebsd-x64": "1.31.1", - "lightningcss-linux-arm-gnueabihf": "1.31.1", - "lightningcss-linux-arm64-gnu": "1.31.1", - "lightningcss-linux-arm64-musl": "1.31.1", - "lightningcss-linux-x64-gnu": "1.31.1", - "lightningcss-linux-x64-musl": "1.31.1", - "lightningcss-win32-arm64-msvc": "1.31.1", - "lightningcss-win32-x64-msvc": "1.31.1" + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", - "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", "cpu": [ "arm64" ], @@ -6679,9 +6768,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", - "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], @@ -6700,9 +6789,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", - "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", "cpu": [ "x64" ], @@ -6721,9 +6810,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", - "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", "cpu": [ "x64" ], @@ -6742,9 +6831,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", - "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", "cpu": [ "arm" ], @@ -6763,9 +6852,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", - "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", "cpu": [ "arm64" ], @@ -6784,9 +6873,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", - "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", "cpu": [ "arm64" ], @@ -6805,9 +6894,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", - "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "cpu": [ "x64" ], @@ -6826,9 +6915,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", - "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "cpu": [ "x64" ], @@ -6847,9 +6936,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", - "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "cpu": [ "arm64" ], @@ -6868,9 +6957,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", - "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "cpu": [ "x64" ], @@ -6899,29 +6988,16 @@ } }, "node_modules/line-column-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/line-column-path/-/line-column-path-3.0.0.tgz", - "integrity": "sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/line-column-path/-/line-column-path-4.0.0.tgz", + "integrity": "sha512-Zvpvd56i9FRV5kaJFiiY1t+FNMEH+dGEaLyQprqKlGHBAxJXmdSk+8tVsh6b9YlxbfyyuLrhJCkzwB+AmOBZ0g==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^2.0.0" + "unicorn-magic": "^0.4.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/line-column-path/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7014,9 +7090,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, @@ -7027,13 +7103,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -7042,14 +7111,14 @@ "license": "MIT" }, "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" }, "engines": { "node": ">=18" @@ -7058,19 +7127,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7084,17 +7140,14 @@ "loose-envify": "cli.js" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/lz-string": { @@ -7117,22 +7170,22 @@ } }, "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.23.0.tgz", + "integrity": "sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==", "dev": true, "license": "CC0-1.0" }, "node_modules/memoize": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.2.0.tgz", - "integrity": "sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-11.0.0.tgz", + "integrity": "sha512-cjsfZaC9b1clqPeIVMbb5dLHSXgdgGWGxdAU3oTUUkHiwWTKTBNnSmcqWJncNjYtBi3S8Rp0c5GIiyGztR8TRA==", "license": "MIT", "dependencies": { "mimic-function": "^5.0.1" }, "engines": { - "node": ">=18" + "node": ">=22" }, "funding": { "url": "https://github.com/sindresorhus/memoize?sponsor=1" @@ -7148,13 +7201,13 @@ } }, "node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", + "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7192,9 +7245,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -7240,16 +7293,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7316,10 +7369,39 @@ "dev": true, "license": "MIT" }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "dev": true, "license": "MIT" }, @@ -7373,27 +7455,14 @@ "npm": ">= 10" } }, - "node_modules/npm-run-all2/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/npm-run-all2/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/npm-run-all2/node_modules/which": { @@ -7442,6 +7511,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -7455,16 +7537,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/obj-props": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/obj-props/-/obj-props-2.0.0.tgz", - "integrity": "sha512-Q/uLAAfjdhrzQWN2czRNh3fDCgXjh7yRIkdHjDgIHTwpFP0BsshxTA3HRNffHR7Iw/XGTH30u8vdMXQ+079urA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7475,6 +7547,16 @@ "node": ">=0.10.0" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.assign": { "name": "@nolyfill/object.assign", "version": "1.0.44", @@ -7543,9 +7625,9 @@ "license": "MIT" }, "node_modules/octicons-plain-react": { - "version": "19.21.2", - "resolved": "https://registry.npmjs.org/octicons-plain-react/-/octicons-plain-react-19.21.2.tgz", - "integrity": "sha512-oGO8khyIM/WynBLwHZMHVQLqDme5wfBIsstPrNpWuzCzaTgGHs+/rSbj78iWq6bOYu6LK9yMLprmJQd4Lfyo2g==", + "version": "19.25.0", + "resolved": "https://registry.npmjs.org/octicons-plain-react/-/octicons-plain-react-19.25.0.tgz", + "integrity": "sha512-SqA9egQeHeSvbWTEl/0K4f5BKwiveRPYmi1dDhF++R4fgpvR1Lnu+4jrgEgnz/TwZYVhZeRk5NffgXuAHwlz7g==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -7586,38 +7668,40 @@ } }, "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", "dev": true, "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", + "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open-editor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/open-editor/-/open-editor-5.1.0.tgz", - "integrity": "sha512-KkNqM6FdoegD6WhY2YXmWcovOux45NV+zBped2+G3+V74zkDPkIl4cqh6hte2zNDojtwO2nBOV8U+sgziWfPrg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/open-editor/-/open-editor-6.0.0.tgz", + "integrity": "sha512-LGd2Xn6NvFlbx/lg/HK69w6Dbg+21MzJzcPDPQRgDRqc+qiR+2/SN99rzZSo7Qa1ck1hcGYig0CAo53cmXCE0w==", "dev": true, "license": "MIT", "dependencies": { - "env-editor": "^1.1.0", - "execa": "^9.3.0", - "line-column-path": "^3.0.0", - "open": "^10.1.0" + "env-editor": "^1.3.0", + "execa": "^9.6.0", + "line-column-path": "^4.0.0", + "open": "^11.0.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7880,9 +7964,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -7916,16 +8000,19 @@ } }, "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", + "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^5.0.0" + "find-up-simple": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/plur": { @@ -7955,9 +8042,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", + "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", "dev": true, "funding": [ { @@ -8611,6 +8698,19 @@ "dev": true, "license": "MIT" }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8635,9 +8735,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { @@ -8663,17 +8763,6 @@ "node": ">=6.0.0" } }, - "node_modules/prettier-plugin-svelte": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.1.tgz", - "integrity": "sha512-xL49LCloMoZRvSwa6IEdN2GV6cq2IqpYGstYtMT+5wmml1/dClEoI0MZR78MiVPpu6BdQFfN0/y73yO6+br5Pg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "prettier": "^3.0.0", - "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" - } - }, "node_modules/pretty-bytes": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-7.1.0.tgz", @@ -8714,19 +8803,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prototype-properties": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/prototype-properties/-/prototype-properties-5.0.0.tgz", - "integrity": "sha512-uCWE2QqnGlwvvJXTwiHTPTyHE62+zORO5hpFWhAwBGDtEtTmNZZleNLJDoFsqHCL4p/CeAP2Q1uMKFUKALuRGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -8833,31 +8909,18 @@ } }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/request-animation-frames": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/request-animation-frames/-/request-animation-frames-1.0.0.tgz", @@ -8871,12 +8934,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -8932,10 +8996,44 @@ "node": ">=0.10.0" } }, + "node_modules/rolldown": { + "version": "1.0.0-rc.17", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz", + "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.127.0", + "@rolldown/pluginutils": "1.0.0-rc.17" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", + "@rolldown/binding-darwin-x64": "1.0.0-rc.17", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" + } + }, "node_modules/rollup": { - "version": "4.56.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", - "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8949,31 +9047,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.56.0", - "@rollup/rollup-android-arm64": "4.56.0", - "@rollup/rollup-darwin-arm64": "4.56.0", - "@rollup/rollup-darwin-x64": "4.56.0", - "@rollup/rollup-freebsd-arm64": "4.56.0", - "@rollup/rollup-freebsd-x64": "4.56.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", - "@rollup/rollup-linux-arm-musleabihf": "4.56.0", - "@rollup/rollup-linux-arm64-gnu": "4.56.0", - "@rollup/rollup-linux-arm64-musl": "4.56.0", - "@rollup/rollup-linux-loong64-gnu": "4.56.0", - "@rollup/rollup-linux-loong64-musl": "4.56.0", - "@rollup/rollup-linux-ppc64-gnu": "4.56.0", - "@rollup/rollup-linux-ppc64-musl": "4.56.0", - "@rollup/rollup-linux-riscv64-gnu": "4.56.0", - "@rollup/rollup-linux-riscv64-musl": "4.56.0", - "@rollup/rollup-linux-s390x-gnu": "4.56.0", - "@rollup/rollup-linux-x64-gnu": "4.56.0", - "@rollup/rollup-linux-x64-musl": "4.56.0", - "@rollup/rollup-openbsd-x64": "4.56.0", - "@rollup/rollup-openharmony-arm64": "4.56.0", - "@rollup/rollup-win32-arm64-msvc": "4.56.0", - "@rollup/rollup-win32-ia32-msvc": "4.56.0", - "@rollup/rollup-win32-x64-gnu": "4.56.0", - "@rollup/rollup-win32-x64-msvc": "4.56.0", + "@rollup/rollup-android-arm-eabi": "4.60.2", + "@rollup/rollup-android-arm64": "4.60.2", + "@rollup/rollup-darwin-arm64": "4.60.2", + "@rollup/rollup-darwin-x64": "4.60.2", + "@rollup/rollup-freebsd-arm64": "4.60.2", + "@rollup/rollup-freebsd-x64": "4.60.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", + "@rollup/rollup-linux-arm64-gnu": "4.60.2", + "@rollup/rollup-linux-arm64-musl": "4.60.2", + "@rollup/rollup-linux-loong64-gnu": "4.60.2", + "@rollup/rollup-linux-loong64-musl": "4.60.2", + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", + "@rollup/rollup-linux-ppc64-musl": "4.60.2", + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", + "@rollup/rollup-linux-riscv64-musl": "4.60.2", + "@rollup/rollup-linux-s390x-gnu": "4.60.2", + "@rollup/rollup-linux-x64-gnu": "4.60.2", + "@rollup/rollup-linux-x64-musl": "4.60.2", + "@rollup/rollup-openbsd-x64": "4.60.2", + "@rollup/rollup-openharmony-arm64": "4.60.2", + "@rollup/rollup-win32-arm64-msvc": "4.60.2", + "@rollup/rollup-win32-ia32-msvc": "4.60.2", + "@rollup/rollup-win32-x64-gnu": "4.60.2", + "@rollup/rollup-win32-x64-msvc": "4.60.2", "fsevents": "~2.3.2" } }, @@ -9028,9 +9126,9 @@ } }, "node_modules/rollup-plugin-stats": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/rollup-plugin-stats/-/rollup-plugin-stats-1.5.4.tgz", - "integrity": "sha512-b1hYagYLTyr8mCVUb7e1x9fjxOXFyeWmV9hIr7vYqq/agN+WDaGNzz+KmM3GAx0KGGI2qllOL+zAUi/l39s/Sg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-stats/-/rollup-plugin-stats-2.1.2.tgz", + "integrity": "sha512-xxeHvcpRheH8MungJfBIx71DSwU27nMVzUbImJt7uAt6jywRuNWwWYHpX8/jEg2Xg8LMazRuvXXpb2n6cn02Bw==", "dev": true, "license": "MIT", "engines": { @@ -9039,7 +9137,7 @@ "peerDependencies": { "rolldown": "^1.0.0-beta.0", "rollup": "^3.0.0 || ^4.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "rolldown": { @@ -9126,9 +9224,9 @@ } }, "node_modules/rollup-plugin-styles/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9139,9 +9237,9 @@ } }, "node_modules/rollup-plugin-styles/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -9194,9 +9292,9 @@ } }, "node_modules/rollup-plugin-svelte/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -9207,13 +9305,13 @@ } }, "node_modules/rollup-plugin-webpack-stats": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/rollup-plugin-webpack-stats/-/rollup-plugin-webpack-stats-2.1.9.tgz", - "integrity": "sha512-ft1vdp3xPjE+zw8A22yCToo5cpymoWCjNDefWNO1awywsDrSDoRJhkoZTENkhJwmfh6oe5ztpGu7PfnJOMXc2g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-webpack-stats/-/rollup-plugin-webpack-stats-3.1.2.tgz", + "integrity": "sha512-giqyWCbYawAJpcu3jjYnh3nlUYhf/CEEOLCOmFWSyNzPepfAQ9vBIg9U2mwey5OKF6smtj0tBeD+SHUvmVv9jw==", "dev": true, "license": "MIT", "dependencies": { - "rollup-plugin-stats": "1.5.4" + "rollup-plugin-stats": "2.1.2" }, "engines": { "node": ">=18" @@ -9221,7 +9319,7 @@ "peerDependencies": { "rolldown": "^1.0.0-beta.0", "rollup": "^3.0.0 || ^4.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "rolldown": { @@ -9289,10 +9387,20 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/select-dom": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/select-dom/-/select-dom-9.5.0.tgz", - "integrity": "sha512-C1jgVNyPmAZQlZEG5I92tHTMFa+NEqajTn5MAax8iNpxOjfRzqm5HY+fohFJvJXIH/pEiJYggY8o/l8onp3lLQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/select-dom/-/select-dom-10.0.0.tgz", + "integrity": "sha512-pWiN404XxT9atzLRSQl5KNoxoBDOmfGPztNV1915k/bhpiEfbTlNKnhp8Ps19ItZMLfsD2BOPFA11XKoCQSBrA==", "license": "MIT", "dependencies": { "typed-query-selector": "^2.11.0" @@ -9305,9 +9413,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -9506,9 +9614,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", "dev": true, "license": "MIT" }, @@ -9537,18 +9645,17 @@ "license": "MIT" }, "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9610,13 +9717,13 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -9650,19 +9757,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylehacks": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", @@ -9704,30 +9798,30 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.4.0.tgz", + "integrity": "sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "has-flag": "^5.0.1", + "supports-color": "^10.2.2" }, "engines": { - "node": ">=14.18" + "node": ">=20" }, "funding": { "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" @@ -9747,9 +9841,9 @@ } }, "node_modules/svelte": { - "version": "5.48.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.48.1.tgz", - "integrity": "sha512-gHdOWQILqvQgqvILjEd87yKy6OKHWlWu7hILXoxvEUo9+iPQ1snPHiR7IGiwRdaC1a9GWC8oWN6QSpQEIb28VQ==", + "version": "5.55.5", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.5.tgz", + "integrity": "sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw==", "dev": true, "license": "MIT", "dependencies": { @@ -9757,13 +9851,14 @@ "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", - "aria-query": "^5.3.1", + "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", - "devalue": "^5.6.2", + "devalue": "^5.6.4", "esm-env": "^1.2.1", - "esrap": "^2.2.1", + "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", @@ -9774,9 +9869,9 @@ } }, "node_modules/svelte-eslint-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.4.1.tgz", - "integrity": "sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.6.0.tgz", + "integrity": "sha512-qoB1ehychT6OxEtQAqc/guSqLS20SlA53Uijl7x375s8nlUT0lb9ol/gzraEEatQwsyPTJo87s2CmKL9Xab+Uw==", "dev": true, "license": "MIT", "dependencies": { @@ -9785,11 +9880,12 @@ "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", - "postcss-selector-parser": "^7.0.0" + "postcss-selector-parser": "^7.0.0", + "semver": "^7.7.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0", - "pnpm": "10.24.0" + "pnpm": "10.30.3" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" @@ -9803,6 +9899,23 @@ } } }, + "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/svelte-eslint-parser/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -9816,6 +9929,24 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/svelte-eslint-parser/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/svelte-eslint-parser/node_modules/postcss-selector-parser": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", @@ -9851,18 +9982,18 @@ } }, "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.2.tgz", + "integrity": "sha512-TyzE4NVGLUFy+H/Uy4N6c3G0HEeprsVfge6Lmq+0FdQQ/zqoVYB62IsBZORsiL+o96s6ff/V6/3UQo/C0cgCAA==", "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^4.1.3", "css-tree": "^1.1.3", "csso": "^4.2.0", "picocolors": "^1.0.0", + "sax": "^1.5.0", "stable": "^0.1.8" }, "bin": { @@ -9984,9 +10115,9 @@ } }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -10058,9 +10189,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", "dev": true, "license": "MIT", "engines": { @@ -10068,14 +10199,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -10085,9 +10216,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -10108,9 +10239,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -10144,9 +10275,9 @@ } }, "node_modules/ts-extras": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ts-extras/-/ts-extras-0.16.1.tgz", - "integrity": "sha512-mvLaDJDWP0g65CPyHPMaMK5xo8x8MO2BHWoRbk60GGMEuIXa403Ey0vk5N7jyT3lXtvUz6j+rOnIlu3ky8XxMg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ts-extras/-/ts-extras-1.0.0.tgz", + "integrity": "sha512-+TLxs47RxPDBowI0hwO2D92VeWkAsUygu6bdzGpWTkbOtEEZgyVRoLQbgJT0CO0QegviEN12RbT820xbmUaV4Q==", "license": "MIT", "dependencies": { "type-fest": "^5.0.1" @@ -10202,9 +10333,9 @@ } }, "node_modules/type-fest": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.1.tgz", - "integrity": "sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -10217,15 +10348,15 @@ } }, "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz", + "integrity": "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==", "license": "MIT" }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -10237,16 +10368,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.1.tgz", - "integrity": "sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.1.tgz", + "integrity": "sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.53.1", - "@typescript-eslint/parser": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1" + "@typescript-eslint/eslint-plugin": "8.59.1", + "@typescript-eslint/parser": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/utils": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10256,8 +10387,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/uhyphen": { @@ -10280,9 +10411,9 @@ } }, "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", "dev": true, "license": "MIT" }, @@ -10296,20 +10427,20 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "dev": true, "license": "MIT" }, "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10454,18 +10585,17 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", + "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.10", + "rolldown": "1.0.0-rc.17", + "tinyglobby": "^0.2.16" }, "bin": { "vite": "bin/vite.js" @@ -10481,9 +10611,10 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -10496,13 +10627,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { + "optional": true + }, + "jiti": { "optional": true }, - "lightningcss": { + "less": { "optional": true }, "sass": { @@ -10529,31 +10663,31 @@ } }, "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", + "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", + "@vitest/expect": "4.1.5", + "@vitest/mocker": "4.1.5", + "@vitest/pretty-format": "4.1.5", + "@vitest/runner": "4.1.5", + "@vitest/snapshot": "4.1.5", + "@vitest/spy": "4.1.5", + "@vitest/utils": "4.1.5", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "std-env": "^3.10.0", + "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "bin": { @@ -10569,12 +10703,15 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", + "@vitest/browser-playwright": "4.1.5", + "@vitest/browser-preview": "4.1.5", + "@vitest/browser-webdriverio": "4.1.5", + "@vitest/coverage-istanbul": "4.1.5", + "@vitest/coverage-v8": "4.1.5", + "@vitest/ui": "4.1.5", "happy-dom": "*", - "jsdom": "*" + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -10595,6 +10732,12 @@ "@vitest/browser-webdriverio": { "optional": true }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, "@vitest/ui": { "optional": true }, @@ -10603,6 +10746,9 @@ }, "jsdom": { "optional": true + }, + "vite": { + "optional": false } } }, @@ -10632,15 +10778,14 @@ } }, "node_modules/webext-bugs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/webext-bugs/-/webext-bugs-1.1.1.tgz", - "integrity": "sha512-9WrxICnaV6fBibJ29MUxib9WsaVNhPn/CKwqZUJJgXhNeaIECJNcSge/tif7AxVCFxFuC8YZNb4XDzDgS7oseg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webext-bugs/-/webext-bugs-2.0.1.tgz", + "integrity": "sha512-M3Yn7lK+HjnNZL54INAvYmuphETgF9HxrJET4Q7q20jfC1HWSqWxfti4reRsOuKJWh8m0sXIyws3pMnmCsOBcA==", "license": "MIT", "dependencies": { "filter-altered-clicks": "^2.1.1", - "webext-alert": "^1.0.3", + "webext-alert": "^1.1.0", "webext-detect": "^5.3.2", - "webext-polyfill-kinda": "^1.0.2", "webext-tools": "^3.0.0" }, "engines": { @@ -10650,10 +10795,27 @@ "url": "https://github.com/sponsors/fregante" } }, + "node_modules/webext-bugs/node_modules/webext-tools": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webext-tools/-/webext-tools-3.0.0.tgz", + "integrity": "sha512-CqxJetvu7mxDf8yqr0/hFotxUP+9Zw7JT76tbdVo62Py2zhM+rRcsbordwX9jWXMX4q0qw1bk1aHXSxy0coCDw==", + "license": "MIT", + "dependencies": { + "webext-content-scripts": "^2.7.0", + "webext-detect": "^5.3.2", + "webext-polyfill-kinda": "^1.0.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, "node_modules/webext-content-scripts": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/webext-content-scripts/-/webext-content-scripts-2.7.2.tgz", - "integrity": "sha512-7e6ZHha2jUww3RXWBkqBkSNa/qVPp8bHHY4BNDPfFIOkCebR+mjDq67BgWxnO51OUJU5skntRndjGmEGVcgvpQ==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/webext-content-scripts/-/webext-content-scripts-2.7.3.tgz", + "integrity": "sha512-WIy69Hq2tNVQjt8ALHoAR28cIse/hD256nB+tSZ9eKDb+fJEl73CtvXBOmyOY4ylSSuTUHHKFspnDAZh0ZvENA==", "license": "MIT", "dependencies": { "webext-patterns": "^1.5.0", @@ -10766,6 +10928,21 @@ "url": "https://github.com/sponsors/fregante" } }, + "node_modules/webext-options-sync-per-domain/node_modules/memoize": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.2.0.tgz", + "integrity": "sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/memoize?sponsor=1" + } + }, "node_modules/webext-patterns": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.5.1.tgz", @@ -10814,6 +10991,23 @@ "url": "https://github.com/sponsors/fregante" } }, + "node_modules/webext-permission-toggle/node_modules/webext-tools": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webext-tools/-/webext-tools-3.0.0.tgz", + "integrity": "sha512-CqxJetvu7mxDf8yqr0/hFotxUP+9Zw7JT76tbdVo62Py2zhM+rRcsbordwX9jWXMX4q0qw1bk1aHXSxy0coCDw==", + "license": "MIT", + "dependencies": { + "webext-content-scripts": "^2.7.0", + "webext-detect": "^5.3.2", + "webext-polyfill-kinda": "^1.0.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, "node_modules/webext-permissions": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/webext-permissions/-/webext-permissions-3.1.4.tgz", @@ -10839,13 +11033,10 @@ } }, "node_modules/webext-storage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/webext-storage/-/webext-storage-2.0.1.tgz", - "integrity": "sha512-DbKAiV4xUva9grslYC/A7jv7mIlWikU+QvadQp54V21Hqsfx4fHWFhSF2GVvEcf7mSvTHOXp0U86hG5Qyv9W2w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/webext-storage/-/webext-storage-3.1.0.tgz", + "integrity": "sha512-tjOqhDCNfNNh5fj36jI84LJys1oYHNPEc1wjivEQe18Cz9QCuaqtIjzMQ29Io/IaM4nq3Er+HWgEXoN3u/Ox7g==", "license": "MIT", - "dependencies": { - "webext-polyfill-kinda": "^1.0.2" - }, "engines": { "node": ">=20" }, @@ -10884,13 +11075,13 @@ } }, "node_modules/webext-tools": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webext-tools/-/webext-tools-3.0.0.tgz", - "integrity": "sha512-CqxJetvu7mxDf8yqr0/hFotxUP+9Zw7JT76tbdVo62Py2zhM+rRcsbordwX9jWXMX4q0qw1bk1aHXSxy0coCDw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/webext-tools/-/webext-tools-4.0.0.tgz", + "integrity": "sha512-WBAnHbB37YniUW0PgF84EL1tZTl6zrmTLGP0Na4HvWwA8EjBaimy7JvBMJhsZgiHQQ/RkbwtKiJpLikHxvwVQw==", "license": "MIT", "dependencies": { - "webext-content-scripts": "^2.7.0", "webext-detect": "^5.3.2", + "webext-patterns": "^1.5.1", "webext-polyfill-kinda": "^1.0.2" }, "engines": { @@ -10958,100 +11149,73 @@ "license": "ISC" }, "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", "dev": true, "license": "MIT", "dependencies": { - "is-wsl": "^3.1.0" + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xo": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/xo/-/xo-1.2.3.tgz", - "integrity": "sha512-ykvWr88620CwealQwr7nWcPwolE6RMAVsCSBIdF3JnVdQUBAllnBJypSPsu0YYFzWTrJjQfNgH82lnWMPVTXnA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/xo/-/xo-2.0.2.tgz", + "integrity": "sha512-08L33hcKMksZyUAK7P8f6Hx5oiEgmya2NjgidvH2e3mBjot9kHz5vlxBjUPX5nparSgxBre/+xVPicat8P2WLQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", - "@sindresorhus/tsconfig": "^7.0.0", - "@stylistic/eslint-plugin": "^4.2.0", - "@typescript-eslint/parser": "^8.37.0", + "@eslint-community/eslint-plugin-eslint-comments": "^4.7.1", + "@eslint/compat": "^2.0.2", + "@sindresorhus/tsconfig": "^8.1.0", "arrify": "^3.0.0", "cosmiconfig": "^9.0.0", "define-lazy-prop": "^3.0.0", - "eslint": "^9.31.0", - "eslint-config-prettier": "^10.1.5", - "eslint-config-xo-react": "^0.28.0", - "eslint-config-xo-typescript": "^7.0.0", - "eslint-formatter-pretty": "^6.0.1", - "eslint-plugin-ava": "^15.0.1", + "eslint": "^10.0.2", + "eslint-config-prettier": "^10.1.8", + "eslint-config-xo-react": "^0.29.0", + "eslint-config-xo-typescript": "^10.0.0", + "eslint-formatter-pretty": "^7.0.0", + "eslint-plugin-ava": "^16.0.0", "eslint-plugin-import-x": "^4.16.1", - "eslint-plugin-n": "^17.21.0", - "eslint-plugin-no-use-extend-native": "^0.7.2", - "eslint-plugin-prettier": "^5.5.1", - "eslint-plugin-promise": "^7.2.1", - "eslint-plugin-unicorn": "^59.0.1", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-prettier": "^5.5.5", + "eslint-plugin-unicorn": "^63.0.0", "find-cache-directory": "^6.0.0", - "get-stdin": "^9.0.0", - "get-tsconfig": "^4.10.1", - "globals": "^16.3.0", - "globby": "^14.1.0", - "meow": "^13.2.0", + "get-stdin": "^10.0.0", + "get-tsconfig": "^4.13.6", + "globals": "^17.3.0", + "globby": "^16.1.1", + "meow": "^14.1.0", "micromatch": "^4.0.8", - "open-editor": "^5.1.0", + "open-editor": "^6.0.0", "path-exists": "^5.0.0", - "prettier": "^3.6.2", - "type-fest": "^4.41.0", - "typescript-eslint": "^8.37.0" + "prettier": "^3.8.1", + "type-fest": "^5.4.3", + "typescript": "^5.9.3", + "typescript-eslint": "^8.56.1" }, "bin": { "xo": "dist/cli.js" }, "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xo/node_modules/@sindresorhus/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-i5K04hLAP44Af16zmDjG07E1NHuDgCM07SJAT4gY0LZSRrWYzwt4qkLem6TIbIVh0k51RkN2bF+lP+lM5eC9fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node": ">=20.19" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xo/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11076,9 +11240,9 @@ } }, "node_modules/xo/node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", + "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", "dev": true, "license": "MIT", "engines": { @@ -11089,21 +11253,21 @@ } }, "node_modules/xo/node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.0.tgz", + "integrity": "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", + "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" + "unicorn-magic": "^0.4.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11129,19 +11293,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/xo/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/xo/node_modules/slash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", @@ -11155,23 +11306,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/xo/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "node_modules/xo/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=14.17" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", "dev": true, "license": "ISC", "engines": { @@ -11218,14 +11377,27 @@ "license": "MIT" }, "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.1.tgz", + "integrity": "sha512-a6ENMBBGZBsnlSebQ/eKCguSBeGKSf4O7BPnqVPmYGtpBYI7VSqoVqw+QcB7kPRjbqPwhYTpFbVj/RqNz/CT0Q==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } } } } diff --git a/package.json b/package.json index 28fc48070e47..0e4302ab0d37 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,12 @@ "build": "run-p build:* --continue-on-error", "build:typescript": "tsc --noEmit", "build:bundle": "rollup -c", - "fix": "run-p \"lint:biome -- --write\" \"lint:js -- --fix\" format \"vitest -- --update\" --continue-on-error", - "format": "prettier . --write && biome format --fix", + "fix": "run-p format \"lint:biome -- --write\" \"lint:eslint -- --fix\" \"vitest -- --update\" --continue-on-error", + "format": "dprint fmt", + "format:check": "dprint check", "lint": "run-p lint:* --continue-on-error", - "lint:js": "eslint .", - "lint:biome": "biome check", - "lint:prettier": "prettier . --check", + "lint:eslint": "eslint .", + "lint:biome": "biome lint", "new": "bash build/new-feature.sh", "pack:safari": "xcodebuild -project 'safari/Refined GitHub.xcodeproj' -scheme 'Refined GitHub' -destination 'platform=macOS'", "prepare:safari": "bash build/prepare-safari-release.sh", @@ -21,21 +21,6 @@ "watch:typescript": "tsc --noEmit --watch --preserveWatchOutput", "watch:bundle": "rollup -c --watch" }, - "prettier": { - "bracketSpacing": false, - "plugins": [ - "prettier-plugin-svelte" - ], - "singleQuote": true, - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] - }, "dependencies": { "@fregante/mi-cron": "^2.0.1", "@sindresorhus/to-milliseconds": "^2.0.0", @@ -48,93 +33,99 @@ "dom-loaded": "^3.1.0", "doma": "^4.0.0", "element-ready": "^9.0.2", + "eslint-plugin-promise": "^7.3.0", "filter-altered-clicks": "^2.1.1", - "fit-textarea": "^2.0.0", "flat-zip": "^1.0.1", - "github-reserved-names": "^2.1.1", - "github-url-detection": "^11.1.3", + "github-reserved-names": "^2.1.4", + "github-url-detection": "^11.2.1", "indent-textarea": "^4.0.0", "js-abbreviation-number": "^1.4.0", "linkify-issues": "^4.2.0", "linkify-urls": "^5.2.0", - "memoize": "^10.2.0", - "octicons-plain-react": "^19.21.2", + "memoize": "^11.0.0", + "octicons-plain-react": "^19.25.0", "one-event": "^4.4.0", "one-mutation": "^3.0.1", "pretty-bytes": "^7.1.0", "regex-join": "^2.1.0", - "select-dom": "^9.5.0", + "select-dom": "^10.0.0", "shorten-repo-url": "^6.0.0", "strip-indent": "^4.0.0", "text-field-edit": "^4.1.1", "tiny-version-compare": "^4.0.0", - "ts-extras": "^0.16.1", + "ts-extras": "^1.0.0", "twas": "^2.1.3", "uint8array-extras": "^1.5.0", "webext-alert": "^1.1.0", "webext-base-css": "^2.1.0", - "webext-bugs": "^1.1.1", - "webext-content-scripts": "^2.7.2", + "webext-bugs": "^2.0.1", + "webext-content-scripts": "^2.7.3", "webext-detect": "^5.3.1", "webext-dynamic-content-scripts": "^10.0.4", "webext-msg": "^1.0.0", "webext-options-sync": "^4.3.0", "webext-options-sync-per-domain": "^4.3.1", "webext-permission-toggle": "^6.0.1", - "webext-storage": "^2.0.1", + "webext-storage": "^3.1.0", "webext-storage-cache": "^6.0.3", - "webext-tools": "^3.0.0", + "webext-tools": "^4.0.0", "zip-text-nodes": "^1.0.0" }, "devDependencies": { - "@biomejs/biome": "^2.3.12", - "@eslint-react/eslint-plugin": "^2.7.2", - "@eslint/compat": "^2.0.1", + "@biomejs/biome": "^2.4.13", + "@dprint/json": "^0.21.3", + "@eslint-react/eslint-plugin": "^5.6.4", + "@eslint/compat": "^2.0.5", + "@eslint/css": "^1.1.0", "@rollup/plugin-alias": "^6.0.0", - "@rollup/plugin-commonjs": "^29.0.0", + "@rollup/plugin-commonjs": "^29.0.2", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", - "@rollup/plugin-sucrase": "^5.0.2", + "@rollup/plugin-sucrase": "^5.1.0", "@sindresorhus/tsconfig": "^8.1.0", - "@types/chrome": "^0.1.36", + "@types/chrome": "^0.1.40", "@types/codemirror": "^5.60.17", - "@types/dom-navigation": "^1.0.6", - "@types/node": "^24.10.1", + "@types/dom-navigation": "^1.0.7", + "@types/node": "^25.6.0", "@types/react": "^17.0.52", - "browserslist": "^4.28.1", + "browserslist": "^4.28.2", "daily-version": "^2.0.0", "dot-json": "^1.3.0", - "eslint": "^9.39.2", + "dprint": "^0.54.0", + "dprint-plugin-graphql": "^0.2.3", + "dprint-plugin-malva": "^0.15.3", + "dprint-plugin-markup": "^0.27.0", + "dprint-plugin-yaml": "^0.6.0", + "eslint": "^10.2.1", + "eslint-config-prettier": "^10.1.8", "eslint-formatter-unix": "^9.0.1", "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-import-x": "^4.16.1", - "eslint-plugin-svelte": "^3.14.0", - "fast-ignore": "^1.1.3", + "eslint-plugin-import-x": "^4.16.2", + "eslint-plugin-svelte": "^3.17.1", + "fast-ignore": "^2.0.0", "filenamify": "^7.0.1", "highlight.js": "^11.11.1", - "lightningcss": "^1.31.1", + "lightningcss": "^1.32.0", "linkedom": "^0.18.12", "npm-run-all2": "^8.0.4", "p-memoize": "^8.0.0", - "prettier": "^3.8.1", - "prettier-plugin-svelte": "^3.4.1", - "rollup": "^4.56.0", + "rollup": "^4.60.2", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-copy": "^3.5.0", "rollup-plugin-delete": "^3.0.2", "rollup-plugin-string": "^3.0.0", "rollup-plugin-styles": "^4.0.0", "rollup-plugin-svelte": "^7.2.3", - "rollup-plugin-webpack-stats": "^2.1.9", + "rollup-plugin-webpack-stats": "^3.1.2", "snarkdown": "^2.0.0", - "svelte": "^5.48.1", - "svelte-eslint-parser": "^1.4.1", + "svelte": "^5.55.5", + "svelte-eslint-parser": "^1.6.0", "type-fest": "^5.4.1", - "typed-query-selector": "^2.12.0", - "typescript": "^5.9.3", + "typed-query-selector": "^2.12.2", + "typescript": "^6.0.3", "unplugin-lightningcss": "^0.4.5", - "vitest": "^4.0.18", - "xo": "^1.2.3" + "vitest": "^4.1.5", + "xo": "^2.0.2" }, "engines": { "node": ">= 20", diff --git a/readme.md b/readme.md index 41219adad42b..ef5c5649fad9 100644 --- a/readme.md +++ b/readme.md @@ -103,10 +103,8 @@ https://github.com/refined-github/refined-github/wiki/Contributing#metadata-guid - [](# "archive-forks-link") [Helps you find forks on archived repos.](https://user-images.githubusercontent.com/1402241/230362566-12493c80-bffe-4c7a-b9ba-4a11b1358ab0.png) - [](# "clean-repo-tabs") [Moves the "Security" and "Insights" to the repository navigation dropdown. Also moves the "Projects", "Actions" and "Wiki" tabs if they're empty/unused.](https://user-images.githubusercontent.com/16872793/124681343-4a6c3c00-de96-11eb-9055-a8fc551e6eb8.png) - [](# "repo-avatars") [Adds the profile picture to the header of public repositories.](https://github-production-user-asset-6210df.s3.amazonaws.com/1402241/255323568-aee4d90e-844e-41e8-880a-ce466826516c.png) -- [](# "quick-new-issue") [Adds a link to create issues from anywhere in a repository.](https://github-production-user-asset-6210df.s3.amazonaws.com/1402241/274816033-820ec518-049d-4248-9f8a-27b9423e350b.png) - [](# "small-user-avatars") [Shows a small avatar next to the username in issue/PR lists and mentions.](https://github-production-user-asset-6210df.s3.amazonaws.com/1402241/271184107-24ec471e-54d1-434a-a5f2-615902d2cad9.png) - [](# "action-pr-link") 🔥 [Adds a link back to the PR that ran the workflow.](https://github-production-user-asset-6210df.s3.amazonaws.com/50487467/241645264-076a0137-36a2-4fd0-a66e-735ef3b3a563.png) -- [](# "mobile-tabs") [Makes the tabs more compact on mobile so more of them can be seen.](https://user-images.githubusercontent.com/1402241/245446231-28f44b59-0151-4986-8cb9-05b5645592d8.png) - [](# "repo-header-info") [Shows whether a repo is a fork and adds the number of stars to its header.](https://github-production-user-asset-6210df.s3.amazonaws.com/1402241/267216946-404d79ab-46d7-4bc8-ba88-ae8f8029150d.png) - [](# "visit-tag") [When navigating a repo's file on a specific tag, it adds a link to see the release/tag itself.](https://github-production-user-asset-6210df.s3.amazonaws.com/1402241/285123739-e5f4fa0a-3f48-49ef-9b87-2fd6f183c923.png) - [](# "actions-run-removal") [Lets you cancel or delete workflow runs faster from the workflow list.](https://github.com/user-attachments/assets/a054f9b4-9d56-40c0-9aac-09a8b07bbb3b) @@ -209,9 +207,9 @@ https://github.com/refined-github/refined-github/wiki/Contributing#metadata-guid - [](# "quick-label-removal") [Adds one-click buttons to remove labels in issues/PRs.](https://user-images.githubusercontent.com/36174850/89980178-0bc80480-dc7a-11ea-8ded-9e25f5f13d1a.gif) - [](# "clean-conversation-headers") [Removes duplicate information in the header of PRs ("User wants to merge X commits from Y into Z")](https://user-images.githubusercontent.com/44045911/112314137-a34b0680-8ce3-11eb-9e0e-8afd6c8235c2.png) - [](# "dim-bots") [Dims commits and PRs by bots to reduce noise.](https://user-images.githubusercontent.com/1402241/220607557-f8ea0863-f05b-48c8-a447-1fec42af0afd.gif) -- [](# "esc-to-cancel") [Adds a shortcut to cancel editing a issue/PR title: esc.](https://user-images.githubusercontent.com/35100156/98303086-d81d2200-1fbd-11eb-8529-70d48d889bcf.gif) +- [](# "esc-to-cancel") [Adds a shortcut to cancel editing a PR title: esc.](https://user-images.githubusercontent.com/35100156/98303086-d81d2200-1fbd-11eb-8529-70d48d889bcf.gif) - [](# "no-duplicate-list-update-time") [Hides the update time of issues/PRs in lists when it matches the open/closed/merged time.](https://user-images.githubusercontent.com/1402241/111357166-ac3a3900-864e-11eb-884a-d6d6da88f7e2.png) -- [](# "linkify-user-labels") [Links the "Contributor", "Member" and "Collaborator" labels on comments to the author’s commits on the repo.](https://user-images.githubusercontent.com/1402241/177033344-4d4eea63-e075-4096-b2d4-f4b879f1df31.png) +- [](# "linkify-user-labels") [Links the "Contributor", "Member" and "Collaborator" labels on comments and PRs to the author’s commits on the repo.](https://user-images.githubusercontent.com/1402241/177033344-4d4eea63-e075-4096-b2d4-f4b879f1df31.png) - [](# "jump-to-conversation-close-event") [Adds a link to jump to the latest close event of a issue/PR.](https://user-images.githubusercontent.com/16872793/177792713-64219754-f8df-4629-a9ec-33259307cfe7.gif) - [](# "close-as-unplanned") [Lets you "close issue as unplanned" in one click instead of three.](https://github-production-user-asset-6210df.s3.amazonaws.com/1402241/279745773-709cde60-c26a-4a0e-89e1-56444d25ebdf.png) - [](# "locked-issue") [Show a label on locked issues and PRs.](https://user-images.githubusercontent.com/1402241/283015579-0a04becc-9bff-4aef-8770-272d6804970b.png) @@ -238,9 +236,11 @@ https://github.com/refined-github/refined-github/wiki/Contributing#metadata-guid - [](# "closing-remarks") 🔥 [Shows the first Git tag a merged PR was included in or suggests creating a release if not yet released.](https://user-images.githubusercontent.com/1402241/169497171-85d4a97f-413a-41b4-84ba-885dca2b51cf.png) - [](# "pr-jump-to-first-non-viewed-file") [Jumps to first non-viewed file in a PR when clicking on the progress bar.](https://github-production-user-asset-6210df.s3.amazonaws.com/140871606/257011208-764f509d-fed9-424b-84e9-c01cf2fd428b.gif) - [](# "jump-to-change-requested-comment") [Adds a link to jump to the latest changed requested comment.](https://user-images.githubusercontent.com/19198931/98718312-418b9f00-23c9-11eb-8da2-dfb616e95eb6.gif) -- [](# "view-last-pr-deployment") [Adds a link to open the latest deployment from the header of a PR.](https://user-images.githubusercontent.com/44045911/232313171-b54ac9cc-ebb1-43ef-bd41-5d81ec9f9588.png) +- [](# "view-last-pr-deployment") [Adds a link to open the latest deployment to the PR header.](https://github.com/user-attachments/assets/90d2498d-ef65-45b9-96eb-07e7988bea61) - [](# "no-unnecessary-split-diff-view") [Always uses unified diffs on files where split diffs aren’t useful.](https://user-images.githubusercontent.com/46634000/121495005-89af8600-c9d9-11eb-822d-77e0b987e3b1.png) - [](# "emphasize-draft-pr-label") [Makes it easier to distinguish draft PR in lists.](https://user-images.githubusercontent.com/1402241/218252438-062a1ab3-4437-436d-9140-87bee23aaefb.png) +- [](# "clean-checks-list") Prioritizes failing and pending checks in the merge checks list, and untruncates long check names. +- [](# "mobile-tabs-pr") Makes the PR tabs smaller so they fit in the screen without scrolling. \n/s, (_, match) => { - textarea.closest('tab-container')!.before( + $closest('tab-container', textarea).before(

{linkifyUrlsToDom(match.trim(), {value: url => shortenRepoUrl(url, location.href)})}
, diff --git a/source/features/rgh-token-user.tsx b/source/features/rgh-token-user.tsx index bda3d49f851e..57daf0bef633 100644 --- a/source/features/rgh-token-user.tsx +++ b/source/features/rgh-token-user.tsx @@ -1,16 +1,16 @@ -import React from 'react'; import AlertIcon from 'octicons-plain-react/Alert'; +import React from 'react'; import features from '../feature-manager.js'; -import observe from '../helpers/selector-observer.js'; -import {getLoggedInUser} from '../github-helpers/index.js'; -import {getToken} from '../options-storage.js'; -import {tokenUser} from '../github-helpers/github-token.js'; import {api3} from '../github-helpers/api.js'; +import {tokenUser} from '../github-helpers/github-token.js'; +import {getLoggedInUser} from '../github-helpers/index.js'; import onetime from '../helpers/onetime.js'; import {OptionsLink} from '../helpers/open-options.js'; +import observe from '../helpers/selector-observer.js'; +import {getToken} from '../options-storage.js'; -async function verify(header: HTMLButtonElement): Promise { +async function verify(header: HTMLElement): Promise { const token = await getToken(); if (!token) { return; @@ -24,9 +24,8 @@ async function verify(header: HTMLButtonElement): Promise {
- Write API calls are blocked because your {' '} - Refined GitHub token - {' '} belongs to {currentTokenUser}, not {currentWebUser}. + Write API calls are blocked because your Refined GitHub token{' '} + belongs to {currentTokenUser}, not {currentWebUser}.
, ); @@ -34,7 +33,7 @@ async function verify(header: HTMLButtonElement): Promise { } function initOnce(): void { - observe('[aria-label="User navigation"][role="heading"]', verify); + observe('div[aria-labelledby="global-nav-user-menu-header"] > div[role="heading"]', verify); } void features.add(import.meta.url, { diff --git a/source/features/same-branch-author-commits.tsx b/source/features/same-branch-author-commits.tsx index c0ef96880847..90902bd6cc24 100644 --- a/source/features/same-branch-author-commits.tsx +++ b/source/features/same-branch-author-commits.tsx @@ -1,5 +1,5 @@ -import {$$} from 'select-dom'; import * as pageDetect from 'github-url-detection'; +import {$$} from 'select-dom'; import features from '../feature-manager.js'; diff --git a/source/features/same-page-links.tsx b/source/features/same-page-links.tsx index f36985522f3c..3b7bcc732241 100644 --- a/source/features/same-page-links.tsx +++ b/source/features/same-page-links.tsx @@ -8,15 +8,23 @@ function fix(button: HTMLAnchorElement): void { } function init(signal: AbortSignal): void { - observe([ - '[data-testid="state-reason-link"] + [target="_blank"]', // "Closing issue" link - '[data-testid="issue-metadata-fixed"] [target="_blank"]', // Reference PR link in issue header - '[data-testid^="timeline-row-border"] [target="_blank"]', // Commit linkbacks in PRs - ], fix, {signal}); + observe( + [ + 'a[target="_blank"][class^="ClosedEvent-module__closerLink"]', // "Closing issue" link + 'a[target="_blank"][class^="LinkedPullRequest-module__pullRequestLink"]', // Linked PR links in issue headers + 'a[target="_blank"][class^="prc-ActionList-ActionListContent"][aria-keyshortcuts="#"]', // Linked PR links in issue header menu + 'ul[data-testid="issue-viewer-linked-pr-container"] a[target="_blank"]', // Linked PR and release links on issue sidebar + 'a[target="_blank"][class^="ReferencedEventInner-module__commitHashLink"]', // Commit linkbacks on issue timeline + 'div[data-testid="list-row-linked-pull-requests"] > a[target="_blank"]', // Linked PRs on issue list + ], + fix, + {signal}, + ); } void features.add(import.meta.url, { include: [ + pageDetect.isIssueList, pageDetect.isIssue, ], init, @@ -26,7 +34,9 @@ void features.add(import.meta.url, { Test URLs -- "Closing issue" link https://github.com/refined-github/refined-github/issues/8346#event-16947543136 -- "Reference PR link" https://github.com/refined-github/refined-github/pull/8367 -- "Commit Linkbacks" https://github.com/sindresorhus/np/issues/82#event-22200037448, https://github.com/cli/cli/issues/10238 +- "Closing issue" link: https://github.com/refined-github/refined-github/issues/8346#event-16947543136 +- Linked PR links on issue page: https://github.com/refined-github/refined-github/issues/8346 +- Linked PR links in issue header menu: https://github.com/refined-github/sandbox/issues/130 +- Commit linkbacks: https://github.com/sindresorhus/np/issues/82#event-22200037448, https://github.com/cli/cli/issues/10238 +- Linked PRs on issue list: https://github.com/refined-github/refined-github/issues?q=is%3Aissue%20has%3Alinked%20reason%3Acompleted */ diff --git a/source/features/select-all-notifications-shortcut.tsx b/source/features/select-all-notifications-shortcut.tsx index ae94cd97c01a..7c43c5765414 100644 --- a/source/features/select-all-notifications-shortcut.tsx +++ b/source/features/select-all-notifications-shortcut.tsx @@ -1,5 +1,5 @@ -import {$} from 'select-dom/strict.js'; import * as pageDetect from 'github-url-detection'; +import {$} from 'select-dom'; import features from '../feature-manager.js'; import {registerHotkey} from '../github-helpers/hotkey.js'; diff --git a/source/features/select-notifications.tsx b/source/features/select-notifications.tsx index b80d1ff084ce..53e9922c01b4 100644 --- a/source/features/select-notifications.tsx +++ b/source/features/select-notifications.tsx @@ -1,29 +1,36 @@ import './select-notifications.css'; -import React from 'dom-chef'; -import {elementExists} from 'select-dom'; -import {$, $$} from 'select-dom/strict.js'; import delegate from 'delegate-it'; +import React from 'dom-chef'; import * as pageDetect from 'github-url-detection'; -import CheckCircleIcon from 'octicons-plain-react/CheckCircle'; import CheckIcon from 'octicons-plain-react/Check'; -import DotFillIcon from 'octicons-plain-react/DotFill'; +import CheckCircleIcon from 'octicons-plain-react/CheckCircle'; import DotIcon from 'octicons-plain-react/Dot'; +import DotFillIcon from 'octicons-plain-react/DotFill'; import GitMergeIcon from 'octicons-plain-react/GitMerge'; -import GitPullRequestDraftIcon from 'octicons-plain-react/GitPullRequestDraft'; import GitPullRequestIcon from 'octicons-plain-react/GitPullRequest'; +import GitPullRequestDraftIcon from 'octicons-plain-react/GitPullRequestDraft'; import HubotIcon from 'octicons-plain-react/Hubot'; import IssueOpenedIcon from 'octicons-plain-react/IssueOpened'; import SquirrelIcon from 'octicons-plain-react/Squirrel'; import XCircleIcon from 'octicons-plain-react/XCircle'; +import { + $, $$, $closest, elementExists, +} from 'select-dom'; -import onetime from '../helpers/onetime.js'; import features from '../feature-manager.js'; -import observe from '../helpers/selector-observer.js'; import {botLinksNotificationSelectors} from '../github-helpers/selectors.js'; +import {is} from '../helpers/css-selectors.js'; +import onetime from '../helpers/onetime.js'; +import observe from '../helpers/selector-observer.js'; -const prIcons = ':is(.octicon-git-pull-request, .octicon-git-pull-request-closed, .octicon-git-pull-request-draft, .octicon-git-merge)'; -const issueIcons = ':is(.octicon-issue-opened, .octicon-issue-closed, .octicon-skip)'; +const prIcons = is( + '.octicon-git-pull-request', + '.octicon-git-pull-request-closed', + '.octicon-git-pull-request-draft', + '.octicon-git-merge', +); +const issueIcons = is('.octicon-issue-opened', '.octicon-issue-closed', '.octicon-skip'); const filters = { 'Pull requests': prIcons, Issues: issueIcons, @@ -53,7 +60,6 @@ function getFiltersSelector(formData: FormData, category: Category): string[] { } function handleSelection(): void { - // @ts-expect-error TS bug const formData = new FormData($('form#rgh-select-notifications-form')); const types = getFiltersSelector(formData, 'Type'); const statuses = getFiltersSelector(formData, 'Status'); @@ -155,7 +161,7 @@ function closeDropdown(): void { function addDropdown(selectAllCheckbox: HTMLInputElement): void { selectAllCheckbox.style.verticalAlign = '-0.2em'; // #7852 - selectAllCheckbox.closest('label')!.after( + $closest('label', selectAllCheckbox).after( // `h6` matches "Select all" style ·, createDropdown(), @@ -166,7 +172,12 @@ function init(signal: AbortSignal): void { observe('input.js-notifications-mark-all-prompt', addDropdown, {signal}); // Close the dropdown when one of the toolbar buttons is clicked - delegate(['.js-notifications-mark-selected-actions > *', '.rgh-open-selected-button'], 'click', closeDropdown, {signal}); + delegate( + ['.js-notifications-mark-selected-actions > *', '.rgh-open-selected-button'], + 'click', + closeDropdown, + {signal}, + ); } void features.add(import.meta.url, { diff --git a/source/features/selection-in-new-tab.tsx b/source/features/selection-in-new-tab.tsx index 9ef6933904d8..f50e7769a5b0 100644 --- a/source/features/selection-in-new-tab.tsx +++ b/source/features/selection-in-new-tab.tsx @@ -1,9 +1,9 @@ -import {$optional} from 'select-dom/strict.js'; +import {$closestOptional, $optional} from 'select-dom'; import {messageRuntime} from 'webext-msg'; -import onetime from '../helpers/onetime.js'; import features from '../feature-manager.js'; import {registerHotkey} from '../github-helpers/hotkey.js'; +import onetime from '../helpers/onetime.js'; function openInNewTab(): void { const selected = $optional([ @@ -20,7 +20,7 @@ function openInNewTab(): void { }); // Get the list element that contains the unread class and mark it as read. - selected.closest('.unread')?.classList.replace('unread', 'read'); + $closestOptional('.unread', selected)?.classList.replace('unread', 'read'); } function initOnce(): void { diff --git a/source/features/shorten-links.tsx b/source/features/shorten-links.tsx index 913db00434de..a8e8a9e86557 100644 --- a/source/features/shorten-links.tsx +++ b/source/features/shorten-links.tsx @@ -1,6 +1,6 @@ -import onetime from '../helpers/onetime.js'; import features from '../feature-manager.js'; import {linkifiedUrlClass, shortenLink} from '../github-helpers/dom-formatters.js'; +import onetime from '../helpers/onetime.js'; import observe from '../helpers/selector-observer.js'; /* This feature is currently so broad that it's not de-inited via signal, it's just run once for all pageloads #5889 */ diff --git a/source/features/show-associated-branch-prs-on-fork.css b/source/features/show-associated-branch-prs-on-fork.css index 3ecca51e5f7e..c91aa9d1d4e5 100644 --- a/source/features/show-associated-branch-prs-on-fork.css +++ b/source/features/show-associated-branch-prs-on-fork.css @@ -24,7 +24,6 @@ text-decoration: none !important; border-radius: 999px; display: inline-flex; - font: 600 12px / 1 inherit; white-space: nowrap; height: 20px; padding: 0 7px; diff --git a/source/features/show-associated-branch-prs-on-fork.tsx b/source/features/show-associated-branch-prs-on-fork.tsx index 69950e33408f..ee695234f3b8 100644 --- a/source/features/show-associated-branch-prs-on-fork.tsx +++ b/source/features/show-associated-branch-prs-on-fork.tsx @@ -1,21 +1,22 @@ import './show-associated-branch-prs-on-fork.css'; import React from 'dom-chef'; -import {CachedFunction} from 'webext-storage-cache'; import * as pageDetect from 'github-url-detection'; +import memoize from 'memoize'; import GitMergeIcon from 'octicons-plain-react/GitMerge'; import GitPullRequestIcon from 'octicons-plain-react/GitPullRequest'; import GitPullRequestClosedIcon from 'octicons-plain-react/GitPullRequestClosed'; import GitPullRequestDraftIcon from 'octicons-plain-react/GitPullRequestDraft'; import RepoForkedIcon from 'octicons-plain-react/RepoForked'; -import memoize from 'memoize'; +import {CachedFunction} from 'webext-storage-cache'; +import {$closest} from 'select-dom'; -import observe from '../helpers/selector-observer.js'; import features from '../feature-manager.js'; import api from '../github-helpers/api.js'; +import {expectToken} from '../github-helpers/github-token.js'; import {cacheByRepo} from '../github-helpers/index.js'; +import observe from '../helpers/selector-observer.js'; import AssociatedPullRequests from './show-associated-branch-prs-on-fork.gql'; -import {expectToken} from '../github-helpers/github-token.js'; type PullRequest = { timelineItems: { @@ -71,8 +72,7 @@ async function addLink(branch: HTMLElement): Promise { const StateIcon = stateIcon[prInfo.state] ?? (() => {/* empty */}); const stateClassName = prInfo.state.toLowerCase(); - const cell = branch - .closest('tr.TableRow')! + const cell = $closest('tr.TableRow', branch) .children .item(4)!; diff --git a/source/features/show-names.tsx b/source/features/show-names.tsx index 72aab5d93b1c..93fd9e358a3a 100644 --- a/source/features/show-names.tsx +++ b/source/features/show-names.tsx @@ -1,21 +1,22 @@ +import batchedFunction from 'batched-function'; import React from 'dom-chef'; import * as pageDetect from 'github-url-detection'; -import batchedFunction from 'batched-function'; +import {$closestOptional} from 'select-dom'; import features from '../feature-manager.js'; import api from '../github-helpers/api.js'; +import {expectToken} from '../github-helpers/github-token.js'; import {getLoggedInUser, isUsernameAlreadyFullName} from '../github-helpers/index.js'; -import observe from '../helpers/selector-observer.js'; -import {removeTextNodeContaining} from '../helpers/dom-utils.js'; import {usernameLinksSelector} from '../github-helpers/selectors.js'; -import {expectToken} from '../github-helpers/github-token.js'; -import attachElement from '../helpers/attach-element.js'; import abortableClassName from '../helpers/abortable-classname.js'; +import attachElement from '../helpers/attach-element.js'; +import {removeTextNodeContaining} from '../helpers/dom-utils.js'; +import observe from '../helpers/selector-observer.js'; async function dropExtraCopy(link: HTMLAnchorElement): Promise { // Drop 'commented' label to shorten the copy const commentedNode = link.parentNode!.nextSibling; - if (link.closest('.timeline-comment-header') && commentedNode) { + if ($closestOptional('.timeline-comment-header', link) && commentedNode) { // "left a comment" appears in the main comment of reviews removeTextNodeContaining(commentedNode, /commented|left a comment/); } @@ -29,18 +30,20 @@ function createElement(element: HTMLAnchorElement, fullName: string): JSX.Elemen ); - if (element.matches([ - '[data-testid="avatar-link"]', // Commment on React-based views - '[data-testid="issue-body-header-author"]', - '.feed-item-content *', - // PR event: - // - https://github.com/refined-github/refined-github/pull/8970#event-22710755292 - // - https://github.com/refined-github/refined-github/pull/8970#event-22710646301 - // `readable-title-change-events` adds gap to rename events - '.TimelineItem-body:not(:has(> del.markdown-title)) > *', - // Reference event: https://github.com/refined-github/refined-github/pull/9041#ref-issue-4028015976 - '.TimelineItem-body > div > *', - ])) { + if ( + element.matches([ + '[data-testid="avatar-link"]', // Commment on React-based views + '[data-testid="issue-body-header-author"]', + '.feed-item-content *', + // PR event: + // - https://github.com/refined-github/refined-github/pull/8970#event-22710755292 + // - https://github.com/refined-github/refined-github/pull/8970#event-22710646301 + // `readable-title-change-events` adds gap to rename events + '.TimelineItem-body:not(:has(> del.markdown-title)) > *', + // Reference event: https://github.com/refined-github/refined-github/pull/9041#ref-issue-4028015976 + '.TimelineItem-body > div > *', + ]) + ) { nameElement.classList.add('ml-1'); } else if ( element.matches( @@ -79,7 +82,7 @@ async function updateLinks(found: HTMLAnchorElement[]): Promise { if (currentUserElements) { for (const currentUserElement of currentUserElements) { // For `sticky-comment-header`. Use attribute because classes are altered by GitHub - currentUserElement.closest('[data-testid="comment-header"]')?.setAttribute('data-rgh-viewer-did-author', ''); + $closestOptional('[data-testid="comment-header"]', currentUserElement)?.setAttribute('data-rgh-viewer-did-author', ''); } users.delete(currentUser); @@ -92,9 +95,7 @@ async function updateLinks(found: HTMLAnchorElement[]): Promise { } const names = await api.v4( - [...users.keys()].map(username => - api.escapeKey(username) + `: user(login: "${username}") {name}`, - ).join(','), + [...users.keys()].map(username => api.escapeKey(username) + `: user(login: "${username}") {name}`).join(','), ); for (const [username, elements] of users) { diff --git a/source/features/show-open-prs-of-forks.tsx b/source/features/show-open-prs-of-forks.tsx index d11aa6cf191f..2c35f7addb08 100644 --- a/source/features/show-open-prs-of-forks.tsx +++ b/source/features/show-open-prs-of-forks.tsx @@ -1,13 +1,13 @@ import React from 'dom-chef'; -import {CachedFunction} from 'webext-storage-cache'; -import {$} from 'select-dom/strict.js'; import elementReady from 'element-ready'; import * as pageDetect from 'github-url-detection'; +import {$} from 'select-dom'; +import {CachedFunction} from 'webext-storage-cache'; import features from '../feature-manager.js'; import api from '../github-helpers/api.js'; -import pluralize from '../helpers/pluralize.js'; import {getForkedRepo, getLoggedInUser, getRepo} from '../github-helpers/index.js'; +import pluralize from '../helpers/pluralize.js'; import GetPRs from './show-open-prs-of-forks.gql'; function getLinkCopy(count: number): string { @@ -65,7 +65,9 @@ async function initHeadHint(): Promise { $(`[data-hovercard-type="repository"][href="/${getForkedRepo()!}"]`).after( // The class is used by `quick-fork-deletion` - <> with
{getLinkCopy(count)}, + <> + with {getLinkCopy(count)} + , ); } @@ -77,7 +79,8 @@ async function initDeleteHint(): Promise { $('details-dialog[aria-label*="Delete"] .Box-body p:first-child').after(

- It will also abandon your {getLinkCopy(count)} in {getForkedRepo()!} and you’ll no longer be able to edit {count === 1 ? 'it' : 'them'}. + It will also abandon your {getLinkCopy(count)} in {getForkedRepo()!}{' '} + and you’ll no longer be able to edit {count === 1 ? 'it' : 'them'}.

, ); } diff --git a/source/features/show-whitespace.tsx b/source/features/show-whitespace.tsx index fba2e59e7944..04b56e3049d4 100644 --- a/source/features/show-whitespace.tsx +++ b/source/features/show-whitespace.tsx @@ -1,17 +1,19 @@ import './show-whitespace.css'; -import * as pageDetect from 'github-url-detection'; import {onAbort} from 'abort-utils'; +import * as pageDetect from 'github-url-detection'; +import {$closestOptional} from 'select-dom'; import features from '../feature-manager.js'; import {codeElementsSelector} from '../github-helpers/dom-formatters.js'; -import showWhiteSpacesOnLine from '../helpers/show-whitespace-on-line.js'; +import {is} from '../helpers/css-selectors.js'; import observe from '../helpers/selector-observer.js'; +import showWhiteSpacesOnLine from '../helpers/show-whitespace-on-line.js'; const viewportObserver = new IntersectionObserver(changes => { for (const {target: line, isIntersecting} of changes) { if (isIntersecting) { - const shouldAvoidSurroundingSpaces = Boolean(line.closest('.blob-wrapper-embedded')); // #2285 + const shouldAvoidSurroundingSpaces = Boolean($closestOptional('.blob-wrapper-embedded', line)); // #2285 showWhiteSpacesOnLine(line, shouldAvoidSurroundingSpaces); viewportObserver.unobserve(line); } @@ -23,7 +25,7 @@ function showWhitespaceWhenInViewport(line: HTMLElement): void { } function init(signal: AbortSignal): void { - observe(`:is(${codeElementsSelector.join(',')}):not(.blob-code-hunk)`, showWhitespaceWhenInViewport, {signal}); + observe(is(codeElementsSelector) + ':not(.blob-code-hunk)', showWhitespaceWhenInViewport, {signal}); onAbort(signal, viewportObserver); } diff --git a/source/features/sidebar-focus-file.tsx b/source/features/sidebar-focus-file.tsx index 9c854e0d150a..4ecda1341332 100644 --- a/source/features/sidebar-focus-file.tsx +++ b/source/features/sidebar-focus-file.tsx @@ -1,9 +1,9 @@ import * as pageDetect from 'github-url-detection'; -import delay from '../helpers/delay.js'; import features from '../feature-manager.js'; import GitHubFileUrl from '../github-helpers/github-file-url.js'; import {scrollIntoViewIfNeeded} from '../github-helpers/index.js'; +import delay from '../helpers/delay.js'; async function init(): Promise { const {filePath} = new GitHubFileUrl(location.href); diff --git a/source/features/small-user-avatars.tsx b/source/features/small-user-avatars.tsx index 09c0fb883402..892e14bd35a5 100644 --- a/source/features/small-user-avatars.tsx +++ b/source/features/small-user-avatars.tsx @@ -1,9 +1,10 @@ import React from 'dom-chef'; -import onetime from '../helpers/onetime.js'; import features from '../feature-manager.js'; -import observe from '../helpers/selector-observer.js'; import getUserAvatarURL from '../github-helpers/get-user-avatar.js'; +import {is, not} from '../helpers/css-selectors.js'; +import onetime from '../helpers/onetime.js'; +import observe from '../helpers/selector-observer.js'; import './small-user-avatars.css'; function addAvatar(link: HTMLElement): void { @@ -36,15 +37,18 @@ function initOnce(): void { observe([ '.js-issue-row [data-hovercard-type="user"]', // `isPRList` + old `isIssueList` '.notification-thread-subscription [data-hovercard-type="user"]', // https://github.com/notifications/subscriptions - `:is( - [data-testid="created-at"], - [data-testid="closed-at"] - ) a[data-hovercard-url*="/users"]`, // `isIssueList` + is( + '[data-testid="created-at"]', + '[data-testid="closed-at"]', + ) + ' a[data-hovercard-url*="/users"]', // `isIssueList` ], addAvatar); - observe(`.user-mention:not(${[ - '.opened-by > *', // Merge queue - '.commit-author', - ].join(',')})`, addMentionAvatar); + observe( + '.user-mention' + not( + '.opened-by > *', // Merge queue + '.commit-author', + ), + addMentionAvatar, + ); } void features.add(import.meta.url, { diff --git a/source/features/sort-conversations-by-update-time.tsx b/source/features/sort-conversations-by-update-time.tsx index b004f60daa90..33517d9eb31f 100644 --- a/source/features/sort-conversations-by-update-time.tsx +++ b/source/features/sort-conversations-by-update-time.tsx @@ -1,12 +1,12 @@ -import {$optional} from 'select-dom/strict.js'; -import * as pageDetect from 'github-url-detection'; import elementReady from 'element-ready'; +import * as pageDetect from 'github-url-detection'; import oneEvent from 'one-event'; +import {$optional} from 'select-dom'; import features from '../feature-manager.js'; import SearchQuery from '../github-helpers/search-query.js'; -import observe from '../helpers/selector-observer.js'; import {linksToConversationLists} from '../github-helpers/selectors.js'; +import observe from '../helpers/selector-observer.js'; /** Keep the original URL on the element so that `shorten-links` can use it reliably #5890 */ export function saveOriginalHref(link: HTMLAnchorElement): void { diff --git a/source/features/status-subscription.tsx b/source/features/status-subscription.tsx index 9fff4144552f..194d0b033161 100644 --- a/source/features/status-subscription.tsx +++ b/source/features/status-subscription.tsx @@ -2,14 +2,14 @@ import './status-subscription.css'; import React from 'dom-chef'; import * as pageDetect from 'github-url-detection'; -import {$optional} from 'select-dom/strict.js'; import BellIcon from 'octicons-plain-react/Bell'; import BellSlashIcon from 'octicons-plain-react/BellSlash'; import IssueReopenedIcon from 'octicons-plain-react/IssueReopened'; +import {$, $closest, $optional} from 'select-dom'; import features from '../feature-manager.js'; -import observe from '../helpers/selector-observer.js'; import {getConversationNumber, getRepo, multilineAriaLabel} from '../github-helpers/index.js'; +import observe from '../helpers/selector-observer.js'; type SubscriptionStatus = 'none' | 'all' | 'status'; @@ -33,9 +33,7 @@ function SubButton(): JSX.Element { } function getReasonElement(subscriptionButton: HTMLButtonElement): HTMLParagraphElement { - return subscriptionButton - .closest('.thread-subscription-status')! - .querySelector('p.reason')!; + return $('p.reason', $closest('.thread-subscription-status', subscriptionButton)); } function getCurrentStatus(subscriptionButton: HTMLButtonElement): SubscriptionStatus { @@ -91,7 +89,6 @@ function addButton(subscriptionButton: HTMLButtonElement): void { Status , - // Always submitted, but ignored unless the value is `subscribe_to_custom_notifications` // Keep outside BtnGroup , @@ -112,7 +109,8 @@ function addButton(subscriptionButton: HTMLButtonElement): void { const githubApiBaseHeaders = new Headers({ accept: 'application/json', 'github-verified-fetch': 'true', - 'x-github-client-version': 'Refined GitHub. Please address https://github.com/orgs/community/discussions/132506#discussioncomment-11294985', + 'x-github-client-version': + 'Refined GitHub. Please address https://github.com/orgs/community/discussions/132506#discussioncomment-11294985', credentials: 'include', }); @@ -157,13 +155,11 @@ async function updateIssueSubscriptionStatus(targetStatus: SubscriptionStatus, i }, }; - const response = await fetch('/_graphql', - { - headers: githubApiBaseHeaders, - method: 'POST', - body: JSON.stringify(body), - }, - ); + const response = await fetch('/_graphql', { + headers: githubApiBaseHeaders, + method: 'POST', + body: JSON.stringify(body), + }); if (!response.ok) { throw new Error('Failed to update the issue subscription status'); } diff --git a/source/features/sticky-comment-header.css b/source/features/sticky-comment-header.css index 789cddf7c1d9..c08a5cf68c26 100644 --- a/source/features/sticky-comment-header.css +++ b/source/features/sticky-comment-header.css @@ -6,7 +6,7 @@ html:not([rgh-OFF-sticky-comment-header]).rgh-show-names { react-app[app-name='issues-react'], /* TODO: Remove after July 2026 */ - .pull-request-tab-content { + .pull-request-tab-content { --rgh-issue-or-pr-sticky-header-height: 56px; } react-app[app-name='pull-requests'] { @@ -26,7 +26,7 @@ html:not([rgh-OFF-sticky-comment-header]).rgh-show-names { z-index: 3; top: calc( var(--base-sticky-header-height, 0px) + - var(--rgh-issue-or-pr-sticky-header-height, 0px) + var(--rgh-issue-or-pr-sticky-header-height, 0px) ); } diff --git a/source/features/sticky-notifications-actions.css b/source/features/sticky-notifications-actions.css index 3b0763e7a608..8afe8f03ff99 100644 --- a/source/features/sticky-notifications-actions.css +++ b/source/features/sticky-notifications-actions.css @@ -29,8 +29,7 @@ .js-notifications-banners-target { margin-bottom: calc( - max(var(--shadow-blur-radius) * 0.6, 0px) + - var(--shadow-spread-radius) + max(var(--shadow-blur-radius) * 0.6, 0px) + var(--shadow-spread-radius) ); } } diff --git a/source/features/sticky-sidebar.css b/source/features/sticky-sidebar.css index 4e8ab17bea98..813b17d16361 100644 --- a/source/features/sticky-sidebar.css +++ b/source/features/sticky-sidebar.css @@ -7,14 +7,14 @@ Exclusively use simple sums and use `0px` instead of `0` --rgh-sticky-header-height: 70px; /* 60px plus some padding */ --rgh-sticky-sidebar-offset: calc( var(--rgh-sticky-header-height, 0px) + - var(--rgh-sticky-notification-header-height, 0px) + var(--rgh-sticky-notification-header-height, 0px) ); } /* `isRepoRoot` */ div[class^='prc-PageLayout-Pane']:has( - > rails-partial[data-partial-name='codeViewRepoRoute.Sidebar'] - ), + > rails-partial[data-partial-name='codeViewRepoRoute.Sidebar'] +), /* Old `isRepoRoot` - Remove after August 2026 */ .Layout-sidebar .BorderGrid { --rgh-sticky-sidebar-offset: 0; diff --git a/source/features/sticky-sidebar.tsx b/source/features/sticky-sidebar.tsx index 89cd8742a7dc..ce42c34e4912 100644 --- a/source/features/sticky-sidebar.tsx +++ b/source/features/sticky-sidebar.tsx @@ -1,12 +1,12 @@ import './sticky-sidebar.css'; +import {onAbort} from 'abort-utils'; import debounce from 'debounce-fn'; import * as pageDetect from 'github-url-detection'; -import {onAbort} from 'abort-utils'; import features from '../feature-manager.js'; -import observe from '../helpers/selector-observer.js'; import calculateCssCalcString from '../helpers/calculate-css-calc-string.js'; +import observe from '../helpers/selector-observer.js'; const minimumViewportWidthForSidebar = 768; // Less than this, the layout is single-column diff --git a/source/features/suggest-commit-title-limit.css b/source/features/suggest-commit-title-limit.css index 66bfb62cae0e..85958706e9f6 100644 --- a/source/features/suggest-commit-title-limit.css +++ b/source/features/suggest-commit-title-limit.css @@ -4,17 +4,18 @@ /* Limit width of commit title to 72 characters */ .rgh-suggest-commit-title-limit -:is( - [data-testid='mergebox-partial'] input[type='text'], - #commit-message-input, - /* TODO: Remove after July 2026 */ + :is( + [data-testid='mergebox-partial'] input[type='text'], + #commit-message-input, + /* TODO: Remove after July 2026 */ #commit-summary-input -) { + ) { box-sizing: content-box; /* Exclude padding/border from `width`; No need to mess with `calc` */ width: 72ch; /* Like 100%, except it works with content-box and it feels like -webkit-1999 */ max-width: -webkit-fill-available; + /* biome-ignore lint/suspicious/noDuplicateProperties: TODO: Remove in 2027 if supported */ max-width: -moz-available; max-width: intrinsic; } @@ -22,7 +23,8 @@ /* TODO: Remove after August 2026 */ #pull_request_title, /* TODO: Remove after July 2026 */ - #commit-summary-input, +#commit-summary-input, +/* TODO: Remove after legacy PR files view is removed */ #issue_title { &.rgh-title-over-limit { border-color: var(--rgh-limit-color); diff --git a/source/features/suggest-commit-title-limit.tsx b/source/features/suggest-commit-title-limit.tsx index 05e75e6fbe8a..ae2297345bba 100644 --- a/source/features/suggest-commit-title-limit.tsx +++ b/source/features/suggest-commit-title-limit.tsx @@ -5,12 +5,12 @@ import * as pageDetect from 'github-url-detection'; import features from '../feature-manager.js'; import onCommitTitleUpdate from '../github-events/on-commit-title-update.js'; +import waitForPrMerge from '../github-events/on-pr-merge.js'; import getNextConversationNumber from '../github-helpers/get-next-conversation-number.js'; import {getConversationNumber} from '../github-helpers/index.js'; -import {formatPrCommitTitle} from './sync-pr-commit-title.js'; -import waitForPrMerge from '../github-events/on-pr-merge.js'; import abortableClassName from '../helpers/abortable-classname.js'; import observe from '../helpers/selector-observer.js'; +import {formatPrCommitTitle} from './sync-pr-commit-title.js'; // https://github.com/refined-github/refined-github/issues/2178#issuecomment-505940703 const limit = 72; @@ -38,11 +38,16 @@ async function init(signal: AbortSignal): Promise { onCommitTitleUpdate(validateCommitTitle, signal); - delegate([ - ...currentPrTitleSelectors, - 'input#pull_request_title', // Old `isCompare` - TODO: Remove after August 2026 - 'input#issue_title', // Old `isPR` view - TODO: Remove after July 2026 - ], 'input', async ({delegateTarget}) => validatePrTitle(delegateTarget as HTMLInputElement), {signal, passive: true}); + delegate( + [ + ...currentPrTitleSelectors, + 'input#pull_request_title', // Old `isCompare` - TODO: Remove after August 2026 + 'input#issue_title', // Old `isPR` view - TODO: Remove after legacy PR files view is removed + ], + 'input', + async ({delegateTarget}) => validatePrTitle(delegateTarget as HTMLInputElement), + {signal, passive: true}, + ); // `isPR` - input is added to the DOM when user enters editing mode and removed when they exit it // `isCompare` - input is re-rendered when previously entered title is restored observe(currentPrTitleSelectors, validatePrTitle, {signal}); diff --git a/source/features/swap-branches-on-compare.tsx b/source/features/swap-branches-on-compare.tsx index c3fc15474121..b3b3201ce64d 100644 --- a/source/features/swap-branches-on-compare.tsx +++ b/source/features/swap-branches-on-compare.tsx @@ -1,6 +1,6 @@ import React from 'dom-chef'; -import {$} from 'select-dom/strict.js'; import * as pageDetect from 'github-url-detection'; +import {$} from 'select-dom'; import features from '../feature-manager.js'; import {buildRepoUrl, getRepo} from '../github-helpers/index.js'; diff --git a/source/features/sync-pr-commit-title.tsx b/source/features/sync-pr-commit-title.tsx index 1bafdebe0b6f..ba69e7386559 100644 --- a/source/features/sync-pr-commit-title.tsx +++ b/source/features/sync-pr-commit-title.tsx @@ -1,17 +1,17 @@ -import React from 'dom-chef'; -import {$, $optional} from 'select-dom/strict.js'; import delegate from 'delegate-it'; +import React from 'dom-chef'; import * as pageDetect from 'github-url-detection'; +import {$, $optional} from 'select-dom'; -import api from '../github-helpers/api.js'; import features from '../feature-manager.js'; -import {getConversationNumber, userCanLikelyMergePr} from '../github-helpers/index.js'; import onCommitTitleUpdate from '../github-events/on-commit-title-update.js'; -import observe from '../helpers/selector-observer.js'; +import api from '../github-helpers/api.js'; +import {getConversationNumber, userCanLikelyMergePr} from '../github-helpers/index.js'; +import parseRenderedText from '../github-helpers/parse-rendered-text.js'; +import {confirmMergeButton} from '../github-helpers/selectors.js'; import cleanPrCommitTitle from '../helpers/pr-commit-cleaner.js'; +import observe from '../helpers/selector-observer.js'; import setReactInputValue from '../helpers/set-react-input-value.js'; -import {confirmMergeButton} from '../github-helpers/selectors.js'; -import parseRenderedText from '../github-helpers/parse-rendered-text.js'; const commitTitleFieldSelector = '[data-testid="mergebox-partial"] input[type="text"]'; @@ -41,11 +41,13 @@ function createCommitTitle(): string { function needsSubmission(): boolean { const mergeButton = $optional(confirmMergeButton); const textContent = mergeButton?.textContent?.trim(); - if (!textContent || ![ - 'Confirm squash and merge', - 'Confirm auto-merge (squash)', - 'Confirm bypass rules and merge (squash)', - ].includes(textContent)) { + if ( + !textContent || ![ + 'Confirm squash and merge', + 'Confirm auto-merge (squash)', + 'Confirm bypass rules and merge (squash)', + ].includes(textContent) + ) { return false; } @@ -54,7 +56,9 @@ function needsSubmission(): boolean { } function getUi(): HTMLElement { - const cancelButton = ; + const cancelButton = ; return $optional('.rgh-sync-pr-commit-title-note') ?? (

The title of this PR will be updated to match this title. {cancelButton} @@ -101,10 +105,14 @@ function disableSubmission(): void { function init(signal: AbortSignal): void { // PR title -> Commit title field observe(commitTitleFieldSelector, updateCommitTitle, {signal}); // On panel open - observe([ - 'h1[class^="prc-PageHeader-Title"]', - '.gh-header-title', // Old view - TODO: Remove after July 2026 - ], updateCommitTitle, {signal}); // On PR title change + observe( + [ + 'h1[class^="prc-PageHeader-Title"]', + '.gh-header-title', // Old view - TODO: Remove after July 2026 + ], + updateCommitTitle, + {signal}, + ); // On PR title change // Commit title field -> toggle checkbox visibility onCommitTitleUpdate(updateUi, signal); diff --git a/source/features/tab-to-indent.tsx b/source/features/tab-to-indent.tsx index da5d508ff919..d9c9211cde41 100644 --- a/source/features/tab-to-indent.tsx +++ b/source/features/tab-to-indent.tsx @@ -1,5 +1,5 @@ -import {eventHandler} from 'indent-textarea'; import * as pageDetect from 'github-url-detection'; +import {eventHandler} from 'indent-textarea'; import features from '../feature-manager.js'; import {onCommentFieldKeydown} from '../github-events/on-field-keydown.js'; diff --git a/source/features/table-input.css b/source/features/table-input.css index 863665dd2214..f4346975c204 100644 --- a/source/features/table-input.css +++ b/source/features/table-input.css @@ -13,7 +13,8 @@ margin: auto; } -.ActionBar-item-container:has(.rgh-table-input) { +.ActionBar-item-container:has(.rgh-table-input), +[class*='ActionBar-Nav']:has(.rgh-table-input) { overflow: visible; } @@ -38,23 +39,23 @@ .rgh-tic:hover::before, /* Hovering the 1st column */ - .rgh-tic:is(:nth-of-type(5n + 1)):has( - ~ .rgh-tic:hover:nth-of-type(5n + 1) - )::before, +.rgh-tic:is(:nth-of-type(5n+1)):has( + ~ .rgh-tic:hover:nth-of-type(5n+1) +)::before, /* Hovering the 2nd column */ - .rgh-tic:is(:nth-of-type(5n + 1), :nth-of-type(5n + 2)):has( - ~ .rgh-tic:hover:nth-of-type(5n + 2) - )::before, +.rgh-tic:is(:nth-of-type(5n+1), :nth-of-type(5n+2)):has( + ~ .rgh-tic:hover:nth-of-type(5n+2) +)::before, /* Hovering the 3rd column */ - .rgh-tic:not(:nth-of-type(5n + 4), :nth-of-type(5n + 5)):has( - ~ .rgh-tic:hover:nth-of-type(5n + 3) - )::before, +.rgh-tic:not(:nth-of-type(5n+4), :nth-of-type(5n+5)):has( + ~ .rgh-tic:hover:nth-of-type(5n+3) +)::before, /* Hovering the 4th column */ - .rgh-tic:not(:nth-of-type(5n + 5)):has( - ~ .rgh-tic:hover:nth-of-type(5n + 4) - )::before, +.rgh-tic:not(:nth-of-type(5n+5)):has( + ~ .rgh-tic:hover:nth-of-type(5n+4) +)::before, /* Hovering the 5th column */ - .rgh-tic:has(~ .rgh-tic:hover:nth-of-type(5n + 5))::before { +.rgh-tic:has(~ .rgh-tic:hover:nth-of-type(5n+5))::before { border-color: var(--borderColor-accent-muted, fuchsia); background-color: var(--bgColor-accent-muted, fuchsia); } diff --git a/source/features/table-input.tsx b/source/features/table-input.tsx index 70a1ab8acc99..bf522189d489 100644 --- a/source/features/table-input.tsx +++ b/source/features/table-input.tsx @@ -1,19 +1,19 @@ import './table-input.css'; +import delegate, {type DelegateEvent} from 'delegate-it'; import React from 'dom-chef'; -import TableIcon from 'octicons-plain-react/Table'; import * as pageDetect from 'github-url-detection'; +import TableIcon from 'octicons-plain-react/Table'; +import {$, $closestOptional} from 'select-dom'; import {insertTextIntoField} from 'text-field-edit'; -import delegate, {type DelegateEvent} from 'delegate-it'; -import {$} from 'select-dom/strict.js'; import features from '../feature-manager.js'; -import smartBlockWrap from '../helpers/smart-block-wrap.js'; -import observe from '../helpers/selector-observer.js'; import {actionBarSelectors} from '../github-helpers/selectors.js'; +import observe from '../helpers/selector-observer.js'; +import smartBlockWrap from '../helpers/smart-block-wrap.js'; function addTable({delegateTarget: square}: DelegateEvent): void { - const container = square.closest('fieldset') // Issue + const container = $closestOptional('fieldset', square) // Issue ?? square.form!.querySelector('.CommentBox-container')!; // PR const field = $('textarea', container); const cursorPosition = field.selectionStart; @@ -23,7 +23,6 @@ function addTable({delegateTarget: square}: DelegateEvent\n' - // on its own line // "1 space" indents without causing unwanted Markdown code blocks that 4 spaces would cause : '\n' + ' \n'.repeat(columns); diff --git a/source/features/tag-changes-link.css b/source/features/tag-changes-link.css index 7a814cece265..b7f1e9ac3fc1 100644 --- a/source/features/tag-changes-link.css +++ b/source/features/tag-changes-link.css @@ -1,7 +1,8 @@ /* Don't break layout on mobile (https://primer.style/css/support/breakpoints) */ @media (width >= 768px) { /* Reserve some space above the "Compare" dropdown (the selector will be disabled as soon as the "Changelog" link is inserted) */ - .rgh-tag-changes-link .repository-content + .rgh-tag-changes-link + .repository-content .my-5 > :first-child > :nth-child(5):not(.rgh-changelog-link) { diff --git a/source/features/tag-changes-link.tsx b/source/features/tag-changes-link.tsx index 6e0f94c6c5f4..c7e80ea28974 100644 --- a/source/features/tag-changes-link.tsx +++ b/source/features/tag-changes-link.tsx @@ -1,16 +1,17 @@ import './tag-changes-link.css'; import React from 'dom-chef'; -import {$$, elementExists} from 'select-dom'; -import {$, $optional} from 'select-dom/strict.js'; import domLoaded from 'dom-loaded'; -import DiffIcon from 'octicons-plain-react/Diff'; import * as pageDetect from 'github-url-detection'; +import DiffIcon from 'octicons-plain-react/Diff'; +import { + $, $$, $optional, elementExists, +} from 'select-dom'; import tinyVersionCompare from 'tiny-version-compare'; import features from '../feature-manager.js'; -import fetchDom from '../helpers/fetch-dom.js'; import {buildRepoUrl, getRepo, parseTag} from '../github-helpers/index.js'; +import fetchDom from '../helpers/fetch-dom.js'; type TagDetails = { element: HTMLElement; @@ -115,7 +116,11 @@ async function init(): Promise { ); // The page of a tag without a release still uses the old layout #5037 - if (pageDetect.isEnterprise() || pageDetect.isTags() || (pageDetect.isSingleReleaseOrTag() && elementExists('.release'))) { + if ( + pageDetect.isEnterprise() + || pageDetect.isTags() + || (pageDetect.isSingleReleaseOrTag() && elementExists('.release')) + ) { lastLink.after(

  • {compareLink} diff --git a/source/features/tags-on-commits-list.tsx b/source/features/tags-on-commits-list.tsx index 65b789db05de..3f8f8a3001a6 100644 --- a/source/features/tags-on-commits-list.tsx +++ b/source/features/tags-on-commits-list.tsx @@ -1,17 +1,17 @@ import React from 'dom-chef'; +import {$, $$, $$optional} from 'select-dom'; import cache from 'webext-storage-cache/legacy.js'; -import {$, $$, $$optional} from 'select-dom/strict.js'; -import TagIcon from 'octicons-plain-react/Tag'; import * as pageDetect from 'github-url-detection'; +import TagIcon from 'octicons-plain-react/Tag'; import features from '../feature-manager.js'; import api from '../github-helpers/api.js'; -import {getCommitHash} from './mark-merge-commits-in-list.js'; -import {buildRepoUrl, getRepo} from '../github-helpers/index.js'; -import GetTagsOnCommit from './tags-on-commits-list.gql'; import {expectToken} from '../github-helpers/github-token.js'; +import {buildRepoUrl, getRepo} from '../github-helpers/index.js'; import delay from '../helpers/delay.js'; +import {getCommitHash} from './mark-merge-commits-in-list.js'; +import GetTagsOnCommit from './tags-on-commits-list.gql'; type CommitTags = Record; @@ -79,7 +79,8 @@ async function getTags(lastCommit: string, after?: string): Promise } const lastTag = nodes.at(-1)!.target; - const lastTagIsYounger = new Date(repository.object.committedDate) < new Date(isTagTarget(lastTag) ? lastTag.tagger.date : lastTag.committedDate); + const lastTagIsYounger = new Date(repository.object.committedDate) + < new Date(isTagTarget(lastTag) ? lastTag.tagger.date : lastTag.committedDate); // If the last tag is newer than last commit on the page, then not all commits are accounted for, keep looking if (lastTagIsYounger && repository.refs.pageInfo.hasNextPage) { diff --git a/source/features/toggle-everything-with-alt.tsx b/source/features/toggle-everything-with-alt.tsx index 431addae0c57..f618a64e8c30 100644 --- a/source/features/toggle-everything-with-alt.tsx +++ b/source/features/toggle-everything-with-alt.tsx @@ -1,8 +1,10 @@ import delegate from 'delegate-it'; import * as pageDetect from 'github-url-detection'; +import {$closest} from 'select-dom'; import features from '../feature-manager.js'; import clickAll from '../helpers/click-all.js'; +import {is} from '../helpers/css-selectors.js'; function minimizedCommentsSelector(clickedItem: HTMLElement): string { const open = (clickedItem.parentElement as HTMLDetailsElement).open ? '[open]' : ':not([open])'; @@ -15,16 +17,24 @@ function resolvedCommentsSelector(clickedItem: HTMLElement): string { return `.js-resolvable-thread-toggler[aria-expanded="${clickedItem.getAttribute('aria-expanded')!}"]:not(.d-none)`; } +function resolveConversationsSelector(clickedItem: HTMLElement): string { + const isResolving = clickedItem.textContent.includes('Resolve'); + return `form[action$="/${isResolving ? 'resolve' : 'unresolve'}"] button[type="submit"]`; +} + const expandSelector = '.js-file .js-expand-full'; const collapseSelector = '.js-file .js-collapse-diff'; const commitMessageSelector = 'button[data-testid="commit-row-show-description-button"]'; -const addSuggestionToBatchSelector = ':is(.js-apply-changes button[data-variant="primary"], .js-batched-suggested-changes-add)'; +const addSuggestionToBatchSelector = is( + '.js-apply-changes button[data-variant="primary"]', + '.js-batched-suggested-changes-add', +); function markdownCommentSelector(clickedItem: HTMLElement): string { - const {id} = clickedItem.closest('.TimelineItem-body[id]')!; + const {id} = $closest('.TimelineItem-body[id]', clickedItem); return `#${id} .markdown-body details > summary`; } @@ -38,6 +48,14 @@ function init(signal: AbortSignal): void { // Review comments in PR delegate('.js-file .js-resolvable-thread-toggler', 'click', clickAll(resolvedCommentsSelector), {signal}); + // "Resolve conversation" / "Unresolve conversation" buttons in PR conversations + delegate( + '.js-resolvable-timeline-thread-form button[type="submit"]', + 'click', + clickAll(resolveConversationsSelector), + {signal}, + ); + // "Expand all" and "Collapse expanded lines" buttons in commit files delegate(expandSelector, 'click', clickAll(expandSelector), {signal}); delegate(collapseSelector, 'click', clickAll(collapseSelector), {signal}); @@ -46,7 +64,9 @@ function init(signal: AbortSignal): void { delegate(commitMessageSelector, 'click', clickAll(commitMessageSelector), {signal}); //
    elements in issue/PR comment Markdown content - delegate('.TimelineItem-body[id] .markdown-body details > summary', 'click', clickAll(markdownCommentSelector), {signal}); + delegate('.TimelineItem-body[id] .markdown-body details > summary', 'click', clickAll(markdownCommentSelector), { + signal, + }); // "Add suggestion to batch" buttons in PR files delegate(addSuggestionToBatchSelector, 'click', clickAll(addSuggestionToBatchSelector), {signal, capture: true}); @@ -84,4 +104,6 @@ Commit messages: - PR comment: https://github.com/OpenLightingProject/open-fixture-library/pull/2453#issuecomment-1055672394 Add suggestion to batch: https://github.com/refined-github/sandbox/pull/121/changes + +Resolve conversation in PR: https://github.com/refined-github/yolo/pull/8 */ diff --git a/source/features/unclip-checks.tsx b/source/features/unclip-checks.tsx index e3b65d552ae0..7546839cee7c 100644 --- a/source/features/unclip-checks.tsx +++ b/source/features/unclip-checks.tsx @@ -1,6 +1,7 @@ import './unclip-checks.css'; -import * as pageDetect from 'github-url-detection'; import delegate, {type DelegateEvent} from 'delegate-it'; +import * as pageDetect from 'github-url-detection'; +import {$closest} from 'select-dom'; import features from '../feature-manager.js'; @@ -9,7 +10,7 @@ function init(signal: AbortSignal): void { 'button[aria-label="Expand checks"]', 'click', ({delegateTarget}: DelegateEvent) => { - delegateTarget.closest('section[aria-label="Checks"]')!.classList.add('rgh-unclip-checks'); + $closest('section[aria-label="Checks"]', delegateTarget).classList.add('rgh-unclip-checks'); }, {signal, capture: true}, ); diff --git a/source/features/unfinished-comments.tsx b/source/features/unfinished-comments.tsx index d25ad1559084..bf1344a819d4 100644 --- a/source/features/unfinished-comments.tsx +++ b/source/features/unfinished-comments.tsx @@ -1,6 +1,6 @@ -import {$$} from 'select-dom'; import delegate from 'delegate-it'; import * as pageDetect from 'github-url-detection'; +import {$$optional} from 'select-dom'; import features from '../feature-manager.js'; @@ -16,7 +16,7 @@ function isFieldDirty(field: HTMLTextAreaElement): boolean { function hasDraftComments(): boolean { // `[id^="convert-to-issue-body"]` excludes the hidden pre-filled textareas created when opening the dropdown menu of review comments - return $$('textarea:not([id^="convert-to-issue-body"])').some(f => isFieldDirty(f)); + return $$optional('textarea:not([id^="convert-to-issue-body"])').some(f => isFieldDirty(f)); } function disableOnSubmit(): void { diff --git a/source/features/unread-anywhere.css b/source/features/unread-anywhere.css new file mode 100644 index 000000000000..b5e2c89cbf7b --- /dev/null +++ b/source/features/unread-anywhere.css @@ -0,0 +1,5 @@ +/* Done in CSS because React removes classes when updating the unread status */ +.rgh-unread-anywhere-wrapper a { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} diff --git a/source/features/unread-anywhere.tsx b/source/features/unread-anywhere.tsx index 590a049f8147..4cd1dfd83c46 100644 --- a/source/features/unread-anywhere.tsx +++ b/source/features/unread-anywhere.tsx @@ -1,21 +1,33 @@ -import {$$optional, $optional} from 'select-dom/strict.js'; -import {messageRuntime} from 'webext-msg'; +import './unread-anywhere.css'; + import React from 'dom-chef'; import * as pageDetect from 'github-url-detection'; import ArrowUpRightIcon from 'octicons-plain-react/ArrowUpRight'; +import {$, $$optional} from 'select-dom'; +import {messageRuntime} from 'webext-msg'; import features from '../feature-manager.js'; import {registerHotkey} from '../github-helpers/hotkey.js'; -import onetime from '../helpers/onetime.js'; import showToast from '../github-helpers/toast.js'; +import {getClasses, isSmallDevice, wrap} from '../helpers/dom-utils.js'; import {fetchDomUncached} from '../helpers/fetch-dom.js'; +import onetime from '../helpers/onetime.js'; import pluralize from '../helpers/pluralize.js'; -import {removeLinkToPrFilesTab} from './pr-notification-link.js'; import observe from '../helpers/selector-observer.js'; -import {getClasses, isSmallDevice} from '../helpers/dom-utils.js'; +import {removeLinkToPrFilesTab} from './pr-notification-link.js'; const limit = 5; +const buttonWithNotificationsSelector = 'a[class*="notificationIndicator"]'; + +function removeNotificationIndicator(element: HTMLElement): void { + for (const className of element.classList) { + if (className.includes('notificationIndicator')) { + element.classList.remove(className); + } + } +} + async function openUnreadNotifications(event?: React.MouseEvent): Promise { if (event?.target instanceof HTMLButtonElement) { // Hide the tooltip @@ -46,8 +58,8 @@ async function openUnreadNotifications(event?: React.MouseEvent): Promise updateToast(`Opened the last ${limit} unread notifications`); } else { updateToast(pluralize(urls.length, '$$ notification') + ' opened'); - // Update the UI too. Optional because the UI is often out of date - $optional('.AppHeader-button--hasIndicator')?.classList.remove('AppHeader-button--hasIndicator'); + // Update the UI too + removeNotificationIndicator($(buttonWithNotificationsSelector)); } }, { message: 'Loading notifications…', @@ -59,39 +71,43 @@ async function openUnreadNotifications(event?: React.MouseEvent): Promise }); } -function addButton(nativeLink: HTMLAnchorElement): void { +async function addButton(nativeLink: HTMLAnchorElement): Promise { const classes = getClasses(nativeLink); - classes.delete('AppHeader-button--hasIndicator'); - // Reverse order so that the new button is painted below the "unread indicator" - nativeLink.parentElement!.classList.add('d-flex', 'flex-row-reverse'); - nativeLink.classList.add('AppHeader-buttonLeft'); const button = ( ); + + // Reverse order so that the new button is painted below the "unread indicator" + // Also has an rgh- class so that it can be targeted via CSS and deduplicated + wrap(nativeLink,
    ); + nativeLink.before(button); + button.setAttribute('data-variant', 'invisible'); // Enables hover style button.classList.add( ...classes, - 'AppHeader-buttonRight', 'tooltipped', 'tooltipped-sw', + 'rounded-left-0', + 'border-left-0', ); + + removeNotificationIndicator(button); } // No signal, created once per load function initOnce(): void { registerHotkey('g u', openUnreadNotifications); document.documentElement.classList.add('rgh-unread-anywhere'); - observe('a#AppHeader-notifications-button.AppHeader-button--hasIndicator', addButton); + observe(buttonWithNotificationsSelector + ':not(.rgh-unread-anywhere-wrapper *)', addButton); } void features.add(import.meta.url, { diff --git a/source/features/unreleased-commits.tsx b/source/features/unreleased-commits.tsx index 199c0e7bfe8c..83187cecd540 100644 --- a/source/features/unreleased-commits.tsx +++ b/source/features/unreleased-commits.tsx @@ -1,30 +1,26 @@ import React from 'dom-chef'; -import {CachedFunction} from 'webext-storage-cache'; import * as pageDetect from 'github-url-detection'; import PlusIcon from 'octicons-plain-react/Plus'; import TagIcon from 'octicons-plain-react/Tag'; -import {elementExists} from 'select-dom'; -import {$optional} from 'select-dom/strict.js'; +import {$optional, elementExists} from 'select-dom'; +import {CachedFunction} from 'webext-storage-cache'; import features from '../feature-manager.js'; -import observe from '../helpers/selector-observer.js'; import api from '../github-helpers/api.js'; +import getDefaultBranch from '../github-helpers/get-default-branch.js'; +import {userHasPushAccess} from '../github-helpers/get-user-permission.js'; +import {expectToken} from '../github-helpers/github-token.js'; +import {groupButtons} from '../github-helpers/group-buttons.js'; import { - buildRepoUrl, - cacheByRepo, - getLatestVersionTag, - getRepo, + buildRepoUrl, cacheByRepo, getLatestVersionTag, getRepo, } from '../github-helpers/index.js'; import isDefaultBranch from '../github-helpers/is-default-branch.js'; -import pluralize from '../helpers/pluralize.js'; import {branchSelector} from '../github-helpers/selectors.js'; -import getPublishRepoState from './unreleased-commits.gql'; -import getDefaultBranch from '../github-helpers/get-default-branch.js'; import abbreviateString from '../helpers/abbreviate-string.js'; import {wrapAll} from '../helpers/dom-utils.js'; -import {groupButtons} from '../github-helpers/group-buttons.js'; -import {expectToken} from '../github-helpers/github-token.js'; -import {userHasPushAccess} from '../github-helpers/get-user-permission.js'; +import pluralize from '../helpers/pluralize.js'; +import observe from '../helpers/selector-observer.js'; +import getPublishRepoState from './unreleased-commits.gql'; type RepoPublishState = { latestTag: string | false; @@ -63,7 +59,9 @@ const repoPublishState = new CachedFunction('tag-ahead-by', { // https://github.com/refined-github/refined-github/issues/6094 const latestTag = getLatestVersionTag([...tags.keys()]); const latestTagOid = tags.get(latestTag)!; - const aheadBy = repository.defaultBranchRef.target.history.nodes.findIndex((node: AnyObject) => node.oid === latestTagOid); + const aheadBy = repository.defaultBranchRef.target.history.nodes.findIndex((node: AnyObject) => + node.oid === latestTagOid, + ); return { latestTag, @@ -79,10 +77,9 @@ async function createLink( latestTag: string, aheadBy: number, ): Promise { - const commitCount - = aheadBy === undeterminableAheadBy - ? 'More than 20 unreleased commits' - : pluralize(aheadBy, '$$ unreleased commit'); + const commitCount = aheadBy === undeterminableAheadBy + ? 'More than 20 unreleased commits' + : pluralize(aheadBy, '$$ unreleased commit'); const label = `${commitCount}\nsince ${abbreviateString(latestTag, 30)}`; return ( @@ -92,7 +89,8 @@ async function createLink( aria-label={label} > - {aheadBy === undeterminableAheadBy || +{aheadBy}} + {' '} + {aheadBy === undeterminableAheadBy || +{aheadBy}} ); } diff --git a/source/features/unwrap-unnecessary-dropdowns.tsx b/source/features/unwrap-unnecessary-dropdowns.tsx index 067bfabb1c55..ceaa39ea298b 100644 --- a/source/features/unwrap-unnecessary-dropdowns.tsx +++ b/source/features/unwrap-unnecessary-dropdowns.tsx @@ -1,5 +1,5 @@ -import {$, $$optional} from 'select-dom/strict.js'; import * as pageDetect from 'github-url-detection'; +import {$, $$optional, $closest} from 'select-dom'; import features from '../feature-manager.js'; import observe from '../helpers/selector-observer.js'; @@ -22,7 +22,7 @@ function replaceNotificationsDropdown(): void { throw new Error('GitHub added new view types. This feature is obsolete.'); } - const dropdown = forms[0].closest('action-menu')!; + const dropdown = $closest('action-menu', forms[0]); const currentView = $('.Button-label span:last-child', dropdown).textContent.trim(); const desiredForm = currentView === 'Date' ? forms[0] : forms[1]; diff --git a/source/features/update-pr-from-base-branch.tsx b/source/features/update-pr-from-base-branch.tsx index 6ef8fda66e71..7f14845532c9 100644 --- a/source/features/update-pr-from-base-branch.tsx +++ b/source/features/update-pr-from-base-branch.tsx @@ -1,20 +1,22 @@ +import delegate, {type DelegateEvent} from 'delegate-it'; import React from 'dom-chef'; -import {elementExists} from 'select-dom'; -import {$, $optional} from 'select-dom/strict.js'; import * as pageDetect from 'github-url-detection'; -import delegate, {type DelegateEvent} from 'delegate-it'; +import { + $, $closest, $optional, elementExists, +} from 'select-dom'; import {CachedFunction} from 'webext-storage-cache'; import features from '../feature-manager.js'; -import observe from '../helpers/selector-observer.js'; import api from '../github-helpers/api.js'; -import {getBranches} from '../github-helpers/pr-branches.js'; import getPrInfo from '../github-helpers/get-pr-info.js'; -import showToast from '../github-helpers/toast.js'; -import {getRepo} from '../github-helpers/index.js'; -import updatePullRequestBranch from './update-pr-from-base-branch.gql'; import {expectToken} from '../github-helpers/github-token.js'; +import {getRepo} from '../github-helpers/index.js'; +import {getBranches} from '../github-helpers/pr-branches.js'; import {deletedHeadRepository, prMergeabilityBoxHeader} from '../github-helpers/selectors.js'; +import showToast from '../github-helpers/toast.js'; +import {getIdentifiers} from '../helpers/feature-helpers.js'; +import observe from '../helpers/selector-observer.js'; +import updatePullRequestBranch from './update-pr-from-base-branch.gql'; // TODO: Use CachedMap after https://github.com/fregante/webext-storage-cache/issues/51 const nativeRepos = new CachedFunction('native-update-button', { @@ -86,7 +88,6 @@ async function handler({delegateTarget: button}: DelegateEvent error); if (response instanceof Error) { - // eslint-disable-next-line unicorn/prefer-type-error -- This is a generic error throw new Error(`Error updating the branch: ${response.message}`, {cause: response}); } }, { @@ -94,53 +95,53 @@ async function handler({delegateTarget: button}: DelegateEvent - { - Object.entries(updateMethods).map(([method, label]) => { - const buttonId = crypto.randomUUID(); - const tooltipId = crypto.randomUUID(); - return ( -
    - - -
    - ); - }) - } + + + +
    + ); + })} ); } -const nativeUpdateButtonSelector = '[aria-label="Conflicts"] [class^="MergeBoxSectionHeader-module__wrapper"] [data-component="buttonContent"]'; +const nativeUpdateButtonSelector + = '[aria-label="Conflicts"] [class^="MergeBoxSectionHeader-module__wrapper"] [data-component="buttonContent"]'; function canNativelyUpdate(): boolean { const nativeButton = $optional(nativeUpdateButtonSelector); @@ -178,7 +179,7 @@ async function init(signal: AbortSignal): Promise { return false; } - delegate(`.${updateButtonClass}`, 'click', handler, {signal}); + delegate(feature.selector, 'click', handler, {signal}); observe(prMergeabilityBoxHeader, addButton, {signal}); observe(nativeUpdateButtonSelector, disableFeatureOnRepo, {signal}); } diff --git a/source/features/useful-not-found-page.tsx b/source/features/useful-not-found-page.tsx index 799e3ebfd476..482e70a2c979 100644 --- a/source/features/useful-not-found-page.tsx +++ b/source/features/useful-not-found-page.tsx @@ -1,17 +1,17 @@ import React from 'dom-chef'; -import {$} from 'select-dom/strict.js'; import elementReady from 'element-ready'; import * as pageDetect from 'github-url-detection'; +import {$} from 'select-dom'; -import onetime from '../helpers/onetime.js'; import features from '../feature-manager.js'; import api from '../github-helpers/api.js'; -import GitHubFileUrl from '../github-helpers/github-file-url.js'; import getDefaultBranch from '../github-helpers/get-default-branch.js'; +import GitHubFileUrl from '../github-helpers/github-file-url.js'; +import {expectToken} from '../github-helpers/github-token.js'; import {getCleanPathname, isUrlReachable} from '../github-helpers/index.js'; +import onetime from '../helpers/onetime.js'; import observe from '../helpers/selector-observer.js'; import GetLatestCommitToFile from './useful-not-found-page.gql'; -import {expectToken} from '../github-helpers/github-token.js'; type File = { previous_filename?: string; @@ -200,14 +200,16 @@ async function initPrCommitOnce(): Promise { const blankSlateParagraph = await elementReady('.blankslate:has(> .octicon-telescope) p', {waitForChildren: false}); blankSlateParagraph!.after( -

    You can also try to view the detached standalone commit.

    , +

    + You can also try to view the detached standalone commit. +

    , ); } async function initRepoFile(signal: AbortSignal): Promise { await expectToken(); observe('#repos-header-breadcrumb-wide-heading + ol a', crossIfNonExistent, {signal}); - observe('main div[data-testid="eror-404-description"]', showGitObjectHistoryOnRepo, {signal}); // "eror" as misspelled by GitHub + observe('main div[data-testid="eror-404-description"]', showGitObjectHistoryOnRepo, {signal}); // "eror" as misspelled by GitHub } void features.add(import.meta.url, { diff --git a/source/features/user-profile-follower-badge.tsx b/source/features/user-profile-follower-badge.tsx index f0891a1b05df..8c788dd04d4e 100644 --- a/source/features/user-profile-follower-badge.tsx +++ b/source/features/user-profile-follower-badge.tsx @@ -1,11 +1,11 @@ import React from 'dom-chef'; -import {CachedFunction} from 'webext-storage-cache'; import elementReady from 'element-ready'; import * as pageDetect from 'github-url-detection'; +import {CachedFunction} from 'webext-storage-cache'; import features from '../feature-manager.js'; import api from '../github-helpers/api.js'; -import {getLoggedInUser, getCleanPathname} from '../github-helpers/index.js'; +import {getCleanPathname, getLoggedInUser} from '../github-helpers/index.js'; import attachElement from '../helpers/attach-element.js'; const doesUserFollow = new CachedFunction('user-follows', { diff --git a/source/features/vertical-front-matter.tsx b/source/features/vertical-front-matter.tsx index 2c8e9984f2fd..7664a4a01403 100644 --- a/source/features/vertical-front-matter.tsx +++ b/source/features/vertical-front-matter.tsx @@ -1,18 +1,19 @@ import './vertical-front-matter.css'; import React from 'dom-chef'; -import {$$} from 'select-dom'; import * as pageDetect from 'github-url-detection'; +import {$$optional} from 'select-dom'; import features from '../feature-manager.js'; import observe from '../helpers/selector-observer.js'; // https://github.com/github/markup/blob/cd01f9ec87c86ce5a7c70188a74ef40fc4669c5b/lib/github/markup/markdown.rb#L34 -const hasFrontMatter = (): boolean => pageDetect.isSingleFile() && /\.(?:mdx?|mkdn?|mdwn|mdown|markdown|litcoffee)$/.test(location.pathname); +const hasFrontMatter = (): boolean => + pageDetect.isSingleFile() && /\.(?:mdx?|mkdn?|mdwn|mdown|markdown|litcoffee)$/.test(location.pathname); function transpose(table: HTMLElement): void { - const rows = $$(':scope > tbody > tr', table); - const headers = $$(':scope > thead th', table); + const rows = $$optional(':scope > tbody > tr', table); + const headers = $$optional(':scope > thead th', table); if (headers.length <= 4 || rows.length !== 1 || headers.length !== rows[0].childElementCount) { return; } diff --git a/source/features/view-last-pr-deployment.tsx b/source/features/view-last-pr-deployment.tsx index 0d1ee7518f2d..8c126a4404f8 100644 --- a/source/features/view-last-pr-deployment.tsx +++ b/source/features/view-last-pr-deployment.tsx @@ -1,32 +1,36 @@ import React from 'dom-chef'; -import {lastElement} from 'select-dom'; import * as pageDetect from 'github-url-detection'; import RocketIcon from 'octicons-plain-react/Rocket'; +import {lastElementOptional} from 'select-dom'; import features from '../feature-manager.js'; import observe from '../helpers/selector-observer.js'; function addLink(header: HTMLElement): void { - const lastDeployment = lastElement('.js-timeline-item a[title="Deployment has completed"]'); + const lastDeployment = lastElementOptional('.js-timeline-item a[title="Deployment has completed"]'); if (!lastDeployment) { return; } - header.prepend( + // Use "parentElement" because open PRs have a "PR status" button before the "Code" button + header.parentElement!.prepend( - - Latest deployment + , ); } function init(signal: AbortSignal): void { - observe('.gh-header-actions', addLink, {signal}); + observe([ + 'button[class*="PullRequestCodeButton"]', + '.gh-header-actions > :first-child', // TODO: Drop in September 2026 + ], addLink, {signal}); } void features.add(import.meta.url, { diff --git a/source/features/visit-tag.tsx b/source/features/visit-tag.tsx index 72afe56054c8..a67d8ea4e5fa 100644 --- a/source/features/visit-tag.tsx +++ b/source/features/visit-tag.tsx @@ -1,23 +1,25 @@ -import React from 'react'; -import {elementExists} from 'select-dom'; +import * as pageDetect from 'github-url-detection'; import ArrowUpRightIcon from 'octicons-plain-react/ArrowUpRight'; import CodeIcon from 'octicons-plain-react/Code'; -import * as pageDetect from 'github-url-detection'; +import React from 'react'; +import {elementExists} from 'select-dom'; -import {branchSelector} from '../github-helpers/selectors.js'; import features from '../feature-manager.js'; -import observe from '../helpers/selector-observer.js'; -import {wrapAll} from '../helpers/dom-utils.js'; import {buildRepoUrl} from '../github-helpers/index.js'; +import {branchSelector} from '../github-helpers/selectors.js'; +import {wrapAll} from '../helpers/dom-utils.js'; +import observe from '../helpers/selector-observer.js'; async function addLink(branchSelector: HTMLButtonElement): Promise { - if (elementExists([ - // If the branch picker is open, do nothing #7491 - '#selectPanel', + if ( + elementExists([ + // If the branch picker is open, do nothing #7491 + '#selectPanel', - // React view deduplication https://github.com/refined-github/refined-github/issues/7601 - '.rgh-visit-tag', - ])) { + // React view deduplication https://github.com/refined-github/refined-github/issues/7601 + '.rgh-visit-tag', + ]) + ) { return; } diff --git a/source/features/warn-pr-from-master.tsx b/source/features/warn-pr-from-master.tsx index a62cf42c60d7..81b626336c00 100644 --- a/source/features/warn-pr-from-master.tsx +++ b/source/features/warn-pr-from-master.tsx @@ -1,15 +1,22 @@ import React from 'dom-chef'; import * as pageDetect from 'github-url-detection'; -import observe from '../helpers/selector-observer.js'; import features from '../feature-manager.js'; -import parseCompareUrl from '../github-helpers/parse-compare-url.js'; import {defaultBranchOfRepo} from '../github-helpers/get-default-branch.js'; +import parseCompareUrl from '../github-helpers/parse-compare-url.js'; +import observe from '../helpers/selector-observer.js'; async function addWarning(anchor: HTMLElement): Promise { anchor.before(
    - Note: Creating a PR from the default branch is an anti-pattern. + Note: Creating a PR from the default branch is an{' '} + + anti-pattern + .
    , ); } diff --git a/source/features/warning-for-disallow-edits.css b/source/features/warning-for-disallow-edits.css index 688721f0fb20..9f31585d8337 100644 --- a/source/features/warning-for-disallow-edits.css +++ b/source/features/warning-for-disallow-edits.css @@ -6,15 +6,15 @@ } :is(.discussion-sidebar-item, .js-collab-option):has( - input[name='collab_privs']:not(:checked) - ) + input[name='collab_privs']:not(:checked) +) ~ .rgh-warning-for-disallow-edits { display: block; } :is(.discussion-sidebar-item, .js-collab-option):has( - input[name='collab_privs']:checked - ) + input[name='collab_privs']:checked +) ~ .rgh-warning-for-disallow-edits { display: none; } diff --git a/source/features/warning-for-disallow-edits.tsx b/source/features/warning-for-disallow-edits.tsx index 35156ed636bb..e7e96f63a3f8 100644 --- a/source/features/warning-for-disallow-edits.tsx +++ b/source/features/warning-for-disallow-edits.tsx @@ -1,15 +1,16 @@ import './warning-for-disallow-edits.css'; import React from 'dom-chef'; -import {$optional} from 'select-dom/strict.js'; import * as pageDetect from 'github-url-detection'; +import {$closest, $optional} from 'select-dom'; import features from '../feature-manager.js'; import attachElement from '../helpers/attach-element.js'; const getWarning = (): React.JSX.Element => (
    - Note: Maintainers may require changes. It's easier and faster to allow them to make direct changes before merging. + Note:{' '} + Maintainers may require changes. It's easier and faster to allow them to make direct changes before merging.
    ); @@ -21,11 +22,11 @@ function init(): void | false { if (pageDetect.isPRConversation()) { attachElement( - checkbox.closest('.discussion-sidebar-item')!, + $closest('.discussion-sidebar-item', checkbox), {after: getWarning}, ); } else { - const option = checkbox.closest('.js-collab-option')!; + const option = $closest('.js-collab-option', checkbox); // Prevent layout shifting when warning appears option.classList.remove('flex-auto'); diff --git a/source/github-events/on-commit-title-update.ts b/source/github-events/on-commit-title-update.ts index 920979c91254..ffa83ba9c782 100644 --- a/source/github-events/on-commit-title-update.ts +++ b/source/github-events/on-commit-title-update.ts @@ -9,7 +9,10 @@ const fieldSelector = [ '#commit-summary-input', ]; -export default function onCommitTitleUpdate(callback: DelegateEventHandler, signal: AbortSignal): void { +export default function onCommitTitleUpdate( + callback: DelegateEventHandler, + signal: AbortSignal, +): void { // For immediate user input delegate(fieldSelector, 'input', callback, {signal}); } diff --git a/source/github-events/on-field-keydown.tsx b/source/github-events/on-field-keydown.tsx index 8ebe2fd4e733..8d23e7a08fc4 100644 --- a/source/github-events/on-field-keydown.tsx +++ b/source/github-events/on-field-keydown.tsx @@ -1,10 +1,11 @@ -import {elementExists} from 'select-dom'; import delegate, {type DelegateEventHandler} from 'delegate-it'; +import {elementExists} from 'select-dom'; -type DelegateFieldEvent = DelegateEventHandler; +type TextField = HTMLTextAreaElement | HTMLInputElement; +type KeydownHandler = DelegateEventHandler; -function onFieldKeydown(selector: string, callback: DelegateFieldEvent, signal: AbortSignal): void { - delegate(selector as 'textarea', 'keydown', event => { +function onFieldKeydown(selector: string | readonly string[], callback: KeydownHandler, signal: AbortSignal): void { + delegate(selector, 'keydown', event => { const field = event.delegateTarget; if ( @@ -25,14 +26,19 @@ function onFieldKeydown(selector: string, callback: DelegateFieldEvent, signal: }); } -export function onCommentFieldKeydown(callback: DelegateFieldEvent, signal: AbortSignal): void { +export function onCommentFieldKeydown(callback: KeydownHandler, signal: AbortSignal): void { onFieldKeydown('textarea', callback, signal); } -export function onConversationTitleFieldKeydown(callback: DelegateFieldEvent, signal: AbortSignal): void { - onFieldKeydown('input[placeholder="Title"], #issue_title, #pull_request_title', callback, signal); +export function onConversationTitleFieldKeydown(callback: KeydownHandler, signal: AbortSignal): void { + onFieldKeydown([ + '[class^="prc-PageLayout-Header"] input', // PR + 'input[placeholder="Title"]', // Issue + '#issue_title', // Old PR view - TODO: Remove after legacy PR files view is removed + '#pull_request_title', // Old compare view - TODO: Remove after August 2026 + ], callback, signal); } -export function onCommitTitleFieldKeydown(callback: DelegateFieldEvent, signal: AbortSignal): void { +export function onCommitTitleFieldKeydown(callback: KeydownHandler, signal: AbortSignal): void { onFieldKeydown('#commit-summary-input', callback, signal); } diff --git a/source/github-events/on-pr-merge.ts b/source/github-events/on-pr-merge.ts index ea5a710e8562..f94b8c2a144b 100644 --- a/source/github-events/on-pr-merge.ts +++ b/source/github-events/on-pr-merge.ts @@ -1,7 +1,7 @@ import {oneEvent} from 'delegate-it'; -import observe from '../helpers/selector-observer.js'; import {confirmMergeButton} from '../github-helpers/selectors.js'; +import observe from '../helpers/selector-observer.js'; // This event ensures that the feature appears exclusively to the person that merged the PR and not anyone who was on the page at the time of the merge export default async function waitForPrMerge(signal: AbortSignal): Promise { diff --git a/source/github-helpers/api.tsx b/source/github-helpers/api.tsx index 463cbec6d851..7a9b5031529d 100644 --- a/source/github-helpers/api.tsx +++ b/source/github-helpers/api.tsx @@ -26,16 +26,16 @@ so the call will not throw an error but it will return as usual. */ import React from 'dom-chef'; -import mem from 'memoize'; import * as pageDetect from 'github-url-detection'; -import type {JsonObject, AsyncReturnType} from 'type-fest'; +import mem from 'memoize'; +import type {AsyncReturnType, JsonObject} from 'type-fest'; import {uint8ArrayToBase64} from 'uint8array-extras'; +import {log} from '../helpers/feature-helpers.js'; import onetime from '../helpers/onetime.js'; -import {getRepo, getLoggedInUser} from './index.js'; import {getToken} from '../options-storage.js'; -import {log} from '../helpers/feature-helpers.js'; import {tokenUser} from './github-token.js'; +import {getLoggedInUser, getRepo} from './index.js'; type JsonError = { message: string; @@ -277,7 +277,7 @@ const v4uncached = async ( return data; } - throw await getError(apiResponse as JsonObject); + throw await getError(apiResponse); }; const v4 = mem(v4uncached, { @@ -322,7 +322,17 @@ async function getError(apiResponse: JsonObject): Promise const error = new RefinedGitHubApiError( 'Your organization requires a specific type of token.', ); - error.richMessage = <>Your organization requires a specific type of token. Fix…; + error.richMessage = <> + Your organization requires a specific type of token.{' '} + + Fix… + + ; return error; } diff --git a/source/github-helpers/bugs-label.ts b/source/github-helpers/bugs-label.ts index 56819ffb319a..649453c7da36 100644 --- a/source/github-helpers/bugs-label.ts +++ b/source/github-helpers/bugs-label.ts @@ -1,4 +1,5 @@ -const supportedLabels = /^(?:bug|bug-?fix|confirmed-bug|(?:category|type|kind|triage|issue)[:/-]bug|(?::[\w-]+:|\p{Emoji})bug)$/iu; +const supportedLabels + = /^(?:bug|bug-?fix|confirmed-bug|(?:category|type|kind|triage|issue)[:/-]bug|(?::[\w-]+:|\p{Emoji})bug)$/iu; export default function isBugLabel(label: string): boolean { return supportedLabels.test(label.replaceAll(/\s/g, '')); } diff --git a/source/github-helpers/create-dropdown-item.tsx b/source/github-helpers/create-dropdown-item.tsx index 9e198f9068ee..4f1be05b6805 100644 --- a/source/github-helpers/create-dropdown-item.tsx +++ b/source/github-helpers/create-dropdown-item.tsx @@ -38,7 +38,6 @@ export default function createDropdownItem({ {label} -
  • ); } diff --git a/source/github-helpers/dom-formatters.tsx b/source/github-helpers/dom-formatters.tsx index ec2dffd7f6b7..6a3c74c992ed 100644 --- a/source/github-helpers/dom-formatters.tsx +++ b/source/github-helpers/dom-formatters.tsx @@ -1,14 +1,15 @@ import React from 'dom-chef'; -import {elementExists} from 'select-dom'; -import {$$} from 'select-dom/strict.js'; -import zipTextNodes from 'zip-text-nodes'; -import {applyToLink} from 'shorten-repo-url'; -import {linkifyUrlsToDom} from 'linkify-urls'; import {linkifyIssuesToDom, type Options as LinkifyIssuesOptions} from 'linkify-issues'; +import {linkifyUrlsToDom} from 'linkify-urls'; +import { + $$, $closest, $closestOptional, elementExists, +} from 'select-dom'; +import {applyToLink} from 'shorten-repo-url'; +import zipTextNodes from 'zip-text-nodes'; import getTextNodes from '../helpers/get-text-nodes.js'; +import {buildRepoUrl, getConversationNumber} from './index.js'; import parseBackticksCore from './parse-backticks.js'; -import {buildRepoUrl} from './index.js'; // Shared class necessary to avoid also shortening the links export const linkifiedUrlClass = 'rgh-linkified-code'; @@ -27,8 +28,20 @@ export function shortenLink(link: HTMLAnchorElement): void { // Exclude the link if the closest element found is not `.markdown-body` // This avoids shortening links in code and code suggestions, but still shortens them in review comments // https://github.com/refined-github/refined-github/pull/4759#discussion_r702460890 - if (link.closest(String([...codeElementsSelector, '.markdown-body']))?.classList.contains('markdown-body')) { + if ($closestOptional([...codeElementsSelector, '.markdown-body'], link)?.classList.contains('markdown-body')) { applyToLink(link, location.href); + + // Customize same-thread links. Already handled by GitHub, but badly + // https://github.com/refined-github/refined-github/issues/6057 + if ( + link.textContent === `#${getConversationNumber()} (comment)` + ) { + link.textContent = '(earlier comment)'; + } else if ( + link.textContent === `#${getConversationNumber()} (review)` + ) { + link.textContent = '(earlier review)'; + } } } @@ -45,9 +58,9 @@ export function repositionAnchors(element: HTMLElement): void { return; } - const container = element.closest('.react-code-file-contents')!.parentElement!; + const container = $closest('.react-code-file-contents', element).parentElement!; - const codeLine = element.closest('[id]'); + const codeLine = $closestOptional('[id]', element); if (!codeLine) { throw new Error('Could not find parent code line'); } @@ -57,7 +70,6 @@ export function repositionAnchors(element: HTMLElement): void { const anchor = `--rgh-${codeLine.id}-${index}`; link.replaceWith({link.textContent}); link.className = 'react-code-text rgh-anchored-link'; - // @ts-expect-error -- Not widely available yet link.style.positionAnchor = anchor; container.prepend(link); } diff --git a/source/github-helpers/get-comment-author.ts b/source/github-helpers/get-comment-author.ts index 7404c44cd108..bac0fa872e7c 100644 --- a/source/github-helpers/get-comment-author.ts +++ b/source/github-helpers/get-comment-author.ts @@ -1,3 +1,4 @@ +import {$closest, $closestOptional} from 'select-dom'; /** Given any element in a comment, returns the comment’s author @@ -18,14 +19,13 @@ Note: Bots are used as `name[bot]`, `app/name`, or `apps/name` depending on the */ export default function getCommentAuthor(anyElementInsideComment: Element): string { - const avatar: HTMLImageElement = anyElementInsideComment - .closest([ - '.TimelineItem', // PR comments (and pre-issue redesign issue comments) - '.review-comment', // PR review comments - '.react-issue-body', // First issue comment - '.react-issue-comment', // Issue comments - '[data-testid="comment-header"]', // Commit comments - ])! + const avatar: HTMLImageElement = $closest([ + '.TimelineItem', // PR comments (and pre-issue redesign issue comments) + '.review-comment', // PR review comments + '.react-issue-body', // First issue comment + '.react-issue-comment', // Issue comments + '[data-testid="comment-header"]', // Commit comments + ], anyElementInsideComment) .querySelector([ '.TimelineItem-avatar img', // PR comments (and pre-issue redesign issue comments) 'img.avatar', // PR review comments @@ -37,7 +37,7 @@ export default function getCommentAuthor(anyElementInsideComment: Element): stri .alt // Occasionally ends with `[bot]` .replace(/^@/, ''); // May or may not be present - if (!name.endsWith('[bot]') && avatar.closest('[href^="https://github.com/apps/"]')) { + if (!name.endsWith('[bot]') && $closestOptional('[href^="https://github.com/apps/"]', avatar)) { // Example: https://github.com/webpack/webpack/pull/15926#issuecomment-1170670173 return name + '[bot]'; } diff --git a/source/github-helpers/get-current-git-ref.test.ts b/source/github-helpers/get-current-git-ref.test.ts index 3f5ca37bb705..71e6e49771b8 100644 --- a/source/github-helpers/get-current-git-ref.test.ts +++ b/source/github-helpers/get-current-git-ref.test.ts @@ -7,91 +7,142 @@ import getCurrentGitRef, {getGitRef} from './get-current-git-ref.js'; // The titles supplied here listed here are real, not guessed, except the error tester test('getGitRef', () => { // Error testing - assert.equal(getGitRef( - '/', - 'some page title', - ), undefined, 'It should never throw with valid input'); - assert.throws(() => getGitRef( - 'https://github.com', - 'github.com', - )); + assert.equal( + getGitRef( + '/', + 'some page title', + ), + undefined, + 'It should never throw with valid input', + ); + assert.throws(() => + getGitRef( + 'https://github.com', + 'github.com', + ), + ); // Root - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint', - 'typescript-eslint/typescript-eslint: Monorepo for all the tooling which enables ESLint to support TypeScript', - ), undefined); - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/tree/chore/lerna-4', - 'typescript-eslint/typescript-eslint at chore/lerna-4', - ), 'chore/lerna-4'); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint', + 'typescript-eslint/typescript-eslint: Monorepo for all the tooling which enables ESLint to support TypeScript', + ), + undefined, + ); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/tree/chore/lerna-4', + 'typescript-eslint/typescript-eslint at chore/lerna-4', + ), + 'chore/lerna-4', + ); // Sub folder - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/tree/master/docs', - 'typescript-eslint/docs at master · typescript-eslint/typescript-eslint', - ), 'master'); - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/tree/chore/lerna-4/docs', - 'typescript-eslint/docs at chore/lerna-4 · typescript-eslint/typescript-eslint', - ), 'chore/lerna-4'); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/tree/master/docs', + 'typescript-eslint/docs at master · typescript-eslint/typescript-eslint', + ), + 'master', + ); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/tree/chore/lerna-4/docs', + 'typescript-eslint/docs at chore/lerna-4 · typescript-eslint/typescript-eslint', + ), + 'chore/lerna-4', + ); // Sub sub folder - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/tree/master/docs/getting-started', - 'typescript-eslint/docs/getting-started at master · typescript-eslint/typescript-eslint', - ), 'master'); - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/tree/chore/lerna-4/docs/getting-started', - 'typescript-eslint/docs/getting-started at chore/lerna-4 · typescript-eslint/typescript-eslint', - ), 'chore/lerna-4'); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/tree/master/docs/getting-started', + 'typescript-eslint/docs/getting-started at master · typescript-eslint/typescript-eslint', + ), + 'master', + ); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/tree/chore/lerna-4/docs/getting-started', + 'typescript-eslint/docs/getting-started at chore/lerna-4 · typescript-eslint/typescript-eslint', + ), + 'chore/lerna-4', + ); // File - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/blob/master/docs/getting-started/README.md', - 'typescript-eslint/README.md at master · typescript-eslint/typescript-eslint', - ), 'master'); - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/blob/chore/lerna-4/docs/getting-started/README.md', - 'typescript-eslint/README.md at chore/lerna-4 · typescript-eslint/typescript-eslint', - ), 'chore/lerna-4'); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/blob/master/docs/getting-started/README.md', + 'typescript-eslint/README.md at master · typescript-eslint/typescript-eslint', + ), + 'master', + ); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/blob/chore/lerna-4/docs/getting-started/README.md', + 'typescript-eslint/README.md at chore/lerna-4 · typescript-eslint/typescript-eslint', + ), + 'chore/lerna-4', + ); // Editing file - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/edit/master/docs/getting-started/README.md', - 'Editing typescript-eslint/README.md at master · typescript-eslint/typescript-eslint', - ), 'master'); - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/edit/chore/lerna-4/docs/getting-started/README.md', - 'Editing typescript-eslint/README.md at chore/lerna-4 · typescript-eslint/typescript-eslint', - ), 'chore/lerna-4'); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/edit/master/docs/getting-started/README.md', + 'Editing typescript-eslint/README.md at master · typescript-eslint/typescript-eslint', + ), + 'master', + ); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/edit/chore/lerna-4/docs/getting-started/README.md', + 'Editing typescript-eslint/README.md at chore/lerna-4 · typescript-eslint/typescript-eslint', + ), + 'chore/lerna-4', + ); // Blame - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/blame/master/docs/getting-started/README.md', - 'typescript-eslint/docs/getting-started/README.md at master · typescript-eslint/typescript-eslint', - ), 'master'); - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/blame/chore/lerna-4/docs/getting-started/README.md', - 'typescript-eslint/docs/getting-started/README.md at chore/lerna-4 · typescript-eslint/typescript-eslint', - ), 'chore/lerna-4'); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/blame/master/docs/getting-started/README.md', + 'typescript-eslint/docs/getting-started/README.md at master · typescript-eslint/typescript-eslint', + ), + 'master', + ); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/blame/chore/lerna-4/docs/getting-started/README.md', + 'typescript-eslint/docs/getting-started/README.md at chore/lerna-4 · typescript-eslint/typescript-eslint', + ), + 'chore/lerna-4', + ); // Single commit - assert.equal(getGitRef( - '/typescript-eslint/typescript-eslint/commit/795fd1c529ee58e97283c9ddf8463703517b50ab', - 'chore: add markdownlint (#1889) · typescript-eslint/typescript-eslint@795fd1c', - ), '795fd1c529ee58e97283c9ddf8463703517b50ab'); + assert.equal( + getGitRef( + '/typescript-eslint/typescript-eslint/commit/795fd1c529ee58e97283c9ddf8463703517b50ab', + 'chore: add markdownlint (#1889) · typescript-eslint/typescript-eslint@795fd1c', + ), + '795fd1c529ee58e97283c9ddf8463703517b50ab', + ); // Branch includes period - assert.equal(getGitRef( - '/anggrayudi/SimpleStorage/tree/release/0.8.0', - 'anggrayudi/SimpleStorage at release/0.8.0', - ), 'release/0.8.0'); + assert.equal( + getGitRef( + '/anggrayudi/SimpleStorage/tree/release/0.8.0', + 'anggrayudi/SimpleStorage at release/0.8.0', + ), + 'release/0.8.0', + ); - assert.equal(getGitRef( - '/ksh-code/repository/tree/h.l.o.o', - 'ksh-code/repository at h.l.o.o', - ), 'h.l.o.o'); + assert.equal( + getGitRef( + '/ksh-code/repository/tree/h.l.o.o', + 'ksh-code/repository at h.l.o.o', + ), + 'h.l.o.o', + ); }); // The titles supplied here listed here are real, not guessed, except the error tester diff --git a/source/github-helpers/get-current-git-ref.ts b/source/github-helpers/get-current-git-ref.ts index 8010c1940831..dcade843b9cd 100644 --- a/source/github-helpers/get-current-git-ref.ts +++ b/source/github-helpers/get-current-git-ref.ts @@ -1,5 +1,5 @@ import {isRepoCommitList} from 'github-url-detection'; -import {$optional} from 'select-dom/strict.js'; +import {$optional} from 'select-dom'; import {extractCurrentBranchFromBranchPicker} from './index.js'; import {branchSelector} from './selectors.js'; diff --git a/source/github-helpers/get-default-branch.ts b/source/github-helpers/get-default-branch.ts index 20e2a9732dd4..8098772e81bb 100644 --- a/source/github-helpers/get-default-branch.ts +++ b/source/github-helpers/get-default-branch.ts @@ -1,11 +1,11 @@ -import {CachedFunction} from 'webext-storage-cache'; import elementReady from 'element-ready'; import type {NameWithOwner} from 'github-url-detection'; +import {CachedFunction} from 'webext-storage-cache'; import api from './api.js'; +import GetDefaultBranch from './get-default-branch.gql'; import {extractCurrentBranchFromBranchPicker, getRepo} from './index.js'; import {branchSelector} from './selectors.js'; -import GetDefaultBranch from './get-default-branch.gql'; const isCurrentRepo = (nameWithOwner: NameWithOwner): boolean => Boolean(getRepo()?.nameWithOwner === nameWithOwner); diff --git a/source/github-helpers/get-tab-count.ts b/source/github-helpers/get-tab-count.ts index 9ec5615f5958..3c2139b7163e 100644 --- a/source/github-helpers/get-tab-count.ts +++ b/source/github-helpers/get-tab-count.ts @@ -1,5 +1,5 @@ -import {$optional} from 'select-dom/strict.js'; import oneMutation from 'one-mutation'; +import {$optional} from 'select-dom'; export default async function getTabCount(tab: Element): Promise { const counter = $optional('.Counter, .num', tab); diff --git a/source/github-helpers/get-user-avatar.ts b/source/github-helpers/get-user-avatar.ts index 2f1dbf839384..9ce6d4e32eae 100644 --- a/source/github-helpers/get-user-avatar.ts +++ b/source/github-helpers/get-user-avatar.ts @@ -1,5 +1,5 @@ -import {$optional} from 'select-dom/strict.js'; import * as pageDetect from 'github-url-detection'; +import {$optional} from 'select-dom'; export default function getUserAvatar(username: string, size: number): string | void { let cleanName = username.replace('[bot]', ''); @@ -22,9 +22,12 @@ export default function getUserAvatar(username: string, size: number): string | cleanName = 'in/1143301'; } - const url = pageDetect.isEnterprise() + // Bots don't have a /$username.png URL + // Enterprise can only use /$username.png + const isBot = username.endsWith('[bot]') || cleanName.includes('/'); + const url = pageDetect.isEnterprise() || !isBot ? `/${cleanName}.png` : `https://avatars.githubusercontent.com/${cleanName}`; - // Why use a 2x size: https://github.com/refined-github/refined-github/pull/4973#discussion_r735133613 + // Why use a 2x size: https://github.com/refined-github/refined-github/pull/4973#discussion_r735133613 return url + `?size=${size * 2}`; } diff --git a/source/github-helpers/get-user-permission.ts b/source/github-helpers/get-user-permission.ts index 759f896e9444..37a1f643862b 100644 --- a/source/github-helpers/get-user-permission.ts +++ b/source/github-helpers/get-user-permission.ts @@ -1,9 +1,9 @@ -import {CachedFunction} from 'webext-storage-cache'; import {elementExists} from 'select-dom'; +import {CachedFunction} from 'webext-storage-cache'; import {hasToken} from '../options-storage.js'; -import {getRepo} from './index.js'; import api from './api.js'; +import {getRepo} from './index.js'; /* From https://docs.github.com/en/graphql/reference/enums#repositorypermission @@ -68,7 +68,6 @@ export async function userIsModerator(): Promise { '[title^="You are a member"]', '[title^="You are a maintainer"]', '[title^="You are a collaborator"]', - // Don't check for admin access here. If the user has admin access, the DOM check in `viewerPermission` will use the DOM and be cached anyway ]); diff --git a/source/github-helpers/github-file-url.test.ts b/source/github-helpers/github-file-url.test.ts index ab987c7c7bac..f0c627dbfac9 100644 --- a/source/github-helpers/github-file-url.test.ts +++ b/source/github-helpers/github-file-url.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import GitHubFileUrl from './github-file-url.js'; @@ -67,14 +67,25 @@ test('change filePath', () => { }); test('get filePath from search', () => { - const url = new GitHubFileUrl('https://github.com/yakov116/refined-github/commits/f23b687b3b89aa95a76193722cdfeff740646670?after=f23b687b3b89aa95a76193722cdfeff740646670+34&path%5B%5D=source&path%5B%5D=features&path%5B%5D=release-download-count.tsx'); + const url = new GitHubFileUrl( + 'https://github.com/yakov116/refined-github/commits/f23b687b3b89aa95a76193722cdfeff740646670?after=f23b687b3b89aa95a76193722cdfeff740646670+34&path%5B%5D=source&path%5B%5D=features&path%5B%5D=release-download-count.tsx', + ); assert.equal(url.user, 'yakov116'); assert.equal(url.repository, 'refined-github'); assert.equal(url.route, 'commits'); assert.equal(url.branch, 'f23b687b3b89aa95a76193722cdfeff740646670'); assert.equal(url.filePath, 'source/features/release-download-count.tsx'); - assert.equal(url.pathname, '/yakov116/refined-github/commits/f23b687b3b89aa95a76193722cdfeff740646670/source/features/release-download-count.tsx'); - assert.equal(url.href, 'https://github.com/yakov116/refined-github/commits/f23b687b3b89aa95a76193722cdfeff740646670/source/features/release-download-count.tsx?after=f23b687b3b89aa95a76193722cdfeff740646670+34'); + assert.equal( + url.pathname, + '/yakov116/refined-github/commits/f23b687b3b89aa95a76193722cdfeff740646670/source/features/release-download-count.tsx', + ); + assert.equal( + url.href, + 'https://github.com/yakov116/refined-github/commits/f23b687b3b89aa95a76193722cdfeff740646670/source/features/release-download-count.tsx?after=f23b687b3b89aa95a76193722cdfeff740646670+34', + ); assert.equal(url.search, '?after=f23b687b3b89aa95a76193722cdfeff740646670+34'); - assert.equal(String(url), 'https://github.com/yakov116/refined-github/commits/f23b687b3b89aa95a76193722cdfeff740646670/source/features/release-download-count.tsx?after=f23b687b3b89aa95a76193722cdfeff740646670+34'); + assert.equal( + String(url), + 'https://github.com/yakov116/refined-github/commits/f23b687b3b89aa95a76193722cdfeff740646670/source/features/release-download-count.tsx?after=f23b687b3b89aa95a76193722cdfeff740646670+34', + ); }); diff --git a/source/github-helpers/github-file-url.ts b/source/github-helpers/github-file-url.ts index 370d086986a2..65c9748fc323 100644 --- a/source/github-helpers/github-file-url.ts +++ b/source/github-helpers/github-file-url.ts @@ -55,7 +55,9 @@ export default class GitHubFileUrl { for (const [index, section] of currentBranchSections.entries()) { if (ambiguousReference[index] !== section) { - console.warn(`The supplied path (${ambiguousReference.join('/')}) is ambiguous (current reference is \`${currentBranch}\`)`); + console.warn( + `The supplied path (${ambiguousReference.join('/')}) is ambiguous (current reference is \`${currentBranch}\`)`, + ); return {branch, filePath}; } } @@ -67,7 +69,10 @@ export default class GitHubFileUrl { } get pathname(): string { - return `/${this.user}/${this.repository}/${this.route}/${this.branch}/${this.filePath}`.replaceAll(/(?:(?:undefined)?\/)+$/g, ''); + return `/${this.user}/${this.repository}/${this.route}/${this.branch}/${this.filePath}`.replaceAll( + /(?:(?:undefined)?\/)+$/g, + '', + ); } set pathname(pathname: string) { diff --git a/source/github-helpers/github-token.ts b/source/github-helpers/github-token.ts index a78597ba25de..fdcd2ea73d63 100644 --- a/source/github-helpers/github-token.ts +++ b/source/github-helpers/github-token.ts @@ -1,9 +1,9 @@ -import {CachedFunction} from 'webext-storage-cache'; import * as pageDetect from 'github-url-detection'; +import {CachedFunction} from 'webext-storage-cache'; // Avoid importing api.js here, there's too much logic/caching we don't need -import {getToken} from '../options-storage.js'; import hashString from '../helpers/hash-string.js'; +import {getToken} from '../options-storage.js'; type BaseApiFetchOptions = { apiBase: string; @@ -121,6 +121,10 @@ export async function expectTokenScope(scope: string): Promise { const {scopes: tokenScopes} = await getTokenInfo(api, token); if (!tokenScopes.includes(scope)) { - throw new Error('The token you provided does not have ' + (tokenScopes.length > 0 ? `the \`${scope}\` scope. It only includes \`${tokenScopes.join(', ')}\`.` : 'any scope. You can change the scope of your token at https://github.com/settings/tokens')); + throw new Error( + 'The token you provided does not have ' + (tokenScopes.length > 0 + ? `the \`${scope}\` scope. It only includes \`${tokenScopes.join(', ')}\`.` + : 'any scope. You can change the scope of your token at https://github.com/settings/tokens'), + ); } } diff --git a/source/github-helpers/group-buttons.tsx b/source/github-helpers/group-buttons.tsx index 9fc7404a4eef..d75cba327513 100644 --- a/source/github-helpers/group-buttons.tsx +++ b/source/github-helpers/group-buttons.tsx @@ -1,5 +1,5 @@ import React from 'dom-chef'; -import {$} from 'select-dom/strict.js'; +import {$, $closestOptional} from 'select-dom'; import {wrapAll} from '../helpers/dom-utils.js'; @@ -16,7 +16,7 @@ export function groupButtons(buttons: Element[], ...classes: string[]): HTMLElem } // They may already be part of a group - let group = buttons[0].closest('.BtnGroup'); + let group = $closestOptional('.BtnGroup', buttons[0]); // If it doesn't exist, wrap them in a new group if (!group) { diff --git a/source/github-helpers/hotkey.tsx b/source/github-helpers/hotkey.tsx index 27212ed7c522..572749acb8cb 100644 --- a/source/github-helpers/hotkey.tsx +++ b/source/github-helpers/hotkey.tsx @@ -2,7 +2,11 @@ import React from 'dom-chef'; import {isMac} from './index.js'; -export function registerHotkey(hotkey: string, functionOrUrl: VoidFunction | string, {signal}: SignalAsOptions = {}): void { +export function registerHotkey( + hotkey: string, + functionOrUrl: VoidFunction | string, + {signal}: SignalAsOptions = {}, +): void { const element = typeof functionOrUrl === 'string' ? - + + , ); diff --git a/source/helpers/calculate-css-calc-string.test.ts b/source/helpers/calculate-css-calc-string.test.ts index fb670a37c4c8..c5eb339df839 100644 --- a/source/helpers/calculate-css-calc-string.test.ts +++ b/source/helpers/calculate-css-calc-string.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import calculateCssCalcString from './calculate-css-calc-string.js'; diff --git a/source/helpers/caller-id.test.ts b/source/helpers/caller-id.test.ts index 3cfa5ce53c81..9935fa53747a 100644 --- a/source/helpers/caller-id.test.ts +++ b/source/helpers/caller-id.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import {getStackLine} from './caller-id.js'; diff --git a/source/helpers/clean-commit-message.test.ts b/source/helpers/clean-commit-message.test.ts index 680d82dd58ac..4cdc3ce4d394 100644 --- a/source/helpers/clean-commit-message.test.ts +++ b/source/helpers/clean-commit-message.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import cleanCommitMessage from './clean-commit-message.js'; @@ -8,45 +8,107 @@ test('cleanCommitMessage', () => { 'co-authored-by: Me ', 'Co-authored-by: You ', ]; + const signoffs = [ + 'Signed-off-by: Me ', + 'signed-off-by: Me ', + ]; assert.isEmpty(cleanCommitMessage('')); assert.isEmpty(cleanCommitMessage('clean me')); assert.isEmpty(cleanCommitMessage(` multi-line `)); - assert.equal(cleanCommitMessage(` + assert.equal( + cleanCommitMessage(` Some stuff happened ${coauthors[0]} - `), coauthors[0], 'Should preserve just the co-authors'); + `), + coauthors[0], + 'Should preserve just the co-authors', + ); - assert.equal(cleanCommitMessage(` + assert.equal( + cleanCommitMessage(` Some stuff happened ${coauthors[0]} Fixes #112345 ${coauthors[2]} - `), coauthors[0] + '\n' + coauthors[2], 'Should preserve multiple co-authors'); + `), + coauthors[0] + '\n' + coauthors[2], + 'Should preserve multiple co-authors', + ); - assert.equal(cleanCommitMessage(` + assert.equal( + cleanCommitMessage(` Some stuff happened ${coauthors[0]} More stuff ${coauthors[1]} - `), coauthors[0], 'Should de-duplicate inconsistent co-authored-by casing'); + `), + coauthors[0], + 'Should de-duplicate inconsistent co-authored-by casing', + ); - assert.isEmpty(cleanCommitMessage(` + assert.equal( + cleanCommitMessage(` + Some stuff happened + ${signoffs[0]} + `), + signoffs[0], + 'Should preserve signed-off-by', + ); + + assert.equal( + cleanCommitMessage(` + Some stuff happened + ${signoffs[0]} + ${signoffs[1]} + `), + signoffs[0], + 'Should de-duplicate inconsistent signed-off-by casing', + ); + + assert.equal( + cleanCommitMessage(` + Some stuff happened + ${coauthors[0]} + ${signoffs[0]} + `), + coauthors[0] + '\n' + signoffs[0], + 'Should preserve both co-authored-by and signed-off-by', + ); + + assert.isEmpty( + cleanCommitMessage(` Fixes #1345 - `), 'Should drop closing keywords'); + `), + 'Should drop closing keywords', + ); - assert.equal(cleanCommitMessage(` + assert.equal( + cleanCommitMessage( + ` Fixes #1345 - `, true), 'Fixes #1345', 'Should keep closing keywords when asked'); - assert.equal(cleanCommitMessage(` + `, + true, + ), + 'Fixes #1345', + 'Should keep closing keywords when asked', + ); + assert.equal( + cleanCommitMessage( + ` Fixes #1 ${coauthors[0]} closes https://github.com/refined-github/refined-github/pull/6328 - `, true), [ - coauthors[0], - 'Fixes #1', - 'closes https://github.com/refined-github/refined-github/pull/6328', - ].join('\n'), 'Should keep multiple closing keywords'); + `, + true, + ), + [ + coauthors[0], + 'Fixes #1', + 'closes https://github.com/refined-github/refined-github/pull/6328', + ].join('\n'), + 'Should keep multiple closing keywords', + ); }); diff --git a/source/helpers/clean-commit-message.ts b/source/helpers/clean-commit-message.ts index 10958eb3c892..76b7f3500903 100644 --- a/source/helpers/clean-commit-message.ts +++ b/source/helpers/clean-commit-message.ts @@ -6,6 +6,12 @@ export default function cleanCommitMessage(message: string, closingKeywords = fa preservedContent.add('Co-authored-by: ' + author); } + // Preserve "Signed-off-by" lines (DCO signoffs) + // https://github.com/refined-github/refined-github/issues/9330#issuecomment-4361024401 + for (const [, signer] of message.matchAll(/signed-off-by: ([^\n]+)/gi)) { + preservedContent.add('Signed-off-by: ' + signer); + } + if (!closingKeywords) { return [...preservedContent].join('\n'); } diff --git a/source/helpers/click-all.ts b/source/helpers/click-all.ts index a17c55fc33a5..dec9b1cb73f2 100644 --- a/source/helpers/click-all.ts +++ b/source/helpers/click-all.ts @@ -1,6 +1,6 @@ +import type {DelegateEvent} from 'delegate-it'; import mem from 'memoize'; import {$$} from 'select-dom'; -import type {DelegateEvent} from 'delegate-it'; import preserveScroll from './preserve-scroll.js'; diff --git a/source/helpers/conventional-commits.test.ts b/source/helpers/conventional-commits.test.ts index f375a53db49b..1535d75cb36e 100644 --- a/source/helpers/conventional-commits.test.ts +++ b/source/helpers/conventional-commits.test.ts @@ -1,4 +1,4 @@ -import {test, expect} from 'vitest'; +import {expect, test} from 'vitest'; import {parseConventionalCommit} from './conventional-commits.js'; @@ -59,7 +59,7 @@ test('parseConventionalCommit', () => { "type": "Feature", } `); - expect(parseConventionalCommit(('feat: Commit (message)'))).toMatchInlineSnapshot(` + expect(parseConventionalCommit('feat: Commit (message)')).toMatchInlineSnapshot(` { "raw": "feat: ", "rawType": "feat", @@ -139,7 +139,7 @@ test('parseConventionalCommit support upper case types', () => { "type": "Feature", } `); - expect(parseConventionalCommit(('Feat: Commit (message)'))).toMatchInlineSnapshot(` + expect(parseConventionalCommit('Feat: Commit (message)')).toMatchInlineSnapshot(` { "raw": "Feat: ", "rawType": "Feat", diff --git a/source/helpers/css-selectors.ts b/source/helpers/css-selectors.ts new file mode 100644 index 000000000000..4d231331af90 --- /dev/null +++ b/source/helpers/css-selectors.ts @@ -0,0 +1,13 @@ +export function is(selectors: readonly string[]): string; +export function is(firstSelector: string, ...otherSelectors: readonly string[]): string; +export function is(firstSelector: readonly string[] | string, ...otherSelectors: readonly string[]): string { + const selectors = Array.isArray(firstSelector) ? firstSelector : [firstSelector, ...otherSelectors]; + return `:is(${selectors.join(', ')})`; +} + +export function not(selectors: readonly string[]): string; +export function not(firstSelector: string, ...otherSelectors: readonly string[]): string; +export function not(firstSelector: readonly string[] | string, ...otherSelectors: readonly string[]): string { + const selectors = Array.isArray(firstSelector) ? firstSelector : [firstSelector, ...otherSelectors]; + return `:not(${selectors.join(', ')})`; +} diff --git a/source/helpers/dom-utils.ts b/source/helpers/dom-utils.ts index 5a42556f23df..0aaafbd5ccda 100644 --- a/source/helpers/dom-utils.ts +++ b/source/helpers/dom-utils.ts @@ -1,5 +1,6 @@ -import {ElementNotFoundError} from 'select-dom'; -import {$, $$, $optional} from 'select-dom/strict.js'; +import { + $, $$, $optional, ElementNotFoundError, +} from 'select-dom'; // eslint-disable-next-line @typescript-eslint/no-restricted-types -- Nodes may be exactly `null` type Nullable = T | null; @@ -52,13 +53,15 @@ export const wrapAll = (wrapper: Wrapper, ...targets: A return wrapper; }; -export const isEditable = (node: unknown): boolean => node instanceof HTMLTextAreaElement +export const isEditable = (node: unknown): boolean => + node instanceof HTMLTextAreaElement || node instanceof HTMLInputElement || (node instanceof HTMLElement && node.isContentEditable); -export const frame = async (): Promise => new Promise(resolve => { - requestAnimationFrame(resolve); -}); +export const frame = async (): Promise => + new Promise(resolve => { + requestAnimationFrame(resolve); + }); export const highlightTab = (tabElement: Element): void => { tabElement.classList.add('selected'); diff --git a/source/helpers/errors.ts b/source/helpers/errors.ts index 63fa1a263eb1..134a93187091 100644 --- a/source/helpers/errors.ts +++ b/source/helpers/errors.ts @@ -11,8 +11,10 @@ export function disableErrorLogging(): void { const {version} = chrome.runtime.getManifest(); -const fineGrainedTokenSuggestion = 'Please use a GitHub App, OAuth App, or a personal access token with fine-grained permissions.'; -const preferredMessage = 'Refined GitHub does not support per-organization fine-grained tokens. https://github.com/refined-github/refined-github/wiki/Security'; +const fineGrainedTokenSuggestion + = 'Please use a GitHub App, OAuth App, or a personal access token with fine-grained permissions.'; +const preferredMessage + = 'Refined GitHub does not support per-organization fine-grained tokens. https://github.com/refined-github/refined-github/wiki/Security'; // Reads from path like assets/features/NAME.js export function parseFeatureNameFromStack(stack: string = new Error('stack').stack!): FeatureId | undefined { @@ -67,11 +69,14 @@ export function logError(error: Error): void { newIssueUrl.searchParams.set('template', '1_bug_report.yml'); newIssueUrl.searchParams.set('title', id ? `\`${id}\`: ${message}` : message); newIssueUrl.searchParams.set('repro', location.href); - newIssueUrl.searchParams.set('description', [ - '```', - String(error instanceof Error ? error.stack! : error).trim(), - '```', - ].join('\n')); + newIssueUrl.searchParams.set( + 'description', + [ + '```', + String(error instanceof Error ? error.stack! : error).trim(), + '```', + ].join('\n'), + ); // Don't change this to `throw Error` because Firefox doesn't show extensions' errors in the console console.group(`❌ Refined GitHub: ${id ?? 'global'}`); // Safari supports only one parameter diff --git a/source/helpers/event-listener-loop.test.ts b/source/helpers/event-listener-loop.test.ts index df7ca7775e0b..598fcc8f4f92 100644 --- a/source/helpers/event-listener-loop.test.ts +++ b/source/helpers/event-listener-loop.test.ts @@ -1,4 +1,4 @@ -import {describe, it, expect} from 'vitest'; +import {describe, expect, it} from 'vitest'; import createEventIterator from './event-listener-loop.js'; diff --git a/source/helpers/feature-utils.test.ts b/source/helpers/feature-utils.test.ts index 5e588a6554cb..6ab974ed2695 100644 --- a/source/helpers/feature-utils.test.ts +++ b/source/helpers/feature-utils.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import {shouldFeatureRun} from './feature-utils.js'; @@ -12,40 +12,64 @@ test('shouldFeatureRun', async () => { assert.isTrue(await shouldFeatureRun({}), 'A lack of conditions should mean "run everywhere"'); - assert.isFalse(await shouldFeatureRun({ - asLongAs: yesNo, - }), 'Every `asLongAs` should be true to run'); - - assert.isFalse(await shouldFeatureRun({ - asLongAs: yesNo, - include: [yes], - }), 'Every `asLongAs` should be true to run, regardless of `include`'); - - assert.isFalse(await shouldFeatureRun({ - include: noNo, - }), 'At least one `include` should be true to run'); - - assert.isTrue(await shouldFeatureRun({ - include: yesNo, - }), 'If one `include` is true, then it should run'); - - assert.isFalse(await shouldFeatureRun({ - exclude: yesNo, - }), 'If any `exclude` is true, then it should not run'); - - assert.isFalse(await shouldFeatureRun({ - include: [yes], - exclude: yesNo, - }), 'If any `exclude` is true, then it should not run, regardless of `include`'); - - assert.isFalse(await shouldFeatureRun({ - asLongAs: [yes], - exclude: yesNo, - }), 'If any `exclude` is true, then it should not run, regardless of `asLongAs`'); - - assert.isFalse(await shouldFeatureRun({ - asLongAs: [yes], - include: yesYes, - exclude: yesNo, - }), 'If any `exclude` is true, then it should not run, regardless of `asLongAs` and `include`'); + assert.isFalse( + await shouldFeatureRun({ + asLongAs: yesNo, + }), + 'Every `asLongAs` should be true to run', + ); + + assert.isFalse( + await shouldFeatureRun({ + asLongAs: yesNo, + include: [yes], + }), + 'Every `asLongAs` should be true to run, regardless of `include`', + ); + + assert.isFalse( + await shouldFeatureRun({ + include: noNo, + }), + 'At least one `include` should be true to run', + ); + + assert.isTrue( + await shouldFeatureRun({ + include: yesNo, + }), + 'If one `include` is true, then it should run', + ); + + assert.isFalse( + await shouldFeatureRun({ + exclude: yesNo, + }), + 'If any `exclude` is true, then it should not run', + ); + + assert.isFalse( + await shouldFeatureRun({ + include: [yes], + exclude: yesNo, + }), + 'If any `exclude` is true, then it should not run, regardless of `include`', + ); + + assert.isFalse( + await shouldFeatureRun({ + asLongAs: [yes], + exclude: yesNo, + }), + 'If any `exclude` is true, then it should not run, regardless of `asLongAs`', + ); + + assert.isFalse( + await shouldFeatureRun({ + asLongAs: [yes], + include: yesYes, + exclude: yesNo, + }), + 'If any `exclude` is true, then it should not run, regardless of `asLongAs` and `include`', + ); }); diff --git a/source/helpers/feature-utils.ts b/source/helpers/feature-utils.ts index 49b804740266..c3530e131f27 100644 --- a/source/helpers/feature-utils.ts +++ b/source/helpers/feature-utils.ts @@ -19,7 +19,9 @@ export function isFeaturePrivate(id: string): boolean { } // Safari iOS 17.6 has the key, but it does nothing -export const doesBrowserActionOpenOptions = !globalThis.chrome?.contextMenus || navigator.platform === 'iPhone' || navigator.platform === 'iPad'; +export const doesBrowserActionOpenOptions = !globalThis.chrome?.contextMenus + || navigator.platform === 'iPhone' + || navigator.platform === 'iPad'; export async function shouldFeatureRun({ /** Every condition must be true */ diff --git a/source/helpers/fetch-dom.ts b/source/helpers/fetch-dom.ts index e94fbededdb4..d29f6769ce8b 100644 --- a/source/helpers/fetch-dom.ts +++ b/source/helpers/fetch-dom.ts @@ -1,18 +1,22 @@ -import mem from 'memoize'; import domify from 'doma'; +import mem from 'memoize'; +import {$optional} from 'select-dom'; import type {ParseSelector} from 'typed-query-selector/parser.js'; import {log} from './feature-helpers.js'; async function fetchDom(url: string): Promise; -async function fetchDom>(url: string, selector: Selector): Promise; +async function fetchDom< + Selector extends string, + ElementType extends HTMLElement = ParseSelector, +>(url: string, selector: Selector): Promise; async function fetchDom(url: string, selector?: string): Promise { log.http(url); const absoluteUrl = new URL(url, location.origin).href; // Firefox `fetch`es from the content script, so relative URLs fail const response = await fetch(absoluteUrl); const dom = domify(await response.text()); if (selector) { - return dom.querySelector(selector) ?? undefined; + return $optional(selector, dom); } return dom; diff --git a/source/helpers/get-items-between.test.ts b/source/helpers/get-items-between.test.ts index 9e9fe39f38b2..2a9ba5a908c8 100644 --- a/source/helpers/get-items-between.test.ts +++ b/source/helpers/get-items-between.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import getItemsBetween from './get-items-between.js'; diff --git a/source/helpers/hotfix.tsx b/source/helpers/hotfix.tsx index 0c8772f31c0d..ba00c76c3ec3 100644 --- a/source/helpers/hotfix.tsx +++ b/source/helpers/hotfix.tsx @@ -1,8 +1,8 @@ +import {any as concatenateTemplateLiteralTag} from 'code-tag'; import React from 'dom-chef'; -import {CachedFunction} from 'webext-storage-cache'; import {isEnterprise} from 'github-url-detection'; import compareVersions from 'tiny-version-compare'; -import {any as concatenateTemplateLiteralTag} from 'code-tag'; +import {CachedFunction} from 'webext-storage-cache'; import type {RghOptions} from '../options-storage.js'; import isDevelopmentVersion from './is-development-version.js'; diff --git a/source/helpers/is-low-quality-comment.test.ts b/source/helpers/is-low-quality-comment.test.ts index 2c79cc49d946..f144b66e7630 100644 --- a/source/helpers/is-low-quality-comment.test.ts +++ b/source/helpers/is-low-quality-comment.test.ts @@ -1,4 +1,4 @@ -import {describe, test, assert} from 'vitest'; +import {assert, describe, test} from 'vitest'; import isLowQualityComment from './is-low-quality-comment.js'; diff --git a/source/helpers/loose-parse-int.test.ts b/source/helpers/loose-parse-int.test.ts index a6662566a893..d3e7b93ca866 100644 --- a/source/helpers/loose-parse-int.test.ts +++ b/source/helpers/loose-parse-int.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import looseParseInt from './loose-parse-int.js'; diff --git a/source/helpers/onetime.ts b/source/helpers/onetime.ts index ba86a2e8818c..6eb55e6efbbe 100644 --- a/source/helpers/onetime.ts +++ b/source/helpers/onetime.ts @@ -1,5 +1,7 @@ const notRun = Symbol('false'); -export default function onetime(function_: (...arguments_: ArgumentsType) => ReturnType): (...arguments_: ArgumentsType) => ReturnType { +export default function onetime( + function_: (...arguments_: ArgumentsType) => ReturnType, +): (...arguments_: ArgumentsType) => ReturnType { let returnValue: ReturnType | typeof notRun = notRun; return function (this: unknown, ...arguments_: ArgumentsType): ReturnType { if (returnValue !== notRun) { diff --git a/source/helpers/pluralize.test.ts b/source/helpers/pluralize.test.ts index 071791895b70..d2a6ae085457 100644 --- a/source/helpers/pluralize.test.ts +++ b/source/helpers/pluralize.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import pluralize from './pluralize.js'; diff --git a/source/helpers/pr-commit-cleaner.test.ts b/source/helpers/pr-commit-cleaner.test.ts index d7b36d53826d..8f0039195c15 100644 --- a/source/helpers/pr-commit-cleaner.test.ts +++ b/source/helpers/pr-commit-cleaner.test.ts @@ -1,4 +1,4 @@ -import {test, assert} from 'vitest'; +import {assert, test} from 'vitest'; import cleanPrCommitTitle from './pr-commit-cleaner.js'; diff --git a/source/helpers/preserve-scroll.ts b/source/helpers/preserve-scroll.ts index 7333eaa54183..9e5bbda3e1c7 100644 --- a/source/helpers/preserve-scroll.ts +++ b/source/helpers/preserve-scroll.ts @@ -1,4 +1,6 @@ -export default function preserveScroll(anchor: Element = document.elementFromPoint(innerWidth / 2, innerHeight / 2)!): VoidFunction { +export default function preserveScroll( + anchor: Element = document.elementFromPoint(innerWidth / 2, innerHeight / 2)!, +): VoidFunction { const originalPosition = anchor.getBoundingClientRect().top; /** diff --git a/source/helpers/selector-observer.tsx b/source/helpers/selector-observer.tsx index 727d10f82155..e27d861adcdb 100644 --- a/source/helpers/selector-observer.tsx +++ b/source/helpers/selector-observer.tsx @@ -1,8 +1,8 @@ -import React from 'dom-chef'; +import {mergeSignals, signalFromPromise} from 'abort-utils'; import {css} from 'code-tag'; -import type {ParseSelector} from 'typed-query-selector/parser.js'; +import React from 'dom-chef'; import domLoaded from 'dom-loaded'; -import {signalFromPromise} from 'abort-utils'; +import type {ParseSelector} from 'typed-query-selector/parser.js'; import delay from '../helpers/delay.js'; import onetime from '../helpers/onetime.js'; @@ -44,7 +44,13 @@ export default function observe< await delay(100); // Allow the animation and events to complete; Also adds support for ajaxed pages })()); - signal = signal ? AbortSignal.any([signal, delayedDomReady]) : delayedDomReady; + signal = mergeSignals(signal, delayedDomReady); + } + + let onceController: AbortController | undefined; + if (once) { + onceController = new AbortController(); + signal = mergeSignals(signal, onceController.signal); } const selector = typeof selectors === 'string' ? selectors : selectors.join(',\n'); @@ -86,6 +92,10 @@ export default function observe< })(); globalThis.addEventListener('animationstart', (event: AnimationEvent) => { + if (event.animationName !== animation) { + return; + } + const target = event.target as ExpectedElement; // The target can match a selector even if the animation actually happened on a ::before pseudo-element, so it needs an explicit exclusion here if (target.classList.contains(seenMark) || !target.matches(selector)) { @@ -98,10 +108,10 @@ export default function observe< target.classList.add(seenMark); listener(target, {signal}); - }, {once, signal}); + onceController?.abort(); + }, {signal}); } -// Untested, likely breaks due to wrong `ancestor` level export async function waitForElement< Selector extends string, ExpectedElement extends ParseSelector, @@ -109,16 +119,17 @@ export async function waitForElement< selectors: Selector | readonly Selector[], {signal, stopOnDomReady}: Options = {}, ): Promise { - const local = new AbortController(); - signal = signal ? AbortSignal.any([signal, local.signal]) : local.signal; - return new Promise(resolve => { observe(selectors, element => { resolve(element); - local.abort(); - }, {signal, stopOnDomReady, once: true}); + }, { + signal, + stopOnDomReady, + once: true, + ancestor: 4, + }); - signal.addEventListener('abort', () => { + signal?.addEventListener('abort', () => { resolve(); }); }); diff --git a/source/helpers/show-whitespace-on-line.test.ts b/source/helpers/show-whitespace-on-line.test.ts index 6aa5a6be927f..a6e65cf03ff0 100644 --- a/source/helpers/show-whitespace-on-line.test.ts +++ b/source/helpers/show-whitespace-on-line.test.ts @@ -1,5 +1,6 @@ -import {assert, test} from 'vitest'; import hl from 'highlight.js'; +import {$$optional} from 'select-dom'; +import {assert, test} from 'vitest'; import showWhiteSpacesOnLine from './show-whitespace-on-line.js'; @@ -9,7 +10,7 @@ function highlight(html: string): string { } function serializeDom(element: Element): string { - for (const replacement of element.querySelectorAll('[data-rgh-whitespace]')) { + for (const replacement of $$optional('[data-rgh-whitespace]', element)) { switch (replacement.getAttribute('data-rgh-whitespace')) { case 'space': { replacement.replaceWith(replacement.innerHTML.replaceAll(' ', '•')); @@ -25,7 +26,7 @@ function serializeDom(element: Element): string { } } - for (const highlighting of element.querySelectorAll('[class^="hljs"]')) { + for (const highlighting of $$optional('[class^="hljs"]', element)) { highlighting.replaceWith(highlighting.innerHTML); } diff --git a/source/options.css b/source/options.css index 1f0b18d0ce26..f4580e13ebe4 100644 --- a/source/options.css +++ b/source/options.css @@ -139,6 +139,11 @@ summary:hover { -webkit-text-security: circle; } +/* Improve wrapping https://github.com/refined-github/refined-github/issues/9153 */ +#validation { + display: inline-block; +} + .feature:not([hidden]) { display: flex; align-items: baseline; diff --git a/source/options.tsx b/source/options.tsx index 6fe345ea5eb6..5fb27c5fa456 100644 --- a/source/options.tsx +++ b/source/options.tsx @@ -1,26 +1,24 @@ import 'webext-base-css/webext-base.css'; import './options.css'; -import {$, $optional} from 'select-dom/strict.js'; -import {$$, elementExists} from 'select-dom'; -import fitTextarea from 'fit-textarea'; -import {enableTabToIndent} from 'indent-textarea'; import delegate, {type DelegateEvent} from 'delegate-it'; +import {enableTabToIndent} from 'indent-textarea'; +import { + $, $$, $closestOptional, $optional, elementExists, +} from 'select-dom'; import {isChrome, isFirefox} from 'webext-detect'; import type {SyncedForm} from 'webext-options-sync-per-domain'; import 'webext-bugs/target-blank'; +import {importedFeatures} from './feature-data.js'; +import {state as bisectState} from './helpers/bisect.js'; import clearCacheHandler from './helpers/clear-cache-handler.js'; +import {doesBrowserActionOpenOptions} from './helpers/feature-utils.js'; import {brokenFeatures, styleHotfixes} from './helpers/hotfix.js'; -import {importedFeatures} from './feature-data.js'; -import {perDomainOptions} from './options-storage.js'; import isDevelopmentVersion from './helpers/is-development-version.js'; -import {doesBrowserActionOpenOptions} from './helpers/feature-utils.js'; -import {state as bisectState} from './helpers/bisect.js'; +import {perDomainOptions} from './options-storage.js'; import initFeatureList, {updateListDom} from './options/feature-list.js'; -import initTokenValidation from './options/token-validation.js'; import initToggleAllButtons from './options/toggle-all.js'; - -const supportsFieldSizing = CSS.supports('field-sizing', 'content'); +import initTokenValidation from './options/token-validation.js'; let syncedForm: SyncedForm | undefined; @@ -56,10 +54,6 @@ function focusSection({delegateTarget: section}: DelegateEvent { - $('#hotfixes-field').textContent - = getExclusions() - ?? await styleHotfixes.getCached(version) - ?? 'No CSS found in cache.'; + $('#hotfixes-field').textContent = getExclusions() + ?? await styleHotfixes.getCached(version) + ?? 'No CSS found in cache.'; } async function fetchHotfixes(event: MouseEvent): Promise { @@ -98,10 +93,9 @@ async function fetchHotfixes(event: MouseEvent): Promise { button.disabled = true; try { // Style - $('#hotfixes-field').textContent - = getExclusions() - ?? await styleHotfixes.getFresh(version) - ?? 'No hotfixes needed for this version! 🎉'; + $('#hotfixes-field').textContent = getExclusions() + ?? await styleHotfixes.getFresh(version) + ?? 'No hotfixes needed for this version! 🎉'; // Broken features const storage = await brokenFeatures.getFresh(); @@ -165,9 +159,6 @@ function addEventListeners(): void { // Improve textareas editing enableTabToIndent('textarea'); - if (!supportsFieldSizing) { - fitTextarea.watch('textarea'); - } // Bring section into view when opened delegate('details', 'toggle', focusSection, {capture: true}); @@ -193,7 +184,7 @@ function scrollTargetIntoView(): void { return; } - const details = element.closest('details'); + const details = $closestOptional('details', element); if (details) { details.open = true; } diff --git a/source/options/feature-list.tsx b/source/options/feature-list.tsx index e225a612c3f7..9d5d5afed4ba 100644 --- a/source/options/feature-list.tsx +++ b/source/options/feature-list.tsx @@ -1,12 +1,13 @@ +import delegate, {type DelegateEvent} from 'delegate-it'; import React from 'dom-chef'; import domify from 'doma'; -import delegate, {type DelegateEvent} from 'delegate-it'; -import {$} from 'select-dom/strict.js'; -import {$$, countElements} from 'select-dom'; +import { + $, $$, $closest, countElements, +} from 'select-dom'; +import {featuresMeta, importedFeatures} from '../feature-data.js'; import {getLocalHotfixes} from '../helpers/hotfix.js'; import {createRghIssueLink, getFeatureUrl} from '../helpers/rgh-links.js'; -import {importedFeatures, featuresMeta} from '../feature-data.js'; function moveDisabledFeaturesToTop(): void { const container = $('.js-features'); @@ -29,7 +30,7 @@ async function markLocalHotfixes(): Promise { input.disabled = true; input.removeAttribute('name'); $(`.feature-name[for="${feature}"]`).after( - (Disabled due to {createRghIssueLink(relatedIssue)}), + {' '}(Disabled due to {createRghIssueLink(relatedIssue)}), ); } } @@ -40,8 +41,7 @@ function buildFeatureCheckbox({id, description, screenshot}: FeatureMeta): HTMLE
    - - {' '} + {' '} source @@ -71,10 +71,7 @@ function summaryHandler(event: DelegateEvent): void { toggle.checked = !toggle.checked; } } else { - const toggle = event - .delegateTarget - .closest('.feature')! - .querySelector('input.screenshot-toggle')!; + const toggle = $('input.screenshot-toggle', $closest('.feature', event.delegateTarget)); toggle.checked = !toggle.checked; } } @@ -114,9 +111,10 @@ function updateOffCount(): void { export default async function initFeatureList(): Promise { // Generate list - $('.js-features').append(...featuresMeta - .filter(feature => importedFeatures.includes(feature.id)) - .map(feature => buildFeatureCheckbox(feature)), + $('.js-features').append( + ...featuresMeta + .filter(feature => importedFeatures.includes(feature.id)) + .map(feature => buildFeatureCheckbox(feature)), ); // Add notice for features disabled via hotfix diff --git a/source/options/header.svelte b/source/options/header.svelte index 81f7649beaa2..4d4541c4c0dc 100644 --- a/source/options/header.svelte +++ b/source/options/header.svelte @@ -7,7 +7,6 @@ }} /> - - {available < 100_000 + { + available < 100_000 ? `Only ${prettyBytes(available)} available` - : `${prettyBytes(used)} used`} + : `${prettyBytes(used)} used` + } diff --git a/source/options/toggle-all.ts b/source/options/toggle-all.ts index b5747e216af9..dfc78b958304 100644 --- a/source/options/toggle-all.ts +++ b/source/options/toggle-all.ts @@ -1,5 +1,4 @@ -import {$$, countElements} from 'select-dom'; -import {$} from 'select-dom/strict.js'; +import {$, $$, countElements} from 'select-dom'; function enableToggleAll(this: HTMLButtonElement): void { const section = $('details#toggle-all'); diff --git a/source/options/token-validation.tsx b/source/options/token-validation.tsx index f18cab4c2619..00c4c446bc0d 100644 --- a/source/options/token-validation.tsx +++ b/source/options/token-validation.tsx @@ -1,5 +1,4 @@ -import {$$} from 'select-dom'; -import {$} from 'select-dom/strict.js'; +import {$, $$} from 'select-dom'; import {assertError} from 'ts-extras'; import type {SyncedForm} from 'webext-options-sync-per-domain'; diff --git a/source/options/version-info.svelte b/source/options/version-info.svelte index a1a73fc0dd2b..3bdb3a2cf966 100644 --- a/source/options/version-info.svelte +++ b/source/options/version-info.svelte @@ -4,7 +4,6 @@ }} /> -