{selectedComponents.find(c => c === 'button') && (
- } title="Button" />
+ } title="Button" />
)}
{selectedComponents.find(c => c === 'checkbox') && (
- } title="Checkbox" />
+ }
+ title="Checkbox"
+ />
)}
{selectedComponents.find(c => c === 'heading') && (
- } title="Heading" />
+ } title="Heading" />
)}
{selectedComponents.find(c => c === 'text') && (
- } title="Text" />
+ } title="Text" />
)}
{/* {selectedComponents.find(c => c === 'input') && (
} title="Input" />
diff --git a/canon-docs/src/snippets/box.tsx b/canon-docs/src/snippets/box.tsx
deleted file mode 100644
index 2a99ebee7d..0000000000
--- a/canon-docs/src/snippets/box.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-'use client';
-
-import { Box } from '../../../packages/canon';
-
-export const BoxPreview = () => {
- return (
-
- );
-};
diff --git a/canon-docs/src/snippets/button.tsx b/canon-docs/src/snippets/button.tsx
deleted file mode 100644
index aa20b3e46a..0000000000
--- a/canon-docs/src/snippets/button.tsx
+++ /dev/null
@@ -1,102 +0,0 @@
-'use client';
-
-import { Button, Flex, ButtonProps, Text } from '../../../packages/canon';
-
-export const ButtonPreview = () => {
- return (
-
-
-
-
- );
-};
-
-export const ButtonSizes = () => {
- return (
-
-
-
-
- );
-};
-
-export const ButtonWithIcons = () => {
- return (
-
-
-
-
-
- );
-};
-
-export const ButtonFullWidth = () => {
- return (
-
-
-
-
-
- );
-};
-
-export const ButtonDisabled = () => {
- return ;
-};
-
-export const ButtonResponsive = () => {
- return (
-
- );
-};
-
-export const ButtonPlayground = () => {
- const variants: string[] = ['primary', 'secondary', 'tertiary'];
-
- return (
-
- {variants.map(variant => (
-
- {variant}
- {['small', 'medium'].map(size => (
-
-
-
-
-
- ))}
-
- ))}
-
- );
-};
diff --git a/canon-docs/src/snippets/checkbox.tsx b/canon-docs/src/snippets/checkbox.tsx
deleted file mode 100644
index fe2a5b0219..0000000000
--- a/canon-docs/src/snippets/checkbox.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-'use client';
-
-import { Checkbox, Flex, Text } from '../../../packages/canon';
-
-export const CheckboxPreview = () => {
- return ;
-};
-
-export const CheckboxAllVariants = () => {
- return (
-
-
-
-
-
-
- );
-};
-
-export const CheckboxPlayground = () => {
- return (
-
- All variants
-
-
-
-
-
-
-
- );
-};
diff --git a/canon-docs/src/snippets/_snippets.ts b/canon-docs/src/snippets/code-snippets.ts
similarity index 100%
rename from canon-docs/src/snippets/_snippets.ts
rename to canon-docs/src/snippets/code-snippets.ts
diff --git a/canon-docs/src/snippets/container.tsx b/canon-docs/src/snippets/container.tsx
deleted file mode 100644
index 27c0ba9922..0000000000
--- a/canon-docs/src/snippets/container.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-'use client';
-
-import { Box, Container } from '../../../packages/canon';
-
-const DecorativeBox = () => (
-
-);
-
-export const ContainerPreview = () => {
- return (
-
-
-
- );
-};
diff --git a/canon-docs/src/snippets/field.tsx b/canon-docs/src/snippets/field.tsx
deleted file mode 100644
index e801d85641..0000000000
--- a/canon-docs/src/snippets/field.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-'use client';
-
-import { Input, Field } from '../../../packages/canon';
-
-export const FieldPreview = () => {
- return (
-
-
- Name
-
- Visible on your profile
-
-
- );
-};
-
-export const InputPlayground = () => {
- return (
-
-
-
- );
-};
diff --git a/canon-docs/src/snippets/flex.tsx b/canon-docs/src/snippets/flex.tsx
deleted file mode 100644
index 8bfab8878e..0000000000
--- a/canon-docs/src/snippets/flex.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-'use client';
-
-import { Flex } from '../../../packages/canon';
-
-const DecorativeBox = () => {
- return (
-
- );
-};
-
-export const FlexPreview = () => {
- return (
-
-
-
-
-
-
-
- );
-};
diff --git a/canon-docs/src/snippets/grid.tsx b/canon-docs/src/snippets/grid.tsx
deleted file mode 100644
index 87012b7630..0000000000
--- a/canon-docs/src/snippets/grid.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-'use client';
-
-import { Box, Grid } from '../../../packages/canon';
-
-const FakeBox = () => (
-
-);
-
-export const GridPreview = () => {
- return (
-
-
-
-
-
- );
-};
diff --git a/canon-docs/src/snippets/heading.tsx b/canon-docs/src/snippets/heading.tsx
deleted file mode 100644
index 484497e7a7..0000000000
--- a/canon-docs/src/snippets/heading.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-'use client';
-
-import { Heading, Flex, Text } from '../../../packages/canon';
-
-export const HeadingPreview = () => {
- return Look mum, no hands!;
-};
-
-export const HeadingAllVariants = () => {
- return (
-
- Display
- Title 1
- Title 2
- Title 3
- Title 4
-
- );
-};
-
-export const HeadingResponsive = () => {
- return (
-
-
- Responsive heading
-
-
- );
-};
-
-export const HeadingPlayground = () => {
- return (
-
- All variants
- Display
- Title 1
- Title 2
- Title 3
- Title 4
-
- );
-};
diff --git a/canon-docs/src/snippets/icon-button.tsx b/canon-docs/src/snippets/icon-button.tsx
deleted file mode 100644
index 2079041456..0000000000
--- a/canon-docs/src/snippets/icon-button.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-'use client';
-
-import { IconButton, Flex, ButtonProps, Text } from '../../../packages/canon';
-
-export const IconButtonPreview = () => {
- return (
-
-
-
-
- );
-};
-
-export const IconButtonSizes = () => {
- return (
-
-
-
-
- );
-};
-
-export const IconButtonDisabled = () => {
- return ;
-};
-
-export const IconButtonResponsive = () => {
- return (
-
- );
-};
-
-export const IconButtonPlayground = () => {
- const variants: string[] = ['primary', 'secondary'];
-
- return (
-
- {variants.map(variant => (
-
- {variant}
- {['small', 'medium'].map(size => (
-
-
-
- ))}
-
- ))}
-
- );
-};
diff --git a/canon-docs/src/snippets/icon.tsx b/canon-docs/src/snippets/icon.tsx
deleted file mode 100644
index 126dbaf686..0000000000
--- a/canon-docs/src/snippets/icon.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-'use client';
-
-import { Icon } from '../../../packages/canon';
-
-export const IconPreview = () => {
- return ;
-};
diff --git a/canon-docs/src/snippets/inline.tsx b/canon-docs/src/snippets/inline.tsx
deleted file mode 100644
index 43fd56c650..0000000000
--- a/canon-docs/src/snippets/inline.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-'use client';
-
-import { Box, Flex } from '../../../packages/canon';
-
-const fakeBlockList = [
- { width: 45, height: 60 },
- { width: 150, height: 75 },
- { width: 80, height: 50 },
- { width: 120, height: 70 },
- { width: 95, height: 65 },
- { width: 80, height: 32 },
- { width: 130, height: 60 },
- { width: 100, height: 80 },
- { width: 140, height: 45 },
- { width: 85, height: 70 },
- { width: 125, height: 50 },
-];
-
-const FakeBox = ({
- width = 120,
- height = 80,
-}: {
- width?: number;
- height?: number;
-}) => (
-
-);
-
-export const InlinePreview = () => {
- return (
-
- {fakeBlockList.map((block, index) => (
-
- ))}
-
- );
-};
diff --git a/canon-docs/src/snippets/input.tsx b/canon-docs/src/snippets/input.tsx
deleted file mode 100644
index 69d0b62b7f..0000000000
--- a/canon-docs/src/snippets/input.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-'use client';
-
-import { Input, Grid } from '../../../packages/canon';
-
-export const InputPreview = () => {
- return (
-
-
-
- );
-};
-
-export const InputSizes = () => {
- return (
-
-
-
-
- );
-};
-
-export const InputError = () => {
- return (
-
-
-
- );
-};
-
-export const InputPlayground = () => {
- return (
-
-
-
- );
-};
diff --git a/canon-docs/src/snippets/stories-snippets.tsx b/canon-docs/src/snippets/stories-snippets.tsx
new file mode 100644
index 0000000000..76137e9b82
--- /dev/null
+++ b/canon-docs/src/snippets/stories-snippets.tsx
@@ -0,0 +1,127 @@
+'use client';
+
+import { composeStories } from '@storybook/react';
+import * as BoxStories from '../../../packages/canon/src/components/Box/Box.stories';
+import * as ButtonStories from '../../../packages/canon/src/components/Button/Button.stories';
+import * as CheckboxStories from '../../../packages/canon/src/components/Checkbox/Checkbox.stories';
+import * as ContainerStories from '../../../packages/canon/src/components/Container/Container.stories';
+import * as FieldStories from '../../../packages/canon/src/components/Field/Field.stories';
+import * as GridStories from '../../../packages/canon/src/components/Grid/Grid.stories';
+import * as HeadingStories from '../../../packages/canon/src/components/Heading/Heading.stories';
+import * as IconButtonStories from '../../../packages/canon/src/components/IconButton/IconButton.stories';
+import * as IconStories from '../../../packages/canon/src/components/Icon/Icon.stories';
+import * as InputStories from '../../../packages/canon/src/components/Input/Input.stories';
+import * as TextStories from '../../../packages/canon/src/components/Text/Text.stories';
+import * as FlexStories from '../../../packages/canon/src/components/Flex/Flex.stories';
+
+export const BoxSnippet = ({ story }: { story: keyof typeof BoxStories }) => {
+ const stories = composeStories(BoxStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const ButtonSnippet = ({
+ story,
+}: {
+ story: keyof typeof ButtonStories;
+}) => {
+ const stories = composeStories(ButtonStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const CheckboxSnippet = ({
+ story,
+}: {
+ story: keyof typeof CheckboxStories;
+}) => {
+ const stories = composeStories(CheckboxStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const ContainerSnippet = ({
+ story,
+}: {
+ story: keyof typeof ContainerStories;
+}) => {
+ const stories = composeStories(ContainerStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const FlexSnippet = ({ story }: { story: keyof typeof FlexStories }) => {
+ const stories = composeStories(FlexStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const FieldSnippet = ({
+ story,
+}: {
+ story: keyof typeof FieldStories;
+}) => {
+ const stories = composeStories(FieldStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const GridSnippet = ({ story }: { story: keyof typeof GridStories }) => {
+ const stories = composeStories(GridStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const HeadingSnippet = ({
+ story,
+}: {
+ story: keyof typeof HeadingStories;
+}) => {
+ const stories = composeStories(HeadingStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const IconButtonSnippet = ({
+ story,
+}: {
+ story: keyof typeof IconButtonStories;
+}) => {
+ const stories = composeStories(IconButtonStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const IconSnippet = ({ story }: { story: keyof typeof IconStories }) => {
+ const stories = composeStories(IconStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const InputSnippet = ({
+ story,
+}: {
+ story: keyof typeof InputStories;
+}) => {
+ const stories = composeStories(InputStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
+
+export const TextSnippet = ({ story }: { story: keyof typeof TextStories }) => {
+ const stories = composeStories(TextStories);
+ const StoryComponent = stories[story as keyof typeof stories];
+
+ return StoryComponent ? : null;
+};
diff --git a/canon-docs/src/snippets/text.tsx b/canon-docs/src/snippets/text.tsx
deleted file mode 100644
index 4d39cbf6dd..0000000000
--- a/canon-docs/src/snippets/text.tsx
+++ /dev/null
@@ -1,94 +0,0 @@
-'use client';
-
-import { Flex, Text } from '../../../packages/canon';
-
-export const TextPreview = () => {
- return (
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is in
- the painting?
-
- );
-};
-
-export const TextAllVariants = () => {
- return (
-
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
-
- );
-};
-
-export const TextAllWeights = () => {
- return (
-
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
-
- );
-};
-
-export const TextResponsive = () => {
- return (
- Responsive text
- );
-};
-
-export const TextPlayground = () => {
- return (
-
- Subtitle
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
- Body
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
- Caption
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
- Label
-
- A man looks at a painting in a museum and says, “Brothers and sisters I
- have none, but that man's father is my father's son.” Who is
- in the painting?
-
-
- );
-};
diff --git a/canon-docs/yarn.lock b/canon-docs/yarn.lock
index 2be457741c..8a0dd8d2f0 100644
--- a/canon-docs/yarn.lock
+++ b/canon-docs/yarn.lock
@@ -6,11 +6,11 @@ __metadata:
cacheKey: 8
"@babel/runtime@npm:^7.18.6":
- version: 7.26.0
- resolution: "@babel/runtime@npm:7.26.0"
+ version: 7.26.10
+ resolution: "@babel/runtime@npm:7.26.10"
dependencies:
regenerator-runtime: ^0.14.0
- checksum: c8e2c0504ab271b3467a261a8f119bf2603eb857a0d71e37791f4e3fae00f681365073cc79f141ddaa90c6077c60ba56448004ad5429d07ac73532be9f7cf28a
+ checksum: 22d2e0abb86e90de489ab16bb578db6fe2b63a88696db431198b24963749820c723f1982298cdbbea187f7b2b80fb4d98a514faf114ddb2fdc14a4b96277b955
languageName: node
linkType: hard
@@ -501,10 +501,10 @@ __metadata:
languageName: node
linkType: hard
-"@next/env@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/env@npm:14.2.23"
- checksum: dad74ff7de68992a0753f728a5b926ed6eb0af8a62deece6bbb32ba254b1f7d870e256b61db8d4c40fa811695cfc5e69ba964339f3cb8b40237cf9c28dfe747f
+"@next/env@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/env@npm:14.2.25"
+ checksum: c937d4e8b62c7ae9c74bd607888e791b78445e93d523d22d0838e816c3fbeb7b1b62766d110ef235229e4c4ca8587f493e6ec761eb0a2c774dabaee2b58f581b
languageName: node
linkType: hard
@@ -534,65 +534,65 @@ __metadata:
languageName: node
linkType: hard
-"@next/swc-darwin-arm64@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-darwin-arm64@npm:14.2.23"
+"@next/swc-darwin-arm64@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-darwin-arm64@npm:14.2.25"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@next/swc-darwin-x64@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-darwin-x64@npm:14.2.23"
+"@next/swc-darwin-x64@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-darwin-x64@npm:14.2.25"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@next/swc-linux-arm64-gnu@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-linux-arm64-gnu@npm:14.2.23"
+"@next/swc-linux-arm64-gnu@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-linux-arm64-gnu@npm:14.2.25"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@next/swc-linux-arm64-musl@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-linux-arm64-musl@npm:14.2.23"
+"@next/swc-linux-arm64-musl@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-linux-arm64-musl@npm:14.2.25"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@next/swc-linux-x64-gnu@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-linux-x64-gnu@npm:14.2.23"
+"@next/swc-linux-x64-gnu@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-linux-x64-gnu@npm:14.2.25"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@next/swc-linux-x64-musl@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-linux-x64-musl@npm:14.2.23"
+"@next/swc-linux-x64-musl@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-linux-x64-musl@npm:14.2.25"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@next/swc-win32-arm64-msvc@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-win32-arm64-msvc@npm:14.2.23"
+"@next/swc-win32-arm64-msvc@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-win32-arm64-msvc@npm:14.2.25"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@next/swc-win32-ia32-msvc@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-win32-ia32-msvc@npm:14.2.23"
+"@next/swc-win32-ia32-msvc@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-win32-ia32-msvc@npm:14.2.25"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@next/swc-win32-x64-msvc@npm:14.2.23":
- version: 14.2.23
- resolution: "@next/swc-win32-x64-msvc@npm:14.2.23"
+"@next/swc-win32-x64-msvc@npm:14.2.25":
+ version: 14.2.25
+ resolution: "@next/swc-win32-x64-msvc@npm:14.2.25"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
@@ -722,20 +722,20 @@ __metadata:
languageName: node
linkType: hard
-"@storybook/components@npm:8.6.7":
- version: 8.6.7
- resolution: "@storybook/components@npm:8.6.7"
+"@storybook/components@npm:8.6.8":
+ version: 8.6.8
+ resolution: "@storybook/components@npm:8.6.8"
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
- checksum: cb20f8baa76deef1af1739d6c1b1a9f57eb22d158fa046d9919a91840e7a00f1b48e96b7ffe7994365b60808f864c963a3476ee98b4c8b63968a3a877068da3a
+ checksum: fb69c6d7804f91fffd3fc7d42ba5b144c7b808af6e6b764c14cdef11263897e551e5cc8a0fa379b9ed73f5c0438ed32d355c7ed63801046e1cb078c479d4cecf
languageName: node
linkType: hard
-"@storybook/core@npm:8.6.7":
- version: 8.6.7
- resolution: "@storybook/core@npm:8.6.7"
+"@storybook/core@npm:8.6.8":
+ version: 8.6.8
+ resolution: "@storybook/core@npm:8.6.8"
dependencies:
- "@storybook/theming": 8.6.7
+ "@storybook/theming": 8.6.8
better-opn: ^3.0.2
browser-assert: ^1.2.1
esbuild: ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0
@@ -751,7 +751,7 @@ __metadata:
peerDependenciesMeta:
prettier:
optional: true
- checksum: b150b7472766fccbbc1dec74cba3c16e009a9f24c13f01198923f553d12e2a2070ee2a35f5514f9af350b79e34577946ea65a4a495fd1fa18a27655f897c013a
+ checksum: d67dea27c021b51f17a0d5807b72a29ea174bb8c945fb41092fbf3698002810da0a510aa7e0e23e1682634362f9b52590ba1a09ef6dd40a2ad5653988b0b0e14
languageName: node
linkType: hard
@@ -762,66 +762,66 @@ __metadata:
languageName: node
linkType: hard
-"@storybook/manager-api@npm:8.6.7":
- version: 8.6.7
- resolution: "@storybook/manager-api@npm:8.6.7"
+"@storybook/manager-api@npm:8.6.8":
+ version: 8.6.8
+ resolution: "@storybook/manager-api@npm:8.6.8"
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
- checksum: 6bb0860c3795945189832613da5866e5159b2adb376478a2b596c113928c64f5962efc325f927a6bcb7a48d7257f42cf6489b0c44397876129626ac68c44aa28
+ checksum: ee575781572898fc2fa734750ccb4bad09fc021bd0878ca9a05d9668cb336610d53e8110f4ff3c2c180573a64e9caba8f50f59d0bd3f0398a5c98e2eafdd91ae
languageName: node
linkType: hard
-"@storybook/preview-api@npm:8.6.7":
- version: 8.6.7
- resolution: "@storybook/preview-api@npm:8.6.7"
+"@storybook/preview-api@npm:8.6.8":
+ version: 8.6.8
+ resolution: "@storybook/preview-api@npm:8.6.8"
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
- checksum: 0d24d62444b7b153bde89d3949ab6539a163e15bc80c5bfcc73b7d49bbb34fb02eb74a99434793b8a6446aeec491e07f006c0f4e404f98486c6d1d614d01defa
+ checksum: ac923a342d09c9e51f67734acaea19a41dc87cfc6cb22aea262591396d41cd4b69896417b618c55f17a9d64660b659813475c30d338c9bb6aa45391cfe8328f0
languageName: node
linkType: hard
-"@storybook/react-dom-shim@npm:8.6.7":
- version: 8.6.7
- resolution: "@storybook/react-dom-shim@npm:8.6.7"
+"@storybook/react-dom-shim@npm:8.6.8":
+ version: 8.6.8
+ resolution: "@storybook/react-dom-shim@npm:8.6.8"
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^8.6.7
- checksum: 51c20259ac4485d9a996266341a4d9898c949049e2a9af9a08bec58c2ace3a40be1a534005c52fc2db2c81bb010dbd36030bb70581b36c05cf4b34d58f140d3a
+ storybook: ^8.6.8
+ checksum: d48ba28fefe0bbe0bde02de6a99629d84ba9436fb539ffc6d779173f7b8f6ec466e26018e943d95fa079d73ace2d96d5911def0221754262782e8a5e8b20882d
languageName: node
linkType: hard
-"@storybook/react@npm:^8.4.7":
- version: 8.6.7
- resolution: "@storybook/react@npm:8.6.7"
+"@storybook/react@npm:^8.6.8":
+ version: 8.6.8
+ resolution: "@storybook/react@npm:8.6.8"
dependencies:
- "@storybook/components": 8.6.7
+ "@storybook/components": 8.6.8
"@storybook/global": ^5.0.0
- "@storybook/manager-api": 8.6.7
- "@storybook/preview-api": 8.6.7
- "@storybook/react-dom-shim": 8.6.7
- "@storybook/theming": 8.6.7
+ "@storybook/manager-api": 8.6.8
+ "@storybook/preview-api": 8.6.8
+ "@storybook/react-dom-shim": 8.6.8
+ "@storybook/theming": 8.6.8
peerDependencies:
- "@storybook/test": 8.6.7
+ "@storybook/test": 8.6.8
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^8.6.7
+ storybook: ^8.6.8
typescript: ">= 4.2.x"
peerDependenciesMeta:
"@storybook/test":
optional: true
typescript:
optional: true
- checksum: c98438ddfd764300e1a805623fab976f9ef94a2d939984d6caf98ce92ed29d8a7307389b98e2df2d1302b302dc549c7c95050464731d9c588347cd154c360834
+ checksum: ebbfb2bed68d4ca8c8777769e5b752b1becf9cc1c3fd6f051df9a8eb012d209526b9e188812f3bf8ecf337a331c5049afa2236d2b073fbcafafd35e79cc3ed78
languageName: node
linkType: hard
-"@storybook/theming@npm:8.6.7":
- version: 8.6.7
- resolution: "@storybook/theming@npm:8.6.7"
+"@storybook/theming@npm:8.6.8":
+ version: 8.6.8
+ resolution: "@storybook/theming@npm:8.6.8"
peerDependencies:
storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
- checksum: 747a2377df65d5f0962dc8606d06247ad89fb7ecabab0bd9611055d599b5bd0fa15769e4c76e948ae34ae232ba756bf6795ccb3467b1adf35ff961db7350f4de
+ checksum: 1be0dea23178af562133f1047165e170f7e90bec4c3cedbdcb59df22685f314273a06a4677835ab84e6dbc682b803590adad6963217971c8136b076ce69800aa
languageName: node
linkType: hard
@@ -1436,13 +1436,13 @@ __metadata:
languageName: node
linkType: hard
-"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1":
- version: 1.0.1
- resolution: "call-bind-apply-helpers@npm:1.0.1"
+"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "call-bind-apply-helpers@npm:1.0.2"
dependencies:
es-errors: ^1.3.0
function-bind: ^1.1.2
- checksum: 3c55343261bb387c58a4762d15ad9d42053659a62681ec5eb50690c6b52a4a666302a01d557133ce6533e8bd04530ee3b209f23dd06c9577a1925556f8fcccdf
+ checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b
languageName: node
linkType: hard
@@ -1458,13 +1458,13 @@ __metadata:
languageName: node
linkType: hard
-"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3":
- version: 1.0.3
- resolution: "call-bound@npm:1.0.3"
+"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "call-bound@npm:1.0.4"
dependencies:
- call-bind-apply-helpers: ^1.0.1
- get-intrinsic: ^1.2.6
- checksum: a93bbe0f2d0a2d6c144a4349ccd0593d5d0d5d9309b69101710644af8964286420062f2cc3114dca120b9bc8cc07507952d4b1b3ea7672e0d7f6f1675efedb32
+ call-bind-apply-helpers: ^1.0.2
+ get-intrinsic: ^1.3.0
+ checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2
languageName: node
linkType: hard
@@ -1491,7 +1491,7 @@ __metadata:
"@mdx-js/loader": ^3.1.0
"@mdx-js/react": ^3.1.0
"@next/mdx": ^15.1.4
- "@storybook/react": ^8.4.7
+ "@storybook/react": ^8.6.8
"@types/mdx": ^2.0.13
"@types/node": ^20
"@types/react": ^18.0.0
@@ -1502,12 +1502,12 @@ __metadata:
eslint-config-next: 14.2.23
lightningcss: ^1.28.2
motion: ^12.4.1
- next: 14.2.23
+ next: 14.2.25
react: ^18.0.2
react-dom: ^18.0.2
react-frame-component: ^5.2.7
shiki: ^1.26.1
- storybook: ^8.4.7
+ storybook: ^8.6.8
typescript: ^5
languageName: unknown
linkType: soft
@@ -1934,12 +1934,12 @@ __metadata:
languageName: node
linkType: hard
-"es-object-atoms@npm:^1.0.0":
- version: 1.0.0
- resolution: "es-object-atoms@npm:1.0.0"
+"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "es-object-atoms@npm:1.1.1"
dependencies:
es-errors: ^1.3.0
- checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c
+ checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97
languageName: node
linkType: hard
@@ -2555,12 +2555,12 @@ __metadata:
languageName: node
linkType: hard
-"for-each@npm:^0.3.3":
- version: 0.3.3
- resolution: "for-each@npm:0.3.3"
+"for-each@npm:^0.3.3, for-each@npm:^0.3.5":
+ version: 0.3.5
+ resolution: "for-each@npm:0.3.5"
dependencies:
- is-callable: ^1.1.3
- checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28
+ is-callable: ^1.2.7
+ checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c
languageName: node
linkType: hard
@@ -2631,21 +2631,21 @@ __metadata:
languageName: node
linkType: hard
-"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7":
- version: 1.2.7
- resolution: "get-intrinsic@npm:1.2.7"
+"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "get-intrinsic@npm:1.3.0"
dependencies:
- call-bind-apply-helpers: ^1.0.1
+ call-bind-apply-helpers: ^1.0.2
es-define-property: ^1.0.1
es-errors: ^1.3.0
- es-object-atoms: ^1.0.0
+ es-object-atoms: ^1.1.1
function-bind: ^1.1.2
- get-proto: ^1.0.0
+ get-proto: ^1.0.1
gopd: ^1.2.0
has-symbols: ^1.1.0
hasown: ^2.0.2
math-intrinsics: ^1.1.0
- checksum: a1597b3b432074f805b6a0ba1182130dd6517c0ea0c4eecc4b8834c803913e1ea62dfc412865be795b3dacb1555a21775b70cf9af7a18b1454ff3414e5442d4a
+ checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d
languageName: node
linkType: hard
@@ -3042,7 +3042,7 @@ __metadata:
languageName: node
linkType: hard
-"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7":
+"is-callable@npm:^1.2.7":
version: 1.2.7
resolution: "is-callable@npm:1.2.7"
checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac
@@ -4176,20 +4176,20 @@ __metadata:
languageName: node
linkType: hard
-"next@npm:14.2.23":
- version: 14.2.23
- resolution: "next@npm:14.2.23"
+"next@npm:14.2.25":
+ version: 14.2.25
+ resolution: "next@npm:14.2.25"
dependencies:
- "@next/env": 14.2.23
- "@next/swc-darwin-arm64": 14.2.23
- "@next/swc-darwin-x64": 14.2.23
- "@next/swc-linux-arm64-gnu": 14.2.23
- "@next/swc-linux-arm64-musl": 14.2.23
- "@next/swc-linux-x64-gnu": 14.2.23
- "@next/swc-linux-x64-musl": 14.2.23
- "@next/swc-win32-arm64-msvc": 14.2.23
- "@next/swc-win32-ia32-msvc": 14.2.23
- "@next/swc-win32-x64-msvc": 14.2.23
+ "@next/env": 14.2.25
+ "@next/swc-darwin-arm64": 14.2.25
+ "@next/swc-darwin-x64": 14.2.25
+ "@next/swc-linux-arm64-gnu": 14.2.25
+ "@next/swc-linux-arm64-musl": 14.2.25
+ "@next/swc-linux-x64-gnu": 14.2.25
+ "@next/swc-linux-x64-musl": 14.2.25
+ "@next/swc-win32-arm64-msvc": 14.2.25
+ "@next/swc-win32-ia32-msvc": 14.2.25
+ "@next/swc-win32-x64-msvc": 14.2.25
"@swc/helpers": 0.5.5
busboy: 1.6.0
caniuse-lite: ^1.0.30001579
@@ -4230,7 +4230,7 @@ __metadata:
optional: true
bin:
next: dist/bin/next
- checksum: 4f9f744439fb860ba7c64ae1c61bc361bdd36e41d56760c52eabb404f4143c854b78ba9a79b7aefc322d93edbbd66d966cbdaf86772a88a8bf2e6b289987f14f
+ checksum: ca47d0f1d41351adaf75a37c8e8ce39dd76ebc62b054266ef84b5fc1ea41241ad5f16ab7a1ca47b6613b2c3e4c6f48b179f8cd3b0f087912ec7164c4e72981f0
languageName: node
linkType: hard
@@ -5051,11 +5051,11 @@ __metadata:
languageName: node
linkType: hard
-"storybook@npm:^8.4.7":
- version: 8.6.7
- resolution: "storybook@npm:8.6.7"
+"storybook@npm:^8.6.8":
+ version: 8.6.8
+ resolution: "storybook@npm:8.6.8"
dependencies:
- "@storybook/core": 8.6.7
+ "@storybook/core": 8.6.8
peerDependencies:
prettier: ^2 || ^3
peerDependenciesMeta:
@@ -5065,7 +5065,7 @@ __metadata:
getstorybook: ./bin/index.cjs
sb: ./bin/index.cjs
storybook: ./bin/index.cjs
- checksum: fe21ce4d9cd17069a5b409ed518603f97ec6ec421b7f41cff3e43b409820fcbc2c8dbcb3aed99dd7d0a99a0c6138c7576ddf72f78186b6f86085d503b3c8b32f
+ checksum: 93b92e53c00ff29b4864932c26c52dd4a45e76b3d46811a2bcdc0271ef37c96e2f8d1833982569ab6a6348d6e84d8348aecf74ee72164744459de4c78d0f6759
languageName: node
linkType: hard
@@ -5616,16 +5616,17 @@ __metadata:
linkType: hard
"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2":
- version: 1.1.18
- resolution: "which-typed-array@npm:1.1.18"
+ version: 1.1.19
+ resolution: "which-typed-array@npm:1.1.19"
dependencies:
available-typed-arrays: ^1.0.7
call-bind: ^1.0.8
- call-bound: ^1.0.3
- for-each: ^0.3.3
+ call-bound: ^1.0.4
+ for-each: ^0.3.5
+ get-proto: ^1.0.1
gopd: ^1.2.0
has-tostringtag: ^1.0.2
- checksum: d2feea7f51af66b3a240397aa41c796585033e1069f18e5b6d4cd3878538a1e7780596fd3ea9bf347c43d9e98e13be09b37d9ea3887cef29b11bc291fd47bb52
+ checksum: 162d2a07f68ea323f88ed9419861487ce5d02cb876f2cf9dd1e428d04a63133f93a54f89308f337b27cabd312ee3d027cae4a79002b2f0a85b79b9ef4c190670
languageName: node
linkType: hard
@@ -5677,8 +5678,8 @@ __metadata:
linkType: hard
"ws@npm:^8.2.3":
- version: 8.18.0
- resolution: "ws@npm:8.18.0"
+ version: 8.18.1
+ resolution: "ws@npm:8.18.1"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ">=5.0.2"
@@ -5687,7 +5688,7 @@ __metadata:
optional: true
utf-8-validate:
optional: true
- checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975
+ checksum: 4658357185d891bc45cc2d42a84f9e192d047e8476fb5cba25b604f7d75ca87ca0dd54cd0b2cc49aeee57c79045a741cb7d0b14501953ac60c790cd105c42f23
languageName: node
linkType: hard
diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md
index 343128bfbf..64468f7f41 100644
--- a/docs/features/software-catalog/external-integrations.md
+++ b/docs/features/software-catalog/external-integrations.md
@@ -1157,13 +1157,21 @@ export class MyIncrementalEntityProvider
The last step is to implement the actual `next` method that will accept the cursor, call the API, process the result and return the result.
```ts
+import {
+ ANNOTATION_LOCATION,
+ ANNOTATION_ORIGIN_LOCATION,
+} from '@backstage/catalog-model';
+import { IncrementalEntityProvider } from '@backstage/plugin-catalog-backend-module-incremental-ingestion';
+
export class MyIncrementalEntityProvider
implements IncrementalEntityProvider
{
private readonly token: string;
+ private readonly mySource: string;
- constructor(token: string) {
+ constructor(token: string, mySource: string) {
this.token = token;
+ this.mySource = mySource;
}
getProviderName() {
@@ -1181,6 +1189,7 @@ export class MyIncrementalEntityProvider
cursor: Cursor = { page: 1 },
): Promise> {
const { apiClient } = context;
+ const location = `${this.getProviderName()}:${this.mySource}`;
// call your API with the current cursor
const data = await apiClient.getServices(cursor);
@@ -1200,8 +1209,8 @@ export class MyIncrementalEntityProvider
name: item.name,
annotations: {
// You need to define these, otherwise they'll fail validation
- [ANNOTATION_LOCATION]: this.getProviderName(),
- [ANNOTATION_ORIGIN_LOCATION]: this.getProviderName(),
+ [ANNOTATION_LOCATION]: location,
+ [ANNOTATION_ORIGIN_LOCATION]: location,
},
},
spec: {
diff --git a/docs/integrations/ldap/org.md b/docs/integrations/ldap/org.md
index 4dd7b7d1d8..9913cf0729 100644
--- a/docs/integrations/ldap/org.md
+++ b/docs/integrations/ldap/org.md
@@ -86,13 +86,14 @@ catalog:
These config blocks have a lot of options in them, so we will describe each "root" key within the block separately.
-> NOTE:
->
-> If you want to import users and groups from different LDAP servers, you can define multiple providers with different names.
-> If they should come from the same server, you can define multiple users and groups blocks within the same provider using an array of users / groups.
-> Entries coming from the same block will be able to detect group memberships based on the `memberOf` attribute.
->
-> If you want only to import users or groups, you can omit the groups or users block.
+:::note Note
+
+If you want to import users and groups from different LDAP servers, you can define multiple providers with different names.
+If they should come from the same server, you can define multiple users and groups blocks within the same provider using an array of users / groups.
+Entries coming from the same block will be able to detect group memberships based on the `memberOf` attribute.
+If you want only to import users or groups, you can omit the groups or users block.
+
+:::
### target
diff --git a/docs/notifications/index.md b/docs/notifications/index.md
index 1156db45a7..2af8879ac0 100644
--- a/docs/notifications/index.md
+++ b/docs/notifications/index.md
@@ -8,7 +8,7 @@ The Backstage Notifications System provides a way for plugins and external servi
These notifications are displayed in the dedicated page of the Backstage frontend UI or by frontend plugins per specific scenarios.
Additionally, notifications can be sent to external channels (like email) via "processors" implemented within plugins.
-Notifications can be optionally integrated with the signals (a push mechanism) to ensure users receive them immediately.
+Notifications can be optionally extended with the signals plugin, which provides a push mechanism to ensure users receive notifications immediately.
### Upgrade to the latest version of Backstage
@@ -27,8 +27,8 @@ There are two basic types of notifications:
Example of use-cases:
- System-wide announcements or alerts
-- Notifications for component owners: e.g., build failures, successful deployments, new vulnerabilities
-- Notifications for individuals: e.g., updates you have subscribed to, new required training courses
+- Notifications for component owners, e.g. build failures, successful deployments, new vulnerabilities
+- Notifications for individuals, e.g. updates you have subscribed to, new required training courses
- Notifications pertaining to a particular entity in the catalog: A notification might apply to an entity and the owning team.
## Installation
@@ -87,17 +87,17 @@ import { NotificationsPage } from '@backstage/plugin-notifications';
### Optional: Add Signals
-The use of signals is optional but improves user experience.
+The use of signals is optional but improves the user experience.
#### Optional: Add Signals Backend
-Add Signals to your backend by first adding the backend package:
+Add signals to your backend by first adding the backend package:
```bash title="From your Backstage root directory"
yarn --cwd packages/backend add @backstage/plugin-signals-backend
```
-The add the signals to your backend:
+Then add the signals plugin to your backend:
```ts title="packages/backend/src/index.ts"
const backend = createBackend();
@@ -156,19 +156,19 @@ add the `UserNotificationSettingsCard` to your frontend.
You can customize the origin names shown in the UI by passing an object where the keys are the origins and the values are the names you want to show in the UI.
-Each notification processor will receive its own column in the settings page, where the user can enable or disable notifications from that processor.
+Each notification processor will receive its own row in the settings page, where the user can enable or disable notifications from that processor.
## Additional info
-An example of a backend plugin sending notifications can be found in https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-notifications.
+An example of a backend plugin sending notifications can be found in the [`@backstage/plugin-scaffolder-backend-module-notifications` package](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-notifications).
-Sources of the notifications and signal plugins:
+Sources of the notifications and signals plugins:
-- https://github.com/backstage/backstage/blob/master/plugins/notifications
-- https://github.com/backstage/backstage/blob/master/plugins/notifications-backend
-- https://github.com/backstage/backstage/blob/master/plugins/notifications-common
-- https://github.com/backstage/backstage/blob/master/plugins/notifications-node
-- https://github.com/backstage/backstage/blob/master/plugins/signals-backend
-- https://github.com/backstage/backstage/blob/master/plugins/signals
-- https://github.com/backstage/backstage/blob/master/plugins/signals-node
-- https://github.com/backstage/backstage/blob/master/plugins/signals-react
+- [notifications](https://github.com/backstage/backstage/blob/master/plugins/notifications)
+- [notifications-backend](https://github.com/backstage/backstage/blob/master/plugins/notifications-backend)
+- [notifications-common](https://github.com/backstage/backstage/blob/master/plugins/notifications-common)
+- [notifications-node](https://github.com/backstage/backstage/blob/master/plugins/notifications-node)
+- [signals-backend](https://github.com/backstage/backstage/blob/master/plugins/signals-backend)
+- [signals](https://github.com/backstage/backstage/blob/master/plugins/signals)
+- [signals-node](https://github.com/backstage/backstage/blob/master/plugins/signals-node)
+- [signals-react](https://github.com/backstage/backstage/blob/master/plugins/signals-react)
diff --git a/docs/notifications/usage.md b/docs/notifications/usage.md
index 59fbd83e3b..358426dc21 100644
--- a/docs/notifications/usage.md
+++ b/docs/notifications/usage.md
@@ -6,7 +6,7 @@ description: How to use the notifications and signals
## Notifications Backend
-The Notifications backend plugin provides an API to create notifications, list notifications per logged-in user, and search based on parameters.
+The notifications backend plugin provides an API to create notifications, list notifications per logged-in user, and search based on parameters.
The plugin uses a relational [database](https://backstage.io/docs/getting-started/config/database) for persistence; no specifics are introduced in this context.
@@ -26,7 +26,7 @@ In the `packages/app/src/components/Root/Root.tsx`, tweak the [properties](https
## Usage
-New notifications can be sent either by a backend plugin or an external service through the REST API.
+New notifications can be sent either by a backend plugin or by an external service through the REST API.
## Backend
@@ -71,7 +71,7 @@ await notificationService.send({
});
```
-Refer the [API documentation](https://github.com/backstage/backstage/blob/master/plugins/notifications-node/report.api.md) for further details.
+Consult the [API documentation](https://github.com/backstage/backstage/blob/master/plugins/notifications-node/report.api.md) for further details.
### External Services
diff --git a/docs/overview/roadmap.md b/docs/overview/roadmap.md
index 1a41eedd63..a61455a313 100644
--- a/docs/overview/roadmap.md
+++ b/docs/overview/roadmap.md
@@ -11,23 +11,9 @@ public roadmap. This not a complete list of all work happening in and around the
project, it only highlights the highest priority initiatives worked on by the
core maintainers.
-## 2024 Fall Roadmap
+## 2025 Spring Roadmap
-The initiatives listed below are planned for release within the next half-year, starting in May 2024. The roadmap is updated every 6 months, and the next update is planned for November 2024.
-
-### Backend System 1.0
-
-The goal of this initiative is the stable 1.0 release of the [new backend system](../backend-system/index.md).
-This includes ensuring that all documentation is up to date, and includes API
-reviews and refactoring efforts to ensure that what is released is both stable
-and evolvable. You can follow along with this work in the [meta issue](https://github.com/backstage/backstage/issues/24493).
-
-As part of this initiative, there will also be an exploration on how to
-simplify extension of backend services. It is not currently possible to augment
-backend services through declarative integration, they are instead only
-customizable through complete replacement. This also limits the ability to
-modularize services and scale ownership of the implementations. The goal is to
-provide a more flexible and scalable way to extend backend services.
+The initiatives listed below are planned for release within the next half-year, starting in November 2024. The roadmap is updated every 6 months, and the next update is planned for April 2024.
### New Frontend System - Ready for Adoption
@@ -40,53 +26,17 @@ This milestone also includes reaching and executing [rollout phase 2](https://gi
Once the initial milestone is reached, the goal is to also build out broader
support for the new frontend system in the core plugins.
-### Backstage Security Audit
-
-This is the second security audit of the Backstage project. It is done together,
-and with the support of the [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/).
-This time the audit will in particular focus on the recently introduced
-[authentication system](https://github.com/backstage/backstage/tree/master/beps/0003-auth-architecture-evolution),
-but also cover other parts of the project.
-
-### Plugin Metadata
-
-The goal of this initiative is to provide better machine readable metadata for
-Backstage packages, available both at runtime, at build-time and as part of
-package registries. We want to surface information such as what packages make up
-a particular plugin, what features it provides, and more generally laying the
-foundation for an evolvable plugin metadata system.
-
-### MUI v5 Green-light
-
-Material-UI v4 is still the officially supported version of MUI in Backstage.
-While we have heard that adopters have had success using MUI 5, this is still an
-untested path with known bugs. The goal of this initiative is to iron out any
-remaining issues or gaps, and then provide a green light for migration to MUI 5.
-
-### Configuration Improvements
-
-This initiative aims to improve the configuration experience and reliability in
-Backstage. Areas for improvement include the way that configuration schema is
-loaded, the way that plugins access configuration that is not owned by them, how
-plugins read configuration, and how configuration visibility is handled.
-
-### Versioned Documentation
-
-The goal of this initiative is to provide versioned documentation at
-[backstage.io](https://backstage.io). This lets us provide documentation that is
-both up-to-date while at the same time not ahead of the latest release.
-
### Rework Pull Request & Issue Process
Our current review and issue triage process is centered around either core- or
project area maintainers. The goal of this initiative is to make it simpler for
more members of the community to be involved and contribute to this process.
-### Catalog Observability
+### Catalog Performance
-The goal of this initiative is to provide better tools for debugging catalog
-ingestion issues and to more generally reduce friction for setting up and
-maintaining the software catalog.
+The goal of this initiative is to improve the performance of the Software
+Catalog, both in terms of speeding up the read API and improving the ingestion
+process.
## How to influence the roadmap
diff --git a/docs/plugins/observability.md b/docs/plugins/observability.md
index 3bc625e7c6..c294001606 100644
--- a/docs/plugins/observability.md
+++ b/docs/plugins/observability.md
@@ -21,7 +21,7 @@ The backend supplies a central logging service,
[`rootLogger`](../backend-system/core-services/root-logger.md), as well as a plugin
based logger, [`logger`](../backend-system/core-services/logger.md) from `coreServices`.
To add additional granularity to your logs, you can create children from the plugin
-based logger, using the `.child()` method and provide is with JSON data. For example,
+based logger, using the `.child()` method and provide it with JSON data. For example,
if you wanted to log items for a specific span in your plugin, you could do
```ts
diff --git a/docs/releases/v1.38.0-next.0-changelog.md b/docs/releases/v1.38.0-next.0-changelog.md
new file mode 100644
index 0000000000..9adf106e6f
--- /dev/null
+++ b/docs/releases/v1.38.0-next.0-changelog.md
@@ -0,0 +1,1156 @@
+# Release v1.38.0-next.0
+
+Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.38.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.38.0-next.0)
+
+## @backstage/backend-defaults@0.9.0-next.0
+
+### Minor Changes
+
+- 01edf6e: Allow pass through of redis client and cluster options to Cache core service
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-app-api@1.2.1
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/backend-dev-utils@0.1.5
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/cli-node@0.2.13
+ - @backstage/config@1.3.2
+ - @backstage/config-loader@1.10.0
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/integration-aws-node@0.1.15
+ - @backstage/types@1.2.1
+ - @backstage/plugin-events-node@0.4.9
+
+## @backstage/cli@0.32.0-next.0
+
+### Minor Changes
+
+- c7254ae: Internal update to move the `clean`, `pre/postpack` and `fix` commands into their own separate module.
+
+### Patch Changes
+
+- 4ea76f7: Bump @module-federation/enhanced ^0.9.0 to fix GHSA-593f-38f6-jp5m
+- 87a5cb4: Fixed an issue causing the `repo lint` command to fail when the `--max-warnings` option was used.
+- d83f3f4: Resolved a problem where the `start` command did not correctly handle multiple `--require` flags, ensuring all specified modules are now properly loaded.
+- Updated dependencies
+ - @backstage/catalog-model@1.7.3
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.13
+ - @backstage/config@1.3.2
+ - @backstage/config-loader@1.10.0
+ - @backstage/errors@1.2.7
+ - @backstage/eslint-plugin@0.1.10
+ - @backstage/integration@1.16.2
+ - @backstage/release-manifests@0.0.12
+ - @backstage/types@1.2.1
+
+## @backstage/plugin-catalog@1.29.0-next.0
+
+### Minor Changes
+
+- 9454ef9: Added support of filtering based on system columns in catalog table
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/integration-react@1.2.5
+ - @backstage/types@1.2.1
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-scaffolder-common@1.5.10
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+
+## @backstage/plugin-scaffolder@1.30.0-next.0
+
+### Minor Changes
+
+- 5890016: add api to retrieve template extensions info from scaffolder-backend
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-react@1.15.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/integration@1.16.2
+ - @backstage/integration-react@1.2.5
+ - @backstage/types@1.2.1
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-scaffolder-common@1.5.10
+
+## @backstage/plugin-scaffolder-backend@1.32.0-next.0
+
+### Minor Changes
+
+- 75e4db4: add template-extensions scaffolder service endpoint
+
+### Patch Changes
+
+- 497d47a: Document the internal built-in filters, and ensure that the types are validated when using `createTemplateFilter` and `createTemplateGlobalFunction` from the `zod` schema.
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-scaffolder-backend-module-azure@0.2.8-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.9-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/types@1.2.1
+ - @backstage/plugin-bitbucket-cloud-common@0.2.28
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.0
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.8-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.2.8-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0
+ - @backstage/plugin-scaffolder-common@1.5.10
+
+## @backstage/plugin-scaffolder-react@1.15.0-next.0
+
+### Minor Changes
+
+- 5890016: add api to retrieve template extensions info from scaffolder-backend
+
+### Patch Changes
+
+- 6ed42b7: Scaffolding - Template card - button to show template entity detail
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/theme@0.6.4
+ - @backstage/types@1.2.1
+ - @backstage/version-bridge@1.0.11
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-scaffolder-common@1.5.10
+
+## @backstage/backend-dynamic-feature-service@0.6.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/plugin-events-backend@0.5.0
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.13
+ - @backstage/config@1.3.2
+ - @backstage/config-loader@1.10.0
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-app-node@0.1.31
+ - @backstage/plugin-events-node@0.4.9
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-search-common@1.2.17
+
+## @backstage/backend-test-utils@1.3.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/backend-app-api@1.2.1
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-events-node@0.4.9
+
+## @backstage/canon@0.2.1-next.0
+
+### Patch Changes
+
+- 6af7b16: Updated styles for the Menu component in Canon.
+- 513477f: Add global CSS reset for anchor tags.
+- 05a5003: Fix the Icon component when the name is not found to return null instead of an empty SVG.
+
+## @backstage/core-compat-api@0.4.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/version-bridge@1.0.11
+
+## @backstage/create-app@0.6.1-next.0
+
+### Patch Changes
+
+- Bumped create-app version.
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
+## @backstage/dev-utils@1.1.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/app-defaults@1.6.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/integration-react@1.2.5
+ - @backstage/theme@0.6.4
+
+## @techdocs/cli@1.9.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-techdocs-node@1.13.2-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.2
+
+## @backstage/plugin-api-docs@0.12.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-permission-react@0.4.32
+
+## @backstage/plugin-auth-backend@0.24.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.0
+ - @backstage/plugin-auth-backend-module-atlassian-provider@0.4.1
+ - @backstage/plugin-auth-backend-module-auth0-provider@0.2.1
+ - @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.1
+ - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.1
+ - @backstage/plugin-auth-backend-module-github-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-gitlab-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-microsoft-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-oauth2-provider@0.4.1
+ - @backstage/plugin-auth-backend-module-okta-provider@0.2.1
+ - @backstage/plugin-auth-backend-module-onelogin-provider@0.3.1
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.0
+ - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.6
+ - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.1
+ - @backstage/plugin-auth-backend-module-google-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.6
+ - @backstage/plugin-catalog-node@1.16.1
+
+## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend@0.24.5-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/errors@1.2.7
+
+## @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.0
+
+### Patch Changes
+
+- 7495edf: Added custom timeout setting for oidc provider
+
+ Here is an example of how to use a custom timeout with the configuration:
+
+ ```yaml
+ auth:
+ oidc:
+ production:
+ clientId: ${AUTH_GOOGLE_CLIENT_ID}
+ clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET}
+ timeout:
+ seconds: 30
+ ```
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend@0.24.5-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/types@1.2.1
+
+## @backstage/plugin-catalog-backend-module-aws@0.4.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/integration-aws-node@0.1.15
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-kubernetes-common@0.9.4
+
+## @backstage/plugin-catalog-backend-module-github@0.7.12-next.0
+
+### Patch Changes
+
+- 16648ef: Added `validateLocationsExist` to the config definition where it was missing.
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+
+## @backstage/plugin-catalog-backend-module-github-org@0.3.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend-module-github@0.7.12-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.0
+
+### Patch Changes
+
+- a568cda: add filter for repos by membership and topics
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+
+## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.5-next.0
+
+### Patch Changes
+
+- 27d1031: fixed misleading example location annotations in docs
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+ - @backstage/plugin-permission-common@0.8.4
+
+## @backstage/plugin-catalog-graph@0.4.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/types@1.2.1
+
+## @backstage/plugin-catalog-import@0.12.12-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/integration@1.16.2
+ - @backstage/integration-react@1.2.5
+ - @backstage/plugin-catalog-common@1.1.3
+
+## @backstage/plugin-catalog-react@1.16.1-next.0
+
+### Patch Changes
+
+- 186d016: Add `operation` to alpha `defaultEntityContentGroups`.
+- 221ddba: Fix offset pagination to reset when updating filters in `useEntityList`
+- Updated dependencies
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/frontend-test-utils@0.3.0
+ - @backstage/integration-react@1.2.5
+ - @backstage/types@1.2.1
+ - @backstage/version-bridge@1.0.11
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-permission-react@0.4.32
+
+## @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0
+
+### Patch Changes
+
+- ba88bfa: Added confirmation popup for delete entities in Catalog Unprocessed Entities plugin
+- 2479827: Fixed the `convertTimeToLocalTimezone` function in the FailedEntities component to correctly parse ISO 8601 date strings and set the timezone to the current local timezone.
+- Updated dependencies
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+
+## @backstage/plugin-devtools@0.1.26-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/plugin-devtools-common@0.1.15
+ - @backstage/plugin-permission-react@0.4.32
+
+## @backstage/plugin-devtools-backend@0.5.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.2
+ - @backstage/config-loader@1.10.0
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-devtools-common@0.1.15
+ - @backstage/plugin-permission-common@0.8.4
+
+## @backstage/plugin-home@0.8.7-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/plugin-home-react@0.1.25-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/theme@0.6.4
+
+## @backstage/plugin-home-react@0.1.25-next.0
+
+### Patch Changes
+
+- 2e4cb15: Fixes auto-hiding of content divider when title not specified
+- Updated dependencies
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+
+## @backstage/plugin-kubernetes@0.12.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/plugin-kubernetes-common@0.9.4
+ - @backstage/plugin-kubernetes-react@0.5.5
+ - @backstage/plugin-permission-react@0.4.32
+
+## @backstage/plugin-kubernetes-cluster@0.0.24-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/plugin-kubernetes-common@0.9.4
+ - @backstage/plugin-kubernetes-react@0.5.5
+ - @backstage/plugin-permission-react@0.4.32
+
+## @backstage/plugin-notifications@0.5.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/theme@0.6.4
+ - @backstage/types@1.2.1
+ - @backstage/plugin-notifications-common@0.0.8
+ - @backstage/plugin-signals-react@0.0.11
+
+## @backstage/plugin-org@0.6.38-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/plugin-catalog-common@1.1.3
+
+## @backstage/plugin-org-react@0.1.37-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+
+## @backstage/plugin-scaffolder-backend-module-azure@0.2.8-next.0
+
+### Patch Changes
+
+- 2bd41ce: Made "publish:azure" action idempotent
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.9-next.0
+
+### Patch Changes
+
+- adfceee: Made "publish:bitbucket" action idempotent
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.8-next.0
+
+### Patch Changes
+
+- 5266f1c: Made "publish:bitbucketCloud" action idempotent
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-bitbucket-cloud-common@0.2.28
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+
+## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/types@1.2.1
+
+## @backstage/plugin-scaffolder-backend-module-gcp@0.2.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+
+## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+
+## @backstage/plugin-scaffolder-backend-module-gitea@0.2.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+
+## @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0
+
+### Patch Changes
+
+- 1af427a: Made "github:autolinks:create" action idempotent
+- 180ea6e: Made "github:branch-protection:create" action idempotent
+- 0be1a1e: Made "publish:github" action idempotent
+- a833f0f: Made "github:actions:dispatch" action idempotent
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/types@1.2.1
+
+## @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+
+## @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.0
+
+### Patch Changes
+
+- 25a7675: Made "notification:send" action idempotent
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/plugin-notifications-common@0.0.8
+ - @backstage/plugin-notifications-node@0.2.13
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/types@1.2.1
+
+## @backstage/plugin-scaffolder-backend-module-sentry@0.2.8-next.0
+
+### Patch Changes
+
+- dcda66a: Made "sentry:project:create" action idempotent
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/types@1.2.1
+ - @backstage/plugin-scaffolder-node-test-utils@0.2.1-next.0
+
+## @backstage/plugin-scaffolder-node@0.8.1-next.0
+
+### Patch Changes
+
+- 497d47a: Document the internal built-in filters, and ensure that the types are validated when using `createTemplateFilter` and `createTemplateGlobalFunction` from the `zod` schema.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/types@1.2.1
+ - @backstage/plugin-scaffolder-common@1.5.10
+
+## @backstage/plugin-scaffolder-node-test-utils@0.2.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/backend-test-utils@1.3.2-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/types@1.2.1
+
+## @backstage/plugin-search@1.4.25-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/types@1.2.1
+ - @backstage/version-bridge@1.0.11
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+
+## @backstage/plugin-search-backend@2.0.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/backend-openapi-utils@0.5.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-search-common@1.2.17
+
+## @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.13.2-next.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-search-common@1.2.17
+
+## @backstage/plugin-techdocs@1.12.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/integration@1.16.2
+ - @backstage/integration-react@1.2.5
+ - @backstage/theme@0.6.4
+ - @backstage/plugin-auth-react@0.1.13
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+ - @backstage/plugin-techdocs-common@0.1.0
+ - @backstage/plugin-techdocs-react@1.2.15
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.47-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/plugin-techdocs@1.12.5-next.0
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/integration-react@1.2.5
+ - @backstage/test-utils@1.7.6
+ - @backstage/plugin-search-react@1.8.7
+ - @backstage/plugin-techdocs-react@1.2.15
+
+## @backstage/plugin-techdocs-backend@2.0.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-techdocs-node@1.13.2-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-techdocs-common@0.1.0
+
+## @backstage/plugin-techdocs-node@1.13.2-next.0
+
+### Patch Changes
+
+- 304a422: Update AWS file retrieval logic from storing file in buffer array to piping to res for better memory efficiency.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/integration-aws-node@0.1.15
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-techdocs-common@0.1.0
+
+## @backstage/plugin-user-settings@0.8.21-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/theme@0.6.4
+ - @backstage/types@1.2.1
+ - @backstage/plugin-signals-react@0.0.11
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## @backstage/plugin-user-settings-backend@0.3.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-signals-node@0.1.18
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## example-app@0.2.108-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/cli@0.32.0-next.0
+ - @backstage/canon@0.2.1-next.0
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0
+ - @backstage/plugin-scaffolder-react@1.15.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/plugin-scaffolder@1.30.0-next.0
+ - @backstage/plugin-api-docs@0.12.6-next.0
+ - @backstage/plugin-catalog-graph@0.4.18-next.0
+ - @backstage/plugin-catalog-import@0.12.12-next.0
+ - @backstage/plugin-org@0.6.38-next.0
+ - @backstage/plugin-techdocs@1.12.5-next.0
+ - @backstage/plugin-user-settings@0.8.21-next.0
+ - @backstage/app-defaults@1.6.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-app-api@0.11.0
+ - @backstage/integration-react@1.2.5
+ - @backstage/theme@0.6.4
+ - @backstage/plugin-auth-react@0.1.13
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-devtools@0.1.26-next.0
+ - @backstage/plugin-home@0.8.7-next.0
+ - @backstage/plugin-kubernetes@0.12.6-next.0
+ - @backstage/plugin-kubernetes-cluster@0.0.24-next.0
+ - @backstage/plugin-notifications@0.5.4-next.0
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-search@1.4.25-next.0
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+ - @backstage/plugin-signals@0.0.17
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.22
+ - @backstage/plugin-techdocs-react@1.2.15
+
+## example-app-next@0.0.22-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/cli@0.32.0-next.0
+ - @backstage/canon@0.2.1-next.0
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0
+ - @backstage/plugin-scaffolder-react@1.15.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/plugin-scaffolder@1.30.0-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/plugin-api-docs@0.12.6-next.0
+ - @backstage/plugin-catalog-graph@0.4.18-next.0
+ - @backstage/plugin-catalog-import@0.12.12-next.0
+ - @backstage/plugin-org@0.6.38-next.0
+ - @backstage/plugin-techdocs@1.12.5-next.0
+ - @backstage/plugin-user-settings@0.8.21-next.0
+ - @backstage/app-defaults@1.6.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-app-api@0.11.0
+ - @backstage/frontend-defaults@0.2.0
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/integration-react@1.2.5
+ - @backstage/theme@0.6.4
+ - @backstage/plugin-app@0.1.7
+ - @backstage/plugin-app-visualizer@0.1.17
+ - @backstage/plugin-auth-react@0.1.13
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-home@0.8.7-next.0
+ - @backstage/plugin-kubernetes@0.12.6-next.0
+ - @backstage/plugin-kubernetes-cluster@0.0.24-next.0
+ - @backstage/plugin-notifications@0.5.4-next.0
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-search@1.4.25-next.0
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+ - @backstage/plugin-signals@0.0.17
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.22
+ - @backstage/plugin-techdocs-react@1.2.15
+
+## example-backend@0.0.37-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0
+ - @backstage/plugin-scaffolder-backend@1.32.0-next.0
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.0
+ - @backstage/plugin-app-backend@0.5.0
+ - @backstage/plugin-auth-backend@0.24.5-next.0
+ - @backstage/plugin-auth-backend-module-github-provider@0.3.1
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/plugin-devtools-backend@0.5.4-next.0
+ - @backstage/plugin-events-backend@0.5.0
+ - @backstage/plugin-kubernetes-backend@0.19.4
+ - @backstage/plugin-notifications-backend@0.5.4
+ - @backstage/plugin-permission-backend@0.5.55
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/plugin-proxy-backend@0.6.0
+ - @backstage/plugin-search-backend@2.0.1-next.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/plugin-signals-backend@0.3.2
+ - @backstage/plugin-techdocs-backend@2.0.1-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.6
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.8
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-search-backend-module-catalog@0.3.2
+ - @backstage/plugin-search-backend-module-explore@0.3.0
+
+## example-backend-legacy@0.2.109-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-scaffolder-backend@1.32.0-next.0
+ - @backstage/plugin-auth-backend@0.24.5-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/plugin-events-backend@0.5.0
+ - @backstage/plugin-kubernetes-backend@0.19.4
+ - @backstage/plugin-permission-backend@0.5.55
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/plugin-search-backend@2.0.1-next.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/plugin-signals-backend@0.3.2
+ - @backstage/plugin-techdocs-backend@2.0.1-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0
+ - @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.3.2
+ - @backstage/plugin-search-backend-module-elasticsearch@1.7.0
+ - @backstage/plugin-search-backend-module-explore@0.3.0
+ - @backstage/plugin-search-backend-module-pg@0.5.42
+ - @backstage/plugin-signals-node@0.1.18
+
+## e2e-test@0.2.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.6.1-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.7
+
+## @internal/scaffolder@0.0.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-react@1.15.0-next.0
+ - @backstage/frontend-plugin-api@0.10.0
+
+## techdocs-cli-embedded-app@0.2.107-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/cli@0.32.0-next.0
+ - @backstage/plugin-techdocs@1.12.5-next.0
+ - @backstage/app-defaults@1.6.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/integration-react@1.2.5
+ - @backstage/test-utils@1.7.6
+ - @backstage/theme@0.6.4
+ - @backstage/plugin-techdocs-react@1.2.15
diff --git a/microsite/blog/2022-10-28-backstagecon-kubecon-2022.mdx b/microsite/blog/2022-10-28-backstagecon-kubecon-2022.mdx
index ffc44ed432..92bdbafe05 100644
--- a/microsite/blog/2022-10-28-backstagecon-kubecon-2022.mdx
+++ b/microsite/blog/2022-10-28-backstagecon-kubecon-2022.mdx
@@ -11,6 +11,8 @@ authorURL: https://www.linkedin.com/in/emmamckeewhite/
What an action-packed and memorable week for the Backstage community meeting up IRL at KubeCon North America 2022 in (unseasonably warm and sunny) Detroit. Let’s see what the community was up to:
+{/* truncate */}
+
### BackstageCon: A full day of nothing but Backstage

diff --git a/microsite/blog/2023-07-08-stash-adopter-post.mdx b/microsite/blog/2023-07-08-stash-adopter-post.mdx
index dbf85f9e25..6c1edea764 100644
--- a/microsite/blog/2023-07-08-stash-adopter-post.mdx
+++ b/microsite/blog/2023-07-08-stash-adopter-post.mdx
@@ -10,7 +10,7 @@ author: Taylor Webber, Staff Engineer, Stash
{/* truncate */}
-At [Stash](stash.com), our mission is to give people the confidence to invest for a better life. Our app simplifies investing for the middle class who may be less experienced with traditional investing and retirement planning. Our customers trust us with their money, and with that, rely on us to provide a responsive and quality experience that works every time.
+At [Stash](https://www.stash.com), our mission is to give people the confidence to invest for a better life. Our app simplifies investing for the middle class who may be less experienced with traditional investing and retirement planning. Our customers trust us with their money, and with that, rely on us to provide a responsive and quality experience that works every time.
It isn't revolutionary to say that monitoring the health of a software application is critical for ensuring its reliability and performance in service of customers' needs. However, in a distributed architecture like microservices, tracking ownership and monitoring application health across the system quickly becomes complex. The difficulties are further compounded when leveraging multiple SaaS products, which is common in modern development but specifically so for fintechs like Stash that integrate best-of-breed software in novel ways, as we do across our platform.
diff --git a/microsite/docusaurus.config.ts b/microsite/docusaurus.config.ts
index 87aa68d633..664f6e1e6e 100644
--- a/microsite/docusaurus.config.ts
+++ b/microsite/docusaurus.config.ts
@@ -123,6 +123,11 @@ const config: Config = {
},
blog: {
path: 'blog',
+ // Gets rid of the following:
+ // Warning: Some blog authors used in "2024-12-18-backstage-wrapped-2024.mdx" are not defined in "authors.yml":
+ // - {"name":"Patrik Oldsberg, Spotify & Ben Lambert, Spotify","key":null,"page":null}
+ // Note that we recommend to declare authors once in a "authors.yml" file and reference them by key in blog posts front matter to avoid author info duplication.
+ onInlineAuthors: 'ignore',
},
theme: {
customCss: 'src/theme/customTheme.scss',
@@ -299,11 +304,6 @@ const config: Config = {
themes: ['docusaurus-theme-openapi-docs'],
themeConfig: {
languageTabs: [
- {
- highlight: 'javascript',
- language: 'nodejs',
- logoClass: 'nodejs',
- },
{
highlight: 'javascript',
language: 'javascript',
diff --git a/package.json b/package.json
index 083c70e483..aed62a8c2d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "root",
- "version": "1.37.0",
+ "version": "1.38.0-next.0",
"backstage": {
"cli": {
"new": {
diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md
index d7bdd7fa17..acf3fa9f56 100644
--- a/packages/app-next/CHANGELOG.md
+++ b/packages/app-next/CHANGELOG.md
@@ -1,5 +1,51 @@
# example-app-next
+## 0.0.22-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/cli@0.32.0-next.0
+ - @backstage/canon@0.2.1-next.0
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0
+ - @backstage/plugin-scaffolder-react@1.15.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/plugin-scaffolder@1.30.0-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/plugin-api-docs@0.12.6-next.0
+ - @backstage/plugin-catalog-graph@0.4.18-next.0
+ - @backstage/plugin-catalog-import@0.12.12-next.0
+ - @backstage/plugin-org@0.6.38-next.0
+ - @backstage/plugin-techdocs@1.12.5-next.0
+ - @backstage/plugin-user-settings@0.8.21-next.0
+ - @backstage/app-defaults@1.6.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-app-api@0.11.0
+ - @backstage/frontend-defaults@0.2.0
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/integration-react@1.2.5
+ - @backstage/theme@0.6.4
+ - @backstage/plugin-app@0.1.7
+ - @backstage/plugin-app-visualizer@0.1.17
+ - @backstage/plugin-auth-react@0.1.13
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-home@0.8.7-next.0
+ - @backstage/plugin-kubernetes@0.12.6-next.0
+ - @backstage/plugin-kubernetes-cluster@0.0.24-next.0
+ - @backstage/plugin-notifications@0.5.4-next.0
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-search@1.4.25-next.0
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+ - @backstage/plugin-signals@0.0.17
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.22
+ - @backstage/plugin-techdocs-react@1.2.15
+
## 0.0.21
### Patch Changes
diff --git a/packages/app-next/package.json b/packages/app-next/package.json
index fd78b59760..84067d4988 100644
--- a/packages/app-next/package.json
+++ b/packages/app-next/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
- "version": "0.0.21",
+ "version": "0.0.22-next.0",
"backstage": {
"role": "frontend"
},
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index a7fbce0cf7..99c3eb234d 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,47 @@
# example-app
+## 0.2.108-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/cli@0.32.0-next.0
+ - @backstage/canon@0.2.1-next.0
+ - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0
+ - @backstage/plugin-scaffolder-react@1.15.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/plugin-scaffolder@1.30.0-next.0
+ - @backstage/plugin-api-docs@0.12.6-next.0
+ - @backstage/plugin-catalog-graph@0.4.18-next.0
+ - @backstage/plugin-catalog-import@0.12.12-next.0
+ - @backstage/plugin-org@0.6.38-next.0
+ - @backstage/plugin-techdocs@1.12.5-next.0
+ - @backstage/plugin-user-settings@0.8.21-next.0
+ - @backstage/app-defaults@1.6.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-app-api@0.11.0
+ - @backstage/integration-react@1.2.5
+ - @backstage/theme@0.6.4
+ - @backstage/plugin-auth-react@0.1.13
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-devtools@0.1.26-next.0
+ - @backstage/plugin-home@0.8.7-next.0
+ - @backstage/plugin-kubernetes@0.12.6-next.0
+ - @backstage/plugin-kubernetes-cluster@0.0.24-next.0
+ - @backstage/plugin-notifications@0.5.4-next.0
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-search@1.4.25-next.0
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+ - @backstage/plugin-signals@0.0.17
+ - @backstage/plugin-techdocs-module-addons-contrib@1.1.22
+ - @backstage/plugin-techdocs-react@1.2.15
+
## 0.2.107
### Patch Changes
diff --git a/packages/app/package.json b/packages/app/package.json
index ce8f4b8482..357de42061 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app",
- "version": "0.2.107",
+ "version": "0.2.108-next.0",
"backstage": {
"role": "frontend"
},
diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md
index 81b70c541e..72607fd320 100644
--- a/packages/backend-defaults/CHANGELOG.md
+++ b/packages/backend-defaults/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/backend-defaults
+## 0.9.0-next.0
+
+### Minor Changes
+
+- 01edf6e: Allow pass through of redis client and cluster options to Cache core service
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-app-api@1.2.1
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/backend-dev-utils@0.1.5
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/cli-node@0.2.13
+ - @backstage/config@1.3.2
+ - @backstage/config-loader@1.10.0
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/integration-aws-node@0.1.15
+ - @backstage/types@1.2.1
+ - @backstage/plugin-events-node@0.4.9
+
## 0.8.2
### Patch Changes
diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json
index 1318d57d42..5d2ae323c6 100644
--- a/packages/backend-defaults/package.json
+++ b/packages/backend-defaults/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-defaults",
- "version": "0.8.2",
+ "version": "0.9.0-next.0",
"description": "Backend defaults used by Backstage backend apps",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md
index 59e4342757..39a1fb1795 100644
--- a/packages/backend-dynamic-feature-service/CHANGELOG.md
+++ b/packages/backend-dynamic-feature-service/CHANGELOG.md
@@ -1,5 +1,29 @@
# @backstage/backend-dynamic-feature-service
+## 0.6.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-scaffolder-node@0.8.1-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/plugin-events-backend@0.5.0
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.13
+ - @backstage/config@1.3.2
+ - @backstage/config-loader@1.10.0
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-app-node@0.1.31
+ - @backstage/plugin-events-node@0.4.9
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-search-common@1.2.17
+
## 0.6.1
### Patch Changes
diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json
index 33cc595286..2b97805a2e 100644
--- a/packages/backend-dynamic-feature-service/package.json
+++ b/packages/backend-dynamic-feature-service/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-dynamic-feature-service",
- "version": "0.6.1",
+ "version": "0.6.2-next.0",
"description": "Backstage dynamic feature service",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-legacy/CHANGELOG.md b/packages/backend-legacy/CHANGELOG.md
index 5dc4eced46..1ca1f34ebb 100644
--- a/packages/backend-legacy/CHANGELOG.md
+++ b/packages/backend-legacy/CHANGELOG.md
@@ -1,5 +1,43 @@
# example-backend-legacy
+## 0.2.109-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-scaffolder-backend@1.32.0-next.0
+ - @backstage/plugin-auth-backend@0.24.5-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/plugin-events-backend@0.5.0
+ - @backstage/plugin-kubernetes-backend@0.19.4
+ - @backstage/plugin-permission-backend@0.5.55
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/plugin-search-backend@2.0.1-next.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/plugin-signals-backend@0.3.2
+ - @backstage/plugin-techdocs-backend@2.0.1-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.8-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.8.2-next.0
+ - @backstage/plugin-scaffolder-backend-module-rails@0.5.8-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.3.2
+ - @backstage/plugin-search-backend-module-elasticsearch@1.7.0
+ - @backstage/plugin-search-backend-module-explore@0.3.0
+ - @backstage/plugin-search-backend-module-pg@0.5.42
+ - @backstage/plugin-signals-node@0.1.18
+
## 0.2.108
### Patch Changes
diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json
index 90430aa4a8..e4a415c93d 100644
--- a/packages/backend-legacy/package.json
+++ b/packages/backend-legacy/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend-legacy",
- "version": "0.2.108",
+ "version": "0.2.109-next.0",
"backstage": {
"role": "backend"
},
diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md
index 793a0ecb4d..3804c1afb8 100644
--- a/packages/backend-test-utils/CHANGELOG.md
+++ b/packages/backend-test-utils/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/backend-test-utils
+## 1.3.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/backend-app-api@1.2.1
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-events-node@0.4.9
+
## 1.3.1
### Patch Changes
diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json
index 17f5d8fad1..54ce0ef6d2 100644
--- a/packages/backend-test-utils/package.json
+++ b/packages/backend-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
- "version": "1.3.1",
+ "version": "1.3.2-next.0",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index d60080901c..dd57069564 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,43 @@
# example-backend
+## 0.0.37-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.6.2-next.0
+ - @backstage/plugin-scaffolder-backend@1.32.0-next.0
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.9-next.0
+ - @backstage/plugin-app-backend@0.5.0
+ - @backstage/plugin-auth-backend@0.24.5-next.0
+ - @backstage/plugin-auth-backend-module-github-provider@0.3.1
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/plugin-devtools-backend@0.5.4-next.0
+ - @backstage/plugin-events-backend@0.5.0
+ - @backstage/plugin-kubernetes-backend@0.19.4
+ - @backstage/plugin-notifications-backend@0.5.4
+ - @backstage/plugin-permission-backend@0.5.55
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/plugin-proxy-backend@0.6.0
+ - @backstage/plugin-search-backend@2.0.1-next.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/plugin-signals-backend@0.3.2
+ - @backstage/plugin-techdocs-backend@2.0.1-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.6
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.0
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.8
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.6
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.6
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.6
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-search-backend-module-catalog@0.3.2
+ - @backstage/plugin-search-backend-module-explore@0.3.0
+
## 0.0.36
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 47ffbf0ece..454bfc2066 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.0.36",
+ "version": "0.0.37-next.0",
"backstage": {
"role": "backend"
},
diff --git a/packages/canon/.storybook/manager.ts b/packages/canon/.storybook/manager.ts
deleted file mode 100644
index c88b10b392..0000000000
--- a/packages/canon/.storybook/manager.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { addons } from '@storybook/manager-api';
-import { create } from '@storybook/theming';
-
-const theme = create({
- base: 'light',
- brandTitle: 'Canon',
- brandImage: 'logo.svg',
-});
-
-addons.setConfig({
- theme,
-});
diff --git a/packages/canon/CHANGELOG.md b/packages/canon/CHANGELOG.md
index 87a8dd4265..8281606041 100644
--- a/packages/canon/CHANGELOG.md
+++ b/packages/canon/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/canon
+## 0.2.1-next.0
+
+### Patch Changes
+
+- 6af7b16: Updated styles for the Menu component in Canon.
+- 513477f: Add global CSS reset for anchor tags.
+- 05a5003: Fix the Icon component when the name is not found to return null instead of an empty SVG.
+
## 0.2.0
### Minor Changes
diff --git a/packages/canon/css/components.css b/packages/canon/css/components.css
index b95ea2425a..1713468367 100644
--- a/packages/canon/css/components.css
+++ b/packages/canon/css/components.css
@@ -404,36 +404,6 @@
height: 1.5rem;
}
-.canon-FieldRoot {
- font-family: var(--canon-font-regular);
- flex-direction: column;
- width: 100%;
- display: flex;
-}
-
-.canon-FieldLabel {
- font-size: var(--canon-font-size-2);
- font-weight: var(--canon-font-weight-regular);
- color: var(--canon-fg-primary);
- margin-bottom: var(--canon-space-1_5);
-}
-
-.canon-FieldDescription {
- font-size: var(--canon-font-size-2);
- font-weight: var(--canon-font-weight-regular);
- color: var(--canon-fg-secondary);
- padding-top: var(--canon-space-1_5);
- margin: 0;
-}
-
-.canon-FieldError {
- font-size: var(--canon-font-size-2);
- font-weight: var(--canon-font-weight-regular);
- color: var(--canon-fg-danger);
- padding-top: var(--canon-space-1_5);
- margin: 0;
-}
-
.canon-Input {
border-radius: var(--canon-radius-3);
border: 1px solid var(--canon-border);
@@ -465,54 +435,50 @@
border-color: var(--canon-fg-danger);
}
-.canon-Input[data-disabled] {
- opacity: .5;
- cursor: not-allowed;
- border: 1px solid var(--canon-border-disabled);
-}
-
-.canon-Input--size-small {
+.canon-Input--size-sm {
height: 2rem;
}
-.canon-Input--size-medium {
+.canon-Input--size-md {
height: 2.5rem;
}
-.canon-MenuTrigger {
- box-sizing: border-box;
- border: 1px solid var(--color-gray-200);
- background-color: var(--color-gray-50);
- height: 2.5rem;
- color: var(--color-gray-900);
- user-select: none;
- border-radius: .375rem;
- outline: 0;
- justify-content: center;
- align-items: center;
- gap: .375rem;
- margin: 0;
- padding: 0 .875rem;
- font-family: inherit;
- font-size: 1rem;
- font-weight: 500;
- line-height: 1.5rem;
+.canon-FieldRoot {
+ font-family: var(--canon-font-regular);
+ flex-direction: column;
+ width: 100%;
display: flex;
+}
- @media (hover: hover) {
- &:hover {
- background-color: var(--color-gray-100);
- }
- }
+.canon-FieldLabel {
+ font-size: var(--canon-font-size-2);
+ font-weight: var(--canon-font-weight-regular);
+ color: var(--canon-fg-primary);
+ margin-bottom: var(--canon-space-1_5);
+}
- &:active, &[data-popup-open] {
- background-color: var(--color-gray-100);
- }
+.canon-FieldDescription {
+ font-size: var(--canon-font-size-2);
+ font-weight: var(--canon-font-weight-regular);
+ color: var(--canon-fg-secondary);
+ padding-top: var(--canon-space-1_5);
+ margin: 0;
+}
- &:focus-visible {
- outline: 2px solid var(--color-blue);
- outline-offset: -1px;
- }
+.canon-FieldError {
+ font-size: var(--canon-font-size-2);
+ font-weight: var(--canon-font-weight-regular);
+ color: var(--canon-fg-danger);
+ padding-top: var(--canon-space-1_5);
+ margin: 0;
+}
+
+.canon-FieldValidity {
+ font-size: var(--canon-font-size-2);
+ font-weight: var(--canon-font-weight-regular);
+ color: var(--canon-fg-secondary);
+ padding-top: var(--canon-space-1_5);
+ margin: 0;
}
.canon-MenuPositioner {
@@ -520,60 +486,45 @@
}
.canon-MenuPopup {
- box-sizing: border-box;
- background-color: var(--canon-bg-elevated);
- color: var(--color-fg-primary);
+ padding: var(--canon-space-2);
+ background-color: var(--canon-bg-surface-1);
+ border: 1px solid var(--canon-border);
+ color: var(--canon-fg-primary);
transform-origin: var(--transform-origin);
border-radius: .375rem;
- padding-block: .25rem;
+ outline: none;
+ max-width: 340px;
transition: transform .15s, opacity .15s;
+ overflow: hidden;
&[data-starting-style], &[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
-
- @media (prefers-color-scheme: light) {
- & {
- outline: 1px solid var(--color-gray-200);
- box-shadow: 0px 10px 15px -3px var(--color-gray-200), 0px 4px 6px -4px var(--color-gray-200);
- }
- }
-
- @media (prefers-color-scheme: dark) {
- & {
- outline: 1px solid var(--color-gray-300);
- outline-offset: -1px;
- }
- }
}
.canon-MenuItem {
cursor: default;
user-select: none;
- padding-block: .5rem;
+ gap: var(--canon-space-2);
+ color: var(--canon-fg-primary);
+ border-radius: var(--canon-radius-2);
+ padding: var(--canon-space-2) var(--canon-space-2);
+ padding-right: var(--canon-space-4);
+ cursor: pointer;
outline: 0;
- padding-left: 1rem;
- padding-right: 2rem;
- font-size: .875rem;
- line-height: 1rem;
+ text-decoration: none;
display: flex;
+ &:last-child {
+ border-bottom: none;
+ }
+
&[data-highlighted] {
z-index: 0;
- color: var(--color-gray-50);
+ background-color: var(--canon-bg-tint-hover);
position: relative;
}
-
- &[data-highlighted]:before {
- content: "";
- z-index: -1;
- background-color: var(--color-gray-900);
- border-radius: .25rem;
- position: absolute;
- inset-block: 0;
- inset-inline: .25rem;
- }
}
.canon-MenuSeparator {
diff --git a/packages/canon/css/core.css b/packages/canon/css/core.css
index 34e447147e..b4583ea35d 100644
--- a/packages/canon/css/core.css
+++ b/packages/canon/css/core.css
@@ -9083,6 +9083,11 @@
}
}
+:where(a) {
+ color: inherit;
+ text-decoration: none;
+}
+
:root {
--canon-font-regular: system-ui;
--canon-font-monospace: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;
diff --git a/packages/canon/css/menu.css b/packages/canon/css/menu.css
index 21192076b4..de811cde77 100644
--- a/packages/canon/css/menu.css
+++ b/packages/canon/css/menu.css
@@ -1,98 +1,47 @@
-.canon-MenuTrigger {
- box-sizing: border-box;
- border: 1px solid var(--color-gray-200);
- background-color: var(--color-gray-50);
- height: 2.5rem;
- color: var(--color-gray-900);
- user-select: none;
- border-radius: .375rem;
- outline: 0;
- justify-content: center;
- align-items: center;
- gap: .375rem;
- margin: 0;
- padding: 0 .875rem;
- font-family: inherit;
- font-size: 1rem;
- font-weight: 500;
- line-height: 1.5rem;
- display: flex;
-
- @media (hover: hover) {
- &:hover {
- background-color: var(--color-gray-100);
- }
- }
-
- &:active, &[data-popup-open] {
- background-color: var(--color-gray-100);
- }
-
- &:focus-visible {
- outline: 2px solid var(--color-blue);
- outline-offset: -1px;
- }
-}
-
.canon-MenuPositioner {
outline: 0;
}
.canon-MenuPopup {
- box-sizing: border-box;
- background-color: var(--canon-bg-elevated);
- color: var(--color-fg-primary);
+ padding: var(--canon-space-2);
+ background-color: var(--canon-bg-surface-1);
+ border: 1px solid var(--canon-border);
+ color: var(--canon-fg-primary);
transform-origin: var(--transform-origin);
border-radius: .375rem;
- padding-block: .25rem;
+ outline: none;
+ max-width: 340px;
transition: transform .15s, opacity .15s;
+ overflow: hidden;
&[data-starting-style], &[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
-
- @media (prefers-color-scheme: light) {
- & {
- outline: 1px solid var(--color-gray-200);
- box-shadow: 0px 10px 15px -3px var(--color-gray-200), 0px 4px 6px -4px var(--color-gray-200);
- }
- }
-
- @media (prefers-color-scheme: dark) {
- & {
- outline: 1px solid var(--color-gray-300);
- outline-offset: -1px;
- }
- }
}
.canon-MenuItem {
cursor: default;
user-select: none;
- padding-block: .5rem;
+ gap: var(--canon-space-2);
+ color: var(--canon-fg-primary);
+ border-radius: var(--canon-radius-2);
+ padding: var(--canon-space-2) var(--canon-space-2);
+ padding-right: var(--canon-space-4);
+ cursor: pointer;
outline: 0;
- padding-left: 1rem;
- padding-right: 2rem;
- font-size: .875rem;
- line-height: 1rem;
+ text-decoration: none;
display: flex;
+ &:last-child {
+ border-bottom: none;
+ }
+
&[data-highlighted] {
z-index: 0;
- color: var(--color-gray-50);
+ background-color: var(--canon-bg-tint-hover);
position: relative;
}
-
- &[data-highlighted]:before {
- content: "";
- z-index: -1;
- background-color: var(--color-gray-900);
- border-radius: .25rem;
- position: absolute;
- inset-block: 0;
- inset-inline: .25rem;
- }
}
.canon-MenuSeparator {
diff --git a/packages/canon/css/styles.css b/packages/canon/css/styles.css
index 5c747ce3d1..7289562f9d 100644
--- a/packages/canon/css/styles.css
+++ b/packages/canon/css/styles.css
@@ -9083,6 +9083,11 @@
}
}
+:where(a) {
+ color: inherit;
+ text-decoration: none;
+}
+
:root {
--canon-font-regular: system-ui;
--canon-font-monospace: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;
@@ -9605,36 +9610,6 @@
height: 1.5rem;
}
-.canon-FieldRoot {
- font-family: var(--canon-font-regular);
- flex-direction: column;
- width: 100%;
- display: flex;
-}
-
-.canon-FieldLabel {
- font-size: var(--canon-font-size-2);
- font-weight: var(--canon-font-weight-regular);
- color: var(--canon-fg-primary);
- margin-bottom: var(--canon-space-1_5);
-}
-
-.canon-FieldDescription {
- font-size: var(--canon-font-size-2);
- font-weight: var(--canon-font-weight-regular);
- color: var(--canon-fg-secondary);
- padding-top: var(--canon-space-1_5);
- margin: 0;
-}
-
-.canon-FieldError {
- font-size: var(--canon-font-size-2);
- font-weight: var(--canon-font-weight-regular);
- color: var(--canon-fg-danger);
- padding-top: var(--canon-space-1_5);
- margin: 0;
-}
-
.canon-Input {
border-radius: var(--canon-radius-3);
border: 1px solid var(--canon-border);
@@ -9666,54 +9641,50 @@
border-color: var(--canon-fg-danger);
}
-.canon-Input[data-disabled] {
- opacity: .5;
- cursor: not-allowed;
- border: 1px solid var(--canon-border-disabled);
-}
-
-.canon-Input--size-small {
+.canon-Input--size-sm {
height: 2rem;
}
-.canon-Input--size-medium {
+.canon-Input--size-md {
height: 2.5rem;
}
-.canon-MenuTrigger {
- box-sizing: border-box;
- border: 1px solid var(--color-gray-200);
- background-color: var(--color-gray-50);
- height: 2.5rem;
- color: var(--color-gray-900);
- user-select: none;
- border-radius: .375rem;
- outline: 0;
- justify-content: center;
- align-items: center;
- gap: .375rem;
- margin: 0;
- padding: 0 .875rem;
- font-family: inherit;
- font-size: 1rem;
- font-weight: 500;
- line-height: 1.5rem;
+.canon-FieldRoot {
+ font-family: var(--canon-font-regular);
+ flex-direction: column;
+ width: 100%;
display: flex;
+}
- @media (hover: hover) {
- &:hover {
- background-color: var(--color-gray-100);
- }
- }
+.canon-FieldLabel {
+ font-size: var(--canon-font-size-2);
+ font-weight: var(--canon-font-weight-regular);
+ color: var(--canon-fg-primary);
+ margin-bottom: var(--canon-space-1_5);
+}
- &:active, &[data-popup-open] {
- background-color: var(--color-gray-100);
- }
+.canon-FieldDescription {
+ font-size: var(--canon-font-size-2);
+ font-weight: var(--canon-font-weight-regular);
+ color: var(--canon-fg-secondary);
+ padding-top: var(--canon-space-1_5);
+ margin: 0;
+}
- &:focus-visible {
- outline: 2px solid var(--color-blue);
- outline-offset: -1px;
- }
+.canon-FieldError {
+ font-size: var(--canon-font-size-2);
+ font-weight: var(--canon-font-weight-regular);
+ color: var(--canon-fg-danger);
+ padding-top: var(--canon-space-1_5);
+ margin: 0;
+}
+
+.canon-FieldValidity {
+ font-size: var(--canon-font-size-2);
+ font-weight: var(--canon-font-weight-regular);
+ color: var(--canon-fg-secondary);
+ padding-top: var(--canon-space-1_5);
+ margin: 0;
}
.canon-MenuPositioner {
@@ -9721,60 +9692,45 @@
}
.canon-MenuPopup {
- box-sizing: border-box;
- background-color: var(--canon-bg-elevated);
- color: var(--color-fg-primary);
+ padding: var(--canon-space-2);
+ background-color: var(--canon-bg-surface-1);
+ border: 1px solid var(--canon-border);
+ color: var(--canon-fg-primary);
transform-origin: var(--transform-origin);
border-radius: .375rem;
- padding-block: .25rem;
+ outline: none;
+ max-width: 340px;
transition: transform .15s, opacity .15s;
+ overflow: hidden;
&[data-starting-style], &[data-ending-style] {
opacity: 0;
transform: scale(.9);
}
-
- @media (prefers-color-scheme: light) {
- & {
- outline: 1px solid var(--color-gray-200);
- box-shadow: 0px 10px 15px -3px var(--color-gray-200), 0px 4px 6px -4px var(--color-gray-200);
- }
- }
-
- @media (prefers-color-scheme: dark) {
- & {
- outline: 1px solid var(--color-gray-300);
- outline-offset: -1px;
- }
- }
}
.canon-MenuItem {
cursor: default;
user-select: none;
- padding-block: .5rem;
+ gap: var(--canon-space-2);
+ color: var(--canon-fg-primary);
+ border-radius: var(--canon-radius-2);
+ padding: var(--canon-space-2) var(--canon-space-2);
+ padding-right: var(--canon-space-4);
+ cursor: pointer;
outline: 0;
- padding-left: 1rem;
- padding-right: 2rem;
- font-size: .875rem;
- line-height: 1rem;
+ text-decoration: none;
display: flex;
+ &:last-child {
+ border-bottom: none;
+ }
+
&[data-highlighted] {
z-index: 0;
- color: var(--color-gray-50);
+ background-color: var(--canon-bg-tint-hover);
position: relative;
}
-
- &[data-highlighted]:before {
- content: "";
- z-index: -1;
- background-color: var(--color-gray-900);
- border-radius: .25rem;
- position: absolute;
- inset-block: 0;
- inset-inline: .25rem;
- }
}
.canon-MenuSeparator {
diff --git a/packages/canon/package.json b/packages/canon/package.json
index 5227e63fa5..b0aa479f25 100644
--- a/packages/canon/package.json
+++ b/packages/canon/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/canon",
- "version": "0.2.0",
+ "version": "0.2.1-next.0",
"backstage": {
"role": "web-library"
},
@@ -36,7 +36,7 @@
"lint": "backstage-cli package lint",
"prepack": "backstage-cli package prepack",
"postpack": "backstage-cli package postpack",
- "start": "yarn build:css:watch && yarn storybook",
+ "start": "concurrently \"yarn build:css:watch\" \"yarn storybook\"",
"storybook": "storybook dev -p 6006",
"test": "backstage-cli package test"
},
@@ -47,15 +47,15 @@
},
"devDependencies": {
"@backstage/cli": "workspace:^",
- "@storybook/addon-essentials": "^8.6.4",
- "@storybook/addon-interactions": "^8.6.4",
+ "@storybook/addon-essentials": "^8.6.8",
+ "@storybook/addon-interactions": "^8.6.8",
"@storybook/addon-styling-webpack": "^1.0.1",
- "@storybook/addon-themes": "^8.6.4",
- "@storybook/addon-webpack5-compiler-swc": "^2.1.0",
- "@storybook/blocks": "^8.6.4",
- "@storybook/react": "^8.6.4",
- "@storybook/react-webpack5": "^8.6.4",
- "@storybook/test": "^8.6.4",
+ "@storybook/addon-themes": "^8.6.8",
+ "@storybook/addon-webpack5-compiler-swc": "^3.0.0",
+ "@storybook/blocks": "^8.6.8",
+ "@storybook/react": "^8.6.8",
+ "@storybook/react-webpack5": "^8.6.8",
+ "@storybook/test": "^8.6.8",
"@testing-library/jest-dom": "^6.0.0",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
@@ -68,7 +68,7 @@
"react": "^18.0.2",
"react-dom": "^18.0.2",
"react-router-dom": "^6.3.0",
- "storybook": "^8.6.4"
+ "storybook": "^8.6.8"
},
"peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0",
diff --git a/packages/canon/report.api.md b/packages/canon/report.api.md
index 600e4ba878..74c014fb12 100644
--- a/packages/canon/report.api.md
+++ b/packages/canon/report.api.md
@@ -11,6 +11,7 @@ import { default as React_2 } from 'react';
import * as React_3 from 'react';
import { ReactNode } from 'react';
import { RefAttributes } from 'react';
+import type { RemixiconComponentType } from '@remixicon/react';
import { ScrollArea as ScrollArea_2 } from '@base-ui-components/react/scroll-area';
import { Tooltip as Tooltip_2 } from '@base-ui-components/react/tooltip';
@@ -604,7 +605,7 @@ export interface IconContextProps {
}
// @public (undocumented)
-export type IconMap = Partial>;
+export type IconMap = Partial>;
// @public (undocumented)
export type IconNames =
@@ -679,7 +680,7 @@ export interface IconProviderProps {
// (undocumented)
children?: ReactNode;
// (undocumented)
- overrides?: Partial>;
+ overrides?: Partial>;
}
// @public (undocumented)
diff --git a/packages/canon/src/components/Flex/Flex.stories.tsx b/packages/canon/src/components/Flex/Flex.stories.tsx
index 3b7a7a07c5..58f96ce157 100644
--- a/packages/canon/src/components/Flex/Flex.stories.tsx
+++ b/packages/canon/src/components/Flex/Flex.stories.tsx
@@ -61,21 +61,33 @@ const DecorativeBox = () => {
export const Default: Story = {
args: {
- children: [, , ],
+ children: (
+ <>
+ , ,
+ >
+ ),
},
};
export const ColumnDirection: Story = {
args: {
direction: 'column',
- children: [, , ],
+ children: (
+ <>
+ , ,
+ >
+ ),
},
};
export const RowDirection: Story = {
args: {
direction: 'row',
- children: [, , ],
+ children: (
+ <>
+ , ,
+ >
+ ),
},
};
diff --git a/packages/canon/src/components/Heading/Heading.stories.tsx b/packages/canon/src/components/Heading/Heading.stories.tsx
index 1357bde877..d568bcaf7f 100644
--- a/packages/canon/src/components/Heading/Heading.stories.tsx
+++ b/packages/canon/src/components/Heading/Heading.stories.tsx
@@ -18,7 +18,6 @@ import React from 'react';
import type { Meta, StoryObj } from '@storybook/react';
import { Heading } from './Heading';
import { Flex } from '../Flex';
-import { Text } from '../Text';
const meta = {
title: 'Components/Heading',
@@ -42,7 +41,7 @@ export const Title1: Story = {
export const AllVariants: Story = {
render: () => (
-
+
Display
Title 1
Title 2
@@ -68,10 +67,22 @@ export const CustomTag: Story = {
},
};
+export const WrappedInLink: Story = {
+ args: {
+ ...Default.args,
+ },
+ decorators: [
+ Story => (
+
+
+
+ ),
+ ],
+};
+
export const Playground: Story = {
render: () => (
-
- All variants
+
Display
Title 1
Title 2
diff --git a/packages/canon/src/components/Icon/icons.ts b/packages/canon/src/components/Icon/icons.ts
index 8cc862459c..615c918db7 100644
--- a/packages/canon/src/components/Icon/icons.ts
+++ b/packages/canon/src/components/Icon/icons.ts
@@ -130,4 +130,4 @@ export const icons: IconMap = {
youtube: RiYoutubeLine,
'zoom-in': RiZoomInLine,
'zoom-out': RiZoomOutLine,
-};
+} as const;
diff --git a/packages/canon/src/components/Icon/types.ts b/packages/canon/src/components/Icon/types.ts
index 5cbdb8e147..4870a1afc4 100644
--- a/packages/canon/src/components/Icon/types.ts
+++ b/packages/canon/src/components/Icon/types.ts
@@ -15,6 +15,7 @@
*/
import { ReactNode } from 'react';
+import type { RemixiconComponentType } from '@remixicon/react';
/** @public */
export type IconNames =
@@ -74,7 +75,7 @@ export type IconNames =
| 'zoom-out';
/** @public */
-export type IconMap = Partial>;
+export type IconMap = Partial>;
/** @public */
export type IconProps = {
@@ -92,5 +93,5 @@ export interface IconContextProps {
/** @public */
export interface IconProviderProps {
children?: ReactNode;
- overrides?: Partial>;
+ overrides?: Partial>;
}
diff --git a/packages/canon/src/components/Menu/Menu.stories.tsx b/packages/canon/src/components/Menu/Menu.stories.tsx
index c971483b16..58284052af 100644
--- a/packages/canon/src/components/Menu/Menu.stories.tsx
+++ b/packages/canon/src/components/Menu/Menu.stories.tsx
@@ -17,6 +17,7 @@
import React from 'react';
import type { Meta, StoryObj } from '@storybook/react';
import { Menu } from './Menu';
+import { Button } from '../Button';
const meta = {
title: 'Components/Menu',
@@ -30,9 +31,15 @@ export const Default: Story = {
args: {
children: (
<>
- Menu
+ (
+
+ )}
+ />
-
+
Item 1
Item 2
@@ -44,3 +51,10 @@ export const Default: Story = {
),
},
};
+
+export const Open: Story = {
+ args: {
+ ...Default.args,
+ open: true,
+ },
+};
diff --git a/packages/canon/src/components/Menu/Menu.styles.css b/packages/canon/src/components/Menu/Menu.styles.css
index 4f76e5552f..403d34294e 100644
--- a/packages/canon/src/components/Menu/Menu.styles.css
+++ b/packages/canon/src/components/Menu/Menu.styles.css
@@ -1,54 +1,17 @@
-.canon-MenuTrigger {
- box-sizing: border-box;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 0.375rem;
- height: 2.5rem;
- padding: 0 0.875rem;
- margin: 0;
- outline: 0;
- border: 1px solid var(--color-gray-200);
- border-radius: 0.375rem;
- background-color: var(--color-gray-50);
- font-family: inherit;
- font-size: 1rem;
- font-weight: 500;
- line-height: 1.5rem;
- color: var(--color-gray-900);
- user-select: none;
-
- @media (hover: hover) {
- &:hover {
- background-color: var(--color-gray-100);
- }
- }
-
- &:active {
- background-color: var(--color-gray-100);
- }
-
- &[data-popup-open] {
- background-color: var(--color-gray-100);
- }
-
- &:focus-visible {
- outline: 2px solid var(--color-blue);
- outline-offset: -1px;
- }
-}
-
.canon-MenuPositioner {
outline: 0;
}
.canon-MenuPopup {
- box-sizing: border-box;
- padding-block: 0.25rem;
+ padding: var(--canon-space-2);
border-radius: 0.375rem;
- background-color: var(--canon-bg-elevated);
- color: var(--color-fg-primary);
+ background-color: var(--canon-bg-surface-1);
+ border: 1px solid var(--canon-border);
+ color: var(--canon-fg-primary);
+ outline: none;
+ overflow: hidden;
transform-origin: var(--transform-origin);
+ max-width: 340px;
transition: transform 150ms, opacity 150ms;
&[data-starting-style],
@@ -56,44 +19,29 @@
opacity: 0;
transform: scale(0.9);
}
-
- @media (prefers-color-scheme: light) {
- outline: 1px solid var(--color-gray-200);
- box-shadow: 0px 10px 15px -3px var(--color-gray-200),
- 0px 4px 6px -4px var(--color-gray-200);
- }
-
- @media (prefers-color-scheme: dark) {
- outline: 1px solid var(--color-gray-300);
- outline-offset: -1px;
- }
}
.canon-MenuItem {
outline: 0;
cursor: default;
user-select: none;
- padding-block: 0.5rem;
- padding-left: 1rem;
- padding-right: 2rem;
display: flex;
- font-size: 0.875rem;
- line-height: 1rem;
+ gap: var(--canon-space-2);
+ color: var(--canon-fg-primary);
+ text-decoration: none;
+ border-radius: var(--canon-radius-2);
+ padding: var(--canon-space-2) var(--canon-space-2);
+ padding-right: var(--canon-space-4);
+ cursor: pointer;
+
+ &:last-child {
+ border-bottom: none;
+ }
&[data-highlighted] {
z-index: 0;
position: relative;
- color: var(--color-gray-50);
- }
-
- &[data-highlighted]::before {
- content: '';
- z-index: -1;
- position: absolute;
- inset-block: 0;
- inset-inline: 0.25rem;
- border-radius: 0.25rem;
- background-color: var(--color-gray-900);
+ background-color: var(--canon-bg-tint-hover);
}
}
diff --git a/packages/canon/src/components/Text/Text.stories.tsx b/packages/canon/src/components/Text/Text.stories.tsx
index 9cf2a73f6e..ab904f524c 100644
--- a/packages/canon/src/components/Text/Text.stories.tsx
+++ b/packages/canon/src/components/Text/Text.stories.tsx
@@ -89,6 +89,19 @@ export const Responsive: Story = {
},
};
+export const WrappedInLink: Story = {
+ args: {
+ ...Default.args,
+ },
+ decorators: [
+ Story => (
+
+
+
+ ),
+ ],
+};
+
export const Playground: Story = {
render: () => (
diff --git a/packages/canon/src/css/core.css b/packages/canon/src/css/core.css
index 8efb066b70..d0686e94f7 100644
--- a/packages/canon/src/css/core.css
+++ b/packages/canon/src/css/core.css
@@ -18,8 +18,13 @@
@import './normalize.css';
@import './utilities.css';
-/* Light theme tokens */
+/* Global reset */
+:where(a) {
+ color: inherit;
+ text-decoration: none;
+}
+/* Light theme tokens */
:root {
/* Font families */
--canon-font-regular: system-ui;
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 0a4c7f2e77..6fb3d27120 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/cli
+## 0.32.0-next.0
+
+### Minor Changes
+
+- c7254ae: Internal update to move the `clean`, `pre/postpack` and `fix` commands into their own separate module.
+
+### Patch Changes
+
+- 4ea76f7: Bump @module-federation/enhanced ^0.9.0 to fix GHSA-593f-38f6-jp5m
+- 87a5cb4: Fixed an issue causing the `repo lint` command to fail when the `--max-warnings` option was used.
+- d83f3f4: Resolved a problem where the `start` command did not correctly handle multiple `--require` flags, ensuring all specified modules are now properly loaded.
+- Updated dependencies
+ - @backstage/catalog-model@1.7.3
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.13
+ - @backstage/config@1.3.2
+ - @backstage/config-loader@1.10.0
+ - @backstage/errors@1.2.7
+ - @backstage/eslint-plugin@0.1.10
+ - @backstage/integration@1.16.2
+ - @backstage/release-manifests@0.0.12
+ - @backstage/types@1.2.1
+
## 0.31.0
### Minor Changes
diff --git a/packages/cli/package.json b/packages/cli/package.json
index f5bd1a02af..aeb6eb47c3 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli",
- "version": "0.31.0",
+ "version": "0.32.0-next.0",
"description": "CLI for developing Backstage plugins and apps",
"backstage": {
"role": "cli"
@@ -58,7 +58,7 @@
"@backstage/release-manifests": "workspace:^",
"@backstage/types": "workspace:^",
"@manypkg/get-packages": "^1.1.3",
- "@module-federation/enhanced": "^0.8.0",
+ "@module-federation/enhanced": "^0.9.0",
"@octokit/graphql": "^5.0.0",
"@octokit/graphql-schema": "^13.7.0",
"@octokit/oauth-app": "^4.2.0",
diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md
index 4884e0a184..8d425843d4 100644
--- a/packages/core-compat-api/CHANGELOG.md
+++ b/packages/core-compat-api/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/core-compat-api
+## 0.4.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/version-bridge@1.0.11
+
## 0.4.0
### Minor Changes
diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json
index eb1fd98ccc..d512c66c18 100644
--- a/packages/core-compat-api/package.json
+++ b/packages/core-compat-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-compat-api",
- "version": "0.4.0",
+ "version": "0.4.1-next.0",
"backstage": {
"role": "web-library"
},
diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md
index 375b0bde56..bed7ee413f 100644
--- a/packages/create-app/CHANGELOG.md
+++ b/packages/create-app/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/create-app
+## 0.6.1-next.0
+
+### Patch Changes
+
+- Bumped create-app version.
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
## 0.6.0
### Minor Changes
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index 0d9fb381a3..fdf01776d8 100644
--- a/packages/create-app/package.json
+++ b/packages/create-app/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/create-app",
- "version": "0.6.0",
+ "version": "0.6.1-next.0",
"description": "A CLI that helps you create your own Backstage app",
"backstage": {
"role": "cli"
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index 82330fd76c..21e4401525 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,5 +1,19 @@
# @backstage/dev-utils
+## 1.1.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/app-defaults@1.6.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/integration-react@1.2.5
+ - @backstage/theme@0.6.4
+
## 1.1.8
### Patch Changes
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index 0bd88f0a26..f026fba9a1 100644
--- a/packages/dev-utils/package.json
+++ b/packages/dev-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/dev-utils",
- "version": "1.1.8",
+ "version": "1.1.9-next.0",
"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 423070e648..014ea8e321 100644
--- a/packages/e2e-test/CHANGELOG.md
+++ b/packages/e2e-test/CHANGELOG.md
@@ -1,5 +1,14 @@
# e2e-test
+## 0.2.27-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.6.1-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.7
+
## 0.2.26
### Patch Changes
diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json
index f76a5770d3..ae5ed05af8 100644
--- a/packages/e2e-test/package.json
+++ b/packages/e2e-test/package.json
@@ -1,6 +1,6 @@
{
"name": "e2e-test",
- "version": "0.2.26",
+ "version": "0.2.27-next.0",
"description": "E2E test for verifying Backstage packages",
"backstage": {
"role": "cli"
diff --git a/packages/integration-react/src/api/ScmAuth.test.ts b/packages/integration-react/src/api/ScmAuth.test.ts
index d252b95b85..5872354d79 100644
--- a/packages/integration-react/src/api/ScmAuth.test.ts
+++ b/packages/integration-react/src/api/ScmAuth.test.ts
@@ -129,7 +129,7 @@ describe('ScmAuth', () => {
await expect(
bitbucketAuth.getCredentials({ url: 'http://example.com' }),
).resolves.toMatchObject({
- token: 'account team pullrequest snippet issue',
+ token: 'account team pullrequest snippet issue project',
});
await expect(
bitbucketAuth.getCredentials({
@@ -138,7 +138,7 @@ describe('ScmAuth', () => {
}),
).resolves.toMatchObject({
token:
- 'account team pullrequest snippet issue pullrequest:write snippet:write issue:write',
+ 'account team pullrequest snippet issue project pullrequest:write snippet:write issue:write',
});
});
@@ -195,7 +195,8 @@ describe('ScmAuth', () => {
},
}),
).resolves.toMatchObject({
- token: 'account team pullrequest snippet issue snippet:write issue:write',
+ token:
+ 'account team pullrequest snippet issue project snippet:write issue:write',
});
});
diff --git a/packages/integration-react/src/api/ScmAuth.ts b/packages/integration-react/src/api/ScmAuth.ts
index ff3e8c098d..011422d4cf 100644
--- a/packages/integration-react/src/api/ScmAuth.ts
+++ b/packages/integration-react/src/api/ScmAuth.ts
@@ -239,6 +239,7 @@ export class ScmAuth implements ScmAuthApi {
'pullrequest',
'snippet',
'issue',
+ 'project',
];
const repoWriteScopes = options?.scopeMapping?.repoWrite ?? [
'pullrequest:write',
diff --git a/packages/integration/config.d.ts b/packages/integration/config.d.ts
index bd5267ab3d..8205e0c71e 100644
--- a/packages/integration/config.d.ts
+++ b/packages/integration/config.d.ts
@@ -239,7 +239,7 @@ export interface Config {
* The secret used for webhooks
* @visibility secret
*/
- webhookSecret: string;
+ webhookSecret?: string;
/**
* The client ID to use
*/
diff --git a/packages/integration/report.api.md b/packages/integration/report.api.md
index c85db9306b..fc38853029 100644
--- a/packages/integration/report.api.md
+++ b/packages/integration/report.api.md
@@ -647,7 +647,7 @@ export type GiteaIntegrationConfig = {
export type GithubAppConfig = {
appId: number;
privateKey: string;
- webhookSecret: string;
+ webhookSecret?: string;
clientId: string;
clientSecret: string;
allowedInstallationOwners?: string[];
diff --git a/packages/integration/src/github/config.ts b/packages/integration/src/github/config.ts
index 1ff4779be2..74a0267d62 100644
--- a/packages/integration/src/github/config.ts
+++ b/packages/integration/src/github/config.ts
@@ -92,7 +92,7 @@ export type GithubAppConfig = {
/**
* Webhook secret can be configured at https://github.com/organizations/$org/settings/apps/$AppName
*/
- webhookSecret: string;
+ webhookSecret?: string;
/**
* Found at https://github.com/organizations/$org/settings/apps/$AppName
*/
@@ -128,7 +128,7 @@ export function readGithubIntegrationConfig(
appId: c.getNumber('appId'),
clientId: c.getString('clientId'),
clientSecret: c.getString('clientSecret'),
- webhookSecret: c.getString('webhookSecret'),
+ webhookSecret: c.getOptionalString('webhookSecret'),
privateKey: c.getString('privateKey'),
allowedInstallationOwners: c.getOptionalStringArray(
'allowedInstallationOwners',
diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md
index 2339472b24..b8378e4996 100644
--- a/packages/scaffolder-internal/CHANGELOG.md
+++ b/packages/scaffolder-internal/CHANGELOG.md
@@ -1,5 +1,13 @@
# @internal/scaffolder
+## 0.0.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-react@1.15.0-next.0
+ - @backstage/frontend-plugin-api@0.10.0
+
## 0.0.7
### Patch Changes
diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json
index f57a049022..20d6a7ef72 100644
--- a/packages/scaffolder-internal/package.json
+++ b/packages/scaffolder-internal/package.json
@@ -1,6 +1,6 @@
{
"name": "@internal/scaffolder",
- "version": "0.0.7",
+ "version": "0.0.8-next.0",
"backstage": {
"role": "web-library",
"inline": true
diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md
index 571d1e31a9..0057a5ddcb 100644
--- a/packages/techdocs-cli-embedded-app/CHANGELOG.md
+++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md
@@ -1,5 +1,24 @@
# techdocs-cli-embedded-app
+## 0.2.107-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/cli@0.32.0-next.0
+ - @backstage/plugin-techdocs@1.12.5-next.0
+ - @backstage/app-defaults@1.6.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/integration-react@1.2.5
+ - @backstage/test-utils@1.7.6
+ - @backstage/theme@0.6.4
+ - @backstage/plugin-techdocs-react@1.2.15
+
## 0.2.106
### Patch Changes
diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json
index 971746e720..bcd30c4a00 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.106",
+ "version": "0.2.107-next.0",
"backstage": {
"role": "frontend"
},
diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md
index 99ebf4f87f..cf0e24c487 100644
--- a/packages/techdocs-cli/CHANGELOG.md
+++ b/packages/techdocs-cli/CHANGELOG.md
@@ -1,5 +1,16 @@
# @techdocs/cli
+## 1.9.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-techdocs-node@1.13.2-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.2
+
## 1.9.1
### Patch Changes
diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json
index 683c73ff3f..febbe38922 100644
--- a/packages/techdocs-cli/package.json
+++ b/packages/techdocs-cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@techdocs/cli",
- "version": "1.9.1",
+ "version": "1.9.2-next.0",
"description": "Utility CLI for managing TechDocs sites in Backstage.",
"backstage": {
"role": "cli"
diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md
index 176f63364f..a30cc08a1d 100644
--- a/plugins/api-docs/CHANGELOG.md
+++ b/plugins/api-docs/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-api-docs
+## 0.12.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-permission-react@0.4.32
+
## 0.12.5
### Patch Changes
diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json
index 1fcdf205b2..5df57448b2 100644
--- a/plugins/api-docs/package.json
+++ b/plugins/api-docs/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-api-docs",
- "version": "0.12.5",
+ "version": "0.12.6-next.0",
"description": "A Backstage plugin that helps represent API entities in the frontend",
"backstage": {
"role": "frontend-plugin",
diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md
index 858ba95b83..cbd6118a9c 100644
--- a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-auth-backend-module-aws-alb-provider
+## 0.4.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend@0.24.5-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/errors@1.2.7
+
## 0.4.1
### Patch Changes
diff --git a/plugins/auth-backend-module-aws-alb-provider/package.json b/plugins/auth-backend-module-aws-alb-provider/package.json
index cafbc0b5c1..c56cd0e2c9 100644
--- a/plugins/auth-backend-module-aws-alb-provider/package.json
+++ b/plugins/auth-backend-module-aws-alb-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-aws-alb-provider",
- "version": "0.4.1",
+ "version": "0.4.2-next.0",
"description": "The aws-alb provider module for the Backstage auth backend.",
"backstage": {
"role": "backend-plugin-module",
diff --git a/plugins/auth-backend-module-bitbucket-provider/src/authenticator.ts b/plugins/auth-backend-module-bitbucket-provider/src/authenticator.ts
index a2d8275964..e07d9caf98 100644
--- a/plugins/auth-backend-module-bitbucket-provider/src/authenticator.ts
+++ b/plugins/auth-backend-module-bitbucket-provider/src/authenticator.ts
@@ -28,6 +28,7 @@ export const bitbucketAuthenticator = createOAuthAuthenticator({
PassportOAuthAuthenticatorHelper.defaultProfileTransform,
scopes: {
required: ['account'],
+ persist: true,
},
initialize({ callbackUrl, config }) {
const clientID = config.getString('clientId');
diff --git a/plugins/auth-backend-module-bitbucket-provider/src/module.test.ts b/plugins/auth-backend-module-bitbucket-provider/src/module.test.ts
index f1426d1b0d..6dddfb1d63 100644
--- a/plugins/auth-backend-module-bitbucket-provider/src/module.test.ts
+++ b/plugins/auth-backend-module-bitbucket-provider/src/module.test.ts
@@ -73,6 +73,7 @@ describe('authModuleBitbucketProvider', () => {
expect(decodeOAuthState(startUrl.searchParams.get('state')!)).toEqual({
env: 'development',
nonce: decodeURIComponent(nonceCookie.value),
+ scope: 'account',
});
});
});
diff --git a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md
index 0441c68756..9864be61f9 100644
--- a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md
+++ b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md
@@ -1,5 +1,30 @@
# @backstage/plugin-auth-backend-module-oidc-provider
+## 0.4.2-next.0
+
+### Patch Changes
+
+- 7495edf: Added custom timeout setting for oidc provider
+
+ Here is an example of how to use a custom timeout with the configuration:
+
+ ```yaml
+ auth:
+ oidc:
+ production:
+ clientId: ${AUTH_GOOGLE_CLIENT_ID}
+ clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET}
+ timeout:
+ seconds: 30
+ ```
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend@0.24.5-next.0
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/types@1.2.1
+
## 0.4.1
### Patch Changes
diff --git a/plugins/auth-backend-module-oidc-provider/config.d.ts b/plugins/auth-backend-module-oidc-provider/config.d.ts
index 409c658c23..8a1df804e6 100644
--- a/plugins/auth-backend-module-oidc-provider/config.d.ts
+++ b/plugins/auth-backend-module-oidc-provider/config.d.ts
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
import { HumanDuration } from '@backstage/types';
export interface Config {
@@ -33,6 +32,7 @@ export interface Config {
tokenSignedResponseAlg?: string;
additionalScopes?: string | string[];
prompt?: string;
+ timeout?: HumanDuration | string;
signIn?: {
resolvers: Array<
| {
diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json
index e163ee8d47..0e212409fa 100644
--- a/plugins/auth-backend-module-oidc-provider/package.json
+++ b/plugins/auth-backend-module-oidc-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend-module-oidc-provider",
- "version": "0.4.1",
+ "version": "0.4.2-next.0",
"description": "The oidc-provider backend module for the auth plugin.",
"backstage": {
"role": "backend-plugin-module",
@@ -35,8 +35,10 @@
},
"dependencies": {
"@backstage/backend-plugin-api": "workspace:^",
+ "@backstage/config": "workspace:^",
"@backstage/plugin-auth-backend": "workspace:^",
"@backstage/plugin-auth-node": "workspace:^",
+ "@backstage/types": "workspace:^",
"express": "^4.18.2",
"openid-client": "^5.5.0",
"passport": "^0.7.0"
diff --git a/plugins/auth-backend-module-oidc-provider/src/authenticator.test.ts b/plugins/auth-backend-module-oidc-provider/src/authenticator.test.ts
index 38e134bcd0..c327d4ecc5 100644
--- a/plugins/auth-backend-module-oidc-provider/src/authenticator.test.ts
+++ b/plugins/auth-backend-module-oidc-provider/src/authenticator.test.ts
@@ -28,6 +28,7 @@ import { ConfigReader } from '@backstage/config';
import { JWK, SignJWT, exportJWK, generateKeyPair } from 'jose';
import { rest } from 'msw';
import express from 'express';
+import { custom } from 'openid-client';
describe('oidcAuthenticator', () => {
let implementation: any;
@@ -169,6 +170,77 @@ describe('oidcAuthenticator', () => {
jest.clearAllMocks();
});
+ describe('timeout configuration', () => {
+ const TEST_URL = new URL('https://test.com');
+
+ it('should use default timeout when no timeout is configured', async () => {
+ const { promise } = oidcAuthenticator.initialize({
+ callbackUrl: 'https://backstage.test/callback',
+ config: new ConfigReader({
+ metadataUrl: 'https://oidc.test/.well-known/openid-configuration',
+ clientId: 'clientId',
+ clientSecret: 'clientSecret',
+ }),
+ });
+ const { client } = await promise;
+
+ const timeout = client[custom.http_options](TEST_URL, {}).timeout;
+
+ // Check if the HTTP timeout is set to the default value
+ expect(timeout).toBeDefined();
+ expect(timeout).toBe(10000);
+ });
+
+ it('should use configured timeout when provided in the config', async () => {
+ const { promise } = oidcAuthenticator.initialize({
+ callbackUrl: 'https://backstage.test/callback',
+ config: new ConfigReader({
+ metadataUrl: 'https://oidc.test/.well-known/openid-configuration',
+ clientId: 'clientId',
+ clientSecret: 'clientSecret',
+ timeout: {
+ seconds: 30,
+ },
+ }),
+ });
+ const { client } = await promise;
+
+ const timeout = client[custom.http_options](TEST_URL, {}).timeout;
+
+ // Check if the HTTP timeout is set to the configured value (30 seconds)
+ expect(timeout).toBeDefined();
+ expect(timeout).toBe(30000);
+ });
+
+ it('should handle invalid timeout configuration gracefully', async () => {
+ expect(() => {
+ oidcAuthenticator.initialize({
+ callbackUrl: 'https://backstage.test/callback',
+ config: new ConfigReader({
+ metadataUrl: 'https://oidc.test/.well-known/openid-configuration',
+ clientId: 'clientId',
+ clientSecret: 'clientSecret',
+ timeout: 123, // Invalid: should be a duration object
+ }),
+ });
+ }).toThrow();
+
+ expect(() => {
+ oidcAuthenticator.initialize({
+ callbackUrl: 'https://backstage.test/callback',
+ config: new ConfigReader({
+ metadataUrl: 'https://oidc.test/.well-known/openid-configuration',
+ clientId: 'clientId',
+ clientSecret: 'clientSecret',
+ timeout: {
+ invalid: 'value',
+ },
+ }),
+ });
+ }).toThrow();
+ });
+ });
+
describe('#start', () => {
let fakeSession: Record;
let startRequest: OAuthAuthenticatorStartInput;
diff --git a/plugins/auth-backend-module-oidc-provider/src/authenticator.ts b/plugins/auth-backend-module-oidc-provider/src/authenticator.ts
index c396ea7034..6e7022f7cf 100644
--- a/plugins/auth-backend-module-oidc-provider/src/authenticator.ts
+++ b/plugins/auth-backend-module-oidc-provider/src/authenticator.ts
@@ -32,14 +32,18 @@ import {
PassportOAuthAuthenticatorHelper,
PassportOAuthPrivateInfo,
} from '@backstage/plugin-auth-node';
+import { durationToMilliseconds } from '@backstage/types';
+import { readDurationFromConfig } from '@backstage/config';
const HTTP_OPTION_TIMEOUT = 10000;
-const httpOptionsProvider: CustomHttpOptionsProvider = (_url, options) => {
- return {
- ...options,
- timeout: HTTP_OPTION_TIMEOUT,
+const createHttpOptionsProvider =
+ ({ timeout }: { timeout?: number }): CustomHttpOptionsProvider =>
+ (_url, options) => {
+ return {
+ ...options,
+ timeout: timeout ?? HTTP_OPTION_TIMEOUT,
+ };
};
-};
/**
* authentication result for the OIDC which includes the token set and user
@@ -85,6 +89,15 @@ export const oidcAuthenticator = createOAuthAuthenticator({
);
}
+ const timeoutMilliseconds = config.has('timeout')
+ ? durationToMilliseconds(
+ readDurationFromConfig(config, { key: 'timeout' }),
+ )
+ : undefined;
+ const httpOptionsProvider = createHttpOptionsProvider({
+ timeout: timeoutMilliseconds,
+ });
+
Issuer[custom.http_options] = httpOptionsProvider;
const promise = Issuer.discover(metadataUrl).then(issuer => {
issuer[custom.http_options] = httpOptionsProvider;
diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md
index 73cc1effcb..22df305701 100644
--- a/plugins/auth-backend/CHANGELOG.md
+++ b/plugins/auth-backend/CHANGELOG.md
@@ -1,5 +1,36 @@
# @backstage/plugin-auth-backend
+## 0.24.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-backend-module-oidc-provider@0.4.2-next.0
+ - @backstage/plugin-auth-backend-module-atlassian-provider@0.4.1
+ - @backstage/plugin-auth-backend-module-auth0-provider@0.2.1
+ - @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.1
+ - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.1
+ - @backstage/plugin-auth-backend-module-github-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-gitlab-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-microsoft-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-oauth2-provider@0.4.1
+ - @backstage/plugin-auth-backend-module-okta-provider@0.2.1
+ - @backstage/plugin-auth-backend-module-onelogin-provider@0.3.1
+ - @backstage/plugin-auth-node@0.6.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.2-next.0
+ - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.6
+ - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.1
+ - @backstage/plugin-auth-backend-module-google-provider@0.3.1
+ - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.6
+ - @backstage/plugin-catalog-node@1.16.1
+
## 0.24.4
### Patch Changes
diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json
index 2173e8a3e1..1dabc3b306 100644
--- a/plugins/auth-backend/package.json
+++ b/plugins/auth-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-auth-backend",
- "version": "0.24.4",
+ "version": "0.24.5-next.0",
"description": "A Backstage backend plugin that handles authentication",
"backstage": {
"role": "backend-plugin",
diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md
index ea21282077..a80f3cded4 100644
--- a/plugins/catalog-backend-module-aws/CHANGELOG.md
+++ b/plugins/catalog-backend-module-aws/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-catalog-backend-module-aws
+## 0.4.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/integration-aws-node@0.1.15
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-kubernetes-common@0.9.4
+
## 0.4.9
### Patch Changes
diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json
index dfaa2ff914..1f7ce93c97 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.4.9",
+ "version": "0.4.10-next.0",
"description": "A Backstage catalog backend module that helps integrate towards AWS",
"backstage": {
"role": "backend-plugin-module",
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts
index 489578e853..5b2f9992c9 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.test.ts
@@ -542,31 +542,11 @@ describe('BitbucketCloudEntityProvider', () => {
})[0];
server.use(
- rest.get(
- `https://api.bitbucket.org/2.0/workspaces/test-ws/projects`,
- (_req, res, ctx) => {
- const response = {
- values: [
- {
- key: 'TEST',
- },
- {
- key: 'TEST2',
- },
- ],
- };
- return res(ctx.json(response));
- },
- ),
rest.get(
`https://api.bitbucket.org/2.0/workspaces/test-ws/search/code`,
(req, res, ctx) => {
const query = req.url.searchParams.get('search_query');
- if (
- !query ||
- !query.includes('repo:test-repo') ||
- !query.includes('project:TEST')
- ) {
+ if (!query || !query.includes('repo:test-repo')) {
return res(ctx.json({ values: [] }));
}
@@ -643,10 +623,6 @@ describe('BitbucketCloudEntityProvider', () => {
entity: addedModule,
locationKey: 'bitbucketCloud-provider:myProvider',
},
- {
- entity: addedModule,
- locationKey: 'bitbucketCloud-provider:myProvider',
- },
];
const removedEntities = [
{
diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts
index e4ba2f2dc0..5beb98ac08 100644
--- a/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts
+++ b/plugins/catalog-backend-module-bitbucket-cloud/src/providers/BitbucketCloudEntityProvider.ts
@@ -326,6 +326,8 @@ export class BitbucketCloudEntityProvider implements EntityProvider {
const optRepoFilter = repoSlug ? ` repo:${repoSlug}` : '';
const query = `"${catalogFilename}" path:${catalogPath}${optRepoFilter}`;
+ if (repoSlug) return this.processQuery(workspace, query);
+
const projects = this.client
.listProjectsByWorkspace(workspace)
.iterateResults();
diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md
index d0647ba4e1..5e07707e42 100644
--- a/plugins/catalog-backend-module-github-org/CHANGELOG.md
+++ b/plugins/catalog-backend-module-github-org/CHANGELOG.md
@@ -1,5 +1,16 @@
# @backstage/plugin-catalog-backend-module-github-org
+## 0.3.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend-module-github@0.7.12-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+
## 0.3.8
### Patch Changes
diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json
index cb68676e62..f8b9f94205 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.3.8",
+ "version": "0.3.9-next.0",
"description": "The github-org backend module for the catalog plugin.",
"backstage": {
"role": "backend-plugin-module",
diff --git a/plugins/catalog-backend-module-github/CHANGELOG.md b/plugins/catalog-backend-module-github/CHANGELOG.md
index 629a5bfe94..3fb473203a 100644
--- a/plugins/catalog-backend-module-github/CHANGELOG.md
+++ b/plugins/catalog-backend-module-github/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-catalog-backend-module-github
+## 0.7.12-next.0
+
+### Patch Changes
+
+- 16648ef: Added `validateLocationsExist` to the config definition where it was missing.
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+
## 0.7.11
### Patch Changes
diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json
index 240571df53..2550eaf757 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.7.11",
+ "version": "0.7.12-next.0",
"description": "A Backstage catalog backend module that helps integrate towards GitHub",
"backstage": {
"role": "backend-plugin-module",
diff --git a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md
index 87843783a9..17de05e67d 100644
--- a/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gitlab-org/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/plugin-catalog-backend-module-gitlab-org
+## 0.2.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend-module-gitlab@0.6.5-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+
## 0.2.7
### Patch Changes
diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json
index 883360efd2..40ebc68b8e 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.2.7",
+ "version": "0.2.8-next.0",
"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 0893e2c8ad..14345708ae 100644
--- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md
+++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-catalog-backend-module-gitlab
+## 0.6.5-next.0
+
+### Patch Changes
+
+- a568cda: add filter for repos by membership and topics
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+
## 0.6.4
### Patch Changes
diff --git a/plugins/catalog-backend-module-gitlab/config.d.ts b/plugins/catalog-backend-module-gitlab/config.d.ts
index ce1cda50e7..e41de67208 100644
--- a/plugins/catalog-backend-module-gitlab/config.d.ts
+++ b/plugins/catalog-backend-module-gitlab/config.d.ts
@@ -72,6 +72,18 @@ export interface Config {
* Should be in the format group/subgroup/repo, with no leading or trailing slashes.
*/
excludeRepos?: string[];
+
+ /**
+ * (Optional) If true, limit by repositories that the current user is a member of.
+ * See: https://docs.gitlab.com/api/projects/#list-projects
+ */
+ membership?: boolean;
+
+ /**
+ * (Optional) List of topic names. Limit results to repositories that match all of given topics.
+ * See: https://docs.gitlab.com/api/projects/#list-projects
+ */
+ topics?: string;
};
};
};
diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json
index daa63096b7..6b78d7ecd9 100644
--- a/plugins/catalog-backend-module-gitlab/package.json
+++ b/plugins/catalog-backend-module-gitlab/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog-backend-module-gitlab",
- "version": "0.6.4",
+ "version": "0.6.5-next.0",
"description": "A Backstage catalog backend module that helps integrate towards GitLab",
"backstage": {
"role": "backend-plugin-module",
diff --git a/plugins/catalog-backend-module-gitlab/report.api.md b/plugins/catalog-backend-module-gitlab/report.api.md
index e2577553d3..5b7bfadf1d 100644
--- a/plugins/catalog-backend-module-gitlab/report.api.md
+++ b/plugins/catalog-backend-module-gitlab/report.api.md
@@ -120,6 +120,8 @@ export type GitlabProviderConfig = {
includeArchivedRepos?: boolean;
excludeRepos?: string[];
includeUsersWithoutSeat?: boolean;
+ membership?: boolean;
+ topics?: string;
};
// @public
diff --git a/plugins/catalog-backend-module-gitlab/src/lib/client.ts b/plugins/catalog-backend-module-gitlab/src/lib/client.ts
index f5ed760b21..9053d68554 100644
--- a/plugins/catalog-backend-module-gitlab/src/lib/client.ts
+++ b/plugins/catalog-backend-module-gitlab/src/lib/client.ts
@@ -41,6 +41,8 @@ export type CommonListOptions = {
interface ListProjectOptions extends CommonListOptions {
archived?: boolean;
group?: string;
+ membership?: boolean;
+ topics?: string;
}
interface UserListOptions extends CommonListOptions {
diff --git a/plugins/catalog-backend-module-gitlab/src/lib/types.ts b/plugins/catalog-backend-module-gitlab/src/lib/types.ts
index e25f9bacf4..864eca7dfe 100644
--- a/plugins/catalog-backend-module-gitlab/src/lib/types.ts
+++ b/plugins/catalog-backend-module-gitlab/src/lib/types.ts
@@ -248,6 +248,18 @@ export type GitlabProviderConfig = {
* Defaults to `false`
*/
includeUsersWithoutSeat?: boolean;
+
+ /**
+ * If true, the membership parameter is set to true in the GitLab API request.
+ * See: https://docs.gitlab.com/api/projects/#list-projects
+ */
+ membership?: boolean;
+
+ /**
+ * Optional comma seperated list of topics to filter projects by, as specified in the GitLab API documentation:
+ * https://docs.gitlab.com/api/projects/#list-projects
+ */
+ topics?: string;
};
/**
diff --git a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts
index 66a6247295..8bf749c275 100644
--- a/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts
+++ b/plugins/catalog-backend-module-gitlab/src/providers/GitlabDiscoveryEntityProvider.ts
@@ -214,6 +214,8 @@ export class GitlabDiscoveryEntityProvider implements EntityProvider {
page: 1,
per_page: 50,
...(!this.config.includeArchivedRepos && { archived: false }),
+ ...(this.config.membership && { membership: true }),
+ ...(this.config.topics && { topics: this.config.topics }),
},
);
diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts
index e1798df184..8790a3fe53 100644
--- a/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts
+++ b/plugins/catalog-backend-module-gitlab/src/providers/config.test.ts
@@ -65,6 +65,8 @@ describe('config', () => {
excludeRepos: [],
restrictUsersToGroup: false,
includeUsersWithoutSeat: false,
+ membership: undefined,
+ topics: undefined,
}),
);
});
@@ -109,6 +111,8 @@ describe('config', () => {
excludeRepos: [],
restrictUsersToGroup: false,
includeUsersWithoutSeat: true,
+ membership: undefined,
+ topics: undefined,
}),
);
});
@@ -153,6 +157,8 @@ describe('config', () => {
skipForkedRepos: true,
includeArchivedRepos: false,
includeUsersWithoutSeat: false,
+ membership: undefined,
+ topics: undefined,
}),
);
});
@@ -197,6 +203,8 @@ describe('config', () => {
skipForkedRepos: false,
includeArchivedRepos: true,
includeUsersWithoutSeat: false,
+ membership: undefined,
+ topics: undefined,
}),
);
});
@@ -242,6 +250,8 @@ describe('config', () => {
includeArchivedRepos: false,
excludeRepos: ['foo/bar', 'quz/qux'],
includeUsersWithoutSeat: false,
+ membership: undefined,
+ topics: undefined,
}),
);
});
@@ -287,6 +297,8 @@ describe('config', () => {
restrictUsersToGroup: false,
excludeRepos: [],
includeUsersWithoutSeat: false,
+ membership: undefined,
+ topics: undefined,
schedule: {
frequency: { minutes: 30 },
timeout: {
@@ -336,4 +348,188 @@ describe('config', () => {
expect(result).toHaveLength(1);
expect(result[0].group).toEqual('');
});
+
+ it('valid config with membership', () => {
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ gitlab: {
+ test: {
+ group: 'group',
+ host: 'host',
+ branch: 'not-master',
+ fallbackBranch: 'main',
+ entityFilename: 'custom-file.yaml',
+ membership: true,
+ },
+ },
+ },
+ },
+ });
+
+ const result = readGitlabConfigs(config);
+ expect(result).toHaveLength(1);
+ result.forEach(r =>
+ expect(r).toStrictEqual({
+ id: 'test',
+ group: 'group',
+ branch: 'not-master',
+ fallbackBranch: 'main',
+ host: 'host',
+ catalogFile: 'custom-file.yaml',
+ projectPattern: /[\s\S]*/,
+ groupPattern: /[\s\S]*/,
+ userPattern: /[\s\S]*/,
+ orgEnabled: false,
+ allowInherited: false,
+ relations: [],
+ schedule: undefined,
+ restrictUsersToGroup: false,
+ excludeRepos: [],
+ skipForkedRepos: false,
+ includeUsersWithoutSeat: false,
+ includeArchivedRepos: false,
+ membership: true,
+ topics: undefined,
+ }),
+ );
+ });
+
+ it('valid config with empyt topics', () => {
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ gitlab: {
+ test: {
+ group: 'group',
+ host: 'host',
+ branch: 'not-master',
+ fallbackBranch: 'main',
+ entityFilename: 'custom-file.yaml',
+ topics: [],
+ },
+ },
+ },
+ },
+ });
+
+ const result = readGitlabConfigs(config);
+ expect(result).toHaveLength(1);
+ result.forEach(r =>
+ expect(r).toStrictEqual({
+ id: 'test',
+ group: 'group',
+ branch: 'not-master',
+ fallbackBranch: 'main',
+ host: 'host',
+ catalogFile: 'custom-file.yaml',
+ projectPattern: /[\s\S]*/,
+ groupPattern: /[\s\S]*/,
+ userPattern: /[\s\S]*/,
+ orgEnabled: false,
+ allowInherited: false,
+ relations: [],
+ schedule: undefined,
+ restrictUsersToGroup: false,
+ excludeRepos: [],
+ skipForkedRepos: false,
+ includeUsersWithoutSeat: false,
+ includeArchivedRepos: false,
+ membership: undefined,
+ topics: undefined,
+ }),
+ );
+ });
+
+ it('valid config with single topics', () => {
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ gitlab: {
+ test: {
+ group: 'group',
+ host: 'host',
+ branch: 'not-master',
+ fallbackBranch: 'main',
+ entityFilename: 'custom-file.yaml',
+ topics: ['topic1'],
+ },
+ },
+ },
+ },
+ });
+
+ const result = readGitlabConfigs(config);
+ expect(result).toHaveLength(1);
+ result.forEach(r =>
+ expect(r).toStrictEqual({
+ id: 'test',
+ group: 'group',
+ branch: 'not-master',
+ fallbackBranch: 'main',
+ host: 'host',
+ catalogFile: 'custom-file.yaml',
+ projectPattern: /[\s\S]*/,
+ groupPattern: /[\s\S]*/,
+ userPattern: /[\s\S]*/,
+ orgEnabled: false,
+ allowInherited: false,
+ relations: [],
+ schedule: undefined,
+ restrictUsersToGroup: false,
+ excludeRepos: [],
+ skipForkedRepos: false,
+ includeUsersWithoutSeat: false,
+ includeArchivedRepos: false,
+ membership: undefined,
+ topics: 'topic1',
+ }),
+ );
+ });
+
+ it('valid config with multiple topics', () => {
+ const config = new ConfigReader({
+ catalog: {
+ providers: {
+ gitlab: {
+ test: {
+ group: 'group',
+ host: 'host',
+ branch: 'not-master',
+ fallbackBranch: 'main',
+ entityFilename: 'custom-file.yaml',
+ topics: ['topic1', 'topic2', 'topic3'],
+ },
+ },
+ },
+ },
+ });
+
+ const result = readGitlabConfigs(config);
+ expect(result).toHaveLength(1);
+ result.forEach(r =>
+ expect(r).toStrictEqual({
+ id: 'test',
+ group: 'group',
+ branch: 'not-master',
+ fallbackBranch: 'main',
+ host: 'host',
+ catalogFile: 'custom-file.yaml',
+ projectPattern: /[\s\S]*/,
+ groupPattern: /[\s\S]*/,
+ userPattern: /[\s\S]*/,
+ orgEnabled: false,
+ allowInherited: false,
+ relations: [],
+ schedule: undefined,
+ restrictUsersToGroup: false,
+ excludeRepos: [],
+ skipForkedRepos: false,
+ includeUsersWithoutSeat: false,
+ includeArchivedRepos: false,
+ membership: undefined,
+ topics: 'topic1,topic2,topic3',
+ }),
+ );
+ });
});
diff --git a/plugins/catalog-backend-module-gitlab/src/providers/config.ts b/plugins/catalog-backend-module-gitlab/src/providers/config.ts
index bf59bb0d36..5b50fce5b1 100644
--- a/plugins/catalog-backend-module-gitlab/src/providers/config.ts
+++ b/plugins/catalog-backend-module-gitlab/src/providers/config.ts
@@ -66,6 +66,11 @@ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig {
const includeUsersWithoutSeat =
config.getOptionalBoolean('includeUsersWithoutSeat') ?? false;
+ const membership = config.getOptionalBoolean('membership');
+
+ const topicsArray = config.getOptionalStringArray('topics');
+ const topics = topicsArray?.length ? topicsArray.join(',') : undefined;
+
return {
id,
group,
@@ -85,6 +90,8 @@ function readGitlabConfig(id: string, config: Config): GitlabProviderConfig {
excludeRepos,
restrictUsersToGroup,
includeUsersWithoutSeat,
+ membership,
+ topics,
};
}
diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
index cb0b578d80..fea3252df5 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
+++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md
@@ -1,5 +1,22 @@
# @backstage/plugin-catalog-backend-module-incremental-ingestion
+## 0.6.5-next.0
+
+### Patch Changes
+
+- 27d1031: fixed misleading example location annotations in docs
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-catalog-backend@1.32.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-events-node@0.4.9
+ - @backstage/plugin-permission-common@0.8.4
+
## 0.6.4
### Patch Changes
diff --git a/plugins/catalog-backend-module-incremental-ingestion/README.md b/plugins/catalog-backend-module-incremental-ingestion/README.md
index 2535fbe8e3..7673ca08ab 100644
--- a/plugins/catalog-backend-module-incremental-ingestion/README.md
+++ b/plugins/catalog-backend-module-incremental-ingestion/README.md
@@ -208,12 +208,20 @@ export class MyIncrementalEntityProvider
The last step is to implement the actual `next` method that will accept the cursor, call the API, process the result and return the result.
```ts
+import {
+ ANNOTATION_LOCATION,
+ ANNOTATION_ORIGIN_LOCATION,
+} from '@backstage/catalog-model';
+import { IncrementalEntityProvider } from '@backstage/plugin-catalog-backend-module-incremental-ingestion';
+
export class MyIncrementalEntityProvider implements IncrementalEntityProvider {
token: string;
+ mySource: string;
- constructor(token: string) {
+ constructor(token: string, mySource: string) {
this.token = token;
+ this.mySource = mySource;
}
getProviderName() {
@@ -230,6 +238,7 @@ export class MyIncrementalEntityProvider implements IncrementalEntityProvider> {
const { apiClient } = context;
+ const location = `${this.getProviderName()}:${this.mySource}`;
// call your API with the current cursor
const data = await apiClient.getServices(cursor);
@@ -249,8 +258,8 @@ export class MyIncrementalEntityProvider implements IncrementalEntityProvider any;
+ onConfirm: () => any;
+}
+
+export function DeleteEntityConfirmationDialog(
+ props: DeleteEntityConfirmationProps,
+) {
+ const { open, onClose, onConfirm } = props;
+ const [busy, setBusy] = useState(false);
+ const onDelete = async () => {
+ setBusy(true);
+ try {
+ onConfirm();
+ } catch (err) {
+ assertError(err);
+ } finally {
+ setBusy(false);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx
index 65e6eb731e..32a7b42eb4 100644
--- a/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx
+++ b/plugins/catalog-unprocessed-entities/src/components/FailedEntities.tsx
@@ -34,6 +34,7 @@ import { EntityDialog } from './EntityDialog';
import { catalogUnprocessedEntitiesApiRef } from '../api';
import useAsync from 'react-use/esm/useAsync';
import DeleteIcon from '@material-ui/icons/Delete';
+import { DeleteEntityConfirmationDialog } from './DeleteEntityConfirmationDialog';
const useStyles = makeStyles((theme: Theme) => ({
errorBox: {
@@ -92,18 +93,15 @@ const RenderErrorContext = ({
* Converts input datetime which lacks timezone info into user's local time so that they can
* easily understand the times.
*/
-const convertTimeToLocalTimezone = (strDateTime: string | Date) => {
- const dateTime = DateTime.fromFormat(
- strDateTime.toLocaleString(),
- 'yyyy-MM-dd hh:mm:ss',
- {
- zone: 'UTC',
- },
- );
+export const convertTimeToLocalTimezone = (dateTime: string | Date) => {
+ const isoDateTime =
+ typeof dateTime === 'string' ? dateTime : dateTime.toISOString();
- const dateTimeLocalTz = dateTime.setZone(DateTime.local().zoneName);
+ const strDateTime = DateTime.fromISO(isoDateTime, {
+ zone: DateTime.local().zoneName,
+ });
- return dateTimeLocalTz.toFormat('yyyy-MM-dd hh:mm:ss ZZZZ');
+ return strDateTime.toFormat('yyyy-MM-dd hh:mm:ss ZZZZ');
};
export const FailedEntities = () => {
@@ -117,6 +115,13 @@ export const FailedEntities = () => {
const [, setSelectedSearchTerm] = useState('');
const unprocessedEntityApi = useApi(catalogUnprocessedEntitiesApiRef);
const alertApi = useApi(alertApiRef);
+ const [selectedEntityId, setSelectedEntityId] = useState(
+ undefined,
+ );
+ const [selectedEntityRef, setSelectedEntityRef] = useState<
+ string | undefined
+ >(undefined);
+ const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);
if (loading) {
return ;
@@ -125,25 +130,34 @@ export const FailedEntities = () => {
return ;
}
- const handleDelete = async ({
+ const handleDelete = ({
entityId,
entityRef,
}: {
entityId: string;
entityRef: string;
}) => {
+ setSelectedEntityId(entityId);
+ setSelectedEntityRef(entityRef);
+ setConfirmationDialogOpen(true);
+ };
+
+ const cleanUpAfterRemoval = async () => {
try {
- await unprocessedEntityApi.delete(entityId);
- alertApi.post({
- message: `Entity ${entityRef} has been deleted`,
- severity: 'success',
- });
+ if (selectedEntityId) {
+ await unprocessedEntityApi.delete(selectedEntityId);
+ alertApi.post({
+ message: `Entity ${selectedEntityRef} has been deleted`,
+ severity: 'success',
+ });
+ }
} catch (e) {
alertApi.post({
- message: `Ran into an issue when deleting ${entityRef}. Please try again later.`,
+ message: `Ran into an issue when deleting ${selectedEntityRef}. Please try again later.`,
severity: 'error',
});
}
+ setConfirmationDialogOpen(false);
};
const columns: TableColumn[] = [
@@ -213,8 +227,8 @@ export const FailedEntities = () => {
return (
- await handleDelete({
+ onClick={() =>
+ handleDelete({
entityId: entity_id,
entityRef: entity_ref,
})
@@ -228,37 +242,46 @@ export const FailedEntities = () => {
];
return (
-
- No failed entities found
-
- }
- onSearchChange={(searchTerm: string) => setSelectedSearchTerm(searchTerm)}
- detailPanel={({ rowData }) => {
- const errors = (rowData as UnprocessedEntity).errors;
- return (
- <>
- {errors?.map((e, idx) => {
- return (
-
-
- {e.name}
-
-
-
-
- );
- })}
- >
- );
- }}
- />
+ <>
+
+ No failed entities found
+
+ }
+ onSearchChange={(searchTerm: string) =>
+ setSelectedSearchTerm(searchTerm)
+ }
+ detailPanel={({ rowData }) => {
+ const errors = (rowData as UnprocessedEntity).errors;
+ return (
+ <>
+ {errors?.map((e, idx) => {
+ return (
+
+
+ {e.name}
+
+
+
+
+ );
+ })}
+ >
+ );
+ }}
+ />
+ setConfirmationDialogOpen(false)}
+ onConfirm={cleanUpAfterRemoval}
+ />
+ >
);
};
diff --git a/plugins/catalog-unprocessed-entities/src/plugin.test.ts b/plugins/catalog-unprocessed-entities/src/plugin.test.ts
index add3d677f0..ebeb24f4ab 100644
--- a/plugins/catalog-unprocessed-entities/src/plugin.test.ts
+++ b/plugins/catalog-unprocessed-entities/src/plugin.test.ts
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+import { convertTimeToLocalTimezone } from './components/FailedEntities';
import { catalogUnprocessedEntitiesPlugin } from './plugin';
describe('catalog-unprocessed-entities', () => {
@@ -20,3 +21,29 @@ describe('catalog-unprocessed-entities', () => {
expect(catalogUnprocessedEntitiesPlugin).toBeDefined();
});
});
+
+describe('components/FailedEntities/convertTimeToLocalTimezone', () => {
+ it('should correctly a UTC ISO string to local time', () => {
+ const utcTime = '2024-09-03T08:15:08.088Z';
+ const localTime = convertTimeToLocalTimezone(utcTime);
+ expect(localTime).toBe('2024-09-03 08:15:08 UTC');
+ });
+
+ it('should correctly convert a UTC Date object to local time', () => {
+ const utcTime = new Date('2024-09-03T08:15:08.088Z');
+ const localTime = convertTimeToLocalTimezone(utcTime);
+ expect(localTime).toBe('2024-09-03 08:15:08 UTC');
+ });
+
+ it('should return "Invalid Date" for an invalid date string', () => {
+ const invalidTime = 'invalid-date-string';
+ const localTime = convertTimeToLocalTimezone(invalidTime);
+ expect(localTime).toBe('Invalid DateTime');
+ });
+
+ it('should handle empty string input', () => {
+ const emptyString = '';
+ const localTime = convertTimeToLocalTimezone(emptyString);
+ expect(localTime).toBe('Invalid DateTime');
+ });
+});
diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md
index b4bafe3e9f..bc6ce467f4 100644
--- a/plugins/catalog/CHANGELOG.md
+++ b/plugins/catalog/CHANGELOG.md
@@ -1,5 +1,30 @@
# @backstage/plugin-catalog
+## 1.29.0-next.0
+
+### Minor Changes
+
+- 9454ef9: Added support of filtering based on system columns in catalog table
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/integration-react@1.2.5
+ - @backstage/types@1.2.1
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-scaffolder-common@1.5.10
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+
## 1.28.0
### Minor Changes
diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json
index e8605e0db4..752ba744e3 100644
--- a/plugins/catalog/package.json
+++ b/plugins/catalog/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-catalog",
- "version": "1.28.0",
+ "version": "1.29.0-next.0",
"description": "The Backstage plugin for browsing the Backstage catalog",
"backstage": {
"role": "frontend-plugin",
diff --git a/plugins/catalog/src/components/CatalogTable/columns.tsx b/plugins/catalog/src/components/CatalogTable/columns.tsx
index d5362badda..87de8bfc91 100644
--- a/plugins/catalog/src/components/CatalogTable/columns.tsx
+++ b/plugins/catalog/src/components/CatalogTable/columns.tsx
@@ -62,6 +62,18 @@ export const columnFactories = Object.freeze({
return {
title: 'System',
field: 'resolved.partOfSystemRelationTitle',
+ customFilterAndSearch: (query, row) => {
+ if (!row.resolved.partOfSystemRelations) {
+ return false;
+ }
+
+ const systemNames = row.resolved.partOfSystemRelations.map(
+ ref => ref.name,
+ ); // Extract system names from entityRefs
+
+ const searchText = systemNames.join(', ').toLocaleUpperCase('en-US');
+ return searchText.includes(query.toLocaleUpperCase('en-US'));
+ },
render: ({ resolved }) => (
= NonNullable<
// @public
export type ListActionsResponse = Array;
+// @public
+export type ListTemplateExtensionsResponse = {
+ filters: Record;
+ globals: {
+ functions: Record;
+ values: Record;
+ };
+};
+
// @public
export type LogEvent = {
type: 'log' | 'completion' | 'cancelled' | 'recovered';
@@ -241,6 +247,7 @@ export interface ScaffolderApi {
tasks: ScaffolderTask[];
totalTasks?: number;
}>;
+ listTemplateExtensions?(): Promise;
retry?(taskId: string): Promise;
scaffold(
options: ScaffolderScaffoldOptions,
@@ -492,6 +499,13 @@ export type ScaffolderTaskStatus =
| 'processing'
| 'skipped';
+// @public
+export type ScaffolderUsageExample = {
+ description?: string;
+ example: string;
+ notes?: string;
+};
+
// @public
export interface ScaffolderUseTemplateSecrets {
// (undocumented)
@@ -523,6 +537,33 @@ export type TaskStream = {
output?: ScaffolderTaskOutput;
};
+// @public
+export type TemplateFilter = {
+ description?: string;
+ schema?: {
+ input?: JSONSchema7;
+ arguments?: JSONSchema7[];
+ output?: JSONSchema7;
+ };
+ examples?: ScaffolderUsageExample[];
+};
+
+// @public
+export type TemplateGlobalFunction = {
+ description?: string;
+ schema?: {
+ arguments?: JSONSchema7[];
+ output?: JSONSchema7;
+ };
+ examples?: ScaffolderUsageExample[];
+};
+
+// @public
+export type TemplateGlobalValue = {
+ description?: string;
+ value: JsonValue;
+};
+
// @public (undocumented)
export type TemplateGroupFilter = {
title?: React.ReactNode;
diff --git a/plugins/scaffolder-react/src/api/types.ts b/plugins/scaffolder-react/src/api/types.ts
index 8e4d989a55..cb73704010 100644
--- a/plugins/scaffolder-react/src/api/types.ts
+++ b/plugins/scaffolder-react/src/api/types.ts
@@ -45,15 +45,24 @@ export type ScaffolderTask = {
};
/**
- * A single action example
+ * A single scaffolder usage example
*
* @public
*/
-export type ActionExample = {
- description: string;
+export type ScaffolderUsageExample = {
+ description?: string;
example: string;
+ notes?: string;
};
+/**
+ * A single action example
+ *
+ * @public
+ * @deprecated in favor of ScaffolderUsageExample
+ */
+export type ActionExample = ScaffolderUsageExample;
+
/**
* The response shape for a single action in the `listActions` call to the `scaffolder-backend`
*
@@ -76,6 +85,58 @@ export type Action = {
*/
export type ListActionsResponse = Array;
+/**
+ * The response shape for a single filter in the `listTemplateExtensions` call to the `scaffolder-backend`
+ *
+ * @public
+ */
+export type TemplateFilter = {
+ description?: string;
+ schema?: {
+ input?: JSONSchema7;
+ arguments?: JSONSchema7[];
+ output?: JSONSchema7;
+ };
+ examples?: ScaffolderUsageExample[];
+};
+
+/**
+ * The response shape for a single global function in the `listTemplateExtensions` call to the `scaffolder-backend`
+ *
+ * @public
+ */
+export type TemplateGlobalFunction = {
+ description?: string;
+ schema?: {
+ arguments?: JSONSchema7[];
+ output?: JSONSchema7;
+ };
+ examples?: ScaffolderUsageExample[];
+};
+
+/**
+ * The response shape for a single global value in the `listTemplateExtensions` call to the `scaffolder-backend`
+ *
+ * @public
+ */
+export type TemplateGlobalValue = {
+ description?: string;
+ value: JsonValue;
+};
+
+/**
+ * The response shape for the `listTemplateExtensions` call to the `scaffolder-backend`
+ *
+ * @public
+ */
+export type ListTemplateExtensionsResponse = {
+ filters: Record;
+ globals: {
+ functions: Record;
+ values: Record;
+ };
+};
+
/** @public */
export type ScaffolderOutputLink = {
title?: string;
@@ -236,6 +297,11 @@ export interface ScaffolderApi {
*/
listActions(): Promise;
+ /**
+ * Returns a structure describing the available templating extensions.
+ */
+ listTemplateExtensions?(): Promise;
+
streamLogs(options: ScaffolderStreamLogsOptions): Observable;
dryRun?(options: ScaffolderDryRunOptions): Promise;
diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md
index 2d02c91ec0..8ba31c4ab8 100644
--- a/plugins/scaffolder/CHANGELOG.md
+++ b/plugins/scaffolder/CHANGELOG.md
@@ -1,5 +1,30 @@
# @backstage/plugin-scaffolder
+## 1.30.0-next.0
+
+### Minor Changes
+
+- 5890016: add api to retrieve template extensions info from scaffolder-backend
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-react@1.15.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/integration@1.16.2
+ - @backstage/integration-react@1.2.5
+ - @backstage/types@1.2.1
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-permission-react@0.4.32
+ - @backstage/plugin-scaffolder-common@1.5.10
+
## 1.29.0
### Minor Changes
diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json
index f03f9e5a23..dc8cd0ebe3 100644
--- a/plugins/scaffolder/package.json
+++ b/plugins/scaffolder/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-scaffolder",
- "version": "1.29.0",
+ "version": "1.30.0-next.0",
"description": "The Backstage plugin that helps you create new things",
"backstage": {
"role": "frontend-plugin",
diff --git a/plugins/scaffolder/report.api.md b/plugins/scaffolder/report.api.md
index c51423ed83..379e6a98b9 100644
--- a/plugins/scaffolder/report.api.md
+++ b/plugins/scaffolder/report.api.md
@@ -25,6 +25,7 @@ import { JSX as JSX_2 } from 'react';
import { LayoutOptions as LayoutOptions_2 } from '@backstage/plugin-scaffolder-react';
import { LayoutTemplate as LayoutTemplate_2 } from '@backstage/plugin-scaffolder-react';
import { ListActionsResponse as ListActionsResponse_2 } from '@backstage/plugin-scaffolder-react';
+import { ListTemplateExtensionsResponse } from '@backstage/plugin-scaffolder-react';
import { LogEvent as LogEvent_2 } from '@backstage/plugin-scaffolder-react';
import { Observable } from '@backstage/types';
import { PathParams } from '@backstage/core-plugin-api';
@@ -561,6 +562,8 @@ export class ScaffolderClient implements ScaffolderApi_2 {
totalTasks?: number;
}>;
// (undocumented)
+ listTemplateExtensions(): Promise;
+ // (undocumented)
retry?(taskId: string): Promise;
// (undocumented)
scaffold(
diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts
index 01e163bb30..85450b012a 100644
--- a/plugins/scaffolder/src/api.ts
+++ b/plugins/scaffolder/src/api.ts
@@ -24,6 +24,7 @@ import { ResponseError } from '@backstage/errors';
import { ScmIntegrationRegistry } from '@backstage/integration';
import {
ListActionsResponse,
+ ListTemplateExtensionsResponse,
LogEvent,
ScaffolderApi,
ScaffolderDryRunOptions,
@@ -324,6 +325,17 @@ export class ScaffolderClient implements ScaffolderApi {
return await response.json();
}
+ async listTemplateExtensions(): Promise {
+ const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');
+ const response = await this.fetchApi.fetch(
+ `${baseUrl}/v2/template-extensions`,
+ );
+ if (!response.ok) {
+ throw ResponseError.fromResponse(response);
+ }
+ return response.json();
+ }
+
async cancelTask(taskId: string): Promise {
const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');
const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`;
diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md
index 8700e8bc91..fbd205b1ea 100644
--- a/plugins/search-backend-module-techdocs/CHANGELOG.md
+++ b/plugins/search-backend-module-techdocs/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-search-backend-module-techdocs
+## 0.4.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-techdocs-node@1.13.2-next.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-search-common@1.2.17
+
## 0.4.0
### Minor Changes
diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json
index 9ca1630a7c..eab306e7ec 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.4.0",
+ "version": "0.4.1-next.0",
"description": "A module for the search backend that exports techdocs modules",
"backstage": {
"role": "backend-plugin-module",
diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md
index ec5995601d..621ce2b7e0 100644
--- a/plugins/search-backend/CHANGELOG.md
+++ b/plugins/search-backend/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-search-backend
+## 2.0.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-permission-node@0.9.0
+ - @backstage/plugin-search-backend-node@1.3.9
+ - @backstage/backend-openapi-utils@0.5.1
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/types@1.2.1
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-search-common@1.2.17
+
## 2.0.0
### Major Changes
diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json
index 91acb56855..33543eafc5 100644
--- a/plugins/search-backend/package.json
+++ b/plugins/search-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search-backend",
- "version": "2.0.0",
+ "version": "2.0.1-next.0",
"description": "The Backstage backend plugin that provides your backstage app with search",
"backstage": {
"role": "backend-plugin",
diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md
index 92aa67b880..e6804c09d2 100644
--- a/plugins/search/CHANGELOG.md
+++ b/plugins/search/CHANGELOG.md
@@ -1,5 +1,21 @@
# @backstage/plugin-search
+## 1.4.25-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/core-compat-api@0.4.1-next.0
+ - @backstage/core-components@0.17.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/errors@1.2.7
+ - @backstage/frontend-plugin-api@0.10.0
+ - @backstage/types@1.2.1
+ - @backstage/version-bridge@1.0.11
+ - @backstage/plugin-search-common@1.2.17
+ - @backstage/plugin-search-react@1.8.7
+
## 1.4.24
### Patch Changes
diff --git a/plugins/search/package.json b/plugins/search/package.json
index 7e12ef21d0..373a7b7033 100644
--- a/plugins/search/package.json
+++ b/plugins/search/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-search",
- "version": "1.4.24",
+ "version": "1.4.25-next.0",
"description": "The Backstage plugin that provides your backstage app with search",
"backstage": {
"role": "frontend-plugin",
diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md
index b9bff49e81..658d70e232 100644
--- a/plugins/techdocs-addons-test-utils/CHANGELOG.md
+++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md
@@ -1,5 +1,20 @@
# @backstage/plugin-techdocs-addons-test-utils
+## 1.0.47-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.29.0-next.0
+ - @backstage/plugin-catalog-react@1.16.1-next.0
+ - @backstage/plugin-techdocs@1.12.5-next.0
+ - @backstage/core-app-api@1.16.0
+ - @backstage/core-plugin-api@1.10.5
+ - @backstage/integration-react@1.2.5
+ - @backstage/test-utils@1.7.6
+ - @backstage/plugin-search-react@1.8.7
+ - @backstage/plugin-techdocs-react@1.2.15
+
## 1.0.46
### Patch Changes
diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json
index 9071a86a93..e9ed1850bc 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.46",
+ "version": "1.0.47-next.0",
"backstage": {
"role": "web-library",
"pluginId": "techdocs-addons",
diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md
index 60246c4903..ef45686374 100644
--- a/plugins/techdocs-backend/CHANGELOG.md
+++ b/plugins/techdocs-backend/CHANGELOG.md
@@ -1,5 +1,24 @@
# @backstage/plugin-techdocs-backend
+## 2.0.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.9.0-next.0
+ - @backstage/plugin-techdocs-node@1.13.2-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.4.1-next.0
+ - @backstage/backend-plugin-api@1.2.1
+ - @backstage/catalog-client@1.9.1
+ - @backstage/catalog-model@1.7.3
+ - @backstage/config@1.3.2
+ - @backstage/errors@1.2.7
+ - @backstage/integration@1.16.2
+ - @backstage/plugin-catalog-common@1.1.3
+ - @backstage/plugin-catalog-node@1.16.1
+ - @backstage/plugin-permission-common@0.8.4
+ - @backstage/plugin-techdocs-common@0.1.0
+
## 2.0.0
### Major Changes
diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json
index 4f94659b99..1b0d3989b1 100644
--- a/plugins/techdocs-backend/package.json
+++ b/plugins/techdocs-backend/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-techdocs-backend",
- "version": "2.0.0",
+ "version": "2.0.1-next.0",
"description": "The Backstage backend plugin that renders technical documentation for your components",
"backstage": {
"role": "backend-plugin",
diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx
index eb16476fa6..f0d9b194ce 100644
--- a/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx
+++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/IssueLink.tsx
@@ -48,10 +48,7 @@ const getIcon = ({ type }: Repository) => {
};
const getName = ({ type }: Repository) => {
- if (type === 'github') {
- return 'Github';
- }
- return 'Gitlab';
+ return type.charAt(0).toLocaleUpperCase('en-US') + type.slice(1);
};
const getUrl = (repository: Repository, template: ReportIssueTemplate) => {
diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx
index 459fa1b65e..97df773f76 100644
--- a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx
+++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.test.tsx
@@ -116,7 +116,7 @@ describe('ReportIssue', () => {
it('renders gitlab link without exploding', async () => {
byUrl.mockReturnValue({ type: 'gitlab' });
- const { shadowRoot, getByText } =
+ const { shadowRoot, getByText, queryByTestId } =
await TechDocsAddonTester.buildAddonsInTechDocs([
,
])
@@ -164,6 +164,8 @@ describe('ReportIssue', () => {
fireSelectionChangeEvent(window);
await waitFor(() => {
+ expect(queryByTestId('report-issue-addon')).toBeInTheDocument();
+
const link = getByText('Open new Gitlab issue');
expect(link).toHaveAttribute(
'href',
@@ -180,7 +182,7 @@ describe('ReportIssue', () => {
body: options.selection.toString().trim(),
});
- const { shadowRoot, getByText } =
+ const { shadowRoot, getByText, queryByTestId } =
await TechDocsAddonTester.buildAddonsInTechDocs([
,
])
@@ -228,6 +230,8 @@ describe('ReportIssue', () => {
fireSelectionChangeEvent(window);
await waitFor(() => {
+ expect(queryByTestId('report-issue-addon')).toBeInTheDocument();
+
const link = getByText('Open new Gitlab issue');
expect(link).toHaveAttribute(
'href',
@@ -235,4 +239,49 @@ describe('ReportIssue', () => {
);
});
});
+
+ it('does not render report issue link for unsupported repository type', async () => {
+ byUrl.mockReturnValue({ type: 'gerrit', resource: 'gerrit.example.com' });
+
+ const { shadowRoot, getByText, queryByTestId } =
+ await TechDocsAddonTester.buildAddonsInTechDocs([
+ ,
+ ])
+ .withDom(
+
+
+
+
+
+ ,
+ )
+ .withApis([[scmIntegrationsApiRef, { byUrl }]])
+ .renderWithEffects();
+
+ (shadowRoot as ShadowRoot & Pick).getSelection =
+ () => selection;
+
+ await waitFor(() => {
+ expect(getByText('Edit page')).toBeInTheDocument();
+ });
+
+ fireSelectionChangeEvent(window);
+
+ await waitFor(() => {
+ expect(queryByTestId('report-issue-addon')).not.toBeInTheDocument();
+ });
+ });
});
diff --git a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.tsx b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.tsx
index a6d8021b9d..3a5511376c 100644
--- a/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.tsx
+++ b/plugins/techdocs-module-addons-contrib/src/ReportIssue/ReportIssue.tsx
@@ -14,39 +14,11 @@
* limitations under the License.
*/
-import React, { useState, useEffect } from 'react';
-
-import { makeStyles, Portal, Paper } from '@material-ui/core';
-
-import { useGitTemplate, useGitRepository } from './hooks';
+import React from 'react';
+import { useGitRepository } from './hooks';
import { ReportIssueTemplateBuilder } from './types';
-import {
- PAGE_MAIN_CONTENT_SELECTOR,
- PAGE_FEEDBACK_LINK_SELECTOR,
- ADDON_FEEDBACK_CONTAINER_ID,
- ADDON_FEEDBACK_CONTAINER_SELECTOR,
-} from './constants';
-import { IssueLink } from './IssueLink';
-
-import {
- useShadowRootElements,
- useShadowRootSelection,
-} from '@backstage/plugin-techdocs-react';
-
-const useStyles = makeStyles(theme => ({
- root: {
- transform: 'translate(-100%, -100%)',
- position: 'absolute',
- padding: theme.spacing(1),
- zIndex: theme.zIndex.tooltip,
- background: theme.palette.common.white,
- },
-}));
-
-type Style = {
- top: string;
- left: string;
-};
+import { ADDON_ISSUE_REPO_TYPES_SUPPORTED } from './constants';
+import { ReportIssueAddonContent } from './ReportIssueContent';
/**
* Props customizing the Addon.
@@ -67,101 +39,24 @@ export type ReportIssueProps = {
templateBuilder?: ReportIssueTemplateBuilder;
};
-/**
- * Show report issue button when text is highlighted
- */
export const ReportIssueAddon = ({
debounceTime = 500,
- templateBuilder: buildTemplate,
+ templateBuilder,
}: ReportIssueProps) => {
- const classes = useStyles();
- const [style, setStyle] = useState