Merge remote-tracking branch 'backstage/master' into erikengervall/plugin-release-manager-as-a-service

This commit is contained in:
Erik Engervall
2021-05-10 10:15:54 +02:00
69 changed files with 354 additions and 325 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/catalog-model': patch
---
Renamed parameters to input in template schema
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
update plugins created to use react-use 17.2.4
+7
View File
@@ -0,0 +1,7 @@
---
'@backstage/core': patch
'@backstage/plugin-api-docs': patch
---
Fix state persisted in the URL make search input in the table toolbar lose their
focus.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/catalog-model': patch
---
Improve error messages when schema validation fails
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': patch
---
Move `jest-when` to the dev dependencies
+44
View File
@@ -0,0 +1,44 @@
---
'@backstage/core': patch
'@backstage/core-api': patch
'@backstage/integration-react': patch
'@backstage/plugin-api-docs': patch
'@backstage/plugin-badges': patch
'@backstage/plugin-bitrise': patch
'@backstage/plugin-catalog': patch
'@backstage/plugin-catalog-import': patch
'@backstage/plugin-catalog-react': patch
'@backstage/plugin-circleci': patch
'@backstage/plugin-cloudbuild': patch
'@backstage/plugin-code-coverage': patch
'@backstage/plugin-config-schema': patch
'@backstage/plugin-cost-insights': patch
'@backstage/plugin-explore': patch
'@backstage/plugin-fossa': patch
'@backstage/plugin-gcp-projects': patch
'@backstage/plugin-github-actions': patch
'@backstage/plugin-github-deployments': patch
'@backstage/plugin-gitops-profiles': patch
'@backstage/plugin-graphiql': patch
'@backstage/plugin-jenkins': patch
'@backstage/plugin-kafka': patch
'@backstage/plugin-kubernetes': patch
'@backstage/plugin-lighthouse': patch
'@backstage/plugin-newrelic': patch
'@backstage/plugin-org': patch
'@backstage/plugin-pagerduty': patch
'@backstage/plugin-register-component': patch
'@backstage/plugin-rollbar': patch
'@backstage/plugin-scaffolder': patch
'@backstage/plugin-search': patch
'@backstage/plugin-sentry': patch
'@backstage/plugin-sonarqube': patch
'@backstage/plugin-splunk-on-call': patch
'@backstage/plugin-tech-radar': patch
'@backstage/plugin-techdocs': patch
'@backstage/plugin-todo': patch
'@backstage/plugin-user-settings': patch
'@backstage/plugin-welcome': patch
---
chore: bump `react-use` dependency in all packages
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-kubernetes-backend': patch
---
Add possibility to configure TLS verification for `gke` type clusters
@@ -33,6 +33,7 @@ kubernetes:
- type: 'gke'
projectId: 'gke-clusters'
region: 'europe-west1'
skipTLSVerify: true
```
### `serviceLocatorMethod`
@@ -129,6 +130,11 @@ The Google Cloud project to look for Kubernetes clusters in.
The Google Cloud region to look for Kubernetes clusters in. Defaults to all
regions.
##### `skipTLSVerify`
This determines whether or not the Kubernetes client verifies the TLS
certificate presented by the API server. Defaults to `false`.
### `customResources` (optional)
Configures which [custom resources][3] to look for when returning an entity's
+1 -1
View File
@@ -18,7 +18,7 @@
"@spotify/prettier-config": "^10.0.0",
"docusaurus": "^2.0.0-alpha.70",
"js-yaml": "^4.1.0",
"prettier": "^2.2.1"
"prettier": "^2.3.0"
},
"prettier": "@spotify/prettier-config"
}
+4 -4
View File
@@ -5197,10 +5197,10 @@ prepend-http@^2.0.0:
resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
prettier@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
prettier@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18"
integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==
prismjs@^1.22.0:
version "1.23.0"
+1 -1
View File
@@ -51,7 +51,7 @@
"react-hot-loader": "^4.12.21",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"zen-observable": "^0.8.15"
},
"devDependencies": {
+1 -1
View File
@@ -514,7 +514,7 @@ export interface TemplateEntityV1beta2 extends Entity {
id?: string;
name?: string;
action: string;
parameters?: JsonObject;
input?: JsonObject;
}>;
output?: {
[name: string]: string;
@@ -168,4 +168,16 @@ components:
(entity as any).spec.system = '';
await expect(validator.check(entity)).rejects.toThrow(/system/);
});
it('rejects additional properties', async () => {
(entity as any).annotations = 'Test';
await expect(validator.check(entity)).rejects.toThrow(
/additional properties/,
);
});
it('rejects with useful error message', async () => {
(entity as any).annotations = 'Test';
await expect(validator.check(entity)).rejects.toThrow(/annotations/);
});
});
@@ -51,7 +51,7 @@ describe('templateEntityV1beta2Validator', () => {
id: 'fetch',
name: 'Fetch',
action: 'fetch:plan',
parameters: {
input: {
url: './template',
},
},
@@ -38,7 +38,7 @@ export interface TemplateEntityV1beta2 extends Entity {
id?: string;
name?: string;
action: string;
parameters?: JsonObject;
input?: JsonObject;
}>;
output?: { [name: string]: string };
};
+7 -1
View File
@@ -66,7 +66,13 @@ export function ajvCompiledJsonSchemaValidator(
}
throw new TypeError(
`Malformed ${kind}, ${error.dataPath || '<root>'} ${error.message}`,
`Malformed ${kind}, ${error.dataPath || '<root>'} ${error.message}${
error.params
? ` - ${Object.entries(error.params)
.map(([key, val]) => `${key}: ${val}`)
.join(', ')}`
: ''
}`,
);
},
};
@@ -125,7 +125,7 @@
"type": "string",
"description": "The name of the action to execute."
},
"parameters": {
"input": {
"type": "object",
"description": "A templated object describing the inputs to the action."
}
@@ -31,7 +31,7 @@
"@material-ui/lab": "4.0.0-alpha.45",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^{{version '@backstage/cli'}}",
+1 -1
View File
@@ -38,7 +38,7 @@
"prop-types": "^15.7.2",
"react": "^16.12.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"zen-observable": "^0.8.15"
},
"devDependencies": {
+1 -1
View File
@@ -65,7 +65,7 @@
"react-sparklines": "^1.7.0",
"react-syntax-highlighter": "^15.4.3",
"react-text-truncate": "^0.16.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"remark-gfm": "^1.0.0",
"zen-observable": "^0.8.15"
},
+79 -57
View File
@@ -20,6 +20,7 @@ import {
makeStyles,
Typography,
useTheme,
withStyles,
} from '@material-ui/core';
// Material-table is not using the standard icons available in in material-ui. https://github.com/mbrn/material-table/issues/51
import AddBox from '@material-ui/icons/AddBox';
@@ -49,6 +50,7 @@ import MTable, {
} from 'material-table';
import React, {
forwardRef,
MutableRefObject,
ReactNode,
useCallback,
useEffect,
@@ -100,19 +102,20 @@ function extractValueByField(data: any, field: string): any | undefined {
return value;
}
const useHeaderStyles = makeStyles<BackstageTheme>(theme => ({
const StyledMTableHeader = withStyles(theme => ({
header: {
padding: theme.spacing(1, 2, 1, 2.5),
borderTop: `1px solid ${theme.palette.grey.A100}`,
borderBottom: `1px solid ${theme.palette.grey.A100}`,
color: theme.palette.textSubtle,
// withStyles hasn't a generic overload for theme
color: (theme as BackstageTheme).palette.textSubtle,
fontWeight: theme.typography.fontWeightBold,
position: 'static',
wordBreak: 'normal',
},
}));
}))(MTableHeader);
const useToolbarStyles = makeStyles<BackstageTheme>(theme => ({
const StyledMTableToolbar = withStyles(theme => ({
root: {
padding: theme.spacing(3, 0, 2.5, 2.5),
},
@@ -124,7 +127,7 @@ const useToolbarStyles = makeStyles<BackstageTheme>(theme => ({
searchField: {
paddingRight: theme.spacing(2),
},
}));
}))(MTableToolbar);
const useFilterStyles = makeStyles<BackstageTheme>(() => ({
root: {
@@ -208,6 +211,59 @@ export interface TableProps<T extends object = {}>
onStateChange?: (state: TableState) => any;
}
export function TableToolbar(toolbarProps: {
toolbarRef: MutableRefObject<any>;
setSearch: (value: string) => void;
onSearchChanged: (value: string) => void;
toggleFilters: () => void;
hasFilters: boolean;
selectedFiltersLength: number;
}) {
const {
toolbarRef,
setSearch,
hasFilters,
selectedFiltersLength,
toggleFilters,
} = toolbarProps;
const filtersClasses = useFilterStyles();
const onSearchChanged = useCallback(
(searchText: string) => {
toolbarProps.onSearchChanged(searchText);
setSearch(searchText);
},
[toolbarProps, setSearch],
);
if (hasFilters) {
return (
<div className={filtersClasses.root}>
<div className={filtersClasses.root}>
<IconButton onClick={toggleFilters} aria-label="filter list">
<FilterList />
</IconButton>
<Typography className={filtersClasses.title}>
Filters ({selectedFiltersLength})
</Typography>
</div>
<StyledMTableToolbar
{...toolbarProps}
ref={toolbarRef}
onSearchChanged={onSearchChanged}
/>
</div>
);
}
return (
<StyledMTableToolbar
{...toolbarProps}
ref={toolbarRef}
onSearchChanged={onSearchChanged}
/>
);
}
export function Table<T extends object = {}>({
columns,
options,
@@ -219,10 +275,7 @@ export function Table<T extends object = {}>({
onStateChange,
...props
}: TableProps<T>) {
const headerClasses = useHeaderStyles();
const toolbarClasses = useToolbarStyles();
const tableClasses = useTableStyles();
const filtersClasses = useFilterStyles();
const { data, ...propsWithoutData } = props;
@@ -230,9 +283,12 @@ export function Table<T extends object = {}>({
const calculatedInitialState = { ...defaultInitialState, ...initialState };
const [filtersOpen, toggleFilters] = useState(
const [filtersOpen, setFiltersOpen] = useState(
calculatedInitialState.filtersOpen,
);
const toggleFilters = useCallback(() => setFiltersOpen(v => !v), [
setFiltersOpen,
]);
const [selectedFiltersLength, setSelectedFiltersLength] = useState(0);
const [tableData, setTableData] = useState(data as any[]);
const [selectedFilters, setSelectedFilters] = useState(
@@ -379,64 +435,32 @@ export function Table<T extends object = {}>({
}));
};
const hasFilters = !!filters?.length;
const Toolbar = useCallback(
toolbarProps => {
const onSearchChanged = (searchText: string) => {
toolbarProps.onSearchChanged(searchText);
setSearch(searchText);
};
if (filters?.length) {
return (
<div className={filtersClasses.root}>
<div className={filtersClasses.root}>
<IconButton
onClick={() => toggleFilters(el => !el)}
aria-label="filter list"
>
<FilterList />
</IconButton>
<Typography className={filtersClasses.title}>
Filters ({selectedFiltersLength})
</Typography>
</div>
<MTableToolbar
classes={toolbarClasses}
{...toolbarProps}
ref={toolbarRef}
onSearchChanged={onSearchChanged}
/>
</div>
);
}
return (
<MTableToolbar
classes={toolbarClasses}
<TableToolbar
toolbarRef={toolbarRef}
setSearch={setSearch}
hasFilters={hasFilters}
selectedFiltersLength={selectedFiltersLength}
toggleFilters={toggleFilters}
{...toolbarProps}
ref={toolbarRef}
onSearchChanged={onSearchChanged}
/>
);
},
[
filters?.length,
selectedFiltersLength,
toggleFilters,
toolbarClasses,
filtersClasses,
setSearch,
toolbarRef,
],
[toggleFilters, hasFilters, selectedFiltersLength, setSearch, toolbarRef],
);
const hasNoRows = typeof data !== 'function' && data.length === 0;
const columnCount = columns.length;
const Body = useCallback(
bodyProps => {
if (emptyContent && typeof data !== 'function' && data.length === 0) {
if (emptyContent && hasNoRows) {
return (
<tbody>
<tr>
<td colSpan={columns.length}>{emptyContent}</td>
<td colSpan={columnCount}>{emptyContent}</td>
</tr>
</tbody>
);
@@ -444,7 +468,7 @@ export function Table<T extends object = {}>({
return <MTableBody {...bodyProps} />;
},
[data, emptyContent, columns],
[hasNoRows, emptyContent, columnCount],
);
return (
@@ -458,9 +482,7 @@ export function Table<T extends object = {}>({
)}
<MTable<T>
components={{
Header: headerProps => (
<MTableHeader classes={headerClasses} {...headerProps} />
),
Header: StyledMTableHeader,
Toolbar,
Body,
}}
+12 -11
View File
@@ -17,7 +17,7 @@
import { isEqual } from 'lodash';
import qs from 'qs';
import { useEffect, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import { useSearchParams } from 'react-router-dom';
import { useDebounce } from 'react-use';
function stringify(queryParams: any): string {
@@ -58,36 +58,37 @@ type SetQueryParams<T> = (params: T) => void;
export function useQueryParamState<T>(
stateName: string,
debounceTime: number = 100,
/** @deprecated Don't configure a custom debouceTime */
debounceTime: number = 250,
): [T | undefined, SetQueryParams<T>] {
const navigate = useNavigate();
const location = useLocation();
const [searchParams, setSearchParams] = useSearchParams();
const searchParamsString = searchParams.toString();
const [queryParamState, setQueryParamState] = useState<T>(
extractState(location.search, stateName),
extractState(searchParamsString, stateName),
);
useEffect(() => {
const newState = extractState(location.search, stateName);
const newState = extractState(searchParamsString, stateName);
setQueryParamState(oldState =>
isEqual(newState, oldState) ? oldState : newState,
);
}, [location, stateName]);
}, [searchParamsString, setQueryParamState, stateName]);
useDebounce(
() => {
const queryString = joinQueryString(
location.search,
searchParamsString,
stateName,
queryParamState,
);
if (location.search !== queryString) {
navigate({ ...location, search: `?${queryString}` }, { replace: true });
if (searchParamsString !== queryString) {
setSearchParams(queryString, { replace: true });
}
},
debounceTime,
[queryParamState],
[setSearchParams, queryParamState, searchParamsString, stateName],
);
return [queryParamState, setQueryParamState];
+18 -19
View File
@@ -933,26 +933,25 @@
Update imports and remove the usage of the deprecated `app.getRoutes()`.
```diff
-import { Router as DocsRouter } from '@backstage/plugin-techdocs';
+import { TechdocsPage } from '@backstage/plugin-techdocs';
import { CatalogImportPage } from '@backstage/plugin-catalog-import';
-import { Router as TechRadarRouter } from '@backstage/plugin-tech-radar';
-import { SearchPage as SearchRouter } from '@backstage/plugin-search';
-import { Router as SettingsRouter } from '@backstage/plugin-user-settings';
+import { TechRadarPage } from '@backstage/plugin-tech-radar';
+import { SearchPage } from '@backstage/plugin-search';
+import { UserSettingsPage } from '@backstage/plugin-user-settings';
+import { ApiExplorerPage } from '@backstage/plugin-api-docs';
import { EntityPage } from './components/catalog/EntityPage';
import { scaffolderPlugin, ScaffolderPage } from '@backstage/plugin-scaffolder';
```
```diff
- import { Router as DocsRouter } from '@backstage/plugin-techdocs';
+ import { TechdocsPage } from '@backstage/plugin-techdocs';
import { CatalogImportPage } from '@backstage/plugin-catalog-import';
- import { Router as TechRadarRouter } from '@backstage/plugin-tech-radar';
- import { SearchPage as SearchRouter } from '@backstage/plugin-search';
- import { Router as SettingsRouter } from '@backstage/plugin-user-settings';
+ import { TechRadarPage } from '@backstage/plugin-tech-radar';
+ import { SearchPage } from '@backstage/plugin-search';
+ import { UserSettingsPage } from '@backstage/plugin-user-settings';
+ import { ApiExplorerPage } from '@backstage/plugin-api-docs';
import { EntityPage } from './components/catalog/EntityPage';
import { scaffolderPlugin, ScaffolderPage } from '@backstage/plugin-scaffolder';
const AppProvider = app.getProvider();
const AppRouter = app.getRouter();
-const deprecatedAppRoutes = app.getRoutes();
````
const AppProvider = app.getProvider();
const AppRouter = app.getRouter();
- const deprecatedAppRoutes = app.getRoutes();
```
As well as update or add the following routes:
@@ -975,7 +974,7 @@ As well as update or add the following routes:
- {deprecatedAppRoutes}
+ <Route path="/search" element={<SearchPage />} />
+ <Route path="/settings" element={<UserSettingsPage />} />
````
```
If you have added additional plugins with registered routes or are using `Router` components from other plugins, these should be migrated to use the `*Page` components as well. See [this commit](https://github.com/backstage/backstage/commit/abd655e42d4ed416b70848ffdb1c4b99d189f13b) for more examples of how to migrate.
+1 -1
View File
@@ -29,7 +29,7 @@
"@material-ui/lab": "4.0.0-alpha.45",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.3",
+1 -1
View File
@@ -45,7 +45,7 @@
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"swagger-ui-react": "^3.37.2"
},
"devDependencies": {
@@ -156,7 +156,6 @@ export const ApiExplorerTable = ({
}: ExplorerTableProps) => {
const [queryParamState, setQueryParamState] = useQueryParamState<TableState>(
'apiTable',
500,
);
if (error) {
+1 -1
View File
@@ -31,7 +31,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -33,7 +33,7 @@
"qs": "^6.9.6",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"recharts": "^1.8.5"
},
"devDependencies": {
@@ -185,7 +185,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase {
),
-- All the nodes that can be reached upwards from the descendants
ancestors(root_id, via_entity_ref, to_entity_ref) AS (
SELECT NULL, entity_ref, entity_ref
SELECT CAST(NULL as INT), entity_ref, entity_ref
FROM descendants
UNION
SELECT
@@ -235,7 +235,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase {
.withRecursive('ancestors', function ancestors(outer) {
return outer
.select({
root_id: tx.raw('NULL', []),
root_id: tx.raw('CAST(NULL as INT)', []),
via_entity_ref: 'entity_ref',
to_entity_ref: 'entity_ref',
})
+1 -1
View File
@@ -49,7 +49,7 @@
"react-hook-form": "^6.15.4",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"yaml": "^1.10.0"
},
"devDependencies": {
+1 -1
View File
@@ -37,7 +37,7 @@
"react": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -49,7 +49,7 @@
"react-helmet": "6.1.0",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -47,7 +47,7 @@
"react-lazylog": "^4.5.2",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -44,7 +44,7 @@
"react-lazylog": "^4.5.3",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -35,7 +35,7 @@
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"recharts": "^1.8.5"
},
"devDependencies": {
+1 -1
View File
@@ -31,7 +31,7 @@
"zen-observable": "^0.8.15",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -49,7 +49,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"recharts": "^1.8.5",
"regression": "^2.0.1",
"yup": "^0.29.3"
+1 -1
View File
@@ -42,7 +42,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -44,7 +44,7 @@
"p-limit": "^3.0.2",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -38,7 +38,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "^6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -47,7 +47,7 @@
"react-lazylog": "^4.5.3",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -31,7 +31,7 @@
"luxon": "^1.26.0",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -39,7 +39,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -40,7 +40,7 @@
"graphql": "15.5.0",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -44,7 +44,7 @@
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -30,7 +30,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+33 -4
View File
@@ -14,14 +14,43 @@
* limitations under the License.
*/
import { ClusterLocatorMethod, CustomResource } from './src/types';
export interface Config {
kubernetes?: {
serviceLocatorMethod: {
type: 'multiTenant';
};
clusterLocatorMethods: ClusterLocatorMethod[];
customResources?: CustomResource[];
clusterLocatorMethods: Array<
| {
/** @visibility frontend */
type: 'gke';
/** @visibility frontend */
projectId: string;
/** @visibility frontend */
region?: string;
/** @visibility frontend */
skipTLSVerify?: boolean;
}
| {
/** @visibility frontend */
type: 'config';
clusters: Array<{
/** @visibility frontend */
url: string;
/** @visibility frontend */
name: string;
/** @visibility secret */
serviceAccountToken?: string;
/** @visibility frontend */
authProvider: 'aws' | 'google' | 'serviceAccount';
/** @visibility frontend */
skipTLSVerify?: boolean;
}>;
}
>;
customResources?: Array<{
group: string;
apiVersion: string;
plural: string;
}>;
};
}
@@ -106,6 +106,7 @@ describe('GkeClusterLocator', () => {
authProvider: 'google',
name: 'some-cluster',
url: 'https://1.2.3.4',
skipTLSVerify: false,
},
]);
expect(mockedListClusters).toBeCalledTimes(1);
@@ -141,6 +142,7 @@ describe('GkeClusterLocator', () => {
authProvider: 'google',
name: 'some-cluster',
url: 'https://1.2.3.4',
skipTLSVerify: false,
},
]);
expect(mockedListClusters).toBeCalledTimes(1);
@@ -181,11 +183,13 @@ describe('GkeClusterLocator', () => {
authProvider: 'google',
name: 'some-cluster',
url: 'https://1.2.3.4',
skipTLSVerify: false,
},
{
authProvider: 'google',
name: 'some-other-cluster',
url: 'https://6.7.8.9',
skipTLSVerify: false,
},
]);
expect(mockedListClusters).toBeCalledTimes(1);
@@ -18,28 +18,28 @@ import { Config } from '@backstage/config';
import * as container from '@google-cloud/container';
import { ClusterDetails, KubernetesClustersSupplier } from '../types/types';
export class GkeClusterLocator implements KubernetesClustersSupplier {
private readonly projectId: string;
private readonly region: string | undefined;
private readonly client: container.v1.ClusterManagerClient;
type GkeClusterLocatorOptions = {
projectId: string;
region?: string;
skipTLSVerify?: boolean;
};
export class GkeClusterLocator implements KubernetesClustersSupplier {
constructor(
projectId: string,
client: container.v1.ClusterManagerClient,
region?: string,
) {
this.projectId = projectId;
this.region = region;
this.client = client;
}
private readonly options: GkeClusterLocatorOptions,
private readonly client: container.v1.ClusterManagerClient,
) {}
static fromConfigWithClient(
config: Config,
client: container.v1.ClusterManagerClient,
): GkeClusterLocator {
const projectId = config.getString('projectId');
const region = config.getOptionalString('region');
return new GkeClusterLocator(projectId, client, region);
const options = {
projectId: config.getString('projectId'),
region: config.getOptionalString('region') ?? '-',
skipTLSVerify: config.getOptionalBoolean('skipTLSVerify') ?? false,
};
return new GkeClusterLocator(options, client);
}
static fromConfig(config: Config): GkeClusterLocator {
@@ -50,9 +50,9 @@ export class GkeClusterLocator implements KubernetesClustersSupplier {
}
async getClusters(): Promise<ClusterDetails[]> {
const region = this.region ?? '-';
const { projectId, region, skipTLSVerify } = this.options;
const request = {
parent: `projects/${this.projectId}/locations/${region}`,
parent: `projects/${projectId}/locations/${region}`,
};
try {
@@ -62,10 +62,11 @@ export class GkeClusterLocator implements KubernetesClustersSupplier {
name: r.name ?? 'unknown',
url: `https://${r.endpoint ?? ''}`,
authProvider: 'google',
skipTLSVerify,
}));
} catch (e) {
throw new Error(
`There was an error retrieving clusters from GKE for projectId=${this.projectId} region=${region} : [${e.message}]`,
`There was an error retrieving clusters from GKE for projectId=${projectId} region=${region} : [${e.message}]`,
);
}
}
@@ -19,50 +19,6 @@ import type {
KubernetesFetchError,
} from '@backstage/plugin-kubernetes-common';
export type ClusterLocatorMethod =
| ConfigClusterLocatorMethod
| GKEClusterLocatorMethod;
export interface ConfigClusterLocatorMethod {
/**
* @visibility frontend
*/
type: 'config';
clusters: {
/**
* @visibility frontend
*/
url: string;
/**
* @visibility frontend
*/
name: string;
/**
* @visibility secret
*/
serviceAccountToken: string | undefined;
/**
* @visibility frontend
*/
authProvider: 'aws' | 'google' | 'serviceAccount';
}[];
}
export interface GKEClusterLocatorMethod {
/**
* @visibility frontend
*/
type: 'gke';
/**
* @visibility frontend
*/
projectId: string;
/**
* @visibility frontend
*/
region?: string;
}
export interface CustomResource {
group: string;
apiVersion: string;
+1 -1
View File
@@ -46,7 +46,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -43,7 +43,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -38,7 +38,7 @@
"@material-ui/lab": "4.0.0-alpha.45",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -32,7 +32,7 @@
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -43,7 +43,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -42,7 +42,7 @@
"react-hook-form": "^6.15.4",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -44,7 +44,7 @@
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-sparklines": "^1.7.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -53,7 +53,6 @@
"handlebars": "^4.7.6",
"helmet": "^4.0.0",
"isomorphic-git": "^1.8.0",
"jest-when": "^3.1.0",
"jsonschema": "^1.2.6",
"knex": "^0.95.1",
"lodash": "^4.17.21",
@@ -70,6 +69,7 @@
"@types/fs-extra": "^9.0.1",
"@types/mock-fs": "^4.13.0",
"@types/supertest": "^2.0.8",
"jest-when": "^3.1.0",
"mock-fs": "^4.13.0",
"msw": "^0.21.2",
"supertest": "^6.1.3",
+1 -1
View File
@@ -55,7 +55,7 @@
"react-lazylog": "^4.5.2",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"use-immer": "^0.5.1",
"zen-observable": "^0.8.15"
},
+1 -1
View File
@@ -41,7 +41,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -42,7 +42,7 @@
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-sparklines": "^1.7.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"timeago.js": "^4.0.2"
},
"devDependencies": {
+1 -1
View File
@@ -44,7 +44,7 @@
"rc-progress": "^3.0.0",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -42,7 +42,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -40,7 +40,7 @@
"prop-types": "^15.7.2",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -47,7 +47,7 @@
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3",
"react-use": "^17.2.4",
"sanitize-html": "^2.3.2"
},
"devDependencies": {
+1 -1
View File
@@ -36,7 +36,7 @@
"@material-ui/lab": "4.0.0-alpha.45",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -38,7 +38,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+1 -1
View File
@@ -38,7 +38,7 @@
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "6.0.0-beta.0",
"react-use": "^15.3.3"
"react-use": "^17.2.4"
},
"devDependencies": {
"@backstage/cli": "^0.6.10",
+34 -116
View File
@@ -2219,10 +2219,10 @@
through2 "^3.0.0"
xdg-basedir "^3.0.0"
"@google-cloud/storage@^5.6.0":
version "5.8.1"
resolved "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.8.1.tgz#00e627723614bcf97e6e29f9a59ec39339171847"
integrity sha512-qP8gCJ2myyMN3JMJN12d82Oo8VBSDO8vO4/x56dtQZX9+WISqcagurntnJVyFX885tIOtS97bsyv8qR1xv6HMg==
"@google-cloud/storage@^5.6.0", "@google-cloud/storage@^5.8.0":
version "5.8.5"
resolved "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.8.5.tgz#2cf1e2e0ef8ca552abc4450301fef3fea4900ef6"
integrity sha512-i0gB9CRwQeOBYP7xuvn14M40LhHCwMjceBjxE4CTvsqL519sVY5yVKxLiAedHWGwUZHJNRa7Q2CmNfkdRwVNPg==
dependencies:
"@google-cloud/common" "^3.6.0"
"@google-cloud/paginator" "^3.0.0"
@@ -2230,38 +2230,11 @@
arrify "^2.0.0"
async-retry "^1.3.1"
compressible "^2.0.12"
date-and-time "^0.14.2"
date-and-time "^1.0.0"
duplexify "^4.0.0"
extend "^3.0.2"
gaxios "^4.0.0"
gcs-resumable-upload "^3.1.3"
get-stream "^6.0.0"
hash-stream-validation "^0.2.2"
mime "^2.2.0"
mime-types "^2.0.8"
onetime "^5.1.0"
p-limit "^3.0.1"
pumpify "^2.0.0"
snakeize "^0.1.0"
stream-events "^1.0.1"
xdg-basedir "^4.0.0"
"@google-cloud/storage@^5.8.0":
version "5.8.0"
resolved "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.8.0.tgz#1f580e276f1d453790b382156421d1bcc4bd3f4b"
integrity sha512-WOShvBPOfkDXUzXMO+3j8Bzus+PFI9r1Ey9dLG2Zf458/PVuFTtaRWntd9ZiDG8g90zl2LmnA1JkDCreGUKr5g==
dependencies:
"@google-cloud/common" "^3.6.0"
"@google-cloud/paginator" "^3.0.0"
"@google-cloud/promisify" "^2.0.0"
arrify "^2.0.0"
async-retry "^1.3.1"
compressible "^2.0.12"
date-and-time "^0.14.2"
duplexify "^4.0.0"
extend "^3.0.2"
gaxios "^4.0.0"
gcs-resumable-upload "^3.1.3"
gcs-resumable-upload "^3.1.4"
get-stream "^6.0.0"
hash-stream-validation "^0.2.2"
mime "^2.2.0"
@@ -8874,11 +8847,6 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
bowser@^1.7.3:
version "1.9.4"
resolved "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a"
integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==
boxen@^1.3.0:
version "1.3.0"
resolved "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
@@ -10811,14 +10779,6 @@ css-tree@1.0.0-alpha.37:
mdn-data "2.0.4"
source-map "^0.6.1"
css-tree@^1.0.0-alpha.28:
version "1.0.0-alpha.39"
resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
dependencies:
mdn-data "2.0.6"
source-map "^0.6.1"
css-tree@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5"
@@ -10973,7 +10933,7 @@ cssstyle@^2.2.0:
dependencies:
cssom "~0.3.6"
csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.5, csstype@^2.5.7, csstype@^2.6.7:
csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.7, csstype@^2.6.7:
version "2.6.9"
resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.9.tgz#05141d0cd557a56b8891394c1911c40c8a98d098"
integrity sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==
@@ -11275,16 +11235,16 @@ dataloader@2.0.0:
resolved "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f"
integrity sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==
date-and-time@^0.14.2:
version "0.14.2"
resolved "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz#a4266c3dead460f6c231fe9674e585908dac354e"
integrity sha512-EFTCh9zRSEpGPmJaexg7HTuzZHh6cnJj1ui7IGCFNXzd2QdpsNh05Db5TF3xzJm30YN+A8/6xHSuRcQqoc3kFA==
date-and-time@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/date-and-time/-/date-and-time-0.6.3.tgz#2daee52df67c28bd93bce862756ac86b68cf4237"
integrity sha512-lcWy3AXDRJOD7MplwZMmNSRM//kZtJaLz4n6D1P5z9wEmZGBKhJRBIr1Xs9KNQJmdXPblvgffynYji4iylUTcA==
date-and-time@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/date-and-time/-/date-and-time-1.0.0.tgz#0062394bdf6f44e961f0db00511cb19cdf3cc0a5"
integrity sha512-477D7ypIiqlXBkxhU7YtG9wWZJEQ+RUpujt2quTfgf4+E8g5fNUkB0QIL0bVyP5/TKBg8y55Hfa1R/c4bt3dEw==
date-fns@^1.27.2:
version "1.30.1"
resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
@@ -13195,11 +13155,6 @@ fast-text-encoding@^1.0.0, fast-text-encoding@^1.0.3:
resolved "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz#ec02ac8e01ab8a319af182dae2681213cfe9ce53"
integrity sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==
fastest-stable-stringify@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz#9122d406d4c9d98bea644a6b6853d5874b87b028"
integrity sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg=
fastest-stable-stringify@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz#3757a6774f6ec8de40c4e86ec28ea02417214c76"
@@ -13854,10 +13809,10 @@ gcs-resumable-upload@^1.0.0:
pumpify "^1.5.1"
stream-events "^1.0.4"
gcs-resumable-upload@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.3.tgz#1e38e1339600b85812e6430a5ab455453c64cce3"
integrity sha512-LjVrv6YVH0XqBr/iBW0JgRA1ndxhK6zfEFFJR4im51QVTj/4sInOXimY2evDZuSZ75D3bHxTaQAdXRukMc1y+w==
gcs-resumable-upload@^3.1.4:
version "3.1.4"
resolved "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.4.tgz#2e591889efb02247af26868de300b398346b17b5"
integrity sha512-5dyDfHrrVcIskiw/cPssVD4HRiwoHjhk1Nd6h5W3pQ/qffDvhfy4oNCr1f3ZXFPwTnxkCbibsB+73oOM+NvmJQ==
dependencies:
abort-controller "^3.0.0"
configstore "^5.0.0"
@@ -15427,14 +15382,6 @@ init-package-json@^2.0.2:
validate-npm-package-license "^3.0.4"
validate-npm-package-name "^3.0.0"
inline-style-prefixer@^4.0.0:
version "4.0.2"
resolved "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz#d390957d26f281255fe101da863158ac6eb60911"
integrity sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg==
dependencies:
bowser "^1.7.3"
css-in-js-utils "^2.0.0"
inline-style-prefixer@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.0.tgz#f73d5dbf2855733d6b153a4d24b7b47a73e9770b"
@@ -18352,11 +18299,6 @@ mdn-data@2.0.4:
resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
mdn-data@2.0.6:
version "2.0.6"
resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
mdurl@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
@@ -19064,21 +19006,7 @@ nan@2.14.1, nan@^2.12.1, nan@^2.14.0:
resolved "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
nano-css@^5.1.0, nano-css@^5.2.1:
version "5.3.0"
resolved "https://registry.npmjs.org/nano-css/-/nano-css-5.3.0.tgz#9d3cd29788d48b6a07f52aa4aec7cf4da427b6b5"
integrity sha512-uM/9NGK9/E9/sTpbIZ/bQ9xOLOIHZwrrb/CRlbDHBU/GFS7Gshl24v/WJhwsVViWkpOXUmiZ66XO7fSB4Wd92Q==
dependencies:
css-tree "^1.0.0-alpha.28"
csstype "^2.5.5"
fastest-stable-stringify "^1.0.1"
inline-style-prefixer "^4.0.0"
rtl-css-js "^1.9.0"
sourcemap-codec "^1.4.1"
stacktrace-js "^2.0.0"
stylis "3.5.0"
nano-css@^5.3.1:
nano-css@^5.1.0, nano-css@^5.2.1, nano-css@^5.3.1:
version "5.3.1"
resolved "https://registry.npmjs.org/nano-css/-/nano-css-5.3.1.tgz#b709383e07ad3be61f64edffacb9d98250b87a1f"
integrity sha512-ENPIyNzANQRyYVvb62ajDd7PAyIgS2LIUnT9ewih4yrXSZX4hKoUwssy8WjUH++kEOA5wUTMgNnV7ko5n34kUA==
@@ -22426,10 +22354,10 @@ react-use@^15.3.3, react-use@^15.3.6:
ts-easing "^0.2.0"
tslib "^2.0.0"
react-use@^17.2.1:
version "17.2.1"
resolved "https://registry.npmjs.org/react-use/-/react-use-17.2.1.tgz#c81e12544115ed049c7deba1e3bb3d977dfee9b8"
integrity sha512-9r51/at7/Nr/nEP4CsHz+pl800EAqhIY9R6O68m68kaWc8slDAfx1UrIedQqpsb4ImddFYb+6hF1i5Vj4u4Cnw==
react-use@^17.2.1, react-use@^17.2.4:
version "17.2.4"
resolved "https://registry.npmjs.org/react-use/-/react-use-17.2.4.tgz#1f89be3db0a8237c79253db0a15e12bbe3cfeff1"
integrity sha512-vQGpsAM0F5UIlshw5UI8ULGPS4yn5rm7/qvn3T1Gnkrz7YRMEEMh+ynKcmRloOyiIeLvKWiQjMiwRGtdbgs5qQ==
dependencies:
"@types/js-cookie" "^2.2.6"
"@xobotyi/scrollbar-width" "^1.9.5"
@@ -23337,7 +23265,7 @@ rsvp@^4.8.4:
resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
rtl-css-js@^1.14.0, rtl-css-js@^1.9.0:
rtl-css-js@^1.14.0:
version "1.14.0"
resolved "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.14.0.tgz#daa4f192a92509e292a0519f4b255e6e3c076b7d"
integrity sha512-Dl5xDTeN3e7scU1cWX8c9b6/Nqz3u/HgR4gePc1kWXYiQWVQbKCEyK6+Hxve9LbcJ5EieHy1J9nJCN3grTtGwg==
@@ -23430,9 +23358,9 @@ sane@^4.0.3:
walker "~1.0.5"
sanitize-html@^2.3.2:
version "2.3.2"
resolved "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.3.2.tgz#a1954aea877a096c408aca7b0c260bef6e4fc402"
integrity sha512-p7neuskvC8pSurUjdVmbWPXmc9A4+QpOXIL+4gwFC+av5h+lYCXFT8uEneqsFQg/wEA1IH+cKQA60AaQI6p3cg==
version "2.3.3"
resolved "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.3.3.tgz#3db382c9a621cce4c46d90f10c64f1e9da9e8353"
integrity sha512-DCFXPt7Di0c6JUnlT90eIgrjs6TsJl/8HYU3KLdmrVclFN4O0heTcVbJiMa23OKVr6aR051XYtsgd8EWwEBwUA==
dependencies:
deepmerge "^4.2.2"
escape-string-regexp "^4.0.0"
@@ -23494,12 +23422,7 @@ schema-utils@^3.0.0:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
screenfull@^5.0.0:
version "5.0.2"
resolved "https://registry.npmjs.org/screenfull/-/screenfull-5.0.2.tgz#b9acdcf1ec676a948674df5cd0ff66b902b0bed7"
integrity sha512-cCF2b+L/mnEiORLN5xSAz6H3t18i2oHh9BA8+CQlAh5DRw2+NFAGQJOSYbcGw8B2k04g/lVvFcfZ83b3ysH5UQ==
screenfull@^5.1.0:
screenfull@^5.0.0, screenfull@^5.1.0:
version "5.1.0"
resolved "https://registry.npmjs.org/screenfull/-/screenfull-5.1.0.tgz#85c13c70f4ead4c1b8a935c70010dfdcd2c0e5c8"
integrity sha512-dYaNuOdzr+kc6J6CFcBrzkLCfyGcMg+gWkJ8us93IQ7y1cevhQAugFsaCdMHb6lw8KV3xPzSxzH7zM1dQap9mA==
@@ -24069,7 +23992,7 @@ source-map@^0.7.3:
resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
sourcemap-codec@^1.4.1, sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8:
sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8:
version "1.4.8"
resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
@@ -24302,7 +24225,7 @@ stacktrace-gps@^3.0.4:
source-map "0.5.6"
stackframe "^1.1.1"
stacktrace-js@^2.0.0, stacktrace-js@^2.0.2:
stacktrace-js@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b"
integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==
@@ -24363,9 +24286,9 @@ store2@^2.7.1:
integrity sha512-tWEpK0snS2RPUq1i3R6OahfJNjWCQYNxq0+by1amCSuw0mXtymJpzmZIeYpA1UAa+7B0grCpNYIbDcd7AgTbFg==
storybook-dark-mode@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/storybook-dark-mode/-/storybook-dark-mode-1.0.3.tgz#8d58a874b6107ff1a7f29ebb0e6726b8036eee08"
integrity sha512-mjHLrv/dwtqKmbOoQ2CMtGKDttWSnUybutujsIPxLcEC77EujjWiRBFv46LtXAZEyZLm8sGFUz0s6HJJfJ3tSw==
version "1.0.8"
resolved "https://registry.npmjs.org/storybook-dark-mode/-/storybook-dark-mode-1.0.8.tgz#bbd64b382fd62d38685fdd769e2cac4e32ec293d"
integrity sha512-uY6yTSd1vYE0YwlON50u+iIoNF/fmMj59ww1cpd/naUcmOmCjwawViKFG5YjichwdR/yJ5ybWRUF0tnRQfaSiw==
dependencies:
fast-deep-equal "^3.0.0"
memoizerific "^1.11.3"
@@ -24722,11 +24645,6 @@ stylehacks@^4.0.0:
postcss "^7.0.0"
postcss-selector-parser "^3.0.0"
stylis@3.5.0:
version "3.5.0"
resolved "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz#016fa239663d77f868fef5b67cf201c4b7c701e1"
integrity sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw==
stylis@^4.0.6:
version "4.0.7"
resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz#412a90c28079417f3d27c028035095e4232d2904"
@@ -25782,9 +25700,9 @@ typescript@^4.0.3, typescript@^4.1.3, typescript@~4.1.3:
integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==
ua-parser-js@^0.7.18:
version "0.7.21"
resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777"
integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==
version "0.7.28"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31"
integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==
uc.micro@^1.0.1, uc.micro@^1.0.5:
version "1.0.6"