Upgrade create-react-app to v5 (#10396)

* Upgrade create-react-app to v5

Some other dependencies needs to be upgraded as well, plus some typescript errors fixed.

Signed-off-by: Łukasz Mierzwa <l.mierzwa@gmail.com>

* Use ESM imports for codemirror-promql

Signed-off-by: Łukasz Mierzwa <l.mierzwa@gmail.com>

* Update FontAwesome to v6

Signed-off-by: Łukasz Mierzwa <l.mierzwa@gmail.com>
This commit is contained in:
Łukasz Mierzwa 2022-03-05 19:45:55 +00:00 committed by GitHub
parent edfe657b54
commit 4e3b6fc043
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 22257 additions and 33148 deletions

55254
web/ui/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -16,9 +16,9 @@
"@codemirror/state": "^0.19.6", "@codemirror/state": "^0.19.6",
"@codemirror/view": "^0.19.27", "@codemirror/view": "^0.19.27",
"@forevolve/bootstrap-dark": "^1.0.0", "@forevolve/bootstrap-dark": "^1.0.0",
"@fortawesome/fontawesome-svg-core": "^1.2.36", "@fortawesome/fontawesome-svg-core": "1.3.0",
"@fortawesome/free-solid-svg-icons": "^5.7.2", "@fortawesome/free-solid-svg-icons": "6.0.0",
"@fortawesome/react-fontawesome": "^0.1.16", "@fortawesome/react-fontawesome": "0.1.17",
"@nexucis/fuzzy": "^0.3.0", "@nexucis/fuzzy": "^0.3.0",
"@nexucis/kvsearch": "^0.5.0", "@nexucis/kvsearch": "^0.5.0",
"bootstrap": "^4.6.1", "bootstrap": "^4.6.1",
@ -82,14 +82,14 @@
"@wojtekmaj/enzyme-adapter-react-17": "^0.6.6", "@wojtekmaj/enzyme-adapter-react-17": "^0.6.6",
"enzyme": "^3.11.0", "enzyme": "^3.11.0",
"enzyme-to-json": "^3.6.2", "enzyme-to-json": "^3.6.2",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.5.0",
"eslint-config-react-app": "^6.0.0", "eslint-config-react-app": "^7.0.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.0.0",
"jest-canvas-mock": "^2.3.1", "jest-canvas-mock": "^2.3.1",
"jest-fetch-mock": "^3.0.3", "jest-fetch-mock": "^3.0.3",
"mutationobserver-shim": "^0.3.7", "mutationobserver-shim": "^0.3.7",
"prettier": "^2.5.1", "prettier": "^2.5.1",
"react-scripts": "4.0.3", "react-scripts": "5.0.0",
"sinon": "^12.0.1", "sinon": "^12.0.1",
"typescript": "^4.5.2" "typescript": "^4.5.2"
}, },

View file

@ -18,7 +18,7 @@ import {
} from './pages'; } from './pages';
describe('App', () => { describe('App', () => {
const app = shallow(<App />); const app = shallow(<App consolesLink={null} agentMode={false} />);
it('navigates', () => { it('navigates', () => {
expect(app.find(Navigation)).toHaveLength(1); expect(app.find(Navigation)).toHaveLength(1);

View file

@ -5,7 +5,7 @@ import { NavItem, NavLink } from 'reactstrap';
describe('Navbar should contain console Link', () => { describe('Navbar should contain console Link', () => {
it('with non-empty consoleslink', () => { it('with non-empty consoleslink', () => {
const app = shallow(<Navigation pathPrefix="/path/prefix" consolesLink="/path/consoles" />); const app = shallow(<Navigation consolesLink="/path/consoles" agentMode={false} />);
expect( expect(
app.contains( app.contains(
<NavItem> <NavItem>
@ -18,7 +18,7 @@ describe('Navbar should contain console Link', () => {
describe('Navbar should not contain consoles link', () => { describe('Navbar should not contain consoles link', () => {
it('with empty string in consolesLink', () => { it('with empty string in consolesLink', () => {
const app = shallow(<Navigation pathPrefix="/path/prefix" consolesLink={null} />); const app = shallow(<Navigation consolesLink={null} agentMode={false} />);
expect( expect(
app.contains( app.contains(
<NavItem> <NavItem>

View file

@ -13,7 +13,7 @@ interface CustomInfiniteScrollProps<T> {
} }
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
const CustomInfiniteScroll = <T extends unknown>({ allItems, child }: CustomInfiniteScrollProps<T>) => { const CustomInfiniteScroll = <T,>({ allItems, child }: CustomInfiniteScrollProps<T>) => {
const [items, setItems] = useState<T[]>(allItems.slice(0, 50)); const [items, setItems] = useState<T[]>(allItems.slice(0, 50));
const [index, setIndex] = useState<number>(initialNumberOfItemsDisplayed); const [index, setIndex] = useState<number>(initialNumberOfItemsDisplayed);
const [hasMore, setHasMore] = useState<boolean>(allItems.length > initialNumberOfItemsDisplayed); const [hasMore, setHasMore] = useState<boolean>(allItems.length > initialNumberOfItemsDisplayed);

View file

@ -52,9 +52,11 @@ exports[`Flags should match snapshot 1`] = `
"icon": Array [ "icon": Array [
320, 320,
512, 512,
Array [], Array [
"sort-desc",
],
"f0dd", "f0dd",
"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41z", "M311.9 335.1l-132.4 136.8C174.1 477.3 167.1 480 160 480c-7.055 0-14.12-2.702-19.47-8.109l-132.4-136.8C-9.229 317.8 3.055 288 27.66 288h264.7C316.9 288 329.2 317.8 311.9 335.1z",
], ],
"iconName": "sort-down", "iconName": "sort-down",
"prefix": "fas", "prefix": "fas",
@ -99,9 +101,11 @@ exports[`Flags should match snapshot 1`] = `
"icon": Array [ "icon": Array [
320, 320,
512, 512,
Array [], Array [
"unsorted",
],
"f0dc", "f0dc",
"M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41zm255-105L177 64c-9.4-9.4-24.6-9.4-33.9 0L24 183c-15.1 15.1-4.4 41 17 41h238c21.4 0 32.1-25.9 17-41z", "M27.66 224h264.7c24.6 0 36.89-29.78 19.54-47.12l-132.3-136.8c-5.406-5.406-12.47-8.107-19.53-8.107c-7.055 0-14.09 2.701-19.45 8.107L8.119 176.9C-9.229 194.2 3.055 224 27.66 224zM292.3 288H27.66c-24.6 0-36.89 29.77-19.54 47.12l132.5 136.8C145.9 477.3 152.1 480 160 480c7.053 0 14.12-2.703 19.53-8.109l132.3-136.8C329.2 317.8 316.9 288 292.3 288z",
], ],
"iconName": "sort", "iconName": "sort",
"prefix": "fas", "prefix": "fas",

View file

@ -20,7 +20,7 @@ import MetricsExplorer from './MetricsExplorer';
import { usePathPrefix } from '../../contexts/PathPrefixContext'; import { usePathPrefix } from '../../contexts/PathPrefixContext';
import { useTheme } from '../../contexts/ThemeContext'; import { useTheme } from '../../contexts/ThemeContext';
import { CompleteStrategy, PromQLExtension } from 'codemirror-promql'; import { CompleteStrategy, PromQLExtension } from 'codemirror-promql';
import { newCompleteStrategy } from 'codemirror-promql/dist/cjs/complete'; import { newCompleteStrategy } from 'codemirror-promql/dist/esm/complete';
const promqlExtension = new PromQLExtension(); const promqlExtension = new PromQLExtension();

View file

@ -9,6 +9,7 @@ import TimeInput from './TimeInput';
const defaultGraphControlProps = { const defaultGraphControlProps = {
range: 60 * 60 * 24 * 1000, range: 60 * 60 * 24 * 1000,
endTime: 1572100217898, endTime: 1572100217898,
useLocalTime: false,
resolution: 10, resolution: 10,
stacked: false, stacked: false,
showExemplars: false, showExemplars: false,
@ -170,7 +171,7 @@ describe('GraphControls', () => {
const btn = group.find(Button).filterWhere((btn) => btn.prop('title') === testCase.title); const btn = group.find(Button).filterWhere((btn) => btn.prop('title') === testCase.title);
const onClick = btn.prop('onClick'); const onClick = btn.prop('onClick');
if (onClick) { if (onClick) {
onClick({} as React.MouseEvent); btn.simulate('click');
expect(results).toHaveLength(1); expect(results).toHaveLength(1);
expect(results[0]).toBe(!testCase.active); expect(results[0]).toBe(!testCase.active);
results.pop(); results.pop();

View file

@ -65,11 +65,7 @@ describe('GraphHelpers', () => {
}); });
}); });
it('should throw error if no match', () => { it('should throw error if no match', () => {
try { expect(() => formatValue(undefined as any)).toThrowError("couldn't format a value, this is a bug");
formatValue(undefined as any);
} catch (error) {
expect(error.message).toEqual("couldn't format a value, this is a bug");
}
}); });
}); });
describe('parseValue', () => { describe('parseValue', () => {

View file

@ -15,10 +15,12 @@ const defaultProps = {
endTime: 1572100217898, endTime: 1572100217898,
resolution: 28, resolution: 28,
stacked: false, stacked: false,
showExemplars: true,
}, },
onOptionsChanged: (): void => { onOptionsChanged: (): void => {
// Do nothing. // Do nothing.
}, },
useLocalTime: false,
pastQueries: [], pastQueries: [],
metricNames: [ metricNames: [
'prometheus_engine_queries', 'prometheus_engine_queries',
@ -31,7 +33,11 @@ const defaultProps = {
onExecuteQuery: (): void => { onExecuteQuery: (): void => {
// Do nothing. // Do nothing.
}, },
pathPrefix: '/',
enableAutocomplete: true, enableAutocomplete: true,
enableHighlighting: true,
enableLinter: true,
id: 'panel',
}; };
describe('Panel', () => { describe('Panel', () => {
@ -79,6 +85,7 @@ describe('Panel', () => {
endTime: 1572100217898, endTime: 1572100217898,
resolution: 28, resolution: 28,
stacked: false, stacked: false,
showExemplars: true,
}; };
const graphPanel = mount(<Panel {...defaultProps} options={options} />); const graphPanel = mount(<Panel {...defaultProps} options={options} />);
const controls = graphPanel.find(GraphControls); const controls = graphPanel.find(GraphControls);

View file

@ -14,6 +14,7 @@ describe('TimeInput', () => {
onChangeTime: (): void => { onChangeTime: (): void => {
// Do nothing. // Do nothing.
}, },
useLocalTime: false,
}; };
const timeInput = shallow(<TimeInput {...timeInputProps} />); const timeInput = shallow(<TimeInput {...timeInputProps} />);
it('renders the string "scalar"', () => { it('renders the string "scalar"', () => {

View file

@ -4,10 +4,7 @@ import Targets from './Targets';
import ScrapePoolList from './ScrapePoolList'; import ScrapePoolList from './ScrapePoolList';
describe('Targets', () => { describe('Targets', () => {
const defaultProps = { const targets = shallow(<Targets />);
pathPrefix: '..',
};
const targets = shallow(<Targets {...defaultProps} />);
describe('Header', () => { describe('Header', () => {
const h2 = targets.find('h2'); const h2 = targets.find('h2');
it('renders a header', () => { it('renders a header', () => {

View file

@ -1,4 +1,4 @@
import { ScrapePools } from '../target'; import { ScrapePools, Target } from '../target';
export const targetGroups: ScrapePools = Object.freeze({ export const targetGroups: ScrapePools = Object.freeze({
blackbox: { blackbox: {
@ -70,7 +70,7 @@ export const targetGroups: ScrapePools = Object.freeze({
scrapeInterval: '15s', scrapeInterval: '15s',
scrapeTimeout: '500ms', scrapeTimeout: '500ms',
}, },
], ] as Target[],
}, },
node_exporter: { node_exporter: {
upCount: 1, upCount: 1,
@ -96,7 +96,7 @@ export const targetGroups: ScrapePools = Object.freeze({
scrapeInterval: '15s', scrapeInterval: '15s',
scrapeTimeout: '500ms', scrapeTimeout: '500ms',
}, },
], ] as Target[],
}, },
prometheus: { prometheus: {
upCount: 1, upCount: 1,
@ -122,7 +122,7 @@ export const targetGroups: ScrapePools = Object.freeze({
scrapeInterval: '15s', scrapeInterval: '15s',
scrapeTimeout: '500ms', scrapeTimeout: '500ms',
}, },
], ] as Target[],
}, },
}); });
@ -148,6 +148,9 @@ export const sampleApiResponse = Object.freeze({
lastScrape: '2019-11-04T11:52:14.759299-07:00', lastScrape: '2019-11-04T11:52:14.759299-07:00',
lastScrapeDuration: 36560147, lastScrapeDuration: 36560147,
health: 'up', health: 'up',
globalUrl: 'http://localhost.localdomain:9000/metrics',
scrapeInterval: '15s',
scrapeTimeout: '500ms',
}, },
{ {
discoveredLabels: { discoveredLabels: {
@ -167,6 +170,9 @@ export const sampleApiResponse = Object.freeze({
lastScrape: '2019-11-04T11:52:24.731096-07:00', lastScrape: '2019-11-04T11:52:24.731096-07:00',
lastScrapeDuration: 49448763, lastScrapeDuration: 49448763,
health: 'up', health: 'up',
globalUrl: 'http://localhost.localdomain:9000/metrics',
scrapeInterval: '15s',
scrapeTimeout: '500ms',
}, },
{ {
discoveredLabels: { discoveredLabels: {
@ -186,6 +192,9 @@ export const sampleApiResponse = Object.freeze({
lastScrape: '2019-11-04T11:52:13.516654-07:00', lastScrape: '2019-11-04T11:52:13.516654-07:00',
lastScrapeDuration: 120916592, lastScrapeDuration: 120916592,
health: 'up', health: 'up',
globalUrl: 'http://localhost.localdomain:9000/metrics',
scrapeInterval: '15s',
scrapeTimeout: '500ms',
}, },
{ {
discoveredLabels: { discoveredLabels: {
@ -204,6 +213,9 @@ export const sampleApiResponse = Object.freeze({
lastScrape: '2019-11-04T11:52:14.145703-07:00', lastScrape: '2019-11-04T11:52:14.145703-07:00',
lastScrapeDuration: 3842307, lastScrapeDuration: 3842307,
health: 'up', health: 'up',
globalUrl: 'http://localhost.localdomain:9000/metrics',
scrapeInterval: '15s',
scrapeTimeout: '500ms',
}, },
{ {
discoveredLabels: { discoveredLabels: {
@ -222,7 +234,10 @@ export const sampleApiResponse = Object.freeze({
lastScrape: '2019-11-04T11:52:18.479731-07:00', lastScrape: '2019-11-04T11:52:18.479731-07:00',
lastScrapeDuration: 4050976, lastScrapeDuration: 4050976,
health: 'up', health: 'up',
globalUrl: 'http://localhost.localdomain:9000/metrics',
scrapeInterval: '15s',
scrapeTimeout: '500ms',
}, },
], ] as Target[],
}, },
}); });