Merge branch 'backstage:master' into feature/support-aoss
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
---
|
||||
'@backstage/plugin-newrelic-dashboard': minor
|
||||
---
|
||||
|
||||
Changes in `newrelic-dashboard` plugin:
|
||||
|
||||
- Make DashboardSnapshotList component public
|
||||
- Settle discrepancies in the exported API
|
||||
- Deprecate DashboardSnapshotComponent
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/theme': patch
|
||||
---
|
||||
|
||||
Added support for string `fontSize` values (e.g. `"2.5rem"`) in themes in addition to numbers. Also added an optional `fontFamily` prop for header typography variants to allow further customization.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-tech-insights': patch
|
||||
---
|
||||
|
||||
Export `ScorecardInfo` and `ScorecardsList` components to be able to use manually queried check results directly.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/frontend-app-api': patch
|
||||
---
|
||||
|
||||
Added support for the existing routing system.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-playlist': patch
|
||||
---
|
||||
|
||||
Updated Playlist read me with additional screenshots
|
||||
+38
-44
@@ -18,11 +18,11 @@ Running all tests:
|
||||
|
||||
yarn test
|
||||
|
||||
Running an individual test (e.g. `MyComponent.test.js`):
|
||||
Running an individual test (e.g. `MyComponent.test.tsx`):
|
||||
|
||||
yarn test MyComponent
|
||||
|
||||
To run both `MyComponent.test.js` and `MyControl.test.js` suite of tests:
|
||||
To run both `MyComponent.test.tsx` and `MyControl.test.tsx` suite of tests:
|
||||
|
||||
yarn test MyCo
|
||||
|
||||
@@ -32,9 +32,9 @@ working on.
|
||||
|
||||
## Naming Test Files
|
||||
|
||||
Tests should be named `[filename].test.js`.
|
||||
Tests should be named `[filename].test.ts`, or `[filename].test.tsx` if it contains JSX (as is the case for a lot of React tests, e.g. components).
|
||||
|
||||
For example, the tests for **`Link.js`** exist in the file **`Link.test.js`**.
|
||||
For example, the tests for **`Link.tsx`** exist in the file **`Link.test.tsx`**.
|
||||
|
||||
## Third-Party Dependencies
|
||||
|
||||
@@ -183,9 +183,9 @@ data then it actually does it. this way both tests fail if the data loading part
|
||||
breaks and the next developer immediately know the problem is that the data
|
||||
loading is broken, not that the loading indicator is broken.
|
||||
|
||||
# Examples
|
||||
## Examples
|
||||
|
||||
## Utility Functions
|
||||
### Utility Functions
|
||||
|
||||
A utility function is a function with no side effects. It takes in arguments and
|
||||
returns a result or displays an error or console message, like so:
|
||||
@@ -241,12 +241,12 @@ it('Works with midCharIx', () => {
|
||||
});
|
||||
```
|
||||
|
||||
## Non-React Classes
|
||||
### Non-React Classes
|
||||
|
||||
Testing a JavaScript object which is _not_ a React component follows a lot of
|
||||
the same principles as testing objects in other languages.
|
||||
|
||||
### API Testing Principles
|
||||
#### API Testing Principles
|
||||
|
||||
Testing an API involves verifying four things:
|
||||
|
||||
@@ -255,7 +255,7 @@ Testing an API involves verifying four things:
|
||||
3. Server response is translated into an expected JavaScript object.
|
||||
4. Server errors are handled gracefully.
|
||||
|
||||
### Mocking API Calls
|
||||
#### Mocking API Calls
|
||||
|
||||
[Mocking in Jest](https://facebook.github.io/jest/docs/en/mock-functions.html)
|
||||
involves wrapping existing functions (like an API call function) with an
|
||||
@@ -263,52 +263,46 @@ alternative.
|
||||
|
||||
For example:
|
||||
|
||||
**`./MyApi.js`**
|
||||
**`./MyApi.ts`**
|
||||
|
||||
```ts
|
||||
export {
|
||||
fetchSomethingFromServer: () => {
|
||||
// Live production call to a URI. Must be avoided during testing!
|
||||
return fetch('blah');
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
**`./__mocks__/MyApi.js`**
|
||||
|
||||
```ts
|
||||
export {
|
||||
fetchSomethingFromServer: () => {
|
||||
// Simulate a production call, but avoid jest and just use a promise
|
||||
return Promise.resolve('some result object simulating server data here');
|
||||
}
|
||||
export async function fetchSomethingFromServer() {
|
||||
// Live production call to a URI. Must be avoided during testing!
|
||||
return fetch('blah');
|
||||
}
|
||||
```
|
||||
|
||||
**`./MyApi.test.js`**
|
||||
**`./__mocks__/MyApi.ts`**
|
||||
|
||||
```ts
|
||||
/* eslint-disable import/first */
|
||||
export async function fetchSomethingFromServer() {
|
||||
// Simulate a production call response
|
||||
return 'some result object simulating server data here';
|
||||
}
|
||||
```
|
||||
|
||||
jest.mock('./MyApi'); // Instruct Jest to swap all future imports of './MyApi.js' to './__mocks__/MyApi.js'
|
||||
**`./MyApi.test.ts`**
|
||||
|
||||
import MyApi from './MyApi'; // Will actually return the contents of the file in the __mocks__ folder now
|
||||
```ts
|
||||
// This import will actually return the contents of the file in the
|
||||
// __mocks__ folder now, due to the jest.mock line below
|
||||
import { fetchSomethingFromServer } from './MyApi';
|
||||
|
||||
it('loads data', done => {
|
||||
MyApi.fetchSomethingFromServer().then(result => {
|
||||
expect(result).toBe('some result object simulating server data here');
|
||||
done();
|
||||
});
|
||||
// This instructs Jest to swap all imports of './MyApi.ts' to
|
||||
// './__mocks__/MyApi.ts' - this gets automatically hoisted to the top
|
||||
// of the file
|
||||
jest.mock('./MyApi');
|
||||
|
||||
it('loads data', async () => {
|
||||
await expect(fetchSomethingFromServer()).resolves.toBe(
|
||||
'some result object simulating server data here',
|
||||
);
|
||||
});
|
||||
```
|
||||
|
||||
Note: make sure you disable the eslint `'import/first'` rule at the top of the
|
||||
file since technically you are not allowed by the default settings to have an
|
||||
import after the `jest.mock` call.
|
||||
### React Components
|
||||
|
||||
## React Components
|
||||
|
||||
### Working with the React Lifecycle
|
||||
#### Working with the React Lifecycle
|
||||
|
||||
The [React lifecycle](https://reactjs.org/docs/state-and-lifecycle.html) is
|
||||
asynchronous.
|
||||
@@ -317,7 +311,7 @@ When you call `setState` or update the `props` of a component, there are several
|
||||
asynchronous stages that must occur before a rerender. Note the following
|
||||
example:
|
||||
|
||||
```jsx
|
||||
```tsx
|
||||
class MyComponent extends Component {
|
||||
load() {
|
||||
this.setState({loading: true});
|
||||
@@ -350,7 +344,7 @@ For more information:
|
||||
|
||||
- [React lifecycle](https://reactjs.org/docs/state-and-lifecycle.html)
|
||||
|
||||
### Accessing `store`, `theme`, routing, browser history, etc.
|
||||
#### Accessing `store`, `theme`, routing, browser history, etc
|
||||
|
||||
The Backstage application has several core providers at its root. To run your
|
||||
test wrapped in a "sample" Backstage application, you can use our utility
|
||||
@@ -369,6 +363,6 @@ functions:
|
||||
Note: wrapping in the test application **requires** you to do a `find()` or
|
||||
`dive()` since the wrapped component is now the application.
|
||||
|
||||
# Debugging Jest Tests
|
||||
## Debugging Jest Tests
|
||||
|
||||
You can find it [here](https://backstage.io/docs/local-dev/cli-build-system#debugging-jest-tests)
|
||||
|
||||
+46
-46
@@ -2604,90 +2604,90 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-darwin-arm64@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-darwin-arm64@npm:1.3.90"
|
||||
"@swc/core-darwin-arm64@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-darwin-arm64@npm:1.3.92"
|
||||
conditions: os=darwin & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-darwin-x64@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-darwin-x64@npm:1.3.90"
|
||||
"@swc/core-darwin-x64@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-darwin-x64@npm:1.3.92"
|
||||
conditions: os=darwin & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm-gnueabihf@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.90"
|
||||
"@swc/core-linux-arm-gnueabihf@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm64-gnu@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm64-gnu@npm:1.3.90"
|
||||
"@swc/core-linux-arm64-gnu@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm64-gnu@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm64 & libc=glibc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm64-musl@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm64-musl@npm:1.3.90"
|
||||
"@swc/core-linux-arm64-musl@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm64-musl@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm64 & libc=musl
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-x64-gnu@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-x64-gnu@npm:1.3.90"
|
||||
"@swc/core-linux-x64-gnu@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-x64-gnu@npm:1.3.92"
|
||||
conditions: os=linux & cpu=x64 & libc=glibc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-x64-musl@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-x64-musl@npm:1.3.90"
|
||||
"@swc/core-linux-x64-musl@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-x64-musl@npm:1.3.92"
|
||||
conditions: os=linux & cpu=x64 & libc=musl
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-arm64-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-arm64-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-arm64-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-arm64-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-ia32-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-ia32-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-ia32-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-ia32-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=ia32
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-x64-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-x64-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-x64-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-x64-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core@npm:^1.3.46":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core@npm:1.3.90"
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core@npm:1.3.92"
|
||||
dependencies:
|
||||
"@swc/core-darwin-arm64": 1.3.90
|
||||
"@swc/core-darwin-x64": 1.3.90
|
||||
"@swc/core-linux-arm-gnueabihf": 1.3.90
|
||||
"@swc/core-linux-arm64-gnu": 1.3.90
|
||||
"@swc/core-linux-arm64-musl": 1.3.90
|
||||
"@swc/core-linux-x64-gnu": 1.3.90
|
||||
"@swc/core-linux-x64-musl": 1.3.90
|
||||
"@swc/core-win32-arm64-msvc": 1.3.90
|
||||
"@swc/core-win32-ia32-msvc": 1.3.90
|
||||
"@swc/core-win32-x64-msvc": 1.3.90
|
||||
"@swc/core-darwin-arm64": 1.3.92
|
||||
"@swc/core-darwin-x64": 1.3.92
|
||||
"@swc/core-linux-arm-gnueabihf": 1.3.92
|
||||
"@swc/core-linux-arm64-gnu": 1.3.92
|
||||
"@swc/core-linux-arm64-musl": 1.3.92
|
||||
"@swc/core-linux-x64-gnu": 1.3.92
|
||||
"@swc/core-linux-x64-musl": 1.3.92
|
||||
"@swc/core-win32-arm64-msvc": 1.3.92
|
||||
"@swc/core-win32-ia32-msvc": 1.3.92
|
||||
"@swc/core-win32-x64-msvc": 1.3.92
|
||||
"@swc/counter": ^0.1.1
|
||||
"@swc/types": ^0.1.5
|
||||
peerDependencies:
|
||||
@@ -2716,7 +2716,7 @@ __metadata:
|
||||
peerDependenciesMeta:
|
||||
"@swc/helpers":
|
||||
optional: true
|
||||
checksum: f8ced5187068dc73445c135065c6492f0ac559d0f7720c2482aa9663c87bd015f3d2abef6ee7b2f817280a5e8dd0946c59cce7e1499180644fbc948a9e3823ab
|
||||
checksum: 88c0c62ff790e896180862c341be8bae98baf0a5c5e87f2f04f49e14b8c4fba460d6b352618b4dda066c8ae6bf152cd843eab25837f38128175208b8c0635721
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -9421,13 +9421,13 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"postcss@npm:^8.4.17, postcss@npm:^8.4.19, postcss@npm:^8.4.21":
|
||||
version: 8.4.23
|
||||
resolution: "postcss@npm:8.4.23"
|
||||
version: 8.4.31
|
||||
resolution: "postcss@npm:8.4.31"
|
||||
dependencies:
|
||||
nanoid: ^3.3.6
|
||||
picocolors: ^1.0.0
|
||||
source-map-js: ^1.0.2
|
||||
checksum: 8bb9d1b2ea6e694f8987d4f18c94617971b2b8d141602725fedcc2222fdc413b776a6e1b969a25d627d7b2681ca5aabb56f59e727ef94072e1b6ac8412105a2f
|
||||
checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
"@backstage/plugin-graphiql": "workspace:^",
|
||||
"@backstage/theme": "workspace:^",
|
||||
"@backstage/types": "workspace:^",
|
||||
"@backstage/version-bridge": "workspace:^",
|
||||
"@material-ui/core": "^4.12.4",
|
||||
"@material-ui/icons": "^4.11.3",
|
||||
"@types/react": "^16.13.1 || ^17.0.0",
|
||||
|
||||
@@ -0,0 +1,528 @@
|
||||
/*
|
||||
* Copyright 2020 The Backstage Authors
|
||||
*
|
||||
* 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 {
|
||||
BackstagePlugin,
|
||||
RouteRef,
|
||||
createRouteRef,
|
||||
} from '@backstage/core-plugin-api';
|
||||
import { extractRouteInfoFromInstanceTree } from './extractRouteInfoFromInstanceTree';
|
||||
import {
|
||||
Extension,
|
||||
coreExtensionData,
|
||||
createExtension,
|
||||
createExtensionInput,
|
||||
createPlugin,
|
||||
} from '@backstage/frontend-plugin-api';
|
||||
import { createInstances } from '../wiring/createApp';
|
||||
import { MockConfigApi } from '@backstage/test-utils';
|
||||
|
||||
const ref1 = createRouteRef({ id: 'page1' });
|
||||
const ref2 = createRouteRef({ id: 'page2' });
|
||||
const ref3 = createRouteRef({ id: 'page3' });
|
||||
const ref4 = createRouteRef({ id: 'page4' });
|
||||
const ref5 = createRouteRef({ id: 'page5' });
|
||||
const refOrder = [ref1, ref2, ref3, ref4, ref5];
|
||||
|
||||
function createTestExtension(options: {
|
||||
id: string;
|
||||
at?: string;
|
||||
path?: string;
|
||||
routeRef?: RouteRef;
|
||||
}) {
|
||||
return createExtension({
|
||||
id: options.id,
|
||||
at: options.at ?? 'core.routes/children',
|
||||
output: {
|
||||
element: coreExtensionData.reactElement,
|
||||
path: coreExtensionData.routePath.optional(),
|
||||
routeRef: coreExtensionData.routeRef.optional(),
|
||||
},
|
||||
inputs: {
|
||||
children: createExtensionInput({
|
||||
element: coreExtensionData.reactElement,
|
||||
}),
|
||||
},
|
||||
factory({ bind }) {
|
||||
bind({
|
||||
path: options.path,
|
||||
routeRef: options.routeRef,
|
||||
element: React.createElement('div'),
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function routeInfoFromExtensions(extensions: Extension<unknown>[]) {
|
||||
const plugin = createPlugin({
|
||||
id: 'test',
|
||||
extensions,
|
||||
});
|
||||
const { rootInstances } = createInstances({
|
||||
config: new MockConfigApi({}),
|
||||
plugins: [plugin],
|
||||
});
|
||||
|
||||
return extractRouteInfoFromInstanceTree(rootInstances);
|
||||
}
|
||||
|
||||
function sortedEntries<T>(map: Map<RouteRef, T>): [RouteRef, T][] {
|
||||
return Array.from(map).sort(
|
||||
([a], [b]) => refOrder.indexOf(a) - refOrder.indexOf(b),
|
||||
);
|
||||
}
|
||||
|
||||
function routeObj(
|
||||
path: string,
|
||||
refs: RouteRef[],
|
||||
children: any[] = [],
|
||||
type: 'mounted' | 'gathered' = 'mounted',
|
||||
backstagePlugin?: BackstagePlugin,
|
||||
) {
|
||||
return {
|
||||
path: path,
|
||||
caseSensitive: false,
|
||||
element: type,
|
||||
routeRefs: new Set(refs),
|
||||
children: [
|
||||
{
|
||||
path: '*',
|
||||
caseSensitive: false,
|
||||
element: 'match-all',
|
||||
routeRefs: new Set(),
|
||||
plugins: new Set(),
|
||||
},
|
||||
...children,
|
||||
],
|
||||
plugins: backstagePlugin ? new Set([backstagePlugin]) : new Set(),
|
||||
};
|
||||
}
|
||||
|
||||
describe('discovery', () => {
|
||||
it('should collect routes', () => {
|
||||
const info = routeInfoFromExtensions([
|
||||
createTestExtension({
|
||||
id: 'nothing',
|
||||
path: 'nothing',
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page1',
|
||||
path: 'foo',
|
||||
routeRef: ref1,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page2',
|
||||
at: 'page1/children',
|
||||
path: 'bar/:id',
|
||||
routeRef: ref2,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page3',
|
||||
at: 'page2/children',
|
||||
path: 'baz',
|
||||
routeRef: ref3,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page4',
|
||||
path: 'divsoup',
|
||||
routeRef: ref4,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page5',
|
||||
at: 'page1/children',
|
||||
path: 'blop',
|
||||
routeRef: ref5,
|
||||
}),
|
||||
]);
|
||||
|
||||
expect(sortedEntries(info.routePaths)).toEqual([
|
||||
[ref1, 'foo'],
|
||||
[ref2, 'bar/:id'],
|
||||
[ref3, 'baz'],
|
||||
[ref4, 'divsoup'],
|
||||
[ref5, 'blop'],
|
||||
]);
|
||||
expect(sortedEntries(info.routeParents)).toEqual([
|
||||
[ref1, undefined],
|
||||
[ref2, ref1],
|
||||
[ref3, ref2],
|
||||
[ref4, undefined],
|
||||
[ref5, ref1],
|
||||
]);
|
||||
expect(info.routeObjects).toEqual([
|
||||
routeObj('nothing', []),
|
||||
routeObj(
|
||||
'foo',
|
||||
[ref1],
|
||||
[
|
||||
routeObj(
|
||||
'bar/:id',
|
||||
[ref2],
|
||||
[routeObj('baz', [ref3], undefined, undefined, expect.any(Object))],
|
||||
undefined,
|
||||
expect.any(Object),
|
||||
),
|
||||
routeObj('blop', [ref5], undefined, undefined, expect.any(Object)),
|
||||
],
|
||||
undefined,
|
||||
expect.any(Object),
|
||||
),
|
||||
routeObj('divsoup', [ref4], undefined, undefined, expect.any(Object)),
|
||||
]);
|
||||
});
|
||||
|
||||
it('should handle all react router Route patterns', () => {
|
||||
const info = routeInfoFromExtensions([
|
||||
createTestExtension({
|
||||
id: 'page1',
|
||||
path: 'foo',
|
||||
routeRef: ref1,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page2',
|
||||
at: 'page1/children',
|
||||
path: 'bar/:id',
|
||||
routeRef: ref2,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page3',
|
||||
path: 'baz',
|
||||
routeRef: ref3,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page4',
|
||||
at: 'page3/children',
|
||||
path: 'divsoup',
|
||||
routeRef: ref4,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page5',
|
||||
at: 'page3/children',
|
||||
path: 'blop',
|
||||
routeRef: ref5,
|
||||
}),
|
||||
]);
|
||||
|
||||
expect(sortedEntries(info.routePaths)).toEqual([
|
||||
[ref1, 'foo'],
|
||||
[ref2, 'bar/:id'],
|
||||
[ref3, 'baz'],
|
||||
[ref4, 'divsoup'],
|
||||
[ref5, 'blop'],
|
||||
]);
|
||||
expect(sortedEntries(info.routeParents)).toEqual([
|
||||
[ref1, undefined],
|
||||
[ref2, ref1],
|
||||
[ref3, undefined],
|
||||
[ref4, ref3],
|
||||
[ref5, ref3],
|
||||
]);
|
||||
});
|
||||
|
||||
it('should strip leading slashes in route paths', () => {
|
||||
const info = routeInfoFromExtensions([
|
||||
createTestExtension({
|
||||
id: 'page1',
|
||||
path: '/foo',
|
||||
routeRef: ref1,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page2',
|
||||
at: 'page1/children',
|
||||
path: '/bar/:id',
|
||||
routeRef: ref2,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page3',
|
||||
path: '/baz',
|
||||
routeRef: ref3,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page4',
|
||||
at: 'page3/children',
|
||||
path: '/divsoup',
|
||||
routeRef: ref4,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page5',
|
||||
at: 'page3/children',
|
||||
path: '/blop',
|
||||
routeRef: ref5,
|
||||
}),
|
||||
]);
|
||||
|
||||
expect(sortedEntries(info.routePaths)).toEqual([
|
||||
[ref1, 'foo'],
|
||||
[ref2, 'bar/:id'],
|
||||
[ref3, 'baz'],
|
||||
[ref4, 'divsoup'],
|
||||
[ref5, 'blop'],
|
||||
]);
|
||||
expect(sortedEntries(info.routeParents)).toEqual([
|
||||
[ref1, undefined],
|
||||
[ref2, ref1],
|
||||
[ref3, undefined],
|
||||
[ref4, ref3],
|
||||
[ref5, ref3],
|
||||
]);
|
||||
});
|
||||
|
||||
it('should use the route aggregator key to bind child routes to the same path', () => {
|
||||
const info = routeInfoFromExtensions([
|
||||
createTestExtension({
|
||||
id: 'foo',
|
||||
path: 'foo',
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page1',
|
||||
at: 'foo/children',
|
||||
routeRef: ref1,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'fooChild',
|
||||
at: 'foo/children',
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page2',
|
||||
at: 'fooChild/children',
|
||||
routeRef: ref2,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'fooEmpty',
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page3',
|
||||
path: 'bar',
|
||||
routeRef: ref3,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page3Child',
|
||||
at: 'page3/children',
|
||||
path: '',
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page4',
|
||||
at: 'page3Child/children',
|
||||
routeRef: ref4,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page5',
|
||||
at: 'page4/children',
|
||||
routeRef: ref5,
|
||||
}),
|
||||
]);
|
||||
|
||||
expect(sortedEntries(info.routePaths)).toEqual([
|
||||
[ref1, 'foo'],
|
||||
[ref2, 'foo'],
|
||||
[ref3, 'bar'],
|
||||
[ref4, ''],
|
||||
[ref5, ''],
|
||||
]);
|
||||
expect(sortedEntries(info.routeParents)).toEqual([
|
||||
[ref1, undefined],
|
||||
[ref2, undefined],
|
||||
[ref3, undefined],
|
||||
[ref4, ref3],
|
||||
[ref5, ref3],
|
||||
]);
|
||||
expect(info.routeObjects).toEqual([
|
||||
routeObj('foo', [ref1, ref2], [], 'mounted', expect.any(Object)),
|
||||
routeObj(
|
||||
'bar',
|
||||
[ref3],
|
||||
[routeObj('', [ref4, ref5], [], 'mounted', expect.any(Object))],
|
||||
'mounted',
|
||||
expect.any(Object),
|
||||
),
|
||||
]);
|
||||
});
|
||||
|
||||
it('should use the route aggregator but stop when encountering explicit path', () => {
|
||||
const info = routeInfoFromExtensions([
|
||||
createTestExtension({
|
||||
id: 'page1',
|
||||
path: 'foo',
|
||||
routeRef: ref1,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page1Child',
|
||||
at: 'page1/children',
|
||||
path: 'bar',
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page2',
|
||||
at: 'page1Child/children',
|
||||
routeRef: ref2,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page3',
|
||||
at: 'page2/children',
|
||||
path: 'baz',
|
||||
routeRef: ref3,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page4',
|
||||
at: 'page3/children',
|
||||
path: '/blop',
|
||||
routeRef: ref4,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page5',
|
||||
at: 'page2/children',
|
||||
routeRef: ref5,
|
||||
}),
|
||||
]);
|
||||
|
||||
expect(sortedEntries(info.routePaths)).toEqual([
|
||||
[ref1, 'foo'],
|
||||
[ref2, 'bar'],
|
||||
[ref3, 'baz'],
|
||||
[ref4, 'blop'],
|
||||
[ref5, 'bar'],
|
||||
]);
|
||||
expect(sortedEntries(info.routeParents)).toEqual([
|
||||
[ref1, undefined],
|
||||
[ref2, ref1],
|
||||
[ref3, ref2],
|
||||
[ref4, ref3],
|
||||
[ref5, ref1],
|
||||
]);
|
||||
expect(info.routeObjects).toEqual([
|
||||
routeObj(
|
||||
'foo',
|
||||
[ref1],
|
||||
[
|
||||
routeObj(
|
||||
'bar',
|
||||
[ref2, ref5],
|
||||
[
|
||||
routeObj(
|
||||
'baz',
|
||||
[ref3],
|
||||
[
|
||||
routeObj(
|
||||
'blop',
|
||||
[ref4],
|
||||
undefined,
|
||||
undefined,
|
||||
expect.any(Object),
|
||||
),
|
||||
],
|
||||
undefined,
|
||||
expect.any(Object),
|
||||
),
|
||||
],
|
||||
'mounted',
|
||||
expect.any(Object),
|
||||
),
|
||||
],
|
||||
undefined,
|
||||
expect.any(Object),
|
||||
),
|
||||
]);
|
||||
});
|
||||
|
||||
it('should account for loose route paths', () => {
|
||||
const info = routeInfoFromExtensions([
|
||||
createTestExtension({
|
||||
id: 'r',
|
||||
path: 'r',
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page1',
|
||||
at: 'r/children',
|
||||
path: 'x',
|
||||
routeRef: ref1,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'y',
|
||||
path: 'y',
|
||||
at: 'r/children',
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page2',
|
||||
at: 'y/children',
|
||||
path: '1',
|
||||
routeRef: ref2,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page3',
|
||||
at: 'page2/children',
|
||||
path: 'a',
|
||||
routeRef: ref3,
|
||||
}),
|
||||
createTestExtension({
|
||||
id: 'page4',
|
||||
at: 'page2/children',
|
||||
path: 'b',
|
||||
routeRef: ref4,
|
||||
}),
|
||||
]);
|
||||
|
||||
expect(sortedEntries(info.routePaths)).toEqual([
|
||||
[ref1, 'r/x'],
|
||||
[ref2, 'r/y/1'],
|
||||
[ref3, 'a'],
|
||||
[ref4, 'b'],
|
||||
]);
|
||||
expect(sortedEntries(info.routeParents)).toEqual([
|
||||
[ref1, undefined],
|
||||
[ref2, undefined],
|
||||
[ref3, ref2],
|
||||
[ref4, ref2],
|
||||
]);
|
||||
expect(info.routeObjects).toEqual([
|
||||
routeObj(
|
||||
'r',
|
||||
[],
|
||||
[
|
||||
routeObj('x', [ref1], [], 'mounted', expect.any(Object)),
|
||||
routeObj(
|
||||
'y',
|
||||
[],
|
||||
[
|
||||
routeObj(
|
||||
'1',
|
||||
[ref2],
|
||||
[
|
||||
routeObj(
|
||||
'a',
|
||||
[ref3],
|
||||
undefined,
|
||||
'mounted',
|
||||
expect.any(Object),
|
||||
),
|
||||
routeObj(
|
||||
'b',
|
||||
[ref4],
|
||||
undefined,
|
||||
'mounted',
|
||||
expect.any(Object),
|
||||
),
|
||||
],
|
||||
'mounted',
|
||||
expect.any(Object),
|
||||
),
|
||||
],
|
||||
'mounted',
|
||||
),
|
||||
],
|
||||
),
|
||||
]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* Copyright 2023 The Backstage Authors
|
||||
*
|
||||
* 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 { RouteRef } from '@backstage/core-plugin-api';
|
||||
import { coreExtensionData } from '@backstage/frontend-plugin-api';
|
||||
import { ExtensionInstance } from '../wiring/createExtensionInstance';
|
||||
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
|
||||
import { BackstageRouteObject } from '../../../core-app-api/src/routing/types';
|
||||
import { toLegacyPlugin } from '../wiring/createApp';
|
||||
|
||||
// We always add a child that matches all subroutes but without any route refs. This makes
|
||||
// sure that we're always able to match each route no matter how deep the navigation goes.
|
||||
// The route resolver then takes care of selecting the most specific match in order to find
|
||||
// mount points that are as deep in the routing tree as possible.
|
||||
export const MATCH_ALL_ROUTE: BackstageRouteObject = {
|
||||
caseSensitive: false,
|
||||
path: '*',
|
||||
element: 'match-all', // These elements aren't used, so we add in a bit of debug information
|
||||
routeRefs: new Set(),
|
||||
plugins: new Set(),
|
||||
};
|
||||
|
||||
// Joins a list of paths together, avoiding trailing and duplicate slashes
|
||||
export function joinPaths(...paths: string[]): string {
|
||||
const normalized = paths.join('/').replace(/\/\/+/g, '/');
|
||||
if (normalized !== '/' && normalized.endsWith('/')) {
|
||||
return normalized.slice(0, -1);
|
||||
}
|
||||
return normalized;
|
||||
}
|
||||
|
||||
export function extractRouteInfoFromInstanceTree(roots: ExtensionInstance[]): {
|
||||
routePaths: Map<RouteRef, string>;
|
||||
routeParents: Map<RouteRef, RouteRef | undefined>;
|
||||
routeObjects: BackstageRouteObject[];
|
||||
} {
|
||||
// This tracks the route path for each route ref, the value is the route path relative to the parent ref
|
||||
const routePaths = new Map<RouteRef, string>();
|
||||
// This tracks the parents of each route ref. To find the full path of any route ref you traverse
|
||||
// upwards in this tree and substitute each route ref for its route path along then way.
|
||||
const routeParents = new Map<RouteRef, RouteRef | undefined>();
|
||||
// This route object tree is passed to react-router in order to be able to look up the current route
|
||||
// ref or extension/source based on our current location.
|
||||
const routeObjects = new Array<BackstageRouteObject>();
|
||||
|
||||
function visit(
|
||||
current: ExtensionInstance,
|
||||
collectedPath?: string,
|
||||
foundRefForCollectedPath: boolean = false,
|
||||
parentRef?: RouteRef,
|
||||
candidateParentRef?: RouteRef,
|
||||
parentObj?: BackstageRouteObject,
|
||||
) {
|
||||
const routePath = current
|
||||
.getData(coreExtensionData.routePath)
|
||||
?.replace(/^\//, '');
|
||||
const routeRef = current.getData(coreExtensionData.routeRef);
|
||||
const parentChildren = parentObj?.children ?? routeObjects;
|
||||
let currentObj = parentObj;
|
||||
|
||||
let newCollectedPath = collectedPath;
|
||||
let newFoundRefForCollectedPath = foundRefForCollectedPath;
|
||||
|
||||
let newParentRef = parentRef;
|
||||
let newCandidateParentRef = candidateParentRef;
|
||||
|
||||
// Whenever a route path is encountered, a new node is created in the routing tree.
|
||||
if (routePath !== undefined) {
|
||||
currentObj = {
|
||||
path: routePath,
|
||||
element: 'mounted',
|
||||
routeRefs: new Set<RouteRef>(),
|
||||
caseSensitive: false,
|
||||
children: [MATCH_ALL_ROUTE],
|
||||
plugins: new Set(),
|
||||
};
|
||||
parentChildren.push(currentObj);
|
||||
|
||||
// Each route path that we discover creates a new node in the routing tree, at that point
|
||||
// we also switch out our candidate parent ref to be the active one.
|
||||
newParentRef = candidateParentRef;
|
||||
newCandidateParentRef = undefined;
|
||||
|
||||
// We need to collect and concatenate route paths until the path has been assigned a route ref:
|
||||
// Once we find a route ref the collection starts over from an empty path, that way each route
|
||||
// path assignment only contains the diff from the parent ref.
|
||||
if (newFoundRefForCollectedPath) {
|
||||
newCollectedPath = routePath;
|
||||
newFoundRefForCollectedPath = false;
|
||||
} else {
|
||||
newCollectedPath = collectedPath
|
||||
? joinPaths(collectedPath, routePath)
|
||||
: routePath;
|
||||
}
|
||||
}
|
||||
|
||||
// Whenever a route ref is encountered, we need to give it a route path and position in the ref tree.
|
||||
if (routeRef) {
|
||||
const routeRefId = (routeRef as any).id; // TODO: properly
|
||||
if (routeRefId !== current.id) {
|
||||
throw new Error(
|
||||
`Route ref '${routeRefId}' must have the same ID as extension '${current.id}'`,
|
||||
);
|
||||
}
|
||||
|
||||
// The first route ref we find after encountering a route path is selected to be used as the
|
||||
// parent ref further down the tree. We don't start using this candidate ref until we encounter
|
||||
// another route path though, at which point we repeat the process and select another candidate.
|
||||
if (!newCandidateParentRef) {
|
||||
newCandidateParentRef = routeRef;
|
||||
}
|
||||
|
||||
// Check if we've encountered any route paths since the closest route ref, in that case we assign
|
||||
// that path to this and following route refs until we encounter another route path.
|
||||
if (newCollectedPath !== undefined) {
|
||||
routePaths.set(routeRef, newCollectedPath);
|
||||
newFoundRefForCollectedPath = true;
|
||||
}
|
||||
|
||||
routeParents.set(routeRef, newParentRef);
|
||||
currentObj?.routeRefs.add(routeRef);
|
||||
if (current.source) {
|
||||
currentObj?.plugins.add(toLegacyPlugin(current.source));
|
||||
}
|
||||
}
|
||||
|
||||
for (const children of current.attachments.values()) {
|
||||
for (const child of children) {
|
||||
visit(
|
||||
child,
|
||||
newCollectedPath,
|
||||
newFoundRefForCollectedPath,
|
||||
newParentRef,
|
||||
newCandidateParentRef,
|
||||
currentObj,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const root of roots) {
|
||||
visit(root);
|
||||
}
|
||||
|
||||
return { routePaths, routeParents, routeObjects };
|
||||
}
|
||||
@@ -74,6 +74,8 @@ import { defaultConfigLoaderSync } from '../../../core-app-api/src/app/defaultCo
|
||||
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
|
||||
import { overrideBaseUrlConfigs } from '../../../core-app-api/src/app/overrideBaseUrlConfigs';
|
||||
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
|
||||
import { RoutingProvider as LegacyRoutingProvider } from '../../../core-app-api/src/routing/RoutingProvider';
|
||||
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
|
||||
import {
|
||||
apis as defaultApis,
|
||||
components as defaultComponents,
|
||||
@@ -82,6 +84,8 @@ import {
|
||||
import { BrowserRouter, Route } from 'react-router-dom';
|
||||
import { SidebarItem } from '@backstage/core-components';
|
||||
import { DarkTheme, LightTheme } from '../extensions/themes';
|
||||
import { extractRouteInfoFromInstanceTree } from '../routing/extractRouteInfoFromInstanceTree';
|
||||
import { getOrCreateGlobalSingleton } from '@backstage/version-bridge';
|
||||
|
||||
/** @public */
|
||||
export interface ExtensionTreeNode {
|
||||
@@ -281,7 +285,7 @@ export function createApp(options: {
|
||||
config,
|
||||
});
|
||||
|
||||
const routePaths = extractRouteInfoFromInstanceTree(rootInstances);
|
||||
const routeInfo = extractRouteInfoFromInstanceTree(rootInstances);
|
||||
|
||||
const coreInstance = rootInstances.find(({ id }) => id === 'core');
|
||||
if (!coreInstance) {
|
||||
@@ -304,10 +308,15 @@ export function createApp(options: {
|
||||
<ApiProvider apis={apiHolder}>
|
||||
<AppContextProvider appContext={appContext}>
|
||||
<AppThemeProvider>
|
||||
<RoutingProvider routePaths={routePaths}>
|
||||
{/* TODO: set base path using the logic from AppRouter */}
|
||||
<BrowserRouter>{rootElements}</BrowserRouter>
|
||||
</RoutingProvider>
|
||||
<LegacyRoutingProvider
|
||||
{...routeInfo}
|
||||
routeBindings={new Map(/* TODO */)}
|
||||
>
|
||||
<RoutingProvider routePaths={routeInfo.routePaths}>
|
||||
{/* TODO: set base path using the logic from AppRouter */}
|
||||
<BrowserRouter>{rootElements}</BrowserRouter>
|
||||
</RoutingProvider>
|
||||
</LegacyRoutingProvider>
|
||||
</AppThemeProvider>
|
||||
</AppContextProvider>
|
||||
</ApiProvider>
|
||||
@@ -328,25 +337,40 @@ export function createApp(options: {
|
||||
};
|
||||
}
|
||||
|
||||
function toLegacyPlugin(plugin: BackstagePlugin): LegacyBackstagePlugin {
|
||||
// Make sure that we only convert each new plugin instance to its legacy equivalent once
|
||||
const legacyPluginStore = getOrCreateGlobalSingleton(
|
||||
'legacy-plugin-compatibility-store',
|
||||
() => new WeakMap<BackstagePlugin, LegacyBackstagePlugin>(),
|
||||
);
|
||||
|
||||
export function toLegacyPlugin(plugin: BackstagePlugin): LegacyBackstagePlugin {
|
||||
let legacy = legacyPluginStore.get(plugin);
|
||||
if (legacy) {
|
||||
return legacy;
|
||||
}
|
||||
|
||||
const errorMsg = 'Not implemented in legacy plugin compatibility layer';
|
||||
const notImplemented = () => {
|
||||
throw new Error(errorMsg);
|
||||
};
|
||||
return {
|
||||
|
||||
legacy = {
|
||||
getId(): string {
|
||||
return plugin.id;
|
||||
},
|
||||
get routes(): never {
|
||||
throw new Error(errorMsg);
|
||||
get routes() {
|
||||
return {};
|
||||
},
|
||||
get externalRoutes(): never {
|
||||
throw new Error(errorMsg);
|
||||
get externalRoutes() {
|
||||
return {};
|
||||
},
|
||||
getApis: notImplemented,
|
||||
getFeatureFlags: notImplemented,
|
||||
provide: notImplemented,
|
||||
};
|
||||
|
||||
legacyPluginStore.set(plugin, legacy);
|
||||
return legacy;
|
||||
}
|
||||
|
||||
function createLegacyAppContext(plugins: BackstagePlugin[]): AppContext {
|
||||
@@ -458,38 +482,3 @@ function createApiHolder(
|
||||
|
||||
return new ApiResolver(factoryRegistry);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
export function extractRouteInfoFromInstanceTree(
|
||||
roots: ExtensionInstance[],
|
||||
): Map<RouteRef, string> {
|
||||
const results = new Map<RouteRef, string>();
|
||||
|
||||
function visit(current: ExtensionInstance, basePath: string) {
|
||||
const routePath = current.getData(coreExtensionData.routePath) ?? '';
|
||||
const routeRef = current.getData(coreExtensionData.routeRef);
|
||||
|
||||
// TODO: join paths in a more robust way
|
||||
const fullPath = basePath + routePath;
|
||||
if (routeRef) {
|
||||
const routeRefId = (routeRef as any).id; // TODO: properly
|
||||
if (routeRefId !== current.id) {
|
||||
throw new Error(
|
||||
`Route ref '${routeRefId}' must have the same ID as extension '${current.id}'`,
|
||||
);
|
||||
}
|
||||
results.set(routeRef, fullPath);
|
||||
}
|
||||
|
||||
for (const children of current.attachments.values()) {
|
||||
for (const child of children) {
|
||||
visit(child, fullPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const root of roots) {
|
||||
visit(root, '');
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
@@ -36,6 +36,8 @@ export interface ExtensionInstance {
|
||||
* Maps input names to the actual instances given to them.
|
||||
*/
|
||||
readonly attachments: Map<string, ExtensionInstance[]>;
|
||||
|
||||
readonly source?: BackstagePlugin;
|
||||
}
|
||||
|
||||
function resolveInputData(
|
||||
@@ -141,7 +143,7 @@ export function createExtensionInstance(options: {
|
||||
getData<T>(ref: ExtensionDataRef<T>): T | undefined {
|
||||
return extensionData.get(ref.id) as T | undefined;
|
||||
},
|
||||
|
||||
source,
|
||||
attachments,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -117,32 +117,38 @@ export type BackstageTypography = {
|
||||
htmlFontSize: number;
|
||||
fontFamily: string;
|
||||
h1: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h2: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h3: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h4: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h5: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h6: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
|
||||
@@ -57,7 +57,7 @@ export function createBaseThemeOptions<PaletteOptions>(
|
||||
throw new Error(`${defaultPageTheme} is not defined in pageTheme.`);
|
||||
}
|
||||
|
||||
const defaultTypography = {
|
||||
const defaultTypography: BackstageTypography = {
|
||||
htmlFontSize,
|
||||
fontFamily,
|
||||
h1: {
|
||||
|
||||
@@ -124,32 +124,38 @@ export type BackstageTypography = {
|
||||
htmlFontSize: number;
|
||||
fontFamily: string;
|
||||
h1: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h2: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h3: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h4: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h5: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
h6: {
|
||||
fontSize: number;
|
||||
fontFamily?: string;
|
||||
fontSize: number | string;
|
||||
fontWeight: number;
|
||||
marginBottom: number;
|
||||
};
|
||||
|
||||
@@ -18,15 +18,15 @@ import * as plugin from './plugin';
|
||||
|
||||
describe('git-release-manager', () => {
|
||||
it('should export plugin & friends', () => {
|
||||
expect(Object.keys(plugin)).toMatchInlineSnapshot(`
|
||||
expect(Object.keys(plugin).sort()).toMatchInlineSnapshot(`
|
||||
[
|
||||
"gitReleaseManagerApiRef",
|
||||
"constants",
|
||||
"helpers",
|
||||
"components",
|
||||
"testHelpers",
|
||||
"gitReleaseManagerPlugin",
|
||||
"GitReleaseManagerPage",
|
||||
"components",
|
||||
"constants",
|
||||
"gitReleaseManagerApiRef",
|
||||
"gitReleaseManagerPlugin",
|
||||
"helpers",
|
||||
"testHelpers",
|
||||
]
|
||||
`);
|
||||
});
|
||||
|
||||
@@ -11,12 +11,22 @@ import { JSX as JSX_2 } from 'react';
|
||||
import { RouteRef } from '@backstage/core-plugin-api';
|
||||
|
||||
// @public
|
||||
export const DashboardSnapshot: (props: {
|
||||
guid: string;
|
||||
name: string;
|
||||
permalink: string;
|
||||
}) => JSX_2.Element;
|
||||
|
||||
// @public @deprecated
|
||||
export const DashboardSnapshotComponent: (props: {
|
||||
guid: string;
|
||||
name: string;
|
||||
permalink: string;
|
||||
}) => JSX_2.Element;
|
||||
|
||||
// @public
|
||||
export const DashboardSnapshotList: (props: { guid: string }) => JSX_2.Element;
|
||||
|
||||
// @public (undocumented)
|
||||
export const EntityNewRelicDashboardCard: () => JSX_2.Element;
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@ export {
|
||||
newRelicDashboardPlugin,
|
||||
EntityNewRelicDashboardCard,
|
||||
EntityNewRelicDashboardContent,
|
||||
DashboardSnapshot,
|
||||
DashboardSnapshotList,
|
||||
DashboardSnapshotComponent,
|
||||
} from './plugin';
|
||||
export { isNewRelicDashboardAvailable } from './Router';
|
||||
|
||||
@@ -52,7 +52,7 @@ export const newRelicDashboardPlugin = createPlugin({
|
||||
/** @public */
|
||||
export const EntityNewRelicDashboardContent = newRelicDashboardPlugin.provide(
|
||||
createComponentExtension({
|
||||
name: 'EntityNewRelicDashboardPage',
|
||||
name: 'EntityNewRelicDashboardContent',
|
||||
component: {
|
||||
lazy: () => import('./Router').then(m => m.Router),
|
||||
},
|
||||
@@ -62,7 +62,7 @@ export const EntityNewRelicDashboardContent = newRelicDashboardPlugin.provide(
|
||||
/** @public */
|
||||
export const EntityNewRelicDashboardCard = newRelicDashboardPlugin.provide(
|
||||
createComponentExtension({
|
||||
name: 'EntityNewRelicDashboardListComponent',
|
||||
name: 'EntityNewRelicDashboardCard',
|
||||
component: {
|
||||
lazy: () =>
|
||||
import('./components/NewRelicDashboard/DashboardEntityList').then(
|
||||
@@ -80,9 +80,9 @@ export const EntityNewRelicDashboardCard = newRelicDashboardPlugin.provide(
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
export const DashboardSnapshotComponent = newRelicDashboardPlugin.provide(
|
||||
export const DashboardSnapshot = newRelicDashboardPlugin.provide(
|
||||
createComponentExtension({
|
||||
name: 'DashboardSnapshotComponent',
|
||||
name: 'DashboardSnapshot',
|
||||
component: {
|
||||
lazy: () =>
|
||||
import(
|
||||
@@ -91,3 +91,33 @@ export const DashboardSnapshotComponent = newRelicDashboardPlugin.provide(
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
/**
|
||||
* Render dashboard snapshots from Newrelic in backstage. Use dashboards which have the tag `isDashboardPage: true`
|
||||
*
|
||||
* @deprecated
|
||||
* Use DashboardSnapshot export name instead
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
export const DashboardSnapshotComponent = DashboardSnapshot;
|
||||
|
||||
/**
|
||||
* Render a dashboard snapshots list from Newrelic in backstage. Use dashboards which have the tag `isDashboardPage: true`
|
||||
*
|
||||
* @remarks
|
||||
* This can be helpful for rendering dashboards outside of Entity Catalog.
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
export const DashboardSnapshotList = newRelicDashboardPlugin.provide(
|
||||
createComponentExtension({
|
||||
name: 'DashboardSnapshotList',
|
||||
component: {
|
||||
lazy: () =>
|
||||
import(
|
||||
'./components/NewRelicDashboard/DashboardSnapshotList/DashboardSnapshotList'
|
||||
).then(m => m.DashboardSnapshotList),
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -154,6 +154,10 @@ playlist:
|
||||
|
||||

|
||||
|
||||
### Duplicate Playlist Error
|
||||
|
||||

|
||||
|
||||
### Edit Existing Playlist
|
||||
|
||||

|
||||
@@ -166,6 +170,10 @@ playlist:
|
||||
|
||||

|
||||
|
||||
### Delete Playlist
|
||||
|
||||

|
||||
|
||||
## Links
|
||||
|
||||
- [playlist-backend](../playlist-backend) provides the backend API for this frontend.
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 120 KiB |
@@ -205,6 +205,7 @@ describe('SearchModal', () => {
|
||||
|
||||
const input = screen.getByLabelText('Search');
|
||||
await userEvent.clear(input);
|
||||
await 'a tick';
|
||||
await userEvent.type(input, 'new term{enter}');
|
||||
|
||||
expect(navigate).toHaveBeenCalledWith('/search?query=new term');
|
||||
|
||||
@@ -68,6 +68,18 @@ export interface InsightFacts {
|
||||
// @public
|
||||
export const jsonRulesEngineCheckResultRenderer: CheckResultRenderer;
|
||||
|
||||
// @public (undocumented)
|
||||
export const ScorecardInfo: (props: {
|
||||
checkResults: CheckResult[];
|
||||
title: string;
|
||||
description?: string | undefined;
|
||||
}) => JSX_2.Element;
|
||||
|
||||
// @public (undocumented)
|
||||
export const ScorecardsList: (props: {
|
||||
checkResults: CheckResult[];
|
||||
}) => JSX_2.Element;
|
||||
|
||||
// @public
|
||||
export interface TechInsightsApi {
|
||||
// (undocumented)
|
||||
|
||||
@@ -17,6 +17,8 @@ export {
|
||||
techInsightsPlugin,
|
||||
EntityTechInsightsScorecardContent,
|
||||
EntityTechInsightsScorecardCard,
|
||||
ScorecardInfo,
|
||||
ScorecardsList,
|
||||
} from './plugin';
|
||||
|
||||
export { techInsightsApiRef, TechInsightsClient } from './api';
|
||||
|
||||
@@ -42,6 +42,30 @@ export const techInsightsPlugin = createPlugin({
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
export const ScorecardInfo = techInsightsPlugin.provide(
|
||||
createRoutableExtension({
|
||||
name: 'ScorecardInfo',
|
||||
component: () =>
|
||||
import('./components/ScorecardsInfo').then(m => m.ScorecardInfo),
|
||||
mountPoint: rootRouteRef,
|
||||
}),
|
||||
);
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
export const ScorecardsList = techInsightsPlugin.provide(
|
||||
createRoutableExtension({
|
||||
name: 'ScorecardsList',
|
||||
component: () =>
|
||||
import('./components/ScorecardsList').then(m => m.ScorecardsList),
|
||||
mountPoint: rootRouteRef,
|
||||
}),
|
||||
);
|
||||
|
||||
/**
|
||||
* @public
|
||||
*/
|
||||
|
||||
+51
-51
@@ -2790,13 +2790,13 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@storybook/testing-library@npm:^0.2.0":
|
||||
version: 0.2.1
|
||||
resolution: "@storybook/testing-library@npm:0.2.1"
|
||||
version: 0.2.2
|
||||
resolution: "@storybook/testing-library@npm:0.2.2"
|
||||
dependencies:
|
||||
"@testing-library/dom": ^9.0.0
|
||||
"@testing-library/user-event": ~14.4.0
|
||||
"@testing-library/user-event": ^14.4.0
|
||||
ts-dedent: ^2.2.0
|
||||
checksum: 2688361b634921219e4dc8e4acbc6622cfba6c224bd9bf17bf9bfb3655c906129cc82edd69354b9b1889b6f43c9c5e74bd51adb4407b68033d78279b93aee457
|
||||
checksum: 8ccdc1fbbb3472264c56b0aaf2f1c5d273f1ae9b230a53adf9cf82bf82c1a555550894f0e8869c206fa07b1fe8423da4d56590377756c58de3ec560b35a96c46
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -2840,90 +2840,90 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-darwin-arm64@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-darwin-arm64@npm:1.3.90"
|
||||
"@swc/core-darwin-arm64@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-darwin-arm64@npm:1.3.92"
|
||||
conditions: os=darwin & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-darwin-x64@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-darwin-x64@npm:1.3.90"
|
||||
"@swc/core-darwin-x64@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-darwin-x64@npm:1.3.92"
|
||||
conditions: os=darwin & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm-gnueabihf@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.90"
|
||||
"@swc/core-linux-arm-gnueabihf@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm64-gnu@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm64-gnu@npm:1.3.90"
|
||||
"@swc/core-linux-arm64-gnu@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm64-gnu@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm64 & libc=glibc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm64-musl@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm64-musl@npm:1.3.90"
|
||||
"@swc/core-linux-arm64-musl@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm64-musl@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm64 & libc=musl
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-x64-gnu@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-x64-gnu@npm:1.3.90"
|
||||
"@swc/core-linux-x64-gnu@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-x64-gnu@npm:1.3.92"
|
||||
conditions: os=linux & cpu=x64 & libc=glibc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-x64-musl@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-x64-musl@npm:1.3.90"
|
||||
"@swc/core-linux-x64-musl@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-x64-musl@npm:1.3.92"
|
||||
conditions: os=linux & cpu=x64 & libc=musl
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-arm64-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-arm64-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-arm64-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-arm64-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-ia32-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-ia32-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-ia32-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-ia32-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=ia32
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-x64-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-x64-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-x64-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-x64-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core@npm:^1.3.46":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core@npm:1.3.90"
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core@npm:1.3.92"
|
||||
dependencies:
|
||||
"@swc/core-darwin-arm64": 1.3.90
|
||||
"@swc/core-darwin-x64": 1.3.90
|
||||
"@swc/core-linux-arm-gnueabihf": 1.3.90
|
||||
"@swc/core-linux-arm64-gnu": 1.3.90
|
||||
"@swc/core-linux-arm64-musl": 1.3.90
|
||||
"@swc/core-linux-x64-gnu": 1.3.90
|
||||
"@swc/core-linux-x64-musl": 1.3.90
|
||||
"@swc/core-win32-arm64-msvc": 1.3.90
|
||||
"@swc/core-win32-ia32-msvc": 1.3.90
|
||||
"@swc/core-win32-x64-msvc": 1.3.90
|
||||
"@swc/core-darwin-arm64": 1.3.92
|
||||
"@swc/core-darwin-x64": 1.3.92
|
||||
"@swc/core-linux-arm-gnueabihf": 1.3.92
|
||||
"@swc/core-linux-arm64-gnu": 1.3.92
|
||||
"@swc/core-linux-arm64-musl": 1.3.92
|
||||
"@swc/core-linux-x64-gnu": 1.3.92
|
||||
"@swc/core-linux-x64-musl": 1.3.92
|
||||
"@swc/core-win32-arm64-msvc": 1.3.92
|
||||
"@swc/core-win32-ia32-msvc": 1.3.92
|
||||
"@swc/core-win32-x64-msvc": 1.3.92
|
||||
"@swc/counter": ^0.1.1
|
||||
"@swc/types": ^0.1.5
|
||||
peerDependencies:
|
||||
@@ -2952,7 +2952,7 @@ __metadata:
|
||||
peerDependenciesMeta:
|
||||
"@swc/helpers":
|
||||
optional: true
|
||||
checksum: f8ced5187068dc73445c135065c6492f0ac559d0f7720c2482aa9663c87bd015f3d2abef6ee7b2f817280a5e8dd0946c59cce7e1499180644fbc948a9e3823ab
|
||||
checksum: 88c0c62ff790e896180862c341be8bae98baf0a5c5e87f2f04f49e14b8c4fba460d6b352618b4dda066c8ae6bf152cd843eab25837f38128175208b8c0635721
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -2986,12 +2986,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@testing-library/user-event@npm:~14.4.0":
|
||||
version: 14.4.3
|
||||
resolution: "@testing-library/user-event@npm:14.4.3"
|
||||
"@testing-library/user-event@npm:^14.4.0":
|
||||
version: 14.5.1
|
||||
resolution: "@testing-library/user-event@npm:14.5.1"
|
||||
peerDependencies:
|
||||
"@testing-library/dom": ">=7.21.4"
|
||||
checksum: 852c48ea6db1c9471b18276617c84fec4320771e466cd58339a732ca3fd73ad35e5a43ae14f51af51a8d0a150dcf60fcaab049ef367871207bea8f92c4b8195e
|
||||
checksum: 3e6bc9fd53dfe2f3648190193ed2fd4bca2a1bfb47f68810df3b33f05412526e5fd5c4ef9dc5375635e0f4cdf1859916867b597eed22bda1321e04242ea6c519
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
||||
@@ -200,8 +200,8 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@apollo/server@npm:^4.0.0":
|
||||
version: 4.9.3
|
||||
resolution: "@apollo/server@npm:4.9.3"
|
||||
version: 4.9.4
|
||||
resolution: "@apollo/server@npm:4.9.4"
|
||||
dependencies:
|
||||
"@apollo/cache-control-types": ^1.0.3
|
||||
"@apollo/server-gateway-interface": ^1.1.1
|
||||
@@ -231,7 +231,7 @@ __metadata:
|
||||
whatwg-mimetype: ^3.0.0
|
||||
peerDependencies:
|
||||
graphql: ^16.6.0
|
||||
checksum: 28537d7646669a5dc1302cfd75d8a9bf473459ee585c6b778d174628a2cfb3f89a5ac742eca7de2a779b6c9e3f30da509a8787a71227520d009ac190aa7a9207
|
||||
checksum: bf7105ffceaed6e3c54f1506513944bb324ae32e92b1aabb3ec7de1b9fee1373bdec6e1a3f5efb7c7f8090671f1ba2d37c01f5b1456c93127ffede1a0b554bac
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -3305,12 +3305,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.15, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
|
||||
version: 7.22.15
|
||||
resolution: "@babel/runtime@npm:7.22.15"
|
||||
"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.6, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.1, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.0, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
|
||||
version: 7.23.1
|
||||
resolution: "@babel/runtime@npm:7.23.1"
|
||||
dependencies:
|
||||
regenerator-runtime: ^0.14.0
|
||||
checksum: 793296df1e41599a935a3d77ec01eb6088410d3fd4dbe4e92f06c6b7bb2f8355024e6d78621a3a35f44e0e23b0b59107f23d585384df4f3123256a1e1492040e
|
||||
checksum: 0cd0d43e6e7dc7f9152fda8c8312b08321cda2f56ef53d6c22ebdd773abdc6f5d0a69008de90aa41908d00e2c1facb24715ff121274e689305c858355ff02c70
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -4313,6 +4313,7 @@ __metadata:
|
||||
"@backstage/test-utils": "workspace:^"
|
||||
"@backstage/theme": "workspace:^"
|
||||
"@backstage/types": "workspace:^"
|
||||
"@backstage/version-bridge": "workspace:^"
|
||||
"@material-ui/core": ^4.12.4
|
||||
"@material-ui/icons": ^4.11.3
|
||||
"@testing-library/jest-dom": ^5.10.1
|
||||
@@ -7351,38 +7352,6 @@ __metadata:
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
|
||||
"@backstage/plugin-home@npm:^0.5.8":
|
||||
version: 0.5.8
|
||||
resolution: "@backstage/plugin-home@npm:0.5.8"
|
||||
dependencies:
|
||||
"@backstage/catalog-model": ^1.4.2
|
||||
"@backstage/config": ^1.1.0
|
||||
"@backstage/core-components": ^0.13.5
|
||||
"@backstage/core-plugin-api": ^1.6.0
|
||||
"@backstage/plugin-catalog-react": ^1.8.4
|
||||
"@backstage/plugin-home-react": ^0.1.3
|
||||
"@backstage/theme": ^0.4.2
|
||||
"@material-ui/core": ^4.12.2
|
||||
"@material-ui/icons": ^4.9.1
|
||||
"@material-ui/lab": 4.0.0-alpha.61
|
||||
"@rjsf/core-v5": "npm:@rjsf/core@5.13.0"
|
||||
"@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.13.0"
|
||||
"@rjsf/utils": 5.13.0
|
||||
"@rjsf/validator-ajv8": 5.13.0
|
||||
"@types/react": ^16.13.1 || ^17.0.0
|
||||
lodash: ^4.17.21
|
||||
react-grid-layout: ^1.3.4
|
||||
react-resizable: ^3.0.4
|
||||
react-use: ^17.2.4
|
||||
zod: ^3.21.4
|
||||
peerDependencies:
|
||||
react: ^16.13.1 || ^17.0.0
|
||||
react-dom: ^16.13.1 || ^17.0.0
|
||||
react-router-dom: 6.0.0-beta.0 || ^6.3.0
|
||||
checksum: 4f895b3a7e7f61149ba7b8fd6ec998d1f83b6e5262073893c5863fe79c46e5e2f52b43346f310733e04815aaebd82b8a13d34616e8d0848f60f87b1fb3193d60
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@backstage/plugin-home@workspace:^, @backstage/plugin-home@workspace:plugins/home":
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@backstage/plugin-home@workspace:plugins/home"
|
||||
@@ -10535,13 +10504,13 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@codemirror/view@npm:^6.0.0":
|
||||
version: 6.21.0
|
||||
resolution: "@codemirror/view@npm:6.21.0"
|
||||
version: 6.21.2
|
||||
resolution: "@codemirror/view@npm:6.21.2"
|
||||
dependencies:
|
||||
"@codemirror/state": ^6.1.4
|
||||
style-mod: ^4.1.0
|
||||
w3c-keyname: ^2.2.4
|
||||
checksum: da49d5541b137a812e1837709130b9a4502fac71b87c45d45384116a7a2b1dab556c283abb673946ba9d044a640ab9058727b85de9b7b576c44848dfbf0ed7bb
|
||||
checksum: d972a32f26882a1811ffab833f8705339cd4c1bfe56765ed6ecbc1d84466b71a728adb8f4b4fc566ca3bccee5aacd2585e79cb96a851dcd48777e2320dab1892
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -13414,14 +13383,14 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@mui/base@npm:5.0.0-beta.17":
|
||||
version: 5.0.0-beta.17
|
||||
resolution: "@mui/base@npm:5.0.0-beta.17"
|
||||
"@mui/base@npm:5.0.0-beta.18":
|
||||
version: 5.0.0-beta.18
|
||||
resolution: "@mui/base@npm:5.0.0-beta.18"
|
||||
dependencies:
|
||||
"@babel/runtime": ^7.22.15
|
||||
"@babel/runtime": ^7.23.1
|
||||
"@floating-ui/react-dom": ^2.0.2
|
||||
"@mui/types": ^7.2.4
|
||||
"@mui/utils": ^5.14.11
|
||||
"@mui/types": ^7.2.5
|
||||
"@mui/utils": ^5.14.12
|
||||
"@popperjs/core": ^2.11.8
|
||||
clsx: ^2.0.0
|
||||
prop-types: ^15.8.1
|
||||
@@ -13432,27 +13401,27 @@ __metadata:
|
||||
peerDependenciesMeta:
|
||||
"@types/react":
|
||||
optional: true
|
||||
checksum: 96ffb85864fc796783514e089c0011ebcc5174705082dc98197ab035dfb287427069c0338e662a4680951849dfbe7a5231f4f6f2aee710af05c07e8578f93310
|
||||
checksum: 7d4ca1e9d537b7b5850567f1adecd1caa47b8613b43a587cf2f399cfda0a8c17dfda06b030c0bea554b76abe7ac25bb9b1af3c996574def5f860cda0c6ea4a3c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@mui/core-downloads-tracker@npm:^5.14.11":
|
||||
version: 5.14.11
|
||||
resolution: "@mui/core-downloads-tracker@npm:5.14.11"
|
||||
checksum: f3e7594c93d4cf5e3649336eef2b57842c171f3deb6890c03be7eccb88d3ac276aac1ab3ad409d124d16468314018778e2dbb92a62ac34c7f44b2813c47f29fb
|
||||
"@mui/core-downloads-tracker@npm:^5.14.12":
|
||||
version: 5.14.12
|
||||
resolution: "@mui/core-downloads-tracker@npm:5.14.12"
|
||||
checksum: 1c1576ceecf7cade9e0d7a531632f5f9db24853d9ebbd47bb9ed943a3af7de734ad4f3374bab79880e9591db3ea55ea84cc10df72177f9ca5e32cc7662e04405
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@mui/material@npm:^5.12.2":
|
||||
version: 5.14.11
|
||||
resolution: "@mui/material@npm:5.14.11"
|
||||
version: 5.14.12
|
||||
resolution: "@mui/material@npm:5.14.12"
|
||||
dependencies:
|
||||
"@babel/runtime": ^7.22.15
|
||||
"@mui/base": 5.0.0-beta.17
|
||||
"@mui/core-downloads-tracker": ^5.14.11
|
||||
"@mui/system": ^5.14.11
|
||||
"@mui/types": ^7.2.4
|
||||
"@mui/utils": ^5.14.11
|
||||
"@babel/runtime": ^7.23.1
|
||||
"@mui/base": 5.0.0-beta.18
|
||||
"@mui/core-downloads-tracker": ^5.14.12
|
||||
"@mui/system": ^5.14.12
|
||||
"@mui/types": ^7.2.5
|
||||
"@mui/utils": ^5.14.12
|
||||
"@types/react-transition-group": ^4.4.6
|
||||
clsx: ^2.0.0
|
||||
csstype: ^3.1.2
|
||||
@@ -13472,16 +13441,16 @@ __metadata:
|
||||
optional: true
|
||||
"@types/react":
|
||||
optional: true
|
||||
checksum: 350d642773d4b19d5b9deac956203dafe89cd005ba8cd6017d1ab0e97ba45ca230050249f34a17f0f00efe466162d47487f160159bebe3e52af1b34dd28579d0
|
||||
checksum: a0d3b52ce3cc282da04036db0805f95f27b35a9c899f132f962fe96f05d3eb112e99ccbf6bd9d05cae617b24beda95470aedaff129d6e39d1b52e1ddf80a9e12
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@mui/private-theming@npm:^5.14.11":
|
||||
version: 5.14.11
|
||||
resolution: "@mui/private-theming@npm:5.14.11"
|
||||
"@mui/private-theming@npm:^5.14.12":
|
||||
version: 5.14.12
|
||||
resolution: "@mui/private-theming@npm:5.14.12"
|
||||
dependencies:
|
||||
"@babel/runtime": ^7.22.15
|
||||
"@mui/utils": ^5.14.11
|
||||
"@babel/runtime": ^7.23.1
|
||||
"@mui/utils": ^5.14.12
|
||||
prop-types: ^15.8.1
|
||||
peerDependencies:
|
||||
"@types/react": ^17.0.0 || ^18.0.0
|
||||
@@ -13489,15 +13458,15 @@ __metadata:
|
||||
peerDependenciesMeta:
|
||||
"@types/react":
|
||||
optional: true
|
||||
checksum: a5d461ae9679b1f3b79f529c51c055e03d84421812bb12110d735fbc5528ae188900488b32aa1b860cb978ac6dd0cb9f54a10e2ff214e853e969ef5c1ed87e84
|
||||
checksum: f8127347dc29126fece3b530cb156f6ababf747b64bb1c712874375e6efae6c738c014304d9553001d67a59b24ca6a665f2d03bb5ae137f03bdba90815f0ecc1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@mui/styled-engine@npm:^5.14.11":
|
||||
version: 5.14.11
|
||||
resolution: "@mui/styled-engine@npm:5.14.11"
|
||||
"@mui/styled-engine@npm:^5.14.12":
|
||||
version: 5.14.12
|
||||
resolution: "@mui/styled-engine@npm:5.14.12"
|
||||
dependencies:
|
||||
"@babel/runtime": ^7.22.15
|
||||
"@babel/runtime": ^7.23.1
|
||||
"@emotion/cache": ^11.11.0
|
||||
csstype: ^3.1.2
|
||||
prop-types: ^15.8.1
|
||||
@@ -13510,19 +13479,19 @@ __metadata:
|
||||
optional: true
|
||||
"@emotion/styled":
|
||||
optional: true
|
||||
checksum: 0a593f967ab56c32c611eae4a83bc23c4ab3a8931e76a6e553ed18230c2f4e9e912d519fe2f0a24970ff154c198634903f134eb54f00ceebde138a73b953622f
|
||||
checksum: c689ccad59e7fd54cd8367838612daa4f132c64d8c6b99ccb7c8f9697b5c940a6bf7edcccd686ce437b565dbcf3bfc12bb0dea47cbd5fbd750ea1553017f9c0d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@mui/system@npm:^5.14.11":
|
||||
version: 5.14.11
|
||||
resolution: "@mui/system@npm:5.14.11"
|
||||
"@mui/system@npm:^5.14.12":
|
||||
version: 5.14.12
|
||||
resolution: "@mui/system@npm:5.14.12"
|
||||
dependencies:
|
||||
"@babel/runtime": ^7.22.15
|
||||
"@mui/private-theming": ^5.14.11
|
||||
"@mui/styled-engine": ^5.14.11
|
||||
"@mui/types": ^7.2.4
|
||||
"@mui/utils": ^5.14.11
|
||||
"@babel/runtime": ^7.23.1
|
||||
"@mui/private-theming": ^5.14.12
|
||||
"@mui/styled-engine": ^5.14.12
|
||||
"@mui/types": ^7.2.5
|
||||
"@mui/utils": ^5.14.12
|
||||
clsx: ^2.0.0
|
||||
csstype: ^3.1.2
|
||||
prop-types: ^15.8.1
|
||||
@@ -13538,28 +13507,28 @@ __metadata:
|
||||
optional: true
|
||||
"@types/react":
|
||||
optional: true
|
||||
checksum: c3d0e1a09a9638663a6467452a7725593e9de6f9620e199add1080db42a7affaca39f52a1b6a52fb75d708f3e30336946babb2a8d1d43fab81c6a1fe3e420b21
|
||||
checksum: 70c3920eadc593395a2d258ddea0f3b28689c7f02fdaf97fc205e16efaeebe462b2ab01c69a20a3bcb011e0d07ea47fa66a433e70d0a1ce15d7b694fb3c52135
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@mui/types@npm:^7.2.4":
|
||||
version: 7.2.4
|
||||
resolution: "@mui/types@npm:7.2.4"
|
||||
"@mui/types@npm:^7.2.5":
|
||||
version: 7.2.5
|
||||
resolution: "@mui/types@npm:7.2.5"
|
||||
peerDependencies:
|
||||
"@types/react": "*"
|
||||
"@types/react": ^17.0.0 || ^18.0.0
|
||||
peerDependenciesMeta:
|
||||
"@types/react":
|
||||
optional: true
|
||||
checksum: 16bea0547492193a22fd1794382f314698a114f6c673825314c66b56766c3a9d305992cc495684722b7be16a1ecf7e6e48a79caa64f90c439b530e8c02611a61
|
||||
checksum: 2807e9a8eb251294eee6384a4d68b2159f7660466625f1781e9efea282aa7c6ff35b42bc7039c2d43e7a5ac80291dcb85c4110022b0b6de4e12b6406b62f3dc1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@mui/utils@npm:^5.14.11":
|
||||
version: 5.14.11
|
||||
resolution: "@mui/utils@npm:5.14.11"
|
||||
"@mui/utils@npm:^5.14.12":
|
||||
version: 5.14.12
|
||||
resolution: "@mui/utils@npm:5.14.12"
|
||||
dependencies:
|
||||
"@babel/runtime": ^7.22.15
|
||||
"@types/prop-types": ^15.7.5
|
||||
"@babel/runtime": ^7.23.1
|
||||
"@types/prop-types": ^15.7.7
|
||||
prop-types: ^15.8.1
|
||||
react-is: ^18.2.0
|
||||
peerDependencies:
|
||||
@@ -13568,7 +13537,7 @@ __metadata:
|
||||
peerDependenciesMeta:
|
||||
"@types/react":
|
||||
optional: true
|
||||
checksum: 84e640dea3589ea7edb7d8f33748d83d561d4ef413c4d3e2216ddf9c0842d8b04d162e3fa5ea59f03846934f17fb446ed8464e318dd4e2e299e3b44b06637d76
|
||||
checksum: 41470b6292b7a46c71fb0a0acc6a5f05a5e080648106b8805555de920e8f748669c7e8d39cbbcf0f52be9053927bb8439a748e24bd02bc1a220c9bded4435f42
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -14830,14 +14799,14 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@roadiehq/backstage-plugin-github-pull-requests@npm:^2.2.7":
|
||||
version: 2.5.16
|
||||
resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.16"
|
||||
version: 2.5.17
|
||||
resolution: "@roadiehq/backstage-plugin-github-pull-requests@npm:2.5.17"
|
||||
dependencies:
|
||||
"@backstage/catalog-model": ^1.4.2
|
||||
"@backstage/core-components": ^0.13.5
|
||||
"@backstage/core-plugin-api": ^1.6.0
|
||||
"@backstage/plugin-catalog-react": ^1.8.4
|
||||
"@backstage/plugin-home": ^0.5.8
|
||||
"@backstage/plugin-home-react": ^0.1.3
|
||||
"@material-ui/core": ^4.11.0
|
||||
"@material-ui/icons": ^4.9.1
|
||||
"@material-ui/lab": ^4.0.0-alpha.60
|
||||
@@ -14854,7 +14823,7 @@ __metadata:
|
||||
react: ^16.13.1 || ^17.0.0
|
||||
react-dom: ^16.13.1 || ^17.0.0
|
||||
react-router: 6.0.0-beta.0 || ^6.3.0
|
||||
checksum: cb35e64d4df6f81829cd238e3b06b84453ad9231a30a0a4698ebb9d408445af0bfeb59d27bcc5d818013735f2f4d44a89ff9824258ff1565274c524c3ae905cc
|
||||
checksum: 4a2203aad37ae8b268f3ff11967545bbcfc18741f3e3ea0e7106dcbb3f8af47a7701ebdcdf17e80023590394fb2f923e0f3691b7d0334586892f99335756a47d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -14934,18 +14903,18 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@rollup/plugin-yaml@npm:^4.0.0":
|
||||
version: 4.1.1
|
||||
resolution: "@rollup/plugin-yaml@npm:4.1.1"
|
||||
version: 4.1.2
|
||||
resolution: "@rollup/plugin-yaml@npm:4.1.2"
|
||||
dependencies:
|
||||
"@rollup/pluginutils": ^5.0.1
|
||||
js-yaml: ^4.1.0
|
||||
tosource: ^2.0.0-alpha.3
|
||||
peerDependencies:
|
||||
rollup: ^1.20.0||^2.0.0||^3.0.0
|
||||
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
checksum: 99c8f9d4a354056bec8a9398786777203d87db32db0cad681f65ee896cbbbb8a61ace0b1c3d801622782ccf28e56eac6cdde950541fb1f7b3e651ad9c705d5c3
|
||||
checksum: a044bb4568a10712465553ea5f31c13a2b7bc371a7f8382014e6b8048c0a264f5645f83f4d70ce9ab46b75117b94cdc032b597e9315fd2adcd8f30637f44bbea
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -16542,90 +16511,90 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-darwin-arm64@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-darwin-arm64@npm:1.3.90"
|
||||
"@swc/core-darwin-arm64@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-darwin-arm64@npm:1.3.92"
|
||||
conditions: os=darwin & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-darwin-x64@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-darwin-x64@npm:1.3.90"
|
||||
"@swc/core-darwin-x64@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-darwin-x64@npm:1.3.92"
|
||||
conditions: os=darwin & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm-gnueabihf@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.90"
|
||||
"@swc/core-linux-arm-gnueabihf@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm64-gnu@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm64-gnu@npm:1.3.90"
|
||||
"@swc/core-linux-arm64-gnu@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm64-gnu@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm64 & libc=glibc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-arm64-musl@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-arm64-musl@npm:1.3.90"
|
||||
"@swc/core-linux-arm64-musl@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-arm64-musl@npm:1.3.92"
|
||||
conditions: os=linux & cpu=arm64 & libc=musl
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-x64-gnu@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-x64-gnu@npm:1.3.90"
|
||||
"@swc/core-linux-x64-gnu@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-x64-gnu@npm:1.3.92"
|
||||
conditions: os=linux & cpu=x64 & libc=glibc
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-linux-x64-musl@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-linux-x64-musl@npm:1.3.90"
|
||||
"@swc/core-linux-x64-musl@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-linux-x64-musl@npm:1.3.92"
|
||||
conditions: os=linux & cpu=x64 & libc=musl
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-arm64-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-arm64-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-arm64-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-arm64-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-ia32-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-ia32-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-ia32-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-ia32-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=ia32
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core-win32-x64-msvc@npm:1.3.90":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core-win32-x64-msvc@npm:1.3.90"
|
||||
"@swc/core-win32-x64-msvc@npm:1.3.92":
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core-win32-x64-msvc@npm:1.3.92"
|
||||
conditions: os=win32 & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@swc/core@npm:^1.3.46":
|
||||
version: 1.3.90
|
||||
resolution: "@swc/core@npm:1.3.90"
|
||||
version: 1.3.92
|
||||
resolution: "@swc/core@npm:1.3.92"
|
||||
dependencies:
|
||||
"@swc/core-darwin-arm64": 1.3.90
|
||||
"@swc/core-darwin-x64": 1.3.90
|
||||
"@swc/core-linux-arm-gnueabihf": 1.3.90
|
||||
"@swc/core-linux-arm64-gnu": 1.3.90
|
||||
"@swc/core-linux-arm64-musl": 1.3.90
|
||||
"@swc/core-linux-x64-gnu": 1.3.90
|
||||
"@swc/core-linux-x64-musl": 1.3.90
|
||||
"@swc/core-win32-arm64-msvc": 1.3.90
|
||||
"@swc/core-win32-ia32-msvc": 1.3.90
|
||||
"@swc/core-win32-x64-msvc": 1.3.90
|
||||
"@swc/core-darwin-arm64": 1.3.92
|
||||
"@swc/core-darwin-x64": 1.3.92
|
||||
"@swc/core-linux-arm-gnueabihf": 1.3.92
|
||||
"@swc/core-linux-arm64-gnu": 1.3.92
|
||||
"@swc/core-linux-arm64-musl": 1.3.92
|
||||
"@swc/core-linux-x64-gnu": 1.3.92
|
||||
"@swc/core-linux-x64-musl": 1.3.92
|
||||
"@swc/core-win32-arm64-msvc": 1.3.92
|
||||
"@swc/core-win32-ia32-msvc": 1.3.92
|
||||
"@swc/core-win32-x64-msvc": 1.3.92
|
||||
"@swc/counter": ^0.1.1
|
||||
"@swc/types": ^0.1.5
|
||||
peerDependencies:
|
||||
@@ -16654,7 +16623,7 @@ __metadata:
|
||||
peerDependenciesMeta:
|
||||
"@swc/helpers":
|
||||
optional: true
|
||||
checksum: f8ced5187068dc73445c135065c6492f0ac559d0f7720c2482aa9663c87bd015f3d2abef6ee7b2f817280a5e8dd0946c59cce7e1499180644fbc948a9e3823ab
|
||||
checksum: 88c0c62ff790e896180862c341be8bae98baf0a5c5e87f2f04f49e14b8c4fba460d6b352618b4dda066c8ae6bf152cd843eab25837f38128175208b8c0635721
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -17703,11 +17672,11 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@types/jquery@npm:^3.3.34":
|
||||
version: 3.5.20
|
||||
resolution: "@types/jquery@npm:3.5.20"
|
||||
version: 3.5.21
|
||||
resolution: "@types/jquery@npm:3.5.21"
|
||||
dependencies:
|
||||
"@types/sizzle": "*"
|
||||
checksum: 9bd69faea3d60f52d3029a87b890003042a9dcf4f538c23ac2c11b3bd0e0ccd86b281d5ba3028d1b02df67c69266b8dc0ef0a35696ae174515ecf34523a0287b
|
||||
checksum: 48cce8892f0292ac68853677d408195436a460ed45445a2da13deddcf21b407b3f896bbf5714f320c8f44666fdff5ceba5c59e873a316486098040404dcf56f4
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -18012,9 +17981,9 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0, @types/node@npm:^20.1.1":
|
||||
version: 20.6.5
|
||||
resolution: "@types/node@npm:20.6.5"
|
||||
checksum: b849e849cf7631458a65c5019c81962028e306d8c4455a48422277b240f5a7eb8a1f1dafa60306bd4c773b77263bb8b05c074b1026e868bd137bb2022cf63ea2
|
||||
version: 20.8.2
|
||||
resolution: "@types/node@npm:20.8.2"
|
||||
checksum: 3da73e25d821bfcdb7de98589027e08bb4848e55408671c4a83ec0341e124b5313a0b20e1e4b4eff1168ea17a86f622ad73fcb04b761abd77496b9a27cbd5de5
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -18033,16 +18002,16 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@types/node@npm:^16.11.26, @types/node@npm:^16.9.2":
|
||||
version: 16.18.54
|
||||
resolution: "@types/node@npm:16.18.54"
|
||||
checksum: 208e8fc64f605e9cd55ab5e620a0fd019d8fe5629e3e3c5de869a149b731ab0fac5720c516dccc0ecc834ac27df754723dfe6554551663f016ba5096ea8851df
|
||||
version: 16.18.57
|
||||
resolution: "@types/node@npm:16.18.57"
|
||||
checksum: db21a14416de3abce8dfc30d9e9513c505060ef4d197fdc1b1b7374feca3417a7757172d041989fd49910245e9f2d7869201accac3cceee7c75bfdf8759ead6d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/node@npm:^18.11.17, @types/node@npm:^18.17.8":
|
||||
version: 18.17.18
|
||||
resolution: "@types/node@npm:18.17.18"
|
||||
checksum: 59cbd906363d37017fe9ba0c08c1446e440d4d977459609c5f90b8fb7eb41f273ce8af30c5a5b5d599d7de934c1b3702bc9fc27caf8d2270e5cdb659c5232991
|
||||
version: 18.18.3
|
||||
resolution: "@types/node@npm:18.18.3"
|
||||
checksum: ed97a832179e0cfbb93738021fe16d0bc5c0f34bea35269c23c9dd5f0ecc8be93dbe5efd51630189a099b31786a47c1bde115508831a7245613a55c3ad1a7d6b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -18203,7 +18172,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.3, @types/prop-types@npm:^15.7.5":
|
||||
"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0, @types/prop-types@npm:^15.7.3, @types/prop-types@npm:^15.7.7":
|
||||
version: 15.7.8
|
||||
resolution: "@types/prop-types@npm:15.7.8"
|
||||
checksum: 61dfad79da8b1081c450bab83b77935df487ae1cdd4660ec7df6be8e74725c15fa45cf486ce057addc956ca4ae78300b97091e2a25061133d1b9a1440bc896ae
|
||||
@@ -18613,11 +18582,11 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"@types/supertest@npm:^2.0.12, @types/supertest@npm:^2.0.8":
|
||||
version: 2.0.13
|
||||
resolution: "@types/supertest@npm:2.0.13"
|
||||
version: 2.0.14
|
||||
resolution: "@types/supertest@npm:2.0.14"
|
||||
dependencies:
|
||||
"@types/superagent": "*"
|
||||
checksum: fe66be8e16626f254dc9d9691706942689f47a84edf7d3baaeadd6d4d576dbf915ee70cebdd7034015e83fa91fcd2dcff1cd0252514e4c510619817a183b5b4f
|
||||
checksum: 9f6850a22b8f0fd4c26a6dfd9b64771a66476b1a4f841a3b84a9da843ce69463efbf37594fe107297dd14a225d199b802464d48d70e9413238c637903d392137
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -19035,9 +19004,9 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@uiw/codemirror-extensions-basic-setup@npm:4.21.18":
|
||||
version: 4.21.18
|
||||
resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.18"
|
||||
"@uiw/codemirror-extensions-basic-setup@npm:4.21.19":
|
||||
version: 4.21.19
|
||||
resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.21.19"
|
||||
dependencies:
|
||||
"@codemirror/autocomplete": ^6.0.0
|
||||
"@codemirror/commands": ^6.0.0
|
||||
@@ -19054,19 +19023,19 @@ __metadata:
|
||||
"@codemirror/search": ">=6.0.0"
|
||||
"@codemirror/state": ">=6.0.0"
|
||||
"@codemirror/view": ">=6.0.0"
|
||||
checksum: c643eebc45e2067080c46e28fdb4ac40043e5890f4862bd45fe5bf816894b6c118ea901ca9ba1dce8862877622ebd793db6ec220491506355ed562a0dc0c4507
|
||||
checksum: 85a1f8b3e071b4587f13609d8449406baa8dead51aa588b914ffa95aac1bdfe1e1aa78689d7927fb90a554b747409cc59cada18fcbe2c204f5936e5441fbade1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@uiw/react-codemirror@npm:^4.9.3":
|
||||
version: 4.21.18
|
||||
resolution: "@uiw/react-codemirror@npm:4.21.18"
|
||||
version: 4.21.19
|
||||
resolution: "@uiw/react-codemirror@npm:4.21.19"
|
||||
dependencies:
|
||||
"@babel/runtime": ^7.18.6
|
||||
"@codemirror/commands": ^6.1.0
|
||||
"@codemirror/state": ^6.1.1
|
||||
"@codemirror/theme-one-dark": ^6.0.0
|
||||
"@uiw/codemirror-extensions-basic-setup": 4.21.18
|
||||
"@uiw/codemirror-extensions-basic-setup": 4.21.19
|
||||
codemirror: ^6.0.0
|
||||
peerDependencies:
|
||||
"@babel/runtime": ">=7.11.0"
|
||||
@@ -19076,7 +19045,7 @@ __metadata:
|
||||
codemirror: ">=6.0.0"
|
||||
react: ">=16.8.0"
|
||||
react-dom: ">=16.8.0"
|
||||
checksum: ef3897e9901b98fd981d4b9db2ae8702aa7ffda4cf5cab3286963580606a6dde38e77a4314c12574b6f5f251d62b62e59f0a1a445009b5927b8500f4b5fd795c
|
||||
checksum: bcd016ac806ff34ab3ab16e17090c80c0ed7f835835575c7a15b21238cae9169662444323cbbc8ef2a62c5e8fd7d8b668fd3562cf79b509ededaf7cd4970adf0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -20299,13 +20268,13 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"axios@npm:^1.4.0":
|
||||
version: 1.5.0
|
||||
resolution: "axios@npm:1.5.0"
|
||||
version: 1.5.1
|
||||
resolution: "axios@npm:1.5.1"
|
||||
dependencies:
|
||||
follow-redirects: ^1.15.0
|
||||
form-data: ^4.0.0
|
||||
proxy-from-env: ^1.1.0
|
||||
checksum: e7405a5dbbea97760d0e6cd58fecba311b0401ddb4a8efbc4108f5537da9b3f278bde566deb777935a960beec4fa18e7b8353881f2f465e4f2c0e949fead35be
|
||||
checksum: 4444f06601f4ede154183767863d2b8e472b4a6bfc5253597ed6d21899887e1fd0ee2b3de792ac4f8459fe2e359d2aa07c216e45fd8b9e4e0688a6ebf48a5a8d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -20666,13 +20635,13 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"better-sqlite3@npm:^8.0.0":
|
||||
version: 8.6.0
|
||||
resolution: "better-sqlite3@npm:8.6.0"
|
||||
version: 8.7.0
|
||||
resolution: "better-sqlite3@npm:8.7.0"
|
||||
dependencies:
|
||||
bindings: ^1.5.0
|
||||
node-gyp: latest
|
||||
prebuild-install: ^7.1.1
|
||||
checksum: 9ebdfd675352347cda1ba30d620a3c512d9db827a1eba66460fd48203a7ad8138b0195893bbf47d40f704bcdd598710041271d4ed69779979b6f784c0d3579a1
|
||||
checksum: f1fa38a9a0e4fcd59ececb67c60371b9638d29c19ce9af034421e8a56c9a77e799bb1411b1c3cb08bb9678e15dfb8985553a9ef4098cf5558e7207a3e019f211
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -31214,18 +31183,18 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"libsodium-wrappers@npm:^0.7.11":
|
||||
version: 0.7.11
|
||||
resolution: "libsodium-wrappers@npm:0.7.11"
|
||||
version: 0.7.13
|
||||
resolution: "libsodium-wrappers@npm:0.7.13"
|
||||
dependencies:
|
||||
libsodium: ^0.7.11
|
||||
checksum: 6a6ef47b2213e3fb4687196c28fee4c9885f70d89547d845e62d96014d3d5ad9f59cb05fadc601debc0031a3cfd0b9b416d7efbeb5bf66db6aa0ed69f55a6293
|
||||
libsodium: ^0.7.13
|
||||
checksum: d184395f7c33023414b191ef9ea2171eb1a5cb061503e886ea877590cb7adc3a4feaf794b9b08731a20515518fa23dbf1c1bfcd376e5ab01728e95cf1cb7525a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"libsodium@npm:^0.7.11":
|
||||
version: 0.7.11
|
||||
resolution: "libsodium@npm:0.7.11"
|
||||
checksum: 0a3493ac1829d1e346178b6984c4eb449dc77157c906876441386c0c653142e3fa56f623ce980bb50e580196578689298c9cd406ce6d514904090e370c6bc0f7
|
||||
"libsodium@npm:^0.7.13":
|
||||
version: 0.7.13
|
||||
resolution: "libsodium@npm:0.7.13"
|
||||
checksum: 75a5f70e84c197d54d9b67dcbd852abbd41cca8facd510767c7c8400a52a23da293e83eebf1693831b2c0c0498f266bd9350a8c27ec66f46a055890dff758d38
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -35829,13 +35798,13 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"postcss@npm:^8.1.0, postcss@npm:^8.4.21":
|
||||
version: 8.4.29
|
||||
resolution: "postcss@npm:8.4.29"
|
||||
version: 8.4.31
|
||||
resolution: "postcss@npm:8.4.31"
|
||||
dependencies:
|
||||
nanoid: ^3.3.6
|
||||
picocolors: ^1.0.0
|
||||
source-map-js: ^1.0.2
|
||||
checksum: dd6daa25e781db9ae5b651d9b7bfde0ec6e60e86a37da69a18eb4773d5ddd51e28fc4ff054fbdc04636a31462e6bf09a1e50986f69ac52b10d46b7457cd36d12
|
||||
checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -43250,9 +43219,9 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"zod@npm:^3.21.4":
|
||||
version: 3.22.3
|
||||
resolution: "zod@npm:3.22.3"
|
||||
checksum: 65b05139be337078a70700b05942ab7f2ef5f11abe194df14ef257fac4e5c383476a4dc290731842996bd57fc8d5bf38e5a4c907fe8cdf8b15477f8da5bfcc00
|
||||
version: 3.22.4
|
||||
resolution: "zod@npm:3.22.4"
|
||||
checksum: 80bfd7f8039b24fddeb0718a2ec7c02aa9856e4838d6aa4864335a047b6b37a3273b191ef335bf0b2002e5c514ef261ffcda5a589fb084a48c336ffc4cdbab7f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
||||
Reference in New Issue
Block a user