diff --git a/.betterer.ts b/.betterer.ts deleted file mode 100644 index ff8b4c56321..00000000000 --- a/.betterer.ts +++ /dev/null @@ -1 +0,0 @@ -export default {}; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 26736002dde..a6b9b13ae84 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1049,7 +1049,6 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform /scripts/**/generate-transformations* @grafana/datapro /scripts/webpack/ @grafana/frontend-ops /scripts/generate-a11y-report.sh @grafana/grafana-frontend-platform -.betterer.ts @grafana/grafana-frontend-platform eslint-suppressions.json @grafanabot # Design system diff --git a/.github/actions/change-detection/action.yml b/.github/actions/change-detection/action.yml index 0832c5d3821..49c1f44477b 100644 --- a/.github/actions/change-detection/action.yml +++ b/.github/actions/change-detection/action.yml @@ -86,7 +86,6 @@ runs: - '.github/actions/change-detection/**' - '**.cue' - '.prettier*' - - '.betterer*' - '.yarnrc.yml' - 'eslint.config.js' - 'jest.config.js' diff --git a/.github/workflows/frontend-lint.yml b/.github/workflows/frontend-lint.yml index 96e38b5c5c6..13dfb83a4ac 100644 --- a/.github/workflows/frontend-lint.yml +++ b/.github/workflows/frontend-lint.yml @@ -120,25 +120,6 @@ jobs: github-app-name: 'grafana-ci-bot' - run: yarn install --immutable --check-cache - run: yarn run typecheck - lint-frontend-betterer: - needs: detect-changes - permissions: - contents: read - id-token: write - if: needs.detect-changes.outputs.changed == 'true' - name: Betterer - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - uses: actions/setup-node@v4 - with: - node-version-file: '.nvmrc' - cache: 'yarn' - cache-dependency-path: 'yarn.lock' - - run: yarn install --immutable --check-cache - - run: yarn run betterer:ci lint-frontend-api-clients: permissions: contents: read diff --git a/.gitignore b/.gitignore index 9b9f93c7bc5..b26c9b1e7d5 100644 --- a/.gitignore +++ b/.gitignore @@ -222,7 +222,6 @@ public/api-spec.json deployment_tools_config.json -.betterer.cache .nx # Temporary file for backporting PRs diff --git a/.prettierignore b/.prettierignore index 236ce47cf21..1f1b9e75e9b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -11,7 +11,6 @@ node_modules pkg public/lib/monaco public/sass/*.generated.scss -scripts/cli/bettererIssueTemplate.md scripts/grafana-server/tmp vendor diff --git a/package.json b/package.json index 623b21610bd..8c842f8553a 100644 --- a/package.json +++ b/package.json @@ -63,10 +63,6 @@ "watch": "yarn start -d watch,start core:start --watchTheme", "i18n:stats": "node ./scripts/cli/reportI18nStats.mjs", "i18n-extract": "make i18n-extract", - "betterer": "betterer --tsconfig ./scripts/cli/tsconfig.json", - "betterer:stats": "ts-node --transpile-only --project ./scripts/cli/tsconfig.json ./scripts/cli/reportBettererStats.ts", - "betterer:issues": "ts-node --transpile-only --project ./scripts/cli/tsconfig.json ./scripts/cli/generateBettererIssues.ts", - "betterer:ci": "betterer ci --tsconfig ./scripts/cli/tsconfig.json", "plugin:build": "nx run-many -t build --projects='tag:scope:plugin'", "plugin:build:commit": "nx run-many -t build:commit --projects='tag:scope:plugin'", "plugin:build:dev": "nx run-many -t dev --projects='tag:scope:plugin' --maxParallel=100", @@ -85,8 +81,6 @@ "@babel/core": "7.28.0", "@babel/preset-env": "7.28.0", "@babel/runtime": "7.28.2", - "@betterer/betterer": "5.4.0", - "@betterer/cli": "5.4.0", "@crowdin/crowdin-api-client": "^1.42.0", "@cypress/webpack-preprocessor": "6.0.4", "@emotion/eslint-plugin": "11.12.0", diff --git a/packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.cjs b/packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.cjs index 64ca4c5ff4a..7d741720bc2 100644 --- a/packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.cjs +++ b/packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.cjs @@ -121,7 +121,7 @@ const noUntranslatedStrings = createRule({ if ( isUntranslated && // TODO: Remove this check in the future when we've fixed all cases of untranslated properties - // For now, we're only reporting the issues that can be auto-fixed, rather than adding to betterer results + // For now, we're only reporting the issues that can be auto-fixed, rather than adding to eslint suppressions errorCanBeFixed ) { context.report({ diff --git a/scripts/ci-frontend-metrics.sh b/scripts/ci-frontend-metrics.sh index 0cf015e8ea2..80f55b7a9f8 100755 --- a/scripts/ci-frontend-metrics.sh +++ b/scripts/ci-frontend-metrics.sh @@ -25,13 +25,6 @@ echo -e "@emotion/css imports: $EMOTION_IMPORTS" echo -e "Total TS files: $TS_FILES" echo -e "Total SCSS files: $SCSS_FILES" -BETTERER_STATS="" -while read -r name value -do - BETTERER_STATS+=$'\n ' - BETTERER_STATS+="\"grafana.ci-code.betterer.${name}\": \"${value}\"," -done <<< "$(yarn betterer:stats)" - ESLINT_STATS="" yarn lint:ts --format ./scripts/cli/eslint-stats-reporter.mjs -o eslint-stats.txt while read -r name value @@ -59,7 +52,6 @@ done <<< "$(yarn themes:usage | awk '$4 == "@grafana/theme-token-usage" {print $ echo "Metrics: { $THEME_TOKEN_USAGE - $BETTERER_STATS $ESLINT_STATS $I18N_STATS \"grafana.ci-code.strictErrors\": \"${ERROR_COUNT}\", diff --git a/scripts/cli/bettererIssueTemplate.md b/scripts/cli/bettererIssueTemplate.md deleted file mode 100644 index 78d7fef9b98..00000000000 --- a/scripts/cli/bettererIssueTemplate.md +++ /dev/null @@ -1,7 +0,0 @@ -Hi <%= owner %>! - -The following files have been marked as having issues regarding `<%= issueFilter %>: <%= issueMessageFilter %>`. - -There are <%= totalIssueCount %> <%= plural('issue', totalIssueCount) %> over <%= fileCount %> <%= plural('file', fileCount) %>: -<% files.forEach((file) => { %> -- [ ] <%= file.issueCount %> <%= plural('issue', file.issueCount) %> in [<%= file.fileName %>](https://github.com/grafana/grafana/blob/main/<%= file.fileName %>) <% }) %> diff --git a/scripts/cli/create_issues_from_files.sh b/scripts/cli/create_issues_from_files.sh deleted file mode 100755 index e8d0ff45411..00000000000 --- a/scripts/cli/create_issues_from_files.sh +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/bash - -# Script to create GitHub issues from text files in a directory -# Usage: ./create_issues_from_files.sh - -# FYI: Generated almost entirely with warp.dev as a quick hack for creating issues from betterer issues output - -set -e - -# Function to display usage -usage() { - echo "Usage: $0 " - echo "" - echo "Arguments:" - echo " directory Directory containing text files" - echo " owner/repo GitHub repository in format 'owner/repository'" - echo "" - echo "Examples:" - echo " $0 ./issues myuser/myrepo" - echo " $0 /path/to/issues organization/project" - exit 1 -} - -# Check if correct number of arguments provided -if [ $# -ne 2 ]; then - echo "Error: Incorrect number of arguments" - usage -fi - -DIRECTORY="$1" -REPO="$2" - -# Validate directory exists -if [ ! -d "$DIRECTORY" ]; then - echo "Error: Directory '$DIRECTORY' does not exist" - exit 1 -fi - -# Validate repository format -if [[ ! "$REPO" =~ ^[^/]+/[^/]+$ ]]; then - echo "Error: Repository must be in format 'owner/repository'" - exit 1 -fi - -echo "Creating issues from text files in '$DIRECTORY' for repository '$REPO'" -echo - -# Counter for created issues -created_count=0 -error_count=0 - -# Process each text file in the directory -for file in "$DIRECTORY"/*.txt; do - # Check if glob matched any files - [ -e "$file" ] || continue - - filename=$(basename "$file") - - echo "Processing: $filename" - - # Read file content - if [ ! -r "$file" ]; then - echo " ❌ Error: Cannot read file '$file'" - ((error_count++)) - continue - fi - - content=$(cat "$file") - - # Skip empty files - if [ -z "$content" ]; then - echo " ⚠️ Skipping empty file" - continue - fi - - # Parse codeowner from first line (assuming format like "@username" or "@team/name") - first_line=$(echo "$content" | head -n 1) - codeowner="" - - # Extract codeowner if first line contains @username or @team/name pattern - if [[ "$first_line" =~ @[a-zA-Z0-9_/-]+ ]]; then - codeowner=$(echo "$first_line" | grep -o '@[a-zA-Z0-9_/-]*' | head -n 1) - # Strip @grafana/ prefix if present - codeowner=${codeowner#@grafana/} - fi - - title="Betterer: React Hooks ($codeowner)" - - # Create the issue using GitHub CLI - if gh issue create \ - --repo "$REPO" \ - --title "$title" \ - --body "$content" > /dev/null 2>&1; then - echo " ✅ Created issue: $title" - ((created_count++)) - else - echo " ❌ Failed to create issue: $title" - ((error_count++)) - fi -done - -echo -echo "Summary:" -echo " Issues created: $created_count" -echo " Errors: $error_count" - -if [ $created_count -eq 0 ] && [ $error_count -eq 0 ]; then - echo " No .txt files found in '$DIRECTORY'" -fi diff --git a/scripts/cli/generateBettererIssues.ts b/scripts/cli/generateBettererIssues.ts deleted file mode 100644 index 39a1485cce9..00000000000 --- a/scripts/cli/generateBettererIssues.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { betterer, BettererFileIssues } from '@betterer/betterer'; -import Codeowners from 'codeowners'; -import { readFile, writeFile } from 'fs/promises'; -import { template } from 'lodash'; -import path from 'path'; -import { hideBin } from 'yargs/helpers'; -import yargs from 'yargs/yargs'; - -const argv = yargs(hideBin(process.argv)) - .option('template', { - demandOption: true, - alias: 't', - describe: 'Path to a template to use for each issue. See source bettererIssueTemplate.md for an example', - type: 'string', - default: './scripts/cli/bettererIssueTemplate.md', - }) - .option('output', { - demandOption: true, - alias: 'o', - describe: 'Path to directory to save issues to', - type: 'string', - }) - .option('test', { - demandOption: true, - alias: 'b', - describe: 'Name of the betterer test to produce the report for', - type: 'string', - }) - .option('test-message', { - alias: 'm', - describe: 'Filter issues containing this message', - type: 'string', - }) - .option('single-owner', { - type: 'boolean', - alias: 's', - describe: 'Only use first owner for files with multiple owners', - default: false, - }) - - .usage('Usage: yarn betterer:issues -t [path] -o [path] -b [string]') - .version(false) - .help('help').argv; - -interface FileDetails { - fileName: string; - issueCount: number; - issues: BettererFileIssues; -} - -// really dumb and simple pluralize function. not meant to be exhaustive -function plural(word: string, count: number) { - if (count === 0 || count > 1) { - return word + 's'; - } - - return word; -} - -async function main() { - const args = await argv; - const templatePath = path.resolve(args.template); - const outputPath = path.resolve(args.output); - const templateString = (await readFile(templatePath)).toString(); - - const owners = new Codeowners(); - const results = await betterer.results(); - - const filesByOwner: Record = {}; - - for (const testResults of results.resultSummaries) { - if (testResults.name !== args.test) { - continue; - } - - if (typeof testResults.details === 'string') { - continue; - } - - for (const _fileName in testResults.details) { - const fileName = _fileName.replace(process.cwd() + '/', ''); - const _details = testResults.details[_fileName]; - let ownersForFile = owners.getOwner(fileName); - - if (args.singleOwner) { - ownersForFile = [ownersForFile[0]]; - } - - const filterByMessage = args.testMessage?.length ? args.testMessage.toLowerCase() : undefined; - - const filteredDetails = filterByMessage - ? _details.filter((v) => v.message.toLowerCase().includes(filterByMessage)) - : _details; - - const numberOfIssues = filteredDetails.length; - - if (numberOfIssues === 0) { - continue; - } - - for (const owner of ownersForFile) { - if (!filesByOwner[owner]) { - filesByOwner[owner] = []; - } - - filesByOwner[owner].push({ - fileName, - issueCount: numberOfIssues, - issues: filteredDetails, - }); - } - } - } - - const contexts = Object.entries(filesByOwner).map(([owner, files]) => { - const fileCount = files.length; - const totalIssueCount = files.reduce((acc, v) => acc + v.issueCount, 0); - - return { - owner, - files, - fileCount, - totalIssueCount, - issueFilter: args.test, - issueMessageFilter: args.testMessage, - }; - }); - - const compiledTemplate = template(templateString, { imports: { plural } }); - - for (const context of contexts) { - const fileSafeOwner = context.owner.replace(/[^a-z0-9-]/gi, '_'); - const fileSafeTestName = args.test.replace(/[^a-z0-9-]/gi, '_'); - const outputFilePath = path.join(outputPath, `${fileSafeTestName}_${fileSafeOwner}.txt`); - const printed = compiledTemplate(context); - await writeFile(outputFilePath, printed); - - const indented = printed - .split('\n') - .map((v) => `\t${v}`) - .join('\n'); - - console.log(`Printed issue for owner`, context.owner, 'to', outputFilePath); - console.log(indented); - } -} - -main().catch(console.error); diff --git a/scripts/cli/reportBettererStats.ts b/scripts/cli/reportBettererStats.ts deleted file mode 100644 index 1b493d7a77c..00000000000 --- a/scripts/cli/reportBettererStats.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { betterer } from '@betterer/betterer'; -import { camelCase } from 'lodash'; - -function logStat(name: string, value: number) { - // Note that this output format must match the parsing in ci-frontend-metrics.sh - // which expects the two values to be separated by a space - console.log(`${name} ${value}`); -} -/** - * Array of regexes + name overrides for legacy checks that have been moved to ESLint - * - * This is so we can still report things like "gfFormUsage..." as "noGfFormUsage_gfFormUsage..." - * rather than "betterEslint_gfFormUsage..." for continuity on our dashboards - */ -const legacyChecksToTransform = [ - { messageRegex: /gfFormUsage/i, prefix: 'noGfFormUsage' }, - { messageRegex: /noUndocumentedStories/i, prefix: 'noUndocumentedStories' }, - { messageRegex: /noSkippingOfA11YTests/i, prefix: 'noSkippingA11YTestsInStories' }, -]; - -async function main() { - const results = await betterer.results(); - - for (const testResults of results.resultSummaries) { - const countByMessage = {}; - const name = camelCase(testResults.name); - Object.values(testResults.details) - .flatMap((v) => v) - .forEach((detail) => { - const message = camelCase(detail.message); - const nameToUse = - legacyChecksToTransform.find((v) => { - return v.messageRegex.test(message); - })?.prefix || name; - - const metricName = `${nameToUse}_${message}`; - - if (metricName in countByMessage) { - countByMessage[metricName]++; - } else { - countByMessage[metricName] = 1; - } - }); - - for (const [metricName, count] of Object.entries(countByMessage)) { - logStat(metricName, count); - } - } -} - -main().catch(console.error); diff --git a/yarn.lock b/yarn.lock index e53d954f33f..7220dc94b64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -122,7 +122,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.3, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.27.1": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.27.1": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" dependencies: @@ -1516,118 +1516,6 @@ __metadata: languageName: node linkType: hard -"@betterer/betterer@npm:5.4.0, @betterer/betterer@npm:^5.4.0": - version: 5.4.0 - resolution: "@betterer/betterer@npm:5.4.0" - dependencies: - "@betterer/constraints": "npm:^5.3.0" - "@betterer/errors": "npm:^5.3.0" - "@betterer/logger": "npm:^5.3.4" - "@betterer/reporter": "npm:^5.4.0" - "@phenomnomnominal/debug": "npm:^0.2.5" - "@phenomnomnominal/worker-require": "npm:^0.0.34" - chokidar: "npm:^3.3.1" - djb2a: "npm:^1.2.0" - fast-memoize: "npm:^2.5.2" - lines-and-columns: "npm:^2.0.3" - minimatch: "npm:^5.0.1" - prettier: "npm:^2.3.2" - simple-git: "npm:^3.6.0" - ts-node: "npm:^10.2.1" - tslib: "npm:^2.3.1" - typescript: "npm:>=2.7" - dependenciesMeta: - typescript: - optional: true - checksum: 10/4d866d2acfc5e46375a29701122571544d60a4c38985a154b7a4a31ffffad8434d584496e8baaa724a7a929b87ff8a65ce5d5a86b0b6f4aedae894e53e4d7d80 - languageName: node - linkType: hard - -"@betterer/cli@npm:5.4.0": - version: 5.4.0 - resolution: "@betterer/cli@npm:5.4.0" - dependencies: - "@betterer/betterer": "npm:^5.4.0" - "@betterer/errors": "npm:^5.3.0" - "@betterer/render": "npm:^5.3.4" - "@betterer/tasks": "npm:^5.3.6" - "@phenomnomnominal/tsquery": "npm:^4.1.1" - "@phenomnomnominal/tstemplate": "npm:^0.1.0" - "@phenomnomnominal/worker-require": "npm:^0.0.34" - chalk: "npm:^4.1.2" - commander: "npm:^8.3.0" - find-up: "npm:^5.0.0" - jest-diff: "npm:^27.1.0" - prettier: "npm:^2.3.2" - tslib: "npm:^2.3.1" - bin: - betterer: bin/betterer - checksum: 10/4f07c6a6cad8c143b655e3bd6a2f35856437fbbc18569a8c3a30c8d80cc1aa04c07e19b11075155b66d6afeec5fef94ef740d53a439ba2b35ed871c84e2cdd15 - languageName: node - linkType: hard - -"@betterer/constraints@npm:^5.3.0": - version: 5.3.0 - resolution: "@betterer/constraints@npm:5.3.0" - dependencies: - tslib: "npm:^2.3.1" - checksum: 10/1945efcf47a25803788f43cb5ab111dcac2ea4308b12345ac415b470d67a079d1e9d4f965e30958022c67a76632761b56c012307b67f642175c394b79a29ca83 - languageName: node - linkType: hard - -"@betterer/errors@npm:^5.3.0": - version: 5.3.0 - resolution: "@betterer/errors@npm:5.3.0" - checksum: 10/189d5ca5f0d5dfa2251fd633780875a35801d7c3b738ebc1320e19f7503e143c16eb65c0155121b46abd7565babde41735ec8f7f19603b8efba250f1a74dd772 - languageName: node - linkType: hard - -"@betterer/logger@npm:^5.3.4": - version: 5.3.4 - resolution: "@betterer/logger@npm:5.3.4" - dependencies: - "@babel/code-frame": "npm:^7.10.3" - jest-diff: "npm:^27.0.6" - lines-and-columns: "npm:^2.0.3" - tslib: "npm:^2.3.1" - checksum: 10/377422dc52dd85002dd32967fb3f59f07d584e18386039831ad4bab6bee0f767ae1a31d33aa1039e76e1167cb308d0706a6d76b6c915a0bc1439ea6cbfdb5d09 - languageName: node - linkType: hard - -"@betterer/render@npm:^5.3.4": - version: 5.3.4 - resolution: "@betterer/render@npm:5.3.4" - checksum: 10/b979b78490cc2cc2032d40e6a46390c5efac9cad1e1262d8a7647dd37c9aec73098298fc721711e71e4b7e15b5501f431f45ed835104c0bd9e7e414b389e6639 - languageName: node - linkType: hard - -"@betterer/reporter@npm:^5.4.0": - version: 5.4.0 - resolution: "@betterer/reporter@npm:5.4.0" - dependencies: - "@betterer/betterer": "npm:^5.4.0" - "@betterer/errors": "npm:^5.3.0" - "@betterer/logger": "npm:^5.3.4" - "@betterer/render": "npm:^5.3.4" - "@betterer/tasks": "npm:^5.3.6" - tslib: "npm:^2.3.1" - checksum: 10/09169f068fbb9de82088d54368ccf1b3eb143e18eba1e7963e9a94b49f0bf3e122e26c7b536ddb2d20da79ce12270747b9507d9271a73047e3640fa6acde1977 - languageName: node - linkType: hard - -"@betterer/tasks@npm:^5.3.6": - version: 5.3.6 - resolution: "@betterer/tasks@npm:5.3.6" - dependencies: - "@betterer/errors": "npm:^5.3.0" - "@betterer/logger": "npm:^5.3.4" - "@betterer/render": "npm:^5.3.4" - chalk: "npm:^4.1.2" - tslib: "npm:^2.3.1" - checksum: 10/b85cfb54198ac94b476839aac9a8f717b28c7f5bf07d576cb4821d6828bcce0c5c4ec9a54eb29f94e42187bbef2e6266482484718a1417b456b73816f0740cdf - languageName: node - linkType: hard - "@braidai/lang@npm:^1.0.0": version: 1.1.1 resolution: "@braidai/lang@npm:1.1.1" @@ -4848,22 +4736,6 @@ __metadata: languageName: node linkType: hard -"@kwsites/file-exists@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/file-exists@npm:1.1.1" - dependencies: - debug: "npm:^4.1.1" - checksum: 10/4ff945de7293285133aeae759caddc71e73c4a44a12fac710fdd4f574cce2671a3f89d8165fdb03d383cfc97f3f96f677d8de3c95133da3d0e12a123a23109fe - languageName: node - linkType: hard - -"@kwsites/promise-deferred@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/promise-deferred@npm:1.1.1" - checksum: 10/07455477a0123d9a38afb503739eeff2c5424afa8d3dbdcc7f9502f13604488a4b1d9742fc7288832a52a6422cf1e1c0a1d51f69a39052f14d27c9a0420b6629 - languageName: node - linkType: hard - "@leeoniya/ufuzzy@npm:1.0.18, @leeoniya/ufuzzy@npm:^1.0.16": version: 1.0.18 resolution: "@leeoniya/ufuzzy@npm:1.0.18" @@ -6239,47 +6111,6 @@ __metadata: languageName: node linkType: hard -"@phenomnomnominal/debug@npm:^0.2.5": - version: 0.2.5 - resolution: "@phenomnomnominal/debug@npm:0.2.5" - dependencies: - callsite: "npm:^1.0.0" - esprima: "npm:^4.0.1" - esquery: "npm:^1.3.1" - tslib: "npm:^2.0.3" - checksum: 10/eedc309988bc679f573c89bb75f7065d59a0b01b0bd4abb8b4c0e077541e4319c66c9550f7f0fea4bcd613bf08cb27f11f7a69ffc08e5938761b433b0f784d51 - languageName: node - linkType: hard - -"@phenomnomnominal/tsquery@npm:^4.1.1": - version: 4.2.0 - resolution: "@phenomnomnominal/tsquery@npm:4.2.0" - dependencies: - esquery: "npm:^1.0.1" - peerDependencies: - typescript: ^3 || ^4 - checksum: 10/5ad8bdf28fd09614023f629aadc1a166f59fca8e7274cafa6afd795eabe9af8bb756c8dd7e49aff20c8467989600f9888840de648d1902887cda81ce48d4ce3c - languageName: node - linkType: hard - -"@phenomnomnominal/tstemplate@npm:^0.1.0": - version: 0.1.0 - resolution: "@phenomnomnominal/tstemplate@npm:0.1.0" - checksum: 10/19bc55fc2b61d57194a792f2edd5ef10d2965e4f7fea127f39426adf1128d5a99e4dcbb3d9503a4f3291dc2bf25ba4fe6f5b59121ec52726dbb2308c8fca95e1 - languageName: node - linkType: hard - -"@phenomnomnominal/worker-require@npm:^0.0.34": - version: 0.0.34 - resolution: "@phenomnomnominal/worker-require@npm:0.0.34" - dependencies: - callsite: "npm:^1.0.0" - comlink: "npm:^4.3.0" - tslib: "npm:^1.10.0" - checksum: 10/86453c1c7d1f866cf7c021795011353698cd64865e91cf334d0df793a8984f7e2563a275c22c840ea07b0de64f538573bf56e98118f7cb7ac4ec15d0be1d0c06 - languageName: node - linkType: hard - "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -12635,13 +12466,6 @@ __metadata: languageName: node linkType: hard -"callsite@npm:^1.0.0": - version: 1.0.0 - resolution: "callsite@npm:1.0.0" - checksum: 10/39fc89ef9dbee7d5491bc69034fc16fbb8876a73456f831cc27060b5828e94357bb6705e0127a6d0182d79b03dbdb0ef88223d0b599c26667c871c89b30eb681 - languageName: node - linkType: hard - "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -12936,7 +12760,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.3.1, chokidar@npm:^3.5.3": +"chokidar@npm:^3.5.3": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -13381,7 +13205,7 @@ __metadata: languageName: node linkType: hard -"comlink@npm:4.4.2, comlink@npm:^4.3.0": +"comlink@npm:4.4.2": version: 4.4.2 resolution: "comlink@npm:4.4.2" checksum: 10/ecee53b5b4536b3aa3f7636c383f831e68fbc013def77665cc7fad873d72cfa23b994e1ec4b49e83e4e909c1089a03acae03a523e33a5e5ed938cdb613456434 @@ -13444,7 +13268,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^8.1.0, commander@npm:^8.3.0": +"commander@npm:^8.1.0": version: 8.3.0 resolution: "commander@npm:8.3.0" checksum: 10/6b7b5d334483ce24bd73c5dac2eab901a7dbb25fd983ea24a1eeac6e7166bb1967f641546e8abf1920afbde86a45fbfe5812fbc69d0dc451bb45ca416a12a3a3 @@ -15137,13 +14961,6 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^27.5.1": - version: 27.5.1 - resolution: "diff-sequences@npm:27.5.1" - checksum: 10/34d852a13eb82735c39944a050613f952038614ce324256e1c3544948fa090f1ca7f329a4f1f57c31fe7ac982c17068d8915b633e300f040b97708c81ceb26cd - languageName: node - linkType: hard - "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -15199,13 +15016,6 @@ __metadata: languageName: node linkType: hard -"djb2a@npm:^1.2.0": - version: 1.2.0 - resolution: "djb2a@npm:1.2.0" - checksum: 10/75fe594fad164634b08dc3878551aadf29fc206ba2767244ab9be323de8ffbd9c01b4dcfc1168ffb7dea0bd98a6f211966943a67aa815639fcaffbab7960ade0 - languageName: node - linkType: hard - "doctrine@npm:^2.1.0": version: 2.1.0 resolution: "doctrine@npm:2.1.0" @@ -16552,7 +16362,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.0.1, esquery@npm:^1.3.1, esquery@npm:^1.5.0, esquery@npm:^1.6.0": +"esquery@npm:^1.5.0, esquery@npm:^1.6.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -16964,13 +16774,6 @@ __metadata: languageName: node linkType: hard -"fast-memoize@npm:^2.5.2": - version: 2.5.2 - resolution: "fast-memoize@npm:2.5.2" - checksum: 10/b7e2839d70607c791ffda617bb3cf7d9944bd5483be05cedbc060be1381c79093efc470215f1bc5aa666b8ecc2c9ae49e6f56ab6f45f0c1474f6628651c9959b - languageName: node - linkType: hard - "fast-safe-stringify@npm:^2.0.7": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" @@ -18287,8 +18090,6 @@ __metadata: "@babel/core": "npm:7.28.0" "@babel/preset-env": "npm:7.28.0" "@babel/runtime": "npm:7.28.2" - "@betterer/betterer": "npm:5.4.0" - "@betterer/cli": "npm:5.4.0" "@bsull/augurs": "npm:^0.10.0" "@crowdin/crowdin-api-client": "npm:^1.42.0" "@cypress/webpack-preprocessor": "npm:6.0.4" @@ -20802,18 +20603,6 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^27.0.6, jest-diff@npm:^27.1.0": - version: 27.5.1 - resolution: "jest-diff@npm:27.5.1" - dependencies: - chalk: "npm:^4.0.0" - diff-sequences: "npm:^27.5.1" - jest-get-type: "npm:^27.5.1" - pretty-format: "npm:^27.5.1" - checksum: 10/af454f30f33af625832bdb02614e188a41e33ce79086b43f95dbcc515274dd36bf8443b8d0299e22c2416e7591da4321e6bc7f2b0aef56471d1133c6b6833221 - languageName: node - linkType: hard - "jest-diff@npm:^30.0.2": version: 30.0.5 resolution: "jest-diff@npm:30.0.5" @@ -20890,13 +20679,6 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-get-type@npm:27.5.1" - checksum: 10/63064ab70195c21007d897c1157bf88ff94a790824a10f8c890392e7d17eda9c3900513cb291ca1c8d5722cad79169764e9a1279f7c8a9c4cd6e9109ff04bbc0 - languageName: node - linkType: hard - "jest-get-type@npm:^29.6.3": version: 29.6.3 resolution: "jest-get-type@npm:29.6.3" @@ -22086,7 +21868,7 @@ __metadata: languageName: node linkType: hard -"lines-and-columns@npm:2.0.4, lines-and-columns@npm:^2.0.3": +"lines-and-columns@npm:2.0.4": version: 2.0.4 resolution: "lines-and-columns@npm:2.0.4" checksum: 10/81ac2f943f5428a46bd4ea2561c74ba674a107d8e6cc70cd317d16892a36ff3ba0dc6e599aca8b6f8668d26c85288394c6edf7a40e985ca843acab3701b80d4c @@ -26175,15 +25957,6 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.3.2": - version: 2.8.8 - resolution: "prettier@npm:2.8.8" - bin: - prettier: bin-prettier.js - checksum: 10/00cdb6ab0281f98306cd1847425c24cbaaa48a5ff03633945ab4c701901b8e96ad558eb0777364ffc312f437af9b5a07d0f45346266e8245beaf6247b9c62b24 - languageName: node - linkType: hard - "pretty-bytes@npm:^5.6.0": version: 5.6.0 resolution: "pretty-bytes@npm:5.6.0" @@ -26212,7 +25985,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^27.0.2, pretty-format@npm:^27.5.1": +"pretty-format@npm:^27.0.2": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" dependencies: @@ -29301,17 +29074,6 @@ __metadata: languageName: node linkType: hard -"simple-git@npm:^3.6.0": - version: 3.16.0 - resolution: "simple-git@npm:3.16.0" - dependencies: - "@kwsites/file-exists": "npm:^1.1.1" - "@kwsites/promise-deferred": "npm:^1.1.1" - debug: "npm:^4.3.4" - checksum: 10/b1c4b187bff2964bab47fd1b683ece275a599e9a466f7e2689ee1fea0360f7d13228e934d66095c911e7e8b57ab5f2526e3deeeb6e4d0c03e4d5f12f7ef03cd9 - languageName: node - linkType: hard - "simple-xml-to-json@npm:^1.2.2": version: 1.2.3 resolution: "simple-xml-to-json@npm:1.2.3" @@ -31333,7 +31095,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:10.9.2, ts-node@npm:^10.2.1": +"ts-node@npm:10.9.2": version: 10.9.2 resolution: "ts-node@npm:10.9.2" dependencies: @@ -31415,14 +31177,14 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.8.1, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.6.2, tslib@npm:^2.7.0, tslib@npm:^2.8.0": +"tslib@npm:2.8.1, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.6.2, tslib@npm:^2.7.0, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 languageName: node linkType: hard -"tslib@npm:^1.10.0, tslib@npm:^1.8.1": +"tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb @@ -31702,7 +31464,7 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.9.2, typescript@npm:>=2.7, typescript@npm:>=3 < 6, typescript@npm:^5.0.4, typescript@npm:^5.4.5, typescript@npm:^5.5.4": +"typescript@npm:5.9.2, typescript@npm:>=3 < 6, typescript@npm:^5.0.4, typescript@npm:^5.4.5, typescript@npm:^5.5.4": version: 5.9.2 resolution: "typescript@npm:5.9.2" bin: @@ -31732,7 +31494,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.9.2#optional!builtin, typescript@patch:typescript@npm%3A>=2.7#optional!builtin, typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.4.5#optional!builtin, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin": +"typescript@patch:typescript@npm%3A5.9.2#optional!builtin, typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.4.5#optional!builtin, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin": version: 5.9.2 resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5" bin: