Chore: Remove betterer (#110469)

This commit is contained in:
Tom Ratcliffe
2025-09-04 18:17:53 +01:00
committed by GitHub
parent ea7c370edd
commit 3d6d632686
14 changed files with 13 additions and 604 deletions
-1
View File
@@ -1 +0,0 @@
export default {};
-1
View File
@@ -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
@@ -86,7 +86,6 @@ runs:
- '.github/actions/change-detection/**'
- '**.cue'
- '.prettier*'
- '.betterer*'
- '.yarnrc.yml'
- 'eslint.config.js'
- 'jest.config.js'
-19
View File
@@ -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
-1
View File
@@ -222,7 +222,6 @@ public/api-spec.json
deployment_tools_config.json
.betterer.cache
.nx
# Temporary file for backporting PRs
-1
View File
@@ -11,7 +11,6 @@ node_modules
pkg
public/lib/monaco
public/sass/*.generated.scss
scripts/cli/bettererIssueTemplate.md
scripts/grafana-server/tmp
vendor
-6
View File
@@ -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",
@@ -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({
-8
View File
@@ -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}\",
-7
View File
@@ -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 %>) <% }) %>
-109
View File
@@ -1,109 +0,0 @@
#!/bin/bash
# Script to create GitHub issues from text files in a directory
# Usage: ./create_issues_from_files.sh <directory> <owner/repo>
# 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 <directory> <owner/repo>"
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
-148
View File
@@ -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<string, FileDetails[]> = {};
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);
-51
View File
@@ -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<number>(countByMessage)) {
logStat(metricName, count);
}
}
}
main().catch(console.error);
+12 -250
View File
@@ -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<compat/typescript>, typescript@patch:typescript@npm%3A>=2.7#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.4.5#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin<compat/typescript>":
"typescript@patch:typescript@npm%3A5.9.2#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.4.5#optional!builtin<compat/typescript>, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin<compat/typescript>":
version: 5.9.2
resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin<compat/typescript>::version=5.9.2&hash=5786d5"
bin: