mirror of
https://github.com/grafana/grafana.git
synced 2025-09-22 13:43:16 +08:00

* Add and configure eslint-plugin-import * Fix the lint:ts npm command * Autofix + prettier all the files * Manually fix remaining files * Move jquery code in jest-setup to external file to safely reorder imports * Resolve issue caused by circular dependencies within Prometheus * Update .betterer.results * Fix missing // @ts-ignore * ignore iconBundle.ts * Fix missing // @ts-ignore
82 lines
2.5 KiB
TypeScript
82 lines
2.5 KiB
TypeScript
import { ValidateResult } from 'react-hook-form';
|
||
|
||
import { isExpressionQuery } from 'app/features/expressions/guards';
|
||
import { AlertQuery } from 'app/types/unified-alerting-dto';
|
||
|
||
export function queriesWithUpdatedReferences(
|
||
queries: AlertQuery[],
|
||
previousRefId: string,
|
||
newRefId: string
|
||
): AlertQuery[] {
|
||
return queries.map((query) => {
|
||
if (previousRefId === newRefId) {
|
||
return query;
|
||
}
|
||
|
||
if (!isExpressionQuery(query.model)) {
|
||
return query;
|
||
}
|
||
|
||
const isMathExpression = query.model.type === 'math';
|
||
const isReduceExpression = query.model.type === 'reduce';
|
||
const isResampleExpression = query.model.type === 'resample';
|
||
const isClassicExpression = query.model.type === 'classic_conditions';
|
||
|
||
if (isMathExpression) {
|
||
return {
|
||
...query,
|
||
model: {
|
||
...query.model,
|
||
expression: updateMathExpressionRefs(query.model.expression ?? '', previousRefId, newRefId),
|
||
},
|
||
};
|
||
}
|
||
|
||
if (isResampleExpression || isReduceExpression) {
|
||
const isReferencing = query.model.expression === previousRefId;
|
||
|
||
return {
|
||
...query,
|
||
model: {
|
||
...query.model,
|
||
expression: isReferencing ? newRefId : query.model.expression,
|
||
},
|
||
};
|
||
}
|
||
|
||
if (isClassicExpression) {
|
||
const conditions = query.model.conditions?.map((condition) => ({
|
||
...condition,
|
||
query: {
|
||
...condition.query,
|
||
params: condition.query.params.map((param: string) => (param === previousRefId ? newRefId : param)),
|
||
},
|
||
}));
|
||
|
||
return { ...query, model: { ...query.model, conditions } };
|
||
}
|
||
|
||
return query;
|
||
});
|
||
}
|
||
|
||
export function updateMathExpressionRefs(expression: string, previousRefId: string, newRefId: string): string {
|
||
const oldExpression = new RegExp('(\\$' + previousRefId + '\\b)|(\\${' + previousRefId + '})', 'gm');
|
||
const newExpression = '${' + newRefId + '}';
|
||
|
||
return expression.replace(oldExpression, newExpression);
|
||
}
|
||
|
||
// some gateways (like Istio) will decode "/" and "\" characters – this will cause 404 errors for any API call
|
||
// that includes these values in the URL (ie. /my/path%2fto/resource -> /my/path/to/resource)
|
||
//
|
||
// see https://istio.io/latest/docs/ops/best-practices/security/#customize-your-system-on-path-normalization
|
||
export function checkForPathSeparator(value: string): ValidateResult {
|
||
const containsPathSeparator = value.includes('/') || value.includes('\\');
|
||
if (containsPathSeparator) {
|
||
return 'Cannot contain "/" or "\\" characters';
|
||
}
|
||
|
||
return true;
|
||
}
|