-
{type}
-
{title}
+
+
+ {type}
+ {title}
+
+
+ {tags?.map(tag => (
+
+ ))}
+
+ {description}
+
+
+
-
- {tags?.map(tag => (
-
- ))}
-
- {description}
-
-
-
-
-
-
-
+
+
);
};
diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json
index a288268670..0ea28e38a9 100644
--- a/plugins/tech-radar/package.json
+++ b/plugins/tech-radar/package.json
@@ -27,7 +27,6 @@
"@material-ui/core": "^4.9.1",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.45",
- "@types/react": "^16.9",
"color": "^3.1.2",
"d3-force": "^2.0.1",
"prop-types": "^15.7.2",
@@ -43,6 +42,7 @@
"@testing-library/user-event": "^12.0.7",
"@types/color": "^3.0.1",
"@types/d3-force": "^1.2.1",
+ "@types/react": "^16.9",
"@types/jest": "^25.2.2",
"@types/node": "^12.0.0",
"jest-fetch-mock": "^3.0.3"
diff --git a/plugins/tech-radar/src/api.ts b/plugins/tech-radar/src/api.ts
index 3dec964ddb..856cf4ff3c 100644
--- a/plugins/tech-radar/src/api.ts
+++ b/plugins/tech-radar/src/api.ts
@@ -15,6 +15,7 @@
*/
import { createApiRef } from '@backstage/core';
+import { MovedState } from './utils/types';
/**
* Types related to the Radar's visualization.
@@ -34,7 +35,7 @@ export interface RadarQuadrant {
export interface RadarEntry {
key: string; // react key
id: string;
- moved: number;
+ moved: MovedState;
quadrant: RadarQuadrant;
ring: RadarRing;
title: string;
diff --git a/plugins/tech-radar/src/components/Radar/Radar.test.tsx b/plugins/tech-radar/src/components/Radar/Radar.test.tsx
index 469f0d85cf..f0ad0d66ed 100644
--- a/plugins/tech-radar/src/components/Radar/Radar.test.tsx
+++ b/plugins/tech-radar/src/components/Radar/Radar.test.tsx
@@ -20,9 +20,9 @@ import { ThemeProvider } from '@material-ui/core';
import { lightTheme } from '@backstage/theme';
import GetBBoxPolyfill from '../../utils/polyfills/getBBox';
-import Radar from './Radar';
+import Radar, { Props } from './Radar';
-const minProps = {
+const minProps: Props = {
width: 500,
height: 200,
quadrants: [{ id: 'languages', name: 'Languages' }],
diff --git a/plugins/tech-radar/src/components/Radar/Radar.tsx b/plugins/tech-radar/src/components/Radar/Radar.tsx
index 1db655730d..124e8bb68a 100644
--- a/plugins/tech-radar/src/components/Radar/Radar.tsx
+++ b/plugins/tech-radar/src/components/Radar/Radar.tsx
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-import React, { FC, useState, useRef } from 'react';
+import React, { useState, useRef } from 'react';
import RadarPlot from '../RadarPlot';
-import { Ring, Quadrant, Entry } from '../../utils/types';
+import type { Ring, Quadrant, Entry } from '../../utils/types';
import { adjustQuadrants, adjustRings, adjustEntries } from './utils';
-type Props = {
+export type Props = {
width: number;
height: number;
quadrants: Quadrant[];
@@ -28,17 +28,17 @@ type Props = {
svgProps?: object;
};
-const Radar: FC
= props => {
+const Radar = (props: Props): JSX.Element => {
const { width, height, quadrants, rings, entries } = props;
const radius = Math.min(width, height) / 2;
- const [activeEntry, setActiveEntry] = useState();
+ const [activeEntry, setActiveEntry] = useState();
const node = useRef(null);
// TODO(dflemstr): most of this can be heavily memoized if performance becomes a problem
adjustQuadrants(quadrants, radius, width, height);
adjustRings(rings, radius);
- adjustEntries(entries, activeEntry, quadrants, rings, radius);
+ adjustEntries(entries, quadrants, rings, radius, activeEntry);
return (
);
diff --git a/plugins/tech-radar/src/components/Radar/utils.ts b/plugins/tech-radar/src/components/Radar/utils.ts
index a8896ddf31..d7a826543c 100644
--- a/plugins/tech-radar/src/components/Radar/utils.ts
+++ b/plugins/tech-radar/src/components/Radar/utils.ts
@@ -17,7 +17,7 @@
import color from 'color';
import { forceCollide, forceSimulation } from 'd3-force';
import Segment from '../../utils/segment';
-import { Ring, Quadrant, Entry } from '../../utils/types';
+import type { Ring, Quadrant, Entry } from '../../utils/types';
export const adjustQuadrants = (
quadrants: Quadrant[],
@@ -81,14 +81,14 @@ export const adjustQuadrants = (
},
];
- quadrants.forEach((quadrant, idx) => {
- const legendParam = legendParams[idx % 4];
+ quadrants.forEach((quadrant, index) => {
+ const legendParam = legendParams[index % 4];
- quadrant.idx = idx;
- quadrant.radialMin = (idx * Math.PI) / 2;
- quadrant.radialMax = ((idx + 1) * Math.PI) / 2;
- quadrant.offsetX = idx % 4 === 0 || idx % 4 === 3 ? 1 : -1;
- quadrant.offsetY = idx % 4 === 0 || idx % 4 === 1 ? 1 : -1;
+ quadrant.index = index;
+ quadrant.radialMin = (index * Math.PI) / 2;
+ quadrant.radialMax = ((index + 1) * Math.PI) / 2;
+ quadrant.offsetX = index % 4 === 0 || index % 4 === 3 ? 1 : -1;
+ quadrant.offsetY = index % 4 === 0 || index % 4 === 1 ? 1 : -1;
quadrant.legendX = legendParam.x;
quadrant.legendY = legendParam.y;
quadrant.legendWidth = legendParam.width;
@@ -98,13 +98,13 @@ export const adjustQuadrants = (
export const adjustEntries = (
entries: Entry[],
- activeEntry: Entry | null | undefined,
quadrants: Quadrant[],
rings: Ring[],
radius: number,
+ activeEntry?: Entry,
) => {
let seed = 42;
- entries.forEach((entry, idx) => {
+ entries.forEach((entry, index) => {
const quadrant = quadrants.find(q => {
const match =
typeof entry.quadrant === 'object' ? entry.quadrant.id : entry.quadrant;
@@ -124,7 +124,7 @@ export const adjustEntries = (
throw new Error(`Unknown ring ${entry.ring} for entry ${entry.id}!`);
}
- entry.idx = idx;
+ entry.index = index;
entry.quadrant = quadrant;
entry.ring = ring;
entry.segment = new Segment(quadrant, ring, radius, () => seed++);
@@ -163,10 +163,10 @@ export const adjustEntries = (
};
export const adjustRings = (rings: Ring[], radius: number) => {
- rings.forEach((ring, idx) => {
- ring.idx = idx;
- ring.outerRadius = ((idx + 2) / (rings.length + 1)) * radius;
+ rings.forEach((ring, index) => {
+ ring.index = index;
+ ring.outerRadius = ((index + 2) / (rings.length + 1)) * radius;
ring.innerRadius =
- ((idx === 0 ? 0 : idx + 1) / (rings.length + 1)) * radius;
+ ((index === 0 ? 0 : index + 1) / (rings.length + 1)) * radius;
});
};
diff --git a/plugins/tech-radar/src/components/RadarBubble/RadarBubble.test.tsx b/plugins/tech-radar/src/components/RadarBubble/RadarBubble.test.tsx
new file mode 100644
index 0000000000..d56ca743c2
--- /dev/null
+++ b/plugins/tech-radar/src/components/RadarBubble/RadarBubble.test.tsx
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { render } from '@testing-library/react';
+import { ThemeProvider } from '@material-ui/core';
+import { lightTheme } from '@backstage/theme';
+import GetBBoxPolyfill from '../../utils/polyfills/getBBox';
+
+import RadarBubble, { Props } from './RadarBubble';
+
+const minProps: Props = {
+ visible: true,
+ text: 'RadarBubble',
+ x: 2,
+ y: 2,
+};
+
+describe('RadarBubble', () => {
+ beforeAll(() => {
+ GetBBoxPolyfill.create(0, 0, 1000, 500);
+ });
+
+ afterAll(() => {
+ GetBBoxPolyfill.remove();
+ });
+
+ it('should render', () => {
+ const rendered = render(
+
+
+ ,
+ );
+
+ expect(rendered.getByText(minProps.text)).toBeInTheDocument();
+ });
+});
diff --git a/plugins/tech-radar/src/components/RadarBubble/RadarBubble.tsx b/plugins/tech-radar/src/components/RadarBubble/RadarBubble.tsx
index dcf9a37ed7..abaed92253 100644
--- a/plugins/tech-radar/src/components/RadarBubble/RadarBubble.tsx
+++ b/plugins/tech-radar/src/components/RadarBubble/RadarBubble.tsx
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-import React, { FC, useRef, useLayoutEffect } from 'react';
+import React, { useRef, useLayoutEffect } from 'react';
import { makeStyles, Theme } from '@material-ui/core';
-type Props = {
+export type Props = {
visible: boolean;
text: string;
x: number;
@@ -46,7 +46,7 @@ const useStyles = makeStyles(() => ({
},
}));
-const RadarBubble: FC = props => {
+const RadarBubble = (props: Props): JSX.Element => {
const classes = useStyles(props);
const { visible, text } = props;
@@ -98,6 +98,7 @@ const RadarBubble: FC = props => {
x={0}
y={0}
className={visible ? classes.visibleBubble : classes.bubble}
+ data-testid="radar-bubble"
>
diff --git a/plugins/tech-radar/src/components/RadarComponent.tsx b/plugins/tech-radar/src/components/RadarComponent.tsx
index 981d1f1369..99190202b9 100644
--- a/plugins/tech-radar/src/components/RadarComponent.tsx
+++ b/plugins/tech-radar/src/components/RadarComponent.tsx
@@ -14,50 +14,38 @@
* limitations under the License.
*/
-import React, { useEffect, useState, FC } from 'react';
+import React, { useEffect } from 'react';
import { Progress, useApi, errorApiRef, ErrorApi } from '@backstage/core';
+import { useAsync } from 'react-use';
import Radar from '../components/Radar';
import { TechRadarComponentProps, TechRadarLoaderResponse } from '../api';
import getSampleData from '../sampleData';
const useTechRadarLoader = (props: TechRadarComponentProps) => {
const errorApi = useApi(errorApiRef);
- const [state, setState] = useState<{
- loading: boolean;
- error?: Error;
- data?: TechRadarLoaderResponse;
- }>({
- loading: true,
- error: undefined,
- data: undefined,
- });
const { getData } = props;
- useEffect(() => {
- if (!getData) {
- return;
+ const state = useAsync(async () => {
+ if (getData) {
+ const response: TechRadarLoaderResponse = await getData();
+ return response;
}
-
- getData()
- .then((payload: TechRadarLoaderResponse) => {
- setState({ loading: false, error: undefined, data: payload });
- })
- .catch((err: Error) => {
- errorApi.post(err);
- setState({
- loading: false,
- error: err,
- data: undefined,
- });
- });
+ return undefined;
}, [getData, errorApi]);
+ useEffect(() => {
+ const { error } = state;
+ if (error) {
+ errorApi.post(error);
+ }
+ }, [errorApi, state]);
+
return state;
};
-const RadarComponent: FC = props => {
- const { loading, error, data } = useTechRadarLoader(props);
+const RadarComponent = (props: TechRadarComponentProps): JSX.Element => {
+ const { loading, error, value: data } = useTechRadarLoader(props);
return (
<>
diff --git a/plugins/tech-radar/src/components/RadarEntry/RadarEntry.test.tsx b/plugins/tech-radar/src/components/RadarEntry/RadarEntry.test.tsx
new file mode 100644
index 0000000000..2d24f301d1
--- /dev/null
+++ b/plugins/tech-radar/src/components/RadarEntry/RadarEntry.test.tsx
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { render } from '@testing-library/react';
+import { ThemeProvider } from '@material-ui/core';
+import { lightTheme } from '@backstage/theme';
+import GetBBoxPolyfill from '../../utils/polyfills/getBBox';
+
+import RadarEntry, { Props } from './RadarEntry';
+
+const minProps: Props = {
+ x: 2,
+ y: 2,
+ value: 2,
+ color: 'red',
+};
+
+describe('RadarEntry', () => {
+ beforeAll(() => {
+ GetBBoxPolyfill.create(0, 0, 1000, 500);
+ });
+
+ afterAll(() => {
+ GetBBoxPolyfill.remove();
+ });
+
+ it('should render', () => {
+ const rendered = render(
+
+
+ ,
+ );
+
+ const radarEntry = rendered.getByTestId('radar-entry');
+ const { x, y } = minProps;
+ expect(radarEntry).toBeInTheDocument();
+ expect(radarEntry.getAttribute('transform')).toBe(`translate(${x}, ${y})`);
+ expect(rendered.getByText(String(minProps.value))).toBeInTheDocument();
+ });
+});
diff --git a/plugins/tech-radar/src/components/RadarEntry/RadarEntry.tsx b/plugins/tech-radar/src/components/RadarEntry/RadarEntry.tsx
index 6006979e67..29d35e01e2 100644
--- a/plugins/tech-radar/src/components/RadarEntry/RadarEntry.tsx
+++ b/plugins/tech-radar/src/components/RadarEntry/RadarEntry.tsx
@@ -14,13 +14,14 @@
* limitations under the License.
*/
-import React, { FC } from 'react';
+import React from 'react';
import { makeStyles, Theme } from '@material-ui/core';
+import { WithLink } from '../../utils/components';
-type Props = {
+export type Props = {
x: number;
y: number;
- number: number;
+ value: number;
color: string;
url?: string;
moved?: number;
@@ -43,14 +44,27 @@ const useStyles = makeStyles(() => ({
},
}));
-const RadarEntry: FC = props => {
+const makeBlip = (color: string, moved?: number) => {
+ const style = { fill: color };
+
+ let blip = ;
+ if (moved && moved > 0) {
+ blip = ; // triangle pointing up
+ } else if (moved && moved < 0) {
+ blip = ; // triangle pointing down
+ }
+
+ return blip;
+};
+
+const RadarEntry = (props: Props): JSX.Element => {
const classes = useStyles(props);
const {
moved,
color,
url,
- number,
+ value,
x,
y,
onMouseEnter,
@@ -58,24 +72,7 @@ const RadarEntry: FC = props => {
onClick,
} = props;
- const style = { fill: color };
-
- let blip;
- if (moved && moved > 0) {
- blip = ; // triangle pointing up
- } else if (moved && moved < 0) {
- blip = ; // triangle pointing down
- } else {
- blip = ;
- }
-
- if (url) {
- blip = (
-
- {blip}
-
- );
- }
+ const blip = makeBlip(color, moved);
return (
= props => {
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
onClick={onClick}
+ data-testid="radar-entry"
>
- {blip}
+
+ {blip}
+
- {number}
+ {value}
);
diff --git a/plugins/tech-radar/src/components/RadarFooter/RadarFooter.test.tsx b/plugins/tech-radar/src/components/RadarFooter/RadarFooter.test.tsx
new file mode 100644
index 0000000000..77f21b6e63
--- /dev/null
+++ b/plugins/tech-radar/src/components/RadarFooter/RadarFooter.test.tsx
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { render } from '@testing-library/react';
+import { ThemeProvider } from '@material-ui/core';
+import { lightTheme } from '@backstage/theme';
+import GetBBoxPolyfill from '../../utils/polyfills/getBBox';
+
+import RadarFooter, { Props } from './RadarFooter';
+
+const minProps: Props = {
+ x: 2,
+ y: 2,
+};
+
+describe('RadarFooter', () => {
+ beforeAll(() => {
+ GetBBoxPolyfill.create(0, 0, 1000, 500);
+ });
+
+ afterAll(() => {
+ GetBBoxPolyfill.remove();
+ });
+
+ it('should render', () => {
+ const rendered = render(
+
+
+ ,
+ );
+ const radarFooter = rendered.getByTestId('radar-footer');
+ const { x, y } = minProps;
+ expect(radarFooter).toBeInTheDocument();
+ expect(radarFooter.getAttribute('transform')).toBe(`translate(${x}, ${y})`);
+ });
+});
diff --git a/plugins/tech-radar/src/components/RadarFooter/RadarFooter.tsx b/plugins/tech-radar/src/components/RadarFooter/RadarFooter.tsx
index 7d60a63f59..ced1ab8054 100644
--- a/plugins/tech-radar/src/components/RadarFooter/RadarFooter.tsx
+++ b/plugins/tech-radar/src/components/RadarFooter/RadarFooter.tsx
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-import React, { FC } from 'react';
+import React from 'react';
import { makeStyles, Theme } from '@material-ui/core';
-type Props = {
+export type Props = {
x: number;
y: number;
};
@@ -31,12 +31,16 @@ const useStyles = makeStyles(() => ({
},
}));
-const RadarFooter: FC = props => {
+const RadarFooter = (props: Props): JSX.Element => {
const { x, y } = props;
const classes = useStyles(props);
return (
-
+
{'▲ moved up\u00a0\u00a0\u00a0\u00a0\u00a0▼ moved down'}
);
diff --git a/plugins/tech-radar/src/components/RadarGrid/RadarGrid.test.tsx b/plugins/tech-radar/src/components/RadarGrid/RadarGrid.test.tsx
new file mode 100644
index 0000000000..3027cc4adb
--- /dev/null
+++ b/plugins/tech-radar/src/components/RadarGrid/RadarGrid.test.tsx
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { render } from '@testing-library/react';
+import { ThemeProvider } from '@material-ui/core';
+import { lightTheme } from '@backstage/theme';
+import GetBBoxPolyfill from '../../utils/polyfills/getBBox';
+
+import RadarGrid, { Props } from './RadarGrid';
+
+const minProps: Props = {
+ radius: 5,
+ rings: [{ id: 'use', name: 'USE', color: '#93c47d' }],
+};
+
+describe('RadarGrid', () => {
+ beforeAll(() => {
+ GetBBoxPolyfill.create(0, 0, 1000, 500);
+ });
+
+ afterAll(() => {
+ GetBBoxPolyfill.remove();
+ });
+
+ it('should render', () => {
+ const rendered = render(
+
+
+ ,
+ );
+
+ expect(rendered.getByTestId('radar-grid-x-line')).toBeInTheDocument();
+ expect(rendered.getByTestId('radar-grid-y-line')).toBeInTheDocument();
+ });
+});
diff --git a/plugins/tech-radar/src/components/RadarGrid/RadarGrid.tsx b/plugins/tech-radar/src/components/RadarGrid/RadarGrid.tsx
index 514afbe958..eae85d4e64 100644
--- a/plugins/tech-radar/src/components/RadarGrid/RadarGrid.tsx
+++ b/plugins/tech-radar/src/components/RadarGrid/RadarGrid.tsx
@@ -16,9 +16,9 @@
import React from 'react';
import { makeStyles, Theme } from '@material-ui/core';
-import { Ring } from '../../utils/types';
+import type { Ring } from '../../utils/types';
-type Props = {
+export type Props = {
radius: number;
rings: Ring[];
};
@@ -49,7 +49,7 @@ const RadarGrid = (props: Props) => {
const { radius, rings } = props;
const classes = useStyles(props);
- const makeRingNode = (ringRadius: number | undefined, ringIndex: number) => [
+ const makeRingNode = (ringIndex: number, ringRadius?: number) => [
{
x2={0}
y2={radius}
className={classes.axis}
+ data-testid="radar-grid-x-line"
/>,
// Y axis
{
x2={radius}
y2={0}
className={classes.axis}
+ data-testid="radar-grid-y-line"
/>,
];
- const ringNodes = rings.map(r => r.outerRadius).map(makeRingNode);
+ const ringNodes = rings
+ .map(r => r.outerRadius)
+ .map((ringRadius, ringIndex) => makeRingNode(ringIndex, ringRadius));
return <>{axisNodes.concat(...ringNodes)}>;
};
diff --git a/plugins/tech-radar/src/components/RadarLegend/RadarLegend.test.tsx b/plugins/tech-radar/src/components/RadarLegend/RadarLegend.test.tsx
new file mode 100644
index 0000000000..68bfe892ea
--- /dev/null
+++ b/plugins/tech-radar/src/components/RadarLegend/RadarLegend.test.tsx
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { render } from '@testing-library/react';
+import { ThemeProvider } from '@material-ui/core';
+import { lightTheme } from '@backstage/theme';
+import GetBBoxPolyfill from '../../utils/polyfills/getBBox';
+
+import RadarLegend, { Props } from './RadarLegend';
+
+const minProps: Props = {
+ quadrants: [{ id: 'languages', name: 'Languages' }],
+ rings: [{ id: 'use', name: 'USE', color: '#93c47d' }],
+ entries: [
+ {
+ id: 'typescript',
+ title: 'TypeScript',
+ quadrant: { id: 'languages', name: 'Languages' },
+ moved: 0,
+ ring: { id: 'use', name: 'USE', color: '#93c47d' },
+ url: '#',
+ },
+ ],
+};
+
+describe('RadarLegend', () => {
+ beforeAll(() => {
+ GetBBoxPolyfill.create(0, 0, 1000, 500);
+ });
+
+ afterAll(() => {
+ GetBBoxPolyfill.remove();
+ });
+
+ it('should render', () => {
+ const rendered = render(
+
+
+ ,
+ );
+
+ expect(rendered.getByTestId('radar-legend')).toBeInTheDocument();
+ expect(rendered.getAllByTestId('radar-quadrant')).toHaveLength(1);
+ expect(rendered.getAllByTestId('radar-ring')).toHaveLength(1);
+ });
+});
diff --git a/plugins/tech-radar/src/components/RadarLegend/RadarLegend.tsx b/plugins/tech-radar/src/components/RadarLegend/RadarLegend.tsx
index 03146a8071..e319846d78 100644
--- a/plugins/tech-radar/src/components/RadarLegend/RadarLegend.tsx
+++ b/plugins/tech-radar/src/components/RadarLegend/RadarLegend.tsx
@@ -13,15 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import React, { FC } from 'react';
+import React from 'react';
import { makeStyles, Theme } from '@material-ui/core';
-import { Quadrant, Ring, Entry } from '../../utils/types';
+import type { Quadrant, Ring, Entry } from '../../utils/types';
+import { WithLink } from '../../utils/components';
type Segments = {
[k: number]: { [k: number]: Entry[] };
};
-type Props = {
+export type Props = {
quadrants: Quadrant[];
rings: Ring[];
entries: Entry[];
@@ -29,7 +30,7 @@ type Props = {
onEntryMouseLeave?: (entry: Entry) => void;
};
-const useStyles = makeStyles(() => ({
+const useStyles = makeStyles(theme => ({
quadrant: {
height: '100%',
width: '100%',
@@ -40,7 +41,7 @@ const useStyles = makeStyles(() => ({
pointerEvents: 'none',
userSelect: 'none',
marginTop: 0,
- marginBottom: 'calc(18px * 0.375)',
+ marginBottom: theme.spacing(8 / (18 * 0.375)),
fontSize: '18px',
},
rings: {
@@ -56,7 +57,7 @@ const useStyles = makeStyles(() => ({
pointerEvents: 'none',
userSelect: 'none',
marginTop: 0,
- marginBottom: 'calc(12px * 0.375)',
+ marginBottom: theme.spacing(8 / (12 * 0.375)),
fontSize: '12px',
fontWeight: 800,
},
@@ -79,73 +80,81 @@ const useStyles = makeStyles(() => ({
},
}));
-const RadarLegend: FC = props => {
+const RadarLegend = (props: Props): JSX.Element => {
const classes = useStyles(props);
- const _getSegment = (
+ const getSegment = (
segmented: Segments,
quadrant: Quadrant,
ring: Ring,
ringOffset = 0,
) => {
- const qidx = quadrant.idx;
- const ridx = ring.idx;
- const segmentedData = qidx === undefined ? {} : segmented[qidx] || {};
- return ridx === undefined ? [] : segmentedData[ridx + ringOffset] || [];
+ const quadrantIndex = quadrant.index;
+ const ringIndex = ring.index;
+ const segmentedData =
+ quadrantIndex === undefined ? {} : segmented[quadrantIndex] || {};
+ return ringIndex === undefined
+ ? []
+ : segmentedData[ringIndex + ringOffset] || [];
};
- const _renderRing = (
- ring: Ring,
- entries: Entry[],
- onEntryMouseEnter?: Props['onEntryMouseEnter'],
- onEntryMouseLeave?: Props['onEntryMouseEnter'],
- ) => {
+ type RadarLegendRingProps = {
+ ring: Ring;
+ entries: Entry[];
+ onEntryMouseEnter?: Props['onEntryMouseEnter'];
+ onEntryMouseLeave?: Props['onEntryMouseEnter'];
+ };
+
+ const RadarLegendRing = ({
+ ring,
+ entries,
+ onEntryMouseEnter,
+ onEntryMouseLeave,
+ }: RadarLegendRingProps) => {
return (
-
+
{ring.name}
{entries.length === 0 ? (
(empty)
) : (
- {entries.map(entry => {
- let node = {entry.title};
-
- if (entry.url) {
- node = (
-
- {node}
-
- );
- }
-
- return (
- - onEntryMouseEnter(entry))
- }
- onMouseLeave={
- onEntryMouseLeave && (() => onEntryMouseLeave(entry))
- }
- >
- {node}
-
- );
- })}
+ {entries.map(entry => (
+ - onEntryMouseEnter(entry))
+ }
+ onMouseLeave={
+ onEntryMouseLeave && (() => onEntryMouseLeave(entry))
+ }
+ >
+
+ {entry.title}
+
+
+ ))}
)}
);
};
- const _renderQuadrant = (
- segments: Segments,
- quadrant: Quadrant,
- rings: Ring[],
- onEntryMouseEnter: Props['onEntryMouseEnter'],
- onEntryMouseLeave: Props['onEntryMouseLeave'],
- ) => {
+ type RadarLegendQuadrantProps = {
+ segments: Segments;
+ quadrant: Quadrant;
+ rings: Ring[];
+ onEntryMouseEnter: Props['onEntryMouseEnter'];
+ onEntryMouseLeave: Props['onEntryMouseLeave'];
+ };
+
+ const RadarLegendQuadrant = ({
+ segments,
+ quadrant,
+ rings,
+ onEntryMouseEnter,
+ onEntryMouseLeave,
+ }: RadarLegendQuadrantProps) => {
return (
= props => {
y={quadrant.legendY}
width={quadrant.legendWidth}
height={quadrant.legendHeight}
+ data-testid="radar-quadrant"
>
{quadrant.name}
- {rings.map(ring =>
- _renderRing(
- ring,
- _getSegment(segments, quadrant, ring),
- onEntryMouseEnter,
- onEntryMouseLeave,
- ),
- )}
+ {rings.map(ring => (
+
+ ))}
);
};
- const _setupSegments = (entries: Entry[]) => {
+ const setupSegments = (entries: Entry[]) => {
const segments: Segments = {};
for (const entry of entries) {
- const qidx = entry.quadrant.idx;
- const ridx = entry.ring.idx;
+ const quadrantIndex = entry.quadrant.index;
+ const ringIndex = entry.ring.index;
let quadrantData: { [k: number]: Entry[] } = {};
- if (qidx !== undefined) {
- if (segments[qidx] === undefined) {
- segments[qidx] = {};
+ if (quadrantIndex !== undefined) {
+ if (segments[quadrantIndex] === undefined) {
+ segments[quadrantIndex] = {};
}
- quadrantData = segments[qidx];
+ quadrantData = segments[quadrantIndex];
}
let ringData = [];
- if (ridx !== undefined) {
- if (quadrantData[ridx] === undefined) {
- quadrantData[ridx] = [];
+ if (ringIndex !== undefined) {
+ if (quadrantData[ringIndex] === undefined) {
+ quadrantData[ringIndex] = [];
}
- ringData = quadrantData[ridx];
+ ringData = quadrantData[ringIndex];
}
ringData.push(entry);
@@ -209,19 +220,20 @@ const RadarLegend: FC
= props => {
onEntryMouseLeave,
} = props;
- const segments: Segments = _setupSegments(entries);
+ const segments: Segments = setupSegments(entries);
return (
-
- {quadrants.map(quadrant =>
- _renderQuadrant(
- segments,
- quadrant,
- rings,
- onEntryMouseEnter,
- onEntryMouseLeave,
- ),
- )}
+
+ {quadrants.map(quadrant => (
+
+ ))}
);
};
diff --git a/plugins/tech-radar/src/components/RadarPage.tsx b/plugins/tech-radar/src/components/RadarPage.tsx
index 4c7236e01f..1aefb72eca 100644
--- a/plugins/tech-radar/src/components/RadarPage.tsx
+++ b/plugins/tech-radar/src/components/RadarPage.tsx
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import React, { FC } from 'react';
+import React from 'react';
import { Grid } from '@material-ui/core';
import {
Content,
@@ -29,7 +29,7 @@ import {
import RadarComponent from '../components/RadarComponent';
import { techRadarApiRef, TechRadarApi } from '../api';
-const RadarPage: FC<{}> = () => {
+const RadarPage = (): JSX.Element => {
const techRadarApi = useApi(techRadarApiRef);
return (
diff --git a/plugins/tech-radar/src/components/RadarPlot/RadarPlot.test.tsx b/plugins/tech-radar/src/components/RadarPlot/RadarPlot.test.tsx
new file mode 100644
index 0000000000..5b17578478
--- /dev/null
+++ b/plugins/tech-radar/src/components/RadarPlot/RadarPlot.test.tsx
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react';
+import { render } from '@testing-library/react';
+import { ThemeProvider } from '@material-ui/core';
+import { lightTheme } from '@backstage/theme';
+import GetBBoxPolyfill from '../../utils/polyfills/getBBox';
+
+import RadarPlot, { Props } from './RadarPlot';
+
+const minProps: Props = {
+ width: 500,
+ height: 200,
+ radius: 50,
+ quadrants: [{ id: 'languages', name: 'Languages' }],
+ rings: [{ id: 'use', name: 'USE', color: '#93c47d' }],
+ entries: [
+ {
+ id: 'typescript',
+ title: 'TypeScript',
+ quadrant: { id: 'languages', name: 'Languages' },
+ moved: 0,
+ ring: { id: 'use', name: 'USE', color: '#93c47d' },
+ url: '#',
+ },
+ ],
+};
+
+describe('RadarPlot', () => {
+ beforeAll(() => {
+ GetBBoxPolyfill.create(0, 0, 1000, 500);
+ });
+
+ afterAll(() => {
+ GetBBoxPolyfill.remove();
+ });
+
+ it('should render', () => {
+ const rendered = render(
+
+
+ ,
+ );
+
+ expect(rendered.getByTestId('radar-plot')).toBeInTheDocument();
+ expect(rendered.getByTestId('radar-legend')).toBeInTheDocument();
+ expect(rendered.getByTestId('radar-footer')).toBeInTheDocument();
+ expect(rendered.getByTestId('radar-bubble')).toBeInTheDocument();
+ expect(rendered.getAllByTestId('radar-entry')).toHaveLength(1);
+ });
+});
diff --git a/plugins/tech-radar/src/components/RadarPlot/RadarPlot.tsx b/plugins/tech-radar/src/components/RadarPlot/RadarPlot.tsx
index 48ad660dde..7f68ffe021 100644
--- a/plugins/tech-radar/src/components/RadarPlot/RadarPlot.tsx
+++ b/plugins/tech-radar/src/components/RadarPlot/RadarPlot.tsx
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-import React, { FC } from 'react';
-import { Quadrant, Ring, Entry } from '../../utils/types';
+import React from 'react';
+import type { Quadrant, Ring, Entry } from '../../utils/types';
import RadarGrid from '../RadarGrid';
import RadarEntry from '../RadarEntry';
@@ -23,7 +23,7 @@ import RadarBubble from '../RadarBubble';
import RadarFooter from '../RadarFooter';
import RadarLegend from '../RadarLegend';
-type Props = {
+export type Props = {
width: number;
height: number;
radius: number;
@@ -36,7 +36,7 @@ type Props = {
};
// A component that draws the radar circle.
-const RadarPlot: FC = props => {
+const RadarPlot = (props: Props): JSX.Element => {
const {
width,
height,
@@ -50,7 +50,7 @@ const RadarPlot: FC = props => {
} = props;
return (
-
+
= props => {
x={entry.x || 0}
y={entry.y || 0}
color={entry.color || ''}
- number={((entry && entry.idx) || 0) + 1}
+ value={(entry?.index || 0) + 1}
url={entry.url}
moved={entry.moved}
onMouseEnter={onEntryMouseEnter && (() => onEntryMouseEnter(entry))}
@@ -80,9 +80,9 @@ const RadarPlot: FC = props => {
))}
diff --git a/plugins/tech-radar/src/utils/components.tsx b/plugins/tech-radar/src/utils/components.tsx
new file mode 100644
index 0000000000..af5a7b05bd
--- /dev/null
+++ b/plugins/tech-radar/src/utils/components.tsx
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react';
+
+type WithLinkProps = {
+ url?: string;
+ className: string;
+ children: React.ReactNode;
+};
+
+export const WithLink = ({
+ url,
+ className,
+ children,
+}: WithLinkProps): JSX.Element =>
+ url ? (
+
+ {children}
+
+ ) : (
+ <>{children}>
+ );
diff --git a/plugins/tech-radar/src/utils/types.ts b/plugins/tech-radar/src/utils/types.ts
index 14a0554a1f..f3933ee584 100644
--- a/plugins/tech-radar/src/utils/types.ts
+++ b/plugins/tech-radar/src/utils/types.ts
@@ -17,7 +17,7 @@
// Parameters for a ring; its index in an array determines how close to the center this ring is.
export type Ring = {
id: string;
- idx?: number;
+ index?: number;
name: string;
color: string;
outerRadius?: number;
@@ -27,7 +27,7 @@ export type Ring = {
// Parameters for a quadrant (there should be exactly 4 of course)
export type Quadrant = {
id: string;
- idx?: number;
+ index?: number;
name: string;
legendX?: number;
legendY?: number;
@@ -45,9 +45,15 @@ export type Segment = {
random: Function;
};
+export enum MovedState {
+ Down = -1,
+ NoChange = 0,
+ Up = 1,
+}
+
export type Entry = {
id: string;
- idx?: number;
+ index?: number;
x?: number;
y?: number;
color?: string;
@@ -61,7 +67,7 @@ export type Entry = {
// An URL to a longer description as to why this entry is where it is
url?: string;
// How this entry has recently moved; -1 for "down", +1 for "up", 0 for not moved
- moved?: number;
+ moved?: MovedState;
active?: boolean;
};
diff --git a/plugins/techdocs/README.md b/plugins/techdocs/README.md
index 10ddcf9411..36d00fc970 100644
--- a/plugins/techdocs/README.md
+++ b/plugins/techdocs/README.md
@@ -10,7 +10,7 @@ Welcome to the TechDocs plugin - Spotify's docs-like-code approach built directl
## Getting started
-Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/techdocs](http://localhost:3000/techdocs).
+Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/docs](http://localhost:3000/docs).
You can also serve the plugin in isolation by running `yarn start` in the plugin directory.
This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads.
diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json
index 9ef290fa40..ca8e957a46 100644
--- a/plugins/techdocs/package.json
+++ b/plugins/techdocs/package.json
@@ -29,6 +29,8 @@
"@material-ui/lab": "4.0.0-alpha.45",
"react": "^16.13.1",
"react-dom": "^16.13.1",
+ "react-router": "^6.0.0-alpha.5",
+ "react-router-dom": "^6.0.0-alpha.5",
"react-use": "^14.2.0"
},
"devDependencies": {
diff --git a/plugins/techdocs/src/config.js b/plugins/techdocs/src/config.js
new file mode 100644
index 0000000000..296b9fc14c
--- /dev/null
+++ b/plugins/techdocs/src/config.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export const docStorageURL =
+ 'https://techdocs-mock-sites.storage.googleapis.com';
diff --git a/plugins/techdocs/src/plugin.ts b/plugins/techdocs/src/plugin.ts
index 23bfa3b714..89a5ddeb73 100644
--- a/plugins/techdocs/src/plugin.ts
+++ b/plugins/techdocs/src/plugin.ts
@@ -34,6 +34,11 @@ import { Reader } from './reader/components/Reader';
export const rootRouteRef = createRouteRef({
path: '/docs',
+ title: 'TechDocs Landing Page',
+});
+
+export const rootDocsRouteRef = createRouteRef({
+ path: '/docs/:componentId/*',
title: 'Docs',
});
@@ -41,5 +46,6 @@ export const plugin = createPlugin({
id: 'techdocs',
register({ router }) {
router.addRoute(rootRouteRef, Reader);
+ router.addRoute(rootDocsRouteRef, Reader);
},
});
diff --git a/plugins/techdocs/src/reader/components/DocsCard.tsx b/plugins/techdocs/src/reader/components/DocsCard.tsx
new file mode 100644
index 0000000000..68f42bf84a
--- /dev/null
+++ b/plugins/techdocs/src/reader/components/DocsCard.tsx
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { FC } from 'react';
+import { Button, Card, Chip, Typography, makeStyles } from '@material-ui/core';
+
+const useStyles = makeStyles(theme => ({
+ header: {
+ color: theme.palette.common.white,
+ padding: theme.spacing(2, 2, 6),
+ backgroundImage:
+ 'linear-gradient(-137deg, rgb(25, 230, 140) 0%, rgb(29, 127, 110) 100%)',
+ },
+ content: {
+ padding: theme.spacing(2),
+ },
+ description: {
+ height: 175,
+ overflow: 'hidden',
+ textOverflow: 'ellipsis',
+ },
+ footer: {
+ display: 'flex',
+ flexDirection: 'row-reverse',
+ },
+}));
+
+type DocsCardProps = {
+ description: string;
+ tags?: string[];
+ title: string;
+ type?: string;
+ label: string;
+ onClick?: () => void;
+};
+export const DocsCard: FC = ({
+ description,
+ tags,
+ title,
+ type,
+ label,
+ onClick,
+}) => {
+ const classes = useStyles();
+
+ return (
+
+
+ {type ?? {type}}
+ {title}
+
+
+ {tags?.map(tag => (
+
+ ))}
+
+ {description}
+
+
+
+
+
+
+ );
+};
diff --git a/plugins/techdocs/src/reader/components/Reader.tsx b/plugins/techdocs/src/reader/components/Reader.tsx
index e306a72424..a4ff03af47 100644
--- a/plugins/techdocs/src/reader/components/Reader.tsx
+++ b/plugins/techdocs/src/reader/components/Reader.tsx
@@ -16,801 +16,116 @@
import React from 'react';
import { useShadowDom } from '..';
-
-const mockHtml: string = `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Download boilerplate - MkDocs Material Boilerplate
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Download boilerplate
-Git clone
-git clone https://github.com/peaceiris/mkdocs-material-boilerplate.git
-cd mkdocs-material-boilerplate
-
-
-
-Download zip
-wget 'https://github.com/peaceiris/mkdocs-material-boilerplate/archive/master.zip'
-unzip master.zip
-cd mkdocs-material-boilerplate-master
-
-
-
-👉 Click me to download zip
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
+import { useAsync } from 'react-use';
+import { useLocation, useParams, useNavigate } from 'react-router-dom';
+
+import { Grid } from '@material-ui/core';
+import { Header, Content } from '@backstage/core';
+
+import transformer, {
+ addBaseUrl,
+ rewriteDocLinks,
+ addEventListener,
+} from '../transformers';
+import { docStorageURL } from '../../config';
+import URLParser from '../urlParser';
+import { DocsCard } from './DocsCard';
+
+const useFetch = (url: string) => {
+ const state = useAsync(async () => {
+ const response = await fetch(url);
+ const raw = await response.text();
+ return raw;
+ }, [url]);
+
+ return state;
+};
+
+const useEnforcedTrailingSlash = (): void => {
+ React.useEffect(() => {
+ const actualUrl = window.location.href;
+ const expectedUrl = new URLParser(window.location.href, '.').parse();
+
+ if (actualUrl !== expectedUrl) {
+ window.history.replaceState({}, document.title, expectedUrl);
+ }
+ }, []);
+};
export const Reader = () => {
+ const location = useLocation();
+ const { componentId, '*': path } = useParams();
const shadowDomRef = useShadowDom();
+ const navigate = useNavigate();
+ const normalizedUrl = new URLParser(
+ `${docStorageURL}${location.pathname.replace('/docs', '')}`,
+ '.',
+ ).parse();
+ const state = useFetch(`${normalizedUrl}index.html`);
+
+ useEnforcedTrailingSlash();
React.useEffect(() => {
const divElement = shadowDomRef.current;
- if (!divElement?.shadowRoot) {
- return;
+ if (divElement?.shadowRoot && state.value) {
+ const transformedElement = transformer(state.value, [
+ addBaseUrl({
+ docStorageURL,
+ componentId,
+ path,
+ }),
+ rewriteDocLinks({
+ componentId,
+ }),
+ ]);
+
+ divElement.shadowRoot.innerHTML = '';
+ if (transformedElement) {
+ divElement.shadowRoot.appendChild(transformedElement);
+ transformer(divElement.shadowRoot.children[0], [
+ addEventListener({
+ onClick: navigate,
+ }),
+ ]);
+ }
}
- divElement.shadowRoot.innerHTML = mockHtml;
- }, [shadowDomRef]);
+ }, [shadowDomRef, state, componentId, path, navigate]);
return (
<>
- Shadow DOM should be underneath
-
+ {componentId ? (
+
+ ) : (
+ <>
+
+
+
+
+
+ navigate('/docs/mkdocs')}
+ tags={['Developer Tool']}
+ title="MkDocs"
+ label="Read Docs"
+ description="MkDocs is a fast, simple and downright gorgeous static site generator that's geared towards building project documentation. "
+ />
+
+
+ navigate('/docs/backstage-microsite')}
+ tags={['Service']}
+ title="Backstage"
+ label="Read Docs"
+ description="Getting started guides, API Overview, documentation around how to Create a Plugin and more. "
+ />
+
+
+
+ >
+ )}
>
);
};
diff --git a/plugins/techdocs/src/reader/transformers/addBaseUrl.ts b/plugins/techdocs/src/reader/transformers/addBaseUrl.ts
new file mode 100644
index 0000000000..653f0b2f71
--- /dev/null
+++ b/plugins/techdocs/src/reader/transformers/addBaseUrl.ts
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import URLParser from '../urlParser';
+import type { Transformer } from './index';
+
+type AddBaseUrlOptions = {
+ docStorageURL: string;
+ componentId: string;
+ path: string;
+};
+
+export const addBaseUrl = ({
+ docStorageURL,
+ componentId,
+ path,
+}: AddBaseUrlOptions): Transformer => {
+ return dom => {
+ const updateDom = (
+ list: HTMLCollectionOf | NodeListOf,
+ attributeName: string,
+ ): void => {
+ Array.from(list)
+ .filter(elem => !!elem.getAttribute(attributeName))
+ .forEach((elem: T) => {
+ const newUrl = new URLParser(
+ `${docStorageURL}/${componentId}/${path}`,
+ elem.getAttribute(attributeName)!,
+ ).parse();
+ elem.setAttribute(attributeName, newUrl);
+ });
+ };
+
+ updateDom(dom.querySelectorAll('img'), 'src');
+ updateDom(dom.querySelectorAll('script'), 'src');
+ updateDom(dom.querySelectorAll('link'), 'href');
+
+ return dom;
+ };
+};
diff --git a/plugins/techdocs/src/reader/transformers/addEventListener.ts b/plugins/techdocs/src/reader/transformers/addEventListener.ts
new file mode 100644
index 0000000000..32b9d6b0b9
--- /dev/null
+++ b/plugins/techdocs/src/reader/transformers/addEventListener.ts
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import type { Transformer } from './index';
+
+type AddEventListenerOptions = {
+ onClick: (newUrl: string) => void;
+};
+
+export const addEventListener = ({
+ onClick,
+}: AddEventListenerOptions): Transformer => {
+ return dom => {
+ Array.from(dom.getElementsByTagName('a')).forEach(elem => {
+ elem.addEventListener('click', (e: MouseEvent) => {
+ e.preventDefault();
+ const target = e.target as HTMLAnchorElement;
+ if (target?.getAttribute('href')) {
+ onClick(
+ target.getAttribute('href')!.replace(window.location.origin, ''),
+ );
+ }
+ });
+ });
+
+ return dom;
+ };
+};
diff --git a/plugins/techdocs/src/reader/transformers/index.ts b/plugins/techdocs/src/reader/transformers/index.ts
new file mode 100644
index 0000000000..64c5527fe7
--- /dev/null
+++ b/plugins/techdocs/src/reader/transformers/index.ts
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export * from './addBaseUrl';
+export * from './rewriteDocLinks';
+export * from './addEventListener';
+
+export type Transformer = (dom: Element) => Element;
+
+function transform(
+ html: string | Element,
+ transformers: Transformer[],
+): Element {
+ let dom: Element;
+
+ if (typeof html === 'string') {
+ dom = new DOMParser().parseFromString(html, 'text/html').documentElement;
+ } else if (html instanceof Element) {
+ dom = html;
+ } else {
+ throw new Error('dom is not a recognized type');
+ }
+
+ transformers.forEach(transformer => transformer(dom));
+
+ return dom;
+}
+
+export default transform;
diff --git a/plugins/techdocs/src/reader/transformers/rewriteDocLinks.ts b/plugins/techdocs/src/reader/transformers/rewriteDocLinks.ts
new file mode 100644
index 0000000000..3f80dbe4e9
--- /dev/null
+++ b/plugins/techdocs/src/reader/transformers/rewriteDocLinks.ts
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import URLParser from '../urlParser';
+import type { Transformer } from './index';
+
+type AddBaseUrlOptions = {};
+
+export const rewriteDocLinks = ({}: AddBaseUrlOptions): Transformer => {
+ return dom => {
+ const updateDom = (
+ list: Array,
+ attributeName: string,
+ ): void => {
+ Array.from(list)
+ .filter(elem => elem.hasAttribute(attributeName))
+ .forEach((elem: T) => {
+ elem.setAttribute(
+ attributeName,
+ new URLParser(
+ window.location.href,
+ elem.getAttribute(attributeName)!,
+ ).parse(),
+ );
+ });
+ };
+
+ updateDom(Array.from(dom.getElementsByTagName('a')), 'href');
+
+ return dom;
+ };
+};
diff --git a/plugins/techdocs/src/reader/urlParser.test.ts b/plugins/techdocs/src/reader/urlParser.test.ts
new file mode 100644
index 0000000000..4322fc42e1
--- /dev/null
+++ b/plugins/techdocs/src/reader/urlParser.test.ts
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import URLParser from './urlParser';
+
+describe('URLParser', () => {
+ it('should not change an absolute url', () => {
+ const urlParser = new URLParser(
+ 'https://www.google.com/',
+ 'https://www.mkdocs.org/',
+ );
+
+ expect(urlParser.parse()).toEqual('https://www.mkdocs.org/');
+ });
+
+ it('should convert a relative url to an absolute url', () => {
+ const urlParser = new URLParser(
+ 'https://www.mkdocs.org/user-guide/getting-started/',
+ '../../support/installing/',
+ );
+
+ expect(urlParser.parse()).toEqual(
+ 'https://www.mkdocs.org/support/installing/',
+ );
+ });
+
+ it('should add a trailing slash', () => {
+ const urlParser = new URLParser(
+ 'https://www.mkdocs.org/user-guide/getting-started',
+ '.',
+ );
+
+ expect(urlParser.parse()).toEqual(
+ 'https://www.mkdocs.org/user-guide/getting-started/',
+ );
+ });
+
+ it('should not add a trailing slash', () => {
+ const urlParser = new URLParser(
+ 'https://www.mkdocs.org/user-guide/getting-started/',
+ '.',
+ );
+
+ expect(urlParser.parse()).toEqual(
+ 'https://www.mkdocs.org/user-guide/getting-started/',
+ );
+ });
+});
diff --git a/plugins/techdocs/src/reader/urlParser.ts b/plugins/techdocs/src/reader/urlParser.ts
new file mode 100644
index 0000000000..b1429b7635
--- /dev/null
+++ b/plugins/techdocs/src/reader/urlParser.ts
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const normalizeBaseURL = (baseURL: string): string => {
+ const url = new URL(baseURL);
+ url.pathname = url.pathname.replace(/([^/])$/, '$1/');
+ return url.toString();
+};
+
+export default class URLParser {
+ constructor(public baseURL: string, public pathname: string) {
+ this.baseURL = normalizeBaseURL(baseURL);
+ }
+
+ parse(): string {
+ return new URL(this.pathname, this.baseURL).toString();
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index 18be8c3246..98477b4ca0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -868,14 +868,6 @@
"@babel/plugin-transform-react-jsx-self" "^7.9.0"
"@babel/plugin-transform-react-jsx-source" "^7.9.0"
-"@babel/runtime-corejs2@^7.4.4":
- version "7.9.2"
- resolved "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.9.2.tgz#f11d074ff99b9b4319b5ecf0501f12202bf2bf4d"
- integrity sha512-ayjSOxuK2GaSDJFCtLgHnYjuMyIpViNujWrZo8GUpN60/n7juzJKK5yOo6RFVb0zdU9ACJFK+MsZrUnj3OmXMw==
- dependencies:
- core-js "^2.6.5"
- regenerator-runtime "^0.13.4"
-
"@babel/runtime-corejs3@^7.10.2":
version "7.10.3"
resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.3.tgz#931ed6941d3954924a7aa967ee440e60c507b91a"
@@ -1184,71 +1176,6 @@
unique-filename "^1.1.1"
which "^1.3.1"
-"@graphql-toolkit/common@0.10.7", "@graphql-toolkit/common@~0.10.2":
- version "0.10.7"
- resolved "https://registry.npmjs.org/@graphql-toolkit/common/-/common-0.10.7.tgz#e5d4ddeae080c4f7357bc7d6a8d02e75578e9bd1"
- integrity sha512-epcJvmIAo+vSEY76F0Dj1Ef6oeewT5pdMe1obHj7LHXN9V22O86aQzwdEEm1iG91qROqSw/apcDnSCMjuVeQVA==
- dependencies:
- aggregate-error "3.0.1"
- camel-case "4.1.1"
- graphql-tools "5.0.0"
- lodash "4.17.15"
-
-"@graphql-toolkit/core@~0.10.2":
- version "0.10.7"
- resolved "https://registry.npmjs.org/@graphql-toolkit/core/-/core-0.10.7.tgz#e4d86d9e439fbb05b634054b0865c16d488fad97"
- integrity sha512-LXcFLG7XcRJrPz/xD+0cExzLx/ptVynDM20650/FbmHbKOU50d9mSbcsrzAOq/3f4q3HrRDssvn0f6pPm0EHMg==
- dependencies:
- "@graphql-toolkit/common" "0.10.7"
- "@graphql-toolkit/schema-merging" "0.10.7"
- aggregate-error "3.0.1"
- globby "11.0.0"
- import-from "^3.0.0"
- is-glob "4.0.1"
- lodash "4.17.15"
- p-limit "2.3.0"
- resolve-from "5.0.0"
- tslib "1.11.2"
- unixify "1.0.0"
- valid-url "1.0.9"
-
-"@graphql-toolkit/graphql-file-loader@~0.10.2":
- version "0.10.7"
- resolved "https://registry.npmjs.org/@graphql-toolkit/graphql-file-loader/-/graphql-file-loader-0.10.7.tgz#496e49712def12449b339739d3583ed1bda7a24f"
- integrity sha512-6tUIuw/YBlm0VyVgXgMrOXsEQ+WpXVgr2NQwHNzmZo82kPGqImveq7A2D3gBWLyVTcinDScRcKJMxM4kCF5T0A==
- dependencies:
- "@graphql-toolkit/common" "0.10.7"
- tslib "1.11.2"
-
-"@graphql-toolkit/json-file-loader@~0.10.2":
- version "0.10.7"
- resolved "https://registry.npmjs.org/@graphql-toolkit/json-file-loader/-/json-file-loader-0.10.7.tgz#6ac38258bc3da8540b38232b71bb5820bf02cff6"
- integrity sha512-nVISrODqvn5LiQ4nKL5pz1Let/W1tuj2viEwrNyTS+9mcjaCE2nhV5MOK/7ZY0cR+XeA4N2u65EH1lQd63U3Cw==
- dependencies:
- "@graphql-toolkit/common" "0.10.7"
- tslib "1.11.2"
-
-"@graphql-toolkit/schema-merging@0.10.7", "@graphql-toolkit/schema-merging@~0.10.2":
- version "0.10.7"
- resolved "https://registry.npmjs.org/@graphql-toolkit/schema-merging/-/schema-merging-0.10.7.tgz#7b33becd48629bc656d602405c0b5c17d33ebd85"
- integrity sha512-VngxJbVdRfXYhdMLhL90pqN+hD/2XTZwhHPGvpWqmGQhT6roc98yN3xyDyrWFYYsuiY4gTexdmrHQ3d7mzitwA==
- dependencies:
- "@graphql-toolkit/common" "0.10.7"
- deepmerge "4.2.2"
- graphql-tools "5.0.0"
- tslib "1.11.2"
-
-"@graphql-toolkit/url-loader@~0.10.2":
- version "0.10.7"
- resolved "https://registry.npmjs.org/@graphql-toolkit/url-loader/-/url-loader-0.10.7.tgz#0de998eeeaebcbf918526a26cb5f30f8250211f0"
- integrity sha512-Ec3T4Zuo63LwG+RfK2ryz8ChPfncBf8fiSJ1xr68FtLDVznDNulvlNKFbfREE5koWejwsnJrjLCv6IX5IbhExg==
- dependencies:
- "@graphql-toolkit/common" "0.10.7"
- cross-fetch "3.0.4"
- graphql-tools "5.0.0"
- tslib "1.11.2"
- valid-url "1.0.9"
-
"@hapi/address@^2.1.2":
version "2.1.4"
resolved "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
@@ -4416,13 +4343,6 @@
"@webassemblyjs/wast-parser" "1.9.0"
"@xtuc/long" "4.2.2"
-"@wry/equality@^0.1.2":
- version "0.1.11"
- resolved "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
- integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==
- dependencies:
- tslib "^1.9.3"
-
"@xobotyi/scrollbar-width@1.9.5":
version "1.9.5"
resolved "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d"
@@ -4550,7 +4470,7 @@ agentkeepalive@^3.4.1:
dependencies:
humanize-ms "^1.2.1"
-aggregate-error@3.0.1, aggregate-error@^3.0.0:
+aggregate-error@^3.0.0:
version "3.0.1"
resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==
@@ -4708,45 +4628,6 @@ anymatch@^3.0.3, anymatch@~3.1.1:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-apollo-link-http-common@^0.2.14:
- version "0.2.16"
- resolved "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc"
- integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==
- dependencies:
- apollo-link "^1.2.14"
- ts-invariant "^0.4.0"
- tslib "^1.9.3"
-
-apollo-link@^1.2.12, apollo-link@^1.2.14:
- version "1.2.14"
- resolved "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9"
- integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==
- dependencies:
- apollo-utilities "^1.3.0"
- ts-invariant "^0.4.0"
- tslib "^1.9.3"
- zen-observable-ts "^0.8.21"
-
-apollo-upload-client@^13.0.0:
- version "13.0.0"
- resolved "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-13.0.0.tgz#146d1ddd85d711fcac8ca97a72d3ca6787f2b71b"
- integrity sha512-lJ9/bk1BH1lD15WhWRha2J3+LrXrPIX5LP5EwiOUHv8PCORp4EUrcujrA3rI5hZeZygrTX8bshcuMdpqpSrvtA==
- dependencies:
- "@babel/runtime" "^7.9.2"
- apollo-link "^1.2.12"
- apollo-link-http-common "^0.2.14"
- extract-files "^8.0.0"
-
-apollo-utilities@^1.3.0:
- version "1.3.4"
- resolved "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf"
- integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==
- dependencies:
- "@wry/equality" "^0.1.2"
- fast-json-stable-stringify "^2.0.0"
- ts-invariant "^0.4.0"
- tslib "^1.10.0"
-
app-root-dir@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118"
@@ -4762,10 +4643,10 @@ aproba@^2.0.0:
resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
-arch@2.1.1:
- version "2.1.1"
- resolved "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e"
- integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==
+arch@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf"
+ integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==
are-we-there-yet@~1.1.2:
version "1.1.5"
@@ -5002,7 +4883,7 @@ async@^2.6.1, async@^2.6.2:
dependencies:
lodash "^4.17.14"
-async@^3.1.0:
+async@^3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
@@ -5905,7 +5786,7 @@ callsites@^3.0.0:
resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-camel-case@4.1.1, camel-case@^4.1.1:
+camel-case@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547"
integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==
@@ -6306,13 +6187,13 @@ code-point-at@^1.0.0:
resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
-codemirror-graphql@^0.12.0-alpha.8:
- version "0.12.0-alpha.8"
- resolved "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-0.12.0-alpha.8.tgz#cd7653299baefcdff2349bc9c3def9549c78775c"
- integrity sha512-leCFSjrwtdKQE70ROWIUoc1U6F8fy6i+cd9/0D1dRbEecoleCt5+zODdANETw9map50kxNPf3EcGW4BPYj14hw==
+codemirror-graphql@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.npmjs.org/codemirror-graphql/-/codemirror-graphql-0.12.0.tgz#55f782ffaaea7ff8dbda037e6b97b584dff2402a"
+ integrity sha512-C/0vKzQT5Uw+DLz6/MwKer29FQM52sh9Bem+VdDW42094j8nES1sdnuqj4k5ahNdQpW4FmVeoj/ngn2g3AWmgg==
dependencies:
- graphql-language-service-interface "^2.4.0-alpha.8"
- graphql-language-service-parser "^1.6.0-alpha.4"
+ graphql-language-service-interface "^2.4.0"
+ graphql-language-service-parser "^1.6.0"
codemirror@^5.52.2:
version "5.53.2"
@@ -6428,21 +6309,16 @@ comma-separated-tokens@^1.0.0:
resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea"
integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==
-commander@4.1.0:
- version "4.1.0"
- resolved "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83"
- integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==
+commander@4.1.1, commander@^4.0.0, commander@^4.0.1, commander@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
version "2.20.3"
resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-commander@^4.0.0, commander@^4.0.1, commander@^4.1.1:
- version "4.1.1"
- resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
- integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
-
commander@^5.1.0:
version "5.1.0"
resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
@@ -6745,7 +6621,7 @@ core-js-pure@^3.0.0, core-js-pure@^3.0.1:
resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a"
integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==
-core-js@^2.4.0, core-js@^2.6.5:
+core-js@^2.4.0:
version "2.6.11"
resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
@@ -6776,17 +6652,6 @@ cors@^2.8.5:
object-assign "^4"
vary "^1"
-cosmiconfig@6.0.0, cosmiconfig@^6.0.0:
- version "6.0.0"
- resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
- integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
- dependencies:
- "@types/parse-json" "^4.0.0"
- import-fresh "^3.1.0"
- parse-json "^5.0.0"
- path-type "^4.0.0"
- yaml "^1.7.2"
-
cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.1:
version "5.2.1"
resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
@@ -6797,6 +6662,17 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.1:
js-yaml "^3.13.1"
parse-json "^4.0.0"
+cosmiconfig@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+ integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.1.0"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.7.2"
+
create-ecdh@^4.0.0:
version "4.0.3"
resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
@@ -6843,7 +6719,7 @@ cross-env@^7.0.0:
dependencies:
cross-spawn "^7.0.1"
-cross-fetch@3.0.4, cross-fetch@^3.0.4:
+cross-fetch@^3.0.4:
version "3.0.4"
resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.4.tgz#7bef7020207e684a7638ef5f2f698e24d9eb283c"
integrity sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw==
@@ -6902,10 +6778,10 @@ crypto-random-string@^2.0.0:
resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
-css-box-model@^1.1.2:
- version "1.2.0"
- resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.0.tgz#3a26377b4162b3200d2ede4b064ec5b6a75186d0"
- integrity sha512-lri0br+jSNV0kkkiGEp9y9y3Njq2PmpqbeGWRFQJuZteZzY9iC9GZhQ8Y4WpPwM/2YocjHePxy14igJY7YKzkA==
+css-box-model@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1"
+ integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==
dependencies:
tiny-invariant "^1.0.6"
@@ -7184,38 +7060,38 @@ cyclist@^1.0.1:
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
cypress@*, cypress@^4.2.0:
- version "4.7.0"
- resolved "https://registry.npmjs.org/cypress/-/cypress-4.7.0.tgz#3ea29bddaf9a1faeaa5b8d54b60a84ed1cafa83d"
- integrity sha512-Vav6wUFhPRlImIND/2lOQlUnAWzgCC/iXyJlJjX9nJOJul5LC1vUpf/m8Oiae870PFPyT0ZLLwPHKTXZNdXmHw==
+ version "4.9.0"
+ resolved "https://registry.npmjs.org/cypress/-/cypress-4.9.0.tgz#c188a3864ddf841c0fdc81a9e4eff5cf539cd1c1"
+ integrity sha512-qGxT5E0j21FPryzhb0OBjCdhoR/n1jXtumpFFSBPYWsaZZhNaBvc3XlBUDEZKkkXPsqUFYiyhWdHN/zo0t5FcA==
dependencies:
"@cypress/listr-verbose-renderer" "0.4.1"
"@cypress/request" "2.88.5"
"@cypress/xvfb" "1.2.4"
"@types/sinonjs__fake-timers" "6.0.1"
"@types/sizzle" "2.3.2"
- arch "2.1.1"
+ arch "2.1.2"
bluebird "3.7.2"
cachedir "2.3.0"
chalk "2.4.2"
check-more-types "2.24.0"
cli-table3 "0.5.1"
- commander "4.1.0"
+ commander "4.1.1"
common-tags "1.8.0"
debug "4.1.1"
- eventemitter2 "4.1.2"
+ eventemitter2 "6.4.2"
execa "1.0.0"
executable "4.1.1"
extract-zip "1.7.0"
fs-extra "8.1.0"
- getos "3.1.4"
+ getos "3.2.1"
is-ci "2.0.0"
- is-installed-globally "0.1.0"
+ is-installed-globally "0.3.2"
lazy-ass "1.6.0"
listr "0.14.3"
lodash "4.17.15"
log-symbols "3.0.0"
minimist "1.2.5"
- moment "2.24.0"
+ moment "2.26.0"
ospath "1.2.2"
pretty-bytes "5.3.0"
ramda "0.26.1"
@@ -7417,7 +7293,7 @@ deep-object-diff@^1.1.0:
resolved "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a"
integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==
-deepmerge@4.2.2, deepmerge@^4.2.2:
+deepmerge@^4.2.2:
version "4.2.2"
resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
@@ -7523,11 +7399,6 @@ depd@~1.1.2:
resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
-deprecated-decorator@^0.1.6:
- version "0.1.6"
- resolved "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37"
- integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=
-
deprecation@^2.0.0, deprecation@^2.3.1:
version "2.3.1"
resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
@@ -7663,11 +7534,6 @@ dns-packet@^1.3.1:
ip "^1.1.0"
safe-buffer "^5.0.1"
-dns-prefetch-control@0.2.0:
- version "0.2.0"
- resolved "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz#73988161841f3dcc81f47686d539a2c702c88624"
- integrity sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==
-
dns-txt@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
@@ -8450,10 +8316,10 @@ event-stream@=3.3.4:
stream-combiner "~0.0.4"
through "~2.3.1"
-eventemitter2@4.1.2:
- version "4.1.2"
- resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-4.1.2.tgz#0e1a8477af821a6ef3995b311bf74c23a5247f15"
- integrity sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU=
+eventemitter2@6.4.2:
+ version "6.4.2"
+ resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.2.tgz#f31f8b99d45245f0edbc5b00797830ff3b388970"
+ integrity sha512-r/Pwupa5RIzxIHbEKCkNXqpEQIIT4uQDxmP4G/Lug/NokVUWj0joz/WzWl3OxRpC5kDrH/WdiUJoR+IrwvXJEw==
eventemitter3@^3.1.0:
version "3.1.2"
@@ -8676,11 +8542,6 @@ extglob@^2.0.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-extract-files@^8.0.0:
- version "8.1.0"
- resolved "https://registry.npmjs.org/extract-files/-/extract-files-8.1.0.tgz#46a0690d0fe77411a2e3804852adeaa65cd59288"
- integrity sha512-PTGtfthZK79WUMk+avLmwx3NGdU8+iVFXC2NMGxKsn0MnihOG2lvumj+AZo8CTwTrwjXDgZ5tztbRlEdRjBonQ==
-
extract-zip@1.7.0:
version "1.7.0"
resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927"
@@ -9416,12 +9277,12 @@ getopts@2.2.5:
resolved "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b"
integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==
-getos@3.1.4:
- version "3.1.4"
- resolved "https://registry.npmjs.org/getos/-/getos-3.1.4.tgz#29cdf240ed10a70c049add7b6f8cb08c81876faf"
- integrity sha512-UORPzguEB/7UG5hqiZai8f0vQ7hzynMQyJLxStoQ8dPGAcmgsfXOPA4iE/fGtweHYkK+z4zc9V0g+CIFRf5HYw==
+getos@3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5"
+ integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==
dependencies:
- async "^3.1.0"
+ async "^3.2.0"
getpass@^0.1.1:
version "0.1.7"
@@ -9526,13 +9387,6 @@ glob@7.1.6, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glo
once "^1.3.0"
path-is-absolute "^1.0.0"
-global-dirs@^0.1.0:
- version "0.1.1"
- resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
- integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
- dependencies:
- ini "^1.3.4"
-
global-dirs@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
@@ -9603,18 +9457,6 @@ globalthis@^1.0.0:
dependencies:
define-properties "^1.1.3"
-globby@11.0.0:
- version "11.0.0"
- resolved "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154"
- integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==
- dependencies:
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.1.1"
- ignore "^5.1.4"
- merge2 "^1.3.0"
- slash "^3.0.0"
-
globby@8.0.2:
version "8.0.2"
resolved "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d"
@@ -9726,86 +9568,55 @@ graceful-fs@^4.2.4:
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
graphiql@^1.0.0-alpha.10:
- version "1.0.0-alpha.10"
- resolved "https://registry.npmjs.org/graphiql/-/graphiql-1.0.0-alpha.10.tgz#9b6b5e554c6586e9bc09ebc863df8bcfd844110d"
- integrity sha512-fKyYXQQRjsxOQw0rZMvICA2+P7ieUjj8AyfMaYlQeXGsGkZo0FUvBXVsN6LTraAPRBvVFo2jH9MSH68ujDXoeQ==
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/graphiql/-/graphiql-1.0.3.tgz#f6b5d5c417d8f1a28786d3228a69883426ba74ad"
+ integrity sha512-6YW76m2exdpGiVS75I0QsbM4NanvenKFR9FtW/IFbui0mWv89iVa1FbdjhUt+kxa+LX/WlqTshiqiZRz7E5Bgg==
dependencies:
"@emotion/core" "^10.0.28"
"@mdx-js/react" "^1.5.2"
codemirror "^5.52.2"
- codemirror-graphql "^0.12.0-alpha.8"
+ codemirror-graphql "^0.12.0"
copy-to-clipboard "^3.2.0"
entities "^2.0.0"
markdown-it "^10.0.0"
- monaco-graphql "^0.1.1"
+ monaco-graphql "^0.2.0"
regenerator-runtime "^0.13.5"
theme-ui "^0.3.1"
-graphql-config@3.0.0-rc.2:
- version "3.0.0-rc.2"
- resolved "https://registry.npmjs.org/graphql-config/-/graphql-config-3.0.0-rc.2.tgz#760a1d7bcf8b114b7c1675c5a6ac624976d62e09"
- integrity sha512-fb14mSDRatKsz2XXWgQjupbRsur/5vfQqHFFKo+N7hZNzRdT4hm+52HG8gn57mHQNZsN18q4aROwRQQRICMqZA==
+graphql-language-service-interface@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.npmjs.org/graphql-language-service-interface/-/graphql-language-service-interface-2.4.0.tgz#4e2e63242c76197c4f56c61122db68187ea566b3"
+ integrity sha512-r7DQPyhCFY5TlpEukdh9tekJ9hAc7MD9TdOsb5CfAPlsIb1/faVVo2Ty19PxGSYDxygXjwpKLOQD0LqqFuw63A==
dependencies:
- "@graphql-toolkit/common" "~0.10.2"
- "@graphql-toolkit/core" "~0.10.2"
- "@graphql-toolkit/graphql-file-loader" "~0.10.2"
- "@graphql-toolkit/json-file-loader" "~0.10.2"
- "@graphql-toolkit/schema-merging" "~0.10.2"
- "@graphql-toolkit/url-loader" "~0.10.2"
- cosmiconfig "6.0.0"
- globby "11.0.0"
- minimatch "3.0.4"
- tslib "^1.11.1"
-
-graphql-language-service-interface@^2.4.0-alpha.8:
- version "2.4.0-alpha.8"
- resolved "https://registry.npmjs.org/graphql-language-service-interface/-/graphql-language-service-interface-2.4.0-alpha.8.tgz#2f50b107c72be01796417bcfec2669d42f3b57c7"
- integrity sha512-HT77H0GQk2jtpE9NAE+f8aNKvCkv5e7cZ32RZd+lCL23qNmuLJYpQcy+pbuRxxFKOWpiZLa5lc17T010gd64rQ==
- dependencies:
- graphql-language-service-parser "^1.6.0-alpha.4"
- graphql-language-service-types "^1.6.0-alpha.6"
- graphql-language-service-utils "^2.4.0-alpha.7"
+ graphql-language-service-parser "^1.6.0"
+ graphql-language-service-types "^1.6.0"
+ graphql-language-service-utils "^2.4.0"
vscode-languageserver-types "^3.15.1"
-graphql-language-service-parser@^1.6.0-alpha.4:
- version "1.6.0-alpha.4"
- resolved "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-1.6.0-alpha.4.tgz#5d80046b1a3848a655d8f514ef65f40261b74897"
- integrity sha512-l76uie88SNsa37Noc0/Bpw3HT1UxLdIrrs5A3NDj6Fm4FHmri+0Mvgjygpa3y4Y0W3AGje2MILtuJUmUSjiriA==
+graphql-language-service-parser@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/graphql-language-service-parser/-/graphql-language-service-parser-1.6.0.tgz#53a97619461ed41ae237b9070e7e20cfaca56118"
+ integrity sha512-tkfYXl6WBECWNcsyw7O09c0oCMrxqr3JGyDNvdISDSDhvk8EwEk+AOweBEJkycJwoiv1lVlM+EdLfj7dzw4/6w==
-graphql-language-service-types@^1.6.0-alpha.6:
- version "1.6.0-alpha.6"
- resolved "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-1.6.0-alpha.6.tgz#a7a50abbdfaf41074019d107754fc9c00ed824e2"
- integrity sha512-cQfLC4CYDBVKcr3C53apqqd9imT+el3oEvIPz5/MocClWAZa4EsoEr2Z4WP9X5L4QrLk3hhFOJHor1aPzQRsLw==
+graphql-language-service-types@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/graphql-language-service-types/-/graphql-language-service-types-1.6.0.tgz#32529bb9d2e3b8ae9dd6d9646e15481ac5dfe9ad"
+ integrity sha512-7y4pkhTL+MtarC8CeHpvRYVc6pkT6ITdQXs+Gr7OClnk4Lz5nQEK0eO29kUdd0jEnYfHyh5iqhnL5Owfy+wT0A==
-graphql-language-service-utils@^2.4.0-alpha.7:
- version "2.4.0-alpha.7"
- resolved "https://registry.npmjs.org/graphql-language-service-utils/-/graphql-language-service-utils-2.4.0-alpha.7.tgz#a78150eb57a079af52eaffadf9f21a9b3c82cea9"
- integrity sha512-iPw9aFUWAJJx+aWY9DUf4rvIKnJVB1Qoaf7NzHegEC7LMIg7052i8ealMFKiSqk0q/zP6PCmiQblCMnGCjnEwg==
+graphql-language-service-utils@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.npmjs.org/graphql-language-service-utils/-/graphql-language-service-utils-2.4.0.tgz#d4992a1968860abc43a118de498fec84361a4b87"
+ integrity sha512-aLa+8iqb7AJYgdcawsKH8/KLc14DHcRsnveshOm8hN6bBVT0YiQP6mEfJoci741O74uaDF2zj1J3c02vorichw==
dependencies:
- graphql-language-service-types "^1.6.0-alpha.6"
+ graphql-language-service-types "^1.6.0"
-graphql-language-service@^3.0.0-alpha.1:
- version "3.0.0-alpha.1"
- resolved "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-3.0.0-alpha.1.tgz#dc04c0ca3f35ce322dc38548aaa023cde867ca1b"
- integrity sha512-JkkONXR7+yYcm8Q4bohBJtRl6hLodgogt01lS0ROX8lcwkaihKaU+dyoSVgrRaNAibahjFrDLo0j7iAOarJ5ow==
+graphql-language-service@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-3.0.0.tgz#953c3bbf4cc35ff9a7bd54e428bca17832367490"
+ integrity sha512-ySPrbecxtjQtzIFdCIOoSJzaco9dQvZK+wZN/tTjcSEEWh3fgMYXmctAG+WddJiZg3AB7I4Xsb2AsO5yFBbLHg==
dependencies:
- graphql-config "3.0.0-rc.2"
- graphql-language-service-interface "^2.4.0-alpha.8"
- graphql-language-service-types "^1.6.0-alpha.6"
-
-graphql-tools@5.0.0:
- version "5.0.0"
- resolved "https://registry.npmjs.org/graphql-tools/-/graphql-tools-5.0.0.tgz#67281c834a0e29f458adba8018f424816fa627e9"
- integrity sha512-5zn3vtn//382b7G3Wzz3d5q/sh+f7tVrnxeuhTMTJ7pWJijNqLxH7VEzv8VwXCq19zAzHYEosFHfXiK7qzvk7w==
- dependencies:
- apollo-link "^1.2.14"
- apollo-upload-client "^13.0.0"
- deprecated-decorator "^0.1.6"
- form-data "^3.0.0"
- iterall "^1.3.0"
- node-fetch "^2.6.0"
- tslib "^1.11.1"
- uuid "^7.0.3"
+ graphql-language-service-interface "^2.4.0"
+ graphql-language-service-types "^1.6.0"
graphql@15.1.0, graphql@^15.0.0:
version "15.1.0"
@@ -9997,12 +9808,11 @@ helmet-csp@2.10.0:
dasherize "2.0.0"
helmet@^3.22.0:
- version "3.22.0"
- resolved "https://registry.npmjs.org/helmet/-/helmet-3.22.0.tgz#3a6f11d931799145f0aff15dbc563cff9e13131f"
- integrity sha512-Xrqicn2nm1ZIUxP3YGuTBmbDL04neKsIT583Sjh0FkiwKDXYCMUqGqC88w3NUvVXtA75JyR2Jn6jw6ZEMOD+ZA==
+ version "3.23.2"
+ resolved "https://registry.npmjs.org/helmet/-/helmet-3.23.2.tgz#390bb6f3f5e593f90f441bdd91000912c543a898"
+ integrity sha512-pe0UiHw3aHbP8Lon9McCq4AN2XLUMSbhwxJnUY6U2t8wTda7F1SsYg0/pBa1BPugaRqAtx9e1/FyF6E9PsUU5A==
dependencies:
depd "2.0.0"
- dns-prefetch-control "0.2.0"
dont-sniff-mimetype "1.1.0"
expect-ct "0.2.0"
feature-policy "0.3.0"
@@ -10012,7 +9822,6 @@ helmet@^3.22.0:
hide-powered-by "1.1.0"
hpkp "2.0.0"
hsts "2.2.0"
- ienoopen "1.1.0"
nocache "2.1.0"
referrer-policy "1.2.0"
x-xss-protection "1.3.0"
@@ -10375,11 +10184,6 @@ ieee754@^1.1.4:
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
-ienoopen@1.1.0:
- version "1.1.0"
- resolved "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz#411e5d530c982287dbdc3bb31e7a9c9e32630974"
- integrity sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==
-
iferr@^0.1.5:
version "0.1.5"
resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
@@ -10627,9 +10431,9 @@ inquirer@^6.2.0:
through "^2.3.6"
inquirer@^7.0.0, inquirer@^7.0.4:
- version "7.1.0"
- resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
- integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.2.0.tgz#63ce99d823090de7eb420e4bb05e6f3449aa389a"
+ integrity sha512-E0c4rPwr9ByePfNlTIB8z51kK1s2n6jrHuJeEHENl/sbq2G/S1auvibgEwNR4uSyiU+PiYHqSwsgGiXjG8p5ZQ==
dependencies:
ansi-escapes "^4.2.1"
chalk "^3.0.0"
@@ -10911,13 +10715,6 @@ is-generator-fn@^2.0.0:
resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
-is-glob@4.0.1, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
- version "4.0.1"
- resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
- dependencies:
- is-extglob "^2.1.1"
-
is-glob@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -10932,6 +10729,13 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
is-hexadecimal@^1.0.0:
version "1.0.4"
resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
@@ -10942,15 +10746,7 @@ is-in-browser@^1.0.2, is-in-browser@^1.1.3:
resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835"
integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=
-is-installed-globally@0.1.0:
- version "0.1.0"
- resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
- integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
- dependencies:
- global-dirs "^0.1.0"
- is-path-inside "^1.0.0"
-
-is-installed-globally@^0.3.1:
+is-installed-globally@0.3.2, is-installed-globally@^0.3.1:
version "0.3.2"
resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
@@ -11024,13 +10820,6 @@ is-path-in-cwd@^2.0.0:
dependencies:
is-path-inside "^2.1.0"
-is-path-inside@^1.0.0:
- version "1.0.1"
- resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
- integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
- dependencies:
- path-is-inside "^1.0.1"
-
is-path-inside@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
@@ -11294,11 +11083,6 @@ istanbul-reports@^3.0.2:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
-iterall@^1.3.0:
- version "1.3.0"
- resolved "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
- integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
-
iterate-iterator@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6"
@@ -12720,10 +12504,10 @@ markdown-to-jsx@^6.11.4:
prop-types "^15.6.2"
unquote "^1.1.0"
-material-table@^1.58.0:
- version "1.58.2"
- resolved "https://registry.npmjs.org/material-table/-/material-table-1.58.2.tgz#dc0d19652848e6bb92f747d122bd7d4681cca6dc"
- integrity sha512-s/m6ebyXFXmg07zxv1Fl6qPySKaiQhASXaOB3ubRKUFA1DkryUy3PGSEVWTjUYnRyi63kGq+N6b5nsokLR6m5A==
+material-table@1.62.x:
+ version "1.62.0"
+ resolved "https://registry.npmjs.org/material-table/-/material-table-1.62.0.tgz#117793ebf16ab0fccbb6f8a670d849a7be0b5995"
+ integrity sha512-+3tnk32lXtkXeKM7k/hZ82jpSzlXU5CsWXqJHq4Tl0Un7ycjK2Kef6EMPqeE3i58vKNqbIvbrFf/ESH0D/Qwig==
dependencies:
"@date-io/date-fns" "^1.1.0"
"@material-ui/pickers" "^3.2.2"
@@ -12733,7 +12517,7 @@ material-table@^1.58.0:
fast-deep-equal "2.0.1"
filefy "0.1.10"
prop-types "^15.6.2"
- react-beautiful-dnd "11.0.3"
+ react-beautiful-dnd "^13.0.0"
react-double-scrollbar "0.0.15"
md5.js@^1.3.4:
@@ -12772,7 +12556,7 @@ media-typer@0.3.0:
resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
-memoize-one@^5.0.4:
+memoize-one@^5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==
@@ -13156,12 +12940,7 @@ modify-values@^1.0.0:
resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==
-moment@2.24.0:
- version "2.24.0"
- resolved "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
- integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
-
-moment@^2.25.3, moment@^2.26.0:
+moment@2.26.0, moment@^2.25.3, moment@^2.26.0:
version "2.26.0"
resolved "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a"
integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw==
@@ -13171,13 +12950,13 @@ monaco-editor@^0.20.0:
resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.20.0.tgz#5d5009343a550124426cb4d965a4d27a348b4dea"
integrity sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==
-monaco-graphql@^0.1.1:
- version "0.1.1"
- resolved "https://registry.npmjs.org/monaco-graphql/-/monaco-graphql-0.1.1.tgz#d74b03a14d60805841157efe99c3ddec6e8c1407"
- integrity sha512-P6K03iP2hme9geA9TR2zYkSrdhVR0/YcMBQjAaTALGvI4dIILTieGxuBeElZAZFEhsj38CNZZKUF8pKXapA86Q==
+monaco-graphql@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/monaco-graphql/-/monaco-graphql-0.2.0.tgz#be6bd165b6cbdc624fde6c108fe9ee32f50f2e80"
+ integrity sha512-IwpbJvrNlFxq6xjnQQ8eC72ep+q2vfiUaHBNkfqe314CXYnUCcXYfoMBfR5EuLAXRBOTf4CKl6BCN1/9eHrq7A==
dependencies:
- graphql-language-service "^3.0.0-alpha.1"
- graphql-language-service-utils "^2.4.0-alpha.7"
+ graphql-language-service "^3.0.0"
+ graphql-language-service-utils "^2.4.0"
monaco-editor "^0.20.0"
morgan@^1.10.0:
@@ -14035,13 +13814,6 @@ p-finally@^2.0.0:
resolved "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561"
integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==
-p-limit@2.3.0:
- version "2.3.0"
- resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
- integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
- dependencies:
- p-try "^2.0.0"
-
p-limit@^1.1.0:
version "1.3.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@@ -14331,7 +14103,16 @@ passport-google-oauth20@^2.0.0:
dependencies:
passport-oauth2 "1.x.x"
-passport-oauth2@1.x.x:
+passport-oauth1@1.x.x:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.1.0.tgz#a7de988a211f9cf4687377130ea74df32730c918"
+ integrity sha1-p96YiiEfnPRoc3cTDqdN8ycwyRg=
+ dependencies:
+ oauth "0.9.x"
+ passport-strategy "1.x.x"
+ utils-merge "1.x.x"
+
+passport-oauth2@1.x.x, passport-oauth2@^1.5.0:
version "1.5.0"
resolved "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.5.0.tgz#64babbb54ac46a4dcab35e7f266ed5294e3c4108"
integrity sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==
@@ -14342,6 +14123,23 @@ passport-oauth2@1.x.x:
uid2 "0.0.x"
utils-merge "1.x.x"
+passport-oauth@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz#90aff63387540f02089af28cdad39ea7f80d77df"
+ integrity sha1-kK/2M4dUDwIImvKM2tOep/gNd98=
+ dependencies:
+ passport-oauth1 "1.x.x"
+ passport-oauth2 "1.x.x"
+
+passport-okta-oauth@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/passport-okta-oauth/-/passport-okta-oauth-0.0.1.tgz#c8bcee02af3d56ca79d3cca776f2df7cf15a5748"
+ integrity sha1-yLzuAq89Vsp508yndvLffPFaV0g=
+ dependencies:
+ passport-oauth "1.0.0"
+ pkginfo "0.2.x"
+ uid2 "0.0.3"
+
passport-saml@^1.3.3:
version "1.3.3"
resolved "https://registry.npmjs.org/passport-saml/-/passport-saml-1.3.3.tgz#cbea1a2b21ff32b3bc4bfd84dc39c3a370df9935"
@@ -14401,7 +14199,7 @@ path-is-absolute@^1.0.0:
resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+path-is-inside@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
@@ -14590,6 +14388,11 @@ pkg-up@3.1.0, pkg-up@^3.1.0:
dependencies:
find-up "^3.0.0"
+pkginfo@0.2.x:
+ version "0.2.3"
+ resolved "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz#7239c42a5ef6c30b8f328439d9b9ff71042490f8"
+ integrity sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=
+
please-upgrade-node@^3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
@@ -15402,7 +15205,7 @@ quick-lru@^1.0.0:
resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=
-raf-schd@^4.0.0:
+raf-schd@^4.0.2:
version "4.0.2"
resolved "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.2.tgz#bd44c708188f2e84c810bf55fcea9231bcaed8a0"
integrity sha512-VhlMZmGy6A6hrkJWHLNTGl5gtgMUm+xfGza6wbwnE914yeQ5Ybm18vgM734RZhMgfw4tacUrWseGZlpUrrakEQ==
@@ -15485,19 +15288,18 @@ rc@^1.2.7, rc@^1.2.8:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-beautiful-dnd@11.0.3:
- version "11.0.3"
- resolved "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-11.0.3.tgz#5678bb3e725d8b56cb7cf57f56e952105fc4f2af"
- integrity sha512-2FX2SnOlKMmfn90xUHCav7cxRWXwY7FeRa6TzdxWeX7DdP5JTvVQcsWgiOkdbJSj+J+1q1nA9QO4/HQ52D0DAA==
+react-beautiful-dnd@^13.0.0:
+ version "13.0.0"
+ resolved "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.0.0.tgz#f70cc8ff82b84bc718f8af157c9f95757a6c3b40"
+ integrity sha512-87It8sN0ineoC3nBW0SbQuTFXM6bUqM62uJGY4BtTf0yzPl8/3+bHMWkgIe0Z6m8e+gJgjWxefGRVfpE3VcdEg==
dependencies:
- "@babel/runtime-corejs2" "^7.4.4"
- css-box-model "^1.1.2"
- memoize-one "^5.0.4"
- raf-schd "^4.0.0"
- react-redux "^7.0.3"
- redux "^4.0.1"
- tiny-invariant "^1.0.4"
- use-memo-one "^1.1.0"
+ "@babel/runtime" "^7.8.4"
+ css-box-model "^1.2.0"
+ memoize-one "^5.1.1"
+ raf-schd "^4.0.2"
+ react-redux "^7.1.1"
+ redux "^4.0.4"
+ use-memo-one "^1.1.1"
react-clientside-effect@^1.2.2:
version "1.2.2"
@@ -15747,7 +15549,7 @@ react-popper@^1.3.6:
typed-styles "^0.0.7"
warning "^4.0.2"
-react-redux@^7.0.3:
+react-redux@^7.1.1:
version "7.2.0"
resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d"
integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==
@@ -16123,7 +15925,7 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
-redux@^4.0.1:
+redux@^4.0.4:
version "4.0.5"
resolved "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==
@@ -16398,11 +16200,6 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1:
expand-tilde "^2.0.0"
global-modules "^1.0.0"
-resolve-from@5.0.0, resolve-from@^5.0.0:
- version "5.0.0"
- resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
- integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-
resolve-from@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
@@ -16413,6 +16210,11 @@ resolve-from@^4.0.0:
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
resolve-pathname@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
@@ -16662,20 +16464,13 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
-rxjs@^6.3.3, rxjs@^6.5.5:
+rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^6.5.4, rxjs@^6.5.5:
version "6.5.5"
resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
dependencies:
tslib "^1.9.0"
-rxjs@^6.4.0, rxjs@^6.5.3, rxjs@^6.5.4:
- version "6.5.4"
- resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
- integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==
- dependencies:
- tslib "^1.9.0"
-
safe-buffer@5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
@@ -18229,7 +18024,7 @@ tiny-emitter@^2.0.0:
resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
-tiny-invariant@^1.0.2, tiny-invariant@^1.0.4, tiny-invariant@^1.0.6:
+tiny-invariant@^1.0.2, tiny-invariant@^1.0.6:
version "1.1.0"
resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==
@@ -18418,13 +18213,6 @@ ts-interface-checker@^0.1.9:
resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.10.tgz#b68a49e37e90a05797e590f08494dd528bf383cf"
integrity sha512-UJYuKET7ez7ry0CnvfY6fPIUIZDw+UI3qvTUQeS2MyI4TgEeWAUBqy185LeaHcdJ9zG2dgFpPJU/AecXU0Afug==
-ts-invariant@^0.4.0:
- version "0.4.4"
- resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"
- integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==
- dependencies:
- tslib "^1.9.3"
-
ts-jest@^26.0.0:
version "26.1.0"
resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.0.tgz#e9070fc97b3ea5557a48b67c631c74eb35e15417"
@@ -18483,21 +18271,11 @@ tslib@1.10.0:
resolved "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
-tslib@1.11.2:
- version "1.11.2"
- resolved "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz#9c79d83272c9a7aaf166f73915c9667ecdde3cc9"
- integrity sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==
-
tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
version "1.11.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
-tslib@^1.11.1:
- version "1.13.0"
- resolved "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
- integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
-
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -18609,7 +18387,7 @@ uid-number@0.0.6:
resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=
-uid2@0.0.x:
+uid2@0.0.3, uid2@0.0.x:
version "0.0.3"
resolved "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=
@@ -18780,13 +18558,6 @@ universalify@^1.0.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"
integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==
-unixify@1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090"
- integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA=
- dependencies:
- normalize-path "^2.1.1"
-
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -18892,7 +18663,7 @@ use-callback-ref@^1.2.1:
resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.1.tgz#898759ccb9e14be6c7a860abafa3ffbd826c89bb"
integrity sha512-C3nvxh0ZpaOxs9RCnWwAJ+7bJPwQI8LHF71LzbQ3BvzH5XkdtlkMadqElGevg5bYBDFip4sAnD4m06zAKebg1w==
-use-memo-one@^1.1.0:
+use-memo-one@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.1.tgz#39e6f08fe27e422a7d7b234b5f9056af313bd22c"
integrity sha512-oFfsyun+bP7RX8X2AskHNTxu+R3QdE/RC5IefMbqptmACAA/gfol1KDD5KRzPsGMa62sWxGZw+Ui43u6x4ddoQ==
@@ -19005,11 +18776,6 @@ v8flags@^3.1.3:
dependencies:
homedir-polyfill "^1.0.1"
-valid-url@1.0.9:
- version "1.0.9"
- resolved "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
- integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=
-
validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3:
version "3.0.4"
resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -19783,15 +19549,7 @@ yup@^0.29.1:
synchronous-promise "^2.0.10"
toposort "^2.0.2"
-zen-observable-ts@^0.8.21:
- version "0.8.21"
- resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"
- integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==
- dependencies:
- tslib "^1.9.3"
- zen-observable "^0.8.0"
-
-zen-observable@^0.8.0, zen-observable@^0.8.15:
+zen-observable@^0.8.15:
version "0.8.15"
resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==