Make linter run by upgrading the ESLint config

Signed-off-by: Julius Volz <julius.volz@gmail.com>
This commit is contained in:
Julius Volz 2024-09-06 20:35:55 +02:00
parent c1c2e32137
commit 07856b4bb9
13 changed files with 371 additions and 125 deletions

View file

@ -1,21 +0,0 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react-hooks/recommended',
],
ignorePatterns: ['dist', '.eslintrc.cjs'],
parser: '@typescript-eslint/parser',
plugins: ['react-refresh'],
rules: {
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
'no-unused-vars': ['error', { 'argsIgnorePattern': '^_' }],
'@typescript-eslint/no-unused-vars': ['error', { 'argsIgnorePattern': '^_' }],
'prefer-const': ['error', { destructuring: 'all' }],
},
}

View file

@ -0,0 +1,71 @@
import { fixupConfigRules } from '@eslint/compat';
import reactRefresh from 'eslint-plugin-react-refresh';
import globals from 'globals';
import tsParser from '@typescript-eslint/parser';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import js from '@eslint/js';
import { FlatCompat } from '@eslint/eslintrc';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all
});
export default [{
ignores: ['**/dist', '**/.eslintrc.cjs'],
}, ...fixupConfigRules(compat.extends(
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react-hooks/recommended',
)), {
plugins: {
'react-refresh': reactRefresh,
},
languageOptions: {
globals: {
...globals.browser,
},
parser: tsParser,
},
rules: {
'react-refresh/only-export-components': ['warn', {
allowConstantExport: true,
}],
// Disable the base rule as it can report incorrect errors
'no-unused-vars': 'off',
// Use the TypeScript-specific rule for unused vars
'@typescript-eslint/no-unused-vars': ['warn', {
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
caughtErrorsIgnorePattern: '^_',
}],
'prefer-const': ['error', {
destructuring: 'all',
}],
},
},
// Override for Node.js-based config files
{
files: ['postcss.config.cjs'], // Specify any other config files
languageOptions: {
ecmaVersion: 2021, // Optional, set ECMAScript version
sourceType: 'script', // For CommonJS (non-ESM) modules
globals: {
module: 'readonly',
require: 'readonly',
process: 'readonly',
__dirname: 'readonly', // Include other Node.js globals if needed
},
},
},
];

View file

@ -6,7 +6,8 @@
"scripts": { "scripts": {
"start": "vite", "start": "vite",
"build": "tsc && vite build", "build": "tsc && vite build",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "lint": "eslint . --report-unused-disable-directives --max-warnings 0",
"lint:fix": "eslint . --report-unused-disable-directives --max-warnings 0 --fix",
"preview": "vite preview", "preview": "vite preview",
"test": "vitest" "test": "vitest"
}, },
@ -49,6 +50,9 @@
"use-query-params": "^2.2.1" "use-query-params": "^2.2.1"
}, },
"devDependencies": { "devDependencies": {
"@eslint/compat": "^1.1.1",
"@eslint/eslintrc": "^3.1.0",
"@eslint/js": "^9.9.1",
"@types/react": "^18.3.5", "@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0", "@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/eslint-plugin": "^6.21.0",
@ -57,6 +61,7 @@
"eslint": "^9.9.1", "eslint": "^9.9.1",
"eslint-plugin-react-hooks": "^5.1.0-rc-e56f4ae3-20240830", "eslint-plugin-react-hooks": "^5.1.0-rc-e56f4ae3-20240830",
"eslint-plugin-react-refresh": "^0.4.11", "eslint-plugin-react-refresh": "^0.4.11",
"globals": "^15.9.0",
"jsdom": "^25.0.0", "jsdom": "^25.0.0",
"postcss": "^8.4.35", "postcss": "^8.4.35",
"postcss-preset-mantine": "^1.17.0", "postcss-preset-mantine": "^1.17.0",

View file

@ -196,7 +196,7 @@ function App() {
useEffect(() => { useEffect(() => {
dispatch(updateSettings({ pathPrefix })); dispatch(updateSettings({ pathPrefix }));
}, [pathPrefix]); }, [pathPrefix, dispatch]);
const { agentMode, consolesLink } = useSettings(); const { agentMode, consolesLink } = useSettings();

View file

@ -137,7 +137,7 @@ export const bucketRangeString = ([
boundaryRule, boundaryRule,
leftBoundary, leftBoundary,
rightBoundary, rightBoundary,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_, _,
]: [number, string, string, string]): string => { ]: [number, string, string, string]): string => {
return `${leftDelim(boundaryRule)}${leftBoundary} -> ${rightBoundary}${rightDelim(boundaryRule)}`; return `${leftDelim(boundaryRule)}${leftBoundary} -> ${rightBoundary}${rightDelim(boundaryRule)}`;

View file

@ -131,13 +131,13 @@ const TreeNode: FC<{
if (error) { if (error) {
reportNodeState && reportNodeState("error"); reportNodeState && reportNodeState("error");
} }
}, [error]); }, [error, reportNodeState]);
useEffect(() => { useEffect(() => {
if (isFetching) { if (isFetching) {
reportNodeState && reportNodeState("running"); reportNodeState && reportNodeState("running");
} }
}, [isFetching]); }, [isFetching, reportNodeState]);
// Update the size and position of tree connector lines based on the node's and its parent's position. // Update the size and position of tree connector lines based on the node's and its parent's position.
useLayoutEffect(() => { useLayoutEffect(() => {
@ -221,7 +221,7 @@ const TreeNode: FC<{
), ),
labelExamples, labelExamples,
}); });
}, [data]); }, [data, reportNodeState]);
const innerNode = ( const innerNode = (
<Group <Group

View file

@ -1,51 +1,51 @@
export enum nodeType { export enum nodeType {
aggregation = 'aggregation', aggregation = "aggregation",
binaryExpr = 'binaryExpr', binaryExpr = "binaryExpr",
call = 'call', call = "call",
matrixSelector = 'matrixSelector', matrixSelector = "matrixSelector",
subquery = 'subquery', subquery = "subquery",
numberLiteral = 'numberLiteral', numberLiteral = "numberLiteral",
parenExpr = 'parenExpr', parenExpr = "parenExpr",
stringLiteral = 'stringLiteral', stringLiteral = "stringLiteral",
unaryExpr = 'unaryExpr', unaryExpr = "unaryExpr",
vectorSelector = 'vectorSelector', vectorSelector = "vectorSelector",
placeholder = 'placeholder', placeholder = "placeholder",
} }
export enum aggregationType { export enum aggregationType {
sum = 'sum', sum = "sum",
min = 'min', min = "min",
max = 'max', max = "max",
avg = 'avg', avg = "avg",
stddev = 'stddev', stddev = "stddev",
stdvar = 'stdvar', stdvar = "stdvar",
count = 'count', count = "count",
group = 'group', group = "group",
countValues = 'count_values', countValues = "count_values",
bottomk = 'bottomk', bottomk = "bottomk",
topk = 'topk', topk = "topk",
quantile = 'quantile', quantile = "quantile",
limitK = 'limitk', limitK = "limitk",
limitRatio = 'limit_ratio', limitRatio = "limit_ratio",
} }
export enum binaryOperatorType { export enum binaryOperatorType {
add = '+', add = "+",
sub = '-', sub = "-",
mul = '*', mul = "*",
div = '/', div = "/",
mod = '%', mod = "%",
pow = '^', pow = "^",
eql = '==', eql = "==",
neq = '!=', neq = "!=",
gtr = '>', gtr = ">",
lss = '<', lss = "<",
gte = '>=', gte = ">=",
lte = '<=', lte = "<=",
and = 'and', and = "and",
or = 'or', or = "or",
unless = 'unless', unless = "unless",
atan2 = 'atan2', atan2 = "atan2",
} }
export const compOperatorTypes: binaryOperatorType[] = [ export const compOperatorTypes: binaryOperatorType[] = [
@ -64,31 +64,31 @@ export const setOperatorTypes: binaryOperatorType[] = [
]; ];
export enum unaryOperatorType { export enum unaryOperatorType {
plus = '+', plus = "+",
minus = '-', minus = "-",
} }
export enum vectorMatchCardinality { export enum vectorMatchCardinality {
oneToOne = 'one-to-one', oneToOne = "one-to-one",
manyToOne = 'many-to-one', manyToOne = "many-to-one",
oneToMany = 'one-to-many', oneToMany = "one-to-many",
manyToMany = 'many-to-many', manyToMany = "many-to-many",
} }
export enum valueType { export enum valueType {
// TODO: 'none' should never make it out of Prometheus. Do we need this here? // TODO: 'none' should never make it out of Prometheus. Do we need this here?
none = 'none', none = "none",
vector = 'vector', vector = "vector",
scalar = 'scalar', scalar = "scalar",
matrix = 'matrix', matrix = "matrix",
string = 'string', string = "string",
} }
export enum matchType { export enum matchType {
equal = '=', equal = "=",
notEqual = '!=', notEqual = "!=",
matchRegexp = '=~', matchRegexp = "=~",
matchNotRegexp = '!~', matchNotRegexp = "!~",
} }
export interface Func { export interface Func {
@ -111,7 +111,7 @@ export interface VectorMatching {
include: string[]; include: string[];
} }
export type StartOrEnd = 'start' | 'end' | null; export type StartOrEnd = "start" | "end" | null;
// AST Node Types. // AST Node Types.

View file

@ -0,0 +1,26 @@
module github.com/prometheus/prometheus/web/ui/mantine-ui/src/promql/tools
go 1.23.0
require (
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc
github.com/prometheus/prometheus v0.54.1
github.com/russross/blackfriday/v2 v2.1.0
)
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/dennwc/varint v1.0.0 // indirect
github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/prometheus/client_golang v1.19.1 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
go.uber.org/atomic v1.11.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.16.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
)

View file

@ -0,0 +1,107 @@
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg=
github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI=
github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps=
github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE=
github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA=
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248=
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4=
github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ=
github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA=
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU=
k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU=
k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg=
k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=

View file

@ -1,9 +1,18 @@
import ASTNode, { binaryOperatorType, nodeType, valueType, Call, compOperatorTypes, setOperatorTypes } from './ast'; import ASTNode, {
import { functionArgNames } from './functionMeta'; binaryOperatorType,
nodeType,
valueType,
Call,
compOperatorTypes,
setOperatorTypes,
} from "./ast";
import { functionArgNames } from "./functionMeta";
export const getNonParenNodeType = (n: ASTNode) => { export const getNonParenNodeType = (n: ASTNode) => {
let cur: ASTNode; let cur: ASTNode;
for (cur = n; cur.type === 'parenExpr'; cur = cur.expr) {} for (cur = n; cur.type === "parenExpr"; cur = cur.expr) {
// Continue traversing until a non-parenthesis expression is found
}
return cur.type; return cur.type;
}; };
@ -34,7 +43,10 @@ const binOpPrecedence = {
[binaryOperatorType.atan2]: 2, [binaryOperatorType.atan2]: 2,
}; };
export const maybeParenthesizeBinopChild = (op: binaryOperatorType, child: ASTNode): ASTNode => { export const maybeParenthesizeBinopChild = (
op: binaryOperatorType,
child: ASTNode
): ASTNode => {
if (child.type !== nodeType.binaryExpr) { if (child.type !== nodeType.binaryExpr) {
return child; return child;
} }
@ -73,7 +85,7 @@ export const getNodeChildren = (node: ASTNode): ASTNode[] => {
case nodeType.binaryExpr: case nodeType.binaryExpr:
return [node.lhs, node.rhs]; return [node.lhs, node.rhs];
default: default:
throw new Error('unsupported node type'); throw new Error("unsupported node type");
} }
}; };
@ -92,18 +104,19 @@ export const getNodeChild = (node: ASTNode, idx: number) => {
case nodeType.binaryExpr: case nodeType.binaryExpr:
return idx === 0 ? node.lhs : node.rhs; return idx === 0 ? node.lhs : node.rhs;
default: default:
throw new Error('unsupported node type'); throw new Error("unsupported node type");
} }
}; };
export const containsPlaceholders = (node: ASTNode): boolean => export const containsPlaceholders = (node: ASTNode): boolean =>
node.type === nodeType.placeholder || getNodeChildren(node).some((n) => containsPlaceholders(n)); node.type === nodeType.placeholder ||
getNodeChildren(node).some((n) => containsPlaceholders(n));
export const nodeValueType = (node: ASTNode): valueType | null => { export const nodeValueType = (node: ASTNode): valueType | null => {
switch (node.type) { switch (node.type) {
case nodeType.aggregation: case nodeType.aggregation:
return valueType.vector; return valueType.vector;
case nodeType.binaryExpr: case nodeType.binaryExpr: {
const childTypes = [nodeValueType(node.lhs), nodeValueType(node.rhs)]; const childTypes = [nodeValueType(node.lhs), nodeValueType(node.rhs)];
if (childTypes.includes(null)) { if (childTypes.includes(null)) {
@ -116,6 +129,7 @@ export const nodeValueType = (node: ASTNode): valueType | null => {
} }
return valueType.scalar; return valueType.scalar;
}
case nodeType.call: case nodeType.call:
return node.func.returnType; return node.func.returnType;
case nodeType.matrixSelector: case nodeType.matrixSelector:
@ -135,7 +149,7 @@ export const nodeValueType = (node: ASTNode): valueType | null => {
case nodeType.vectorSelector: case nodeType.vectorSelector:
return valueType.vector; return valueType.vector;
default: default:
throw new Error('invalid node type'); throw new Error("invalid node type");
} }
}; };
@ -144,50 +158,65 @@ export const childDescription = (node: ASTNode, idx: number): string => {
case nodeType.aggregation: case nodeType.aggregation:
if (aggregatorsWithParam.includes(node.op) && idx === 0) { if (aggregatorsWithParam.includes(node.op) && idx === 0) {
switch (node.op) { switch (node.op) {
case 'topk': case "topk":
case 'bottomk': case "bottomk":
case 'limitk': case "limitk":
return 'k'; return "k";
case 'quantile': case "quantile":
return 'quantile'; return "quantile";
case 'count_values': case "count_values":
return 'target label name'; return "target label name";
case 'limit_ratio': case "limit_ratio":
return 'ratio'; return "ratio";
} }
} }
return 'vector to aggregate'; return "vector to aggregate";
case nodeType.binaryExpr: case nodeType.binaryExpr:
return idx === 0 ? 'left-hand side' : 'right-hand side'; return idx === 0 ? "left-hand side" : "right-hand side";
case nodeType.call: case nodeType.call:
if (functionArgNames.hasOwnProperty(node.func.name)) { if (node.func.name in functionArgNames) {
const argNames = functionArgNames[node.func.name]; const argNames = functionArgNames[node.func.name];
return argNames[Math.min(functionArgNames[node.func.name].length - 1, idx)]; return argNames[Math.min(argNames.length - 1, idx)];
} }
return 'argument'; return "argument";
case nodeType.parenExpr: case nodeType.parenExpr:
return 'expression'; return "expression";
case nodeType.placeholder: case nodeType.placeholder:
return 'argument'; return "argument";
case nodeType.subquery: case nodeType.subquery:
return 'subquery to execute'; return "subquery to execute";
case nodeType.unaryExpr: case nodeType.unaryExpr:
return 'expression'; return "expression";
default: default:
throw new Error('invalid node type'); throw new Error("invalid node type");
} }
}; };
export const aggregatorsWithParam = ['topk', 'bottomk', 'quantile', 'count_values', 'limitk', 'limit_ratio']; export const aggregatorsWithParam = [
"topk",
"bottomk",
"quantile",
"count_values",
"limitk",
"limit_ratio",
];
export const anyValueType = [valueType.scalar, valueType.string, valueType.matrix, valueType.vector]; export const anyValueType = [
valueType.scalar,
valueType.string,
valueType.matrix,
valueType.vector,
];
export const allowedChildValueTypes = (node: ASTNode, idx: number): valueType[] => { export const allowedChildValueTypes = (
node: ASTNode,
idx: number
): valueType[] => {
switch (node.type) { switch (node.type) {
case nodeType.aggregation: case nodeType.aggregation:
if (aggregatorsWithParam.includes(node.op) && idx === 0) { if (aggregatorsWithParam.includes(node.op) && idx === 0) {
if (node.op === 'count_values') { if (node.op === "count_values") {
return [valueType.string]; return [valueType.string];
} }
return [valueType.scalar]; return [valueType.scalar];
@ -211,7 +240,7 @@ export const allowedChildValueTypes = (node: ASTNode, idx: number): valueType[]
case nodeType.unaryExpr: case nodeType.unaryExpr:
return anyValueType; return anyValueType;
default: default:
throw new Error('invalid node type'); throw new Error("invalid node type");
} }
}; };
@ -225,17 +254,19 @@ export const canAddVarArg = (node: Call): boolean => {
}; };
export const canRemoveVarArg = (node: Call): boolean => { export const canRemoveVarArg = (node: Call): boolean => {
return node.func.variadic !== 0 && node.args.length >= node.func.argTypes.length; return (
node.func.variadic !== 0 && node.args.length >= node.func.argTypes.length
);
}; };
export const humanizedValueType: Record<valueType, string> = { export const humanizedValueType: Record<valueType, string> = {
[valueType.none]: 'none', [valueType.none]: "none",
[valueType.string]: 'string', [valueType.string]: "string",
[valueType.scalar]: 'number (scalar)', [valueType.scalar]: "number (scalar)",
[valueType.vector]: 'instant vector', [valueType.vector]: "instant vector",
[valueType.matrix]: 'range vector', [valueType.matrix]: "range vector",
}; };
export const escapeString = (str: string) => { export const escapeString = (str: string) => {
return str.replace(/([\\"])/g, '\\$1'); return str.replace(/([\\"])/g, "\\$1");
}; };

View file

@ -62,6 +62,9 @@
"use-query-params": "^2.2.1" "use-query-params": "^2.2.1"
}, },
"devDependencies": { "devDependencies": {
"@eslint/compat": "^1.1.1",
"@eslint/eslintrc": "^3.1.0",
"@eslint/js": "^9.9.1",
"@types/react": "^18.3.5", "@types/react": "^18.3.5",
"@types/react-dom": "^18.3.0", "@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/eslint-plugin": "^6.21.0",
@ -70,6 +73,7 @@
"eslint": "^9.9.1", "eslint": "^9.9.1",
"eslint-plugin-react-hooks": "^5.1.0-rc-e56f4ae3-20240830", "eslint-plugin-react-hooks": "^5.1.0-rc-e56f4ae3-20240830",
"eslint-plugin-react-refresh": "^0.4.11", "eslint-plugin-react-refresh": "^0.4.11",
"globals": "^15.9.0",
"jsdom": "^25.0.0", "jsdom": "^25.0.0",
"postcss": "^8.4.35", "postcss": "^8.4.35",
"postcss-preset-mantine": "^1.17.0", "postcss-preset-mantine": "^1.17.0",
@ -169,6 +173,19 @@
} }
} }
}, },
"mantine-ui/node_modules/globals": {
"version": "15.9.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz",
"integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"module/codemirror-promql": { "module/codemirror-promql": {
"name": "@prometheus-io/codemirror-promql", "name": "@prometheus-io/codemirror-promql",
"version": "0.54.1", "version": "0.54.1",
@ -1448,6 +1465,16 @@
"node": "^12.0.0 || ^14.0.0 || >=16.0.0" "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
} }
}, },
"node_modules/@eslint/compat": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.1.1.tgz",
"integrity": "sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/config-array": { "node_modules/@eslint/config-array": {
"version": "0.18.0", "version": "0.18.0",
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",