+
{subheader &&
{subheader}
}
{icon}
@@ -228,7 +233,7 @@ export function InfoCard(props: Props): JSX.Element {
{title && (
)}
@@ -250,6 +256,7 @@ export function InfoCard(props: Props): JSX.Element {
diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md
index c6338c7243..be4c46ab03 100644
--- a/packages/create-app/CHANGELOG.md
+++ b/packages/create-app/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/create-app
+## 0.5.15
+
+### Patch Changes
+
+- c066c88: Removed `packages/backend/src/types.ts` from the template as it is unused. It was mistakenly left in after moving the template to the new backend system.
+- 5d99272: Update local development dependencies.
+- 0478509: Bumped create-app version.
+- d85dd88: Bumped create-app version.
+- 8105aad: Removed the Tech Radar and GitHub Actions plugins from the template, which have been moved to the community plugins repository.
+
+## 0.5.15-next.2
+
+### Patch Changes
+
+- Bumped create-app version.
+
## 0.5.15-next.1
### Patch Changes
@@ -1128,8 +1144,7 @@
Migrating to the stable version of `react-router` is optional for the time
being. But if you want to do the same for your existing repository, please
- follow [this
- guide](https://backstage.io/docs/tutorials/react-router-stable-migration).
+ follow [this guide](https://backstage.io/docs/tutorials/react-router-stable-migration).
- e05e0f021b: Update versions of packages used in the create-app template, to match those in the main repo
- 01dff06be4: Leverage cache mounts in Dockerfile during `yarn install ...` and `apt-get ...` commands to speed up repeated builds.
@@ -1176,8 +1191,7 @@
Migrating to the stable version of `react-router` is optional for the time
being. But if you want to do the same for your existing repository, please
- follow [this
- guide](https://backstage.io/docs/tutorials/react-router-stable-migration).
+ follow [this guide](https://backstage.io/docs/tutorials/react-router-stable-migration).
- e05e0f021b: Update versions of packages used in the create-app template, to match those in the main repo
- 52f25858a8: Added `*.session.sql` Visual Studio Code database functionality files to `.gitignore` in the default template. This is optional but potentially helpful if your developers use Visual Studio Code; you can add a line with that exact value to your own root `.gitignore` if you want the same.
@@ -3160,8 +3174,7 @@
The old `sqlite3` NPM library has been abandoned by its maintainers, which has
led to unhandled security reports and other issues. Therefore, in the `knex` 1.x
- release line they have instead switched over to the [`@vscode/sqlite3`
- library](https://github.com/microsoft/vscode-node-sqlite3) by default, which is
+ release line they have instead switched over to the [`@vscode/sqlite3` library](https://github.com/microsoft/vscode-node-sqlite3) by default, which is
actively maintained by Microsoft.
This means that as you update to this version of Backstage, there are two
@@ -3230,8 +3243,7 @@
The old `sqlite3` NPM library has been abandoned by its maintainers, which has
led to unhandled security reports and other issues. Therefore, in the `knex` 1.x
- release line they have instead switched over to the [`@vscode/sqlite3`
- library](https://github.com/microsoft/vscode-node-sqlite3) by default, which is
+ release line they have instead switched over to the [`@vscode/sqlite3` library](https://github.com/microsoft/vscode-node-sqlite3) by default, which is
actively maintained by Microsoft.
This means that as you update to this version of Backstage, there are two
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index 72d8e00045..422442ed2b 100644
--- a/packages/create-app/package.json
+++ b/packages/create-app/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
- "version": "0.5.15-next.1",
+ "version": "0.5.15",
"publishConfig": {
"access": "public"
},
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index e4622aab60..c8e32a39d0 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/dev-utils
+## 1.0.32
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/theme@0.5.4
+ - @backstage/core-app-api@1.12.5
+ - @backstage/app-defaults@1.5.5
+ - @backstage/integration-react@1.1.27
+
+## 1.0.32-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/integration-react@1.1.27-next.0
+
## 1.0.32-next.1
### Patch Changes
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index bac82890d0..de5acd3249 100644
--- a/packages/dev-utils/package.json
+++ b/packages/dev-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/dev-utils",
- "version": "1.0.32-next.1",
+ "version": "1.0.32",
"description": "Utilities for developing Backstage plugins.",
"backstage": {
"role": "web-library"
diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md
index 326002b350..7ff6862d2f 100644
--- a/packages/e2e-test/CHANGELOG.md
+++ b/packages/e2e-test/CHANGELOG.md
@@ -1,5 +1,12 @@
# e2e-test
+## 0.2.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.5.15
+
## 0.2.16-next.1
### Patch Changes
diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json
index a41c724d5a..a77bb8c8a1 100644
--- a/packages/e2e-test/package.json
+++ b/packages/e2e-test/package.json
@@ -1,7 +1,7 @@
{
"name": "e2e-test",
"description": "E2E test for verifying Backstage packages",
- "version": "0.2.16-next.1",
+ "version": "0.2.16",
"private": true,
"backstage": {
"role": "cli"
@@ -43,7 +43,6 @@
"@backstage/cli": "workspace:^",
"@types/fs-extra": "^11.0.0",
"@types/node": "^18.17.8",
- "@types/puppeteer": "^7.0.0",
"nodemon": "^3.0.1"
},
"nodemonConfig": {
diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md
index 60dde12184..63a7650400 100644
--- a/packages/eslint-plugin/CHANGELOG.md
+++ b/packages/eslint-plugin/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/eslint-plugin
+## 0.1.8
+
+### Patch Changes
+
+- 65ec043: add some `pickers` fixes
+
## 0.1.7
### Patch Changes
diff --git a/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md b/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md
index a105014abc..e2143354d2 100644
--- a/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md
+++ b/packages/eslint-plugin/docs/rules/no-top-level-material-ui-4-imports.md
@@ -41,3 +41,50 @@ import {
import Typography from '@material-ui/core/Typography';
import Box from '@material-ui/core/Box';
```
+
+## --fix known issues
+
+This rule provides automatic fixes for the imports, but it has some known issues:
+
+### Non Props types import
+
+The fix will handle correctly 3 groups of imports:
+
+- Any import from related to styles (i.e `makeStyles`, `styled`, `WithStyles`) will be auto fixed to the `@material-ui/core/styles` import.
+- Any import with `Props` suffix will be auto fixed to actual component for example `DialogProps` will be imported from `@material-ui/core/Dialog`.
+- Any other import will be considered as a component import and will be auto fixed to the actual component import.
+
+This means that some types of imports without `Props` suffix will be wrongly auto fixed to the component import, for example this fix will be wrong:
+
+```diff
+- import { Alert, Color } from '@material-ui/lab';
++ import Alert from '@material-ui/lab/Alert';
++ import Color from '@material-ui/lab/Color'; // this import is wrong
+```
+
+The correct import should look like this:
+
+```diff
+- import { Alert, Color } from '@material-ui/lab';
++ import Alert, {Color} from '@material-ui/lab/Alert';
+```
+
+Because `Color` is a type coming from the Alert component.
+
+### No default export available
+
+Some components do not have a default export, for example `@material-ui/pickers/DateTimePicker` does not have a default export, so the fix will not work for these cases.
+
+The fix will be wrong for this import:
+
+```diff
+- import { DateTimePicker } from '@material-ui/pickers';
++ import DateTimePicker from '@material-ui/pickers/DateTimePicker'; // this default import does not exist
+```
+
+The correct import should look like this:
+
+```diff
+- import { DateTimePicker } from '@material-ui/pickers';
++ import { DateTimePicker } from '@material-ui/pickers/DateTimePicker'; // this is the correct import
+```
diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json
index 395a3eea64..0d8db000e0 100644
--- a/packages/eslint-plugin/package.json
+++ b/packages/eslint-plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/eslint-plugin",
- "version": "0.1.7",
+ "version": "0.1.8",
"description": "Backstage ESLint plugin",
"publishConfig": {
"access": "public"
diff --git a/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js b/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js
index 77adcad215..78fd3d63e9 100644
--- a/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js
+++ b/packages/eslint-plugin/rules/no-top-level-material-ui-4-imports.js
@@ -27,7 +27,23 @@
*/
const KNOWN_STYLES = [
- // TODO: add exports from colorManipulator and transitions
+ // colorManipulator
+ 'hexToRgb',
+ 'rgbToHex',
+ 'hslToRgb',
+ 'decomposeColor',
+ 'recomposeColor',
+ 'getContrastRatio',
+ 'getLuminance',
+ 'emphasize',
+ 'fade',
+ 'alpha',
+ 'darken',
+ 'lighten',
+ // transitions
+ 'easing',
+ 'duration',
+ // styles
'createTheme',
'unstable_createMuiStrictModeTheme',
'createMuiTheme',
@@ -139,7 +155,11 @@ module.exports = {
const value = s.imported.name;
const alias = s.local.name === value ? undefined : s.local.name;
- const propsMatch = /^([A-Z]\w+)Props$/.exec(value);
+ const propsMatch =
+ /^([A-Z]\w+)Props$/.exec(value) ??
+ (node.source.value === '@material-ui/pickers'
+ ? /^Keyboard([A-Z]\w+Picker)$/.exec(value)
+ : null);
const emitProp = propsMatch !== null;
const emitComponent = !emitProp;
@@ -188,7 +208,7 @@ module.exports = {
if (specifier.emitProp && !specifier.emitComponent) {
const replacement = `import { ${getNamedImportValue(
specifier,
- )} } from '@material-ui/core/${specifier.componentValue}';`;
+ )} } from '${node.source.value}/${specifier.componentValue}';`;
replacements.push(replacement);
}
@@ -197,9 +217,9 @@ module.exports = {
replacements.push(
`import ${
specifier.componentAlias ?? specifier.componentValue
- }, { ${getNamedImportValue(
- specifier,
- )} } from '@material-ui/core/${specifier.componentValue}';`,
+ }, { ${getNamedImportValue(specifier)} } from '${
+ node.source.value
+ }/${specifier.componentValue}';`,
);
}
}
diff --git a/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts b/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts
index 2d29c2f9e9..4b675bd038 100644
--- a/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts
+++ b/packages/eslint-plugin/src/no-top-level-material-ui-4-imports.test.ts
@@ -93,6 +93,8 @@ import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon';`,
ThemeProvider,
WithStyles,
Tooltip as MaterialTooltip,
+ alpha,
+ easing
} from '@material-ui/core';`,
errors: [{ messageId: 'topLevelImport' }],
output: `import Box from '@material-ui/core/Box';
@@ -101,7 +103,7 @@ import DialogContent from '@material-ui/core/DialogContent';
import DialogTitle from '@material-ui/core/DialogTitle';
import Grid from '@material-ui/core/Grid';
import MaterialTooltip from '@material-ui/core/Tooltip';
-import { makeStyles, ThemeProvider, WithStyles } from '@material-ui/core/styles';`,
+import { makeStyles, ThemeProvider, WithStyles, alpha, easing } from '@material-ui/core/styles';`,
},
{
code: `import { Box, Button, makeStyles } from '@material-ui/core';`,
@@ -111,11 +113,11 @@ import Button from '@material-ui/core/Button';
import { makeStyles } from '@material-ui/core/styles';`,
},
{
- code: `import { Paper, Typography, styled, withStyles } from '@material-ui/core';`,
+ code: `import { Paper, Typography, styled, withStyles, alpha, duration} from '@material-ui/core';`,
errors: [{ messageId: 'topLevelImport' }],
output: `import Paper from '@material-ui/core/Paper';
import Typography from '@material-ui/core/Typography';
-import { styled, withStyles } from '@material-ui/core/styles';`,
+import { styled, withStyles, alpha, duration } from '@material-ui/core/styles';`,
},
{
code: `import { styled } from '@material-ui/core';`,
@@ -152,5 +154,17 @@ import { styled, withStyles } from '@material-ui/core/styles';`,
errors: [{ messageId: 'topLevelImport' }],
output: `import { styled as s } from '@material-ui/core/styles';`,
},
+ {
+ code: `import { TreeItem, TreeItemProps, TreeView, AlertProps } from '@material-ui/lab';`,
+ errors: [{ messageId: 'topLevelImport' }],
+ output: `import TreeItem, { TreeItemProps } from '@material-ui/lab/TreeItem';
+import TreeView from '@material-ui/lab/TreeView';
+import { AlertProps } from '@material-ui/lab/Alert';`,
+ },
+ {
+ code: `import { KeyboardDatePicker } from '@material-ui/pickers';`,
+ errors: [{ messageId: 'topLevelImport' }],
+ output: `import { KeyboardDatePicker } from '@material-ui/pickers/DatePicker';`,
+ },
],
});
diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md
index 0ac06f4393..b9571091a8 100644
--- a/packages/frontend-app-api/CHANGELOG.md
+++ b/packages/frontend-app-api/CHANGELOG.md
@@ -1,5 +1,31 @@
# @backstage/frontend-app-api
+## 0.7.0
+
+### Minor Changes
+
+- ddddecb: Extensions in app-config now always affect ordering. Previously, only when enabling disabled extensions did they rise to the top.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/theme@0.5.4
+ - @backstage/core-app-api@1.12.5
+ - @backstage/frontend-plugin-api@0.6.5
+
+## 0.7.0-next.2
+
+### Minor Changes
+
+- ddddecb: Extensions in app-config now always affect ordering. Previously, only when enabling disabled extensions did they rise to the top.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+
## 0.6.5-next.1
### Patch Changes
diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json
index 65045bc6ab..2e350b5a98 100644
--- a/packages/frontend-app-api/package.json
+++ b/packages/frontend-app-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-app-api",
- "version": "0.6.5-next.1",
+ "version": "0.7.0",
"backstage": {
"role": "web-library"
},
diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts
index 82f274b960..8af2aef070 100644
--- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts
+++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.test.ts
@@ -110,6 +110,12 @@ describe('resolveAppNodeSpecs', () => {
],
}),
).toEqual([
+ {
+ id: 'b',
+ extension: b,
+ attachTo: { id: 'derp', input: 'default' },
+ disabled: false,
+ },
{
id: 'test/a',
extension: makeExt('test/a'),
@@ -117,12 +123,6 @@ describe('resolveAppNodeSpecs', () => {
source: pluginA,
disabled: false,
},
- {
- id: 'b',
- extension: b,
- attachTo: { id: 'derp', input: 'default' },
- disabled: false,
- },
]);
});
@@ -206,6 +206,70 @@ describe('resolveAppNodeSpecs', () => {
]);
});
+ it('should place config-mentioned instances in the order that they were listed, irrespective of if the extension was enabled or not originally', () => {
+ const a = makeExt('a', 'disabled');
+ const b = makeExt('b', 'enabled');
+ const c = makeExt('c', 'disabled');
+ const d = makeExt('d', 'enabled');
+ const e = makeExt('e', 'disabled');
+ const f = makeExt('f', 'enabled');
+ const g = makeExt('g', 'disabled');
+ expect(
+ resolveAppNodeSpecs({
+ features: [createPlugin({ id: 'empty', extensions: [] })],
+ builtinExtensions: [a, b, c, d, e, f, g],
+ parameters: [
+ { id: 'e', disabled: false },
+ { id: 'd', disabled: false },
+ { id: 'c', disabled: false },
+ ],
+ }),
+ ).toEqual([
+ {
+ id: 'e',
+ extension: e,
+ attachTo: { id: 'root', input: 'default' },
+ disabled: false,
+ },
+ {
+ id: 'd',
+ extension: d,
+ attachTo: { id: 'root', input: 'default' },
+ disabled: false,
+ },
+ {
+ id: 'c',
+ extension: c,
+ attachTo: { id: 'root', input: 'default' },
+ disabled: false,
+ },
+ {
+ id: 'a',
+ extension: a,
+ attachTo: { id: 'root', input: 'default' },
+ disabled: true,
+ },
+ {
+ id: 'b',
+ extension: b,
+ attachTo: { id: 'root', input: 'default' },
+ disabled: false,
+ },
+ {
+ id: 'f',
+ extension: f,
+ attachTo: { id: 'root', input: 'default' },
+ disabled: false,
+ },
+ {
+ id: 'g',
+ extension: g,
+ attachTo: { id: 'root', input: 'default' },
+ disabled: true,
+ },
+ ]);
+ });
+
it('should apply extension overrides', () => {
const plugin = createPlugin({
id: 'test',
diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts
index f056e7a49e..e31c70025d 100644
--- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts
+++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts
@@ -184,6 +184,7 @@ export function resolveAppNodeSpecs(options: {
);
}
+ const order = new Map();
for (const overrideParam of parameters) {
const extensionId = overrideParam.id;
@@ -193,11 +194,10 @@ export function resolveAppNodeSpecs(options: {
);
}
- const existingIndex = configuredExtensions.findIndex(
+ const existing = configuredExtensions.find(
e => e.extension.id === extensionId,
);
- if (existingIndex !== -1) {
- const existing = configuredExtensions[existingIndex];
+ if (existing) {
if (overrideParam.attachTo) {
existing.params.attachTo = overrideParam.attachTo;
}
@@ -209,18 +209,19 @@ export function resolveAppNodeSpecs(options: {
Boolean(existing.params.disabled) !== Boolean(overrideParam.disabled)
) {
existing.params.disabled = Boolean(overrideParam.disabled);
- if (!existing.params.disabled) {
- // bump
- configuredExtensions.splice(existingIndex, 1);
- configuredExtensions.push(existing);
- }
}
+ order.set(extensionId, existing);
} else {
throw new Error(`Extension ${extensionId} does not exist`);
}
}
- return configuredExtensions.map(param => ({
+ const orderedExtensions = [
+ ...order.values(),
+ ...configuredExtensions.filter(e => !order.has(e.extension.id)),
+ ];
+
+ return orderedExtensions.map(param => ({
id: param.extension.id,
attachTo: param.params.attachTo,
extension: param.extension,
diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md
index 1c681fa6bc..f12de020f5 100644
--- a/packages/frontend-plugin-api/CHANGELOG.md
+++ b/packages/frontend-plugin-api/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/frontend-plugin-api
+## 0.6.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+
## 0.6.5-next.1
### Patch Changes
diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json
index 94906cfc67..2dedd6fc12 100644
--- a/packages/frontend-plugin-api/package.json
+++ b/packages/frontend-plugin-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-plugin-api",
- "version": "0.6.5-next.1",
+ "version": "0.6.5",
"backstage": {
"role": "web-library"
},
diff --git a/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts b/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts
index c180dc9719..dab8a9778a 100644
--- a/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts
+++ b/packages/frontend-plugin-api/src/wiring/createPlugin.test.ts
@@ -187,7 +187,7 @@ describe('createPlugin', () => {
await expect(
screen.findByText(
- 'Names: extension-1, extension-2-renamed, extension-3:child',
+ 'Names: extension-2-renamed, extension-1, extension-3:child',
),
).resolves.toBeInTheDocument();
});
diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md
index 79d54b2f29..b2abbd9c2d 100644
--- a/packages/frontend-test-utils/CHANGELOG.md
+++ b/packages/frontend-test-utils/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/frontend-test-utils
+## 0.1.7
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-app-api@0.7.0
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/test-utils@1.5.5
+
+## 0.1.7-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-app-api@0.7.0-next.2
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+
## 0.1.7-next.1
### Patch Changes
diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json
index af83141368..4845e7e9b1 100644
--- a/packages/frontend-test-utils/package.json
+++ b/packages/frontend-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-test-utils",
- "version": "0.1.7-next.1",
+ "version": "0.1.7",
"backstage": {
"role": "web-library"
},
diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md
index b12e621a60..f44e72919c 100644
--- a/packages/integration-react/CHANGELOG.md
+++ b/packages/integration-react/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/integration-react
+## 1.1.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.11.0
+
+## 1.1.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.11.0-next.0
+
## 1.1.26
### Patch Changes
diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json
index c77bd26f27..07effadbae 100644
--- a/packages/integration-react/package.json
+++ b/packages/integration-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration-react",
- "version": "1.1.26",
+ "version": "1.1.27",
"description": "Frontend package for managing integrations towards external systems",
"backstage": {
"role": "web-library"
diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md
index 8a4616bfd7..0c00b80d58 100644
--- a/packages/integration/CHANGELOG.md
+++ b/packages/integration/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/integration
+## 1.11.0
+
+### Minor Changes
+
+- 2cc750d: Added `HarnessIntegration` via the `ScmIntegrations` interface.
+
+## 1.11.0-next.0
+
+### Minor Changes
+
+- 2cc750d: Added `HarnessIntegration` via the `ScmIntegrations` interface.
+
## 1.10.0
### Minor Changes
diff --git a/packages/integration/api-report.md b/packages/integration/api-report.md
index 6b691dff80..2029dac600 100644
--- a/packages/integration/api-report.md
+++ b/packages/integration/api-report.md
@@ -513,6 +513,17 @@ export function getGitLabRequestOptions(config: GitLabIntegrationConfig): {
headers: Record;
};
+// @public
+export function getHarnessFileContentsUrl(
+ config: HarnessIntegrationConfig,
+ url: string,
+): string;
+
+// @public
+export function getHarnessRequestOptions(config: HarnessIntegrationConfig): {
+ headers?: Record;
+};
+
// @public
export class GiteaIntegration implements ScmIntegration {
constructor(config: GiteaIntegrationConfig);
@@ -674,6 +685,34 @@ export type GoogleGcsIntegrationConfig = {
privateKey?: string;
};
+// @public
+export class HarnessIntegration implements ScmIntegration {
+ constructor(config: HarnessIntegrationConfig);
+ // (undocumented)
+ readonly config: HarnessIntegrationConfig;
+ // (undocumented)
+ static factory: ScmIntegrationsFactory;
+ // (undocumented)
+ resolveEditUrl(url: string): string;
+ // (undocumented)
+ resolveUrl(options: {
+ url: string;
+ base: string;
+ lineNumber?: number | undefined;
+ }): string;
+ // (undocumented)
+ get title(): string;
+ // (undocumented)
+ get type(): string;
+}
+
+// @public
+export type HarnessIntegrationConfig = {
+ host: string;
+ token?: string;
+ apiKey?: string;
+};
+
// @public
export interface IntegrationsByType {
// (undocumented)
@@ -696,6 +735,8 @@ export interface IntegrationsByType {
github: ScmIntegrationsGroup;
// (undocumented)
gitlab: ScmIntegrationsGroup;
+ // (undocumented)
+ harness: ScmIntegrationsGroup;
}
// @public
@@ -839,6 +880,9 @@ export function readGoogleGcsIntegrationConfig(
config: Config,
): GoogleGcsIntegrationConfig;
+// @public
+export function readHarnessConfig(config: Config): HarnessIntegrationConfig;
+
// @public @deprecated (undocumented)
export const replaceGitHubUrlType: typeof replaceGithubUrlType;
@@ -889,6 +933,8 @@ export interface ScmIntegrationRegistry
github: ScmIntegrationsGroup;
// (undocumented)
gitlab: ScmIntegrationsGroup;
+ // (undocumented)
+ harness: ScmIntegrationsGroup;
resolveEditUrl(url: string): string;
resolveUrl(options: {
url: string;
@@ -927,6 +973,8 @@ export class ScmIntegrations implements ScmIntegrationRegistry {
// (undocumented)
get gitlab(): ScmIntegrationsGroup;
// (undocumented)
+ get harness(): ScmIntegrationsGroup;
+ // (undocumented)
list(): ScmIntegration[];
// (undocumented)
resolveEditUrl(url: string): string;
diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts
index 44303bf25c..58dd9153c4 100644
--- a/packages/integration/config.d.ts
+++ b/packages/integration/config.d.ts
@@ -345,5 +345,23 @@ export interface Config {
*/
password?: string;
}>;
+ /** Integration configuration for Harness Code */
+ harness?: Array<{
+ /**
+ * The hostname of the given Harness Code instance
+ * @visibility frontend
+ */
+ host: string;
+ /**
+ * The apikey to use for authenticated requests.
+ * @visibility secret
+ */
+ apiKey?: string;
+ /**
+ * Harness Code token used to authenticate requests. This can be either a generated access token.
+ * @visibility secret
+ */
+ token?: string;
+ }>;
};
}
diff --git a/packages/integration/package.json b/packages/integration/package.json
index bbd0eecbe7..da4b700fd6 100644
--- a/packages/integration/package.json
+++ b/packages/integration/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration",
- "version": "1.10.0",
+ "version": "1.11.0",
"description": "Helpers for managing integrations towards external systems",
"backstage": {
"role": "common-library"
diff --git a/packages/integration/src/ScmIntegrations.test.ts b/packages/integration/src/ScmIntegrations.test.ts
index acf602e38d..c758816c03 100644
--- a/packages/integration/src/ScmIntegrations.test.ts
+++ b/packages/integration/src/ScmIntegrations.test.ts
@@ -38,6 +38,7 @@ import { ScmIntegrations } from './ScmIntegrations';
import { GiteaIntegration, GiteaIntegrationConfig } from './gitea';
import { AwsCodeCommitIntegration } from './awsCodeCommit/AwsCodeCommitIntegration';
import { AwsCodeCommitIntegrationConfig } from './awsCodeCommit';
+import { HarnessIntegration, HarnessIntegrationConfig } from './harness';
describe('ScmIntegrations', () => {
const awsS3 = new AwsS3Integration({
@@ -80,6 +81,10 @@ describe('ScmIntegrations', () => {
host: 'gitea.local',
} as GiteaIntegrationConfig);
+ const harness = new HarnessIntegration({
+ host: 'harness.local',
+ } as HarnessIntegrationConfig);
+
const i = new ScmIntegrations({
awsS3: basicIntegrations([awsS3], item => item.config.host),
awsCodeCommit: basicIntegrations([awsCodeCommit], item => item.config.host),
@@ -94,6 +99,7 @@ describe('ScmIntegrations', () => {
github: basicIntegrations([github], item => item.config.host),
gitlab: basicIntegrations([gitlab], item => item.config.host),
gitea: basicIntegrations([gitea], item => item.config.host),
+ harness: basicIntegrations([harness], item => item.config.host),
});
it('can get the specifics', () => {
@@ -113,6 +119,7 @@ describe('ScmIntegrations', () => {
expect(i.github.byUrl('https://github.local')).toBe(github);
expect(i.gitlab.byUrl('https://gitlab.local')).toBe(gitlab);
expect(i.gitea.byUrl('https://gitea.local')).toBe(gitea);
+ expect(i.harness.byUrl('https://harness.local')).toBe(harness);
});
it('can list', () => {
@@ -128,6 +135,7 @@ describe('ScmIntegrations', () => {
github,
gitlab,
gitea,
+ harness,
]),
);
});
@@ -143,6 +151,7 @@ describe('ScmIntegrations', () => {
expect(i.byUrl('https://github.local')).toBe(github);
expect(i.byUrl('https://gitlab.local')).toBe(gitlab);
expect(i.byUrl('https://gitea.local')).toBe(gitea);
+ expect(i.byUrl('https://harness.local')).toBe(harness);
expect(i.byHost('awss3.local')).toBe(awsS3);
expect(i.byHost('awscodecommit.local')).toBe(awsCodeCommit);
diff --git a/packages/integration/src/ScmIntegrations.ts b/packages/integration/src/ScmIntegrations.ts
index 6a1faaa75b..e0d430d834 100644
--- a/packages/integration/src/ScmIntegrations.ts
+++ b/packages/integration/src/ScmIntegrations.ts
@@ -28,6 +28,7 @@ import { defaultScmResolveUrl } from './helpers';
import { ScmIntegration, ScmIntegrationsGroup } from './types';
import { ScmIntegrationRegistry } from './registry';
import { GiteaIntegration } from './gitea';
+import { HarnessIntegration } from './harness/HarnessIntegration';
/**
* The set of supported integrations.
@@ -48,6 +49,7 @@ export interface IntegrationsByType {
github: ScmIntegrationsGroup;
gitlab: ScmIntegrationsGroup;
gitea: ScmIntegrationsGroup;
+ harness: ScmIntegrationsGroup;
}
/**
@@ -70,6 +72,7 @@ export class ScmIntegrations implements ScmIntegrationRegistry {
github: GithubIntegration.factory({ config }),
gitlab: GitLabIntegration.factory({ config }),
gitea: GiteaIntegration.factory({ config }),
+ harness: HarnessIntegration.factory({ config }),
});
}
@@ -120,6 +123,10 @@ export class ScmIntegrations implements ScmIntegrationRegistry {
return this.byType.gitea;
}
+ get harness(): ScmIntegrationsGroup {
+ return this.byType.harness;
+ }
+
list(): ScmIntegration[] {
return Object.values(this.byType).flatMap(
i => i.list() as ScmIntegration[],
diff --git a/packages/integration/src/harness/HarnessIntegration.test.ts b/packages/integration/src/harness/HarnessIntegration.test.ts
new file mode 100644
index 0000000000..2d85204f16
--- /dev/null
+++ b/packages/integration/src/harness/HarnessIntegration.test.ts
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2024 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 { ConfigReader } from '@backstage/config';
+import { HarnessIntegration } from './HarnessIntegration';
+
+describe('HarnessIntegration', () => {
+ it('has a working factory', () => {
+ const integrations = HarnessIntegration.factory({
+ config: new ConfigReader({
+ integrations: {
+ harness: [
+ {
+ host: 'app.harness.io',
+ token: '1234',
+ },
+ ],
+ },
+ }),
+ });
+ expect(integrations.list().length).toBe(1);
+ expect(integrations.list()[0].config.host).toBe('app.harness.io');
+ });
+
+ it('returns the basics', () => {
+ const integration = new HarnessIntegration({
+ host: 'app.harness.io',
+ });
+ expect(integration.type).toBe('harness');
+ expect(integration.title).toBe('app.harness.io');
+ });
+
+ describe('resolveUrl', () => {
+ it('works for valid urls, ignoring line number', () => {
+ const integration = new HarnessIntegration({
+ host: 'app.harness.io',
+ });
+
+ expect(
+ integration.resolveUrl({
+ url: 'https://app.harness.io/catalog-info.yaml',
+ base: 'https://app.harness.io/catalog-info.yaml',
+ lineNumber: 9,
+ }),
+ ).toBe('https://app.harness.io/catalog-info.yaml');
+ });
+
+ it('handles line numbers', () => {
+ const integration = new HarnessIntegration({
+ host: 'app.harness.io',
+ });
+
+ expect(
+ integration.resolveUrl({
+ url: '',
+ base: 'https://app.harness.io/catalog-info.yaml#4',
+ lineNumber: 9,
+ }),
+ ).toBe('https://app.harness.io/catalog-info.yaml#L9');
+ });
+ });
+
+ describe('resolves with a relative url', () => {
+ it('works for valid urls', () => {
+ const integration = new HarnessIntegration({
+ host: 'app.harness.io',
+ });
+
+ expect(
+ integration.resolveUrl({
+ url: './skeleton',
+ base: 'https://app.harness.io/git/plugins/repo/+/refs/heads/master/template.yaml',
+ }),
+ ).toBe(
+ 'https://app.harness.io/git/plugins/repo/+/refs/heads/master/skeleton',
+ );
+ });
+ });
+
+ describe('resolves with an absolute url', () => {
+ it('works for valid urls', () => {
+ const integration = new HarnessIntegration({
+ host: 'app.harness.io',
+ });
+
+ expect(
+ integration.resolveUrl({
+ url: '/catalog-info.yaml',
+ base: 'https://app.harness.io/git/repo/+/refs/heads/master/',
+ }),
+ ).toBe(
+ 'https://app.harness.io/git/repo/+/refs/heads/master/catalog-info.yaml',
+ );
+ });
+ });
+
+ it('resolve edit URL', () => {
+ const integration = new HarnessIntegration({
+ host: 'app.harness.io',
+ });
+
+ expect(
+ integration.resolveEditUrl(
+ 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/edit/refMain/~/all-apis.yaml',
+ ),
+ ).toBe(
+ 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/edit/all-apis.yaml',
+ );
+ });
+});
diff --git a/packages/integration/src/harness/HarnessIntegration.ts b/packages/integration/src/harness/HarnessIntegration.ts
new file mode 100644
index 0000000000..5d1b274149
--- /dev/null
+++ b/packages/integration/src/harness/HarnessIntegration.ts
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2024 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 { basicIntegrations, defaultScmResolveUrl } from '../helpers';
+import { ScmIntegration, ScmIntegrationsFactory } from '../types';
+import { HarnessIntegrationConfig, readHarnessConfig } from './config';
+import { getHarnessEditContentsUrl } from './core';
+
+/**
+ * A Harness Code based integration.
+ *
+ * @public
+ */
+export class HarnessIntegration implements ScmIntegration {
+ static factory: ScmIntegrationsFactory = ({ config }) => {
+ const configs = config.getOptionalConfigArray('integrations.harness') ?? [];
+ const harnessConfigs = configs.map(c => readHarnessConfig(c));
+
+ return basicIntegrations(
+ harnessConfigs.map(c => new HarnessIntegration(c)),
+ (harness: HarnessIntegration) => harness.config.host,
+ );
+ };
+
+ constructor(readonly config: HarnessIntegrationConfig) {}
+
+ get type(): string {
+ return 'harness';
+ }
+
+ get title(): string {
+ return this.config.host;
+ }
+
+ resolveUrl(options: {
+ url: string;
+ base: string;
+ lineNumber?: number | undefined;
+ }): string {
+ return defaultScmResolveUrl(options);
+ }
+
+ resolveEditUrl(url: string): string {
+ return getHarnessEditContentsUrl(this.config, url);
+ }
+}
diff --git a/packages/integration/src/harness/config.test.ts b/packages/integration/src/harness/config.test.ts
new file mode 100644
index 0000000000..93be1fcc32
--- /dev/null
+++ b/packages/integration/src/harness/config.test.ts
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2024 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 { Config, ConfigReader } from '@backstage/config';
+import { loadConfigSchema } from '@backstage/config-loader';
+import { HarnessIntegrationConfig, readHarnessConfig } from './config';
+
+describe('readHarnessConfig', () => {
+ function buildConfig(data: Partial): Config {
+ return new ConfigReader(data);
+ }
+
+ async function buildFrontendConfig(
+ data: Partial,
+ ): Promise {
+ const fullSchema = await loadConfigSchema({
+ dependencies: ['@backstage/integration'],
+ });
+ const serializedSchema = fullSchema.serialize() as {
+ schemas: { value: { properties?: { integrations?: object } } }[];
+ };
+ const schema = await loadConfigSchema({
+ serialized: {
+ ...serializedSchema, // only include schemas that apply to integrations
+ schemas: serializedSchema.schemas.filter(
+ s => s.value?.properties?.integrations,
+ ),
+ },
+ });
+ const processed = schema.process(
+ [{ data: { integrations: { harness: [data] } }, context: 'app' }],
+ { visibility: ['frontend'] },
+ );
+ return new ConfigReader((processed[0].data as any).integrations.harness[0]);
+ }
+
+ it('reads all values', () => {
+ const output = readHarnessConfig(
+ buildConfig({
+ host: 'a.com',
+ token: 'p',
+ apiKey: 'a',
+ }),
+ );
+ expect(output).toEqual({
+ host: 'a.com',
+ token: 'p',
+ apiKey: 'a',
+ });
+ });
+
+ it('can create a default value if the API base URL is missing', () => {
+ const output = readHarnessConfig(
+ buildConfig({
+ host: 'a.com',
+ }),
+ );
+ expect(output).toEqual({
+ host: 'a.com',
+ token: undefined,
+ });
+ });
+
+ it('rejects funky configs', () => {
+ const valid: any = {
+ host: 'a.com',
+ };
+ expect(() => readHarnessConfig(buildConfig({ ...valid, host: 2 }))).toThrow(
+ /host/,
+ );
+ });
+
+ it('works on the frontend', async () => {
+ expect(
+ readHarnessConfig(
+ await buildFrontendConfig({
+ host: 'a.com',
+ token: 'p',
+ }),
+ ),
+ ).toEqual({
+ host: 'a.com',
+ });
+ });
+});
diff --git a/packages/integration/src/harness/config.ts b/packages/integration/src/harness/config.ts
new file mode 100644
index 0000000000..2f75915567
--- /dev/null
+++ b/packages/integration/src/harness/config.ts
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2024 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 { Config } from '@backstage/config';
+import { isValidHost } from '../helpers';
+
+/**
+ * The configuration for a single Harness integration.
+ *
+ * @public
+ */
+export type HarnessIntegrationConfig = {
+ /**
+ * The host of the target that this matches on, e.g. "app.harness.io"
+ */
+ host: string;
+ /**
+ * The password or http token to use for authentication.
+ */
+ token?: string;
+ /**
+ * The API key to use for authentication.
+ */
+ apiKey?: string;
+};
+
+/**
+ * Parses a location config block for use in HarnessIntegration
+ *
+ * @public
+ */
+export function readHarnessConfig(config: Config): HarnessIntegrationConfig {
+ const host = config.getString('host');
+ const token = config.getOptionalString('token');
+ const apiKey = config.getOptionalString('apiKey');
+
+ if (!isValidHost(host)) {
+ throw new Error(
+ `Invalid Harness Code integration config, '${host}' is not a valid host`,
+ );
+ }
+
+ return {
+ host,
+ apiKey,
+ token,
+ };
+}
diff --git a/packages/integration/src/harness/core.test.ts b/packages/integration/src/harness/core.test.ts
new file mode 100644
index 0000000000..d3d402806a
--- /dev/null
+++ b/packages/integration/src/harness/core.test.ts
@@ -0,0 +1,91 @@
+/*
+ * 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 { setupServer } from 'msw/node';
+import { setupRequestMockHandlers } from '../helpers';
+import { HarnessIntegrationConfig } from './config';
+import {
+ getHarnessEditContentsUrl,
+ getHarnessFileContentsUrl,
+ getHarnessRequestOptions,
+} from './core';
+
+describe('Harness code core', () => {
+ const worker = setupServer();
+ setupRequestMockHandlers(worker);
+
+ describe('getHarnessFileContentsUrl', () => {
+ it('can create an url from arguments', () => {
+ const config: HarnessIntegrationConfig = {
+ host: 'app.harness.io',
+ };
+ expect(
+ getHarnessFileContentsUrl(
+ config,
+ 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml',
+ ),
+ ).toEqual(
+ 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/raw/all-apis.yaml?routingId=accountId&git_ref=refMain',
+ );
+ });
+ });
+
+ describe('getHarnessEditContentsUrl', () => {
+ it('can create an url from arguments', () => {
+ const config: HarnessIntegrationConfig = {
+ host: 'app.harness.io',
+ };
+ expect(
+ getHarnessEditContentsUrl(
+ config,
+ 'https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/edit/refMain/~/all-apis.yaml',
+ ),
+ ).toEqual(
+ 'https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/edit/all-apis.yaml',
+ );
+ });
+ });
+
+ describe('getHarnessRequestOptions', () => {
+ it('adds token header when only a token is specified', () => {
+ const authRequest: HarnessIntegrationConfig = {
+ host: 'app.harness.io',
+ token: 'P',
+ };
+ const anonymousRequest: HarnessIntegrationConfig = {
+ host: 'app.harness.io',
+ };
+ expect(
+ (getHarnessRequestOptions(authRequest).headers as any).Authorization,
+ ).toEqual('Bearer P');
+ expect(getHarnessRequestOptions(anonymousRequest).headers).toStrictEqual(
+ {},
+ );
+ });
+
+ it('adds basic auth when apikey and token are specified', () => {
+ const authRequest: HarnessIntegrationConfig = {
+ host: 'app.harness.io',
+ token: 'P',
+ apiKey: 'a',
+ };
+
+ expect(
+ (getHarnessRequestOptions(authRequest).headers as any)['x-api-key'],
+ ).toEqual('a');
+ });
+ });
+});
diff --git a/packages/integration/src/harness/core.ts b/packages/integration/src/harness/core.ts
new file mode 100644
index 0000000000..3a61905e27
--- /dev/null
+++ b/packages/integration/src/harness/core.ts
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2024 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 { HarnessIntegrationConfig } from './config';
+
+/**
+ * Given a URL pointing to a file, returns a URL
+ * for editing the contents of the data.
+ *
+ * @remarks
+ *
+ * Converts
+ * from: https://app.harness.io/a/b/src/branchname/path/to/c.yaml
+ * or: https://app.harness.io/a/b/_edit/branchname/path/to/c.yaml
+ *
+ * @param url - A URL pointing to a file
+ * @param config - The relevant provider config
+ * @public
+ */
+export function getHarnessEditContentsUrl(
+ config: HarnessIntegrationConfig,
+ url: string,
+) {
+ try {
+ const baseUrl = `https://${config.host}`;
+ const [
+ _blank,
+ _ng,
+ _account,
+ accountId,
+ _module,
+ _moduleName,
+ _org,
+ orgName,
+ _projects,
+ projectName,
+ _repos,
+ repoName,
+ _files,
+ _ref,
+ _branch,
+ ...path
+ ] = url.replace(baseUrl, '').split('/');
+ const pathWithoutSlash = path.join('/').replace(/^\//, '');
+ return `${baseUrl}/gateway/code/api/v1/repos/${accountId}/${orgName}/${projectName}/${repoName}/+/edit/${pathWithoutSlash}`;
+ } catch (e) {
+ throw new Error(`Incorrect URL: ${url}, ${e}`);
+ }
+}
+
+/**
+ * Given a file path URL,
+ * it returns an API URL which returns the contents of the file.
+ * @remarks
+ *
+ * Converts
+ * from: https://app.harness.io/ng/account/accountId/module/code/orgs/orgName/projects/projName/repos/repoName/files/refMain/~/all-apis.yaml
+ * to: https://app.harness.io/gateway/code/api/v1/repos/accountId/orgName/projName/repoName/+/content/all-apis.yaml?routingId=accountId&include_commit=false&ref=refMain
+ *
+ * @param url - A URL pointing to a file
+ * @param config - The relevant provider config
+ * @public
+ */
+export function getHarnessFileContentsUrl(
+ config: HarnessIntegrationConfig,
+ url: string,
+) {
+ try {
+ const baseUrl = `https://${config.host}`;
+ const [
+ _blank,
+ _ng,
+ _account,
+ accountId,
+ _module,
+ _moduleName,
+ _org,
+ orgName,
+ _projects,
+ projectName,
+ _repos,
+ repoName,
+ _files,
+ _ref,
+ _branch,
+ ...path
+ ] = url.replace(baseUrl, '').split('/');
+ const urlParts = url.replace(baseUrl, '').split('/');
+ const refAndPath = urlParts.slice(13);
+ const refIndex = refAndPath.findIndex(item => item === '~');
+ const refString = refAndPath.slice(0, refIndex);
+ const pathWithoutSlash = path.join('/').replace(/^\//, '');
+ return `${baseUrl}/gateway/code/api/v1/repos/${accountId}/${orgName}/${projectName}/${repoName}/+/raw/${pathWithoutSlash}?routingId=${accountId}&git_ref=${refString}`;
+ } catch (e) {
+ throw new Error(`Incorrect URL: ${url}, ${e}`);
+ }
+}
+
+/**
+ * Return request headers for a Harness Code provider.
+ *
+ * @param config - A Harness Code provider config
+ * @public
+ */
+export function getHarnessRequestOptions(config: HarnessIntegrationConfig): {
+ headers?: Record;
+} {
+ const headers: Record = {};
+ const { token, apiKey } = config;
+
+ if (apiKey) {
+ headers['x-api-key'] = apiKey;
+ } else if (token) {
+ headers.Authorization = `Bearer ${token}`;
+ }
+
+ return {
+ headers,
+ };
+}
diff --git a/packages/integration/src/harness/index.ts b/packages/integration/src/harness/index.ts
new file mode 100644
index 0000000000..264df657f0
--- /dev/null
+++ b/packages/integration/src/harness/index.ts
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2024 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.
+ */
+export { HarnessIntegration } from './HarnessIntegration';
+export { getHarnessRequestOptions, getHarnessFileContentsUrl } from './core';
+export { readHarnessConfig } from './config';
+export type { HarnessIntegrationConfig } from './config';
diff --git a/packages/integration/src/index.ts b/packages/integration/src/index.ts
index b20477ee6a..32c573abef 100644
--- a/packages/integration/src/index.ts
+++ b/packages/integration/src/index.ts
@@ -31,6 +31,7 @@ export * from './gitea';
export * from './github';
export * from './gitlab';
export * from './googleGcs';
+export * from './harness';
export { defaultScmResolveUrl } from './helpers';
export { ScmIntegrations } from './ScmIntegrations';
export type { IntegrationsByType } from './ScmIntegrations';
diff --git a/packages/integration/src/registry.ts b/packages/integration/src/registry.ts
index 00706acc1c..7e4b34cc34 100644
--- a/packages/integration/src/registry.ts
+++ b/packages/integration/src/registry.ts
@@ -25,6 +25,7 @@ import { GerritIntegration } from './gerrit/GerritIntegration';
import { GithubIntegration } from './github/GithubIntegration';
import { GitLabIntegration } from './gitlab/GitLabIntegration';
import { GiteaIntegration } from './gitea/GiteaIntegration';
+import { HarnessIntegration } from './harness/HarnessIntegration';
/**
* Holds all registered SCM integrations, of all types.
@@ -46,6 +47,7 @@ export interface ScmIntegrationRegistry
github: ScmIntegrationsGroup;
gitlab: ScmIntegrationsGroup;
gitea: ScmIntegrationsGroup;
+ harness: ScmIntegrationsGroup;
/**
* Resolves an absolute or relative URL in relation to a base URL.
*
diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md
index 443a5f30b5..251ddb28de 100644
--- a/packages/repo-tools/CHANGELOG.md
+++ b/packages/repo-tools/CHANGELOG.md
@@ -1,5 +1,30 @@
# @backstage/repo-tools
+## 0.9.0
+
+### Minor Changes
+
+- 683870a: Adds 2 new commands `repo schema openapi diff` and `package schema openapi diff`. `repo schema openapi diff` is intended to power a new breaking changes check on pull requests and the package level command allows plugin developers to quickly see new API breaking changes. They're intended to be used in complement with the existing `repo schema openapi verify` command to validate your OpenAPI spec against a variety of things.
+
+### Patch Changes
+
+- 9ae9bb2: Update the paths logic in the api reports command to support complex subpaths
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-plugin-api@0.6.18
+
+## 0.9.0-next.2
+
+### Minor Changes
+
+- 683870a: Adds 2 new commands `repo schema openapi diff` and `package schema openapi diff`. `repo schema openapi diff` is intended to power a new breaking changes check on pull requests and the package level command allows plugin developers to quickly see new API breaking changes. They're intended to be used in complement with the existing `repo schema openapi verify` command to validate your OpenAPI spec against a variety of things.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.8.1-next.1
### Patch Changes
diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json
index e39e5203b7..5c2e5e859c 100644
--- a/packages/repo-tools/package.json
+++ b/packages/repo-tools/package.json
@@ -1,38 +1,49 @@
{
"name": "@backstage/repo-tools",
"description": "CLI for Backstage repo tooling ",
- "version": "0.8.1-next.1",
+ "version": "0.9.0",
"publishConfig": {
"access": "public"
},
"backstage": {
"role": "cli"
},
+ "keywords": [
+ "backstage"
+ ],
"homepage": "https://backstage.io",
"repository": {
"type": "git",
"url": "https://github.com/backstage/backstage",
"directory": "packages/repo-tools"
},
- "keywords": [
- "backstage"
- ],
"license": "Apache-2.0",
"main": "dist/index.cjs.js",
- "scripts": {
- "build": "backstage-cli package build",
- "lint": "backstage-cli package lint",
- "test": "backstage-cli package test",
- "clean": "backstage-cli package clean",
- "start": "nodemon --"
- },
"bin": {
"backstage-repo-tools": "bin/backstage-repo-tools"
},
+ "files": [
+ "bin",
+ "dist/**/*.js",
+ "templates",
+ "openapitools.json"
+ ],
+ "scripts": {
+ "build": "backstage-cli package build",
+ "clean": "backstage-cli package clean",
+ "lint": "backstage-cli package lint",
+ "start": "nodemon --",
+ "test": "backstage-cli package test"
+ },
+ "nodemonConfig": {
+ "exec": "bin/backstage-repo-tools",
+ "ext": "ts",
+ "watch": "./src"
+ },
"dependencies": {
"@apidevtools/swagger-parser": "^10.1.0",
"@apisyouwonthate/style-guide": "^1.4.0",
- "@backstage/backend-common": "workspace:^",
+ "@backstage/backend-plugin-api": "workspace:^",
"@backstage/catalog-model": "workspace:^",
"@backstage/cli-common": "workspace:^",
"@backstage/cli-node": "workspace:^",
@@ -84,16 +95,5 @@
"prettier": {
"optional": true
}
- },
- "files": [
- "bin",
- "dist/**/*.js",
- "templates",
- "openapitools.json"
- ],
- "nodemonConfig": {
- "watch": "./src",
- "exec": "bin/backstage-repo-tools",
- "ext": "ts"
}
}
diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts
index 5dfed05f93..6963e02664 100644
--- a/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts
+++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts
@@ -24,7 +24,7 @@ import { paths as cliPaths } from '../../../../../lib/paths';
import { mkdirpSync } from 'fs-extra';
import fs from 'fs-extra';
import { exec } from '../../../../../lib/exec';
-import { resolvePackagePath } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { getPathToCurrentOpenApiSpec } from '../../../../../lib/openapi/helpers';
async function generate(outputDirectory: string) {
diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md
index 99853ed312..0bb564782c 100644
--- a/packages/techdocs-cli-embedded-app/CHANGELOG.md
+++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md
@@ -1,5 +1,33 @@
# techdocs-cli-embedded-app
+## 0.2.96
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.20.0
+ - @backstage/cli@0.26.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-techdocs@1.10.5
+ - @backstage/theme@0.5.4
+ - @backstage/core-app-api@1.12.5
+ - @backstage/app-defaults@1.5.5
+ - @backstage/integration-react@1.1.27
+ - @backstage/test-utils@1.5.5
+ - @backstage/plugin-techdocs-react@1.2.4
+
+## 0.2.96-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.26.5-next.1
+ - @backstage/plugin-techdocs@1.10.5-next.2
+ - @backstage/plugin-catalog@1.20.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/integration-react@1.1.27-next.0
+
## 0.2.96-next.1
### Patch Changes
diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json
index ce19840c56..c6f776015c 100644
--- a/packages/techdocs-cli-embedded-app/package.json
+++ b/packages/techdocs-cli-embedded-app/package.json
@@ -1,6 +1,6 @@
{
"name": "techdocs-cli-embedded-app",
- "version": "0.2.96-next.1",
+ "version": "0.2.96",
"private": true,
"backstage": {
"role": "frontend"
diff --git a/packages/techdocs-cli-embedded-app/src/apis.ts b/packages/techdocs-cli-embedded-app/src/apis.ts
index d48bee569d..5bb19a563d 100644
--- a/packages/techdocs-cli-embedded-app/src/apis.ts
+++ b/packages/techdocs-cli-embedded-app/src/apis.ts
@@ -72,7 +72,7 @@ class TechDocsDevStorageApi implements TechDocsStorageApi {
}
async getBuilder() {
- return this.configApi.getString('techdocs.builder');
+ return this.configApi.getOptionalString('techdocs.builder') || 'local';
}
async getEntityDocs(_entityId: CompoundEntityRef, path: string) {
diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md
index 3b2c544e7d..c1c15bb78c 100644
--- a/packages/techdocs-cli/CHANGELOG.md
+++ b/packages/techdocs-cli/CHANGELOG.md
@@ -1,5 +1,15 @@
# @techdocs/cli
+## 1.8.11
+
+### Patch Changes
+
+- 1a0e009: Fix cookie endpoint mock for `serve`
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/plugin-techdocs-node@1.12.4
+
## 1.8.11-next.1
### Patch Changes
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 13eed9d249..5af004aeb0 100644
--- a/packages/techdocs-cli/package.json
+++ b/packages/techdocs-cli/package.json
@@ -1,7 +1,7 @@
{
"name": "@techdocs/cli",
"description": "Utility CLI for managing TechDocs sites in Backstage.",
- "version": "1.8.11-next.1",
+ "version": "1.8.11",
"publishConfig": {
"access": "public"
},
diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md
index d28d0cac49..4c8e0c1173 100644
--- a/packages/test-utils/CHANGELOG.md
+++ b/packages/test-utils/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/test-utils
+## 1.5.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.5.4
+ - @backstage/core-app-api@1.12.5
+
## 1.5.5-next.0
### Patch Changes
diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json
index 2e46e3a9b0..d48b652c43 100644
--- a/packages/test-utils/package.json
+++ b/packages/test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/test-utils",
- "version": "1.5.5-next.0",
+ "version": "1.5.5",
"description": "Utilities to test Backstage plugins and apps.",
"backstage": {
"role": "web-library"
diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md
index 20703a1d9d..397b6c80f5 100644
--- a/packages/theme/CHANGELOG.md
+++ b/packages/theme/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/theme
+## 0.5.4
+
+### Patch Changes
+
+- f1462df: Fixed bug where scrollbars don't pick up the theme when in dark mode
+
## 0.5.4-next.0
### Patch Changes
diff --git a/packages/theme/package.json b/packages/theme/package.json
index 07eefe756f..698d4f567c 100644
--- a/packages/theme/package.json
+++ b/packages/theme/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/theme",
- "version": "0.5.4-next.0",
+ "version": "0.5.4",
"description": "material-ui theme for use with Backstage.",
"backstage": {
"role": "web-library"
diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md
index faac54a107..92eb1b44f1 100644
--- a/plugins/api-docs/CHANGELOG.md
+++ b/plugins/api-docs/CHANGELOG.md
@@ -1,5 +1,32 @@
# @backstage/plugin-api-docs
+## 0.11.5
+
+### Patch Changes
+
+- 5d99272: Update local development dependencies.
+- 725ff0b: Fix dark mode text color inside tables in `description:` from OpenAPI definitions
+- Updated dependencies
+ - @backstage/plugin-catalog@1.20.0
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.11.5-next.2
+
+### Patch Changes
+
+- 725ff0b: Fix dark mode text color inside tables in `description:` from OpenAPI definitions
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/plugin-catalog@1.20.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+
## 0.11.5-next.1
### Patch Changes
@@ -1337,8 +1364,7 @@
### Patch Changes
- 8f7b1835df: Updated dependency `msw` to `^0.41.0`.
-- 811ff4bcf4: Updated `swagger-ui-react` to 4.11.1 in order to address a [XSS
- vulnerability](https://github.com/advisories/GHSA-hqq7-2q2v-82xq) in `@braintree/sanitize-url`
+- 811ff4bcf4: Updated `swagger-ui-react` to 4.11.1 in order to address a [XSS vulnerability](https://github.com/advisories/GHSA-hqq7-2q2v-82xq) in `@braintree/sanitize-url`
- Updated dependencies
- @backstage/plugin-catalog@1.3.0
- @backstage/plugin-catalog-react@1.1.1
diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json
index c8acdf256f..398407e33f 100644
--- a/plugins/api-docs/package.json
+++ b/plugins/api-docs/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-api-docs",
- "version": "0.11.5-next.1",
+ "version": "0.11.5",
"description": "A Backstage plugin that helps represent API entities in the frontend",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx
index ee23e75ff2..1505646dee 100644
--- a/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx
+++ b/plugins/api-docs/src/components/OpenApiDefinitionWidget/OpenApiDefinition.tsx
@@ -34,7 +34,9 @@ const useStyles = makeStyles(theme => ({
[`& .opblock-tag,
.opblock-tag small,
table thead tr td,
- table thead tr th`]: {
+ table thead tr th,
+ table tbody tr td,
+ table tbody tr th`]: {
fontFamily: theme.typography.fontFamily,
color: theme.palette.text.primary,
borderColor: theme.palette.divider,
diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md
index 2b51f92102..c33d774b1a 100644
--- a/plugins/app-backend/CHANGELOG.md
+++ b/plugins/app-backend/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-app-backend
+## 0.3.66
+
+### Patch Changes
+
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+ - @backstage/plugin-app-node@0.1.18
+
## 0.3.66-next.1
### Patch Changes
diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json
index fc4a6a8ded..d0b07f4041 100644
--- a/plugins/app-backend/package.json
+++ b/plugins/app-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-app-backend",
"description": "A Backstage backend plugin that serves the Backstage frontend app",
- "version": "0.3.66-next.1",
+ "version": "0.3.66",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts b/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts
index 05d6424013..1179a11ef3 100644
--- a/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts
+++ b/plugins/app-backend/src/lib/assets/StaticAssetsStore.ts
@@ -14,15 +14,15 @@
* limitations under the License.
*/
-import {
- PluginDatabaseManager,
- resolvePackagePath,
-} from '@backstage/backend-common';
+import { PluginDatabaseManager } from '@backstage/backend-common';
import { Knex } from 'knex';
import { DateTime } from 'luxon';
import partition from 'lodash/partition';
import { StaticAsset, StaticAssetInput, StaticAssetProvider } from './types';
-import { LoggerService } from '@backstage/backend-plugin-api';
+import {
+ LoggerService,
+ resolvePackagePath,
+} from '@backstage/backend-plugin-api';
const migrationsDir = resolvePackagePath(
'@backstage/plugin-app-backend',
diff --git a/plugins/app-backend/src/lib/assets/findStaticAssets.ts b/plugins/app-backend/src/lib/assets/findStaticAssets.ts
index 7ecea7146e..c8731bfc93 100644
--- a/plugins/app-backend/src/lib/assets/findStaticAssets.ts
+++ b/plugins/app-backend/src/lib/assets/findStaticAssets.ts
@@ -17,7 +17,7 @@
import fs from 'fs-extra';
import globby from 'globby';
import { StaticAssetInput } from './types';
-import { resolveSafeChildPath } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
/**
* Finds all static assets within a directory
diff --git a/plugins/app-backend/src/service/__fixtures__/app-dir/dist/.config-schema.json b/plugins/app-backend/src/service/__fixtures__/app-dir/dist/.config-schema.json
new file mode 100644
index 0000000000..3db59473d3
--- /dev/null
+++ b/plugins/app-backend/src/service/__fixtures__/app-dir/dist/.config-schema.json
@@ -0,0 +1,4 @@
+{
+ "backstageConfigSchemaVersion": 1,
+ "schemas": []
+}
diff --git a/plugins/app-backend/src/service/appPlugin.test.ts b/plugins/app-backend/src/service/appPlugin.test.ts
index 647697c204..c239d476bd 100644
--- a/plugins/app-backend/src/service/appPlugin.test.ts
+++ b/plugins/app-backend/src/service/appPlugin.test.ts
@@ -22,7 +22,7 @@ import {
} from '@backstage/backend-test-utils';
import { appPlugin } from './appPlugin';
import { createRootLogger } from '@backstage/backend-common';
-import { overridePackagePathResolution } from '@backstage/backend-common/testUtils';
+import { overridePackagePathResolution } from '@backstage/backend-plugin-api/testUtils';
const mockDir = createMockDirectory();
overridePackagePathResolution({
diff --git a/plugins/app-backend/src/service/router.test.ts b/plugins/app-backend/src/service/router.test.ts
index 30fa5454c0..6fffdb149f 100644
--- a/plugins/app-backend/src/service/router.test.ts
+++ b/plugins/app-backend/src/service/router.test.ts
@@ -15,12 +15,13 @@
*/
import { getVoidLogger } from '@backstage/backend-common';
-import { ConfigReader } from '@backstage/config';
+import { AppConfig, ConfigReader } from '@backstage/config';
import express from 'express';
import Router from 'express-promise-router';
import { resolve as resolvePath } from 'path';
import request from 'supertest';
import { createRouter } from './router';
+import { loadConfigSchema } from '@backstage/config-loader';
jest.mock('../lib/config', () => ({
injectConfig: jest.fn(),
@@ -115,3 +116,75 @@ describe('createRouter with static fallback handler', () => {
expect(response3.status).toBe(404);
});
});
+
+describe('createRouter config schema test', () => {
+ const libConfigs = require('../lib/config');
+ const libConfigsActual = jest.requireActual('../lib/config');
+ const readConfigsMock: jest.Mock = libConfigs.readConfigs;
+
+ beforeEach(() => {
+ jest.resetAllMocks();
+ readConfigsMock.mockImplementation(libConfigsActual.readConfigs);
+ });
+
+ it('uses an external schema', async () => {
+ await createRouter({
+ logger: getVoidLogger(),
+ config: new ConfigReader({
+ test: 'value',
+ }),
+ appPackageName: 'example-app',
+ schema: await loadConfigSchema({
+ serialized: {
+ schemas: [
+ {
+ value: {
+ type: 'object',
+ properties: {
+ test: {
+ visibility: 'frontend',
+ type: 'string',
+ },
+ },
+ },
+ path: '/mock',
+ },
+ ],
+ backstageConfigSchemaVersion: 1,
+ },
+ }),
+ });
+
+ const results = readConfigsMock.mock.results;
+ expect(results.length).toBe(1);
+
+ const mockedResult = results[0];
+ expect(mockedResult.type).toBe('return');
+ const result = await (mockedResult.value as Promise);
+
+ expect(result.length).toBe(1);
+ expect(result[0].data).toStrictEqual({
+ test: 'value',
+ });
+ });
+
+ it('uses no external schema', async () => {
+ await createRouter({
+ logger: getVoidLogger(),
+ config: new ConfigReader({
+ test: 'value',
+ }),
+ appPackageName: 'example-app',
+ });
+
+ const results = readConfigsMock.mock.results;
+ expect(results.length).toBe(1);
+
+ const mockedResult = results[0];
+ expect(mockedResult.type).toBe('return');
+ const result = await (mockedResult.value as Promise);
+
+ expect(result.length).toBe(1);
+ expect(result[0].data).toStrictEqual({});
+ });
+});
diff --git a/plugins/app-backend/src/service/router.ts b/plugins/app-backend/src/service/router.ts
index af88f0d9da..8ec871df81 100644
--- a/plugins/app-backend/src/service/router.ts
+++ b/plugins/app-backend/src/service/router.ts
@@ -17,8 +17,8 @@
import {
notFoundHandler,
PluginDatabaseManager,
- resolvePackagePath,
} from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { AppConfig, Config } from '@backstage/config';
import helmet from 'helmet';
import express from 'express';
@@ -113,6 +113,7 @@ export async function createRouter(
staticFallbackHandler,
auth,
httpAuth,
+ schema,
} = options;
const disableConfigInjection =
@@ -143,6 +144,7 @@ export async function createRouter(
config,
appDistDir,
env: process.env,
+ schema,
});
const assetStore =
diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md
index dfc8e08cb9..75fc04fbdf 100644
--- a/plugins/app-node/CHANGELOG.md
+++ b/plugins/app-node/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-app-node
+## 0.1.18
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+
## 0.1.18-next.1
### Patch Changes
diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json
index a38ed25171..cbaca9f3d1 100644
--- a/plugins/app-node/package.json
+++ b/plugins/app-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-app-node",
"description": "Node.js library for the app plugin",
- "version": "0.1.18-next.1",
+ "version": "0.1.18",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md
index c3e117a8a0..bf39546c90 100644
--- a/plugins/app-visualizer/CHANGELOG.md
+++ b/plugins/app-visualizer/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-app-visualizer
+## 0.1.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/frontend-plugin-api@0.6.5
+
## 0.1.6-next.1
### Patch Changes
diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json
index 0b2370054c..a3e9d89e3b 100644
--- a/plugins/app-visualizer/package.json
+++ b/plugins/app-visualizer/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-app-visualizer",
- "version": "0.1.6-next.1",
+ "version": "0.1.6",
"description": "Visualizes the Backstage app structure",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md
index 915c9b0f19..f75da3056e 100644
--- a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-atlassian-provider
+## 0.1.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.10-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-atlassian-provider/package.json b/plugins/auth-backend-module-atlassian-provider/package.json
index 0f0c3eeda9..0b0f949c44 100644
--- a/plugins/auth-backend-module-atlassian-provider/package.json
+++ b/plugins/auth-backend-module-atlassian-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-atlassian-provider",
"description": "The atlassian-provider backend module for the auth plugin.",
- "version": "0.1.10-next.1",
+ "version": "0.1.10",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md
index 0b2fa1faf0..f3c1594df9 100644
--- a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md
@@ -1,5 +1,25 @@
# @backstage/plugin-auth-backend-module-aws-alb-provider
+## 0.1.10
+
+### Patch Changes
+
+- 4a0577e: fix: Move config declarations to appropriate auth backend modules
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-backend@0.22.5
+ - @backstage/plugin-auth-node@0.4.13
+
+## 0.1.10-next.2
+
+### Patch Changes
+
+- 4a0577e: fix: Move config declarations to appropriate auth backend modules
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-auth-backend@0.22.5-next.2
+
## 0.1.10-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-aws-alb-provider/config.d.ts b/plugins/auth-backend-module-aws-alb-provider/config.d.ts
new file mode 100644
index 0000000000..1978e5a4df
--- /dev/null
+++ b/plugins/auth-backend-module-aws-alb-provider/config.d.ts
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2024 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.
+ */
+
+export interface Config {
+ auth?: {
+ providers?: {
+ /** @visibility frontend */
+ awsalb?: {
+ issuer?: string;
+ region: string;
+ };
+ };
+ };
+}
diff --git a/plugins/auth-backend-module-aws-alb-provider/package.json b/plugins/auth-backend-module-aws-alb-provider/package.json
index ae25459ccc..e699c13dfd 100644
--- a/plugins/auth-backend-module-aws-alb-provider/package.json
+++ b/plugins/auth-backend-module-aws-alb-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-aws-alb-provider",
"description": "The aws-alb provider module for the Backstage auth backend.",
- "version": "0.1.10-next.1",
+ "version": "0.1.10",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md
index 0ed21e2749..901f88b20a 100644
--- a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-backend-module-azure-easyauth-provider
+## 0.1.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-azure-easyauth-provider/package.json b/plugins/auth-backend-module-azure-easyauth-provider/package.json
index e936f48f43..bec9f86224 100644
--- a/plugins/auth-backend-module-azure-easyauth-provider/package.json
+++ b/plugins/auth-backend-module-azure-easyauth-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-azure-easyauth-provider",
- "version": "0.1.1-next.1",
+ "version": "0.1.1",
"description": "The azure-easyauth-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md
index 4b414015cc..a3787cfdc0 100644
--- a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-bitbucket-provider
+## 0.1.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-bitbucket-provider/package.json b/plugins/auth-backend-module-bitbucket-provider/package.json
index ba1184ab0f..3d16dc4bce 100644
--- a/plugins/auth-backend-module-bitbucket-provider/package.json
+++ b/plugins/auth-backend-module-bitbucket-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-bitbucket-provider",
- "version": "0.1.1-next.1",
+ "version": "0.1.1",
"description": "The bitbucket-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md
index 1aabb47fb9..d8e5dfe4d5 100644
--- a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-cloudflare-access-provider
+## 0.1.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.1-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-cloudflare-access-provider/package.json b/plugins/auth-backend-module-cloudflare-access-provider/package.json
index 77f77052b5..7fe161480b 100644
--- a/plugins/auth-backend-module-cloudflare-access-provider/package.json
+++ b/plugins/auth-backend-module-cloudflare-access-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-cloudflare-access-provider",
- "version": "0.1.1-next.1",
+ "version": "0.1.1",
"description": "The cloudflare-access-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md
index 03576e316e..89f6dd9805 100644
--- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-gcp-iap-provider
+## 0.2.13
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.2.13-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json
index 1492ebaaf2..603fcc64c7 100644
--- a/plugins/auth-backend-module-gcp-iap-provider/package.json
+++ b/plugins/auth-backend-module-gcp-iap-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-gcp-iap-provider",
"description": "A GCP IAP auth provider module for the Backstage auth backend",
- "version": "0.2.13-next.1",
+ "version": "0.2.13",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md
index c9da8b5970..a892924c64 100644
--- a/plugins/auth-backend-module-github-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-auth-backend-module-github-provider
+## 0.1.15
+
+### Patch Changes
+
+- 4a0577e: fix: Move config declarations to appropriate auth backend modules
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
+## 0.1.15-next.2
+
+### Patch Changes
+
+- 4a0577e: fix: Move config declarations to appropriate auth backend modules
+
## 0.1.15-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-github-provider/config.d.ts b/plugins/auth-backend-module-github-provider/config.d.ts
new file mode 100644
index 0000000000..e79711310d
--- /dev/null
+++ b/plugins/auth-backend-module-github-provider/config.d.ts
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2024 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.
+ */
+
+export interface Config {
+ auth?: {
+ providers?: {
+ /** @visibility frontend */
+ github?: {
+ [authEnv: string]: {
+ clientId: string;
+ /**
+ * @visibility secret
+ */
+ clientSecret: string;
+ callbackUrl?: string;
+ enterpriseInstanceUrl?: string;
+ };
+ };
+ };
+ };
+}
diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json
index 65217f0eeb..2a45c2ed78 100644
--- a/plugins/auth-backend-module-github-provider/package.json
+++ b/plugins/auth-backend-module-github-provider/package.json
@@ -1,10 +1,10 @@
{
"name": "@backstage/plugin-auth-backend-module-github-provider",
+ "version": "0.1.15",
"description": "The github-provider backend module for the auth plugin.",
- "version": "0.1.15-next.1",
- "main": "src/index.ts",
- "types": "src/index.ts",
- "license": "Apache-2.0",
+ "backstage": {
+ "role": "backend-plugin-module"
+ },
"publishConfig": {
"access": "public",
"main": "dist/index.cjs.js",
@@ -15,17 +15,21 @@
"url": "https://github.com/backstage/backstage",
"directory": "plugins/auth-backend-module-github-provider"
},
- "backstage": {
- "role": "backend-plugin-module"
- },
+ "license": "Apache-2.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "files": [
+ "dist",
+ "config.d.ts"
+ ],
"scripts": {
- "start": "backstage-cli package start",
"build": "backstage-cli package build",
- "lint": "backstage-cli package lint",
- "test": "backstage-cli package test",
"clean": "backstage-cli package clean",
+ "lint": "backstage-cli package lint",
"prepack": "backstage-cli package prepack",
- "postpack": "backstage-cli package postpack"
+ "postpack": "backstage-cli package postpack",
+ "start": "backstage-cli package start",
+ "test": "backstage-cli package test"
},
"dependencies": {
"@backstage/backend-plugin-api": "workspace:^",
@@ -39,7 +43,5 @@
"@backstage/plugin-auth-backend": "workspace:^",
"supertest": "^6.3.3"
},
- "files": [
- "dist"
- ]
+ "configSchema": "config.d.ts"
}
diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md
index 1f4f5ecbf9..201fa5901b 100644
--- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-gitlab-provider
+## 0.1.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.15-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json
index 5d8ee28020..146c26fffd 100644
--- a/plugins/auth-backend-module-gitlab-provider/package.json
+++ b/plugins/auth-backend-module-gitlab-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-gitlab-provider",
"description": "The gitlab-provider backend module for the auth plugin.",
- "version": "0.1.15-next.1",
+ "version": "0.1.15",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md
index 9e7e4043a3..46ea104253 100644
--- a/plugins/auth-backend-module-google-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-google-provider
+## 0.1.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.15-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json
index a9b529504d..35814282ec 100644
--- a/plugins/auth-backend-module-google-provider/package.json
+++ b/plugins/auth-backend-module-google-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-google-provider",
"description": "A Google auth provider module for the Backstage auth backend",
- "version": "0.1.15-next.1",
+ "version": "0.1.15",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-guest-provider/CHANGELOG.md b/plugins/auth-backend-module-guest-provider/CHANGELOG.md
index 56c4e179b8..91565c88fd 100644
--- a/plugins/auth-backend-module-guest-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-guest-provider/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-auth-backend-module-guest-provider
+## 0.1.4
+
+### Patch Changes
+
+- 07d8cca: Error if used outside of a development environment without explicit allowance
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.4-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-guest-provider/package.json b/plugins/auth-backend-module-guest-provider/package.json
index 9676afb176..e27c19eb5d 100644
--- a/plugins/auth-backend-module-guest-provider/package.json
+++ b/plugins/auth-backend-module-guest-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-guest-provider",
- "version": "0.1.4-next.1",
+ "version": "0.1.4",
"description": "The guest-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md
index 14e4cef987..83c3bb229d 100644
--- a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-microsoft-provider
+## 0.1.13
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.13-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-microsoft-provider/package.json b/plugins/auth-backend-module-microsoft-provider/package.json
index a8569903cc..9e2719acc3 100644
--- a/plugins/auth-backend-module-microsoft-provider/package.json
+++ b/plugins/auth-backend-module-microsoft-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-microsoft-provider",
"description": "The microsoft-provider backend module for the auth plugin.",
- "version": "0.1.13-next.1",
+ "version": "0.1.13",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md
index 747d8fa317..dbb970e028 100644
--- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-oauth2-provider
+## 0.1.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.15-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json
index 7cbc5929ae..6aecfd6c48 100644
--- a/plugins/auth-backend-module-oauth2-provider/package.json
+++ b/plugins/auth-backend-module-oauth2-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-oauth2-provider",
"description": "The oauth2-provider backend module for the auth plugin.",
- "version": "0.1.15-next.1",
+ "version": "0.1.15",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md
index acc41221f6..e5366af8b6 100644
--- a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-oauth2-proxy-provider
+## 0.1.11
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.11-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/package.json b/plugins/auth-backend-module-oauth2-proxy-provider/package.json
index cbcef196a5..0f3063db34 100644
--- a/plugins/auth-backend-module-oauth2-proxy-provider/package.json
+++ b/plugins/auth-backend-module-oauth2-proxy-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-oauth2-proxy-provider",
"description": "The oauth2-proxy-provider backend module for the auth plugin.",
- "version": "0.1.11-next.1",
+ "version": "0.1.11",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md
index 6713b3c7b6..e8716f0ce1 100644
--- a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-auth-backend-module-oidc-provider
+## 0.1.9
+
+### Patch Changes
+
+- dd53bf3: Add nonce to authorize request to be added in ID token
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-backend@0.22.5
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.9-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json
index c8894fc070..34bb282ba5 100644
--- a/plugins/auth-backend-module-oidc-provider/package.json
+++ b/plugins/auth-backend-module-oidc-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-oidc-provider",
"description": "The oidc-provider backend module for the auth plugin.",
- "version": "0.1.9-next.1",
+ "version": "0.1.9",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-okta-provider/CHANGELOG.md b/plugins/auth-backend-module-okta-provider/CHANGELOG.md
index 43e434a711..8378a83e7c 100644
--- a/plugins/auth-backend-module-okta-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-okta-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-okta-provider
+## 0.0.11
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.0.11-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-okta-provider/package.json b/plugins/auth-backend-module-okta-provider/package.json
index 3006544145..b8a679b0b0 100644
--- a/plugins/auth-backend-module-okta-provider/package.json
+++ b/plugins/auth-backend-module-okta-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-okta-provider",
"description": "The okta-provider backend module for the auth plugin.",
- "version": "0.0.11-next.1",
+ "version": "0.0.11",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md
index a115289d0b..e9631b54cc 100644
--- a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-backend-module-pinniped-provider
+## 0.1.12
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.12-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-pinniped-provider/package.json b/plugins/auth-backend-module-pinniped-provider/package.json
index 163c3f8e05..227055d366 100644
--- a/plugins/auth-backend-module-pinniped-provider/package.json
+++ b/plugins/auth-backend-module-pinniped-provider/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-auth-backend-module-pinniped-provider",
"description": "The pinniped-provider backend module for the auth plugin.",
- "version": "0.1.12-next.1",
+ "version": "0.1.12",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md
index 9245b6ded5..97753a12d2 100644
--- a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-auth-backend-module-vmware-cloud-provider
+## 0.1.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.10-next.1
### Patch Changes
diff --git a/plugins/auth-backend-module-vmware-cloud-provider/package.json b/plugins/auth-backend-module-vmware-cloud-provider/package.json
index 6054f63ea1..64af928848 100644
--- a/plugins/auth-backend-module-vmware-cloud-provider/package.json
+++ b/plugins/auth-backend-module-vmware-cloud-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-vmware-cloud-provider",
- "version": "0.1.10-next.1",
+ "version": "0.1.10",
"description": "The vmware-cloud-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md
index aa33d39713..2b161d638a 100644
--- a/plugins/auth-backend/CHANGELOG.md
+++ b/plugins/auth-backend/CHANGELOG.md
@@ -1,5 +1,45 @@
# @backstage/plugin-auth-backend
+## 0.22.5
+
+### Patch Changes
+
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- 4a0577e: fix: Move config declarations to appropriate auth backend modules
+- ea9262b: Allow overriding default ownership resolving with the new `AuthOwnershipResolutionExtensionPoint`
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-backend-module-aws-alb-provider@0.1.10
+ - @backstage/plugin-auth-backend-module-github-provider@0.1.15
+ - @backstage/plugin-auth-backend-module-oidc-provider@0.1.9
+ - @backstage/plugin-auth-node@0.4.13
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-auth-backend-module-atlassian-provider@0.1.10
+ - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.1.1
+ - @backstage/plugin-auth-backend-module-bitbucket-provider@0.1.1
+ - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.1.1
+ - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.2.13
+ - @backstage/plugin-auth-backend-module-gitlab-provider@0.1.15
+ - @backstage/plugin-auth-backend-module-google-provider@0.1.15
+ - @backstage/plugin-auth-backend-module-microsoft-provider@0.1.13
+ - @backstage/plugin-auth-backend-module-oauth2-provider@0.1.15
+ - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.1.11
+ - @backstage/plugin-auth-backend-module-okta-provider@0.0.11
+
+## 0.22.5-next.2
+
+### Patch Changes
+
+- 4a0577e: fix: Move config declarations to appropriate auth backend modules
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-auth-backend-module-aws-alb-provider@0.1.10-next.2
+ - @backstage/plugin-auth-backend-module-github-provider@0.1.15-next.2
+
## 0.22.5-next.1
### Patch Changes
diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md
index d15399d279..edd462b528 100644
--- a/plugins/auth-backend/api-report.md
+++ b/plugins/auth-backend/api-report.md
@@ -14,7 +14,7 @@ import { AwsAlbResult as AwsAlbResult_2 } from '@backstage/plugin-auth-backend-m
import { AzureEasyAuthResult } from '@backstage/plugin-auth-backend-module-azure-easyauth-provider';
import { BackendFeature } from '@backstage/backend-plugin-api';
import { BackstageSignInResult } from '@backstage/plugin-auth-node';
-import { CacheService } from '@backstage/backend-plugin-api';
+import { CacheClient } from '@backstage/backend-common';
import { CatalogApi } from '@backstage/catalog-client';
import { ClientAuthResponse } from '@backstage/plugin-auth-node';
import { cloudflareAccessSignInResolvers } from '@backstage/plugin-auth-backend-module-cloudflare-access-provider';
@@ -452,7 +452,7 @@ export const providers: Readonly<{
signIn: {
resolver: SignInResolver_2;
};
- cache?: CacheService | undefined;
+ cache?: CacheClient | undefined;
}) => AuthProviderFactory_2;
resolvers: Readonly;
}>;
diff --git a/plugins/auth-backend/config.d.ts b/plugins/auth-backend/config.d.ts
index f0ceaa4224..a7ea18ed1d 100644
--- a/plugins/auth-backend/config.d.ts
+++ b/plugins/auth-backend/config.d.ts
@@ -89,29 +89,6 @@ export interface Config {
* @additionalProperties true
*/
providers?: {
- /** @visibility frontend */
- google?: {
- [authEnv: string]: {
- clientId: string;
- /**
- * @visibility secret
- */
- clientSecret: string;
- callbackUrl?: string;
- };
- };
- /** @visibility frontend */
- github?: {
- [authEnv: string]: {
- clientId: string;
- /**
- * @visibility secret
- */
- clientSecret: string;
- callbackUrl?: string;
- enterpriseInstanceUrl?: string;
- };
- };
/** @visibility frontend */
saml?: {
entryPoint: string;
@@ -137,20 +114,6 @@ export interface Config {
acceptedClockSkewMs?: number;
};
/** @visibility frontend */
- oauth2?: {
- [authEnv: string]: {
- clientId: string;
- /**
- * @visibility secret
- */
- clientSecret: string;
- authorizationUrl: string;
- tokenUrl: string;
- scope?: string;
- disableRefresh?: boolean;
- };
- };
- /** @visibility frontend */
auth0?: {
[authEnv: string]: {
clientId: string;
@@ -177,11 +140,6 @@ export interface Config {
callbackUrl?: string;
};
};
- /** @visibility frontend */
- awsalb?: {
- iss?: string;
- region: string;
- };
/**
* The backstage token expiration.
*/
diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json
index 372b8f8d4b..0797145855 100644
--- a/plugins/auth-backend/package.json
+++ b/plugins/auth-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend",
- "version": "0.22.5-next.1",
+ "version": "0.22.5",
"description": "A Backstage backend plugin that handles authentication",
"backstage": {
"role": "backend-plugin"
diff --git a/plugins/auth-backend/src/database/AuthDatabase.ts b/plugins/auth-backend/src/database/AuthDatabase.ts
index 97e4236754..ec4d2034e7 100644
--- a/plugins/auth-backend/src/database/AuthDatabase.ts
+++ b/plugins/auth-backend/src/database/AuthDatabase.ts
@@ -17,8 +17,8 @@
import {
DatabaseManager,
PluginDatabaseManager,
- resolvePackagePath,
} from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { ConfigReader } from '@backstage/config';
import { Knex } from 'knex';
diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md
index af4318227d..ecfd0c78b6 100644
--- a/plugins/auth-node/CHANGELOG.md
+++ b/plugins/auth-node/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-auth-node
+## 0.4.13
+
+### Patch Changes
+
+- ea9262b: Allow overriding default ownership resolving with the new `AuthOwnershipResolutionExtensionPoint`
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/catalog-client@1.6.5
+
## 0.4.13-next.1
### Patch Changes
diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json
index ba05caaad4..8b0e7f87c3 100644
--- a/plugins/auth-node/package.json
+++ b/plugins/auth-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-node",
- "version": "0.4.13-next.1",
+ "version": "0.4.13",
"backstage": {
"role": "node-library"
},
diff --git a/plugins/auth-react/CHANGELOG.md b/plugins/auth-react/CHANGELOG.md
index ebd567184f..46ddcc9a51 100644
--- a/plugins/auth-react/CHANGELOG.md
+++ b/plugins/auth-react/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-auth-react
+## 0.1.2
+
+### Patch Changes
+
+- c297afd: When using `CookieAuthRefreshProvider` or `useCookieAuthRefresh`, a 404 response from the cookie endpoint will now be treated as if cookie auth is disabled and is not needed.
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+
## 0.1.2-next.1
### Patch Changes
diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json
index c223b4c40f..7b85295f48 100644
--- a/plugins/auth-react/package.json
+++ b/plugins/auth-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-react",
- "version": "0.1.2-next.1",
+ "version": "0.1.2",
"description": "Web library for the auth plugin",
"backstage": {
"role": "web-library"
diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md
index 64ffaa12dd..b20502394f 100644
--- a/plugins/bitbucket-cloud-common/CHANGELOG.md
+++ b/plugins/bitbucket-cloud-common/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-bitbucket-cloud-common
+## 0.2.19
+
+### Patch Changes
+
+- d76cb29: Updated dependency `ts-morph` to `^22.0.0`.
+- Updated dependencies
+ - @backstage/integration@1.11.0
+
+## 0.2.19-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.11.0-next.0
+
## 0.2.18
### Patch Changes
diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json
index 41ba69be10..a6d52a1850 100644
--- a/plugins/bitbucket-cloud-common/package.json
+++ b/plugins/bitbucket-cloud-common/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-bitbucket-cloud-common",
- "version": "0.2.18",
+ "version": "0.2.19",
"description": "Common functionalities for bitbucket-cloud plugins",
"backstage": {
"role": "common-library"
@@ -44,6 +44,6 @@
"@backstage/cli": "workspace:^",
"@openapitools/openapi-generator-cli": "^2.4.26",
"msw": "^1.0.0",
- "ts-morph": "^21.0.0"
+ "ts-morph": "^22.0.0"
}
}
diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md
index be6e743eb9..cf7dc39048 100644
--- a/plugins/catalog-backend-module-aws/CHANGELOG.md
+++ b/plugins/catalog-backend-module-aws/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-catalog-backend-module-aws
+## 0.3.13
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/integration@1.11.0
+ - @backstage/plugin-catalog-common@1.0.23
+ - @backstage/plugin-kubernetes-common@0.7.6
+
+## 0.3.13-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.3.13-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json
index fbc4122fe2..ba9a299fad 100644
--- a/plugins/catalog-backend-module-aws/package.json
+++ b/plugins/catalog-backend-module-aws/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-aws",
- "version": "0.3.13-next.1",
+ "version": "0.3.13",
"description": "A Backstage catalog backend module that helps integrate towards AWS",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md
index 5b7751dc03..649c15872a 100644
--- a/plugins/catalog-backend-module-azure/CHANGELOG.md
+++ b/plugins/catalog-backend-module-azure/CHANGELOG.md
@@ -1,5 +1,26 @@
# @backstage/plugin-catalog-backend-module-azure
+## 0.1.38
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/integration@1.11.0
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.1.38-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.38-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json
index 4df7824fa7..e5b47db18c 100644
--- a/plugins/catalog-backend-module-azure/package.json
+++ b/plugins/catalog-backend-module-azure/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-azure",
- "version": "0.1.38-next.1",
+ "version": "0.1.38",
"description": "A Backstage catalog backend module that helps integrate towards Azure",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md
index 449c016837..2d63fdeadd 100644
--- a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md
+++ b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-catalog-backend-module-backstage-openapi
+## 0.2.1
+
+### Patch Changes
+
+- f3f0281: Fix incorrect dependency import.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/backend-openapi-utils@0.1.11
+
+## 0.2.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+
## 0.2.1-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json
index 86c7bb02e7..af9a299848 100644
--- a/plugins/catalog-backend-module-backstage-openapi/package.json
+++ b/plugins/catalog-backend-module-backstage-openapi/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-backstage-openapi",
- "version": "0.2.1-next.1",
+ "version": "0.2.1",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
index a40ceb8254..1fa58406c4 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
+++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md
@@ -1,5 +1,32 @@
# @backstage/plugin-catalog-backend-module-bitbucket-cloud
+## 0.2.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-events-node@0.3.4
+ - @backstage/plugin-bitbucket-cloud-common@0.2.19
+ - @backstage/integration@1.11.0
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.2.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+ - @backstage/integration@1.11.0-next.0
+ - @backstage/plugin-bitbucket-cloud-common@0.2.19-next.0
+
## 0.2.5-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json
index f6b4620671..b821a1e01d 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/package.json
+++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud",
"description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud",
- "version": "0.2.5-next.1",
+ "version": "0.2.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
index 153494a358..ffb79454cf 100644
--- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
+++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/plugin-catalog-backend-module-bitbucket-server
+## 0.1.32
+
+### Patch Changes
+
+- 062ffb1: Allow skipping archived repositories (`skipArchivedRepos` flag) on Bitbucket.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/integration@1.11.0
+
+## 0.1.32-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.32-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json
index e46d0107a5..684b5fa95a 100644
--- a/plugins/catalog-backend-module-bitbucket-server/package.json
+++ b/plugins/catalog-backend-module-bitbucket-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-bitbucket-server",
- "version": "0.1.32-next.1",
+ "version": "0.1.32",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md
index 18299d760a..008b18882b 100644
--- a/plugins/catalog-backend-module-gcp/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md
@@ -1,5 +1,25 @@
# @backstage/plugin-catalog-backend-module-gcp
+## 0.1.19
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-kubernetes-common@0.7.6
+
+## 0.1.19-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.1.19-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json
index c58c014b0e..f0f3b1722f 100644
--- a/plugins/catalog-backend-module-gcp/package.json
+++ b/plugins/catalog-backend-module-gcp/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-gcp",
- "version": "0.1.19-next.1",
+ "version": "0.1.19",
"description": "A Backstage catalog backend module that helps integrate towards GCP",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md
index 8b5e5edd96..2b5f22e034 100644
--- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md
@@ -1,5 +1,25 @@
# @backstage/plugin-catalog-backend-module-gerrit
+## 0.1.35
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/integration@1.11.0
+
+## 0.1.35-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.35-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json
index c436a07263..1e9ff4284c 100644
--- a/plugins/catalog-backend-module-gerrit/package.json
+++ b/plugins/catalog-backend-module-gerrit/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-gerrit",
- "version": "0.1.35-next.1",
+ "version": "0.1.35",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md
index b1fd9b17d7..99f073203c 100644
--- a/plugins/catalog-backend-module-github-org/CHANGELOG.md
+++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-catalog-backend-module-github-org
+## 0.1.13
+
+### Patch Changes
+
+- 5bdeaa7: Fixed an issue where the `catalog-backend-module-github-org` would not correctly create groups using `default` as namespace in case a single organization was configured.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-catalog-backend-module-github@0.6.1
+ - @backstage/plugin-events-node@0.3.4
+
+## 0.1.13-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-catalog-backend-module-github@0.6.1-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+
## 0.1.13-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json
index 2838396c88..9f73d2a052 100644
--- a/plugins/catalog-backend-module-github-org/package.json
+++ b/plugins/catalog-backend-module-github-org/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-github-org",
- "version": "0.1.13-next.1",
+ "version": "0.1.13",
"description": "The github-org backend module for the catalog plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-github-org/src/GithubOrgEntityCleanerProvider.ts b/plugins/catalog-backend-module-github-org/src/GithubOrgEntityCleanerProvider.ts
new file mode 100644
index 0000000000..a00cd504d7
--- /dev/null
+++ b/plugins/catalog-backend-module-github-org/src/GithubOrgEntityCleanerProvider.ts
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2024 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 { LoggerService } from '@backstage/backend-plugin-api';
+import {
+ EntityProvider,
+ EntityProviderConnection,
+} from '@backstage/plugin-catalog-node';
+
+export class GithubOrgEntityCleanerProvider implements EntityProvider {
+ logger: LoggerService;
+ constructor(private readonly options: { id: string; logger: LoggerService }) {
+ this.logger = options.logger.child({ target: this.getProviderName() });
+ }
+
+ getProviderName() {
+ return `GithubOrgEntityProvider:${this.options.id}`;
+ }
+ async connect(connection: EntityProviderConnection) {
+ // Clean up any existing entities
+ connection
+ .applyMutation({
+ type: 'full',
+ entities: [],
+ })
+ .catch(error => {
+ this.logger.error('Failed to clean up entities', error);
+ });
+ }
+}
diff --git a/plugins/catalog-backend-module-github-org/src/module.ts b/plugins/catalog-backend-module-github-org/src/module.ts
index 0baa768644..31d4cef1c0 100644
--- a/plugins/catalog-backend-module-github-org/src/module.ts
+++ b/plugins/catalog-backend-module-github-org/src/module.ts
@@ -31,6 +31,7 @@ import {
} from '@backstage/plugin-catalog-backend-module-github';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';
import { eventsServiceRef } from '@backstage/plugin-events-node';
+import { GithubOrgEntityCleanerProvider } from './GithubOrgEntityCleanerProvider';
/**
* Interface for {@link githubOrgEntityProviderTransformsExtensionPoint}.
@@ -99,8 +100,14 @@ export const catalogModuleGithubOrgEntityProvider = createBackendModule({
logger: coreServices.logger,
scheduler: coreServices.scheduler,
},
+
async init({ catalog, config, events, logger, scheduler }) {
- for (const definition of readDefinitionsFromConfig(config)) {
+ const definitions = readDefinitionsFromConfig(config);
+
+ for (const definition of definitions) {
+ catalog.addEntityProvider(
+ new GithubOrgEntityCleanerProvider({ id: definition.id, logger }),
+ );
catalog.addEntityProvider(
GithubMultiOrgEntityProvider.fromConfig(config, {
id: definition.id,
@@ -113,6 +120,8 @@ export const catalogModuleGithubOrgEntityProvider = createBackendModule({
logger,
userTransformer,
teamTransformer,
+ alwaysUseDefaultNamespace:
+ definitions.length === 1 && definition.orgs?.length === 1,
}),
);
}
diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md
index 5bb58f25c0..09735e37ca 100644
--- a/plugins/catalog-backend-module-github/CHANGELOG.md
+++ b/plugins/catalog-backend-module-github/CHANGELOG.md
@@ -1,5 +1,42 @@
# @backstage/plugin-catalog-backend-module-github
+## 0.6.1
+
+### Patch Changes
+
+- 0b50143: GitHub push events now schedule a refresh on entities that have a `refresh_key` matching the `catalogPath` config itself.
+ This allows to support a `catalogPath` configuration that uses glob patterns.
+- f2a2a83: Updated to use the new `catalogAnalysisExtensionPoint` API.
+- 5bdeaa7: Added `alwaysUseDefaultNamespace` option to `GithubMultiOrgEntityProvider`.
+
+ If set to true, the provider will use `default` as the namespace for all group entities. Groups with the same name across different orgs will be considered the same group.
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/plugin-catalog-backend@1.22.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-events-node@0.3.4
+ - @backstage/integration@1.11.0
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.6.1-next.2
+
+### Patch Changes
+
+- 0b50143: GitHub push events now schedule a refresh on entities that have a `refresh_key` matching the `catalogPath` config itself.
+ This allows to support a `catalogPath` configuration that uses glob patterns.
+- f2a2a83: Updated to use the new `catalogAnalysisExtensionPoint` API.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/plugin-catalog-backend@1.22.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.6.1-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-github/api-report.md b/plugins/catalog-backend-module-github/api-report.md
index b53d1b7b17..0b68170255 100644
--- a/plugins/catalog-backend-module-github/api-report.md
+++ b/plugins/catalog-backend-module-github/api-report.md
@@ -150,6 +150,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider {
orgs?: string[];
userTransformer?: UserTransformer;
teamTransformer?: TeamTransformer;
+ alwaysUseDefaultNamespace?: boolean;
});
// (undocumented)
connect(connection: EntityProviderConnection): Promise;
@@ -165,6 +166,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider {
// @public
export interface GithubMultiOrgEntityProviderOptions {
+ alwaysUseDefaultNamespace?: boolean;
events?: EventsService;
githubCredentialsProvider?: GithubCredentialsProvider;
githubUrl: string;
diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json
index 47a32566af..d71303629a 100644
--- a/plugins/catalog-backend-module-github/package.json
+++ b/plugins/catalog-backend-module-github/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-github",
- "version": "0.6.1-next.1",
+ "version": "0.6.1",
"description": "A Backstage catalog backend module that helps integrate towards GitHub",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts
index 0f466fefb7..24ee7f7108 100644
--- a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts
+++ b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.test.ts
@@ -37,7 +37,8 @@ describe('githubCatalogModule', () => {
};
const analysisExtensionPoint = {
- addLocationAnalyzer: jest.fn(),
+ setLocationAnalyzer: jest.fn(),
+ addScmLocationAnalyzer: jest.fn(),
};
const runner = jest.fn();
@@ -81,7 +82,7 @@ describe('githubCatalogModule', () => {
'github-provider:default',
);
expect(runner).not.toHaveBeenCalled();
- expect(analysisExtensionPoint.addLocationAnalyzer).toHaveBeenCalledWith(
+ expect(analysisExtensionPoint.addScmLocationAnalyzer).toHaveBeenCalledWith(
expect.any(GithubLocationAnalyzer),
);
});
diff --git a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts
index 0b46e1a023..809a1a5094 100644
--- a/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts
+++ b/plugins/catalog-backend-module-github/src/module/githubCatalogModule.ts
@@ -56,7 +56,7 @@ export const githubCatalogModule = createBackendModule({
discovery,
auth,
}) {
- analyzers.addLocationAnalyzer(
+ analyzers.addScmLocationAnalyzer(
new GithubLocationAnalyzer({
discovery,
config,
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
index d0fc54245f..a201177198 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.test.ts
@@ -1074,6 +1074,77 @@ describe('GithubEntityProvider', () => {
expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0);
});
+ it('apply refresh call on modified files from push event when catalogPath contains a glob pattern', async () => {
+ const schedule = new PersistingTaskRunner();
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ github: {
+ organization: 'test-org',
+ catalogPath: '**/catalog-info.yaml',
+ },
+ },
+ },
+ });
+
+ const provider = GithubEntityProvider.fromConfig(config, {
+ logger,
+ schedule,
+ })[0];
+
+ const entityProviderConnection: EntityProviderConnection = {
+ applyMutation: jest.fn(),
+ refresh: jest.fn(),
+ };
+ await provider.connect(entityProviderConnection);
+
+ const event: EventParams = {
+ topic: 'github.push',
+ metadata: {
+ 'x-github-event': 'push',
+ },
+ eventPayload: {
+ ref: 'refs/heads/main',
+ repository: {
+ name: 'teste-1',
+ url: 'https://github.com/test-org/test-repo',
+ default_branch: 'main',
+ stargazers: 0,
+ master_branch: 'main',
+ organization: 'test-org',
+ topics: [],
+ },
+ created: true,
+ deleted: false,
+ forced: false,
+ commits: [
+ {
+ added: ['new-file.yaml'],
+ removed: [],
+ modified: [],
+ },
+ {
+ added: [],
+ removed: [],
+ modified: ['catalog-info.yaml'],
+ },
+ ],
+ },
+ };
+
+ await provider.onEvent(event);
+
+ expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(1);
+ expect(entityProviderConnection.refresh).toHaveBeenCalledWith({
+ keys: [
+ 'url:https://github.com/test-org/test-repo/tree/main/catalog-info.yaml',
+ 'url:https://github.com/test-org/test-repo/blob/main/catalog-info.yaml',
+ 'url:https://github.com/test-org/test-repo/tree/main/**/catalog-info.yaml',
+ ],
+ });
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(0);
+ });
+
it('should process repository when match filters from push event', async () => {
const schedule = new PersistingTaskRunner();
const config = new ConfigReader({
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
index b6805a1c24..978d9593c1 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubEntityProvider.ts
@@ -374,16 +374,23 @@ export class GithubEntityProvider implements EntityProvider, EventSubscriber {
);
if (modified.length > 0) {
+ const catalogPath = this.config.catalogPath.startsWith('/')
+ ? this.config.catalogPath.substring(1)
+ : this.config.catalogPath;
+
await this.connection.refresh({
keys: [
- ...modified.map(
- filePath =>
- `url:${event.repository.url}/tree/${branch}/${filePath}`,
- ),
- ...modified.map(
- filePath =>
- `url:${event.repository.url}/blob/${branch}/${filePath}`,
- ),
+ ...new Set([
+ ...modified.map(
+ filePath =>
+ `url:${event.repository.url}/tree/${branch}/${filePath}`,
+ ),
+ ...modified.map(
+ filePath =>
+ `url:${event.repository.url}/blob/${branch}/${filePath}`,
+ ),
+ `url:${event.repository.url}/tree/${branch}/${catalogPath}`,
+ ]),
],
});
}
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts
index 0542e64d64..c89901fcb3 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.test.ts
@@ -68,26 +68,24 @@ describe('GithubMultiOrgEntityProvider', () => {
headers: { token: 'blah' },
type: 'app',
});
-
- const githubCredentialsProvider: GithubCredentialsProvider = {
- getCredentials: mockGetCredentials,
- };
-
- entityProvider = new GithubMultiOrgEntityProvider({
- id: 'my-id',
- gitHubConfig,
- githubCredentialsProvider,
- githubUrl: 'https://github.com',
- logger,
- orgs: ['orgA', 'orgB'], // only include for tests that require it
- });
-
- entityProvider.connect(entityProviderConnection);
});
afterEach(() => jest.resetAllMocks());
it('should read specified orgs', async () => {
+ entityProvider = new GithubMultiOrgEntityProvider({
+ id: 'my-id',
+ gitHubConfig,
+ githubCredentialsProvider: {
+ getCredentials: mockGetCredentials,
+ },
+ githubUrl: 'https://github.com',
+ logger,
+ orgs: ['orgA', 'orgB'],
+ });
+
+ await entityProvider.connect(entityProviderConnection);
+
mockClient
.mockResolvedValueOnce({
organization: {
@@ -348,6 +346,19 @@ describe('GithubMultiOrgEntityProvider', () => {
});
it('should read every accessible org', async () => {
+ entityProvider = new GithubMultiOrgEntityProvider({
+ id: 'my-id',
+ gitHubConfig,
+ githubCredentialsProvider: {
+ getCredentials: mockGetCredentials,
+ },
+ githubUrl: 'https://github.com',
+ logger,
+ orgs: ['orgA', 'orgB'],
+ });
+
+ await entityProvider.connect(entityProviderConnection);
+
getAllInstallationsMock.mockResolvedValue([
{
target_type: 'Organization',
@@ -636,7 +647,284 @@ describe('GithubMultiOrgEntityProvider', () => {
});
});
+ it('should use the default namespace if options.alwaysUseDefaultNamespace is provided', async () => {
+ mockClient
+ .mockResolvedValueOnce({
+ organization: {
+ membersWithRole: {
+ pageInfo: { hasNextPage: false },
+ nodes: [
+ {
+ login: 'a',
+ name: 'b',
+ bio: 'c',
+ email: 'd',
+ avatarUrl: 'e',
+ },
+ {
+ login: 'x',
+ name: 'y',
+ bio: 'z',
+ email: 'w',
+ avatarUrl: 'v',
+ },
+ ],
+ },
+ },
+ })
+ .mockResolvedValueOnce({
+ organization: {
+ teams: {
+ pageInfo: { hasNextPage: false },
+ nodes: [
+ {
+ slug: 'team',
+ combinedSlug: 'orgC/team',
+ name: 'Team',
+ description: 'The one and only team',
+ avatarUrl: 'http://example.com/team.jpeg',
+ parentTeam: {
+ slug: 'parent',
+ combinedSlug: '',
+ members: { pageInfo: { hasNextPage: false }, nodes: [] },
+ },
+ members: {
+ pageInfo: { hasNextPage: false },
+ nodes: [{ login: 'a' }, { login: 'x' }],
+ },
+ },
+ ],
+ },
+ },
+ })
+ .mockResolvedValueOnce({
+ organization: {
+ membersWithRole: {
+ pageInfo: { hasNextPage: false },
+ nodes: [
+ {
+ login: 'a',
+ name: 'b',
+ bio: 'c',
+ email: 'd',
+ avatarUrl: 'e',
+ },
+ {
+ login: 'x',
+ name: 'y',
+ bio: 'z',
+ email: 'w',
+ avatarUrl: 'v',
+ },
+ {
+ login: 'q',
+ name: 'r',
+ bio: 's',
+ email: 't',
+ avatarUrl: 'u',
+ },
+ ],
+ },
+ },
+ })
+ .mockResolvedValueOnce({
+ organization: {
+ teams: {
+ pageInfo: { hasNextPage: false },
+ nodes: [
+ {
+ slug: 'team',
+ combinedSlug: 'orgD/team',
+ name: 'Team',
+ description: 'The one and only team',
+ avatarUrl: 'http://example.com/team.jpeg',
+ parentTeam: {
+ slug: 'parent',
+ combinedSlug: '',
+ members: { pageInfo: { hasNextPage: false }, nodes: [] },
+ },
+ members: {
+ pageInfo: { hasNextPage: false },
+ nodes: [{ login: 'a' }, { login: 'q' }],
+ },
+ },
+ ],
+ },
+ },
+ });
+
+ (graphql.defaults as jest.Mock).mockReturnValue(mockClient);
+
+ entityProvider = new GithubMultiOrgEntityProvider({
+ id: 'my-id',
+ gitHubConfig,
+ githubCredentialsProvider: {
+ getCredentials: mockGetCredentials,
+ },
+ githubUrl: 'https://github.com',
+ logger,
+ orgs: ['orgA', 'orgB'],
+ alwaysUseDefaultNamespace: true,
+ });
+
+ await entityProvider.connect(entityProviderConnection);
+ await entityProvider.read();
+
+ expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({
+ entities: [
+ {
+ entity: {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'User',
+ metadata: {
+ annotations: {
+ 'backstage.io/managed-by-location':
+ 'url:https://github.com/a',
+ 'backstage.io/managed-by-origin-location':
+ 'url:https://github.com/a',
+ 'github.com/user-login': 'a',
+ },
+ description: 'c',
+ name: 'a',
+ },
+ spec: {
+ memberOf: ['team'],
+ profile: {
+ displayName: 'b',
+ email: 'd',
+ picture: 'e',
+ },
+ },
+ },
+ locationKey: 'github-multi-org-provider:my-id',
+ },
+ {
+ entity: {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'User',
+ metadata: {
+ annotations: {
+ 'backstage.io/managed-by-location':
+ 'url:https://github.com/x',
+ 'backstage.io/managed-by-origin-location':
+ 'url:https://github.com/x',
+ 'github.com/user-login': 'x',
+ },
+ description: 'z',
+ name: 'x',
+ },
+ spec: {
+ memberOf: ['team'],
+ profile: {
+ displayName: 'y',
+ email: 'w',
+ picture: 'v',
+ },
+ },
+ },
+ locationKey: 'github-multi-org-provider:my-id',
+ },
+ {
+ entity: {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'User',
+ metadata: {
+ annotations: {
+ 'backstage.io/managed-by-location':
+ 'url:https://github.com/q',
+ 'backstage.io/managed-by-origin-location':
+ 'url:https://github.com/q',
+ 'github.com/user-login': 'q',
+ },
+ description: 's',
+ name: 'q',
+ },
+ spec: {
+ memberOf: ['team'],
+ profile: {
+ displayName: 'r',
+ email: 't',
+ picture: 'u',
+ },
+ },
+ },
+ locationKey: 'github-multi-org-provider:my-id',
+ },
+ {
+ entity: {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'Group',
+ metadata: {
+ annotations: {
+ 'backstage.io/managed-by-location':
+ 'url:https://github.com/orgs/orgC/teams/team',
+ 'backstage.io/managed-by-origin-location':
+ 'url:https://github.com/orgs/orgC/teams/team',
+ 'github.com/team-slug': 'orgC/team',
+ },
+ name: 'team',
+ description: 'The one and only team',
+ },
+ spec: {
+ children: [],
+ parent: 'parent',
+ profile: {
+ displayName: 'Team',
+ picture: 'http://example.com/team.jpeg',
+ },
+ type: 'team',
+ members: ['default/a', 'default/x'],
+ },
+ },
+ locationKey: 'github-multi-org-provider:my-id',
+ },
+ {
+ entity: {
+ apiVersion: 'backstage.io/v1alpha1',
+ kind: 'Group',
+ metadata: {
+ annotations: {
+ 'backstage.io/managed-by-location':
+ 'url:https://github.com/orgs/orgD/teams/team',
+ 'backstage.io/managed-by-origin-location':
+ 'url:https://github.com/orgs/orgD/teams/team',
+ 'github.com/team-slug': 'orgD/team',
+ },
+ name: 'team',
+ description: 'The one and only team',
+ },
+ spec: {
+ children: [],
+ parent: 'parent',
+ profile: {
+ displayName: 'Team',
+ picture: 'http://example.com/team.jpeg',
+ },
+ type: 'team',
+ members: ['default/a', 'default/q'],
+ },
+ },
+ locationKey: 'github-multi-org-provider:my-id',
+ },
+ ],
+ type: 'full',
+ });
+ });
+
it('should not call applyMutation if an error is thrown', async () => {
+ entityProvider = new GithubMultiOrgEntityProvider({
+ id: 'my-id',
+ gitHubConfig,
+ githubCredentialsProvider: {
+ getCredentials: mockGetCredentials,
+ },
+ githubUrl: 'https://github.com',
+ logger,
+ orgs: ['orgA', 'orgB'],
+ });
+
+ await entityProvider.connect(entityProviderConnection);
+
mockClient.mockImplementationOnce(() => {
throw new Error('Network Error');
});
diff --git a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts
index f07d033ecd..756b9902c6 100644
--- a/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts
+++ b/plugins/catalog-backend-module-github/src/providers/GithubMultiOrgEntityProvider.ts
@@ -143,6 +143,15 @@ export interface GithubMultiOrgEntityProviderOptions {
*/
githubCredentialsProvider?: GithubCredentialsProvider;
+ /**
+ * Use the default namespace for groups. By default, groups will be namespaced according to their GitHub org.
+ *
+ * @remarks
+ *
+ * If set to true, groups with the same name across different orgs will be considered the same group.
+ */
+ alwaysUseDefaultNamespace?: boolean;
+
/**
* Optionally include a user transformer for transforming from GitHub users to User Entities
*/
@@ -198,6 +207,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider {
userTransformer: options.userTransformer,
teamTransformer: options.teamTransformer,
events: options.events,
+ alwaysUseDefaultNamespace: options.alwaysUseDefaultNamespace,
});
provider.schedule(options.schedule);
@@ -216,6 +226,7 @@ export class GithubMultiOrgEntityProvider implements EntityProvider {
orgs?: string[];
userTransformer?: UserTransformer;
teamTransformer?: TeamTransformer;
+ alwaysUseDefaultNamespace?: boolean;
},
) {}
@@ -846,7 +857,10 @@ export class GithubMultiOrgEntityProvider implements EntityProvider {
const result = await defaultOrganizationTeamTransformer(team, ctx);
if (result && result.spec) {
- result.metadata.namespace = ctx.org.toLocaleLowerCase('en-US');
+ if (!this.options.alwaysUseDefaultNamespace) {
+ result.metadata.namespace = ctx.org.toLocaleLowerCase('en-US');
+ }
+
// Group `spec.members` inherits the namespace of it's group so need to explicitly specify refs here
result.spec.members = team.members.map(
user => `${DEFAULT_NAMESPACE}/${user.login}`,
diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md
index fa0b9f2a24..793b10fd8b 100644
--- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/plugin-catalog-backend-module-gitlab-org
+## 0.0.1
+
+### Patch Changes
+
+- a70377d: Added a new `catalog-backend-module-gitlab-org` module which adds the `GitlabOrgDiscoveryEntityProvider` to the catalog's providers using the new backend system.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/plugin-catalog-backend-module-gitlab@0.3.15
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+
+## 0.0.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+ - @backstage/plugin-catalog-backend-module-gitlab@0.3.15-next.4
+
## 0.0.1-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json
index c2d524d9d8..d0069fc968 100644
--- a/plugins/catalog-backend-module-gitlab-org/package.json
+++ b/plugins/catalog-backend-module-gitlab-org/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-gitlab-org",
- "version": "0.0.1-next.1",
+ "version": "0.0.1",
"description": "The gitlab-org backend module for the catalog plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md
index 5b36f2570b..ee1ceb70b7 100644
--- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md
@@ -1,5 +1,30 @@
# @backstage/plugin-catalog-backend-module-gitlab
+## 0.3.16
+
+### Patch Changes
+
+- a70377d: Added events support for `GitlabDiscoveryEntityProvider` and `GitlabOrgDiscoveryEntityProvider`.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-events-node@0.3.4
+ - @backstage/integration@1.11.0
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.3.15-next.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.3.15-next.3
### Patch Changes
diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json
index d0d3c876ae..109dee369e 100644
--- a/plugins/catalog-backend-module-gitlab/package.json
+++ b/plugins/catalog-backend-module-gitlab/package.json
@@ -1,8 +1,53 @@
{
+ "name": "@backstage/plugin-catalog-backend-module-gitlab",
+ "version": "0.3.16",
+ "description": "A Backstage catalog backend module that helps integrate towards GitLab",
"backstage": {
"role": "backend-plugin-module"
},
- "configSchema": "config.d.ts",
+ "publishConfig": {
+ "access": "public"
+ },
+ "keywords": [
+ "backstage"
+ ],
+ "homepage": "https://backstage.io",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/backstage/backstage",
+ "directory": "plugins/catalog-backend-module-gitlab"
+ },
+ "license": "Apache-2.0",
+ "exports": {
+ ".": "./src/index.ts",
+ "./alpha": "./src/alpha.ts",
+ "./package.json": "./package.json"
+ },
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "typesVersions": {
+ "*": {
+ "alpha": [
+ "src/alpha.ts"
+ ],
+ "package.json": [
+ "package.json"
+ ]
+ }
+ },
+ "files": [
+ "config.d.ts",
+ "dist"
+ ],
+ "scripts": {
+ "build": "backstage-cli package build",
+ "clean": "backstage-cli package clean",
+ "lint": "backstage-cli package lint",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack",
+ "start": "backstage-cli package start",
+ "test": "backstage-cli package test"
+ },
"dependencies": {
"@backstage/backend-common": "workspace:^",
"@backstage/backend-plugin-api": "workspace:^",
@@ -18,7 +63,6 @@
"node-fetch": "^2.6.7",
"uuid": "^9.0.0"
},
- "description": "A Backstage catalog backend module that helps integrate towards GitLab",
"devDependencies": {
"@backstage/backend-test-utils": "workspace:^",
"@backstage/cli": "workspace:^",
@@ -28,49 +72,5 @@
"luxon": "^3.0.0",
"msw": "^1.0.0"
},
- "exports": {
- ".": "./src/index.ts",
- "./alpha": "./src/alpha.ts",
- "./package.json": "./package.json"
- },
- "files": [
- "config.d.ts",
- "dist"
- ],
- "homepage": "https://backstage.io",
- "keywords": [
- "backstage"
- ],
- "license": "Apache-2.0",
- "main": "src/index.ts",
- "name": "@backstage/plugin-catalog-backend-module-gitlab",
- "publishConfig": {
- "access": "public"
- },
- "repository": {
- "directory": "plugins/catalog-backend-module-gitlab",
- "type": "git",
- "url": "https://github.com/backstage/backstage"
- },
- "scripts": {
- "build": "backstage-cli package build",
- "clean": "backstage-cli package clean",
- "lint": "backstage-cli package lint",
- "postpack": "backstage-cli package postpack",
- "prepack": "backstage-cli package prepack",
- "start": "backstage-cli package start",
- "test": "backstage-cli package test"
- },
- "types": "src/index.ts",
- "typesVersions": {
- "*": {
- "alpha": [
- "src/alpha.ts"
- ],
- "package.json": [
- "package.json"
- ]
- }
- },
- "version": "0.3.15-next.3"
+ "configSchema": "config.d.ts"
}
diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
index 2f4505abba..b20c236f55 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
+++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
@@ -1,5 +1,30 @@
# @backstage/plugin-catalog-backend-module-incremental-ingestion
+## 0.4.23
+
+### Patch Changes
+
+- 8c1ab9e: Fix plugin/incremental-ingestion 'Maximum call stack size exceeded' error when ingest large entities.
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/plugin-catalog-backend@1.22.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-events-node@0.3.4
+
+## 0.4.23-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/plugin-catalog-backend@1.22.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+
## 0.4.23-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json
index 6c9f930d33..8f6016a228 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/package.json
+++ b/plugins/catalog-backend-module-incremental-ingestion/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-incremental-ingestion",
- "version": "0.4.23-next.1",
+ "version": "0.4.23",
"description": "An entity provider for streaming large asset sources into the catalog",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/migrations.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/migrations.ts
index 940a82107b..08c581e77a 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/src/database/migrations.ts
+++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/migrations.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { resolvePackagePath } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { Knex } from 'knex';
import { DB_MIGRATIONS_TABLE } from './tables';
diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md
index 10a774ffad..917f895046 100644
--- a/plugins/catalog-backend-module-ldap/CHANGELOG.md
+++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-catalog-backend-module-ldap
+## 0.5.34
+
+### Patch Changes
+
+- 7699967: Remove dependency to Winston Logger and use Backstage LoggerService instead
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.5.34-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+
## 0.5.34-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-ldap/api-report.md b/plugins/catalog-backend-module-ldap/api-report.md
index 277a48af8d..76276c8fad 100644
--- a/plugins/catalog-backend-module-ldap/api-report.md
+++ b/plugins/catalog-backend-module-ldap/api-report.md
@@ -12,7 +12,7 @@ import { EntityProviderConnection } from '@backstage/plugin-catalog-node';
import { GroupEntity } from '@backstage/catalog-model';
import { JsonValue } from '@backstage/types';
import { LocationSpec } from '@backstage/plugin-catalog-common';
-import { Logger } from 'winston';
+import { LoggerService } from '@backstage/backend-plugin-api';
import { SearchEntry } from 'ldapjs';
import { SearchOptions } from 'ldapjs';
import { TaskRunner } from '@backstage/backend-tasks';
@@ -76,10 +76,10 @@ export const LDAP_UUID_ANNOTATION = 'backstage.io/ldap-uuid';
// @public
export class LdapClient {
- constructor(client: Client, logger: Logger);
+ constructor(client: Client, logger: LoggerService);
// (undocumented)
static create(
- logger: Logger,
+ logger: LoggerService,
target: string,
bind?: BindConfig,
tls?: TLSConfig,
@@ -99,7 +99,7 @@ export class LdapOrgEntityProvider implements EntityProvider {
constructor(options: {
id: string;
provider: LdapProviderConfig;
- logger: Logger;
+ logger: LoggerService;
userTransformer?: UserTransformer;
groupTransformer?: GroupTransformer;
});
@@ -112,14 +112,14 @@ export class LdapOrgEntityProvider implements EntityProvider {
): LdapOrgEntityProvider;
// (undocumented)
getProviderName(): string;
- read(options?: { logger?: Logger }): Promise;
+ read(options?: { logger?: LoggerService }): Promise;
}
// @public
export interface LdapOrgEntityProviderOptions {
groupTransformer?: GroupTransformer;
id: string;
- logger: Logger;
+ logger: LoggerService;
schedule: 'manual' | TaskRunner;
target: string;
userTransformer?: UserTransformer;
@@ -129,7 +129,7 @@ export interface LdapOrgEntityProviderOptions {
export class LdapOrgReaderProcessor implements CatalogProcessor {
constructor(options: {
providers: LdapProviderConfig[];
- logger: Logger;
+ logger: LoggerService;
groupTransformer?: GroupTransformer;
userTransformer?: UserTransformer;
});
@@ -137,7 +137,7 @@ export class LdapOrgReaderProcessor implements CatalogProcessor {
static fromConfig(
configRoot: Config,
options: {
- logger: Logger;
+ logger: LoggerService;
groupTransformer?: GroupTransformer;
userTransformer?: UserTransformer;
},
@@ -187,7 +187,7 @@ export function readLdapOrg(
options: {
groupTransformer?: GroupTransformer;
userTransformer?: UserTransformer;
- logger: Logger;
+ logger: LoggerService;
},
): Promise<{
users: UserEntity[];
diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json
index 82558bc6d8..2b447ea7ec 100644
--- a/plugins/catalog-backend-module-ldap/package.json
+++ b/plugins/catalog-backend-module-ldap/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-ldap",
- "version": "0.5.34-next.1",
+ "version": "0.5.34",
"description": "A Backstage catalog backend module that helps integrate towards LDAP",
"backstage": {
"role": "backend-plugin-module"
@@ -36,6 +36,7 @@
"test": "backstage-cli package test"
},
"dependencies": {
+ "@backstage/backend-plugin-api": "workspace:^",
"@backstage/backend-tasks": "workspace:^",
"@backstage/catalog-model": "workspace:^",
"@backstage/config": "workspace:^",
@@ -46,8 +47,7 @@
"@types/ldapjs": "^2.2.5",
"ldapjs": "^2.3.3",
"lodash": "^4.17.21",
- "uuid": "^9.0.0",
- "winston": "^3.2.1"
+ "uuid": "^9.0.0"
},
"devDependencies": {
"@backstage/cli": "workspace:^",
diff --git a/plugins/catalog-backend-module-ldap/src/ldap/client.ts b/plugins/catalog-backend-module-ldap/src/ldap/client.ts
index 75e54013b3..48a3eedfb8 100644
--- a/plugins/catalog-backend-module-ldap/src/ldap/client.ts
+++ b/plugins/catalog-backend-module-ldap/src/ldap/client.ts
@@ -19,7 +19,6 @@ import { readFile } from 'fs/promises';
import ldap, { Client, SearchEntry, SearchOptions } from 'ldapjs';
import { cloneDeep } from 'lodash';
import tlsLib from 'tls';
-import { Logger } from 'winston';
import { BindConfig, TLSConfig } from './config';
import { createOptions, errorString } from './util';
import {
@@ -29,6 +28,7 @@ import {
FreeIpaVendor,
LdapVendor,
} from './vendors';
+import { LoggerService } from '@backstage/backend-plugin-api';
/**
* Basic wrapper for the `ldapjs` library.
@@ -41,7 +41,7 @@ export class LdapClient {
private vendor: Promise | undefined;
static async create(
- logger: Logger,
+ logger: LoggerService,
target: string,
bind?: BindConfig,
tls?: TLSConfig,
@@ -89,7 +89,7 @@ export class LdapClient {
constructor(
private readonly client: Client,
- private readonly logger: Logger,
+ private readonly logger: LoggerService,
) {}
/**
diff --git a/plugins/catalog-backend-module-ldap/src/ldap/read.ts b/plugins/catalog-backend-module-ldap/src/ldap/read.ts
index 590d27ba8b..50036b94b0 100644
--- a/plugins/catalog-backend-module-ldap/src/ldap/read.ts
+++ b/plugins/catalog-backend-module-ldap/src/ldap/read.ts
@@ -31,9 +31,9 @@ import {
LDAP_UUID_ANNOTATION,
} from './constants';
import { LdapVendor } from './vendors';
-import { Logger } from 'winston';
import { GroupTransformer, UserTransformer } from './types';
import { mapStringAttr } from './util';
+import { LoggerService } from '@backstage/backend-plugin-api';
/**
* The default implementation of the transformation from an LDAP entry to a
@@ -269,7 +269,7 @@ export async function readLdapOrg(
options: {
groupTransformer?: GroupTransformer;
userTransformer?: UserTransformer;
- logger: Logger;
+ logger: LoggerService;
},
): Promise<{
users: UserEntity[];
diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts
index d4f19d0522..97ea4a53b0 100644
--- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts
+++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgEntityProvider.ts
@@ -27,7 +27,6 @@ import {
} from '@backstage/plugin-catalog-node';
import { merge } from 'lodash';
import * as uuid from 'uuid';
-import { Logger } from 'winston';
import {
GroupTransformer,
LdapClient,
@@ -37,6 +36,7 @@ import {
readLdapOrg,
UserTransformer,
} from '../ldap';
+import { LoggerService } from '@backstage/backend-plugin-api';
/**
* Options for {@link LdapOrgEntityProvider}.
@@ -64,7 +64,7 @@ export interface LdapOrgEntityProviderOptions {
/**
* The logger to use.
*/
- logger: Logger;
+ logger: LoggerService;
/**
* The refresh schedule to use.
@@ -143,7 +143,7 @@ export class LdapOrgEntityProvider implements EntityProvider {
private options: {
id: string;
provider: LdapProviderConfig;
- logger: Logger;
+ logger: LoggerService;
userTransformer?: UserTransformer;
groupTransformer?: GroupTransformer;
},
@@ -164,7 +164,7 @@ export class LdapOrgEntityProvider implements EntityProvider {
* Runs one single complete ingestion. This is only necessary if you use
* manual scheduling.
*/
- async read(options?: { logger?: Logger }) {
+ async read(options?: { logger?: LoggerService }) {
if (!this.connection) {
throw new Error('Not initialized');
}
@@ -237,7 +237,7 @@ export class LdapOrgEntityProvider implements EntityProvider {
}
// Helps wrap the timing and logging behaviors
-function trackProgress(logger: Logger) {
+function trackProgress(logger: LoggerService) {
let timestamp = Date.now();
let summary: string;
diff --git a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts
index 00578ac3a4..c920968fc1 100644
--- a/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts
+++ b/plugins/catalog-backend-module-ldap/src/processors/LdapOrgReaderProcessor.ts
@@ -15,7 +15,6 @@
*/
import { Config } from '@backstage/config';
-import { Logger } from 'winston';
import {
GroupTransformer,
LdapClient,
@@ -30,6 +29,7 @@ import {
processingResult,
} from '@backstage/plugin-catalog-node';
import { LocationSpec } from '@backstage/plugin-catalog-common';
+import { LoggerService } from '@backstage/backend-plugin-api';
/**
* Extracts teams and users out of an LDAP server.
@@ -38,14 +38,14 @@ import { LocationSpec } from '@backstage/plugin-catalog-common';
*/
export class LdapOrgReaderProcessor implements CatalogProcessor {
private readonly providers: LdapProviderConfig[];
- private readonly logger: Logger;
+ private readonly logger: LoggerService;
private readonly groupTransformer?: GroupTransformer;
private readonly userTransformer?: UserTransformer;
static fromConfig(
configRoot: Config,
options: {
- logger: Logger;
+ logger: LoggerService;
groupTransformer?: GroupTransformer;
userTransformer?: UserTransformer;
},
@@ -62,7 +62,7 @@ export class LdapOrgReaderProcessor implements CatalogProcessor {
constructor(options: {
providers: LdapProviderConfig[];
- logger: Logger;
+ logger: LoggerService;
groupTransformer?: GroupTransformer;
userTransformer?: UserTransformer;
}) {
diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md
index 8b7dcb9c80..526a8609ac 100644
--- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md
+++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/plugin-catalog-backend-module-msgraph
+## 0.5.26
+
+### Patch Changes
+
+- 49eab29: Fixed disabling of user photo fetching. Previously, the config value wasn't propagated properly, so user photos was still being fetched despite disabled by config.
+- 6e370e6: Handle fetching huge amounts of users from Azure without crashing
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.5.26-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.5.26-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json
index 7a89b0c507..b12afe2f01 100644
--- a/plugins/catalog-backend-module-msgraph/package.json
+++ b/plugins/catalog-backend-module-msgraph/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-msgraph",
- "version": "0.5.26-next.1",
+ "version": "0.5.26",
"description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md
index f7303d298e..a0f8b3945d 100644
--- a/plugins/catalog-backend-module-openapi/CHANGELOG.md
+++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-catalog-backend-module-openapi
+## 0.1.36
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/plugin-catalog-backend@1.22.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/integration@1.11.0
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.1.36-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/plugin-catalog-backend@1.22.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.36-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json
index be2efd8c93..40975fc254 100644
--- a/plugins/catalog-backend-module-openapi/package.json
+++ b/plugins/catalog-backend-module-openapi/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-openapi",
- "version": "0.1.36-next.1",
+ "version": "0.1.36",
"description": "A Backstage catalog backend module that helps with OpenAPI specifications",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md
index b2604c469e..e49b8fdfa2 100644
--- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md
+++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-catalog-backend-module-puppetdb
+## 0.1.24
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+
+## 0.1.24-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.1.24-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json
index 6c38b658e3..d12990b54d 100644
--- a/plugins/catalog-backend-module-puppetdb/package.json
+++ b/plugins/catalog-backend-module-puppetdb/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-puppetdb",
- "version": "0.1.24-next.1",
+ "version": "0.1.24",
"description": "A Backstage catalog backend module that helps integrate towards PuppetDB",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md
index b7b46ed403..e2a2e7f299 100644
--- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md
+++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-catalog-backend-module-scaffolder-entity-model
+## 0.1.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.2
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.1.16-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+
## 0.1.16-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json
index 6b8bc12493..5f7a22b8dc 100644
--- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json
+++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model",
- "version": "0.1.16-next.1",
+ "version": "0.1.16",
"description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md
index a53e36a696..16b105df8d 100644
--- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md
+++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/plugin-catalog-backend-module-unprocessed
+## 0.4.5
+
+### Patch Changes
+
+- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`.
+- 6f5a3a3: Correctly convert owner to string in case owner has not been provided
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
+## 0.4.5-next.2
+
+### Patch Changes
+
+- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.4.5-next.1
### Patch Changes
diff --git a/plugins/catalog-backend-module-unprocessed/README.md b/plugins/catalog-backend-module-unprocessed/README.md
index 0d9f9f8cb9..6b350e5ef8 100644
--- a/plugins/catalog-backend-module-unprocessed/README.md
+++ b/plugins/catalog-backend-module-unprocessed/README.md
@@ -14,7 +14,13 @@ A `pending` entity has not been processed yet.
yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-unprocessed
```
-### backend
+In `packages/backend/src/index.ts` add the module:
+
+```ts title="packages/backend/src/index.ts"
+backend.add(catalogModuleUnprocessedEntities());
+```
+
+### Legacy Backend
In `packages/backend/src/plugins/catalog.ts` import the module and initialize it after invoking `CatalogBuilder.build()`:
@@ -29,13 +35,3 @@ const unprocessed = new UnprocessedEntitiesModule(
);
unprocessed.registerRoutes();
```
-
-### backend-next
-
-In `packages/backend-next/src/index.ts` add the module:
-
-```ts title="packages/backend-next/src/index.ts"
-backend.add(catalogModuleUnprocessedEntities());
-```
-
-_This plugin was created through the Backstage CLI_
diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json
index 38d96e62e9..c1df39fc6c 100644
--- a/plugins/catalog-backend-module-unprocessed/package.json
+++ b/plugins/catalog-backend-module-unprocessed/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-unprocessed",
- "version": "0.4.5-next.1",
+ "version": "0.4.5",
"description": "Backstage Catalog module to view unprocessed entities",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md
index 426333c567..3934bb495f 100644
--- a/plugins/catalog-backend/CHANGELOG.md
+++ b/plugins/catalog-backend/CHANGELOG.md
@@ -1,5 +1,49 @@
# @backstage/plugin-catalog-backend
+## 1.22.0
+
+### Minor Changes
+
+- f2a2a83: Deprecated the `LocationAnalyzer` type, which has been moved to `@backstage/plugin-catalog-node`.
+- f2a2a83: The `/alpha` plugin export has had its implementation of the `catalogAnalysisExtensionPoint` updated to reflect the new API.
+- 8d14475: Emit well known relationships for the Domain entity kind.
+
+### Patch Changes
+
+- 131e5cb: Fix broken links in README.
+- c6cb568: Add lifecycle monitoring for the catalog processing
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- 8479a0b: Fixed bug in stitching queue gauge that included entities that are scheduled in the future.
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/plugin-search-backend-module-catalog@0.1.24
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-events-node@0.3.4
+ - @backstage/integration@1.11.0
+ - @backstage/backend-openapi-utils@0.1.11
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+ - @backstage/plugin-permission-node@0.7.29
+
+## 1.22.0-next.2
+
+### Minor Changes
+
+- f2a2a83: Deprecated the `LocationAnalyzer` type, which has been moved to `@backstage/plugin-catalog-node`.
+- f2a2a83: The `/alpha` plugin export has had its implementation of the `catalogAnalysisExtensionPoint` updated to reflect the new API.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/plugin-search-backend-module-catalog@0.1.24-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 1.22.0-next.1
### Patch Changes
@@ -3558,8 +3602,7 @@
`packages/backend/src/plugins/catalog.ts` creates the catalog builder using
`CatalogBuilder.create`. If you instead call `new CatalogBuilder`, you are on
the old implementation and will experience breakage if you upgrade to this
- version. If you are still on the old version, see [the relevant change log
- entry](https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/CHANGELOG.md#patch-changes-27)
+ version. If you are still on the old version, see [the relevant change log entry](https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/CHANGELOG.md#patch-changes-27)
for migration instructions.
The minimal `packages/backend/src/plugins/catalog.ts` file is now:
@@ -3652,8 +3695,7 @@
`packages/backend/src/plugins/catalog.ts` creates the catalog builder using
`CatalogBuilder.create`. If you instead call `new CatalogBuilder`, you are on
the old implementation and will experience breakage if you upgrade to this
- version. If you are still on the old version, see [the relevant change log
- entry](https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/CHANGELOG.md#patch-changes-27)
+ version. If you are still on the old version, see [the relevant change log entry](https://github.com/backstage/backstage/blob/master/plugins/catalog-backend/CHANGELOG.md#patch-changes-27)
for migration instructions.
The minimal `packages/backend/src/plugins/catalog.ts` file is now:
diff --git a/plugins/catalog-backend/README.md b/plugins/catalog-backend/README.md
index 7f886de155..b0bd0328ab 100644
--- a/plugins/catalog-backend/README.md
+++ b/plugins/catalog-backend/README.md
@@ -1,9 +1,7 @@
# Catalog Backend
-This is the backend for the default Backstage [software
-catalog](http://backstage.io/docs/features/software-catalog/).
-This provides an API for consumers such as the frontend [catalog
-plugin](https://github.com/backstage/backstage/tree/master/plugins/catalog).
+This is the backend for the default Backstage [software catalog](http://backstage.io/docs/features/software-catalog/).
+This provides an API for consumers such as the frontend [catalog plugin](https://github.com/backstage/backstage/tree/master/plugins/catalog).
It comes with a builtin database-backed implementation of the catalog that can
store and serve your catalog for you.
@@ -30,12 +28,19 @@ restoring the plugin, if you previously removed it.
yarn --cwd packages/backend add @backstage/plugin-catalog-backend
```
-### Adding the plugin to your `packages/backend`
+Then add the plugin to your backend, typically in `packages/backend/src/index.ts`:
-You'll need to add the plugin to the router in your `backend` package. You can
-do this by creating a file called `packages/backend/src/plugins/catalog.ts` with
-contents matching [catalog.ts in the create-app
-template](https://github.com/backstage/backstage/blob/master/packages/create-app/templates/default-app/packages/backend/src/plugins/catalog.ts).
+```ts
+const backend = createBackend();
+// ...
+backend.add(import('@backstage/plugin-catalog-backend/alpha'));
+```
+
+#### Old backend system
+
+In the old backend system there's a bit more wiring required. You'll need to
+create a file called `packages/backend/src/plugins/catalog.ts` with contents
+matching [catalog.ts in the create-app template](https://github.com/backstage/backstage/blob/ad9314d3a7e0405719ba93badf96e97adde8ef83/packages/create-app/templates/default-app/packages/backend/src/plugins/catalog.ts).
With the `catalog.ts` router setup in place, add the router to
`packages/backend/src/index.ts`:
@@ -60,10 +65,8 @@ async function main() {
### Adding catalog entities
At this point the `catalog-backend` is installed in your backend package, but
-you will not have any catalog entities loaded. See [Catalog
-Configuration](https://backstage.io/docs/features/software-catalog/configuration)
-for how to add locations, or copy the catalog locations from the [create-app
-template](https://github.com/backstage/backstage/blob/master/packages/create-app/templates/default-app/app-config.yaml.hbs)
+you will not have any catalog entities loaded. See [Catalog Configuration](https://backstage.io/docs/features/software-catalog/configuration)
+for how to add locations, or copy the catalog locations from the [create-app template](https://github.com/backstage/backstage/blob/master/packages/create-app/templates/default-app/app-config.yaml.hbs)
to get up and running quickly.
## Development
diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md
index 27c00257a5..1c65abf83e 100644
--- a/plugins/catalog-backend/api-report.md
+++ b/plugins/catalog-backend/api-report.md
@@ -41,6 +41,7 @@ import { EntityRelationSpec as EntityRelationSpec_2 } from '@backstage/plugin-ca
import { EventBroker } from '@backstage/plugin-events-node';
import { GetEntitiesRequest } from '@backstage/catalog-client';
import { HttpAuthService } from '@backstage/backend-plugin-api';
+import { LocationAnalyzer as LocationAnalyzer_2 } from '@backstage/plugin-catalog-node';
import { LocationSpec as LocationSpec_2 } from '@backstage/plugin-catalog-common';
import { locationSpecToLocationEntity as locationSpecToLocationEntity_2 } from '@backstage/plugin-catalog-node';
import { locationSpecToMetadataName as locationSpecToMetadataName_2 } from '@backstage/plugin-catalog-node';
@@ -167,7 +168,7 @@ export class CatalogBuilder {
setEntityDataParser(parser: CatalogProcessorParser_2): CatalogBuilder;
setEventBroker(broker: EventBroker): CatalogBuilder;
setFieldFormatValidators(validators: Partial): CatalogBuilder;
- setLocationAnalyzer(locationAnalyzer: LocationAnalyzer): CatalogBuilder;
+ setLocationAnalyzer(locationAnalyzer: LocationAnalyzer_2): CatalogBuilder;
setPlaceholderResolver(
key: string,
resolver: PlaceholderResolver_2,
@@ -359,12 +360,8 @@ export class FileReaderProcessor implements CatalogProcessor_2 {
): Promise;
}
-// @public (undocumented)
-export type LocationAnalyzer = {
- analyzeLocation(
- location: AnalyzeLocationRequest_2,
- ): Promise;
-};
+// @public @deprecated (undocumented)
+export type LocationAnalyzer = LocationAnalyzer_2;
// @public @deprecated
export class LocationEntityProcessor implements CatalogProcessor_2 {
diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json
index cea3f06c6f..44f35dccf2 100644
--- a/plugins/catalog-backend/package.json
+++ b/plugins/catalog-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend",
- "version": "1.22.0-next.1",
+ "version": "1.22.0",
"description": "The Backstage backend plugin that provides the Backstage catalog",
"backstage": {
"role": "backend-plugin"
diff --git a/plugins/catalog-backend/src/database/migrations.ts b/plugins/catalog-backend/src/database/migrations.ts
index ed3a7751b5..5139c74930 100644
--- a/plugins/catalog-backend/src/database/migrations.ts
+++ b/plugins/catalog-backend/src/database/migrations.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { resolvePackagePath } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { Knex } from 'knex';
export async function applyDatabaseMigrations(knex: Knex): Promise {
diff --git a/plugins/catalog-backend/src/deprecated.ts b/plugins/catalog-backend/src/deprecated.ts
index 72c3cad225..2d08d2ce0c 100644
--- a/plugins/catalog-backend/src/deprecated.ts
+++ b/plugins/catalog-backend/src/deprecated.ts
@@ -48,6 +48,7 @@ import {
type PlaceholderResolverParams as _PlaceholderResolverParams,
type PlaceholderResolverRead as _PlaceholderResolverRead,
type PlaceholderResolverResolveUrl as _PlaceholderResolverResolveUrl,
+ type LocationAnalyzer as _LocationAnalyzer,
type ScmLocationAnalyzer as _ScmLocationAnalyzer,
} from '@backstage/plugin-catalog-node';
import {
@@ -177,6 +178,11 @@ export type LocationSpec = _LocationSpec;
* @deprecated import from `@backstage/plugin-catalog-node` instead
*/
export type AnalyzeOptions = _AnalyzeOptions;
+/**
+ * @public
+ * @deprecated import from `@backstage/plugin-catalog-node` instead
+ */
+export type LocationAnalyzer = _LocationAnalyzer;
/**
* @public
* @deprecated import from `@backstage/plugin-catalog-node` instead
diff --git a/plugins/catalog-backend/src/index.ts b/plugins/catalog-backend/src/index.ts
index 6a479babdc..d3ffa9a974 100644
--- a/plugins/catalog-backend/src/index.ts
+++ b/plugins/catalog-backend/src/index.ts
@@ -20,7 +20,6 @@
* @packageDocumentation
*/
-export * from './ingestion';
export * from './modules';
export * from './processing';
export * from './search';
diff --git a/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts b/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts
index 61d319bf37..d574f3b299 100644
--- a/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts
+++ b/plugins/catalog-backend/src/ingestion/LocationAnalyzer.ts
@@ -17,12 +17,14 @@
import parseGitUrl from 'git-url-parse';
import { Entity } from '@backstage/catalog-model';
import { ScmIntegrationRegistry } from '@backstage/integration';
-import { LocationAnalyzer } from './types';
import {
AnalyzeLocationRequest,
AnalyzeLocationResponse,
} from '@backstage/plugin-catalog-common';
-import { ScmLocationAnalyzer } from '@backstage/plugin-catalog-node';
+import {
+ LocationAnalyzer,
+ ScmLocationAnalyzer,
+} from '@backstage/plugin-catalog-node';
import { LoggerService } from '@backstage/backend-plugin-api';
export class RepoLocationAnalyzer implements LocationAnalyzer {
diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts
index 2438dc9009..f305bf2d8b 100644
--- a/plugins/catalog-backend/src/service/CatalogBuilder.ts
+++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts
@@ -45,6 +45,7 @@ import {
EntitiesSearchFilter,
EntityProvider,
PlaceholderResolver,
+ LocationAnalyzer,
ScmLocationAnalyzer,
} from '@backstage/plugin-catalog-node';
import {
@@ -64,7 +65,6 @@ import {
yamlPlaceholderResolver,
} from '../modules/core/PlaceholderProcessor';
import { defaultEntityDataParser } from '../modules/util/parse';
-import { LocationAnalyzer } from '../ingestion';
import {
CatalogProcessingEngine,
createRandomProcessingInterval,
diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts
index dd44e20add..ac869cdc2b 100644
--- a/plugins/catalog-backend/src/service/CatalogPlugin.ts
+++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts
@@ -20,7 +20,6 @@ import {
import { Entity, Validators } from '@backstage/catalog-model';
import { CatalogBuilder, CatalogPermissionRuleInput } from './CatalogBuilder';
import {
- CatalogAnalysisExtensionPoint,
catalogAnalysisExtensionPoint,
CatalogModelExtensionPoint,
catalogModelExtensionPoint,
@@ -33,11 +32,13 @@ import {
CatalogProcessor,
CatalogProcessorParser,
EntityProvider,
+ LocationAnalyzer,
PlaceholderResolver,
ScmLocationAnalyzer,
} from '@backstage/plugin-catalog-node';
import { merge } from 'lodash';
import { Permission } from '@backstage/plugin-permission-common';
+import { ForwardedError } from '@backstage/errors';
class CatalogProcessingExtensionPointImpl
implements CatalogProcessingExtensionPoint
@@ -96,20 +97,6 @@ class CatalogProcessingExtensionPointImpl
}
}
-class CatalogAnalysisExtensionPointImpl
- implements CatalogAnalysisExtensionPoint
-{
- #locationAnalyzers = new Array();
-
- addLocationAnalyzer(analyzer: ScmLocationAnalyzer): void {
- this.#locationAnalyzers.push(analyzer);
- }
-
- get locationAnalyzers() {
- return this.#locationAnalyzers;
- }
-}
-
class CatalogPermissionExtensionPointImpl
implements CatalogPermissionExtensionPoint
{
@@ -178,11 +165,29 @@ export const catalogPlugin = createBackendPlugin({
processingExtensions,
);
- const analysisExtensions = new CatalogAnalysisExtensionPointImpl();
- env.registerExtensionPoint(
- catalogAnalysisExtensionPoint,
- analysisExtensions,
- );
+ let locationAnalyzerFactory:
+ | ((options: {
+ scmLocationAnalyzers: ScmLocationAnalyzer[];
+ }) => Promise<{ locationAnalyzer: LocationAnalyzer }>)
+ | undefined = undefined;
+ const scmLocationAnalyzers = new Array();
+ env.registerExtensionPoint(catalogAnalysisExtensionPoint, {
+ setLocationAnalyzer(analyzerOrFactory) {
+ if (locationAnalyzerFactory) {
+ throw new Error('LocationAnalyzer has already been set');
+ }
+ if (typeof analyzerOrFactory === 'function') {
+ locationAnalyzerFactory = analyzerOrFactory;
+ } else {
+ locationAnalyzerFactory = async () => ({
+ locationAnalyzer: analyzerOrFactory,
+ });
+ }
+ },
+ addScmLocationAnalyzer(analyzer: ScmLocationAnalyzer) {
+ scmLocationAnalyzers.push(analyzer);
+ },
+ });
const permissionExtensions = new CatalogPermissionExtensionPointImpl();
env.registerExtensionPoint(
@@ -246,7 +251,16 @@ export const catalogPlugin = createBackendPlugin({
Object.entries(processingExtensions.placeholderResolvers).forEach(
([key, resolver]) => builder.setPlaceholderResolver(key, resolver),
);
- builder.addLocationAnalyzers(...analysisExtensions.locationAnalyzers);
+ if (locationAnalyzerFactory) {
+ const { locationAnalyzer } = await locationAnalyzerFactory({
+ scmLocationAnalyzers,
+ }).catch(e => {
+ throw new ForwardedError('Failed to create LocationAnalyzer', e);
+ });
+ builder.setLocationAnalyzer(locationAnalyzer);
+ } else {
+ builder.addLocationAnalyzers(...scmLocationAnalyzers);
+ }
builder.addPermissions(...permissionExtensions.permissions);
builder.addPermissionRules(...permissionExtensions.permissionRules);
builder.setFieldFormatValidators(modelExtensions.fieldValidators);
diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts
index 292c4c1b7a..a2fae0e8bd 100644
--- a/plugins/catalog-backend/src/service/createRouter.test.ts
+++ b/plugins/catalog-backend/src/service/createRouter.test.ts
@@ -42,7 +42,7 @@ import { decodeCursor, encodeCursor } from './util';
import { wrapInOpenApiTestServer } from '@backstage/backend-openapi-utils';
import { Server } from 'http';
import { mockCredentials, mockServices } from '@backstage/backend-test-utils';
-import { LocationAnalyzer } from '../ingestion';
+import { LocationAnalyzer } from '@backstage/plugin-catalog-node';
describe('createRouter readonly disabled', () => {
let entitiesCatalog: jest.Mocked;
diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts
index 508f0bb3d6..774ee61a6d 100644
--- a/plugins/catalog-backend/src/service/createRouter.ts
+++ b/plugins/catalog-backend/src/service/createRouter.ts
@@ -28,7 +28,6 @@ import express from 'express';
import yn from 'yn';
import { z } from 'zod';
import { EntitiesCatalog } from '../catalog/types';
-import { LocationAnalyzer } from '../ingestion';
import { CatalogProcessingOrchestrator } from '../processing/types';
import { validateEntityEnvelope } from '../processing/util';
import {
@@ -55,6 +54,7 @@ import {
HttpAuthService,
LoggerService,
} from '@backstage/backend-plugin-api';
+import { LocationAnalyzer } from '@backstage/plugin-catalog-node';
/**
* Options used by {@link createRouter}.
diff --git a/plugins/catalog-common/CHANGELOG.md b/plugins/catalog-common/CHANGELOG.md
index f070ca11e2..a6dc3f06d6 100644
--- a/plugins/catalog-common/CHANGELOG.md
+++ b/plugins/catalog-common/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-catalog-common
+## 1.0.23
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+
## 1.0.23-next.0
### Patch Changes
diff --git a/plugins/catalog-common/package.json b/plugins/catalog-common/package.json
index 59d0019512..936fc3c935 100644
--- a/plugins/catalog-common/package.json
+++ b/plugins/catalog-common/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-common",
- "version": "1.0.23-next.0",
+ "version": "1.0.23",
"description": "Common functionalities for the catalog plugin",
"backstage": {
"role": "common-library"
diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md
index e1b79d8d13..9d5a638ad7 100644
--- a/plugins/catalog-graph/CHANGELOG.md
+++ b/plugins/catalog-graph/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-catalog-graph
+## 0.4.5
+
+### Patch Changes
+
+- 39564b3: Allow multiple edges with different type (e.g. `ownedBy` and `applicationOwnerBy`) to have the same source and target node.
+- Updated dependencies
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/catalog-client@1.6.5
+ - @backstage/frontend-plugin-api@0.6.5
+
+## 0.4.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+
## 0.4.5-next.1
### Patch Changes
diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json
index d0363f5376..4d2ac4b393 100644
--- a/plugins/catalog-graph/package.json
+++ b/plugins/catalog-graph/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-graph",
- "version": "0.4.5-next.1",
+ "version": "0.4.5",
"backstage": {
"role": "frontend-plugin"
},
diff --git a/plugins/catalog-graph/src/components/EntityRelationsGraph/DefaultRenderLabel.tsx b/plugins/catalog-graph/src/components/EntityRelationsGraph/DefaultRenderLabel.tsx
index cde4808f6e..ae01a113dd 100644
--- a/plugins/catalog-graph/src/components/EntityRelationsGraph/DefaultRenderLabel.tsx
+++ b/plugins/catalog-graph/src/components/EntityRelationsGraph/DefaultRenderLabel.tsx
@@ -38,7 +38,7 @@ export function DefaultRenderLabel({
return (
{relations.map((r, i) => (
- 0 && classes.secondary)}>
+
{i > 0 && / }
{r}
diff --git a/plugins/catalog-graph/src/components/EntityRelationsGraph/useEntityRelationNodesAndEdges.test.ts b/plugins/catalog-graph/src/components/EntityRelationsGraph/useEntityRelationNodesAndEdges.test.ts
index 8c7b59b9c4..0a5e43bf37 100644
--- a/plugins/catalog-graph/src/components/EntityRelationsGraph/useEntityRelationNodesAndEdges.test.ts
+++ b/plugins/catalog-graph/src/components/EntityRelationsGraph/useEntityRelationNodesAndEdges.test.ts
@@ -371,12 +371,6 @@ describe('useEntityRelationNodesAndEdges', () => {
relations: [RELATION_HAS_PART, RELATION_PART_OF],
to: 'b:d/c1',
},
- {
- from: 'b:d/c',
- label: 'visible',
- relations: [RELATION_HAS_PART, RELATION_PART_OF],
- to: 'b:d/c1',
- },
{
from: 'b:d/c1',
label: 'visible',
@@ -389,24 +383,6 @@ describe('useEntityRelationNodesAndEdges', () => {
relations: [RELATION_HAS_PART, RELATION_PART_OF],
to: 'b:d/c2',
},
- {
- from: 'b:d/c1',
- label: 'visible',
- relations: [RELATION_HAS_PART, RELATION_PART_OF],
- to: 'b:d/c2',
- },
- {
- from: 'b:d/c',
- label: 'visible',
- relations: [RELATION_OWNER_OF, RELATION_OWNED_BY],
- to: 'k:d/a1',
- },
- {
- from: 'b:d/c1',
- label: 'visible',
- relations: [RELATION_OWNER_OF, RELATION_OWNED_BY],
- to: 'k:d/a1',
- },
]);
});
diff --git a/plugins/catalog-graph/src/components/EntityRelationsGraph/useEntityRelationNodesAndEdges.ts b/plugins/catalog-graph/src/components/EntityRelationsGraph/useEntityRelationNodesAndEdges.ts
index d2a5138ccb..74aff1b3d0 100644
--- a/plugins/catalog-graph/src/components/EntityRelationsGraph/useEntityRelationNodesAndEdges.ts
+++ b/plugins/catalog-graph/src/components/EntityRelationsGraph/useEntityRelationNodesAndEdges.ts
@@ -146,11 +146,60 @@ export function useEntityRelationNodesAndEdges({
nodeQueue.push(rel.targetRef);
visitedNodes.add(rel.targetRef);
}
+
+ // if unidirectional add missing relations as entities are only visited once
+ if (unidirectional) {
+ const findIndex = edges.findIndex(
+ edge =>
+ entityRef === edge.from &&
+ rel.targetRef === edge.to &&
+ !edge.relations.includes(rel.type),
+ );
+ if (findIndex >= 0) {
+ if (mergeRelations) {
+ const pair = relationPairs.find(
+ ([l, r]) => l === rel.type || r === rel.type,
+ ) ?? [rel.type];
+ edges[findIndex].relations = [
+ ...edges[findIndex].relations,
+ ...pair,
+ ];
+ } else {
+ edges[findIndex].relations = [
+ ...edges[findIndex].relations,
+ rel.type,
+ ];
+ }
+ }
+ }
});
}
}
- setNodesAndEdges({ nodes, edges });
+ // Reduce edges as the dependency graph anyway ignores duplicated edges regarding from / to
+ // Additionally, this will improve rendering speed for the dependency graph
+ const finalEdges = edges.reduce((previousEdges, currentEdge) => {
+ const indexFound = previousEdges.findIndex(
+ previousEdge =>
+ previousEdge.from === currentEdge.from &&
+ previousEdge.to === currentEdge.to,
+ );
+ if (indexFound >= 0) {
+ previousEdges[indexFound] = {
+ ...previousEdges[indexFound],
+ relations: Array.from(
+ new Set([
+ ...previousEdges[indexFound].relations,
+ ...currentEdge.relations,
+ ]),
+ ),
+ };
+ return previousEdges;
+ }
+ return [...previousEdges, currentEdge];
+ }, [] as EntityEdge[]);
+
+ setNodesAndEdges({ nodes, edges: finalEdges });
},
100,
[
diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md
index bfdfabba5a..8bc9f0914e 100644
--- a/plugins/catalog-import/CHANGELOG.md
+++ b/plugins/catalog-import/CHANGELOG.md
@@ -1,5 +1,36 @@
# @backstage/plugin-catalog-import
+## 0.11.0
+
+### Minor Changes
+
+- e1174b0: `EntityListComponent` uses `entityPresentationApi` instead of `humanizeEntityRef` to display Entity
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/integration@1.11.0
+ - @backstage/catalog-client@1.6.5
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/integration-react@1.1.27
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.10.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/integration@1.11.0-next.0
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+ - @backstage/integration-react@1.1.27-next.0
+
## 0.10.11-next.1
### Patch Changes
diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json
index a766110a4d..822ed6f395 100644
--- a/plugins/catalog-import/package.json
+++ b/plugins/catalog-import/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-import",
- "version": "0.10.11-next.1",
+ "version": "0.11.0",
"description": "A Backstage plugin the helps you import entities into your catalog",
"backstage": {
"role": "frontend-plugin"
@@ -78,6 +78,7 @@
"@backstage/cli": "workspace:^",
"@backstage/core-app-api": "workspace:^",
"@backstage/dev-utils": "workspace:^",
+ "@backstage/plugin-catalog": "workspace:^",
"@backstage/test-utils": "workspace:^",
"@testing-library/dom": "^10.0.0",
"@testing-library/jest-dom": "^6.0.0",
diff --git a/plugins/catalog-import/src/components/EntityListComponent/EntityListComponent.tsx b/plugins/catalog-import/src/components/EntityListComponent/EntityListComponent.tsx
index ef57fad204..80a2d90fcc 100644
--- a/plugins/catalog-import/src/components/EntityListComponent/EntityListComponent.tsx
+++ b/plugins/catalog-import/src/components/EntityListComponent/EntityListComponent.tsx
@@ -14,11 +14,16 @@
* limitations under the License.
*/
-import { Entity, CompoundEntityRef } from '@backstage/catalog-model';
-import { useApp } from '@backstage/core-plugin-api';
import {
+ Entity,
+ CompoundEntityRef,
+ stringifyEntityRef,
+} from '@backstage/catalog-model';
+import { useApi } from '@backstage/core-plugin-api';
+import {
+ EntityDisplayName,
EntityRefLink,
- humanizeEntityRef,
+ entityPresentationApiRef,
} from '@backstage/plugin-catalog-react';
import Collapse from '@material-ui/core/Collapse';
import IconButton from '@material-ui/core/IconButton';
@@ -38,12 +43,6 @@ const useStyles = makeStyles(theme => ({
},
}));
-function sortEntities(entities: Array) {
- return entities.sort((a, b) =>
- humanizeEntityRef(a).localeCompare(humanizeEntityRef(b)),
- );
-}
-
/**
* Props for {@link EntityListComponent}.
*
@@ -76,9 +75,8 @@ export const EntityListComponent = (props: EntityListComponentProps) => {
withLinks = false,
} = props;
- const app = useApp();
const classes = useStyles();
-
+ const entityPresentationApi = useApi(entityPresentationApiRef);
const [expandedUrls, setExpandedUrls] = useState([]);
const handleClick = (url: string) => {
@@ -87,6 +85,17 @@ export const EntityListComponent = (props: EntityListComponentProps) => {
);
};
+ function sortEntities(entities: Array) {
+ return entities.sort((a, b) =>
+ entityPresentationApi
+ .forEntity(stringifyEntityRef(a))
+ .snapshot.entityRef.localeCompare(
+ entityPresentationApi.forEntity(stringifyEntityRef(b)).snapshot
+ .entityRef,
+ ),
+ );
+ }
+
return (
{firstListItem}
@@ -124,12 +133,9 @@ export const EntityListComponent = (props: EntityListComponentProps) => {
>
{sortEntities(r.entities).map(entity => {
- const Icon = app.getSystemIcon(
- `kind:${entity.kind.toLocaleLowerCase('en-US')}`,
- );
return (
{
}
: {})}
>
- {Icon && }
-
+ }
+ />
);
})}
diff --git a/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.test.tsx b/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.test.tsx
index b5efd3fbbf..e5a4174859 100644
--- a/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.test.tsx
+++ b/plugins/catalog-import/src/components/StepPrepareSelectLocations/StepPrepareSelectLocations.test.tsx
@@ -14,14 +14,22 @@
* limitations under the License.
*/
-import { renderInTestApp } from '@backstage/test-utils';
+import { TestApiProvider, renderInTestApp } from '@backstage/test-utils';
import { act, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import { AnalyzeResult } from '../../api';
import { StepPrepareSelectLocations } from './StepPrepareSelectLocations';
+import {
+ CatalogApi,
+ catalogApiRef,
+ entityPresentationApiRef,
+} from '@backstage/plugin-catalog-react';
+import { DefaultEntityPresentationApi } from '@backstage/plugin-catalog';
+import { Entity } from '@backstage/catalog-model';
describe('', () => {
+ let entities: Entity[];
const analyzeResult = {
type: 'locations',
locations: [
@@ -53,17 +61,43 @@ describe('', () => {
],
} as Extract;
+ const catalogApi: jest.Mocked = {
+ getLocationById: jest.fn(),
+ getEntityByName: jest.fn(),
+ getEntities: jest.fn(async () => ({ items: entities })),
+ addLocation: jest.fn(),
+ getLocationByRef: jest.fn(),
+ removeEntityByUid: jest.fn(),
+ } as any;
+ let Wrapper: React.ComponentType>;
+
beforeEach(() => {
jest.resetAllMocks();
+ catalogApi.getEntities.mockResolvedValue({ items: entities });
+ Wrapper = ({ children }: { children?: React.ReactNode }) => (
+
+ {children}
+
+ );
});
it('renders display locations to be added', async () => {
await renderInTestApp(
- undefined}
- onGoBack={() => undefined}
- />,
+
+ undefined}
+ onGoBack={() => undefined}
+ />
+ ,
);
expect(screen.getByText('url-1')).toBeInTheDocument();
@@ -96,11 +130,13 @@ describe('', () => {
} as Extract;
await renderInTestApp(
- undefined}
- onGoBack={() => undefined}
- />,
+
+ undefined}
+ onGoBack={() => undefined}
+ />
+ ,
);
expect(screen.getByText(/my-target/)).toBeInTheDocument();
@@ -112,11 +148,13 @@ describe('', () => {
it('should select and deselect all', async () => {
await renderInTestApp(
- undefined}
- onGoBack={() => undefined}
- />,
+
+ undefined}
+ onGoBack={() => undefined}
+ />
+ ,
);
const checkboxes = screen.getAllByRole('checkbox');
@@ -144,15 +182,17 @@ describe('', () => {
it('should preselect prepared locations', async () => {
await renderInTestApp(
- undefined}
- onGoBack={() => undefined}
- />,
+
+ undefined}
+ onGoBack={() => undefined}
+ />
+ ,
);
const checkboxes = screen.getAllByRole('checkbox');
@@ -164,11 +204,13 @@ describe('', () => {
it('should select items', async () => {
await renderInTestApp(
- undefined}
- onGoBack={() => undefined}
- />,
+
+ undefined}
+ onGoBack={() => undefined}
+ />
+ ,
);
const checkboxes = screen.getAllByRole('checkbox');
@@ -193,11 +235,13 @@ describe('', () => {
const onGoBack = jest.fn();
await renderInTestApp(
- undefined}
- onGoBack={onGoBack}
- />,
+
+ undefined}
+ onGoBack={onGoBack}
+ />
+ ,
);
await act(async () => {
@@ -211,11 +255,13 @@ describe('', () => {
const onPrepare = jest.fn();
await renderInTestApp(
- undefined}
- />,
+
+ undefined}
+ />
+ ,
);
const checkboxes = screen.getAllByRole('checkbox');
diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md
index a2405a7eef..8948ad6f98 100644
--- a/plugins/catalog-node/CHANGELOG.md
+++ b/plugins/catalog-node/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-catalog-node
+## 1.12.0
+
+### Minor Changes
+
+- f2a2a83: Added `LocationAnalyzer` type, moved from `@backstage/plugin-catalog-backend`.
+- f2a2a83: Breaking change to `/alpha` API where the `catalogAnalysisExtensionPoint` has been reworked. The `addLocationAnalyzer` method has been renamed to `addScmLocationAnalyzer`, and a new `setLocationAnalyzer` method has been added which allows the full `LocationAnalyzer` implementation to be overridden.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+ - @backstage/plugin-permission-node@0.7.29
+
+## 1.12.0-next.2
+
+### Minor Changes
+
+- f2a2a83: Added `LocationAnalyzer` type, moved from `@backstage/plugin-catalog-backend`.
+- f2a2a83: Breaking change to `/alpha` API where the `catalogAnalysisExtensionPoint` has been reworked. The `addLocationAnalyzer` method has been renamed to `addScmLocationAnalyzer`, and a new `setLocationAnalyzer` method has been added which allows the full `LocationAnalyzer` implementation to be overridden.
+
## 1.11.2-next.1
### Patch Changes
diff --git a/plugins/catalog-node/api-report-alpha.md b/plugins/catalog-node/api-report-alpha.md
index fb41d6f03e..b61d1b1d27 100644
--- a/plugins/catalog-node/api-report-alpha.md
+++ b/plugins/catalog-node/api-report-alpha.md
@@ -10,6 +10,7 @@ import { EntitiesSearchFilter } from '@backstage/plugin-catalog-node';
import { Entity } from '@backstage/catalog-model';
import { EntityProvider } from '@backstage/plugin-catalog-node';
import { ExtensionPoint } from '@backstage/backend-plugin-api';
+import { LocationAnalyzer } from '@backstage/plugin-catalog-node';
import { Permission } from '@backstage/plugin-permission-common';
import { PermissionRule } from '@backstage/plugin-permission-node';
import { PermissionRuleParams } from '@backstage/plugin-permission-common';
@@ -20,8 +21,14 @@ import { Validators } from '@backstage/catalog-model';
// @alpha (undocumented)
export interface CatalogAnalysisExtensionPoint {
- // (undocumented)
- addLocationAnalyzer(analyzer: ScmLocationAnalyzer): void;
+ addScmLocationAnalyzer(analyzer: ScmLocationAnalyzer): void;
+ setLocationAnalyzer(
+ analyzerOrFactory:
+ | LocationAnalyzer
+ | ((options: { scmLocationAnalyzers: ScmLocationAnalyzer[] }) => Promise<{
+ locationAnalyzer: LocationAnalyzer;
+ }>),
+ ): void;
}
// @alpha (undocumented)
diff --git a/plugins/catalog-node/api-report.md b/plugins/catalog-node/api-report.md
index a4ba95073f..7c1c8b5911 100644
--- a/plugins/catalog-node/api-report.md
+++ b/plugins/catalog-node/api-report.md
@@ -6,6 +6,8 @@
///
import { AnalyzeLocationExistingEntity } from '@backstage/plugin-catalog-common';
+import { AnalyzeLocationRequest } from '@backstage/plugin-catalog-common';
+import { AnalyzeLocationResponse } from '@backstage/plugin-catalog-common';
import { CompoundEntityRef } from '@backstage/catalog-model';
import { Entity } from '@backstage/catalog-model';
import { JsonValue } from '@backstage/types';
@@ -166,6 +168,13 @@ export type EntityRelationSpec = {
target: CompoundEntityRef;
};
+// @public (undocumented)
+export type LocationAnalyzer = {
+ analyzeLocation(
+ location: AnalyzeLocationRequest,
+ ): Promise;
+};
+
// @public @deprecated
export type LocationSpec = LocationSpec_2;
diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json
index ebfea63cef..da6a67f163 100644
--- a/plugins/catalog-node/package.json
+++ b/plugins/catalog-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-node",
- "version": "1.11.2-next.1",
+ "version": "1.12.0",
"description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend",
"backstage": {
"role": "node-library"
diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts
index 648b8c5974..7c1fe6c30d 100644
--- a/plugins/catalog-node/src/extensions.ts
+++ b/plugins/catalog-node/src/extensions.ts
@@ -22,6 +22,7 @@ import {
EntitiesSearchFilter,
EntityProvider,
PlaceholderResolver,
+ LocationAnalyzer,
ScmLocationAnalyzer,
} from '@backstage/plugin-catalog-node';
import {
@@ -79,7 +80,27 @@ export const catalogProcessingExtensionPoint =
* @alpha
*/
export interface CatalogAnalysisExtensionPoint {
- addLocationAnalyzer(analyzer: ScmLocationAnalyzer): void;
+ /**
+ * Replaces the entire location analyzer with a new one.
+ *
+ * @remarks
+ *
+ * By providing a factory function you can access all the SCM analyzers that
+ * have been added through `addScmLocationAnalyzer`. If you provide a
+ * `LocationAnalyzer` directly, the SCM analyzers will be ignored.
+ */
+ setLocationAnalyzer(
+ analyzerOrFactory:
+ | LocationAnalyzer
+ | ((options: {
+ scmLocationAnalyzers: ScmLocationAnalyzer[];
+ }) => Promise<{ locationAnalyzer: LocationAnalyzer }>),
+ ): void;
+
+ /**
+ * Adds an analyzer for a specific SCM type to the default location analyzer.
+ */
+ addScmLocationAnalyzer(analyzer: ScmLocationAnalyzer): void;
}
/**
diff --git a/plugins/catalog-node/src/processing/index.ts b/plugins/catalog-node/src/processing/index.ts
index 8cffac6961..4e83e6077d 100644
--- a/plugins/catalog-node/src/processing/index.ts
+++ b/plugins/catalog-node/src/processing/index.ts
@@ -21,5 +21,6 @@ export type {
PlaceholderResolverParams,
PlaceholderResolverRead,
PlaceholderResolverResolveUrl,
+ LocationAnalyzer,
ScmLocationAnalyzer,
} from './types';
diff --git a/plugins/catalog-node/src/processing/types.ts b/plugins/catalog-node/src/processing/types.ts
index b6785c1b91..e3d3c305fc 100644
--- a/plugins/catalog-node/src/processing/types.ts
+++ b/plugins/catalog-node/src/processing/types.ts
@@ -15,7 +15,11 @@
*/
import { Entity } from '@backstage/catalog-model';
-import { AnalyzeLocationExistingEntity } from '@backstage/plugin-catalog-common';
+import {
+ AnalyzeLocationExistingEntity,
+ AnalyzeLocationRequest,
+ AnalyzeLocationResponse,
+} from '@backstage/plugin-catalog-common';
import { JsonValue } from '@backstage/types';
import { CatalogProcessorEmit } from '../api';
@@ -52,6 +56,19 @@ export type PlaceholderResolver = (
params: PlaceholderResolverParams,
) => Promise;
+/** @public */
+export type LocationAnalyzer = {
+ /**
+ * Generates an entity configuration for given git repository. It's used for
+ * importing new component to the backstage app.
+ *
+ * @param location - Git repository to analyze and generate config for.
+ */
+ analyzeLocation(
+ location: AnalyzeLocationRequest,
+ ): Promise;
+};
+
/** @public */
export type AnalyzeOptions = {
url: string;
diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md
index 190773044a..ab6f2290ba 100644
--- a/plugins/catalog-react/CHANGELOG.md
+++ b/plugins/catalog-react/CHANGELOG.md
@@ -1,5 +1,34 @@
# @backstage/plugin-catalog-react
+## 1.12.0
+
+### Minor Changes
+
+- 8834daf: Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/catalog-client@1.6.5
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/integration-react@1.1.27
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 1.12.0-next.2
+
+### Minor Changes
+
+- 8834daf: Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+ - @backstage/integration-react@1.1.27-next.0
+
## 1.11.4-next.1
### Patch Changes
@@ -2932,8 +2961,7 @@
`CatalogPage` component in your `App.tsx` routing allows you to adjust the
layout, header, and which filters are available.
- See the documentation added on [Catalog
- Customization](https://backstage.io/docs/features/software-catalog/catalog-customization)
+ See the documentation added on [Catalog Customization](https://backstage.io/docs/features/software-catalog/catalog-customization)
for instructions.
### Patch Changes
diff --git a/plugins/catalog-react/api-report.md b/plugins/catalog-react/api-report.md
index 55064ff91f..79aad53c33 100644
--- a/plugins/catalog-react/api-report.md
+++ b/plugins/catalog-react/api-report.md
@@ -460,6 +460,7 @@ export type EntityRefLinksProps<
// @public
export interface EntityRefPresentation {
+ promise: Promise;
snapshot: EntityRefPresentationSnapshot;
update$?: Observable;
}
diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json
index 041253f223..6f0094f0c7 100644
--- a/plugins/catalog-react/package.json
+++ b/plugins/catalog-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-catalog-react",
"description": "A frontend library that helps other Backstage plugins interact with the catalog",
- "version": "1.11.4-next.1",
+ "version": "1.12.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/catalog-react/src/apis/EntityPresentationApi/EntityPresentationApi.ts b/plugins/catalog-react/src/apis/EntityPresentationApi/EntityPresentationApi.ts
index 945bce1d27..642dd6dbac 100644
--- a/plugins/catalog-react/src/apis/EntityPresentationApi/EntityPresentationApi.ts
+++ b/plugins/catalog-react/src/apis/EntityPresentationApi/EntityPresentationApi.ts
@@ -109,6 +109,10 @@ export interface EntityRefPresentation {
* elsewhere.
*/
update$?: Observable;
+ /**
+ * A promise that resolves to a usable entity presentation.
+ */
+ promise: Promise;
}
/**
diff --git a/plugins/catalog-react/src/apis/EntityPresentationApi/useEntityPresentation.ts b/plugins/catalog-react/src/apis/EntityPresentationApi/useEntityPresentation.ts
index bae3936cc8..e397558ed0 100644
--- a/plugins/catalog-react/src/apis/EntityPresentationApi/useEntityPresentation.ts
+++ b/plugins/catalog-react/src/apis/EntityPresentationApi/useEntityPresentation.ts
@@ -61,7 +61,8 @@ export function useEntityPresentation(
const presentation = useMemo(
() => {
if (!entityPresentationApi) {
- return { snapshot: defaultEntityPresentation(entityOrRef, context) };
+ const fallback = defaultEntityPresentation(entityOrRef, context);
+ return { snapshot: fallback, promise: Promise.resolve(fallback) };
}
return entityPresentationApi.forEntity(
diff --git a/plugins/catalog-react/src/components/EntityDisplayName/EntityDisplayName.test.tsx b/plugins/catalog-react/src/components/EntityDisplayName/EntityDisplayName.test.tsx
index 573cfa9011..3a3816e1e3 100644
--- a/plugins/catalog-react/src/components/EntityDisplayName/EntityDisplayName.test.tsx
+++ b/plugins/catalog-react/src/components/EntityDisplayName/EntityDisplayName.test.tsx
@@ -73,6 +73,10 @@ describe('', () => {
update$: new ObservableImpl(subscriber => {
promise.then(value => subscriber.next(value));
}),
+ promise: Promise.resolve({
+ entityRef: 'component:default/foo',
+ primaryTitle: 'foo',
+ }),
} as EntityRefPresentation);
await renderInTestApp(
diff --git a/plugins/catalog-react/src/components/EntityTable/presets.test.tsx b/plugins/catalog-react/src/components/EntityTable/presets.test.tsx
index 82075df5e9..afe4336300 100644
--- a/plugins/catalog-react/src/components/EntityTable/presets.test.tsx
+++ b/plugins/catalog-react/src/components/EntityTable/presets.test.tsx
@@ -72,7 +72,7 @@ describe('systemEntityColumns', () => {
expect(screen.getByText('my-namespace/my-system')).toBeInTheDocument();
expect(screen.getByText('my-namespace/my-domain')).toBeInTheDocument();
expect(screen.getByText('test')).toBeInTheDocument();
- expect(screen.getByText(/Some/)).toBeInTheDocument();
+ expect(screen.queryAllByText(/Some/)).not.toHaveLength(0);
});
});
});
@@ -126,7 +126,7 @@ describe('componentEntityColumns', () => {
expect(screen.getByText('test')).toBeInTheDocument();
expect(screen.getByText('production')).toBeInTheDocument();
expect(screen.getByText('service')).toBeInTheDocument();
- expect(screen.getByText(/Some/)).toBeInTheDocument();
+ expect(screen.queryAllByText(/Some/)).not.toHaveLength(0);
});
});
});
diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md
index 06d4344889..989a852b55 100644
--- a/plugins/catalog-unprocessed-entities/CHANGELOG.md
+++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-catalog-unprocessed-entities
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+
## 0.2.4-next.1
### Patch Changes
diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json
index eb35eae31e..059dc8802b 100644
--- a/plugins/catalog-unprocessed-entities/package.json
+++ b/plugins/catalog-unprocessed-entities/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-unprocessed-entities",
- "version": "0.2.4-next.1",
+ "version": "0.2.4",
"backstage": {
"role": "frontend-plugin"
},
diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md
index 300083da1c..b2d036e914 100644
--- a/plugins/catalog/CHANGELOG.md
+++ b/plugins/catalog/CHANGELOG.md
@@ -1,5 +1,45 @@
# @backstage/plugin-catalog
+## 1.20.0
+
+### Minor Changes
+
+- 8834daf: Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context.
+
+### Patch Changes
+
+- 131e5cb: Fix broken links in README.
+- 5d99272: Update local development dependencies.
+- 4118530: Avoiding pre-loading display total count undefined for table counts
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.2
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/catalog-client@1.6.5
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/integration-react@1.1.27
+ - @backstage/plugin-catalog-common@1.0.23
+ - @backstage/plugin-search-react@1.7.11
+
+## 1.20.0-next.2
+
+### Minor Changes
+
+- 8834daf: Updated the presentation API to return a promise, in addition to the snapshot and observable that were there before. This makes it much easier to consume the API in a non-React context.
+
+### Patch Changes
+
+- 4118530: Avoiding pre-loading display total count undefined for table counts
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+ - @backstage/plugin-search-react@1.7.11-next.1
+ - @backstage/integration-react@1.1.27-next.0
+
## 1.19.1-next.1
### Patch Changes
@@ -3344,8 +3384,7 @@
`CatalogPage` component in your `App.tsx` routing allows you to adjust the
layout, header, and which filters are available.
- See the documentation added on [Catalog
- Customization](https://backstage.io/docs/features/software-catalog/catalog-customization)
+ See the documentation added on [Catalog Customization](https://backstage.io/docs/features/software-catalog/catalog-customization)
for instructions.
### Patch Changes
diff --git a/plugins/catalog/README.md b/plugins/catalog/README.md
index 1ce7b2bf69..9375c14a4a 100644
--- a/plugins/catalog/README.md
+++ b/plugins/catalog/README.md
@@ -1,7 +1,6 @@
# Backstage Catalog Frontend
-This is the React frontend for the default Backstage [software
-catalog](http://backstage.io/docs/features/software-catalog/).
+This is the React frontend for the default Backstage [software catalog](http://backstage.io/docs/features/software-catalog/).
This package supplies interfaces related to listing catalog entities or showing
more information about them on entity pages.
diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json
index 207717e1c9..bad4466146 100644
--- a/plugins/catalog/package.json
+++ b/plugins/catalog/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog",
- "version": "1.19.1-next.1",
+ "version": "1.20.0",
"description": "The Backstage plugin for browsing the Backstage catalog",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts
index 42ff777cbd..4cc4d79f52 100644
--- a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts
+++ b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.test.ts
@@ -23,10 +23,11 @@ import {
import { DefaultEntityPresentationApi } from './DefaultEntityPresentationApi';
describe('DefaultEntityPresentationApi', () => {
- it('works in local mode', () => {
+ it('works in local mode', async () => {
const api = DefaultEntityPresentationApi.createLocal();
- expect(api.forEntity('component:default/test')).toEqual({
+ let presentation = api.forEntity('component:default/test');
+ expect(presentation).toEqual({
snapshot: {
entityRef: 'component:default/test',
entity: undefined,
@@ -35,11 +36,14 @@ describe('DefaultEntityPresentationApi', () => {
Icon: expect.anything(),
},
update$: undefined,
+ promise: expect.any(Promise),
});
+ await expect(presentation.promise).resolves.toEqual(presentation.snapshot);
- expect(
- api.forEntity('component:default/test', { defaultKind: 'Other' }),
- ).toEqual({
+ presentation = api.forEntity('component:default/test', {
+ defaultKind: 'Other',
+ });
+ expect(presentation).toEqual({
snapshot: {
entityRef: 'component:default/test',
entity: undefined,
@@ -48,13 +52,14 @@ describe('DefaultEntityPresentationApi', () => {
Icon: expect.anything(),
},
update$: undefined,
+ promise: expect.any(Promise),
});
+ await expect(presentation.promise).resolves.toEqual(presentation.snapshot);
- expect(
- api.forEntity('component:default/test', {
- defaultNamespace: 'other',
- }),
- ).toEqual({
+ presentation = api.forEntity('component:default/test', {
+ defaultNamespace: 'other',
+ });
+ expect(presentation).toEqual({
snapshot: {
entityRef: 'component:default/test',
entity: undefined,
@@ -63,7 +68,9 @@ describe('DefaultEntityPresentationApi', () => {
Icon: expect.anything(),
},
update$: undefined,
+ promise: expect.any(Promise),
});
+ await expect(presentation.promise).resolves.toEqual(presentation.snapshot);
const entity: Entity = {
apiVersion: 'backstage.io/v1alpha1',
@@ -77,7 +84,8 @@ describe('DefaultEntityPresentationApi', () => {
},
};
- expect(api.forEntity(entity)).toEqual({
+ presentation = api.forEntity(entity);
+ expect(presentation).toEqual({
snapshot: {
entityRef: 'component:default/test',
primaryTitle: 'test',
@@ -85,7 +93,9 @@ describe('DefaultEntityPresentationApi', () => {
Icon: expect.anything(),
},
update$: undefined,
+ promise: expect.any(Promise),
});
+ await expect(presentation.promise).resolves.toEqual(presentation.snapshot);
});
it('works in catalog mode', async () => {
@@ -114,34 +124,38 @@ describe('DefaultEntityPresentationApi', () => {
});
// return simple presentation, call catalog, return full presentation
- await expect(
- consumePresentation(api.forEntity('component:default/test')),
- ).resolves.toEqual([
+ let presentation = api.forEntity('component:default/test');
+ let expected: EntityRefPresentationSnapshot = {
+ entityRef: 'component:default/test',
+ primaryTitle: 'test',
+ secondaryTitle: 'component:default/test | service',
+ Icon: expect.anything(),
+ };
+ await expect(consumePresentation(presentation)).resolves.toEqual([
+ // first the dummy snapshot
{
entityRef: 'component:default/test',
primaryTitle: 'test',
secondaryTitle: 'component:default/test',
Icon: expect.anything(),
},
- {
- entityRef: 'component:default/test',
- primaryTitle: 'test',
- secondaryTitle: 'component:default/test | service',
- Icon: expect.anything(),
- },
+ expected,
]);
+ await expect(presentation.promise).resolves.toEqual(expected);
// use cached entity, immediately return full presentation
- await expect(
- consumePresentation(api.forEntity('component:default/test')),
- ).resolves.toEqual([
- {
- entityRef: 'component:default/test',
- primaryTitle: 'test',
- secondaryTitle: 'component:default/test | service',
- Icon: expect.anything(),
- },
+ presentation = api.forEntity('component:default/test');
+ expected = {
+ entityRef: 'component:default/test',
+ primaryTitle: 'test',
+ secondaryTitle: 'component:default/test | service',
+ Icon: expect.anything(),
+ };
+ expect(presentation.snapshot).toEqual(expected);
+ await expect(consumePresentation(presentation)).resolves.toEqual([
+ expected,
]);
+ await expect(presentation.promise).resolves.toEqual(presentation.snapshot);
expect(catalogApi.getEntitiesByRefs).toHaveBeenCalledTimes(1);
expect(catalogApi.getEntitiesByRefs).toHaveBeenCalledWith(
diff --git a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts
index 82862be435..1955763d3d 100644
--- a/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts
+++ b/plugins/catalog/src/apis/EntityPresentationApi/DefaultEntityPresentationApi.ts
@@ -260,47 +260,65 @@ export class DefaultEntityPresentationApi implements EntityPresentationApi {
};
}
- // And then the following snapshot
- const observable = !needsLoad
- ? undefined
- : new ObservableImpl(subscriber => {
- let aborted = false;
+ if (!needsLoad) {
+ return {
+ snapshot: initialSnapshot,
+ promise: Promise.resolve(initialSnapshot),
+ };
+ }
- Promise.resolve()
- .then(() => this.#loader?.load(entityRef))
- .then(newEntity => {
- if (
- !aborted &&
- newEntity &&
- newEntity.metadata.etag !== entity?.metadata.etag
- ) {
- const updatedSnapshot = render({
- loading: false,
- entity: newEntity,
- });
- subscriber.next(updatedSnapshot);
- }
- })
- .catch(() => {
- // Intentionally ignored - we do not propagate errors to the
- // observable here. The presentation API should be error free and
- // always return SOMETHING that makes sense to render, and we have
- // already ensured above that the initial snapshot was that.
- })
- .finally(() => {
- if (!aborted) {
- subscriber.complete();
- }
- });
-
- return () => {
- aborted = true;
- };
+ // Load the entity and render it
+ const maybeUpdatedSnapshot = Promise.resolve()
+ .then(() => {
+ return this.#loader?.load(entityRef);
+ })
+ .then(newEntity => {
+ // We re-render no matter if we get back a new entity or the old
+ // one or nothing, because of the now false loading state - in
+ // case the renderer outputs different data depending on that
+ return render({
+ loading: false,
+ entity: newEntity ?? entity,
});
+ })
+ .catch(() => {
+ // Intentionally ignored - we do not propagate errors to the
+ // caller here. The presentation API should be error free and
+ // always return SOMETHING that makes sense to render, and we have
+ // already ensured above that the initial snapshot was that.
+ return undefined;
+ });
+
+ const observable = new ObservableImpl(
+ subscriber => {
+ let aborted = false;
+
+ maybeUpdatedSnapshot
+ .then(updatedSnapshot => {
+ if (updatedSnapshot) {
+ subscriber.next(updatedSnapshot);
+ }
+ })
+ .finally(() => {
+ if (!aborted) {
+ subscriber.complete();
+ }
+ });
+
+ return () => {
+ aborted = true;
+ };
+ },
+ );
+
+ const promise = maybeUpdatedSnapshot.then(updatedSnapshot => {
+ return updatedSnapshot ?? initialSnapshot;
+ });
return {
snapshot: initialSnapshot,
update$: observable,
+ promise: promise,
};
}
diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md
index 792691f33d..4d6609477c 100644
--- a/plugins/config-schema/CHANGELOG.md
+++ b/plugins/config-schema/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-config-schema
+## 0.1.55
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+
## 0.1.55-next.1
### Patch Changes
diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json
index 19f2401602..bbf1e786a1 100644
--- a/plugins/config-schema/package.json
+++ b/plugins/config-schema/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-config-schema",
- "version": "0.1.55-next.1",
+ "version": "0.1.55",
"description": "A Backstage plugin that lets you browse the configuration schema of your app",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md
index 1d4247cb9f..902a43c880 100644
--- a/plugins/devtools-backend/CHANGELOG.md
+++ b/plugins/devtools-backend/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-devtools-backend
+## 0.3.4
+
+### Patch Changes
+
+- 036feca: Added discovery property to the readme documentation to ensure that it will build when setting it up as new to a Backstage instance
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-permission-node@0.7.29
+
+## 0.3.4-next.2
+
+### Patch Changes
+
+- 036feca: Added discovery property to the readme documentation to ensure that it will build when setting it up as new to a Backstage instance
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.3.4-next.1
### Patch Changes
diff --git a/plugins/devtools-backend/README.md b/plugins/devtools-backend/README.md
index 4439c8cd9f..bf0eb64a98 100644
--- a/plugins/devtools-backend/README.md
+++ b/plugins/devtools-backend/README.md
@@ -28,6 +28,7 @@ Here's how to get the DevTools Backend up and running:
logger: env.logger,
config: env.config,
permissions: env.permissions,
+ discovery: env.discovery,
});
}
```
diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json
index e9c6f48b49..00d8df80ae 100644
--- a/plugins/devtools-backend/package.json
+++ b/plugins/devtools-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-devtools-backend",
- "version": "0.3.4-next.1",
+ "version": "0.3.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md
index b618417ce0..ee7fd659bb 100644
--- a/plugins/devtools/CHANGELOG.md
+++ b/plugins/devtools/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-devtools
+## 0.1.14
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/frontend-plugin-api@0.6.5
+
## 0.1.14-next.1
### Patch Changes
diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json
index 64b3626546..c711d941c6 100644
--- a/plugins/devtools/package.json
+++ b/plugins/devtools/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-devtools",
- "version": "0.1.14-next.1",
+ "version": "0.1.14",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md
index 498f89b6fa..1398d95e4a 100644
--- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md
+++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-events-backend-module-aws-sqs
+## 0.3.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-events-node@0.3.4
+
## 0.3.4-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json
index ab33e2c451..0e889a2f8e 100644
--- a/plugins/events-backend-module-aws-sqs/package.json
+++ b/plugins/events-backend-module-aws-sqs/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-aws-sqs",
- "version": "0.3.4-next.1",
+ "version": "0.3.4",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md
index 1fbb360beb..d9c8e91140 100644
--- a/plugins/events-backend-module-azure/CHANGELOG.md
+++ b/plugins/events-backend-module-azure/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-azure
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+
## 0.2.4-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json
index f7ade8b3a2..9264fe2374 100644
--- a/plugins/events-backend-module-azure/package.json
+++ b/plugins/events-backend-module-azure/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-azure",
- "version": "0.2.4-next.1",
+ "version": "0.2.4",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md
index b649c38b5b..b2734012c0 100644
--- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md
+++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-bitbucket-cloud
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+
## 0.2.4-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json
index baed6171fd..5dc4d0147a 100644
--- a/plugins/events-backend-module-bitbucket-cloud/package.json
+++ b/plugins/events-backend-module-bitbucket-cloud/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-bitbucket-cloud",
- "version": "0.2.4-next.1",
+ "version": "0.2.4",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md
index 57c6390296..5a1134e692 100644
--- a/plugins/events-backend-module-gerrit/CHANGELOG.md
+++ b/plugins/events-backend-module-gerrit/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-gerrit
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+
## 0.2.4-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json
index b3f8161604..61d0fafd53 100644
--- a/plugins/events-backend-module-gerrit/package.json
+++ b/plugins/events-backend-module-gerrit/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-gerrit",
- "version": "0.2.4-next.1",
+ "version": "0.2.4",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md
index ae5ee59263..88b0b1634d 100644
--- a/plugins/events-backend-module-github/CHANGELOG.md
+++ b/plugins/events-backend-module-github/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-github
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+
## 0.2.4-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json
index 9fb876f714..d234a7e01b 100644
--- a/plugins/events-backend-module-github/package.json
+++ b/plugins/events-backend-module-github/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-github",
- "version": "0.2.4-next.1",
+ "version": "0.2.4",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md
index 73c4c7e281..b6bb80f18f 100644
--- a/plugins/events-backend-module-gitlab/CHANGELOG.md
+++ b/plugins/events-backend-module-gitlab/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-events-backend-module-gitlab
+## 0.2.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+
## 0.2.4-next.1
### Patch Changes
diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json
index e10b26736f..f793455a5d 100644
--- a/plugins/events-backend-module-gitlab/package.json
+++ b/plugins/events-backend-module-gitlab/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-module-gitlab",
- "version": "0.2.4-next.1",
+ "version": "0.2.4",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md
index f5ba8b9609..eeb52a1d29 100644
--- a/plugins/events-backend-test-utils/CHANGELOG.md
+++ b/plugins/events-backend-test-utils/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-events-backend-test-utils
+## 0.1.28
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.3.4
+
## 0.1.28-next.1
### Patch Changes
diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json
index f766130efc..b96b7afe7f 100644
--- a/plugins/events-backend-test-utils/package.json
+++ b/plugins/events-backend-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend-test-utils",
- "version": "0.1.28-next.1",
+ "version": "0.1.28",
"description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node",
"backstage": {
"role": "node-library"
diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md
index 1bb33b6db1..0862263896 100644
--- a/plugins/events-backend/CHANGELOG.md
+++ b/plugins/events-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-events-backend
+## 0.3.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+
## 0.3.5-next.1
### Patch Changes
diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json
index dc36a33d07..1cd3f909cc 100644
--- a/plugins/events-backend/package.json
+++ b/plugins/events-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-backend",
- "version": "0.3.5-next.1",
+ "version": "0.3.5",
"backstage": {
"role": "backend-plugin"
},
diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md
index 185da613eb..5b907547d8 100644
--- a/plugins/events-node/CHANGELOG.md
+++ b/plugins/events-node/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/plugin-events-node
+## 0.3.4
+
+### Patch Changes
+
+- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+
+## 0.3.4-next.2
+
+### Patch Changes
+
+- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used
+
## 0.3.4-next.1
### Patch Changes
diff --git a/plugins/events-node/api-report.md b/plugins/events-node/api-report.md
index 9574d6c098..46646d2ce8 100644
--- a/plugins/events-node/api-report.md
+++ b/plugins/events-node/api-report.md
@@ -4,6 +4,7 @@
```ts
import { LoggerService } from '@backstage/backend-plugin-api';
+import { ServiceFactory } from '@backstage/backend-plugin-api';
import { ServiceRef } from '@backstage/backend-plugin-api';
// @public
@@ -61,6 +62,12 @@ export interface EventsService {
// @public (undocumented)
export type EventsServiceEventHandler = (params: EventParams) => Promise;
+// @public (undocumented)
+export const eventsServiceFactory: () => ServiceFactory<
+ EventsService,
+ 'plugin'
+>;
+
// @public
export const eventsServiceRef: ServiceRef;
diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json
index 7312950a99..c082da2eab 100644
--- a/plugins/events-node/package.json
+++ b/plugins/events-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-events-node",
- "version": "0.3.4-next.1",
+ "version": "0.3.4",
"description": "The plugin-events-node module for @backstage/plugin-events-backend",
"backstage": {
"role": "node-library"
diff --git a/plugins/events-node/src/index.ts b/plugins/events-node/src/index.ts
index 2bd93a8aea..643ba7f79e 100644
--- a/plugins/events-node/src/index.ts
+++ b/plugins/events-node/src/index.ts
@@ -22,4 +22,4 @@
export * from './api';
export * from './deprecated';
-export { eventsServiceRef } from './service';
+export { eventsServiceRef, eventsServiceFactory } from './service';
diff --git a/plugins/events-node/src/service.ts b/plugins/events-node/src/service.ts
index e1d3047fca..af0e562c80 100644
--- a/plugins/events-node/src/service.ts
+++ b/plugins/events-node/src/service.ts
@@ -30,18 +30,19 @@ import { EventsService, DefaultEventsService } from './api';
export const eventsServiceRef = createServiceRef({
id: 'events.service',
scope: 'plugin',
- defaultFactory: async service =>
- createServiceFactory({
- service,
- deps: {
- pluginMetadata: coreServices.pluginMetadata,
- rootLogger: coreServices.rootLogger,
- },
- async createRootContext({ rootLogger }) {
- return DefaultEventsService.create({ logger: rootLogger });
- },
- async factory({ pluginMetadata }, eventsService) {
- return eventsService.forPlugin(pluginMetadata.getId());
- },
- }),
+});
+
+/** @public */
+export const eventsServiceFactory = createServiceFactory({
+ service: eventsServiceRef,
+ deps: {
+ pluginMetadata: coreServices.pluginMetadata,
+ rootLogger: coreServices.rootLogger,
+ },
+ async createRootContext({ rootLogger }) {
+ return DefaultEventsService.create({ logger: rootLogger });
+ },
+ async factory({ pluginMetadata }, eventsService) {
+ return eventsService.forPlugin(pluginMetadata.getId());
+ },
});
diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md
index 2d6dee39e2..d152236a11 100644
--- a/plugins/example-todo-list-backend/CHANGELOG.md
+++ b/plugins/example-todo-list-backend/CHANGELOG.md
@@ -1,5 +1,14 @@
# @internal/plugin-todo-list-backend
+## 1.0.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 1.0.27-next.1
### Patch Changes
diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json
index cd45af6d37..15a9d16ee9 100644
--- a/plugins/example-todo-list-backend/package.json
+++ b/plugins/example-todo-list-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@internal/plugin-todo-list-backend",
- "version": "1.0.27-next.1",
+ "version": "1.0.27",
"backstage": {
"role": "backend-plugin"
},
diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md
index 0962426ac3..a86ffe7c60 100644
--- a/plugins/example-todo-list/CHANGELOG.md
+++ b/plugins/example-todo-list/CHANGELOG.md
@@ -1,5 +1,12 @@
# @internal/plugin-todo-list
+## 1.0.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+
## 1.0.27-next.1
### Patch Changes
diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json
index 849b96433a..4bd01f6e32 100644
--- a/plugins/example-todo-list/package.json
+++ b/plugins/example-todo-list/package.json
@@ -1,6 +1,6 @@
{
"name": "@internal/plugin-todo-list",
- "version": "1.0.27-next.1",
+ "version": "1.0.27",
"backstage": {
"role": "frontend-plugin"
},
diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md
index b1f8f6793e..6013cad734 100644
--- a/plugins/home-react/CHANGELOG.md
+++ b/plugins/home-react/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-home-react
+## 0.1.13
+
+### Patch Changes
+
+- 0040ec2: Updated dependency `@rjsf/utils` to `5.18.2`.
+ Updated dependency `@rjsf/core` to `5.18.2`.
+ Updated dependency `@rjsf/material-ui` to `5.18.2`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.18.2`.
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+
## 0.1.13-next.1
### Patch Changes
diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json
index bb04ce8211..3853ef0f85 100644
--- a/plugins/home-react/package.json
+++ b/plugins/home-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-home-react",
- "version": "0.1.13-next.1",
+ "version": "0.1.13",
"description": "A Backstage plugin that contains react components helps you build a home page",
"backstage": {
"role": "web-library"
diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md
index 565d82f395..9543096cd0 100644
--- a/plugins/home/CHANGELOG.md
+++ b/plugins/home/CHANGELOG.md
@@ -1,5 +1,35 @@
# @backstage/plugin-home
+## 0.7.4
+
+### Patch Changes
+
+- 2196d3e: Use relative time when displaying visits from the same day
+- 0040ec2: Updated dependency `@rjsf/utils` to `5.18.2`.
+ Updated dependency `@rjsf/core` to `5.18.2`.
+ Updated dependency `@rjsf/material-ui` to `5.18.2`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.18.2`.
+- Updated dependencies
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/theme@0.5.4
+ - @backstage/plugin-home-react@0.1.13
+ - @backstage/core-app-api@1.12.5
+ - @backstage/catalog-client@1.6.5
+ - @backstage/frontend-plugin-api@0.6.5
+
+## 0.7.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+
## 0.7.4-next.1
### Patch Changes
diff --git a/plugins/home/package.json b/plugins/home/package.json
index 0058c35e00..79003a2ad7 100644
--- a/plugins/home/package.json
+++ b/plugins/home/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-home",
- "version": "0.7.4-next.1",
+ "version": "0.7.4",
"description": "A Backstage plugin that helps you build a home page",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md
index a1000aea2c..bc447b62e0 100644
--- a/plugins/kubernetes-backend/CHANGELOG.md
+++ b/plugins/kubernetes-backend/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-kubernetes-backend
+## 0.17.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-kubernetes-common@0.7.6
+ - @backstage/plugin-kubernetes-node@0.1.12
+ - @backstage/plugin-permission-node@0.7.29
+
+## 0.17.1-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.17.1-next.1
### Patch Changes
diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json
index a8634d8855..7589a453a7 100644
--- a/plugins/kubernetes-backend/package.json
+++ b/plugins/kubernetes-backend/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-kubernetes-backend",
"description": "A Backstage backend plugin that integrates towards Kubernetes",
- "version": "0.17.1-next.1",
+ "version": "0.17.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md
index 8ebfd45d77..aad774818d 100644
--- a/plugins/kubernetes-cluster/CHANGELOG.md
+++ b/plugins/kubernetes-cluster/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-kubernetes-cluster
+## 0.0.11
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/plugin-kubernetes-react@0.3.5
+ - @backstage/plugin-kubernetes-common@0.7.6
+
+## 0.0.11-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+
## 0.0.11-next.1
### Patch Changes
diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json
index 1402c79951..db9d08b5d7 100644
--- a/plugins/kubernetes-cluster/package.json
+++ b/plugins/kubernetes-cluster/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-kubernetes-cluster",
- "version": "0.0.11-next.1",
+ "version": "0.0.11",
"description": "A Backstage plugin that shows details of Kubernetes clusters",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md
index 55f3485ff4..778364af1b 100644
--- a/plugins/kubernetes-common/CHANGELOG.md
+++ b/plugins/kubernetes-common/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/plugin-kubernetes-common
+## 0.7.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+
## 0.7.6-next.0
### Patch Changes
diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json
index 77201e4fbf..f3bba8b855 100644
--- a/plugins/kubernetes-common/package.json
+++ b/plugins/kubernetes-common/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-kubernetes-common",
- "version": "0.7.6-next.0",
+ "version": "0.7.6",
"description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin",
"backstage": {
"role": "common-library"
diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md
index 89c7a58526..730d43b95c 100644
--- a/plugins/kubernetes-node/CHANGELOG.md
+++ b/plugins/kubernetes-node/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-kubernetes-node
+## 0.1.12
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-kubernetes-common@0.7.6
+
## 0.1.12-next.1
### Patch Changes
diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json
index 79e304671a..dbe0a35d44 100644
--- a/plugins/kubernetes-node/package.json
+++ b/plugins/kubernetes-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-kubernetes-node",
- "version": "0.1.12-next.1",
+ "version": "0.1.12",
"description": "Node.js library for the kubernetes plugin",
"backstage": {
"role": "node-library"
diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md
index e05d103ad6..76abb6a50a 100644
--- a/plugins/kubernetes-react/CHANGELOG.md
+++ b/plugins/kubernetes-react/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-kubernetes-react
+## 0.3.5
+
+### Patch Changes
+
+- 3102a99: add the namespace label to CronJobDrawer & IngressDrawer.
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-kubernetes-common@0.7.6
+
## 0.3.5-next.1
### Patch Changes
diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json
index 7ff42ab26c..0991845ebd 100644
--- a/plugins/kubernetes-react/package.json
+++ b/plugins/kubernetes-react/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-kubernetes-react",
"description": "Web library for the kubernetes-react plugin",
- "version": "0.3.5-next.1",
+ "version": "0.3.5",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md
index de0f70736a..abd18e5e21 100644
--- a/plugins/kubernetes/CHANGELOG.md
+++ b/plugins/kubernetes/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-kubernetes
+## 0.11.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/plugin-kubernetes-react@0.3.5
+ - @backstage/plugin-kubernetes-common@0.7.6
+
+## 0.11.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+
## 0.11.10-next.1
### Patch Changes
diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json
index e75d503558..fd02de4137 100644
--- a/plugins/kubernetes/package.json
+++ b/plugins/kubernetes/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-kubernetes",
"description": "A Backstage plugin that integrates towards Kubernetes",
- "version": "0.11.10-next.1",
+ "version": "0.11.10",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md
index 065f8cb533..41bb1d2d9e 100644
--- a/plugins/notifications-backend-module-email/CHANGELOG.md
+++ b/plugins/notifications-backend-module-email/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-notifications-backend-module-email
+## 0.0.1
+
+### Patch Changes
+
+- d541ff6: Fixed email processor `esm` issue and config reading
+- e538b10: Support relative links in notifications sent via email
+- dbf2696: Allow sending notifications by email with the new notifications module
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/plugin-notifications-node@0.1.4
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/catalog-client@1.6.5
+
+## 0.0.1-next.1
+
+### Patch Changes
+
+- d541ff6: Fixed email processor `esm` issue and config reading
+- e538b10: Support relative links in notifications sent via email
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.0.1-next.0
### Patch Changes
diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json
index bb99d9cb97..892c8c9156 100644
--- a/plugins/notifications-backend-module-email/package.json
+++ b/plugins/notifications-backend-module-email/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-notifications-backend-module-email",
- "version": "0.0.1-next.0",
+ "version": "0.0.1",
"description": "The email backend module for the notifications plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md
index 389fa25f61..26762f5b2a 100644
--- a/plugins/notifications-backend/CHANGELOG.md
+++ b/plugins/notifications-backend/CHANGELOG.md
@@ -1,5 +1,33 @@
# @backstage/plugin-notifications-backend
+## 0.2.1
+
+### Patch Changes
+
+- d541ff6: Fixed email processor `esm` issue and config reading
+- 295c05d: Support for filtering entities from notification recipients after resolving them from the recipients
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- cba628a: Add possibility to generate random notifications on the fly in local development
+- ee09dfc: Updated documentation for sending messages by external services.
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/plugin-notifications-node@0.1.4
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+ - @backstage/plugin-auth-node@0.4.13
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-signals-node@0.1.4
+
+## 0.2.1-next.2
+
+### Patch Changes
+
+- d541ff6: Fixed email processor `esm` issue and config reading
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+
## 0.2.1-next.1
### Patch Changes
diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json
index 9f7f427895..6e6c0e04cb 100644
--- a/plugins/notifications-backend/package.json
+++ b/plugins/notifications-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-notifications-backend",
- "version": "0.2.1-next.1",
+ "version": "0.2.1",
"backstage": {
"role": "backend-plugin"
},
diff --git a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts
index ae548a9892..f4bd25d1ba 100644
--- a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts
+++ b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts
@@ -13,10 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import {
- PluginDatabaseManager,
- resolvePackagePath,
-} from '@backstage/backend-common';
+import { PluginDatabaseManager } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import {
NotificationGetOptions,
NotificationModifyOptions,
diff --git a/plugins/notifications-node/CHANGELOG.md b/plugins/notifications-node/CHANGELOG.md
index 2b6321a3f8..86813090da 100644
--- a/plugins/notifications-node/CHANGELOG.md
+++ b/plugins/notifications-node/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-notifications-node
+## 0.1.4
+
+### Patch Changes
+
+- 295c05d: Support for filtering entities from notification recipients after resolving them from the recipients
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-signals-node@0.1.4
+
## 0.1.4-next.1
### Patch Changes
diff --git a/plugins/notifications-node/package.json b/plugins/notifications-node/package.json
index 1abfcc07ba..9f764c732b 100644
--- a/plugins/notifications-node/package.json
+++ b/plugins/notifications-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-notifications-node",
- "version": "0.1.4-next.1",
+ "version": "0.1.4",
"description": "Node.js library for the notifications plugin",
"backstage": {
"role": "node-library"
diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md
index 78c8c96f1d..278ac77062 100644
--- a/plugins/notifications/CHANGELOG.md
+++ b/plugins/notifications/CHANGELOG.md
@@ -1,5 +1,32 @@
# @backstage/plugin-notifications
+## 0.2.1
+
+### Patch Changes
+
+- e6bf85f: Allow overriding `NotificationsPage` page properties
+- f730c0b: The user can newly mark all unread messages as read at one click.
+- bfcb2f1: Allow showing notifications as snackbars in the UI
+- e49a810: Show all notifications by default to match the sidebar item status
+- 42eaf63: Increase default and allow modifying notification snackbar auto hide duration
+- a42a19b: Empty descriptions are not rendered to improve the look&feel.
+- 1bc3b86: Fix to show web notifications even when browser is on foreground. Fix duplicate notifications with multiple tabs.
+- f793112: Allow defining `className` and additional properties for `NotificationsSideBarItem`
+- e1c7d6e: Fix infinite loop in the notification title counter
+- fcda449: The rendered size of a notification is limited for very long descriptions.
+- f6633ca: Add option to set the notification as read automatically when the notification link is opened
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/theme@0.5.4
+
+## 0.2.1-next.2
+
+### Patch Changes
+
+- 42eaf63: Increase default and allow modifying notification snackbar auto hide duration
+- Updated dependencies
+ - @backstage/core-components@0.14.7-next.2
+
## 0.2.1-next.1
### Patch Changes
diff --git a/plugins/notifications/api-report.md b/plugins/notifications/api-report.md
index 3699aa1bb0..9240bdb1c2 100644
--- a/plugins/notifications/api-report.md
+++ b/plugins/notifications/api-report.md
@@ -102,6 +102,7 @@ export const NotificationsSidebarItem: (props?: {
webNotificationsEnabled?: boolean;
titleCounterEnabled?: boolean;
snackbarEnabled?: boolean;
+ snackbarAutoHideDuration?: number | null;
className?: string;
icon?: IconComponent;
text?: string;
diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json
index bdc96a921b..8307103942 100644
--- a/plugins/notifications/package.json
+++ b/plugins/notifications/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-notifications",
- "version": "0.2.1-next.1",
+ "version": "0.2.1",
"backstage": {
"role": "frontend-plugin"
},
diff --git a/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx b/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx
index d1dde185f2..ef1fda0407 100644
--- a/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx
+++ b/plugins/notifications/src/components/NotificationsPage/NotificationsPage.tsx
@@ -71,7 +71,7 @@ export const NotificationsPage = (props?: NotificationsPageProps) => {
const [pageNumber, setPageNumber] = React.useState(0);
const [pageSize, setPageSize] = React.useState(5);
const [containsText, setContainsText] = React.useState();
- const [createdAfter, setCreatedAfter] = React.useState('lastWeek');
+ const [createdAfter, setCreatedAfter] = React.useState('all');
const [sorting, setSorting] = React.useState(
SortByOptions.newest.sortBy,
);
diff --git a/plugins/notifications/src/components/NotificationsSideBarItem/NotificationsSideBarItem.tsx b/plugins/notifications/src/components/NotificationsSideBarItem/NotificationsSideBarItem.tsx
index 000eabcae6..7b55c63747 100644
--- a/plugins/notifications/src/components/NotificationsSideBarItem/NotificationsSideBarItem.tsx
+++ b/plugins/notifications/src/components/NotificationsSideBarItem/NotificationsSideBarItem.tsx
@@ -83,6 +83,7 @@ export const NotificationsSidebarItem = (props?: {
webNotificationsEnabled?: boolean;
titleCounterEnabled?: boolean;
snackbarEnabled?: boolean;
+ snackbarAutoHideDuration?: number | null;
className?: string;
icon?: IconComponent;
text?: string;
@@ -93,6 +94,7 @@ export const NotificationsSidebarItem = (props?: {
webNotificationsEnabled = false,
titleCounterEnabled = true,
snackbarEnabled = true,
+ snackbarAutoHideDuration = 10000,
icon = NotificationsIcon,
text = 'Notifications',
...restProps
@@ -100,6 +102,7 @@ export const NotificationsSidebarItem = (props?: {
webNotificationsEnabled: false,
titleCounterEnabled: true,
snackbarEnabled: true,
+ snackbarAutoHideDuration: 10000,
};
const { loading, error, value, retry } = useNotificationsApi(api =>
@@ -196,6 +199,7 @@ export const NotificationsSidebarItem = (props?: {
variant: notification.payload.severity,
anchorOrigin: { vertical: 'bottom', horizontal: 'right' },
action,
+ autoHideDuration: snackbarAutoHideDuration,
} as OptionsWithExtraProps);
}
})
@@ -216,6 +220,7 @@ export const NotificationsSidebarItem = (props?: {
sendWebNotification,
webNotificationsEnabled,
snackbarEnabled,
+ snackbarAutoHideDuration,
notificationsApi,
alertApi,
getSnackbarProperties,
diff --git a/plugins/notifications/src/components/NotificationsTable/NotificationsTable.tsx b/plugins/notifications/src/components/NotificationsTable/NotificationsTable.tsx
index db2b351432..72a27975f6 100644
--- a/plugins/notifications/src/components/NotificationsTable/NotificationsTable.tsx
+++ b/plugins/notifications/src/components/NotificationsTable/NotificationsTable.tsx
@@ -43,7 +43,7 @@ const ThrottleDelayMs = 1000;
const useStyles = makeStyles({
description: {
maxHeight: '5rem',
- overflow: 'scroll',
+ overflow: 'auto',
},
severityItem: {
alignContent: 'center',
diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md
index 2ad74d1db0..853a4e76e3 100644
--- a/plugins/org-react/CHANGELOG.md
+++ b/plugins/org-react/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-org-react
+## 0.1.24
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/catalog-client@1.6.5
+
+## 0.1.24-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+
## 0.1.24-next.1
### Patch Changes
diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json
index 0567691a3b..dd9bc64f5a 100644
--- a/plugins/org-react/package.json
+++ b/plugins/org-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-org-react",
- "version": "0.1.24-next.1",
+ "version": "0.1.24",
"backstage": {
"role": "web-library"
},
diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md
index 3d2bedca68..885f03cb3d 100644
--- a/plugins/org/CHANGELOG.md
+++ b/plugins/org/CHANGELOG.md
@@ -1,5 +1,29 @@
# @backstage/plugin-org
+## 0.6.25
+
+### Patch Changes
+
+- 99e6105: Fix ownership card sometimes locking up for complex org structures
+- Updated dependencies
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.6.25-next.2
+
+### Patch Changes
+
+- 99e6105: Fix ownership card sometimes locking up for complex org structures
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+
## 0.6.25-next.1
### Patch Changes
diff --git a/plugins/org/package.json b/plugins/org/package.json
index b00e6f2bb2..5c9580ee0b 100644
--- a/plugins/org/package.json
+++ b/plugins/org/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-org",
- "version": "0.6.25-next.1",
+ "version": "0.6.25",
"description": "A Backstage plugin that helps you create entity pages for your organization",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts b/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts
index e7c1f132c3..5a708bcfee 100644
--- a/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts
+++ b/plugins/org/src/components/Cards/OwnershipCard/useGetEntities.ts
@@ -34,7 +34,7 @@ import qs from 'qs';
import { EntityRelationAggregation } from '../types';
import { uniq } from 'lodash';
-const limiter = limiterFactory(10);
+const limiter = limiterFactory(5);
type EntityTypeProps = {
kind: string;
@@ -92,10 +92,12 @@ const getChildOwnershipEntityRefs = async (
const entityRef = stringifyEntityRef(entity);
if (hasChildGroups) {
const entityRefs = childGroups.map(r => stringifyEntityRef(r));
- const childGroupResponse = await catalogApi.getEntitiesByRefs({
- fields: ['kind', 'metadata.namespace', 'metadata.name', 'relations'],
- entityRefs,
- });
+ const childGroupResponse = await limiter(() =>
+ catalogApi.getEntitiesByRefs({
+ fields: ['kind', 'metadata.namespace', 'metadata.name', 'relations'],
+ entityRefs,
+ }),
+ );
const childGroupEntities = childGroupResponse.items.filter(isEntity);
const unknownChildren = childGroupEntities.filter(
@@ -107,12 +109,10 @@ const getChildOwnershipEntityRefs = async (
const childrenRefs = (
await Promise.all(
unknownChildren.map(childGroupEntity =>
- limiter(() =>
- getChildOwnershipEntityRefs(childGroupEntity, catalogApi, [
- ...alreadyRetrievedParentRefs,
- entityRef,
- ]),
- ),
+ getChildOwnershipEntityRefs(childGroupEntity, catalogApi, [
+ ...alreadyRetrievedParentRefs,
+ entityRef,
+ ]),
),
)
).flatMap(aggregated => aggregated);
diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md
index 90874346ad..d2ae73f5f4 100644
--- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md
+++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-permission-backend-module-allow-all-policy
+## 0.1.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+ - @backstage/plugin-permission-node@0.7.29
+
## 0.1.15-next.1
### Patch Changes
diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json
index ef5dfade7f..6e08904940 100644
--- a/plugins/permission-backend-module-policy-allow-all/package.json
+++ b/plugins/permission-backend-module-policy-allow-all/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-permission-backend-module-allow-all-policy",
- "version": "0.1.15-next.1",
+ "version": "0.1.15",
"description": "Allow all policy backend module for the permission plugin.",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md
index cc5b497a2c..6548fdfac1 100644
--- a/plugins/permission-backend/CHANGELOG.md
+++ b/plugins/permission-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-permission-backend
+## 0.5.42
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+ - @backstage/plugin-permission-node@0.7.29
+
## 0.5.42-next.1
### Patch Changes
diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json
index 3671e2b5a4..e039cd1898 100644
--- a/plugins/permission-backend/package.json
+++ b/plugins/permission-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-permission-backend",
- "version": "0.5.42-next.1",
+ "version": "0.5.42",
"backstage": {
"role": "backend-plugin"
},
diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md
index fd84633615..8b145de147 100644
--- a/plugins/permission-node/CHANGELOG.md
+++ b/plugins/permission-node/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-permission-node
+## 0.7.29
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.7.29-next.1
### Patch Changes
diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json
index c510014089..bf6afc9e34 100644
--- a/plugins/permission-node/package.json
+++ b/plugins/permission-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-permission-node",
"description": "Common permission and authorization utilities for backend plugins",
- "version": "0.7.29-next.1",
+ "version": "0.7.29",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md
index b133154c85..80e2f2e241 100644
--- a/plugins/proxy-backend/CHANGELOG.md
+++ b/plugins/proxy-backend/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-proxy-backend
+## 0.4.16
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+
## 0.4.16-next.1
### Patch Changes
diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json
index 9430f7120d..0614956a18 100644
--- a/plugins/proxy-backend/package.json
+++ b/plugins/proxy-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-proxy-backend",
- "version": "0.4.16-next.1",
+ "version": "0.4.16",
"description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend",
"backstage": {
"role": "backend-plugin"
diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md
index 37987ca19f..c2418d6309 100644
--- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/plugin-scaffolder-backend-module-azure
+## 0.1.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.10-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json
index efd61bae83..bc6b4a45d0 100644
--- a/plugins/scaffolder-backend-module-azure/package.json
+++ b/plugins/scaffolder-backend-module-azure/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-azure",
- "version": "0.1.10-next.1",
+ "version": "0.1.10",
"description": "The azure module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md
index 099d4d6fd0..9a1340c1ad 100644
--- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/plugin-scaffolder-backend-module-bitbucket-cloud
+## 0.1.8
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.8-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json
index 51df2f87ed..abde43fb2f 100644
--- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json
+++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud",
- "version": "0.1.8-next.1",
+ "version": "0.1.8",
"description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md
index 83a345f463..fc245e48ba 100644
--- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-scaffolder-backend-module-bitbucket-server
+## 0.1.8
+
+### Patch Changes
+
+- 24dd655: Add examples for `publish:bitbucketServer:pull-request` scaffolder action & improve related tests
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.8-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json
index 2c195c8d88..2a9fcc3f9d 100644
--- a/plugins/scaffolder-backend-module-bitbucket-server/package.json
+++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server",
- "version": "0.1.8-next.1",
+ "version": "0.1.8",
"description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md
index 31b5cfad46..97a57ff28f 100644
--- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md
@@ -1,5 +1,26 @@
# @backstage/plugin-scaffolder-backend-module-bitbucket
+## 0.2.8
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8
+ - @backstage/integration@1.11.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8
+
+## 0.2.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8-next.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8-next.2
+
## 0.2.8-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json
index ad07c7208d..355ca41844 100644
--- a/plugins/scaffolder-backend-module-bitbucket/package.json
+++ b/plugins/scaffolder-backend-module-bitbucket/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-bitbucket",
- "version": "0.2.8-next.1",
+ "version": "0.2.8",
"description": "The bitbucket module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md
index 1bbc8a234d..77152b9659 100644
--- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-scaffolder-backend-module-confluence-to-markdown
+## 0.2.19
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.2.19-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.2.19-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json
index ddf56c91d1..7cca3be249 100644
--- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json
+++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown",
- "version": "0.2.19-next.1",
+ "version": "0.2.19",
"description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
index 01535ca917..a6c6b24a07 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md
@@ -1,5 +1,25 @@
# @backstage/plugin-scaffolder-backend-module-cookiecutter
+## 0.2.42
+
+### Patch Changes
+
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.2.42-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.2.42-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json
index b4206baff2..b0f137ffab 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/package.json
+++ b/plugins/scaffolder-backend-module-cookiecutter/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-cookiecutter",
- "version": "0.2.42-next.1",
+ "version": "0.2.42",
"description": "A module for the scaffolder backend that lets you template projects using cookiecutter",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts
index 1a49ab0855..d170acb5d0 100644
--- a/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts
+++ b/plugins/scaffolder-backend-module-cookiecutter/src/actions/fetch/cookiecutter.ts
@@ -14,11 +14,8 @@
* limitations under the License.
*/
-import {
- ContainerRunner,
- UrlReader,
- resolveSafeChildPath,
-} from '@backstage/backend-common';
+import { ContainerRunner, UrlReader } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { JsonObject, JsonValue } from '@backstage/types';
import { InputError } from '@backstage/errors';
import { ScmIntegrations } from '@backstage/integration';
diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md
index 959d01271b..3daf8fc28a 100644
--- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/plugin-scaffolder-backend-module-gerrit
+## 0.1.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.10-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json
index d7f9bfce66..1d9e003cfd 100644
--- a/plugins/scaffolder-backend-module-gerrit/package.json
+++ b/plugins/scaffolder-backend-module-gerrit/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-gerrit",
- "version": "0.1.10-next.1",
+ "version": "0.1.10",
"description": "The gerrit module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md
index 306fbd6812..6ec5592bc5 100644
--- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/plugin-scaffolder-backend-module-gitea
+## 0.1.8
+
+### Patch Changes
+
+- 554af73: Allow defining `repoVisibility` field for the action `publish:gitea`
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.1.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.1.8-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json
index 77bc3cd26e..1d8ad190bc 100644
--- a/plugins/scaffolder-backend-module-gitea/package.json
+++ b/plugins/scaffolder-backend-module-gitea/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-gitea",
- "version": "0.1.8-next.1",
+ "version": "0.1.8",
"description": "The gitea module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md
index bcef59a58c..40c8349399 100644
--- a/plugins/scaffolder-backend-module-github/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/plugin-scaffolder-backend-module-github
+## 0.2.8
+
+### Patch Changes
+
+- 5d99272: Update local development dependencies.
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- 52ab241: Adding support to change the default commit author for `publish:github:pull-request`
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.2.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.2.8-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-github/api-report.md b/plugins/scaffolder-backend-module-github/api-report.md
index 0284c362eb..b1a1c80af5 100644
--- a/plugins/scaffolder-backend-module-github/api-report.md
+++ b/plugins/scaffolder-backend-module-github/api-report.md
@@ -128,6 +128,7 @@ export interface CreateGithubPullRequestActionOptions {
} | null>;
}
>;
+ config?: Config;
githubCredentialsProvider?: GithubCredentialsProvider;
integrations: ScmIntegrationRegistry;
}
@@ -389,6 +390,8 @@ export const createPublishGithubPullRequestAction: (
commitMessage?: string | undefined;
update?: boolean | undefined;
forceFork?: boolean | undefined;
+ gitAuthorName?: string | undefined;
+ gitAuthorEmail?: string | undefined;
},
JsonObject
>;
diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json
index 8491b5877a..56dbd291a3 100644
--- a/plugins/scaffolder-backend-module-github/package.json
+++ b/plugins/scaffolder-backend-module-github/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-github",
- "version": "0.2.8-next.1",
+ "version": "0.2.8",
"description": "The github module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.test.ts
index dd07c88a70..26469dfcb4 100644
--- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.test.ts
+++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.test.ts
@@ -103,6 +103,7 @@ describe('publish:github:pull-request examples', () => {
integrations,
githubCredentialsProvider,
clientFactory,
+ config,
});
});
@@ -484,6 +485,138 @@ describe('publish:github:pull-request examples', () => {
expect(mockContext.output).toHaveBeenCalledWith('pullRequestNumber', 123);
});
+ it('Create a pull request with a git author name and email', async () => {
+ const input = yaml.parse(examples[9].example).steps[0].input;
+
+ await action.handler({
+ ...mockContext,
+ workspacePath,
+ input,
+ });
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'owner',
+ repo: 'repo',
+ title: 'Create my new app',
+ body: 'This PR is really good',
+ head: 'new-app',
+ draft: undefined,
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'foo@bar.example',
+ name: 'Foo Bar',
+ },
+ },
+ ],
+ });
+
+ expect(fakeClient.rest.pulls.requestReviewers).not.toHaveBeenCalled();
+ expect(mockContext.output).toHaveBeenCalledTimes(3);
+ expect(mockContext.output).toHaveBeenCalledWith('targetBranchName', 'main');
+ expect(mockContext.output).toHaveBeenCalledWith(
+ 'remoteUrl',
+ 'https://github.com/myorg/myrepo/pull/123',
+ );
+ expect(mockContext.output).toHaveBeenCalledWith('pullRequestNumber', 123);
+ });
+
+ it('Create a pull request with a git author name', async () => {
+ const input = yaml.parse(examples[10].example).steps[0].input;
+
+ await action.handler({
+ ...mockContext,
+ workspacePath,
+ input,
+ });
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'owner',
+ repo: 'repo',
+ title: 'Create my new app',
+ body: 'This PR is really good',
+ head: 'new-app',
+ draft: undefined,
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'scaffolder@backstage.io',
+ name: 'Foo Bar',
+ },
+ },
+ ],
+ });
+
+ expect(fakeClient.rest.pulls.requestReviewers).not.toHaveBeenCalled();
+ expect(mockContext.output).toHaveBeenCalledTimes(3);
+ expect(mockContext.output).toHaveBeenCalledWith('targetBranchName', 'main');
+ expect(mockContext.output).toHaveBeenCalledWith(
+ 'remoteUrl',
+ 'https://github.com/myorg/myrepo/pull/123',
+ );
+ expect(mockContext.output).toHaveBeenCalledWith('pullRequestNumber', 123);
+ });
+
+ it('Create a pull request with a git author email', async () => {
+ const input = yaml.parse(examples[11].example).steps[0].input;
+
+ await action.handler({
+ ...mockContext,
+ workspacePath,
+ input,
+ });
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'owner',
+ repo: 'repo',
+ title: 'Create my new app',
+ body: 'This PR is really good',
+ head: 'new-app',
+ draft: undefined,
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'foo@bar.example',
+ name: 'Scaffolder',
+ },
+ },
+ ],
+ });
+
+ expect(fakeClient.rest.pulls.requestReviewers).not.toHaveBeenCalled();
+ expect(mockContext.output).toHaveBeenCalledTimes(3);
+ expect(mockContext.output).toHaveBeenCalledWith('targetBranchName', 'main');
+ expect(mockContext.output).toHaveBeenCalledWith(
+ 'remoteUrl',
+ 'https://github.com/myorg/myrepo/pull/123',
+ );
+ expect(mockContext.output).toHaveBeenCalledWith('pullRequestNumber', 123);
+ });
+
it('Create a pull request with all parameters', async () => {
mockDir.setContent({
[workspacePath]: {
@@ -491,7 +624,7 @@ describe('publish:github:pull-request examples', () => {
irrelevant: { 'bar.txt': 'Nothing to see here' },
},
});
- const input = yaml.parse(examples[9].example).steps[0].input;
+ const input = yaml.parse(examples[12].example).steps[0].input;
await action.handler({
...mockContext,
@@ -517,6 +650,10 @@ describe('publish:github:pull-request examples', () => {
mode: '100644',
},
},
+ author: {
+ email: 'foo@bar.example',
+ name: 'Foo Bar',
+ },
},
],
});
diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.ts
index d6138b262b..b6d31e732b 100644
--- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.ts
+++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.ts
@@ -178,6 +178,65 @@ export const examples: TemplateExample[] = [
],
}),
},
+ {
+ description: 'Create a pull request with a git author name and email',
+ example: yaml.stringify({
+ steps: [
+ {
+ action: 'publish:github:pull-request',
+ name: 'Create a pull reuqest',
+ input: {
+ repoUrl: 'github.com?repo=repo&owner=owner',
+ branchName: 'new-app',
+ title: 'Create my new app',
+ description: 'This PR is really good',
+ gitAuthorName: 'Foo Bar',
+ gitAuthorEmail: 'foo@bar.example',
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description: 'Create a pull request with a git author name',
+ example: yaml.stringify({
+ steps: [
+ {
+ action: 'publish:github:pull-request',
+ name: 'Create a pull reuqest',
+ input: {
+ repoUrl: 'github.com?repo=repo&owner=owner',
+ branchName: 'new-app',
+ title: 'Create my new app',
+ description: 'This PR is really good',
+ // gitAuthorEmail will be 'scaffolder@backstage.io'
+ // once one author attribute has been set we need to set both
+ gitAuthorName: 'Foo Bar',
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description: 'Create a pull request with a git author email',
+ example: yaml.stringify({
+ steps: [
+ {
+ action: 'publish:github:pull-request',
+ name: 'Create a pull reuqest',
+ input: {
+ repoUrl: 'github.com?repo=repo&owner=owner',
+ branchName: 'new-app',
+ title: 'Create my new app',
+ description: 'This PR is really good',
+ // gitAuthorName will be 'Scaffolder'
+ // once one author attribute has been set we need to set both
+ gitAuthorEmail: 'foo@bar.example',
+ },
+ },
+ ],
+ }),
+ },
{
description: 'Create a pull request with all parameters',
example: yaml.stringify({
@@ -198,6 +257,8 @@ export const examples: TemplateExample[] = [
reviewers: ['foobar'],
teamReviewers: ['team-foo'],
commitMessage: 'Commit for foo changes',
+ gitAuthorName: 'Foo Bar',
+ gitAuthorEmail: 'foo@bar.example',
},
},
],
diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts
index c9d1498187..20508494b8 100644
--- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts
+++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts
@@ -15,7 +15,7 @@
*/
import { createRootLogger } from '@backstage/backend-common';
-import { ConfigReader } from '@backstage/config';
+import { Config, ConfigReader } from '@backstage/config';
import {
GithubCredentialsProvider,
ScmIntegrations,
@@ -46,6 +46,8 @@ describe('createPublishGithubPullRequestAction', () => {
pulls: { requestReviewers: jest.Mock };
};
};
+ let config: Config;
+ let integrations: ScmIntegrations;
const mockDir = createMockDirectory();
const workspacePath = mockDir.resolve('workspace');
@@ -53,7 +55,8 @@ describe('createPublishGithubPullRequestAction', () => {
beforeEach(() => {
mockDir.clear();
- const integrations = ScmIntegrations.fromConfig(new ConfigReader({}));
+ config = new ConfigReader({});
+ integrations = ScmIntegrations.fromConfig(config);
fakeClient = {
createPullRequest: jest.fn(async (_: any) => {
return {
@@ -84,6 +87,7 @@ describe('createPublishGithubPullRequestAction', () => {
integrations,
githubCredentialsProvider,
clientFactory,
+ config,
});
});
@@ -663,4 +667,352 @@ describe('createPublishGithubPullRequestAction', () => {
});
});
});
+
+ describe('with author name and email', () => {
+ let input: GithubPullRequestActionInput;
+ let ctx: ActionContext;
+
+ beforeEach(() => {
+ input = {
+ repoUrl: 'github.com?owner=myorg&repo=myrepo',
+ title: 'Create my new app',
+ branchName: 'new-app',
+ description: 'This PR is really good',
+ gitAuthorEmail: 'foo@bar.example',
+ gitAuthorName: 'Foo Bar',
+ };
+
+ mockDir.setContent({
+ [workspacePath]: { 'file.txt': 'Hello there!' },
+ });
+
+ ctx = createMockActionContext({ input, workspacePath });
+ });
+
+ it('creates a pull request', async () => {
+ await instance.handler(ctx);
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'myorg',
+ repo: 'myrepo',
+ title: 'Create my new app',
+ head: 'new-app',
+ body: 'This PR is really good',
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'foo@bar.example',
+ name: 'Foo Bar',
+ },
+ },
+ ],
+ });
+ });
+ });
+
+ describe('with author name', () => {
+ let input: GithubPullRequestActionInput;
+ let ctx: ActionContext;
+
+ beforeEach(() => {
+ input = {
+ repoUrl: 'github.com?owner=myorg&repo=myrepo',
+ title: 'Create my new app',
+ branchName: 'new-app',
+ description: 'This PR is really good',
+ gitAuthorName: 'Foo Bar',
+ };
+
+ mockDir.setContent({
+ [workspacePath]: { 'file.txt': 'Hello there!' },
+ });
+
+ ctx = createMockActionContext({ input, workspacePath });
+ });
+
+ it('creates a pull request', async () => {
+ await instance.handler(ctx);
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'myorg',
+ repo: 'myrepo',
+ title: 'Create my new app',
+ head: 'new-app',
+ body: 'This PR is really good',
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'scaffolder@backstage.io',
+ name: 'Foo Bar',
+ },
+ },
+ ],
+ });
+ });
+ });
+
+ describe('with author email', () => {
+ let input: GithubPullRequestActionInput;
+ let ctx: ActionContext;
+
+ beforeEach(() => {
+ input = {
+ repoUrl: 'github.com?owner=myorg&repo=myrepo',
+ title: 'Create my new app',
+ branchName: 'new-app',
+ description: 'This PR is really good',
+ gitAuthorEmail: 'foo@bar.example',
+ };
+
+ mockDir.setContent({
+ [workspacePath]: { 'file.txt': 'Hello there!' },
+ });
+
+ ctx = createMockActionContext({ input, workspacePath });
+ });
+
+ it('creates a pull request', async () => {
+ await instance.handler(ctx);
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'myorg',
+ repo: 'myrepo',
+ title: 'Create my new app',
+ head: 'new-app',
+ body: 'This PR is really good',
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'foo@bar.example',
+ name: 'Scaffolder',
+ },
+ },
+ ],
+ });
+ });
+ });
+
+ describe('with author from config file', () => {
+ let input: GithubPullRequestActionInput;
+ let ctx: ActionContext;
+
+ beforeEach(() => {
+ input = {
+ repoUrl: 'github.com?owner=myorg&repo=myrepo',
+ title: 'Create my new app',
+ branchName: 'new-app',
+ description: 'This PR is really good',
+ };
+
+ mockDir.setContent({
+ [workspacePath]: { 'file.txt': 'Hello there!' },
+ });
+
+ ctx = createMockActionContext({ input, workspacePath });
+ });
+
+ it('creates a pull request with default config attributes', async () => {
+ config = new ConfigReader({
+ scaffolder: {
+ defaultAuthor: {
+ name: 'Config',
+ email: 'config@file.example',
+ },
+ },
+ });
+
+ const clientFactory = jest.fn(async () => fakeClient as any);
+ const githubCredentialsProvider: GithubCredentialsProvider = {
+ getCredentials: jest.fn(),
+ };
+
+ const instanceWithConfig = createPublishGithubPullRequestAction({
+ integrations,
+ githubCredentialsProvider,
+ clientFactory,
+ config,
+ });
+
+ await instanceWithConfig.handler(ctx);
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'myorg',
+ repo: 'myrepo',
+ title: 'Create my new app',
+ head: 'new-app',
+ body: 'This PR is really good',
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'config@file.example',
+ name: 'Config',
+ },
+ },
+ ],
+ });
+ });
+ });
+
+ describe('with author attributes and config file', () => {
+ let input: GithubPullRequestActionInput;
+ let ctx: ActionContext;
+
+ beforeEach(() => {
+ input = {
+ repoUrl: 'github.com?owner=myorg&repo=myrepo',
+ title: 'Create my new app',
+ branchName: 'new-app',
+ description: 'This PR is really good',
+ gitAuthorEmail: 'foo@bar.example',
+ gitAuthorName: 'Foo Bar',
+ };
+
+ mockDir.setContent({
+ [workspacePath]: { 'file.txt': 'Hello there!' },
+ });
+
+ ctx = createMockActionContext({ input, workspacePath });
+ });
+
+ it('creates a pull request with using author name and email from input', async () => {
+ config = new ConfigReader({
+ scaffolder: {
+ defaultAuthor: {
+ name: 'Config',
+ email: 'config@file.example',
+ },
+ },
+ });
+
+ const clientFactory = jest.fn(async () => fakeClient as any);
+ const githubCredentialsProvider: GithubCredentialsProvider = {
+ getCredentials: jest.fn(),
+ };
+
+ const instanceWithConfig = createPublishGithubPullRequestAction({
+ integrations,
+ githubCredentialsProvider,
+ clientFactory,
+ config,
+ });
+
+ await instanceWithConfig.handler(ctx);
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'myorg',
+ repo: 'myrepo',
+ title: 'Create my new app',
+ head: 'new-app',
+ body: 'This PR is really good',
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'foo@bar.example',
+ name: 'Foo Bar',
+ },
+ },
+ ],
+ });
+ });
+ });
+
+ describe('with author fallback and no config', () => {
+ let input: GithubPullRequestActionInput;
+ let ctx: ActionContext;
+
+ beforeEach(() => {
+ input = {
+ repoUrl: 'github.com?owner=myorg&repo=myrepo',
+ title: 'Create my new app',
+ branchName: 'new-app',
+ description: 'This PR is really good',
+ gitAuthorName: 'Foo Bar',
+ };
+
+ mockDir.setContent({
+ [workspacePath]: { 'file.txt': 'Hello there!' },
+ });
+
+ ctx = createMockActionContext({ input, workspacePath });
+ });
+
+ it('creates a pull request with using author name and email fallback when have no config', async () => {
+ const clientFactory = jest.fn(async () => fakeClient as any);
+ const githubCredentialsProvider: GithubCredentialsProvider = {
+ getCredentials: jest.fn(),
+ };
+
+ const instanceWithConfig = createPublishGithubPullRequestAction({
+ integrations,
+ githubCredentialsProvider,
+ clientFactory,
+ });
+
+ await instanceWithConfig.handler(ctx);
+
+ expect(fakeClient.createPullRequest).toHaveBeenCalledWith({
+ owner: 'myorg',
+ repo: 'myrepo',
+ title: 'Create my new app',
+ head: 'new-app',
+ body: 'This PR is really good',
+ changes: [
+ {
+ commit: 'Create my new app',
+ files: {
+ 'file.txt': {
+ content: Buffer.from('Hello there!').toString('base64'),
+ encoding: 'base64',
+ mode: '100644',
+ },
+ },
+ author: {
+ email: 'scaffolder@backstage.io',
+ name: 'Foo Bar',
+ },
+ },
+ ],
+ });
+ });
+ });
});
diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts
index b4aa03b602..5efcc6e0bb 100644
--- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts
+++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts
@@ -27,11 +27,14 @@ import {
} from '@backstage/plugin-scaffolder-node';
import { Octokit } from 'octokit';
import { CustomErrorBase, InputError } from '@backstage/errors';
-import { resolveSafeChildPath } from '@backstage/backend-common';
import { createPullRequest } from 'octokit-plugin-create-pull-request';
import { getOctokitOptions } from './helpers';
import { examples } from './githubPullRequest.examples';
-import { LoggerService } from '@backstage/backend-plugin-api';
+import {
+ LoggerService,
+ resolveSafeChildPath,
+} from '@backstage/backend-plugin-api';
+import { Config } from '@backstage/config';
export type Encoding = 'utf-8' | 'base64';
@@ -100,6 +103,10 @@ export interface CreateGithubPullRequestActionOptions {
} | null>;
}
>;
+ /**
+ * An instance of {@link @backstage/config#Config} that will be used in the action.
+ */
+ config?: Config;
}
type GithubPullRequest = {
@@ -119,6 +126,7 @@ export const createPublishGithubPullRequestAction = (
integrations,
githubCredentialsProvider,
clientFactory = defaultClientFactory,
+ config,
} = options;
return createTemplateAction<{
@@ -136,6 +144,8 @@ export const createPublishGithubPullRequestAction = (
commitMessage?: string;
update?: boolean;
forceFork?: boolean;
+ gitAuthorName?: string;
+ gitAuthorEmail?: string;
}>({
id: 'publish:github:pull-request',
examples,
@@ -223,6 +233,18 @@ export const createPublishGithubPullRequestAction = (
title: 'Force Fork',
description: 'Create pull request from a fork',
},
+ gitAuthorName: {
+ type: 'string',
+ title: 'Default Author Name',
+ description:
+ "Sets the default author name for the commit. The default value is the authenticated user or 'Scaffolder'",
+ },
+ gitAuthorEmail: {
+ type: 'string',
+ title: 'Default Author Email',
+ description:
+ "Sets the default author email for the commit. The default value is the authenticated user or 'scaffolder@backstage.io'",
+ },
},
},
output: {
@@ -262,6 +284,8 @@ export const createPublishGithubPullRequestAction = (
commitMessage,
update,
forceFork,
+ gitAuthorEmail,
+ gitAuthorName,
} = ctx.input;
const { owner, repo, host } = parseRepoUrl(repoUrl, integrations);
@@ -327,7 +351,10 @@ export const createPublishGithubPullRequestAction = (
changes: [
{
files,
- commit: commitMessage ?? title,
+ commit:
+ commitMessage ??
+ config?.getOptionalString('scaffolder.defaultCommitMessage') ??
+ title,
},
],
body: description,
@@ -336,6 +363,36 @@ export const createPublishGithubPullRequestAction = (
update,
forceFork,
};
+
+ const gitAuthorInfo = {
+ name:
+ gitAuthorName ??
+ config?.getOptionalString('scaffolder.defaultAuthor.name'),
+ email:
+ gitAuthorEmail ??
+ config?.getOptionalString('scaffolder.defaultAuthor.email'),
+ };
+
+ if (gitAuthorInfo.name || gitAuthorInfo.email) {
+ if (Array.isArray(createOptions.changes)) {
+ createOptions.changes = createOptions.changes.map(change => ({
+ ...change,
+ author: {
+ name: gitAuthorInfo.name || 'Scaffolder',
+ email: gitAuthorInfo.email || 'scaffolder@backstage.io',
+ },
+ }));
+ } else {
+ createOptions.changes = {
+ ...createOptions.changes,
+ author: {
+ name: gitAuthorInfo.name || 'Scaffolder',
+ email: gitAuthorInfo.email || 'scaffolder@backstage.io',
+ },
+ };
+ }
+ }
+
if (targetBranchName) {
createOptions.base = targetBranchName;
}
diff --git a/plugins/scaffolder-backend-module-github/src/module.ts b/plugins/scaffolder-backend-module-github/src/module.ts
index 79c954a6dd..1817a68bfb 100644
--- a/plugins/scaffolder-backend-module-github/src/module.ts
+++ b/plugins/scaffolder-backend-module-github/src/module.ts
@@ -89,6 +89,7 @@ export const githubModule = createBackendModule({
createPublishGithubPullRequestAction({
integrations,
githubCredentialsProvider,
+ config,
}),
);
},
diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md
index 58f4cfdfb0..829e2122f3 100644
--- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md
@@ -1,5 +1,36 @@
# @backstage/plugin-scaffolder-backend-module-gitlab
+## 0.4.0
+
+### Minor Changes
+
+- 18f736f: Add examples for `gitlab:projectVariable:create` scaffolder action & improve related tests
+
+### Patch Changes
+
+- 8fa8a00: Add merge method and squash option for project creation
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- ffc73ec: Add examples for `gitlab:repo:push` scaffolder action & improve related tests
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.4.0-next.2
+
+### Minor Changes
+
+- 18f736f: Add examples for `gitlab:projectVariable:create` scaffolder action & improve related tests
+
+### Patch Changes
+
+- 8fa8a00: Add merge method and squash option for project creation
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.3.4-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-gitlab/api-report.md b/plugins/scaffolder-backend-module-gitlab/api-report.md
index 4fb965eb13..fdffba1c7e 100644
--- a/plugins/scaffolder-backend-module-gitlab/api-report.md
+++ b/plugins/scaffolder-backend-module-gitlab/api-report.md
@@ -31,19 +31,19 @@ export const createGitlabIssueAction: (options: {
title: string;
repoUrl: string;
projectId: number;
+ labels?: string | undefined;
+ description?: string | undefined;
+ weight?: number | undefined;
token?: string | undefined;
assignees?: number[] | undefined;
- confidential?: boolean | undefined;
- description?: string | undefined;
createdAt?: string | undefined;
+ confidential?: boolean | undefined;
+ milestoneId?: number | undefined;
+ epicId?: number | undefined;
dueDate?: string | undefined;
discussionToResolve?: string | undefined;
- epicId?: number | undefined;
- labels?: string | undefined;
issueType?: IssueType | undefined;
mergeRequestToResolveDiscussionsOf?: number | undefined;
- milestoneId?: number | undefined;
- weight?: number | undefined;
},
{
issueUrl: string;
@@ -59,11 +59,11 @@ export const createGitlabProjectAccessTokenAction: (options: {
{
repoUrl: string;
projectId: string | number;
- token?: string | undefined;
name?: string | undefined;
- accessLevel?: number | undefined;
+ token?: string | undefined;
scopes?: string[] | undefined;
expiresAt?: string | undefined;
+ accessLevel?: number | undefined;
},
{
access_token: string;
@@ -78,8 +78,8 @@ export const createGitlabProjectDeployTokenAction: (options: {
name: string;
repoUrl: string;
projectId: string | number;
- token?: string | undefined;
username?: string | undefined;
+ token?: string | undefined;
scopes?: string[] | undefined;
},
{
@@ -98,11 +98,11 @@ export const createGitlabProjectVariableAction: (options: {
repoUrl: string;
projectId: string | number;
variableType: string;
- token?: string | undefined;
- variableProtected?: boolean | undefined;
- masked?: boolean | undefined;
raw?: boolean | undefined;
+ token?: string | undefined;
+ masked?: boolean | undefined;
environmentScope?: string | undefined;
+ variableProtected?: boolean | undefined;
},
JsonObject
>;
@@ -145,6 +145,13 @@ export function createPublishGitlabAction(options: {
auto_devops_enabled?: boolean | undefined;
ci_config_path?: string | undefined;
description?: string | undefined;
+ merge_method?: 'merge' | 'ff' | 'rebase_merge' | undefined;
+ squash_option?:
+ | 'always'
+ | 'never'
+ | 'default_on'
+ | 'default_off'
+ | undefined;
topics?: string[] | undefined;
visibility?: 'internal' | 'private' | 'public' | undefined;
}
diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json
index 941dcb5aef..383ef0e79d 100644
--- a/plugins/scaffolder-backend-module-gitlab/package.json
+++ b/plugins/scaffolder-backend-module-gitlab/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-gitlab",
- "version": "0.3.4-next.1",
+ "version": "0.4.0",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.test.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.test.ts
new file mode 100644
index 0000000000..d1c37ccd9d
--- /dev/null
+++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.test.ts
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2021 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 { createGitlabProjectVariableAction } from './createGitlabProjectVariableAction';
+import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils';
+import { ScmIntegrations } from '@backstage/integration';
+import { ConfigReader } from '@backstage/config';
+import yaml from 'yaml';
+import { examples } from './createGitlabProjectVariableAction.examples';
+
+const mockGitlabClient = {
+ ProjectVariables: {
+ create: jest.fn(),
+ },
+};
+jest.mock('@gitbeaker/node', () => ({
+ Gitlab: class {
+ constructor() {
+ return mockGitlabClient;
+ }
+ },
+}));
+
+describe('gitlab:projectVariableAction: create examples', () => {
+ const config = new ConfigReader({
+ integrations: {
+ gitlab: [
+ {
+ host: 'gitlab.com',
+ token: 'tokenlols',
+ apiBaseUrl: 'https://api.gitlab.com',
+ },
+ {
+ host: 'hosted.gitlab.com',
+ apiBaseUrl: 'https://api.hosted.gitlab.com',
+ },
+ ],
+ },
+ });
+
+ const integrations = ScmIntegrations.fromConfig(config);
+ const action = createGitlabProjectVariableAction({ integrations });
+ const mockContext = createMockActionContext({
+ input: {
+ repoUrl: 'gitlab.com?repo=repo&owner=owner',
+ projectId: '123',
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ variableType: 'env_var',
+ },
+ });
+
+ beforeEach(() => {
+ jest.resetAllMocks();
+ });
+
+ it(`Should ${examples[0].description}`, async () => {
+ mockGitlabClient.ProjectVariables.create.mockResolvedValue({
+ token: 'TOKEN',
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: yaml.parse(examples[0].example).steps[0].input,
+ });
+
+ expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith(
+ '123',
+ {
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ variable_type: 'env_var',
+ environment_scope: '*',
+ masked: false,
+ protected: false,
+ raw: false,
+ },
+ );
+ });
+ it(`Should ${examples[1].description}`, async () => {
+ mockGitlabClient.ProjectVariables.create.mockResolvedValue({
+ token: 'TOKEN',
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: yaml.parse(examples[1].example).steps[0].input,
+ });
+
+ expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith(
+ '123',
+ {
+ key: 'MY_VARIABLE',
+ value: 'my-file-content',
+ protected: false,
+ masked: false,
+ raw: false,
+ environment_scope: '*',
+ variable_type: 'file',
+ },
+ );
+ });
+
+ it(`Should ${examples[2].description}`, async () => {
+ mockGitlabClient.ProjectVariables.create.mockResolvedValue({
+ token: 'TOKEN',
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: yaml.parse(examples[2].example).steps[0].input,
+ });
+
+ expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith(
+ '456',
+ {
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ masked: false,
+ raw: false,
+ environment_scope: '*',
+ variable_type: 'env_var',
+ protected: true,
+ },
+ );
+ });
+
+ it(`Should ${examples[3].description}`, async () => {
+ mockGitlabClient.ProjectVariables.create.mockResolvedValue({
+ token: 'TOKEN',
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: yaml.parse(examples[3].example).steps[0].input,
+ });
+
+ expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith(
+ '789',
+ {
+ key: 'DB_PASSWORD',
+ value: 'password123',
+ protected: false,
+ raw: false,
+ environment_scope: '*',
+ variable_type: 'env_var',
+ masked: true,
+ },
+ );
+ });
+
+ it(`Should ${examples[4].description}`, async () => {
+ mockGitlabClient.ProjectVariables.create.mockResolvedValue({
+ token: 'TOKEN',
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: yaml.parse(examples[4].example).steps[0].input,
+ });
+
+ expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith(
+ '123',
+ {
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ protected: false,
+ environment_scope: '*',
+ variable_type: 'env_var',
+ masked: false,
+ raw: true,
+ },
+ );
+ });
+
+ it(`Should ${examples[5].description}`, async () => {
+ mockGitlabClient.ProjectVariables.create.mockResolvedValue({
+ token: 'TOKEN',
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: yaml.parse(examples[5].example).steps[0].input,
+ });
+
+ expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith(
+ '123',
+ {
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ protected: false,
+ variable_type: 'env_var',
+ masked: false,
+ raw: false,
+ environment_scope: 'production',
+ },
+ );
+ });
+
+ it(`Should ${examples[6].description}`, async () => {
+ mockGitlabClient.ProjectVariables.create.mockResolvedValue({
+ token: 'TOKEN',
+ });
+
+ await action.handler({
+ ...mockContext,
+ input: yaml.parse(examples[6].example).steps[0].input,
+ });
+
+ expect(mockGitlabClient.ProjectVariables.create).toHaveBeenCalledWith(
+ '123',
+ {
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ protected: false,
+ variable_type: 'env_var',
+ masked: false,
+ raw: false,
+ environment_scope: '*',
+ },
+ );
+ });
+});
diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.ts
new file mode 100644
index 0000000000..81d526f7c8
--- /dev/null
+++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.examples.ts
@@ -0,0 +1,160 @@
+/*
+ * 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 { TemplateExample } from '@backstage/plugin-scaffolder-node';
+import yaml from 'yaml';
+
+export const examples: TemplateExample[] = [
+ {
+ description: 'Creating a GitLab project variable of type env_var',
+ example: yaml.stringify({
+ steps: [
+ {
+ id: 'createVariable',
+ action: 'gitlab:createGitlabProjectVariableAction',
+ name: 'Create GitLab Project Variable',
+ input: {
+ repoUrl: 'gitlab.com?repo=repo&owner=owner',
+ projectId: '123',
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ variableType: 'env_var',
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description: 'Creating a GitLab project variable of type file',
+ example: yaml.stringify({
+ steps: [
+ {
+ id: 'createVariable',
+ action: 'gitlab:createGitlabProjectVariableAction',
+ name: 'Create GitLab Project Variable',
+ input: {
+ repoUrl: 'gitlab.com?repo=repo&owner=owner',
+ projectId: '123',
+ key: 'MY_VARIABLE',
+ value: 'my-file-content',
+ variableType: 'file',
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description: 'Create a GitLab project variable that is protected.',
+ example: yaml.stringify({
+ steps: [
+ {
+ id: 'createVariable',
+ action: 'gitlab:createGitlabProjectVariableAction',
+ name: 'Create GitLab Project Variable',
+ input: {
+ repoUrl: 'gitlab.com?repo=repo&owner=owner',
+ projectId: '456',
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ variableType: 'env_var',
+ variableProtected: true,
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description: 'Create a GitLab project variable with masked flag as true',
+ example: yaml.stringify({
+ steps: [
+ {
+ id: 'createVariable',
+ action: 'gitlab:createGitlabProjectVariableAction',
+ name: 'Create GitLab Project Variable',
+ input: {
+ repoUrl: 'gitlab.com?repo=repo&owner=owner',
+ projectId: '789',
+ key: 'DB_PASSWORD',
+ value: 'password123',
+ variableType: 'env_var',
+ masked: true,
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description: 'Create a GitLab project variable that is expandable.',
+ example: yaml.stringify({
+ steps: [
+ {
+ id: 'createVariable',
+ action: 'gitlab:projectVariable:create',
+ name: 'Create GitLab Project Variable',
+ input: {
+ repoUrl: 'gitlab.com?repo=repo&owner=owner',
+ projectId: '123',
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ variableType: 'env_var',
+ raw: true,
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description:
+ 'Create a GitLab project variable with a specific environment scope.',
+ example: yaml.stringify({
+ steps: [
+ {
+ id: 'createVariable',
+ action: 'gitlab:projectVariable:create',
+ name: 'Create GitLab Project Variable',
+ input: {
+ repoUrl: 'gitlab.com?repo=repo&owner=owner',
+ projectId: '123',
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ variableType: 'env_var',
+ environmentScope: 'production',
+ },
+ },
+ ],
+ }),
+ },
+ {
+ description:
+ 'Create a GitLab project variable with a wildcard environment scope.',
+ example: yaml.stringify({
+ steps: [
+ {
+ id: 'createVariable',
+ action: 'gitlab:projectVariable:create',
+ name: 'Create GitLab Project Variable',
+ input: {
+ repoUrl: 'gitlab.com?repo=repo&owner=owner',
+ projectId: '123',
+ key: 'MY_VARIABLE',
+ value: 'my_value',
+ variableType: 'env_var',
+ environmentScope: '*',
+ },
+ },
+ ],
+ }),
+ },
+];
diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts
index a154c16662..e09a074701 100644
--- a/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts
+++ b/plugins/scaffolder-backend-module-gitlab/src/actions/createGitlabProjectVariableAction.ts
@@ -20,6 +20,7 @@ import { Gitlab } from '@gitbeaker/node';
import { getToken } from '../util';
import commonGitlabConfig from '../commonGitlabConfig';
import { z } from 'zod';
+import { examples } from './createGitlabProjectVariableAction.examples';
/**
* Creates a `gitlab:projectVariable:create` Scaffolder action.
@@ -33,6 +34,7 @@ export const createGitlabProjectVariableAction = (options: {
const { integrations } = options;
return createTemplateAction({
id: 'gitlab:projectVariable:create',
+ examples,
schema: {
input: commonGitlabConfig.merge(
z.object({
@@ -85,7 +87,6 @@ export const createGitlabProjectVariableAction = (options: {
host: integrationConfig.config.baseUrl,
token: token,
});
-
await api.ProjectVariables.create(projectId, {
key: key,
value: value,
diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts
index ad032e9017..9746bfabe2 100644
--- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts
+++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.examples.ts
@@ -87,6 +87,26 @@ export const examples: TemplateExample[] = [
],
}),
},
+ {
+ description:
+ 'Initializes a GitLab repository with fast forward merge and always squash settings.',
+ example: yaml.stringify({
+ steps: [
+ {
+ id: 'publish',
+ action: 'publish:gitlab',
+ name: 'Publish to GitLab',
+ input: {
+ repoUrl: 'gitlab.com?repo=project_name&owner=group_name',
+ settings: {
+ merge_method: 'ff',
+ squash_option: 'always',
+ },
+ },
+ },
+ ],
+ }),
+ },
{
description: 'Initializes a GitLab repository with branch settings.',
example: yaml.stringify({
diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts
index 22f875ca8d..020e8a9c18 100644
--- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts
+++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlab.ts
@@ -56,6 +56,8 @@ export function createPublishGitlabAction(options: {
auto_devops_enabled?: boolean;
ci_config_path?: string;
description?: string;
+ merge_method?: 'merge' | 'rebase_merge' | 'ff';
+ squash_option?: 'default_off' | 'default_on' | 'never' | 'always';
topics?: string[];
visibility?: 'private' | 'internal' | 'public';
};
@@ -169,6 +171,19 @@ export function createPublishGitlabAction(options: {
description: 'Short project description',
type: 'string',
},
+ merge_method: {
+ title: 'Merge Method to use',
+ description: 'Merge Methods (merge, rebase_merge, ff)',
+ type: 'string',
+ enum: ['merge', 'rebase_merge', 'ff'],
+ },
+ squash_option: {
+ title: 'Squash option',
+ description:
+ 'Set squash option for the project (never, always, default_on, default_off)',
+ type: 'string',
+ enum: ['default_off', 'default_on', 'never', 'always'],
+ },
topics: {
title: 'Topic labels',
description: 'Topic labels to apply on the repository',
diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts
index c9b8ce68a9..a549585426 100644
--- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts
+++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabMergeRequest.ts
@@ -23,7 +23,7 @@ import { Types } from '@gitbeaker/core';
import path from 'path';
import { ScmIntegrationRegistry } from '@backstage/integration';
import { InputError } from '@backstage/errors';
-import { resolveSafeChildPath } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { createGitlabApi } from './helpers';
import { examples } from './gitlabMergeRequest.examples';
diff --git a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts
index aae3b05c49..c926fe2971 100644
--- a/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts
+++ b/plugins/scaffolder-backend-module-gitlab/src/actions/gitlabRepoPush.ts
@@ -23,7 +23,7 @@ import { Types } from '@gitbeaker/core';
import path from 'path';
import { ScmIntegrationRegistry } from '@backstage/integration';
import { InputError } from '@backstage/errors';
-import { resolveSafeChildPath } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { createGitlabApi } from './helpers';
import { examples } from './gitlabRepoPush.examples';
diff --git a/plugins/scaffolder-backend-module-notifications/.eslintrc.js b/plugins/scaffolder-backend-module-notifications/.eslintrc.js
new file mode 100644
index 0000000000..e2a53a6ad2
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/.eslintrc.js
@@ -0,0 +1 @@
+module.exports = require('@backstage/cli/config/eslint-factory')(__dirname);
diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md
new file mode 100644
index 0000000000..d5d3902191
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md
@@ -0,0 +1,21 @@
+# @backstage/plugin-scaffolder-backend-module-notifications
+
+## 0.0.1
+
+### Patch Changes
+
+- 503d769: Add a new scaffolder action to allow sending notifications from templates
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/plugin-notifications-node@0.1.4
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+
+## 0.0.1-next.0
+
+### Patch Changes
+
+- 503d769: Add a new scaffolder action to allow sending notifications from templates
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
diff --git a/plugins/scaffolder-backend-module-notifications/README.md b/plugins/scaffolder-backend-module-notifications/README.md
new file mode 100644
index 0000000000..49a363a994
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/README.md
@@ -0,0 +1,5 @@
+# @backstage/plugin-scaffolder-backend-module-notifications
+
+The notifications backend module for the scaffolder plugin.
+
+_This plugin was created through the Backstage CLI_
diff --git a/plugins/scaffolder-backend-module-notifications/api-report.md b/plugins/scaffolder-backend-module-notifications/api-report.md
new file mode 100644
index 0000000000..8b12210fe9
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/api-report.md
@@ -0,0 +1,32 @@
+## API Report File for "@backstage/plugin-scaffolder-backend-module-notifications"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+import { BackendFeature } from '@backstage/backend-plugin-api';
+import { JsonObject } from '@backstage/types';
+import { NotificationService } from '@backstage/plugin-notifications-node';
+import { NotificationSeverity } from '@backstage/plugin-notifications-common';
+import { TemplateAction } from '@backstage/plugin-scaffolder-node';
+
+// @public (undocumented)
+export function createSendNotificationAction(options: {
+ notifications: NotificationService;
+}): TemplateAction<
+ {
+ recipients: string;
+ entityRefs?: string[] | undefined;
+ title: string;
+ info?: string | undefined;
+ link?: string | undefined;
+ severity?: NotificationSeverity | undefined;
+ scope?: string | undefined;
+ optional?: boolean | undefined;
+ },
+ JsonObject
+>;
+
+// @public
+const scaffolderModuleNotifications: () => BackendFeature;
+export default scaffolderModuleNotifications;
+```
diff --git a/plugins/scaffolder-backend-module-notifications/catalog-info.yaml b/plugins/scaffolder-backend-module-notifications/catalog-info.yaml
new file mode 100644
index 0000000000..640cd1ad6f
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/catalog-info.yaml
@@ -0,0 +1,10 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: backstage-plugin-scaffolder-backend-module-notifications
+ title: '@backstage/plugin-scaffolder-backend-module-notifications'
+ description: The notifications module for @backstage/plugin-scaffolder-backend
+spec:
+ lifecycle: experimental
+ type: backstage-backend-plugin-module
+ owner: maintainers
diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json
new file mode 100644
index 0000000000..07cb5e9bb1
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "@backstage/plugin-scaffolder-backend-module-notifications",
+ "version": "0.0.1",
+ "description": "The notifications backend module for the scaffolder plugin.",
+ "backstage": {
+ "role": "backend-plugin-module"
+ },
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.cjs.js",
+ "types": "dist/index.d.ts"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/backstage/backstage",
+ "directory": "plugins/scaffolder-backend-module-notifications"
+ },
+ "license": "Apache-2.0",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "build": "backstage-cli package build",
+ "clean": "backstage-cli package clean",
+ "lint": "backstage-cli package lint",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack",
+ "start": "backstage-cli package start",
+ "test": "backstage-cli package test"
+ },
+ "dependencies": {
+ "@backstage/backend-common": "workspace:^",
+ "@backstage/backend-plugin-api": "workspace:^",
+ "@backstage/plugin-notifications-common": "workspace:^",
+ "@backstage/plugin-notifications-node": "workspace:^",
+ "@backstage/plugin-scaffolder-node": "workspace:^",
+ "octokit": "^3.0.0"
+ },
+ "devDependencies": {
+ "@backstage/cli": "workspace:^",
+ "@backstage/plugin-scaffolder-node-test-utils": "workspace:^"
+ }
+}
diff --git a/plugins/scaffolder-backend-module-notifications/src/actions/index.ts b/plugins/scaffolder-backend-module-notifications/src/actions/index.ts
new file mode 100644
index 0000000000..9d708282dd
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/src/actions/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2024 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.
+ */
+export { createSendNotificationAction } from './sendNotification';
diff --git a/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.test.ts b/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.test.ts
new file mode 100644
index 0000000000..efd1377cae
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.test.ts
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2024 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 { createSendNotificationAction } from './sendNotification';
+import { NotificationService } from '@backstage/plugin-notifications-node';
+import { TemplateAction } from '@backstage/plugin-scaffolder-node';
+import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils';
+
+describe('notification:send', () => {
+ const notificationService: jest.Mocked = {
+ send: jest.fn(),
+ };
+
+ let action: TemplateAction;
+
+ beforeEach(() => {
+ jest.resetAllMocks();
+ action = createSendNotificationAction({
+ notifications: notificationService,
+ });
+ });
+
+ const mockContext = createMockActionContext({
+ input: {
+ recipients: 'broadcast',
+ title: 'Test notification',
+ },
+ });
+
+ it('should send broadcast notification', async () => {
+ const ctx = Object.assign({}, mockContext, {
+ input: { recipients: 'broadcast', title: 'Test notification' },
+ });
+ await action.handler(ctx);
+ expect(notificationService.send).toHaveBeenCalledWith({
+ recipients: { type: 'broadcast' },
+ payload: {
+ title: 'Test notification',
+ },
+ });
+ });
+
+ it('should send entity notification', async () => {
+ const ctx = Object.assign({}, mockContext, {
+ input: {
+ recipients: 'entity',
+ entityRefs: ['user:default/john.doe'],
+ title: 'Test notification',
+ },
+ });
+ await action.handler(ctx);
+ expect(notificationService.send).toHaveBeenCalledWith({
+ recipients: { type: 'entity', entityRef: ['user:default/john.doe'] },
+ payload: {
+ title: 'Test notification',
+ },
+ });
+ });
+
+ it('should throw error if entity refs are missing', async () => {
+ const ctx = Object.assign({}, mockContext, {
+ input: {
+ recipients: 'entity',
+ title: 'Test notification',
+ },
+ });
+ await expect(action.handler(ctx)).rejects.toThrow();
+ });
+
+ it('should not throw error if entity refs are missing but optional is true', async () => {
+ const ctx = Object.assign({}, mockContext, {
+ input: {
+ recipients: 'entity',
+ title: 'Test notification',
+ optional: true,
+ },
+ });
+ await expect(action.handler(ctx)).resolves.not.toThrow();
+ expect(notificationService.send).not.toHaveBeenCalled();
+ });
+});
diff --git a/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.ts b/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.ts
new file mode 100644
index 0000000000..f50e178174
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/src/actions/sendNotification.ts
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2024 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 {
+ NotificationRecipients,
+ NotificationService,
+} from '@backstage/plugin-notifications-node';
+import {
+ NotificationPayload,
+ NotificationSeverity,
+} from '@backstage/plugin-notifications-common';
+import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
+
+/**
+ * @public
+ */
+export function createSendNotificationAction(options: {
+ notifications: NotificationService;
+}) {
+ const { notifications } = options;
+ return createTemplateAction<{
+ recipients: string;
+ entityRefs?: string[];
+ title: string;
+ info?: string;
+ link?: string;
+ severity?: NotificationSeverity;
+ scope?: string;
+ optional?: boolean;
+ }>({
+ id: 'notification:send',
+ description: 'Sends a notification using NotificationService',
+ schema: {
+ input: {
+ type: 'object',
+ required: ['recipients', 'title'],
+ properties: {
+ recipients: {
+ title: 'Recipient',
+ enum: ['broadcast', 'entity'],
+ description:
+ 'The recipient of the notification, either broadcast or entity. If using entity, also entityRef must be provided',
+ type: 'string',
+ },
+ entityRefs: {
+ title: 'Entity references',
+ description:
+ 'The entity references to send the notification to, required if using recipient of entity',
+ type: 'array',
+ items: {
+ type: 'string',
+ },
+ },
+ title: {
+ title: 'Title',
+ description: 'Notification title',
+ type: 'string',
+ },
+ info: {
+ title: 'Description',
+ description: 'Notification description',
+ type: 'string',
+ },
+ link: {
+ title: 'Link',
+ description: 'Notification link',
+ type: 'string',
+ },
+ severity: {
+ title: 'Severity',
+ type: 'string',
+ description: `Notification severity`,
+ enum: ['low', 'normal', 'high', 'critical'],
+ },
+ scope: {
+ title: 'Scope',
+ description: 'Notification scope',
+ type: 'string',
+ },
+ optional: {
+ title: 'Optional',
+ description:
+ 'Do not fail the action if the notification sending fails',
+ type: 'boolean',
+ },
+ },
+ },
+ },
+ async handler(ctx) {
+ const {
+ recipients,
+ entityRefs,
+ title,
+ info,
+ link,
+ severity,
+ scope,
+ optional,
+ } = ctx.input;
+
+ ctx.logger.info(`Sending notification to ${recipients}`);
+ if (recipients === 'entity' && !entityRefs) {
+ if (optional !== true) {
+ throw new Error('Entity references must be provided');
+ }
+ return;
+ }
+
+ const notificationRecipients: NotificationRecipients =
+ recipients === 'broadcast'
+ ? { type: 'broadcast' }
+ : { type: 'entity', entityRef: entityRefs! };
+ const payload: NotificationPayload = {
+ title,
+ description: info,
+ link,
+ severity,
+ scope,
+ };
+
+ try {
+ await notifications.send({
+ recipients: notificationRecipients,
+ payload,
+ });
+ } catch (e) {
+ ctx.logger.error(`Failed to send notification: ${e}`);
+ if (optional !== true) {
+ throw e;
+ }
+ }
+ },
+ });
+}
diff --git a/plugins/scaffolder-backend-module-notifications/src/index.ts b/plugins/scaffolder-backend-module-notifications/src/index.ts
new file mode 100644
index 0000000000..05a356cc71
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/src/index.ts
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2024 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.
+ */
+
+/**
+ * The notifications backend module for the scaffolder plugin.
+ *
+ * @packageDocumentation
+ */
+export * from './actions';
+export { scaffolderModuleNotifications as default } from './module';
diff --git a/plugins/scaffolder-backend-module-notifications/src/module.ts b/plugins/scaffolder-backend-module-notifications/src/module.ts
new file mode 100644
index 0000000000..e8b6823e99
--- /dev/null
+++ b/plugins/scaffolder-backend-module-notifications/src/module.ts
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2024 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 { createBackendModule } from '@backstage/backend-plugin-api';
+import { notificationService } from '@backstage/plugin-notifications-node';
+import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha';
+import { createSendNotificationAction } from './actions';
+
+/**
+ * @public
+ * The Notifications module for the Scaffolder Backend
+ */
+export const scaffolderModuleNotifications = createBackendModule({
+ pluginId: 'scaffolder',
+ moduleId: 'notifications',
+ register(reg) {
+ reg.registerInit({
+ deps: {
+ notifications: notificationService,
+ scaffolder: scaffolderActionsExtensionPoint,
+ },
+ async init({ notifications, scaffolder }) {
+ scaffolder.addActions(createSendNotificationAction({ notifications }));
+ },
+ });
+ },
+});
diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md
index 4553938eab..64c1c79d7c 100644
--- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-scaffolder-backend-module-rails
+## 0.4.35
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/integration@1.11.0
+
+## 0.4.35-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.4.35-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json
index a523ed9a8d..0d822764dd 100644
--- a/plugins/scaffolder-backend-module-rails/package.json
+++ b/plugins/scaffolder-backend-module-rails/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-rails",
- "version": "0.4.35-next.1",
+ "version": "0.4.35",
"description": "A module for the scaffolder backend that lets you template projects using Rails",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md
index d3685153d5..fa5b12ae0e 100644
--- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-scaffolder-backend-module-sentry
+## 0.1.26
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+
## 0.1.26-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json
index bd7555a8c2..1f2e48ad59 100644
--- a/plugins/scaffolder-backend-module-sentry/package.json
+++ b/plugins/scaffolder-backend-module-sentry/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-sentry",
- "version": "0.1.26-next.1",
+ "version": "0.1.26",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md
index 96b7222d0f..cb1a73f9f7 100644
--- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md
+++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-scaffolder-backend-module-yeoman
+## 0.3.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/plugin-scaffolder-node-test-utils@0.1.4
+
## 0.3.1-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json
index c0f0c85f72..9a2fb1fdb1 100644
--- a/plugins/scaffolder-backend-module-yeoman/package.json
+++ b/plugins/scaffolder-backend-module-yeoman/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend-module-yeoman",
- "version": "0.3.1-next.1",
+ "version": "0.3.1",
"backstage": {
"role": "backend-plugin-module"
},
diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md
index 0ed790e3be..05be28c1ae 100644
--- a/plugins/scaffolder-backend/CHANGELOG.md
+++ b/plugins/scaffolder-backend/CHANGELOG.md
@@ -1,5 +1,56 @@
# @backstage/plugin-scaffolder-backend
+## 1.22.6
+
+### Patch Changes
+
+- 131e5cb: Fix broken links in README.
+- 025641b: Fix issue with the log format not being respected when logging from actions
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- e4b50ab: Scaffolder workspace serialization
+- 025641b: Redact `meta` fields too with the logger
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.2
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.2.8
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.1.8
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.4.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-scaffolder-node@0.4.4
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8
+ - @backstage/plugin-auth-node@0.4.13
+ - @backstage/integration@1.11.0
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16
+ - @backstage/plugin-permission-node@0.7.29
+ - @backstage/plugin-scaffolder-backend-module-azure@0.1.10
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.2.8
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.1.10
+
+## 1.22.6-next.2
+
+### Patch Changes
+
+- e4b50ab: Scaffolder workspace serialization
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.4.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-scaffolder-node@0.4.4-next.2
+ - @backstage/integration@1.11.0-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.16-next.2
+ - @backstage/plugin-scaffolder-backend-module-azure@0.1.10-next.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.2.8-next.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.1.8-next.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.1.8-next.2
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.1.10-next.2
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.1.8-next.2
+ - @backstage/plugin-scaffolder-backend-module-github@0.2.8-next.2
+
## 1.22.5-next.1
### Patch Changes
diff --git a/plugins/scaffolder-backend/README.md b/plugins/scaffolder-backend/README.md
index 0aa57fd90c..d760b0fc2d 100644
--- a/plugins/scaffolder-backend/README.md
+++ b/plugins/scaffolder-backend/README.md
@@ -1,9 +1,7 @@
# Scaffolder Backend
-This is the backend for the default Backstage [software
-templates](https://backstage.io/docs/features/software-templates/).
-This provides the API for the frontend [scaffolder
-plugin](https://github.com/backstage/backstage/tree/master/plugins/scaffolder),
+This is the backend for the default Backstage [software templates](https://backstage.io/docs/features/software-templates/).
+This provides the API for the frontend [scaffolder plugin](https://github.com/backstage/backstage/tree/master/plugins/scaffolder),
as well as the built-in template actions, tasks and stages.
## Installation
@@ -24,12 +22,19 @@ restoring the plugin, if you previously removed it.
yarn --cwd packages/backend add @backstage/plugin-scaffolder-backend
```
-### Adding the plugin to your `packages/backend`
+Then add the plugin to your backend, typically in `packages/backend/src/index.ts`:
-You'll need to add the plugin to the router in your `backend` package. You can
-do this by creating a file called `packages/backend/src/plugins/scaffolder.ts`
-with contents matching [scaffolder.ts in the create-app
-template](https://github.com/backstage/backstage/blob/master/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts).
+```ts
+const backend = createBackend();
+// ...
+backend.add(import('@backstage/plugin-scaffolder-backend/alpha'));
+```
+
+#### Old backend system
+
+In the old backend system there's a bit more wiring required. You'll need to
+create a file called `packages/backend/src/plugins/scaffolder.ts`
+with contents matching [scaffolder.ts in the create-app template](https://github.com/backstage/backstage/blob/ad9314d3a7e0405719ba93badf96e97adde8ef83/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts).
With the `scaffolder.ts` router setup in place, add the router to
`packages/backend/src/index.ts`:
@@ -54,10 +59,7 @@ async function main() {
### Adding templates
At this point the scaffolder backend is installed in your backend package, but
-you will not have any templates available to use. These need to be [added to the
-software
-catalog](https://backstage.io/docs/features/software-templates/adding-templates).
+you will not have any templates available to use. These need to be [added to the software catalog](https://backstage.io/docs/features/software-templates/adding-templates).
To get up and running and try out some templates quickly, you can or copy the
-catalog locations from the [create-app
-template](https://github.com/backstage/backstage/blob/master/packages/create-app/templates/default-app/app-config.yaml.hbs).
+catalog locations from the [create-app template](https://github.com/backstage/backstage/blob/master/packages/create-app/templates/default-app/app-config.yaml.hbs).
diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md
index 6af1ac04a6..c141733ec4 100644
--- a/plugins/scaffolder-backend/api-report.md
+++ b/plugins/scaffolder-backend/api-report.md
@@ -3,6 +3,8 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
+///
+
import { ActionContext as ActionContext_2 } from '@backstage/plugin-scaffolder-node';
import { AuthService } from '@backstage/backend-plugin-api';
import * as azure from '@backstage/plugin-scaffolder-backend-module-azure';
@@ -136,15 +138,15 @@ export function createFetchCatalogEntityAction(options: {
auth?: AuthService;
}): TemplateAction_2<
{
- entityRef?: string | undefined;
- entityRefs?: string[] | undefined;
optional?: boolean | undefined;
defaultKind?: string | undefined;
defaultNamespace?: string | undefined;
+ entityRef?: string | undefined;
+ entityRefs?: string[] | undefined;
},
{
- entity?: any;
entities?: any[] | undefined;
+ entity?: any;
}
>;
@@ -285,6 +287,8 @@ export const createPublishGithubPullRequestAction: (
commitMessage?: string | undefined;
update?: boolean | undefined;
forceFork?: boolean | undefined;
+ gitAuthorName?: string | undefined;
+ gitAuthorEmail?: string | undefined;
},
JsonObject
>;
@@ -370,6 +374,8 @@ export interface CurrentClaimedTask {
spec: TaskSpec;
state?: JsonObject;
taskId: string;
+ // (undocumented)
+ workspace?: Promise;
}
// @public
@@ -385,6 +391,8 @@ export class DatabaseTaskStore implements TaskStore {
// (undocumented)
claimTask(): Promise;
// (undocumented)
+ cleanWorkspace({ taskId }: { taskId: string }): Promise;
+ // (undocumented)
completeTask(options: {
taskId: string;
status: TaskStatus_2;
@@ -435,8 +443,15 @@ export class DatabaseTaskStore implements TaskStore {
ids: string[];
}>;
// (undocumented)
+ rehydrateWorkspace(options: {
+ taskId: string;
+ targetPath: string;
+ }): Promise;
+ // (undocumented)
saveTaskState(options: { taskId: string; state?: JsonObject }): Promise;
// (undocumented)
+ serializeWorkspace(options: { path: string; taskId: string }): Promise;
+ // (undocumented)
shutdownTask(options: TaskStoreShutDownTaskOptions): Promise;
}
@@ -529,6 +544,8 @@ export class TaskManager implements TaskContext_2 {
// (undocumented)
get cancelSignal(): AbortSignal;
// (undocumented)
+ cleanWorkspace?(): Promise;
+ // (undocumented)
complete(result: TaskCompletionState_2, metadata?: JsonObject): Promise;
// (undocumented)
static create(
@@ -537,6 +554,7 @@ export class TaskManager implements TaskContext_2 {
abortSignal: AbortSignal,
logger: Logger,
auth?: AuthService,
+ config?: Config,
): TaskManager;
// (undocumented)
get createdBy(): string | undefined;
@@ -556,8 +574,15 @@ export class TaskManager implements TaskContext_2 {
// (undocumented)
getWorkspaceName(): Promise;
// (undocumented)
+ rehydrateWorkspace?(options: {
+ taskId: string;
+ targetPath: string;
+ }): Promise;
+ // (undocumented)
get secrets(): TaskSecrets_2 | undefined;
// (undocumented)
+ serializeWorkspace?(options: { path: string }): Promise;
+ // (undocumented)
get spec(): TaskSpecV1beta3;
// (undocumented)
updateCheckpoint?(
@@ -588,6 +613,8 @@ export interface TaskStore {
// (undocumented)
claimTask(): Promise;
// (undocumented)
+ cleanWorkspace?({ taskId }: { taskId: string }): Promise;
+ // (undocumented)
completeTask(options: {
taskId: string;
status: TaskStatus;
@@ -629,11 +656,24 @@ export interface TaskStore {
ids: string[];
}>;
// (undocumented)
+ rehydrateWorkspace?(options: {
+ taskId: string;
+ targetPath: string;
+ }): Promise;
+ // (undocumented)
saveTaskState?(options: {
taskId: string;
state?: JsonObject;
}): Promise;
// (undocumented)
+ serializeWorkspace?({
+ path,
+ taskId,
+ }: {
+ path: string;
+ taskId: string;
+ }): Promise;
+ // (undocumented)
shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise;
}
diff --git a/plugins/scaffolder-backend/config.d.ts b/plugins/scaffolder-backend/config.d.ts
index 477defe026..754eedb55b 100644
--- a/plugins/scaffolder-backend/config.d.ts
+++ b/plugins/scaffolder-backend/config.d.ts
@@ -47,6 +47,11 @@ export interface Config {
*/
EXPERIMENTAL_recoverTasks?: boolean;
+ /**
+ * Sets the serialization of the workspace to have an ability to rerun the failed task.
+ */
+ EXPERIMENTAL_workspaceSerialization?: boolean;
+
/**
* Every task which is in progress state and having a last heartbeat longer than a specified timeout is going to
* be attempted to recover.
diff --git a/plugins/catalog-backend/src/ingestion/types.ts b/plugins/scaffolder-backend/migrations/20240401213200_workspace.js
similarity index 56%
rename from plugins/catalog-backend/src/ingestion/types.ts
rename to plugins/scaffolder-backend/migrations/20240401213200_workspace.js
index 6ca0ab259b..175de54cd9 100644
--- a/plugins/catalog-backend/src/ingestion/types.ts
+++ b/plugins/scaffolder-backend/migrations/20240401213200_workspace.js
@@ -14,20 +14,22 @@
* limitations under the License.
*/
-import {
- AnalyzeLocationRequest,
- AnalyzeLocationResponse,
-} from '@backstage/plugin-catalog-common';
+// @ts-check
-/** @public */
-export type LocationAnalyzer = {
- /**
- * Generates an entity configuration for given git repository. It's used for
- * importing new component to the backstage app.
- *
- * @param location - Git repository to analyze and generate config for.
- */
- analyzeLocation(
- location: AnalyzeLocationRequest,
- ): Promise;
+/**
+ * @param {import('knex').Knex} knex
+ */
+exports.up = async function up(knex) {
+ await knex.schema.alterTable('tasks', table => {
+ table.binary('workspace').nullable().comment('A snapshot of the workspace');
+ });
+};
+
+/**
+ * @param {import('knex').Knex} knex
+ */
+exports.down = async function down(knex) {
+ await knex.schema.alterTable('tasks', table => {
+ table.dropColumn('workspace');
+ });
};
diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json
index 338dc290e1..f748ccb92d 100644
--- a/plugins/scaffolder-backend/package.json
+++ b/plugins/scaffolder-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-backend",
- "version": "1.22.5-next.1",
+ "version": "1.22.6",
"description": "The Backstage backend plugin that helps you create new things",
"backstage": {
"role": "backend-plugin"
@@ -78,6 +78,7 @@
"@backstage/types": "workspace:^",
"@types/express": "^4.17.6",
"@types/luxon": "^3.0.0",
+ "concat-stream": "^2.0.0",
"express": "^4.17.1",
"express-promise-router": "^4.1.0",
"fs-extra": "^11.2.0",
@@ -93,6 +94,8 @@
"p-limit": "^3.1.0",
"p-queue": "^6.6.2",
"prom-client": "^15.0.0",
+ "tar": "^6.1.12",
+ "triple-beam": "^1.4.1",
"uuid": "^9.0.0",
"winston": "^3.2.1",
"winston-transport": "^4.7.0",
diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts
index 14a58e4975..6860902c78 100644
--- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts
+++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts
@@ -15,7 +15,7 @@
*/
import { Isolate } from 'isolated-vm';
-import { resolvePackagePath } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import {
TemplateFilter as _TemplateFilter,
TemplateGlobal as _TemplateGlobal,
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts
index 27c39dd098..9feaa14c07 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts
@@ -17,7 +17,7 @@
import fs from 'fs-extra';
import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
import * as yaml from 'yaml';
-import { resolveSafeChildPath } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { z } from 'zod';
import { examples } from './write.examples';
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts
index a017c2e224..673776bec9 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts
@@ -178,6 +178,7 @@ export const createBuiltinActions = (
createPublishGithubPullRequestAction({
integrations,
githubCredentialsProvider,
+ config,
}),
createPublishGitlabAction({
integrations,
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts
index 8bca630af9..c6beaa2d67 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plain.ts
@@ -14,7 +14,8 @@
* limitations under the License.
*/
-import { UrlReader, resolveSafeChildPath } from '@backstage/backend-common';
+import { UrlReader } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { ScmIntegrations } from '@backstage/integration';
import { examples } from './plain.examples';
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts
index da0255ff5a..92db7aa3ed 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/plainFile.ts
@@ -14,7 +14,8 @@
* limitations under the License.
*/
-import { UrlReader, resolveSafeChildPath } from '@backstage/backend-common';
+import { UrlReader } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { ScmIntegrations } from '@backstage/integration';
import { examples } from './plainFile.examples';
import {
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts
index 36f1f00b50..02fe0c30a4 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.examples.test.ts
@@ -16,7 +16,8 @@
import { join as joinPath, sep as pathSep } from 'path';
import fs from 'fs-extra';
-import { resolvePackagePath, UrlReader } from '@backstage/backend-common';
+import { UrlReader } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { ScmIntegrations } from '@backstage/integration';
import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test-utils';
import { createFetchTemplateAction } from './template';
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts
index fd0ef7d757..0542b6a50d 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts
@@ -21,7 +21,8 @@ jest.mock('@backstage/plugin-scaffolder-node', () => {
import { join as joinPath, sep as pathSep } from 'path';
import fs from 'fs-extra';
-import { resolvePackagePath, UrlReader } from '@backstage/backend-common';
+import { UrlReader } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { ScmIntegrations } from '@backstage/integration';
import { createFetchTemplateAction } from './template';
import {
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts
index b39582e18b..0983199339 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts
@@ -15,7 +15,8 @@
*/
import { extname } from 'path';
-import { resolveSafeChildPath, UrlReader } from '@backstage/backend-common';
+import { UrlReader } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { InputError } from '@backstage/errors';
import { ScmIntegrations } from '@backstage/integration';
import {
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts
index 5787d245ab..13dfc69525 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts
@@ -16,7 +16,7 @@
import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
import { InputError } from '@backstage/errors';
-import { resolveSafeChildPath } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import fs from 'fs-extra';
import { examples } from './delete.examples';
diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.ts
index 5d9d666d15..238fc9e8c0 100644
--- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/rename.ts
@@ -15,7 +15,7 @@
*/
import { createTemplateAction } from '@backstage/plugin-scaffolder-node';
-import { resolveSafeChildPath } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { InputError } from '@backstage/errors';
import fs from 'fs-extra';
import { examples } from './rename.examples';
diff --git a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts
index 2eaa505c8c..6b8caf5a3d 100644
--- a/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/dryrun/createDryRunner.ts
@@ -33,9 +33,11 @@ import { TemplateActionRegistry } from '../actions';
import { NunjucksWorkflowRunner } from '../tasks/NunjucksWorkflowRunner';
import { DecoratedActionsRegistry } from './DecoratedActionsRegistry';
import fs from 'fs-extra';
-import { resolveSafeChildPath } from '@backstage/backend-common';
import { PermissionEvaluator } from '@backstage/plugin-permission-common';
-import { BackstageCredentials } from '@backstage/backend-plugin-api';
+import {
+ BackstageCredentials,
+ resolveSafeChildPath,
+} from '@backstage/backend-plugin-api';
interface DryRunInput {
spec: TaskSpec;
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts
index ab80dcff04..f4fae0715b 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.test.ts
@@ -19,6 +19,8 @@ import { ConfigReader } from '@backstage/config';
import { DatabaseTaskStore } from './DatabaseTaskStore';
import { TaskSpec } from '@backstage/plugin-scaffolder-common';
import { ConflictError } from '@backstage/errors';
+import { createMockDirectory } from '@backstage/backend-test-utils';
+import fs from 'fs-extra';
const createStore = async () => {
const manager = DatabaseManager.fromConfig(
@@ -37,6 +39,18 @@ const createStore = async () => {
return { store, manager };
};
+const workspaceDir = createMockDirectory({
+ content: {
+ 'app-config.yaml': `
+ app:
+ title: Example App
+ sessionKey:
+ $file: secrets/session-key.txt
+ escaped: \$\${Escaped}
+ `,
+ },
+});
+
describe('DatabaseTaskStore', () => {
it('should create the database store and run migration', async () => {
const { store, manager } = await createStore();
@@ -259,4 +273,22 @@ describe('DatabaseTaskStore', () => {
},
});
});
+
+ it('serialize and restore the workspace', async () => {
+ const { store } = await createStore();
+ const { taskId } = await store.createTask({
+ spec: {} as TaskSpec,
+ createdBy: 'me',
+ });
+
+ await store.serializeWorkspace({ path: workspaceDir.path, taskId });
+ expect(fs.existsSync(`${workspaceDir.path}/app-config.yaml`)).toBeTruthy();
+
+ fs.removeSync(workspaceDir.path);
+ expect(fs.existsSync(`${workspaceDir.path}/app-config.yaml`)).toBeFalsy();
+
+ fs.mkdirSync(workspaceDir.path);
+ await store.rehydrateWorkspace({ targetPath: workspaceDir.path, taskId });
+ expect(fs.existsSync(`${workspaceDir.path}/app-config.yaml`)).toBeTruthy();
+ });
});
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts
index ac391ea2b6..9c95c11017 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts
@@ -15,10 +15,8 @@
*/
import { JsonObject } from '@backstage/types';
-import {
- PluginDatabaseManager,
- resolvePackagePath,
-} from '@backstage/backend-common';
+import { PluginDatabaseManager } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { ConflictError, NotFoundError } from '@backstage/errors';
import { Knex } from 'knex';
import { v4 as uuid } from 'uuid';
@@ -42,6 +40,7 @@ import { DateTime, Duration } from 'luxon';
import { TaskRecovery, TaskSpec } from '@backstage/plugin-scaffolder-common';
import { trimEventsTillLastRecovery } from './taskRecoveryHelper';
import { intervalFromNowTill } from './dbUtil';
+import { restoreWorkspace, serializeWorkspace } from './serializer';
const migrationsDir = resolvePackagePath(
'@backstage/plugin-scaffolder-backend',
@@ -57,6 +56,7 @@ export type RawDbTaskRow = {
created_at: string;
created_by: string | null;
secrets?: string | null;
+ workspace?: Buffer;
};
export type RawDbTaskEventRow = {
@@ -509,6 +509,36 @@ export class DatabaseTaskStore implements TaskStore {
});
}
+ async rehydrateWorkspace(options: {
+ taskId: string;
+ targetPath: string;
+ }): Promise {
+ const [result] = await this.db('tasks')
+ .where({ id: options.taskId })
+ .select('workspace');
+
+ await restoreWorkspace(options.targetPath, result.workspace);
+ }
+
+ async cleanWorkspace({ taskId }: { taskId: string }): Promise {
+ await this.db('tasks').where({ id: taskId }).update({
+ workspace: undefined,
+ });
+ }
+
+ async serializeWorkspace(options: {
+ path: string;
+ taskId: string;
+ }): Promise {
+ if (options.path) {
+ await this.db('tasks')
+ .where({ id: options.taskId })
+ .update({
+ workspace: await serializeWorkspace(options.path),
+ });
+ }
+ }
+
async cancelTask(
options: TaskStoreEmitOptions<{ message: string } & JsonObject>,
): Promise {
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts
index 5d24ac7cc7..77097e97ea 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts
@@ -419,6 +419,8 @@ export class NunjucksWorkflowRunner implements WorkflowRunner {
reason: stringifyError(err),
});
throw err;
+ } finally {
+ await task.serializeWorkspace?.({ path: workspacePath });
}
},
createTemporaryDirectory: async () => {
@@ -455,11 +457,14 @@ export class NunjucksWorkflowRunner implements WorkflowRunner {
throw new Error(`Step ${step.name} has been cancelled.`);
}
+ await task.cleanWorkspace?.();
await stepTrack.markSuccessful();
} catch (err) {
await taskTrack.markFailed(step, err);
await stepTrack.markFailed();
throw err;
+ } finally {
+ await task.serializeWorkspace?.({ path: workspacePath });
}
}
@@ -469,10 +474,9 @@ export class NunjucksWorkflowRunner implements WorkflowRunner {
'Wrong template version executed with the workflow engine',
);
}
- const workspacePath = path.join(
- this.options.workingDirectory,
- await task.getWorkspaceName(),
- );
+ const taskId = await task.getWorkspaceName();
+
+ const workspacePath = path.join(this.options.workingDirectory, taskId);
const { additionalTemplateFilters, additionalTemplateGlobals } =
this.options;
@@ -486,6 +490,8 @@ export class NunjucksWorkflowRunner implements WorkflowRunner {
});
try {
+ await task.rehydrateWorkspace?.({ taskId, targetPath: workspacePath });
+
const taskTrack = await this.tracker.taskStart(task);
await fs.ensureDir(workspacePath);
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts
index e9a408d9d6..03a2833938 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.ts
@@ -64,8 +64,16 @@ export class TaskManager implements TaskContext {
abortSignal: AbortSignal,
logger: Logger,
auth?: AuthService,
+ config?: Config,
) {
- const agent = new TaskManager(task, storage, abortSignal, logger, auth);
+ const agent = new TaskManager(
+ task,
+ storage,
+ abortSignal,
+ logger,
+ auth,
+ config,
+ );
agent.startTimeout();
return agent;
}
@@ -77,6 +85,7 @@ export class TaskManager implements TaskContext {
private readonly signal: AbortSignal,
private readonly logger: Logger,
private readonly auth?: AuthService,
+ private readonly config?: Config,
) {}
get spec() {
@@ -99,6 +108,15 @@ export class TaskManager implements TaskContext {
return this.task.taskId;
}
+ async rehydrateWorkspace?(options: {
+ taskId: string;
+ targetPath: string;
+ }): Promise {
+ if (this.isWorkspaceSerializationEnabled()) {
+ this.storage.rehydrateWorkspace?.(options);
+ }
+ }
+
get done() {
return this.isDone;
}
@@ -144,6 +162,21 @@ export class TaskManager implements TaskContext {
});
}
+ async serializeWorkspace?(options: { path: string }): Promise {
+ if (this.isWorkspaceSerializationEnabled()) {
+ await this.storage.serializeWorkspace?.({
+ path: options.path,
+ taskId: this.task.taskId,
+ });
+ }
+ }
+
+ async cleanWorkspace?(): Promise {
+ if (this.isWorkspaceSerializationEnabled()) {
+ await this.storage.cleanWorkspace?.({ taskId: this.task.taskId });
+ }
+ }
+
async complete(
result: TaskCompletionState,
metadata?: JsonObject,
@@ -178,6 +211,14 @@ export class TaskManager implements TaskContext {
}, 1000);
}
+ private isWorkspaceSerializationEnabled(): boolean {
+ return (
+ this.config?.getOptionalBoolean(
+ 'scaffolder.EXPERIMENTAL_workspaceSerialization',
+ ) ?? false
+ );
+ }
+
async getInitiatorCredentials(): Promise {
const secrets = this.task.secrets as InternalTaskSecrets;
@@ -219,6 +260,8 @@ export interface CurrentClaimedTask {
* The creator of the task.
*/
createdBy?: string;
+
+ workspace?: Promise;
}
function defer() {
@@ -322,6 +365,7 @@ export class StorageTaskBroker implements TaskBroker {
abortController.signal,
this.logger,
this.auth,
+ this.config,
);
}
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts
index 064eb69349..3824a32a6f 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/logger.ts
@@ -21,6 +21,7 @@ import { JsonObject } from '@backstage/types';
import { Format, TransformableInfo } from 'logform';
import Transport, { TransportStreamOptions } from 'winston-transport';
import { Logger, format, createLogger, transports } from 'winston';
+import { MESSAGE } from 'triple-beam';
/**
* Escapes a given string to be used inside a RegExp.
@@ -107,20 +108,16 @@ export class WinstonLogger implements RootLoggerService {
let redactionPattern: RegExp | undefined = undefined;
- const replace = (obj: TransformableInfo) => {
- for (const key in obj) {
- if (obj.hasOwnProperty(key)) {
- if (typeof obj[key] === 'object') {
- obj[key] = replace(obj[key] as TransformableInfo);
- } else if (typeof obj[key] === 'string') {
- obj[key] = obj[key]?.replace(redactionPattern, '[REDACTED]');
- }
- }
- }
- return obj;
- };
return {
- format: format(replace)(),
+ format: format((obj: TransformableInfo) => {
+ if (!redactionPattern || !obj) {
+ return obj;
+ }
+
+ obj[MESSAGE] = obj[MESSAGE]?.replace?.(redactionPattern, '[REDACTED]');
+
+ return obj;
+ })(),
add(newRedactions) {
let added = 0;
for (const redactionToTrim of newRedactions) {
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.test.ts
new file mode 100644
index 0000000000..bec5398e28
--- /dev/null
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.test.ts
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2021 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 { serializeWorkspace, restoreWorkspace } from './serializer';
+import { createMockDirectory } from '@backstage/backend-test-utils';
+import fs from 'fs-extra';
+
+describe('serializer', () => {
+ const workspaceDir = createMockDirectory({
+ content: {
+ 'app-config.yaml': `
+ app:
+ title: Example App
+ sessionKey:
+ $file: secrets/session-key.txt
+ escaped: \$\${Escaped}
+ `,
+ 'app-config2.yaml': `
+ app:
+ title: Example App 2
+ sessionKey:
+ $file: secrets/session-key.txt
+ escaped: \$\${Escaped}
+ `,
+ 'app-config.development.yaml': `
+ app:
+ sessionKey: development-key
+ backend:
+ $include: ./included.yaml
+ other:
+ $include: secrets/included.yaml
+ `,
+ 'secrets/session-key.txt': 'abc123',
+ 'secrets/included.yaml': `
+ secret:
+ $file: session-key.txt
+ `,
+ 'included.yaml': `
+ foo:
+ bar: token \${MY_SECRET}
+ `,
+ 'app-config.substitute.yaml': `
+ app:
+ someConfig:
+ $include: \${SUBSTITUTE_ME}.yaml
+ noSubstitute:
+ $file: \$\${ESCAPE_ME}.txt
+ `,
+ 'substituted.yaml': `
+ secret:
+ $file: secrets/\${SUBSTITUTE_ME}.txt
+ `,
+ 'secrets/substituted.txt': '123abc',
+ '${ESCAPE_ME}.txt': 'notSubstituted',
+ 'empty.yaml': '# just a comment',
+ },
+ });
+
+ const restoredWorkspaceDir = createMockDirectory();
+
+ it('should be able to archive and restore the workspace', async () => {
+ const workspaceBuffer = await serializeWorkspace(workspaceDir.path);
+ await restoreWorkspace(restoredWorkspaceDir.path, workspaceBuffer);
+
+ expect(
+ fs.existsSync(`${restoredWorkspaceDir.path}/\$\{ESCAPE_ME\}.txt`),
+ ).toBeTruthy();
+ expect(
+ fs.existsSync(`${restoredWorkspaceDir.path}/app-config.development.yaml`),
+ ).toBeTruthy();
+ expect(
+ fs.existsSync(`${restoredWorkspaceDir.path}/app-config.substitute.yaml`),
+ ).toBeTruthy();
+ expect(
+ fs.existsSync(`${restoredWorkspaceDir.path}/app-config.yaml`),
+ ).toBeTruthy();
+ expect(
+ fs.existsSync(`${restoredWorkspaceDir.path}/app-config2.yaml`),
+ ).toBeTruthy();
+ expect(
+ fs.existsSync(`${restoredWorkspaceDir.path}/empty.yaml`),
+ ).toBeTruthy();
+ expect(
+ fs.existsSync(`${restoredWorkspaceDir.path}/included.yaml`),
+ ).toBeTruthy();
+ expect(fs.existsSync(`${restoredWorkspaceDir.path}/secrets`)).toBeTruthy();
+ expect(
+ fs.existsSync(`${restoredWorkspaceDir.path}/substituted.yaml`),
+ ).toBeTruthy();
+
+ expect(
+ fs.readFileSync(`${restoredWorkspaceDir.path}/substituted.yaml`, 'utf8'),
+ ).toEqual(`
+ secret:
+ $file: secrets/\${SUBSTITUTE_ME}.txt
+ `);
+ });
+});
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.ts
new file mode 100644
index 0000000000..69c48fb769
--- /dev/null
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/serializer.ts
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2021 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 tar from 'tar';
+import concatStream from 'concat-stream';
+import { promisify } from 'util';
+import { pipeline as pipelineCb, Readable } from 'stream';
+
+const pipeline = promisify(pipelineCb);
+
+export const serializeWorkspace = async (path: string): Promise => {
+ return await new Promise(async resolve => {
+ await pipeline(tar.create({ cwd: path }, ['']), concatStream(resolve));
+ });
+};
+
+export const restoreWorkspace = async (path: string, buffer?: Buffer) => {
+ if (buffer) {
+ await pipeline(
+ Readable.from(buffer),
+ tar.extract({
+ C: path,
+ }),
+ );
+ }
+};
diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts
index aa647d8bd6..0e0ebd706b 100644
--- a/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts
+++ b/plugins/scaffolder-backend/src/scaffolder/tasks/types.ts
@@ -211,6 +211,21 @@ export interface TaskStore {
): Promise<{ events: SerializedTaskEvent[] }>;
shutdownTask?(options: TaskStoreShutDownTaskOptions): Promise;
+
+ rehydrateWorkspace?(options: {
+ taskId: string;
+ targetPath: string;
+ }): Promise;
+
+ cleanWorkspace?({ taskId }: { taskId: string }): Promise;
+
+ serializeWorkspace?({
+ path,
+ taskId,
+ }: {
+ path: string;
+ taskId: string;
+ }): Promise;
}
export type WorkflowResponse = { output: { [key: string]: JsonValue } };
diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md
index 4a9e1b870b..8b5c2d7c99 100644
--- a/plugins/scaffolder-common/CHANGELOG.md
+++ b/plugins/scaffolder-common/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-scaffolder-common
+## 1.5.2
+
+### Patch Changes
+
+- 9156654: Capturing more event clicks for scaffolder
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+
## 1.5.2-next.1
### Patch Changes
@@ -641,8 +649,7 @@
- e72d371296: Added `TemplateEntityV1beta2` which was moved here from
`@backstage/plugin-scaffolder-common`. It has also been marked as deprecated in
- the process - please consider [migrating to `v1beta3`
- templates](https://backstage.io/docs/features/software-templates/migrating-from-v1beta2-to-v1beta3).
+ the process - please consider [migrating to `v1beta3` templates](https://backstage.io/docs/features/software-templates/migrating-from-v1beta2-to-v1beta3).
- c77c5c7eb6: Added `backstage.role` to `package.json`
- Updated dependencies
- @backstage/catalog-model@0.10.0
diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json
index 614bd16a25..a0060b1427 100644
--- a/plugins/scaffolder-common/package.json
+++ b/plugins/scaffolder-common/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-common",
- "version": "1.5.2-next.1",
+ "version": "1.5.2",
"description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin",
"backstage": {
"role": "common-library"
diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md
index 5914c8fdee..72804941e4 100644
--- a/plugins/scaffolder-node-test-utils/CHANGELOG.md
+++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-scaffolder-node-test-utils
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-test-utils@0.3.8
+ - @backstage/plugin-scaffolder-node@0.4.4
+
## 0.1.4-next.1
### Patch Changes
diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json
index 99adae5ab7..8686592f7a 100644
--- a/plugins/scaffolder-node-test-utils/package.json
+++ b/plugins/scaffolder-node-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-node-test-utils",
- "version": "0.1.4-next.1",
+ "version": "0.1.4",
"backstage": {
"role": "node-library"
},
diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md
index f1739c59e4..5c6fe0f6cc 100644
--- a/plugins/scaffolder-node/CHANGELOG.md
+++ b/plugins/scaffolder-node/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-scaffolder-node
+## 0.4.4
+
+### Patch Changes
+
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- e4b50ab: Scaffolder workspace serialization
+- f633efa: To remove the dependency on the soon-to-be-deprecated `backend-common` package, this package now maintains its own isomorphic Git class implementation.
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.2
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/integration@1.11.0
+
+## 0.4.4-next.2
+
+### Patch Changes
+
+- e4b50ab: Scaffolder workspace serialization
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 0.4.4-next.1
### Patch Changes
diff --git a/plugins/scaffolder-node/api-report.md b/plugins/scaffolder-node/api-report.md
index c757301249..66e8ccd678 100644
--- a/plugins/scaffolder-node/api-report.md
+++ b/plugins/scaffolder-node/api-report.md
@@ -344,6 +344,8 @@ export interface TaskContext {
// (undocumented)
cancelSignal: AbortSignal;
// (undocumented)
+ cleanWorkspace?(): Promise;
+ // (undocumented)
complete(result: TaskCompletionState, metadata?: JsonObject): Promise;
// (undocumented)
createdBy?: string;
@@ -365,8 +367,15 @@ export interface TaskContext {
// (undocumented)
isDryRun?: boolean;
// (undocumented)
+ rehydrateWorkspace?(options: {
+ taskId: string;
+ targetPath: string;
+ }): Promise;
+ // (undocumented)
secrets?: TaskSecrets;
// (undocumented)
+ serializeWorkspace?(options: { path: string }): Promise;
+ // (undocumented)
spec: TaskSpec;
// (undocumented)
updateCheckpoint?(
diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json
index f0776e6491..af26f204dd 100644
--- a/plugins/scaffolder-node/package.json
+++ b/plugins/scaffolder-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-node",
- "version": "0.4.4-next.1",
+ "version": "0.4.4",
"description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend",
"backstage": {
"role": "node-library"
@@ -54,6 +54,7 @@
"@backstage/types": "workspace:^",
"fs-extra": "^11.2.0",
"globby": "^11.0.0",
+ "isomorphic-git": "^1.23.0",
"jsonschema": "^1.2.6",
"p-limit": "^3.1.0",
"winston": "^3.2.1",
diff --git a/plugins/scaffolder-node/src/actions/fetch.ts b/plugins/scaffolder-node/src/actions/fetch.ts
index 6b3e08bc7e..63bc4b1352 100644
--- a/plugins/scaffolder-node/src/actions/fetch.ts
+++ b/plugins/scaffolder-node/src/actions/fetch.ts
@@ -14,7 +14,8 @@
* limitations under the License.
*/
-import { resolveSafeChildPath, UrlReader } from '@backstage/backend-common';
+import { UrlReader } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { InputError } from '@backstage/errors';
import { ScmIntegrations } from '@backstage/integration';
import fs from 'fs-extra';
diff --git a/plugins/scaffolder-node/src/actions/gitHelpers.test.ts b/plugins/scaffolder-node/src/actions/gitHelpers.test.ts
index b230b2cd06..64281d660f 100644
--- a/plugins/scaffolder-node/src/actions/gitHelpers.test.ts
+++ b/plugins/scaffolder-node/src/actions/gitHelpers.test.ts
@@ -14,7 +14,8 @@
* limitations under the License.
*/
-import { Git, getVoidLogger } from '@backstage/backend-common';
+import { getVoidLogger } from '@backstage/backend-common';
+import { Git } from '../scm';
import {
commitAndPushRepo,
initRepoAndPush,
@@ -24,7 +25,7 @@ import {
cloneRepo,
} from './gitHelpers';
-jest.mock('@backstage/backend-common', () => ({
+jest.mock('../scm', () => ({
Git: {
fromAuth: jest.fn().mockReturnValue({
init: jest.fn(),
diff --git a/plugins/scaffolder-node/src/actions/gitHelpers.ts b/plugins/scaffolder-node/src/actions/gitHelpers.ts
index 2026e75247..04f47d1648 100644
--- a/plugins/scaffolder-node/src/actions/gitHelpers.ts
+++ b/plugins/scaffolder-node/src/actions/gitHelpers.ts
@@ -14,8 +14,8 @@
* limitations under the License.
*/
-import { Git } from '@backstage/backend-common';
import { Logger } from 'winston';
+import { Git } from '../scm';
/**
* @public
diff --git a/plugins/scaffolder-node/src/actions/util.ts b/plugins/scaffolder-node/src/actions/util.ts
index 7f7121ef16..2b3a1296bf 100644
--- a/plugins/scaffolder-node/src/actions/util.ts
+++ b/plugins/scaffolder-node/src/actions/util.ts
@@ -15,7 +15,7 @@
*/
import { InputError } from '@backstage/errors';
-import { isChildPath } from '@backstage/backend-common';
+import { isChildPath } from '@backstage/backend-plugin-api';
import { join as joinPath, normalize as normalizePath } from 'path';
import { ScmIntegrationRegistry } from '@backstage/integration';
diff --git a/plugins/scaffolder-node/src/files/deserializeDirectoryContents.ts b/plugins/scaffolder-node/src/files/deserializeDirectoryContents.ts
index bdcecd99f1..4c6ae251ee 100644
--- a/plugins/scaffolder-node/src/files/deserializeDirectoryContents.ts
+++ b/plugins/scaffolder-node/src/files/deserializeDirectoryContents.ts
@@ -16,7 +16,7 @@
import fs from 'fs-extra';
import { dirname } from 'path';
-import { resolveSafeChildPath } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { SerializedFile } from './types';
/**
diff --git a/plugins/scaffolder-node/src/files/serializeDirectoryContents.ts b/plugins/scaffolder-node/src/files/serializeDirectoryContents.ts
index 7e52f6323b..1b83a8cf32 100644
--- a/plugins/scaffolder-node/src/files/serializeDirectoryContents.ts
+++ b/plugins/scaffolder-node/src/files/serializeDirectoryContents.ts
@@ -17,7 +17,7 @@
import { promises as fs } from 'fs';
import globby from 'globby';
import limiterFactory from 'p-limit';
-import { resolveSafeChildPath } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import { SerializedFile } from './types';
import { isError } from '@backstage/errors';
diff --git a/plugins/scaffolder-node/src/scm/git.test.ts b/plugins/scaffolder-node/src/scm/git.test.ts
new file mode 100644
index 0000000000..1c07dfb917
--- /dev/null
+++ b/plugins/scaffolder-node/src/scm/git.test.ts
@@ -0,0 +1,606 @@
+/*
+ * 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.
+ */
+jest.mock('isomorphic-git');
+jest.mock('isomorphic-git/http/node');
+jest.mock('fs-extra');
+
+import * as isomorphic from 'isomorphic-git';
+import { Git } from './git';
+import http from 'isomorphic-git/http/node';
+import fs from 'fs-extra';
+
+describe('Git', () => {
+ beforeEach(() => {
+ jest.resetAllMocks();
+ });
+
+ describe('add', () => {
+ it('should call isomorphic-git add with the correct arguments', async () => {
+ const git = Git.fromAuth({});
+ const dir = 'mockdirectory';
+ const filepath = 'mockfile/path';
+
+ await git.add({ dir, filepath });
+
+ expect(isomorphic.add).toHaveBeenCalledWith({
+ fs,
+ dir,
+ filepath,
+ });
+ });
+ });
+
+ describe('addRemote', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const git = Git.fromAuth({});
+ const dir = 'mockdirectory';
+ const remote = 'origin';
+ const url = 'git@github.com/something/sads';
+ const force = true;
+
+ await git.addRemote({ dir, remote, url, force });
+
+ expect(isomorphic.addRemote).toHaveBeenCalledWith({
+ fs,
+ dir,
+ remote,
+ url,
+ force,
+ });
+ });
+ });
+
+ describe('remove', () => {
+ it('should call isomorphic-git remove with the correct arguments', async () => {
+ const git = Git.fromAuth({});
+ const dir = 'mockdirectory';
+ const filepath = 'mockfile/path';
+
+ await git.remove({ dir, filepath });
+
+ expect(isomorphic.remove).toHaveBeenCalledWith({
+ fs,
+ dir,
+ filepath,
+ });
+ });
+ });
+
+ describe('deleteRemote', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const git = Git.fromAuth({});
+ const dir = 'mockdirectory';
+ const remote = 'origin';
+
+ await git.deleteRemote({ dir, remote });
+
+ expect(isomorphic.deleteRemote).toHaveBeenCalledWith({
+ fs,
+ dir,
+ remote,
+ });
+ });
+ });
+
+ describe('checkout', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const git = Git.fromAuth({});
+ const dir = 'mockdirectory';
+ const ref = 'master';
+
+ await git.checkout({ dir, ref });
+
+ expect(isomorphic.checkout).toHaveBeenCalledWith({
+ fs,
+ dir,
+ ref,
+ });
+ });
+ });
+
+ describe('branch', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const git = Git.fromAuth({});
+ const dir = 'mockdirectory';
+ const ref = 'master';
+
+ await git.branch({ dir, ref });
+
+ expect(isomorphic.branch).toHaveBeenCalledWith({
+ fs,
+ dir,
+ ref,
+ });
+ });
+ });
+
+ describe('commit', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const git = Git.fromAuth({});
+ const dir = 'mockdirectory';
+ const message = 'Inital Commit';
+ const author = {
+ name: 'author',
+ email: 'test@backstage.io',
+ };
+ const committer = {
+ name: 'comitter',
+ email: 'test@backstage.io',
+ };
+
+ await git.commit({ dir, message, author, committer });
+
+ expect(isomorphic.commit).toHaveBeenCalledWith({
+ fs,
+ dir,
+ message,
+ author,
+ committer,
+ });
+ });
+ });
+
+ describe('clone', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const url = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+
+ await git.clone({ url, dir });
+
+ expect(isomorphic.clone).toHaveBeenCalledWith({
+ fs,
+ http,
+ url,
+ dir,
+ singleBranch: true,
+ depth: 1,
+ onProgress: expect.any(Function),
+ headers: {
+ 'user-agent': 'git/@isomorphic-git',
+ },
+ onAuth: expect.any(Function),
+ });
+ });
+
+ it('should call isomorphic-git with the correct arguments (Bearer)', async () => {
+ const url = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ token: 'test',
+ };
+ const git = Git.fromAuth(auth);
+
+ await git.clone({ url, dir });
+
+ expect(isomorphic.clone).toHaveBeenCalledWith({
+ fs,
+ http,
+ url,
+ dir,
+ singleBranch: true,
+ depth: 1,
+ onProgress: expect.any(Function),
+ headers: {
+ Authorization: 'Bearer test',
+ 'user-agent': 'git/@isomorphic-git',
+ },
+ onAuth: expect.any(Function),
+ });
+ });
+
+ it('should pass a function that returns the authorization as the onAuth handler when username and password are specified', async () => {
+ const url = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+
+ await git.clone({ url, dir });
+
+ const { onAuth } = (
+ isomorphic.clone as unknown as jest.Mock<(typeof isomorphic)['clone']>
+ ).mock.calls[0][0]!;
+
+ expect(onAuth()).toEqual(auth);
+ });
+
+ it('should pass the provided callback as the onAuth handler when on auth is specified', async () => {
+ const url = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'from',
+ password: 'callback',
+ };
+
+ const git = Git.fromAuth({ onAuth: () => auth });
+
+ await git.clone({ url, dir });
+
+ const { onAuth } = (
+ isomorphic.clone as unknown as jest.Mock<(typeof isomorphic)['clone']>
+ ).mock.calls[0][0]!;
+
+ expect(onAuth()).toEqual(auth);
+ });
+
+ it('should propagate the data from the error handler', async () => {
+ const url = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+
+ (isomorphic.clone as jest.Mock).mockImplementation(() => {
+ const error: Error & { data?: unknown } = new Error('mock error');
+ error.data = { some: 'more information here' };
+
+ throw error;
+ });
+
+ await expect(git.clone({ url, dir })).rejects.toThrow(
+ 'more information here',
+ );
+ });
+ });
+
+ describe('currentBranch', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const dir = '/some/mock/dir';
+ const fullName = true;
+ const git = Git.fromAuth({});
+
+ await git.currentBranch({ dir, fullName });
+
+ expect(isomorphic.currentBranch).toHaveBeenCalledWith({
+ fs,
+ dir,
+ fullname: true,
+ });
+
+ await git.currentBranch({ dir });
+
+ expect(isomorphic.currentBranch).toHaveBeenCalledWith({
+ fs,
+ dir,
+ fullname: false,
+ });
+ });
+ });
+
+ describe('fetch', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const remote = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+
+ await git.fetch({ remote, dir, tags: true });
+
+ expect(isomorphic.fetch).toHaveBeenCalledWith({
+ fs,
+ http,
+ remote,
+ dir,
+ tags: true,
+ onProgress: expect.any(Function),
+ headers: {
+ 'user-agent': 'git/@isomorphic-git',
+ },
+ onAuth: expect.any(Function),
+ });
+ });
+
+ it('should call isomorphic-git with the correct arguments (Bearer)', async () => {
+ const remote = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ token: 'test',
+ };
+ const git = Git.fromAuth(auth);
+
+ await git.fetch({ remote, dir });
+
+ expect(isomorphic.fetch).toHaveBeenCalledWith({
+ fs,
+ http,
+ remote,
+ dir,
+ tags: false,
+ onProgress: expect.any(Function),
+ headers: {
+ Authorization: 'Bearer test',
+ 'user-agent': 'git/@isomorphic-git',
+ },
+ onAuth: expect.any(Function),
+ });
+ });
+
+ it('should pass a function that returns the authorization as the onAuth handler', async () => {
+ const remote = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+
+ await git.fetch({ remote, dir });
+
+ const { onAuth } = (
+ isomorphic.fetch as unknown as jest.Mock<(typeof isomorphic)['fetch']>
+ ).mock.calls[0][0]!;
+
+ expect(onAuth()).toEqual(auth);
+ });
+
+ it('should propagate the data from the error handler', async () => {
+ const remote = 'http://github.com/some/repo';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+
+ (isomorphic.fetch as jest.Mock).mockImplementation(() => {
+ const error: Error & { data?: unknown } = new Error('mock error');
+ error.data = { some: 'more information here' };
+
+ throw error;
+ });
+
+ await expect(git.fetch({ remote, dir })).rejects.toThrow(
+ 'more information here',
+ );
+ });
+ });
+
+ describe('init', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const dir = '/some/mock/dir';
+ const defaultBranch = 'master';
+
+ const git = Git.fromAuth({});
+
+ await git.init({ dir, defaultBranch });
+
+ expect(isomorphic.init).toHaveBeenCalledWith({
+ fs,
+ dir,
+ defaultBranch,
+ });
+ });
+ });
+
+ describe('merge', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const dir = '/some/mock/dir';
+ const author = {
+ name: 'author',
+ email: 'test@backstage.io',
+ };
+ const committer = {
+ name: 'comitter',
+ email: 'test@backstage.io',
+ };
+ const theirs = 'master';
+ const ours = 'production';
+
+ const git = Git.fromAuth({});
+
+ await git.merge({ dir, theirs, ours, author, committer });
+
+ expect(isomorphic.merge).toHaveBeenCalledWith({
+ fs,
+ dir,
+ ours,
+ theirs,
+ author,
+ committer,
+ });
+ });
+ });
+
+ describe('push', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const remote = 'origin';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+ const remoteRef = 'master';
+ const force = true;
+
+ await git.push({ dir, remote, remoteRef, force });
+
+ expect(isomorphic.push).toHaveBeenCalledWith({
+ fs,
+ http,
+ remote,
+ dir,
+ remoteRef,
+ force,
+ onProgress: expect.any(Function),
+ headers: {
+ 'user-agent': 'git/@isomorphic-git',
+ },
+ onAuth: expect.any(Function),
+ });
+ });
+
+ it('should call isomorphic-git with the correct arguments (Bearer)', async () => {
+ const remote = 'origin';
+ const dir = '/some/mock/dir';
+ const auth = {
+ token: 'test',
+ };
+ const git = Git.fromAuth(auth);
+ const remoteRef = 'master';
+ const force = true;
+
+ await git.push({ dir, remote, remoteRef, force });
+
+ expect(isomorphic.push).toHaveBeenCalledWith({
+ fs,
+ http,
+ remote,
+ dir,
+ remoteRef,
+ force,
+ onProgress: expect.any(Function),
+ headers: {
+ Authorization: 'Bearer test',
+ 'user-agent': 'git/@isomorphic-git',
+ },
+ onAuth: expect.any(Function),
+ });
+ });
+
+ it('should call isomorphic-git with remoteRef parameter', async () => {
+ const remote = 'origin';
+ const remoteRef = 'refs/for/master';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+
+ await git.push({ dir, remote, remoteRef });
+
+ expect(isomorphic.push).toHaveBeenCalledWith({
+ fs,
+ http,
+ remote,
+ remoteRef,
+ dir,
+ onProgress: expect.any(Function),
+ headers: {
+ 'user-agent': 'git/@isomorphic-git',
+ },
+ onAuth: expect.any(Function),
+ });
+ });
+
+ it('should pass a function that returns the authorization as the onAuth handler', async () => {
+ const remote = 'origin';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+ const remoteRef = 'master';
+ const force = true;
+
+ await git.push({ remote, dir, remoteRef, force });
+
+ const { onAuth } = (
+ isomorphic.push as unknown as jest.Mock<(typeof isomorphic)['push']>
+ ).mock.calls[0][0]!;
+
+ expect(onAuth()).toEqual(auth);
+ });
+
+ it('should propagate the data from the error handler', async () => {
+ const remote = 'origin';
+ const dir = '/some/mock/dir';
+ const auth = {
+ username: 'blob',
+ password: 'hunter2',
+ };
+ const git = Git.fromAuth(auth);
+ const remoteRef = 'master';
+ const force = true;
+
+ (isomorphic.push as jest.Mock).mockImplementation(() => {
+ const error: Error & { data?: unknown } = new Error('mock error');
+ error.data = { some: 'more information here' };
+
+ throw error;
+ });
+
+ await expect(git.push({ remote, dir, remoteRef, force })).rejects.toThrow(
+ 'more information here',
+ );
+ });
+ });
+
+ describe('readCommit', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const dir = '/some/mock/dir';
+ const sha = 'as43bd7';
+
+ const git = Git.fromAuth({});
+
+ await git.readCommit({ dir, sha });
+
+ expect(isomorphic.readCommit).toHaveBeenCalledWith({
+ fs,
+ dir,
+ oid: sha,
+ });
+ });
+ });
+
+ describe('resolveRef', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const dir = '/some/mock/dir';
+ const ref = 'as43bd7';
+
+ const git = Git.fromAuth({});
+
+ await git.resolveRef({ dir, ref });
+
+ expect(isomorphic.resolveRef).toHaveBeenCalledWith({
+ fs,
+ dir,
+ ref,
+ });
+ });
+ });
+
+ describe('log', () => {
+ it('should call isomorphic-git with the correct arguments', async () => {
+ const dir = '/some/mock/dir';
+ const ref = 'as43bd7';
+
+ const git = Git.fromAuth({});
+
+ await git.log({ dir, ref });
+
+ expect(isomorphic.log).toHaveBeenCalledWith({
+ fs,
+ dir,
+ ref,
+ });
+ });
+ });
+});
diff --git a/packages/backend-common/src/scm/git.ts b/plugins/scaffolder-node/src/scm/git.ts
similarity index 100%
rename from packages/backend-common/src/scm/git.ts
rename to plugins/scaffolder-node/src/scm/git.ts
diff --git a/plugins/catalog-backend/src/ingestion/index.ts b/plugins/scaffolder-node/src/scm/index.ts
similarity index 86%
rename from plugins/catalog-backend/src/ingestion/index.ts
rename to plugins/scaffolder-node/src/scm/index.ts
index a6555dd98d..f9c59e99eb 100644
--- a/plugins/catalog-backend/src/ingestion/index.ts
+++ b/plugins/scaffolder-node/src/scm/index.ts
@@ -14,4 +14,5 @@
* limitations under the License.
*/
-export type { LocationAnalyzer } from './types';
+export { Git } from './git';
+export type { StaticAuthOptions, AuthCallbackOptions } from './git';
diff --git a/plugins/scaffolder-node/src/tasks/types.ts b/plugins/scaffolder-node/src/tasks/types.ts
index aef2c5f360..a2adb97b9c 100644
--- a/plugins/scaffolder-node/src/tasks/types.ts
+++ b/plugins/scaffolder-node/src/tasks/types.ts
@@ -141,6 +141,15 @@ export interface TaskContext {
},
): Promise;
+ serializeWorkspace?(options: { path: string }): Promise;
+
+ cleanWorkspace?(): Promise;
+
+ rehydrateWorkspace?(options: {
+ taskId: string;
+ targetPath: string;
+ }): Promise;
+
getWorkspaceName(): Promise;
getInitiatorCredentials(): Promise;
diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md
index 9c3a25638d..c445b76d06 100644
--- a/plugins/scaffolder-react/CHANGELOG.md
+++ b/plugins/scaffolder-react/CHANGELOG.md
@@ -1,5 +1,30 @@
# @backstage/plugin-scaffolder-react
+## 1.8.5
+
+### Patch Changes
+
+- 9156654: Capturing more event clicks for scaffolder
+- 0040ec2: Updated dependency `@rjsf/utils` to `5.18.2`.
+ Updated dependency `@rjsf/core` to `5.18.2`.
+ Updated dependency `@rjsf/material-ui` to `5.18.2`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.18.2`.
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.2
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/theme@0.5.4
+ - @backstage/catalog-client@1.6.5
+
+## 1.8.5-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+
## 1.8.5-next.1
### Patch Changes
diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json
index b7b7b20014..9187d9259d 100644
--- a/plugins/scaffolder-react/package.json
+++ b/plugins/scaffolder-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder-react",
- "version": "1.8.5-next.1",
+ "version": "1.8.5",
"description": "A frontend library that helps other Backstage plugins interact with the Scaffolder",
"backstage": {
"role": "web-library"
diff --git a/plugins/scaffolder-react/src/next/components/ScaffolderField/ScaffolderField.tsx b/plugins/scaffolder-react/src/next/components/ScaffolderField/ScaffolderField.tsx
index 1bb1656fd0..60c3907ddb 100644
--- a/plugins/scaffolder-react/src/next/components/ScaffolderField/ScaffolderField.tsx
+++ b/plugins/scaffolder-react/src/next/components/ScaffolderField/ScaffolderField.tsx
@@ -76,6 +76,7 @@ export const ScaffolderField = (
{displayLabel && rawDescription ? (
) : null}
diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md
index 9a7ecd2e50..c4949715d7 100644
--- a/plugins/scaffolder/CHANGELOG.md
+++ b/plugins/scaffolder/CHANGELOG.md
@@ -1,5 +1,47 @@
# @backstage/plugin-scaffolder
+## 1.20.0
+
+### Minor Changes
+
+- 4268696: `MultiEntityPicker` uses `EntityDisplayName` instead of `humanizeEntityRef` to display entity.
+
+### Patch Changes
+
+- 9156654: Capturing more event clicks for scaffolder
+- 131e5cb: Fix broken links in README.
+- 0040ec2: Updated dependency `@rjsf/utils` to `5.18.2`.
+ Updated dependency `@rjsf/core` to `5.18.2`.
+ Updated dependency `@rjsf/material-ui` to `5.18.2`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.18.2`.
+- 762141c: Fixed a bug where the `MultiEntityPicker` was not able to be set as required
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.2
+ - @backstage/plugin-scaffolder-react@1.8.5
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/integration@1.11.0
+ - @backstage/catalog-client@1.6.5
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/integration-react@1.1.27
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 1.19.4-next.2
+
+### Patch Changes
+
+- 762141c: Fixed a bug where the `MultiEntityPicker` was not able to be set as required
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/integration@1.11.0-next.0
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+ - @backstage/plugin-scaffolder-react@1.8.5-next.2
+ - @backstage/integration-react@1.1.27-next.0
+
## 1.19.4-next.1
### Patch Changes
diff --git a/plugins/scaffolder/README.md b/plugins/scaffolder/README.md
index a6af441d62..8acf456b08 100644
--- a/plugins/scaffolder/README.md
+++ b/plugins/scaffolder/README.md
@@ -1,7 +1,6 @@
# Scaffolder Frontend
-This is the React frontend for the default Backstage [software
-templates](https://backstage.io/docs/features/software-templates/).
+This is the React frontend for the default Backstage [software templates](https://backstage.io/docs/features/software-templates/).
This package supplies interfaces related to showing available templates in the
Backstage catalog and the workflow to create software using those templates.
diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md
index ccea88e27c..5c766af890 100644
--- a/plugins/scaffolder/api-report.md
+++ b/plugins/scaffolder/api-report.md
@@ -79,10 +79,10 @@ export const EntityNamePickerFieldExtension: FieldExtensionComponent_2<
export const EntityPickerFieldExtension: FieldExtensionComponent_2<
string,
{
- allowedKinds?: string[] | undefined;
defaultKind?: string | undefined;
- allowArbitraryValues?: boolean | undefined;
defaultNamespace?: string | false | undefined;
+ allowedKinds?: string[] | undefined;
+ allowArbitraryValues?: boolean | undefined;
catalogFilter?:
| Record<
string,
@@ -108,10 +108,10 @@ export const EntityPickerFieldExtension: FieldExtensionComponent_2<
export const EntityPickerFieldSchema: FieldSchema<
string,
{
- allowedKinds?: string[] | undefined;
defaultKind?: string | undefined;
- allowArbitraryValues?: boolean | undefined;
defaultNamespace?: string | false | undefined;
+ allowedKinds?: string[] | undefined;
+ allowArbitraryValues?: boolean | undefined;
catalogFilter?:
| Record<
string,
@@ -141,9 +141,9 @@ export type EntityPickerUiOptions =
export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2<
string[],
{
- kinds?: string[] | undefined;
- showCounts?: boolean | undefined;
helperText?: string | undefined;
+ showCounts?: boolean | undefined;
+ kinds?: string[] | undefined;
}
>;
@@ -151,9 +151,9 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2<
export const EntityTagsPickerFieldSchema: FieldSchema<
string[],
{
- kinds?: string[] | undefined;
- showCounts?: boolean | undefined;
helperText?: string | undefined;
+ showCounts?: boolean | undefined;
+ kinds?: string[] | undefined;
}
>;
@@ -215,8 +215,8 @@ export const MultiEntityPickerFieldExtension: FieldExtensionComponent_2<
string[],
{
defaultKind?: string | undefined;
- allowArbitraryValues?: boolean | undefined;
defaultNamespace?: string | false | undefined;
+ allowArbitraryValues?: boolean | undefined;
catalogFilter?:
| Record<
string,
@@ -267,10 +267,10 @@ export type MyGroupsPickerUiOptions =
export const OwnedEntityPickerFieldExtension: FieldExtensionComponent_2<
string,
{
- allowedKinds?: string[] | undefined;
defaultKind?: string | undefined;
- allowArbitraryValues?: boolean | undefined;
defaultNamespace?: string | false | undefined;
+ allowedKinds?: string[] | undefined;
+ allowArbitraryValues?: boolean | undefined;
catalogFilter?:
| Record<
string,
@@ -296,10 +296,10 @@ export const OwnedEntityPickerFieldExtension: FieldExtensionComponent_2<
export const OwnedEntityPickerFieldSchema: FieldSchema<
string,
{
- allowedKinds?: string[] | undefined;
defaultKind?: string | undefined;
- allowArbitraryValues?: boolean | undefined;
defaultNamespace?: string | false | undefined;
+ allowedKinds?: string[] | undefined;
+ allowArbitraryValues?: boolean | undefined;
catalogFilter?:
| Record<
string,
@@ -329,9 +329,9 @@ export type OwnedEntityPickerUiOptions =
export const OwnerPickerFieldExtension: FieldExtensionComponent_2<
string,
{
+ defaultNamespace?: string | false | undefined;
allowedKinds?: string[] | undefined;
allowArbitraryValues?: boolean | undefined;
- defaultNamespace?: string | false | undefined;
catalogFilter?:
| Record<
string,
@@ -357,9 +357,9 @@ export const OwnerPickerFieldExtension: FieldExtensionComponent_2<
export const OwnerPickerFieldSchema: FieldSchema<
string,
{
+ defaultNamespace?: string | false | undefined;
allowedKinds?: string[] | undefined;
allowArbitraryValues?: boolean | undefined;
- defaultNamespace?: string | false | undefined;
catalogFilter?:
| Record<
string,
@@ -407,12 +407,12 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2<
secretsKey: string;
additionalScopes?:
| {
- gitea?: string[] | undefined;
- gerrit?: string[] | undefined;
+ azure?: string[] | undefined;
github?: string[] | undefined;
gitlab?: string[] | undefined;
bitbucket?: string[] | undefined;
- azure?: string[] | undefined;
+ gerrit?: string[] | undefined;
+ gitea?: string[] | undefined;
}
| undefined;
}
@@ -434,12 +434,12 @@ export const RepoUrlPickerFieldSchema: FieldSchema<
secretsKey: string;
additionalScopes?:
| {
- gitea?: string[] | undefined;
- gerrit?: string[] | undefined;
+ azure?: string[] | undefined;
github?: string[] | undefined;
gitlab?: string[] | undefined;
bitbucket?: string[] | undefined;
- azure?: string[] | undefined;
+ gerrit?: string[] | undefined;
+ gitea?: string[] | undefined;
}
| undefined;
}
diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json
index 14c1d5b2de..c11f1a163a 100644
--- a/plugins/scaffolder/package.json
+++ b/plugins/scaffolder/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder",
- "version": "1.19.4-next.1",
+ "version": "1.20.0",
"description": "The Backstage plugin that helps you create new things",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.test.tsx b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.test.tsx
index bc0a5ed32d..4be07b139d 100644
--- a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.test.tsx
+++ b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.test.tsx
@@ -16,7 +16,11 @@
import { CATALOG_FILTER_EXISTS } from '@backstage/catalog-client';
import { Entity } from '@backstage/catalog-model';
-import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react';
+import {
+ CatalogApi,
+ catalogApiRef,
+ entityPresentationApiRef,
+} from '@backstage/plugin-catalog-react';
import { renderInTestApp, TestApiProvider } from '@backstage/test-utils';
import { fireEvent, screen } from '@testing-library/react';
@@ -24,6 +28,7 @@ import React from 'react';
import { MultiEntityPicker } from './MultiEntityPicker';
import { MultiEntityPickerProps } from './schema';
import { ScaffolderRJSFFieldProps as FieldProps } from '@backstage/plugin-scaffolder-react';
+import { DefaultEntityPresentationApi } from '@backstage/plugin-catalog';
const makeEntity = (kind: string, namespace: string, name: string): Entity => ({
apiVersion: 'scaffolder.backstage.io/v1beta3',
@@ -59,7 +64,15 @@ describe('', () => {
];
Wrapper = ({ children }: { children?: React.ReactNode }) => (
-
+
{children}
);
diff --git a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx
index d9804a8cba..f8fc831976 100644
--- a/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx
+++ b/plugins/scaffolder/src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx
@@ -25,7 +25,9 @@ import {
import { useApi } from '@backstage/core-plugin-api';
import {
catalogApiRef,
- humanizeEntityRef,
+ entityPresentationApiRef,
+ EntityDisplayName,
+ EntityRefPresentationSnapshot,
} from '@backstage/plugin-catalog-react';
import TextField from '@material-ui/core/TextField';
import FormControl from '@material-ui/core/FormControl';
@@ -64,33 +66,31 @@ export const MultiEntityPicker = (props: MultiEntityPickerProps) => {
uiSchema['ui:options']?.defaultNamespace || undefined;
const catalogApi = useApi(catalogApiRef);
-
+ const entityPresentationApi = useApi(entityPresentationApiRef);
const { value: entities, loading } = useAsync(async () => {
const { items } = await catalogApi.getEntities(
catalogFilter ? { filter: catalogFilter } : undefined,
);
- return items;
+ const entityRefToPresentation = new Map<
+ string,
+ EntityRefPresentationSnapshot
+ >(
+ await Promise.all(
+ items.map(async item => {
+ const presentation = await entityPresentationApi.forEntity(item)
+ .promise;
+ return [stringifyEntityRef(item), presentation] as [
+ string,
+ EntityRefPresentationSnapshot,
+ ];
+ }),
+ ),
+ );
+ return { entities: items, entityRefToPresentation };
});
const allowArbitraryValues =
uiSchema['ui:options']?.allowArbitraryValues ?? true;
- const getLabel = useCallback(
- (ref: string) => {
- try {
- return humanizeEntityRef(
- parseEntityRef(ref, { defaultKind, defaultNamespace }),
- {
- defaultKind,
- defaultNamespace,
- },
- );
- } catch (err) {
- return ref;
- }
- },
- [defaultKind, defaultNamespace],
- );
-
const onSelect = useCallback(
(_: any, refs: (string | Entity)[], reason: AutocompleteChangeReason) => {
const values = refs
@@ -130,8 +130,8 @@ export const MultiEntityPicker = (props: MultiEntityPickerProps) => {
);
useEffect(() => {
- if (entities?.length === 1) {
- onChange([stringifyEntityRef(entities[0])]);
+ if (entities?.entities?.length === 1) {
+ onChange([stringifyEntityRef(entities?.entities[0])]);
}
}, [entities, onChange]);
@@ -144,23 +144,18 @@ export const MultiEntityPicker = (props: MultiEntityPickerProps) => {
formData && formData.includes(stringifyEntityRef(e)),
- ) ?? (allowArbitraryValues && formData ? formData.map(getLabel) : [])
- }
loading={loading}
onChange={onSelect}
- options={entities || []}
+ options={entities?.entities || []}
+ renderOption={option => }
getOptionLabel={option =>
// option can be a string due to freeSolo.
typeof option === 'string'
? option
- : humanizeEntityRef(option, { defaultKind, defaultNamespace })!
+ : entities?.entityRefToPresentation.get(stringifyEntityRef(option))
+ ?.entityRef!
}
autoSelect
freeSolo={allowArbitraryValues}
@@ -170,10 +165,16 @@ export const MultiEntityPicker = (props: MultiEntityPickerProps) => {
label={title}
margin="dense"
helperText={description}
- FormHelperTextProps={{ margin: 'dense', style: { marginLeft: 0 } }}
+ FormHelperTextProps={{
+ margin: 'dense',
+ style: { marginLeft: 0 },
+ }}
variant="outlined"
required={required}
- InputProps={params.InputProps}
+ InputProps={{
+ ...params.InputProps,
+ required: formData.length === 0 && required,
+ }}
/>
)}
/>
diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md
index fb9977e0ea..d0c84a7617 100644
--- a/plugins/search-backend-module-catalog/CHANGELOG.md
+++ b/plugins/search-backend-module-catalog/CHANGELOG.md
@@ -1,5 +1,32 @@
# @backstage/plugin-search-backend-module-catalog
+## 0.1.24
+
+### Patch Changes
+
+- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`.
+- d5fff66: Fix wiring of the module exported at the `/alpha` path, which was causing authentication failures.
+- 5dc5f4f: Allow the `tokenManager` parameter to be optional when instantiating collator
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-search-backend-node@1.2.22
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.1.24-next.2
+
+### Patch Changes
+
+- b192752: Updated `README.md` to point to `packages/backend` instead of `packages/backend-next`.
+- 5dc5f4f: Allow the `tokenManager` parameter to be optional when instantiating collator
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+
## 0.1.24-next.1
### Patch Changes
diff --git a/plugins/search-backend-module-catalog/README.md b/plugins/search-backend-module-catalog/README.md
index cbabe13d6d..925d8d3b09 100644
--- a/plugins/search-backend-module-catalog/README.md
+++ b/plugins/search-backend-module-catalog/README.md
@@ -14,7 +14,7 @@ yarn --cwd packages/backend add @backstage/plugin-search-backend-module-catalog
Add the collator to your backend instance, along with the search plugin itself:
```tsx
-// packages/backend-next/src/index.ts
+// packages/backend/src/index.ts
import { createBackend } from '@backstage/backend-defaults';
import { searchPlugin } from '@backstage/plugin-search-backend/alpha';
import { searchModuleCatalogCollator } from '@backstage/plugin-search-backend-module-catalog/alpha';
@@ -32,7 +32,7 @@ You may also want to add configuration parameters to your app-config, for exampl
This module also has an extension point, which lets you inject advanced customizations. Here's an example of how to leverage that extension point to tweak the transformer used for building the search indexer documents:
```tsx
-// packages/backend-next/src/index.ts
+// packages/backend/src/index.ts
import { createBackend } from '@backstage/backend-defaults';
import { createBackendModule } from '@backstage/backend-plugin-api';
import { searchPlugin } from '@backstage/plugin-search-backend/alpha';
diff --git a/plugins/search-backend-module-catalog/api-report.md b/plugins/search-backend-module-catalog/api-report.md
index fc19ede2d4..8019ab0aac 100644
--- a/plugins/search-backend-module-catalog/api-report.md
+++ b/plugins/search-backend-module-catalog/api-report.md
@@ -44,7 +44,7 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory {
export type DefaultCatalogCollatorFactoryOptions = {
auth?: AuthService;
discovery: PluginEndpointDiscovery;
- tokenManager: TokenManager;
+ tokenManager?: TokenManager;
locationTemplate?: string;
filter?: GetEntitiesRequest['filter'];
batchSize?: number;
diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json
index ad03071eaf..f7eca60fbd 100644
--- a/plugins/search-backend-module-catalog/package.json
+++ b/plugins/search-backend-module-catalog/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend-module-catalog",
- "version": "0.1.24-next.1",
+ "version": "0.1.24",
"description": "A module for the search backend that exports catalog modules",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts
index 166985f2d5..22dcc67233 100644
--- a/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts
+++ b/plugins/search-backend-module-catalog/src/collators/DefaultCatalogCollatorFactory.ts
@@ -40,7 +40,7 @@ import { AuthService } from '@backstage/backend-plugin-api';
export type DefaultCatalogCollatorFactoryOptions = {
auth?: AuthService;
discovery: PluginEndpointDiscovery;
- tokenManager: TokenManager;
+ tokenManager?: TokenManager;
/**
* @deprecated Use the config key `search.collators.catalog.locationTemplate` instead.
*/
@@ -95,7 +95,6 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory {
entityTransformer: options.entityTransformer,
auth: adaptedAuth,
discovery: options.discovery,
- tokenManager: options.tokenManager,
catalogClient: options.catalogClient,
});
}
@@ -107,7 +106,6 @@ export class DefaultCatalogCollatorFactory implements DocumentCollatorFactory {
entityTransformer?: CatalogCollatorEntityTransformer;
auth: AuthService;
discovery: PluginEndpointDiscovery;
- tokenManager: TokenManager;
catalogClient?: CatalogApi;
}) {
const {
diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md
index 1af0204403..5bf9aa19ea 100644
--- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md
+++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-search-backend-module-elasticsearch
+## 1.4.1
+
+### Patch Changes
+
+- 5252ee1: Fix never resolved indexer promise.
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-search-backend-node@1.2.22
+
## 1.4.1-next.1
### Patch Changes
diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json
index 85489b4043..128bc0e28c 100644
--- a/plugins/search-backend-module-elasticsearch/package.json
+++ b/plugins/search-backend-module-elasticsearch/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend-module-elasticsearch",
- "version": "1.4.1-next.1",
+ "version": "1.4.1",
"description": "A module for the search backend that implements search using ElasticSearch",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts
index f8c996df51..93312c9fba 100644
--- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts
+++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts
@@ -345,6 +345,7 @@ export class ElasticSearchSearchEngine implements SearchEngine {
attempts++;
}
+ done();
});
if (cleanupError) {
diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md
index ce6499ab4e..fc8ff4b307 100644
--- a/plugins/search-backend-module-explore/CHANGELOG.md
+++ b/plugins/search-backend-module-explore/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/plugin-search-backend-module-explore
+## 0.1.24
+
+### Patch Changes
+
+- ca6e2e0: Migrate search collator to use the new auth services.
+- 5d99272: Update README.md to point to explore plugin in community-plugins repository.
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-search-backend-node@1.2.22
+
## 0.1.24-next.1
### Patch Changes
diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json
index d181d70cbf..28ba6945c3 100644
--- a/plugins/search-backend-module-explore/package.json
+++ b/plugins/search-backend-module-explore/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend-module-explore",
- "version": "0.1.24-next.1",
+ "version": "0.1.24",
"description": "A module for the search backend that exports explore modules",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md
index 37386a7fd1..ba6674606d 100644
--- a/plugins/search-backend-module-pg/CHANGELOG.md
+++ b/plugins/search-backend-module-pg/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-search-backend-module-pg
+## 0.5.27
+
+### Patch Changes
+
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-search-backend-node@1.2.22
+
## 0.5.27-next.1
### Patch Changes
diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json
index 3aec50e503..6645e2642f 100644
--- a/plugins/search-backend-module-pg/package.json
+++ b/plugins/search-backend-module-pg/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend-module-pg",
- "version": "0.5.27-next.1",
+ "version": "0.5.27",
"description": "A module for the search backend that implements search using PostgreSQL",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts
index 3019c63a64..88ba7072dd 100644
--- a/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts
+++ b/plugins/search-backend-module-pg/src/database/DatabaseDocumentStore.ts
@@ -13,10 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import {
- PluginDatabaseManager,
- resolvePackagePath,
-} from '@backstage/backend-common';
+import { PluginDatabaseManager } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { IndexableDocument } from '@backstage/plugin-search-common';
import { Knex } from 'knex';
import {
diff --git a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md
index c8faaf7609..c56c40ebe4 100644
--- a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md
+++ b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-search-backend-module-stack-overflow-collator
+## 0.1.11
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-search-backend-node@1.2.22
+
## 0.1.11-next.1
### Patch Changes
diff --git a/plugins/search-backend-module-stack-overflow-collator/package.json b/plugins/search-backend-module-stack-overflow-collator/package.json
index 3c76ed164b..5ae74d37bc 100644
--- a/plugins/search-backend-module-stack-overflow-collator/package.json
+++ b/plugins/search-backend-module-stack-overflow-collator/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend-module-stack-overflow-collator",
- "version": "0.1.11-next.1",
+ "version": "0.1.11",
"description": "A module for the search backend that exports stack overflow modules",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md
index e79c98ab5a..569a73c232 100644
--- a/plugins/search-backend-module-techdocs/CHANGELOG.md
+++ b/plugins/search-backend-module-techdocs/CHANGELOG.md
@@ -1,5 +1,31 @@
# @backstage/plugin-search-backend-module-techdocs
+## 0.1.23
+
+### Patch Changes
+
+- 5dc5f4f: Allow the `tokenManager` parameter to be optional when instantiating collator
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+ - @backstage/plugin-techdocs-node@1.12.4
+ - @backstage/plugin-search-backend-node@1.2.22
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 0.1.23-next.2
+
+### Patch Changes
+
+- 5dc5f4f: Allow the `tokenManager` parameter to be optional when instantiating collator
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.12.0-next.2
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-techdocs-node@1.12.4-next.2
+
## 0.1.23-next.1
### Patch Changes
diff --git a/plugins/search-backend-module-techdocs/api-report.md b/plugins/search-backend-module-techdocs/api-report.md
index fbdecef2a8..35cf8533cf 100644
--- a/plugins/search-backend-module-techdocs/api-report.md
+++ b/plugins/search-backend-module-techdocs/api-report.md
@@ -45,7 +45,7 @@ export type TechDocsCollatorEntityTransformer = (
export type TechDocsCollatorFactoryOptions = {
discovery: PluginEndpointDiscovery;
logger: LoggerService;
- tokenManager: TokenManager;
+ tokenManager?: TokenManager;
auth?: AuthService;
httpAuth?: HttpAuthService;
locationTemplate?: string;
diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json
index 09aa136f0e..c27fe52d93 100644
--- a/plugins/search-backend-module-techdocs/package.json
+++ b/plugins/search-backend-module-techdocs/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend-module-techdocs",
- "version": "0.1.23-next.1",
+ "version": "0.1.23",
"description": "A module for the search backend that exports techdocs modules",
"backstage": {
"role": "backend-plugin-module"
diff --git a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts
index ad820e6ad2..10c09d02b2 100644
--- a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts
+++ b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts
@@ -61,7 +61,7 @@ interface MkSearchIndexDoc {
export type TechDocsCollatorFactoryOptions = {
discovery: PluginEndpointDiscovery;
logger: LoggerService;
- tokenManager: TokenManager;
+ tokenManager?: TokenManager;
auth?: AuthService;
httpAuth?: HttpAuthService;
locationTemplate?: string;
diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md
index 854996ba53..74ba4c86c1 100644
--- a/plugins/search-backend-node/CHANGELOG.md
+++ b/plugins/search-backend-node/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-search-backend-node
+## 1.2.22
+
+### Patch Changes
+
+- c6cb568: Add lifecycle monitoring for the search index registry
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/backend-tasks@0.5.23
+
## 1.2.22-next.1
### Patch Changes
diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json
index c734681980..a3c9e16f95 100644
--- a/plugins/search-backend-node/package.json
+++ b/plugins/search-backend-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend-node",
- "version": "1.2.22-next.1",
+ "version": "1.2.22",
"description": "A library for Backstage backend plugins that want to interact with the search backend plugin",
"backstage": {
"role": "node-library"
diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md
index 5dabd9f1a5..0a80301ede 100644
--- a/plugins/search-backend/CHANGELOG.md
+++ b/plugins/search-backend/CHANGELOG.md
@@ -1,5 +1,26 @@
# @backstage/plugin-search-backend
+## 1.5.8
+
+### Patch Changes
+
+- c6cb568: Add lifecycle monitoring for the search index registry
+- Updated dependencies
+ - @backstage/repo-tools@0.9.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-search-backend-node@1.2.22
+ - @backstage/backend-openapi-utils@0.1.11
+ - @backstage/plugin-permission-node@0.7.29
+
+## 1.5.8-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/repo-tools@0.9.0-next.2
+
## 1.5.8-next.1
### Patch Changes
diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json
index c06b99ec92..146e50d177 100644
--- a/plugins/search-backend/package.json
+++ b/plugins/search-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend",
- "version": "1.5.8-next.1",
+ "version": "1.5.8",
"description": "The Backstage backend plugin that provides your backstage app with search",
"backstage": {
"role": "backend-plugin"
diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md
index c4e75fa41a..046532facf 100644
--- a/plugins/search-react/CHANGELOG.md
+++ b/plugins/search-react/CHANGELOG.md
@@ -1,5 +1,14 @@
# @backstage/plugin-search-react
+## 1.7.11
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/theme@0.5.4
+ - @backstage/frontend-plugin-api@0.6.5
+
## 1.7.11-next.1
### Patch Changes
diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json
index 274deae1d7..1e6b2b0e8e 100644
--- a/plugins/search-react/package.json
+++ b/plugins/search-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-react",
- "version": "1.7.11-next.1",
+ "version": "1.7.11",
"backstage": {
"role": "web-library"
},
diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md
index cde6f55c14..b738d853f8 100644
--- a/plugins/search/CHANGELOG.md
+++ b/plugins/search/CHANGELOG.md
@@ -1,5 +1,29 @@
# @backstage/plugin-search
+## 1.4.11
+
+### Patch Changes
+
+- 0501243: Added `aria-label` attribute to DialogTitle element and set `aria-modal` attribute to `true` for improved accessibility in the search modal.
+- Updated dependencies
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/plugin-search-react@1.7.11
+
+## 1.4.11-next.2
+
+### Patch Changes
+
+- 0501243: Added `aria-label` attribute to DialogTitle element and set `aria-modal` attribute to `true` for improved accessibility in the search modal.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+ - @backstage/plugin-search-react@1.7.11-next.1
+
## 1.4.11-next.1
### Patch Changes
diff --git a/plugins/search/package.json b/plugins/search/package.json
index 06f5ff47e7..1a9a09a5fe 100644
--- a/plugins/search/package.json
+++ b/plugins/search/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search",
- "version": "1.4.11-next.1",
+ "version": "1.4.11",
"description": "The Backstage plugin that provides your backstage app with search",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/search/src/components/SearchModal/SearchModal.tsx b/plugins/search/src/components/SearchModal/SearchModal.tsx
index 814779fb45..07eec4438e 100644
--- a/plugins/search/src/components/SearchModal/SearchModal.tsx
+++ b/plugins/search/src/components/SearchModal/SearchModal.tsx
@@ -190,7 +190,8 @@ export const SearchModal = (props: SearchModalProps) => {
paperFullWidth: classes.paperFullWidth,
}}
onClose={toggleModal}
- aria-labelledby="search-modal-title"
+ aria-label="Search Modal"
+ aria-modal="true"
fullWidth
maxWidth="lg"
open={open}
diff --git a/plugins/signals-backend/CHANGELOG.md b/plugins/signals-backend/CHANGELOG.md
index fcd34ead2e..f6eeac9bf4 100644
--- a/plugins/signals-backend/CHANGELOG.md
+++ b/plugins/signals-backend/CHANGELOG.md
@@ -1,5 +1,26 @@
# @backstage/plugin-signals-backend
+## 0.1.4
+
+### Patch Changes
+
+- 845d56a: Improved signal lifecycle management and added server side pinging of connections
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+ - @backstage/plugin-auth-node@0.4.13
+ - @backstage/plugin-signals-node@0.1.4
+
+## 0.1.4-next.2
+
+### Patch Changes
+
+- 845d56a: Improved signal lifecycle management and added server side pinging of connections
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/plugin-events-node@0.3.4-next.2
+
## 0.1.4-next.1
### Patch Changes
diff --git a/plugins/signals-backend/api-report.md b/plugins/signals-backend/api-report.md
index cad43bfaae..d59ca8e5ad 100644
--- a/plugins/signals-backend/api-report.md
+++ b/plugins/signals-backend/api-report.md
@@ -5,9 +5,11 @@
```ts
import { AuthService } from '@backstage/backend-plugin-api';
import { BackendFeature } from '@backstage/backend-plugin-api';
+import { Config } from '@backstage/config';
import { EventsService } from '@backstage/plugin-events-node';
import express from 'express';
import { IdentityApi } from '@backstage/plugin-auth-node';
+import { LifecycleService } from '@backstage/backend-plugin-api';
import { LoggerService } from '@backstage/backend-plugin-api';
import { PluginEndpointDiscovery } from '@backstage/backend-common';
import { UserInfoService } from '@backstage/backend-plugin-api';
@@ -20,12 +22,16 @@ export interface RouterOptions {
// (undocumented)
auth?: AuthService;
// (undocumented)
+ config: Config;
+ // (undocumented)
discovery: PluginEndpointDiscovery;
// (undocumented)
events: EventsService;
// (undocumented)
identity: IdentityApi;
// (undocumented)
+ lifecycle?: LifecycleService;
+ // (undocumented)
logger: LoggerService;
// (undocumented)
userInfo?: UserInfoService;
diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json
index 5d961c71ef..b148d4d5e5 100644
--- a/plugins/signals-backend/package.json
+++ b/plugins/signals-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-signals-backend",
- "version": "0.1.4-next.1",
+ "version": "0.1.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -41,7 +41,7 @@
"node-fetch": "^2.6.7",
"uuid": "^9.0.0",
"winston": "^3.2.1",
- "ws": "^8.14.2",
+ "ws": "^8.17.0",
"yn": "^4.0.0"
},
"devDependencies": {
@@ -51,6 +51,7 @@
"@backstage/plugin-auth-backend-module-guest-provider": "workspace:^",
"@backstage/plugin-events-backend": "workspace:^",
"@types/supertest": "^2.0.8",
+ "@types/ws": "^8.5.10",
"msw": "^1.0.0",
"supertest": "^6.2.4"
},
diff --git a/plugins/signals-backend/src/plugin.ts b/plugins/signals-backend/src/plugin.ts
index 3e00c00a34..0963b79ccb 100644
--- a/plugins/signals-backend/src/plugin.ts
+++ b/plugins/signals-backend/src/plugin.ts
@@ -32,6 +32,8 @@ export const signalsPlugin = createBackendPlugin({
deps: {
httpRouter: coreServices.httpRouter,
logger: coreServices.logger,
+ config: coreServices.rootConfig,
+ lifecycle: coreServices.rootLifecycle,
identity: coreServices.identity,
discovery: coreServices.discovery,
userInfo: coreServices.userInfo,
@@ -41,6 +43,8 @@ export const signalsPlugin = createBackendPlugin({
async init({
httpRouter,
logger,
+ config,
+ lifecycle,
identity,
discovery,
userInfo,
@@ -50,7 +54,9 @@ export const signalsPlugin = createBackendPlugin({
httpRouter.use(
await createRouter({
logger,
+ config,
identity,
+ lifecycle,
discovery,
userInfo,
auth,
diff --git a/plugins/signals-backend/src/service/SignalManager.test.ts b/plugins/signals-backend/src/service/SignalManager.test.ts
index 3ee99bb34b..7d3a6ddf59 100644
--- a/plugins/signals-backend/src/service/SignalManager.test.ts
+++ b/plugins/signals-backend/src/service/SignalManager.test.ts
@@ -17,6 +17,7 @@ import { WebSocket } from 'ws';
import { EventsServiceSubscribeOptions } from '@backstage/plugin-events-node';
import { SignalManager } from './SignalManager';
import { getVoidLogger } from '@backstage/backend-common';
+import { ConfigReader } from '@backstage/config';
class MockWebSocket {
closed: boolean = false;
@@ -30,6 +31,11 @@ class MockWebSocket {
this.closed = true;
}
+ terminate(): void {
+ this.readyState = WebSocket.CLOSED;
+ this.closed = true;
+ }
+
on(
event: string | symbol,
listener: (this: WebSocket, ...args: any[]) => void,
@@ -63,9 +69,23 @@ describe('SignalManager', () => {
},
};
+ const shutdownHooks: Function[] = [];
+ const mockLifecycle = {
+ addShutdownHook: (hook: Function) => shutdownHooks.push(hook),
+ };
+
const manager = SignalManager.create({
events: mockEvents,
logger: getVoidLogger(),
+ config: new ConfigReader({}),
+ lifecycle: mockLifecycle as any,
+ });
+
+ it('should close all connections when server is closed', () => {
+ const ws = new MockWebSocket();
+ manager.addConnection(ws as unknown as WebSocket);
+ shutdownHooks.forEach(hook => hook());
+ expect(ws.closed).toBeTruthy();
});
it('should close connection on error', () => {
diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts
index 3211c51c9c..995c80ad28 100644
--- a/plugins/signals-backend/src/service/SignalManager.ts
+++ b/plugins/signals-backend/src/service/SignalManager.ts
@@ -20,8 +20,10 @@ import { v4 as uuid } from 'uuid';
import { JsonObject } from '@backstage/types';
import {
BackstageUserInfo,
+ LifecycleService,
LoggerService,
} from '@backstage/backend-plugin-api';
+import { Config } from '@backstage/config';
/**
* @internal
@@ -32,6 +34,7 @@ export type SignalConnection = {
ws: WebSocket;
ownershipEntityRefs: string[];
subscriptions: Set;
+ isAlive: boolean;
};
/**
@@ -39,7 +42,9 @@ export type SignalConnection = {
*/
export type SignalManagerOptions = {
events: EventsService;
+ config: Config;
logger: LoggerService;
+ lifecycle?: LifecycleService;
};
/** @internal */
@@ -50,6 +55,7 @@ export class SignalManager {
>();
private events: EventsService;
private logger: LoggerService;
+ private pingInterval: ReturnType | undefined;
static create(options: SignalManagerOptions) {
return new SignalManager(options);
@@ -64,11 +70,43 @@ export class SignalManager {
onEvent: (params: EventParams) =>
this.onEventBrokerEvent(params.eventPayload as SignalPayload),
});
+
+ options.lifecycle?.addShutdownHook(() => this.onShutdown());
+ }
+
+ private ping() {
+ this.connections.forEach(conn => {
+ if (!conn.isAlive) {
+ this.logger.debug(`Connection ${conn.id} is not alive, terminating`);
+ conn.ws.terminate();
+ return;
+ }
+
+ conn.isAlive = false;
+ conn.ws.ping();
+ });
+ }
+
+ private onShutdown() {
+ if (this.pingInterval) {
+ clearInterval(this.pingInterval);
+ }
+
+ // TODO: Unsubscribe from events?
+
+ this.connections.forEach(conn => {
+ conn.ws.terminate();
+ });
+ this.connections.clear();
}
addConnection(ws: WebSocket, identity?: BackstageUserInfo) {
- const id = uuid();
+ // Start pinging on first connection
+ if (!this.pingInterval) {
+ this.pingInterval = setInterval(() => this.ping(), 30000);
+ }
+ const id = uuid();
const conn = {
id,
user: identity?.userEntityRef ?? 'user:default/guest',
@@ -77,25 +115,37 @@ export class SignalManager {
'user:default/guest',
],
subscriptions: new Set(),
+ isAlive: true,
};
this.connections.set(id, conn);
+ this.logger.debug(`Connection ${id} connected`);
ws.on('error', (err: Error) => {
this.logger.error(
`Error occurred with connection ${id}: ${err}, closing connection`,
);
- ws.close();
+ ws.terminate();
this.connections.delete(id);
});
ws.on('close', (code: number, reason: Buffer) => {
- this.logger.info(
+ this.logger.debug(
`Connection ${id} closed with code ${code}, reason: ${reason}`,
);
+ ws.terminate();
this.connections.delete(id);
});
+ ws.on('ping', () => {
+ conn.isAlive = true;
+ ws.pong();
+ });
+
+ ws.on('pong', () => {
+ conn.isAlive = true;
+ });
+
ws.on('message', (data: RawData, isBinary: boolean) => {
this.logger.debug(`Received message from connection ${id}: ${data}`);
if (isBinary) {
@@ -114,12 +164,12 @@ export class SignalManager {
private handleMessage(connection: SignalConnection, message: JsonObject) {
if (message.action === 'subscribe' && message.channel) {
- this.logger.info(
+ this.logger.debug(
`Connection ${connection.id} subscribed to ${message.channel}`,
);
connection.subscriptions.add(message.channel as string);
} else if (message.action === 'unsubscribe' && message.channel) {
- this.logger.info(
+ this.logger.debug(
`Connection ${connection.id} unsubscribed from ${message.channel}`,
);
connection.subscriptions.delete(message.channel as string);
diff --git a/plugins/signals-backend/src/service/router.test.ts b/plugins/signals-backend/src/service/router.test.ts
index bbcf506d19..c081031c54 100644
--- a/plugins/signals-backend/src/service/router.test.ts
+++ b/plugins/signals-backend/src/service/router.test.ts
@@ -24,6 +24,7 @@ import { createRouter } from './router';
import { EventsService } from '@backstage/plugin-events-node';
import { IdentityApi } from '@backstage/plugin-auth-node';
import { UserInfoService } from '@backstage/backend-plugin-api';
+import { ConfigReader } from '@backstage/config';
const eventsServiceMock: jest.Mocked = {
subscribe: jest.fn(),
@@ -53,6 +54,7 @@ describe('createRouter', () => {
events: eventsServiceMock,
discovery,
userInfo,
+ config: new ConfigReader({}),
});
app = express().use(router);
});
diff --git a/plugins/signals-backend/src/service/router.ts b/plugins/signals-backend/src/service/router.ts
index fab706e878..ea706ebf1a 100644
--- a/plugins/signals-backend/src/service/router.ts
+++ b/plugins/signals-backend/src/service/router.ts
@@ -23,6 +23,7 @@ import Router from 'express-promise-router';
import {
AuthService,
BackstageUserInfo,
+ LifecycleService,
LoggerService,
UserInfoService,
} from '@backstage/backend-plugin-api';
@@ -33,6 +34,7 @@ import { IdentityApi } from '@backstage/plugin-auth-node';
import { EventsService } from '@backstage/plugin-events-node';
import { WebSocket, WebSocketServer } from 'ws';
import { Duplex } from 'stream';
+import { Config } from '@backstage/config';
/** @public */
export interface RouterOptions {
@@ -40,6 +42,8 @@ export interface RouterOptions {
events: EventsService;
identity: IdentityApi;
discovery: PluginEndpointDiscovery;
+ config: Config;
+ lifecycle?: LifecycleService;
auth?: AuthService;
userInfo?: UserInfoService;
}
@@ -56,16 +60,12 @@ export async function createRouter(
let apiUrl: string | undefined = undefined;
const webSocketServer = new WebSocketServer({
- noServer: true,
- clientTracking: false,
+ noServer: true, // handle upgrade manually
+ clientTracking: false, // handle connections in SignalManager
});
webSocketServer.on('error', (error: Error) => {
- logger.error('WebSocket server error', error);
- });
-
- webSocketServer.on('close', () => {
- logger.info('WebSocket server closed');
+ logger.error(`WebSocket server error: ${error}`);
});
const handleUpgrade = async (
@@ -94,7 +94,7 @@ export async function createRouter(
}
}
} catch (e) {
- logger.error('Failed to authenticate WebSocket connection', e);
+ logger.error(`Failed to authenticate WebSocket connection: ${e}`);
socket.write(
'HTTP/1.1 401 Web Socket Protocol Handshake\r\n' +
'Upgrade: WebSocket\r\n' +
@@ -115,7 +115,14 @@ export async function createRouter(
},
);
} catch (e) {
- logger.error('Failed to handle WebSocket upgrade', e);
+ logger.error(`Failed to handle WebSocket upgrade: ${e}`);
+ socket.write(
+ 'HTTP/1.1 500 Web Socket Protocol Handshake\r\n' +
+ 'Upgrade: WebSocket\r\n' +
+ 'Connection: Upgrade\r\n' +
+ '\r\n',
+ );
+ socket.destroy();
}
};
@@ -145,7 +152,6 @@ export async function createRouter(
router.use(upgradeMiddleware);
router.get('/health', (_, response) => {
- logger.info('PONG!');
response.json({ status: 'ok' });
});
diff --git a/plugins/signals-node/CHANGELOG.md b/plugins/signals-node/CHANGELOG.md
index ea703d4291..e26991c787 100644
--- a/plugins/signals-node/CHANGELOG.md
+++ b/plugins/signals-node/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-signals-node
+## 0.1.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-events-node@0.3.4
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.1.4-next.1
### Patch Changes
diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json
index 970b89aca2..4d1ad9e1ef 100644
--- a/plugins/signals-node/package.json
+++ b/plugins/signals-node/package.json
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-signals-node",
"description": "Node.js library for the signals plugin",
- "version": "0.1.4-next.1",
+ "version": "0.1.4",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
diff --git a/plugins/signals/CHANGELOG.md b/plugins/signals/CHANGELOG.md
index fdfddfdf2a..971a849a03 100644
--- a/plugins/signals/CHANGELOG.md
+++ b/plugins/signals/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-signals
+## 0.0.6
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/theme@0.5.4
+
## 0.0.6-next.1
### Patch Changes
diff --git a/plugins/signals/package.json b/plugins/signals/package.json
index 7d5fb3bcf9..ec618415a8 100644
--- a/plugins/signals/package.json
+++ b/plugins/signals/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-signals",
- "version": "0.0.6-next.1",
+ "version": "0.0.6",
"backstage": {
"role": "frontend-plugin"
},
diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md
index 5151796171..8a4b3d1eb8 100644
--- a/plugins/techdocs-addons-test-utils/CHANGELOG.md
+++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md
@@ -1,5 +1,31 @@
# @backstage/plugin-techdocs-addons-test-utils
+## 1.0.32
+
+### Patch Changes
+
+- 2f13862: Fix bug in TechDocsAddonTester when jest.resetAllMocks is called between tests
+- Updated dependencies
+ - @backstage/plugin-catalog@1.20.0
+ - @backstage/plugin-techdocs@1.10.5
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/core-app-api@1.12.5
+ - @backstage/integration-react@1.1.27
+ - @backstage/test-utils@1.5.5
+ - @backstage/plugin-search-react@1.7.11
+ - @backstage/plugin-techdocs-react@1.2.4
+
+## 1.0.32-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs@1.10.5-next.2
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/plugin-catalog@1.20.0-next.2
+ - @backstage/plugin-search-react@1.7.11-next.1
+ - @backstage/integration-react@1.1.27-next.0
+
## 1.0.32-next.1
### Patch Changes
diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json
index 6a6edcd5fa..02161159e9 100644
--- a/plugins/techdocs-addons-test-utils/package.json
+++ b/plugins/techdocs-addons-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-techdocs-addons-test-utils",
- "version": "1.0.32-next.1",
+ "version": "1.0.32",
"backstage": {
"role": "web-library"
},
diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md
index 53ee8b3681..d4d18976b0 100644
--- a/plugins/techdocs-backend/CHANGELOG.md
+++ b/plugins/techdocs-backend/CHANGELOG.md
@@ -1,5 +1,31 @@
# @backstage/plugin-techdocs-backend
+## 1.10.5
+
+### Patch Changes
+
+- 5863cf7: The `techdocs.builder` config is now optional and it will default to `local`.
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-techdocs-node@1.12.4
+ - @backstage/integration@1.11.0
+ - @backstage/plugin-search-backend-module-techdocs@0.1.23
+ - @backstage/catalog-client@1.6.5
+ - @backstage/plugin-catalog-common@1.0.23
+
+## 1.10.5-next.2
+
+### Patch Changes
+
+- 5863cf7: The `techdocs.builder` config is now optional and it will default to `local`.
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/integration@1.11.0-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.1.23-next.2
+ - @backstage/plugin-techdocs-node@1.12.4-next.2
+
## 1.10.5-next.1
### Patch Changes
diff --git a/plugins/techdocs-backend/config.d.ts b/plugins/techdocs-backend/config.d.ts
index 01da1e7926..9d1cd9e170 100644
--- a/plugins/techdocs-backend/config.d.ts
+++ b/plugins/techdocs-backend/config.d.ts
@@ -24,7 +24,7 @@ export interface Config {
* Documentation building process depends on the builder attr
* @visibility frontend
*/
- builder: 'local' | 'external';
+ builder?: 'local' | 'external';
/**
* Techdocs generator information
diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json
index 013029bb0b..a5a8e0ba76 100644
--- a/plugins/techdocs-backend/package.json
+++ b/plugins/techdocs-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-techdocs-backend",
- "version": "1.10.5-next.1",
+ "version": "1.10.5",
"description": "The Backstage backend plugin that renders technical documentation for your components",
"backstage": {
"role": "backend-plugin"
diff --git a/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.test.ts b/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.test.ts
index 7868135b08..714a3736a9 100644
--- a/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.test.ts
+++ b/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.test.ts
@@ -17,12 +17,6 @@
import { DefaultDocsBuildStrategy } from './DefaultDocsBuildStrategy';
import { ConfigReader } from '@backstage/config';
-const MockedConfigReader = ConfigReader as jest.MockedClass<
- typeof ConfigReader
->;
-
-jest.mock('@backstage/config');
-
describe('DefaultDocsBuildStrategy', () => {
const entity = {
apiVersion: 'backstage.io/v1alpha1',
@@ -33,32 +27,40 @@ describe('DefaultDocsBuildStrategy', () => {
},
};
- const config = new ConfigReader({});
-
- beforeEach(() => {
- jest.resetAllMocks();
- });
-
describe('shouldBuild', () => {
- it('should return true when techdocs.build is set to local', async () => {
- const defaultDocsBuildStrategy =
- DefaultDocsBuildStrategy.fromConfig(config);
-
- MockedConfigReader.prototype.getString.mockReturnValue('local');
+ it('should return true when techdocs.builder is set to local', async () => {
+ const defaultDocsBuildStrategy = DefaultDocsBuildStrategy.fromConfig(
+ new ConfigReader({
+ techdocs: {
+ builder: 'local',
+ },
+ }),
+ );
const result = await defaultDocsBuildStrategy.shouldBuild({ entity });
expect(result).toBe(true);
});
- it('should return false when techdocs.build is set to external', async () => {
- const defaultDocsBuildStrategy =
- DefaultDocsBuildStrategy.fromConfig(config);
-
- MockedConfigReader.prototype.getString.mockReturnValue('external');
+ it('should return true when techdocs.builder is not set', async () => {
+ const defaultDocsBuildStrategy = DefaultDocsBuildStrategy.fromConfig(
+ new ConfigReader({ techdocs: {} }),
+ );
const result = await defaultDocsBuildStrategy.shouldBuild({ entity });
+ expect(result).toBe(true);
+ });
+ it('should return false when techdocs.builder is set to external', async () => {
+ const defaultDocsBuildStrategy = DefaultDocsBuildStrategy.fromConfig(
+ new ConfigReader({
+ techdocs: {
+ builder: 'external',
+ },
+ }),
+ );
+
+ const result = await defaultDocsBuildStrategy.shouldBuild({ entity });
expect(result).toBe(false);
});
});
diff --git a/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.ts b/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.ts
index bc2c586c82..a0bd623b64 100644
--- a/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.ts
+++ b/plugins/techdocs-backend/src/service/DefaultDocsBuildStrategy.ts
@@ -29,6 +29,8 @@ export class DefaultDocsBuildStrategy implements DocsBuildStrategy {
}
async shouldBuild(_: { entity: Entity }): Promise {
- return this.config.getString('techdocs.builder') === 'local';
+ return [undefined, 'local'].includes(
+ this.config.getOptionalString('techdocs.builder'),
+ );
}
}
diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md
index b914a8e3b1..2ab0cef022 100644
--- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md
+++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-techdocs-module-addons-contrib
+## 1.1.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/integration@1.11.0
+ - @backstage/integration-react@1.1.27
+ - @backstage/plugin-techdocs-react@1.2.4
+
+## 1.1.10-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/integration@1.11.0-next.0
+ - @backstage/integration-react@1.1.27-next.0
+
## 1.1.10-next.1
### Patch Changes
diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json
index 5c8a0248ee..2aaca2c4e0 100644
--- a/plugins/techdocs-module-addons-contrib/package.json
+++ b/plugins/techdocs-module-addons-contrib/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-techdocs-module-addons-contrib",
- "version": "1.1.10-next.1",
+ "version": "1.1.10",
"description": "Plugin module for contributed TechDocs Addons",
"backstage": {
"role": "frontend-plugin-module"
diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md
index 23f5d333d3..59a0cc2055 100644
--- a/plugins/techdocs-node/CHANGELOG.md
+++ b/plugins/techdocs-node/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-techdocs-node
+## 1.12.4
+
+### Patch Changes
+
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- Updated dependencies
+ - @backstage/catalog-model@1.5.0
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/integration@1.11.0
+
+## 1.12.4-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-common@0.22.0-next.2
+ - @backstage/integration@1.11.0-next.0
+
## 1.12.4-next.1
### Patch Changes
diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json
index 1ff7b305f6..7d4c83545d 100644
--- a/plugins/techdocs-node/package.json
+++ b/plugins/techdocs-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-techdocs-node",
- "version": "1.12.4-next.1",
+ "version": "1.12.4",
"description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli",
"backstage": {
"role": "node-library"
diff --git a/plugins/techdocs-node/src/helpers.ts b/plugins/techdocs-node/src/helpers.ts
index 39a1f4c666..c293d16896 100644
--- a/plugins/techdocs-node/src/helpers.ts
+++ b/plugins/techdocs-node/src/helpers.ts
@@ -14,7 +14,8 @@
* limitations under the License.
*/
-import { resolveSafeChildPath, UrlReader } from '@backstage/backend-common';
+import { UrlReader } from '@backstage/backend-common';
+import { resolveSafeChildPath } from '@backstage/backend-plugin-api';
import {
Entity,
getEntitySourceLocation,
diff --git a/plugins/techdocs-node/src/stages/generate/helpers.ts b/plugins/techdocs-node/src/stages/generate/helpers.ts
index 1450a4afba..df1a31470d 100644
--- a/plugins/techdocs-node/src/stages/generate/helpers.ts
+++ b/plugins/techdocs-node/src/stages/generate/helpers.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { isChildPath } from '@backstage/backend-common';
+import { isChildPath } from '@backstage/backend-plugin-api';
import { Entity } from '@backstage/catalog-model';
import { assertError, ForwardedError } from '@backstage/errors';
import { ScmIntegrationRegistry } from '@backstage/integration';
diff --git a/plugins/techdocs-node/src/stages/publish/local.test.ts b/plugins/techdocs-node/src/stages/publish/local.test.ts
index 4019f80d11..89a38c7ed2 100644
--- a/plugins/techdocs-node/src/stages/publish/local.test.ts
+++ b/plugins/techdocs-node/src/stages/publish/local.test.ts
@@ -17,7 +17,7 @@ import {
getVoidLogger,
PluginEndpointDiscovery,
} from '@backstage/backend-common';
-import { overridePackagePathResolution } from '@backstage/backend-common/testUtils';
+import { overridePackagePathResolution } from '@backstage/backend-plugin-api/testUtils';
import { ConfigReader } from '@backstage/config';
import express from 'express';
import request from 'supertest';
diff --git a/plugins/techdocs-node/src/stages/publish/local.ts b/plugins/techdocs-node/src/stages/publish/local.ts
index 1a02cb7eee..37f41080b4 100644
--- a/plugins/techdocs-node/src/stages/publish/local.ts
+++ b/plugins/techdocs-node/src/stages/publish/local.ts
@@ -13,11 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+import { PluginEndpointDiscovery } from '@backstage/backend-common';
import {
- PluginEndpointDiscovery,
resolvePackagePath,
resolveSafeChildPath,
-} from '@backstage/backend-common';
+} from '@backstage/backend-plugin-api';
import {
Entity,
CompoundEntityRef,
diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md
index 9a13bd2149..4b76fe42e4 100644
--- a/plugins/techdocs-react/CHANGELOG.md
+++ b/plugins/techdocs-react/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/plugin-techdocs-react
+## 1.2.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+
## 1.2.4-next.1
### Patch Changes
diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json
index ebba33cdca..283e3afcff 100644
--- a/plugins/techdocs-react/package.json
+++ b/plugins/techdocs-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-techdocs-react",
- "version": "1.2.4-next.1",
+ "version": "1.2.4",
"description": "Shared frontend utilities for TechDocs and Addons",
"backstage": {
"role": "web-library"
diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md
index ee3071b030..7e8f3056e5 100644
--- a/plugins/techdocs/CHANGELOG.md
+++ b/plugins/techdocs/CHANGELOG.md
@@ -1,5 +1,38 @@
# @backstage/plugin-techdocs
+## 1.10.5
+
+### Patch Changes
+
+- d2cc139: Update path in Readme for Plugin Techdocs to show the correct setup information.
+- 5863cf7: The `techdocs.builder` config is now optional and it will default to `local`.
+- Updated dependencies
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/catalog-model@1.5.0
+ - @backstage/plugin-auth-react@0.1.2
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/theme@0.5.4
+ - @backstage/integration@1.11.0
+ - @backstage/frontend-plugin-api@0.6.5
+ - @backstage/integration-react@1.1.27
+ - @backstage/plugin-search-react@1.7.11
+ - @backstage/plugin-techdocs-react@1.2.4
+
+## 1.10.5-next.2
+
+### Patch Changes
+
+- 5863cf7: The `techdocs.builder` config is now optional and it will default to `local`.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/integration@1.11.0-next.0
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+ - @backstage/plugin-search-react@1.7.11-next.1
+ - @backstage/integration-react@1.1.27-next.0
+
## 1.10.5-next.1
### Patch Changes
diff --git a/plugins/techdocs/config.d.ts b/plugins/techdocs/config.d.ts
index 82ae8dd87a..0df852e490 100644
--- a/plugins/techdocs/config.d.ts
+++ b/plugins/techdocs/config.d.ts
@@ -24,7 +24,7 @@ export interface Config {
* Documentation building process depends on the builder attr
* @visibility frontend
*/
- builder: 'local' | 'external';
+ builder?: 'local' | 'external';
/**
* Allows fallback to case-sensitive triplets in case of migration issues.
diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json
index 7e06c8f128..bc9c4c8022 100644
--- a/plugins/techdocs/package.json
+++ b/plugins/techdocs/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-techdocs",
- "version": "1.10.5-next.1",
+ "version": "1.10.5",
"description": "The Backstage plugin that renders technical documentation for your components",
"backstage": {
"role": "frontend-plugin"
diff --git a/plugins/techdocs/src/client.ts b/plugins/techdocs/src/client.ts
index ae81ecdaaa..0f11eb4068 100644
--- a/plugins/techdocs/src/client.ts
+++ b/plugins/techdocs/src/client.ts
@@ -151,7 +151,7 @@ export class TechDocsStorageClient implements TechDocsStorageApi {
}
async getBuilder(): Promise {
- return this.configApi.getString('techdocs.builder');
+ return this.configApi.getOptionalString('techdocs.builder') || 'local';
}
/**
diff --git a/plugins/techdocs/src/reader/components/TechDocsNotFound.tsx b/plugins/techdocs/src/reader/components/TechDocsNotFound.tsx
index bd2ef26b1e..858f9c5afc 100644
--- a/plugins/techdocs/src/reader/components/TechDocsNotFound.tsx
+++ b/plugins/techdocs/src/reader/components/TechDocsNotFound.tsx
@@ -39,7 +39,7 @@ export const TechDocsNotFound = ({ errorMessage }: Props) => {
}, [analyticsApi, entityRef, location]);
let additionalInfo = '';
- if (techdocsBuilder !== 'local') {
+ if (![undefined, 'local'].includes(techdocsBuilder)) {
additionalInfo =
"Note that techdocs.builder is not set to 'local' in your config, which means this Backstage app will not " +
"generate docs if they are not found. Make sure the project's docs are generated and published by some external " +
diff --git a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx
index 70868baa21..53f407586a 100644
--- a/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx
+++ b/plugins/techdocs/src/reader/transformers/copyToClipboard.tsx
@@ -67,7 +67,7 @@ const CopyToClipboardButton = ({ text }: CopyToClipboardButtonProps) => {
leaveDelay={1000}
>
diff --git a/plugins/techdocs/src/search/components/TechDocsSearch.tsx b/plugins/techdocs/src/search/components/TechDocsSearch.tsx
index 665f99c1bb..ce77d547db 100644
--- a/plugins/techdocs/src/search/components/TechDocsSearch.tsx
+++ b/plugins/techdocs/src/search/components/TechDocsSearch.tsx
@@ -63,6 +63,7 @@ const TechDocsSearchBar = (props: TechDocsSearchProps) => {
const navigate = useNavigate();
const {
setFilters,
+ term,
result: { loading, value: searchVal },
} = useSearch();
const [options, setOptions] = useState([]);
@@ -109,7 +110,7 @@ const TechDocsSearchBar = (props: TechDocsSearchProps) => {
''}
filterOptions={x => {
return x; // This is needed to get renderOption to be called after options change. Bug in material-ui?
@@ -117,7 +118,7 @@ const TechDocsSearchBar = (props: TechDocsSearchProps) => {
onClose={() => {
setOpen(false);
}}
- onFocus={() => {
+ onOpen={() => {
setOpen(true);
}}
onChange={handleSelection}
diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md
index 57e3663d5f..f689d8090f 100644
--- a/plugins/user-settings-backend/CHANGELOG.md
+++ b/plugins/user-settings-backend/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-user-settings-backend
+## 0.2.17
+
+### Patch Changes
+
+- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package.
+- Updated dependencies
+ - @backstage/backend-common@0.22.0
+ - @backstage/backend-plugin-api@0.6.18
+ - @backstage/plugin-auth-node@0.4.13
+
## 0.2.17-next.1
### Patch Changes
diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json
index f8b46d8d3f..ac5e5d9af2 100644
--- a/plugins/user-settings-backend/package.json
+++ b/plugins/user-settings-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-user-settings-backend",
- "version": "0.2.17-next.1",
+ "version": "0.2.17",
"description": "The Backstage backend plugin to manage user settings",
"backstage": {
"role": "backend-plugin"
diff --git a/plugins/user-settings-backend/src/database/DatabaseUserSettingsStore.ts b/plugins/user-settings-backend/src/database/DatabaseUserSettingsStore.ts
index b0fe8fdecc..99c4b2cff4 100644
--- a/plugins/user-settings-backend/src/database/DatabaseUserSettingsStore.ts
+++ b/plugins/user-settings-backend/src/database/DatabaseUserSettingsStore.ts
@@ -14,10 +14,8 @@
* limitations under the License.
*/
-import {
- PluginDatabaseManager,
- resolvePackagePath,
-} from '@backstage/backend-common';
+import { PluginDatabaseManager } from '@backstage/backend-common';
+import { resolvePackagePath } from '@backstage/backend-plugin-api';
import { NotFoundError } from '@backstage/errors';
import { JsonValue } from '@backstage/types';
import { Knex } from 'knex';
diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md
index 2611a7d18a..85930ec041 100644
--- a/plugins/user-settings/CHANGELOG.md
+++ b/plugins/user-settings/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/plugin-user-settings
+## 0.8.6
+
+### Patch Changes
+
+- 131e5cb: Fix broken links in README.
+- Updated dependencies
+ - @backstage/core-compat-api@0.2.5
+ - @backstage/core-components@0.14.7
+ - @backstage/plugin-catalog-react@1.12.0
+ - @backstage/theme@0.5.4
+ - @backstage/core-app-api@1.12.5
+ - @backstage/frontend-plugin-api@0.6.5
+
+## 0.8.6-next.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.12.0-next.2
+ - @backstage/core-components@0.14.7-next.2
+ - @backstage/core-compat-api@0.2.5-next.1
+ - @backstage/frontend-plugin-api@0.6.5-next.1
+
## 0.8.6-next.1
### Patch Changes
diff --git a/plugins/user-settings/README.md b/plugins/user-settings/README.md
index 1ecaaeb536..41a6930ae3 100644
--- a/plugins/user-settings/README.md
+++ b/plugins/user-settings/README.md
@@ -8,8 +8,7 @@ This plugin provides two components, `` is intended to be used w
It also provides a `UserSettingsStorage` implementation of the `StorageApi`, to
be used in the frontend as a persistent alternative to the builtin `WebStorage`.
-Please see [the backend
-README](https://github.com/backstage/backstage/tree/master/plugins/user-settings-backend)
+Please see [the backend README](https://github.com/backstage/backstage/tree/master/plugins/user-settings-backend)
for installation instructions.
## Components Usage
diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json
index 3461d220d6..b3f0f244c8 100644
--- a/plugins/user-settings/package.json
+++ b/plugins/user-settings/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-user-settings",
- "version": "0.8.6-next.1",
+ "version": "0.8.6",
"description": "A Backstage plugin that provides a settings page",
"backstage": {
"role": "frontend-plugin"
diff --git a/scripts/verify-links.js b/scripts/verify-links.js
index 94ffc497cd..cb7385d972 100755
--- a/scripts/verify-links.js
+++ b/scripts/verify-links.js
@@ -137,6 +137,16 @@ async function verifyFile(filePath, docPages) {
}
}
+ const multiLineLinks =
+ content.match(/\[[^\]\n]+?\n[^\]\n]*?(?:\n[^\]\n]*?)?\]\(/g) || [];
+ badUrls.push(
+ ...multiLineLinks.map(url => ({
+ url,
+ basePath: filePath,
+ problem: 'multi-line',
+ })),
+ );
+
return badUrls;
}
@@ -226,7 +236,7 @@ async function main() {
console.error(` From: ${basePath}`);
console.error(` To: ${url}`);
if (suggestion) {
- console.error(` Replace With: ${suggestion}`);
+ console.error(` Replace with: ${suggestion}`);
}
} else if (problem === 'not-relative') {
console.error('Links within /docs/ must be relative');
@@ -238,6 +248,10 @@ async function main() {
);
console.error(` From: ${basePath}`);
console.error(` To: ${url}`);
+ } else if (problem === 'multi-line') {
+ console.error(`Links are not allowed to span multiple lines:`);
+ console.error(` From: ${basePath}`);
+ console.error(` To: ${url.replace(/\n/g, '\n ')}`);
}
}
process.exit(1);
diff --git a/yarn.lock b/yarn.lock
index c07c71c8b3..728bac0c68 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3330,6 +3330,7 @@ __metadata:
selfsigned: ^2.0.0
stoppable: ^1.1.0
supertest: ^6.1.3
+ triple-beam: ^1.4.1
uuid: ^9.0.0
winston: ^3.2.1
winston-transport: ^4.5.0
@@ -3432,6 +3433,7 @@ __metadata:
"@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-test-utils": "workspace:^"
"@backstage/cli": "workspace:^"
+ "@backstage/plugin-events-node": "workspace:^"
languageName: unknown
linkType: soft
@@ -3505,8 +3507,11 @@ __metadata:
resolution: "@backstage/backend-plugin-api@workspace:packages/backend-plugin-api"
dependencies:
"@backstage/backend-tasks": "workspace:^"
+ "@backstage/backend-test-utils": "workspace:^"
"@backstage/cli": "workspace:^"
+ "@backstage/cli-common": "workspace:^"
"@backstage/config": "workspace:^"
+ "@backstage/errors": "workspace:^"
"@backstage/plugin-auth-node": "workspace:^"
"@backstage/plugin-permission-common": "workspace:^"
"@backstage/types": "workspace:^"
@@ -3550,6 +3555,7 @@ __metadata:
"@backstage/config": "workspace:^"
"@backstage/errors": "workspace:^"
"@backstage/plugin-auth-node": "workspace:^"
+ "@backstage/plugin-events-node": "workspace:^"
"@backstage/types": "workspace:^"
"@types/supertest": ^2.0.8
better-sqlite3: ^9.0.0
@@ -3569,18 +3575,6 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/catalog-client@npm:^1.6.4":
- version: 1.6.4
- resolution: "@backstage/catalog-client@npm:1.6.4"
- dependencies:
- "@backstage/catalog-model": ^1.4.5
- "@backstage/errors": ^1.2.4
- cross-fetch: ^4.0.0
- uri-template: ^2.0.0
- checksum: af3537d04f0abd6e6f3e49c7623994cc83db6efb2776fff5d59faee26c598840486e42a99c2bbb4a1b6ff97ad97ac857e913830cad62cda7cd71eef74cf2e179
- languageName: node
- linkType: hard
-
"@backstage/catalog-client@workspace:^, @backstage/catalog-client@workspace:packages/catalog-client":
version: 0.0.0-use.local
resolution: "@backstage/catalog-client@workspace:packages/catalog-client"
@@ -3594,19 +3588,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/catalog-model@npm:^1.4.3, @backstage/catalog-model@npm:^1.4.5":
- version: 1.4.5
- resolution: "@backstage/catalog-model@npm:1.4.5"
- dependencies:
- "@backstage/errors": ^1.2.4
- "@backstage/types": ^1.1.1
- ajv: ^8.10.0
- lodash: ^4.17.21
- checksum: 34aaa4b82d29bf3b0a4b52552f8eb8189041df826f87a7bbdef5107a1efb8ce1f7eb1c1a343868718ca2af9be76d9f5184f6a92076d893d3a3951d16881647b7
- languageName: node
- linkType: hard
-
-"@backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model":
+"@backstage/catalog-model@^1.4.3, @backstage/catalog-model@^1.4.5, @backstage/catalog-model@workspace:^, @backstage/catalog-model@workspace:packages/catalog-model":
version: 0.0.0-use.local
resolution: "@backstage/catalog-model@workspace:packages/catalog-model"
dependencies:
@@ -3858,7 +3840,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/config@^1.1.1, @backstage/config@^1.2.0, @backstage/config@workspace:^, @backstage/config@workspace:packages/config":
+"@backstage/config@^1.1.1, @backstage/config@workspace:^, @backstage/config@workspace:packages/config":
version: 0.0.0-use.local
resolution: "@backstage/config@workspace:packages/config"
dependencies:
@@ -3930,6 +3912,77 @@ __metadata:
languageName: unknown
linkType: soft
+"@backstage/core-components@^0.14.4, @backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components":
+ version: 0.0.0-use.local
+ resolution: "@backstage/core-components@workspace:packages/core-components"
+ dependencies:
+ "@backstage/app-defaults": "workspace:^"
+ "@backstage/cli": "workspace:^"
+ "@backstage/config": "workspace:^"
+ "@backstage/core-app-api": "workspace:^"
+ "@backstage/core-plugin-api": "workspace:^"
+ "@backstage/errors": "workspace:^"
+ "@backstage/test-utils": "workspace:^"
+ "@backstage/theme": "workspace:^"
+ "@backstage/version-bridge": "workspace:^"
+ "@date-io/core": ^1.3.13
+ "@material-table/core": ^3.1.0
+ "@material-ui/core": ^4.12.2
+ "@material-ui/icons": ^4.9.1
+ "@material-ui/lab": 4.0.0-alpha.61
+ "@react-hookz/web": ^24.0.0
+ "@testing-library/dom": ^10.0.0
+ "@testing-library/jest-dom": ^6.0.0
+ "@testing-library/react": ^15.0.0
+ "@testing-library/user-event": ^14.0.0
+ "@types/ansi-regex": ^5.0.0
+ "@types/classnames": ^2.2.9
+ "@types/d3-selection": ^3.0.1
+ "@types/d3-shape": ^3.0.1
+ "@types/d3-zoom": ^3.0.1
+ "@types/dagre": ^0.7.44
+ "@types/google-protobuf": ^3.7.2
+ "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0
+ "@types/react-helmet": ^6.1.0
+ "@types/react-sparklines": ^1.7.0
+ "@types/react-syntax-highlighter": ^15.0.0
+ "@types/react-virtualized-auto-sizer": ^1.0.1
+ "@types/react-window": ^1.8.5
+ "@types/zen-observable": ^0.8.0
+ ansi-regex: ^6.0.1
+ classnames: ^2.2.6
+ cross-fetch: ^4.0.0
+ d3-selection: ^3.0.0
+ d3-shape: ^3.0.0
+ d3-zoom: ^3.0.0
+ dagre: ^0.8.5
+ history: ^5.0.0
+ linkify-react: 4.1.3
+ linkifyjs: 4.1.3
+ lodash: ^4.17.21
+ msw: ^1.0.0
+ pluralize: ^8.0.0
+ qs: ^6.9.4
+ rc-progress: 3.5.1
+ react-helmet: 6.1.0
+ react-hook-form: ^7.12.2
+ react-idle-timer: 5.7.2
+ react-markdown: ^8.0.0
+ react-sparklines: ^1.7.0
+ react-syntax-highlighter: ^15.4.5
+ react-use: ^17.3.2
+ react-virtualized-auto-sizer: ^1.0.11
+ react-window: ^1.8.6
+ remark-gfm: ^3.0.1
+ zen-observable: ^0.10.0
+ zod: ^3.22.4
+ peerDependencies:
+ react: ^16.13.1 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0
+ react-router-dom: 6.0.0-beta.0 || ^6.3.0
+ languageName: unknown
+ linkType: soft
+
"@backstage/core-components@npm:^0.13.10":
version: 0.13.10
resolution: "@backstage/core-components@npm:0.13.10"
@@ -3981,130 +4034,6 @@ __metadata:
languageName: node
linkType: hard
-"@backstage/core-components@npm:^0.14.4":
- version: 0.14.4
- resolution: "@backstage/core-components@npm:0.14.4"
- dependencies:
- "@backstage/config": ^1.2.0
- "@backstage/core-plugin-api": ^1.9.2
- "@backstage/errors": ^1.2.4
- "@backstage/theme": ^0.5.3
- "@backstage/version-bridge": ^1.0.8
- "@date-io/core": ^1.3.13
- "@material-table/core": ^3.1.0
- "@material-ui/core": ^4.12.2
- "@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.61
- "@react-hookz/web": ^24.0.0
- "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0
- "@types/react-sparklines": ^1.7.0
- "@types/react-text-truncate": ^0.14.0
- ansi-regex: ^6.0.1
- classnames: ^2.2.6
- d3-selection: ^3.0.0
- d3-shape: ^3.0.0
- d3-zoom: ^3.0.0
- dagre: ^0.8.5
- linkify-react: 4.1.3
- linkifyjs: 4.1.3
- lodash: ^4.17.21
- pluralize: ^8.0.0
- qs: ^6.9.4
- rc-progress: 3.5.1
- react-helmet: 6.1.0
- react-hook-form: ^7.12.2
- react-idle-timer: 5.7.2
- react-markdown: ^8.0.0
- react-sparklines: ^1.7.0
- react-syntax-highlighter: ^15.4.5
- react-text-truncate: ^0.19.0
- react-use: ^17.3.2
- react-virtualized-auto-sizer: ^1.0.11
- react-window: ^1.8.6
- remark-gfm: ^3.0.1
- zen-observable: ^0.10.0
- zod: ^3.22.4
- peerDependencies:
- react: ^16.13.1 || ^17.0.0 || ^18.0.0
- react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0
- react-router-dom: 6.0.0-beta.0 || ^6.3.0
- checksum: b96721b267daeec5a73a8b487f96ab5b5b3a85b8b113b2e45c5b733f3201af0d5cda3d7a325f5f68a4057ccbe78beac9f239b51ceb3099d3b0001709ec16928b
- languageName: node
- linkType: hard
-
-"@backstage/core-components@workspace:^, @backstage/core-components@workspace:packages/core-components":
- version: 0.0.0-use.local
- resolution: "@backstage/core-components@workspace:packages/core-components"
- dependencies:
- "@backstage/app-defaults": "workspace:^"
- "@backstage/cli": "workspace:^"
- "@backstage/config": "workspace:^"
- "@backstage/core-app-api": "workspace:^"
- "@backstage/core-plugin-api": "workspace:^"
- "@backstage/errors": "workspace:^"
- "@backstage/test-utils": "workspace:^"
- "@backstage/theme": "workspace:^"
- "@backstage/version-bridge": "workspace:^"
- "@date-io/core": ^1.3.13
- "@material-table/core": ^3.1.0
- "@material-ui/core": ^4.12.2
- "@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.61
- "@react-hookz/web": ^24.0.0
- "@testing-library/dom": ^10.0.0
- "@testing-library/jest-dom": ^6.0.0
- "@testing-library/react": ^15.0.0
- "@testing-library/user-event": ^14.0.0
- "@types/ansi-regex": ^5.0.0
- "@types/classnames": ^2.2.9
- "@types/d3-selection": ^3.0.1
- "@types/d3-shape": ^3.0.1
- "@types/d3-zoom": ^3.0.1
- "@types/dagre": ^0.7.44
- "@types/google-protobuf": ^3.7.2
- "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0
- "@types/react-helmet": ^6.1.0
- "@types/react-sparklines": ^1.7.0
- "@types/react-syntax-highlighter": ^15.0.0
- "@types/react-text-truncate": ^0.14.0
- "@types/react-virtualized-auto-sizer": ^1.0.1
- "@types/react-window": ^1.8.5
- "@types/zen-observable": ^0.8.0
- ansi-regex: ^6.0.1
- classnames: ^2.2.6
- cross-fetch: ^4.0.0
- d3-selection: ^3.0.0
- d3-shape: ^3.0.0
- d3-zoom: ^3.0.0
- dagre: ^0.8.5
- history: ^5.0.0
- linkify-react: 4.1.3
- linkifyjs: 4.1.3
- lodash: ^4.17.21
- msw: ^1.0.0
- pluralize: ^8.0.0
- qs: ^6.9.4
- rc-progress: 3.5.1
- react-helmet: 6.1.0
- react-hook-form: ^7.12.2
- react-idle-timer: 5.7.2
- react-markdown: ^8.0.0
- react-sparklines: ^1.7.0
- react-syntax-highlighter: ^15.4.5
- react-text-truncate: ^0.19.0
- react-use: ^17.3.2
- react-virtualized-auto-sizer: ^1.0.11
- react-window: ^1.8.6
- remark-gfm: ^3.0.1
- zen-observable: ^0.10.0
- zod: ^3.22.4
- peerDependencies:
- react: ^16.13.1 || ^17.0.0 || ^18.0.0
- react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0
- react-router-dom: 6.0.0-beta.0 || ^6.3.0
- languageName: unknown
- linkType: soft
-
"@backstage/core-plugin-api@^1.8.2, @backstage/core-plugin-api@^1.9.2, @backstage/core-plugin-api@workspace:^, @backstage/core-plugin-api@workspace:packages/core-plugin-api":
version: 0.0.0-use.local
resolution: "@backstage/core-plugin-api@workspace:packages/core-plugin-api"
@@ -4252,26 +4181,6 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/frontend-plugin-api@npm:^0.6.4":
- version: 0.6.4
- resolution: "@backstage/frontend-plugin-api@npm:0.6.4"
- dependencies:
- "@backstage/core-components": ^0.14.4
- "@backstage/core-plugin-api": ^1.9.2
- "@backstage/types": ^1.1.1
- "@backstage/version-bridge": ^1.0.8
- "@material-ui/core": ^4.12.4
- "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0
- lodash: ^4.17.21
- zod: ^3.22.4
- zod-to-json-schema: ^3.21.4
- peerDependencies:
- react: ^16.13.1 || ^17.0.0 || ^18.0.0
- react-router-dom: 6.0.0-beta.0 || ^6.3.0
- checksum: 2ae2919147dcfd8a5b4379059ecb76461a27f38159c398915384db7a7396bc65451cf696d955e4ba23eb6dfb549395624d09412d0c9c776072d3f003e5f1cba8
- languageName: node
- linkType: hard
-
"@backstage/frontend-plugin-api@workspace:^, @backstage/frontend-plugin-api@workspace:packages/frontend-plugin-api":
version: 0.0.0-use.local
resolution: "@backstage/frontend-plugin-api@workspace:packages/frontend-plugin-api"
@@ -4335,7 +4244,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/integration-react@^1.1.26, @backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react":
+"@backstage/integration-react@workspace:^, @backstage/integration-react@workspace:packages/integration-react":
version: 0.0.0-use.local
resolution: "@backstage/integration-react@workspace:packages/integration-react"
dependencies:
@@ -4947,7 +4856,7 @@ __metadata:
"@openapitools/openapi-generator-cli": ^2.4.26
cross-fetch: ^4.0.0
msw: ^1.0.0
- ts-morph: ^21.0.0
+ ts-morph: ^22.0.0
languageName: unknown
linkType: soft
@@ -5232,6 +5141,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@backstage/plugin-catalog-backend-module-ldap@workspace:plugins/catalog-backend-module-ldap"
dependencies:
+ "@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-tasks": "workspace:^"
"@backstage/catalog-model": "workspace:^"
"@backstage/cli": "workspace:^"
@@ -5245,7 +5155,6 @@ __metadata:
ldapjs: ^2.3.3
lodash: ^4.17.21
uuid: ^9.0.0
- winston: ^3.2.1
languageName: unknown
linkType: soft
@@ -5411,18 +5320,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/plugin-catalog-common@npm:^1.0.20, @backstage/plugin-catalog-common@npm:^1.0.22":
- version: 1.0.22
- resolution: "@backstage/plugin-catalog-common@npm:1.0.22"
- dependencies:
- "@backstage/catalog-model": ^1.4.5
- "@backstage/plugin-permission-common": ^0.7.13
- "@backstage/plugin-search-common": ^1.2.11
- checksum: f468ade184d5e535cc27cbb27a9dbd6cd21c1601b5a84167d2ea1004f471180ef8bf148df5561b5557c332bdc01480d020e93f62915f029cc728802cebf8e255
- languageName: node
- linkType: hard
-
-"@backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common":
+"@backstage/plugin-catalog-common@^1.0.20, @backstage/plugin-catalog-common@workspace:^, @backstage/plugin-catalog-common@workspace:plugins/catalog-common":
version: 0.0.0-use.local
resolution: "@backstage/plugin-catalog-common@workspace:plugins/catalog-common"
dependencies:
@@ -5487,6 +5385,7 @@ __metadata:
"@backstage/frontend-plugin-api": "workspace:^"
"@backstage/integration": "workspace:^"
"@backstage/integration-react": "workspace:^"
+ "@backstage/plugin-catalog": "workspace:^"
"@backstage/plugin-catalog-common": "workspace:^"
"@backstage/plugin-catalog-react": "workspace:^"
"@backstage/test-utils": "workspace:^"
@@ -5530,43 +5429,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/plugin-catalog-react@npm:^1.11.3, @backstage/plugin-catalog-react@npm:^1.9.3":
- version: 1.11.3
- resolution: "@backstage/plugin-catalog-react@npm:1.11.3"
- dependencies:
- "@backstage/catalog-client": ^1.6.4
- "@backstage/catalog-model": ^1.4.5
- "@backstage/core-components": ^0.14.4
- "@backstage/core-plugin-api": ^1.9.2
- "@backstage/errors": ^1.2.4
- "@backstage/frontend-plugin-api": ^0.6.4
- "@backstage/integration-react": ^1.1.26
- "@backstage/plugin-catalog-common": ^1.0.22
- "@backstage/plugin-permission-common": ^0.7.13
- "@backstage/plugin-permission-react": ^0.4.22
- "@backstage/types": ^1.1.1
- "@backstage/version-bridge": ^1.0.8
- "@material-ui/core": ^4.12.2
- "@material-ui/icons": ^4.9.1
- "@material-ui/lab": 4.0.0-alpha.61
- "@react-hookz/web": ^24.0.0
- "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0
- classnames: ^2.2.6
- lodash: ^4.17.21
- material-ui-popup-state: ^1.9.3
- qs: ^6.9.4
- react-use: ^17.2.4
- yaml: ^2.0.0
- zen-observable: ^0.10.0
- peerDependencies:
- react: ^16.13.1 || ^17.0.0 || ^18.0.0
- react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0
- react-router-dom: 6.0.0-beta.0 || ^6.3.0
- checksum: d04919bff692094bb145d8479aae47368911f3adc92644b4742e5db1296af9a2673cf4341995b9c65e660cd608d3b59a136b9c164ab2df51bdc3ccbaf5af71fd
- languageName: node
- linkType: hard
-
-"@backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react":
+"@backstage/plugin-catalog-react@^1.11.3, @backstage/plugin-catalog-react@^1.9.3, @backstage/plugin-catalog-react@workspace:^, @backstage/plugin-catalog-react@workspace:plugins/catalog-react":
version: 0.0.0-use.local
resolution: "@backstage/plugin-catalog-react@workspace:plugins/catalog-react"
dependencies:
@@ -6405,7 +6268,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/plugin-permission-common@^0.7.13, @backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common":
+"@backstage/plugin-permission-common@workspace:^, @backstage/plugin-permission-common@workspace:plugins/permission-common":
version: 0.0.0-use.local
resolution: "@backstage/plugin-permission-common@workspace:plugins/permission-common"
dependencies:
@@ -6443,7 +6306,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/plugin-permission-react@^0.4.22, @backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react":
+"@backstage/plugin-permission-react@workspace:^, @backstage/plugin-permission-react@workspace:plugins/permission-react":
version: 0.0.0-use.local
resolution: "@backstage/plugin-permission-react@workspace:plugins/permission-react"
dependencies:
@@ -6695,6 +6558,21 @@ __metadata:
languageName: unknown
linkType: soft
+"@backstage/plugin-scaffolder-backend-module-notifications@workspace:plugins/scaffolder-backend-module-notifications":
+ version: 0.0.0-use.local
+ resolution: "@backstage/plugin-scaffolder-backend-module-notifications@workspace:plugins/scaffolder-backend-module-notifications"
+ dependencies:
+ "@backstage/backend-common": "workspace:^"
+ "@backstage/backend-plugin-api": "workspace:^"
+ "@backstage/cli": "workspace:^"
+ "@backstage/plugin-notifications-common": "workspace:^"
+ "@backstage/plugin-notifications-node": "workspace:^"
+ "@backstage/plugin-scaffolder-node": "workspace:^"
+ "@backstage/plugin-scaffolder-node-test-utils": "workspace:^"
+ octokit: ^3.0.0
+ languageName: unknown
+ linkType: soft
+
"@backstage/plugin-scaffolder-backend-module-rails@workspace:^, @backstage/plugin-scaffolder-backend-module-rails@workspace:plugins/scaffolder-backend-module-rails":
version: 0.0.0-use.local
resolution: "@backstage/plugin-scaffolder-backend-module-rails@workspace:plugins/scaffolder-backend-module-rails"
@@ -6788,6 +6666,7 @@ __metadata:
"@types/nunjucks": ^3.1.4
"@types/supertest": ^2.0.8
"@types/zen-observable": ^0.8.0
+ concat-stream: ^2.0.0
esbuild: ^0.20.0
express: ^4.17.1
express-promise-router: ^4.1.0
@@ -6806,6 +6685,8 @@ __metadata:
prom-client: ^15.0.0
strip-ansi: ^7.1.0
supertest: ^6.1.3
+ tar: ^6.1.12
+ triple-beam: ^1.4.1
uuid: ^9.0.0
wait-for-expect: ^3.0.2
winston: ^3.2.1
@@ -6856,6 +6737,7 @@ __metadata:
"@backstage/types": "workspace:^"
fs-extra: ^11.2.0
globby: ^11.0.0
+ isomorphic-git: ^1.23.0
jsonschema: ^1.2.6
p-limit: ^3.1.0
winston: ^3.2.1
@@ -7159,7 +7041,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/plugin-search-common@^1.2.11, @backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common":
+"@backstage/plugin-search-common@workspace:^, @backstage/plugin-search-common@workspace:plugins/search-common":
version: 0.0.0-use.local
resolution: "@backstage/plugin-search-common@workspace:plugins/search-common"
dependencies:
@@ -7256,6 +7138,7 @@ __metadata:
"@backstage/types": "workspace:^"
"@types/express": "*"
"@types/supertest": ^2.0.8
+ "@types/ws": ^8.5.10
express: ^4.17.1
express-promise-router: ^4.1.0
http-proxy-middleware: ^2.0.0
@@ -7264,7 +7147,7 @@ __metadata:
supertest: ^6.2.4
uuid: ^9.0.0
winston: ^3.2.1
- ws: ^8.14.2
+ ws: ^8.17.0
yn: ^4.0.0
languageName: unknown
linkType: soft
@@ -7615,7 +7498,7 @@ __metadata:
dependencies:
"@apidevtools/swagger-parser": ^10.1.0
"@apisyouwonthate/style-guide": ^1.4.0
- "@backstage/backend-common": "workspace:^"
+ "@backstage/backend-plugin-api": "workspace:^"
"@backstage/backend-test-utils": "workspace:^"
"@backstage/catalog-model": "workspace:^"
"@backstage/cli": "workspace:^"
@@ -7695,23 +7578,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/theme@npm:^0.5.0, @backstage/theme@npm:^0.5.3":
- version: 0.5.3
- resolution: "@backstage/theme@npm:0.5.3"
- dependencies:
- "@emotion/react": ^11.10.5
- "@emotion/styled": ^11.10.5
- "@mui/material": ^5.12.2
- peerDependencies:
- "@material-ui/core": ^4.12.2
- "@types/react": ^16.13.1 || ^17.0.0 || ^18.0.0
- react: ^16.13.1 || ^17.0.0 || ^18.0.0
- react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0
- checksum: ac6c3bbd73294385f73aa91e04f8bf3a1bb78cadc0e43034760ebf19e86814ed2d679f2641bb086aa9e305a24d923d8c3480b2de3bff55189c19bc5dfdce1814
- languageName: node
- linkType: hard
-
-"@backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme":
+"@backstage/theme@^0.5.0, @backstage/theme@workspace:^, @backstage/theme@workspace:packages/theme":
version: 0.0.0-use.local
resolution: "@backstage/theme@workspace:packages/theme"
dependencies:
@@ -7742,7 +7609,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@backstage/version-bridge@^1.0.7, @backstage/version-bridge@^1.0.8, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge":
+"@backstage/version-bridge@^1.0.7, @backstage/version-bridge@workspace:^, @backstage/version-bridge@workspace:packages/version-bridge":
version: 0.0.0-use.local
resolution: "@backstage/version-bridge@workspace:packages/version-bridge"
dependencies:
@@ -7817,7 +7684,7 @@ __metadata:
languageName: node
linkType: hard
-"@changesets/assemble-release-plan@npm:^6.0.0":
+"@changesets/assemble-release-plan@npm:6.0.0":
version: 6.0.0
resolution: "@changesets/assemble-release-plan@npm:6.0.0"
dependencies:
@@ -7831,6 +7698,20 @@ __metadata:
languageName: node
linkType: hard
+"@changesets/assemble-release-plan@patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch::locator=root%40workspace%3A.":
+ version: 6.0.0
+ resolution: "@changesets/assemble-release-plan@patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch::version=6.0.0&hash=43c5e4&locator=root%40workspace%3A."
+ dependencies:
+ "@babel/runtime": ^7.20.1
+ "@changesets/errors": ^0.2.0
+ "@changesets/get-dependents-graph": ^2.0.0
+ "@changesets/types": ^6.0.0
+ "@manypkg/get-packages": ^1.1.3
+ semver: ^7.5.3
+ checksum: b7a68e28d03379bdc2a1d7171963990e1b88d0e5efca5f5ed490c0f583d66d0ccbd4c04ebf4e5cd1c38e1346ff0e5c4c16e1b4973cdd97fabdbad0c6996fe016
+ languageName: node
+ linkType: hard
+
"@changesets/changelog-git@npm:^0.2.0":
version: 0.2.0
resolution: "@changesets/changelog-git@npm:0.2.0"
@@ -9333,6 +9214,16 @@ __metadata:
languageName: node
linkType: hard
+"@grpc/grpc-js@npm:^1.7.1":
+ version: 1.10.7
+ resolution: "@grpc/grpc-js@npm:1.10.7"
+ dependencies:
+ "@grpc/proto-loader": ^0.7.13
+ "@js-sdsl/ordered-map": ^4.4.2
+ checksum: 69e88768e59b53ca020e2cfa9474fbd645f4ee7dd3269559c9fb91970273da6e8db480c0c439bdd73b49f1831d8f47c9bc5305dc5f9ed4db8873d53572e4f019
+ languageName: node
+ linkType: hard
+
"@grpc/grpc-js@npm:~1.9.6":
version: 1.9.11
resolution: "@grpc/grpc-js@npm:1.9.11"
@@ -9343,17 +9234,108 @@ __metadata:
languageName: node
linkType: hard
-"@grpc/proto-loader@npm:^0.7.0, @grpc/proto-loader@npm:^0.7.8":
- version: 0.7.10
- resolution: "@grpc/proto-loader@npm:0.7.10"
+"@grpc/proto-loader@npm:^0.7.0, @grpc/proto-loader@npm:^0.7.13, @grpc/proto-loader@npm:^0.7.8":
+ version: 0.7.13
+ resolution: "@grpc/proto-loader@npm:0.7.13"
dependencies:
lodash.camelcase: ^4.3.0
long: ^5.0.0
- protobufjs: ^7.2.4
+ protobufjs: ^7.2.5
yargs: ^17.7.2
bin:
proto-loader-gen-types: build/bin/proto-loader-gen-types.js
- checksum: 4987e23b57942c2363b6a6a106e63efae636666cefa348778dfafef2ff72da7343c8587667521cb1d52482827bcd001dd535bdc27065110af56d9c7c176334c9
+ checksum: 399c1b8a4627f93dc31660d9636ea6bf58be5675cc7581e3df56a249369e5be02c6cd0d642c5332b0d5673bc8621619bc06fb045aa3e8f57383737b5d35930dc
+ languageName: node
+ linkType: hard
+
+"@hapi/b64@npm:5.x.x":
+ version: 5.0.0
+ resolution: "@hapi/b64@npm:5.0.0"
+ dependencies:
+ "@hapi/hoek": 9.x.x
+ checksum: 1e166bc9a6ca2952190ede40089d552efa21554c3325d5174e5616b940f79cd8327520b239ef6725f823f95b9e4684579bc8e99a222b28639b793ae0ef788409
+ languageName: node
+ linkType: hard
+
+"@hapi/boom@npm:9.x.x, @hapi/boom@npm:^9.0.0":
+ version: 9.1.4
+ resolution: "@hapi/boom@npm:9.1.4"
+ dependencies:
+ "@hapi/hoek": 9.x.x
+ checksum: b1cdde1e82fae8222d893ac74e13e9a784f0398ffcb7ece32f6eb69bad990ca62f3c40cca19673e74cc676628ff121ee5576d6b0f1add92dcfa182ff9b90b937
+ languageName: node
+ linkType: hard
+
+"@hapi/bourne@npm:2.x.x":
+ version: 2.1.0
+ resolution: "@hapi/bourne@npm:2.1.0"
+ checksum: 0ce5a38bc46b1b649fc04c00763def978c99b2eba5013e512f492f4d0d806a6fc1d09f36524c2f8b45cc778d481a06c1f808392e08bc6ebd14abab4bfde07ca5
+ languageName: node
+ linkType: hard
+
+"@hapi/cryptiles@npm:5.x.x":
+ version: 5.1.0
+ resolution: "@hapi/cryptiles@npm:5.1.0"
+ dependencies:
+ "@hapi/boom": 9.x.x
+ checksum: 3109ad8435d6333b22092e8264e0cc32baafaa10c8c813685ca379c033b5d4123cd503aecdb535fb0c2d39d8e26c494f4c4998d5d040865907b64bf4cb72c705
+ languageName: node
+ linkType: hard
+
+"@hapi/hoek@npm:9.x.x, @hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0":
+ version: 9.3.0
+ resolution: "@hapi/hoek@npm:9.3.0"
+ checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43
+ languageName: node
+ linkType: hard
+
+"@hapi/iron@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "@hapi/iron@npm:6.0.0"
+ dependencies:
+ "@hapi/b64": 5.x.x
+ "@hapi/boom": 9.x.x
+ "@hapi/bourne": 2.x.x
+ "@hapi/cryptiles": 5.x.x
+ "@hapi/hoek": 9.x.x
+ checksum: ef07abc8a55eb8b60ab0c09d797bb13b39d283260ecdabedc1568c64c47d8c15fe517beed4f76a2b69dac57e6c26cd30ac7612169c41adb8f4c77ea3f58d973d
+ languageName: node
+ linkType: hard
+
+"@hapi/podium@npm:^4.1.3":
+ version: 4.1.3
+ resolution: "@hapi/podium@npm:4.1.3"
+ dependencies:
+ "@hapi/hoek": 9.x.x
+ "@hapi/teamwork": 5.x.x
+ "@hapi/validate": 1.x.x
+ checksum: da7d02af93a2797fc522cca0ec6cf12691a75047857db80162405d7f83bbf437d49f95c20714bd8e19f2ff41b8e5139e88fb7a896f5d967e0d9bcbf632a9feae
+ languageName: node
+ linkType: hard
+
+"@hapi/teamwork@npm:5.x.x":
+ version: 5.1.1
+ resolution: "@hapi/teamwork@npm:5.1.1"
+ checksum: f679aff66b432f5fe3daa72a0659c4280de8f6e109e0c547ed24e7ea60149b182c406c4c02426a8bcfd87a79889b180f6d5f5a95690489e5607cc044c3c2defb
+ languageName: node
+ linkType: hard
+
+"@hapi/topo@npm:^5.0.0, @hapi/topo@npm:^5.1.0":
+ version: 5.1.0
+ resolution: "@hapi/topo@npm:5.1.0"
+ dependencies:
+ "@hapi/hoek": ^9.0.0
+ checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014
+ languageName: node
+ linkType: hard
+
+"@hapi/validate@npm:1.x.x":
+ version: 1.1.3
+ resolution: "@hapi/validate@npm:1.1.3"
+ dependencies:
+ "@hapi/hoek": ^9.0.0
+ "@hapi/topo": ^5.0.0
+ checksum: dd6f8d6e33ac55d430448bc83c33572a593702ae856186610161a9488a611110ac4f793339043ea44a6f79bebe689bc7f86122df2f817725255159a0c1cb62ec
languageName: node
linkType: hard
@@ -9902,6 +9884,13 @@ __metadata:
languageName: node
linkType: hard
+"@js-sdsl/ordered-map@npm:^4.4.2":
+ version: 4.4.2
+ resolution: "@js-sdsl/ordered-map@npm:4.4.2"
+ checksum: a927ae4ff8565ecb75355cc6886a4f8fadbf2af1268143c96c0cce3ba01261d241c3f4ba77f21f3f017a00f91dfe9e0673e95f830255945c80a0e96c6d30508a
+ languageName: node
+ linkType: hard
+
"@jsdevtools/ono@npm:7.1.3, @jsdevtools/ono@npm:^7.1.3":
version: 7.1.3
resolution: "@jsdevtools/ono@npm:7.1.3"
@@ -11879,13 +11868,114 @@ __metadata:
languageName: node
linkType: hard
-"@opentelemetry/api@npm:^1.0.1, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.4.1":
+"@opentelemetry/api-logs@npm:0.49.1, @opentelemetry/api-logs@npm:^0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/api-logs@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 83f559164fb62ed4343e650afccae766bb7ec730540a14f391d6ab4516a96a11cb1f9db9fc77495d07cb95541b4e8ccd184a6f36a0e38ddaad4fdd6359b3a3d9
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/api-logs@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/api-logs@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 5d4d9d448d1dc3a74879a19d5d24b9aecfd180e05acc622e25e5ca1bd0ad2c27b5541e101e474f2870e6470e148a7bad3c1b041d5a41181ebcde1f38a1ee6feb
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.0.1, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0":
version: 1.8.0
resolution: "@opentelemetry/api@npm:1.8.0"
checksum: 0e32079975f05bee6de2ad8ade097f0afdc63f462c76550150fce2444c73ab92aaf851ac85e638b6e3b269da6640ac7e63f33913a0fd7df9f9beec2e100759df
languageName: node
linkType: hard
+"@opentelemetry/auto-instrumentations-node@npm:^0.43.0":
+ version: 0.43.0
+ resolution: "@opentelemetry/auto-instrumentations-node@npm:0.43.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/instrumentation-amqplib": ^0.35.0
+ "@opentelemetry/instrumentation-aws-lambda": ^0.39.0
+ "@opentelemetry/instrumentation-aws-sdk": ^0.39.1
+ "@opentelemetry/instrumentation-bunyan": ^0.36.0
+ "@opentelemetry/instrumentation-cassandra-driver": ^0.36.0
+ "@opentelemetry/instrumentation-connect": ^0.34.0
+ "@opentelemetry/instrumentation-cucumber": ^0.4.0
+ "@opentelemetry/instrumentation-dataloader": ^0.7.0
+ "@opentelemetry/instrumentation-dns": ^0.34.0
+ "@opentelemetry/instrumentation-express": ^0.36.1
+ "@opentelemetry/instrumentation-fastify": ^0.34.0
+ "@opentelemetry/instrumentation-fs": ^0.10.0
+ "@opentelemetry/instrumentation-generic-pool": ^0.34.0
+ "@opentelemetry/instrumentation-graphql": ^0.38.1
+ "@opentelemetry/instrumentation-grpc": ^0.49.1
+ "@opentelemetry/instrumentation-hapi": ^0.35.0
+ "@opentelemetry/instrumentation-http": ^0.49.1
+ "@opentelemetry/instrumentation-ioredis": ^0.38.0
+ "@opentelemetry/instrumentation-knex": ^0.34.0
+ "@opentelemetry/instrumentation-koa": ^0.38.0
+ "@opentelemetry/instrumentation-lru-memoizer": ^0.35.0
+ "@opentelemetry/instrumentation-memcached": ^0.34.0
+ "@opentelemetry/instrumentation-mongodb": ^0.41.0
+ "@opentelemetry/instrumentation-mongoose": ^0.36.0
+ "@opentelemetry/instrumentation-mysql": ^0.36.0
+ "@opentelemetry/instrumentation-mysql2": ^0.36.0
+ "@opentelemetry/instrumentation-nestjs-core": ^0.35.0
+ "@opentelemetry/instrumentation-net": ^0.34.0
+ "@opentelemetry/instrumentation-pg": ^0.39.1
+ "@opentelemetry/instrumentation-pino": ^0.36.0
+ "@opentelemetry/instrumentation-redis": ^0.37.0
+ "@opentelemetry/instrumentation-redis-4": ^0.37.0
+ "@opentelemetry/instrumentation-restify": ^0.36.0
+ "@opentelemetry/instrumentation-router": ^0.35.0
+ "@opentelemetry/instrumentation-socket.io": ^0.37.0
+ "@opentelemetry/instrumentation-tedious": ^0.8.0
+ "@opentelemetry/instrumentation-winston": ^0.35.0
+ "@opentelemetry/resource-detector-alibaba-cloud": ^0.28.7
+ "@opentelemetry/resource-detector-aws": ^1.4.0
+ "@opentelemetry/resource-detector-container": ^0.3.7
+ "@opentelemetry/resource-detector-gcp": ^0.29.7
+ "@opentelemetry/resources": ^1.12.0
+ "@opentelemetry/sdk-node": ^0.49.1
+ peerDependencies:
+ "@opentelemetry/api": ^1.4.1
+ checksum: e1bb1119a58f70186cffc8de192f1b3884ba10aa31976b513a7df0995a737383fd043c570142f6feb660db087e160c24356aa55d8fe22010394efca3ca9ceb0b
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/context-async-hooks@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/context-async-hooks@npm:1.22.0"
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 03b3b8c3eb34b35495abd9869303e67a61fafb8a004a9bc6ab1234a35909ee89d0f515cfeb5b710c9f3e8f4d185b776ada3fa2975a62d607c80986a7c46f4d83
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/context-async-hooks@npm:1.23.0":
+ version: 1.23.0
+ resolution: "@opentelemetry/context-async-hooks@npm:1.23.0"
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 4dc6c4f816402fe3deb5d43aebd4ceadd8afa8feab2047eed7cc906379fd341686cac8d16bce1c436d15e03b29883bcf73f04d4da005abe318e0b9ec69bdbd23
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/core@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/core@npm:1.22.0"
+ dependencies:
+ "@opentelemetry/semantic-conventions": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 0056bbaceb922816ec87e7e21aa8a7687377a41ba36a598bb6c49738d1eb5767f823e5758b5bf844d2b10aa075c553e98904dd6fd4f02c24cf335e3951fe78a6
+ languageName: node
+ linkType: hard
+
"@opentelemetry/core@npm:1.23.0":
version: 1.23.0
resolution: "@opentelemetry/core@npm:1.23.0"
@@ -11897,6 +11987,17 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/core@npm:1.24.0, @opentelemetry/core@npm:^1.0.0, @opentelemetry/core@npm:^1.1.0, @opentelemetry/core@npm:^1.8.0":
+ version: 1.24.0
+ resolution: "@opentelemetry/core@npm:1.24.0"
+ dependencies:
+ "@opentelemetry/semantic-conventions": 1.24.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: b1af2641cd3af62fae772c97701434e45fbb2bbd53403aa640a589548f852759279598134b4338ed48bcde6099e273b2f34686cbf1e817d566282e3b846397b7
+ languageName: node
+ linkType: hard
+
"@opentelemetry/exporter-prometheus@npm:^0.50.0":
version: 0.50.0
resolution: "@opentelemetry/exporter-prometheus@npm:0.50.0"
@@ -11910,6 +12011,875 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/exporter-trace-otlp-grpc@npm:0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.49.1"
+ dependencies:
+ "@grpc/grpc-js": ^1.7.1
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/otlp-grpc-exporter-base": 0.49.1
+ "@opentelemetry/otlp-transformer": 0.49.1
+ "@opentelemetry/resources": 1.22.0
+ "@opentelemetry/sdk-trace-base": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 2418f68c8027d5baf5609f7e32b524826ecdc16b3382f6113a6f1f00835e59275a51f2fdefcd5b6f73f455aab444892097866ce8e894d0415d70acd25a6a3049
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/exporter-trace-otlp-grpc@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.50.0"
+ dependencies:
+ "@grpc/grpc-js": ^1.7.1
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/otlp-grpc-exporter-base": 0.50.0
+ "@opentelemetry/otlp-transformer": 0.50.0
+ "@opentelemetry/resources": 1.23.0
+ "@opentelemetry/sdk-trace-base": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: f27189ebf0ae4f417d7e3697a5679805da3544cc60082b89d2d66344a3a4e1941f2f9ab130954ea2718ed32f14201d5679b675d1eb026b7ed5f7b9f817243e57
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/exporter-trace-otlp-http@npm:0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/otlp-exporter-base": 0.49.1
+ "@opentelemetry/otlp-transformer": 0.49.1
+ "@opentelemetry/resources": 1.22.0
+ "@opentelemetry/sdk-trace-base": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 35084da407169f7871c016f92df787446f7e133b8cf6a062b9e76e4779373dae7f054b98ace7709bd52b236f13a073b58fa599bf8fc09d5a9df09945bac0fa49
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/exporter-trace-otlp-http@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/otlp-exporter-base": 0.50.0
+ "@opentelemetry/otlp-transformer": 0.50.0
+ "@opentelemetry/resources": 1.23.0
+ "@opentelemetry/sdk-trace-base": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: e0725be8f19f2c37c9b16989ff234183213878dad44f0698fc2b6a815c5979498c3766b0377932197ef051a0914d337c81a486612eac2285a4c9cb8313eefa6b
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/exporter-trace-otlp-proto@npm:0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/otlp-exporter-base": 0.49.1
+ "@opentelemetry/otlp-proto-exporter-base": 0.49.1
+ "@opentelemetry/otlp-transformer": 0.49.1
+ "@opentelemetry/resources": 1.22.0
+ "@opentelemetry/sdk-trace-base": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 0afa21d176f087d52b68b84f5645076241e5b842461add7de4429f8860861d5141d5f84be144b74d7656d3928bc580f8ee12bb231b4d80861f73128f3b09b4fc
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/exporter-trace-otlp-proto@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/exporter-trace-otlp-proto@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/otlp-exporter-base": 0.50.0
+ "@opentelemetry/otlp-proto-exporter-base": 0.50.0
+ "@opentelemetry/otlp-transformer": 0.50.0
+ "@opentelemetry/resources": 1.23.0
+ "@opentelemetry/sdk-trace-base": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 9666686d85a0966373e5b01e55f6ae9bbe397a27efce4f2bd1eb861e993f5894724b5b5131c4a74061f6bb60b18ba946f27e38850fcd33204ca99f631317139e
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/exporter-zipkin@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/exporter-zipkin@npm:1.22.0"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/resources": 1.22.0
+ "@opentelemetry/sdk-trace-base": 1.22.0
+ "@opentelemetry/semantic-conventions": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 8d3d396d3cf69d5b507abb980a1d548c6a93243d5413c371a8ed7a025990e02c04498f7232c2562279d74a1c4ec862292d6a3498a4513eebe9882d615226c5fd
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/exporter-zipkin@npm:1.23.0":
+ version: 1.23.0
+ resolution: "@opentelemetry/exporter-zipkin@npm:1.23.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/resources": 1.23.0
+ "@opentelemetry/sdk-trace-base": 1.23.0
+ "@opentelemetry/semantic-conventions": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 08d5f7a9e2af1ad749be8cb6e65d1b312d1e86dd9ec484156ddcd2c0ad3ff27dded459c599ec406d9bccb937e1fd5b58e9af6ff2e5efc3d2e4e83ca2af12920e
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-amqplib@npm:^0.35.0":
+ version: 0.35.0
+ resolution: "@opentelemetry/instrumentation-amqplib@npm:0.35.0"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 7f99738f85d56ee0b706330558936c92e2f2b6f91ae86896b3ac0891f40a42c5b8cee8b457a8efc12d4875ed73b29f36d9aa3590b779a1214d13a655b83268ce
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-aws-lambda@npm:^0.39.0":
+ version: 0.39.0
+ resolution: "@opentelemetry/instrumentation-aws-lambda@npm:0.39.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/propagator-aws-xray": ^1.3.1
+ "@opentelemetry/resources": ^1.8.0
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@types/aws-lambda": 8.10.122
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: e2840a79680e70157f82341f7796e3d53e79c65c63bfc77995760a647e797fee4afb5dcf6220a672cf8dd3d2caa74ac15f1850a295b483d50d19dd0aeb7512d1
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-aws-sdk@npm:^0.39.1":
+ version: 0.39.1
+ resolution: "@opentelemetry/instrumentation-aws-sdk@npm:0.39.1"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/propagation-utils": ^0.30.7
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 7d18489b2f161b9bbc2e2d25c23f7358dc5b4e623b76edfdac9f999c083b3b5dd49326b79f6dc1b19c74b9024683e12e1addf03d0817946b2f11481808bbf530
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-bunyan@npm:^0.36.0":
+ version: 0.36.0
+ resolution: "@opentelemetry/instrumentation-bunyan@npm:0.36.0"
+ dependencies:
+ "@opentelemetry/api-logs": ^0.49.1
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@types/bunyan": 1.8.9
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 4848164223c152381d435127a39d296da6445591a99c7d872c220e9605e1ff769537d3840f8d3b17bb4db8d8ccfec54c505e75a82f19117addef793ba990d74d
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-cassandra-driver@npm:^0.36.0":
+ version: 0.36.0
+ resolution: "@opentelemetry/instrumentation-cassandra-driver@npm:0.36.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: f978269c922b1a1880ad792accfe359073c0e2ba6060ea75060c9785115aab0b6ce39cfe861a4f358e3da90ad2a7d9f53d52cbf54ac94fd65602bfd732709a32
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-connect@npm:^0.34.0":
+ version: 0.34.0
+ resolution: "@opentelemetry/instrumentation-connect@npm:0.34.0"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@types/connect": 3.4.36
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: dde9880cd00490bfc52dca8b3b1be6a4951e859fa98617e6db78ec95ce84e8d3df3bbbbe5711796a13bd672aa2d89ba4439621a70614f8b1400943cc439540ad
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-cucumber@npm:^0.4.0":
+ version: 0.4.0
+ resolution: "@opentelemetry/instrumentation-cucumber@npm:0.4.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 4126c5eaf5d48daca410b0ce76bd4d97f6e868fe0b0c151f88f379a93a1d95a1b7e934cb876d0060182f1b9dd20012aac13fc9c7baa6dd4f0c7f903fdfdce54e
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-dataloader@npm:^0.7.0":
+ version: 0.7.0
+ resolution: "@opentelemetry/instrumentation-dataloader@npm:0.7.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: bbd5f27ff770ccb7d79bf16c81c5de9ad84e0c27df8991f8fd36560f190bbb7b7b7d9c8c62d438577f18033447795519a16f66e650f8e009031ffc52a96be825
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-dns@npm:^0.34.0":
+ version: 0.34.0
+ resolution: "@opentelemetry/instrumentation-dns@npm:0.34.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ semver: ^7.5.4
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 9c2b4aae823255d88590c39802a76df888b745f744442930e322e9f48558090a9e08f91c7cd7433d48fac97dc7747ed636446277f3f163dcaecc0c70c53d0604
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-express@npm:^0.36.1":
+ version: 0.36.1
+ resolution: "@opentelemetry/instrumentation-express@npm:0.36.1"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: c4f4ed644a194160dd816e20cd914ab59b7927c11b2c1639fb17bb160a59148a027b23c3259d3ec3ac3384b90c769b15bedd7aac4649ac3ae01ee2cdb746f61d
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-fastify@npm:^0.34.0":
+ version: 0.34.0
+ resolution: "@opentelemetry/instrumentation-fastify@npm:0.34.0"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: c37d8f889b1b1db87fa066d41d595220505b6b708183daae06a0b8db94140a5f6d294bcc5650f024385626e114e5d926b1679c8246008be40a540a2f5710b1c5
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-fs@npm:^0.10.0":
+ version: 0.10.0
+ resolution: "@opentelemetry/instrumentation-fs@npm:0.10.0"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 4382ddeb28b663d218f47b2db533c2f4a350d9c38ca71b1a4b688b54f8f0333ce9f54ed411e294f0ce05cbf339897b2379ee8dfd7aaf6b3109077c86cc629a94
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-generic-pool@npm:^0.34.0":
+ version: 0.34.0
+ resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.34.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 0d55b59e65b6cf2af9942d303bc550da66455b718be5778330a0538f5c6ca27c18a2f82cb88dbeab98d4d8fb37ce761de1cd448e338701e57fd61bdb3b60b12a
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-graphql@npm:^0.38.1":
+ version: 0.38.1
+ resolution: "@opentelemetry/instrumentation-graphql@npm:0.38.1"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: d148d1aa5ab661ab375bce5a0539e80836e0dc695936661a93e64a4f58b7b7c9617cca6d9989b15f6d7fa2a5ffbdd8c26ba43316416cdf527ce03cb9fc9165ac
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-grpc@npm:^0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/instrumentation-grpc@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/instrumentation": 0.49.1
+ "@opentelemetry/semantic-conventions": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 55b22e2dffb6be63d57c97773b63fed9576307676d7919b16b005f47bce13a103437160966f2c01c2ed5aa71f135b36248d3db69c3030685a1e8ea9d4c42d4f9
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-hapi@npm:^0.35.0":
+ version: 0.35.0
+ resolution: "@opentelemetry/instrumentation-hapi@npm:0.35.0"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@types/hapi__hapi": 20.0.13
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 23545b19597e3f7f65fb0ff06adb6d5ed9ce4675ebbc5153c243668b0476f99d298e097b7f2349b3eaa565bcab0c26e7985332b749624afd5b77172669b70217
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-http@npm:^0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/instrumentation-http@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/instrumentation": 0.49.1
+ "@opentelemetry/semantic-conventions": 1.22.0
+ semver: ^7.5.2
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: b3dc388f94a69202749cca70d71b5bcd3b713d67c40e0421b84d11a323080a76d645ea05fc551092022451cbbef6da303d806890e90f1784edde65adefd20e4d
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-ioredis@npm:^0.38.0":
+ version: 0.38.0
+ resolution: "@opentelemetry/instrumentation-ioredis@npm:0.38.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/redis-common": ^0.36.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@types/ioredis4": "npm:@types/ioredis@^4.28.10"
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 0b61f92db80ff89d00e93f3ef8b532c9439973ac0fd7d6b492a5faf46dc61d3c0b65b6b4359d69d23413db59b85e86a3857d82b00f810dd22be41014b3ff392d
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-knex@npm:^0.34.0":
+ version: 0.34.0
+ resolution: "@opentelemetry/instrumentation-knex@npm:0.34.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 544b280c7a508bf4930f3d99dbce844358d066a1b7455c389916a6c13cab9d43ac5ff6eb1dd7e147988bc2636ca0e979f62883ee9c5941abcda29ba168af6165
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-koa@npm:^0.38.0":
+ version: 0.38.0
+ resolution: "@opentelemetry/instrumentation-koa@npm:0.38.0"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@types/koa": 2.14.0
+ "@types/koa__router": 12.0.3
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 7b76f6d03cbaeeda3a8a1e40790b76b52587365bd1ee2d2b04b65d62a527b9085c13827398e0422be4432f1b0dde3621246e7cbd85fa489aced58e085702e201
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-lru-memoizer@npm:^0.35.0":
+ version: 0.35.0
+ resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.35.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 9ef0231cf21c747fac86134402f36ea8561e8df694bc1e536b0f54af536e0a675e38c8d34c22628afbe6bc65ab5b5edebfe4de7b45d42e6e9d616afb60db62bf
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-memcached@npm:^0.34.0":
+ version: 0.34.0
+ resolution: "@opentelemetry/instrumentation-memcached@npm:0.34.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@types/memcached": ^2.2.6
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: b2a9d97f78641074054e9a67458702785fb15ceb7c1e4868ab8f5ddde85826676e29094154fac19b0722a58a62e1311afc5fda69e883b2bd7e4780bb8dd3f2cb
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-mongodb@npm:^0.41.0":
+ version: 0.41.0
+ resolution: "@opentelemetry/instrumentation-mongodb@npm:0.41.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/sdk-metrics": ^1.9.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 8fb991a1ea05a559d369e0274825b1f7e2a27f2aa4ddb8ecbf4e329efa35e115a19bd75864597918b74773319ad9dcbaf846e621dd286543d4f732399ab942b1
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-mongoose@npm:^0.36.0":
+ version: 0.36.0
+ resolution: "@opentelemetry/instrumentation-mongoose@npm:0.36.0"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 7bc18b731f321090550e02930f2a2ffa4a99d7becd58b3cfba16c89f8c5e91a97e59abac4976864c98c13b5ce171f9b4131c723b13ec62657d9a0d8e3f74e79f
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-mysql2@npm:^0.36.0":
+ version: 0.36.0
+ resolution: "@opentelemetry/instrumentation-mysql2@npm:0.36.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@opentelemetry/sql-common": ^0.40.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 3395f0d69c23d3a98e9e4d7085a36868b938eb5337c5f5bd540d6b4d025d90a6af89f28e01635e2558d963d2c28be1ba6bf63364767575dd39383fd6dfc82c89
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-mysql@npm:^0.36.0":
+ version: 0.36.0
+ resolution: "@opentelemetry/instrumentation-mysql@npm:0.36.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@types/mysql": 2.15.22
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 705ab9e38e79a6db3be59eac718814c1cc71dea7d45e4da5257094625940f1e84002d9c5c8afa33f5bbc25ff012a66988d02b5be8fac521e2fc0fae353d9e013
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-nestjs-core@npm:^0.35.0":
+ version: 0.35.0
+ resolution: "@opentelemetry/instrumentation-nestjs-core@npm:0.35.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: f878dc88d65e4ac876ca36a2e1f9c109aba14dd97f7aa8863b2231d90b57cb2526c74124690661a4d5fad8936d8c9b44c63c46563a5b89a1a57c86eb0ba01efd
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-net@npm:^0.34.0":
+ version: 0.34.0
+ resolution: "@opentelemetry/instrumentation-net@npm:0.34.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: ed4dd2a9ea69314d519358733fcaee8a55d120cb8a5e85088b20626b753e5ddeea7a61e58b76d1e86b27c36828e9777a504ba405556046e9a30ef1bf12eeaa08
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-pg@npm:^0.39.1":
+ version: 0.39.1
+ resolution: "@opentelemetry/instrumentation-pg@npm:0.39.1"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@opentelemetry/sql-common": ^0.40.0
+ "@types/pg": 8.6.1
+ "@types/pg-pool": 2.0.4
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 5e6276aaed45e88ccf019ce533a905570340160752e08e7e85c1bdfbe646ca6779046afd46c759cba18b2acec3dcb5bf80591807cf335bc2583d577725fdede8
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-pino@npm:^0.36.0":
+ version: 0.36.0
+ resolution: "@opentelemetry/instrumentation-pino@npm:0.36.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: bf46db42c88930f64430a68c227b5b08deeb40518ad082a610524ad8efc5768d038117951032e89a86131eb0f95106368cba8d3fde091f906aa3e42e167c2c95
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-redis-4@npm:^0.37.0":
+ version: 0.37.0
+ resolution: "@opentelemetry/instrumentation-redis-4@npm:0.37.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/redis-common": ^0.36.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 98208f8fe83bcf5e4fc9efeadff8724bc9eba4cfddc9c76630a30a582583e4d49842a47730429705c1d5931acbcc7223a4538194c43373c30ea6b0e326721db8
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-redis@npm:^0.37.0":
+ version: 0.37.0
+ resolution: "@opentelemetry/instrumentation-redis@npm:0.37.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/redis-common": ^0.36.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 06ceaf8df2cfc7f197f981b6785af3160379eb94c4a7b3e0a0e60ca78c47b3f22599d3e9f030c52ff016da396418a0c31eb38282b207d0477aa42e8c9180ac2c
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-restify@npm:^0.36.0":
+ version: 0.36.0
+ resolution: "@opentelemetry/instrumentation-restify@npm:0.36.0"
+ dependencies:
+ "@opentelemetry/core": ^1.8.0
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: f7dbca7e2a10463575d33f27c9c7e3b9352732dfe3df646fa0772a61aaae4757d1e66ede740ebe41804a952de904447cc6823c82ece31db16b568f926e40bcaa
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-router@npm:^0.35.0":
+ version: 0.35.0
+ resolution: "@opentelemetry/instrumentation-router@npm:0.35.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 3bdfba103b41f10c7fe7a650ad4f54cfa7a53b38afe69e05a0402b0157f2c393543b45e42febf05cc5c964ecb8667374a60ad25d00ce021180c70c02770e5f63
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-socket.io@npm:^0.37.0":
+ version: 0.37.0
+ resolution: "@opentelemetry/instrumentation-socket.io@npm:0.37.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 21b790f53b91994a1241d7d3c5a400d5232001f740c13f64a0f48461e5db7974d2563e17059a44f567fb8dc4fb9078dc57738784b1474fb40e771e5d7bca67bb
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-tedious@npm:^0.8.0":
+ version: 0.8.0
+ resolution: "@opentelemetry/instrumentation-tedious@npm:0.8.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ "@opentelemetry/semantic-conventions": ^1.0.0
+ "@types/tedious": ^4.0.10
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 920a8446fb765f6833d926680ae4e6a7e7e4013e2f9145b20546e945848e3f9a31aabb6e37c087a9a7667457c7ec710cd5d6304279e67a6c7ddeda0d41501e01
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation-winston@npm:^0.35.0":
+ version: 0.35.0
+ resolution: "@opentelemetry/instrumentation-winston@npm:0.35.0"
+ dependencies:
+ "@opentelemetry/instrumentation": ^0.49.1
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: f4f2ef0adf049de6434906fd573e2465900e1f5c0f788c842978f6a43889c12dc04d15a8c079a615e9fe09df1eeabc0c2b93a219aff6f1106b2031b01f045d96
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation@npm:0.49.1, @opentelemetry/instrumentation@npm:^0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/instrumentation@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/api-logs": 0.49.1
+ "@types/shimmer": ^1.0.2
+ import-in-the-middle: 1.7.1
+ require-in-the-middle: ^7.1.1
+ semver: ^7.5.2
+ shimmer: ^1.2.1
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 87379f8505118c850f73947784fd57fbaa2667fbf5ca8bd0a91a0782d0a240ab92e9091cd4107a6785d37e4976a6f1fb20b89a1d9ac9bec6faf858681a7d8707
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/instrumentation@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/instrumentation@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/api-logs": 0.50.0
+ "@types/shimmer": ^1.0.2
+ import-in-the-middle: 1.7.1
+ require-in-the-middle: ^7.1.1
+ semver: ^7.5.2
+ shimmer: ^1.2.1
+ peerDependencies:
+ "@opentelemetry/api": ^1.3.0
+ checksum: 371398639ca68c188d4b77a0034ea369222a2a1de421be37190900bade1210802a50b53cc48fd21206917817319a92a4cb52bd92bd534889355b54316145e634
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/otlp-exporter-base@npm:0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/otlp-exporter-base@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 43b2237b83811ccb632b0e6a5a6b824627c1c05670c0ca158f0686278ec6d1dc32d8780d0fde8c496531e6b7fbe780e154aa5dc53b911b49c927f0566bcc795d
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/otlp-exporter-base@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/otlp-exporter-base@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: e1e6586a64d753e542f28858c1618776deeaf639afd50e4ff325c14f7571ac91546928d0f2f89b2287e7cdbadf3211e3f9dd844139f64e6253e99f71b6cc1f07
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/otlp-grpc-exporter-base@npm:0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.49.1"
+ dependencies:
+ "@grpc/grpc-js": ^1.7.1
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/otlp-exporter-base": 0.49.1
+ protobufjs: ^7.2.3
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 7d8065ea161ba105060856ec448d2fdbbb725fd397bfd47a3281929249af3995373619d8e8c6504ca22893d1e1cffe12f3af220988d06e2b1576c8ac26edb86e
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/otlp-grpc-exporter-base@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.50.0"
+ dependencies:
+ "@grpc/grpc-js": ^1.7.1
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/otlp-exporter-base": 0.50.0
+ protobufjs: ^7.2.3
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 97a4e69d2834c840f1f037737eb378c309e5645002490b5bc51b836303a205a65658e2b1ec512dd613207626517efbe744b46225a9b3079b782cdda0a168fcf6
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/otlp-proto-exporter-base@npm:0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/otlp-proto-exporter-base@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/otlp-exporter-base": 0.49.1
+ protobufjs: ^7.2.3
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: b381e1022855867b621ad04252cad7376445c6a110073c8715f1c41b782b5dbad668f2acee2aecfca348c49a3f2adb4c16297d99fe9d3068b1746314cc6d4c13
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/otlp-proto-exporter-base@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/otlp-proto-exporter-base@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/otlp-exporter-base": 0.50.0
+ protobufjs: ^7.2.3
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: d39f61a5ca31ac9cbb6ac7e77c71afebc7b40bf247361c99e34f8c00aeae88db1d4c7e6742f9dd01d2334ee50c7db8e24d7d9df67a65ee005c947358611f2050
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/otlp-transformer@npm:0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/otlp-transformer@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/api-logs": 0.49.1
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/resources": 1.22.0
+ "@opentelemetry/sdk-logs": 0.49.1
+ "@opentelemetry/sdk-metrics": 1.22.0
+ "@opentelemetry/sdk-trace-base": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ checksum: 1f79e796a452168f353a3dfead3ae3e3206a30fa68d690721d7377e78f9e2ba0f3de32621fd8743b3c47c9b8c22034bf7f9b209327d2d09caa8a08f13288eeb0
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/otlp-transformer@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/otlp-transformer@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/api-logs": 0.50.0
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/resources": 1.23.0
+ "@opentelemetry/sdk-logs": 0.50.0
+ "@opentelemetry/sdk-metrics": 1.23.0
+ "@opentelemetry/sdk-trace-base": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ checksum: d2637146cdb1a3c7c311f03c8d8a11c1c4b57c63ac3532865096055d603a334bb4b5a63cecaba96f27dd0f3b8b4c7ffcebd248d85c47b7e60a5b5e7ae821219c
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/propagation-utils@npm:^0.30.7":
+ version: 0.30.9
+ resolution: "@opentelemetry/propagation-utils@npm:0.30.9"
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 4cc6e645ed7334fc1773396854c95aaabd5c5a307ede85ee8533e362fff4fa290a6efa36b35ced7a7d73894f575d07bd4daae4331ddd62536a4847efdd9354b0
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/propagator-aws-xray@npm:^1.3.1":
+ version: 1.24.0
+ resolution: "@opentelemetry/propagator-aws-xray@npm:1.24.0"
+ dependencies:
+ "@opentelemetry/core": 1.24.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 51d78403749e110c31f916a82edef2c5d1df1e8a1a9ada8dd420bf3ef5c1baafb0748193cd74fbb3975745110afe99602d5977a0e38690c9ba53e2166c28d4c5
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/propagator-b3@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/propagator-b3@npm:1.22.0"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: f072fcfaa2c126b84f7f9b060fa66fff36fbe3f425123f6aec9a99094d20296dc781d3c61e765b2727e957fcad311fd4f58da70ed51bf152fbc21202d78d70a5
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/propagator-b3@npm:1.23.0":
+ version: 1.23.0
+ resolution: "@opentelemetry/propagator-b3@npm:1.23.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 8478a4ac3fcad3ea53ed7af70c7da22dee48a262aef2bb2c64a039a3aff1368476b23ce385b95b3c34334a29d7964c98ca3c08bc05dd2999a891faf3ab858799
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/propagator-jaeger@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/propagator-jaeger@npm:1.22.0"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 0d998bd160b6d812ebc61b8ba75009688cf2d0feaeb4389c8f6bb32d2a02c16f7cf6a77d1bc5f773bf5663f31ca3fa7ec2dc79cf6d9909ffb5098297f6357a86
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/propagator-jaeger@npm:1.23.0":
+ version: 1.23.0
+ resolution: "@opentelemetry/propagator-jaeger@npm:1.23.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 240f27f15473704a5cf8549ea22b1640d865ef40c3da65b023e7f44cc89422b9f983061e4508a3f4576339907625c8f725c42e7f5e77c243c833e03d9490880d
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/redis-common@npm:^0.36.1":
+ version: 0.36.2
+ resolution: "@opentelemetry/redis-common@npm:0.36.2"
+ checksum: b0a6f2c2dc64ba3b655ed944a5a33715d00365865e6f498005527a4ad6c40ca0e7b8ac531791b6d5abfbab9b22d9c6aa1cd8bcc851a7634dfb381ad2d5061b0d
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/resource-detector-alibaba-cloud@npm:^0.28.7":
+ version: 0.28.9
+ resolution: "@opentelemetry/resource-detector-alibaba-cloud@npm:0.28.9"
+ dependencies:
+ "@opentelemetry/resources": ^1.0.0
+ "@opentelemetry/semantic-conventions": ^1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 8ac05377da60c7c1a958509849989d2151a29c341819def6033f65e5302066dec77ad0358a117d40eef22cbb3537956bb492a15e524a86131f92e0e5d9a91c16
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/resource-detector-aws@npm:^1.4.0":
+ version: 1.4.2
+ resolution: "@opentelemetry/resource-detector-aws@npm:1.4.2"
+ dependencies:
+ "@opentelemetry/core": ^1.0.0
+ "@opentelemetry/resources": ^1.0.0
+ "@opentelemetry/semantic-conventions": ^1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 66a7c90f037bccb0a754701182b6ec89982f8ba1d46bc07c0b4db6debe69dc504482fe65bdb3867c8ddf8f18e899a657cbb0c6bf5e677becb2ec08be8c3538f1
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/resource-detector-container@npm:^0.3.7":
+ version: 0.3.9
+ resolution: "@opentelemetry/resource-detector-container@npm:0.3.9"
+ dependencies:
+ "@opentelemetry/resources": ^1.0.0
+ "@opentelemetry/semantic-conventions": ^1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: c2157f4d9b602c6fd32ad27c2b0ee8dd944542b18c025363d47fd9b38458ee2107f442dab957e8d4107c8ac7cc049cdc09779965cb309ab3fedb5b52fafbcb30
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/resource-detector-gcp@npm:^0.29.7":
+ version: 0.29.9
+ resolution: "@opentelemetry/resource-detector-gcp@npm:0.29.9"
+ dependencies:
+ "@opentelemetry/core": ^1.0.0
+ "@opentelemetry/resources": ^1.0.0
+ "@opentelemetry/semantic-conventions": ^1.22.0
+ gcp-metadata: ^6.0.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.0.0
+ checksum: 4829cef6e5d849cae34320751c172ac9583ae12a9336db48ffa8ae47c288ca8d86d5b2ec19f20881fdd9505b6f3f12eeadd59f9dd341187dc8702f0a68d7e4d0
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/resources@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/resources@npm:1.22.0"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/semantic-conventions": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: f1da492d9fa7dbe3e5f08a511654b45265fcd16c4695bb1ae92488baa45ae9910d5a962166aaa4ae63be4c75393680c6f064450a5f10b86501b9df427ac49f27
+ languageName: node
+ linkType: hard
+
"@opentelemetry/resources@npm:1.23.0":
version: 1.23.0
resolution: "@opentelemetry/resources@npm:1.23.0"
@@ -11922,7 +12892,58 @@ __metadata:
languageName: node
linkType: hard
-"@opentelemetry/sdk-metrics@npm:1.23.0, @opentelemetry/sdk-metrics@npm:^1.13.0":
+"@opentelemetry/resources@npm:1.24.0, @opentelemetry/resources@npm:^1.0.0, @opentelemetry/resources@npm:^1.12.0, @opentelemetry/resources@npm:^1.8.0":
+ version: 1.24.0
+ resolution: "@opentelemetry/resources@npm:1.24.0"
+ dependencies:
+ "@opentelemetry/core": 1.24.0
+ "@opentelemetry/semantic-conventions": 1.24.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: b9a59d4267388aaec8d4adc1d708220209bdba1f60ef80fdf1436a23a4e1e04d0c05c33bf1cd08bec7ab75d1b7d2311d25bbe62253bd1d6efbb64102a7018958
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-logs@npm:0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/sdk-logs@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/resources": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.4.0 <1.9.0"
+ "@opentelemetry/api-logs": ">=0.39.1"
+ checksum: 9c2a60a15fd5a40316b96805a23d96dffb62258d78d20edcc0a9dedcb89aa410ab592d67c315fa63138657cb717d7e9e406337b16bee89a7115bdfe8a190190b
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-logs@npm:0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/sdk-logs@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/resources": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.4.0 <1.9.0"
+ "@opentelemetry/api-logs": ">=0.39.1"
+ checksum: e93be98f4ea2b64dd0fc0aebc5dfa7276f995a0822cae727455988397cb0c10f7696dbabc4d01a7b09d515faceffa2858c3329a85841ae79c44072e8c0911df8
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-metrics@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/sdk-metrics@npm:1.22.0"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/resources": 1.22.0
+ lodash.merge: ^4.6.2
+ peerDependencies:
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ checksum: 43b6599432bece2e41a48d40653f4f928ad7ba0b74c50a17bdb38f13bcb47cec1e08ce9af7f8cc643dc2c28cb127ef5ef4ce3e53cd1bf386d54fdaca361f29f2
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-metrics@npm:1.23.0":
version: 1.23.0
resolution: "@opentelemetry/sdk-metrics@npm:1.23.0"
dependencies:
@@ -11935,6 +12956,130 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/sdk-metrics@npm:^1.9.1":
+ version: 1.24.0
+ resolution: "@opentelemetry/sdk-metrics@npm:1.24.0"
+ dependencies:
+ "@opentelemetry/core": 1.24.0
+ "@opentelemetry/resources": 1.24.0
+ lodash.merge: ^4.6.2
+ peerDependencies:
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ checksum: 4468302b048685fa06c03c434754a37a671c4b1ae9a0409ad53132742eac7c982a65712bee4614f2d46e1fd361ec012afc55f693f00316808573f5c427cb68b9
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-node@npm:^0.49.1":
+ version: 0.49.1
+ resolution: "@opentelemetry/sdk-node@npm:0.49.1"
+ dependencies:
+ "@opentelemetry/api-logs": 0.49.1
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/exporter-trace-otlp-grpc": 0.49.1
+ "@opentelemetry/exporter-trace-otlp-http": 0.49.1
+ "@opentelemetry/exporter-trace-otlp-proto": 0.49.1
+ "@opentelemetry/exporter-zipkin": 1.22.0
+ "@opentelemetry/instrumentation": 0.49.1
+ "@opentelemetry/resources": 1.22.0
+ "@opentelemetry/sdk-logs": 0.49.1
+ "@opentelemetry/sdk-metrics": 1.22.0
+ "@opentelemetry/sdk-trace-base": 1.22.0
+ "@opentelemetry/sdk-trace-node": 1.22.0
+ "@opentelemetry/semantic-conventions": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ checksum: eb1ef8ddb33de7a4e8be697ed0eca100a4d728f41f7c8fca5a06f3facf5a1c2a4fce3d9585a29f47d958904a920024dd6637907e810cc9fb4b702cc8970136eb
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-node@npm:^0.50.0":
+ version: 0.50.0
+ resolution: "@opentelemetry/sdk-node@npm:0.50.0"
+ dependencies:
+ "@opentelemetry/api-logs": 0.50.0
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/exporter-trace-otlp-grpc": 0.50.0
+ "@opentelemetry/exporter-trace-otlp-http": 0.50.0
+ "@opentelemetry/exporter-trace-otlp-proto": 0.50.0
+ "@opentelemetry/exporter-zipkin": 1.23.0
+ "@opentelemetry/instrumentation": 0.50.0
+ "@opentelemetry/resources": 1.23.0
+ "@opentelemetry/sdk-logs": 0.50.0
+ "@opentelemetry/sdk-metrics": 1.23.0
+ "@opentelemetry/sdk-trace-base": 1.23.0
+ "@opentelemetry/sdk-trace-node": 1.23.0
+ "@opentelemetry/semantic-conventions": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.3.0 <1.9.0"
+ checksum: 1ca47e0cec7832a291e20fc838bfb2a7307b6d041a29b0ace1a5f3eb9f77fa8bad6e40d55eb19e5ab7c153afb866890bfc415e843d6b950691527566a592ad35
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-trace-base@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/sdk-trace-base@npm:1.22.0"
+ dependencies:
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/resources": 1.22.0
+ "@opentelemetry/semantic-conventions": 1.22.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 9a15bca01532b9bd279fcf7c083af7e39c24187c6793aa6ce0e6f780394abc12458fc5ae67bff279afd9392ccd67f5d1823c326d4f4511d789667ba2a878d56c
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-trace-base@npm:1.23.0":
+ version: 1.23.0
+ resolution: "@opentelemetry/sdk-trace-base@npm:1.23.0"
+ dependencies:
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/resources": 1.23.0
+ "@opentelemetry/semantic-conventions": 1.23.0
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 564a14a38b151d793949da95949a5eb4e0034ff95356162a7fcf7fe6a81b312cd8d601d6e46b303e6d9f785152ff28621cb7bd114f61e064bfdfa77ed28ca8cc
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-trace-node@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/sdk-trace-node@npm:1.22.0"
+ dependencies:
+ "@opentelemetry/context-async-hooks": 1.22.0
+ "@opentelemetry/core": 1.22.0
+ "@opentelemetry/propagator-b3": 1.22.0
+ "@opentelemetry/propagator-jaeger": 1.22.0
+ "@opentelemetry/sdk-trace-base": 1.22.0
+ semver: ^7.5.2
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: fcd755be1355b211551e54d6a36d46f196fd9bec30b2eff0dc935082a59a86df3f9e9460a6d0b1f540063627f0baf1780f504ec13653a08a2954985d06888ac0
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sdk-trace-node@npm:1.23.0":
+ version: 1.23.0
+ resolution: "@opentelemetry/sdk-trace-node@npm:1.23.0"
+ dependencies:
+ "@opentelemetry/context-async-hooks": 1.23.0
+ "@opentelemetry/core": 1.23.0
+ "@opentelemetry/propagator-b3": 1.23.0
+ "@opentelemetry/propagator-jaeger": 1.23.0
+ "@opentelemetry/sdk-trace-base": 1.23.0
+ semver: ^7.5.2
+ peerDependencies:
+ "@opentelemetry/api": ">=1.0.0 <1.9.0"
+ checksum: 165f26d77672d6745e9b1d3af78e3b1afcd4fe1b48e0eaef1aa67e9c86e822f9d0947cb0066c6a1080bdcf03c9da268870cace839254d1fee03446b25dbf6d30
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/semantic-conventions@npm:1.22.0":
+ version: 1.22.0
+ resolution: "@opentelemetry/semantic-conventions@npm:1.22.0"
+ checksum: cb3bdca1a29d3c32c44599bdf5ee5143b84e81aaa61edcd3f750133bfaffd7c1b36755c877921e4993e2468284a0564388844a7dda388122bee486d3f67fa4c8
+ languageName: node
+ linkType: hard
+
"@opentelemetry/semantic-conventions@npm:1.23.0":
version: 1.23.0
resolution: "@opentelemetry/semantic-conventions@npm:1.23.0"
@@ -11942,6 +13087,24 @@ __metadata:
languageName: node
linkType: hard
+"@opentelemetry/semantic-conventions@npm:1.24.0, @opentelemetry/semantic-conventions@npm:^1.0.0, @opentelemetry/semantic-conventions@npm:^1.22.0":
+ version: 1.24.0
+ resolution: "@opentelemetry/semantic-conventions@npm:1.24.0"
+ checksum: ba7c71602f3eddc3f015457cf1183bd24f0300b2636b57cafe2e5196ae233daf05e573e3a7b954818e8f2d9543a44282a0406f327b9c066ae948eea5f4a91d27
+ languageName: node
+ linkType: hard
+
+"@opentelemetry/sql-common@npm:^0.40.0":
+ version: 0.40.1
+ resolution: "@opentelemetry/sql-common@npm:0.40.1"
+ dependencies:
+ "@opentelemetry/core": ^1.1.0
+ peerDependencies:
+ "@opentelemetry/api": ^1.1.0
+ checksum: 23529740531937dee137c9680dbd2f7abf6a7d7340fbd48d309707601fa6255a5e8c2626c8e1c285b49c0b3429f2b3a8e6cbf7f7240820ecfeb52e2ba5ed6740
+ languageName: node
+ linkType: hard
+
"@oriflame/backstage-plugin-score-card@npm:^0.8.0":
version: 0.8.0
resolution: "@oriflame/backstage-plugin-score-card@npm:0.8.0"
@@ -11987,14 +13150,12 @@ __metadata:
linkType: hard
"@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.7":
- version: 0.5.11
- resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.11"
+ version: 0.5.13
+ resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.13"
dependencies:
ansi-html-community: ^0.0.8
- common-path-prefix: ^3.0.0
core-js-pure: ^3.23.3
error-stack-parser: ^2.0.6
- find-up: ^5.0.0
html-entities: ^2.1.0
loader-utils: ^2.0.4
schema-utils: ^3.0.0
@@ -12005,7 +13166,7 @@ __metadata:
sockjs-client: ^1.4.0
type-fest: ">=0.17.0 <5.0.0"
webpack: ">=4.43.0 <6.0.0"
- webpack-dev-server: 3.x || 4.x
+ webpack-dev-server: 3.x || 4.x || 5.x
webpack-hot-middleware: 2.x
webpack-plugin-serve: 0.x || 1.x
peerDependenciesMeta:
@@ -12021,7 +13182,7 @@ __metadata:
optional: true
webpack-plugin-serve:
optional: true
- checksum: a82eced9519f4dcac424acae719f819ab4150bfcf2874ac7daaf25a4f1c409e3d8b9d693fea0c686c24d520a5473756df32da90d8b89739670f8f8084c600bb4
+ checksum: 9f931cf79945f58ee31569b83f4b294ae0849ea8232b6c79e690b46a3d7f2b981aa72718a4bd7517ab82657dddfed2a691c9d9e37295a87dfd0b18b2693d4aa6
languageName: node
linkType: hard
@@ -12240,24 +13401,6 @@ __metadata:
languageName: node
linkType: hard
-"@puppeteer/browsers@npm:2.2.1":
- version: 2.2.1
- resolution: "@puppeteer/browsers@npm:2.2.1"
- dependencies:
- debug: 4.3.4
- extract-zip: 2.0.1
- progress: 2.0.3
- proxy-agent: 6.4.0
- semver: 7.6.0
- tar-fs: 3.0.5
- unbzip2-stream: 1.4.3
- yargs: 17.7.2
- bin:
- browsers: lib/cjs/main-cli.js
- checksum: c2ec8bac9978ae6279d67442a3a81c517db1e172bd4603d1983eb48de12b088d8b565b1817abe21ba6df76be9a68e3fc543d4c7111c964a93f3ac9b14f7c76e5
- languageName: node
- linkType: hard
-
"@radix-ui/primitive@npm:1.0.1":
version: 1.0.1
resolution: "@radix-ui/primitive@npm:1.0.1"
@@ -13292,6 +14435,29 @@ __metadata:
languageName: node
linkType: hard
+"@sideway/address@npm:^4.1.5":
+ version: 4.1.5
+ resolution: "@sideway/address@npm:4.1.5"
+ dependencies:
+ "@hapi/hoek": ^9.0.0
+ checksum: 3e3ea0f00b4765d86509282290368a4a5fd39a7995fdc6de42116ca19a96120858e56c2c995081def06e1c53e1f8bccc7d013f6326602bec9d56b72ee2772b9d
+ languageName: node
+ linkType: hard
+
+"@sideway/formula@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "@sideway/formula@npm:3.0.1"
+ checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a
+ languageName: node
+ linkType: hard
+
+"@sideway/pinpoint@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "@sideway/pinpoint@npm:2.0.0"
+ checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2
+ languageName: node
+ linkType: hard
+
"@sinclair/typebox@npm:^0.27.8":
version: 0.27.8
resolution: "@sinclair/typebox@npm:0.27.8"
@@ -15292,15 +16458,15 @@ __metadata:
languageName: node
linkType: hard
-"@ts-morph/common@npm:~0.22.0":
- version: 0.22.0
- resolution: "@ts-morph/common@npm:0.22.0"
+"@ts-morph/common@npm:~0.23.0":
+ version: 0.23.0
+ resolution: "@ts-morph/common@npm:0.23.0"
dependencies:
fast-glob: ^3.3.2
minimatch: ^9.0.3
mkdirp: ^3.0.1
path-browserify: ^1.0.1
- checksum: e549facfff2a68eeef4e3e2c4183e7216a02b57e62cdfe60ca15d5fdee24770bd3b5b6d1a0388cfce7b4dfaeb0ebe31ffa40585e36b9fb7948aea8081fa73769
+ checksum: 96463742ec1114900901ded8aecc2c9664b20119454a56c896042e6a5e5b153af1d986467362d737ed0130506aeac9655731922dc8c4e851a16f9c1a8a8099b4
languageName: node
linkType: hard
@@ -15332,6 +16498,15 @@ __metadata:
languageName: node
linkType: hard
+"@types/accepts@npm:*":
+ version: 1.3.7
+ resolution: "@types/accepts@npm:1.3.7"
+ dependencies:
+ "@types/node": "*"
+ checksum: 7678cf74976e16093aff6e6f9755826faf069ac1e30179276158ce46ea246348ff22ca6bdd46cef08428881337d9ceefbf00bab08a7731646eb9fc9449d6a1e7
+ languageName: node
+ linkType: hard
+
"@types/ansi-regex@npm:^5.0.0":
version: 5.0.0
resolution: "@types/ansi-regex@npm:5.0.0"
@@ -15364,10 +16539,10 @@ __metadata:
languageName: node
linkType: hard
-"@types/aws-lambda@npm:^8.10.83":
- version: 8.10.92
- resolution: "@types/aws-lambda@npm:8.10.92"
- checksum: 71c44d83a1c88aa6dbc920baedfb2d100b8843a3d210c695ccaafb30dfb75f04398b0e5368100022acbf75c55d456c61774242f20dd70915fc63d85430cbcf8a
+"@types/aws-lambda@npm:8.10.122, @types/aws-lambda@npm:^8.10.83":
+ version: 8.10.122
+ resolution: "@types/aws-lambda@npm:8.10.122"
+ checksum: 5c2e02ae8fc0eea90fa3b1014f401a8567695e65910fb53452e813b9b58761c956fba50ac7da606b97e07d881d264ff513573d279e7116f3c6b9590fdb093f31
languageName: node
linkType: hard
@@ -15456,6 +16631,15 @@ __metadata:
languageName: node
linkType: hard
+"@types/bunyan@npm:1.8.9":
+ version: 1.8.9
+ resolution: "@types/bunyan@npm:1.8.9"
+ dependencies:
+ "@types/node": "*"
+ checksum: 0635ca1906acda4fbce5aed0b9ba16c857e13081724ae5d30aae61083f03f80b299f05e8e573e2804e530ec4b7c2a68ee7f2f522afde664a41122d16e0a39db0
+ languageName: node
+ linkType: hard
+
"@types/cacheable-request@npm:^6.0.1":
version: 6.0.1
resolution: "@types/cacheable-request@npm:6.0.1"
@@ -15546,12 +16730,19 @@ __metadata:
languageName: node
linkType: hard
-"@types/connect@npm:*":
- version: 3.4.33
- resolution: "@types/connect@npm:3.4.33"
+"@types/connect@npm:*, @types/connect@npm:3.4.36":
+ version: 3.4.36
+ resolution: "@types/connect@npm:3.4.36"
dependencies:
"@types/node": "*"
- checksum: 1220403e0cd05c6f51c03b83eed0f4e086f252d50c13279effd38d8bfea5cae82db012b134d31004cb8e4705f83d8ad62dddd71028baa190bf6f31c8d9ac916b
+ checksum: 4dee3d966fb527b98f0cbbdcf6977c9193fc3204ed539b7522fe5e64dfa45f9017bdda4ffb1f760062262fce7701a0ee1c2f6ce2e50af36c74d4e37052303172
+ languageName: node
+ linkType: hard
+
+"@types/content-disposition@npm:*":
+ version: 0.5.8
+ resolution: "@types/content-disposition@npm:0.5.8"
+ checksum: eeea868fb510ae7a32aa2d7de680fba79d59001f3e758a334621e10bc0a6496d3a42bb79243a5e53b9c63cb524522853ccc144fe1ab160c4247d37cdb81146c4
languageName: node
linkType: hard
@@ -15585,6 +16776,18 @@ __metadata:
languageName: node
linkType: hard
+"@types/cookies@npm:*":
+ version: 0.9.0
+ resolution: "@types/cookies@npm:0.9.0"
+ dependencies:
+ "@types/connect": "*"
+ "@types/express": "*"
+ "@types/keygrip": "*"
+ "@types/node": "*"
+ checksum: ce59bfdf3a5d750400ac32aa93157ec7be997dc632660cf0bbfd76df23d71a70bb5f0820558cd26b9a5576f86b6664a2fd23ae211b51202a5b2f9a15995d7331
+ languageName: node
+ linkType: hard
+
"@types/core-js@npm:^2.5.4":
version: 2.5.8
resolution: "@types/core-js@npm:2.5.8"
@@ -15676,9 +16879,9 @@ __metadata:
linkType: hard
"@types/diff@npm:^5.0.0":
- version: 5.2.0
- resolution: "@types/diff@npm:5.2.0"
- checksum: 07e20ba25d15b997758cc248628bb1e6459e7b396c868f176dee1e6a5d1dfcdf1e186fb5bf5e67128d7f55a11e989cff2ec656de089e15ed4a44e654c5c1fda3
+ version: 5.2.1
+ resolution: "@types/diff@npm:5.2.1"
+ checksum: 5983a323177bd691cb2194f5d55b960cd20a9c8fec653b4b038760c5809627cc9ea3578fdf10119ccbefefef193ea925f2817136eb97b17388f66b16c8480a8a
languageName: node
linkType: hard
@@ -15861,6 +17064,47 @@ __metadata:
languageName: node
linkType: hard
+"@types/hapi__catbox@npm:*":
+ version: 10.2.6
+ resolution: "@types/hapi__catbox@npm:10.2.6"
+ checksum: 06cd8f4bced5ee912ec89daa53c10a416ab8d7c25ebf981dc3525a9fcc744afcfafd7353146ab8612a71b8905851e44613579ef89ab0c0cef2def0f27aeac480
+ languageName: node
+ linkType: hard
+
+"@types/hapi__hapi@npm:20.0.13":
+ version: 20.0.13
+ resolution: "@types/hapi__hapi@npm:20.0.13"
+ dependencies:
+ "@hapi/boom": ^9.0.0
+ "@hapi/iron": ^6.0.0
+ "@hapi/podium": ^4.1.3
+ "@types/hapi__catbox": "*"
+ "@types/hapi__mimos": "*"
+ "@types/hapi__shot": "*"
+ "@types/node": "*"
+ joi: ^17.3.0
+ checksum: 02d0f91b3b0900e05b6e8d31ae664e20d9c41238155c56fe8c4ca3e8f3d6bc99a8be117eb9aced2141435c855ce8be9bade575ce97af0d5ba8939268ba40d798
+ languageName: node
+ linkType: hard
+
+"@types/hapi__mimos@npm:*":
+ version: 4.1.4
+ resolution: "@types/hapi__mimos@npm:4.1.4"
+ dependencies:
+ "@types/mime-db": "*"
+ checksum: 8cae226b3d38427d3a380840506be0f226b0494d3e00826c2ff093e38e4f0ec2254d790531110f874b2ed6ac482eceaf5ac628a5e71898c49aea5d29a4875568
+ languageName: node
+ linkType: hard
+
+"@types/hapi__shot@npm:*":
+ version: 4.1.6
+ resolution: "@types/hapi__shot@npm:4.1.6"
+ dependencies:
+ "@types/node": "*"
+ checksum: 12fdb024a69890c0f552e5953c8afb76bf023c5315b8d70aeb9609c382efb63907a60ae5b048675c82fea5df9c3bad52befdef78df5758f6cf3d00b8cfee628d
+ languageName: node
+ linkType: hard
+
"@types/hast@npm:^2.0.0":
version: 2.3.4
resolution: "@types/hast@npm:2.3.4"
@@ -15896,6 +17140,13 @@ __metadata:
languageName: node
linkType: hard
+"@types/http-assert@npm:*":
+ version: 1.5.5
+ resolution: "@types/http-assert@npm:1.5.5"
+ checksum: cd6bb7fd42cc6e2a702cb55370b8b25231954ad74c04bcd185b943a74ded3d4c28099c30f77b26951df2426441baff41718816c60b5af80efe2b8888d900bf93
+ languageName: node
+ linkType: hard
+
"@types/http-cache-semantics@npm:*":
version: 4.0.0
resolution: "@types/http-cache-semantics@npm:4.0.0"
@@ -15945,6 +17196,15 @@ __metadata:
languageName: node
linkType: hard
+"@types/ioredis4@npm:@types/ioredis@^4.28.10":
+ version: 4.28.10
+ resolution: "@types/ioredis@npm:4.28.10"
+ dependencies:
+ "@types/node": "*"
+ checksum: 0f2788cf25f490d3b345db8c5f8b8ce3f6c92cc99abcf744c8f974f02b9b3875233b3d22098614c462a0d6c41c523bd655509418ea88eb6249db6652290ce7cf
+ languageName: node
+ linkType: hard
+
"@types/is-glob@npm:^4.0.2":
version: 4.0.4
resolution: "@types/is-glob@npm:4.0.4"
@@ -15988,11 +17248,11 @@ __metadata:
linkType: hard
"@types/jquery@npm:^3.3.34":
- version: 3.5.29
- resolution: "@types/jquery@npm:3.5.29"
+ version: 3.5.30
+ resolution: "@types/jquery@npm:3.5.30"
dependencies:
"@types/sizzle": "*"
- checksum: 5e959762d6f7050b07b4387b6507a308113384566a77cfc4f8d0f54c2fb0a79f6bc8c057706c6aa4840cde56f32ad0e5814fb53c5f078c5db9e01670a1ecd535
+ checksum: 4594d10fa9b347062883d254a23c9259ae814ef5989ce1985f093dcc7ad4475e324ac3343aef10599c478ea4951726f0e7f79d8ed471ab04de394b7e724d6d13
languageName: node
linkType: hard
@@ -16079,6 +17339,13 @@ __metadata:
languageName: node
linkType: hard
+"@types/keygrip@npm:*":
+ version: 1.0.6
+ resolution: "@types/keygrip@npm:1.0.6"
+ checksum: d157f60bf920492347791d2b26d530d5069ce05796549fbacd4c24d66ffbebbcb0ab67b21e7a1b80a593b9fd4b67dc4843dec04c12bbc2e0fddfb8577a826c41
+ languageName: node
+ linkType: hard
+
"@types/keyv@npm:*, @types/keyv@npm:^3.1.1":
version: 3.1.4
resolution: "@types/keyv@npm:3.1.4"
@@ -16088,6 +17355,56 @@ __metadata:
languageName: node
linkType: hard
+"@types/koa-compose@npm:*":
+ version: 3.2.8
+ resolution: "@types/koa-compose@npm:3.2.8"
+ dependencies:
+ "@types/koa": "*"
+ checksum: 95c32bdee738ac7c10439bbf6342ca3b9f0aafd7e8118739eac7fb0fa703a23cfe4c88f63e13a69a16fbde702e0bcdc62b272aa734325fc8efa7e5625479752e
+ languageName: node
+ linkType: hard
+
+"@types/koa@npm:*":
+ version: 2.15.0
+ resolution: "@types/koa@npm:2.15.0"
+ dependencies:
+ "@types/accepts": "*"
+ "@types/content-disposition": "*"
+ "@types/cookies": "*"
+ "@types/http-assert": "*"
+ "@types/http-errors": "*"
+ "@types/keygrip": "*"
+ "@types/koa-compose": "*"
+ "@types/node": "*"
+ checksum: f429b92f36f96c8f5ceb5333f982400d0db20e177b7d89a7a576ac6f63aff8c964f7ab313e2e281a07bbb93931c66327fb42614cd4984b2ef33dfe7cbd76d741
+ languageName: node
+ linkType: hard
+
+"@types/koa@npm:2.14.0":
+ version: 2.14.0
+ resolution: "@types/koa@npm:2.14.0"
+ dependencies:
+ "@types/accepts": "*"
+ "@types/content-disposition": "*"
+ "@types/cookies": "*"
+ "@types/http-assert": "*"
+ "@types/http-errors": "*"
+ "@types/keygrip": "*"
+ "@types/koa-compose": "*"
+ "@types/node": "*"
+ checksum: 57d809e42350c9ddefa2150306355e40757877468bb027e0bd99f5aeb43cfaf8ba8b14761ea65e419d6fb4c2403a1f3ed0762872a9cf040dbd14357caca56548
+ languageName: node
+ linkType: hard
+
+"@types/koa__router@npm:12.0.3":
+ version: 12.0.3
+ resolution: "@types/koa__router@npm:12.0.3"
+ dependencies:
+ "@types/koa": "*"
+ checksum: e9cdc53e01a6b2340583e94982cec2720c2d4c582240438eca57db7db4596f707578ac3e32cd32ace787331de304b6292cca8c98b0233c77f8749493c4991c96
+ languageName: node
+ linkType: hard
+
"@types/ldapjs@npm:^2.2.5":
version: 2.2.5
resolution: "@types/ldapjs@npm:2.2.5"
@@ -16105,9 +17422,9 @@ __metadata:
linkType: hard
"@types/lodash@npm:^4.14.151":
- version: 4.17.0
- resolution: "@types/lodash@npm:4.17.0"
- checksum: 3f98c0b67a93994cbc3403d4fa9dbaf52b0b6bb7f07a764d73875c2dcd5ef91222621bd5bcf8eee7b417a74d175c2f7191b9f595f8603956fd06f0674c0cba93
+ version: 4.17.1
+ resolution: "@types/lodash@npm:4.17.1"
+ checksum: 01984d5b44c09ef45258f8ac6d0cf926900624064722d51a020ba179e5d4a293da0068fb278d87dc695586afe7ebd3362ec57f5c0e7c4f6c1fab9d04a80e77f5
languageName: node
linkType: hard
@@ -16148,6 +17465,22 @@ __metadata:
languageName: node
linkType: hard
+"@types/memcached@npm:^2.2.6":
+ version: 2.2.10
+ resolution: "@types/memcached@npm:2.2.10"
+ dependencies:
+ "@types/node": "*"
+ checksum: c95e2ed494d5df5e45bab024d24ff2ba45930eb9737cb86564a5ac2a0b3fb5dfdc23d8a65061da38ffe2aabe202a8d333764c0c3dc99d2bb205bff8ba620f2c2
+ languageName: node
+ linkType: hard
+
+"@types/mime-db@npm:*":
+ version: 1.43.5
+ resolution: "@types/mime-db@npm:1.43.5"
+ checksum: 83a994ba20d5e1f5ad7bf9d408dd01631ce80d0bfdedabac5af046810f5d6e94b6d9f34bcbad85c2e02516851c946e034ba4122d4f5168b30a008fc19c2292fe
+ languageName: node
+ linkType: hard
+
"@types/mime-types@npm:^2.1.0":
version: 2.1.4
resolution: "@types/mime-types@npm:2.1.4"
@@ -16224,6 +17557,15 @@ __metadata:
languageName: node
linkType: hard
+"@types/mysql@npm:2.15.22":
+ version: 2.15.22
+ resolution: "@types/mysql@npm:2.15.22"
+ dependencies:
+ "@types/node": "*"
+ checksum: 325120f027b04052b3ed056fef096d186ecc0988d9efe110a52bd3f2233d02e17fb802ea42da7fa1ae1d150b0194cddf56ff71bfb28411bc05361f947b0635af
+ languageName: node
+ linkType: hard
+
"@types/ndjson@npm:^2.0.1":
version: 2.0.4
resolution: "@types/ndjson@npm:2.0.4"
@@ -16300,11 +17642,11 @@ __metadata:
linkType: hard
"@types/nodemailer@npm:^6.4.14":
- version: 6.4.14
- resolution: "@types/nodemailer@npm:6.4.14"
+ version: 6.4.15
+ resolution: "@types/nodemailer@npm:6.4.15"
dependencies:
"@types/node": "*"
- checksum: 5f61f01dd736b17f431d1e8b320322f86460604b45df947fc4bc8999d7c7719405e349f7abba86e4fb100a464a30b52615d00dac03d9cb37562ff04487ebd310
+ checksum: f6f9a2f8a669703ecc3ca6359c12345b16f6b2e5691b93c406b9af7de639c02092ec00133526e6fecd8c60d884890a7cd0f967d8e64bedab46d5c3d8be0882d7
languageName: node
linkType: hard
@@ -16367,13 +17709,13 @@ __metadata:
linkType: hard
"@types/passport-google-oauth20@npm:^2.0.3":
- version: 2.0.14
- resolution: "@types/passport-google-oauth20@npm:2.0.14"
+ version: 2.0.16
+ resolution: "@types/passport-google-oauth20@npm:2.0.16"
dependencies:
"@types/express": "*"
"@types/passport": "*"
"@types/passport-oauth2": "*"
- checksum: 1f013dec6e6b168e7971ae1f7815b5eb015830d2da5bdb0d2fc5e3dbdf9ef7e39e2d1c62495a50d763abda9b59f7c1e35f83945ddfc309ba74cb46695da4a792
+ checksum: 721163b179efd43dba861d8ce36687d58278d3aa30207f5b2e7a05f41814ea0b89edae062d1c2bfa11a4d28e4259cca423c6e53cc30e52402e213b90f5caf705
languageName: node
linkType: hard
@@ -16387,13 +17729,13 @@ __metadata:
linkType: hard
"@types/passport-oauth2@npm:*, @types/passport-oauth2@npm:^1.4.11, @types/passport-oauth2@npm:^1.4.15":
- version: 1.4.15
- resolution: "@types/passport-oauth2@npm:1.4.15"
+ version: 1.4.16
+ resolution: "@types/passport-oauth2@npm:1.4.16"
dependencies:
"@types/express": "*"
"@types/oauth": "*"
"@types/passport": "*"
- checksum: 352c4e2d09a86f8fc0dcf2c917c221f302a35a14e7467e2fa3a1653c0a9a1f842c910a4e52f799856536522e6359c20d1afc319579d9edf4b2ac7ea11b183b52
+ checksum: a590d3fcdf93dbe4498c636de139dc22a723bbf12a7f248f432085a47ec1b76b2e1201336ee26cd65c400d7ce6fb30ae0b151f40067267942c8a5b3c708cc23d
languageName: node
linkType: hard
@@ -16426,14 +17768,34 @@ __metadata:
languageName: node
linkType: hard
-"@types/pg@npm:^8.6.6":
- version: 8.11.5
- resolution: "@types/pg@npm:8.11.5"
+"@types/pg-pool@npm:2.0.4":
+ version: 2.0.4
+ resolution: "@types/pg-pool@npm:2.0.4"
+ dependencies:
+ "@types/pg": "*"
+ checksum: 5ae1c49fe1820ec011f8e2a877198a62f4c9795d2cc340dff4527c26f24ee22dffe99a8ca5cdec6edb54613bded820cc51256fb668e0eb4d22794181b94fad82
+ languageName: node
+ linkType: hard
+
+"@types/pg@npm:*, @types/pg@npm:^8.6.6":
+ version: 8.11.6
+ resolution: "@types/pg@npm:8.11.6"
dependencies:
"@types/node": "*"
pg-protocol: "*"
pg-types: ^4.0.1
- checksum: 7346d3df959a8d279cba581c8ee93ed7e331e516c5d8c6866029b9f70eadecb8400818bdc9994d69dd75ccab5bdb7e5a1fc16897efd2e3033fa1ccecd2d2d31a
+ checksum: 231f7e5bfe8b4d14cca398d24cd55f4f14f582f815b62059e6f3ee74108cf92089fbd946568ebc35fa402f238ed9c8a8c1e10e7084e83e4ca3aff75957243014
+ languageName: node
+ linkType: hard
+
+"@types/pg@npm:8.6.1":
+ version: 8.6.1
+ resolution: "@types/pg@npm:8.6.1"
+ dependencies:
+ "@types/node": "*"
+ pg-protocol: "*"
+ pg-types: ^2.2.0
+ checksum: a44710ff06e70f57685ddb88edbb93d4b46e03fed90619f09853ed3868ab28541c4da03eccf6b0b444a7566a0b3c56028543ced43554d51168ca3f8ae15e194f
languageName: node
linkType: hard
@@ -16481,15 +17843,6 @@ __metadata:
languageName: node
linkType: hard
-"@types/puppeteer@npm:^7.0.0":
- version: 7.0.4
- resolution: "@types/puppeteer@npm:7.0.4"
- dependencies:
- puppeteer: "*"
- checksum: c84a44b054454c13935a9cf0f8983166e238532397af4f321c918d89b43a91f854460e3d0dda122f72c258b444dbcdc04ada950e35adc1938ff3b7831c6fd7a4
- languageName: node
- linkType: hard
-
"@types/qs@npm:*":
version: 6.9.6
resolution: "@types/qs@npm:6.9.6"
@@ -16562,11 +17915,11 @@ __metadata:
linkType: hard
"@types/react-syntax-highlighter@npm:^15.0.0":
- version: 15.5.11
- resolution: "@types/react-syntax-highlighter@npm:15.5.11"
+ version: 15.5.13
+ resolution: "@types/react-syntax-highlighter@npm:15.5.13"
dependencies:
"@types/react": "*"
- checksum: 8363ded0138963407c909f198ddcac58d9c937b118f16a46fb3e97078dd0c6234746f9efa85f6aa660efebe357bab11047c95b57bd9508dd4b09619b1a237087
+ checksum: 55f751c140eb6641b16a5644af3b6fc25223957141085758ae6898948e70eaca33d8276e86e75d5d60939aff63af1d20278aba0d3a25483266f9deee1eb468e3
languageName: node
linkType: hard
@@ -16757,6 +18110,13 @@ __metadata:
languageName: node
linkType: hard
+"@types/shimmer@npm:^1.0.2":
+ version: 1.0.5
+ resolution: "@types/shimmer@npm:1.0.5"
+ checksum: f6b0c950dc9187464c5393faf4f4e2b7b44b16665bb49196da28affecceb4fdcd9749af15cbe50f1a2de39f3a84b7523e73445f117f6b48bdbd61b892568364a
+ languageName: node
+ linkType: hard
+
"@types/sinon@npm:^10.0.10":
version: 10.0.13
resolution: "@types/sinon@npm:10.0.13"
@@ -16878,12 +18238,21 @@ __metadata:
linkType: hard
"@types/tar@npm:^6.1.1":
- version: 6.1.12
- resolution: "@types/tar@npm:6.1.12"
+ version: 6.1.13
+ resolution: "@types/tar@npm:6.1.13"
dependencies:
"@types/node": "*"
minipass: ^4.0.0
- checksum: b1cbae1894cc943e3a86f88613853986f97f552c6bec34ee990a47fe5905871d1552397ff440108233d75d05653be2fbc356e62beb0b93a45b927fb88060b438
+ checksum: bb3910936a6b37f093e38b73a52b0544fd73079685f5ea72e5c049fddc3770e58d80cf6d714425853f0746290221852c1a7ca89ffdb9614f3b2a858a3bf5436a
+ languageName: node
+ linkType: hard
+
+"@types/tedious@npm:^4.0.10":
+ version: 4.0.14
+ resolution: "@types/tedious@npm:4.0.14"
+ dependencies:
+ "@types/node": "*"
+ checksum: 88505dda8b8e57e1da58ce74fb29bc2b4d64d90e9c34dc1d4b4010116b9785e23ce43f1e8016901bd27037e17d9d148e34d4ebd5f57d060212847e0df91cf024
languageName: node
linkType: hard
@@ -17067,7 +18436,7 @@ __metadata:
languageName: node
linkType: hard
-"@types/yauzl@npm:^2.10.0, @types/yauzl@npm:^2.9.1":
+"@types/yauzl@npm:^2.10.0":
version: 2.10.3
resolution: "@types/yauzl@npm:2.10.3"
dependencies:
@@ -17340,13 +18709,13 @@ __metadata:
languageName: node
linkType: hard
-"@useoptic/json-pointer-helpers@npm:0.54.8":
- version: 0.54.8
- resolution: "@useoptic/json-pointer-helpers@npm:0.54.8"
+"@useoptic/json-pointer-helpers@npm:0.54.13":
+ version: 0.54.13
+ resolution: "@useoptic/json-pointer-helpers@npm:0.54.13"
dependencies:
jsonpointer: ^5.0.1
minimatch: 9.0.3
- checksum: 4eddabb6dce3ca8160dcd4904299b6964945c3fe47d39bfeca6c68b9a50b058b901a6fb10ab168295475d651df3349149faa5f27f77293e15b6eee8d4417432e
+ checksum: ad987e9bbec82606bd5995f4ffea7eb708549573e8a94a201ed266e4efc854423804671c3772be714457c417641da69d6689a1e61164bd0cfb8f83a1561facdb
languageName: node
linkType: hard
@@ -17405,10 +18774,10 @@ __metadata:
linkType: hard
"@useoptic/openapi-utilities@npm:^0.54.8":
- version: 0.54.8
- resolution: "@useoptic/openapi-utilities@npm:0.54.8"
+ version: 0.54.13
+ resolution: "@useoptic/openapi-utilities@npm:0.54.13"
dependencies:
- "@useoptic/json-pointer-helpers": 0.54.8
+ "@useoptic/json-pointer-helpers": 0.54.13
ajv: ^8.6.0
ajv-errors: ~3.0.0
ajv-formats: ~2.1.0
@@ -17425,7 +18794,7 @@ __metadata:
ts-invariant: ^0.9.3
url-join: ^4.0.1
yaml-ast-parser: ^0.0.43
- checksum: fa9e9f430c77687591aaf8b43b7b31a7c2f80fe9c140aaa978f1948f84d3e974181c91c3d8ec3e06efca9735c7826290baf4be72063bf733887aa632b40c3c4a
+ checksum: d02eabba96af29632557cdb5532edcc4a629860471fe6cd02990c54ad8014c980d07e3dde8d04ed644a0bd3c2218a93fc50fe9904ee317ef6189b2db41bc7505
languageName: node
linkType: hard
@@ -19641,7 +21010,7 @@ __metadata:
languageName: node
linkType: hard
-"buffer@npm:^5.2.1, buffer@npm:^5.5.0, buffer@npm:^5.7.1":
+"buffer@npm:^5.5.0, buffer@npm:^5.7.1":
version: 5.7.1
resolution: "buffer@npm:5.7.1"
dependencies:
@@ -20131,19 +21500,6 @@ __metadata:
languageName: node
linkType: hard
-"chromium-bidi@npm:0.5.17":
- version: 0.5.17
- resolution: "chromium-bidi@npm:0.5.17"
- dependencies:
- mitt: 3.0.1
- urlpattern-polyfill: 10.0.0
- zod: 3.22.4
- peerDependencies:
- devtools-protocol: "*"
- checksum: 522da996ed5abfb47707583cc24785f9aa05d87bd968dbd520f245cf8972fa3ec102f8d1d72fa07558daa70495d8c6f2bf364d8599eb60b77504e528601d8a30
- languageName: node
- linkType: hard
-
"ci-info@npm:^2.0.0":
version: 2.0.0
resolution: "ci-info@npm:2.0.0"
@@ -20168,10 +21524,10 @@ __metadata:
languageName: node
linkType: hard
-"cjs-module-lexer@npm:^1.0.0":
- version: 1.2.2
- resolution: "cjs-module-lexer@npm:1.2.2"
- checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5
+"cjs-module-lexer@npm:^1.0.0, cjs-module-lexer@npm:^1.2.2":
+ version: 1.3.1
+ resolution: "cjs-module-lexer@npm:1.3.1"
+ checksum: 75f20ac264a397ea5c63f9c2343a51ab878043666468f275e94862f7180ec1d764a400ec0c09085dcf0db3193c74a8b571519abd2bf4be0d2be510d1377c8d4b
languageName: node
linkType: hard
@@ -20440,10 +21796,10 @@ __metadata:
languageName: node
linkType: hard
-"code-block-writer@npm:^12.0.0":
- version: 12.0.0
- resolution: "code-block-writer@npm:12.0.0"
- checksum: 9f6505a4d668c9131c6f3f686359079439e66d5f50c236614d52fcfa53aeb0bc615b2c6c64ef05b5511e3b0433ccfd9f7756ad40eb3b9298af6a7d791ab1981d
+"code-block-writer@npm:^13.0.1":
+ version: 13.0.1
+ resolution: "code-block-writer@npm:13.0.1"
+ checksum: 678b740d1723c7cc3c5addcbc1a91d9a7a3f033510eb8e0639154fcaae456c80630dbd40d16aefdffaf3edb5ffb352d7d46f195f69c8be692c4d7debb1dc7933
languageName: node
linkType: hard
@@ -20708,13 +22064,6 @@ __metadata:
languageName: node
linkType: hard
-"common-path-prefix@npm:^3.0.0":
- version: 3.0.0
- resolution: "common-path-prefix@npm:3.0.0"
- checksum: fdb3c4f54e51e70d417ccd950c07f757582de800c0678ca388aedefefc84982039f346f9fd9a1252d08d2da9e9ef4019f580a1d1d3a10da031e4bb3c924c5818
- languageName: node
- linkType: hard
-
"common-tags@npm:^1.8.0":
version: 1.8.2
resolution: "common-tags@npm:1.8.2"
@@ -21152,23 +22501,6 @@ __metadata:
languageName: node
linkType: hard
-"cosmiconfig@npm:9.0.0":
- version: 9.0.0
- resolution: "cosmiconfig@npm:9.0.0"
- dependencies:
- env-paths: ^2.2.1
- import-fresh: ^3.3.0
- js-yaml: ^4.1.0
- parse-json: ^5.2.0
- peerDependencies:
- typescript: ">=4.9.5"
- peerDependenciesMeta:
- typescript:
- optional: true
- checksum: a30c424b53d442ea0bdd24cb1b3d0d8687c8dda4a17ab6afcdc439f8964438801619cdb66e8e79f63b9caa3e6586b60d8bab9ce203e72df6c5e80179b971fe8f
- languageName: node
- linkType: hard
-
"cosmiconfig@npm:^6.0.0":
version: 6.0.0
resolution: "cosmiconfig@npm:6.0.0"
@@ -22409,13 +23741,6 @@ __metadata:
languageName: node
linkType: hard
-"devtools-protocol@npm:0.0.1262051":
- version: 0.0.1262051
- resolution: "devtools-protocol@npm:0.0.1262051"
- checksum: beaad00059964a661ab056d5e993492742c612c0370c6f08acd91490181c4d4ecf57d316eedb5a37fb6bb59321901d09ce50762f79ea09a50751d86f601b8f8e
- languageName: node
- linkType: hard
-
"dezalgo@npm:^1.0.0, dezalgo@npm:^1.0.4":
version: 1.0.4
resolution: "dezalgo@npm:1.0.4"
@@ -22825,7 +24150,6 @@ __metadata:
"@backstage/errors": "workspace:^"
"@types/fs-extra": ^11.0.0
"@types/node": ^18.17.8
- "@types/puppeteer": ^7.0.0
chalk: ^4.0.0
commander: ^12.0.0
cross-fetch: ^4.0.0
@@ -22908,13 +24232,13 @@ __metadata:
linkType: hard
"ejs@npm:^3.1.6":
- version: 3.1.9
- resolution: "ejs@npm:3.1.9"
+ version: 3.1.10
+ resolution: "ejs@npm:3.1.10"
dependencies:
jake: ^10.8.5
bin:
ejs: bin/cli.js
- checksum: af6f10eb815885ff8a8cfacc42c6b6cf87daf97a4884f87a30e0c3271fedd85d76a3a297d9c33a70e735b97ee632887f85e32854b9cdd3a2d97edf931519a35f
+ checksum: ce90637e9c7538663ae023b8a7a380b2ef7cc4096de70be85abf5a3b9641912dde65353211d05e24d56b1f242d71185c6d00e02cb8860701d571786d92c71f05
languageName: node
linkType: hard
@@ -24143,9 +25467,9 @@ __metadata:
languageName: unknown
linkType: soft
-"example-app@link:../app::locator=example-backend%40workspace%3Apackages%2Fbackend":
+"example-app@link:../app::locator=example-backend-legacy%40workspace%3Apackages%2Fbackend-legacy":
version: 0.0.0-use.local
- resolution: "example-app@link:../app::locator=example-backend%40workspace%3Apackages%2Fbackend"
+ resolution: "example-app@link:../app::locator=example-backend-legacy%40workspace%3Apackages%2Fbackend-legacy"
languageName: node
linkType: soft
@@ -24217,48 +25541,9 @@ __metadata:
languageName: unknown
linkType: soft
-"example-backend-next@workspace:packages/backend-next":
+"example-backend-legacy@workspace:packages/backend-legacy":
version: 0.0.0-use.local
- resolution: "example-backend-next@workspace:packages/backend-next"
- dependencies:
- "@backstage/backend-defaults": "workspace:^"
- "@backstage/backend-plugin-api": "workspace:^"
- "@backstage/backend-tasks": "workspace:^"
- "@backstage/catalog-model": "workspace:^"
- "@backstage/cli": "workspace:^"
- "@backstage/plugin-app-backend": "workspace:^"
- "@backstage/plugin-auth-backend": "workspace:^"
- "@backstage/plugin-auth-backend-module-github-provider": "workspace:^"
- "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^"
- "@backstage/plugin-auth-node": "workspace:^"
- "@backstage/plugin-catalog-backend": "workspace:^"
- "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^"
- "@backstage/plugin-catalog-backend-module-openapi": "workspace:^"
- "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^"
- "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^"
- "@backstage/plugin-devtools-backend": "workspace:^"
- "@backstage/plugin-kubernetes-backend": "workspace:^"
- "@backstage/plugin-notifications-backend": "workspace:^"
- "@backstage/plugin-permission-backend": "workspace:^"
- "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^"
- "@backstage/plugin-permission-common": "workspace:^"
- "@backstage/plugin-permission-node": "workspace:^"
- "@backstage/plugin-proxy-backend": "workspace:^"
- "@backstage/plugin-scaffolder-backend": "workspace:^"
- "@backstage/plugin-scaffolder-backend-module-github": "workspace:^"
- "@backstage/plugin-search-backend": "workspace:^"
- "@backstage/plugin-search-backend-module-catalog": "workspace:^"
- "@backstage/plugin-search-backend-module-explore": "workspace:^"
- "@backstage/plugin-search-backend-module-techdocs": "workspace:^"
- "@backstage/plugin-search-backend-node": "workspace:^"
- "@backstage/plugin-signals-backend": "workspace:^"
- "@backstage/plugin-techdocs-backend": "workspace:^"
- languageName: unknown
- linkType: soft
-
-"example-backend@workspace:packages/backend":
- version: 0.0.0-use.local
- resolution: "example-backend@workspace:packages/backend"
+ resolution: "example-backend-legacy@workspace:packages/backend-legacy"
dependencies:
"@backstage/backend-common": "workspace:^"
"@backstage/backend-tasks": "workspace:^"
@@ -24298,9 +25583,6 @@ __metadata:
"@backstage/plugin-techdocs-backend": "workspace:^"
"@gitbeaker/node": ^35.1.0
"@octokit/rest": ^19.0.3
- "@opentelemetry/api": ^1.4.1
- "@opentelemetry/exporter-prometheus": ^0.50.0
- "@opentelemetry/sdk-metrics": ^1.13.0
"@types/dockerode": ^3.3.0
"@types/express": ^4.17.6
"@types/express-serve-static-core": ^4.17.5
@@ -24321,6 +25603,48 @@ __metadata:
languageName: unknown
linkType: soft
+"example-backend@workspace:packages/backend":
+ version: 0.0.0-use.local
+ resolution: "example-backend@workspace:packages/backend"
+ dependencies:
+ "@backstage/backend-defaults": "workspace:^"
+ "@backstage/backend-plugin-api": "workspace:^"
+ "@backstage/backend-tasks": "workspace:^"
+ "@backstage/catalog-model": "workspace:^"
+ "@backstage/cli": "workspace:^"
+ "@backstage/plugin-app-backend": "workspace:^"
+ "@backstage/plugin-auth-backend": "workspace:^"
+ "@backstage/plugin-auth-backend-module-github-provider": "workspace:^"
+ "@backstage/plugin-auth-backend-module-guest-provider": "workspace:^"
+ "@backstage/plugin-auth-node": "workspace:^"
+ "@backstage/plugin-catalog-backend": "workspace:^"
+ "@backstage/plugin-catalog-backend-module-backstage-openapi": "workspace:^"
+ "@backstage/plugin-catalog-backend-module-openapi": "workspace:^"
+ "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^"
+ "@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^"
+ "@backstage/plugin-devtools-backend": "workspace:^"
+ "@backstage/plugin-kubernetes-backend": "workspace:^"
+ "@backstage/plugin-notifications-backend": "workspace:^"
+ "@backstage/plugin-permission-backend": "workspace:^"
+ "@backstage/plugin-permission-backend-module-allow-all-policy": "workspace:^"
+ "@backstage/plugin-permission-common": "workspace:^"
+ "@backstage/plugin-permission-node": "workspace:^"
+ "@backstage/plugin-proxy-backend": "workspace:^"
+ "@backstage/plugin-scaffolder-backend": "workspace:^"
+ "@backstage/plugin-scaffolder-backend-module-github": "workspace:^"
+ "@backstage/plugin-search-backend": "workspace:^"
+ "@backstage/plugin-search-backend-module-catalog": "workspace:^"
+ "@backstage/plugin-search-backend-module-explore": "workspace:^"
+ "@backstage/plugin-search-backend-module-techdocs": "workspace:^"
+ "@backstage/plugin-search-backend-node": "workspace:^"
+ "@backstage/plugin-signals-backend": "workspace:^"
+ "@backstage/plugin-techdocs-backend": "workspace:^"
+ "@opentelemetry/auto-instrumentations-node": ^0.43.0
+ "@opentelemetry/exporter-prometheus": ^0.50.0
+ "@opentelemetry/sdk-node": ^0.50.0
+ languageName: unknown
+ linkType: soft
+
"execa@npm:8.0.1":
version: 8.0.1
resolution: "execa@npm:8.0.1"
@@ -24575,23 +25899,6 @@ __metadata:
languageName: node
linkType: hard
-"extract-zip@npm:2.0.1":
- version: 2.0.1
- resolution: "extract-zip@npm:2.0.1"
- dependencies:
- "@types/yauzl": ^2.9.1
- debug: ^4.1.1
- get-stream: ^5.1.0
- yauzl: ^2.10.0
- dependenciesMeta:
- "@types/yauzl":
- optional: true
- bin:
- extract-zip: cli.js
- checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635
- languageName: node
- linkType: hard
-
"extsprintf@npm:1.3.0":
version: 1.3.0
resolution: "extsprintf@npm:1.3.0"
@@ -24824,15 +26131,6 @@ __metadata:
languageName: node
linkType: hard
-"fd-slicer@npm:~1.1.0":
- version: 1.1.0
- resolution: "fd-slicer@npm:1.1.0"
- dependencies:
- pend: ~1.2.0
- checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2
- languageName: node
- linkType: hard
-
"fecha@npm:^4.2.0":
version: 4.2.0
resolution: "fecha@npm:4.2.0"
@@ -25545,7 +26843,7 @@ __metadata:
languageName: node
linkType: hard
-"gcp-metadata@npm:^6.1.0":
+"gcp-metadata@npm:^6.0.0, gcp-metadata@npm:^6.1.0":
version: 6.1.0
resolution: "gcp-metadata@npm:6.1.0"
dependencies:
@@ -26699,7 +27997,7 @@ __metadata:
languageName: node
linkType: hard
-"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.1":
+"http-proxy-agent@npm:^7.0.0":
version: 7.0.2
resolution: "http-proxy-agent@npm:7.0.2"
dependencies:
@@ -26797,7 +28095,7 @@ __metadata:
languageName: node
linkType: hard
-"https-proxy-agent@npm:7.0.4, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2, https-proxy-agent@npm:^7.0.3":
+"https-proxy-agent@npm:7.0.4, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2":
version: 7.0.4
resolution: "https-proxy-agent@npm:7.0.4"
dependencies:
@@ -27017,6 +28315,18 @@ __metadata:
languageName: node
linkType: hard
+"import-in-the-middle@npm:1.7.1":
+ version: 1.7.1
+ resolution: "import-in-the-middle@npm:1.7.1"
+ dependencies:
+ acorn: ^8.8.2
+ acorn-import-assertions: ^1.9.0
+ cjs-module-lexer: ^1.2.2
+ module-details-from-path: ^1.0.3
+ checksum: 37cc8c75fb7eac60611bafafea7fc60f794d0931fdabcec516c8a26effe69e914b1f7e8116e98549c6fdd1fe88dcaebfdebf35d7f52c761b48b312e40f3bf323
+ languageName: node
+ linkType: hard
+
"import-lazy@npm:^2.1.0":
version: 2.1.0
resolution: "import-lazy@npm:2.1.0"
@@ -28812,6 +30122,19 @@ __metadata:
languageName: node
linkType: hard
+"joi@npm:^17.3.0":
+ version: 17.13.1
+ resolution: "joi@npm:17.13.1"
+ dependencies:
+ "@hapi/hoek": ^9.3.0
+ "@hapi/topo": ^5.1.0
+ "@sideway/address": ^4.1.5
+ "@sideway/formula": ^3.0.1
+ "@sideway/pinpoint": ^2.0.0
+ checksum: e755140446a0e0fb679c0f512d20dfe1625691de368abe8069507c9bccae5216b5bb56b5a83100a600808b1753ab44fdfdc9933026268417f84b6e0832a9604e
+ languageName: node
+ linkType: hard
+
"join-component@npm:^1.1.0":
version: 1.1.0
resolution: "join-component@npm:1.1.0"
@@ -31776,13 +33099,6 @@ __metadata:
languageName: node
linkType: hard
-"mitt@npm:3.0.1":
- version: 3.0.1
- resolution: "mitt@npm:3.0.1"
- checksum: b55a489ac9c2949ab166b7f060601d3b6d893a852515ae9eca4e11df01c013876df777ea109317622b5c1c60e8aae252558e33c8c94e14124db38f64a39614b1
- languageName: node
- linkType: hard
-
"mixme@npm:^0.5.1":
version: 0.5.4
resolution: "mixme@npm:0.5.4"
@@ -31893,6 +33209,13 @@ __metadata:
languageName: node
linkType: hard
+"module-details-from-path@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "module-details-from-path@npm:1.0.3"
+ checksum: 378a8a26013889aa3086bfb0776b7860c5bb957336253e1ba5d779c2f239a218930b145ca76e52c1dd7c8079d52b2af64b8eec30822f81ffdb0dfa27d6fe6f33
+ languageName: node
+ linkType: hard
+
"moo@npm:^0.5.0":
version: 0.5.2
resolution: "moo@npm:0.5.2"
@@ -33518,7 +34841,7 @@ __metadata:
languageName: node
linkType: hard
-"pac-proxy-agent@npm:^7.0.0, pac-proxy-agent@npm:^7.0.1":
+"pac-proxy-agent@npm:^7.0.0":
version: 7.0.1
resolution: "pac-proxy-agent@npm:7.0.1"
dependencies:
@@ -34161,7 +35484,7 @@ __metadata:
languageName: node
linkType: hard
-"pg-types@npm:^2.1.0":
+"pg-types@npm:^2.1.0, pg-types@npm:^2.2.0":
version: 2.2.0
resolution: "pg-types@npm:2.2.0"
dependencies:
@@ -35161,13 +36484,6 @@ __metadata:
languageName: node
linkType: hard
-"progress@npm:2.0.3":
- version: 2.0.3
- resolution: "progress@npm:2.0.3"
- checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7
- languageName: node
- linkType: hard
-
"prom-client@npm:^15.0.0":
version: 15.1.2
resolution: "prom-client@npm:15.1.2"
@@ -35318,7 +36634,7 @@ __metadata:
languageName: node
linkType: hard
-"protobufjs@npm:^7.0.0, protobufjs@npm:^7.2.4, protobufjs@npm:^7.2.5, protobufjs@npm:^7.2.6":
+"protobufjs@npm:^7.0.0, protobufjs@npm:^7.2.3, protobufjs@npm:^7.2.5, protobufjs@npm:^7.2.6":
version: 7.2.6
resolution: "protobufjs@npm:7.2.6"
dependencies:
@@ -35355,22 +36671,6 @@ __metadata:
languageName: node
linkType: hard
-"proxy-agent@npm:6.4.0":
- version: 6.4.0
- resolution: "proxy-agent@npm:6.4.0"
- dependencies:
- agent-base: ^7.0.2
- debug: ^4.3.4
- http-proxy-agent: ^7.0.1
- https-proxy-agent: ^7.0.3
- lru-cache: ^7.14.1
- pac-proxy-agent: ^7.0.1
- proxy-from-env: ^1.1.0
- socks-proxy-agent: ^8.0.2
- checksum: 4d3794ad5e07486298902f0a7f250d0f869fa0e92d790767ca3f793a81374ce0ab6c605f8ab8e791c4d754da96656b48d1c24cb7094bfd310a15867e4a0841d7
- languageName: node
- linkType: hard
-
"proxy-from-env@npm:^1.1.0":
version: 1.1.0
resolution: "proxy-from-env@npm:1.1.0"
@@ -35453,33 +36753,6 @@ __metadata:
languageName: node
linkType: hard
-"puppeteer-core@npm:22.6.4":
- version: 22.6.4
- resolution: "puppeteer-core@npm:22.6.4"
- dependencies:
- "@puppeteer/browsers": 2.2.1
- chromium-bidi: 0.5.17
- debug: 4.3.4
- devtools-protocol: 0.0.1262051
- ws: 8.16.0
- checksum: 76d4328e7d2a788a7a2dc3a8b19571f8eda842ff990da2fe773c3e5c01236a03856b67d9a2a6ae976f8fa74ab38813e2c7e7c4b15b9715965b2156e9ca1f9a78
- languageName: node
- linkType: hard
-
-"puppeteer@npm:*":
- version: 22.6.4
- resolution: "puppeteer@npm:22.6.4"
- dependencies:
- "@puppeteer/browsers": 2.2.1
- cosmiconfig: 9.0.0
- devtools-protocol: 0.0.1262051
- puppeteer-core: 22.6.4
- bin:
- puppeteer: lib/esm/puppeteer/node/cli.js
- checksum: 7dcbda7fc3b999f3ee7808d1c67da41be0aeabd66b0831711a46a897a2681d117f044263e57aeb7d0a096c420bb9f5871c5c2b21c38e40d323fa675e1de322c9
- languageName: node
- linkType: hard
-
"pure-color@npm:^1.2.0":
version: 1.3.0
resolution: "pure-color@npm:1.3.0"
@@ -36962,6 +38235,17 @@ __metadata:
languageName: node
linkType: hard
+"require-in-the-middle@npm:^7.1.1":
+ version: 7.3.0
+ resolution: "require-in-the-middle@npm:7.3.0"
+ dependencies:
+ debug: ^4.1.1
+ module-details-from-path: ^1.0.3
+ resolve: ^1.22.1
+ checksum: 014ae8aef4a0ed995476d0ba6f7d86afff7114247353894d3b41ef7b0953de03303c30ad127eaac4036eb0c8c862fd247b760e2a6de10ac147712372304e3e73
+ languageName: node
+ linkType: hard
+
"require-main-filename@npm:^2.0.0":
version: 2.0.0
resolution: "require-main-filename@npm:2.0.0"
@@ -37830,7 +39114,16 @@ __metadata:
languageName: node
linkType: hard
-"semver@npm:7.6.0, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.4.0, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0":
+"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1":
+ version: 6.3.1
+ resolution: "semver@npm:6.3.1"
+ bin:
+ semver: bin/semver.js
+ checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2
+ languageName: node
+ linkType: hard
+
+"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.4.0, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0":
version: 7.6.0
resolution: "semver@npm:7.6.0"
dependencies:
@@ -37841,15 +39134,6 @@ __metadata:
languageName: node
linkType: hard
-"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1":
- version: 6.3.1
- resolution: "semver@npm:6.3.1"
- bin:
- semver: bin/semver.js
- checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2
- languageName: node
- linkType: hard
-
"send@npm:0.18.0":
version: 0.18.0
resolution: "send@npm:0.18.0"
@@ -38112,6 +39396,13 @@ __metadata:
languageName: node
linkType: hard
+"shimmer@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "shimmer@npm:1.2.1"
+ checksum: aa0d6252ad1c682a4fdfda69e541be987f7a265ac7b00b1208e5e48cc68dc55f293955346ea4c71a169b7324b82c70f8400b3d3d2d60b2a7519f0a3522423250
+ languageName: node
+ linkType: hard
+
"short-unique-id@npm:^5.0.2":
version: 5.0.3
resolution: "short-unique-id@npm:5.0.3"
@@ -39590,7 +40881,19 @@ __metadata:
languageName: node
linkType: hard
-"tar-fs@npm:3.0.5, tar-fs@npm:^3.0.5":
+"tar-fs@npm:^2.0.0":
+ version: 2.1.1
+ resolution: "tar-fs@npm:2.1.1"
+ dependencies:
+ chownr: ^1.1.1
+ mkdirp-classic: ^0.5.2
+ pump: ^3.0.0
+ tar-stream: ^2.1.4
+ checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d
+ languageName: node
+ linkType: hard
+
+"tar-fs@npm:^3.0.5":
version: 3.0.5
resolution: "tar-fs@npm:3.0.5"
dependencies:
@@ -39607,18 +40910,6 @@ __metadata:
languageName: node
linkType: hard
-"tar-fs@npm:^2.0.0":
- version: 2.1.1
- resolution: "tar-fs@npm:2.1.1"
- dependencies:
- chownr: ^1.1.1
- mkdirp-classic: ^0.5.2
- pump: ^3.0.0
- tar-stream: ^2.1.4
- checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d
- languageName: node
- linkType: hard
-
"tar-fs@npm:~2.0.1":
version: 2.0.1
resolution: "tar-fs@npm:2.0.1"
@@ -39886,7 +41177,7 @@ __metadata:
languageName: node
linkType: hard
-"through@npm:2, through@npm:^2.3.6, through@npm:^2.3.8":
+"through@npm:2, through@npm:^2.3.6":
version: 2.3.8
resolution: "through@npm:2.3.8"
checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd
@@ -40191,10 +41482,10 @@ __metadata:
languageName: node
linkType: hard
-"triple-beam@npm:^1.3.0":
- version: 1.3.0
- resolution: "triple-beam@npm:1.3.0"
- checksum: 7d7b77d8625fb252c126c24984a68de462b538a8fcd1de2abd0a26421629cf3527d48e23b3c2264f08f4a6c3bc40a478a722176f4d7b6a1acc154cb70c359f2b
+"triple-beam@npm:^1.3.0, triple-beam@npm:^1.4.1":
+ version: 1.4.1
+ resolution: "triple-beam@npm:1.4.1"
+ checksum: 2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61
languageName: node
linkType: hard
@@ -40265,13 +41556,13 @@ __metadata:
languageName: node
linkType: hard
-"ts-morph@npm:^21.0.0":
- version: 21.0.1
- resolution: "ts-morph@npm:21.0.1"
+"ts-morph@npm:^22.0.0":
+ version: 22.0.0
+ resolution: "ts-morph@npm:22.0.0"
dependencies:
- "@ts-morph/common": ~0.22.0
- code-block-writer: ^12.0.0
- checksum: f8e6acd4cdb2842af47ccf4e8900dc3f230f20c3b0d28e1e8b58c395b0a16d7b3e03ef56f29da3fdb861c50e22eb52524e0fc4bfca0fde8448f81b8f4f6aa157
+ "@ts-morph/common": ~0.23.0
+ code-block-writer: ^13.0.1
+ checksum: 7bf0ec8cc9ab2a4ce528ec249634db315caa01b5783259484fd91ac0dae2f05b94d9c53ba236939fad2b8ab882e7fce1c82a689ab7c9a4a9dcec5c1160d77264
languageName: node
linkType: hard
@@ -40743,16 +42034,6 @@ __metadata:
languageName: node
linkType: hard
-"unbzip2-stream@npm:1.4.3":
- version: 1.4.3
- resolution: "unbzip2-stream@npm:1.4.3"
- dependencies:
- buffer: ^5.2.1
- through: ^2.3.8
- checksum: 0e67c4a91f4fa0fc7b4045f8b914d3498c2fc2e8c39c359977708ec85ac6d6029840e97f508675fdbdf21fcb8d276ca502043406f3682b70f075e69aae626d1d
- languageName: node
- linkType: hard
-
"undefsafe@npm:^2.0.5":
version: 2.0.5
resolution: "undefsafe@npm:2.0.5"
@@ -41150,13 +42431,6 @@ __metadata:
languageName: node
linkType: hard
-"urlpattern-polyfill@npm:10.0.0":
- version: 10.0.0
- resolution: "urlpattern-polyfill@npm:10.0.0"
- checksum: 61d890f151ea4ecf34a3dcab32c65ad1f3cda857c9d154af198260c6e5b2ad96d024593409baaa6d4428dd1ab206c14799bf37fe011117ac93a6a44913ac5aa4
- languageName: node
- linkType: hard
-
"urlpattern-polyfill@npm:^9.0.0":
version: 9.0.0
resolution: "urlpattern-polyfill@npm:9.0.0"
@@ -42275,9 +43549,9 @@ __metadata:
languageName: node
linkType: hard
-"ws@npm:*, ws@npm:8.16.0, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.16.0, ws@npm:^8.8.0":
- version: 8.16.0
- resolution: "ws@npm:8.16.0"
+"ws@npm:*, ws@npm:^8.11.0, ws@npm:^8.12.0, ws@npm:^8.13.0, ws@npm:^8.14.2, ws@npm:^8.16.0, ws@npm:^8.17.0, ws@npm:^8.8.0":
+ version: 8.17.0
+ resolution: "ws@npm:8.17.0"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ">=5.0.2"
@@ -42286,7 +43560,7 @@ __metadata:
optional: true
utf-8-validate:
optional: true
- checksum: feb3eecd2bae82fa8a8beef800290ce437d8b8063bdc69712725f21aef77c49cb2ff45c6e5e7fce622248f9c7abaee506bae0a9064067ffd6935460c7357321b
+ checksum: 147ef9eab0251364e1d2c55338ad0efb15e6913923ccbfdf20f7a8a6cb8f88432bcd7f4d8f66977135bfad35575644f9983201c1a361019594a4e53977bf6d4e
languageName: node
linkType: hard
@@ -42566,21 +43840,6 @@ __metadata:
languageName: node
linkType: hard
-"yargs@npm:17.7.2, yargs@npm:^17.1.1, yargs@npm:^17.3.1, yargs@npm:^17.7.1, yargs@npm:^17.7.2":
- version: 17.7.2
- resolution: "yargs@npm:17.7.2"
- dependencies:
- cliui: ^8.0.1
- escalade: ^3.1.1
- get-caller-file: ^2.0.5
- require-directory: ^2.1.1
- string-width: ^4.2.3
- y18n: ^5.0.5
- yargs-parser: ^21.1.1
- checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a
- languageName: node
- linkType: hard
-
"yargs@npm:^15.1.0":
version: 15.4.1
resolution: "yargs@npm:15.4.1"
@@ -42615,13 +43874,18 @@ __metadata:
languageName: node
linkType: hard
-"yauzl@npm:^2.10.0":
- version: 2.10.0
- resolution: "yauzl@npm:2.10.0"
+"yargs@npm:^17.1.1, yargs@npm:^17.3.1, yargs@npm:^17.7.1, yargs@npm:^17.7.2":
+ version: 17.7.2
+ resolution: "yargs@npm:17.7.2"
dependencies:
- buffer-crc32: ~0.2.3
- fd-slicer: ~1.1.0
- checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b
+ cliui: ^8.0.1
+ escalade: ^3.1.1
+ get-caller-file: ^2.0.5
+ require-directory: ^2.1.1
+ string-width: ^4.2.3
+ y18n: ^5.0.5
+ yargs-parser: ^21.1.1
+ checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a
languageName: node
linkType: hard
@@ -42796,10 +44060,10 @@ __metadata:
languageName: node
linkType: hard
-"zod@npm:3.22.4, zod@npm:^3.22.4":
- version: 3.22.4
- resolution: "zod@npm:3.22.4"
- checksum: 80bfd7f8039b24fddeb0718a2ec7c02aa9856e4838d6aa4864335a047b6b37a3273b191ef335bf0b2002e5c514ef261ffcda5a589fb084a48c336ffc4cdbab7f
+"zod@npm:^3.22.4":
+ version: 3.23.6
+ resolution: "zod@npm:3.23.6"
+ checksum: f534119e2a54e86bf77e5c6ff630ef4ec50b87dd9d9faf66dc7a663a489d37130b716ebd836cdd9d7fc6e124a1accdc0d53f388243a236c10e632dcc945eaa27
languageName: node
linkType: hard