From ec98492a5f1444d30d7227f79296449c8ed3771e Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Wed, 5 Nov 2025 10:52:42 -0500 Subject: [PATCH 001/455] Revise component creation guide Updated the guide to create a component using Software Templates, enhancing clarity and structure. Added detailed steps, additional supporting information, and corrected formatting for better readability. Updated graphics. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/create-a-component.md | 111 +++++++++++++++++---- 1 file changed, 91 insertions(+), 20 deletions(-) diff --git a/docs/getting-started/create-a-component.md b/docs/getting-started/create-a-component.md index 29ba99db83..37dd7514cc 100644 --- a/docs/getting-started/create-a-component.md +++ b/docs/getting-started/create-a-component.md @@ -6,38 +6,109 @@ description: Leverage the scaffolder to start creating components with best prac Audience: Developers -## Summary +## Overview -This guide will walk you through how to use Software Templates to create new components with baked in best practices. +Components in the software catalog are created using a software template. Templates load skeletons of code, which can include some variables, and incorporate your company's best pracitces. The templates are published to a location, such as GitHub or GitLab. + +The standalone Backstage application includes the `Example Node.js Template`, which is an example template for the scaffolder that creates a simple Node.js service. You can also [create your own templates](../features/software-templates/adding-templates.md). ## Prerequisites -:::note +For this example, the default Note.js template will be used. The template creates a repository in GitHub and adds the necessary files to it so that the component is integrated into the software catalog. Because you are creating a repository, you must first create an integration between Backstage and GitHub. -If you're running Backstage with Node 20 or later, you'll need to pass the flag `--no-node-snapshot` to Node in order to use the templates feature. One way to do this is to specify the `NODE_OPTIONS` environment variable before starting Backstage: `export NODE_OPTIONS=--no-node-snapshot` +- You should have already [installed a standalone app](../getting-started/index.md). -::: +- If you are running Backstage with Node 20 or later, pass the flag `--no-node-snapshot` to Node in order to use the templates feature to create new components. One way to do this is to specify the `NODE_OPTIONS` environment variable before starting Backstage: -You should already have [a standalone app](./index.md). + ``` + export NODE_OPTIONS=--no-node-snapshot + ``` -You will also need to register the [GitHub Scaffolder Action module](../features/software-templates/builtin-actions.md#installing-action-modules) before moving forward. +- Register the [GitHub Scaffolder Action module](../features/software-templates/builtin-actions.md#installing-action-modules). -## Creating your component +- [Setup up a GitHub Integration](../getting-started/config/authentication.md#setting-up-a-github-integration) with Backstage, using a GitHub Personal Access Token. -- Go to `create` and choose to create a website with the `Example Node.js Template` -- Type in a name, let's use `tutorial` and click `Next Step` +## Creating the component -![Software template deployment input screen asking for a name](../assets/getting-started/b-scaffold-1.png) +To create the component: -- You should see the following screen: +1. Select `Create`. -![Software template deployment input screen asking for the GitHub username, and name of the new repo to create](../assets/getting-started/b-scaffold-2.png) + ![select create for new component](../assets/getting-started/select-create-for-new-component.png) -- For host, it should default to github.com -- As owner, type your GitHub username -- For the repository name, type `tutorial`. Go to the next step +2. Select `Service` in the `CATEGORIES` dropdown list. +3. Select the `Owner`. For this example, you can select `guest`. +4. Select `Choose` in the `Example Node.js Template`. -- Review the details of this new service, and press `Create` if you want to - deploy it like this. -- You can follow along with the progress, and as soon as every step is - finished, you can take a look at your new service + ![setup-nodejs-categories-owners](../assets/getting-started/setup-nodejs-cat-owner.png) + +5. For this example, enter `tutorial` for the `Name` of the service. and select `NEXT`. + + ![enter name of new component](../assets/getting-started/enter-name-of-new-component.png) + +6. Enter your GitHub user name as the `Owner`. +7. Enter `tutorial` for the `Repository` and select `REVIEW`. + ![select review create component](../assets/getting-started/select-review-create-component.png) +8. Review the information and select `CREATE`. + + ![select create to make component](../assets/getting-started/select-create-to-make-component.png) + +If you see an error message, similar to the following, + + ![error creating new component](../assets/getting-started/error-creating-new-component.png) + +Perform the following steps: + +1. Close the Backstage app. +2. Enter `CTRL-C` in the terminal window to stop the Backstage frontend and backend. +3. In the terminal window, enter: + + ``` + export NODE_OPTIONS=--no-node-snapshot + ``` + +4. Enter `yarn start` to restart the Backstage application. + e. Repeat steps to create the component. + +Otherwise, you can follow along with the progress, and as soon as every step is finished, you can take a look at your new service in either the repository or the catalog. + +![run of example of create component](../assets/getting-started/successful-create-new-coponent.png) + +Selecting `REPOSITORY` displays the files in the main branch of the new `tutorial` repository. When you created the new `tutorial` component, three files were created in the repository + +- **catalog-info.yaml** - Describes the entity for the software catalog. [Descriptor Format of Catalog Entities](../features/software-catalog/descriptor-format.md) provides additional information. + + ``` + apiVersion: backstage.io/v1alpha1 + kind: Component + metadata: + name: "tutorial" + spec: + type: service + owner: user:guest + lifecycle: experimental + ``` + +- **index.js** - + + ``` + console.log('Hello from tutorial!'); + ``` + +- **package.json** - + + ``` + { + "name": "tutorial", + "private": true, + "dependencies": {} + } + ``` + +Selecting `OPEN IN CATALOG` displays details of the new component, such as its relationships, links, and subcomponents. + +![select open in catalog](../assets/getting-started/tutorial-component-open-in-catalog.png) + +Selecting `Home` in the sidebar, displays the new `tutorial` component in the catalog. + +![new turorial component in software catalog](../assets/getting-started/new-tutorial-component-in-software-catalog.png) From 4f37d6c9c0a0b5bdc6159d5391d9fbcb69463ea7 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:34:23 -0500 Subject: [PATCH 002/455] Update documentation for creating a component Clarified the description of the Example Node.js Template and corrected the step numbering in the instructions. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/create-a-component.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/getting-started/create-a-component.md b/docs/getting-started/create-a-component.md index 37dd7514cc..18f1e81f27 100644 --- a/docs/getting-started/create-a-component.md +++ b/docs/getting-started/create-a-component.md @@ -10,7 +10,7 @@ Audience: Developers Components in the software catalog are created using a software template. Templates load skeletons of code, which can include some variables, and incorporate your company's best pracitces. The templates are published to a location, such as GitHub or GitLab. -The standalone Backstage application includes the `Example Node.js Template`, which is an example template for the scaffolder that creates a simple Node.js service. You can also [create your own templates](../features/software-templates/adding-templates.md). +The standalone Backstage application includes the `Example Node.js Template`, which is an example template for the scaffolder that creates and registers a simple Node.js service. You can also [create your own templates](../features/software-templates/adding-templates.md). ## Prerequisites @@ -59,16 +59,16 @@ If you see an error message, similar to the following, Perform the following steps: -1. Close the Backstage app. -2. Enter `CTRL-C` in the terminal window to stop the Backstage frontend and backend. -3. In the terminal window, enter: +1. Close the Backstage app. +2. Enter `CTRL-C` in the terminal window to stop the Backstage frontend and backend. +3. In the terminal window, enter: ``` export NODE_OPTIONS=--no-node-snapshot ``` -4. Enter `yarn start` to restart the Backstage application. - e. Repeat steps to create the component. +4. Enter `yarn start` to restart the Backstage application. +5. Repeat steps to create the component. Otherwise, you can follow along with the progress, and as soon as every step is finished, you can take a look at your new service in either the repository or the catalog. From c632d93e971388a61c19b3ee3721a5421f5eef1f Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:55:29 -0500 Subject: [PATCH 003/455] Revise component registration guide for clarity Updated the guide to register a component, including changes to the structure and wording for clarity. Updated graphics. Rewrote into task-based steps. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/register-a-component.md | 45 +++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/docs/getting-started/register-a-component.md b/docs/getting-started/register-a-component.md index 4e2076ee8d..bed8733413 100644 --- a/docs/getting-started/register-a-component.md +++ b/docs/getting-started/register-a-component.md @@ -8,38 +8,53 @@ Audience: Developers :::note Note Entity files are stored in YAML format, if you are not familiar with YAML, you can learn more about it [here](https://yaml.org). + +[Descriptor Format of Catalog Entities](../features/software-catalog/descriptor-format.md) provides additional information on the format of the YAML entity files. ::: -## Summary +## Overview This guide will walk you through how to pull Backstage data from other locations manually. There are integrations that will automatically do this for you. +When registering a component, you can: + +- Link to an existing entity file: The file is analyzed to determine which entities are defined, and the entities are added to the Scaffolded Backstage App catalog. For example, `https://github.com/backstage/backstage/blob/master/catalog-info.yaml`. + +- Link to a repository: All `catalog-info.yaml` files are discovered in the repository and their defined entities are added to the Scaffolded Backstage App catalog. For example, `https://github.com/backstage/backstage`. + + :::note Note + If no entites are found, a Pull Request is created that adds an example `catalog-info.yaml` file to the repository. When the Pull Request is merged, the Scaffolded Backstage App catalog loads all of the defined entities. + + ::: + ## Prerequisites -You should have already [have a standalone app](./index.md). +- You should have [installed a standalone app](./index.md). -## 1. Finding our template +## Registering a component -Register a new component, by going to `create` and choose `Register existing component` +To manually register a component in the software catalog: - +1. Select `Create`. +2. Select `REGISTER EXISTING COMPONENT`. -![Software template main screen, with a blue button to add an existing component](../assets/getting-started/b-existing-1.png) + ![Select Register existing component.](../assets/uiguide/select-register-existing-component.png) -## 2. Filling out the template +3. Fill out the template. -For repository URL, use `https://github.com/backstage/backstage/blob/master/catalog-info.yaml`. This is used in our [demo site](https://demo.backstage.io) catalog. + The standalone Backstage application includes one template. For this example, enter the repository URL to the entity file, `https://github.com/backstage/backstage/blob/master/catalog-info.yaml.` This is used in our [demo site](https://demo.backstage.io) catalog. -![Register a new component wizard, asking for an URL to the existing component YAML file](../assets/getting-started/b-existing-2.png) + ![enter url of component entity file.](../assets/uiguide/enter-url-of-component.png) -Hit `Analyze` and review the changes. +4. Select `ANALYZE`. +5. If the changes from `ANALYZE` are correct, select `IMPORT`. -## 3. Import the entity + ![review and select import .](../assets/uiguide/review-select-import.png) -If the changes from `Analyze` are correct, click `Apply`. +If your entity was successfully imported, the details will be displayed. -![Register a new component wizard, showing the metadata for the component YAML we use in this tutorial](../assets/getting-started/b-existing-3.png) +![details of registered component.](../assets/uiguide/details-for-registered-backstage-website.png) -You should receive a message that your entities have been added. +Select `Home` to view your new entity in the software catalog. -If you go back to `Home`, you should be able to find `backstage`. You can click it and see the details for this new entity. +![Backstage website component in software catalog.](../assets/uiguide/backstage-website-registered-catalog-view.png) From 4a5bad07526651e1be55da2ba40997977d798a42 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:25:45 -0500 Subject: [PATCH 004/455] Create review-select-import.png Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/assets/uiguide/review-select-import.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/assets/uiguide/review-select-import.png diff --git a/docs/assets/uiguide/review-select-import.png b/docs/assets/uiguide/review-select-import.png new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/docs/assets/uiguide/review-select-import.png @@ -0,0 +1 @@ + From 1920ef0f28e666ff7baab9c88b4a94e0883de340 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:26:54 -0500 Subject: [PATCH 005/455] Add graphics for register a component Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- ...ackstage-website-registered-catalog-view.png | Bin 0 -> 47128 bytes ...details-for-registered-backstage-website.png | Bin 0 -> 84998 bytes docs/assets/uiguide/enter-url-of-component.png | Bin 0 -> 76297 bytes docs/assets/uiguide/review-select-import.png | Bin 1 -> 81061 bytes .../select-register-existing-component.png | Bin 0 -> 73429 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/uiguide/backstage-website-registered-catalog-view.png create mode 100644 docs/assets/uiguide/details-for-registered-backstage-website.png create mode 100644 docs/assets/uiguide/enter-url-of-component.png create mode 100644 docs/assets/uiguide/select-register-existing-component.png diff --git a/docs/assets/uiguide/backstage-website-registered-catalog-view.png b/docs/assets/uiguide/backstage-website-registered-catalog-view.png new file mode 100644 index 0000000000000000000000000000000000000000..9263eff0c71e8d4152b7917460deb10fbb324544 GIT binary patch literal 47128 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/details-for-registered-backstage-website.png b/docs/assets/uiguide/details-for-registered-backstage-website.png new file mode 100644 index 0000000000000000000000000000000000000000..00d55026f2b67197992d52d35bd1f373f4bd44d6 GIT binary patch literal 84998 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/enter-url-of-component.png b/docs/assets/uiguide/enter-url-of-component.png new file mode 100644 index 0000000000000000000000000000000000000000..c1cc6c8d502a76aa5377eb61a8c1ccfb91da24c2 GIT binary patch literal 76297 zcmXtfbyQnVv^Av^DHJQTxD+TY#a)9FC=@B~F2&sm?tv6{r%>G8-L1GwaCZVhzWl!T z-dZy^>)t=^n#?_OWbb{#73G2N-jcjULPB~cBQ5b03F&n)5)!fiIx6DH4x5=A;s?WC zTGI&$3A^{d`6}TXHYwsEnzPIgNwfpZH+WRc2lQP~BqS;%83|Dp_w-|3k92~*MUZEK zSGkb?n;3CiT(xsdD_mT>t|QFQ@GlSH?jnM?Q5O=Dc`;#VN_l_7KQ(o}$03ONM4}{u zcM(P;DH@+0_KDGK(bR1`jU~1Kd=}9dg(|8b&FGC4ppXwq%tj7T5vadk{dnoVQiCP$;cK6 zbqF$6s+Gtif6)DE8jpsI{_xnRmiHrvRbPM@AS0%DNwa@NO?5BVp};uCW@s&`vFtjh z;FspO2sLVsBJP`vY9d=1UH=qc^uCERH=H;3g2*Ub!j+wPr?N1|Wf^-$c28+xxpz`NatPD2EiT2{~Ad-hfG36jua&iYREfN;jESW*IIR0Cb}C zIhNvI`GTVvedCgM%@_QshoOURD)LZ~Sj*@WNe>h8yry{D8rd)0L2@x3@i!09=rHT$ z_w+dm1e@Rn5L<@2&{s@%yC1FnTs zF@V`Yi};tg=Q8IWbklp_2i=f6Vs8le%y@b}T!&}Np*YJ&5PaX2KJNT7DbE}SvfW|H z)2r1H@F=|*4A=Pvlf(chsh~-`FDu)1B!-$O01c1qrVjte-Y}6ixn8DUrvi2wKb81UCg1RelnDRUZigwpzrVZ8|Ek#2U5mpU@?6y;947w znllo?MR8{M7P@~ypiLOfNF5$KT#HJJK|!sX_-8b;d4hm_wI5tR0Zw41Ih9~m)`_>> z)WC|-ASfHk@A3g(uvLxs6?LQwjj4V1w;0~0!w{r!BNG0G%1SvHa$jTYak6C|BR;}v zT={A-`v*QUgvunyOs>*3KhVNtG0M-R=Sz*66d&m7!QgA4OD$dGrDA!c9t(exYBt+S zz^+9Q2Z*@~d@)VAhtIG9cKv+WRmp%3^FEiw=TAr|Q4Z9W<0m4!7fo58h?>C<*7eHQ zfzWS-(QjEuaI{jec*lnMZHrIt1#S~g-}N+RnbJaVJE1XfyMrUod&if6XnkShaf^^d z&4+kUwu^Ufc2?{ha2+yrI5GE3s!N~!kk$-(`^WHQ>s=aqysh?Hv{jNCh9u|C&; zBu(U3ll=|3pmTDz%$^v)b?-V)NsrCT#RDrA>#Vd&hV5?FB#)0uKX+^s*Qeace#EeD zeNa~9O%EiE36^BL6p#t)x7abw6o%1Z%;r=Zm2|}brE`;wv`l+u7ddfT@1%W!$0!$W&H zn`FfT*7p+iGW0Oz>ksIzB1-Kxto^B++F12dNH#ShHXeGCyV9`PcTuA;v2NE;k;~jG_5dLh|QMGZ}(zv97e(>XFJ4EQdw{{ zQX>tCYfcy`?lt3wOJe+N`Ut1NtL;s%DY-XMQ59%l_@e;Fwf0n0r1DpE{B> z{Sp*mfPNwIsjphpUxG>ru$qX)D6UcXr;~*E?*Z-9OJo=v6dFRO+*@KcIfWCLLgCAi^pk)5lA$ z`czrkXLO>`g|F+xY1H!Pog&%oj7thRScpq((?^Avol0FQ#*c_S;z9KoET-1qXDL~& zLj?H2ud!#h*Lhw&Xz&%{eQ(0=Pd=Sy^Z05AZHlI*fcPxNE6 z(z5oSTnS-1yYY$tFVoqPcOj!i3VL5T%4|pXhZ8n2@1M{gyk{b=%Ay~b`V15?hul9# ziki;h%wZMlmD_JeshjCSBZe57`684VKl8CTUeZdf$BgrQFMFSzO-F)=mg#N<@uU&K zl3qMmvhSqMa6~P&j2T1h1^dlu@)hyWa|Ll3>q*FL2mmq?im?K>dXY>~yk3^}l;#TL zBhJV?3vGy_%`}Ccnuj-UGJNN7%PEl3R8=VD;Nb-(=KCmi7$j;zAGU+$5=6yOt3CrW zNBJf-6@jM|ttl=leU>K~`b&r%ND&s;VLc+A7`J|D@P<4qyA+uoJ(`%lzO@F<;;RnB{OHS+G|&wpSAjdzn92qYF^36^_F9x4WVsZQgYdZf@8V4D%7c$y+r!NnE+ioxX)ij>0TmuWj z>u5?xItf*+l?~B;>bUJ@*sYO^Ps$+}7NT6B3^(xQ)N$|nyzf{4Lum>xY6xKpsakxz z6g9dMc|xMso>PBXktr}gfCFhr!!oaD42Fz$40uwg?uaD|mXnnTP{;ZN9pX%l6AmPp zwROOEn)@HZ2XLdM@P72_GNFxU?%L}|JA}LPe5DbV0%RQca4r%dwa5+60+r-LpM-2- zzqN*xh$Ql!fEjFBz4k#;ivzW)->Z2+otEC&~|Bndm$l~NkSG$y|&b@ zj$Muw(ik%w^N}{T%pxLaiU6aBWmtO^#Rm{YSxdOo0x9;)di`{~?LetYe0^2=#KeKB z$5-ISf*}onNy_LM0!X-y(-NxBib%06xgA$0zcJ14Huu0(r0P_Z-j?Q)W;7x;HnI53 zg4@1C4jug#*liKbzusR!FgX>~EtVG_)mXsazTN1LZQ+^h*WZ}`|vyRoSJsg#e#(oVfgP|sae^;8R0&dCc;*-Sh(~d;p zyn|RZ-JH`obb;oZvSNjC_)RHQQO52a?Dza+&;CBpr(bG0 zL?M3TJ)KG})|5L|%zvYGti$)!&_I+*bO22X?IlC;)EC;R5|T2#E+flIS#Z=9EIHR$ zs*9L=p4i;AXZQ!@cQt~@`!{~oB1oXDAbXWHGu9SZ>CLc|uz-hr`}8SWUGR;NX|R3o zyCl49UI6G`#4uTwo483HGRU*^@V!@y_&$qy_~+*!++#>(g~)v3)Kt`vSgsIJVsL;_ ztrRqzn@33FLbgupI3%zK!|^~C9T_+N5gkUWoLFapg(L1A%xy6X*D={%Njk{2eZy@r zeaF^cIL(qMjc`e#m|XCvnnJ#nJtG~pY;Tn@J9d&7b)s(%_twNn-}vNHcxsTHl%sX~ zTcEG4m;=r1Id1(;4XnqAB>6#kP-~yClfz%nS0f%Cq_gG^b(|3jnos4Qh=OQ6r^uo{ zC5AbnvSDt=iCVLOjhH7pI?M)aruH-pweV1k!rjx@wBCq{xctS+Rd=R)xx!XzJgjzvNnjvcV=e}??|x+*BF3?1lOZ}QZmMz;WG<+I-e2*$y0wWD=}+(HJ=#3K z=hpjEVIH8YmFb32ULI*!uoU&X-k(55yrd^B=tV52mOzp^BGP`;eus@Miyj~-q^num zkDe~X6;VONF2L+H{HX@v(49DAFNExs3u1JjUT;~Zr+k?EcL;K;Ju8%@B3<$^1~Xrw zq(?27kHD%vS)tD5hDBAgX`|u>a6t>%eUZ}?s*7=4Mt|ZtnM$vo6W3G5xZ-w*^0Rx# z{`g0F3EzBgx<2b})m^Rg?_d)(gW@Fo!V1#@0vL?_B8D&NaW^UefEz)T{xZt>4Kp1L2i9-sbXO+11a;L8FjY-TRjGYSPaGIx-F zPu~h3zOM7sJhC1E57gVZA{B6Jt=#wF3D;HCkpbE#9jhcvW}XM)%^jBX6BagjJ|L8* z{{|=Ge7_Cl+L6ke#Hv@`ZEj;NG{XgXKK-Gk#7YDNE@Lj!k9-Xy0uC0m6MP~+`Ll9! zFj$bcN|xZG-t=ReY~?p28UGUJwGnAqLKiNBxc3EZbUh|yLv)h9rZhL)x31(kE|Rg} zJ%M|Vv;3C+Y8{RHiTVQ#>Nolm9)r< zAQ_FJ@R~dSFjoQa_VWe_EB)%5C6uk*H)^& z#3Om5lzs{X|Jf`F&uvup^fq_kpjL;#C-737H(S^WJ@G+~_ES|FH4SYA`p`E-l$K~! z<<>GTVqHgMy9mcRwHre#!&&&DNC``A=-X1g(+ZHwtBKKm8JIwLdau}gl=ofwvvGyU zwYw5A7NRVy6vmg59R;;?8Qmi_xS^`zY@YKanb9o{hVjA!1RP8|vY&c}c#W!9T|o^P z3LTdynQJNS`B|T0>@2_uQ%PH6GOv|l_^p@f$p)TxqE<}Nk^Pv7gfBSLd2rnwx_aCh z_cWI2-}b2;Ma|TVx4cd&a^V5vsOdoT+v4)DxY&domf|@sMwkUyFE;-mZNFhaB3*!1mXnktBzn_Tq2Ru@VQb^#Mk(y0aUy zG2Tu&cfw4+v!&OZ#%ofzZ>JEFOpX}zCBv_$2nwpkK@`~ZO_xV&qx|0{bjUbjDf%H1}JSyF#ubn zXzPB&Z}l9$XTnko1xIPGS9r5#*dC7@IHSgEV|^|GmD+dXHjh&qi;CoUfoJ!B`xjj>Q%*~eLmft;kz?lb*IjlNAzA$bwfKgT=R zNH39B5b}uj&+3TE$@}w#iJX-i^~}J4sHk0jGu|Q8%DmD3k|2FbxaC(#2xjOu5yRj- zaBh!qQ?^PxoM4&ZWvd|4o(Pc$If$qhw(bvhDKRLnIqV2sgy$Z7?>f9oy{S2g743Ww zDugE_-cg%AF3?Kgmby&WLyjF!wv5lDnx{jG??sN`Nhr4_A=X$+Ex|+ghD;DuTMyPS zKZQ)}6(U=<*^wWWxB4k(uSo?Sip`z^w~@215Y5|9L@aE zqKF4@=1GH&@+!MX*K5}~LB-3X&sa-yr%0eqhkP$|6{N*l0p%Of7639g+ z<-|E0FRxXeAz1HRJ=ah_mVHQ#d`t6hxT>AQB#L#->le3KdztY18=B~QzH(t#UhIMu zO)m;}L3Fht$7;?9jT{AtCiUV@pyprJ*5RMaDR_I?g8x|1$eZtfR2gqOM)5#fW9^1H zoy9n5f)+y_U>URe+>#hH z>n`ypKc>l<;WrA2i{hdn3IdRfS;SUZS=gUPE#vTO0z(K@wt7011 ztt~~kTM=!#V~GwGw)2=7{F=Dj9PhRcVqM#>&nhO2Fw94`mMUgwK!4ziu|nzi(xp#L zy$#7>TLD|Fti1`6q$sJ{@BM4?!&G~p1wB-kBhun_ijxS>u*`d!<>7VtX_nsa-8NsH zD9kl>vuDqAHk^vbTG@w9p)-U1RW11v^Hmo6o8&y!TrWC?c$wjF)_R{OyiBbNqC`;1 zejzE}i4b;!0tJLkh(T%d)o*a#ud|QtpuWJy!Vy#VqkPe#H*wDW*HhPA*#{+ith*B> zGfD09llmLONm`utPjyY3bTRo|<=KdJ4W6voew zo(#|9$?jW4ymw)u`|5Z>EOnCRwH_YHshzw#8d zKOfE2o(XF_A5+>-sGT^a(2Q{r`F3w(Ee_|ZF9UoD8w4}HzBH%{`3>nNTxvtInD3E0 zQtbsl-<<_B7Zr_HNz*)E-Iu^tr>&~`@SvFJZP8sn-uG|70-LRdea~?84eqrkpgF!T z$!qE*S5@w?f6A=ssYXw$^q3b{^gKm7Zr3SJ4(l(9F1BZAjmJ2$=h!IeE?s9u!JXai zFFRIjR=Nxwih)@ftiytGz~^@!OLmq@)^@W>&<%co?Y`LD1C*n05%bt zw0Uj%00(tq@~nic;{`m$uHnxqGkBO3!jk(ZV`3+p{~Ws6>+8(2*>uslN`Y3!piUpiOGGhDbit=^!qahE7@vv zx1Buvjr_qpp>E*89d)xW4&cdBD3MV=WTz#HxUp;GS_H6 zlv%my$^_@H+%E%J6NVvy6c1QDnIQH8>|_676|$&z`p~F^J7{&oEz*9(!8A*c>5KTz z{PS7m=_)-N^d7?HFwyEwZA+G%+E4O~)$j~@*L<)QefolZwC44She;bk-rpBN4IMZC zo@B;)+Q4{yq+5m308+H;ye1DKo-Qzam=tHt7Np}P1{y=% zG#Wr}cH6GyL&iB+e2I9Jer58&F(e9q^kDHvyJNOL8gZR^?aDB!M{GA9RmsfGBW+Hw z+TD_Cn7Fo~8{?1%ks)kE>Q1VKwPT=G=4XOAXNKmERM zb$OZFPj=B)Lx%bo+*nEQE}E;R zS@p1StZdk3ZxsT@L%__v+Sg#Y`_AryULCyLs1hDJA<_}@pD+vb@7-`h+O}V*W89{Nhp6aqOC#|r7Rs; z)Y@B7s+lZRyIMAmugZG~UxQnA0Q$JP*hFD*z92f#KWGK7&!Rc_E2lqI=Qs4fZxcjw z_3?f61$}ok9#slMgf)VxX~w($Sz^3D^OZCPUsGIJ33?pj?f<~h@S;_rU?upN=_ZWo z9j{5^EN<4fe?#F!oG3rlSGKRRM%WYbjNJ2pBXTA@Ht>3V@?Lkv?|cc8-G4p}sy37y70!iru3bBkKOPy4qdWcG1=34^MP$pdR?3t=92zN63B! zBWW{ggVKKGy_xAOp|ZI?_|?vX^G&D2fG+suKq+bnr!{xl=F6_`9<8q9CW+5N^V2ns z2FP9=b`V$OnC5Y7ts+&?!?(X%v#K+)o(OcEktZzP4k^dCKtX! z?WY)P$<{i;G8x-OM`!E*k9yR0vJ6KuhwDLoG=43NHD3KC{{gjY$z-h;kY^eF)w7|@ z(Or6dgU)aKPbBk_mPwsug7I0-gJLJ3?%5K3)df0v+WZ|vogplh13dS;CFH`~ail7^ z)YxITr_LYla+L~=mDkn4!=m2C$^N<$AQktdUi0b*jQW8_HN2vXqzGw)n)O*WHvhpF z=`bv6vFe~!eh?%p6Z=*Gr}qMCwlyJqklSQu{#1AX577;1GJXeEAu*!se>|(Ozsjkm z&XB{W6?h_RP$(VYwEb%yT`tQ}P#i*g!|^W*7x$851r!h-Qylo>muLT!5=f>Rpx1T7Fbvesl!=vayiREp;riLL@OW#K&bjwf z?%~QwqmHMIv7zGViw=AE@Hd}_Voy_|B2I<}a){LtdaO)tVv>?Hx(I((fIt*j#U?<> zYsQ(8Y+BOibh%DpgJt<|fA=)`d;0W%Orij7dUF3vmHU$w7$+#NFzlU3bVjtS99V^k zmQ3*2d6YDJyTN8u<(J}Kyd$-Y`+j|KvqDJB_dLf9loj@LhOE@Djds;l)L%=qgN-4R zRYs*Q^+zchCPw*|iU6Xd3@1SJcj2&#m*LyMtJ&EvSELoG zmZVvt{3qM^hskv9^;lC3udba@{n(>}uBB0YbV-$QX+Y0ZfP213k{g(NPvXo~AgkMo z;a{bSKBW#1!rj*MPivSI!K9y`kPELX;sqRy+~i1jD4c|~F_4HZYBq@u^K##vbw}`I zcE7f&&)y2-V1=6l4J8tE&z6vkQFAB>?Vjcml3Ok%TW^^B^njZW;T@e{eQ0OS9#ARm zd?+V6ShPiCKj=mQgWgx}?<%v2WvDj4@lE!kq)_@Kux*{r5yt)zKg!)|Y~5kNs(M`g z#ZJrIcYd?+95!%1$6)$f1j74#RZ-~hG<{}Ka6pnQe)v-H@YS^O>>gdc8ya{zvI3Vji$D=odEz!ACB2|8b02=Ut`rdCt3c;@H z{>Juuqh0&JsL0;i(t)$A`_WqtDRg`Jms7<^z+%|lJiy;ee>G?f$ucw}`kOEJTXCVN zh1(wAN?WKWpe{wOQQai*#9Ais*&QKB2?|Fi(b{E=?2 zI!AvQvjut9UbNgao~4*q?qeEUV@%u6%lx95ThGJh0OFNu<7_luIV_3{C(EApgj!{F z>6XkJkfR#!_8v5POF-f;7!5oBI#umMqmu8#Wn}v9HlyY#d!tx7x_2n$9!7`-8wuL?EB%7btrG&l(tAmw+Y1*LHI2LXgc={oBDG)aND3%R_n9{< zX$p)Ft6QoFkfK|Vk_5ibJ2O7O7)Bp^1tED}fX)mBL4V1YlZcc;9lx}YpI3t|*L`wg z=l0)kXY^DIgBqYi<}U$Ob3De^;f2t-3*hE&74jl7cjWRiAL1mCZRV~WHz3d|Q{SIF z$*C~ad!gC5YPP=*ng!u3J04Tduea|}c}bgk{S3LHhXBGT`DUMg?)`f% z0ddyX{)Jam6NQt{-o+E<>KsfvwP+e-zFIVqBU=Wzznurgc-EWo9yTi_b!dmyJU0t+ znO@thG~45N&+CLME8oFz1hJB~2v-zPjVvis|Jd|uzre`L;Z!cLuAk{ISsw&lcTl3( zWTibjM&)jHd{pXcfZYqXeUTb9G_&Z(?r06dkJz?6G8u+yF|~g)U7jW(Mi1O}jhIR8 z_3D|+FI~#K9iqLMdl30mnwYiJO$CQUxTS1EU;pTlL#EJvg4%wh*-!XD zHa+;uD1-nBpi(jV$#oT)lyfdFw%4W9MpH08D zuokcM;Rzqp&P(wIsB`z=(^$1Gq`^5EN-n^?nE+YuiilrHllq5cOGerLAdvnDSuOHj z4w95D?@@Eap&%~WUn9(eq#=1_B zJ3c<;v(R}_uDRbz>D1^&JFW^-_Ewe6!j3s5JIY}P`(2%T{ehfQ6^X_(xrCQM_ldVU zjrG`B8L{%(rXD!B`Guq@oHpe6wE}ODR8Ykc8R(zo*J-L_3C2jjTa7GLH)}VGPNEZ++NiF`w^;Fhhf5ByUQ$;=c;SqehWa#|iSYN1k9 z(8DcEw#yPI$fHhPkaOIzL}V*!+$hPhFsP?zZ4dYPqMBcL`4O6yVBNKMMA_G;pfuB6 z`Fbj@*>vx&;^>j2VPi-4=0M!{ou%)0D)hSj?+QLP52!3YNKCiwVZNvK07$xb{pswgla48;$%0Ml7WU0MtGYY)83Z{ z?!=Pf@jSGIx(aqsXdQce_}0$7_I?zA?j#5!NA%b?y1fb z8{iF+914QZKUXV-4cHKH>!&}xMY9y=4p|%g%|QYo=2qkg_vMlk+b8| zNuIZXQ4{%Kl{chSFe^|0LWXM!s=^~ypJu&b9rWQZx_LkHfgNzHJFD^1P98Y;lnhMM ztQd&8nZfS#&hnifPrZ@VgK3xO>LKTJ=)W-NG!u)(c%1KPKh8B1Mcy7S(g|FPoIyQG zMTFSnV>RG|5TYUlsGtPwtEfds7~oQ8t^Z4!aHRy=<~!EDqK%XJ5AVlnpu&eV4L%NK z6LXgcL#RY>4IZxCQMgdDt2+yXKX_Co%8b;-?coW^IcmPlz>c?z?+xRyNmmhSuXibz zNs^hJKTk7N_;_DbgNN-6T+CI1|AmCVUso=G^ZUiT%_mY7*iYdr#Ii<>WrDdss&SFaUiuf)jq_x-m}yuTLKk+X3sskJoU+YSphLZDLF<=U1BCTZqTz`?DByWsS^ zVV68_E+Yc2n*+b>e!J@2m!bvU7ZuqI2C3>FG3~r04a3uCk`*6!{E@t4+baq5gBVo)u_%rBUbKoDwqCBAt)L7~QqP?sBW-lz z7XR(BXicfg5yV~PG_4ZoBRZV&^HCDC}@ z+WPFuS?;s&8uxlodR|OiCgp$xnTT2bLlh4OaUhD1l1xhs0f;diSDy*5A} z%Gc`fY}~j{Hnk#)W>H2lRln3#3DyV4@V^Z#M(ep0(K3_&C2$OfF)f@!GDpqs9zsO-*-<=?QM>80JD?uSx|Pr=S!mNwrH;B5CNOwPnLEXHf!nix{lVlb7eZ% zn-Q=_A&7Ug(dm4YsiW&%=)a88V^fk(8o`0@d;*{rmLi9(Pg#!ZgIVi-g@qY@Y^&2! zmbFb3ly-W7XlpA4rV`58M}c_hyH4e2I;OLmDfBqA>@`S!#iG2XrN>XB{MB!)yUFj? z{g2dbdUt(L8Ow+yCfZ#ZH){Dbybca{Q*mbpx~#**&X&tUt0o$(dyx;G%$_K4t_HQe z-b_7>p1$h2;q?A{X#S#;CgH*LdHcN42!&WL&~-CJM_kKHTV&61QTh#|8l)EERsCa3 zN0Q_IjXUmdZv-`_NQjlgKp^Hp73N3lwx59ataH7UQ~$^1f3V`^qi~aNx4=&Yn9PK) zn-C?k4%birN37GTBXx}?xqEFC8r3KWE($HiYH=}wf1pR9MU+g~TSpeSH*mDYE(QpD zIi3gY@iNOi0%)-_J|XVt3D{g!1{Vc^dd9oNhdw+$7AZ_m1l5)H)!&(K?kQ-hQ{2<7 zhxUK@hn>*HAcuTjeY&P>Ra{GNvCA^eK6yNFebS-VY5Jmt{R-I<4bu05eNPEKo+f{? zvit}4M)iV@DzkJ0(1)J9FZJC+%r$!4$OY>p~e3V8~@lfck z0A9;0oc%cNjwpNyI^v!inTIstb2wk_KN#ghM!|)*f7lysxx}Q<{hk~oURkm%oAMrR z&euH@X7ao>B@6MAFQ1m9PQvRAt1{nAS2*p#U*#4iUcyb$jUUOOVCiT^|EBlaZ;goK z!JbUmf-1yS09U9a;1ZC8#NZj#x8hX42?MV4MDeUHax&}3()tao45)f2>^#n{(zq+r zI5oRbt3(Zn^b;Hwtrl}YdE&os!p%65es%OIav8sdle>oIFdqjN+a_ZWRTj_w{a4vF z1`Cp8Ax$Px4>{38SJmA~&j+$XZmm9MMbzWsRx2l!mp6vtzE|!daXgy)^XE0b|9*DT)?FeZdUy8{Z*Bm`cRFX2Fv1D`bfZ zwAgvfPeXg!aWXea()DJ}mwdcS_(tI<2(6XxAL~q)~y-#H2b2I7rK-_?# zvpSN7zrsP6{|0rkbL_L|M&m(`1Ci>P>)FGC!BT~Q;#e>Efzfb5!7RJsb4TdL=vr<2 zJD4FFQfViBs`IeM5V*VVY($S@5$8VcwyaZHbfdIHK!@2kiriVVQ>j^{t2y*!r`6!HC zD#%o1fWEg5gSpxSZO}(1rS+JpuK<++>6EHD?AQA%#HylDrjvL$pNV_y*SX)%c#)Hr zg^@ZSW|=2fs2$D|Al=!^i{4TWwm&>bGX~p@n(j8w zJqz~JI*(8391c?(YhN>MIVfIIL6!Iek6UJspcSfXWJLjQ28x&2aNZdcAd&S$<;6oD{d;m^z(%L5f_fv$hm&7ud?YTW*SU1|cigSdFxh9;BRO+Pzu-2E<9uNZ zXEQKuZ*%Huy!#IgwkVF`&G96r!|OJnoe^3hqi(1Tfs^i(FY<2mNxf1 zY6m~mQP8)C@_emT`+VR6Xz0E-)AG*=ojKW^wJrhQ&pp!PKHjaXDZ`)Q>5#P`NwfWz zuhjg3B2LzqT>fjW%$Zh9Ro>Iubtr@$Tgpz%e&O$d`^8~6?`Wrd9S@0Ke=+%tL0kum znT{tPGk-p65H1#57Y3qC#^IItH?&eoE;%(yNtuDjOdwrWR<}89C}2qMt0tyuT(1{aBIi&jCl;=fG~z z^}&$OIhp7`akmY8T<;@3NR9mXV#gSL`u2BfS27oL9PHfo{E${1{khqc$m8?;o^NwT ztZo!kp+%X=+;LK4#q}iXV)e zAeQnD1(s#tQO+vM{#~B7s*5~Wo-K!{!t@!50Rd|ieE9WN8eig6t#e9h@_Q`$fbjw) z2F+S(Woy!N=3+CO#w~6<>|f5TxzxHkcdR+>ydaDsMgBkOGBKur#ZvY;_)vqf5sg_>lSKESlY1j6XqdFv>kHgl5Kw{Po`UOy1kC zxUNkRT{SekvhII6v+ZAqvz$GVv_u8>w2llIQjq_c^(W%H76Bit2R^I|`I#bdw>FcU z&1Htr%-WD)_sY=ghR4ZQ{|i+-;5dCw_uOh~bg=gf&x%;WNLCjREx`%iFCTONDfB?! zZj%}i6Cs~TBFAq>{rQ!}gCnt?KI~KG<0Y#O2NhTKCpDw(slAQGyossagEPIz_bu~V z=i^aC@CFwWR5q*9C)D*!PV`U)Wp#K|pAXQked(KU}a49 z=Iu-DuR7^5cbEriR~k-I3G&LZeGMeyJGGX3aTe_-Fkq5`&MOxffi26>*mf6c{+mBe zA<(OeIV44?CD$AP*0u5xluE~EHL#JSvmS@JOItyEXgnyrqZ&a6Efi|=-CYRJ8};NA z798nT(#!Mhpr$)UNIvq1Ofl-f7A(^}m6s-O+{mNX_4vp-xFR^)$tQ&1*hm{`zJh^! zhvi)*TmE3Cf=WXkRg z%(DQZOkL)UND|6vqBFt^AsN4L?Z~v(eFPJj>GWM1_M@4EwOE89racwCwWnVfb252v zX4W@URyl(LQD+R7{HS5!wHWk(xF!Y%ZjHvfj>Z%%@KJWm{1!Y0NsD{ajna15@@;k8 zgj0Kz>NiAtO^H{2{YQ5c9B-pT3I8}TtShR z8pmw4e2&m`3#oGK@HE4PR&GW=;3AiLIDXZ8LEwzmxXh`J z$e#HNre$nY-(uz3qckT<`}gDoNcxms79$(C`h;e%0_M-lWt!ANq9=B|OXlmd%NF~kNPo#Ong#`WE`v&<*54tt4qAkO>D@bI^D<$yP%lK1 zfDkX@g%2xH+E zPQX0Zt{fAxsa;R&M+APUVgGH{=KGM0?%MtCYoe<`$44i1%-rw#!ixb9m-oVCMg$6I$^J=#FH3*0ER!#pTK zkk9<&;UB!~1nT5i09{dTt6-~_dpy88@ZcR%IBzOwB_v6&`J?iw7rxclta$(^=&-Et zIVf!o6k#)_lKS6!*8)sO?0P&Xm4j8-&uqSGv z-h&GSFC=xiIBcUr!9|_uwhQ?gXCHUt{`3b}^!PxK#PTA|G1hFFMITnw$UDSh!lDh>NDApSLs3V$KMQ7z_^%WZ{MJ*Ido`syK_^$CmIxSk?Hyz#zh}mYd`M(M zoH`m!+g>|_Rs_`WPh1?=g!JDR=LlMAi*PBtr~%fa;f{@6(czX#w24(`K2RU;HVD%R-A#*i!$w~9_j2O>vsS|Wv$`9f zloLm0N6k$M;R0APLX+j~BqU5Uk|XlK#d)?j?H_Zg^yimLo?=SKAV2a+ZJhW(9w)^j zk>uW3GpYJD7+P}H(FN4z-l&7T1iKw6U(C-K4JXU+cCbj6gdSCWMWf-OSylOh9`KbT z)+$-$60=CYZ6pIhTDy!$zX2Z+M=F^w!%}qIO7QY>=GFP;LTyF9qBbX=L>Tu6yKT)2 z886gZp>cyQDD+wO_K3E;O_OrI>T@I}h zup^?(tx61meeDgff4U&TFDpYd1tgSlzNWr?!c&6=_9ZJ_yBJ|LV>G0C`E-oyWJcca z=EfBJHIWhZ?dIycX!41HJOtAES<~Q#UO|7sShR5xf0|wyqoN_R30B~!_D^gqU@tny z#t%3D@+Et&Cc&am4D5Ohim3UlDcoSbjQW^hm>*z@qJons{~I4N02O6V;lw%tmM#+G z(?1BvL{cEL6SHd*W9ykEUK5c|M`-Mn5WY9!6ic)+K8W|PW5AY#{1{_{jab@SypWJB zz1XMob@7j{>X-M3m%imV*atwfJBNT7n)-npf2=F2*ctz%uG_pqbmi_{eh+$l23rYs zI0YiT${oN&&=-0)t*vXpiNPoP*2tj((zM!BWHSHZfS#@8B%z~Nq~DCqyLuOIc);aH zXia0$JI@xo?WL)(H;Fz59OiP96GxC6cbK+KHI2C1x$6(c@*cgEEG<&es^tKY84m8cHXtu4ir-yU#$r0G`pI66tJ#0HV#Y zTTu!rEjolvYM=Gp?eDea97x&PN~JP2y`7Wg3W%-pl9ri5Xx00dFi>>&KWhxr^hgK0 zv`^;n2X^{lD2-cfIT%Vz)cxu%a$ocE{+dYcj#uDp?)8yE<8;mTPZPV3{E-_l=x4`4 z>&E>Fh1fHaB?AMsM;#{g+nHw$QC&1@1yv^|&hKj7X`AZSeRP{aeB2*sNr8cHVl>EN zlY{i*7uGq_EDNM)G}e<72Rawcqw z!T|@cpY(ES%ceqVVskzUrtmPudt)-scyEpr%{?iNQ=DAJzVheB4jE(fIyd(c;LO-; z)@Xu1N5Es(6e$h?M>6e7Le`{i0j($l#Zp@uaX-hGBn&;kKv>lJY--L-5M`HA& zw%pk%Hmbt(auG;9iucMu)_12I1GcUAKo`pRlAFl>Dzg}Qn2}Ei68m)32x+yXxJ3-)saJpdYzdo zM1Dxp31)6Fq4pAMGa*nN-u|NtgzTT%qwRO=C-2-9TaPvhmp4YDiu|cI-=fHZ1G^V6 z0}No9d)@AqP`3RFlC^>U+Uie~4^7|Z$=ftGC0IW9FPlDTP>YC6?g2Haki-xjF7Q=Z zsgHX9rv(sOdL0BxdWz*Mxd~AM09=EKWSDym>e2uaepQ=C^;k3n1%hvTD0pLHZN``- zzF%hO|JTQ)QJRfvrG3QP;Bvk)E|DVq9}HJa`6q2KG)pj)Z~r#P%vdHOh7N^w4H=x5 z*G2z5)h+Wz*Trh7lI)|hO1Uq6WKP=h{m6%pP#?)jrjMMG-Q-66mD2For5j&OOkn0~ z<_gcW%=hK`Z|2?qA9G(76<4#Ziv?hxDw?(XjH))3qqcXxN!0Kwhe-QDeW z{=Lt*d*A2#aB47mEV@_8nl-Cxe$$prW9>4|$g1_HW2&$S6TcbGMD)C)Y(s-SJk4&2 zAbGE_DhB-JJ!Wl!(oQx~MH$sD=jUlq&`h0#e&|Mg%{(DG>`ZYGbrr-;6ugW**ICPt% zgwBnMSGyE(lQCTwX!DvbS(Rc~D3E*4_P|@@V~xAd&~XZNfIod&OjA6z_s>-VbsN5N z1Hg8{iS@6L5f>%$abqJxrvu!UpJvkJsG)rlE`KV$*+vRN?;laiVS_-n1@2zV2DC|n zo3?oUS$26ZJ@gGVL0D76mG7XyN!@r*Ff#Un+Pa9#POvm#)618FbZGW72$K}Ly7E5J zZv?$SX=$@Cj!SbZQj|yxQo9kcga%)AY+-8b=Yz9kVGPljFWboiM*3e^kMssh(?|TT zybbkTDy~;-oXzI1t7RksBfT;~qB@Ct-BdzX=!L4kOtjHc^O@GerX;F{Gu*R4n>Hni zuWT$z2J(l364pjf4qA$U`Ryg@EAP`^tXpuz zhkbZ}=CXk~55TC%%HU>CF;!t0asFN3TB1vg8trvB)dG*Bsc~uO_%-*exQhI?#feif z6fI5JsZ3YZ*9a{@9_m_^{8>h)b4q9U+e*8GK|NY7clqw0FZRMa_J6*F`W?m~+mY5( zQ#QO-A|&KUx(5BllgJu zpjdR8XZ!ov%}$qVB=R^YzH{3@>u=J1Dt+i7OgjcXd3obbi4hoOuoR?z&pWrrJ*PRf zz}Nv&hR9Kliql)zG~Rj$%M?(kKc~4@xmSL93bJX$PY>O)QHQ2!Ai8x9x0@93>m&`ux{9AUknFx7;wt z;i9_~DdAJa?;{+TGgOJ0Eop3C(TG&M!WCDWNetwQp>H5z(kmCLYQS(srTHvx7>+`U zyiCXC`7;DfQ=r1L&r&0d=s@{P?H34tZ#~3Yik73eu^MdvM~4mj*L+K3)?o;NS682v zEF>B{r=u2k^E-)OAfl7@sEe=}F?X=x)+b$qIZ%I{N0Q_n`Gx}|{X%~V*WCxfZUqO= z&b6xy@?cU@>e2i|Ybt@=Zi9(oGi$vZt^8i~rvj@1uSIAHVhE{E56!rR<^e4j+@(%i zf1!ed#^t-At|asQxvf3zWQ>d=RLNgNn$lB<3`>v6{f?- zaxcIlHjQI{Ux>hHe{lD?i0d$s2`MB40kJ`-YK!a>M;$|m%rI#Nvfo)q4u0MQT;c05 zi0DRGd!#2+YrNtCvR_a^al4Y=W;>1?^wGFTuDi`@qRg61p}Ya0Oc`SCM8!X{kb_ps z0giV4Y=kIK#*_1UQxeCXG3I|PURc8P%T`Bn0_n8up8=;s&ZLHO zY-J1*xU}s;U1yD*0+1ZP3zWF%0AVtQN2XfJNp>;?pWI!cE+5+8hNiSPP6-sXL=3pr5=StSR$86YJuHIXVqovtSaZoRXd9_UQJAqP;!q_$ez0fhWs$JLP?Dp)TE>9%Z&1RK`3*$RwHoo3Ijr&aarvO zNd-T@`5o0C0cXlKISrHHck+h62~tlG@02;osbN!ae!RsZgYpu5!w_O2Ff|b7i13~- z_bN~q{NyrlhM16p0!sGrn_j$7s%WV*?@8@bQ*;hQQ)QcTc~*{o<3wxR&Mg%EiQ(_p zHzrOKbD(2KrfqY#o+lKzFxW0DuwuowfQQk*CgFk3`m%AXpF%tq6y0CCL50{fV>I!t zmbuJ^smq2r&gN;6GqQ>_j~j*GoyeE)fjy_Qq(-{g`f~@}4=#GLWgRSX^M}+f<3jcAlWkd0@Rz6r^RMYotn?Y&Vw>vFnAI zD6d5^I2S5rGKq+gWJ5?aWROl6W$Z#QGRwrweuneMB3uci5|YeP{i=7>F2r$%?J`U` z%w)Cgn)9wvfn@z>cbTzOGy=oYKQ$a^p+DTK7PPP%<9d{k z+)Jq^6SkvwTcz(i@5xA7XXQLhtb14CdvZO{WFU0b;vuZYVxg1jqDb3&Zh?ZeLkTc) zMa?^mJvYhl_S^{s5UO=ZaY1X-vlB{D&v=tR+gB44i61Vtzz@HIpRR4F)p}N$FqDd- z=XX5b#*_FbSO-_;FYcxbqcuuh&;7E2e=iwz(4zVJ3>o{go+Q<5#j`q*Ng~vq60LN2 zc(S1V3$J{A*OIZ*pV$3Ejzh`}A5wD6$-0*Q2{?$&8wuBwSR3z|kMY!r2>fGHl2o=9E{1kv$Y{2bRfFeB6ITGQQH^W<9W&#v2$eXVenyl>^! z{M}wbbw*wpiJ@Rr_^q!>JEK_oE;YVH{RSB9WGB!(*t` zV@K1WBSus3uNj%nXSy7rzTNyV>hFz3ww@B3E6&>9^{(^e<2tUmJ|yoT@M?S^-PKWUWx0;rEQ?F5%AqSE=Q`PvScw{I@HN~ zIo(#YvA5JGRcRgrb8PkpEgXH>na+rJbw(m`>B47|lNFf7ul7p}xh4peGn3y(buU>Q zLUp4?I0vqem=Umm&6E+;Z|!HW%r%`8g9F2iSj(lWCsmOsNmR+ANO$c)Q**%xd;Gv; zR0BSRRK&b0@nCJ2lv!Qzc%o2{nHQAs$xQ(Fj~4@t3NH^nzDGX~uBgb8ji~yV>MvBo zNu5>Y+D}wPHrEon&=0 zJT#&kCgm{i5Y~6wx;Eb^l%XzFVJ9(JQ{CS3$Cg5f z5I9!~PiGv$(P6ccv8|#}vK)r)nIFRn0co)8ync=qV&sRaFC`s0UXu`r7 zN}5}$-txVZTaOZgv@`fJKA8!*Ve72L(USCeI!u>^6;6qkwu8E%-L2+&Qo*X$ifx^8TEe86YG9+E7Brsv#*mhY)tA=W(`%i!n~(MP_%} z6M~X_eTq9mMC7uf`(*`A%@^p-0;ir0q$dT0Pa+zP98NFH#gGNb>AT(K=n&=^wzWIt zai2yb?i@o&4Bw!45j+|EQO4lti@*vTwNH5kS7&NPxQ>YWJdF?`Z+22An$6T95y;BL z23N6($_)a1->NWueT6Njuiq6Q9)3ATjT@tLR4bZ-aALrrbRFumhk;Xhian$?&s>#_ zjY~N)NPXqX1X;A0lbf}Y(^Gy7bo^`%k~S_Ri3M8$t=L~65^4%S-=POd`m81jw!F7s zQt=7KdrvjwI1r9F3q+?lS5fTkh%@iDKCq457ekW zkbl|wPaUi|8|EU7{vmY{(@m)=gv2n75C>a&#Fz~EgTyTbDYhjfkkN*PK#T=7c*wO# z&kPu3P&3(54gnHcP~%6jl`=O1Ax-t+;dPqe!v$4sfkbA|>$j95_p{#@_gbkEd%*&& zx^^l)pPH`*cf6!sQ;DfHSfGdY84v{!rAS=^(O~|gh{+SHC@B%e{LE%;V1;4_Ir;rZ z3Hw}=n+q{yq_Cqn)cv1Do+e~(Z|}HX7bjhPZ}UG2CG;OX2FfZE3xi|_{{;X4D0$H+ zWa0|Q60`ENC7(#HO?^=^5y5CUM)BB$Mdm12}n0+fwNc>h(XnsbK#v#z|t z<_+M#9zp_cRqnsX_}xzEzlWCp8&Ubc1{DkO|4`z8btBET#pF2ETixndeD%nskl;`X zUFUDWKM|fP2A+TRmo!cEw^S=FjiWkn86IK-7tb$i235lu?}8GZCMiwJx#=@5m~~9t zHp@O0D~?z|OE4?r;gKN)TYrAboL}pGR=PKHGbJ{8D@XD!opFF%d)XYk!O+`NRY7!o zpSoNZ9K~AWsZe!yon5ci=uCbDAF09zYDioh^TyShMM2zdjk?rG7TA;8 zlKi^ql9q;3?KC`lsy?iB*=V<336|%2}RN#a~0F z3QBjm8`Sm#L+qc=KeBn{gVF$^&}fIV8eU!P9Eg4vOZy58X!98#CNXoq9)@ zC$;bFe=zY}TOHRmd|@`zEg5vFs8Vxx#d9BW_}aAt+en`lNZLmIaNqrCnY0rOgPU3vsT}<2 zqM|=NX3pY0q9eEh_o}z_lLldjMcQ-rqaSif;p=_Wp9mQCY+}P<+=>^3a?k?kHP?{r0hDi5d=f5Vm5b!f zGu7MTf}YW;i>|wFw_1)J<<38;EW~$Lx1m35mFF>{!oWJRg_hVTSs3qY&J2se{0(kc z^*eT>ux03s(3ZtY7H@81(1oVUm?`Qst}^WxKkKtmy=qD0?|ftQ z>dgoZ=g3cFU1zyrUJZD4qKcNxi$~F=X%?Oq%0NdEcUqHlNkoA}Rnp?Ng56F@xnlrf zhKw_oPpC}MY#Y~8=xs@XBGX32py~*t>u`()-`O!JFWM3w4g1Z^{6cUHbM<8hv}Ts^ zz+E>Q-{w{j;$;#pxd(HNk=_yltq%hVZ&JzqpNtSHHRo>nvRn}t8a&FmF zjD{$@D5Z}zfyPvt@C}zK%PLBEaDT;e&T(#TF4a?X{l?kFJXHAS?oObQR>KpsbCd1t zYFD~MR%)>2K{V%GiUpJN65Y=0^lrBUlkyKAetc|q-%zC9-PSK*r6ul{73&d)r$$*eSN z=slJ?>Fa;vTyvyLiZRMJd$qc284>p<&zg_^VPgJiaFC0ApT^W(#X3}gV7*hFN4ANy zfmAg0kFK;y`{eIgwwWt|ax&&~U2(Q^1J8N;x7Dtg(WXI1Yfq5|`sa=4r(I_a+cjD9 z1&2!6XNPCEPVpAixXw4opgr_Z;lTw-^0cNCn9)J6;0N1pH)6@NRqx*7zw7a9U)ao7 z$oCd5?v<{G466~7Qs`PYAcXc_&BZO zFyf%sxbTx(rr%p2kAG(9s~wA7!y4)}on+#g#8i|_l&S4{JZ9&FSjr~xX$=X2mn z4<)^ik{EhV!F)uygtVFUSTTbpqlCHXKV`KwxIcrj>AgQm8ne}UP$dE~QX5r1==P~5 zSZMnE4y3$Tad1#l>QT~gcfSwfW~Kis@d+oYHRrWR@C+IqFj+CL^0w~_Miow!md;9T z)SBPxrJgO}Ft0(4@UdgYdC%&20EXRgUU+v^&aH?iISR=m)P4pB7Jd=IgDJ1GB0EFP zv-|W%0ku|jFUB!V?zY#WEs7iUOQz7ouzZKdA(Z6spOaNINwY9V8JhBW2uCu^cs<0` z*XVi!0WUJ{`M@7~f(VOp>5FH(v)8M9>$)%A2i^ymkOqK)rv{^BN3dTDq90B!3A!sr)pjPy;U#UE-|~c`mI3%P&6YWRGaM z$+)k%JK%^|>nZZ<`a%J#fnrq~>s!Z_b$u7H)=OMo@k^#ckb>K+CpV?HA!UhN!8FCY z)SUI^p3ig@Wc$>wDEp_2Yrb9?eaD0xQ%ie(^_9jc|Mww=9>Q_ML!%0#yc=*lNBw*Y^XVN7+65^XAR@d1N>T9YCYfvrQ*tgKTIU*La?xY(pysw`H)& z3Qy!UPhLgwx=Dkk8H$i?e9sJ5)RP^SB7Ivu8<)o?)qP3(+hOjWEq8?POkl9DcN;_Z zhOyhYhIX0F5l_gyu(J2Pb@K1sMzpJbCwu+qTHlL>1`x&jH(kqeMv=#Ts?fEMz4dQd z&V5xIN2dD$QrNp~(^z?H-;!mWCA`JAp{jHQwiY;dIgxUm)2Kcz%es)USSmMfgmV_e z@*(BE>9I;I7!5It!)$sQ!_Htl%gpl@={of09lokBk@wtS`AiiY+a4~dXn}(%%Ks3p!UYHjO@PK9?vTyQT6tDj>-NuklN38#*EL*1X-Z| z94u(P+U?+HH-Q1_E1>Low0un&9@n>r0;$-tzIWq9kZ7Ie^%f;ag^+)tSpZ`+Z|4f~ zu-c4p==LlCr4}on^>#sJE^M>RCLSjdIk3nd_L0Z#O&`3LS2HS4HEv1!8r7|6*O^W6 ztavQpYgZ9kgKTkCaB}L0YWNHM7N8L+kPWO+3vG{fYPk@Cz5OmQx|TM!H(QZXvP;%; z(e@_i%~B$@!R#&Snu;5G!~6=InqkGi)d6^H6wd}T*-0u+p zZkqABrBi?{N&8|;ez3YbppU-lxG>$Y#chqf}^@91Fg}0=YX4s;y})31{XnliReO)p}?05 zP5CyJ*qZ8h%GJ`?0fs^=XqGkbjfZ_@o(8@b*jluw%!k1{Cg=_LUx9mdi@U8?+pd;- zoOHt4ahi1{F*SeYvDXzN=W(^|e27a8MXS5;GplR_yG`rl-cQjFJ@(>8j#~#u zB5S382dxfRvU0&s>}17F{X##oIbeTB;_Y*<$L9~Ov~K8C)B~&}e4G?7cg+Ke@SVfP zyejZ{3xHmC7Xgu_evfSzlodTeko2y_54(wkBA$x+f_<`~b281y-k(Iu{?IdDwy-=a zLZN}8J*xL-mmIdN2o$WX-rY_8K236H5#k+@4%}S`kHzCybSMvfZa3?J}f?^D0 zJFvqOfu!pPHcSgdK+BAB(ec%A*+=~RnnpOm)PlSe@B4Q;YWn^~KWW@PLP>ikE%%yZ zfsFG0%|N=jA4A@`7zM4E<65WXj>A5|Q}3lumVXi>4G__Cep(Z<#V5esCA2|XexVF< zT){Y0YR|!-BTKOZ<5Ql$DJ;-w)SD67{-}$-Q{THF@*};@+Lo#9Z)~>z+DN(Gfm5CQ zU4|j6ufOFpFvK}MA#g+S9l(|R7{pOlw$;G|e3}|LG;_)GFs$sB>203Yipmx88_UO?o<@h4hqhbI!~Ya;LM8!nfk-FPlx5{R*812j?pr|*7;(*)%BJ%1uM%aT`;v# zfAS3JlhxQ#v@#Z>wMg*hiwCuW9Qv!hTQZRr-g4en(7FSr z6MjDpAY9W)Nk!xOosz0{kaegw;!^`=;B*6qIr;EJ$7KNvKasvB`Uj34oS{WuVy;=m z)`4Fx2a*>{3ztiozKq3V70SKkiVs+&XZ^{5DC+{LtB`#CPO@h4(w~H!`g1^v5`HAm zTt>mqg=$%7DacHEf8V0g__1Ge-+Hu`0A4=12lqNvYe#xtM!WTx43!JdQ`3$w0nuYt zwql>94>Y@@>zFBRGq~UeBh(^i#PqEI?x?3r?!xuXhQbGA}wtUvlL zjltXz=8r0F*m-jCswCHR^DZ}|Xoi0BZ6;H)tkk|WZZmr%c`sh^X#fQ2btsyPgD@+z6XCx8yIbtEpsk|4kBfKA{|%EgWyoaatRary;8A zVm4Z~p_m4_SUWiZ&j`9dHDKLJ)Z0=7ME8+cM_Eh&Zt!Wq!5V4MY|4dBfPv1MZ{W$m zE$l}Q*o{VqX5CoA)J6p*!rR=Pft}`8D+sy?D$Q+Xts|oZ@k)4_5s=4w&Tcu4I?RpP z8&Jg(6Vu;4pQ<*hJ>!wtcwPYMW3C5aUF^A<5+pS(Tsl7Hm8D~YZSb|h z=G`Ut!S_BFuOY6X-iLq9mA=f9_ZJuhAG0`xz)O0UTrfTNmLmSlsskqX#Dkt$DP-kh zlL^|#>lR6UKTvvFE7!$#geu@hE(yaUjJmme)-i}T2@YAOfA)m8nGGkYG=T9o7N!9g zPX0{RDPx!0@wb5t+dSD#U}h27L(`G3sGQ$c!!R&Ba#(ISk41|URht{a`9vXIzOE8 zcQjG!f&PKm3FeW&%FT%_MZ6ANf@WPAlSsSTa#WK&srlkZO^eP$8%2nQKMnl*iyPk|b4E4NtvU+j{F zJ+azRD~68Dt>f1lw~#UD1LTN`gS@Fn4d1=@E=bUZ)3gc-biN3WO0H!O+|EQTOC|r% zrjcMbKZ&rdKW67qd;+_&6XOAL|13#$T~6P7LRn&N zzQCMy7xN!6$4%p;mzZL->=4t8%SaQF4$o|uoB+nCOibW5zk5u*%US@dd*Jbg$vp}} zD$kHYH4J=DRXqhd9pR1CT=4-m%Ddd8Yd6k}sYtFj7jXa$hPk7XV^d2#X0APbsp}(3 zvXTydPjc5(AY_7#^_91PzCliu0qh2*M4&WL4_0e!txJYv0gVWdV=gIh^U0StUXh!k zVzc;2gKGi)tayA_M7yr>v*5&x*jxs}jO=$dWlA5ID_QSn`Sm0CjKsEq{+>qZl?XDs z!B1J~R$Ii@4?+pjGGiF@PT3=u@1#MBJheO2%a9)E0ho2wfI@2r6#pXvCEYs_D}@P+ zbHUAl=d8Y)Qw!ZhCi-X6F@i$fb0!4X(1WujxhB$~$T9_^Lqbo4Hbz(TG`=Oat?*%T zmXdi%su1_L$J%o;+SghXI4#19`WbYYbJb0Sl^v}1mC~(~1s7f937DydE<77&S_@)0 z_&vV3Mp?$w8k7RE9;wBNV7u>;eGt(APpa>8iDd0KlNb5VS17GIY-u%AJ&AA)!Toz# zp&5TrqA-%vJK9Up3XWSZ%{q`emSg6fZ@_#nx&1aAw|ox^tp)8M+U!5XZ?G8Fpx!5Iv&GWIm7G} zPrL}mFF$VN^*Ry3fpJdet!UAMe$?1FSXDCdQ0@6=QokH&=A~-F*c#?MZ#?lLmo8Aj zbeigqiDE7XMlC&!W}Pfhl@bV|{K^`GBn)Q!AeL*^Nyh%M5OzOR?Iq_yySkloan)lM z5h61b2}U;o`Dn)rz{6cs6UwXHiSd+?;fefO#c@uf)gZXNPiqnJ9_WwY3;`0-UX%3y%_1`)9B z0EBlQo`TdT)2c+N9FP_*a6GwOkWioUZ?zUH=-uK&B7Nk+)RN#(o(Hc##njP-?+lT) zxO4gKDL8+3ijKForxSpWHg^^tn%J-E~Pxzwzc6`fYJ#Wx`TGH zqDuqbL+*JRxcS$_C2Ef4-1cnr9#X5Hu}mfRWRik($C-2K;G-~`B~<+LJlC8}tOa)7 zwo+~FtNwf&M5}4>-WZ>e)KJcf$kJeeE?d7B+FLQ#>krA-?(1FHS0&OuH}#O!S7eG} zw(smW@zjcOWtN{Dan^Uy9+{2$DB;WXvLPSO-aQ8{z9q?!k=FBW#b$njHGKBNrE{j( zQDWfB>`!cfE_i9H*Uo@n<+vnMPnGhbyK8H>OFmgUM1}4s@>vZfm{WJiRdPxUSehD9 z4I;wF#()kB5D39NGkY82_GReT`2nUHu9wmjz@)Lw; z->qzHzsA#GSJL(%)B9lXdt0z0BhtGH$%f234gOpkbdqILg_#U7E{R`v)u+9?}VNYa=&{W6U4qK-mHvnlomZrNUMc=azX7Dr*7>S>EsWWGZK3r(%~zs$ZBi zeEN0EBaPITlV67_!kwhCFQmtLi*)SO_YLdJAKU;myH{Z&t?i6wj;N>RrPSL@XO?v& z1-Op1&uw-_#eKPmV5mkdQg;?hVm369yHp=dUI6tKlUG^uKQE3QNX!>4XcOo8oc7qy z{ZE*dc~zdZ)PdF3UC_8j|84f68gidr+)W&>J2*H*INg z!`EtEvQqC1^VspVsTE}#=PVNne|%1IDYQ}fu0`>TdfS$J%&R}_nkSPy3HZ}6!v+?lDg2wk}f)iAioOw!aEdI+EXAQH(QW~^`wkdm3-#p!)%9mkISMbn3 ztXn9(r^738ZS$Pd1Ps+>9s#_8BNS_Pm6&I$(^s<--gbrMySv}L3kemgJT{f)sh8lk zxEFt20lv0L)#xaYfL=;q3p0f}XJfI|!Vop`op8?RTVJQqXAnMuG-PkxtXMdKD65Tb ztHH^POJZbQ4m+l76CdZTYi!s#pl{n!dJzN3_N|+q-f)KWlywU;hi$+L7 z!p;+0gxY-06YLIzrsB8=FFJ7-_PbVO=RJ|h3J5M zjPz&N6YRPb+_Ic2+IK=>i37?J;EwHX#c65S9#6?ZP1ED?15b+**$4wIQKNK80#F3S z5@?`L)?il;{T_xCcK46h#5F5xU1-)h@dHV=LJ*9#rGbD*bm9P%Se1O|Khrv3Ezdmc zD#j(2RWnWVpba(zwNjo8)DEaKlvsH?(S(0p3jP!o5c}VIT|=e)S%d`jP6#yY)z7QW z3);sN=#Qu00#F=^Vh-yZyQ4}$M#sAB^|hll)6`7Lpj)_p^<6#3q}yu&2{@YCNPO?g-pa;mfN5 zLP)UlmV->CI8bYXDlCM6M`AF&xl(2O3>jXo&%^=Ij}zmcD&!-DNt&HcFs#^C1Y`eo zCtKRz<|HTsk|tz8)c*GVca+BzSzdn1Wz&tbe`&35U#`&rm*sUW-V;TYl>zGD+-aMK z3$y)%p52!S^lz*u!S#|jXo!CR1lMjj|4bU_1N#%c^8feizS2DmexvIS-JG%y>sK=~ zJa!6`tM1^g?jnFG`l)+YF#UU**XtE1OA@r_xI_5gQT=5dBh(fUxx^GYp5`kwVS{@I z$H#T5i3Z*WWG9!O>Y5jL8uySVZ|^>Q%Vk$E(kVcdV(Iqx_x0+Q>>k!!2ioZ}{vnSM z+1Hb$meZWBuJ@#mKt3K1I${cRuyJhhBU$!P&7cu3ymyKG~C28$n2CS7?kkwIY6n|M`8gI^JOe zi6-~_Wwn&2mGDY)Ujqg`ZYn~o)Ri#>sC(g7d0Ve{BNp)H zGnZLcx+XkVl3AY6i9bUUi%l$~@3rk5Fu zM-ff>Kuoh%w4QZ{qmKm5;Vm6pzbcX+DPIkCIYkvZmwpvWVv_wJc81!UXvoPipue8^ zMgU@Ct{7AnKEmJYJL4kb6oj6hf{SgwXb^~Zhcap0u3y57U*HG@i8mk=$eR#%tQU8r z-=veGjno>k=hD8`F#^0{KX?wbIhK8X>Gp{q^!mK%*3e_MM4_Vf5_9=bE{2B_cZ<)B z8KnkeADI~822cmcVI94It-iE^JLPqD(-iCuRxN)T7(2nzwvzynz{V9X6A&Os+&cio z+4CE(EH+JN+#a-fI{nfkF*m7TelP8l<@{)_q$7_iGu^RlrNe$KojG=8JU@bN_LDnz zSgODH7E!;t-!nF>|H}sHsGv)qE8104@dL7+yt6IFGxeZ~y8}rnjY{kM2+7#3rE|Pq zbCWn)YQcIWCtEljLwuiW<^7*ZA6;RaD&!x{E+qB57%(0T4mR4ZMI$Ejm)XMuV~ zH1<^@1y;$=pBA8*e+I3U(5n;H*CQYC8IlkYq=iL(NITmf;o3?0Fdki|9LwFO zj(M-Ebhp8Ruz}B0PI)>qLJks^GNBt>TU^SJ+0gGS5gM|$nSFz;U&{YQi*u>;;x+U8 zj#~&#n{@1>a&~(R@<|o#sQt7aRrWM_8(FV?=1IL+%w5d202r6J81)xv$4x+xD)f*H@3TBX0VD%ntP zEjB!`cQ<-c_!{)^InQv16f2R7rcK-CHVE|~bV~oJTR&La=5np-)2^qboF+Ks78^V= z*}PHAE_kYr-XcASWtBc>OS-pUK=V?_oX6C%&&Q0O{VTlh@~M~rseosvIFGVSXCn-kqwPo9`5jIFFrlb6P# zK6|YPWeQ3r#cKSP|XTC7ywPv3?+$R>>2mL@I_c|#9kt!HwlzR zTzxir%31mv%D1=)3T0;T2pEQgbw#kSz6FJExnN<8cXeKaCC5-T6O*?5kgA<7QZ<(y zkXkgUqT~(v8)`XIAzi(@ke*dwm{r9|hr8|TG=@{fe54E#593Kq55-{7(rn+Gmm*ns zZ|#rL`}Pe|3}MvWYTXZ+8b<1jnrp_R_&_8&G&th;VJq`rkbU;_OitVrowM6ql)5 z)F-Kv*~3Y|4ly(_K|B`K+y=00+%cWH=MdTBR$1Q+fOU0eu7KmHO+>M~%qbUc3mPB9WSEn?Q>UhG(LlaSJ0$-?^V&Vy{$hLYs@s;v}!4i zDq2zZyd1dEkEbGXgw!2kAQ@|cNLKlSM9Qt$*^n_gmLJ4w@qbyZ&nGE!Dv3VPi*Ely z0l~-VQTS@vYsr09RG&gdMKthXw~7{n6Hfm?`)R$BxA!5jTx5vTdjQ3)bBU>*-RDE( zk)0)vTU!4IXj?khbCMaOtfb!Z&A8(nP(h?nGDQirWaqd=<^7EK8>do{G@fQ2P9rvA z6hfRf3w6Gc9BW>yoh`vN<#WVp^vCRx5P~8rM}O`N*zdzr^;nFxfq@#{&P1^d6>d)b z4HPhbUOe0{BLh^CuWy*B$EbJ2!e36yS*7^PMZ^(cq*O7)LfJf%`LUHFTvX)(wH-3U zn7?zb^+!9639z{a>?~(g*O)%=+HXq0e`3Rx5-*JipaCD*FMhuwBxCTp_sQxN(&Y-C zVWeBCarYkmcKx6`TOr@Da%QHpK@Y_GvDG#UHJCTKw{Gz0iGc4Di2Oz{NZhh#w!WDp zrdi-wAh+$nA_Vws7ynxyr!ofE!2>{pCtbhGV4ZsU%mI9npHZ*Ul*}e%)D<5<{43iy z#D`>KP2f0=nxZHQdFY5vbW)9IPdn?BhK`CJEXRVaavms!HA+y?uvTEwO5-#fB~}~_rgV1~`igP!hf5&f#1CmQTDxdbOzJT$dxvpJlYM8}b&M(43avjg z=a!5uTZY_A4N4d;nJ9s0ADw)FXX)Og#9w?&_^4!xnuDaM=oQEVd;4C@9j4gD9H57R z*2+Rck9*NHzuhc3hyA=0ImL~jUAAyCU{+9iM*N!D!{i`M!xq{o!`7lz7TI#4%rPJ+ z#gMd0yI_&QhK5+oU+al-T#iVxgjv3De<9LqW z;d*eSox6gt7DVx1^ncmW<=M~&U!fLP?er{jIGTRLPQmosWC>~OFT}QHCa^DwcH1vN ziKRYW4bK4RFU)~t4D_N=^C@o+6ntiR8)gdb7MA!Ok9Sw zFDty~xMP;G(=N24{uNHivNuwiJhS#+L%1p|JPBdxFEQF`k1Mqgep)STz-8He3#p#) z^B6ZmObwV+v?s;3$2VqTq6oJ+P$D}M#=lZRamuwuDhS-0PgiiMLeIc+r&#jqF#BRM z0vzDnVUli@g%4uZADMgO#IyV6F&kr!Bgj#AxR`RRwlehNe2N#oFJI>_stCZYcjwka z8}uymIlTVCyiJ;-&aj?|E~yc5RfVU(@@O&PKCnhfUrY4)S= z6 z;VgZ~zH3RIa*|PgKmu9=x8feE6 zae8{{Gz)CZ%Ps+MKUvn=Eohrh_<@*C9M{p&v3kj>`Q^OLP^T$*V!S|P z<-6+YU}&_FJo|@)n`4QT@M5`zNRoea0oi;VGpUKv*rV3?M--pirViS=7{x!xiVgzN zWyaZhTc!nmEhT;x9QK6N`6RTDwK=?@1(n!Hq!zS~fO;eTc4N=00qG<`cNEfu=Tf!h z=PYfud4>6n0KK7Dpoyi~z7Biu-lX?ac+1~vWU)2OrJ#cVb_k5htI!exJYT;9x5d$} z2a~DXSw(z+(@=2mOtk-B2wUZg>pIR~oMxn7KFIn{wZD+*Ty>`+q)2pnYJR16{3?O5g+lEarj`oc++J5^6%dk|M)VOir>JWdcV4F zePju(P$NUc{la?S4*6Qe4GV_lZp3K(Z^Rd!FoC~Q{LD$0w*#|q_5Rv**h%QVrx*L( zJg4iIEg$fl{_yoraRKaj1Sphyo)9To2|r*sICtrJKZqbUI+1_3 z1yNu0X7&aabGji}W=%i?(0tJ{g+2er7hp#W{B9w&-=CvfP8Y;fl)PR0%#Ra3jo5AP z$ApP<^7w>=x{d9BJCfR*$$GEfvvm!~dj=8U+iAYUPfH0|VQ(M8d#@M9H&u{0)k*Sp zM6F)Q6{A(eZhCz>~17i-BV4_f?mXh*f%dw%KTifydn<*aPI|@e?YKUDKovA z&hq%Xsg}A3M#XB1-U(y$DX+`gx6-)Bg-@G}ZK!+&2)`%!Xe@Zmn}9~k8eleU_%5FN zjnaSFkcPlXDNfMCULm8u&trgBj}QyJrA_2%w&u_UCyz0Tp}y>Tav8QfPwlVILd06DS>NwvK|Mql z_(fSje{rk8Wd(8;d_+8K)41f665aFsBd~B`YStTn^Q|1mnN^`_!jl}s*EokdOoI8q=hjVyg_OZz$QaZ~-NQk^L#l4)Tdxx%{Y|K*9 z+0Pk`l}axc_NMS1_joH8S8~^5BDG@EoVU~=AO-0{SZK3o(im;k4ke|;in{2WPE6WG zp|r6C*_>P10ucM774^4`$WFruoEE5C8JGRUe?*#xGqE;Ho9tJdOSZ2v-T*ai`Wkmx zW|VBM*j@cK=^YVLZe5VSSp@GlV#vCFJ>;R7(4e;7&R5Y*prBAn3#l!_YAlQsNnEP; z);Q8{M@#_OxeyKT4_{y`@x#0WRdi-v4I40H)Y$SZn{1kCdp-Lmb)PPvo1!bpONpM4^2VP3@5%-Q_n~wD~DdLQ*l`D(C79I?>f~$T*@vPkh+IjhBWJN6dO5!OU~0;^bzmnkv}% zsl0kRMV&7WlmT}4`A_~xG?ll_$-y4nuc*@Rq-KCNj2t=G97$@|Tfx(^&j#h`l~_JHvZ3enw`LjH2b%Z z_$(h&_T#znzTy*{2shveeojL==%M00!?%zFH_Je30>z%Yq*R9XiAb=BMxwQ%1ZJp@ zagbD3m5=A^smpG$>-4;UoW}*eMy7o3_B8O_H9H4y4EGf_(94cQdhgsZud@#NJ=%zm zjJ>rF&v5wLa)%Mc)fq!(h5E`UW#tB%X+_|@Ln$=ry2EL=dC569QU{OvQmQ;iKUQxjx&4_3WjFrx6M^{nBx?4H zi4sI&gcF3cU-}&)I0(vy0DzEc3jy!Z$m7XR@Mub8nOATFIft50x2KUjFWkI-Tc7qg ze#PLzOAv|UrD_lVAKuozyF+nnk)p-j-QAty?(XjH?(Xgm#ih9O zZJy`6-#UNKk8`qEuwjQglT4DCxiT}csC;fF(Imo9*Q~jUCSsrKuw$$NfUQHeYJ;qv z!aJ~BE45#7b!AUZ7_$eaD8QQSACltxksWH?Hcfl4!^GHY`2-ioIF`6qB)s{x(qz8VjB;#**0MozP=A}Mo1p46uHz-ZkAO$V=pWI7 z2KUd8c5OuW$r6O%Ar%4fkdCzoj>r6}l{ya?DN2qAj&+-IN5%YiJ}rEpWtTc;ZI-H? zZ%4w{X^MfvR;kC5U79;u8fp4ja8ozQV#YAC{Cs{g%b1zuibm7-Q6j)#PDIv4a50w7 zHGh)3GbwdOXuULYiz$4;_;AK-eXhV>N$^CNt&|kbQ(<+RxA+xZiEcIs)kgk(3L(?+ynqu8Pe?P!dy2>zppqOiTgNi~q#L4?dC&*2R zeH-;2t}4u%nNllLEj(uVr7%@y^K+Qsx;kbP#!yHXrRu3!mJFA z%lgl!{OSml;ll3nP?(_21(J1phlQ*=XW9@4@F`pSZc)8=+|qSge0%xXFunFF zT!0g@&yGFhk%IlqH0uK#E%2IoiR1Yj@`G*Mu7E)ZHXCj{LwXIYJ(_@@>Xj4${@>D6 z8EGshn+5mcFq=QK?1z4?Fb>8ucas(QOq(b+qG*v-xaK2k(uf z>%Mit2yc1k)~Xzu&&pU1o6Il&&e{LIyhPD~OQvmx-ja%m+Yrb6eW4)$z>*71r`ji9 z_GKi2=sywSJ4D74h5MYTFdgwhMq#WlTh)D5TU=s>rDEI62L=s(XZ5xQH*%&O+D3%o z6F;%`%>riQK!JkpV>Bmo2qLsGKME@dEnuNw!Au zpSYxPzo{(BD`9&xpxCzs&!l#{D$qF=E_^EB49_e%vU5`mLWnYTbtIMYV zgH8;QSi`7w%2vEqujMXEyLs2rT;DWMbS0&PD^}%1Fj&V7w1*|Ntz$8>Jy`Zmar5fy z&@PpA)@(`0a>L@7uL>n2MU8D6*9Eo@xoN!#Y(~wpi2p(s9WMlPet7i24zhn zM*Z?7o*AtX%<&BsbADU79hr(|(auAdIz54!Gfvb;)*?8gxc_0xBrA5zDLfbT=q}Im zm*FV&O6C?b4~c`Zk2l*bml5}c>SJ!L7d5WxSb3w5N9p3V2vF~<5DIpMb(EJ~H}qOo zim(ai`~Zz##6x|X-^T##&u#|c0r+U@ul1(((%h*`^WzUN0sgKDhHG`k$tlEc{_c4% zbg{AjdsbxB>4s9Ijt&Doax2TE(Y6Kc-7C)mz#Ksf{*#L%dGqb`^EO2(bM)07Y09d`_TUtqN zx+bbtNftMlBqdbN3-_D0vUx0m#7T*DeP2Ea432w~hT9%g1TUVzQIYneWdvqN&LSyD z6^EYVX9B$qoA6vXe+rlX1^lB_n)$+wx=iRdLP7cDZ2S9s>2ru{rBR+@jhN1NmXs{^ z+#|}y>*Csa?O=JZ74oCs>_E$--#9!&nF7+;62G30+P{Ku=kub3(_8L`36ZW~Rj<*{bat0Mvry;a82@;; zDP$3IDN)A6MHf-8OFz6J44T%-3}Ge=&#}+$%K?wV@q2>cGuw@q?cS*Jy*q4QlF32UznE|3!v58n^{BZk>}}eB=~XY2PWrhkldvEN}DR+olH3j z)7}LRV!LbLI3_5DZe{yu!<(BVlLQs>T2_fYa(Puq?XW!vaB8}c?boY5IGIM2(!D30 zK_JW&%-;-mFjF_Fh5CvRL;+1s22R9BhhG|VO=`G6pG!Jn6%+bl?20W> z+;!RMewf+&pXMEEJ@l_hMeao$t`^ZkUpj?Njr0ZZwwbbc>B0c8&Mvd{>P{_!&%>tG zdS!;Gf7Ao6n{!8uXoC&XOAeu^`dMh7QsW%ZEnr9RzUY24TMV`6S{mfoM(y!Itsgyf zM_*W|3om6cTIiHhUnw{mY$_u%)S!Xhwq}nxKFE#a4H=u55Jr#f=;(kftiG$h$Priij)=)8n|U<>tLE=WcE_4X^qcR}`)QSn z-hBRCA(ME9RnfueC@LoMjq|nk*936MUtG0Zba~E;?k0mHRSoO0Cdc~E#GDJ(4SLN= z_xIjH$q}L`_^Gc&Uzrlg6<>%kr}M0eVT?>0}&LY^G(rLI64!-b(@ z3nAZay}p>)IhiM ztX5`3jyqph{SZ;op)(rL;1|It8qMedP42+3@@}PcLtkkdIO-F>iqzXRikKO3mZgtG zJu5>R8vMo~o)DOi|IpZX`9h|z@~}N?;%-&w z2q5%+=yvU&MG+z0rt4-STw76^wvl?!t+cLy#9RZKh^;l24(TpKbSg*e(_1FOkLX+} z`&On>{yB@JC^6F#S>-M28|q<`3ZE#;>@w>Z)9soK2%T^~w$oIZ`Lr+V(T>ha>^Kp5 zuGi&ijYtTA(dp^wQpxshZ%-!=SBaf%Su8k_e38*g2nC`<0LIY>e&qRmY<#@iuy*^r z^&-M$U6%Vl9yjs)z=*KPeYk3TpnEYgQ~#Ss)BnroHROn6qgqdl3ki>^HC=$3VWbV< z9_-BVr}cew-w*20fhr|tW}n~wUO*p~0kCiP|3HWp<)ovuUp|01nh#)=2GVko>;Zr% z7qwo&H!|N7_t689ehe{PEthTj10S$fA^AVmn}~4~_-z#*W&hKA;9K$}F7nfdBhyEV z`uqI<$9`P%L#Ln!*6%qo_Z+@i`|tvAH(O1R8u{S$^*a|Cd5 zlH`M@$n7!ftDR!XTSSs1sSsCX1PS}fIOezZkPWTa3(1_fId?f71n}3-qQ)L)Kd$+7 z%%Le)=oq6U)=@q|d^@dLJ*#4a(A9u!)M%MlZ^S%O+dmSnaVnRPU9^hJ`0$Ep1k@qH zRcBRyb*4}7t~|=iQU6-xli5`$^D7U}$c1s~@;rfVf5KH@#w!sK7Z1H$4ks!#3xu{| z^{4q`RbZPqu;vy^QEDa-Ix1Vk!Vq|3B|+wB@=fak!BX5{&P0`Y9~*$sxuuE94h8#a{#Xi%xpezAB@WTP zXOnZ_^cjO=Xx68^h`^Ov_W5(0msl$Fz&%4w%a@hNM=QPi%hQjGUnAr!Do}^gL|ROMV#_~PRL)HLa@dpJ~Mqb+2fXn%7P12NH=!qbg5_2 zyAa_)*j&Xn;9{r+$Ea(WKU(QQn5zkDV1&^|@|BZyTYsxin(6&{YiuKM-)ho|)*)w( zGS%qe;RS*dJSzUe{A0c3R%qytO%KMG?#4CUwT3*IP5>)mtYgEaG=TdLd`s_0$9fs) zZcXK~VaQ412LfE+qUHJUJ#J+50SQ-=baQ)4Yx*S9wu$d@J`_EK{Lk)h`7e?y#l3vu zNuj6BNI|0LYW3v;WDO=VSn%Gwb#sSHO#pSn3FSSgg)Lt za3*?NQ_?F%l9H*oMkvhS`|+>o&gQeE6`$aZoU3SqucJBja*UOYMD(~EIrC<5XA}n2 zRcAoYBPcASMK|mC7#3p{Jfh9Bv zcj>3U=@<=S_X_DDZP&ep`JMRA1Xo?)YQ%*Dy7`s)^|$^`IkhwS21Kh%#Y2kg7r#Yx zMJ>}SC<>K3oQMibXs#N1C}Pj?2zkVD1y9&eknPLdOQeM4!&Qz%p%LLJpJG?RI%pUZZ66&yzSE#em?M7~fP%UoiJ zY19h>322Y^QmDX#mWP`0k57p~+O8 zLna$~*FmZzWJ_dpkJ7ndK6Jy?jM_0+=g6e*_x?1PcH*HpAz?%0km>wVv=3HuG2T0t znsd6mq@EtAw|EeBeeSZyv-C+D%DG4azH*|O9y<0yrP6(@nV$1L*~y5(Zaj1V_E=#k zl{Qqv$Pi6Q$L%-$pIT=2_t8L^PRoZuQpHSAeoJwNzYsS zv#dh{??x!6QBL=5D;5|d5HTuDdEppR%gw8N)x6Qhn&`X-yBgbT#TZ&vCYrxF#@W*u z$l-f1+7mhojxyLXWFEN>)(XpV3B^XxaTFs4HKLRNXW^mG*Ri9elkm^HdRb;{$7j99 zE%wN6urbY(>J#T4`%ls<6Rz?V7mW$?G-ng8OI9q|oksLmfP0IG=~P=K_My4(ssK68 z` zheLatDj^W&j?l{8*~5AP)1n32rL-N_iI`Q23IZJT;$sHNu&jRWCm0@@9s=Z_EjlpQ z`bCZTn90uyS>o9)mw&G%+@ zL1_R>K+DQ#`c}!W=DD(Glevf^5xpU{2=}le9k;6*75o9j+~lh9XbBaIj$n!Qho+ki zI@;;NXlJ$IkBQf%TkxLPP>i%4m7g?)-&FCp$5cyuAq!6CKMkhiqVTv*DddXVKM!S5 zab!m>1AkoAgEf6MGA`5_p-21URT$@Z4Il(nQS_Ipjha%duR39vY&fa_`VSn-0EaCL z!!emB^}pOcSxjQhD4w@2hwX+SP`Rh1sm0aDBe1kI z+B)kfhQz2-q(x2=5e(=4+ZEiSj9#*045xI}TqP>+HWwu=bKvAli-tlgiH5zS3AXsH z!|>gLK4(yL=ezC~&NvuudXD0h3N*D-;cHQ9aS}fo@-!LN-4y)r#Xfr5s@LSRgv3ep z%NJ;b&2c%Ld@D-tTJR?1&)5`0Ud}=A@qp-oTYeK7)<@lJfJt+b!HIR3?;1 z*ajV&k=@UY;Z#rRcQP-7U9n*pJ&ON_jCw+(HZK7RUisyS=W(nvqp7_k< zKV(HUZZXZd1AH(oezZ!75g%kT$sJT3c5^>e?(4W!XZ`d&(=RlKo-w~6F1154o%2de zAHth7yJC3MCH_`Ou&R%&O@u#|b~m3Y)A=tcoA0vAwi9voiAX;hSk3`o9xp;v=dxDa z?J_3}S-?R!#+-)|y!ib`{O~V-n1MJQ2oWP@Vap7miw8})KtZ)#cHo@VmSwYUqTp}P z4)7JF#tW^!ZCQ)pWuRo8Fpv` z*Qq%KVKv>T*v%gmTDLC0;2s^3{*NyJ^PgQ}+j}`*GKagRV5ms&b=U=;yZ5}CR5(b5 zrTPl2akkd!`2*kDADCIrbIBRp@^Q(kMYqIES9cUqD`{+m`i$G(=DFZ?c>XdGRcMW| z!=1p2nqn>%rIgP%sM@u?94>mI#=uaUhMR_+*qh;@YTOrBAfqivQ<*X4E`U+F94`)p zBvlAWXv6ES-6qSN80aO+&HBqI*1o`-af~m-ryNmEe4963-anaRtqgD|O>q4!3>|!| zL|yBwQTOt9vH0j{A$dThH!TVw{3^9Pc3)ND2a}KTq*TCL45=ZYrGDFf-*=S%I@swt zjK%9aV3jVS$r`DlLLsEqs8^%G8M@>~h`0)m3AOV|@TLV@qLTWOr=j zzR^~pHC;Rbp_=VqS3=lp+GNx+^~2NwpE0a%lD6zU47Y^l!!42Ur!r;LTy{QcZZKX( zhBpFwvOD2RWBGjGnhq`8;bMAhP`)>#*e<8^j!S zT>T&AMpy;I?79--Qh%J^6jEb9C_nH)5W}Cp2VavvSpzoD>X~)v33I(e8p7{b`H0l< zCA}kSu>-%AGe`N6MfOOui4rtbD&3le?FqC;ZQe+5L|QygL6D30c&k`qw>1wF99G z(rN1LWj1VNRMuI_5~G%p85Ze#m_aM1z!x4E*I(LwGym- zN3PR5+w2IAOtD{NK&aA(LCR>|Lw!~x7^7(ZFOac2a**W+kt0`CWofbhS^rC3sCr0+@bdkvJ=G_Xt&OzsVE z%2LEiPqI1m@v0>v*{Y$OED!H~_-_IMBRDfHqvuk;2;0)1v}V2f#8Zxd0D<4^IDsVSjo7K0H7@f}H?KBGy7b>s^U{nH>M^3bP;YVo9&0el(P6|HUv=ve_d8kvKcn zWb^pDHPzwHG%P8BfFC#``Tu+Z(40P+{r`pM(gZc{d?J+KB7Br_4X5>dz`p)3oWRk1 zhO5xeaqFNyFv{2FvyAxW&@43aOVR7Eob%565~$G(6;}~JK9v75Soefp%LP;}ngCv<1by#+%-@`{34#mYsY4|IT}kHjVrRstA~#=XN^Xo(l4<@;?=lxJ za5VN8W%%Qu!2?`GyAtVeqW!u`Y={T_@6;e2ubOpmj-`xWn^943WvjbCL_6Qm>C9}I zAZ-e!BLzSltK7r&$zQuH&WePIkb(H7!H2tKAiH|ghAVy4>ZWG3bDl0yRC~%`W^i$;qaT@JHSbX&SW;8)m`S{2Y*!Os1 zogYq|l%K`xDngxd^Yg`Q^%FTSB(#SOXnW2R(B%O``x|QpzsW42*jNpIF*3mwx0`mv0XYw$JOaFNlc4Z?ZX za3Ws0?qRJ49_On>Y%?354)@+YPXg+n^27!d*SGCXve$CX85_gq3MZE1S+xBZMdFE{ z33?}R5gy_($cx_?Va_s=BlMD*=@Ad;1t)iYaVAB-<;ID`VcZrlb9A$jS9_EO$8vB7 z4O=KkdnMye?ZvQ|O*K+PvSafG4VX=NLW9P%xBRp!-F)A23{@*K1#(53%aLxg;T?^c znRGe3BlIvK7@XmkIwWT*Z5)>*e#&>G#OX9Y|krmv?&p|RcsK<7dX z|Ng-U$MB=y!w4S_JZ4;83e|SOg7Qy%CK#DpZf^!AX9rf_`3?@KYYW@EFdy=e56Y?) z-(|8c%RtqY@=HrdUSd`8byAt7K&ZIuzx(^dE$illc9fFknVj}4#5kORzw@a!4^cvd z_9jm@9*)f4Lu(mZs(OfUESJr{p|JU4rFre@IIB8})7#M_WbFZ~ZW5vEeW3TUjs)uq zCztnir#t4Y486}lavcX;oAXyhzF8tJ$8bz{X-^Z@bcKw9hOE@P6b`NlEWKS@T4?ZpEb!g&?6i?uW3_-5W4e5dR z;oNgpseO<4e?j|}%sj;oR7bf^&diP&;LH1g(?qMI>hFvX&j->ZTq1@{DkJ7Hg+dkR zb>^(tXweRI`(Zw)o^WI6I@hKrEwGMhA{)%KOYN!)A|ld!UH^Qqhuo$ZvlxrG2 zCeLJrET)!^nrpOSF4JMdw{y(55aF`ncTPtI+#8z_NMCJ5W#%ar*ZY0_%+`x+RGtWt z0?XXp+Ler*Sekiev2UQ%3&NWen6R*seX;4u+uA?=kkN%BKa0X|- zNnn6Hhd}Iwwc5=)3R8$K?PuY(I)75wQ^1dKOp`F0nHl=Ix}SKBvsa$nH%7C=Uc#}| zq0m7DUdDqFSRjP|8#O?q6SR-Rb`*{RwZ_5S<#>9#*|NaNu}l~wbk=0 z^P-{On?x0M_duvREhlzZf&;?hCaA${y-$`_zn-j_Gaab3q)a~=6Fxp~z<#%Z6NOEm zIkwZ_^dUQ=xI&IZkM>2n)5|4EwSum5mhu@}U~}&F_0! zji&E6o>;PW`R9J5eWA@MGPz&6<#c};E_Yn^=IghttC@PyGSdP_-n{P4*$T>;C$Zny zB+pF>B^qgyn?!>G_qIrfbeL^9QBCS=wMTIIKkEtHYt9*Gq!$2(e_?Z~gbpg5E_GJw z$3Oh2&O(uP8ko6=a#p%re?cUpz|}T7W{i=Y3PuPO*@$b9eOCG9v}(^}Qo~I@fuCvT z9>EBq`?CZ8vp)`g<~7%%L&U$y&J%SgI!V%4ED-GZY%(&$Bw80PdrFzU*ec@%*KT$b zh=FS@kaBw(v4uv`MUOQ&HobinKn4o@@f>_qNAxJng$F}w^xW} zj92;w25;ty2@2MkhGn04bm1BgoQDd86>TU7D-5a#(n+QAuFl=U291HDGOU*Mr@76S z^}BD9!NP_ao!bvX=7d-m>r#K&go*^5NR+fA8lHmDR+5M(|w!QL{H~QtH zF5~wg%T9DObDaL7HKl2=8v&`CSq2MoQX)aRPp#tnK{OQ3Qkog3kh@7FsUX_%Z46>W|47vRQwhzhv^y_avR z?f6nMJApiI&7W_C5-Y9;=W^)+u|W@W4BKu9q228ElE-WzFRY zPzk$<44I6K2>D!Te{P0ycWb~-rG?57mG`Nv2n89roSpK%sOQfLn;GM6!$a}2=U#4J z0cfMKRr~WPM&L=uMLz{i(fR?1PD;=5&0cV~2U^pnCN{j@m~IkUo>IW`QKqTV1v#!n zIKg9_-E=UglSvS-gzbwl70+XSt50LTUSf%fH;X#T71QppElWK3&%d?J-;`#=wwBV$ zB>2CU8a5rRYTgu6dyQPq^BR-OF`0j6cZBSBTvrZV(a0?UTb@0PrT&9$HtnvTf!=Tt z_*|nDtW<#+k86`Vdg71att^DR%ks`nJYLqg_*}P|7+{yci&)ooCY0&^HjWzm^zUzK z`EYiJ$+P^tViY+L)OI_dI(IHxZZ_j&K);xCYthUz7Ym=CJg&fcsu4VV?!D__@>rod z2l%zpX*EX9jVOF{@wdx157}?bf^R>{PRw%6et5jH-_7^f(l(#R9WTYiUd45{SAM0{ zth97#!HNi<%OuayZz3nHRcNz8+mK;#v6AY|?+tG|sAn z604GFs&$~c#Y23XZhKZ#LEGv~1F3no87VvNOc0m9XFqE*r4 zoy)Sr^=1dlaU-gka*c?l~&brmSw$~#H zdzFv5o$1$BD$Tew{L!8F68V?YQR`f+CwAQ!`&EI6h$sh`OeL8l(B95kdEH9$##FgP zgFaoyQnEfQXLWyQaxTO)Ia6Zs=V<&4^F9$Mp3K}De1CQ&O*f*ZP?W4k_g1EzSXZJ| zlt1{l&|0}|mHCKc^?Jh+SN`%Kq|R9d8T3N!_}ZB$Kbq0kwfTbjrrEeLetnVigzvE0 z_jO4VJ1*h0hu-sz`1C=ro(J@>{O-F1+ZE`A+Mkg54&#+v2z!2a;Cxb;*<!oNqsMZuGA>n}VrVY-(8VbKk z4F;D|1_?^MbmH?s2Y-M0`LZ(z{L+bX&vW?$@9pe$cjwNlBtt+z%ABuX6eIE*2TX}?Cp+7i6tg)@YDa_KS@f3mSw zKtA*L`N0<7QWfD97p2L(>&ZI)HhpJPPhVWnM^PjtD=}%S=RthGI}zBzuhhxWM%|dH zyu6TkNmW64+AUxDCj{qpUn&mc_38AXo6a}h{!M0OV^XtkvSGcC?;A-D^!v7g4aJq& z%9pdu_&1npFHhP>y%c^_hB`THwbl?64zMC)%8H+u7~ctrSf`qzJ<4=P6%?#9*^M_wXtUmH4I*dDJ{ zTe1iKI~vWQ_eCk}4~XB<_IV;Y-wzh$@3X$GnLU-xVlG{OgYvv=Hq{~hCWbG9toc(S z8T$BlzQQ(} zcFAXn??M_cbIQX%d|>i)XK}JEt77U?7Y*-ADh22fZyvuG?-}*&%!8~!P_T6R)S6m# z0#t8>C$#)Dmci^e61qhSs-ih`86{eQym-!SMur83pTskgDu3%9*p_M4rMx1K$6!?X zKx-l+QCyoFoT1Tr0$T=TC4z#HR6spsEP_Q+etFwy#+iV-%n+ z8v^fF$D?j+xulKLU!txbr+r;T@r^(>P0!FUA;ciGx*} z2=*?%NQ*fB_bA>PmW<0`j)X95pL|e2dWTm~jIySh>tpnl{=Hlw)rn%#e*npjo^|)D zgNn?i9iRgu&`3rWVe5&)It#1*mA0vBID94CBPjz+Oj&@GD943C2H>?SDGuw*)W*RV z?Z;jgLz#eAAJCmh>sI@zbV)Xd!O;aRBK<^YWUsGj>ME&Ft{N9tqta^1-byIT;|6Ij)qp1ACvV(a0W;5!gzl zm(E>&0^emPfM^`S%>vW;K8X(rZtSue%Bw8hI>~s^!5T~7ekQazpvrPE7uF{z7-#X~ z`c166vXGESwJGh*HHDNJm>S?!INM|G0I6GeN0o&twTAE+6VF-?m8+ZjTybBwkJ{e- zSr>Wt8XX#KMn|Fyu=6ntl8@?tEH3 zm{f*>94$O74hEq);)n(`P^3H`OF0~ToQ?kusk!tIcaLXcZ&YGq*X*(<;$mwm^8L?$ z#uOOU`I5?_3bjUr&DV3Mf3qdJr;nj#O>XyeZwFp)zuEsuUdg@furyk4h{Yuvqq17doB z86O<{XpK0!s6wL^{Ws4o+SSz+16$*vXoM20OA<@0{C~ELkp_j#qLDp6VE6whwyPx> z693%?f)w%oGt~hW$I1OK0+3~-baDU<^`mh3|F13~@1y;{sW|*7c(td}WgH0BLI5;qL}K}TwW>xquDAC)}-YZxjdke^H3C-WPHdzVD??XZ16jDC82 z-+KRL5g)E6_M2O3a?AEY#G!-c`q8rKo~)T(!A8O{M=XT+{%IeqvQi-OVdctuRiRNl zCwD|YRorO%HH$ZcfxE{yee`MZ2)g;LS8~QNr6*-ma^d??qJJiIvn^fas3Qm z(nQ2CW)4U!(d#!9N{|Lv6)q^vIFhTs-xqnPecY^XNmdhaw5BtkyONB{rV8>BzJFSo z;;pkJ2PcDQ-ppa3=kTn$o6Q~}++W8T;_*Ho#@=A)@nfAK8&oukDj39LNC6#u^xG`@ zlKMGFnngjAzhuODs~DL@LAaV}%FL5MjFiyC0RmreP?m}-M>Ie0pCyIEccvz_aR21Umx2As{SCXKyp5wWxOM=Lt24k{#m^I zFUizn2|i=rmKW=CV<^|Aj;ni$qqGIvv<=dm4Z(sfQhKbdmfto9+9#wxt(0Xv!m*ev z7O|oRGEVKoHX+YfB$G1v?Ra}nGv||bii>Xns|s4=Q1QQVPr#7tjwbm$Rw+jF8_uJ4 z<5$*CTNsxzU0aJ6lmEH+*B-xO;g*W}GocH>IWFz#*Hj@N?5rT7$wf{d)>HdTd}I3& z)U9QMWJS>_eh{zb-y+-h1iY!2w66KlF&mYW?sY|PBeA|LxgYI1UN ztH<-*&!^SL<+b2r3%g3MJk^`&6T8)h;n9G zINp+*-l7)|H2IkFmLs>Xd3hKc3!nPdjDTQoyG(>}c#jfu+UChf&CJz;&CVB`b-fg4 zUa@oPW-CTK4utUriMveq^QpCyRn1K7nB4>~rN-lbJhIq_EBCpJ@vkJSlpboPJMkH% z5lYYM7WhYv`8T24jN_Y)PkIs!&Bxq~$K<&W@)psjUJ7o-_)7Fj^^Zn_TA6OILnkX| zCP3&O&j&#wcAB(r?!VpKh0lm_Lp$jEZufUnDz)ZD;VX1<-=2(rnTlJihP)Q>W-1&E zfNN@9J@VN1J*+8MDa}TtbSRyj1f8eE>&@I3PP-7_`nZ+OAAGnAe^ zUKAvBMZb9sS2ZC(Rp`sHu(Rj*ptPb=r(CBhTq!}M(#lyJubkX3&^EH)bg_l?abR#! zkYpEvbhT@c!`(Ej@u>o*h!A>F19b}vaVn`cf=d~*2H~^Gn>FnTe1zwbHeC#s8Yz!G zW-bNDkB`CL1wT=I$|`|K9#n!}%+~y8k9i2C$^F@(FF2Tj0q;k1R2Ym=ud!8acZ6jh z8EQ~E)bR$$Rd4610V7qL7UEmTt2HcP7H^RAi#im1)x-7r%>&C>*2?*hq=Bi37FV{l zub*D}dExE{r`ab9%HpL=fUDtgbk)l^OGCx`Evf4SxNGq)pHgu6@0;M^=XE1F?_0d7 zj~dO&ExpTy%taQ1*>_&C>VDgRm%xJYM{te15GxRAxTS;o7Ac1oE1sU%qLYF?-SQS+ zC>*#MJe^3?c9wz|bly_3utQGFLy0$_iZ>x(q5@8d0w~lk6+W$OUtPC59`z9gQCb)a z-G+XDs4UUS8h;+GOP>x!QioA2X-sYi#{2Rg!Bd(6+wJVOve&P=4q83J>{;~*FeNuv zdc{1fB9_+*bUeHWh3l0=_MzX%kdVz|Yp+1H>7(wwEZT&jO}Z(7=Y<SZR5UAGoyQW_V*cd z6E7aE$^-vY^8GqL=NI|}>?-E1v8v$Pa2oJ1Om@;xE5>%1r0doLl*Lp3dM-guvZR=79^c+jJ)fO{oeC8P%eFkE zxoN<(+aaw-m2!$M5OGcIF0NhBY+@(_|8>aaDcFbs=09)D&(<=Sf4mPYPe9Onqn`cK zc?iK+La%{aU9Faa`X65aebE)KZbrXtWNsMo`8w@a?$zj}l+-Oh_G(2}L}!n$in-bB z0q0;xp85t}e^({#<%3_LB~eM>Uyo7} zB;k%NOliU*fYLA83$q(at-4h$L%eOX0tVIrN^1;%DZU+j8tOYr$K#bU&B z2qJlYLo^>qlq02`t}pNG#`3=VJDw<(eGlm(_ibkOQHcDEqLeC%)dr z3H`QkcBh_} zVie^8<@gX8DL|w|mxbrcaF;e*ks(!!ED027HP>1bg|_RsvPigf%LCsU`Yv~m@XXe+ z=_~D`DYEmhb|f>gu}3Q+B=jf1O4c_3jKRC?t?^t6HQ)j*jvO+;ChGo=P1KY3ygIDn zmDqh#Z!$Y*NQ~jFfgquQ2Yz~;H^Drc^hp{7qUe6>>J_X1ucBUa5G^L(FLq!#_m++5 zu?Ti*o9iNnuR0+CZv9I^so1u;669ed45lnyD$i)dXj>-aUSZnYwEl^mE?n1iFjMd8 z3kYJmUQUZOU1*P}>UrOE%a=gdP%LI%rg(-E9`u1S=AlI+_PyVGF#MSzMu#h+Dyi)) zmtFHV&|;2AI0&8J_3ZMI3DZn$lnZbV%O1t&lV=Hh$4u&qy1l!5tSBD=UbgFc3vK@n;g$ng--@`8P}R@z`uU|s@&;GI!?tB;KMwN z>92(K2UZy=nNsa-IC>#*+c--iMR_Dt#vlm*K!751KKwMb=}%HzL*My=0$k761Sq&n zLagO*qv_%5T{i=tl%o(w4YhA-SeDp0LuB$@lYI^;gxMByIFOJ6w?=wHym+9hpOV)O zmMH1l3I`a&kEhYV3^T^ffINNfC!E9z0Pu!pGM|Z*J&fT{ zK83?H^_PYc&auuNO}!dag+I{S{imjcWLz?&Fqd$2_YpIndzr0T4QmjPk!ckbsXy4H zZXH7f=;7ZzpI0|?YHX7`?2mPkHkfCT$R$xOkjK4>vFZm^w{AaO>5Gx_kGy6iNTP3r zIWpx}kLFf!Yn3-I%Hza*05*5Ir$N|q8|coHpq)M`-S%40?1;YDmuF9w3p1fm%pmsU z7+ij|fUD82KJZ4d3mCo_|XOKFuTD1iy;Yn`Rtcb5Y_wZ;2;9V zDfqcoBpz%is&qu1NGLMBpidOz6C1%nFe)#2^OYS>Uw|yS+qzEWOSMLb4d%;NU8|xf zMnjNB0{~nD>CC>Fo5F7-$LKlr*kbNr#t0s1V#8cEkWF`Z+2P;R?y zd--Q)2(}-$0)4A#DGoA#ngYMGJM!*u(&ew+hAVaJ8KPlL2+@Wt;zrshX5z0U<`{cY zh_@-Q^&q-6@7wjy&X`65&uLExKZkbbd!JrZWG7e$wdcR4{D&LaNWNwb3pWKleoeCa zO~38xfNkU#3S1Puk3P2vadX~6e=ax^5EL|dcQmv(yy)u_Oc4>6xsFx39HHL%{Tey8 z_yR1MMDFjv9<7dUMyV9=mXK-LRh5<`Db?l39pU`(1+(bP21N!2=el)nLx>qk%)9sV zCdw7&0)o?Qtt+@GX-m?vhrSXUv1fi)GnRP_oGI#d60pTI{8`#iqZFpYwL1#2lpYNcRB>@hu8JOWEpcJwPXq^hXNRp#~ zq!0aSr8^=OO1wY)k`VNH;;jCovJ_-jVrp2{5C0yaT{EJj93HTPwDt#-{n+t1rlqui5F-3x6W*A`z=F3-E+jSIhS68`nCrLQ_-VUX(F+fjF!}I1; zaA+q~43trU#>fd8z7Je@&cjSEDuvELU4dA57p_V%rdDj!l>B)A7x)16-V=JI|L0uLvVM327-G6!QCB#2AAM22@u@f2{yPp z1b6p=-~@N~*OTx2-TUqzZ@u?=t*op}rhBTot4{5+_pZ~DSR}Xg=+dgaG8FN}HD{6D zJGOY%OswC~Bx6NYZ!lvSI)|uZue7EsUt>-L3~J@LU)!V{C@Y4fWIkZ5WE^xn>s~?0 zDz%JmVJ^d-Jh~X%H}~TzFAXZxi!ii84+fC`0C17LdIl%^w85R*>OauY9P2%x_|$)#(MKD&Btv#FwsM%_Jr z&kC=mK? zS&xl9;YT+Ijf&DYoc;TSfr#zM?EPKV42zg0iHYI{>M=UBkRVUrH!g0W#2?IKXfSwv-81~xwL>MQ!1jtIPma%YOq z&LyUcxJ$vD=%K7hbwS*5+|BwOBBF7NRh;{_bZ<-_$*Fhf3Nfw9FOQrLOD@1 zBJPUSM?f55$_skGe~iqw@BO8K@-@ppGeoV6Wt<}u&j@!t)Q;FuKEiTqs(Ywm#24Db89*=3`sAj3UtdrZ2K zmWn6T0OP1;z~aWL{vs9Yu+e)A&>w(ffHTAZsutxXnoe zGs^oTpS@qTH69QL9pwVoicWtiQ>toNLTSlgzp(<^I|C}fuTypkrHcA#c)<#)u{zA7 z%eaB!s;#Aa2E_jmuV2WkQVL(JW2^!z>6*vNy`I>t8k#EV!U2#HUV$k5Al;_j!_6-nqSvfeq+qT_`xp|JHaLl*3y@> zapG0_Y0+;P4>ZE)@v^&2q8*1TOUr$@aSk3JBb>wt!R5-Y=W-4?xA>-YJo57Dl;%NM zlP}p{Vz_S}-s8Ms`RC^4GSj|RT}WWkt}q!&p#Gg-+XOQaLhlG}t7lxI^7eCU!8i$X zF@lmJ-`5kv7q9DJ)loU8r$X&gvE)El>P8jEwJ)%Wim7?QML9A?Z{AkC@QoG9QwY65e}UD8@mK6Y zc=Fo^DYDN|g+Qo)axyP`4RLiqG{4Hn{<-F$%50lB2iLc?q955m-roZ;2zLE%63rwd z_g7!B=dzvlFP!tbw-&G>$P z(r$KU$^dHP^PdmDpRf1~+xB>9YsN=KF$oaof16XaA1g1|5l+ZeVZR~v1_y_Ng#~?o zwsfgJ`uga1*WqHlJz)0zi_*W22?SX$)|v1zQYfvB>jN#trdpyB#(+bTU30YTpbXx3 zLr65bH@&|w$R2ZNPrj5ts$B!7ll|?P$x^!ysnAUadWF-z8voE&GQ6%d=dJ3n zGt*Ku>urdwI0>PjgoTHj@DWkOl#Hqq0c{gc0eAs!NHsA+vIhR+`2cO^D)8sqjKzpE z9s2hfi=ND<3tG>!0a_vinK;5+Xw~eJ`WqDiN-6UHLich z5efB%cO0n_`n&KB{m%*ffosu0xwDA&M<*{BEK}fQaQr>mHi1s8MR{XbHF2x^L@Szm55d8(d^<;#u$DjVG`^wN?bWXIqRckbUT6>% z>k03pfYQbO)#~^P@Zuaqm6t1%q4U3S=hMn|?Z^!RM?rq?PeRp0a z*^;4y<^pp%!%LL32xHHZMuXo?PV)`+ls3yP$%hKTByRuofVB)u$-%ypn(1Zs9GUrk zi6l+YDQCfHFa07W=~)Mj4St8Kjusb6WSYSYV(frSYlHQ3aT7R8>c&cfu%POZ&d|KL zy=lYp>x%&ElSo*)E9zMK-3F0kyzZ=SUKIVx20BMh6p(}?(VKdBAV@aNyDuqyOcg!| zVMc3A_izu#vaaS#JLvAfVLh$kK;K_S?y!!#p+Bwfs#agJJ-G07Nc-Vu(+z_1NHSA_ z`ktro(4iMAjI}nZc)KOoI+jF*X z;?TsGQwze{DJl9GU!{{eY)Rh`Kr)4n2ECH!X%DVB1x-$nA5=)2$o)AVMAI0f25?FX z?gCH7N>?dg*Y5ET;%N{Z$P1+$(#s`ZE&$k9CPvOIHEFe0U1~r=N|h7!@{~OJB1Bc< ztzR_O&M6WNySy4{F?P6ZA=WTJTn|ZZNV4Nd6=QRDsl)StL3HuH!(-z@%ba+!8!k@ z#uXL1#F(wEobqvS3=60tUP@Jt$s?L`fB{mbJG6i^?Fk~IEqM!6aI^@LRc>StWr)Xe zQi5;xAj<|bb7eKXdwhSq(w=FWumT7I#gMWpUG-begc9W9;(ha3pGqxW8-QC^F5WF` zl?!l<5lOjx^an_>vI`3Sg_qCR=bRcq%sB!sAjnOj<@|Tl_WPo?k-uHrI~{w!rbKWD z-ZDm+sF6p?l_fX=qZp;r!VCsm+}NLO>r}BJlTq7;e?nnsoOo&7#AC18p1@sP?v2FS z`}jqB^&0X5RMuVdvP@D(EDgNYp04D?lMG6M#&Cc;Fgq&*9^t%lpe+OT>L&$=ij!4k z@mVsKm~G^d2pmF~e8Y##U;$Yg%x zn-czME?}3`HHi(vwmi;5X=gy);3(dE`@_lsZ$E%a*dZrhu8!k9ndPjSdL%Hm#oPMo z(Bw1}A9IqJ`?Sz#u&xK>Zt}=W48O|@ZB${0KMokHW^U$7)n(TbRNLCx5KaWEeFHURj3B)1UWA(Nxy}*T%J7$Bw@SJ);7f-bu5-zx0 zj|b=?&-B}-B*@FIwgHpiI@h`a^U&NhB;IW568HYy(n>JU?T<{X0UFkCu}JAkl<;+K)4N?(I83k9f^c5U z+^-!)A01mMmKU^M&*`v{u#Td{XoJT1&rxiE;>-n^-Vo2cLFeubgcSsUPX0RSHaSl! zo=f!OXvw~=Cr^U_VC#{7=MHj)X>u&eF-!Lv33$pqltBi+LXJz)&32$=Jx+$-kNsTa z!4!b|>pWB>kgF+3rN#vTRDTtZlU>>62~WW1W@b3$z@@#b0=Ee6E*k}}@-6=_3@K7? zXx9-W>rvaV?!1bPu!Ao4j!S_^W=a2Jwrl%c+9b(2QN1J~@8Wdzd+87_JiTAtGEycu zd-uFkivT((({Il(y*Wmv^3sj@y#tFp(CTq*_ju=IHD9ro9VjMRG`rOJ)yxI}(mv0E zM@x+X4-XG{VUimFc?4h)+yv`;0E|cjRcWA9YInwdLj6PG9f0Z?DgRF zWD|ytu>U=DK?X?JiUpDzv^8u>oY2pQklOh=YwbD_a(5~y-T7Cfo}mA^6w2U5Jm$HQ z4z9OeJ2A6J*XZ7 za1hJLb;+MLkL#ngtHVX;g@D@=v7O-&5wDWNC~;l?b*rrt1HgR~B9%bHtd<%uxonra zH#ez(AZ7_59-+n0Oc20jcnZ8pX+7C2qvN{$*~=3kn?{`_M1RJfL!E&+@xFim`o3oT zuZN<>@c$VJZcfild0x(_CnY8Qnx1|G9e)6oX9%pUu6Mfym4I0U$=~;Kf6k0g28uQT zAykYfwotFd6*G}VUry5-xFN&C!v?0N2+bfNa_{eeer*yF27uPNVZ+TNT)pz6?Rg|qQg=pxzpgVhX7!0M6C1Z6 zIA;`#z_)cdh{M&L_;g^~VG0n^~f|8DH281Fvt}2pXIc30~K)gWvo5BrF|iw0hx;IuP~`l5()YnD5*o=P*| zwRWMb>oK^w5`t!T|7}`(WwF8^!e-9agg$Gr z-y{R*e7)mas3F#1$mo2LTG$J`R=DXStVMNx+sS%msm#5r;u=Lr(giCn-5Beh@@3=P z`XSbJ4sTx%XV4YVyL~=ck1s~pnYbO_M{2pj=9U3%Q&!?WR_6z>lef2sji{)1NR;_= z-~Ir_3<>w@CcE>zN0~SF{dYbOY31C_sOy{XFU<{`WqJjU2|W`5PA1KqLg)isxkv`c z)j}KzTgIV?2G%X&UmA_DxnQnqBRjeos6nnqhosB986Nb`9rFtsoGNtEiY&-4v776uV@-*ON&d*&xj|Lt?!^Gt4rQLWVqF`Gcw`dMH`CM) zqNalirob@Cg5IiMLwnuDaN@8gML!69&1G_r*KODluR?9dh44P?Mzd{>g^{`1bEUxc zN>&vmV_rOd=306ynb{V@31|z<2G^-DZ!6CY9Sh>@3L{0LBdaK3;yyu5dE+!MxIj8h zpcZ^#gGaok7H}OGM|hiMtzkQ$6g^(z4Ng+yPB7Qt)%495k=c>?`s(V4+XxvD62tuW68iT3n1Zxz}p4fSLs! zW8UZ@J9zrfdIqZlV{mlx>$p;`zfSiB-yBTOM8&r$ALqi| z!@}%}gtI!jA-+>$5%W+=uiz|*>?{cT5q_Nm z&W*d$CRJ23s#es=(2!yzH?Qz^0KIZo8)Sz&$Ncd6Q9bN0r#nRpZjz7wl{b#WkW9jF$5&n-_2xj>8#hCbrqacT3! zb}d37=Ahes=}JPTFQ;<&Y9&&7$arX)fKVa)VPs;ud!Qnw?wj+B)Uh-p-8`@p7=Jjn zP)ng%Tx$c^#PRelTr)0-X3Hp1e64Vy+`|(kH<8G$h3aumFC6j&lQ+0CulZu>ARsp% zB_S1;eT?0THcuV~@I&TrcB`qk)*MLV#(uezdDU{a_sH*MA*wx6o5gtuF~VzQ51)`$ z;vfY%^VCE>XXDJU>}KR&q+jXGs<9B;f!5u=X*I~k{F=CK#hX!Omv-jG@LUNk3JZF$ zEN+Aty~7~x*|}5cg0-MyJ$|a^w^OXz=n_|R zCCIQ;qbxr>duadDxN(0~!mU7IQ9L{A+n3-VIw3afLinZPP|YyU@gRR#7^2#tna*2H zXC7ba^~N+U@{tO8GcgQ)KvP@&QWf*oy07IpENK13uLC>M{0tW}wd_deA0jTWXXCnF z6WvKhiLkkM=)^yfcL7gu%kpj<`MkSPfqxQYF3gwzr#i{68yy(NK}0FT39$vlpnD~> zK}bnEu(6QM=S1J*WavqPuuqEhKVAT_#oIrrwm2=vG3jWl=u?Bkc18s;?`a3C8^Y7i zz@}+f`WVeQ>#s`Knil~tal9sOp5}3m?!W>ru#nNS_(UyW0xKdLTVUBWj7t`NGYbNT z&)0771|tP-fo!Jr-W|NCDM(_h-m2;gNu5=d!QHU$-tq5%VNrS-Ol2-5Qc1Pluo1ND z&yLlf5+&jce14(!UA`@h^gM{0Gq}<{B~b}zR_l>U5pdG{3doIQQMaj{d3VYG``()o zF=mj13DKkn_HT~}pc7$N`({10Sq2+)Vq0w?Xj$kEIhldxd~Y$y9Wdv0>BWsdbbLKK zGiJf-qgqf2&qegjT9au*@B-T~aNGujCL=NTUxQPw(#r&tB8ot@=0ai7^wVc<6q%tD z6UI(oz1}+KqQjcb^^HD$@qT)tg<|@8ltn1yj~B%9*Fg&1JXtS~Gfy(vm>6@`s;}cP z%uIhL;5%+)x8NS)P~-&2S$BZLahr__dS33SebqZN-9ymKk8I^k$8|%vtX@6kXW#=@ zy=Bs$ncO=qW}ehrQHAZ;n%>g>85#%*dNEuFVEXR8)>}Eb@)asx;f24T9+NdfhPPv! zivsvKcjKQ+xyZmWSkg1SXh>}$bf&1J3_4!at$@1}0Tqkvo2TB~M zQGwDQ^-TFSBSbjfK$32)%6j8#UUPFI#t(R8g{Zz?x&RjG>3AWN8w=8!*ths~a74}i zhRrr5pAO3uXM7LLF9xtXfXzRGZ1S%bue-b!in|%qe*vr4#MWi!E8!BF5c?FLv}n`W z#eFZxp>)@0=}bhe<*OWd!RJ3eBp+SRM`kw_R%*P!77YEdZ;K%AMobniMY9~c%~gq( z6L)n>Bzpsalf!l;1XpF<#xB23+iE=3nJl;l1ro~_#Vz2upuH?;IU$LqMNvj2pS`S| z;K*+CCc3xy+?b%_BIRT?puIM@x;z(xQ?6dWv||9&dEjt4T1wVFhy}9aNIsV%G9jNe z5ih77zq;J&fnTBt)mnJk9!$`OCuh|4++(E?#S=7GAu&C1x-!)=N0>Aua--tcM=VG*H`u55ePa>V)56IlY7Zx;uJON9i+1VO$ zNwR5crX~vYN#L(w-BjSq(NyCB_K3$?cyZ+?xiQ1dc@U%cMRogL%*iL3ErtklzEZN# z9bf?~Olh4!$8{7+y8judh%qY;PlWIMnA>M z4B)fz4`dUQI;y|qEw||ilW|$Sp zccX3kXF(1qWVi6b2lkl{z>qEDnx9;2E8}DHpuwrR#327P|GPCv{cLg~?IFvQoShOI zRQaNL@;*kbwuBm-%4y9et3vtM-j@KVR^=^cBA{Qmr0r%}vQV|d|4REz>Agi{ZI+XU zj9mP^#bE48I{YrpB{1FL?gNtiJJ>JxndpQ`?*fYzDb%%Cj&Opmtmu9@`j9ePm3_ho zc8VvNEMK=JPTUc4TK#JCx(B%B*)3EcErA|Y6qdlW+1lF5 zuBv*S>GQ-R_;h0=BP+X>YTKqrq7O(`oVLp-A25Jds8-><{pZ)2>eD1tOrQpOK$!r6 z^t~>zkCt0Qp)@t12o0XxEB%`m{$B zsn3%M&1D1^$)RZ^G?9!u|Br!QKPL4LqW|g#SDx$NHPhPY zU6d->U)iR-XvZ}vf4y(${%ri=EQ!rB0Hr=;GzH$ua-1?wZ`?Cl5$?<>=@*ogz6FD3KMs zdRXC5X#%(b|7CUO65R@h`UdhYRp}%nJbBJ+c`itiG#=5rt*o2xx+=PB_zmH>n^kWJB(Bt^-MJ zS&{$eT)}_r@tS>qty1)pi$B3tgRf}$6!TOJ!ohF$_!q5`%3Vmfp)5-+ zp)=e8;B&Z#$S?ZBf-No0qdPCM*1dOUWLmLLDttv2p;(2=5xr z2kjq|N|~Z4mW*9C+c_tbrr}aRXIiB znyvh?86i^LMC<8H;IMQ#PW$3edPgB$S0{e0VpJnbG#$jF1eM#yqv@vUDb|P?1w;PTc zrnj4Szy6$yM9UqlZfaE>LMSVD7#n_)|(gX)zVp2 z$l50>whxqt4s77A;!n3Z6V%54X;JAb1d~~2Bs!n~zQR3m6xJJkRRQPO!o!(uHMB4p z4Y+>{wqi*0gyQ@p-z=9RIeD^+cf`6Bh)!LJx<(YYM)YH_oGw`%(WyW(WK~`8X{fLg zWX|vvxJ62VonmRBp^G8tw+0MX*+s8^ZNgdg2~DK?qpq?v`~+~-A5bcMkQJ`>vbtB?^Dz-Ce1g`hN+He zh90nIMh+;>UECZ90(O*z7kRB)Sq3|mT0`8{rFMP=>zhF*736Psd4uUj33yuIuy(bj)DVZB$ z_m)9lGxj@uYMI@bBqUWDiU1d9$7Z8CIgQa;&0NHPnP7S}v=5Nzt<^J@%FiH^zI(XV z!EzEmHWx6gSkwy2`>!2g`|{=(oD9p|TG@`cw)JLe`SC?myouwIYvKXfmUFj7Mg~+y zjCp!Vi}RtR;ms$c+*0^~Ir{$c4K@aX$a{kT)V7TQOhoeO-O-o7_xoNpb5`n-|BY>> z1kBT_FN86rLi0YwvWiBRRK?eKgSJpTl_s1C4b^FVJM={B=d$0hQoZx*Z)lNC2ZBy3 za@s-SG9xzc8e?2Bt&Q#ri=a{r46HznGgM=f^bap!4JvTSw=_x$y(bc?LT&=(WlZ_M zh_|$3s>zVC*@%eL-dv3=;Pf?isqM-d0LJv##ZcXJ-?S`oLyRDsk2MBs6Yg*dLU@+hj4ezJOPsC`tZ z9JrZMm+2X?6B|MO&YmMdrVXC!BZd$jn_%Qr>{xpa5O=?m-!>pyS4fBc;p+>(N_^r0 zKb6?{TJ!tA+znvPTcO`y^`ECr*5Rw_7JXBgct7@|$(`<{`C09!B^Eh!GIFmSs&=#_ zDDnU9k#pou_9068fs7Kcm+izDPSrteA9RMXfGUTucNMa2Z%9Gk${bQI`GgGfaRdau zSFLyXNnUS%mX;(8-L0Ucd%cH_u8#Dt$6gvNwp0975^C`&>&D0c5rESxvI${{Tajkw z@=6%g%qdTbR#c=#=8_~SI8Q2~J2Gtn)>>NT=aLDLG zmjtOG)Ul5ES^`CMoQzsA)Vw{l!b$$0xT#~3KB-t#rg*zS-~<1+`rc(`B3 zW{{k8N5#r2V8upi4KVC9PkKXG7yqy}4@bebw^|cV;a;a)jcTS{m7>+Qx(Lr6O)IY6 z4M7Y+vC)?qwMrV>wS3cs?hh;-@lA*jHXvOSX*|GcR8Q=1hfay*nb zz*xOV6!j_vWj7w2d=|x1eF;3Uk4UYPt>v%<;ek(5*F@!M&to_+8!EDcL& zu;f#FAKiztl7L4?LP%MHMJ&$LmA2rgMeE?&8cE474*6;u=dQOV?h$5BX`4=ocsmJ! zm0F({v%yVhR}@sL4DVZ=W9|=CA!YUAE_@#yWZBz3i(m5K>q zp#y#Tew6_YpGF2MN%HA3mu|BawS-(3z6^ra-w7^NGGs{c_NMVlYmGjG$>!ZY^7Fb)X<2$^>*L#Si`Xneu4oBqg&0_ zwoo8X7YGe@q^~#ZIqnViF@s+1P5A^QeB7`n1=DXHO1~e(QOkuoobE7zNQT( z1x+Jj+J3c2XiV{{kc?FZwEXVuRgePtFa3iqJ0HrDpfU1!z)%rmy{Lhd)dZtRO>&zw zrEcCS>(AYYPL}Z=>d^cnbQd@KF7z!E?VfYP+RAd=L82REEZCfniT$bg#nPmcktIoQ zqZBB`FioUm z->P1xdewaXWaNW^*@2oZz7#rn#n7JuWSqlHR|8NJNIIWORAy#-9IJU6!1S}UoOD)M zX9831E$|M7|CDZ+D!YF7ZwV*&M>KyeIOz?9th z4(dWE+6(yhj+ZZF+*RY*PdlD_Vd905T~=P=ku5F5U)avh0+d;Z0t+mJ^{43!I03#` z*2Ru-5pwl5U0M}NLIfk>+V`P~69LfD2*F=o{_8Q@eR6hS`^Vq&KfFAfo;ib`+y5p5 zqLB${^8cEAb|(JM9w4=9V0C**@{QbkENlD?0-5)iv8wnB;TP!~FZcsA!xU`+^GQC| zk52*%53bXFnLmsPzpr5?w1>ys4@I@v;{G=E^$hbrqqK3c?-s;>gHg4GSD;41fNpzD zDY2Pcd3DHgiWhbj8%BE@OOsL4ZEdn74;Iu?1Ee{3r0tyt)?t?tQ!mlDkiWhI3!G3g znnw!(Pqb4`T3WRL5A$}Ly+j8u6?whna%>*N^V4$ShG5Utp~hwAwce7c>2QndfEIC~>`yg!YK zh$kWbn>eYxE^^2zb(d7_rioNyea*n|*%j?O=-a9dG6ObPwC}@BpP$Ci2S+&zhNvGA zVB;A{)e&T_mw`hgUuMk+8EU)GY{W0F{M1Tr61sE_2dhBZus@Bf#X`hQ0oH78 z9{X2atAyq{bYI#ElBHBL;dL@uA$SbiyBov*KIoayX9h6TE=j>F5r=+Oo&4E84AI2W zRxak!;CS+z67I5;{nD^5Z%!y5vs0{xYpC)0Ch|Fn@9Ur8C85VD zp%M6ij>gRAhwZP=XDrWbE^D3N8=oJ>o^`6cfDDr<576!!0U4ggmCQN;_Q#_9W9^YA6>FpE zg16QTy$#md7K;UG@@K5x>~T8st)w%zG5p((k3Ve?w;D|!Ipp~)N1bxNDnn*DXCm+L zWJeh`HWKblC9sqS?Fn>zLiv2c%UlB5ly&dV+;WNP7cBj%tYg2jQ8VuXXP52kpU;5; zHfA%?0}nqGD*_A!k1|vaq!4^K5z%RKd;dOjE0*U{GXW$xb@t&K^_`bCHT&y~OOSa-rz;p- z+*hVZa4QG(HS#zif`T5D5GSiCT)MsT1n-~Ic%FrID?>gAaYQRh2z^&sUIj;fd&l0_ zd^(K|@PFsp%vDIv>bB4`&+OcsOQSKc5QIyVJSv9^u^x)q25HQ`1%tt*=GglhsvLe< z-tYBn=rf$L2n8xpRCUFS3vAdEJEN#r*laCK7J9Qijlgt-q6%tLB4Nn=!8+Af;*WEN z2^ELRW^Jt4d$mZ$sagH>0*oK_`pI&@3I%mjgfsIC&df+p_3z3yqv0s#ME*EsA>Ju} zV9KgX-fPM`)!ucNH?mS;4Y-M*d$XTN-JAvXUMU>|LDct13cXJ{5CN-$n(Y0>eMcs2e4cg!oc&Aps>(At}mr+#c`-@^5gLePu<$hx3q_ATJP@)(wN~&{~(H> zt5sLina`BIW2yYEna(0ck1jUdGSpxmo#~$DW)yBjCic?vi3BdX`yr-qZ2i-tB8&OA zymymYpp2c;d_iZeHFM?Rpfkqr^|v)kof~_H(fVoMC;xn~{N8%NePs?)*;cjbbeL93 zYfR^!P*xam*8k44aNG>uWFlaN{m=IB0k1FHQTM6B>ZNHY=^GQ{@x(vT-w3NnRulJMy}6vz zB7zy>{k?bB`e5ceYIYHqHQ2kc==FwAz924^pSFpS66UNTT zM*?`!x;)Y{hiveHUl`rTE&&a}?DidhPbCjK`R$sm1+yZqz2wh0&cA zNbfCu-M*~wrN~l?9w`p5q$BYy4da4X{HtK9W6!D%pUfEQ~%_R z2L=(+4~Gje40CCU++YVmD&Pq3DrME#D(Xgw|9EtQRg z*fU~*O7sjLmgpDZ{px6>O`hm%#O1maJfd$MV@}LB3?7QN2_|Zo_g*kdb*tA~Q zGzevQ1$$&hdd8=ZsKw?+MjI1qF3U?x-MzgC5kx#n=WWkV$IlU&j|XPj0<~)wyHniW z4-MxC3z@5>?azffJ-DY3{UBe`@b#%Om(!*VrHsha*m~x*`1U8}w%=CQPXZ6?w&JJH z5b+aT+e2$%QBnB_s3~YXTZG&7#9-mD?%dXlQcAveg7*uSD5m1!>^hR;aLzGAPKJDp za(S!gV8P^PNLyOJJi;n~gH4)iYr>7i7Xt_s8-4ip6BKoIOK&7VAQH#Nfw_~d+H2Np zpTqhaz%w+62nPA8W4d2EdDh-+wY%4Mdh7S>A153DY`Q4Om;H?+Tl0q+V(B&ipx5}x zLysYcA5xm&!I|E7<~`PJZdaDvSJbQe^=?ES6ohx?bIq>ALLJ)bzUrr#f=#Had2{d1 z)K_{jEyb|gf1yA9c`b-Y##WWUxL^9|VYM{!gvVF?xkM*00oYO@xi0c-&^jbs(|2p6 zFf-3gq*2mwRPSN-4!%~g{I{+pI>d4hr|@a0{XzN`^+}us5+!oPW$juyY>H08U$|~X zN`9Ka^LX8Jgy}h_T{Cbfe>$k&9y*sQ)GNO%Wx#rW=JQJm;|gxRt$;O{Xc^lN7( z^7QaHIL7N~fdS9$+R5M+5wG>^m19$TIIYn~+<(~e4fT3q)#r2-ZQAA&S|ve>VfKDj%++Na+PI+Ipw}*7EM6Q<(QKa6L&GGk!9+F@twVe#2 z#rG%U@%7%{N<5eoS2IisUPq1FL@Pr&x2(%P&t5IhPxt+g2sd-`-eC-LhxOJL z7LdHxICnP%wrjMStHIaJuGeFFUX0sRe`N$n~kCC>5-GLrlY-iUVv|9Hh}HukRg!2A3A5;U>#TqUd8D|a}?nq@6OAevx?l(+va z9I3kXbXc-Dy#mzbwnj_>lBpK~|CIU3p_TdlLKSqgA@pR#e}7QD2mx{|=#jzbgsS3m zeC>@+Oiaw}d1E(n@9gNf+Jigv*!fQlAUZj`tc(Tp(L^Gqo1^HT zY)QT$5J|tClF>UY0?o5S%2;a~A(S^@8$ zx=5IcBA@^JiyX+41pn~@Ku?;;h!$^={%F9)^3;SQE*wK93DZ5dr%_VN{Xz*3@P-V4 zey*{D$OK9fIl}E)hrUn(3v3KkZVR9Mg}Q5z1CJ;l_T{mhHnPZGh*3eL&EYx0729Gj zox0OuZT$~kDW$c{5T~+fv0k$e;eB2xM14V9Uty&`OWZx%UN@-P-^l>QE-N&Qyai!V zfd>fmT&4A4oiT11Zkko!>s5|%)|cmf0+|o+pv`O@M7tLt&)}lAySNcWg7dFz6mv>D zwnb(e$b))FFEgn#GUm2WtEP|ESu z)Y#TyK*#)ECT07LwW=2L{tf4Sx4BQ8F~zGznTv8B24VW&EBWYBy=K%wTJ-kg-=7zJTSduY#Wfw)N%v_eRm8=qjo`XTf2c9;U+E#7>miV1*gDrChyKVe)Xh zKE}JUBFNK%KjFaS#vMi~@(U!2&jSZd2nCqtu$$4l{$VEGY`z$;6~ful=3a!+#k4~9 zl|NJut63ID(W)4&7}(&1-i_!pzZ(07>@>XXiWd9oQT;X2N3l&U6hS7tkqE|Ar!t!U zBv^M9D0tj#EX4fv{f~c6I4ytwpFz^jvh=up5*ge}T@I%`eg?|MD1@jWf3hVmoamr_ z{sCGoro}r9Wv0VmG71Qul;xx4#py@Ly!3?^@*@*PKayOL!i>3V*`jgXgMjHX9e#s{ z-z_!B61mDwq>LxDl+0a()I<2fe?dsBG45Rp?tMiG(03EjGVK7o`^WQ;F!NTXe18RI z=9I^>OIr(!V3+T{Z@u_jI&M+7dd+wMm}XNXJ2=EL`qBJ63mapu&3aK~BC)5hbc^7s zFKP#VJXN@aEY%R$BdrEU_;l4}+R?L?_5oyZQ>QA-2IbL0e z)$D#3ytsHVF~h%F57z|T4uz{<=unkEvCbpT9bhSUvS(wlA zYQ`P4975VFh9TfB97c>cC)>zs-e-1bEF*1D9onqDK*Y)4$`aLz`8+WuTe2jS3^gFElzWdUa0 zvZK0FL~E&G`hx%x+OUx-%#zvNL=!>J{3b=!PM71W5Q;7!{wcbau~42bQ>@d*B4zye+)SQKxyZ3--Z%2em%PffE$`jW>$JKO zLxHcq`wBFBAB;iEq3)|Wm6oY_oo_2tGm8Q(T|F#FV`r|-sSSypgeH-sO+k859W(x7 zVT>ZGey)l2y)5~IVGLfVBZW~uQ|reXbYYI%yNiTrpEP-%eEvtCG&mzDOXLu z9p#Tgr^6{U!MAmn-%v~(OAK_sxJstczDveMe`v(s=k$t&s(OK%E2Jv8E%CcJPO^wj+II&f zX7?mHlGC#DU*8^49Zp8P8){JEn0z8lc(c!)fhNU;Dh_`Pd?k31mezCNgiq2p%G6ip zBQ=I-b()fhE(UsJsdGxYYHEhg5r_@GRU%jcv2(+GU`Xg4+wbuMT z!g^yqan#6Xaqa|1g(&uu)V+$Qy`fBeZB6M0M>CFimbCVA7Bl7K9}Qksr?x-)txFA3 zl>8v7X_E_G#x!qjx0Zy@GU9V=!?eidIS?T}7hG7VXaBL26lEX@v#Y#+_`s-f)`<0@^tPx=*D|WyUVz&X zJO1)8HLD*)Q?;~)cZo(XI6mh&;c!)wOT>J;^_TQQdtg0Z!ez4~(Gz6jqqO zPLfldUXvv$gAPp_F5$AW=!VooL$_<6U?{LSjV6J<$n#N2#NbZEe%i0MzPe6-8Dic5 zv;ZsGKL|a!hGPW69feQ@ftWVmsgY!wnEM$?#E>y%rC@INbLGdoaqH$=r`=DQAI!O< z)@MW=lDZq;H!2Rh$?y`-70K%cOa%)clS(i0>Q*y7CJFK})XhOkHd8Et5S7}-GCl{; zHpP!xW9B+PP;8uy@dO*jpYs=8ceI^0YFidwX?bCEI4b_Bflf@|^}Us+UyAu`ZEOsU zj9|qhh!zIefK=d+2g=E1iv-!7tael_p012OG6>=K?HN3C`uH0Qz2-Wi%W%G(zgiJG z1LmHs=-zXzdd+!4XB2`#bxCg9;NxQBVVDJgMM?NwD}HwYUYtWsAaM~^R#t8e{ea38 z`Kce(DL_JWy1y=7(d*`f+#4vt`5D@RNRrr#u5oa1to`zXh3*RpC#y{nj#u^pP~SHPWuN+Z zMRK$3u=2X@{E z;#$lN%-!0>5w^u!6iINN&L6=TD)M*9E44YQwBaW?+K0c=s_D)zyxPtB^0Dbv?&1OQ>*!@nm z8EsN%f$l9p8(PWvXR)Z$MiJxXj8^-O5fYwrRpg+gkvDVj>VPKWEIHC^5_Me;DTF~I z{@;3if1g66Bzh`74&_(nD6fgON4-!=GD#$WVud*rp!E1`3RgUW{D&6yDw+6@|IaOh zF-lk!j+b=%8!-bmn}p)k#b;Gx2b+E-)r0{#drl*!2;XHA=R-s?0U}{nZZf^p5`kA% zhYZ!aqJbZY>I;b(t?~8jxC;}^!_jdscmD<4)l4PZTzB*4&oR#9`(TroL0!~F#SQJR z?z(7{6EgWDzo03Ijioy2RS=@jp6*7CXaXcLO5~}o-_6;to7Y`hxI^<5`?0_plg%TH z|48$+J@--KJ5t!o7i|U`YYYqc^C-R*iRVT$& z(`fm1k{;`cU8uJ*#jENOE8p9Q`Xtr09I*@54ln=g+722mdg8pKE3%w0OZHkI?iESC zdUr)A@j`;)XQX%#>s~iRf3|ADXEdwHUQIQ9Kj3ewMiP^WLiX)j!skk3s#=shFhFwF z5ViwEtP1uIy(G;7hDVJ0)AfA4vFQf!zCpx9OZ&8TfM!ws4rZow5HLny#WkHMFyZZK zG(3stOAw-om{7Y*VB>u?#v$Or9?5=@T7eNGL1EmA`IRv?Ai-PIJvM2sZh&R9^D%!G zcm%Xk->4`wNMLes1th}y`^(fkC=(F?c-ayrk?Lk6{Nbv*X4W*sxs87vH|JMBn~Lfu z^qA40(NEDlxx~1NX>+#BUo~B6L}@DQN~l)r5Q5O|3nq+ex}XWbM+mpcYXOCsH+R~T zNG?fUZTvAaHZ4x%I>tDTUtIa{ zWxebYm`JvHGHvhgI00bjnA?}+ez4@-@m}zBh3kGoOWDNpI!H%aU~cez*UbEwS>OEm z)|&e-tc0ALd(Kn#-e=#FL*FB|G@gKoAKa=lFa@>i<$Ts+oOu-^cJIfYnBsK>fjn~d z;Ur7Qk{~_yjTV?9&ay(1oPl6-ia>Mw;I?qJ;LLC*qv^>jgELWl<9o^>tIYZ#js73! z6}2jkU=wUo6?)wjrYn1AbKitx>az1l7ju%F4GV2Q)ULT|n+@umjKL)b<`lIAY6pcPA?8c}c`pv| zRLIh2_Y4tj-dr(5hfztf>Q);(I_7V+(!>{U-{BQ+)>oemm_C>FuryN&awSi#=~7;< zUp^|0@ZG1Ct=dd^FymTn!HGyiw4%dmXZEcc7fwx`L3Tm@tZjO?j0Lyr3dp}AVYa)d zzB_2)2@=zq4i4~(?8*9(aig%mOisV*B;{^;FI}L&`g6xOpW9M>$&e`gD4=z3!hOoX zT=rWR#m6`jHt7?|%BecZ0>;Jxk}DX4gjQ-W*F!crJS#^{fGUV*2G;qsY5lRWtwGW< zkG-CGnOpDsN|}Xi4#a*w#2v4tn=HFZQ=ps*Iy%s(9_quFg;1B}bbuUnk;r6*iw|mU z)yrNn8U!VO7!BbXExX>QwsiYOEk!BcHKWHVg{W*){e~%hdpB7EYFPNUe9oSI#g@@D zqdz%u(XbYgP5@Ej3rk%s)3$t6wo}WsEa3;U-qM*oBEEH^RQd$z-^*YsOjMeqRa?Cp z`0k49;Oc>&4d5YSgl@#IjcNk$1)rUl%L;{K-(ZeaO!5)14o12jIX#ySqA%?D1S;S!hMsm33PYmv@ z-!Y-_W_47bB^JQhK~)C$8uW%dhrICpo}&8Q>sw!p-oExNa(Nhe|Jn#?{qa6koE`U| zA2Rl*PrTTYW^jKa#>LT?WV`5^-KcXm1lz5q*CBVV4LR6$Wi$-kCx@ImwJBu1I0_XT zBO_OzvQ_PFQVWdD>!CB9D)bJ9$ZFSi`OmrBYAByPh$X9XwwG)Ly7TgbE_@biUBPj^ zi1Mk#Ui=f=;jZ_a=y}ynrfghe*H$QbusU3KQxKK)TUn`h=CzPL;hXh_M7c(5O&+lg z6C={ROaa?DvGV+9TT~)wNw4Z@D34iQ+UA%8uf!oR<%(Wtm79YalEaO$C7d8CibDR4J8jL(?vrJ8Jt zfJ<6@?Z|8~PgVIaDjJQ5-HnF_wz=mqguwV-^SK$KAm%@=HlibXa`L&}wgR>yr3IMy z$;ru%1olVk=I=ABXdca76D*r;p}lOyS>nW{bJiH!8IibY&qd-0QgQKNSo8hO$^8yY zGjiegb0vTY<-qXtv5al$aK#U1*Lcop?7{BUq1!;=S^2ZIa9tY=6nQY6TJKyki|6@8 zyE-1Ku6?XNT)aZvt=Egf4*5xjEs`F!^qvZquu_y%#4Qzz*P-03lz~op6#`oj!eW@F zdi;4`MgMmk_Fn*O5AK)(l~Z^E!P{&Sc?M0~TlZC1Qu-9nFS1|l=rH#-M5b&dDI1}c zoB6_TKL&u-a)~`Vzv_cAoynjV&5No4j$3Cmz-(KWIR*v?YX-_INiP(`XhX0iZNj^k zxtI!PL40b^+sJ3k9oK<~fBD9wuyadv+;{5wgF67Vi>_KUx5&ueRB{?ZgrTT$tXCr) z58_Y00{D0aI&LvOY7=q=t0%*|$pwY%*mRw2^CS9Q(t5P>$-&r4MkGT_sO03!e$+C^ z4!cmo>C1rfw(qm!cSCtRY2OM{Y8RXL8n$5KUj1^-@y+ae>E;GQCYtPO^;8j~)XEK| z3K7-!HlU_{>4C&k8ZSI=yXeX}XO{NcHx2n4L;zHJ_jeQLy8%2vlMVEEMe&GiIKAeg zPua~_$WJ4hNErH{&~@rHy9v^AsfulYMI03_S5Az~7?IFq=f%GTCZ(G~Pc$}=E_;?$ zMAABK60wzBziMh_+5bi#feN~p-S`zRjyi=bdPC^lc6UM~SyeG>2rEUBOPaF>LxPw* zI8`|~dTB@P>2rajr^fm@CB0E*WUm>2BP4RY9^BERE=iO3;CG@7$bTuEYgW<}qhd<2 zuO=TP^v2d*p+$}wcvw*F3Rzx9Pql$B>#5?C!h=en`#f!PQj_mr~jE{ zkv$9wj;5vV;WXiKGcE-XF$u0Nd;sPAfGAE2F(qS4?j%|Zl$n1ZX4u%Gd04xlg@QQ9 zT2tEq$A`s<)r+(%9 zU=-^A4(ZW>VpvgQ>oecx_e+gglV2GM#m9wH(nbjdj)!TGTh&)+iZIUffcm`pPiWl!gyu zM~@n?z+f*|oxo6hkoZp;5H!5-X3u2e=r*PC7!KbMK%h}76e%jy0-P@o_h~7#W{&>J z8z5VG;DQViz5rdx7Yd|pRl~SDFa2q#P!B8DqHAVqGF~6ZsC)GF~%E$oTpv) zeprL|ZVuPWfuQ6V*9qSOp+oQ0LDdp^9#BY~oOc~4ghbr-xm35FV{1Dzs><@bqFLW1 z+rpy=n5?4+!WsaoM4u=XG+85}pwTHG`xlgwxj(H^Jw+ ze8#%lst#-DTBTE4|^m22|Jx#iNzyK8--OF+bYxNz8Twq{;$9J_$q!}WT7nI^20 zD}>ofqOQ6Ni($5|*gLrU^_7Nlc=dJL{`UQk8ET1ahcP)?}*H zqpgg(F-{hlT)X*UrXcCUi$B^+cI&LB+6k#D%7pSHM@dPWJNzTDu+S3lSQi*}TNuT< za>;f@P9lh|F$Dzx}-@F?QJk$Wy|0y3#)<)o);TplD@NzyQoMUhPJjIxE%ndg_{mY3J6kCL(&`VF zI7ZZ&e%?I>n28>h(*qN=#?pdBPd)YQn@4VdN!4uuP)1cI^rUIM&c!Elg}Nu_#9y?eTJP9L9`A7erRhFYXDzd2fh^y zRlT4zip7nJX2OA^T4(_PhN-HmdddDMZnXKH66t5HCEFRjSf5O-7J&O>u32qf7STwL z^6mPs2~zfoB8!4vR>^4-vo-gzCKh=LVza;j-BmKU^S-xe?GWB2R#K zMKRpK<|ORpbnmLL2mV%+BdGm{1I~@;yu#@JU2kOg9E_O=p2rHh#Kgqb&8Ywr|B@Me zU_IrQHF~WvD^-+t1-dcOqBqRbWLL-ST7=U&n^u^RgzK{*(lgmG%t8Bo7Wtnqen^;% z4e+GUr9Gel%^@3iiHm}Xzni8qbgCow6f_Ruhcf*{F)gvbY@`D`q7ewu06>g|HDcUN z4n9df#>`$~en`_l!L`AbT~W|vxO!_?Z++dxh1fvM>tQNDyT~de7q{!>21sRxixW$Z z+Pv0;szK8$NJu$;u^)eH*z0xQVD(>fd%q(E|MFa%K9)eDP!PEw(qGM7N|AT9&7T+w z?qYfyYI-@!9y&Yo3}oMrACx;ISzKHMG^WS#FxuBe{D1iMt&CbjxHQDL08(Alt0-f;&?`|ipaym&AwX^a?kM_ z98biNmf{(7z#LE$biq+vM;!T4)R!T(?rk5 ziqCY^49b~yXDMkBTt%lW6_|FOMl{p)50b)Re*CW=$MNVU{YDOciuL)p5U$HwBccB; zymtn6-90{@{aF)zLwaXG>Pg}T3y$n*tuCBh)Qj>5a<(RAxF9FZ`SSBYe~%-psFa>W z|G_V2rfn9~aRZ0SVa75Z+gugKNo;^P-H2#wmMo;0{F-?cc+(vY6!mKi)g zmTV9frYo^7Ssk93K}wRbUMt(p?PxeZ+Yss7Rw$~d_sk~kG1k@+l_Uf+aJ9Dh?l0z9T53G zLvX-y|AhQIO^3G)ektG)gFH5=(AiqI4~HWg_D#gmgvjCYvR%d|=U}4WEQ!kr2NQ8% z=^Iweer`W-GWHZtYe$mf^XQG?8+OB&q#YzqO|kIr!xK&OZBk*I6$VxxtFzouTw54v z9v-9mr2JOqenVX&euFLd?1fn|BM}&PR z%_7S8Afqj2Q-3S)EYCIFmCY1<`T)BiR>J;_fr>5^lfknQp+&(&oI|^8BIx z6y=uBRS?gzO{FKf*>7ZV%eXTARL^u!GA5X;x!R!O#OS+OvX$+k%XC|;^z$#C6TnKi z0dNd=RYUD<7>XHJkh28baAMgYIDJo4-<(?gIF87a3&+fCnLL6w^1?e!6?TBAhg_sd zB4C(x83POHd^>hm-=XS{)Gx|0RMW!7w!uF1DEH_O;yXGwil^$UatS@R9yz-OKTwa< zG`8TvDEyR&yH94jom3I*x*}d^Af6p()q?5jEN-O{=ZU!)xXBdU=<*O)6#=-HNA8yf zzUhF7elh!EEqiC$Yj7TW7W@R4LiWK`bd>$#G65;KV#9?jd46Cn+B+#~UP$R_LN7NR z#K6Oxf{+gfht|lZi}gm*lR%5dW%eCnMZ?$Ln){o$uMX(OKb*bt) z_Orj)+~1;xPvfU)Wh?xyN>}OsDCkAqv5%7>MF2M|DZ_+21zlUdr`d{*86A^u2qX^a zsuMkIPe8~OmgV@&=mq3FwejxMIpp4&H4%mdM*Yj01eZ7;FH3JN6x$TY5I z+2OxlIb&h8EG3j?4#pppO4i+fQr7$20ZODee&}l=rh3Ws?i5P9!7Q8{>l2OC%9~V| zC8#ZK8!AXu$R3x}TQ1bC4VfReGpi%!kMVLId5dsFF34=Cn13T{2|X#@SUy83(eYIW z!nAFrg8KLu4KQc;C2Ly5tr~rz@Nv;hwjLfMn-(Dfq1P2z)tG1U6{Y&X8hzQkVKgxt zeA19$!z-g1ek34wcf6`Pw;~_hIrJ8Dx|mmCEj zNhI7J^V5-ZX%lKs`mD=Rdnpsjr0iAvEh zom^szK*(Mqw<1#`mh`sWU)TA9?(5tRGb+EYRu{D8s z*WS<#bchhF{lJVea^6H1`+|nX`)3evNLc}fc)$y1F{NWD#@Ow*WZ`Csk?!fY(YN34 zb|3QkUD&`3#KKp#RYxxmZsek8cUu^LtRM&j3AN7JQyutX$)rzETMC%3hjc}fEpAv|N?}c8u?EW$ z9vyOiU;m8j#lb2$SQhpQAev>K?|{fy!7;03xa4Wfmu3u$a|L+>4>`Lv|K54G?fWeyFKbu3#1VA1g%i A3IG5A literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/review-select-import.png b/docs/assets/uiguide/review-select-import.png index 8b137891791fe96927ad78e64b0aad7bded08bdc..8b7816969aecf24163d4cb875390515d6a183d93 100644 GIT binary patch literal 81061 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%0AKr{=PE>yKH4;NgVq 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 P;N#H)jr&FSo(KI0jD-k% literal 1 Icmd-A000XB3jhEB diff --git a/docs/assets/uiguide/select-register-existing-component.png b/docs/assets/uiguide/select-register-existing-component.png new file mode 100644 index 0000000000000000000000000000000000000000..8d3f5c7af448c26dbb4238c181a4887045eaede1 GIT binary patch literal 73429 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 Df1Nep literal 0 HcmV?d00001 From 235110578c8d2736b4286fabece67dc4b9994db2 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:33:13 -0500 Subject: [PATCH 006/455] Added graphics for create new component Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- .../uiguide/enter-name-of-new-component.png | Bin 0 -> 81296 bytes ...-tutorial-component-in-software-catalog.png | Bin 0 -> 48015 bytes .../select-create-for-new-component.png | Bin 0 -> 43932 bytes .../select-create-to-make-component.png | Bin 0 -> 87342 bytes .../uiguide/select-review-create-component.png | Bin 0 -> 90646 bytes docs/assets/uiguide/setup-nodejs-cat-owner.png | Bin 0 -> 87521 bytes .../successful-create-new-component.png | Bin 0 -> 190445 bytes .../tutorial-component-open-in-catalog.png | Bin 0 -> 90202 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/uiguide/enter-name-of-new-component.png create mode 100644 docs/assets/uiguide/new-tutorial-component-in-software-catalog.png create mode 100644 docs/assets/uiguide/select-create-for-new-component.png create mode 100644 docs/assets/uiguide/select-create-to-make-component.png create mode 100644 docs/assets/uiguide/select-review-create-component.png create mode 100644 docs/assets/uiguide/setup-nodejs-cat-owner.png create mode 100644 docs/assets/uiguide/successful-create-new-component.png create mode 100644 docs/assets/uiguide/tutorial-component-open-in-catalog.png diff --git a/docs/assets/uiguide/enter-name-of-new-component.png b/docs/assets/uiguide/enter-name-of-new-component.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6a11a3602df14fdf159622b315cd6dab7ad371 GIT binary patch literal 81296 zcmV*tKtjKXP)V)OybC9`pV_@9!->O-=Wy^VGA~Q%}{YVyC?AMh;at z0Or)PxPQ(VP;yao4lq({aFO3l&A}K0=NuVhC?hoo2ZLy*5K!;M@gwh(epnizC_GAc zjNTOgstRL3S#o5V0T@D0;{l*_>h64j>FGY^d!^>Dh0p@%rR4p=%Mkj<0B~NS-D+TR zvVonZTG(N-fvL%sXwLv%0xT1J)$#|?C)q)O9X0V2|FGfue5-=XIY-HXxo&|@cYwM1 z0{wm&ct6Y_{XD`ysy88d@(6;|Zd||&%D#jjh{0uyftNfeKwi3fE#RsK;r=Q7xZD_E z*?*G0GGu7t@2=gk(ECyNX}!|^sEWQ45xJ)O_wC3QfOx+eze@PE@beXb^D+!S1Xq?U zXUKCV=W(7_VjzZCzN3jR~UfmcF({Q(LM zti$+)iB5TK75vwtH{|@B!CJuc84=W*ntWqyNO{mMILFrMK4xYHHq1Kk63+e)Dd<@6 z=X=X)bTY;;wL=qAlTA_Y&_bTasOFV{dCGVd?kW6S1NYG9?u(+#&6ntO2k6cfn42r& z2=Wwud^_Qn>YfMXLEpCrH|PCI{OtC=_!9{7IDU4Uh00g)H{yqC=$8lA>pu=4Jh>Od(e%15P=t~Ci+JnFPgM)4)c(ey!^Orma8jZ|=s~Fs>gM$FV*5uDHFg*CC{b|a5 ziueD}!GUjY7PyMwFJ%`Boiu)Fc-8m?UL^2b{(0|L*vDdnKl+$+pe#xh1=q=-dic>l zpf-M0#>;uYu~Gh2`n`}dGA|e$ls~ZH)Jb@y8@S^}!mozL4UMFvw-$a5{6M^?;qfrv z41E>&i4I`+XVb}fBHkKuT#MnyUU4qT{3o=ovOFyAjQH&1g7C)kL|F}>0j9Ly7gncKh& zmaac>_>)ktYW!S%wiPTT-%zmO^Dp{3!OwN}Df}>${<*P#IFlG>V4Yy68o!kOR48a7 z*vlIkG86YF^p7IMjb9=Dz^BXj;~@3{|4SJVS|M@e8e9P&d~-9`Hh#w6h3rG)H^d52 z($6R9^E;q^Ip$ZQD}WY%L-t{>;4hAUE`D+O+3yc0-(parEIG=e3P007)xQw_Dfy<7 zo%FHiKo@8qQT(FzQG&6|N+t|vA9e8yXTpOke=h%0CHB}FH{$V6Y-Le{iRW1K`);BB z-CG&29CsxQ75qp0CjI)cQrg+axt4f6Qc}H8cr3&J7I;AQ;A#41HSr70d;@L6o*Vr> z$Mj4eoo-Q&-i69BRuW)1w;RNlKkLDBOPEgkFJmJa#>Sf%8_6*~-oW^1jK%agF-* zM6$GU+^EI75PlUaC>DNUIu-m>{A0Gw5jyE?rjmbYeU9U2#*J7!VB;4c04e^t_}R%3 zcJfel|QWQ(eKqy4yag@uP#MsbkwdqV$E}FH*ktA5g)+D*S8!Rhf8Rmwyp+=VdCT z6?9lO{1RxkGrgJ#2TDEuxpIZYztp%<{Vj)27tK`H&Xjt53xA71-A=53#W(HmB6^p^ z&wb75n3q*6CBuG;;^JqobohFkSV@rl`@^o}440`d2OK5m7|8FqI8UwQBvv8}0%ib9 z^&hd{>Xn#<^3Q?q@oz}`NUUVl!!O`(7z4@@$TCqch=1xIfsUnL4a!x;lQFkP$L)aK zQt^kzORB$yUY~yo0rv8@ip+oP!=Ge{dkFvxj3q|D7@Wjl36>s=s_{!Z`&w`k^e%vd zUJ2n>IiaZF8wb$q71%o6w>~6Y2)v;RdEd=kB|?JX@N>#g@Zz&jgeHGuV>w3JIohop ztyYF+GefJHq1BQ<%}ji-&3)9Uu_|7~@T;2XE7aXG-zzaUH^AJSSQYStZ$qEXbVm3l zB^Ko$=V|Z;)D(W?qSQ8!x*joe>)O-?#w|0zEZAAAL!cBWGld+;4{(i`dqzI|x@ zso-DT;2;K|TK_8e7bUD7e%>|(7tD5(Z`eL60Z^?L}`hXK1y>M4;Ks(WaAxW`=eQNhL7c7_BHc zy7J_pPPed5)-dD|ryZczJ}ty&fXQG*2H`{oGT6V}y}#Gj!!PDns_+y4;$;bzW%hO+ z=Y99j7JhJ&CQ1I;h0+&W)~@7V6@I)#=Iphtdf&#cO1|7Vt;S}6Ww#_4;tu>!u%|Nq zY5c1A=i(RVUnrQYeOgq&KI-uge#Z`c#h6egarkd+eEx;#w)zikgCP8)@Iw3>4nGnP zAfDOPtt+-My7Y$ebLgWhe~CaY#6OQ3&+Lp{6a$XIph(I{O>%CL%{_g8wgQV&|CRc8eMeRai5H6Z}Ua=QBNxC`pA?ELF{NU-`PA;ibS^5B$c>C*{w@Ze$~WD=)1m8;l+RA$hXnt^{cG*? zGQkUzZ)|+@>?1;77(dty8d|<}_{WFPKO4WQ6`raR3;tA5M}!swj-o7m{1W4(3NF)r zxxQ`&{c`X$DB8d8Sd-(1*MAj$@s(qNA3S}D5}1G=vyW>2RZULQ_=QeWTiCek7lsgj zZ2%3m?TIO6QJE5YJ~A0(b>^D`1rMKl&pAkDn|T>blQAicbK)uk80HpT8E|VsEZ2Cs zb+iOC%Y=E6ItWVrkMOT7)Si8kxrI|l_-FRK2|`%Lz0+_^#}=!I&J!mLlc5@EXJ|It z*tV^Qt~^Fk)2D)!P|y-0+G0@1dpouFK9~RGKnd_n)eyCOO~+nV?aNR1D}Q&{qyA#F z&D2$-`sA2t3X}RM5Y#`eR!)fXcl5V?;q2!OYyh0dV<@>ZbK?Fe4VSbVhZHo*JgM3o^#RScWVUHDhw6jR}|x z;@o%DH)9N0CTsb}O#WRwH~-Eu1z)tuGJyfhGx58Gn`II{mzjR8Q@()diW`l&RQzGt zHwWBcp30LzmHH;^AJPxF{WA{jSE89}HHcb>IQYqcDrEmvdy)MWUoxn1_tX~OA8^jm zXfiZ%(bgX(_n+z)pse$?4Su!yn>5E4M=hio#Tkk6=xoDm z&vG6Udf7|PzJXiJ^pFb_S9-kif#@(4xCWyfzsnGQ0$vP21W*DV0>1+wF|9Ecx1ZQK z=G$u*5=4=(BV@S+Sz#{=A<#cNifpTV*8 zC1;yG|KYvYVVS$c)93XIb?P>;7QFPB6D(o;Wae}TI20Z|N1rjVY?tLs*Z!$SvAyd4 z*X}7kFQmlx%=>NU<_kA^B8htLB>uf6xR@?L`w_`vVMeutP0xp3>zTdjx- z7DL?7>KuS>!H&PZ$t55s>eLBJ*Xyre~1#MGvyQ#-Yg2wDHZxs z^#M>dyn6IT0SqxYVgRN)19ar7K=78~8upRKFF|K5dPB}HLT^Q>hhIovwiCU{OhAbyD~MDm7B2_TAJjbbv1u6!we@byIVueyWq_$cX9zbElC#phod0hc~Q zr_!zT_~?D_5y8!dPJ_Q-_m#La)cDY|l6Ifodhvx1t1LMB{ZbwiY9@cF_@_F!t%`p* zY3TdA*tR{*KSY9Og=TI1BFUgi`T8(vv$%W(ov{NTeEh2TSA}2L{;TxQYA_Uj%07eu z*o)ruiy#QbVD{)k?op4_v7nq2EX<9xen#4-E}~pSdE9#gtjw~@v{)fZ?XGxOH}KYk zr@&ELRB&>}Q1B8t%lr&(Xr>*}z0g>dzzBXY zA7pPgc~slSA4Xp)wtWo^uL{4gedL*#2sCo>p>39nld19sLz7G#@?4x;<@%i9sYE); z5rd7%RQm)p39+Fn(-=DSN7iaAT}-B*mWAOL;2(h($ItNB+@R_sP|d$& ztV8gpH?-QpN}7KTd@mRxe%*TPj|(CF4e^h{sekW6zz@KVe} z=*<=4m{2G9<2;<{x6CjsSj2)|n}5~gIHlK@Z;IX&egOoA!cW;p+P}xP%T@DFf(@K@ z7TV4i8!sy-gHikneu}vXCOM)#!my}!}*K;STwyM`>*c@hL>;H+5h3_ z9b%4WQl1(P(DoNZXb;;>7bOmU2F$q7{r`v6bLgWJ3h`e$yz z^YM$LC;ARIF!-eaU}*fnfqt*VU{HdWC3ti%ypS(<;Vue4-#(;= zJO=SG@U;3EI0T;C@`!z75aOS^XEU`&wKjo?;HRpD^~HG*oMFe|D0(%xz-c^@xre1c z?jBg6ekL-7U&=nJwzW_mP0tR{?F=w8+efcgTF=t2r|e>Jd;Zh(QhkXyxS`+;Pj9Ws z<)Y~wep_UU&SC6>F@|O2>A&Dfcq+lG zN2R})# zH3=fWJCh!2E`u?#JxH)wBx*El%(^I|(tDfj-N@Z`>I!q**n7poD+qBj(ocX=fij4Pr<;t4(hmKnZx&_;GZ)B|07P!EmS3 zUnIOL{30tT3z!7f8+5Dvz|iz2OW4^b>0A`O_5EE6UXV`b^(r_%~1b{i@TdysmBgsJ>Jz&AeFfXVaH@KW!h?=eAcHZiu`6UV(nUMA5I}->~@E z_7VO7+-V-bPd~3bmp^pwy}Nyewui&ND0!Ox)c9C^+E?1o4}UJd-(WHPtNNzUU14M| zIO}?DG7)yBgl5|5jlOnAgn z(l^o?<#YKrBzoep#ZRNNQ2>cdr`wH{St~iV&Ggaf1U~w-@G`H7_38YuUDee9bk5LfKGQHPOeDe zSFx=ny`r{cH*J7D^lPOQHY{pgs6#sOl*`ZIBlHTa9=%&w0 z8=hI27BA3Dxe8uV@D!a&Dqbet#m~vis}%sdf1@v6rr*7n#?ccuQxE%b^cxWkt}+-( z`*}ZJu>}=6+SbC)f#;U$$xJwo(DJN^r`*XxzgME@mlzaW>kCT&NCmrszPj7V!uTP1 z`J?<+CBi!(EnlT?Y5W`jjzUx&9b0|0viqX#@2XEDtCDXOej)pCWYOAUBQWAosJoL}78$KX|c-A@S^YR`X-G90~C_-#LU;#WgwSpYMg zKDzRPv0gtgvs*NN_3a~JRYTAlvj6|{_x!v5Zdm@cTRBEX^99mtN~4jX-IiO3h#%3M5PIYV_cS4|n+jK4x#f~8{f+T&d*Byl(4b$UH(w-^Een$`a zAT{i1{)NX$?$F}Wnc`m@KL>s=E};0O^f!&4>;Q&;Hl4}S#wdMB{-y1!p^QxT6*%WV zRMd@^{!OMzF!qC}GqP^@t-t9zbmOmv36PuGoc`n>DQ>hgdm7C*59UT1uOigo<*xvU4_WBf?hX?JUWn3Z*Nl+ujt+(Zu4>IcTemfx>TRwvIb0((IwA(w zZQJ^o?-wvz2oozFux~VGy8radG%9y)@Cz<$8+FnKkSscIH+1USR!_;lIKpB6xjuvk zYo=?eZxxe;1<;$i0n*YFtuJAE^ z-gYxXdqk{bS(#G?>qc*=8@{#wvj_Z)0sVe~LBGTd`qnowSq_Y}8)!Be+U*>zR*v>a zjz-Qjy>z9TbGZ`B4V{_dC!~KPH{R=|a)~PE=9@Xs&qJ;tJKq{;_GBEq09Y<+IDSB_ zKnVOwWRQFPC5CEcmSqgQ5DrM(1P$$<%M!>km5Jxlzi>UC+2fk&*Gz&+FioF-x|qhV zwC{D{Qf_4_$HxNthH56|3r4@?AmcI1P(sjYPRT26{1lx9z|^-QN&b=XhzSkU-!fzw zxLgXcSBU)6jEH(70|eaA3Q#E&mCD5)Z_NsnULgm04uij*j9U0Xuar>-lII!5#xwMK zB?i3${Q(buI4j2wp6~<8KFnJI|D*gI@dr@)gYb4C>QAE|)S9DA@Df za2>aZB{i6H9*;+3glLz$u`)z+Glbc}5dAJO({Z49%X{3s%5C z6#pV}hH@f~*9^^gWtpDoV|sQFnbg&#mpX%Z2CP23s^UApXy(f)wA+-ks%sw$*(Q`K zVK^arQHy^uJxPHN(W_XRf-^sFZx0&QA4D~q(pypL(V4Q3xIc))tD-Y(AO7f77v3W1 ztpHpHUY;>bOg0m`9=4A}v!VO|%b1*e$(P)-s=6}F~nsZ zne6Jv?&}_W?%_qZqYmruT-;OgjngjPus>9cxDA&+s@@fT*#zZ&as&*uE_I^t>f39mwMdO$D@4fj#YzZpDaN?);`SJ@3C`!H}z@pceum1{_XEp!Qem=w&pMR>M zZy#~|T>T5<7yppg@He%RTD7wvg`Z0Bgz#(Vmz5II%t2viGGcqyLz(y59+|@s@64Pj zT;=@S8B!5+dg+^F4Lm;+R?3d(X#+HaD>5jY)Fu;T%>-qwxDXO5fGE8hNjEhJB%O^a z?#h7SpHsW|QA03qdixXMovGfo`{tqJaN`1<$pQ2)z~5x|wlr z53KGcY#+nWYv6@4RX%PC!!W%rerYu>535|5OUpJMJdasc&ACnByFCa|3N)0v<5Z%Ft+u2|>G^V|28EEDL{=P?F3r z9RE#E9TKPW(C6xXClfC-<0_S07Vd-hzPgT->hRF;r&CILQhTxpOq~90)3h@wsCo}b2ULdafhsmU?dvP-Pje&dWP?lvV zi_$E$>QubgVwh)=KKF5eKBIq4QUBBq00X2uJU`&_u;Yg2BE>&=UmvVOlLUWGZeJ8W{Vw#QN155$6T z-3ym-Wa6F}PP#DhfczbRwVls#huZB>gdG3Q%hKNoq2Y-b(5!S;;YVxL54nUbu##qBN7gfUeap#FsQ!Ng_sZDPP zynJAmcWdnNt%N6Wj50FvVgeqM{|nJuo%rzq(+^TPpg#ugcI(^#YwGZyD>AtudKXh- zv%|nlTp8j*Rh-fn-Nxe*R3X$|3nzSsZ$s4Y6&gJ(6Q|M0{wR=S;IX4kk@l z%s%KK9;4SC)I-4I^m15xwFB~1s4s|raB27TB{~~6=!af6K};ms$3pK1>?6iMEJ{Bh5diD_q z;6AIuFKyr+Xji=>-vGtlXD7VwS{~!2)sXPO1+F`(@YOy%XOEm)hK6TqI>Xn051#s9 zm}0%JGc)4%Jo8USsK$>tzd(jatt>30#Dk3r+0DL?mzpqGp92ih6hBMq@iFwzJny%_xM6uy0=>7^OWke@Hz(^9-(AWiSkr==u< zk%j0>>gYpC-{Scf#!H`;5=jE3{4;|&?Z=~27$-@wKATNZKr z#0mnrk(sU(bK#HYy94z5;=-_Csgkb_oB|E>^RR$I`e*gaLi}^k^YC-*By!`m!7mKA zE`BIO3h2t0;^)*c1B~M5+DDD;P>CXfe~0Lpu{mD=M2W6FxD8QK&c#*g?dj|nvd6c| z`7wB}M@qfXFm+0ji=Qx&YUgZDHA=&yb+2DyW@do-UQrYMkiG;mig7htT&aLVw^t?Q z8&}NeoBuQC{3q~R0K61_!Ul)4kHyd{z7y!9+ZFZyJ?DRW&|BZ%rQlKYvz%daqKT}* z7D#XK@zC~P-@gwJuhq;jGTP9q1S9R7bdiRc%5)AB+=gM70evy`_CNPN<*0psF#Ngb zK7A?s82;V>o8Ef&2E;p{zlG&HEPn3fuMU3IWqvNQ5|9|b01{kB=&Y7+wQZzUQinPB zK8#<;pVqezEMjsW8!vS;o*p;MDnSgl5OhN?=S&3udJm$$fsbY;eP7Yv8qqp!|^&hjj{5)isCfbPL|i?uQ`6up+b?Dh)Yf(wyfEqVCH z5j#gaQ#WSjrdFBVZPPt;I)!ywO{Oyswa~4F-!OyCb}2rCw7|_bE8&x`57S{vR%=v@rFD*QOc$D3%kvp|EI^hQb;KR3Dv$u$gjVf4oR&Pc0)_Ncj+pxw@W z|L3AxGgBY)cf2esf}xlnHP4e|C!!e}zsUPlmpplo-R)2ggKF^4bJyzcfpMIZrGA!W z;&-cmJ2UUXqp_l^9_m{P{ak)yV8%!BjfflnfWj{bJZHR6@C|3ZHu06E}8tpxPu z3lv2-&Kv&Rd;P@YUs(U@+ebb8T>A(Z0D)Jv66Pz6i(h(tTqyrS-`rX?r~2X#u%Y;Z z0bs|!Mr8h({NG}oJte*pUfg#^iwcH?93lW}WOAqxZx8(F<6*b#FARZN0D}0{@6PWp zW*qLet-1LE+qU&llzfQ6ydoG{IQfwh(3{0{Q2BbDZCb;?t8i9zf}x?{5y(7^AC>3O z-^3(J6}|mFN2k*lHx1ABEAXpNuLK{pkN>;p--p*~<(QakY-f5G!@mWLN81S=%Yarh z$LOdydURw&++a-G+Vnc0D(tOt(INzZ$dzmVm!KsHKGcBp#}{WG+`++PLzF>MlX%)b zR39<92I=$gi`z$4`QLr70i}1YTc9^zSlf!k`*D9j@r%-z!q0i^jvw)F4IKJv@NXgb zxeDm=EonN@Nr(7@yTai%Tu9Qu8>Rw%@rA6s42lvn z(*tzpi+Y1)9XhS<7rv)C49{Ut;v0wH%2dcVs(zG_*2K?sezmuKEP~#ob9XvmaL)6F zuWr>fSxM5F4cmTg{D$LSuU}%WJHSk*z+87wlivD#^WjzD=lg-h!K=bAy{x_c=_UR= z%do=^4P<%tKS=NYG`zHZMB&KN$eFcWsNGVRlLh<-j67rC#F$`!C%-A;JhrlEo-6wd zQDU7g6reY{LSEB8LjHhGis;UQ5WG15T>Kn_dv3HN1G&VK^ZtI6SB?+wYsLLEY{kNv~HZeM3x+7BAPZefXnc zU3iP2w*s&WZ(^c}Hre}LuY~O*(QI+_CTH!#(Hq6D5^+Os-e4GM=V-MvjEpqIWFVy0 zm3!eM{plo7b#R;RpsIfzZ3O77@gZde`(r`9{h?>v-=*lQgP#e`!t$)V*Pw#l)V&F2 zuYWulw9v^x$UaIA%y$QvpD*<`sOV`_ntzdTjp}cOd@Xsp%?AFuZCxxcC`(<{O7P{Hofsp6MGFMMrMt zrr+n7neCg8fh+KHm3t^U|A*l5$c>k&(`?*tV*bBPZ$R(?e-KB@O z@A(aoPgg8M-Nj=a0Zu;;+kbQ=g1jH4*C}4GfeuQ!}!_uVcSLE8_!C+jk+z%?xOZlmOg_B|JZS7{G0<}=2aF?sngpO7z42H z?)dPzd*h@%8WEs&nR(z5eBq1t;_64k&y$(IfOn~K_QA~5~Vs$`H&Z=)ej6&jJ-gc|bBfhv-s2j*@eov2iK3YlENpX2K|sx+zfCZcLK*0sD~h6gR8J2f*aH?VRd7)!Q(Ap?IL=WmsP{ zeel0~rItc|7u=(EXK#lxbP^DWBIGOl`^b0$t#*dFZh`svf!1FOKPX(n`V;0K*RO@> zR{$&CQm55F}~5<@-~$ zGDVK_p>|=tZ`0c_q>9>rHg&A1J^$M6vH)_5#?=SmZ-xx~b(!1=Z~615;okFqhZ|Gv z9NsJJ_0{S!8^tpDBn#(T3_QX$#^hD^a&X}cYNEsB)=YR?G&Kei9+MA5%{T+FH(vkp zDeO%9WlX%8S=`n96sU0vaShs}wE=)!(JuKQ(FxW>Vn%Wfi{+n~#xub`r>JKm?HsLU zj+vQ0I&%fUBz-KPH-O)Pk}qdAWU?oUu$ioSIV(|Af4Qm&oy@Hj|4gk|tvO}k=^?CZ zLvKj$U=zTV7S*GdXsI6DXa<~d3yLKnHFPinUvW)M^e7gTRK-VXA07)}c%>(fLA#*z z+GHDgBN;^}!{^iM@=v_oYUOCRa_lhGLa$e%+ZmuM_q!S*jUTYTc?#j@+J#N8p)(?n zpuWWE^ywW=Ut<1_{rTZe;2)Mpd$fVkQL@iJD%S|T4(PaDz=1cMeZ&A7?T_H+=nH2t z|E}<};dtN3kp@Bh96#XF+nX=Zn=i3#Yafk9ChizeHxXyV-zY#O0`fI|W}d%yIgyf> zNB~m1@aWCTB)z;$>x++`Z69j9jM+z4y7G1OBs0I;@^$f3-MVzfKgJMG9er`?OmonF zY6MhTen5>M20tY2LrIA0v4YPKy4S$=2N{uT*32={%rMf=%_P9{E5q4GdYlZbEYSET z7SRKwPv+o9k_B@757~!zOt}^i87B#RmtK2}qH>k|%*=Rc<0on}bVuxiWhB-x^3?XF zf!X6nqohO;VY_>ot(`Re4Oimgb9ckuZs1=G@X+r!<3IoNFKuQh_gq8I^r3@in%Si{@Cv?h zk6y(x!#~(kBhN%;RPND&pV_nu=P1fj3(Tr5c;xhgqk$Vuq_{x^Z&EK0vR5 z`9tWmB?^HtU~;m7Mw4M?W}uG*HJLDI6+(aw^uv`<9nW;C0l>}hajpJD40fhFwGyE8 zO}(ekbM!^)4IDaM2D`86U&0az_d@6;8SpxVO9sR;os3g`p{M+Cr-qf;@M>9<-m$9d z<1PG%zBrWIdXl1&1?g-yGc z>GkOw3`z{93(U@lzqI8fU}Us`W+O9zNOq%YTY#VFxBCrea*5|5D-9uf=}Mr6L-g3Y zgvo8q%?lwvz@1F1D_@U3;_&rKfYZN^U)&E^p;e$&_!2A1U;i5?>IbU%m$najs*&~w z3XW#4KTaC{0(m3D_@tP4&UFWvpDzOPrTjDTk9R}0!zr2xcUMxG-&El8LwNL*b=Y0z7#Ty>Tz`qju@Ux7zNcU1UsW{?$x@X8hEa z4jJG;EH$dOv?lD(z0jHI>I+t2^`z6Z-@(;iy#pWp#TObIAn~fn zi3oTx)ncGCUez&Os4cmwP2WCV?w(NfyI+@1?eUS)Nr<-THH3Tgx(tzJbfkf1Bgf2a zA9M4CMXwvl_;PUJniVT(BX$U&zjD|?8bSjCsbyQHYg=EunY~vWH{cTFMsA+hh|y~| zivjR5amqE5Zk?e{qNEHfCSPiAq-(`kMr+DH7gJ^%QWd?f{<-vqGUFDVc81UPf2JNC zX<&4ufgPvX=*}1Db_ST6FVOE579>50yP3I&LNFeq*B85}ZGW)+=#Am$2+4jbAqxB^ z#+%48R~{}rA8opt6s0#rP!OK)2SRnMFghv+_W1hvr8Bvy-Y9);9UNdRdVTw_z(8`r~C$o7%*}yqi7WU@` zKld@Ag9FI2u-^l$iJ`9Dl|j;PtCgYIYGGu)#QdDtHfg~5cA*b{38=eHp1F3R;vilM z=_#--8`KI2>DRRncl@DThlFq02SL=}=XS&NbFSlO1mi~&_#4k;(aD+INkj32fd|UJ zfSz&yu79`92ke;Be#V8OgWLcccD61eA*EK3O@?$iKL2+I;kX@Xg8|ljYYoo-;hY7} zKIeZ4K6>$Cc+qb5d$)e`dYpfylF1&p_?!D-^|<}~vK^1WdrsO3%hlie13dJrb@=q( zJcQqZNyA}Se%wAd|CHrey=My(YE_~rG4s?M?!Ik3zVx*XxTk{N17CI^-g4X$9JY50 z6C;`ZuwP>4$r;>w?RtFqpC89Y8YG;2Bz}C>PMC;tSe6YN@tk+uWo7EI+pakK^?Tyv zRb$wB-1OO-?P24CTk!pF-G%Sp&#Z47%*u%T2s|??kK#v)>zdpF;`EQ7fVZt8t2_^{!=bPJ4OX6X5dPwicgHgi z9>b)X0rvXX{J<7m{x5goi`R65@N`Fe?2dPwyDv^%J&9c=43Fk#=CR?P$8gzK?!aYt zIV%*WAB$hUV;7itY9GJ6_&@Qce^Pu@UgZ${+jaZl5Xz5@8}X)7*WhLcjW>SjC3w$K zWXWr0Gd}mC8*vGSD=UuL4{v?bo;cyaF^eAb`q;dFE3Wr>1f9kMF^!E?kF4K!Rv+ zFzk=7|JN!!gLL`8l~>@8E?J5*-+TzpIBp6nb~J*Re`*>x|KvV=>2qsw7pnCShwh8N zI(H?WbLbRynal}43QTX_ikpA@06zb<^>`!zr_&wa4gc^;eDIk>zW3gTou7RZ_IlNk z`1l+5#tBDGV5+T<>*4Xc9>ur5b}K&py;=BqMS|Zx```l~J`}GzehSN`2z^_-SbN6? zeEnlL;va4&a;0#-cnY?>ddfW9`Y1lU|JC@)5eMSJj~T1sm-5fv84=@OOn!oY{!P$!|Gs^A_=jIl9yv4-xz;q*#r?(rOTQ3Tg(!PB;u#p0@-`D4a(h!};gmg*8>id)CqT`HM#| z{rDUne0VEvyT=a%zSeZh;=;N;M--gpJ z+(hW!2jBR~p*WTZW%^fl;+f|^V3Tq7v+=7p?quUvY{ezdxelMR8t#s-TzM2uAj&`g z>$|b~ZTG|(;*~MH`jgMXd!9d*;D^NZ-iPqX58NRF?EsvYz2|6r@Rd`TtU7+Z*TFRx z--363cdPFQKKMK*_+O8UH|&gaj!WRTWivj1&VAVZldJLSL*j}%{oDKSmv8E`~1Uysx4!}H&->cA$)jepV~@+QueC-_&2Hv+?&|4Dvp82j-wF7?uXzjKXZ#j1*IOiyMS!wX5NLo>1*Hezf zg=bU*{s53SaKOt};nKH@&xrMwr!r7;ZfY+6w%Zwp)(`vvV8>I^A8D;oZr=9{`#-tJ58#&%*!wIe_u2(7mqx7i;GK1NAh63Papc)t9)Bk5W0qrIOZiLOb?ZHjy`+A| zaOTA)-~%-Re*l;~U~hcMF@SXFPSq{Xv zHvoIB#Q9YL^paih?tgt|GVlk0$yNK{ybH!8{|JwqcKbdz9ry!4d-<+-_uoGYZzw~2 z-4%cJo#Sy{oxmRemh6l-eB^k1{MJLkHLDYNw*-5zK zeHDQ}05n=S?CcY9!$m7J2n!S~<4f`8^HPC70OVNq;=^#^xm*sq$xrC~!b}1Qx>h5v z+WsVJ#zaO;)bz(ZLuAVoO;V{^yywCtHMnfcp^w>M^lx@;!wCO?)bz)FX1~Y6wIqbO zKpE42qqTT149n(?BNS&lTYpeudb*Fzo93|Tu`Z^!_0aDZzQH)f9_uAP>5qOF^!2dHi-y`k}s(Hl7Yvvr$G0yu<%a495h0C7N$zk=M3 zmks|24Ec=+=Y&4(%Z)CVrNCA1AMl(hY{$i=Q{;fIGv+ueNQVRCcwW2IjlxQ7+3=)h ztTh1;E*PAfa~C)_Kk9c=M@oMVKfCnTc-5&t#j{TPDV}x4E%@R_0dd7yhvBWO>``#$ z;m2_CM{dM%r{0M3FWrPk`s87A46k^@!8l4YiUHUk=NvO)_qlBwF8}f^IR4b1;`l$i z9iRR2lX${8EpTF=CHPY=c*C!}9WOccr#Sx9jaciTKl9uB@SIbBisMiHDW3C=y9IA| zJpiA2wKK7qoyFCc-iFg(_1`%CBlqFw8)@L0VXqVS$9oSq3M-NWPA%B1Yp`AMXV0Iq z1OI*(*Is%%&N%hI@!V5y!TY}R7}n0gE-QAz%a@x$P7OXRQ+lHQE(b26GgfJ4XaVSL zc@mdjcoPnP-oNA2&#cAmTb*|K1de^h5__ClaVRc2dkL)1OJ-(p)t7I=i=O=>yy*P9 zaP@kdNBh3yP<;FtK;_)NcJo%u)AyH5;Dyfs%=CE$j`hA=7qIp_Vn1utU-`mGtfWo4 zTk*@kx1ys!P0ATZ;M~=AU-OS|#y@@PTC953l{oEF58>BO*{`(sU5N|M8MlIjmFKL+ z`Ny~IfOL8W*L?GKoObLF@w8KKz=!{JGdA~VgC>r6-Ql?Kc!?W_x24MhcmH~P?rqm# z)ibWa`!0JD({6*Dw!0dKJ>zHi^v^mruaV=B;||0MFOm$G&3CQE=ihcU4nO8 zar5Jj!7bSpXa29f#lH!t=X~}EoN=Jb*C+73Fa82AJNgP7{`wnn@sFl$8d_sG>4IZ$ z-X78)foZ2~l~#^6fceKZ;h#S8-`M}4f5nUc;$GbHgww7uh3C9}x$SuOIU1MzCfWI3va^5u6Pm~ zII!`Khw=Wm{{}yQoV3ZuapE8EiL#LW6+HUGOI1ILFI{v8{{BZ>@Y@YN%=Am#`=7Vr z1K;0*4FyM0Zo>`V{Vl%mtFD7|6FaXqD@B(6=uC;pjGKQ41o-&l_~4s=g^PYRi>V!& zc<{gO!WmzF9GjhHEB9Dt7zW_fcdo!8mT+fq`Nw~T_k4RZ)^U!9*W8bHoW2HEZzOH< z3B2(2`z=?xFxeiH z-J!Mm8N&x&x{E!Lncj>qzWqjg^2(>cIdInxe}mV2awF_rJ{gX9{sCB_vTEfX_`oZj zElSf*;*011H{S7Ou`iyl+l0$Me*;eV%e8pGngER9r1Or%F*KtQlGnzKc<&jv;u~vb z!TBt%`d@2s)jffBk8H$y|MXV;<1HPOJ-6YyN1QfG#_;{*Gn6e$#vd2#7{1n+w3_4xD;pTg)^1CLyD2hP0kQEYOW z?X~ajIx7Rt@!C)Cjl-#+=C|V8=lu|G{nAD}1dg@W-H9`w@pD|Yj)O zk{xtwx{|>IHE0c8$FOG%nD3R?Hr>aj$2xfO$$4};1MQ=fyqM-Ew`;~VUZwlIRB{lE zC}sB6)V4fIosl&)BlN1wrm9Pl$)zjIWl7#AlLc+Rs-m0EnOUi(@I+${2Cn^p&aQH` zTEsM+<_$>?iE#^=T~_fxA>qqBH3~(KTFEUWy|Pa+&XzJJE5!~Cl~Ly0thjTsf*}=) z10ufQPF%;sKb}9(&rHmwR7{OwrHmt0o#hM@J2bK5PHl{gv&RckyWztfqKn>EohBj+7jbHIH3M~a+7LCwW&2ToiO zb8F~nR_S?CS&A8~`MR5ymgTuiagg=laf!QcxEnW+sTE@k*{%2CR_n{j1`a-EPm9ib zZrOmp{o-vn^W1B3;-6fP_x!g8A)9ba_uSbD)3Z7~a|;pyd!%5y;koNp2GbzPQzA%ID_5s!UOHS67%i~F@V1Zr8ta*` zDgNfYaI7;~x$EE8;A?jV0-@_~$6w!I=i;&Vu6X0i0X5)<%KF=Wi)%r}*}?j4eXrdE zxBeE_S@dqk?TKl06A;d^)5+40GvR^l(<#iur%x7>m2xbkG8G_Kr)2i@h6 zk+!6g0oVtxILtmvfBv@*|XKoV6DO+!Q7@vNK_&G4(p_}oW z2c3rP9J>Jl|8AE?yXoDVBC>%%rfOzts2a?xnW{6UYo=FEJ_z0&L7)UfKzeNOa6)N-6qwI^R@!3o22^~KN`hG*UiXzLW7xx=rg?4Lp~@D#n7C0|9S@&`Jr&lLa6_+it_2o?e{ z&W(M9;sHy?avnf1G^b1HspwQ@{OwK28h2%4>i)+dO_>a&ca&dQa7>Mx5^tx_Iz189WLyQK-K^F#uK=_Dn3B!qZFOSAlcP6;0ry zSpDoJIQobsSbgLa4qD=_dT{W9qp&7CAttF=BINnDJ7M{bc8f>W-H)R5Z&rO|Z4WaT zH`{~8N3iPf694?0Ow10|*WZ~s$5<3eKFool9F_qv;DDod!?T{g6i2Pv5eJ1f)t4N+ zRQdxL4X3q&$4s`;Dg$g;+co?5CXVZakG%ig}wdT(WV_0fY)5nH8ABTUP`waf#^dA^zIgej+#Dw=@@=c%X z*zHx}z_ph@f%VT_PPQwxvF|fR!GGK}n<`zrem@H+K1WL*o9>-8+c*{7ftLCxH=Q$c z$|Kuw$-||zTdp%E0I=?|ZCL-OQw0AUD-K)<&PBTXW&1l>|1D49M?c`+Iscq70JHd; zUu?x0hwf~6n2+P&GXZ=voDo-aDjz4^sHokhd5)z^M=&=x!2JAj?6u5(y!IY>oDZdw zaXfTq7h5r9wg*j3;29?ZU;Y`Q=lnmm?oMcdQ#u1}X@)QCp8%GtKpXm8YLN4(8B?Q( zJSG|pCCup*=JYbxPfNd^aeZW;eh#DFx;yKA3fDgEj9!dl@H2ic0}sH9)S6!7R~Ta! zy}EYIHFWTNjhdzCwCHu@LB}gfXB~RUy(WXQM1Q70XO^MaU>F%~qSemOY-YNDaeACH zg(koALY*c^=`#+0@Kf;* z6<Id(Hz7^DG6x?_#VWf*w*D0XpL z?EQil;Kmo!LA;5{eHid-t~Hs_n)XVKmH`JHy*EyN=`MKI0h3rV?i}?QL|b_qH6v2q zjnuMmPTEK3S{vk_xWO{8-^s7Q?@zA483544`97i3$7Vg~a^HY%n#FVhy+BFiS0?xW}pS#KYkuT?bAf%0B#*m4+Lp*C9?n#~p_&)EUHIgk!~_3N?a z)nOLcrG=?g4D4q-!qXleyGP(8*lOx~AL{`J*b{l3*>!>+(gG?tVSv8bT-7Rb;lmDoQ#dP zFf!UiXSR>-Y~QS^61y#GgLp;lQ?vglDym-enU7J4xeXldr-%fUDH0e52V0D6(Ztfd z)rDysz(ct0{{3+1f#&)Ct5<;Ew-Z* zPG;g%MuX18UFt#^T#=<9mPhxVSc8yk9}#ycCkAxIh)H{8**vy(-~_1>R~{6Yz^ios z7V20eBds?>4W+Zy4&5o!+vdng3U29RE}%T2+b}IWpjL=%H^_c8hi#vPGx-*ff(s!i zFt=9PY*{T2wfe^Lh%c>GTG;hKt|xy%v<3nJZ-pb!)J(XcGhu;N+RvNXWWHR*v@&4? zPiCM6;3ez>(8&=uqo_lHVCGA{uQO#7o}o85zR?F6llzp_$Zua+tumd)|1nscluHlX zG_Zbm+l!TxQvW?eCVwXs5PIRrSI}$tm@&05pjHIbYi6YsWvTT9@;q~T??+jd=yo|e zoj%&l9L=`4KR|8QvIWiMQjJ;xfOXC~t;@0`H_kJAhX7-GeD`l$2N*Nszgbx_nOzMJ zv6U01R{-Mpak`LX{3uNSkp04aFJlgVOlNkB((HT)uEZ1^EN5bcL*r+ji~D8}`#*F5 zUbNDmmGowNcx2-Y*8cuU{A7pS@#zyry*5c4Tye$rDAX-kj){pTI-NmqvM^jRnFOGN zZ`?D3*B)ph{ap@OiPK&@W}V)%`Ju>Wn}G%2$@Ekp*{+$`K_jO(|&9)D(=w`N_c$rf#6&j|~z=MsSm&tbMl{ciC{xTas zSKF030~nk{x4)vGQ}Jp=L4LiUzNwH)0t^iO zf}=k>K({kMyDe7(+GL?KQAL^ZI(_T zBLaUZbdZ|pFNjamcA{IG4ST{bI};3M#!K%xhLUfq#iDw?2#y{_Xu(^Qd{@b)O7;8po&IN)lC znl*>$jb=ktDuv(|Dx)JgTFnfdE9S820$73C{a0OymwpOPW(Ycy5#pOF>o0i%_n$mr zKJHyIfj6z9QE?yltyzz2s^H zN@!1GsGYOS>NS~c<7J%VDoMH3;T~hy#hJWped;Os^j@rgY!!~BhBVp6$>6w3^Uo** zFH5k4N1UvGADbTFnt#EfGfhSwEDLS%J+^Pewlnkq*BRt6j`B64FIqn}70ybrYryn( z5plq}%}Avj9scRx6X5jwrO_9IpZ$#kbKdvHNyTXOjf3+|0{N6e*IdK%?bjcm?fx>R zR{R1hf3cc=6wNb5~GICY{QKiA;TDB|+GiGY}FyGsaMGAZI|q<(_|Tf8%N6XI4(Mp2%-J z()dAsD`M~ifc9vPW-G(|T!ESC9tHz@8C9b%>rnEG-b}Cjo$5&WXZ>ewHYVdw?ZYh` z(*7mA!FZYIomrWr_?eXqy-G;@XzK1Zv(>3yJP_LRpV8x=)Qo}YTFzeO9~d(O81-A6 zo8!7TsRbTuam5|h`GEi$IOa8n3;^)J7JTJ4KxaIIgAySE zPMZgM&iUhQ?0yRLOgKcZm?bg^Pt-5o%gK1pZpF7h_5jvAYV$8tD4kr_fp+q1ZO$1O zrm=aO{d~!?y&&~X*YIkSiPKBDWU!OuQPObQ)5e|4y}G#Jvv%MQ0Lw%Bl^7fbglZ=7 zQgwt+rQsG0@tjt|QDwly_za$K4tiO-d_NgDz|=5oFnUL1pb%QO0e4zwXpUjOy~(fL z8Qk_yLSL@BbsAJW`|W3M>|TG*I{Z>gg49fMg4T*fKkqn4LuOcc=w6^lxvBct&%6-7 z|HVsj&A&VcfBXJJ@Y)lmG(q3FW7rb-uB#rL^^r{+6)y&kCPR1}OO3cm< zu=S~VbY})A3NHB$T|>$REKrj`-=!B2nPx5nb)_%5W=v$F;o^rVJa+{k%jKym5&ZP2 zE}CwapA6v8r~1$uvQ~jM$lobGCR16CI7 zD*+Tg3J(A{(PL)UjEV5ou@CLnGltQzCU#jiiXEof$aAJ+G=+zn2zx_@{6!@|wLfs| z1#bVe7TRZ+MvCf-$#GG`b@Ypa{B9es#1EQY)rQ6cx@-Sc{Z5E@Lof9=<_C-+6M?!s zZ?-7qIqkHzf7F?wDhs7+K<{5wbyb-0TFeXpQ5g?>q+o_MrpurlZHjUie*i z#Pd%*6qkMTFr2=R8(j8q{groPopp9;AaLg92D4I5LP{yX}YP9q8|w=UkqN3+Osj#7vOO_UrH;_t+Dt$%A*t z`;QT4`Kt5ui&EmC>cYOQj-LCf&f|A~8iAO;xlH1r&Jiw`;QT}VEkEk60R2-YY6UM$ zJUHhl3VHX0ti6RECD)PzScj|cwU4RX;jlgMsb|OUs?cW~a~`;dU=zOkyG~R-SoZ|J zpzfXc&J(yl+O&f^zyG**CNI6qqO@xHv-WP>XJ>cjp5Gt$^n31|nO%Ipzhfp3J9F=Io_@}GPK(Ddcw{w> zpD`M@KXe%G8O+Z1{dFT&8MKZ6#^LzEI4b;t@PyA z07*naR6OGVg$eobkL@Y-cS>1C#)gfZZw)tK*jIw%t~(gVQSba_`5A^EeYHY=w4)Vo z{|drZ7XP!!xEG-W$9?Yzd}9ct?is9`btujmuRHthrR(u96B?JFuPA40tLHR_%FSJe zmp;{xC@z~k9CseCKBJ$VO$b3E;h?-cj+&YTDk|ehC8NQadXZsLq3tpGTXj_eF~^3G zisX+>0#Rm9ekig|CJpL`nh=U{QkakX2r!ccMqPgUlOJ{Pr$NcB?>9TYD!yQTUXL5z@-Y`-tVqi zFP}AI_M*P8-p(tMB|ej(!Y=^n|0>K+pTe(c^M<*)lxiRKdqDCh@BdNwf{X*A&0_WF z=hnOITzOZM8&ulV{s5(c?IV}7yeC0_SNNKZKJmW&+A_dfp2bN?yiy#eyh0m`%G8hy-04F1$O5Ec)l zp{h0+{E_FiF{qBJ%+Z**y^j)YN<>VJC=eWi0y{S0&VM#zx4AGo62*wa2ji+creN7i z)3E%BL-F9O0T^55?}4_j*o2?I4ydD>u%ZSs@dnwBXFt|6fAPU}xcBi1`2LaQ00_va zzWDwPN8_D;O~X4+9gV--I|;X(TZ_X7O13sM88_pURN&l4#^KCS6hI$LJ@+8|{o&#M znG3|wZ<;qQqhM2rbRTvb$;h$+6*y%eLEYp!Tyg#&fB^IUcQ>>PIpd``^Tw&T_gnoi zjt~&19LJtF5r2FBt9b8k$K!7gABy`gAAu7mCB-P#I=WRq0N&ndob!$(j=Am-{9sZN z#7W}tlgHxmrzhhC^VAeXQQi;2RD5bO)Wuf>Q22}Zj%dKDaW8Iqr$fE`uie<7$*2tH z{$v^+x~M-6A_O26IPs#xF#nA+@Yx$DWB$`q@vECgsiJQ-1YKqZAJm9YFz&NV{yk>{V<3EgO3=62cMsS z_YcEJ?UJ;1{NvXv zutmve5StQ2wub+^&=T~ls&V@>iQ&WX=u1c8@)N260*pWFVEl3ZWE^iCi?!vwdi;j> z4*<|bAL6-1#@zx#hv1&ypMZO2*J3aTFkv8maPLWY@dkYv4qA5M$@?~Xae(^mMI~RT zTFus2`D9ri5WMir4t$~7Z=xLE{OQTK|B?Y14+4-%9Dm6ayu9cfEL(IMUVi>KJbK$W zeC^0mI1W&fh@h-IhQ78;J)jXo1hi8HLQqqaKr$JHv#!&aF^yr+p+hj(DaDj;9)wF~ z@QgTNw|X*2B;+@Ji`fDNiVw?pYf$|V6Y6&9gG#1f%uuKwBD446MpObH6dy<84dz#$ z4bk~EXjFLNGYXFSA+X5Lg!YeGxA;Ip!Xf-n{6`!C9S#FN-fzST34kq*6Gk)uEB;xq!Q}r2fRQVBc zDir6_VHy8u%t2*U0yX_gkW59HO!*9g+@UI?8kd_lL!rezB6X_n5#jwHH8y%PI7&}N z{vhP2{mmiwGs1U==<%L65`^ug2x>Q^4N1JB4`Jcg&!^5Wr!mTJ)e~#lOz1UrAn>2o zpq~56$I;?%!q=>O9lb3tEX8-|!T8g6YS7nmM0{AuY}|%hZ`**)6!5Q^^cQt4uKCE4 zxoh#_*h!e7tZOeDHUL-LJ^)vki29adOy5$Bnba3Y)UCkTb9aM);+Z#FaN(rB+MNMq zBkFMbLv^@4loJQ>Dlj?nHGYlQ+B^zJs7F}V*5dBpv2#4P@4$=CZNc_WR^j0{EAZgg zlw~=kr8s%k!8m!ASx+3pM^$6^sA?Q@NC|#;*($upgdx{l>TBM-DMDb|^SjY-Tq(vV zI*Rx0i;I5x6-%hd zJ1!pWJDd}{KHGwMVpOis%t!43;vp2E&n?5RjyVpuOi>OEt*OS$Imck;9E;olpsN+n z%~^%b09$%T@&4V5Fn7p_xcLZW?SEMrPP+IIoOJOa0f@S>_*d`aws$zSoKV}dYSu7F zsRo~Zb5Nek^8h=FG%=(O*UqiOwE<`{>o?%;n|AoVf9eMxV&uQ3;G6?wRzK0d8s}Vp zEY7(;2w6M+ar**1wGmqUu?}8cz%}&B^H9c<%m*01?|+2*=2hd-8Rhb5(Xuj}cI{Vi znvcm6j5w$SBMz#?u}7zH?P(w59Ux%MKS3lBLp+{CcQ>28WDQ!-;Jd0aj%1Q8)P83l zb{qQ<22DE>FSBb1w!XXpzyIHT7CV+-n5Xds>sM)D!ZHH^b_f-}rznq40gZQA5K>S1 z$y)?lieErixNVKEj{*N{ezs(DnxDP`@CBW=Q~=A+;((z)`K_rSJHMTo96CF5h{e2p z0SUfKUwxbg>@nhxu=YzQ$EY{VUd-_1S{q!5VeqBlt zA>Nw$Ao>U)n*6jlMZLWOIV$^m-dcT6zm&>;ox}%mPCa$ysYKjv2=Q(T;QgKmagd|( zv?|%Z=J+YxoaC49b)W!Z@d&C*qS#l`jlFGM=pZB=uT(B9YxJ3X`1_jw_Hxa?#*qRg8zy0wS+h6zu z({KJ93mb!%yJ#hs#TRcjVAhqZv5<{qs0PDc4*GF7?!0pqo?n{{_}x##`Zw3&nn(7C z5g}gx1b4o^59Uq=y|~!AVl&=tRKJU2#Kb!A^Zf}3DDA|PuQtKF{8Nx|}}UfjMU`!IK~CD@d-HZM*Q)O|N0j+br&Y!!YuR z&aX9G`Tb+T?eAmG^DTw@_}a~Q;L4A&KxC}!&qZQUR8+)KQ(c1cia3%b5k#Vn_3>n7 z0)5J2BD+nt)Z>}Lu8EfWvm&@^^>qdK97c!ZgupQBU1Wm&Lb{i0x`hZ}ghIi#d z2$yS!_!QioO{gb+!Sv8$)^%#HBf%xvUewZ>ciLw$$ z9?zF^k=d6){bxJy!e2kfi|ZgxYq2C8ti{zfi!yN#$c*%s?fB_+JMhBk<8b4t{V=XJ zin64#)Tqlvds`Y`tl5bdpI?U;*UD;nW@F*Qi!kHkQMh&HARJK}MS`cAyRz7`u?a7} zxE7DUwGUtaNq>B$zf7ao95e`*57>fVZTCio4k6h5_m6N{*CgC=PG5|uii-OPy3$#+ zH+G@Z^-c%^()iEgi}9cNLvY9UhTzx(J=w(-*>!bhv2{Z;-gH1j+<&F4`Mg@aD@6xc8;Kpx-|VCy!F{fg}3jnj?UlmqVaicNQGb@o}KeL{`A{^ zxcH(mIPaKB4DPEOiz)DIz%L)&fK|-VgED=Z7N{#a*j!DvC#g$e4*RXo@wJUm^`Vv= z{&dqTSbF}UxcOUyaL7=`M=po9-5pr=YCZ0HU^6xwGnn!;4+=_l;J%Bu;l7C@aNYNZ z;q=2Q(XT8b<&o*e?oG{jdtN<${nSo5u(PX6=g6gSg?__$m1}dQxwqq`yI#Xf|2z=) z+&B^^j4wr5N}(&4L#Cq}Th{KuYyVt@xi5OVgk|O`K&J3UKExqN#2q9O5m1++#N3ud z2ohyc@L2&bBfbyMUb+C8dk(`T$CaU`EFx&>>gdK+p3KP;m$hf8IWRmK2B-e1&I}2AA>w=W9DOV1Q2MCWUkZF*#3x((sGQ;i zXaeRLZ0*!2rP%FHZ6|sE40;ATAALf8`U(uw{y+frUI^1dy!K5wt;Z)lK)czOD3u8L zdi16G#E>Y7U~hXDI`(D-A%cE&rc))uwJAvYhew}Xz8-zv(iZhpGp(mcl~a}i;sAF7 z(=UQAZ1KweIOm^?|HkW7ykKR);8=S=|3bZiP49dZiqArz)>{ptkXsuq03U-P*z)nK zPbbNdU-9_-^l_f0i<;Br#p46yvYv4I6lYKdfi}e6I=k?`xqVtTxOln=d7%h?IVzn# zimq;oj*cw4y4|Aj<>NP>f9Sza_m99i;vUe~BLpG%ddF`VeIaCu*GJ*$cPHW~bx^f_ z1IC=W)bNWu@t`+FS9m&}Y+Up12o^&qiNf!bA8C^^5#;`Rv8YXJMsh?OD&`Pb}u3q$G-1+zBPqbIX7S zs3(J-+6m<>DEQ2Hmsf=O9?17|LGN4Q9fO7Ve_))aR6}p0)ugXD`33XG?HAOa%u?~0 z^kp(xw6}I4!)|)y=mYsx>$mtvKKY3x32gH7)2A1^|A*o0O@GCV2T|=53QyMFZ~Pp6 zB9Ei;t@)>be(o!vt;tu;S9cesoqQkm7UU{ zc%ZbG>PX*&a?LsneAIxjj(p|F+|zfExx`edf8oD&!^NcsBw%KKkq>N3GT% zik!*e0`l{z;|r@$o^$O`3G)^GW@f6%#dlsah^}u);}$u5%itptAt)=0p);Mu-j1BS zrnSHrYi9m@&g&DK`32?N>HcQuLk1^<0EHnl(@9zI*JBu4Lm6noPu{10dkhVZM(FJBzc zJw?rg)z&5vi+Rg{Vlg0v2(mc}H|HXorReTGKOnfpL2=&iOB#U;Q!FFZ}%4 z0-PD&m7f8Braw>I)AV~v%MnF&-u5$A2QP+ zGu6T8-uuL1#CQ9-_fo(4=|kX50s)`N=4;{o{-Mf8n5?nKAs>B-L=^FU5p?Y1`vIts zG+Y;ybwJHMPXrK|ewW()L+y`9`XKC3?Jui(EhHY8@$Ua(&3}|D((G*Tjwb)z<%}yN ztNImFBWi8LgWf=ZC<6mI;{pPu9U}~>0#)YO*Sunp#pfMhB2ie0G>eMBfRz7DV7;7( zSKwE&tXu79c>EGJ#YGeqFi06=76B6h<(Fc{3c5@JJCUaRR0t_Qu14bPB^r&Jf>$k^ z4;MNtpzp7+&oJ}93A;mz@a0eJqBO%EeT)$j$Zs+gLp16j-I+rslT)Iy(YS@mPe*Lt z$m!RE5$qA%*|j&BvOc2x%|igE$7a^7`4SvalR&D{$@$gs_Lg69W2;3UIzGSu`wHJT zqY26u{FK%LvR&3<1UED$D564@eN{l>Wqa@yfh~kzgz#&{%5Q?yuA-Gs5I*?x-!89s zuK_7gTU&y7Jfb}d0MQ75XcX}{Yt&p9-C2rU)QTr>UmpJmY?x)~>UPo9?IKY^ zQId$THeTmb(5K!TU@IZj6Ua--;OKnH;GxF@6Q4-V5xq;M6QG)*E=O@+Gzp;JRkYBBZc==_=H<1hh|0%n{S=^*- z!~@4Ag1*wSIFhLt_O^GSy|s%qv5L*Bj4I?(ySmV3?j0OYa zsTuc-7g>pVqgbk({t|30)D|45vi6^yF5-0_skSDK5YzJXVs#dU4D*IoHM1!nmN3}) zSeO(eG=EGm-{AkyIvbGnQ_5#FlngZ?Y)!wTb%J=|8F5W4D!)EHgZO3gqpZuLr9%7& zYUz+{q*BjqfPzgaD*XA?WtsWlnHQd^VRDnF7wG)@>9c44 zC>Vc6roUJGQUtE?l~3vT{cD=3rB)_CHPb>=dsAiv0qYH)Tz-YF2@mEs$Ukhz6h0B2 zIhFD=>9fZ>0abF?DOjK`sDM(x5r?2(zY;_uESqJqH*P0<%T+8&5Q|2D63@P}If`7j z8?sDjfAh=q02%LedlA3DmiY?QE2lQpKm7FN$5$M`_F~B(7P#i$hRdVRKjTqIJSd*u zJof6N%^q(u?AG9t1UnhXAzD%{pFRxsg?|9V&L_`MhM}SX>}c`R&!4`Q-|!C@7w%fb z5<0`7>DNBvmT#|wZ308@@5z-5LY9giWIxTWPd&a!yrO<>27$*>DQLCdrPHVL>o`Dp zMI0r3KR|o8L7zo@KKjglkV>DeeYD%J%|Fz~f@bOr%HXpXpMDK|b`}8u-gYnIWuEyB zZDxkZQa8MTiT4jN(saZR-kXlh^jSOCK70msM1lMnqTnZzQd{TGKi-fCMW&tT)dfqWLx8%Q>F4tOw&=& zd-x!N6@eP5bbd7na{E+Nra|_COCd7|fxZ>QuTCGQh&Z0Th#3?X<&q^4B;rw|)7|Ju zE61$(_zmz6n;k3uVY44O!k54LGcH6x&%C7FdZ-D^DzuQp{X-j7NWbvgpWj~eI6$oW zkoW?B@aaRxr$0cbY*+$=ml{m`>Ia0R`Bc4x;4r|R1?m913zlCVdjBtF$Ih-l!0>66fo&!o?MtuX)a<1_8WuTl-iHzos0G zCj$BdVrHR`&QK5oc8ZY6xajVpNR&hnPw-=bRC{4wZ*;DV>KQvcm2TmaQcx$j|Kt5L zpaLS}v(B%FPfwIdKE(_GL*@9y!Q{$UK$#Ai$3H|p5s$y183Z2tyf)pm7lMfR%6OmK zT?FzS^#LW$Qz$bX1_LC*I{1#RS8cG%!*>DvCQ716lths%&0=qB#@i1-0ek<^KWk%J zp?5AnlxKt5Nn+4v;IqVc;(tvROFL=f*Ni86??Zm0o%NvaisoxxJwxSd%=ub<3H6bf z7?H6xT4F$=WG304zBS=4C^HDZxAK35kuf@LNhZyADr>cBDhRp?Ys=nxqg0qP~lgM zz@@tKy{XF2w?>lMGS>3+1PRTV03Gt&6VHI>nSe9&Ys>rv@Ea&8SoyT^>zlc<`XiSf z6{kUfy{pC_G1CNTzkVp~PRL7fSbmeDqz{G3&&IFuNbs6X8#03c?tBU;gg#zhNr~6- z=eDn}RfRrdBIE?CADa9|A_Ng9f;c-NEa!TIfn1g%n{x|`w-f<0MHYU2Kl&SU-HwfF zc?a0Ye1{gnuO;(G4gavctni6Ec4Ft(;8Ww*#HagXQEUEv)mZBFxw}2ynVi|b4ezY* zr(H^sPP^#Jcy|QEqK>yD#8vstQ<3_Jhy(tm1=O%3n}TeaXrqFHX98^eit3e>6?wWV zejAqvBz~pcFlQ2Ew?m$KBa(c9@>BaO5ayxrr_9i4i5U@36#Og>Xs7=8=rdr5e3Qut zlF1a>Tf5NSmO-u?tlf}%MpeI1&E7gw;EVIN{!bWvhQfUK^6_i47qh=-;$v|D6lBy% zuTdDU<}K_&qQ0p9U??{q9xF78oxU&xl8(YyvQ!#i1;j^DFZhMOV=b`JDO1M^Gfc z#iHN;{$|G)jXNkQiHMt8i)}A$U#oP5ohAgL#x1*l*p9N)&;*VelzKu4$VXpZeH2=M zKs*RKs#LsQi2RJA`iDzhOB_%YX!$xszW|WUx@d3fLVHV>LZ96~yg`vJ!2RPF_Vy#M zgBK773W`q$e(hB%b*W@li9Cni7Nq!TE>`3g;`~!xLChD5&u@$QnU_ixBYIxHpf4P6 z7+u=wMh=1N%FL|eIB;Dq&pgVpIcq?yR%hOP#uFCY1Aew02^z{Tkw0jBGAK?rBKn%^ zpwm?(eR@z+*CI2Yj`s~3^27Ri{JlXe%gvn1 zr;aG6rP=wVTKmNR7WKQ->TmhvXVMp>Uz1fO$)Ywa45Kx-|ussmWnidbN?UvrZ<0aFXLt9G*>3!XLbD+E(EYGlZ zGPu3;9=4-Mg2cnaUTnj+&n zM;~ZbYW+5Q$+v8;DEZ~1ulT`k_`Lza^zCi$LTgi}cQok#Uz0&a_=lZ7y}cBje*l)u znmQ98GdC`Uw)UT0bOu++tk{;Asl=LJ%eAHcHQt3VZ^vhk?Gj&D(DzH%%W%oZIp2k3 zCT*EqZMT0f`6Yrz%H%KCh!+z4LmM*$$uEdLJrk#AAf+5tyKyW__toh@Yv$HRUx57- z-DukFCY{b9-I)`aN!4BoTIOMtu$ch!2JJBZY%>9-{POA7PGGQq^n~C1_ME3PZ~CM4 zTz)fNg~-dy!1cmEiY-0U2lB{I$49BRkEOaQfoRO!E0^b0X#fBq07*naRN}Bqr!GHp zritSVnu$~Wi{sJ$_GSJhr6SWA#I6!=ayf4UvCAN(RLo5DNN(IuEMFInFU&8B@Q)%I z^@3jPLAy~{HIm<6&0K}>8P-`TMo_V+gIL@_H0lJ>7dR8Zeo$|ywesr^6FQqAzkBZo z-+(LWP}nTePV)9)&5oP#V7^Sa55Gyi5|34V+Gcj`3bni z?rq7Sr8!fWJ^M6WbyU;e`ybsUog-9A>8??V3epHjmw-c3N?@ZqhI?DtAz$bBRO;%hmDy>n#P_>|6-&aq z&+C$|ZDdzlLF>gowJ$=gvf3^=nu(icWG5%s?m9oi91rgNPj_f_ zle8IIB)5ETncK%<7T$We+RUXoh5~8h8%67 zuafc}6r`|#D>4zcVv72NES^87%a5Kr>gxUwUzcx-7+9KI_lRw+)sng$87ZMlTk#8f z7c}~-N?_Wz!N5nJc(hb7)y@0yv)@Gi0bX@kJ{hLjTfS1VCHaz_D|dPQIvpnYD42kp9K;`WNUwo z$QsX)#86ML8EqCV!j7_`mEt_?&*hhR#&g;I)fyBcUS*Vuq;;ELAO~*@zo{lQ-KY$^d=<~~KOM}p{iz1Cqz8p8 z#}w+$h|tz@;~&P@_^9&PU%aulgv6x+&BTTlUjpH$=YxwHeA2yM#XSaA0mpH?|03G; zi_c!ZROfIIIvfia8*SpG83(PNGK*?}cSgMse;}WIgy2J!>%82#tVO>=MmrFSo-Ah8 zml>f(m#$k?FjNa`xOf)HO|F zI3b6N+!3GyUK$3zY8kR_M^XY}{v*Dn()w2Zi|ptr^G9zz?B4tWStqTcuYS*372eum zgvV}pyNgC=Ayn_&8orMw^JQ}&O_i;7@QsFzZJd7ht= z;W~k5aZ3i;;;-YPNKsGx3_MWMguHL1j638r=$7-5!p0vFCXF@?3_ zQHhCVs0v234UMLyJb$#+)7Wb^E3EPbG1=AJ54gFr%>mEO(@`qzoPk^)_k(wg*;5V2LFs>uvS!h?T7IIS_Fx)F zeNzp%*?Q&{&=HTvg$Rao&|M#%ou4yKYj^p4tT=0&)BGIOHh~T%Xcl?~HXtk?Wfojs z{soqTTiQsZaGR{d@+Qav(pUwIGkP@V z#ZweDm^lbjlN;E9sEbThJv*S)mm!VF3Rm;*A4a=jOw8w6gezJn3&=-=@DxNT)Uf>= z0Y*OtS?aEXm$itw9Ah-*3>$@UNa14neVYT%|5o6%t(4#@X6m{t90ojt1pnv`|MqN7 zG!O}B@d~GZ#r4i!y>F->`WbuA24%74=g~dZ&}Wa;I=}Vm&*I*Aea_UAeQXdKo@{zK zj~kVCLdu^)!~KpaV@dZX(MGFJS8~KP0Tb+#drjpZ7QaM)Y(e z9^}&aN+<OU@gx=hoDER$aXjCXE1sp%4SD@WU`Wf6a!-qL z-jzk!DmPQ`Ji_t}Ohxz@-n)8UO{)crNE#2!{Chv<7OfT@KEl0Qdjs`A#l{;6hXy@) zrE6*ws#Gw^&6*U5BE0Lz#PyX|9Xbie4ptsK1+JS8v%zHZ_~O%AQIWl2xvPs%v>9El za$wta()uphf$j@@eC5`Mp-$7)>w-vgGyrmAE$#HKf%je6l!hA8=#*$+e1>;=kE{lC z%vgV=A5@`S7;0H$?t10(-`C5pquI^r!KvR5WqurfI8fCz;H|N66-ISo)GDtBSPG~i z`GzWmFgMm^zn@^QpcFkm@LKnT?rHDK2Ufdw10J8w>7w*E`C3bh37EA8-alp`9#`)S z%U0?_^86iOi?Gsmd@+lvtk9)x*fnE<0;a%hPf0 zIJ`!IXFf=epBX$jRC!)BzA7E9oFOHg^K4yw%aJB6GHJ)^(Zz1qi3GEkyYf68Al>)L zbLyo2s!E=?3L!?*S*W(6RX3m8lg&%Lay@DkKls*V3VAb&IyfV5TboM5p^6q;H+!#4 zkwe~eN8v4>8C(!z+fFrp+N zg|D%VX~Klo@(sf?hi7aEKlK$soO@3;(J%uEcwt)xN;T@)u+E>a6bl<6j4<;pB^Huy zZSfk|75+_IXJxAlX|(S8fxYhj(vE5guiGod7REauZWl8_dX}@W|GH%cicaxVa$V(i zHD;qD>zgTF-jW}C4evw`FD?8P-qtH6F4xViv#6Pp4KVr->$>E8##LW;?HUH<*3{6M zUt203<CY%{#>DgGpS zm+z?)p8_-vep*CBXw-C763t`E@(k=nSRNo(05vgVdDM=7W2)Se>_%16xHenQKl32H zTqcq)6T``1DE9|A;tG#!Btka6Cfpz!OVNFQUJ;0lEl3h~)pMn~A+XK~szQK2s2tXB zZptAr6%RaoJjg%N0keD(WA^Fy609^P`Yk6E@@^~`a2XiLqcASKx9pg zpPuJ|DBPd=1So%XZbmGuC}dNPhOEwx>M@YDj`j%|C;*?#T^{sLP03hmGHhnu2*$3o ze!KzhzPvNxv+#j*BWR+k9$6<6zz~T^O1V`edWKE`W@Y|&i!X~W&5#uO9^dY9hODhy z1tW2?GE`S~&d9E)V8{R?QfXz}Jn@`=O6~5-=XwD|y2P`Xb+ver^x~%K1f^a!Ip)u! zNRR8XX$8vUjK3a|*{>{ahzFS9^KFhw!)`*EVl6%Xao-@u;Mz)|4#|0WV2z_*)s9VyoV`_ z>Go1kg_|bCS-8{FPTVM4PPOMN^yeH!16TRlc)tk6j`S1lh@o+8Pmor0+`x}!f$;wZ zH<``Y_i>bhWpdwcL0Kz07$+XAdyDYsg}&%fd8kV5a2L)^sq%1rsqnDsixV-ZZ(y~r zm47Zy{EQ@7)WIr?$ckE@Sn1i=TeS{^hx-2L5F5;#On6TZK|{h%YJRS>Ch|O*LZ5Vn zgGi&_F-$HDzp2a-*c0OUGfBx{^Os|Vj8Rg*ptlZg!Nm20-Kg8>lU_@q0cHw%)flq> zUiG@BqLYeegWp3VY7Zu{4d~S%KcN6_*9?>?yDn2Gj?rEIt4OOJ{u`x&l);y0C3}A^ zcXb!tv=d2vj<&^;Y@=!BpBuQz_8Y^q;m{;FG|n&)6PYd{D~g*{8UBUNF7)IH{85CvWbP6zoFN< zjSWQxG+^I#c+O{O10{rmtb9(fPxu}tqCX_`qO{HWoJ<}*1F=s=J-1t?$#rlL1^&!k zJ;-dM0}{m+RDSlmEJ)$L=K(1V$Fa0m$#f9GJgKQjW%G#UtkW4(tTLb|t5dTdN@QS5 zGL6qg;+yKN6ssyr95AY^T??}v;mv!6&94_8hbqEIAu@5~D6~?AaP#xt*)uuK>KhH41XHfS+e@1Ra(v^CBXyqzmz|8eBh&B3NCR8ZyTBXxdPAPR2)4?u{#=q69_1;sAr-7)lMj}I0`5r*D+NGTho_=|Asf^^c9hx0 zv`)g)(I@Rb-M=jfX%Badm$HNj&QUwhmB8{fei4=Vu(?qB3sPDy-oWEvT*7A@I&~rtHL_<<7*vdm*yy(qU7It45VAPmo70HjjvHd*oZFg$ zicBcP??pc>h+vb%`0Bgla%a{vcMGZR5^|QFvkprH>$}ecOz$Rr${K)oJd~$h*EskH z%@AFT$cJW=fa(L)Gm`LYqO+rPQAE~-UMxp19-{mK=I~!|)wHBVR)V?BN=0Cy{1NgrXQ4Yn!1p z9uH_?t0QtGeyy(L7qT;gC;3T?wT>6#+l6MDxCiDzcVaOe?(fEgnV`!F?L9LhP z7B7nhK#KYE29O{|ZGp4DR!HhsFr-Da!NOB`$bam)!O;Z5QT-eiaVNQ;2bJwj6ypkT zj!Z4eCE0tY#0ky`JP1kfijpTCV6_I!$Qb%m0?Al&7^WY)$2+}NGoOEYhAQ{lZt@N( zsw~blzq}yRgCWg!uDddML^m#M{5+PQE8OjjOG3_vM^6~1w9C3vK}=B*CsMY@cCg#i z`@`dIJ)_i)E#tOy#t#`;v`Dv2DIHcp;iP;l>h>Z$SO(vBL>50B0BZ7bR(@>mLs-$` z$}KQt*LYr0@C_9?>G)-3uZXJqqLQ+UwbHFuQ~1M^*p<*DnLH=(XB>=HjQ^+Dr|qmh zvpl!4yDs>tVAqUrG@icS_TVRpGFSeeqQ)eRw|#@f#nBtN@=CbMqB|8l0KoNMgv~(w z%MPtCqWKT6we*DC^(q_EN6!26$SW%8mKyehb}AcXeu9`if=v`ih0&*(FExLuhKTc5bu^Qda`QqBw6hk916SFA z*S`#sS5Hnd$Fs!c-(mW>@aN0owwIjiBpk323ZI}0*HNgU+L+iFhvVmvG~eKPS5nAa z0%n3W-%FYAU5+H(POcm=tirjwEK3O&pe5f7tU!&uKwTZHdE6wW`}fn+5bq}30$vpq z<5L-ykcydo%PH$?-%KPSnqDYl3xLg*xuG?8*eYd8PEQ_l|L3|FZx(OEM9^K#)4(qH}D(COj9 zGT`jRgv2al?Y(NkSPvb05yQg{vqCe_;kcv>^5}HGcl^6AL}Bkz(xQv0%esfLm5U{e z_SNw{LGa&>G1j??S-i-YiI*Sw@Y-$2ezradzAQS4z#$GEkW|0^)nQ?`KJ387NfuARXCd$7B@W5VtW!6z zvUA?=hT^2;tML-=pF|+Q1>>92#o-d$NuXB!IR%f5r_{ehuNiH*f@e=2Z4pCmHvwg zTL@xy&7BlhKjY3Hv)OvM0fYB7-+EVQ1n)VgEP17j3$qOsFn0*2o-85@4mDnnvIM2H z32v0^V=C(B&C_EN$G3s8T5LSI?q^NeF*kTNKDLHE1uqO`AHX2x0RVcZv(kme=ahn! zlSjQIKXpz^4~&M!!zMGrAb6USMNdKs6?0yk97!E&yMelHL0?UJ#|y2nrnA9AOs&s8 zwD@p}Avg04?2LYfCR?GN4dXTF`*U&VR zreu2)yEJNn>^+&yYZgl^6=I9A?}}4pZSYw=TTG9^8Ff3B#aBDf$K5IXz>e(9c0lgE zrga}clIj8izP6mMp3GYJ?!WmPFr^}6ANYtb*d=lO1hX6px(9#hlomPKeQWNC#+jSR z=xfC0X9a(J9A%|+F1!4;&OpJ7V7TtQSr{{^Zytc)V+&BXLha9wBew4n8cz?`WOfe1 zu%G1-y9Qt!?CUOp0}$C!$uz|ercJ8orLSdzlkcQ@rIA{-e7fSx{^$Y?p2Q?!Tspmk zU3(OzUw3RGQgL+*G#P&iwwb2Yw=Dq(X55ystuQOY)q?wvWyuRlh&dp(6mKeAJ4p<{ zq6gV)e%nCSiNAj%z{1Q4?M5WuRx*{hewgy2$$ku!F?cH0Bhi1NjQp}q?XG-`$SSw)Ui=VKLjWXkNyqrtYGcX0=v`>?Tzx*C9p%Mg z5f;Z>QEa2+>?o+ER43`a=?i5?V%v8K-5>L%q+lbK*4>3|jhhR-B91+Le8+c#-8?Sy%u1${;d{K~J(B5(z49lL>))&@x_rlhG3W2d&t0DoRDFC#>v|KDejl`+oR0%Y zH*X=B6p0e?TDrmXf3E;ruA@3>hvV(!h~rN3sW{3-^+SGxOE8<$lNcHw@^XW8@6+k`G?nEab zNPBiy#4<54vA%YTuwfc-cMy|BZH*sP`3-8rFuC9C(KxG(8${om_`|rgfKNx6QHUh) zgzgINuWXM#5v?pGVz>5c`t$7%_&6e7Gkk0i6An%LeFO@)aT|pmWTYWt%FTT^p6I|5ja%=Qt_@IQn40BvwX_y^q3qzhtr1 zpC1Id{06rhi{e!FMGtW(F0sv(zR?4M!EPDhh60fb=$F_R;uPH?Kk@s&&X+~x*Z^D} z_A$*#a860>KOOm!`&V1uF5@~N9B}H2gj}YM`rSaKS1-h)Hs&@CCjL(IJ52rFa=1M( zbHAkcB9aFs#jb{6s*vh=ftcW!_vtLCyqhSFRdi>pTU6J1r{3)V+hqYwY`i2wW7ls) z(gZrUR~%D>Voj@MAe8u32-r0{T=Xy#3qg*98W=PgB)f3j7cDe67mvQzLm!YZ;4!qd z;Emr`ca|1MI{@otP6Tl(4M?RLXTNB@du~4Z_l#mfCC9&(PTlH7Og|fS6!P&%?Aol< z#*g1cV?8F5^V50vmLufP06aL)60TL4uRBKIL(1*3bvv&KyY?1=!+swF{SO~b3!~7J zt-N7rOU|2~h3m1r(itmV2tT5@Y8-qT9v=Dyi~%f!WFEwuP_FDO7W)U*0M?-ajHAJ{ zW9_yix%ab=0r&-jeCv8dMI#WZm8LZ{Lt{U73<2=4kDn19Wp;w0!+s6v z{?OO^d%Nn0yuDuTEb_{V8v}E+kHL8 zFCqJSPuA;+6c&!}VI(G|E3wCAaVmKKafbg>PEO%@Y2K8NlS+GnA&-hNtriA7n;xl+ zyV+|_$X50u3zX2dNcKNf5e}Fg;fQcH03%SESswqUEWh?$&o&^k+m5%%IPWO(`(VR! zCE;r`b`M)`nS};pMSYdC8PPk-Hv9wWlXF76aO?F(ft14Ue6OGB8Kj=Jvzo;uex!Uo zYSDQ0pXlz39ru5ej?9x)2O5#}B?Y$NqQLSoPk`ol{B{o~UaRZ$y1HQs7yZO$}m>U4VuC6NwlpQU~ zGbDN)^JyfbjT#Jh>UUt|h^8%^!3AK?j3?@{bBQV_QX|*t-|3Q#vnQroF2&Y53in*) z_tkmywGE$Ff9Kn%1+;Q=Zd{Uj1$Z{y(Oi{Z7xZ-W~ck9y)O zsX7}R$!RGi?A=L);mrh&R&@ZuH2L3tt9BXV^Oj))}xtkdK5oDBbE9Fx0e ztYd9XILH3(j|7G`kiCjgT{5EpfWp1+ER?!-u?#4;_ z#?$Kum`7h#mtgh4`phDz?`Z=x+-bxHk3G~>Tw}epmZ~Gm&8@%0u|3jkConv%UMO24 zh?+8Y(|h4=CdFFAj-@CU@pBddzY~dPHV7dCzKt;$52RpcH+}d;PwGoY?IJ!We!~)) z=AWK@oprs|6~_nwxVA#LrQGJD40NCrMY(8!tE1udGtK^(;H+2AMBS}Ptw8risI5vX ztnP?lcBJh8i`~z1&@J(uTn%#JLZ!I)MP8W>xmwhvikX=-#Jx8Fc@34e8%lXQ@>P4UQW+V{-(DRM|>g?K`$$EEQatjfj$q zGhB^%R4=+yH^;3fYX}Fz5i^EdzBw4i{zghV_sh-sw?hewEF=rTI;mFXF-gEP@L5G!N*u@1s>&%A;Ejv=gjo z{D?DC=Gz<l<5z!FQW>Eb=W3jRkdNoK=H7d%=Kg!Q3g_6qahYsVWp4dZ z|5Q*#ce2)V#IBm4`=3W-Rl9BMOeX1FBPWS{8&u`$-TMqKD>EUoAoEbk%ko$9n(m_s zUqk}cWpi)T6f4^8aj?^LH?)hB8YCW5E!RF}zTcm?|>bGnb~|#M!lpJUn%7WrI8Zf>PV zkMtg5xu*}mNArGv(UTwD%ic3zTWx}mrNlT*t4OSuuOvNZJ83k6)CnM2_yo^sq>-s%OIth5|GDc<=Qi>+K;v2E~iW^ne_qu%|{Y1S)>dIX<9nb}F z^`zuPLI;aKL0^~xl?jFfHJ|vbH!w1t8QtxFf_Cg$2!2QlK795E$nMs9^kJfKI(*q^ zTZnbP$>pOE7iSc`+>gBCl6btlxte@DA-?XNAijcS?>)nHvrGT14#Xe3Tf3cHat_GQ zFsHEDQm8Sblx@#vxH~VjNUx{9qc+dTk58La%h&pI?$7!sH%hpV`GmS`kBenL$=&8xAsd&B1iLwB5 z=Z|Xo42afKpW{L6<1b(p{?kE$q>@9Mlc~&Hk6U#fo zMX?4`YN=UUvX}#|vBOJ#CDT9gCzf!0&?oChj}yu}zR?OGoYe$#?{^3rg?f3g#i~Cf zIBO}^Js+f-i}EX-{q^m;LL_bCe%!u*4lfo-ka5zIHBYy_h*m1LnvHb$S61Xw)4jJG zh%+t!=sU!MwYk<%%?j(1&~@}wr^?u?(lbD?9lKi_Xk{7wu3)T_r~a&oa%IAv6~1ra zMUJbD`L{L~(PB?5=Hs_YzpgcRuwPep^v(*aI5?2!Yoyq%5w)Dow8*dN$HL)tBv|?M z&qHd-2Q0V1BsY$(S*pQ0y!FzBh`%7|VEx!g@A4Oqcrs)vaE174Ok-ymk2_+=zgF8C zk)>6*JYU(ze+M}SuzBjzzmcq4AIJO!yb7_px1qpJ;4y6z6tU#urnMm~>?e*xaiFls zCc_zHSL7F#3>{hAM5O2YAqqx|`I0uw94Tlu1JlZ#y8g|LnqqKSS`NXALXr&uKU>Xg z&G8R^yhFBNQX9Vy7&dZ=-h9__rhDWe%)^^_Y4G~_eb!zSW?MgYc6lLDd<;qk_X|w@ z3_B$wby>{qn}VX*QgBQ6&2Ru=goPqEc>;%v>AhB%Y7V-NDX3-ChsCK}W5LT$*VHc- zHv(4z`};F)+6YYQTVKv`?p%NCH(q0PgohMiP_pKXe)r`^b4{fN>v&ZGzP!ty9Etb} zOxkOhv0mZ+K7JuP2=MFv)#>DKMU&=0s@OOj#_0$_P-8T%~(%P)tH5C<_Di(}X;}#)i zZlbKL9y41)DI=BjxT&OC*? z6|rrwhlcHt>v2-?%w{o&jnXRD53H778)yKhhvMLBFGm(4;BQ9#!}sz(7*0-v+npTh zns7f|M>Wdq@1n7UP`@oWEA|fnpE&pYPV%uq;yB2h6~6`09UU#148K!-o>ZYMm(z>F zd}{XdUw(eLkje0;O~Q?*qA8FIeKEqK`$`XMe98NKbk_l_jy{Iee3S;nQZWS7loU^h zqy9Sc^Yz7-^e{UDg9{az6>j6`^RR&Q1`ldCDz5sSH#}^n-jihom$qO%izo4C z?@{P7R@8X3>`&|t+Dup^5w1{}rGfoXVV{gx0vD>yFIHNF(z!3cP!uc6)OAlv^|A~bbLbg;-_d@bf=fP z!$yUiK7L43vgPs-)K*!7a)p9crg>I#tu>o^`dm`IcEU6#vMxvelHtx3}o#25P z0UXe2cg+_0?a5T?XtT%|J%CTwfL;UZ417ss4gQki00LAwgQM6+^{Gzsa5&lvw}lEp z%<4C8qfafk!)iRe$*}nrvYV1e_{$G?gJq+?vKA>DH^dz+I)p7vXX5~{s0>$XtnJRR zcJE8#uV&3XN+j>!{ODL{Cz&>UQ zuet~ox}{fsp4kagfh`(7yv}b~q-Pcl zw!S67bN{oo(Yp1#hgB05PmndYLQglDN`12Eq!@iH64^ zuqCg?tL!?w2!8?T7U^TH0LLriLfyA4Y7zpqpuMptEHibnE@oh`G~tDg?O_HfqTS^D zgxWk{6hEHbjO*u`DLY?vSz#eQHt*ORx}=^k<}!95^3=43_Me4p4!u|3^rWk7Zzd3K zs~c?YoBiw9fjK%Ic|a?KF?)J|_5M8isX9{fZ}YJbLr#utnZ;D(&=9_U3E$VRV(Y;K zxOwH}tXLE)&GeF*7FS*U&3{pZ;;bc=_e8|lie%rFc-Mng78W9&w5*cg7DeSZyOGFE znU*;_(OlNm`}o(YCT5F)JYPL+_wMAYb}1~7-6+2|s`Zb2vZ*CL9*UcX&kMEV`)`nM z8;geRiy7js?z29&8JT-U5Q7A5>2L?u)I&)*mBE_n8T_VZE1_c_wF71X(=p{}vnw*c zu+jV^jtCUunOxhlu=NU&OEe7oaVB3Fk4 z%W)IJiyNHkIlfdXGC?*09FJf&Nc#kZcEIa zv}q?8O%UXRIXwrr4!oN7F6m@5D3p;@$;GvPU~Ad5dLKsG*iu54qEBA-`V+f8>`BR? zdn`?&z2C+RrMaAA$yTfRYI_#%>Ssji3*T+`6}Q=7>eYQyo~;)#zWNy$Z$}H%(TW*j zBrZ$cQOBTAl@Y|4ne>(m%jYW5SafKBxJWMJ+`n>PxCmhaHIq*gck-5g6@919Ovz%A zs8qtIWU~D5d6&6401F{VX58ILHoEtTWP2@G|Gn!bnQO#$SA_c4Zbo>@>Q~EKX)+PZ zan<0sJ#p!2T44&U<{1L4dxsiVg1cj|__nPHP@=(SBf*yyYfxsvfRW$AUR4+Ihb=HD4=V5VLGU%y7fa_u^sOFGqmt;r%li6$XxkK)hypLtVjUsRlxY4ZC>JDd)< zy|L^4$uJ6G!)5Ci2dAjM<5CRuR87o9d&)8v4#|eV zRc~wJXJRxe61eKz>Js?NslA5N1hc)PzJ38Lu8r>%v~Tt~N1!%xX;0m{MnUL|9lQ(j z2X=34OjXn0XF(hyHTK9uS1%jt*Af~U?9O@w{su1LkDz9VvxE9{6>bmybTKqhJC3r& zoVWV}u#QhJ{V?BkU^V{A|s zl+J2w%)Mrf#j=-cC-xrT`2$v^Ed^y1ei@ke&s;i+$tqm-O9Fz)+7rRw7tPkJ&$v1r%#$$y@4hEzEv^k#SmX+5aTQ1m2Iq}PPc&hYj}{7I|VL{%Yy z2GAf*FMn9iz#!D3MGk8|#q%VUIp7KGr3(b@Z~I?5dAYt-bv0M4AIr5hJ`3ut=lkPc zBIQ;^y06csRKT#(zN(z^@OyEkTVFm^d5@&DmO2K9-`RMzT5SdS^kUfi2v=N~B_f&V z&FU{>DZ9b%&-Jb)rM0`}JaTg}$f!>;oHB0PA-I*%Up|YiLcLg~bei4#h+oY_!*x$`0akf?f09A+BLcky7IN2A_2JXv#dMT;LFUucg1eQT!! z3el-D(GHHWnh#i;3Uh?JD-;7!*0sca@_7eFTM4fex-1W$riADyI;oWCbngWGdHXQP zQ2Dh~_BHiz!&#|v6d>p>J+DrOZZtryy5ZMwSEXs`9?&02v6fu)qJxVIgD3h(wdqRniKYU;|nLK8ruy`?GiO1D(fh{(3BCW9z8AnA&_bKw&LG!xqW4;7^ zFBZ7`3{F?zl|kmcB4^I%5+q|0-8k#@10%FQh&YnFw~k1!mU}o-#Ynm()}XaaqaM3w z=JQfZ{QAh18o$08Ch*9L6e`I2c5*Va`y1`gD&d^&#W~j^ofnnU-)j^S;b<^Vd%!)>cRTR!e$4#z?})^Y z48MXj!x8*na)Nsgi&-R?cYfl&0DFj6*oVG z=O|P!^xrmmq|Vj1;qm6&2ylD~OtnhF`9wfm?{b}HG(DXX?I+@=ONwZmeXE^o@^4T7 zD(vw5{dA`R!HAt6J73kH?(cXBU_s#ju;43mrB-^%pfTdX=azI zn1D~_3nF=eD_DC4D~wzW_>-1?mVa`8tw!eBa-^m(N=TcpVVv={K1NT}`I1D*m{0y2 zc;9TIQ88iCPC##}0Uv8t;1wuqf@d-P%PsxJMmaYaSkTx@Zkqo9kH1IPM-TkLee1G7 zxmp(rk2NVuNfxWue&yJ1xM({$Fl+3{v_J`u*3We27a#iZHqw@#U2r`f+l%g3p+12| z(@UQ6u(vPpCEsvdCxL_U#Qp!8%`BhNzC8KlU_73FrX8A8_(Rt- zt_wK)4Mvm6sS-9$NwozkNm>gcpQa0Tt}FsJYnWvyKM&fsf@?f?Pof55K4Vh1*xX*GV6qybxLLzHe>vEi8YM=_ z_NVV4XJu6u3r;$TuWaqvg-2pU`n%1a4{QxLiE&?~Is5w{CTgW==Q0Q1rL^H80*L*Z z817Xs$J_gr!4V}VgR=Zv1-XeQTD2%-+SYKwbGJKhDGoedE^vCoM@7jUdNHNN<@NDtmf zkx0%Bh56lbj+Kqr&U~y6cY3*DQr7Ostt9r7Q1~#AwLhtaNw$nMYDI~1mcZxesE1(3 z|C8Iw4MT?D^Kon=>Hm`d_^sx~Ap847J9jUlzuixG>@q0Em6WzRX1tH%kCHT>zv=c4sSLW|MqOBeaQcE3Kb)-7VmBq_wsuWy z^?Yhv!vXdLeP>M6rl$+7oB6V{BYJ-IK3X!J_;7qntQdayBpAm|OphzUVS2r(fcI{e6U*-|>yKsI8x5MTVyk_Kd*WQIkbF zQdM8Ze@E+mn3NCtxkb@>Z7GdDI|ou8wr;W7oyJ|l`e2xwrp|&Off^YMs+~z@LcSJA z>|5a9UtS26eGI8%NW?Q2zYiqewF>#LNW~wf@;40!t=4}USBjVigEn()?FJUh;YS^l z`Tkm2pDa07E79+n(pJtzwOU&lR*<(&PfXAB$l;BI@uKDuf6boP`JTwfw!MiDGt#Fr zeqVKU6u@{79!ef|2qpTOe%+d|)Uw=F75CG9G@c9qfL`{-=^FbI*1JJz$vfn8`X`~v z1dkyjS&x{c*PhrnS^c+8@lHE%Wwd)m!He24JGpzhbPUgnSxK&%fmW!z_vG4peSW2m z=w^5rxtzYz#~kFD@#zn>2%&kEdJ%~@1N_YX%P|$68Qz}3=i(K#SeJ}1#xv+>KKQ&mT%Z*att{r zvk+5Xb{pP?f1Xf8kN*eOQ`<@^;WF`?YC@&!sWG*SM@GW6)cMeCj}AdqRAaz52{?|I zdK^ld4yo@4MttN(bZECNXv4XK*u!T~=X$P3G^PPvpNk-&WwwwX=myGGNox=~$r#ZW zl8;GNkUM1AIl5y^~KVR+WYi!B-6m(~h_C;f=yCAiU4D*haO{7Z2}D`a8eCUHeyS1raxUVF)WK6flG)8q&XS^ALU&bE3Prs45D%Vu0KM@5Yf4mySUw1x53v-Rv0!J;rI z#6zohjK}T1!mEH`%&7e1k5`Vu9f#wV!N;zQpv6XDDQ3ecWA3uW_w=ST%K9D-VH4y) zvRnSWm#WDAD77sAI{_Oweg1j*)16<{G7QIWfA*-+-jJg3wGz?PV^|pNk`UzPz(=bY z^(3C{O~mZ|YnV#RfDCfSC_qoT3b(eh4e)OOPP@h$PRr%39_SSR{#xfI*%l6zvWPvo zJ=kh#u_#+<1nMX*B^E(~s8`zV9|WFb%;VkAFd7-3GFCyLliIL2kw-7@7^Tt2L}@ep z!6-i%_NtV0$10m&>A9G@TN;$b7vH*-YvUsVrqgtoA`p5re~#UhHINiqc&5yF%HT=) z85s_q<-(=Z8_dNua*;J^Z4G*D4^&L+hohr`nxE>;tyOKXaOt|2_*j40flx=Bd?{l1 zDUtiq#W`XEu0y!`bojOiI?r=R@iR4yzSOesH16l=4R#~Pp;x%As21(k`!SD{ts3Ok z6cHl18ViA?hK1!zSS?{VT&*rz_0xL~KVNh_bVl_UKzmlb1QF>_1eXH(G*#wP9V-;M z0{T|=WP|;Dueelm7JW$N)aoFSb_-tlw>@_^z|$3-dm2hM)Yb@<-B=l!=-E1p0yy$NK~gdenxIL+oZc)Tmv>1)5f z&ta1NPS_yK6t>71-04cs~7MPBye)Y^AQz=8U!>|433qpeubBuh1!Z#n3^+M zK=4j(0ByHWSyxol6&~PlaWMUReNX@5RF#>N2`{hzWD|j8*_kxfdpo- zqYimDV1IhM1l##efClxsH^vP1;d&@x=kJ!Kx`{7C{R>L}jW*wt#bS&fJ0*w0Pd1|4 z6A+r6DR|sGNC^!u9oJ}I?A^$+?0$|hnRt!)1+;4Qka0yF#CdF3S;aGAcBrvwJhavP z$>5{(4ZnIoBbu!Hv^$_puEp_s5xKJ^udXS)RC_s3IsNCdbGkHgHR@Vhb+%ez+3%is zXo#&9b+$NnceaQ;oq#kVhI!mK(lu6(8k$d0UhK#LWUUBloyCf*PUmbf+|0*50yq* z&tHQ=h-T|v4xX&u4O@22GMa}92l?Z-Uu@B!^69}ZM9_S4Y(fr;(TKPDgJd=4OK z1yNIW%RpG>XC=TiXJx|!Z4Y>NlkmAr=GgBrJ^&F+_9u?m*9q?e{5f)EI(6S9#jE_P}# zL-TFGDtxSsk#z1h`F&fouJMlk1q z?VextV2_N2tL|h{vcrG1UYe?JJV_}{+82JZytB(oZpiGvO4#xHRfOpu2fN!JKl?p% za8Y2$T|?7$mwum3!4eQOlp<_3{JDT$e!#?^%CUkI-H_Hk^Lu^~C}05$fRi^FN%t|# z65nJO_~t@+@Y(@P>Hr-VMM{Tw=IxRz=izO@PrC|HBBJ{lJA;}#qL+>IhSijBj=i!> zj&#xMWG|7F%T%eOKstre!;K4BU#xNx&(BZzZ0MAIMmjKd^C@;p#u<8=kp^9XsQ zz?11KvbBr~(~h`6aq9^+LzB<=0&O>w4ktTv5#M|Z+9;Fq!$WN2~A>Xogvd$r2?+~9wwfbmzBWUF4uTS&3YYzsZJk_m4$1BC8P5&$cj_v za0;C!Swo^+7A4MdlO=TTCE{_m^&s8fU69kC31~i&>TP&_Zy%G;wX)z;N%lzbB4OoS zdCd*A1i`_Wq{3W^t^@b#*Iq5EFMy}|UN;3%`imm>BJcV!q@5s}*&>t=86K}w-Vhkw zYFxfs9Ob}B*oOOGvHBDEPQPG?cA;1tT$OMvI(*w}f~vcJ5{=`96ygtQ0meE;^q* zm^vWnSREQ_@h^l2$49mYM`;(*z2e>?_XJFi+{R0oW=3yd-;^cD_SW-l^d>qRG%T`S z?!jeM-kUvhqJeszXW=<)!nQ~^g-lBbGu@MwG`FaAW5G^@l4FPK2Kqux8r;NK<^w&< z6)5f%AQvZvxxvW=Pa?wFdL!e*QBTZ+%E-7obLClIXS2VXYJZ~!dRlym;Ez6xo6xA& z;bIOP{n{91?E=xhL&nMYp8ipyF%YJWb=gk*tclizCyAU_6uoz=S%^qAX6WbQHg`10bVbZy;ALXcxqExV5=}HM&TgaJaahk|ib-VlmF*q_Yxb5D8LTt0p^kNWuJ=+=L^WbeLq!VEdG)k|5X(q49H6ZxE*7+F0oxCJmUx+vY#Jm2kNsL@*S#xpaL=y1Jvh z1XPbazZjC#H~%v+P8&4O4Yq>TO3UjdF^BiPTmWPd!T2r#Jv#Sk*QY^Kxnf^JSIWQE^4>mt z5%ux{STscVb2+yyUkfD#5eRzb6beGk&i5W_j(tG5V4D?XVC-g)U=M|h2(Go2tFZHr zwQD@`rQWm0Afx1)%XhbT>S3?6!UO8V+B=MUFh5;aFfadIy02vr=OxIhXT6ucF=Ibc zog_L7*dvrq--`O?ORD1(z|VzcU*HpL^COH9wMgkxO)=WmAr`Mq(|D=i9><*%G3W}2 z?YEFkiW*So&fdJfnBvt=z!-@vjArAB!Sb~*Nnl3k4Vy}?vxQT^Tx4XzATBQG)&AS* z?9;-MlCF)EOY>vc@pr)AAnTX8w-?c0gNQOc!DgFDvW^)h8dM6Z@YAG6(M#IaKX~A0 zZTFrP^`!-7*pBuT7>_)+b^+@vz9=y*@sC?+FBtSbIaYK|Mmw7q#h~9F6DV~rS`MaA zVxTV7jJ?cWg-jNQo<#p~7sZfrBfXHh^l-W0^Y|)Tc#Dze6)4I%Ms&4UfxG)QO>{$e z&^w{~9{X9C*k=*bMqeSxmcmOnkLKku=yN>!{oc(T(#AE2)Xtng#`?8p9d-1X4v|QC z>+gpeM19wM7?1DY1xfj8?D^vPJ;osgM`yMuPAlC>JP9Z7IPoujK7j&14?H)guSIH& z4bMyaSS`lVR)IFFWucLT{ zcgPrTQonjT5#RK@RWyl?XBf=WKI?!$K*WUt-SSdy7Kn>Ct~n6Kh@^YM@PdUYS`c?V zY5sQVU=rW8Fe|i=1{@uimT|mk=mOqgGag?j(JIyjA;_!XGrGVIA#C0lVV$!Px)hCX zd{lt+-qVfp_=+(EJZ1UZ}8n9Ivr@n}ex zulg#kdNL%h=X%my_%7@B&fpfZ322^bK6nN>8Sj4;fg`SQT8=gUG zKS?7-S6+Kgz?IsX^MmR(Z;Gxa+`t?06gbixd>A1puwuI2Qpc*xVr3hbYWkN7d*dQ> z%py>pNl|j->&`0igYHS5r8U?nZ8|5m8W?PtPQog{d$7O-$xNhn*-hm1$St|)ZFv|$?{!hwMyAsW?*m{G z!FL-UFrZ=tW?-EMmhpt_pk!gh4#fs|9W$GDa9rBOTY}UPB2t{vs4_ms?J%1hG|JTI(UrUy zy=oKehNGrC8r%)3C|T<_1}lWhYqxuy+Hz5`hkAcb8oj(8WG?)Spt02dsD(vnE-dk8 z#G|=ytA*PZz@XN;cbR-S>3P@HlAyQ?cy&qtwIgFH36K@M_1EC5e`EV3tnE^Ss%<5m z0>BVepccl)?w|@W)YoWT-N|Sgb3T!v0@WLzotcRUwhXtS0;I@g7Qc6rbe;H5dlu|c z&5Fvnm|Ibc2=F`pX^qQMw?k5X!RVN9R)X`y@cGSIHAAc4%lt$^)GXF6l`*wpHT%rp zCSjofzy93lXU4L0AbR&Rcs_z2F{Nv~Ibc^eQ=E|nysndQ+2rq0hik8_$ zd%^tFsXWjL#kTG#2Vvdio;>ibpG6Sa8;nQMImSweI$t-DVmr3ct3i9O0Ef%BjLuDY z%77)HmO90Ks^-@sgn%}%Cn-*2l%cEB7{8H=upHjS_9K>YzHU(h;)iiqPc0B zKsFlE-q4l7arl2oQVdAp=XXRQ4A2#RMxbV>+yD1D| zRS`nzFvZ>7mo!xu%Z;mf8I}6O)*4bXWC6n#6-shFZ>G5)Um{Nj;DIWFEk+t+;XD9z zA`iL+ku5fM664;`!p-`V!p!A)SZPChaQtXwK@O*{zqeqVX*%$6$K@B7q&Z+T-j=2~ zcYhXbWCjrN%66GMF2VXoxDQC*>ly(gqH^uiaK&5yv-jBU?%QOX-GU6v93su&p~hC9@h!b$uv0E=l>8P`+qMHR4shne3?pHJ zokr4bVu27(Uj1DlTO+z=mGIuu`Pu5N(8^`m_k0kWjUnZ^+1n@GK4Bn+ns#f+-zDLR zh`Kox_Y2Fesg<+%{#kic)~3HM4PyAdntB#EVYaIgS0JQyIB9I?wwFBmp6i z*gq`%3#z0QFvH`bv*fYjP}QPITLGS zb#lZ8+E{5M)7ulW;QVGPGVIj=!^&zLlJE5Pj;sZ_mtBlxV)b69 zV5QF06Ig$UYahb;*xNMq^Xb##^SabQpI$%*fo%yXcTy$>-%~Qv*>qL1qz@G&5i_|N zUoV?}yNiq=_^CHq%)+3HH}mlB-2#cEfm0k{z9(3Mnz{z6#8BClbnR|cBa|kt^JQ*> zGz}BnnjalBYxzlO8U;gqvxb+XjRFtJSJV|8-IyY1J;r=Gx=$U2s-RlKd9ikP_;m@p zrV4%0@VGe3(KcTkR`83noGIc>K0DjPLvl!Cm?Gd1w)BUXM+MAz;Mx zLKYodS+j!@xb_CC zBG_=elpB0_m-*&1+FMtQRVetSKgVu@YL<;yXbJh+wf131)$Gl5O7G}hFT=7+IW`iW z2>6zJycG%4eW-@q)7JGG?|i24ruigpf>oM1ZK$FKE6BUi`>{N#Fd@cbJF&#h1};$lR$*r|DZ9+EVw5PbF38MJIz0=)^PSf9 z&E}~~Q9p*PNR==y{QSjk>Q^_1DkBK*r#`;jT85%@c=a=vMk<#jkdyyceVVnSv{KsA z0wM17pV0*Z6sfcm(uXb+wojh)$DZlzFjp8_YobYrMs{N4?vtOMA0MYJZiJWe@F0o< z))3hN$&Oj=PxAw^&O>X+TcP7vnL;py|4xR#9{-Ox|+{W|g1PMVZ#p8FLc$;}Sbdr|#^3U?N;*<&|PNEh{04cD$zq){fU2@*hgzXuk zw;h$xHN0#+L4y8bvsz0WcblF&e(Cm=@5;U z-96v4HdQ+=|GOsycK10*A0rUYMI8uN2hbg2dy2VUtFS~X+yRh6=xkl(Cmu{)#EeH~ zBwGO00l^Zwl>NhZ)@gpNdX_ua8^kR>*NJ--1j5!43x7Qg z1@s(_Y6pKFKcV)qX<%Ewto#8nH&nJBDKN0VoWI~>=cs7hBK(qd=@Ofe!s7mtjVlBi zXyinE@V;&CeJaGu%jlt&L>F-Fd=rkJ{5?3Dt65y8$?&3Pnq`MU#u?G|JJAMB6)bB0 zhdgA0>zFrHcy0aKS)V#f+0x0N%~PcRye9k!4s6H*Y+hKzCgY|ig4EZSH6hEh=?J#} z{P|rN6(!qyLfmZEPmzMlM12Ttcm=TvdWTi@V&!uM5Jj?Jho;>2KPKB*DdUsFnF(Eo znbL!*68C*s&-cAc@Nri>iI|%ZAAF;R(j;za6Ys||u%jLWWV6;8D)Oi31Zy_y79ut( zEPr~g4)UG;HHX>X(ar?<6(M=B8I+e}8t$=aqPfFve8-c0X)y0tF%Myr;R)qbI-5vDY9D+O*I8x2^(51P(=Uc#Uqf&PGK^iZePM&O4 zeBSeMl4K5us~Wd0+a?vqY%iD~WjHMLb~`OU)&m4R>xG<)t9-7Y8gRo&H|fjjUXbhe zcTWhft|k~3Ey463DeE${zL1iW>tPofputT)+FO2Z+=nNhx>;*B-$s&a+;koqQy_?y zAJksh)9XGT;9QZ&fGRp7Qsu*v2WK^W$5tZO;`%ZAM%<{-P(&;Gr}sl0>q5RyTw6S8 z_^@ysSWG#eI&r92cRJy*F^_>|tLe?)bI~O=5k0xv1Jg|Q!dKa8$)B6V?`lk2DM?^b zSYR}f936*DuNIWrrO-i#s zp4zAUtgF6Um)sV$qg6rLB6!k41sM!+Vgi#BtWUxbZ{P|8=lB8ReJuj2K%fPhN9~|*t8ka zpO%rGvn$^ZtkW?KYw1XX9x6^sACSc{6g#WD;i5MkGEGr%DGN{W)4hBpFNn!(Q(5yI ztTSYyMA=LGNEIL!A>lSYpYmZj#Bu8oUwG|pVFjz04Boyk3qfk!W$5RMD1AM>qqIex zk4MyXDg5XctW<}`ziNc?A+m!9*tCXK@VrL=O>HnZDmeO78f}w|BsPX<=bJw4l8m^r z>315D#O!aR(2ADUv&1;2vNz3PmgqK)$QeEG;-AOaxce#{D3-LApJ+dt39cjn3$=s} zVA*F|c;3{Ps5io$yO2!!Df5UZY`x^E_OD>tGSfM;EOID>*eQT#&e6PfaI=(G4(Ewj z6$SL4pTR<_=(HDLj0pORiPk=gO(89XnMi&Z=*6zbI7+t(sTBr!>-&7spq94ohPAm( z#li{Y5YTP?yYsuhQ%jH#5f!nhUYJiJMs`cW{G5V^;O|$QyfdvYTTgljBh&yjHTn^i zs!Uu^C_QyIzug)_mPLb9b|FPI-M+rm^qT~J0y%U--+-yAx1beUc4$WWRlTak$FK_8 zEEwH*wSjf_#6(QNR3zpm4mUOt^xfGd&VziV&!}&M7jK3W*NA|ph9P>E4}w+U{tn)U zaD6#3|GLNq1Bd6-;Q^A}J^t0dLYlU~0+JWQ|5K04O8*+aW(FeFzZXEyb@NHnHn^Bp z!psTdf`LvVhE^KLt+@7H!gcC>sV}j#ex&U4xHI z(+VSw@TfcwHH48sp;QD95k4_-5~uv9Zd-B?d7sr_y~s0y=Ce+z%0=!6Qz{$idbKcG?r-~KbAf67QevAnm+#tE&4i%oilBkY_%`7>;#LBa*FPro8Qn_xSh-u;b$)38 z9AKZn=0cb5erFzu>zInZSRv;Y+YolLzG*7uAmP~GovG)bkIPxt!dXBFRLy>Vr~1{9 z7p)4(qyRZ1lh9Jx)9it=NG1;XBA&_nLS(cu0ACRB{PK7Vk-cavF89`Az=g^fs10M! zY&kC!Kl_w#`?ZRnbeWcA7zl3596eXbH$@<|qM&*5zl4>1HI`La+g4bwOG_EG;Lw}i ztJT=>OVRrP(c8?Le6*&`Rxx6*N8#xxzQ89FwwOQM;1ptsMs-DLyr(tpIZHQ89E0*8 zTlNZ*#A`&%^#EO4D$Br4|Bd!jYg#c^vJaE1s9J9~<%5H))irBrBX1}ET4G3+6b&@Xw9_aU$-#0IoWFhLglW%AeSM!^~6 z`V1-|pN9+D^23p(4nm9xev8hI=Om-&Qg1uI%hXK`Ls&;*@Jfw9AW4r_WNXA0CqiHll-vMq&?h37LiV$W>?eB2#%QYRHXZ z9rGx7*JmO*mQ_{f$MqitivHwFW1OEM~M5;`9o6{Sm;)1|kF zy7L;VVoS#5SrNtYxe3TS`ysDuTu8F2AVcfaNL*wx<)}j)OutgbZsQKI%?GiwyA~F` zQ&3YA87}O53g+z383?VQ&0}hEjcREPP_lB;fYsD@X&{NbQ(WcV?Yn zEylITBUc(VJl6{g{WG&kO63F9V*@>Qjdc^)-3!u6&zVbm4`9a`P+3n6hYi*uAH3^y zrmNL&k`UDd|LkdsiwUOm;O-d2Fe7ccZR?Jp9E)%Tm)~15+TfV}&?~IGDXz5urkeVb z9^oh1bMqC;E?yTORmCVK1Q&5JlfX4|C?(C7+=^IafJ4 zezBX-0TcnKG;RTY)6?FKZ!3KB&AdJjo#xs>rTm0B{f(QUI1`uw^~?ZE7<{80@*=%j z0mpn~>2rb%3>vVI)E-`s;a|ozG|paXJK?38(7 z5%CZ~@DMWK5bgwgrCaC8Vg2!4w}BvZYRJ%AB3cEQjnj?E|j zpHhO*p$_S`9ZODusRx7disFTE^Y7$ILPK%}*gqv1%ZjL*0A5_;eul@1($cf^ zEkEd5?OFEi?V^uoD=~LV2gmB^(A`aur0BKi`>vlqds2JM+0n$U$@?*jH-@SHjJ<#4 z=e=^{1&DoasTg642B7tv8@1})G@sfQVRUv{=Inh`$MBQw!IhKOX%$vtZeYviLnLLY zl)SR#1Xb@_gOcRa`kwUl^>gVNH9 z=Iog3jG|@5gQZ;E{2L1}XPjFTnQ8rM#RAc#npae%x;pY8#Z+&jwShdOj9ixJV7E7N zZ+*X^S8t4!!9y20Pq36rGYo;B=?@P3k;Fd!>20=~WZ9YNZF0XjTM!scJ)~Oi=%`3bz~~d7m6nd>sGnK^#Vm}FigNfSNjNE-{PEtstDfz>Xl;(&03_IAl6ZDlPxT^+qc%Qam- z#7t-&@8hQ#$=z4^xoLDdW`bp>D)W@e8wY7G#K4lqnu$;|5KuIJ7|2DfvU*TQ+i`}i z6(G|3TULN0dKk#Ym6b#oI;sdRoB9i$We=%IaO2rYY;or6$H(WGo(oks$)TTWZxsGx{AYxSiK`bBeM*qC% z%bpj4nbr#edf(@7BEQ}#&9vkhcT!IzC8Wvy5*SkA?QG3&d=Jt_YllL!^_;- zcZLe;__g{2ro_M0O^X>0I4+-p1fd7&(lnGa8YIf;khRUQ`Ulhp;_v8mK*%%9J+R!x zLgc?rxLR~5PFVPs5GZbx;}ZP^`{Aar6Go*OCfJ)-a+N(=}3~h^fy>)jUE=R_&!3Z&!q~?c$A# zdln{v`AtjGSr?@&(ujkH#|kmi-3{Qn<%NZ+0KoSJnb_e_3D7-rQVZsS0G917))+Er zPtJBunTgr;xO>n9-L~Sa@GjCXZbNRdV=ai}=;P|k zdez~Pb<)kjKgp@{b1E=wRfaxRdBJm3_#UaO$ZcT<)o;U}(C<1?Ee!+tFEc!?Gt?i* zj+Z7uZd3~urzX7U&<6Y#Eoqp@-$ccBB2r1dU6+)=@`mkNw#~xYhxopE@NE*-U`QMt zFzogA&#jVe95ApM*dBy831cu-)jt?Um-G7yQV9CWsmMO5-#V$ZyKpi?06q6UxgOX0 z0<6!OoJ1lW;*9wGRJQ1X{qHg3%L21v+G$Uc!ni?o9nc!&J(+<$dWKa`L`fzB-yC9T z`O;iwfEREy$~2g;9q>+n+A4sYhxcS=Q#!YCjklrI8?GReDCMapY`V|>;1WhV*3H}x z#NZy2sS$jo+KN0Vy5!9pdb0hy6BR`Nb{ZAPmSw?pM)s+Fe~urF{(D+6bPayGDKJzF zy>o~ck3O54=xvT#fIY-};E5#_ol*VX?%jA#NjY^GkTE=lEFw~PDCQ(LPz=HRn7>h= z^!(KUnR`$Myc3aqC>L0i#c&W8N06Ff3j7h(d+b>eXmw{5@P=QU2PDcH3ay3^tR8Pa zS)MRE<@KYgfl9?vzS$QpEN7L`103h3t3Gb;lhgn>Wq!;pzw0q8moFcbdb{!H*{Dy4 z@ypl|zM_%0QyNP9Z(^5HcI9xiz_<+=Po;UZR{OD}L$3+%m}k$h^kbM&aUeooX@?g? z0hIX?&%&51+n1j_sQv7f31W32CW0v%34rQuZ>@LS#l%^sMa4U=VPJlsmuulq9(Z>Y zQABn|Kk(gjJj94)KPQ96N|bZBLi11S?{!I(OGg4U`RdyfkkokuhX%r_HRo&W2)!sM zGFbSdX0?6_Lv=~|j;~JcBIO7_(&1*O@pmWi zFJYo{ZPc`qCnH|aR0|!M^%cgLZLX}cb4VX1rF>k^7%lZpkag2 zL@=iEMJG=N(DILvpLkcx0jD373@)Op2mcY?+-TqPuHX^XBh)vRyGKzY&3(8zgvrnc ztZ*Pmcsun&IFFSnLu$< zLFc)XQ!Ip)wR$m6qpcD%;N1839@zqf^!Fp@^#(~JDaBmV_6zy|0E;}3gLR_D20VrM z9RvR%1;!*^BDv|0#mI^_v!TP{>m$*}VN*mrdTa$cUqjBxt9QpFbBwgjM1`b_+vazg zP7wI0xhkfM{{EuU_Ni+&`cO~7<-(q44#tS%x%8(X!?EV=icJMY5n_}3-TP@-G+PHy zqlJGRX9;M7I7f8EdOr)dXM4I6+(LZmg6^Wh)c|1gsnKmni_RYigq;VR*L3#Fg^G`Q2rqaJ??(>wGL?ONz>_QG^)bs36)Tto z6ZGI>Ihe5K&Ai3vrpN0d&_TO897g0;_s}sL@*bAa;`+y?+c^M?-)|v{a z0CAq0bsN6SK2JVNhS0!LsltolYDZ=m-E3T)A zJok%dKmcaO&WMQ^uoaOM9wqq_y}6M=)rb;>IDefSj*MciHP*z3?e!xuy=QvUTne*VSnjA_&Nackh#5V#)P~Mvl^p%+r!ORur|wjxJ9gdaNOoIWzf@N&5<{lWOb7 z%UpMvEY6a7@3;c`RXzZe6$UU(bD?+1zBfuNmX>DPj09N%Mq?!dxg8{7!72cyFS9dW z_Yp}I8Hsq0P%V7rwt_a66gblgvp2T9-q^xV;((#n-$9%$R$Of+M&|EEs0zvZciHv} zhFJO-{&@eK_;Hs~sjoKk2I!m1`K2^ki88-{_UxWKomFe*%fL5T+I8DikhT^7vMy5MG~7 zn@tg*uv~(?u|BzC?@WplQF=|r{QdQQvA z=!OQ@tm4uLCscf)IJiNA-Vd6eRQW#LHjw%Ah*CE9fvL=?E!a$&&-ZcTTQJl+-fGVR zEO7h#kQHJ5yA(Nh_!9j2dYQgLHpseX-O6Z)&sDk5QuBN{qv3o4o;08o3q^)~;z3MG zymyg!MsrDT_1IyT;`zLPH%Z6Z6wu*sUXfJAUGvu{Vm^hFTLvi~^8vIMs%ZFz2>t0B z#AqX4nWpqf0u7H#@`=)nv%S$il2SQ<4zo8TJ(Z&i=;SV7#mE!h^5alo!!wZFw!#Rw zng|QmJH-xfY;s@H1)h6{$87&RtlLW{h5Ti0N!>v@gMPhXGM#|I;Ji{nZN;V{4?bJD z-QKf23e~$eCw4r$y%hKn&)hz`&eu`SO3+);icp0->{q&|d$g`4igRr&6HLdN!kqJm=K&eRF`Tyg@VxV?bgt zchh$5>U-WLyQrPNmfCCW0fw@WDdxQe*R|$^;k=5aBU%TKnJGsc+mGmFuY~|^4CPZ z^uu#xRgbz9y=I`UPU}Ig(ev{bC73&P!7M6@X%mO9QR8mNqC!v8e&4KyOS)1Ia2jy5;tzc(Z}vpK z!+(7sG~+%%QhP|@108Ie!L(g7ouc0z732xD=|JeB2Q%d4Tw@zCZ)$vfMqN&jm}SQ- zqST08$qwKJe@>wggq*ke41;sn<2;#TC8lK0ha~wjYWl*#dLOD>lvu2Jv~x6QMQc* z>?SaYcrh4!I=XhzFFDc0GevZK&ZhLe)2=}L>0-K9# z`su1i?4$(q;yt(Uh~zB?_!xTi6?N_0P>w(2hK}Z0Yk2bG&3`_^=zcw2-M`LMQ~(Io zjra2F?n?#X?CD?TcV6gCy3|$;_#2z7KNBO~jByGZrYW%z;&9S@=QmaU*O=DC zrO`y4^0Yw9_kV-B{`4DWRrBb*3gmyoT*p#>7jp{SkWGX9pC&OI&EM6U{qX+1uo@*Y z_4I#TVmrI^F+KFiB=zq!kR7+EMt<`DGcBYv?BC9_6W*u&d*>Y{&Fzf;Qs#{p-sBDQ ze+Li@#B{s+-<|#+H;>vOZ0r6@vA@gme`XW8AuI>m85;(etKMv^5dUwG#DvEOVi7s0 zW(u#;vk?ma{iaW0S*4`}mX?-GAS1f}4P_bAoPb$9^=}9X^Q!Oz)2nLv?9mvWjfmad zc+))4mW7L}AOi3|a_4qAQ^h7cyhKs`;>KH&!h|dKx5wShi;SZq$5)5{PVU7+KLY~; zqf1L=97P%`k>My0509LdmKNr&|Itgf;^9<$2Su(N>2`N^BhE`HsucS_GAT>FjggYf z@V$4t!w{Vc`uD0@mCpgq>wgLOB>TLDOW|J<{_ymb`u~*V|L;Fg=_6hCsAT4C^BsM` z+$PJ}jv-H!Q{Z`&bOF)raoVqbHHYP(HIGkc=B{HpMcG{eY>SmgI2^49lY5L4)t^{i z(I5aOGhsfk{Bu=VWl);mmJe)9hNno7DUaC!V0fck&*wp#9aFgt)q{=+&2I8eLIHdm6ZNUC31GU&FF51DGo zTn%?xl&>@tC3+kSe%n)dmY&MB4jjd7sUs{QH(~hpN`%t2wHfc$&F%MS9c@ah7_Lq) z9<=wP2rfP?_m0++kFUSpN-R8WsK6>C;^<0cmzyV~_7EvItbDbw{HuZM;RZy5y#kBr zp*`IzojH?d$ZY3CQER#nfEh~Pny^$;ne7}VQVskMoDGi?B6VPslOigWj!pv&PXh`j z;0##Q@<0gTt0SI-oOm4RnWC$stBEhX@(6H6VvycKN(wUqKR8!;Q*}ebscYX=9PoC)8t;*qL zQ!rX&2QW(6HbdkF*eFflid15py~_v#4VBr%9PNAOk?p@6>1xp6lD5M`@~06k{;=fA zYgmhOOLV<~C)RjU8<|Fv?f)GPdTF+mmtelk5O_g(BUp+Ibxv&b#BxV0Akvm4NUYa! z#SXRH#d*0>XKvJM>&iQ`4L7(!&g{x#(0y+gy0;(4zB3UW$_8;%mS8!Ql~kS-D<$4r z5P2|))tgaj6g<-!ZxVIShTooX-ylQ`$hFE>K<6)2n?BQgs5>GWu$?JMsoZpRt=x-K zuYH&Pt6!*s1T;G3mqs+)xoM~celL0&+N1PkISc>RSl?`!ET)oMEx8Y#DO0A@Vz2SV zUMVeuxg_i#y&zk(`|+WSuHFnsFG3?^v!qkTAUA<6#<&6bv>GBu)QVwimP_5wOd>w$gI7S z>(f=M&+Jw6lIP~1u{(jZ*^{`1sx`%EEyLZe{I(Q-GA$zWv@(P1M!8w5q?=t&+mt-j zgRb8rY8@@O93tp(-cqmOm$vwV;uf5<23K()1CPIm8py@SOB{ISx{lgxi?N1z=2;e# z!POUD&?EKFl>aE6;BnVvk2|4EspKA^yN`Ju{3YBQVrqrkw9SH_#tuXh@1GotfB4jc za4Oj!H->~wwdA!OJzI26x-yqLN-n4@0w6f?lJ>UvPLaLQHB8P07tZel;Z9BS-GmI|-$Kbj97n z>K3g!I`(}8sbq<;|La4fh~P>Lh=aU3TsRd@E=_sXRJnF!DLp)!Qn_V#=2HehRW+19 z2RgLp&!Bwu!#XO@id)1-K72ZF0e_tUp*qyAcLQnmWRIXkDnDFI18h}jdyiI5&!Koy zR}HQLN4FZcE-A&fYM$P`k_Wd-_y(Y~*gt7$J6$%5n*ffsO2>Dy4!hF(e+uX6cWZ79 zOAQT(STCwRJN%wpi3~b+y117hz;6}6mtkAYJ6%}}qkPC)G`kj>Qf*Ird1x08!LnMc zA7RIW<*(+(6aQlZ?O>>%4g2~LBnRX>g+#ZZxef{9IdnhPYa1S6{avYL^?1bCMA9Py z;YoHXQEv;;z<7@!2UDojB*c(h_fg^BsQtEJ+mN5n+SN+*KTiiN=Sa&rNNnBN zFgZR+r@A!PQ9)6FVZKgJ?<5ZXfGaaw1$Tmc1E#zgLHm4B939kGLT1Ss@`Y4^ zhJdIEMf#N=rj9SJIIov6Cuat(mRLmtD(W)fb(O(gx*xLQ@0;zgwmyoICX5&c>k-vu zAC}P>R9c#9ZcUq*zGf==G@ri6Nb{khk%Zm)nT*`alW`A>qeiuFQ$pzCsW%w!y9o_$ z{0%8S;Jq;pu&t>GNUbG#DPZn*UuohtN0=zE$imbW1+x1oNmf^QpCVu&qM*3kR>ahP zF!p@VC#+y&BN6O(t|N2++szhEvi$jvt>g850#%#QK{Mww{P!CVAL9Ly zDwBJol5dlrIju|tM7@V*OSp5~aXx%|^q%|=w1Kw4{>kNWT)e?YPtJUk%%y~~Ua|~~ z5BpqQUJd|v9NPKHgMqBkXCu+GA=F%0!XsW%{B`=P^In;HdpaJq<(&7g z#N!y8xDlNgrSQK)_lXnuFs`qYFI3X%bcg`V_yaBTM($p4X&|^wPWz>4OxU>L zzrI3dd|h5u_N@GB_Q2JS>tdjuZLA|J)3|@3;ozus6`8wc@qcGu9tEFg?X`9a=KU(; z!y{7WU$d&VR|5WA)NhpBd-%JEY8KB9ha6$+Supqty0$-0%>B?}>gskdWFYP;@M;=N zT``RNavgWZpnM3%P%~91xTQi?e2e8h21>Af`PLXiXXU0NGzg>Mo0dGMRhfzZpOGOR zC(`5j5JEM=*{?I$i>I?*gV2*)_QWtLw;tX;)>4jV?ayOIr7fUSKP-L0Vjsj6_K*Lu z%`k-z#qQ<4exiN}(HBEl9>4Ie1HGcL)$An^qfH7b3g=u8wI`F;ND8n6xZ(uXaY}a% z=uCzzE?7~a`Q3kzXt!<7(HL7{>V6uiZw+VNzllz8nEmwH;WDAy^C1VB#M(p|UARFMQKXJnwb1Q#W5^Xk?B;FCpbjmb#ahjZbw@Bui{Hc-E#P$p3Jz(t(m7<2=&env zX#?jq(!r0_k5fF3JCC+$dy_4N%ziCqE#8UKtH0$;oR^~iUCx}*F|6GJ%aRpGSv0u+ zk>qrn>Wz>(u;{D!phA6bW^gj=cmVlA7{B6zl^;g^IhFVqoHXt~l9PoDT79;1y6VkA zfPAUfU+H8b|5`5gT`50)IOP;}5eQ>KPb9kZFz~H{Ijcp>P zPf$SfMYOQ9ZI~2S9K!!}pHST*E7-Do0Q6CpkWYbJhazJ@~cb2(6_QAW`x*3E9{KhDg5D00v&=| zqHl=at~R>@vw^Qg&G%nYYTW_J!}X#V-?D0I_WxBjc>gGyA32g28F%#SVYqNOEnwa-ZVS zsnV1zz1P7%iNh`^nS?+v9HYDv#Po;T;S5c<#~J^|0zilF;I1EnwYHJn4I=HCKH@Um zSLG?6#U6?_w3>KDN;4a!SU}?yx9|1W0*^VL_bPrE{)@Sr`|6v0M+dtC(y2VnpDEsh z?a@Q6AQ+*x0+{*3Ni8)y75?}mQ+CwxA=Az%U*;cu;Y?`TUElqI9^ zd9ieA*7WOt7vB|b0cab*Iq#BDY-n&tw48)Q!rI&+S0#7ygGPf*mgNRc=<%n6EtC6E zCN&LYX)YVfRU{SXv-nA>1Ttu5PVLH1!y>q~faV=c zf1dV1$e3X#EQNJvY|@HW6*=?DKcoH?ognn-qT~@{iu+MCEzaKQXkEfCk=~dkjDAKRoc6l7r7d6 zpIAbZXZWQ!KXW&Uyye>~MngTV(6JfL9%Na;R&JJ-sgXY?z%-09=f{t5x(nATL=mSA zQg?i^qPvt zt(I5%pPddoG0IPHfrT@S)(wBp)2jofXL)tPt4D;I;I zZEW3#0)i_D5Uh`?XFSI=;`X({`tjRmMbh$Z#DCD7$jeK2-47q=6JYJmsgqY%#nHY$ zgo`%C#tJ_m5cFWjI{s&46)_EF^B9ZL};W&8p z(&{BzE?B7k=ReNBGlv0EvB~cqjc?8U!r$ZZfRorHYmeIH{TJ#|e(Z3~^xwna3GDfk ze*r^T`oc4f|MVdB9E$w_e*70dljZUgz5nka_L#~)UH`Yu`HTNQG+*OCLecib9}8qx zRT0~Hq<#6g%;jn8a<$bdH!$a4x3ci#b6)Jvk9K3T4KKmkOS)|6t4|I&`aQ2y(rAMI ztRCS8=miO_d_)SXzipoO+MV1<0H9qt@CJ^uI2)RK_nJRgJ!SKF*-x|_&KacqrZC8} zZQnZYCx}!|X)oWDb`ZYc1f$^?|E)b4NmFJnp;R<4`D2HAQ@suo$JGY+4-G}+Dajx6 zTXSP>he<{P;VDs{_p@i8`2LuS=BIs;dz!0@JO))#F5s&DU+sNoR8vv6AP9;m#fH)m z0cj#2O+cFTUIS7CBE3p)Nl>IH0!r_QbP$lKH&64OL#FJY~xu1O5z z@{M0)Z%4gWVbr2hGtrGDU6$>I5+A#KoabND#>MM)O1+q!qL`Z^np^m|d$CPU`62)t zp|T0gVpP8JY{=k>o7soyoUw(~{qIhE^!rB25@*k*BGz4Eb^J+DLwDyO2t$qL*AHsp zZ8x9gHKb&@|LdXfcMrrSd3&Vj@uo6C|tHraw5KEeqw){o`t6JB!EUz=*w?O+}7s9?FYxmgY~B2ldkv4xK1U0 z8Tm~cZlMdiHrMbStxuwrEe!k4zb3c>*?JP@!$@r!WwB#VthvHX8h>F}JER^q(0{h^ zoiq`KQ?~^vq5`=#*%4M&(jszb+M07_Z zf~~uvEA((oQb5riX0K^y@khwFt|`=QpIH~*ihj2M7T@xgsQFrFA<0~`>NMH%q;TyqGE+>fs>!t}YJU7dZpk6)@Y}o#YTiAH|G0J*`qQWPjJ8e4?DjA3 z2p5ZoU2BlLjV4}kuTmq%WuDjF-)rwY@V%%?ns78@#rojb8MSZC>uqImF+zfI7wl172*AAS|e68wfxD;1NBO2TZUWlo0pJ6lX9wB8=3C@qO-KOW0ahy zK|%6U3uN9rCm9nyzs8#6`FuGJbcc68IK!q~rLgrZ?;~;)kZkV~J1hKeSQSjyvTt^| z43`gYfA-Dr&4Qm!V+&rI&IGYXoRO1JGr!tz#XOb_II)+5AV)o>2Q%;0k%T;a`4Rt4 zdO7y6{Y})=tEpTAU+)mVSQZh=Q8MCLaJ9>~Wua>$QY4(&OIs4vGL76*FGQEoS3b%B z@a)$OR2hdlP(V5ZdKhz zyf`QE*@A>~X(De#VDE{bCEXrQd zav%G)Io1}c)UVV*YKgIidn9x)m6OnZZ2a;uaJw|e_RBMd@c^q+w>O~`Hj@!|!tF|C zt|aej@9D?oYBM%7ip+|h@6Ei6BHI$c`UEoOm9mJAAmp5dg3P;9jq+wc zb{X78)`qB@rM^sn70+(1vdN_nq=#j|%1K`MZqn)&u}L69ob-j!O|{mNTLP~?2EOt@sv#_lM@k zt#yMzzRoa!0o?B7y|8k2Qpzdv ze71C_n>+UHXsrUeARu{%ct&%LIbib+MRE{t;zWRxdm00FAhGs}SmjDlIdAK0ZriL~ zNK*7hboGa`FEl^*`?%A4Jd7)=xxbtJp0@Z7)ic&TP);NxD8udMn$s`ZT-k91skn38O&vG3%5vjS(B>iYc3>y;=2{C-qet zw0TXMh{{>vcwO)%w~9bUp;pxCoXXog)ta`-S0!SMHrww4_(xA+r;Q;T~Dtu z?`o^cb=gG|G`n3O9$s@d>dZ}HG{pNwKubZD*fsma?xcHMQ4l#!Cx0P3w&%zm;aO1l zkC0%Ux&s}_WU%vy1 zdlXffIG@>fOq-R;1zA2wyyw#5$tLQ`9P=JM7?jB2wO~0$`He)&7ORp$c3QdQpMGi7 zZR~u}Jx1_AX|F)J200>KC!i3yVd~l!A7>@*Vx- zOpBKv77$;aF)ehgJxRQk7bODDQF$3?g{CZIq8OF9*tlmN)xI-Z;H1uG)8`#97^&L} zrQouud&hoS6q+9sYPq0Z1)DMOVuV}N{V0@7K(cu=7uw|1pByL6O1F`xJxIJDI`vzI z%Itz`Rc?@rmrCFRGpFp$3J^=>+K<-zU<-6^ZD8mM2kgzwg`m}#m#ALI6%E(+6S!fQ#pDpSwsXlb94k8;YE8nrUo=w~Us;4f$9nLM#?_?V;Mz?Q&^A|3#~5d_;Y zxdpyKN2NxEk?#WJF*5`S%4ty*b4!$4XzMs+c8`BU2Llcp?(aIZsqF)_sJVm`uPe*^2rheJ0^m$XvvQJ@*X)1cRmiPgcw)|SgHMnf|d>VDqGk{FI zR)kGXS7Hv7q;_LcA{v#&&~~_ccYA}o>t3?%DaBRqfu-8ox@F$Kk-RDh+13mN_*Sen zx)YOEGku%>`@vR}eZUwPt&{A?9FlJ>kvcrZ^-5X0O_V6=sB!STXy7KGXXZ1GP^Y2Y zs-1osZGb^Yj~$CP)uvCXB?;8Q>sD2qoc^fCXo=uXMz<`&-Bz&u_H*leLJV=MwQu6w zw|8|`V$4XSh~iosZk$`haq*iW7D*qrDjC7m@AE;Lpse|A!|bI|r5z`;3E4k%nKBk6khNLz_6lyDP#g`~W zILE?cETg3+PM;$gUSsuyzvvoM^C3WsYzfarm?_nBdaOt++??+s8CQngF<#Eio;fz% z`fn>udGt^Qzw)&u>iMV2plAJgg@NC7dz^1jmhRs0mpH^Z@3>`+KGK$ z(Jbg%ntT~QbvwcOcr7H(X&6&J1tZ zue>FH81c(pyiEoT-(;WfCZF&2Z!6{+MI5Cg7(EU=GmoVT!YloWh=|(tIzQ406(Ylh zFSIixyt&fIfSZrAjH11{|kuHu19u;L9I zF>sB%e?fTkuH5af5x{m~~~T@3~8eQH9Hk zEd&YuAQ7NLJh+lmRHVAn6=US#QRysd+P8fhCz#8#AXyAfFxu`JpMv%)aZI12B^+1p z?9s`O3ALLr?YO+S@NYv(ti6926My-zJi{0f=|l% z_oBql)khLa!f?pnE$Dd$7~R`U;t3BRa0NME3KtBg>=ycRycEu|_2)C2{15>B>AlZa zui|NMCG0behxN!%HfB&J!1UGvl{GhRT55L1uuNvlhhLc=0DiqL{Jio4i2|0*6u#cS z=c{B(c8%_Ip4|JXtdQh*^J@h`lH;FK@wS3+^v&?^U6t=`v5Bky(mch6%fn z97Jpdp%yh=AS?3w;nd?ZtmgO-9RDxzdxAIK!IHO*J5RY1i^uts+P*Lt?b5xiB~}?} z@I<_{u$x2X(AK%fn5UafZWu}6SV}>Gv5O7^7p4Wu-r6^x^Giy2 zYiagg6sNyl*f^h{#+VDQ*AickTnp+pJt>4Hiq9Nh^pmaEQl8(y34Yy~zCAlnYFXcS zJRsTcv=f~da8X`n)cYf89Ci{zg?RAoXP;-qUPcm#b6>GNCo&hx+)j1{;CcPLm?n!- z#A6EMS*)PQ4dRX$j*i8TEt;qBZ+#z)ufRB%7U&@d+M1fXzH|eM?QC0~f-3WM3!8Q+ z)?*8SL0`r1y>TaCEt8Ti`e^owQY!iFhbL{HWX{{@Mk8PbE+n7s%%fuKHgu(+_+8v! z-E5aSQzH7<7~U>1!4JMz zJ6qe-5#{!4z;N4ef8&)sm|2X>p49Co(-TAzri~q8_DgoEv9Yla(Rr~_mj}mY(@3kj`oW!I1}!!`j`o)nxDp*^A4F2e&S}VSao<6=3it4q_jN0S@p5&&<#4(){f@GoG(A#WLUADk)KqMa(|u)JXo)*QcSGA(8Nfm_l$sk>X$V8T^=_W$yF*-&JV;y+ZmgXhM}} zU$Pr5ok@4?U5g}_n>p4fXLjbkUOono$_Flte<&I^S>uZBVW>uxEoOC0?l{3!#tQi& z*Ne-hcre$GYn&F2^NJ;yl3#+G4V~8W{biW+^GcqZSmfJ`u8jQ19<^? z3AtLQ59XefG&aGUFy^UBoPJQJ;nACBYml$ky>FO#+$=is&3OHywRY0kU^Dv?zJVw? z^gw3rQK?QxzJE)fS+*~O;jgL1XD+Vxw66+?BJF1jqP9zNe>;Kh-a1uZb7cKO6*{Nf zV{mt0i|FPwXlmux2Ftt&AX%1wG3e_%+*@Cj_L z!l?SBLxJym4#*r$p~bGwa9XRjy20>wJ^H4gTp3P{K|!B~_1P2f$#@F?7xIa5UXh=9cov&-vyU=sr0v z8?Qe&UTJr2yt!2kv)4^Y`i3pR!{s>Y`g%#BbIPTpE7>_=r_3&=A~Mdu1cTx$r2U%o zpkUwo&G&>#apa$WYPkK}3x0RT_HFkQv(aX@M9m;FYU<2mK&d&+M<+kjjgRGeHWgG%ZfQUIUV-S&cc>u`uuQfjlcl6{p;ym zVtXk*F}l#70u+*Yo290 z?WVKljWh=I^r)+4Q|llOdwn`7bM^^5uy_)ROul!7iq~xwIDheug<SdW8$yswECO zt)@x7cZ%BZ$*K2iTAJ0%g5VlEr*zDmon^Mt7IzEU79hK@b7@6*m+Y)uR*b9I2YK|W zltrs|j4SnKhh2iz@!LsC%!RSd>pzIvEz0aJ5`liZ&QptlQsAFlTgMXO`GGhCRGNXc z4L@9Wdm<@kHfnkK0LJ+hRd>BZ(b_uaHSWTHW%+j`Nzc}^1If8&WA^Zln@4s()T7p2 ztsUOO6d*@G!&ePj<~T86m!sSJ#Y-79sgH^d^SozL^uOYdqEFP1s~dve&*h~V?3%I` zD3t79gGcLg;GYZ%S#3R+ieE9zFpVv)DKg;kA07n)#AW@(FBq>R+00h+Ot`#Lkt*{KjcvI*oZ0anC)#tHZPf73CjdW<6?V(d^=0M01t z0L@I^oeB@d)q2+S)s=4c8W`SvHj+|uVLa?SRs}o#t@y^ffM0+3+r$ty4YZM!m1uOo zDRq42?z}5;h_6PIZ%q$WJ#%DL>Ygo4Xu6#zGjF`l?u6jJ_+&t#)^2M}%ouu-a>7@# zp(ks+IK(^CaAr`nSDF`mR5NQ>5W=Ga*O4v>u?nrsT6*}VNA01E?pKaH#nkN=1qV;k z`K5i;h0?FR|1t1P95ksMIlA`Ipwn}tG@zlzvsHfkr>*#;(hFSKI8S#<$%F6$+Jf@R zJfKhD<3cz^Ru%h!^%V5toKtI)vW{LvoA*PK{d`Y@N4#1Ow{E{AufmBk*u>N%k7ZgO zkC5h8_YqMRl+pCOyH?_8T4dJ5Zgb~K0%>(Is@kBbfBcyBmvo2s3vM|jJZ1=5Yuv-7 z^C$0lqq#9;*Sh{7HV4X2^bC_EB3KOy%r|%3Y#R(lnSg5GdBxw0esH*!@|BJ(U2C8U zFHhs|4t&$N{bg%r-CheVIL=&KvY3)-rv=-c657qQVIOCTy~f;Ybc{9`M1g#D8uKE; z!A3GB*%^@1g|5q>wlkV$Uz%rw zrr(auu5t`rrq>V#UX01WDJ`C1@Mbk(aclcnGS$sN@EP#n&W6(*N%q1XBzXGR=QHb0 z)16!B{ciCiWwv8WB z6K8ZEQ)a>x$PVr=sEW_Zoo>W`3U^(#htSDXN2?MMtxE zhlknuW;|#stY*>ANPP?@*KuBVanzBQk5coP3vlrr`NT!t8rNL1yMWPd=c>XELx6FDgaAjW4>j|(%H5!~~bdiT? z=}zQ5p1K9p?#x*;?<-7K^q3j}b3Ss%c~CY4M}L;t8-A7Q0GYruPh;~bvvugUhsELe zOd$N-*j8!X*=~m`{_2hiM#anD%|p))K7iOS?N{*^lo)JD zi3Ma1W-j;}4P6Gzk2gEOJ@0xu(J>NdhlXgVy&wTrkCzXVZ zztEWYiODdj14ti!l-?hxUTq2elJ%no6BQd@r7*Mj$=YVH*0A}-*U5lyl5Vn?2&?;$ z=!y7gseR-EO|mn!|2_=nQS~53Q&vsSObcEqFi%piBzG?Rk7M*`)VBFi|HQWk z`+_`rOWAtb4Y9uHncpCuc~FUU%qov>K$ zhNntgra;`n$~Gj-s_@@?D~qX4K@M-$TMutgA6+5}em68WmV3C;#VamuESko*j^xG= zVmFWe)kXzQ(FOuL0&>#?vpBf$|1`4mzikNr|BnCFK%2tbaJ)8hEQEifa{)^Kq~>)O zOMphxU3%XOIc=uq^|Z^tf@*wTTw2%;F-Z{Xsv^nSDk8&wiRu?qAzSubB2WQ^p+~di zP#c5SKGTTj;H3RABXT5E*=i4X`xJBN(4r`zc#u~V)4urD| zRrO1roRh`ImzI_<6rf_+2P+3Nj;h_=4&%@+atC*z#S5*{x@#rA8{@OgL+{C+ggM#) z0|v7SJyOCQGr#y^hb$6R;%N{+PlO(BQO=;zaT15?4Xvzh^M5Mdh99ACp(*-WKNucAf zJS%}CepNaXlzXk~+(F`AAXZvD#ExdJ;C4Bgv_zHbr?+pLj%&00_U^vY{G>lp1=kHk z+*!DlwN*-;8yE@Oa@j`&`1An#NUHZ-s}{l+aZ34;Uu(t_rZgK2Xz09ESS`~~5Y zJ~8o$E}KI#HdpeJ%s}!j^Y;U@3>HIxNt;oirG7d74CrFHN-Mnt9=RZc79$K>N}}YJ zT3>fH1!&2P<6HOqnZE!lcM_S*LUk&|Y5DT+Jdp}La>QXP*B!SzMrK*OPAl6BX3ibm zjsuSM=kHyl%X&ubK@To(p@BISSf(gH;CDD8xqh+}zc`3$JR2)O|0YlcS=$ig_w-1S zk4Wdx`b7crP*s7W*9xHpl%+-u?0Q$rLO|}k>OYNdUIE%3mHvllC3Vwh7;vA6ME<`V z^Zg$%IP9u8W3-wtl$M16>4+e}?0?#uaDiw$=8_^@h`IogtNm&7)rckI`Al8hAq1j3ekTu9ng7 zsPLwD#h}WC(tigLflsPP; z?@3beD1KF5{;FU&khMaAhLY0J{;x5!YevUBH*aFZv;X8~t*=Mq-9B)^<{Dg-p5CBp zq9}v6->($_O+;%#&VR+%xEg_opJ#d?sx{j}m-buR@Zi8hpGhQv{-#z;Tj) z-4czo<^xvoHN%WRE(t22dve#UrMAP!0M*eo3Wn~ivpV(Mm2wB)p+f8l%Nfpnf0Yvs z>X76WHijQP2$zpWZ7b{nG5mIS%l8NTsy*GKF=Vq!IxYA)y}HDBu|g}i_vyAL1jeF$ z*?qXzF5=m&1yUj>4CeeodN3d>>5fK|EZK5$S;fUojC#p%1Y)XttIyVe+%?jW4n z_e@G-8S5tcsRI-X&m!9s@03Tli`|dy_89mC_+*z{(&xUyxR45XH2+I1)k^@*;*8q) zfy_QwZS`5JmM3I?G^_FXej@+pCa|!UEOo_w?;?dkZ{J5k~K^|{6n53Xf;p< z-xH9q<1)0~^uSfr11vgT$j(_9g(}}<-LIX`f?2J*67n4R|2dy9`!G_4)6>&0&r<>q zeZ27>B7ibW%72q3$szxm9)VreJp$kb10nJMb>1X)W&Ta;-1*}5!@WxYc+1q=U;==VjyRyY>FE>HyQuFDyjO$*@g1T6z}8lfk&~mphCk~TbiPs&u0ETP{#yttwuwv z-Mc{3QoB6kP@apeFDFy<{ln5O7cB-SgveB;?)>85k8PVfj-_q^29QrPPNKzLMkT)8 zK{WoD+pSu-qbGdNwoNC>e%f8~<%@1v*86QWIC%Qosm9jTkD6WELA$6}D^LcFUfhS3 znuU|h8vSV<@A00h(rmJeEcQaq-K*Ih?L>kcDQA(*DBf>K}!unI;9B3f&#>x{!5Xg`34tBY2XQ;RDGwt#Td1@76)W zKT#lh(z+fZ!!qxB$LLBe+_2@xl+G^r$xyEa<_3=+_LFyOnV{&Mdl*Cw$nC)Gtg7dw zHD>q^hB-h3h?kri+YBMTW3S#6EuVyt%V@RKpnw1k>+*u}J~s07MK#Fn>P3s`VK z5pIw~ycP0obmav=EM{y3gi*(csK|T#R9q$0n9nfP9`GImwjYE8oVd)-cg(h7`Nk$@ zcM9=YtvaD}G+3apuhv+?jCXSB%lj&mJZ5V=1j%ZDN6Hz3m)P{N;Rd7NH?h_4jrAhg zYf6y3MW^3+zqjUI9ANcJQbC1ZzerwcIJ;B4b>{7uHG8b32z#&>nK~ZOXqZ=4-2Rr% z*wM&U1+(i-miJrH%9j+q2lndv*};5rmMmJQgCcmDzse@ck3c70mL+fe8!~-_F3oE9 z@_xeVl+4)dW6!m=Tr%d8V>khU|5fGSz|F`|smf$FcTVnEJ%G3WqSQuB-$VK?gUw>S z2_YMk#K+p=eV>y9Z|Hr!W%PqXw#DAX0W{IKbSEZIytSF*8o>sYcp#Z!X+v;!*dnMndKKQG*;9X zO7J9+-n6wNX3nCdrUy%1eVE1FV9dQvT#hZM-YoNaHL!OPG7)|9R7>s{eQW-ZGA^^= zQo>O?KOmueoc}TnC4E>nux*03j}MQepvq=|1YJm{|Dv_ z!J_)Nq&c7~3Fs<`b_gubht^k3J0I@7W&fK|50iCY-3$Tuo);P=jfbZ~5J?8WG^H?b^1 zmjrXa4Qb;)VL>f_gr3=!o=%FClwds41O0aMqO~S=njc|DM}qo+^Jwvkvdxc){?3Ge z<^dPJ3qSd_4b%S^0^3w;ZlV!0pHHem9H>Ih9pZqqwj;fd!8U0A*k!?^!4hde`dQL1 z6yn!UAR>?aC3x13EL3_^nYyLcqeIS|F2ycTolBH-{AIJm0|t|j{PbD-UywS ztAyEQyK;~C^KVT3zxPzz4Gx*-wY(0WN&ly59YT_Yunx`TF^+?ug`^5%ytisi3+y$f zRwE0fM~KfZYo_`a*j@;D#I@Q4IBhQ%#ds~67VM>GGFMudVwoWxCXm{Ur+Z_8<=RPA z4HjZ$Gq<1Et+kboRgDg8HLST6&DELx5^bHtEhKFx=`)YNN8KJXKFhYnHHz9pTWj5# z%&W$85k4yTix;)78>Nyr(Smb-@h=NymcxJ5f_TZ2ZFPlRJ`okE&r_wd_Fj+F_qYHK zBWwF$S=D|i4$Gra~FWKi)9cJVsa+1D?72bh!lk2~#Ou1{sgwMmx> zSqrTtCl*!QGx0ioxv>*j5bgICHpLWjvRT(He)@5);HTli5h=dH11{S4wyia(2^A=g zkSRunxNOOQCrbJ!9Zs#`wYWoFsdQw^>HYyJjQ1~-{Q9k!;qp0s^kM5~GD9g|3&F1Q9xAxHsm^1KtAr| zy%tPLev`!i>DdXV#Fq*W3C`|aoPzRh#}ey;g+WUmzTPG;GXq~Zfk*Ui`O}Sq`(f?q zbn;A=$|p4zBSPz^!r8in;+q?so1^J+-dGn$cklt6bt*?H@YH@VQ`<{vB!yqATmQnd z1-I~Gb9Vp1B=T&P51H~rzD~SrtM79RuzMA8$8%J7yG;-{vSwIW z>#je?U&beJu zIL+(%rEJ5tx#8S_Z<}a@1Ide)18KqvWO&1d`AaUjFrn&#Mgvm||1#?9k<&cWdrzLk zKOPKeJ;E_Ahf|4%FkdhU+2p5tY_}_Cv%>K@`_*vxnvfD;>#N2AD|i3=l2v_CfI43H zti_c!(EKCsx)X+Ex-q*!`XCbqHuWcvasHVwt1cmP>&~YTu;}|uzivKt4>DwwDlDYu ze)jRSX}*;VCgp~tGi~FnZmG!L$HqJ|7qZnFNny*fk8#~PylmN_h$_c_Ma{ZS?tCh0 zd3L~CRJHeRD}TOl+Inzvd@UP1vgWp3pFH@( zQNY3vCbgjrqv#k);58Zp_W5yZ!y48}qXL?n65OQ&mgKODWHLh=!#N_3V_ehDqSMZ` zg_CZMjw9!XD+%f8jH3b4@qbm;KVLK@FfMB$=fLqFWSam}4*uVypk?Z!d!Ttw;nP$0 zLsFI)KXcN*!o`v&t^Z+Kf4=d+iJvb=cArN+CPuUQA5HY&dQCO8k%fibv5i;D`Rq|z zr;IVVxw-WgLa&}RaH|})rD8T=P`%I9aVO5*~E)v5v$PI=v$o94!%wn z)#c{qR#Q7tIPfzgWe1Oz5|o3&aTK~BHG(2cI7iuO`PchYVTV{feSPebj0GG1uk23lyoXbcqR-ndZY8)H)&Kc)9-PHxy3f%?AUk$Bs z7fNhN8zw_!3UZ%{L6k_7;{hEaVBXx;EjrBJbNCmCr3#1I!R7sbcwYbJ;Sto-zZn7l zqLISbFJ}MJL&U-|A+&PehoH_8J8$SKKf{1UIz|jqgN}iQ;JkDh7<8yylPUHfD?UDV zb@f$EP0eOc06UAN#u5RDm^CniNUny zz{~+gzJ%9?j!GxfRx^HAHNN0IY{V z@dQxf7R4Z@1=M$h&||el8(^`|*zn!m-GntL)Xnk2A}6;;^3cH1%}j@7P#Bqp7OZ}C_z*w p1tcrcecc1fHsJbCRToC!se{Au&J;JeZUJ40R28)p%AQ-k{ck$LLG1tl literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/new-tutorial-component-in-software-catalog.png b/docs/assets/uiguide/new-tutorial-component-in-software-catalog.png new file mode 100644 index 0000000000000000000000000000000000000000..51ee73c5246d548ecf31a2f93981a63e639cf644 GIT binary patch literal 48015 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%0A$LK#X_S@IjNaoK;|p)eFgwb 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/select-create-for-new-component.png b/docs/assets/uiguide/select-create-for-new-component.png new file mode 100644 index 0000000000000000000000000000000000000000..9fbc612ac007828895ed1d8b39ebce217ca8f3be GIT binary patch literal 43932 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/select-create-to-make-component.png b/docs/assets/uiguide/select-create-to-make-component.png new file mode 100644 index 0000000000000000000000000000000000000000..e86e9398ca0828abfacb2c2aa40406ea1eae2d72 GIT binary patch literal 87342 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/select-review-create-component.png b/docs/assets/uiguide/select-review-create-component.png new file mode 100644 index 0000000000000000000000000000000000000000..5acce27ec6fde28faf4e149a9757d2a71cdafa1c GIT binary patch literal 90646 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

F_V-n@ceLeK1qH_FzUI=Y8_;BG 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𝔘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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/setup-nodejs-cat-owner.png b/docs/assets/uiguide/setup-nodejs-cat-owner.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8effec728ab594f645054c1c66d003eaa6c579 GIT binary patch literal 87521 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

WI^i{c6057ZO!*p$9`+V8r1O* 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/tutorial-component-open-in-catalog.png b/docs/assets/uiguide/tutorial-component-open-in-catalog.png new file mode 100644 index 0000000000000000000000000000000000000000..107974c4374753793616c8b3a90d78843ac25e72 GIT binary patch literal 90202 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 Date: Thu, 6 Nov 2025 11:36:56 -0500 Subject: [PATCH 007/455] Fix image paths in create-a-component documentation Updated image paths for creating a component guide. Changed getting-started to uiguide in path to graphic. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/create-a-component.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/getting-started/create-a-component.md b/docs/getting-started/create-a-component.md index 18f1e81f27..f1b146aa64 100644 --- a/docs/getting-started/create-a-component.md +++ b/docs/getting-started/create-a-component.md @@ -34,28 +34,28 @@ To create the component: 1. Select `Create`. - ![select create for new component](../assets/getting-started/select-create-for-new-component.png) + ![select create for new component](../assets/uiguide/select-create-for-new-component.png) 2. Select `Service` in the `CATEGORIES` dropdown list. 3. Select the `Owner`. For this example, you can select `guest`. 4. Select `Choose` in the `Example Node.js Template`. - ![setup-nodejs-categories-owners](../assets/getting-started/setup-nodejs-cat-owner.png) + ![setup-nodejs-categories-owners](../assets/uiguide/setup-nodejs-cat-owner.png) 5. For this example, enter `tutorial` for the `Name` of the service. and select `NEXT`. - ![enter name of new component](../assets/getting-started/enter-name-of-new-component.png) + ![enter name of new component](../assets/uiguide/enter-name-of-new-component.png) 6. Enter your GitHub user name as the `Owner`. 7. Enter `tutorial` for the `Repository` and select `REVIEW`. - ![select review create component](../assets/getting-started/select-review-create-component.png) + ![select review create component](../assets/uiguide/select-review-create-component.png) 8. Review the information and select `CREATE`. - ![select create to make component](../assets/getting-started/select-create-to-make-component.png) + ![select create to make component](../assets/uiguide/select-create-to-make-component.png) If you see an error message, similar to the following, - ![error creating new component](../assets/getting-started/error-creating-new-component.png) + ![error creating new component](../assets/uiguide/error-creating-new-component.png) Perform the following steps: @@ -72,7 +72,7 @@ Perform the following steps: Otherwise, you can follow along with the progress, and as soon as every step is finished, you can take a look at your new service in either the repository or the catalog. -![run of example of create component](../assets/getting-started/successful-create-new-coponent.png) +![run of example of create component](../assets/uiguide/successful-create-new-coponent.png) Selecting `REPOSITORY` displays the files in the main branch of the new `tutorial` repository. When you created the new `tutorial` component, three files were created in the repository @@ -107,8 +107,8 @@ Selecting `REPOSITORY` displays the files in the main branch of the new `tutoria Selecting `OPEN IN CATALOG` displays details of the new component, such as its relationships, links, and subcomponents. -![select open in catalog](../assets/getting-started/tutorial-component-open-in-catalog.png) +![select open in catalog](../assets/uiguide/tutorial-component-open-in-catalog.png) Selecting `Home` in the sidebar, displays the new `tutorial` component in the catalog. -![new turorial component in software catalog](../assets/getting-started/new-tutorial-component-in-software-catalog.png) +![new turorial component in software catalog](../assets/uiguide/new-tutorial-component-in-software-catalog.png) From bcd7d354548cc57fb9a8053690460775ff658b20 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:38:57 -0500 Subject: [PATCH 008/455] Fix image filename in create-a-component.md Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/create-a-component.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/create-a-component.md b/docs/getting-started/create-a-component.md index f1b146aa64..6996b64501 100644 --- a/docs/getting-started/create-a-component.md +++ b/docs/getting-started/create-a-component.md @@ -72,7 +72,7 @@ Perform the following steps: Otherwise, you can follow along with the progress, and as soon as every step is finished, you can take a look at your new service in either the repository or the catalog. -![run of example of create component](../assets/uiguide/successful-create-new-coponent.png) +![run of example of create component](../assets/uiguide/successful-create-new-component.png) Selecting `REPOSITORY` displays the files in the main branch of the new `tutorial` repository. When you created the new `tutorial` component, three files were created in the repository From 54a11b99c133d433a36fe726d06985cde7746572 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:51:24 -0500 Subject: [PATCH 009/455] Cropped two graphics for clarity Cropped the "enter-url-of-component" and "review-select-import" graphics Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- .../assets/uiguide/enter-url-of-component.png | Bin 76297 -> 13216 bytes docs/assets/uiguide/review-select-import.png | Bin 81061 -> 18295 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/assets/uiguide/enter-url-of-component.png b/docs/assets/uiguide/enter-url-of-component.png index c1cc6c8d502a76aa5377eb61a8c1ccfb91da24c2..29fecb7bfdf30f34b87521883528176deee43880 100644 GIT binary patch literal 13216 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 A3IG5A diff --git a/docs/assets/uiguide/review-select-import.png b/docs/assets/uiguide/review-select-import.png index 8b7816969aecf24163d4cb875390515d6a183d93..bd4a0acd7cbf131aa5d55cfa13f81efdd9356e32 100644 GIT binary patch literal 18295 zcmchBzWO&!QEZn;dgKMxcznC z?{@bau5Sp zuyoQ#8JG8=At43+T=v^~E3K}L`^6=!{w67Qd3dP7wr3lnpw5TYm*?MQ)EF3GR@?1i zJdmK6SP+fPsDc$1YA_QoZ^ZEM@b5CB*WuXY6%#P&t}D)hwwV#N8Bb89WWaueH$C} z@nzVrFQkcQW^i-I63CwMKL6q1bk?8S-GBZ1zVWQP;b-E<|=d?L;>)P1ircZ!lvA|hX@di=J{ zUpOOA+;rY5rzpEhS8f|}fo}xdk1K93vj2!F0}ocuR^BrJg?IyBjRH5;tBl<)Q%2-(cz{oYHCo)4VsvszZ4?7d?x zA5!&|rkKvdriF?p2OKHMbN0F`v*vkhq;Bd<&J))PSLu3t*QI~nqA`5biqIY+WXgOt zwkU?tN+%al2$&^6hoWM*oDLzw&xuNc=)T@I5Hu@m$sMA zY1NJGt=ab$&hA~2w|5PLHph>Q?WZH!F7Ho+zCD3wSBbN;tf0T6+1Eevw?Go*ganb_ zwS5aHWD*uxlBm@(EVp z1`1ms9iHWO5elLm+F(QYAYi+Tnk_dLctY8f>>C7?)Ib)TeU$`OXJ2KEvDea<;9;u!{PkoVrT=u zRc>;+Z(dZPzPTomEZ`#u6CEB^8Q#1l8=r7oI6 z%ZpxmIT~CT9HUCu$HisILR}eUqSI2F+;JcCToDmgHssU{ZSN$QRrh_-R@~++4X?w^ zmfJ^;%-%bs9!}f+;gCCvTI@V6>*9T%oe)s)TI5HTS%>Ugcu=Y7u0vOSGrBN6X(TtT zo?_5Q4y?oUoc!BlcKQp!Qf3Io-)1oIAU)gcl0oQ8+)iW;!s&cl3PntsYqxQFkwL}8 z!V!%VUu_#fA2@?HEDfl-!OL@27I9!!ld;(yd=D3V-n}pL^K9FL9__cEZUvM}`qMIi ztw@FWyjXMNx!*G|q{CQHJFAlr8r)%17&8q7Gv@egAr^WRmkl9;@|J7QTqzD~EAIX0 z8x1W!?~K2{V_lA`iOYnHyM8rTZq*1}_Y^G9`1WY=MCl2Z9tfQdtomr#us+vG_ooAL z9xe|KRQk)UO?$V4eLT0IZ@}-8_+g7|>g;1+kITU_`UETAsDFzq`T9f$i2j+hovHvFnANWkm)oYBa!-43}3@!ej zrib~@=KWs`uu}LNSAt=M&~q3x4Q=wUOh00*T}EbCJ{!+LQ$D5)S(+Y`e9GXyE1|F? z5Pu2{8DPXy()Lw2uWg7ONMp>mIs>Fk7ON(bQ7Hxx1L3p=*ZV)gN+qa+%?Yd& z%>37?NMSKGwVsu>m`iPfSx%TK4}Zi`5U%2r5;)iC@W@^i>ik1O;y=)tK40IoRr1{; zd0fGb{YiRRrR8+lbWG!O#(0feF2>$y?elX8i~b#g7uKk2ikzhafBqIB2ZRLqjP`=< z9gzlkL_=~y%2P6a>FwC(*r;+fi(ur;!OW5crv+n?9?1-Dsj#xnL(HugHSCw_p^v;r zy_|CB-It$;AoVl#>O>hB;-g)fn|ceq1~(&lh28tHkxr-f4x}_K+eqirWL(Ia6SZp{ zR8|dFKB~r-J2~0LM>R(#jKx=Z)2wh3SMS`gu#T~{Rd$S!uK0nxISr4W@8Nn6op@yh z;>9~8>3F(g|D@P$M3}Y4$ID}QAHJR#tp-OZ?i}p0&>{K(J2cO;*u0}@(tp6 zcgFH`R#kiz=E2QJhXFBg4rlIn_4W~Q^)j0yh$30xck|2-nd#l$EmZ%&iKQ3n1MjumdG z>>vk}>W^DLy5^ZVKujR`unszyMvR7rNHBcz-)4DmKW$0sXTRaF*&v#F+PI;xqWrf& z3|T!g5R7Z(+RQv>s-(RL1p*>5dU{TLIraj+Ke*Piy>TlyF&t8wE(C5-6TK3Pl*6j2 zL&Mb*jH;S|uxl+YeF8t9illdJDb%9%a;**VR-m|?tdPy@hK)iOM^vv z;Yix^&1VYio+8QY{3rkE!2C=sB+@-}yC-w4T z`Jkp>rdJIXZZJdkhCnOWhikzDK-nMS^o3Y#Eab1Ap@6uYnxvalxqJk}v9YsC)6;a( zbKA|~yq?fWP<$n>>%I7s1_J91b5m<3T%eX%l_(PG{3pUDZ?1dhi74W|i z#yt(R<`4h0@jJjn>`EXNSYdGkm08JcB2NN|uUI7cX7mp(@cI4L?GVnME_f+gPOnhp zhX350@c1Rzm>+MC<$T8mNDerRbi!NxGQGq+cOQ?R?kmnllkHDEa}FY9uIi>{=`QTwTmZQ*1r_-r zDUM^+3r$q_84mzq5^4<=XKb9_`fn*^)A5)xwWFUHmJHgxrnUeOhi4}Ivh{Vn?xd$j zw^7M{xii$+0cLm%*V}Z{r^usQd?~sfj=*yAnsTFdf4hSH*)^@J&vgn0y<3D^z>3 zpZHAoO;9|+Y(wf>tkx1 z_xQ1m+9EFs)wa(~>6biB6D*u<6S)I96f#B&13$IC6_&jdCHXz{IISUYdMwW4By1sd z$BP4`vlNm1k; z$>LU)5dB<0Na{r$)7fjVg1FP4iK)$j`x)^#=Lx#g%)iWF-V5Hxe2{SqP~X^H4husd z?0thFqZ%Y2hY13nBiibN6oS<8Eh+I`C>nrP-dnH$u&BNI43+bcmWh(yQfmu{%wJB* z&=P39B$iR5)exyNgw(4Vpa8VK%S?R=dwtpUk6Qfdp5J5EgR?N=_u_`oXmPKDP@w-rL*B`sMR@&M4sM9z!hlbnKaZXIJtf8>b*TIf4Yf-5PGx^F@K z97R3dM~9;X$N<)j{UGUh61GK9+Ufn&KwZ!z> zLSC0=`ihHILmyQ(85ocp3=Q)^3?Q|`N~qmWOaNekTr&%s9#K{dk+?dNAuomh20QZ0 zi{&@vTMeaJ;CV*tzZ3%K(t#^^{ACh=cFjxwh&lfY?DjV>`d!Dv{lyf3uU_iY!q4b96g zXV(1=h3fUU_>XJrjss)roZEK5oFnqESy4I)xE6pC5sGr9>qV)B0Ep2{&D^hWpNZ9! z|7=Jgid#>t^*Va;*2zBU@1={r(8X=)$$oQC^5BK{vHwdac#7aI4d5J(jXv4G%nc&5 zFOYtD=ui9skWAP;#~GFf+_45nG>;oQ&g)TkARAN${wAoKCl&W06CQUx?K+QuiNn(n zl*+-A$7x8y#iyS?8wwMlwA1+I6e5d=shEu>TO zTLJnboGzGT)HdQZ32rmdnO?)nz1O|#(KVRvAQ?{>ORm`w*RJ=D##Pe~LQq6^=!8#%2+lLCONxM1Z;<+8U5peI+V-8tQeYqw3@4*YaVv$D93Q3mn>B3RZm zL^fM}eIZ{+Sh3<9?cz8b=!m{EC|&V;q{S48AR6RpInG*CfrWoZJ3dSzs2R$~TMi9z zCLyy8sHn&12sn}=S;(OUXvO{kVMDd^5jw*Y-q%DG^bi-#d_vV|8~;94zN!ai3a5MK zZNMwyWM&}r0}0t=6&4_&#F!_EPTP=yEU3f`EXz!Hny<=I%eVNwuJ5W*i}bWv%-7)ist$Zg}ueB11sSPRH7N? zJa7GHS@hmufNPC*$99{5ov2oSo5EE1a^Hc2uSNi{Cx&?VtQBoEm;x>?L{^Q*#R`Q_ zT{Dhq$qjP@fAN8Xr-f;oJ9Hx95B6&A=H=x_0*_q>XAv!g?;9>uz5rlq<-;M_6lhJr z25Zdedd(RQ?n}pITn0a!GuBeb*iw4G`450Sp_du_^b^?6AK~K8(E)DY|E8i(@fBhT z0Z2o?tS5j#T(7_Zc5);=t+LnCNF@S0>rMX?pN`nJQDvSdFSeuX%nLsybXVvv4XKCe znYU@bqzXQ=%$fQF<)6YVl^FpFb7ZtoLb9S<%9*j=IBT{+1^nwi(za0t*~=t7>WGLZ z{BF$gxU#tc$~@7KE0sUz=`oKsh>&URzt{|)y9*K6X5z&E$a42vb594tgP04NAty8P zLH8N6%n*Mi-_Oc>)anPKAsVy=IirKjToa@@2&_=zDQ+-Wla02M?60$yoDscEL#JsI ztRM&kTjqgPzS5|fPbCP}&COL=`(fjcja5ugR15B$KY}mfQJyL^-&S0Ym54$!$JhA<%ydz z!O9H%x<$G7X{7lU>k7TkCZc~w;poe7mc)a|>`sbtg*+8jRBKRBPFht0?vOVpiB3smQCMim;k zsx$2)Rm@TBfwSM9h*W1fqw2tq+zr3Z@#m`8TkBoQ_B}@vWg|W8^S0LK+^Mb0n%`eb zyX0N>7b?{=ebnAbRMUoaDvi9d4!fp|$6lt~f0mzi`uz0nCEa0F>IvIC^--sUPcn+h zh#!1iw25EgyG4n25=la;T{y|k_ck3ArVUa9s~_; zrv*K5mxu)!HxkDtnWV;KR$Ec;$5%f&HImN;j=;Q~&FvDWDVdFQyR$ZLyT013x{8wp z8~zFiD|5=KLwS~H*Q6z#7Sq6;n=WU1lUQECA+mtGD@IyPv&A1X$Y@QKI8>R_+*hiR zRO<0U%pk9VSYnX=kvgh3CZGElt6$m)M$1T&AJcX#_b0?F16$1hSx?k|4&zA+?!irL zRb|9cKF-9l-i0M@o$uoxO!r~)rWy5~C^hhGCfLdtiq zEOnz97#V3J{zimiyb*>h8<@8!DKD%=V*>;t(}$uUpyQVs!e;gCo^WuXwf zLf$M(WdO0h1(x$>u_)2Zb3}L$L39}iPXOm|D#VG&z)&Q0K%NgQVyT`?DH4Ypz8@25 z+_;%H9h936KFe{g8QKDH42`(L4E#aJWur%-NgOpzpf(fz+a`UzU*RwFy;Q2Q{rCIp zDzY8#X{DK9a4Z~X3xYl~R={U%o#6-)pKWeK(6_jW32gmTZ@_ZImwxCc7gaxdDIkYY zE8|H(IV|M#U2wa5A@Dc#;$=QE69)LB*64nqw3T(reFK6Xrx&MxadM{f`Tg*#ZJD8= zjffuXNuH2R*WsxuSocx=4uCmX(?o4my&aTZyeT4shPDya;R;q~-9&A8;?2|&7u#u# z=eZn?L~ya!*#*SV_rAOQld;8RDZu@tI#S4Vh6TyuT9m-RpTDt}nH|VQ{P7o^l8r80 zR{Lw^-JnUo+YoclG#(FaLwQXPct21(qksiS&ErUoVo##R!o8@t8Y)AMwDw&_XTlF2 ze4-CZu(GsLLm=^dpNy1`jq&-oNj+KzV%g&;awfj*)nVLgT;x;*R{8Bv9I4Ib&TOqi)PIdb*FsF@d*%Bk!+wCljh@OO*CfbeWl<6J^`gnnS?9d2bl&6 zWwZ}oALO@vf8KRWg!cQjNs9EQ`*4|&^fhGTf0QO$DuHR#4=VW$W1r8PBB!2MUG~ak z<|e@mvwfVy*fTM^Z_pg0gBsCzC5s4MSpZ#Ao+_ZUv=o8X2BsU)vyAjKJB3MkEoFT)*pYsX}#gj(b_vVKbmtI%~mHJ`+G+!m`GGpDX>fDvF^6@ki zJeoSC22R!_QP38fFM+9f1eqK^i!i-D1%xmjuQ)j+OtbY%I-mxCl^p|!mq@7p0onae z3#R|g0GB0jf6$zsq2_*(?C{fGdosY@^27A%8I0J>f8?332T(!D0lG!45S5vj%@?D= zyUz$k>GXsAL};0q-Bj1X0L&~?@V4H=6|oOR8R@W#vh#k&w7f8#dDw`M(pZimL z-*9w?bz5zmd3)?YBD3E%euriEt{Gi~MSg;GqnFaW_+=qAE~U zsuk7#yv%$Bf~Rkoh5rHL{HD_i)B8XmLa_>|-!$aHY*Dp)`JKy|y;(@$6S{*sJvr-c zALV9Bj=rj4-q-=Jo%am@MMl+1ie0LnJJKs-8*>tk7bIlgy!a;|iDO48F^}iyt_i)O>>;OeV&TsQW0L-)q|)-@wvu%3FwcA`A|f-XRkYFl zM*eFq1vLVY29X_6TmnaApm4U$CL1d&7Qf^E7Z>t7k9LF+Z@SSmF3jtPr}e0)sMCuv z0fBYTEIAVwds$gd6Y0WBtMKd9b) zaoOPJN>^6P8yj6Li*WTlk@BF$rjcc-NlqKhs4c$(dx+w$#jSqf|*st-{XB=@ZRV2inZQ}Q& z4o}Ur_d|obFLN|2eY|#rT{yuq#dO!3WPTP3U0s&kqxk)WNPbf86wv+nvbmURRqZbg zhQY}%Ueo7l3kDz`E@txIBXD#ucIk+EQMH2e#>#Dmp26g_rJ@rdonV?-Y|uT_t}jtJ zIfxMe^i*Y+5P&)_#iEstVnba8ZUHISO{ z%12Q{ltCMP3R*2fIP00mBLy8YX%;i+ z=zXqn^m;~3AH;Zrs>>?L|AtE-IwSl{Gl~T4B^Q&CKzEGdQPRD(3(g|*CMf9Po0hB( zoU*aaeG-%V*JUbPV~TU@Vp#$qg0Y@#v5#6slyw~)u?cW$g=e)#r5PDdR~6ooQBkPM zozOluoDoSnZU_QTdvdmbuZ6le-S@RX2}4gkJXPtFVH)&1q6eEXY^^4-XdlHFwk^48 zqra+QZg%xOlK{&KRkg=p-bR%lOb~dc6s2gHXI9*gH2ywpx0vbRn}1UQQVx}vE|Kzw z^x2L+MID0{`6-YB7FZdoQPo`T?hZ)kB`xc*(OsdIvn~L_MFL~OYJ14S3zIcBgrSR~ z<&;gHB}2v5vb3vkM=5E0rj?fe$x73a^}LwgGMs@O>3BM_zP-qNNwZ5`S5HSZ4ip$>WmD6t(?LFe(IbQHadYd%%tZ(3 zmSX&^rWX(~pghC?Q53)zV5qdY5W5zjOB~}i7(4sBy$?85_JF1dN6D!2L*#GfK5LYIp1#*2r5F0*vqh$7T-%#baa+G zQ4icNpsNFGg@TX+0Kd5ptW`&$W)I`bC2!aFjBK-;C6;0NGMm00MHKSN+F!(b7PRMb zRYhM-v-Lq=gsF8%EN=FsrF-Z~Qu(J>v1MJ{g6Pby3zh{ z+@tNh9QbOlItLboS#=3}&Ju5p2L<}3US1^#5B$v$H~3#T2#$<48;kcg#`8K z*A^7WB3&qSd0+P;++Cd_0b!Yw%YGTc5R&=D`n+bgeE{LCEU0ob_W{CjRq`sTmV}A{ z%I)6oFXKdZp`s5dRyPW+Q(xqpQnV(Y1sT)hhMa5!MPfftfA&EAL{gALPsC;KyGSW^ z2!g}TY>*%DMZrkl7v~DzlKd#1cxADhJpn;CKcidttIATHfLqE#ZZ# zh_B&N`X`aK*`SZopk-gIOs-xN(U$Zxn4i%~O3HA&w43KNZIwfJ9}WzsO;{wgl^^Qc zk;*?s%{?CiIikLzk5=6^=A>YciXICwkit4BI2Z#l@Owf6n?B6(Y6rGL) z?rXm@3IY230h8F{v}?DyFw+Yk4wW#Z{pGr$Ba*hF)o$W|Q=?0a0MR)iSK4{)Z9ZTa zP-)0&wKra&@!~oK5NIdMhUF7W)EGkc8-T>bvpqX-zX245}D1+&i;wySOI~CQ#sIN3o(&!=sL&8(Y;RnN!EZ=0`jS?W#zr!&Hce* zGBf%WkU6CY&1m5L&{0x$M$>x?qxph*!*O3fL6DP>FIrGm78MF$tRa5%azK`8)Y0hA zhhkE`y4LuwtD>sf=Inb`en8I>0sL%$lg^K2svIS!h-{L z1BF@4pPrt4`^Rm+8yB4Td>3|P2TxSG6&f)5wq!+E`G)Val4D|gBMCS*`UReufZshP zF)_&fqz(6CXDoBS7y^W|tmGezB!0#qSSY)}2?Qyh)XFMZRBgU~3V@YZiO30D@dE$JChha^U{~M5kGgOu%9Fi^2O&IzBORV>{J4W1l9{ zwDJI9s=XbH7LD+i5J+uHaJen~w0q3y&pV%G0e1)(O`L4cMJu|eeK$hyb5c;}#ii5~ z-8>P28Sr&-y!D!>KdUfuzHPoGS|;vOT0}K4dZe=JT6R&x2()fCdVjj`>jnY?{MB$g ze%Wq_{$l9D%Zn7D#~Yg^cg*oRO&zbda(ve&OZU^qqO8Ap>3SD5mebFz-9E;>)&i#{hU_}ZgDi`n!AGLwaKz#RT>0%U1!=L*)r(&c*1*}CZ-IqRO|_iR5~k|5$jKFZbH>&hCp!Gu?0!Bw@Gqx-N*EnR0a z=%K%^kV2cc>W%KwM1SP%uQmCLy!2(ihe{$*uZx_n z_xEn3pu#LeFZp4jHFOwVD*{1BGqD^m4z=NXLdOZB3W5`X5X;4S$y9n^A-dQ2eC2?= z;)NN50KwHua=aIvI6YP;Zyp|AC`<#qocTFd@tA*=W`8$J{Rf@rf2(NyuL?AXzZGVN z=hS9m^0PC5>Oqk5(60>?kMFy(iYBEQ+5&)p(|vLy=crtJ1vkzz?MMpT2$N~l+E$Wo zpPbh@ChyIX{alkh<@ND$c;@3K+|r0puvwm1Q5_`UV`|^QCd+bqu;hd=158y#7jj)Qr@zPpEh(nq0p+7 zc0S##M$38bEB!1j{Uz`;DX{*!gZ2Z;_^5VY)fJ%Xx48#(qLpHjg^`O?A$<(TwLG^2 z+@IGUT<@|6u4CK92nbIFu?X}6Nv`UAN|aV`tfn45|D0R*!!vGl`qG(Kl9o=ziS=C? zKBwsy1nY0Jl=Iv!ApRJ^98j?>XX z0&i75VedRhPt*)=d=eL0FR+e^8IdlaMRlcK0PqMYXh4HLd^yAh%fG8QaO_b?MU!h& z)&btF4mzHO42X5YqHTzjQUnT99Z{}cg5mQpeuo>#6)D#|^*tCj&GAw22aFg*e`7?B zRS%Z(j%PPeCtv`#c{pnLb9?p&q2kEe&=kWjZ1sGDp8M|KMyEm;ht#+2%-Sh;i~ih^Y}2BN$7rJL!!VqdaGaHDlezHS6;xnZ3Z07MPyK zrw~ZcwyLjh`kG)aH7*Chq-`2fZ3%1wK4 zPcWLCV}b+HU#hHl9OTG*$TWVaAzbLYEs@d>id<(yPt$$|?t4b&$bDNB9pp#nT!wd4 zFDf%a^Kf8GXm~%AktYqui2;gsEf8SVld17U4{&;uMxRt1RI%gQY9+&y}u6v!axw%;}PccHRIK7y~=m;a+f&Hko z{(ThlTCkGgC0Tkl_j*KHSFsqyIddjvlnSUUY8USyBsVSA&7sgV*^M=ivqd>_Ws_y| z5YgdPZckO4ozH!m1oRMl9V-V{JyrJ&(=7;&^9Gg9czHNDw{OMz2@hRhMCflwRc6wM z)`fB!v-Pq8g`blb!eFbQ09l6T)g>9D`~)~G0g1a2vSwsJm7X!T6B+d3hw4v`$XdxJ zfi(Ac0<2$yP(G%vp1a49nb3#LYN_Kt9=5HHF(FCsIV%mU$ zGo%IPubl}ur3$lH4N?R{@w|DTNF?&`vGeM?@&YN)D&S7>u!yz;)j2Ag)ZF1=c`9~K z*Yb7?hhagH*xXKsVw7%R=;4*6$QQLc+1Z8)hCHt-q9hR&z-AL%D&h4q>`%O|N-h?7 zb5P8Coz5S@cuxsHhUA4wIRT=TW=HeJ+*}Gm)ZiW`BfMfGS$TTW!CU*yj>iWP zRtblPyiO{m;E$r3IYYIhr);C`N|CG-L$Q%K@s5#E^_xlDnFH`NI z%n|IF-YQUgkTN&=B@+stuPny6?+e_~p4IQz_aIQ_Sa5qgf9v&vImjnpI_ZNXS#%CN zmb6KTXntj`xW?ox)TNsORik0*$=Q&}o}gE`gKToD32YQ-Vi)RE1@Tl2^YYaX)eF+2 z_Tk<3DH@lGvnWQvt3#Y%kcUTJ0iawWYB^rh#2kLhxWaT&ZNy*JVGz(v z5N7vW6wUO&-Bi}Q#W?Gfizcy>G_Rtz)!gU~P)?8oK<@{?lqd$u`MpeJ@9s~jHq|#n z?71x*J{c(5=%R5RkDLm{Z<(S3@6|3SpOBNIsRRm9(6{)%nO1-L-oTMGzZGM3K4u^q z>lIcx6OMkc3)yZrDO{Ux&_bRr;>-q6jYGw zBLBevbbvV}d=Afo_;ASZFa3JDX!0sF-U#XdUFmXji&=19dT=Oct~p4+d>^mt1t@9_ z06|3T{f12DH*C~pWKjf|#848@>jQ)xtg*>x3bbUJ?!un(e;)jl^d#g`k1r^9N0)G{ zc>}t1`lPPG$`?yye$W3&K@_EGte=|{-O@bPBla>bCBqBf(0e@3V4ScE2&A?*%g!Z< zo|_aTl1vk<*)INEPLZRtID9N@TiZ}&$GcZ)+i#9|_6_V5^bk4$;jQh8OKIi3Nn*vt z-Hi*|?9O&F#?P{(Nok4?g$&2xjU7bvZFZ2oN#cjn1AuEbYeU!(<4ZqN7(km?3b}i0c}I{|S?qC!(1~XeK$MveN}UhOWRaZn zho#G#l9>M%_*CqPp=g+Dk)=1$jgyTY)Q8V4#fw$`>h)l zWoA0jl6L9#UuIczoxjrP#vH_lara(DUweg*$=S9kRe4+_juf*;HKO&&2Qk0I_s=Dc ztlt_+PK!;q%M-e5rm&WOGS~H%agtGLu`tSvcG$5qm`}Nq+{HW^llRDsUaJ3k_wJw|`JdvV0(Q?|0|)meF|?na$65b(@X{!;o7vi`k4Fr|{T&HKfx6zDXqfB%8uVG%bsHwQdx=!w1igNl9tu-F{c%|h??-KiDBtNN(ms zj(Rx7KXgfMTpl8K74=rFV{u^Mh5qBnKe`tGRb%CCxFC!CYm2CH$t!^w9%5QOJeS4A z$moMfDZ2(Bd?jt{Ps8avxZ$`Aebq)ou~wJ}@hEZ~0WZ$0WNB_Yhwo-=+|+GG5^i-f zwIFud8dzN3fb)`LgzWY7KqjMUUGxo0en5w4QF#;@;Jz18_|@6zW4wkO+|%fCM&5oi z6>j=CGNdHmv$r+HV{(>j@ipz}+WeZ@B-0vT48JjI6PJY^dot4QIyjW8J@NLg4g z{Yck-g<_^0^sF;})NT&YbtcZ(Op&qfIOdH2I$B5ei@uSk@Uk$Q>NMJ{S0nzwNKQ_c zEKCL74KPGZw^pXH=4@>!?F8LGM*twR%7o$Jv6|4r!df2UlBdx9=f0@_0OdypNI2eN zW?~BGtG1O6LshL5tD%e7O9Eu(MiTAJ)u1)~t0?V5ox-t(L7=B>h1AQgvCJY3!C|{o;i6Vw0d1{L8KQoRmBz$ar325;dAi7z^m& zfxA}WNO{06c~}HP@*D;)tf}T-^iX5v7=21gQxTaB!of;prT8HqgvF@I?jV!~3!yaB z@~M-2D;m|)6~PX(p8Iuns23*rvn>5Jr%gwq=hrWOohf%=SHY*oUD}+dN6M0u0t=p~ zO%0Zv9|$`=b>ou+T#-)<(8mTA8THsHpaK!?Wd~!P{s0mG1bAjk3uW>d{IZ?-&r@ShpDoT+hDZ5 zeEgyq@x_yBMIfXE>HN$z_LAr2L8g`G#gma>0ut!ZWE%1-cxBE>;nAVt#;1J44hNb^ z7o4|xl#ToV? z5p|<8W=fKHWC(J_3y$Xuf-VKE)s@-m%WcmrIQXvdY;s|b!_$JSoY)Nw0;*U}gjLyi zj7WSOv#qoAZlx+4*>5@XSU$d)oaHBAmzv0 zI5if3uAFh#vv#CPl#|otVGdbpB{%za9in11J^OA1oa(dE{hLg0Jx6(eq@xwO>1}t_ z>W2dF+6O|$%MXtoFc{zn_Hh3K63a3G>`6W^BC8g@Z3BxRIzZH2O`r$?u<)k2O42r+ zWv&sys!=|j@w7T8`!}j}zKmxa*x>?rbPZDx8|Gu{o1La_h&w&K@qbOjkn}U;C{>A? z>c#~+x40WP&(a(|-VnKL9}%3@9l41Y0WF!6bVw=t<|!+Hw#jy2?mzq5h1FZ|iXvRV z+fX1{d=a#BbEK_WNPw@Wd~uF_Z3YGCnbF1;n?g(yRKm>Q5~d)GH8gL8i#Th8-X}D& z)5A~jye*JO;B8u!M}U2izXt50DZQ~cqGMk>nvE{ z5hC;U7bS8r_%g?0(I$qx)4_oh3vs5`#rx^*!{43Q`svkZlb(|vqiG=p30+-X z0Vj!1pRlPxAlT>Ea{<)ZUw!NNJpZkRcZ2aXp^1qJn~}#RCGAMFt&}@^fZ=AJo+iyv zHxPpzX|mrT$3m2GWJAV93}kdJcar}sE!~sGWv}n-qLVPQ`PX)FGg6^Q;ZE3nQM=I4`9P(aOUI}^2=*61At>-67U?7V8DlI43- zsVpX_<&7JNbn4a6uWtd40|1=&ri#M@SqKuoEb2Z@TKW0;`p=JduQjj@AX{tQob^7<63}Q=qv84LmxisU!7<`Vj*C^jeLK9Z}WI-+j=#l$?5&f`+8ggpup$> z)fhT71R(wV_}h5~AO63r*Kx$lc~Zw(f~pRlElH_Qm!Hfpaq8=@-KzBor|= z{xC5)nLC6`VwNG`P5f|k(hm?~<>n89q&^%gE>I<^727|7PTvAH;3$Kr4|-y0{GRyy znP{IreG*d*20EV^g8;$!af=}r^#=xU(Pb|`DWVh=a4Ka3mUAG(gB?*=5`29j2zi`_ zv+!R#+J-94Q#?IAx$9{Jf8+8;(LQ*G&8(VRpWSr45CLClcuwb*(Opl8)<>@uaHZ=A z5-90Ci{-W$mP@>4%vh)=knXr=Jf3Ow;10okuEFtsHbo)+Ncb`$4>Xau0_J^U0WXhV zmi$%gf7I+?POmvHApVksIC>dY6gh;O0fFZu88$G#k3jEQ!-^a26|8eYm!HmMyJ1%j zR;qTRjeZ2%cd^iZ>HSI!IsHW)z4xdaYY3q5*<9nHp!@h9zcC|bEgG52VD_eEL5W&~IMeCDNh<&z=3jJX>-e=U7)4h*Og zUK$tbEUuknx%y28rFqp6msz~J>f0ehusG6p7!XoYRGlC2;P9B~Om*x>*f<^cFbX2O{AXa}q*ACQ1@fGa?C0~}@|2me>KQ>q0V!t!3L(FUSWF0=1dD9X+z(`t4wQ>2vv zWVHG1;beaxYX7-jwC-0{)eZ#Gi@_-2mGW>v7H}F2#@~*6LBjp`N;SX-E2jdwn6?vn z5*4606A&5oMYFQhz7f>{LNgGEMOe+L46_n}|IGXj%=q1lz{B}-=o4w-8gOV1NK#Z* Kq+D3f@BaX>KH6{q literal 81061 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%0AKr{=PE>yKH4;NgVq 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 P;N#H)jr&FSo(KI0jD-k% From 5428a1a2f5148013d292d6cbd3525863e7cb82bd Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Tue, 11 Nov 2025 11:00:49 -0500 Subject: [PATCH 010/455] Reorganize Backstage getting started documentation Adding new subheading, "Managing Components" and put Registering a Component and Creating a Component under it. Also added a new Updating a Component page to the section. Added a new UI Overview page before the Managing Components subheading. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- mkdocs.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index 45fdd2c9d6..e799687505 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -37,8 +37,11 @@ nav: - Kubernetes: 'deployment/k8s.md' - Using Backstage: - Logging in: 'getting-started/logging-in.md' - - Register a component: 'getting-started/register-a-component.md' - - Create a component: 'getting-started/create-a-component.md' + - UI overview: 'getting-started/ui-overview.md' + - Managing Components: + - Creating a component: 'getting-started/create-a-component.md' + - Registering a component: 'getting-started/register-a-component.md' + - Updating a component: 'getting-started/'update-a-component.md' - Keeping Backstage Updated: 'getting-started/keeping-backstage-updated.md' - Core Features: - Software Catalog: From 35a138c4b6f20693ea54a6b748cbd7dc5c3e0fb9 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Wed, 12 Nov 2025 08:31:49 -0500 Subject: [PATCH 011/455] Add graphic files for updating a component Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/assets/uiguide/component-name-updated.png | Bin 0 -> 39902 bytes .../uiguide/select-edit-icon-for-component.png | Bin 0 -> 40055 bytes .../uiguide/tutorial-catalog-info-yaml-file.png | Bin 0 -> 38033 bytes .../uiguide/updated-component-name-in-ui.png | Bin 0 -> 40346 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/uiguide/component-name-updated.png create mode 100644 docs/assets/uiguide/select-edit-icon-for-component.png create mode 100644 docs/assets/uiguide/tutorial-catalog-info-yaml-file.png create mode 100644 docs/assets/uiguide/updated-component-name-in-ui.png diff --git a/docs/assets/uiguide/component-name-updated.png b/docs/assets/uiguide/component-name-updated.png new file mode 100644 index 0000000000000000000000000000000000000000..602e2e551a6dfb5e4a4317856b153ed95f7ac37e GIT binary patch literal 39902 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/select-edit-icon-for-component.png b/docs/assets/uiguide/select-edit-icon-for-component.png new file mode 100644 index 0000000000000000000000000000000000000000..04d693259d55c5035781c89d96a8de61b8190168 GIT binary patch literal 40055 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 z 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Ï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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/tutorial-catalog-info-yaml-file.png b/docs/assets/uiguide/tutorial-catalog-info-yaml-file.png new file mode 100644 index 0000000000000000000000000000000000000000..55d3d24baf5193afa3abf75c04552e795aac974a GIT binary patch literal 38033 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 H!GrK0gzA72 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/updated-component-name-in-ui.png b/docs/assets/uiguide/updated-component-name-in-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5a9e564895514c9812bca775b04fa69eedfe02 GIT binary patch literal 40346 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 Date: Wed, 12 Nov 2025 08:34:38 -0500 Subject: [PATCH 012/455] Add update a component New file to describe how to update a component using the Backstage UI. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/update-a-component.md | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 docs/getting-started/update-a-component.md diff --git a/docs/getting-started/update-a-component.md b/docs/getting-started/update-a-component.md new file mode 100644 index 0000000000..f8768c879b --- /dev/null +++ b/docs/getting-started/update-a-component.md @@ -0,0 +1,33 @@ +--- +id: update-a-component +title: Update a Component +description: Update an existing component. +--- + +Audience: Developers + +## Overview + +Components in the software catalog are created using a software template. The template generates a `catalog-info.yaml` file in either GitHub or GitLab that defines the entity. To update the component, you must edit its corresponding `catalog-info.yaml` entity definition file. + +## Updating the component + +To update a component using the Backstage UI: + +1. Select the "Edit" icon associated with the component. In this example, the `tutorial` entity is selected. + + ![select edit icon for component](../assets/uiguide/select-edit-icon-for-component.png) + + The associated `catalog-info.yaml` file is displayed. + + ![tutorial component catalog-info.yaml file](../assets/uiguide/tutorial-catalog-info-yaml-file.png) + +2. Make your changes to the YAML file. In this example, the name of the component is changed to `mytutorial`. + + ![component name updated](../assets/uiguide/component-name-updated.png) + +3. Select `Commit changes` to commit your changes to the appropriate branch and go through your normal PR review procedure. + +4. Once the updated `catalog-info.yaml` file has been merged into the branch associated with the component, then you will see the updated information in the software catalog. + + ![updated component name in ui](../assets/uiguide/updated-component-name-in-ui.png) From 2c9c887bdf3ec09a393b12e964ff3b56f6a27f55 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Wed, 12 Nov 2025 08:51:18 -0500 Subject: [PATCH 013/455] Add link for updating a component in documentation Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/landing-page/doc-landing-page.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/landing-page/doc-landing-page.md b/docs/landing-page/doc-landing-page.md index cb1b889851..bcdb0d6adb 100644 --- a/docs/landing-page/doc-landing-page.md +++ b/docs/landing-page/doc-landing-page.md @@ -35,6 +35,7 @@ description: Documentation landing page.

  • Logging into Backstage
  • Registering a Component
  • Creating a Component
  • +
  • Updating a Component
  • Configuring a Software Template
  • Creating a Software Template
  • Check health of services with Kubernetes
  • From afeb8aaf71ab049535e15aea1ac5bc3d01e3cb88 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 13 Nov 2025 12:32:10 -0500 Subject: [PATCH 014/455] Add new catalog search file Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/search-catalog.md | 71 ++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 docs/getting-started/search-catalog.md diff --git a/docs/getting-started/search-catalog.md b/docs/getting-started/search-catalog.md new file mode 100644 index 0000000000..e66e42a0f6 --- /dev/null +++ b/docs/getting-started/search-catalog.md @@ -0,0 +1,71 @@ +--- +id: search-catalog +title: Searching the Catalog +description: Searching the Catalog. +--- + +Audience: Developers + +## Overview + +The Catalog can be searched by any combination of owner, kind, type, lifecycle, prcoessing status, namespace, and name. + +![Catalog search options](../assets/uiguide/catalog-search-options.png) + +The [Techical Overview](../overview/technical-overview.md) provides greater detail, but the catalog displays two main types of entities: + +- Core Entities + + - `Components` - Individual pieces of software that can be tracked in source control and can implement APIs for other components to consume. + - `APIs` - Implemented by components and form the boundaries between different components. The API can be either public, restricted, or private. + - `Resources` - The physical or virtual infrastructure needed to operate a component. + +- Organizational Entities + - `User` - A person, such as an employee, contractor, or similar. + - `Group` - An organizational entity, such as a team, business unit, and so on. + +There are three additional items that can be part of the system model: + +- `Location` - A marker that references other places to look for catalog data. +- `Type` - It has no set meaning. You can assign your own types and use them as desired. +- `Template` - Describes both the parameters that are rendered in the frontend part of the scaffolding wizard, and the steps that are executed when scaffolding that component. + +## Searching for an entity + +- **Search by name:** + + Enter one or more consecutive letters into the `Filter` field. As you type the letters, the entities whose names do not contain that string will be filtered out of the displayed list. + + ![Search catalog by name](../assets/uiguide/search-by-name.png) + +- **Search by kind:** + + Use the `Kind` dropdown list to select which kind of entity to show in the list: + + - API + - Component + - Group + - Location + - System + - Template + - User + +- **Search by Type:** + + Use the `Type` dropdown list to select which type of entity to show in the list. The selections available in the dropdown list depend on the kind of entity selected in the `Kind` list, and the types of entity you have registered for that kind. + +- **Search by Owner** + + Use the`Owner` dropdown to filter the catalog list by who owns the entity. + +- **Search by Lifecysle** + + Use the `Lifecycle` dropdown to filter the catalog list by lifecycle. + +- **\*Search by Processing Status** + + Use the `Processing Status` dropdown to restrict the displayed list to only include those entities which are [orphaned](../features/software-catalog/life-of-an-entity.md#orphaning) or in error. + +- **Search by Namespace** + + Use the `Namespace` dropdown to filter the catalog list by namespace associated with the entity. From c95d91b99445510e6a0188baaadb60293e9bd8bc Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 13 Nov 2025 12:34:40 -0500 Subject: [PATCH 015/455] Add graphic files for catalog search Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/assets/uiguide/catalog-search-options.png | Bin 0 -> 58746 bytes docs/assets/uiguide/search-by-name.png | Bin 0 -> 11267 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/uiguide/catalog-search-options.png create mode 100644 docs/assets/uiguide/search-by-name.png diff --git a/docs/assets/uiguide/catalog-search-options.png b/docs/assets/uiguide/catalog-search-options.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a85ab1926dd1dd067cced0a8d1e6f51fb8a79f GIT binary patch literal 58746 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
    sWH)Y#k+Pu*TjS-kx849ojtDE^V;ET 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 Date: Thu, 13 Nov 2025 12:43:20 -0500 Subject: [PATCH 016/455] fix formatting issue Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/search-catalog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/getting-started/search-catalog.md b/docs/getting-started/search-catalog.md index e66e42a0f6..8433aed3a7 100644 --- a/docs/getting-started/search-catalog.md +++ b/docs/getting-started/search-catalog.md @@ -62,10 +62,11 @@ There are three additional items that can be part of the system model: Use the `Lifecycle` dropdown to filter the catalog list by lifecycle. -- **\*Search by Processing Status** +- **Search by Processing Status** Use the `Processing Status` dropdown to restrict the displayed list to only include those entities which are [orphaned](../features/software-catalog/life-of-an-entity.md#orphaning) or in error. - **Search by Namespace** Use the `Namespace` dropdown to filter the catalog list by namespace associated with the entity. + From ef4ed48d840d41fd79613c740fe156ecd584b5f2 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 13 Nov 2025 14:28:39 -0500 Subject: [PATCH 017/455] Refactor sidebar to include component management section Added new component management section to include registering, creating, and updating a component. Also added the new search catalog file. All changes are under Using Backstage. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- microsite/sidebars.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/microsite/sidebars.ts b/microsite/sidebars.ts index 9a4f03620f..d54f838c28 100644 --- a/microsite/sidebars.ts +++ b/microsite/sidebars.ts @@ -55,8 +55,16 @@ export default { label: 'Using Backstage', items: [ 'getting-started/logging-in', - 'getting-started/register-a-component', - 'getting-started/create-a-component', + { + type: 'category', + label: 'Managing Components', + items: [ + 'getting-started/register-a-component', + 'getting-started/create-a-component', + 'getting-started/update-a-component', + ], + }, + 'getting-started/search-catalog', ], }, 'overview/support', From 24ce8d8e55c5a2c635eb57aac0de6af1cf1b4e67 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 13 Nov 2025 14:50:12 -0500 Subject: [PATCH 018/455] Refactor component management section in mkdocs.yml Undo changes made to file in the Using Backstage section under Getting Started. Reverted back to master branch version. Made my changes in the sidebars.ts file instead. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- mkdocs.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index e799687505..45fdd2c9d6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -37,11 +37,8 @@ nav: - Kubernetes: 'deployment/k8s.md' - Using Backstage: - Logging in: 'getting-started/logging-in.md' - - UI overview: 'getting-started/ui-overview.md' - - Managing Components: - - Creating a component: 'getting-started/create-a-component.md' - - Registering a component: 'getting-started/register-a-component.md' - - Updating a component: 'getting-started/'update-a-component.md' + - Register a component: 'getting-started/register-a-component.md' + - Create a component: 'getting-started/create-a-component.md' - Keeping Backstage Updated: 'getting-started/keeping-backstage-updated.md' - Core Features: - Software Catalog: From 830b73376bf853f222a320ef7984fbe7b31f7c31 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Wed, 19 Nov 2025 13:09:39 -0500 Subject: [PATCH 019/455] Add new viewing-catalog file to getting started Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/viewing-catalog.md | 121 ++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 docs/getting-started/viewing-catalog.md diff --git a/docs/getting-started/viewing-catalog.md b/docs/getting-started/viewing-catalog.md new file mode 100644 index 0000000000..650d091a59 --- /dev/null +++ b/docs/getting-started/viewing-catalog.md @@ -0,0 +1,121 @@ +--- +id: viewing-catalog +title: Viewing the Catalog +sidebar_label: Viewing the Catalog +description: Viewing the Catalog +--- + +Audience: Developers + +## Overview + +When you first log into your standalone Backstage App, `Home` is selected in the sidebar, which displays the Catalog in the main panel. + +![Screenshot explaining entity actions.](../assets/uiguide/entity-actions.png) + +The [Techical Overview](../overview/technical-overview.md) provides greater detail, but the catalog displays two main kinds of registered entities: + +- **Core Entities** + + - `Components` - Individual pieces of software that can be tracked in source control and can implement APIs for other components to consume. + - `APIs` - Implemented by components and form the boundaries between different components. The API can be either public, restricted, or private. + - `Resources` - The physical or virtual infrastructure needed to operate a component. + +- **Organizational Entities** + - `User` - A person, such as an employee, contractor, or similar. + - `Group` - An organizational entity, such as a team, business unit, and so on. + +There are three additional items that can be part of the system model: + +- `Location` - A marker that references other places to look for catalog data. +- `Type` - It has no set meaning. You can assign your own types and use them as desired. +- `Template` - Describes both the parameters that are rendered in the frontend part of the scaffolding wizard, and the steps that are executed when scaffolding that component. + +It should be noted that you can also [create your own kinds of entities](../features/software-catalog/extending-the-model.md#adding-a-new-kind), if you need to model something in your organization that does not map to one of the existing entity types. + +Initially, the Catalog displays registered entities matching the following filter settings: + +- **Kind** - Component +- **Type** - all +- **Owner** - Owned +- **Lifecycle** - list of lifecycle values of entites in the Catalog +- **Processing Status** - normal +- **Namespace** - The ID of a [namespace](../features/software-catalog/descriptor-format.md#namespace-optional) to which the entity belongs + +You can change the initial setting for each filter. [Catalog Customization](../features/software-catalog/catalog-customization.md) provides additional information. + +## Informational columns for each entity + +For each kind of entity, a set of columns display information regarding the entity. For example, the default set of information for a `Component` is: + +- `Name` - the name of the component +- `System` - an optional field that references the system to which the component belongs +- `Owner` - the owner of the component +- `Type` - common types are as follows, but you can [create a new type](../features/software-catalog/extending-the-model.md#adding-a-new-kind) to meet your organization's needs + - `service` - a backend service, typically exposing an API + - `website` - a website + - `library` - a software library, such as an npm module or a Java library +- `Lifecyle` + - `experimental` - an experiment or early, non-production component, signaling + that users may not prefer to consume it over other more established + components, or that there are low or no reliability guarantees + - `production` - an established, owned, maintained component + - `deprecated` - a component that is at the end of its lifecycle, and may + disappear at a later point in time +- `Description` - an optional field that describes the component. +- `Tags` - an optional field that can be used for searching +- `Actions` - see [Catalog Actions](#catalog-actions) + +You can modify the columns associated with each kind of entity, following the instructions in [Customize Columns](../features/software-catalog/catalog-customization.md#customize-actions). + +## Catalog Actions + +For each entity, there are a set of actions that are available. + +- View - View the `catalog-info.yaml` file that defines the entity. +- Edit - Edit the `catalog-info.yaml` file that defines the entity. See [Updating a Component](../getting-started/uiguide/update-a-component.md) +- Star - Designate the entity as a favorite. You can filter and search for starred entities. + +![Screenshot explaining entity actions.](../assets/uiguide/entity-actions.png) + +[Customize Actions](../features/software-catalog/catalog-customization.md#customize-actions) describes how you can modify the actions that are displayed. + +## Viewing entity details + +Selecting a entity in the main panel displays details of the entity. The type of details depends on the type of entity. For example, selecting a Component, such as `example-website`, displays the following details: + +- About - Metadata for the entity, such as description, owner,tags,and domain. +- Relations - see [Viewing entity relations](#viewing-entitiy-relationships) +- Links - any links associated with the entity +- Has subcomponents - An entity reference to another component of which the component is a part + +Selecting a System, such as `examples`, displays `About`, `Relations`, and `Links` similar to a Component, but it also includes `Has components`, `APIs` and `Has Resources`. + +![Details of system entity.](../assets/uiguide/details-system-entity.png) + +## Viewing what you own + +To view the entities that you own: + +1. Select `Home` in the sidebar. +2. Select `User` in the `Kind` dropdown list. +3. Select your username in the `All Users` list. + +A page is displayed that shows the entities of which you have owenership, either directly, or through a group of which you are a member. You can toggle between showing: + +- `Direct Relations` - entities that you directly own +- `Aggregated Relations` - entities that you own through your group + +![Entities guest user owns.](../assets/uiguide/entities-owned-by-me.png) + +## Viewing entitiy relationships + +Each of the entities in the Catalog have various relationships to each other. For example, the demo data includes an API that provides data to a website. `guests` is the owner of the API and the website, and anyone signed in as part of the `guests` group can maintain them. To see these relationships, select the name of the component in the main panel, in this example, **example-website**. + +![Screenshot of the Backstage portal with example-website selected.](../assets/uiguide/select-example-website.png) + +A page is displayed that includes a **Relations** section. This section displays the selected entity and any other types of entities to which it is related. Each relationship is also designated, such as `hasPart/partOf` and `apiProvidedBy/providesApi`. [Well-known Relations between Catalog Entities](../features/software-catalog/well-known-relations.md) describes the most common relationships but you can also [create your own relationships](../features/software-catalog/extending-the-model.md#adding-a-new-relation-type). + +Selecting any of the related entities allows you to drill down further through the system model. + +![Screenshot of the example-website Relations panel.](../assets/uiguide/example-website-relationships.png) From 826fef5d8f3951a8fa984a844f4f5a05055004bd Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Wed, 19 Nov 2025 13:14:43 -0500 Subject: [PATCH 020/455] Add graphics for viewing catalog doc Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/assets/uiguide/details-system-entity.png | Bin 0 -> 60035 bytes docs/assets/uiguide/entities-owned-by-me.png | Bin 0 -> 63512 bytes docs/assets/uiguide/entity-actions.png | Bin 0 -> 20731 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/uiguide/details-system-entity.png create mode 100644 docs/assets/uiguide/entities-owned-by-me.png create mode 100644 docs/assets/uiguide/entity-actions.png diff --git a/docs/assets/uiguide/details-system-entity.png b/docs/assets/uiguide/details-system-entity.png new file mode 100644 index 0000000000000000000000000000000000000000..c667421603aacad86a470efc6b6eb0c7ec82798a GIT binary patch literal 60035 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/entities-owned-by-me.png b/docs/assets/uiguide/entities-owned-by-me.png new file mode 100644 index 0000000000000000000000000000000000000000..e0dda5e680ad8850bd5884c13755434a2680c0a0 GIT binary patch literal 63512 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 a8<+y Date: Wed, 19 Nov 2025 13:54:20 -0500 Subject: [PATCH 021/455] Revise Viewing the Catalog documentation Updated content and images for the Viewing the Catalog documentation. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/viewing-catalog.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/getting-started/viewing-catalog.md b/docs/getting-started/viewing-catalog.md index 650d091a59..2414e22ebb 100644 --- a/docs/getting-started/viewing-catalog.md +++ b/docs/getting-started/viewing-catalog.md @@ -11,7 +11,7 @@ Audience: Developers When you first log into your standalone Backstage App, `Home` is selected in the sidebar, which displays the Catalog in the main panel. -![Screenshot explaining entity actions.](../assets/uiguide/entity-actions.png) +![Portal with annotations.](../assets/uiguide/portal-with-annotations.png) The [Techical Overview](../overview/technical-overview.md) provides greater detail, but the catalog displays two main kinds of registered entities: @@ -110,12 +110,18 @@ A page is displayed that shows the entities of which you have owenership, either ## Viewing entitiy relationships -Each of the entities in the Catalog have various relationships to each other. For example, the demo data includes an API that provides data to a website. `guests` is the owner of the API and the website, and anyone signed in as part of the `guests` group can maintain them. To see these relationships, select the name of the component in the main panel, in this example, **example-website**. +Each of the entities in the Catalog have various relationships to each other. For example, the demo data includes an API that provides data to a website. `guests` is the owner of the API and the website, and anyone signed in as part of the `guests` group can maintain them. + +To see these relationships: + +1. select the name of the component in the main panel, in this example, **example-website**. + + ![Screenshot of the Backstage portal with example-website selected.](../assets/uiguide/select-example-website.png) -![Screenshot of the Backstage portal with example-website selected.](../assets/uiguide/select-example-website.png) A page is displayed that includes a **Relations** section. This section displays the selected entity and any other types of entities to which it is related. Each relationship is also designated, such as `hasPart/partOf` and `apiProvidedBy/providesApi`. [Well-known Relations between Catalog Entities](../features/software-catalog/well-known-relations.md) describes the most common relationships but you can also [create your own relationships](../features/software-catalog/extending-the-model.md#adding-a-new-relation-type). Selecting any of the related entities allows you to drill down further through the system model. ![Screenshot of the example-website Relations panel.](../assets/uiguide/example-website-relationships.png) + From 2ddb0fe1af6276bddb7a4bb20702cfebbd21a27a Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Wed, 19 Nov 2025 13:56:28 -0500 Subject: [PATCH 022/455] Add additional graphics for viewing catalog doc Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- .../assets/uiguide/portal-with-annotations.png | Bin 0 -> 119110 bytes docs/assets/uiguide/select-example-website.png | Bin 0 -> 47446 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/uiguide/portal-with-annotations.png create mode 100644 docs/assets/uiguide/select-example-website.png diff --git a/docs/assets/uiguide/portal-with-annotations.png b/docs/assets/uiguide/portal-with-annotations.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c9bc535b15c70dbd90b6ea235a3a869d6ff4ea GIT binary patch literal 119110 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�H_ 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�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 Gar<9Z%x4M! literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/select-example-website.png b/docs/assets/uiguide/select-example-website.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f72699eb2ce697050c8795254b14ff4b4b2df2 GIT binary patch literal 47446 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 Date: Wed, 19 Nov 2025 14:01:35 -0500 Subject: [PATCH 023/455] Fixed link to update-component.md file Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/viewing-catalog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/getting-started/viewing-catalog.md b/docs/getting-started/viewing-catalog.md index 2414e22ebb..1c48072268 100644 --- a/docs/getting-started/viewing-catalog.md +++ b/docs/getting-started/viewing-catalog.md @@ -73,7 +73,7 @@ You can modify the columns associated with each kind of entity, following the in For each entity, there are a set of actions that are available. - View - View the `catalog-info.yaml` file that defines the entity. -- Edit - Edit the `catalog-info.yaml` file that defines the entity. See [Updating a Component](../getting-started/uiguide/update-a-component.md) +- Edit - Edit the `catalog-info.yaml` file that defines the entity. See [Updating a Component](../getting-started/update-a-component.md) - Star - Designate the entity as a favorite. You can filter and search for starred entities. ![Screenshot explaining entity actions.](../assets/uiguide/entity-actions.png) @@ -125,3 +125,4 @@ Selecting any of the related entities allows you to drill down further through t ![Screenshot of the example-website Relations panel.](../assets/uiguide/example-website-relationships.png) + From b02b47bf05b2c11f278379b343e8409c35e1a8bd Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:05:57 -0500 Subject: [PATCH 024/455] Add graphic showing relationships section Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- .../uiguide/example-website-relationships.png | Bin 0 -> 17665 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/uiguide/example-website-relationships.png diff --git a/docs/assets/uiguide/example-website-relationships.png b/docs/assets/uiguide/example-website-relationships.png new file mode 100644 index 0000000000000000000000000000000000000000..b4fa6e33c7d20aadba05eef1f157e7ba0cbe6703 GIT binary patch literal 17665 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 G1pOZu%Uc)# literal 0 HcmV?d00001 From 4961d4fd6716dab121c056ccb0be010ed787c64e Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:49:42 -0500 Subject: [PATCH 029/455] Add new documentation links to sidebars for Using Backstage Added new files to the Getting Started > Using Backstage section. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- microsite/sidebars.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/microsite/sidebars.ts b/microsite/sidebars.ts index d54f838c28..10979e9a96 100644 --- a/microsite/sidebars.ts +++ b/microsite/sidebars.ts @@ -55,6 +55,9 @@ export default { label: 'Using Backstage', items: [ 'getting-started/logging-in', + 'viewing-catalog.md', + 'view-what-you-own.md', + 'viewing-entity-relationships.md', { type: 'category', label: 'Managing Components', From 3ded92ada5ce3d76d26eb480199a05402d022270 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:55:58 -0500 Subject: [PATCH 030/455] Add links for viewing and searching the catalog Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/landing-page/doc-landing-page.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/landing-page/doc-landing-page.md b/docs/landing-page/doc-landing-page.md index bcdb0d6adb..eb3f8ab3e6 100644 --- a/docs/landing-page/doc-landing-page.md +++ b/docs/landing-page/doc-landing-page.md @@ -33,9 +33,11 @@ description: Documentation landing page. Configure, Deploy, & Upgrade.

    From db13606feb005c09ec33fc6f271884f585538667 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Wed, 18 Feb 2026 17:36:44 -0500 Subject: [PATCH 159/455] Fix grammatical error in component creation instructions Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/create-a-component.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/create-a-component.md b/docs/getting-started/create-a-component.md index 921a687aca..68dce5753d 100644 --- a/docs/getting-started/create-a-component.md +++ b/docs/getting-started/create-a-component.md @@ -36,7 +36,7 @@ To create the component: ![setup-nodejs-categories-owners](../assets/uiguide/setup-nodejs-cat-owner.png) -5. For this example, enter `tutorial` for the `Name` of the service. and select `NEXT`. +5. For this example, enter `tutorial` for the `Name` of the service and select `NEXT`. ![enter name of new component](../assets/uiguide/enter-name-of-new-component.png) From 85eef526782d3f8b93feab7a70570b6c56e315fd Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 19 Feb 2026 09:51:00 -0500 Subject: [PATCH 160/455] try to fix line endings and prettier errors Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/filter-catalog.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/getting-started/filter-catalog.md b/docs/getting-started/filter-catalog.md index 0696b64ee1..742f982013 100644 --- a/docs/getting-started/filter-catalog.md +++ b/docs/getting-started/filter-catalog.md @@ -28,17 +28,11 @@ You can filter the Catalog using a combination of the following: Use the `Kind` dropdown list to select which kind of entity to show in the list: - API - - Component - - Group - - Location - - System - - Template - - User - **Filter by Type** From 7d99411665cda3b769243b6100ff130fea282976 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 19 Feb 2026 14:18:51 -0500 Subject: [PATCH 161/455] Added space after Direction to fix formatting Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- .../viewing-entity-relationships.md | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/docs/getting-started/viewing-entity-relationships.md b/docs/getting-started/viewing-entity-relationships.md index a5d3496a13..087f86014c 100644 --- a/docs/getting-started/viewing-entity-relationships.md +++ b/docs/getting-started/viewing-entity-relationships.md @@ -12,13 +12,13 @@ To see these relationships: 1. Select the name of the component in the main panel, in this example, `example-website`. - ![Screenshot of the Backstage portal with example-website selected.](../assets/uiguide/select-example-website.png) + ![Screenshot of the Backstage portal with example-website selected.](../assets/uiguide/select-example-website.png) A page is displayed that includes a `Relations` section. This section displays the selected entity and any other types of entities to which it is related. Each relationship is also designated, such as `hasPart/partOf` and `apiProvidedBy/providesApi`. [Well-known Relations between Catalog Entities](../features/software-catalog/well-known-relations.md) describes the most common relationships, but you can also [create your own relationships](../features/software-catalog/extending-the-model.md#adding-a-new-relation-type). 2. Selecting any of the related entities allows you to drill down further through the system model. - ![Screenshot of the example-website Relations panel.](../assets/uiguide/example-website-relationships.png) + ![Screenshot of the example-website Relations panel.](../assets/uiguide/example-website-relationships.png) ## Filtering the relationships @@ -46,30 +46,29 @@ The `Catalog Graph` automatically reflects any changes you make to the filter se - `MAX DEPTH` = 1 ![Max Depth at 1](../assets/uiguide/max-depth-1.png) - + - `MAX DEPTH` = infinite ![Max Depth at infinite](../assets/uiguide/max-depth-infinite.png) - - `KINDS` - select what kinds of entities you want to view, default is all kinds - `RELATIONS` - select which relationships you want to view, default is all relationships -- `Direction`- orientation in which you want to view the entity and its associated nodes +- `Direction` - orientation in which you want to view the entity and its associated nodes - Top to bottom - Bottom to top - Left to right - Right to left - `Curve` - - `Curve` = Monotone ![Curve at Monotone.](../assets/uiguide/curve-monotone.png) - + - `Curve` = Step Before ![Curve at Step Before.](../assets/uiguide/curve-step-before.png) You can also toggle: + - `Simplified` - On = simple view - Off = detailed view @@ -78,18 +77,18 @@ You can also toggle: - Off = You only see relations from the selected entity to its nodes. The following graphics illustrate the view of the nodes and relationships, based on the combination of the settings of `Simplified` and `Merge relations`. - - `Simplified` = On and `Merge Relations` = On + - `Simplified` = On and `Merge Relations` = On - ![Simplified is On and Merge Relations is On.](../assets/uiguide/simplify-on-merge-relations-on.png) + ![Simplified is On and Merge Relations is On.](../assets/uiguide/simplify-on-merge-relations-on.png) - - `Simplified` = On and `Merge Relations` = Off + - `Simplified` = On and `Merge Relations` = Off - ![Simplified is On and Merge Relations is Off.](../assets/uiguide/simplify-on-merge-relations-off.png) + ![Simplified is On and Merge Relations is Off.](../assets/uiguide/simplify-on-merge-relations-off.png) - - `Simplified` = Off and `Merge Relations` = On + - `Simplified` = Off and `Merge Relations` = On - ![Simplified is Off and Merge Relations is On.](../assets/uiguide/simplify-off-merge-relations-on.png) + ![Simplified is Off and Merge Relations is On.](../assets/uiguide/simplify-off-merge-relations-on.png) - - `Simplified` = Off and `Merge Relations` = Off + - `Simplified` = Off and `Merge Relations` = Off - ![Simplified is Off and Merge Relations is Off.](../assets/uiguide/simplify-off-merge-relations-off.png) + ![Simplified is Off and Merge Relations is Off.](../assets/uiguide/simplify-off-merge-relations-off.png) From f0876da49f6a98baa378b28a9e67218f15528d4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 10:35:15 +0100 Subject: [PATCH 162/455] use a structured orderBy for ordering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../catalog-client/src/CatalogClient.test.ts | 12 ++++--- packages/catalog-client/src/CatalogClient.ts | 4 +-- .../QueryEntitiesByPredicateRequest.model.ts | 3 +- ...iesByPredicateRequestOrderByInner.model.ts | 34 +++++++++++++++++++ .../schema/openapi/generated/models/index.ts | 1 + .../catalog-backend/src/schema/openapi.yaml | 15 ++++++-- .../QueryEntitiesByPredicateRequest.model.ts | 3 +- ...iesByPredicateRequestOrderByInner.model.ts | 34 +++++++++++++++++++ .../schema/openapi/generated/models/index.ts | 1 + .../src/schema/openapi/generated/router.ts | 14 ++++++-- .../service/request/parseEntityQuery.test.ts | 14 +++++--- .../src/service/request/parseEntityQuery.ts | 11 +++--- 12 files changed, 122 insertions(+), 24 deletions(-) create mode 100644 packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequestOrderByInner.model.ts create mode 100644 plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequestOrderByInner.model.ts diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index 4ee93c0cba..aee10cd3f2 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -751,9 +751,11 @@ describe('CatalogClient', () => { expect(mockedEndpoint).toHaveBeenCalledTimes(1); }); - it('should send orderFields with correct format (field,order)', async () => { + it('should send orderFields with correct format', async () => { const mockedEndpoint = jest.fn().mockImplementation((req, res, ctx) => { - expect(req.body.orderField).toEqual(['metadata.name,asc']); + expect(req.body.orderBy).toEqual([ + { field: 'metadata.name', order: 'asc' }, + ]); return res(ctx.json(defaultResponse)); }); @@ -769,9 +771,9 @@ describe('CatalogClient', () => { it('should send multiple orderFields with correct format', async () => { const mockedEndpoint = jest.fn().mockImplementation((req, res, ctx) => { - expect(req.body.orderField).toEqual([ - 'metadata.name,asc', - 'spec.type,desc', + expect(req.body.orderBy).toEqual([ + { field: 'metadata.name', order: 'asc' }, + { field: 'spec.type', order: 'desc' }, ]); return res(ctx.json(defaultResponse)); }); diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index 51d57f715e..a6f47933f2 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -368,9 +368,7 @@ export class CatalogClient implements CatalogApi { body.limit = limit; } if (orderFields !== undefined) { - body.orderField = ( - Array.isArray(orderFields) ? orderFields : [orderFields] - ).map(({ field, order }) => `${field},${order}`); + body.orderBy = [orderFields].flat(); } if (fullTextFilter) { body.fullTextFilter = fullTextFilter; diff --git a/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts b/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts index bdcd854a5c..818a780b4a 100644 --- a/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts +++ b/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts @@ -19,6 +19,7 @@ // ****************************************************************** import { QueryEntitiesByPredicateRequestFullTextFilter } from '../models/QueryEntitiesByPredicateRequestFullTextFilter.model'; +import { QueryEntitiesByPredicateRequestOrderByInner } from '../models/QueryEntitiesByPredicateRequestOrderByInner.model'; /** * @public @@ -26,7 +27,7 @@ import { QueryEntitiesByPredicateRequestFullTextFilter } from '../models/QueryEn export interface QueryEntitiesByPredicateRequest { cursor?: string; limit?: number; - orderField?: Array; + orderBy?: Array; fullTextFilter?: QueryEntitiesByPredicateRequestFullTextFilter; fields?: Array; /** diff --git a/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequestOrderByInner.model.ts b/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequestOrderByInner.model.ts new file mode 100644 index 0000000000..373ca9715f --- /dev/null +++ b/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequestOrderByInner.model.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ****************************************************************** +// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. * +// ****************************************************************** + +/** + * @public + */ +export interface QueryEntitiesByPredicateRequestOrderByInner { + field: string; + order: QueryEntitiesByPredicateRequestOrderByInnerOrderEnum; +} + +/** + * @public + */ +export type QueryEntitiesByPredicateRequestOrderByInnerOrderEnum = + | 'asc' + | 'desc'; diff --git a/packages/catalog-client/src/schema/openapi/generated/models/index.ts b/packages/catalog-client/src/schema/openapi/generated/models/index.ts index 889b5968fa..9461ac8d28 100644 --- a/packages/catalog-client/src/schema/openapi/generated/models/index.ts +++ b/packages/catalog-client/src/schema/openapi/generated/models/index.ts @@ -47,6 +47,7 @@ export * from '../models/ModelError.model'; export * from '../models/NullableEntity.model'; export * from '../models/QueryEntitiesByPredicateRequest.model'; export * from '../models/QueryEntitiesByPredicateRequestFullTextFilter.model'; +export * from '../models/QueryEntitiesByPredicateRequestOrderByInner.model'; export * from '../models/RecursivePartialEntity.model'; export * from '../models/RecursivePartialEntityMeta.model'; export * from '../models/RecursivePartialEntityMetaAllOf.model'; diff --git a/plugins/catalog-backend/src/schema/openapi.yaml b/plugins/catalog-backend/src/schema/openapi.yaml index f44ac026e4..41738c1148 100644 --- a/plugins/catalog-backend/src/schema/openapi.yaml +++ b/plugins/catalog-backend/src/schema/openapi.yaml @@ -1125,10 +1125,21 @@ paths: type: string limit: type: number - orderField: + orderBy: type: array items: - type: string + type: object + required: + - field + - order + properties: + field: + type: string + order: + type: string + enum: + - asc + - desc fullTextFilter: type: object properties: diff --git a/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts b/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts index bdcd854a5c..818a780b4a 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts @@ -19,6 +19,7 @@ // ****************************************************************** import { QueryEntitiesByPredicateRequestFullTextFilter } from '../models/QueryEntitiesByPredicateRequestFullTextFilter.model'; +import { QueryEntitiesByPredicateRequestOrderByInner } from '../models/QueryEntitiesByPredicateRequestOrderByInner.model'; /** * @public @@ -26,7 +27,7 @@ import { QueryEntitiesByPredicateRequestFullTextFilter } from '../models/QueryEn export interface QueryEntitiesByPredicateRequest { cursor?: string; limit?: number; - orderField?: Array; + orderBy?: Array; fullTextFilter?: QueryEntitiesByPredicateRequestFullTextFilter; fields?: Array; /** diff --git a/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequestOrderByInner.model.ts b/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequestOrderByInner.model.ts new file mode 100644 index 0000000000..373ca9715f --- /dev/null +++ b/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequestOrderByInner.model.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ****************************************************************** +// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. * +// ****************************************************************** + +/** + * @public + */ +export interface QueryEntitiesByPredicateRequestOrderByInner { + field: string; + order: QueryEntitiesByPredicateRequestOrderByInnerOrderEnum; +} + +/** + * @public + */ +export type QueryEntitiesByPredicateRequestOrderByInnerOrderEnum = + | 'asc' + | 'desc'; diff --git a/plugins/catalog-backend/src/schema/openapi/generated/models/index.ts b/plugins/catalog-backend/src/schema/openapi/generated/models/index.ts index 889b5968fa..9461ac8d28 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/models/index.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/models/index.ts @@ -47,6 +47,7 @@ export * from '../models/ModelError.model'; export * from '../models/NullableEntity.model'; export * from '../models/QueryEntitiesByPredicateRequest.model'; export * from '../models/QueryEntitiesByPredicateRequestFullTextFilter.model'; +export * from '../models/QueryEntitiesByPredicateRequestOrderByInner.model'; export * from '../models/RecursivePartialEntity.model'; export * from '../models/RecursivePartialEntityMeta.model'; export * from '../models/RecursivePartialEntityMetaAllOf.model'; diff --git a/plugins/catalog-backend/src/schema/openapi/generated/router.ts b/plugins/catalog-backend/src/schema/openapi/generated/router.ts index 86ddeddf61..ed9536d6b9 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/router.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/router.ts @@ -1269,10 +1269,20 @@ export const spec = { limit: { type: 'number', }, - orderField: { + orderBy: { type: 'array', items: { - type: 'string', + type: 'object', + required: ['field', 'order'], + properties: { + field: { + type: 'string', + }, + order: { + type: 'string', + enum: ['asc', 'desc'], + }, + }, }, }, fullTextFilter: { diff --git a/plugins/catalog-backend/src/service/request/parseEntityQuery.test.ts b/plugins/catalog-backend/src/service/request/parseEntityQuery.test.ts index 8b6d1c21b7..b95c4c6c0e 100644 --- a/plugins/catalog-backend/src/service/request/parseEntityQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/parseEntityQuery.test.ts @@ -77,9 +77,12 @@ describe('parseEntityQuery', () => { ); }); - it('parses orderField into orderFields', () => { + it('parses orderBy into orderFields', () => { const result = parseEntityQuery({ - orderField: ['metadata.name,asc', 'metadata.namespace,desc'], + orderBy: [ + { field: 'metadata.name', order: 'asc' }, + { field: 'metadata.namespace', order: 'desc' }, + ], }); expect(result).toEqual( expect.objectContaining({ @@ -128,9 +131,12 @@ describe('parseEntityQuery', () => { ); }); - it('throws on invalid orderField order value', () => { + it('throws on invalid orderBy order value', () => { expect(() => - parseEntityQuery({ orderField: ['metadata.name,sideways'] }), + parseEntityQuery({ + // @ts-expect-error - invalid order value + orderBy: [{ field: 'metadata.name', order: 'sideways' }], + }), ).toThrow(/Invalid order field order/); }); }); diff --git a/plugins/catalog-backend/src/service/request/parseEntityQuery.ts b/plugins/catalog-backend/src/service/request/parseEntityQuery.ts index 5ad505b8a1..c33492e740 100644 --- a/plugins/catalog-backend/src/service/request/parseEntityQuery.ts +++ b/plugins/catalog-backend/src/service/request/parseEntityQuery.ts @@ -41,17 +41,16 @@ function isSupportedFilterPredicateRoot( } function parseOrderFields( - orderField: string[] | undefined, + orderField: Array<{ field: string; order: string }> | undefined, ): EntityOrder[] | undefined { if (!orderField?.length) { return undefined; } - return orderField.map(entry => { - const [field, order] = entry.split(','); - if (order !== undefined && order !== 'asc' && order !== 'desc') { + return orderField.map(({ field, order }) => { + if (order !== 'asc' && order !== 'desc') { throw new InputError('Invalid order field order, must be asc or desc'); } - return { field, order: order as 'asc' | 'desc' }; + return { field, order }; }); } @@ -98,7 +97,7 @@ export function parseEntityQuery( query = result.data; } - const orderFields = parseOrderFields(request.orderField); + const orderFields = parseOrderFields(request.orderBy); return { query, From f076495eea5bdf960a250251ccc7a4acd90db327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 10:48:44 +0100 Subject: [PATCH 163/455] add todo about cursor introspection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/CatalogClient.ts | 34 +++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index a6f47933f2..fa8a88c1ca 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -53,6 +53,7 @@ import { } from './utils'; import { DefaultApiClient, + GetEntitiesByQuery, GetLocationsByQueryRequest, QueryEntitiesByPredicateRequest, TypedResponse, @@ -271,35 +272,33 @@ export class CatalogClient implements CatalogApi { request: QueryEntitiesRequest = {}, options?: CatalogRequestOptions, ): Promise { + const isInitialRequest = isQueryEntitiesInitialRequest(request); + // Validate that filter and query are mutually exclusive - if ( - isQueryEntitiesInitialRequest(request) && - request.filter && - request.query - ) { + if (isInitialRequest && request.filter && request.query) { throw new Error( 'Cannot specify both "filter" and "query" in the same request. Use "filter" for traditional key-value filtering or "query" for predicate-based filtering.', ); } // Route to POST endpoint if query predicate is provided (initial request) - if (isQueryEntitiesInitialRequest(request) && request.query) { + if (isInitialRequest && request.query) { return this.queryEntitiesByPredicate(request, options); } // Route to POST endpoint if cursor contains a query predicate (pagination) - if ( - !isQueryEntitiesInitialRequest(request) && - cursorContainsQuery(request.cursor) - ) { + // TODO(freben): It's costly and non-opaque to have to introspect the cursor + // like this. It should be refactored in the future to not need this. + // Suggestion: make the GET and POST endpoints understand the same cursor + // format, and pick which one to call ONLY based on whether the cursor size + // risks hitting url length limits + if (!isInitialRequest && cursorContainsQuery(request.cursor)) { return this.queryEntitiesByPredicate(request, options); } - const params: Partial< - Parameters[0]['query'] - > = {}; + const params: Partial = {}; - if (isQueryEntitiesInitialRequest(request)) { + if (isInitialRequest) { const { fields = [], filter, @@ -357,7 +356,7 @@ export class CatalogClient implements CatalogApi { request: QueryEntitiesRequest, options?: CatalogRequestOptions, ): Promise { - const body: Record = {}; + const body: QueryEntitiesByPredicateRequest = {}; if (isQueryEntitiesInitialRequest(request)) { const { query, limit, orderFields, fullTextFilter, fields } = request; @@ -387,10 +386,7 @@ export class CatalogClient implements CatalogApi { } const res = await this.requestRequired( - await this.apiClient.queryEntitiesByPredicate( - { body: body as unknown as QueryEntitiesByPredicateRequest }, - options, - ), + await this.apiClient.queryEntitiesByPredicate({ body }, options), ); return { From f3b3b1dafb8eddc77f0506b2bf949a9c9568bab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 10:55:24 +0100 Subject: [PATCH 164/455] implement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../applyPredicateEntityFilterToQuery.test.ts | 12 +++++++++++ .../applyPredicateEntityFilterToQuery.ts | 21 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts index 63b0bb9b24..2f216fd219 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts @@ -181,6 +181,18 @@ describe.each(databases.eachSupportedId())( ).resolves.toEqual(['bare-e']); }); + it('filters with $hasPrefix', async () => { + await expect( + query({ 'metadata.name': { $hasPrefix: 'service' } }), + ).resolves.toEqual(['service-a', 'service-b']); + }); + + it('filters with $hasPrefix case-insensitively', async () => { + await expect( + query({ 'metadata.name': { $hasPrefix: 'Service' } }), + ).resolves.toEqual(['service-a', 'service-b']); + }); + it('handles nested logical operators', async () => { await expect( query({ diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index db39a2195a..d077bd1460 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -61,6 +61,12 @@ function isInValue( return typeof value === 'object' && value !== null && '$in' in value; } +function isHasPrefixValue( + value: FilterPredicateValue, +): value is { $hasPrefix: string } { + return typeof value === 'object' && value !== null && '$hasPrefix' in value; +} + function isFieldExpression(filter: FilterPredicate): boolean { if (typeof filter !== 'object' || filter === null) { return false; @@ -202,6 +208,19 @@ function applyPredicateInStrategy( .where({ key: normalizedKey }) .whereIn('value', values); this.andWhere(onEntityIdField, 'in', matchQuery); + } else if (isHasPrefixValue(value)) { + // Handle $hasPrefix + const prefix = value.$hasPrefix.toLowerCase(); + const escaped = prefix.replace(/[%_\\]/g, c => `\\${c}`); + const matchQuery = knex('search') + .select('search.entity_id') + .where({ key: normalizedKey }) + .andWhereRaw('?? like ? escape ?', [ + 'value', + `${escaped}%`, + '\\', + ]); + this.andWhere(onEntityIdField, 'in', matchQuery); } else if (isPrimitive(value)) { // Handle direct value match const matchQuery = knex('search') @@ -214,7 +233,7 @@ function applyPredicateInStrategy( } else { // Reject unsupported/invalid predicate values throw new InputError( - `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, or $in operator, but got ${JSON.stringify( + `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, or $hasPrefix operator, but got ${JSON.stringify( value, )}`, ); From 02443480b3f22752d2e4d11f7dbe642514f1bdfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 10:56:31 +0100 Subject: [PATCH 165/455] locale lowercase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../request/applyPredicateEntityFilterToQuery.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index d077bd1460..91b29b6ce1 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -187,7 +187,7 @@ function applyPredicateInStrategy( return targetQuery[negate ? 'andWhereNot' : 'andWhere']( function fieldFilter() { for (const [key, value] of Object.entries(filter)) { - const normalizedKey = key.toLowerCase(); + const normalizedKey = key.toLocaleLowerCase('en-US'); if (isExistsValue(value)) { // Handle $exists @@ -202,7 +202,9 @@ function applyPredicateInStrategy( } } else if (isInValue(value)) { // Handle $in - const values = value.$in.map(v => String(v).toLowerCase()); + const values = value.$in.map(v => + String(v).toLocaleLowerCase('en-US'), + ); const matchQuery = knex('search') .select('search.entity_id') .where({ key: normalizedKey }) @@ -210,7 +212,7 @@ function applyPredicateInStrategy( this.andWhere(onEntityIdField, 'in', matchQuery); } else if (isHasPrefixValue(value)) { // Handle $hasPrefix - const prefix = value.$hasPrefix.toLowerCase(); + const prefix = value.$hasPrefix.toLocaleLowerCase('en-US'); const escaped = prefix.replace(/[%_\\]/g, c => `\\${c}`); const matchQuery = knex('search') .select('search.entity_id') @@ -227,7 +229,7 @@ function applyPredicateInStrategy( .select('search.entity_id') .where({ key: normalizedKey, - value: String(value).toLowerCase(), + value: String(value).toLocaleLowerCase('en-US'), }); this.andWhere(onEntityIdField, 'in', matchQuery); } else { From fa4e24d75265bc3267815f82cc87e887f08dd741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 11:04:28 +0100 Subject: [PATCH 166/455] remove the unnecessary inversion boolean MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../applyPredicateEntityFilterToQuery.ts | 200 ++++++++---------- 1 file changed, 86 insertions(+), 114 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index 91b29b6ce1..eb6e65604a 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -115,60 +115,55 @@ function isFieldExpression(filter: FilterPredicate): boolean { * ``` */ -function applyPredicateInStrategy( - filter: FilterPredicate, - targetQuery: Knex.QueryBuilder, - onEntityIdField: string, - knex: Knex, - negate: boolean, -): Knex.QueryBuilder { +export function applyPredicateEntityFilterToQuery(options: { + filter: FilterPredicate; + targetQuery: Knex.QueryBuilder; + onEntityIdField: string; + knex: Knex; +}): Knex.QueryBuilder { + const { filter, targetQuery, onEntityIdField, knex } = options; // Handle $not if (isNotPredicate(filter)) { - return applyPredicateInStrategy( - filter.$not, - targetQuery, - onEntityIdField, - knex, - !negate, + return targetQuery.andWhereNot(subQuery => + applyPredicateEntityFilterToQuery({ + filter: filter.$not, + targetQuery: subQuery, + onEntityIdField, + knex, + }), ); } // Handle $all (AND) if (isAllPredicate(filter)) { - return targetQuery[negate ? 'andWhereNot' : 'andWhere']( - function allFilter() { - for (const subFilter of filter.$all) { - this.andWhere(subQuery => - applyPredicateInStrategy( - subFilter, - subQuery, - onEntityIdField, - knex, - false, - ), - ); - } - }, - ); + return targetQuery.andWhere(function allFilter() { + for (const subFilter of filter.$all) { + this.andWhere(subQuery => + applyPredicateEntityFilterToQuery({ + filter: subFilter, + targetQuery: subQuery, + onEntityIdField, + knex, + }), + ); + } + }); } // Handle $any (OR) if (isAnyPredicate(filter)) { - return targetQuery[negate ? 'andWhereNot' : 'andWhere']( - function anyFilter() { - for (const subFilter of filter.$any) { - this.orWhere(subQuery => - applyPredicateInStrategy( - subFilter, - subQuery, - onEntityIdField, - knex, - false, - ), - ); - } - }, - ); + return targetQuery.andWhere(function anyFilter() { + for (const subFilter of filter.$any) { + this.orWhere(subQuery => + applyPredicateEntityFilterToQuery({ + filter: subFilter, + targetQuery: subQuery, + onEntityIdField, + knex, + }), + ); + } + }); } // Reject primitives at the top level. Matching by value without specifying @@ -184,83 +179,60 @@ function applyPredicateInStrategy( // Handle field expressions like { "kind": "component" } or { "spec.type": { "$in": ["service", "website"] } } if (isFieldExpression(filter)) { - return targetQuery[negate ? 'andWhereNot' : 'andWhere']( - function fieldFilter() { - for (const [key, value] of Object.entries(filter)) { - const normalizedKey = key.toLocaleLowerCase('en-US'); + return targetQuery.andWhere(function fieldFilter() { + for (const [key, value] of Object.entries(filter)) { + const normalizedKey = key.toLocaleLowerCase('en-US'); - if (isExistsValue(value)) { - // Handle $exists - const existsQuery = knex('search') - .select('search.entity_id') - .where({ key: normalizedKey }); + if (isExistsValue(value)) { + // Handle $exists + const existsQuery = knex('search') + .select('search.entity_id') + .where({ key: normalizedKey }); - if (value.$exists) { - this.andWhere(onEntityIdField, 'in', existsQuery); - } else { - this.andWhere(onEntityIdField, 'not in', existsQuery); - } - } else if (isInValue(value)) { - // Handle $in - const values = value.$in.map(v => - String(v).toLocaleLowerCase('en-US'), - ); - const matchQuery = knex('search') - .select('search.entity_id') - .where({ key: normalizedKey }) - .whereIn('value', values); - this.andWhere(onEntityIdField, 'in', matchQuery); - } else if (isHasPrefixValue(value)) { - // Handle $hasPrefix - const prefix = value.$hasPrefix.toLocaleLowerCase('en-US'); - const escaped = prefix.replace(/[%_\\]/g, c => `\\${c}`); - const matchQuery = knex('search') - .select('search.entity_id') - .where({ key: normalizedKey }) - .andWhereRaw('?? like ? escape ?', [ - 'value', - `${escaped}%`, - '\\', - ]); - this.andWhere(onEntityIdField, 'in', matchQuery); - } else if (isPrimitive(value)) { - // Handle direct value match - const matchQuery = knex('search') - .select('search.entity_id') - .where({ - key: normalizedKey, - value: String(value).toLocaleLowerCase('en-US'), - }); - this.andWhere(onEntityIdField, 'in', matchQuery); + if (value.$exists) { + this.andWhere(onEntityIdField, 'in', existsQuery); } else { - // Reject unsupported/invalid predicate values - throw new InputError( - `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, or $hasPrefix operator, but got ${JSON.stringify( - value, - )}`, - ); + this.andWhere(onEntityIdField, 'not in', existsQuery); } + } else if (isInValue(value)) { + // Handle $in + const values = value.$in.map(v => + String(v).toLocaleLowerCase('en-US'), + ); + const matchQuery = knex('search') + .select('search.entity_id') + .where({ key: normalizedKey }) + .whereIn('value', values); + this.andWhere(onEntityIdField, 'in', matchQuery); + } else if (isHasPrefixValue(value)) { + // Handle $hasPrefix + const prefix = value.$hasPrefix.toLocaleLowerCase('en-US'); + const escaped = prefix.replace(/[%_\\]/g, c => `\\${c}`); + const matchQuery = knex('search') + .select('search.entity_id') + .where({ key: normalizedKey }) + .andWhereRaw('?? like ? escape ?', ['value', `${escaped}%`, '\\']); + this.andWhere(onEntityIdField, 'in', matchQuery); + } else if (isPrimitive(value)) { + // Handle direct value match + const matchQuery = knex('search') + .select('search.entity_id') + .where({ + key: normalizedKey, + value: String(value).toLocaleLowerCase('en-US'), + }); + this.andWhere(onEntityIdField, 'in', matchQuery); + } else { + // Reject unsupported/invalid predicate values + throw new InputError( + `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, or $hasPrefix operator, but got ${JSON.stringify( + value, + )}`, + ); } - }, - ); + } + }); } return targetQuery; } - -export function applyPredicateEntityFilterToQuery(options: { - filter: FilterPredicate; - targetQuery: Knex.QueryBuilder; - onEntityIdField: string; - knex: Knex; -}): Knex.QueryBuilder { - const { filter, targetQuery, onEntityIdField, knex } = options; - - return applyPredicateInStrategy( - filter, - targetQuery, - onEntityIdField, - knex, - false, - ); -} From b218fb07df3c5475e0dc50d4db2078a756c446c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 11:30:45 +0100 Subject: [PATCH 167/455] arrow functions and simplify MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../applyPredicateEntityFilterToQuery.test.ts | 18 ++ .../applyPredicateEntityFilterToQuery.ts | 265 ++++++++---------- 2 files changed, 141 insertions(+), 142 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts index 2f216fd219..21e5d2c37a 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts @@ -116,6 +116,16 @@ describe.each(databases.eachSupportedId())( ); } + it('matches everything for empty field expression', async () => { + await expect(query({})).resolves.toEqual([ + 'api-d', + 'bare-e', + 'service-a', + 'service-b', + 'website-c', + ]); + }); + it('filters by direct field value', async () => { await expect(query({ kind: 'component' })).resolves.toEqual([ 'bare-e', @@ -140,6 +150,10 @@ describe.each(databases.eachSupportedId())( ).resolves.toEqual(['service-a', 'service-b']); }); + it('returns nothing for empty $all', async () => { + await expect(query({ $all: [] })).resolves.toEqual([]); + }); + it('filters with $any', async () => { await expect( query({ @@ -148,6 +162,10 @@ describe.each(databases.eachSupportedId())( ).resolves.toEqual(['service-a', 'service-b', 'website-c']); }); + it('returns nothing for empty $any', async () => { + await expect(query({ $any: [] })).resolves.toEqual([]); + }); + it('filters with $not', async () => { await expect( query({ diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index eb6e65604a..88b064866d 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -23,24 +23,6 @@ import { InputError } from '@backstage/errors'; import { Knex } from 'knex'; import { DbSearchRow } from '../../database/tables'; -function isAllPredicate( - filter: FilterPredicate, -): filter is { $all: FilterPredicate[] } { - return typeof filter === 'object' && filter !== null && '$all' in filter; -} - -function isAnyPredicate( - filter: FilterPredicate, -): filter is { $any: FilterPredicate[] } { - return typeof filter === 'object' && filter !== null && '$any' in filter; -} - -function isNotPredicate( - filter: FilterPredicate, -): filter is { $not: FilterPredicate } { - return typeof filter === 'object' && filter !== null && '$not' in filter; -} - function isPrimitive(value: unknown): value is FilterPredicatePrimitive { return ( typeof value === 'string' || @@ -49,30 +31,8 @@ function isPrimitive(value: unknown): value is FilterPredicatePrimitive { ); } -function isExistsValue( - value: FilterPredicateValue, -): value is { $exists: boolean } { - return typeof value === 'object' && value !== null && '$exists' in value; -} - -function isInValue( - value: FilterPredicateValue, -): value is { $in: FilterPredicatePrimitive[] } { - return typeof value === 'object' && value !== null && '$in' in value; -} - -function isHasPrefixValue( - value: FilterPredicateValue, -): value is { $hasPrefix: string } { - return typeof value === 'object' && value !== null && '$hasPrefix' in value; -} - -function isFieldExpression(filter: FilterPredicate): boolean { - if (typeof filter !== 'object' || filter === null) { - return false; - } - // Not a logical operator - return !('$all' in filter || '$any' in filter || '$not' in filter); +function isObject(value: unknown): value is Record { + return typeof value === 'object' && value !== null && !Array.isArray(value); } /** @@ -114,7 +74,6 @@ function isFieldExpression(filter: FilterPredicate): boolean { * ORDER BY final_entities.entity_ref ASC; * ``` */ - export function applyPredicateEntityFilterToQuery(options: { filter: FilterPredicate; targetQuery: Knex.QueryBuilder; @@ -122,53 +81,9 @@ export function applyPredicateEntityFilterToQuery(options: { knex: Knex; }): Knex.QueryBuilder { const { filter, targetQuery, onEntityIdField, knex } = options; - // Handle $not - if (isNotPredicate(filter)) { - return targetQuery.andWhereNot(subQuery => - applyPredicateEntityFilterToQuery({ - filter: filter.$not, - targetQuery: subQuery, - onEntityIdField, - knex, - }), - ); - } - // Handle $all (AND) - if (isAllPredicate(filter)) { - return targetQuery.andWhere(function allFilter() { - for (const subFilter of filter.$all) { - this.andWhere(subQuery => - applyPredicateEntityFilterToQuery({ - filter: subFilter, - targetQuery: subQuery, - onEntityIdField, - knex, - }), - ); - } - }); - } - - // Handle $any (OR) - if (isAnyPredicate(filter)) { - return targetQuery.andWhere(function anyFilter() { - for (const subFilter of filter.$any) { - this.orWhere(subQuery => - applyPredicateEntityFilterToQuery({ - filter: subFilter, - targetQuery: subQuery, - onEntityIdField, - knex, - }), - ); - } - }); - } - - // Reject primitives at the top level. Matching by value without specifying - // a field key is ambiguous and should not be allowed. - if (isPrimitive(filter)) { + // We do not support top-level primitives; all matching happens through objects + if (!filter || typeof filter !== 'object' || Array.isArray(filter)) { throw new InputError( `Invalid filter predicate: top-level primitive values are not supported. ` + `Wrap the value in a field expression, e.g. { "kind": ${JSON.stringify( @@ -177,62 +92,128 @@ export function applyPredicateEntityFilterToQuery(options: { ); } - // Handle field expressions like { "kind": "component" } or { "spec.type": { "$in": ["service", "website"] } } - if (isFieldExpression(filter)) { - return targetQuery.andWhere(function fieldFilter() { - for (const [key, value] of Object.entries(filter)) { - const normalizedKey = key.toLocaleLowerCase('en-US'); + if ('$not' in filter) { + return targetQuery.andWhereNot(inner => + applyPredicateEntityFilterToQuery({ + filter: filter.$not, + targetQuery: inner, + onEntityIdField, + knex, + }), + ); + } - if (isExistsValue(value)) { - // Handle $exists - const existsQuery = knex('search') - .select('search.entity_id') - .where({ key: normalizedKey }); - - if (value.$exists) { - this.andWhere(onEntityIdField, 'in', existsQuery); - } else { - this.andWhere(onEntityIdField, 'not in', existsQuery); - } - } else if (isInValue(value)) { - // Handle $in - const values = value.$in.map(v => - String(v).toLocaleLowerCase('en-US'), - ); - const matchQuery = knex('search') - .select('search.entity_id') - .where({ key: normalizedKey }) - .whereIn('value', values); - this.andWhere(onEntityIdField, 'in', matchQuery); - } else if (isHasPrefixValue(value)) { - // Handle $hasPrefix - const prefix = value.$hasPrefix.toLocaleLowerCase('en-US'); - const escaped = prefix.replace(/[%_\\]/g, c => `\\${c}`); - const matchQuery = knex('search') - .select('search.entity_id') - .where({ key: normalizedKey }) - .andWhereRaw('?? like ? escape ?', ['value', `${escaped}%`, '\\']); - this.andWhere(onEntityIdField, 'in', matchQuery); - } else if (isPrimitive(value)) { - // Handle direct value match - const matchQuery = knex('search') - .select('search.entity_id') - .where({ - key: normalizedKey, - value: String(value).toLocaleLowerCase('en-US'), - }); - this.andWhere(onEntityIdField, 'in', matchQuery); - } else { - // Reject unsupported/invalid predicate values - throw new InputError( - `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, or $hasPrefix operator, but got ${JSON.stringify( - value, - )}`, - ); - } + if ('$all' in filter) { + if (filter.$all.length === 0) { + return targetQuery.andWhereRaw('1 = 0'); + } + return targetQuery.andWhere(outer => { + for (const subFilter of filter.$all) { + outer.andWhere(inner => + applyPredicateEntityFilterToQuery({ + filter: subFilter, + targetQuery: inner, + onEntityIdField, + knex, + }), + ); } }); } - return targetQuery; + if ('$any' in filter) { + if (filter.$any.length === 0) { + return targetQuery.andWhereRaw('1 = 0'); + } + return targetQuery.andWhere(outer => { + for (const subFilter of filter.$any) { + outer.orWhere(inner => + applyPredicateEntityFilterToQuery({ + filter: subFilter, + targetQuery: inner, + onEntityIdField, + knex, + }), + ); + } + }); + } + + // Treat the filter as a field expression like { "kind": "component" } or { "spec.type": { "$in": ["service", "website"] } } + if (Object.keys(filter).length === 0) { + return targetQuery; + } + return targetQuery.andWhere(inner => { + for (const [keyAnyCase, value] of Object.entries(filter)) { + applyFieldCondition({ + key: keyAnyCase.toLocaleLowerCase('en-US'), + value, + targetQuery: inner, + onEntityIdField, + knex, + }); + } + }); +} + +/** + * Applies a single { key: value } filter to the target query. + */ +function applyFieldCondition(options: { + key: string; + value: FilterPredicateValue; + targetQuery: Knex.QueryBuilder; + onEntityIdField: string; + knex: Knex; +}): Knex.QueryBuilder { + const { key, value, targetQuery, onEntityIdField, knex } = options; + + if (isPrimitive(value)) { + const matchQuery = knex('search') + .select('search.entity_id') + .where({ + key, + value: String(value).toLocaleLowerCase('en-US'), + }); + return targetQuery.andWhere(onEntityIdField, 'in', matchQuery); + } + + if (isObject(value)) { + if ('$exists' in value) { + const existsQuery = knex('search') + .select('search.entity_id') + .where({ key }); + if (value.$exists) { + return targetQuery.andWhere(onEntityIdField, 'in', existsQuery); + } + return targetQuery.andWhere(onEntityIdField, 'not in', existsQuery); + } + + if ('$in' in value) { + const values = (value.$in as FilterPredicatePrimitive[]).map(v => + String(v).toLocaleLowerCase('en-US'), + ); + const matchQuery = knex('search') + .select('search.entity_id') + .where({ key }) + .whereIn('value', values); + return targetQuery.andWhere(onEntityIdField, 'in', matchQuery); + } + + if ('$hasPrefix' in value) { + const prefix = (value.$hasPrefix as string).toLocaleLowerCase('en-US'); + const escaped = prefix.replace(/[%_\\]/g, c => `\\${c}`); + const matchQuery = knex('search') + .select('search.entity_id') + .where({ key }) + .andWhereRaw('?? like ? escape ?', ['value', `${escaped}%`, '\\']); + return targetQuery.andWhere(onEntityIdField, 'in', matchQuery); + } + } + + throw new InputError( + `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, or $hasPrefix operator, but got ${JSON.stringify( + value, + )}`, + ); } From 59d458202033be0d15c742a6559be75155c6a441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 11:33:08 +0100 Subject: [PATCH 168/455] remove extra spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- plugins/catalog-backend/src/service/createRouter.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 4571d3bc68..ebfadc66c7 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -72,7 +72,6 @@ describe('createRouter readonly disabled', () => { beforeEach(async () => { entitiesCatalog = { entities: jest.fn(), - entitiesBatch: jest.fn(), removeEntityByUid: jest.fn(), entityAncestry: jest.fn(), @@ -1177,7 +1176,6 @@ describe('createRouter readonly and raw json enabled', () => { beforeAll(async () => { entitiesCatalog = { entities: jest.fn(), - entitiesBatch: jest.fn(), removeEntityByUid: jest.fn(), entityAncestry: jest.fn(), @@ -1394,7 +1392,6 @@ describe('NextRouter permissioning', () => { beforeAll(async () => { entitiesCatalog = { entities: jest.fn(), - entitiesBatch: jest.fn(), removeEntityByUid: jest.fn(), entityAncestry: jest.fn(), From 42d89b5025b4372c2deeba39a0268f826be32e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 11:47:51 +0100 Subject: [PATCH 169/455] small fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/rich-ducks-ring.md | 2 +- .../src/service/request/applyPredicateEntityFilterToQuery.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/rich-ducks-ring.md b/.changeset/rich-ducks-ring.md index 04848da4a7..ea8a3e8016 100644 --- a/.changeset/rich-ducks-ring.md +++ b/.changeset/rich-ducks-ring.md @@ -5,6 +5,6 @@ Added predicate-based entity filtering via POST /entities/by-query endpoint. -Supports `$all`, `$any`, `$not`, `$exists`, and `$in` operators for expressive entity queries. Integrated into the existing `queryEntities` flow with full cursor-based pagination, permission enforcement, and `totalItems` support. +Supports `$all`, `$any`, `$not`, `$exists`, `$in`, and `$hasPrefix` operators for expressive entity queries. Integrated into the existing `queryEntities` flow with full cursor-based pagination, permission enforcement, and `totalItems` support. The catalog client's `queryEntities()` method automatically routes to the POST endpoint when a `query` predicate is provided. diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index 88b064866d..5deb97019c 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -1,5 +1,5 @@ /* - * Copyright 2024 The Backstage Authors + * Copyright 2026 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -83,7 +83,7 @@ export function applyPredicateEntityFilterToQuery(options: { const { filter, targetQuery, onEntityIdField, knex } = options; // We do not support top-level primitives; all matching happens through objects - if (!filter || typeof filter !== 'object' || Array.isArray(filter)) { + if (!isObject(filter)) { throw new InputError( `Invalid filter predicate: top-level primitive values are not supported. ` + `Wrap the value in a field expression, e.g. { "kind": ${JSON.stringify( From 06ac10a0c27a34a53c1e1ed17937e7dd350a21cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 11:53:33 +0100 Subject: [PATCH 170/455] make sure to pass through offset too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/CatalogClient.ts | 6 ++++- .../QueryEntitiesByPredicateRequest.model.ts | 1 + .../catalog-backend/src/schema/openapi.yaml | 2 ++ .../QueryEntitiesByPredicateRequest.model.ts | 1 + .../src/schema/openapi/generated/router.ts | 3 +++ .../src/service/createRouter.test.ts | 25 +++++++++++++++++++ .../service/request/parseEntityQuery.test.ts | 13 ++++++++++ .../src/service/request/parseEntityQuery.ts | 1 + 8 files changed, 51 insertions(+), 1 deletion(-) diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index fa8a88c1ca..62111abf9e 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -359,13 +359,17 @@ export class CatalogClient implements CatalogApi { const body: QueryEntitiesByPredicateRequest = {}; if (isQueryEntitiesInitialRequest(request)) { - const { query, limit, orderFields, fullTextFilter, fields } = request; + const { query, limit, offset, orderFields, fullTextFilter, fields } = + request; if (query && typeof query === 'object') { body.query = query; } if (limit !== undefined) { body.limit = limit; } + if (offset !== undefined) { + body.offset = offset; + } if (orderFields !== undefined) { body.orderBy = [orderFields].flat(); } diff --git a/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts b/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts index 818a780b4a..17a9c9962f 100644 --- a/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts +++ b/packages/catalog-client/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts @@ -27,6 +27,7 @@ import { QueryEntitiesByPredicateRequestOrderByInner } from '../models/QueryEnti export interface QueryEntitiesByPredicateRequest { cursor?: string; limit?: number; + offset?: number; orderBy?: Array; fullTextFilter?: QueryEntitiesByPredicateRequestFullTextFilter; fields?: Array; diff --git a/plugins/catalog-backend/src/schema/openapi.yaml b/plugins/catalog-backend/src/schema/openapi.yaml index 41738c1148..0531a9a1d3 100644 --- a/plugins/catalog-backend/src/schema/openapi.yaml +++ b/plugins/catalog-backend/src/schema/openapi.yaml @@ -1125,6 +1125,8 @@ paths: type: string limit: type: number + offset: + type: number orderBy: type: array items: diff --git a/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts b/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts index 818a780b4a..17a9c9962f 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntitiesByPredicateRequest.model.ts @@ -27,6 +27,7 @@ import { QueryEntitiesByPredicateRequestOrderByInner } from '../models/QueryEnti export interface QueryEntitiesByPredicateRequest { cursor?: string; limit?: number; + offset?: number; orderBy?: Array; fullTextFilter?: QueryEntitiesByPredicateRequestFullTextFilter; fields?: Array; diff --git a/plugins/catalog-backend/src/schema/openapi/generated/router.ts b/plugins/catalog-backend/src/schema/openapi/generated/router.ts index ed9536d6b9..6c739eb2ee 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/router.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/router.ts @@ -1269,6 +1269,9 @@ export const spec = { limit: { type: 'number', }, + offset: { + type: 'number', + }, orderBy: { type: 'array', items: { diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index ebfadc66c7..acfac3b8d1 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -509,6 +509,31 @@ describe('createRouter readonly disabled', () => { ); }); + it('queries entities with an offset', async () => { + const items: Entity[] = [ + { apiVersion: 'a', kind: 'b', metadata: { name: 'n' } }, + ]; + entitiesCatalog.queryEntities.mockResolvedValue({ + items: { type: 'object', entities: items }, + pageInfo: {}, + totalItems: 5, + }); + + const response = await request(app) + .post('/entities/by-query') + .send({ query: { kind: 'b' }, limit: 2, offset: 3 }); + + expect(response.status).toEqual(200); + expect(entitiesCatalog.queryEntities).toHaveBeenCalledWith( + expect.objectContaining({ + query: { kind: 'b' }, + limit: 2, + offset: 3, + credentials: mockCredentials.user(), + }), + ); + }); + it('paginates with a cursor in the body', async () => { const items: Entity[] = [ { apiVersion: 'a', kind: 'b', metadata: { name: 'n' } }, diff --git a/plugins/catalog-backend/src/service/request/parseEntityQuery.test.ts b/plugins/catalog-backend/src/service/request/parseEntityQuery.test.ts index b95c4c6c0e..7380259188 100644 --- a/plugins/catalog-backend/src/service/request/parseEntityQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/parseEntityQuery.test.ts @@ -28,6 +28,7 @@ describe('parseEntityQuery', () => { fullTextFilter: undefined, fields: undefined, limit: undefined, + offset: undefined, }); }); @@ -68,6 +69,18 @@ describe('parseEntityQuery', () => { expect(result).toEqual(expect.objectContaining({ limit: 50 })); }); + it('passes through offset', () => { + const result = parseEntityQuery({ offset: 100 }); + expect(result).toEqual(expect.objectContaining({ offset: 100 })); + }); + + it('passes through limit and offset together', () => { + const result = parseEntityQuery({ limit: 50, offset: 100 }); + expect(result).toEqual( + expect.objectContaining({ limit: 50, offset: 100 }), + ); + }); + it('passes through fields', () => { const result = parseEntityQuery({ fields: ['metadata.name', 'kind'], diff --git a/plugins/catalog-backend/src/service/request/parseEntityQuery.ts b/plugins/catalog-backend/src/service/request/parseEntityQuery.ts index c33492e740..27992c273a 100644 --- a/plugins/catalog-backend/src/service/request/parseEntityQuery.ts +++ b/plugins/catalog-backend/src/service/request/parseEntityQuery.ts @@ -110,5 +110,6 @@ export function parseEntityQuery( : undefined, fields: request.fields, limit: request.limit, + offset: request.offset, }; } From b8355e72089ecfac9202913a7d5b2ffb079247cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 12:09:38 +0100 Subject: [PATCH 171/455] empty should match everything MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../request/applyPredicateEntityFilterToQuery.test.ts | 10 ++++++++-- .../request/applyPredicateEntityFilterToQuery.ts | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts index 21e5d2c37a..70d5461c3a 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts @@ -150,8 +150,14 @@ describe.each(databases.eachSupportedId())( ).resolves.toEqual(['service-a', 'service-b']); }); - it('returns nothing for empty $all', async () => { - await expect(query({ $all: [] })).resolves.toEqual([]); + it('matches everything for empty $all', async () => { + await expect(query({ $all: [] })).resolves.toEqual([ + 'api-d', + 'bare-e', + 'service-a', + 'service-b', + 'website-c', + ]); }); it('filters with $any', async () => { diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index 5deb97019c..2a404b88bf 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -105,7 +105,7 @@ export function applyPredicateEntityFilterToQuery(options: { if ('$all' in filter) { if (filter.$all.length === 0) { - return targetQuery.andWhereRaw('1 = 0'); + return targetQuery; } return targetQuery.andWhere(outer => { for (const subFilter of filter.$all) { From 430b8978402961929506df10fbff31a5469eff72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 12:14:08 +0100 Subject: [PATCH 172/455] add explicit clear rejection of MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../request/applyPredicateEntityFilterToQuery.test.ts | 6 ++++++ .../service/request/applyPredicateEntityFilterToQuery.ts | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts index 70d5461c3a..b90e0ca409 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts @@ -231,6 +231,12 @@ describe.each(databases.eachSupportedId())( ).resolves.toEqual(['service-a', 'website-c']); }); + it('throws on $contains operator', async () => { + await expect( + query({ 'metadata.name': { $contains: 'service' } as any }), + ).rejects.toThrow(/\$contains operator is not supported/); + }); + it('throws on top-level primitive', async () => { await expect(query('bad-value' as any)).rejects.toThrow( /top-level primitive values are not supported/, diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index 2a404b88bf..56d85a9da1 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -209,6 +209,11 @@ function applyFieldCondition(options: { .andWhereRaw('?? like ? escape ?', ['value', `${escaped}%`, '\\']); return targetQuery.andWhere(onEntityIdField, 'in', matchQuery); } + + if ('$contains' in value) { + // TODO(freben): Implement this, AT LEAST for some special cases such as tags and relations. + throw new InputError('The $contains operator is not supported'); + } } throw new InputError( From 9dd2f112f0a920531987e31f9be67773f9143737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 12:17:57 +0100 Subject: [PATCH 173/455] add more pagination tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../catalog-client/src/CatalogClient.test.ts | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index aee10cd3f2..7ce9e94396 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -807,6 +807,81 @@ describe('CatalogClient', () => { expect(mockedEndpoint).toHaveBeenCalledTimes(1); }); + it('should paginate using POST when cursor contains a query', async () => { + // Simulate a cursor that contains a query predicate (as the server would encode it) + const cursorPayload = Buffer.from( + JSON.stringify({ + orderFields: [], + orderFieldValues: [], + isPrevious: false, + query: { kind: 'component' }, + totalItems: 100, + }), + ).toString('base64'); + + const page2Response = { + items: [ + { + apiVersion: '1', + kind: 'Component', + metadata: { name: 'service-3', namespace: 'default' }, + }, + ], + totalItems: 100, + pageInfo: {}, + }; + + const mockedEndpoint = jest.fn().mockImplementation((req, res, ctx) => { + expect(req.method).toBe('POST'); + expect(req.body).toMatchObject({ cursor: cursorPayload }); + return res(ctx.json(page2Response)); + }); + + server.use(rest.post(`${mockBaseUrl}/entities/by-query`, mockedEndpoint)); + + const response = await client.queryEntities({ + cursor: cursorPayload, + }); + + expect(mockedEndpoint).toHaveBeenCalledTimes(1); + expect(response.items).toEqual(page2Response.items); + expect(response.totalItems).toBe(100); + }); + + it('should use GET endpoint for cursor without query', async () => { + // A cursor that does NOT contain a query field should go to GET + const cursorPayload = Buffer.from( + JSON.stringify({ + orderFields: [], + orderFieldValues: [], + isPrevious: false, + totalItems: 50, + }), + ).toString('base64'); + + const mockedGetEndpoint = jest.fn().mockImplementation((_req, res, ctx) => + res( + ctx.json({ + items: [], + totalItems: 50, + pageInfo: {}, + }), + ), + ); + + const mockedPostEndpoint = jest.fn(); + + server.use( + rest.get(`${mockBaseUrl}/entities/by-query`, mockedGetEndpoint), + rest.post(`${mockBaseUrl}/entities/by-query`, mockedPostEndpoint), + ); + + await client.queryEntities({ cursor: cursorPayload }); + + expect(mockedGetEndpoint).toHaveBeenCalledTimes(1); + expect(mockedPostEndpoint).not.toHaveBeenCalled(); + }); + it('should handle errors from POST endpoint', async () => { const mockedEndpoint = jest .fn() From 1ed51c2d8a7641b052529d7311299ec70cabae57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 13:34:06 +0100 Subject: [PATCH 174/455] make sure that permissions apply MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../service/AuthorizedEntitiesCatalog.test.ts | 172 ++++++++++++++++++ .../src/service/AuthorizedEntitiesCatalog.ts | 64 ++++++- .../applyPredicateEntityFilterToQuery.ts | 2 +- 3 files changed, 231 insertions(+), 7 deletions(-) diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts index 894949a691..f074f25397 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts @@ -23,6 +23,7 @@ import { AuthorizedEntitiesCatalog } from './AuthorizedEntitiesCatalog'; import { Cursor, QueryEntitiesResponse } from '../catalog/types'; import { Entity } from '@backstage/catalog-model'; import { EntityFilter } from '@backstage/plugin-catalog-node'; +import { FilterPredicate } from '@backstage/filter-predicates'; import { mockCredentials } from '@backstage/backend-test-utils'; describe('AuthorizedEntitiesCatalog', () => { @@ -306,6 +307,177 @@ describe('AuthorizedEntitiesCatalog', () => { }, }); }); + + it('combines permission filter into query field using $all on CONDITIONAL with initial request', async () => { + fakePermissionApi.authorizeConditional.mockResolvedValue([ + { + result: AuthorizeResult.CONDITIONAL, + conditions: { + rule: 'IS_ENTITY_KIND', + params: { kinds: ['b'] }, + }, + }, + ]); + + const userQuery: FilterPredicate = { 'metadata.name': 'my-entity' }; + + const entities = [ + { + kind: 'component', + namespace: 'default', + name: 'a', + } as unknown as Entity, + ]; + + fakeCatalog.queryEntities.mockResolvedValue({ + items: { type: 'object', entities }, + pageInfo: { + nextCursor: { + isPrevious: false, + orderFieldValues: ['xxx', null], + query: { $all: [{ kind: 'b' }, userQuery] }, + orderFields: [{ field: 'name', order: 'asc' }], + }, + }, + totalItems: 1, + } as QueryEntitiesResponse); + + const catalog = createCatalog(isEntityKind); + + const response = await catalog.queryEntities({ + credentials: mockCredentials.none(), + query: userQuery, + }); + + expect(fakeCatalog.queryEntities).toHaveBeenCalledWith({ + credentials: mockCredentials.none(), + query: { $all: [{ kind: 'b' }, userQuery] }, + filter: undefined, + }); + + expect(response.pageInfo.nextCursor).toEqual({ + isPrevious: false, + orderFieldValues: ['xxx', null], + query: userQuery, + filter: undefined, + orderFields: [{ field: 'name', order: 'asc' }], + }); + }); + + it('combines permission filter into cursor query field using $all on CONDITIONAL with cursor request', async () => { + fakePermissionApi.authorizeConditional.mockResolvedValue([ + { + result: AuthorizeResult.CONDITIONAL, + conditions: { + rule: 'IS_ENTITY_KIND', + params: { kinds: ['b'] }, + }, + }, + ]); + + const userQuery: FilterPredicate = { 'metadata.name': 'my-entity' }; + + const entities = [ + { + kind: 'component', + namespace: 'default', + name: 'a', + } as unknown as Entity, + ]; + + fakeCatalog.queryEntities.mockResolvedValue({ + items: { type: 'object', entities }, + pageInfo: { + nextCursor: { + isPrevious: false, + orderFieldValues: ['yyy', null], + query: { $all: [{ kind: 'b' }, userQuery] }, + orderFields: [{ field: 'name', order: 'asc' }], + }, + prevCursor: { + isPrevious: true, + orderFieldValues: ['aaa', null], + query: { $all: [{ kind: 'b' }, userQuery] }, + orderFields: [{ field: 'name', order: 'asc' }], + }, + }, + totalItems: 3, + } as QueryEntitiesResponse); + + const catalog = createCatalog(isEntityKind); + + const cursor: Cursor = { + query: userQuery, + orderFields: [{ field: 'name', order: 'asc' }], + isPrevious: false, + orderFieldValues: ['xxx', null], + }; + + const response = await catalog.queryEntities({ + credentials: mockCredentials.none(), + cursor, + }); + + expect(fakeCatalog.queryEntities).toHaveBeenCalledWith({ + credentials: mockCredentials.none(), + cursor: { + ...cursor, + query: { $all: [{ kind: 'b' }, userQuery] }, + filter: undefined, + }, + }); + + expect(response.pageInfo.nextCursor).toEqual({ + isPrevious: false, + orderFieldValues: ['yyy', null], + query: userQuery, + filter: undefined, + orderFields: [{ field: 'name', order: 'asc' }], + }); + + expect(response.pageInfo.prevCursor).toEqual({ + isPrevious: true, + orderFieldValues: ['aaa', null], + query: userQuery, + filter: undefined, + orderFields: [{ field: 'name', order: 'asc' }], + }); + }); + + it('converts multi-value permission filter with $in when converting to predicate', async () => { + fakePermissionApi.authorizeConditional.mockResolvedValue([ + { + result: AuthorizeResult.CONDITIONAL, + conditions: { + rule: 'IS_ENTITY_KIND', + params: { kinds: ['component', 'api'] }, + }, + }, + ]); + + const userQuery: FilterPredicate = { 'metadata.name': 'my-entity' }; + + fakeCatalog.queryEntities.mockResolvedValue({ + items: { type: 'object', entities: [] }, + pageInfo: {}, + totalItems: 0, + } as QueryEntitiesResponse); + + const catalog = createCatalog(isEntityKind); + + await catalog.queryEntities({ + credentials: mockCredentials.none(), + query: userQuery, + }); + + expect(fakeCatalog.queryEntities).toHaveBeenCalledWith({ + credentials: mockCredentials.none(), + query: { + $all: [{ kind: { $in: ['component', 'api'] } }, userQuery], + }, + filter: undefined, + }); + }); }); describe('removeEntityByUid', () => { diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts index d3d0dba5b3..bb81144f25 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts @@ -35,6 +35,7 @@ import { QueryEntitiesRequest, QueryEntitiesResponse, } from '../catalog/types'; +import { FilterPredicate } from '@backstage/filter-predicates'; import { basicEntityFilter } from './request'; import { isQueryEntitiesCursorRequest } from './util'; import { EntityFilter } from '@backstage/plugin-catalog-node'; @@ -43,6 +44,30 @@ import { PermissionsService, } from '@backstage/backend-plugin-api'; +function entityFilterToFilterPredicate(filter: EntityFilter): FilterPredicate { + if ('allOf' in filter) { + return { $all: filter.allOf.map(entityFilterToFilterPredicate) }; + } + + if ('anyOf' in filter) { + return { $any: filter.anyOf.map(entityFilterToFilterPredicate) }; + } + + if ('not' in filter) { + return { $not: entityFilterToFilterPredicate(filter.not) }; + } + + if (!filter.values) { + return { [filter.key]: { $exists: true } } as FilterPredicate; + } + + if (filter.values.length === 1) { + return { [filter.key]: filter.values[0] } as FilterPredicate; + } + + return { [filter.key]: { $in: filter.values } } as FilterPredicate; +} + export class AuthorizedEntitiesCatalog implements EntitiesCatalog { private readonly entitiesCatalog: EntitiesCatalog; private readonly permissionApi: PermissionsService; @@ -147,18 +172,42 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { let permissionedRequest: QueryEntitiesRequest; let requestFilter: EntityFilter | undefined; + let requestQuery: FilterPredicate | undefined; if (isQueryEntitiesCursorRequest(request)) { requestFilter = request.cursor.filter; + requestQuery = request.cursor.query; + if (request.cursor.query) { + const permissionPredicate = + entityFilterToFilterPredicate(permissionFilter); + permissionedRequest = { + ...request, + cursor: { + ...request.cursor, + query: { $all: [permissionPredicate, request.cursor.query] }, + filter: undefined, + }, + }; + } else { + permissionedRequest = { + ...request, + cursor: { + ...request.cursor, + filter: request.cursor.filter + ? { allOf: [permissionFilter, request.cursor.filter] } + : permissionFilter, + }, + }; + } + } else if (request.query) { + const permissionPredicate = + entityFilterToFilterPredicate(permissionFilter); + requestQuery = request.query; permissionedRequest = { ...request, - cursor: { - ...request.cursor, - filter: request.cursor.filter - ? { allOf: [permissionFilter, request.cursor.filter] } - : permissionFilter, - }, + query: { $all: [permissionPredicate, request.query] }, + filter: undefined, }; } else { permissionedRequest = { @@ -177,11 +226,13 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { const prevCursor: Cursor | undefined = response.pageInfo.prevCursor && { ...response.pageInfo.prevCursor, filter: requestFilter, + query: requestQuery, }; const nextCursor: Cursor | undefined = response.pageInfo.nextCursor && { ...response.pageInfo.nextCursor, filter: requestFilter, + query: requestQuery, }; return { @@ -193,6 +244,7 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { }; } + // The ALLOW case return this.entitiesCatalog.queryEntities(request); } diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index 56d85a9da1..b42252369d 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -105,7 +105,7 @@ export function applyPredicateEntityFilterToQuery(options: { if ('$all' in filter) { if (filter.$all.length === 0) { - return targetQuery; + return targetQuery.andWhereRaw('1 = 1'); } return targetQuery.andWhere(outer => { for (const subFilter of filter.$all) { From 345a36aa1b3f549546122ad2e86f51312af05f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 13:57:11 +0100 Subject: [PATCH 175/455] remove the exclusivity constraint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../catalog-client/src/CatalogClient.test.ts | 11 ---- packages/catalog-client/src/CatalogClient.ts | 7 --- packages/catalog-client/src/types/api.ts | 11 +++- plugins/catalog-backend/src/catalog/types.ts | 2 - .../service/AuthorizedEntitiesCatalog.test.ts | 55 ++++------------ .../src/service/AuthorizedEntitiesCatalog.ts | 62 +++---------------- .../service/DefaultEntitiesCatalog.test.ts | 32 ++++++++++ 7 files changed, 60 insertions(+), 120 deletions(-) diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index 7ce9e94396..819fa70381 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -594,17 +594,6 @@ describe('CatalogClient', () => { expect(response.totalItems).toBe(2); }); - it('should throw error when both filter and query are provided', async () => { - await expect( - client.queryEntities({ - filter: { kind: 'component' }, - query: { kind: 'component' }, - } as any), - ).rejects.toThrow( - 'Cannot specify both "filter" and "query" in the same request', - ); - }); - it('should support $all operator', async () => { const mockedEndpoint = jest.fn().mockImplementation((req, res, ctx) => { expect(req.body).toMatchObject({ diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index 62111abf9e..bd557cfdd2 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -274,13 +274,6 @@ export class CatalogClient implements CatalogApi { ): Promise { const isInitialRequest = isQueryEntitiesInitialRequest(request); - // Validate that filter and query are mutually exclusive - if (isInitialRequest && request.filter && request.query) { - throw new Error( - 'Cannot specify both "filter" and "query" in the same request. Use "filter" for traditional key-value filtering or "query" for predicate-based filtering.', - ); - } - // Route to POST endpoint if query predicate is provided (initial request) if (isInitialRequest && request.query) { return this.queryEntitiesByPredicate(request, options); diff --git a/packages/catalog-client/src/types/api.ts b/packages/catalog-client/src/types/api.ts index 8bf13271b2..2dffb35570 100644 --- a/packages/catalog-client/src/types/api.ts +++ b/packages/catalog-client/src/types/api.ts @@ -593,6 +593,7 @@ export interface CatalogApi { * const response = await catalogClient.queryEntities({ * filter: [{ kind: 'group' }], * limit: 20, + * fields: ['metadata', 'kind'], * fullTextFilter: { * term: 'A', * }, @@ -609,11 +610,15 @@ export interface CatalogApi { * * ``` * const secondBatchResponse = await catalogClient - * .queryEntities({ cursor: response.nextCursor }); + * .queryEntities({ + * cursor: response.nextCursor, + * limit: 20, + * fields: ['metadata', 'kind'], + * }); * ``` * - * secondBatchResponse will contain the next batch of (maximum) 20 entities, - * together with a prevCursor property, useful to fetch the previous batch. + * `secondBatchResponse` will contain the next batch of (maximum) 20 entities, + * together with a `prevCursor` property, useful to fetch the previous batch. * * @public * diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index dda7e9a811..5d733ad14c 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -215,7 +215,6 @@ export interface QueryEntitiesInitialRequest { filter?: EntityFilter; /** * Predicate-based query for filtering entities. - * Mutually exclusive with filter. */ query?: FilterPredicate; orderFields?: EntityOrder[]; @@ -281,7 +280,6 @@ export type Cursor = { filter?: EntityFilter; /** * A predicate-based query to be applied to the full list of entities. - * Mutually exclusive with filter. */ query?: FilterPredicate; /** diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts index f074f25397..85fbd16eeb 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.test.ts @@ -308,7 +308,7 @@ describe('AuthorizedEntitiesCatalog', () => { }); }); - it('combines permission filter into query field using $all on CONDITIONAL with initial request', async () => { + it('passes through query alongside permission filter on CONDITIONAL with initial request', async () => { fakePermissionApi.authorizeConditional.mockResolvedValue([ { result: AuthorizeResult.CONDITIONAL, @@ -335,7 +335,8 @@ describe('AuthorizedEntitiesCatalog', () => { nextCursor: { isPrevious: false, orderFieldValues: ['xxx', null], - query: { $all: [{ kind: 'b' }, userQuery] }, + query: userQuery, + filter: { key: 'kind', values: ['b'] }, orderFields: [{ field: 'name', order: 'asc' }], }, }, @@ -351,8 +352,8 @@ describe('AuthorizedEntitiesCatalog', () => { expect(fakeCatalog.queryEntities).toHaveBeenCalledWith({ credentials: mockCredentials.none(), - query: { $all: [{ kind: 'b' }, userQuery] }, - filter: undefined, + query: userQuery, + filter: { key: 'kind', values: ['b'] }, }); expect(response.pageInfo.nextCursor).toEqual({ @@ -364,7 +365,7 @@ describe('AuthorizedEntitiesCatalog', () => { }); }); - it('combines permission filter into cursor query field using $all on CONDITIONAL with cursor request', async () => { + it('passes through cursor query alongside permission filter on CONDITIONAL with cursor request', async () => { fakePermissionApi.authorizeConditional.mockResolvedValue([ { result: AuthorizeResult.CONDITIONAL, @@ -391,13 +392,15 @@ describe('AuthorizedEntitiesCatalog', () => { nextCursor: { isPrevious: false, orderFieldValues: ['yyy', null], - query: { $all: [{ kind: 'b' }, userQuery] }, + query: userQuery, + filter: { key: 'kind', values: ['b'] }, orderFields: [{ field: 'name', order: 'asc' }], }, prevCursor: { isPrevious: true, orderFieldValues: ['aaa', null], - query: { $all: [{ kind: 'b' }, userQuery] }, + query: userQuery, + filter: { key: 'kind', values: ['b'] }, orderFields: [{ field: 'name', order: 'asc' }], }, }, @@ -422,8 +425,7 @@ describe('AuthorizedEntitiesCatalog', () => { credentials: mockCredentials.none(), cursor: { ...cursor, - query: { $all: [{ kind: 'b' }, userQuery] }, - filter: undefined, + filter: { key: 'kind', values: ['b'] }, }, }); @@ -443,41 +445,6 @@ describe('AuthorizedEntitiesCatalog', () => { orderFields: [{ field: 'name', order: 'asc' }], }); }); - - it('converts multi-value permission filter with $in when converting to predicate', async () => { - fakePermissionApi.authorizeConditional.mockResolvedValue([ - { - result: AuthorizeResult.CONDITIONAL, - conditions: { - rule: 'IS_ENTITY_KIND', - params: { kinds: ['component', 'api'] }, - }, - }, - ]); - - const userQuery: FilterPredicate = { 'metadata.name': 'my-entity' }; - - fakeCatalog.queryEntities.mockResolvedValue({ - items: { type: 'object', entities: [] }, - pageInfo: {}, - totalItems: 0, - } as QueryEntitiesResponse); - - const catalog = createCatalog(isEntityKind); - - await catalog.queryEntities({ - credentials: mockCredentials.none(), - query: userQuery, - }); - - expect(fakeCatalog.queryEntities).toHaveBeenCalledWith({ - credentials: mockCredentials.none(), - query: { - $all: [{ kind: { $in: ['component', 'api'] } }, userQuery], - }, - filter: undefined, - }); - }); }); describe('removeEntityByUid', () => { diff --git a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts index bb81144f25..910188b036 100644 --- a/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/AuthorizedEntitiesCatalog.ts @@ -44,30 +44,6 @@ import { PermissionsService, } from '@backstage/backend-plugin-api'; -function entityFilterToFilterPredicate(filter: EntityFilter): FilterPredicate { - if ('allOf' in filter) { - return { $all: filter.allOf.map(entityFilterToFilterPredicate) }; - } - - if ('anyOf' in filter) { - return { $any: filter.anyOf.map(entityFilterToFilterPredicate) }; - } - - if ('not' in filter) { - return { $not: entityFilterToFilterPredicate(filter.not) }; - } - - if (!filter.values) { - return { [filter.key]: { $exists: true } } as FilterPredicate; - } - - if (filter.values.length === 1) { - return { [filter.key]: filter.values[0] } as FilterPredicate; - } - - return { [filter.key]: { $in: filter.values } } as FilterPredicate; -} - export class AuthorizedEntitiesCatalog implements EntitiesCatalog { private readonly entitiesCatalog: EntitiesCatalog; private readonly permissionApi: PermissionsService; @@ -178,45 +154,25 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog { requestFilter = request.cursor.filter; requestQuery = request.cursor.query; - if (request.cursor.query) { - const permissionPredicate = - entityFilterToFilterPredicate(permissionFilter); - permissionedRequest = { - ...request, - cursor: { - ...request.cursor, - query: { $all: [permissionPredicate, request.cursor.query] }, - filter: undefined, - }, - }; - } else { - permissionedRequest = { - ...request, - cursor: { - ...request.cursor, - filter: request.cursor.filter - ? { allOf: [permissionFilter, request.cursor.filter] } - : permissionFilter, - }, - }; - } - } else if (request.query) { - const permissionPredicate = - entityFilterToFilterPredicate(permissionFilter); - requestQuery = request.query; permissionedRequest = { ...request, - query: { $all: [permissionPredicate, request.query] }, - filter: undefined, + cursor: { + ...request.cursor, + filter: request.cursor.filter + ? { allOf: [permissionFilter, request.cursor.filter] } + : permissionFilter, + }, }; } else { + requestFilter = request.filter; + requestQuery = request.query; + permissionedRequest = { ...request, filter: request.filter ? { allOf: [permissionFilter, request.filter] } : permissionFilter, }; - requestFilter = request.filter; } const response = await this.entitiesCatalog.queryEntities( diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 7012c2e505..f9e41b679c 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -2054,6 +2054,38 @@ describe('DefaultEntitiesCatalog', () => { ]); }, ); + + it.each(databases.eachSupportedId())( + 'should apply both filter and query when both are given, %p', + async databaseId => { + await createDatabase(databaseId); + + // Add entities with different kinds and names + await addEntityToSearch(entityFrom('A', { kind: 'component' })); + await addEntityToSearch(entityFrom('B', { kind: 'component' })); + await addEntityToSearch(entityFrom('C', { kind: 'api' })); + await addEntityToSearch(entityFrom('D', { kind: 'api' })); + + const catalog = new DefaultEntitiesCatalog({ + database: knex, + logger: mockServices.logger.mock(), + stitcher, + }); + + // Use filter to restrict to kind=component, and query to restrict to name=A + const response = await catalog.queryEntities({ + filter: { key: 'kind', values: ['component'] }, + query: { 'metadata.name': 'a' }, + orderFields: [{ field: 'metadata.name', order: 'asc' }], + credentials: mockCredentials.none(), + }); + + const resultEntities = entitiesResponseToObjects(response.items); + expect(resultEntities).toEqual([ + entityFrom('A', { kind: 'component' }), + ]); + }, + ); }); describe('removeEntityByUid', () => { From 7f0f4139300049969ad727bd629dee1cc1479ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 14:34:22 +0100 Subject: [PATCH 176/455] Update packages/catalog-client/src/types/api.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/types/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/catalog-client/src/types/api.ts b/packages/catalog-client/src/types/api.ts index 2dffb35570..a99f36573e 100644 --- a/packages/catalog-client/src/types/api.ts +++ b/packages/catalog-client/src/types/api.ts @@ -438,7 +438,7 @@ export type QueryEntitiesInitialRequest = { */ filter?: EntityFilterQuery; /** - * Predicate-based filter with logical operators ($all, $any, $not, $exists, $in). + * Predicate-based filter with logical operators ($all, $any, $not, $exists, $in, $hasPrefix). * Mutually exclusive with `filter`. * * @example From 7969c48889e4207e21e9a60219fe69b03e5fc663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 14:42:17 +0100 Subject: [PATCH 177/455] remove dead code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/types/api.ts | 5 ++-- .../src/service/DefaultEntitiesCatalog.ts | 25 ------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/packages/catalog-client/src/types/api.ts b/packages/catalog-client/src/types/api.ts index a99f36573e..64d01c0972 100644 --- a/packages/catalog-client/src/types/api.ts +++ b/packages/catalog-client/src/types/api.ts @@ -423,7 +423,7 @@ export type QueryEntitiesRequest = * * @remarks * - * Either `filter` or `query` can be provided, but not both: + * Either `filter` or `query` can be provided, or even both: * - `filter`: Uses the traditional key-value filter syntax (GET endpoint) * - `query`: Uses the predicate-based filter syntax with logical operators (POST endpoint) * @@ -434,12 +434,11 @@ export type QueryEntitiesInitialRequest = { limit?: number; offset?: number; /** - * Traditional key-value based filter. Mutually exclusive with `query`. + * Traditional key-value based filter. */ filter?: EntityFilterQuery; /** * Predicate-based filter with logical operators ($all, $any, $not, $exists, $in, $hasPrefix). - * Mutually exclusive with `filter`. * * @example * ```typescript diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index 11bce7bd86..dab605d176 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -18,7 +18,6 @@ import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; import { InputError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; import { chunk as lodashChunk, isEqual } from 'lodash'; -import { z } from 'zod'; import { Cursor, EntitiesBatchRequest, @@ -49,7 +48,6 @@ import { isQueryEntitiesCursorRequest, isQueryEntitiesInitialRequest, } from './util'; -import { EntityFilter } from '@backstage/plugin-catalog-node'; import { LoggerService } from '@backstage/backend-plugin-api'; import { applyEntityFilterToQuery } from './request/applyEntityFilterToQuery'; import { processRawEntitiesResult } from './response'; @@ -714,29 +712,6 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { } } -const entityFilterParser: z.ZodSchema = z.lazy(() => - z - .object({ - key: z.string(), - values: z.array(z.string()).optional(), - }) - .or(z.object({ not: entityFilterParser })) - .or(z.object({ anyOf: z.array(entityFilterParser) })) - .or(z.object({ allOf: z.array(entityFilterParser) })), -); - -export const cursorParser: z.ZodSchema = z.object({ - orderFields: z.array( - z.object({ field: z.string(), order: z.enum(['asc', 'desc']) }), - ), - orderFieldValues: z.array(z.string().or(z.null())), - filter: entityFilterParser.optional(), - isPrevious: z.boolean(), - query: z.string().optional(), - firstSortFieldValues: z.array(z.string().or(z.null())).optional(), - totalItems: z.number().optional(), -}); - function parseCursorFromRequest( request?: QueryEntitiesRequest, ): Partial & { skipTotalItems: boolean } { From a3e4add213840810696dca100a60dc61020b9082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 15:01:38 +0100 Subject: [PATCH 178/455] remove some unnecessary noise MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../applyPredicateEntityFilterToQuery.ts | 45 +------------------ 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index b42252369d..d376b132ff 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -35,45 +35,6 @@ function isObject(value: unknown): value is Record { return typeof value === 'object' && value !== null && !Array.isArray(value); } -/** - * example generated query - * Selects all non-null final entities that: - * - * - Are of kind "component" - * - Have spec.type = "service" - * - Are owned by either: - * - backend-team - * - platform-team - * - Are NOT in experimental lifecycle - * - * Results are ordered by entity_ref in ascending order. - * - * SQL Reference: - * ``` - * SELECT final_entities.* - * FROM final_entities - * WHERE final_entities.final_entity IS NOT NULL - * AND final_entities.entity_id IN ( - * SELECT entity_id FROM search WHERE key = 'kind' AND value = 'component' - * ) - * AND final_entities.entity_id IN ( - * SELECT entity_id FROM search WHERE key = 'spec.type' AND value = 'service' - * ) - * AND ( - * final_entities.entity_id IN ( - * SELECT entity_id FROM search WHERE key = 'spec.owner' AND value = 'backend-team' - * ) - * OR - * final_entities.entity_id IN ( - * SELECT entity_id FROM search WHERE key = 'spec.owner' AND value = 'platform-team' - * ) - * ) - * AND final_entities.entity_id NOT IN ( - * SELECT entity_id FROM search WHERE key = 'spec.lifecycle' AND value = 'experimental' - * ) - * ORDER BY final_entities.entity_ref ASC; - * ``` - */ export function applyPredicateEntityFilterToQuery(options: { filter: FilterPredicate; targetQuery: Knex.QueryBuilder; @@ -190,9 +151,7 @@ function applyFieldCondition(options: { } if ('$in' in value) { - const values = (value.$in as FilterPredicatePrimitive[]).map(v => - String(v).toLocaleLowerCase('en-US'), - ); + const values = value.$in.map(v => String(v).toLocaleLowerCase('en-US')); const matchQuery = knex('search') .select('search.entity_id') .where({ key }) @@ -201,7 +160,7 @@ function applyFieldCondition(options: { } if ('$hasPrefix' in value) { - const prefix = (value.$hasPrefix as string).toLocaleLowerCase('en-US'); + const prefix = value.$hasPrefix.toLocaleLowerCase('en-US'); const escaped = prefix.replace(/[%_\\]/g, c => `\\${c}`); const matchQuery = knex('search') .select('search.entity_id') From c7c0dd5ed2688c2e19567054f5f31ecd4f48f905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 15:11:59 +0100 Subject: [PATCH 179/455] add test for empty matcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../request/applyPredicateEntityFilterToQuery.test.ts | 4 ++++ .../request/applyPredicateEntityFilterToQuery.ts | 11 ++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts index b90e0ca409..e48be8169a 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts @@ -126,6 +126,10 @@ describe.each(databases.eachSupportedId())( ]); }); + it('matches nothing for {$not: {}}', async () => { + await expect(query({ $not: {} })).resolves.toEqual([]); + }); + it('filters by direct field value', async () => { await expect(query({ kind: 'component' })).resolves.toEqual([ 'bare-e', diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index d376b132ff..e7cf152184 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -102,7 +102,7 @@ export function applyPredicateEntityFilterToQuery(options: { // Treat the filter as a field expression like { "kind": "component" } or { "spec.type": { "$in": ["service", "website"] } } if (Object.keys(filter).length === 0) { - return targetQuery; + return targetQuery.andWhereRaw('1 = 1'); } return targetQuery.andWhere(inner => { for (const [keyAnyCase, value] of Object.entries(filter)) { @@ -144,10 +144,11 @@ function applyFieldCondition(options: { const existsQuery = knex('search') .select('search.entity_id') .where({ key }); - if (value.$exists) { - return targetQuery.andWhere(onEntityIdField, 'in', existsQuery); - } - return targetQuery.andWhere(onEntityIdField, 'not in', existsQuery); + return targetQuery.andWhere( + onEntityIdField, + value.$exists ? 'in' : 'not in', + existsQuery, + ); } if ('$in' in value) { From c25c589f9cd8733c771efe5c56e9d0732a513833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 15:29:39 +0100 Subject: [PATCH 180/455] add primitive $contains support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../applyPredicateEntityFilterToQuery.test.ts | 328 ++++++++++-------- .../applyPredicateEntityFilterToQuery.ts | 41 ++- 2 files changed, 215 insertions(+), 154 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts index e48be8169a..7f07cad11e 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts @@ -67,7 +67,11 @@ describe.each(databases.eachSupportedId())( await addEntity({ apiVersion: 'backstage.io/v1alpha1', kind: 'Component', - metadata: { name: 'bare-e', namespace: 'default' }, + metadata: { + name: 'bare-e', + namespace: 'default', + tags: ['java', 'backend'], + }, spec: {}, }); }); @@ -116,151 +120,185 @@ describe.each(databases.eachSupportedId())( ); } - it('matches everything for empty field expression', async () => { - await expect(query({})).resolves.toEqual([ - 'api-d', - 'bare-e', - 'service-a', - 'service-b', - 'website-c', - ]); - }); - - it('matches nothing for {$not: {}}', async () => { - await expect(query({ $not: {} })).resolves.toEqual([]); - }); - - it('filters by direct field value', async () => { - await expect(query({ kind: 'component' })).resolves.toEqual([ - 'bare-e', - 'service-a', - 'service-b', - 'website-c', - ]); - }); - - it('filters by exact spec field value', async () => { - await expect(query({ 'spec.type': 'service' })).resolves.toEqual([ - 'service-a', - 'service-b', - ]); - }); - - it('filters with $all', async () => { - await expect( - query({ - $all: [{ kind: 'component' }, { 'spec.type': 'service' }], - }), - ).resolves.toEqual(['service-a', 'service-b']); - }); - - it('matches everything for empty $all', async () => { - await expect(query({ $all: [] })).resolves.toEqual([ - 'api-d', - 'bare-e', - 'service-a', - 'service-b', - 'website-c', - ]); - }); - - it('filters with $any', async () => { - await expect( - query({ - $any: [{ 'spec.type': 'service' }, { 'spec.type': 'website' }], - }), - ).resolves.toEqual(['service-a', 'service-b', 'website-c']); - }); - - it('returns nothing for empty $any', async () => { - await expect(query({ $any: [] })).resolves.toEqual([]); - }); - - it('filters with $not', async () => { - await expect( - query({ - $all: [ - { kind: 'component' }, - { $not: { 'spec.lifecycle': 'experimental' } }, - ], - }), - ).resolves.toEqual(['bare-e', 'service-a', 'website-c']); - }); - - it('filters with $in', async () => { - await expect( - query({ 'spec.type': { $in: ['service', 'openapi'] } }), - ).resolves.toEqual(['api-d', 'service-a', 'service-b']); - }); - - it('filters with $exists true', async () => { - await expect( - query({ - $all: [{ kind: 'component' }, { 'spec.owner': { $exists: true } }], - }), - ).resolves.toEqual(['service-a', 'service-b', 'website-c']); - }); - - it('filters with $exists false', async () => { - await expect( - query({ - $all: [{ kind: 'component' }, { 'spec.owner': { $exists: false } }], - }), - ).resolves.toEqual(['bare-e']); - }); - - it('filters with $hasPrefix', async () => { - await expect( - query({ 'metadata.name': { $hasPrefix: 'service' } }), - ).resolves.toEqual(['service-a', 'service-b']); - }); - - it('filters with $hasPrefix case-insensitively', async () => { - await expect( - query({ 'metadata.name': { $hasPrefix: 'Service' } }), - ).resolves.toEqual(['service-a', 'service-b']); - }); - - it('handles nested logical operators', async () => { - await expect( - query({ - $all: [ - { kind: 'component' }, - { - $any: [{ 'spec.type': 'service' }, { 'spec.type': 'website' }], - }, - { $not: { 'spec.lifecycle': 'experimental' } }, - ], - }), - ).resolves.toEqual(['service-a', 'website-c']); - }); - - it('throws on $contains operator', async () => { - await expect( - query({ 'metadata.name': { $contains: 'service' } as any }), - ).rejects.toThrow(/\$contains operator is not supported/); - }); - - it('throws on top-level primitive', async () => { - await expect(query('bad-value' as any)).rejects.toThrow( - /top-level primitive values are not supported/, - ); - }); - - it('combines filter and query independently', async () => { - const q = - knex('final_entities').whereNotNull('final_entity'); - applyEntityFilterToQuery({ - filter: { key: 'kind', values: ['component'] }, - query: { 'spec.type': 'service' }, - targetQuery: q, - onEntityIdField: 'final_entities.entity_id', - knex, + describe('field expressions', () => { + it('matches everything for empty field expression', async () => { + await expect(query({})).resolves.toEqual([ + 'api-d', + 'bare-e', + 'service-a', + 'service-b', + 'website-c', + ]); + }); + + it('filters by direct field value', async () => { + await expect(query({ kind: 'component' })).resolves.toEqual([ + 'bare-e', + 'service-a', + 'service-b', + 'website-c', + ]); + }); + + it('filters by exact spec field value', async () => { + await expect(query({ 'spec.type': 'service' })).resolves.toEqual([ + 'service-a', + 'service-b', + ]); + }); + + it('throws on top-level primitive', async () => { + await expect(query('bad-value' as any)).rejects.toThrow( + /top-level primitive values are not supported/, + ); + }); + }); + + describe('$all', () => { + it('filters with $all', async () => { + await expect( + query({ + $all: [{ kind: 'component' }, { 'spec.type': 'service' }], + }), + ).resolves.toEqual(['service-a', 'service-b']); + }); + + it('matches everything for empty $all', async () => { + await expect(query({ $all: [] })).resolves.toEqual([ + 'api-d', + 'bare-e', + 'service-a', + 'service-b', + 'website-c', + ]); + }); + }); + + describe('$any', () => { + it('filters with $any', async () => { + await expect( + query({ + $any: [{ 'spec.type': 'service' }, { 'spec.type': 'website' }], + }), + ).resolves.toEqual(['service-a', 'service-b', 'website-c']); + }); + + it('returns nothing for empty $any', async () => { + await expect(query({ $any: [] })).resolves.toEqual([]); + }); + }); + + describe('$not', () => { + it('filters with $not', async () => { + await expect( + query({ + $all: [ + { kind: 'component' }, + { $not: { 'spec.lifecycle': 'experimental' } }, + ], + }), + ).resolves.toEqual(['bare-e', 'service-a', 'website-c']); + }); + + it('matches nothing for {$not: {}}', async () => { + await expect(query({ $not: {} })).resolves.toEqual([]); + }); + }); + + describe('$in', () => { + it('filters with $in', async () => { + await expect( + query({ 'spec.type': { $in: ['service', 'openapi'] } }), + ).resolves.toEqual(['api-d', 'service-a', 'service-b']); + }); + }); + + describe('$exists', () => { + it('filters with $exists true', async () => { + await expect( + query({ + $all: [{ kind: 'component' }, { 'spec.owner': { $exists: true } }], + }), + ).resolves.toEqual(['service-a', 'service-b', 'website-c']); + }); + + it('filters with $exists false', async () => { + await expect( + query({ + $all: [{ kind: 'component' }, { 'spec.owner': { $exists: false } }], + }), + ).resolves.toEqual(['bare-e']); + }); + }); + + describe('$hasPrefix', () => { + it('filters with $hasPrefix', async () => { + await expect( + query({ 'metadata.name': { $hasPrefix: 'service' } }), + ).resolves.toEqual(['service-a', 'service-b']); + }); + + it('filters with $hasPrefix case-insensitively', async () => { + await expect( + query({ 'metadata.name': { $hasPrefix: 'Service' } }), + ).resolves.toEqual(['service-a', 'service-b']); + }); + }); + + describe('$contains', () => { + it('filters with primitive $contains on array fields', async () => { + await expect( + query({ 'metadata.tags': { $contains: 'java' } }), + ).resolves.toEqual(['bare-e']); + }); + + it('throws on non-primitive $contains', async () => { + await expect( + query({ + 'metadata.tags': { $contains: { nested: 'object' } } as any, + }), + ).rejects.toThrow( + /Non primitive forms of the \$contains operator is not supported/, + ); + }); + }); + + describe('nested operators', () => { + it('handles nested logical operators', async () => { + await expect( + query({ + $all: [ + { kind: 'component' }, + { + $any: [{ 'spec.type': 'service' }, { 'spec.type': 'website' }], + }, + { $not: { 'spec.lifecycle': 'experimental' } }, + ], + }), + ).resolves.toEqual(['service-a', 'website-c']); + }); + }); + + describe('combined filter and query', () => { + it('combines filter and query independently', async () => { + const q = + knex('final_entities').whereNotNull( + 'final_entity', + ); + applyEntityFilterToQuery({ + filter: { key: 'kind', values: ['component'] }, + query: { 'spec.type': 'service' }, + targetQuery: q, + onEntityIdField: 'final_entities.entity_id', + knex, + }); + const result = await q.then(rows => + rows + .map(row => JSON.parse(row.final_entity!).metadata.name) + .toSorted(), + ); + expect(result).toEqual(['service-a', 'service-b']); }); - const result = await q.then(rows => - rows.map(row => JSON.parse(row.final_entity!).metadata.name).toSorted(), - ); - expect(result).toEqual(['service-a', 'service-b']); }); }, ); diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index e7cf152184..27701a90ef 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -45,11 +45,9 @@ export function applyPredicateEntityFilterToQuery(options: { // We do not support top-level primitives; all matching happens through objects if (!isObject(filter)) { + const actual = JSON.stringify(filter); throw new InputError( - `Invalid filter predicate: top-level primitive values are not supported. ` + - `Wrap the value in a field expression, e.g. { "kind": ${JSON.stringify( - filter, - )} }`, + `Invalid filter predicate: top-level primitive values are not supported. Wrap the value in a field expression, e.g. { "kind": ${actual} }`, ); } @@ -171,14 +169,39 @@ function applyFieldCondition(options: { } if ('$contains' in value) { - // TODO(freben): Implement this, AT LEAST for some special cases such as tags and relations. - throw new InputError('The $contains operator is not supported'); + const target = value.$contains; + + // If the target is a primitive, match on the special array syntax. + // + // FROM: `{ "a": { "$contains": "b" } }` + // + // TO: `{ "a.b": "true" }` + // + // The search table does not actually show us that "a" was an array to + // begin with, so this can mistakenly also match on an object that had a + // "b" key with a true value. We'll consider that an acceptable tradeoff + // though. + if (isPrimitive(target)) { + const matchQuery = knex('search') + .select('search.entity_id') + .where({ + key: `${key}.${String(target).toLocaleLowerCase('en-US')}`, + value: 'true', + }); + return targetQuery.andWhere(onEntityIdField, 'in', matchQuery); + } + + // TODO(freben): Implement this for more use cases - for example simple + // objects (resulting in a $and and appending key strings) and maybe + // a subset of relations? + throw new InputError( + 'Non primitive forms of the $contains operator is not supported', + ); } } + const actual = JSON.stringify(value); throw new InputError( - `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, or $hasPrefix operator, but got ${JSON.stringify( - value, - )}`, + `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, or $hasPrefix operator, but got ${actual}`, ); } From bec9fe21d7bd2d070ba07b870600e94c7d1a024a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Fri, 20 Feb 2026 17:04:59 +0100 Subject: [PATCH 181/455] implement relations contains MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../applyPredicateEntityFilterToQuery.test.ts | 132 +++++++++++++++++- .../applyPredicateEntityFilterToQuery.ts | 132 +++++++++++++++++- 2 files changed, 256 insertions(+), 8 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts index 7f07cad11e..cea9d961f7 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.test.ts @@ -45,18 +45,24 @@ describe.each(databases.eachSupportedId())( kind: 'Component', metadata: { name: 'service-a', namespace: 'default' }, spec: { type: 'service', lifecycle: 'production', owner: 'team-a' }, + relations: [ + { type: 'ownedBy', targetRef: 'group:default/team-a' }, + { type: 'consumesApi', targetRef: 'api:default/api-d' }, + ], }); await addEntity({ apiVersion: 'backstage.io/v1alpha1', kind: 'Component', metadata: { name: 'service-b', namespace: 'default' }, spec: { type: 'service', lifecycle: 'experimental', owner: 'team-b' }, + relations: [{ type: 'ownedBy', targetRef: 'group:default/team-b' }], }); await addEntity({ apiVersion: 'backstage.io/v1alpha1', kind: 'Component', metadata: { name: 'website-c', namespace: 'default' }, spec: { type: 'website', lifecycle: 'production', owner: 'team-a' }, + relations: [{ type: 'ownedBy', targetRef: 'group:default/team-a' }], }); await addEntity({ apiVersion: 'backstage.io/v1alpha1', @@ -147,6 +153,12 @@ describe.each(databases.eachSupportedId())( ]); }); + it('throws on unsupported field operator', async () => { + await expect(query({ kind: { $bad: 'value' } as any })).rejects.toThrow( + /\$contains operator, but got/, + ); + }); + it('throws on top-level primitive', async () => { await expect(query('bad-value' as any)).rejects.toThrow( /top-level primitive values are not supported/, @@ -252,13 +264,127 @@ describe.each(databases.eachSupportedId())( ).resolves.toEqual(['bare-e']); }); - it('throws on non-primitive $contains', async () => { + it('matches relations by type only (existence)', async () => { + await expect( + query({ relations: { $contains: { type: 'consumesApi' } } }), + ).resolves.toEqual(['service-a']); + }); + + it('matches relations by type and exact targetRef', async () => { await expect( query({ - 'metadata.tags': { $contains: { nested: 'object' } } as any, + relations: { + $contains: { + type: 'ownedBy', + targetRef: 'group:default/team-a', + }, + }, + }), + ).resolves.toEqual(['service-a', 'website-c']); + }); + + it('matches relations by type and targetRef case-insensitively', async () => { + await expect( + query({ + relations: { + $contains: { + type: 'OwnedBy', + targetRef: 'Group:Default/Team-A', + }, + }, + }), + ).resolves.toEqual(['service-a', 'website-c']); + }); + + it('handles mixed-case keys in $contains object', async () => { + await expect( + query({ + relations: { + $contains: { + TyPe: 'ownedBy', + TargetRef: 'group:default/team-a', + }, + }, + } as any), + ).resolves.toEqual(['service-a', 'website-c']); + }); + + it('matches relations by type and targetRef with $in', async () => { + await expect( + query({ + relations: { + $contains: { + type: 'ownedBy', + targetRef: { + $in: ['group:default/team-a', 'group:default/team-b'], + }, + }, + }, + }), + ).resolves.toEqual(['service-a', 'service-b', 'website-c']); + }); + + it('throws on unsupported keys in $contains object', async () => { + await expect( + query({ + relations: { + $contains: { type: 'ownedBy', badKey: 'value' }, + } as any, + }), + ).rejects.toThrow(/Unsupported key "badKey" in \$contains/); + }); + + it('throws on duplicate keys in $contains object', async () => { + await expect( + query({ + relations: { + // JSON.parse allows duplicate keys, last one wins, but we + // simulate via an object that has both casings + $contains: JSON.parse('{"type": "ownedBy", "Type": "ownedBy"}'), + }, + }), + ).rejects.toThrow(/Duplicate key "Type" in \$contains/); + }); + + it('throws on $contains object without type', async () => { + await expect( + query({ + relations: { + $contains: { targetRef: 'group:default/team-a' }, + } as any, + }), + ).rejects.toThrow(/requires a "type" string property/); + }); + + it('throws on empty $in array in targetRef', async () => { + await expect( + query({ + relations: { + $contains: { type: 'ownedBy', targetRef: { $in: [] } }, + }, + }), + ).rejects.toThrow(/Empty "\$in" array for \$contains on "relations"/); + }); + + it('throws on unsupported targetRef value', async () => { + await expect( + query({ + relations: { + $contains: { type: 'ownedBy', targetRef: ['bad'] }, + } as any, + }), + ).rejects.toThrow(/Unsupported value in \$contains for "relations"/); + }); + + it('throws on object $contains for non-relations fields', async () => { + await expect( + query({ + 'metadata.tags': { + $contains: { type: 'something' }, + } as any, }), ).rejects.toThrow( - /Non primitive forms of the \$contains operator is not supported/, + /Object form of \$contains is not supported for field/, ); }); }); diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index 27701a90ef..a44f878abd 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -191,17 +191,139 @@ function applyFieldCondition(options: { return targetQuery.andWhere(onEntityIdField, 'in', matchQuery); } - // TODO(freben): Implement this for more use cases - for example simple - // objects (resulting in a $and and appending key strings) and maybe - // a subset of relations? + // Object form of $contains - currently only supports relation-style + // objects with "type" and optional "targetRef" keys. + // + // FROM: `{ "relations": { "$contains": { "type": "ownedBy", "targetRef": "group:default/team-a" } } }` + // + // TO: search for key = "relations.ownedby" AND value = "group:default/team-a" + if (isObject(target)) { + if (key === 'relations') { + return applyContainsRelation({ + target, + targetQuery, + onEntityIdField, + knex, + }); + } + + throw new InputError( + `Object form of $contains is not supported for field "${key}"`, + ); + } + + const actual = JSON.stringify(target); throw new InputError( - 'Non primitive forms of the $contains operator is not supported', + `Unsupported $contains target for field "${key}": ${actual}`, ); } } const actual = JSON.stringify(value); throw new InputError( - `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, or $hasPrefix operator, but got ${actual}`, + `Invalid filter predicate value for field "${key}": expected a primitive value, $exists, $in, $hasPrefix, or $contains operator, but got ${actual}`, ); } + +/** + * Handles expressions on the form + * + * ``` + * { + * "relations": { + * "$contains": { + * "type": "ownedBy", + * "targetRef": "group:default/team-a" + * } + * } + * } + * ``` + * + * which map onto the search table's special `relation.: ` + * syntax. + * + * Only the keys "type" and "targetRef" are supported. The "type" key is + * required. If "targetRef" is omitted, it becomes an existence check for any + * relation of that type. The "targetRef" value can be a string or an `$in` + * array. + */ +function applyContainsRelation(options: { + target: Record; + targetQuery: Knex.QueryBuilder; + onEntityIdField: string; + knex: Knex; +}): Knex.QueryBuilder { + const { target: rawTarget, targetQuery, onEntityIdField, knex } = options; + + function parseStringOrIn(value: unknown): string[] { + if (typeof value === 'string') { + return [value.toLocaleLowerCase('en-US')]; + } + if ( + isObject(value) && + Object.keys(value).length === 1 && + '$in' in value && + Array.isArray(value.$in) && + value.$in.every((v): v is string => typeof v === 'string') + ) { + if (value.$in.length === 0) { + throw new InputError( + `Empty "$in" array for $contains on "relations" is not allowed`, + ); + } + return value.$in.map(v => v.toLocaleLowerCase('en-US')); + } + const actual = JSON.stringify(value); + throw new InputError( + `Unsupported value in $contains for "relations": expected a string or { "$in": [strings] }, but got ${actual}`, + ); + } + + let type: string | undefined; + let targetRef: string[] | undefined; + + for (const [rawKey, value] of Object.entries(rawTarget)) { + const key = rawKey.toLocaleLowerCase('en-US'); + + if (key === 'type') { + if (type !== undefined) { + throw new InputError( + `Duplicate key "${rawKey}" in $contains for "relations"`, + ); + } + if (typeof value !== 'string') { + throw new InputError( + `The $contains operator for "relations" requires a "type" string property`, + ); + } + type = value; + } else if (key === 'targetref') { + if (targetRef !== undefined) { + throw new InputError( + `Duplicate key "${rawKey}" in $contains for "relations"`, + ); + } + targetRef = parseStringOrIn(value); + } else { + throw new InputError( + `Unsupported key "${rawKey}" in $contains for "relations". Only "type" and "targetRef" are supported`, + ); + } + } + + if (!type) { + throw new InputError( + `The $contains operator for "relations" requires a "type" string property`, + ); + } + + const matchQuery = knex('search') + .select('search.entity_id') + .where({ key: `relations.${type.toLocaleLowerCase('en-US')}` }); + + if (targetRef) { + matchQuery.whereIn('value', targetRef); + } + + return targetQuery.andWhere(onEntityIdField, 'in', matchQuery); +} From 01914bc201e8e7bbdf11931cdecc4c10c6b8e913 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:40:38 -0500 Subject: [PATCH 182/455] trying to fix prettier errors Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> From c4aa99e8d5a7d31ee312e426ff9c9b74379a94b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Sat, 21 Feb 2026 14:34:56 +0100 Subject: [PATCH 183/455] clarify changeset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/rich-ducks-ring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/rich-ducks-ring.md b/.changeset/rich-ducks-ring.md index ea8a3e8016..5f046e31b2 100644 --- a/.changeset/rich-ducks-ring.md +++ b/.changeset/rich-ducks-ring.md @@ -5,6 +5,6 @@ Added predicate-based entity filtering via POST /entities/by-query endpoint. -Supports `$all`, `$any`, `$not`, `$exists`, `$in`, and `$hasPrefix` operators for expressive entity queries. Integrated into the existing `queryEntities` flow with full cursor-based pagination, permission enforcement, and `totalItems` support. +Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$hasPrefix`, and (partially) `$contains` operators for expressive entity queries. Integrated into the existing `queryEntities` flow with full cursor-based pagination, permission enforcement, and `totalItems` support. The catalog client's `queryEntities()` method automatically routes to the POST endpoint when a `query` predicate is provided. From 72747b4b55d88db7e6012b9fe3cf530a5df87527 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Sat, 21 Feb 2026 10:02:13 -0600 Subject: [PATCH 184/455] Catalog - Deprecated two moved processors Signed-off-by: Andre Wanlin --- .changeset/rare-falcons-pump.md | 8 ++++++++ plugins/catalog-backend/report.api.md | 4 ++-- .../src/processors/AnnotateScmSlugEntityProcessor.ts | 5 ++++- .../catalog-backend/src/processors/CodeOwnersProcessor.ts | 5 ++++- 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 .changeset/rare-falcons-pump.md diff --git a/.changeset/rare-falcons-pump.md b/.changeset/rare-falcons-pump.md new file mode 100644 index 0000000000..78b0f48f8c --- /dev/null +++ b/.changeset/rare-falcons-pump.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Deprecated two processors as they have been moved to the Community Plugins repo with their own backend modules: + +- `AnnotateScmSlugEntityProcessor`: Use `@backstage-community/plugin-catalog-backend-module-annotate-scm-slug` instead +- `CodeOwnersProcessor`: Use `@backstage-community/plugin-catalog-backend-module-codeowners` instead diff --git a/plugins/catalog-backend/report.api.md b/plugins/catalog-backend/report.api.md index 9fc3041d6f..610548aec6 100644 --- a/plugins/catalog-backend/report.api.md +++ b/plugins/catalog-backend/report.api.md @@ -31,7 +31,7 @@ export class AnnotateLocationEntityProcessor implements CatalogProcessor { ): Promise; } -// @public (undocumented) +// @public @deprecated (undocumented) export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { constructor(opts: { scmIntegrationRegistry: ScmIntegrationRegistry; @@ -76,7 +76,7 @@ export const CATALOG_ERRORS_TOPIC = 'experimental.catalog.errors'; const catalogPlugin: BackendFeature; export default catalogPlugin; -// @public (undocumented) +// @public @deprecated (undocumented) export class CodeOwnersProcessor implements CatalogProcessor { constructor(options: { integrations: ScmIntegrationRegistry; diff --git a/plugins/catalog-backend/src/processors/AnnotateScmSlugEntityProcessor.ts b/plugins/catalog-backend/src/processors/AnnotateScmSlugEntityProcessor.ts index a000f2f422..2cf9fcb24d 100644 --- a/plugins/catalog-backend/src/processors/AnnotateScmSlugEntityProcessor.ts +++ b/plugins/catalog-backend/src/processors/AnnotateScmSlugEntityProcessor.ts @@ -29,7 +29,10 @@ const GITHUB_ACTIONS_ANNOTATION = 'github.com/project-slug'; const GITLAB_ACTIONS_ANNOTATION = 'gitlab.com/project-slug'; const AZURE_ACTIONS_ANNOTATION = 'dev.azure.com/project-repo'; -/** @public */ +/** + * @public + * @deprecated Use `@backstage-community/plugin-catalog-backend-module-annotate-scm-slug` instead, this will be removed in a future release + */ export class AnnotateScmSlugEntityProcessor implements CatalogProcessor { private readonly opts: { scmIntegrationRegistry: ScmIntegrationRegistry; diff --git a/plugins/catalog-backend/src/processors/CodeOwnersProcessor.ts b/plugins/catalog-backend/src/processors/CodeOwnersProcessor.ts index f6dc27101c..24dc2b9b54 100644 --- a/plugins/catalog-backend/src/processors/CodeOwnersProcessor.ts +++ b/plugins/catalog-backend/src/processors/CodeOwnersProcessor.ts @@ -28,7 +28,10 @@ import { LoggerService, UrlReaderService } from '@backstage/backend-plugin-api'; const ALLOWED_KINDS = ['API', 'Component', 'Domain', 'Resource', 'System']; const ALLOWED_LOCATION_TYPES = ['url']; -/** @public */ +/** + * @public + * @deprecated Use `@backstage-community/plugin-catalog-backend-module-codeowners` instead, this will be removed in a future release + */ export class CodeOwnersProcessor implements CatalogProcessor { private readonly integrations: ScmIntegrationRegistry; private readonly logger: LoggerService; From 4a47c603e1ec2eedbe26821be292a30f41e66c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Sat, 21 Feb 2026 16:10:40 +0100 Subject: [PATCH 185/455] add docs too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- docs/features/software-catalog/api.md | 187 +++++++++++++++++++++++ packages/catalog-client/report.api.md | 2 +- packages/catalog-client/src/types/api.ts | 10 +- 3 files changed, 194 insertions(+), 5 deletions(-) diff --git a/docs/features/software-catalog/api.md b/docs/features/software-catalog/api.md index ca8b8f638d..3cd70538c2 100644 --- a/docs/features/software-catalog/api.md +++ b/docs/features/software-catalog/api.md @@ -210,6 +210,193 @@ if `prevCursor` exists, it can be used to retrieve the previous batch of entitie it isn't possible to change any of [`filter`, `orderField`, `fullTextFilter`] when passing `cursor` as query parameters, as changing any of these properties will affect pagination. If any of `filter`, `orderField`, `fullTextFilter` is specified together with `cursor`, only the latter is taken into consideration. +### `POST /entities/by-query` + +This supports the same features as the `GET` variant, but in a `POST` body to +not have to abide by URL length limits. Additionally, it supports advanced, more +expressive querying format - see below. The response format is identical. + +#### Querying by filter predicate + +You can pass in a filter predicate to select a subset of entities in the +catalog. They are comprised of an optional logical expression tree (using +`$all`, `$any`, `$not`), ending in filter sets that can have custom matchers +(e.g. `$exists`, `$in`, `$hasPrefix`, `$contains`). + +This is an example of what such a filter predicate expression might look like: + +```js +{ + "query": { + "$all": [ + { + "kind": "Component", + "spec.type": { "$in": ["service", "website"] } + }, + { + "$not": { + "metadata.annotations.backstage.io/orphan": "true" + } + } + ] + } +} +``` + +A filter set is an object whose keys are dot separated paths into an object, and +the values are either primitives (string, number, or boolean) or custom matchers +as per below. An example of a simple such filter set is: + +```js +// All of the following must be true for a given entity (there's an +// implicit AND between them) +{ + // The kind field is matched against a literal, case insensitively + "kind": "Component", + // The type field inside the spec is matched using a custom matcher, see below + "spec.type": { "$in": ["service", "website"] } +} +``` + +The root of the query is always an object, whether there is a logic expression +tree or not. Nodes with a single key that starts with a `$` sign have special +meaning. + +- `$not`: Logical negation. + + Its value must be a single expression. Example: + + ```js + // Matches entities that do NOT have kind Component + { + "$not": { + "kind": "Component", + } + } + ``` + + Note that `$not` cannot be used in a right hand side value matcher. + + ```js + // ❌ WRONG + { "kind": { "$not": "Component" } } + // ✅ CORRECT + { "$not": { "kind": "Component" } } + ``` + +- `$all`: Require that all given expressions match each entity. + + Its value must be an array of expressions. Example: + + ```js + // Matches entities that BOTH have kind Component and type website + { + "$all": [ + { "kind": "Component" }, + { "spec.type": "website" } + ] + } + ``` + + An empty array always matches every entity. + +- `$any`: Require that at least one of a set of expressions match a given entity. + + Its value must be an array of expressions. Example: + + ```js + // Matches entities that EITHER have kind Component or type website + { + "$any": [ + { "kind": "Component" }, + { "spec.type": "website" } + ] + } + ``` + + An empty array never matches anything. + +- `$exists`: Assert on the existence of fields. + + Its value is either `true`, meaning that the field must exist on the entity + (no matter what its value), or `false`, meaning that it must not exist. + Example: + + ```js + // Matches entities that DO NOT have that annotation, ignoring what the + // value might be + { + "metadata.annotations.backstage.io/orphan": { + "$exists": false + }, + } + ``` + +- `$in`: Assert that a field has any of a set of primitive values. + + Its value must be an array of string, number, and/or boolean values. Example: + + ```js + // Matches entities whose type is EITHER service or website + { + "spec.type": { + "$in": ["service", "website"] + } + } + ``` + + The matching is case insensitive. An empty array never matches anything. + +- `$hasPrefix`: Assert that a field is a string that starts with a certain prefix text. + + Its value is a string. Example: + + ```js + // Matches entities whose project slug annotation starts with "backstage/" + { + "metadata.annotations.github.com/project-slug": { + "$hasPrefix": "backstage/" + } + } + ``` + + The matching is case insensitive, and captures both exact matches and strings + that start with the given prefix. + +- `$contains`: Assert that an array contains an element that matches the given expression. + + There is only limited support for this matcher. One use case is for relations: + + ```js + { + // Specifically type and (optionally) targetRef supported, and only + // with equality or "$in" for the targetRef + "relations": { + "$contains": { + "type": "ownedBy", + "targetRef": { + "$in": ["user:default/foo", "group:default/bar"] + } + } + } + } + ``` + + The other use case is for arrays where you match with a primitive value, such + as labels. Example: + + ```js + { + // Works for any field, as long as the value is a primitive + // (either string, number, or boolean) + "metadata.labels": { + "$contains": "java" + } + } + ``` + + In every case, the matching is case insensitive. + ### `GET /entities` Lists entities. diff --git a/packages/catalog-client/report.api.md b/packages/catalog-client/report.api.md index cc83cce443..0d71e6bc59 100644 --- a/packages/catalog-client/report.api.md +++ b/packages/catalog-client/report.api.md @@ -8,7 +8,7 @@ import type { AnalyzeLocationResponse } from '@backstage/plugin-catalog-common'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { Entity } from '@backstage/catalog-model'; import type { FilterPredicate } from '@backstage/filter-predicates'; -import { SerializedError } from '@backstage/errors'; +import type { SerializedError } from '@backstage/errors'; // @public export type AddLocationRequest = { diff --git a/packages/catalog-client/src/types/api.ts b/packages/catalog-client/src/types/api.ts index 64d01c0972..c39c0c872e 100644 --- a/packages/catalog-client/src/types/api.ts +++ b/packages/catalog-client/src/types/api.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { CompoundEntityRef, Entity } from '@backstage/catalog-model'; -import { SerializedError } from '@backstage/errors'; +import type { CompoundEntityRef, Entity } from '@backstage/catalog-model'; +import type { SerializedError } from '@backstage/errors'; import type { AnalyzeLocationRequest, AnalyzeLocationResponse, @@ -438,7 +438,9 @@ export type QueryEntitiesInitialRequest = { */ filter?: EntityFilterQuery; /** - * Predicate-based filter with logical operators ($all, $any, $not, $exists, $in, $hasPrefix). + * Predicate-based filter with operators for logical expressions (`$all`, + * `$any`, and `$not`) and matching (`$exists`, `$in`, `$hasPrefix`, and + * (partially) `$contains`). * * @example * ```typescript @@ -446,7 +448,7 @@ export type QueryEntitiesInitialRequest = { * query: { * $all: [ * { kind: 'component' }, - * { 'spec.type': 'service' } + * { 'spec.type': { $in: ['service', 'website'] } } * ] * } * } From ebd463070223fe497aa821fd7bdb51466e49c783 Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Thu, 29 Jan 2026 09:03:19 +0100 Subject: [PATCH 186/455] chore: replace legacy package.json workspaces.packages by workspaces Signed-off-by: Gabriel Dugny --- .changeset/slow-items-pull.md | 18 ++++++++++++++++++ docs/contribute/project-structure.md | 10 ++++------ package.json | 10 ++++------ .../templates/default-app/package.json.hbs | 10 ++++------ .../templates/next-app/package.json.hbs | 10 ++++------ 5 files changed, 34 insertions(+), 24 deletions(-) create mode 100644 .changeset/slow-items-pull.md diff --git a/.changeset/slow-items-pull.md b/.changeset/slow-items-pull.md new file mode 100644 index 0000000000..50f4897fa5 --- /dev/null +++ b/.changeset/slow-items-pull.md @@ -0,0 +1,18 @@ +--- +'@backstage/create-app': patch +--- + +Replace `package.json` deprecated `workspaces.packages` by `workspaces` + +This change is **not** required, but you can edit your main `package.json`, to fit the more modern & more common pattern: + +```diff +- "workspaces": { +- "packages": [ + "workspaces": [ + "packages/*", + "plugins/*" +- ] +- }, + ], +``` diff --git a/docs/contribute/project-structure.md b/docs/contribute/project-structure.md index f58afedee8..372fb79844 100644 --- a/docs/contribute/project-structure.md +++ b/docs/contribute/project-structure.md @@ -55,12 +55,10 @@ defined in [`package.json`](https://github.com/backstage/backstage/blob/master/package.json): ```json - "workspaces": { - "packages": [ - "packages/*", - "plugins/*" - ] - }, + "workspaces": [ + "packages/*", + "plugins/*" + ], ``` Let's look at them individually. diff --git a/package.json b/package.json index a0a530adb8..5a63fbc2db 100644 --- a/package.json +++ b/package.json @@ -16,12 +16,10 @@ "type": "git", "url": "https://github.com/backstage/backstage" }, - "workspaces": { - "packages": [ - "packages/*", - "plugins/*" - ] - }, + "workspaces": [ + "packages/*", + "plugins/*" + ], "scripts": { "build-storybook": "storybook build --output-dir dist-storybook", "build-storybook:chromatic": "STORYBOOK_STORY_SET=chromatic storybook build --stats-json --output-dir dist-storybook", diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index 4e723ea078..229ed5ffa0 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -22,12 +22,10 @@ "prettier:check": "prettier --check .", "new": "backstage-cli new" }, - "workspaces": { - "packages": [ - "packages/*", - "plugins/*" - ] - }, + "workspaces": [ + "packages/*", + "plugins/*" + ], "devDependencies": { "@backstage/cli": "^{{version '@backstage/cli'}}", "@backstage/e2e-test-utils": "^{{version '@backstage/e2e-test-utils'}}", diff --git a/packages/create-app/templates/next-app/package.json.hbs b/packages/create-app/templates/next-app/package.json.hbs index 80ff4a9a06..27d5880c11 100644 --- a/packages/create-app/templates/next-app/package.json.hbs +++ b/packages/create-app/templates/next-app/package.json.hbs @@ -44,12 +44,10 @@ } } }, - "workspaces": { - "packages": [ - "packages/*", - "plugins/*" - ] - }, + "workspaces": [ + "packages/*", + "plugins/*" + ], "devDependencies": { "@backstage/cli": "^{{version '@backstage/cli'}}", "@backstage/e2e-test-utils": "^{{version '@backstage/e2e-test-utils'}}", From a9d23c4a322717b14648dfbc3c38d206a0f1cfd4 Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Thu, 29 Jan 2026 10:24:31 +0100 Subject: [PATCH 187/455] fix: Support workspaces in CLIs Signed-off-by: Gabriel Dugny --- .changeset/slick-dogs-pay.md | 8 +++ packages/cli-common/report.api.md | 3 ++ packages/cli-common/src/index.ts | 2 +- packages/cli-common/src/paths.ts | 21 +++++++- packages/cli-node/src/monorepo/isMonoRepo.ts | 3 +- .../src/pacman/PackageManager.test.ts | 12 ++++- .../cli-node/src/pacman/PackageManager.ts | 4 +- .../cli-node/src/pacman/yarn/Yarn.test.ts | 11 +++- packages/cli-node/src/pacman/yarn/Yarn.ts | 3 +- packages/cli/config/jest.js | 6 +-- .../cli/src/lib/versioning/packages.test.ts | 4 +- .../migrate/commands/versions/bump.test.ts | 52 +++++-------------- .../migrate/commands/versions/migrate.test.ts | 12 ++--- 13 files changed, 79 insertions(+), 62 deletions(-) create mode 100644 .changeset/slick-dogs-pay.md diff --git a/.changeset/slick-dogs-pay.md b/.changeset/slick-dogs-pay.md new file mode 100644 index 0000000000..f75382aa02 --- /dev/null +++ b/.changeset/slick-dogs-pay.md @@ -0,0 +1,8 @@ +--- +'@backstage/cli-common': patch +'@backstage/create-app': patch +'@backstage/cli-node': patch +'@backstage/cli': patch +--- + +Properly support `package.json` `workspaces` field diff --git a/packages/cli-common/report.api.md b/packages/cli-common/report.api.md index 96475c6bd1..ec146f78c4 100644 --- a/packages/cli-common/report.api.md +++ b/packages/cli-common/report.api.md @@ -23,6 +23,9 @@ export class ExitCodeError extends CustomErrorBase { // @public export function findPaths(searchDir: string): Paths; +// @public +export function getWorkspacesPatterns(pkgJson: any): string[]; + // @public export function isChildPath(base: string, path: string): boolean; diff --git a/packages/cli-common/src/index.ts b/packages/cli-common/src/index.ts index d11601b044..146af314cd 100644 --- a/packages/cli-common/src/index.ts +++ b/packages/cli-common/src/index.ts @@ -20,7 +20,7 @@ * @packageDocumentation */ -export { findPaths, BACKSTAGE_JSON } from './paths'; +export { findPaths, getWorkspacesPatterns, BACKSTAGE_JSON } from './paths'; export { isChildPath } from './isChildPath'; export type { Paths, ResolveFunc } from './paths'; export { bootstrapEnvProxyAgents } from './proxyBootstrap'; diff --git a/packages/cli-common/src/paths.ts b/packages/cli-common/src/paths.ts index 5da2d596a4..557af7ccca 100644 --- a/packages/cli-common/src/paths.ts +++ b/packages/cli-common/src/paths.ts @@ -107,6 +107,25 @@ export function findOwnRootDir(ownDir: string) { return resolvePath(ownDir, '../..'); } +/** + * Gets the workspaces pattern from a package.json object. + * @param pkgJson - The package.json object to get the workspaces pattern from. + * @returns The workspaces patterns (glob not resolved). + * @public + */ +export function getWorkspacesPatterns(pkgJson: any): string[] { + if (Array.isArray(pkgJson.workspaces)) { + return pkgJson.workspaces; + } else if ( + typeof pkgJson.workspaces === 'object' && + pkgJson.workspaces !== null && + Array.isArray(pkgJson.workspaces.packages) + ) { + return pkgJson.workspaces.packages; + } + return []; +} + /** * Find paths related to a package and its execution context. * @@ -141,7 +160,7 @@ export function findPaths(searchDir: string): Paths { try { const content = fs.readFileSync(path, 'utf8'); const data = JSON.parse(content); - return Boolean(data.workspaces); + return getWorkspacesPatterns(data).length > 0; } catch (error) { throw new Error( `Failed to parse package.json file while searching for root, ${error}`, diff --git a/packages/cli-node/src/monorepo/isMonoRepo.ts b/packages/cli-node/src/monorepo/isMonoRepo.ts index da78c8dd53..9cb19ea62f 100644 --- a/packages/cli-node/src/monorepo/isMonoRepo.ts +++ b/packages/cli-node/src/monorepo/isMonoRepo.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { getWorkspacesPatterns } from '@backstage/cli-common'; import { paths } from '../paths'; import fs from 'fs-extra'; @@ -26,7 +27,7 @@ export async function isMonoRepo(): Promise { const rootPackageJsonPath = paths.resolveTargetRoot('package.json'); try { const pkg = await fs.readJson(rootPackageJsonPath); - return Boolean(pkg?.workspaces?.packages); + return getWorkspacesPatterns(pkg).length > 0; } catch (error) { return false; } diff --git a/packages/cli-node/src/pacman/PackageManager.test.ts b/packages/cli-node/src/pacman/PackageManager.test.ts index dd35e74902..fd7ace5bcb 100644 --- a/packages/cli-node/src/pacman/PackageManager.test.ts +++ b/packages/cli-node/src/pacman/PackageManager.test.ts @@ -43,7 +43,7 @@ describe('PackageManager', () => { expect(mockYarnCreate).toHaveBeenCalled(); }); - it('should detect via root package.json workspaces', async () => { + it('should detect via root package.json workspaces with legacy workspaces.packages field', async () => { mockDir.setContent({ 'package.json': JSON.stringify({ name: 'foo', @@ -55,6 +55,16 @@ describe('PackageManager', () => { await detectPackageManager(); expect(mockYarnCreate).toHaveBeenCalled(); }); + it('should detect via root package.json workspaces', async () => { + mockDir.setContent({ + 'package.json': JSON.stringify({ + name: 'foo', + workspaces: [], + }), + }); + await detectPackageManager(); + expect(mockYarnCreate).toHaveBeenCalled(); + }); it('should detect via root package.json packageManager', async () => { mockDir.setContent({ diff --git a/packages/cli-node/src/pacman/PackageManager.ts b/packages/cli-node/src/pacman/PackageManager.ts index 44c0849705..5693acce06 100644 --- a/packages/cli-node/src/pacman/PackageManager.ts +++ b/packages/cli-node/src/pacman/PackageManager.ts @@ -17,7 +17,7 @@ import { Yarn } from './yarn'; import { Lockfile } from './Lockfile'; import { paths } from '../paths'; -import { RunOptions } from '@backstage/cli-common'; +import { getWorkspacesPatterns, RunOptions } from '@backstage/cli-common'; import fs from 'fs-extra'; /** @@ -101,7 +101,7 @@ export async function detectPackageManager(): Promise { const packageJson = await fs.readJson( paths.resolveTargetRoot('package.json'), ); - if (packageJson.workspaces) { + if (getWorkspacesPatterns(packageJson).length > 0) { // technically this could be NPM as well return await Yarn.create(); } diff --git a/packages/cli-node/src/pacman/yarn/Yarn.test.ts b/packages/cli-node/src/pacman/yarn/Yarn.test.ts index 9bf866b821..f13b5a0296 100644 --- a/packages/cli-node/src/pacman/yarn/Yarn.test.ts +++ b/packages/cli-node/src/pacman/yarn/Yarn.test.ts @@ -30,7 +30,7 @@ const allYarnVersions = [yarnClassic, yarnBerry]; describe('Yarn', () => { describe.each(allYarnVersions)('%s.getMonorepoPackages', yarn => { - it('should detect a monorepo', async () => { + it('should detect a monorepo with workspaces.packages field', async () => { mockDir.setContent({ 'package.json': JSON.stringify({ name: 'foo', @@ -41,6 +41,15 @@ describe('Yarn', () => { }); await expect(yarn.getMonorepoPackages()).resolves.toEqual(['packages/*']); }); + it('should detect a monorepo', async () => { + mockDir.setContent({ + 'package.json': JSON.stringify({ + name: 'foo', + workspaces: ['packages/*'], + }), + }); + await expect(yarn.getMonorepoPackages()).resolves.toEqual(['packages/*']); + }); it('should detect a non-monorepo', async () => { mockDir.setContent({ diff --git a/packages/cli-node/src/pacman/yarn/Yarn.ts b/packages/cli-node/src/pacman/yarn/Yarn.ts index a6544344ca..4658a256c6 100644 --- a/packages/cli-node/src/pacman/yarn/Yarn.ts +++ b/packages/cli-node/src/pacman/yarn/Yarn.ts @@ -25,6 +25,7 @@ import { YarnVersion } from './types'; import fs from 'fs-extra'; import { paths } from '../../paths'; import { run, runOutput, RunOptions } from '@backstage/cli-common'; +import { getWorkspacesPatterns } from '@backstage/cli-common'; export class Yarn implements PackageManager { constructor(private readonly yarnVersion: YarnVersion) {} @@ -50,7 +51,7 @@ export class Yarn implements PackageManager { const rootPackageJsonPath = paths.resolveTargetRoot('package.json'); try { const pkg = await fs.readJson(rootPackageJsonPath); - return pkg?.workspaces?.packages || []; + return getWorkspacesPatterns(pkg); } catch (error) { return []; } diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js index 814f017e1d..09143ac034 100644 --- a/packages/cli/config/jest.js +++ b/packages/cli/config/jest.js @@ -20,6 +20,7 @@ const crypto = require('node:crypto'); const glob = require('node:util').promisify(require('glob')); const { version } = require('../package.json'); const paths = require('@backstage/cli-common').findPaths(process.cwd()); +const { getWorkspacesPatterns } = require('@backstage/cli-common'); const { getJestEnvironment, getJestMajorVersion, @@ -336,11 +337,10 @@ async function getRootConfig() { rejectFrontendNetworkRequests, }; - const workspacePatterns = - rootPkgJson.workspaces && rootPkgJson.workspaces.packages; + const workspacePatterns = getWorkspacesPatterns(rootPkgJson); // Check if we're running within a specific monorepo package. In that case just get the single project config. - if (!workspacePatterns || paths.targetRoot !== paths.targetDir) { + if (workspacePatterns.length === 0 || paths.targetRoot !== paths.targetDir) { return getProjectConfig( paths.targetDir, { diff --git a/packages/cli/src/lib/versioning/packages.test.ts b/packages/cli/src/lib/versioning/packages.test.ts index e823ce8769..8946b8ba2f 100644 --- a/packages/cli/src/lib/versioning/packages.test.ts +++ b/packages/cli/src/lib/versioning/packages.test.ts @@ -104,9 +104,7 @@ describe('mapDependencies', () => { it('should read dependencies', async () => { mockDir.setContent({ 'package.json': JSON.stringify({ - workspaces: { - packages: ['pkgs/*'], - }, + workspaces: ['pkgs/*'], }), pkgs: { a: { diff --git a/packages/cli/src/modules/migrate/commands/versions/bump.test.ts b/packages/cli/src/modules/migrate/commands/versions/bump.test.ts index 202704e030..affd5a9aee 100644 --- a/packages/cli/src/modules/migrate/commands/versions/bump.test.ts +++ b/packages/cli/src/modules/migrate/commands/versions/bump.test.ts @@ -160,9 +160,7 @@ describe('bump', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -255,9 +253,7 @@ describe('bump', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -353,9 +349,7 @@ describe('bump', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -459,9 +453,7 @@ describe('bump', () => { '.yarnrc.yml': yarnRcMock, 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -572,9 +564,7 @@ describe('bump', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -644,9 +634,7 @@ describe('bump', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -750,9 +738,7 @@ describe('bump', () => { mockDir.setContent({ 'yarn.lock': customLockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -865,9 +851,7 @@ describe('bump', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -1099,9 +1083,7 @@ describe('environment variables', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -1192,9 +1174,7 @@ describe('environment variables', () => { 'custom-manifest.json': JSON.stringify(customManifest), 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -1262,9 +1242,7 @@ describe('environment variables', () => { '.yarnrc.yml': yarnRcMock, 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -1337,9 +1315,7 @@ describe('environment variables', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { @@ -1362,9 +1338,7 @@ describe('environment variables', () => { mockDir.setContent({ 'yarn.lock': lockfileMock, 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), packages: { a: { diff --git a/packages/cli/src/modules/migrate/commands/versions/migrate.test.ts b/packages/cli/src/modules/migrate/commands/versions/migrate.test.ts index 936d10e24c..533bdaa954 100644 --- a/packages/cli/src/modules/migrate/commands/versions/migrate.test.ts +++ b/packages/cli/src/modules/migrate/commands/versions/migrate.test.ts @@ -73,9 +73,7 @@ describe('versions:migrate', () => { it('should bump to the moved version when the package is moved', async () => { mockDir.setContent({ 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), node_modules: { '@backstage': { @@ -177,9 +175,7 @@ describe('versions:migrate', () => { it('should replace the occurrences of the moved package in files inside the correct package', async () => { mockDir.setContent({ 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), node_modules: { '@backstage': { @@ -264,9 +260,7 @@ describe('versions:migrate', () => { it('should replace occurrences of changed packages, and is careful', async () => { mockDir.setContent({ 'package.json': JSON.stringify({ - workspaces: { - packages: ['packages/*'], - }, + workspaces: ['packages/*'], }), node_modules: { '@backstage': { From b2d9d78c27e1db07773945315819d9518684d437 Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Thu, 29 Jan 2026 17:43:29 +0100 Subject: [PATCH 188/455] fix: defensive package.json reading Signed-off-by: Gabriel Dugny --- packages/cli-common/report.api.md | 2 +- packages/cli-common/src/index.ts | 3 +- packages/cli-common/src/paths.test.ts | 6 +- packages/cli-common/src/paths.ts | 20 +----- packages/cli-common/src/workspaces.test.ts | 69 +++++++++++++++++++ packages/cli-common/src/workspaces.ts | 63 +++++++++++++++++ .../src/pacman/PackageManager.test.ts | 4 +- 7 files changed, 142 insertions(+), 25 deletions(-) create mode 100644 packages/cli-common/src/workspaces.test.ts create mode 100644 packages/cli-common/src/workspaces.ts diff --git a/packages/cli-common/report.api.md b/packages/cli-common/report.api.md index ec146f78c4..324b28880b 100644 --- a/packages/cli-common/report.api.md +++ b/packages/cli-common/report.api.md @@ -24,7 +24,7 @@ export class ExitCodeError extends CustomErrorBase { export function findPaths(searchDir: string): Paths; // @public -export function getWorkspacesPatterns(pkgJson: any): string[]; +export function getWorkspacesPatterns(pkgJson: unknown): string[]; // @public export function isChildPath(base: string, path: string): boolean; diff --git a/packages/cli-common/src/index.ts b/packages/cli-common/src/index.ts index 146af314cd..e142030b88 100644 --- a/packages/cli-common/src/index.ts +++ b/packages/cli-common/src/index.ts @@ -20,7 +20,8 @@ * @packageDocumentation */ -export { findPaths, getWorkspacesPatterns, BACKSTAGE_JSON } from './paths'; +export { findPaths, BACKSTAGE_JSON } from './paths'; +export { getWorkspacesPatterns } from './workspaces'; export { isChildPath } from './isChildPath'; export type { Paths, ResolveFunc } from './paths'; export { bootstrapEnvProxyAgents } from './proxyBootstrap'; diff --git a/packages/cli-common/src/paths.test.ts b/packages/cli-common/src/paths.test.ts index 6ade904e12..f3d7b9b873 100644 --- a/packages/cli-common/src/paths.test.ts +++ b/packages/cli-common/src/paths.test.ts @@ -98,7 +98,9 @@ describe('paths', () => { }); it('findPaths should find workspace root with object', () => { - jest.spyOn(JSON, 'parse').mockReturnValue({ workspaces: { packages: [] } }); + jest + .spyOn(JSON, 'parse') + .mockReturnValue({ workspaces: { packages: ['packages/*'] } }); jest.spyOn(process, 'cwd').mockReturnValue(__dirname); const paths = findPaths(__dirname); @@ -110,7 +112,7 @@ describe('paths', () => { }); it('findPaths should find workspace root with array', () => { - jest.spyOn(JSON, 'parse').mockReturnValue({ workspaces: [] }); + jest.spyOn(JSON, 'parse').mockReturnValue({ workspaces: ['packages/*'] }); jest.spyOn(process, 'cwd').mockReturnValue(__dirname); const paths = findPaths(__dirname); diff --git a/packages/cli-common/src/paths.ts b/packages/cli-common/src/paths.ts index 557af7ccca..efbb05c7bb 100644 --- a/packages/cli-common/src/paths.ts +++ b/packages/cli-common/src/paths.ts @@ -16,6 +16,7 @@ import fs from 'node:fs'; import { dirname, resolve as resolvePath } from 'node:path'; +import { getWorkspacesPatterns } from './workspaces'; /** * A function that takes a set of path fragments and resolves them into a @@ -107,25 +108,6 @@ export function findOwnRootDir(ownDir: string) { return resolvePath(ownDir, '../..'); } -/** - * Gets the workspaces pattern from a package.json object. - * @param pkgJson - The package.json object to get the workspaces pattern from. - * @returns The workspaces patterns (glob not resolved). - * @public - */ -export function getWorkspacesPatterns(pkgJson: any): string[] { - if (Array.isArray(pkgJson.workspaces)) { - return pkgJson.workspaces; - } else if ( - typeof pkgJson.workspaces === 'object' && - pkgJson.workspaces !== null && - Array.isArray(pkgJson.workspaces.packages) - ) { - return pkgJson.workspaces.packages; - } - return []; -} - /** * Find paths related to a package and its execution context. * diff --git a/packages/cli-common/src/workspaces.test.ts b/packages/cli-common/src/workspaces.test.ts new file mode 100644 index 0000000000..7725aa7e6a --- /dev/null +++ b/packages/cli-common/src/workspaces.test.ts @@ -0,0 +1,69 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getWorkspacesPatterns } from './workspaces'; + +describe('getWorkspacesPatterns', () => { + it('returns empty array when pkgJson has no workspaces key', () => { + expect(getWorkspacesPatterns({ name: 'pkg' })).toEqual([]); + }); + + it('returns patterns when workspaces is array form', () => { + const patterns = ['packages/*', 'apps/*']; + expect(getWorkspacesPatterns({ workspaces: patterns })).toEqual(patterns); + }); + + it('returns patterns when workspaces is object form with packages', () => { + const patterns = ['packages/*']; + expect( + getWorkspacesPatterns({ workspaces: { packages: patterns } }), + ).toEqual(patterns); + }); + + it('returns empty array when workspaces is object without packages array', () => { + expect(getWorkspacesPatterns({ workspaces: {} })).toEqual([]); + expect(getWorkspacesPatterns({ workspaces: { noMatch: [] } })).toEqual([]); + }); + + it('throws when pkgJson is not an object', () => { + expect(() => getWorkspacesPatterns(null)).toThrow( + 'pkgJson must be an object', + ); + expect(() => getWorkspacesPatterns('string')).toThrow( + 'pkgJson must be an object', + ); + expect(() => getWorkspacesPatterns(42)).toThrow( + 'pkgJson must be an object', + ); + }); + + it('throws when workspaces array contains non-strings', () => { + expect(() => getWorkspacesPatterns({ workspaces: ['a', 1, 'b'] })).toThrow( + 'must be an array of strings', + ); + expect(() => getWorkspacesPatterns({ workspaces: [null] })).toThrow( + 'must be an array of strings', + ); + }); + + it('throws when workspaces.packages contains non-strings', () => { + expect(() => + getWorkspacesPatterns({ + workspaces: { packages: ['a', 1] }, + }), + ).toThrow('must be an array of strings'); + }); +}); diff --git a/packages/cli-common/src/workspaces.ts b/packages/cli-common/src/workspaces.ts new file mode 100644 index 0000000000..17fca511a4 --- /dev/null +++ b/packages/cli-common/src/workspaces.ts @@ -0,0 +1,63 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function assertStringArray( + value: unknown, + field: string, +): asserts value is string[] { + if (!Array.isArray(value)) { + throw new Error(`${field} must be an array`); + } + if (!value.every((item): item is string => typeof item === 'string')) { + throw new Error(`${field} must be an array of strings`); + } +} + +/** + * Gets the workspaces patterns from a package.json object. + * + * Supports both the array form (`"workspaces": ["packages/*"]`) and the object + * form (`"workspaces": { "packages": ["packages/*"] }`) from npm/yarn. + * + * @param pkgJson - The package.json object. Type as `unknown` so callers must pass parsed JSON; an object type check is performed. + * @returns The workspaces patterns (globs not resolved). Empty array if none. + * @throws Error if `pkgJson` is not an object or workspaces/packages contain non-strings. + * @public + */ +export function getWorkspacesPatterns(pkgJson: unknown): string[] { + if (typeof pkgJson !== 'object' || pkgJson === null) { + throw new Error('pkgJson must be an object'); + } + if (!('workspaces' in pkgJson)) { + return []; + } + + const workspaces = pkgJson.workspaces; + if (Array.isArray(workspaces)) { + assertStringArray(workspaces, 'pkgJson.workspaces'); + return workspaces; + } + if ( + typeof workspaces === 'object' && + workspaces !== null && + 'packages' in workspaces && + Array.isArray(workspaces.packages) + ) { + assertStringArray(workspaces.packages, 'pkgJson.workspaces.packages'); + return workspaces.packages; + } + return []; +} diff --git a/packages/cli-node/src/pacman/PackageManager.test.ts b/packages/cli-node/src/pacman/PackageManager.test.ts index fd7ace5bcb..e394d2ed60 100644 --- a/packages/cli-node/src/pacman/PackageManager.test.ts +++ b/packages/cli-node/src/pacman/PackageManager.test.ts @@ -48,7 +48,7 @@ describe('PackageManager', () => { 'package.json': JSON.stringify({ name: 'foo', workspaces: { - packages: [], + packages: ['packages/*'], }, }), }); @@ -59,7 +59,7 @@ describe('PackageManager', () => { mockDir.setContent({ 'package.json': JSON.stringify({ name: 'foo', - workspaces: [], + workspaces: ['packages/*'], }), }); await detectPackageManager(); From 0e5fd0fd27f2fb5bec9738f02862a4854210c22c Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Sun, 22 Feb 2026 17:00:06 +0100 Subject: [PATCH 189/455] Revert most changes Signed-off-by: Gabriel Dugny --- .changeset/slick-dogs-pay.md | 1 - packages/cli-common/report.api.md | 3 - packages/cli-common/src/index.ts | 1 - packages/cli-common/src/paths.ts | 3 +- packages/cli-common/src/workspaces.test.ts | 69 ------------------- packages/cli-common/src/workspaces.ts | 63 ----------------- packages/cli-node/src/monorepo/isMonoRepo.ts | 8 ++- .../src/pacman/PackageManager.test.ts | 6 +- .../cli-node/src/pacman/PackageManager.ts | 4 +- packages/cli-node/src/pacman/yarn/Yarn.ts | 6 +- packages/cli/config/jest.js | 6 +- 11 files changed, 18 insertions(+), 152 deletions(-) delete mode 100644 packages/cli-common/src/workspaces.test.ts delete mode 100644 packages/cli-common/src/workspaces.ts diff --git a/.changeset/slick-dogs-pay.md b/.changeset/slick-dogs-pay.md index f75382aa02..409670601e 100644 --- a/.changeset/slick-dogs-pay.md +++ b/.changeset/slick-dogs-pay.md @@ -1,5 +1,4 @@ --- -'@backstage/cli-common': patch '@backstage/create-app': patch '@backstage/cli-node': patch '@backstage/cli': patch diff --git a/packages/cli-common/report.api.md b/packages/cli-common/report.api.md index 324b28880b..96475c6bd1 100644 --- a/packages/cli-common/report.api.md +++ b/packages/cli-common/report.api.md @@ -23,9 +23,6 @@ export class ExitCodeError extends CustomErrorBase { // @public export function findPaths(searchDir: string): Paths; -// @public -export function getWorkspacesPatterns(pkgJson: unknown): string[]; - // @public export function isChildPath(base: string, path: string): boolean; diff --git a/packages/cli-common/src/index.ts b/packages/cli-common/src/index.ts index e142030b88..d11601b044 100644 --- a/packages/cli-common/src/index.ts +++ b/packages/cli-common/src/index.ts @@ -21,7 +21,6 @@ */ export { findPaths, BACKSTAGE_JSON } from './paths'; -export { getWorkspacesPatterns } from './workspaces'; export { isChildPath } from './isChildPath'; export type { Paths, ResolveFunc } from './paths'; export { bootstrapEnvProxyAgents } from './proxyBootstrap'; diff --git a/packages/cli-common/src/paths.ts b/packages/cli-common/src/paths.ts index efbb05c7bb..5da2d596a4 100644 --- a/packages/cli-common/src/paths.ts +++ b/packages/cli-common/src/paths.ts @@ -16,7 +16,6 @@ import fs from 'node:fs'; import { dirname, resolve as resolvePath } from 'node:path'; -import { getWorkspacesPatterns } from './workspaces'; /** * A function that takes a set of path fragments and resolves them into a @@ -142,7 +141,7 @@ export function findPaths(searchDir: string): Paths { try { const content = fs.readFileSync(path, 'utf8'); const data = JSON.parse(content); - return getWorkspacesPatterns(data).length > 0; + return Boolean(data.workspaces); } catch (error) { throw new Error( `Failed to parse package.json file while searching for root, ${error}`, diff --git a/packages/cli-common/src/workspaces.test.ts b/packages/cli-common/src/workspaces.test.ts deleted file mode 100644 index 7725aa7e6a..0000000000 --- a/packages/cli-common/src/workspaces.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2026 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { getWorkspacesPatterns } from './workspaces'; - -describe('getWorkspacesPatterns', () => { - it('returns empty array when pkgJson has no workspaces key', () => { - expect(getWorkspacesPatterns({ name: 'pkg' })).toEqual([]); - }); - - it('returns patterns when workspaces is array form', () => { - const patterns = ['packages/*', 'apps/*']; - expect(getWorkspacesPatterns({ workspaces: patterns })).toEqual(patterns); - }); - - it('returns patterns when workspaces is object form with packages', () => { - const patterns = ['packages/*']; - expect( - getWorkspacesPatterns({ workspaces: { packages: patterns } }), - ).toEqual(patterns); - }); - - it('returns empty array when workspaces is object without packages array', () => { - expect(getWorkspacesPatterns({ workspaces: {} })).toEqual([]); - expect(getWorkspacesPatterns({ workspaces: { noMatch: [] } })).toEqual([]); - }); - - it('throws when pkgJson is not an object', () => { - expect(() => getWorkspacesPatterns(null)).toThrow( - 'pkgJson must be an object', - ); - expect(() => getWorkspacesPatterns('string')).toThrow( - 'pkgJson must be an object', - ); - expect(() => getWorkspacesPatterns(42)).toThrow( - 'pkgJson must be an object', - ); - }); - - it('throws when workspaces array contains non-strings', () => { - expect(() => getWorkspacesPatterns({ workspaces: ['a', 1, 'b'] })).toThrow( - 'must be an array of strings', - ); - expect(() => getWorkspacesPatterns({ workspaces: [null] })).toThrow( - 'must be an array of strings', - ); - }); - - it('throws when workspaces.packages contains non-strings', () => { - expect(() => - getWorkspacesPatterns({ - workspaces: { packages: ['a', 1] }, - }), - ).toThrow('must be an array of strings'); - }); -}); diff --git a/packages/cli-common/src/workspaces.ts b/packages/cli-common/src/workspaces.ts deleted file mode 100644 index 17fca511a4..0000000000 --- a/packages/cli-common/src/workspaces.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2026 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function assertStringArray( - value: unknown, - field: string, -): asserts value is string[] { - if (!Array.isArray(value)) { - throw new Error(`${field} must be an array`); - } - if (!value.every((item): item is string => typeof item === 'string')) { - throw new Error(`${field} must be an array of strings`); - } -} - -/** - * Gets the workspaces patterns from a package.json object. - * - * Supports both the array form (`"workspaces": ["packages/*"]`) and the object - * form (`"workspaces": { "packages": ["packages/*"] }`) from npm/yarn. - * - * @param pkgJson - The package.json object. Type as `unknown` so callers must pass parsed JSON; an object type check is performed. - * @returns The workspaces patterns (globs not resolved). Empty array if none. - * @throws Error if `pkgJson` is not an object or workspaces/packages contain non-strings. - * @public - */ -export function getWorkspacesPatterns(pkgJson: unknown): string[] { - if (typeof pkgJson !== 'object' || pkgJson === null) { - throw new Error('pkgJson must be an object'); - } - if (!('workspaces' in pkgJson)) { - return []; - } - - const workspaces = pkgJson.workspaces; - if (Array.isArray(workspaces)) { - assertStringArray(workspaces, 'pkgJson.workspaces'); - return workspaces; - } - if ( - typeof workspaces === 'object' && - workspaces !== null && - 'packages' in workspaces && - Array.isArray(workspaces.packages) - ) { - assertStringArray(workspaces.packages, 'pkgJson.workspaces.packages'); - return workspaces.packages; - } - return []; -} diff --git a/packages/cli-node/src/monorepo/isMonoRepo.ts b/packages/cli-node/src/monorepo/isMonoRepo.ts index 9cb19ea62f..c58b3d00ce 100644 --- a/packages/cli-node/src/monorepo/isMonoRepo.ts +++ b/packages/cli-node/src/monorepo/isMonoRepo.ts @@ -14,12 +14,14 @@ * limitations under the License. */ -import { getWorkspacesPatterns } from '@backstage/cli-common'; import { paths } from '../paths'; import fs from 'fs-extra'; /** - * Returns try if the current project is a monorepo. + * Returns true if the current project is a monorepo. + * + * Uses a simple presence check on the `workspaces` field. Empty or invalid + * workspace config is treated as a monorepo; we do not validate patterns. * * @public */ @@ -27,7 +29,7 @@ export async function isMonoRepo(): Promise { const rootPackageJsonPath = paths.resolveTargetRoot('package.json'); try { const pkg = await fs.readJson(rootPackageJsonPath); - return getWorkspacesPatterns(pkg).length > 0; + return Boolean(pkg?.workspaces); } catch (error) { return false; } diff --git a/packages/cli-node/src/pacman/PackageManager.test.ts b/packages/cli-node/src/pacman/PackageManager.test.ts index e394d2ed60..f704610ab2 100644 --- a/packages/cli-node/src/pacman/PackageManager.test.ts +++ b/packages/cli-node/src/pacman/PackageManager.test.ts @@ -43,19 +43,19 @@ describe('PackageManager', () => { expect(mockYarnCreate).toHaveBeenCalled(); }); - it('should detect via root package.json workspaces with legacy workspaces.packages field', async () => { + it('should detect via root package.json workspaces', async () => { mockDir.setContent({ 'package.json': JSON.stringify({ name: 'foo', workspaces: { - packages: ['packages/*'], + packages: [], }, }), }); await detectPackageManager(); expect(mockYarnCreate).toHaveBeenCalled(); }); - it('should detect via root package.json workspaces', async () => { + it('should detect via root package.json workspaces (array form)', async () => { mockDir.setContent({ 'package.json': JSON.stringify({ name: 'foo', diff --git a/packages/cli-node/src/pacman/PackageManager.ts b/packages/cli-node/src/pacman/PackageManager.ts index 5693acce06..44c0849705 100644 --- a/packages/cli-node/src/pacman/PackageManager.ts +++ b/packages/cli-node/src/pacman/PackageManager.ts @@ -17,7 +17,7 @@ import { Yarn } from './yarn'; import { Lockfile } from './Lockfile'; import { paths } from '../paths'; -import { getWorkspacesPatterns, RunOptions } from '@backstage/cli-common'; +import { RunOptions } from '@backstage/cli-common'; import fs from 'fs-extra'; /** @@ -101,7 +101,7 @@ export async function detectPackageManager(): Promise { const packageJson = await fs.readJson( paths.resolveTargetRoot('package.json'), ); - if (getWorkspacesPatterns(packageJson).length > 0) { + if (packageJson.workspaces) { // technically this could be NPM as well return await Yarn.create(); } diff --git a/packages/cli-node/src/pacman/yarn/Yarn.ts b/packages/cli-node/src/pacman/yarn/Yarn.ts index 4658a256c6..9c242c90da 100644 --- a/packages/cli-node/src/pacman/yarn/Yarn.ts +++ b/packages/cli-node/src/pacman/yarn/Yarn.ts @@ -25,7 +25,6 @@ import { YarnVersion } from './types'; import fs from 'fs-extra'; import { paths } from '../../paths'; import { run, runOutput, RunOptions } from '@backstage/cli-common'; -import { getWorkspacesPatterns } from '@backstage/cli-common'; export class Yarn implements PackageManager { constructor(private readonly yarnVersion: YarnVersion) {} @@ -51,7 +50,10 @@ export class Yarn implements PackageManager { const rootPackageJsonPath = paths.resolveTargetRoot('package.json'); try { const pkg = await fs.readJson(rootPackageJsonPath); - return getWorkspacesPatterns(pkg); + const workspaces = pkg?.workspaces; + return Array.isArray(workspaces) + ? workspaces + : workspaces?.packages ?? []; } catch (error) { return []; } diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js index 09143ac034..c670f0fe8b 100644 --- a/packages/cli/config/jest.js +++ b/packages/cli/config/jest.js @@ -20,7 +20,6 @@ const crypto = require('node:crypto'); const glob = require('node:util').promisify(require('glob')); const { version } = require('../package.json'); const paths = require('@backstage/cli-common').findPaths(process.cwd()); -const { getWorkspacesPatterns } = require('@backstage/cli-common'); const { getJestEnvironment, getJestMajorVersion, @@ -337,10 +336,11 @@ async function getRootConfig() { rejectFrontendNetworkRequests, }; - const workspacePatterns = getWorkspacesPatterns(rootPkgJson); + const ws = rootPkgJson.workspaces; + const workspacePatterns = Array.isArray(ws) ? ws : ws?.packages; // Check if we're running within a specific monorepo package. In that case just get the single project config. - if (workspacePatterns.length === 0 || paths.targetRoot !== paths.targetDir) { + if (!workspacePatterns || paths.targetRoot !== paths.targetDir) { return getProjectConfig( paths.targetDir, { From bc6c024a4ce0bc4cced64f9a7f83403c67ff7523 Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Sun, 22 Feb 2026 17:26:35 +0100 Subject: [PATCH 190/455] chore: remove PackageManager getMonorepoPackages Unused, prefer @manypkg/get-packages's getPackages instead. Signed-off-by: Gabriel Dugny --- .../cli-node/src/pacman/PackageManager.ts | 6 -- .../cli-node/src/pacman/yarn/Yarn.test.ts | 68 ------------------- packages/cli-node/src/pacman/yarn/Yarn.ts | 15 ---- 3 files changed, 89 deletions(-) delete mode 100644 packages/cli-node/src/pacman/yarn/Yarn.test.ts diff --git a/packages/cli-node/src/pacman/PackageManager.ts b/packages/cli-node/src/pacman/PackageManager.ts index 44c0849705..0029652544 100644 --- a/packages/cli-node/src/pacman/PackageManager.ts +++ b/packages/cli-node/src/pacman/PackageManager.ts @@ -49,12 +49,6 @@ export interface PackageManager { /** The file name of the lockfile used by the package manager. */ lockfileName(): string; - /** - * If this repo is a monorepo, returns the patterns specified by the package - * manager's monorepo configuration. Does not attempt to resolve any globs. - */ - getMonorepoPackages(): Promise; - /** Uses the package manager to run a command in the repo. */ run(args: string[], options?: RunOptions): Promise; diff --git a/packages/cli-node/src/pacman/yarn/Yarn.test.ts b/packages/cli-node/src/pacman/yarn/Yarn.test.ts deleted file mode 100644 index f13b5a0296..0000000000 --- a/packages/cli-node/src/pacman/yarn/Yarn.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2024 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { createMockDirectory } from '@backstage/backend-test-utils'; -import { Yarn } from './Yarn'; - -const mockDir = createMockDirectory(); - -jest.mock('../../paths', () => ({ - ...jest.requireActual('../../paths'), - paths: { resolveTargetRoot: (...args: string[]) => mockDir.resolve(...args) }, -})); - -const yarnClassic = new Yarn({ version: '1.0.0', codename: 'classic' }); -const yarnBerry = new Yarn({ version: '3.0.0', codename: 'berry' }); -const allYarnVersions = [yarnClassic, yarnBerry]; - -describe('Yarn', () => { - describe.each(allYarnVersions)('%s.getMonorepoPackages', yarn => { - it('should detect a monorepo with workspaces.packages field', async () => { - mockDir.setContent({ - 'package.json': JSON.stringify({ - name: 'foo', - workspaces: { - packages: ['packages/*'], - }, - }), - }); - await expect(yarn.getMonorepoPackages()).resolves.toEqual(['packages/*']); - }); - it('should detect a monorepo', async () => { - mockDir.setContent({ - 'package.json': JSON.stringify({ - name: 'foo', - workspaces: ['packages/*'], - }), - }); - await expect(yarn.getMonorepoPackages()).resolves.toEqual(['packages/*']); - }); - - it('should detect a non-monorepo', async () => { - mockDir.setContent({ - 'package.json': JSON.stringify({ - name: 'foo', - }), - }); - await expect(yarn.getMonorepoPackages()).resolves.toEqual([]); - }); - - it('should return false if package.json is missing', async () => { - mockDir.setContent({}); - await expect(yarn.getMonorepoPackages()).resolves.toEqual([]); - }); - }); -}); diff --git a/packages/cli-node/src/pacman/yarn/Yarn.ts b/packages/cli-node/src/pacman/yarn/Yarn.ts index 9c242c90da..7aee7bdebf 100644 --- a/packages/cli-node/src/pacman/yarn/Yarn.ts +++ b/packages/cli-node/src/pacman/yarn/Yarn.ts @@ -22,8 +22,6 @@ import { import { PackageInfo, PackageManager } from '../PackageManager'; import { Lockfile } from '../Lockfile'; import { YarnVersion } from './types'; -import fs from 'fs-extra'; -import { paths } from '../../paths'; import { run, runOutput, RunOptions } from '@backstage/cli-common'; export class Yarn implements PackageManager { @@ -46,19 +44,6 @@ export class Yarn implements PackageManager { return 'yarn.lock'; } - async getMonorepoPackages() { - const rootPackageJsonPath = paths.resolveTargetRoot('package.json'); - try { - const pkg = await fs.readJson(rootPackageJsonPath); - const workspaces = pkg?.workspaces; - return Array.isArray(workspaces) - ? workspaces - : workspaces?.packages ?? []; - } catch (error) { - return []; - } - } - async pack(out: string, packageDir: string) { const outArg = this.yarnVersion.codename === 'classic' ? '--filename' : '--out'; From 1464d88200bec8658a23d5b694b5a118dc314a79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 22 Feb 2026 20:51:37 +0000 Subject: [PATCH 191/455] chore(deps): update dependency testcontainers to v11.12.0 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 61 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/yarn.lock b/yarn.lock index d1dbdea01c..8048529680 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10921,6 +10921,15 @@ __metadata: languageName: node linkType: hard +"@kwsites/file-exists@npm:^1.1.1": + version: 1.1.1 + resolution: "@kwsites/file-exists@npm:1.1.1" + dependencies: + debug: "npm:^4.1.1" + checksum: 10/4ff945de7293285133aeae759caddc71e73c4a44a12fac710fdd4f574cce2671a3f89d8165fdb03d383cfc97f3f96f677d8de3c95133da3d0e12a123a23109fe + languageName: node + linkType: hard + "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.3 resolution: "@leichtgewicht/ip-codec@npm:2.0.3" @@ -21434,14 +21443,14 @@ __metadata: languageName: node linkType: hard -"@types/dockerode@npm:^3.3.47": - version: 3.3.47 - resolution: "@types/dockerode@npm:3.3.47" +"@types/dockerode@npm:^4.0.1": + version: 4.0.1 + resolution: "@types/dockerode@npm:4.0.1" dependencies: "@types/docker-modem": "npm:*" "@types/node": "npm:*" "@types/ssh2": "npm:*" - checksum: 10/b840ae7872398a3b02e5789006a69d0cf5bb7ec6c0eb714c7ca04ca093add8de4cd06204ecd8f01388e347e62927cf4c599e8b7dba53e81c1350910da766d517 + checksum: 10/d16b3a69a20fac269b2317a978442a6752dea158729a264511a3812dcb4c756e0ee079b39b61068cee182f268661e27e32aa7a28815262f0e088ffeb9f2f48c5 languageName: node linkType: hard @@ -29538,12 +29547,12 @@ __metadata: languageName: node linkType: hard -"docker-compose@npm:^1.3.0": - version: 1.3.0 - resolution: "docker-compose@npm:1.3.0" +"docker-compose@npm:^1.3.1": + version: 1.3.1 + resolution: "docker-compose@npm:1.3.1" dependencies: yaml: "npm:^2.2.2" - checksum: 10/7c1b395fc104031eadef08cac0c028af11fd9e3084265dca9e17bc76ad27c2bfe96d8b74df258bb64b198f9e0f1792a7f2c63123cddc0d60bb776f211d54cfb2 + checksum: 10/39e0e4b96c0dea8c88df9770a4d102a9e2437ad0af5f5f28a9f88fbf164eb4fb81fde0d8740500bd451abafab74072e5d5cfa35cc85254722bbe2b7dbc7c033a languageName: node linkType: hard @@ -39640,6 +39649,15 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10/16fd79c28645759505914561e249b9a1f5fe3362279ad95487a4501e4467abeb714fd35b95307326b8fd03f3c7719065ef11a6f97b7285d7888306d1bd2232ba + languageName: node + linkType: hard + "mock-socket@npm:^9.3.0": version: 9.3.1 resolution: "mock-socket@npm:9.3.1" @@ -43410,12 +43428,13 @@ __metadata: languageName: node linkType: hard -"properties-reader@npm:^2.3.0": - version: 2.3.0 - resolution: "properties-reader@npm:2.3.0" +"properties-reader@npm:^3.0.1": + version: 3.0.1 + resolution: "properties-reader@npm:3.0.1" dependencies: - mkdirp: "npm:^1.0.4" - checksum: 10/0b41eb4136dc278ae0d97968ccce8de2d48d321655b319192e31f2424f1c6e052182204671e65aa8967216360cb3e7cbd9129830062e058fe9d6a1d74964c29a + "@kwsites/file-exists": "npm:^1.1.1" + mkdirp: "npm:^3.0.1" + checksum: 10/5a96c33dad9925c399bf3c3e343f3eb801fa1b4802330d1bfbf1e7d7639dafa935deb6c60be38b292544b57793b03ba1eaf5191cc3a7d018cda7bd6ead19a15c languageName: node linkType: hard @@ -48434,25 +48453,25 @@ __metadata: linkType: hard "testcontainers@npm:^11.9.0": - version: 11.11.0 - resolution: "testcontainers@npm:11.11.0" + version: 11.12.0 + resolution: "testcontainers@npm:11.12.0" dependencies: "@balena/dockerignore": "npm:^1.0.2" - "@types/dockerode": "npm:^3.3.47" + "@types/dockerode": "npm:^4.0.1" archiver: "npm:^7.0.1" async-lock: "npm:^1.4.1" byline: "npm:^5.0.0" debug: "npm:^4.4.3" - docker-compose: "npm:^1.3.0" + docker-compose: "npm:^1.3.1" dockerode: "npm:^4.0.9" get-port: "npm:^7.1.0" proper-lockfile: "npm:^4.1.2" - properties-reader: "npm:^2.3.0" + properties-reader: "npm:^3.0.1" ssh-remote-port-forward: "npm:^1.0.4" tar-fs: "npm:^3.1.1" tmp: "npm:^0.2.5" - undici: "npm:^7.16.0" - checksum: 10/6a05baf5cd9ff0eab7ecb6c31f10e1204d9b4a88698f2ecea9f4008a6ca9130302a83f0b79e303bfda577de3dd26c74689bb4636720b28d7dd3753ce50422865 + undici: "npm:^7.22.0" + checksum: 10/d15ebc0be1c09192c4c26060bfec2f7ad2cf338624bed4a1ca2d548419853e54ea7deb8cd21cca21d55976552f09a00093ab7be822017e045f4c29e09b7e9ba2 languageName: node linkType: hard @@ -49619,7 +49638,7 @@ __metadata: languageName: node linkType: hard -"undici@npm:^7.16.0, undici@npm:^7.2.3": +"undici@npm:^7.2.3, undici@npm:^7.22.0": version: 7.22.0 resolution: "undici@npm:7.22.0" checksum: 10/a7a1813ba4b74c0d46cc8dd160386202c05699ffc487c5d882cf40e6d2435c8d6faff3b8f8675d09bd1ef0386e370675c26b59b9a8c8b3f17b9f82a42236a927 From df3913ec1998e5789fd6de236bbf32f3c97faecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ahlert=20Junior?= Date: Mon, 23 Feb 2026 04:13:37 -0300 Subject: [PATCH 192/455] Add n8n to plugin directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: André Ahlert Junior --- microsite/data/plugins/n8n.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 microsite/data/plugins/n8n.yaml diff --git a/microsite/data/plugins/n8n.yaml b/microsite/data/plugins/n8n.yaml new file mode 100644 index 0000000000..7898c1efe4 --- /dev/null +++ b/microsite/data/plugins/n8n.yaml @@ -0,0 +1,11 @@ +--- +title: n8n +author: André Ahlert Junior +authorUrl: https://github.com/andreahlert +category: Other +description: n8n workflow automation — view workflows and execution history on Backstage entity pages. +documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/n8n/plugins/n8n +iconUrl: /img/logo-gradient-on-dark.svg +npmPackageName: '@backstage-community/plugin-n8n' +addedDate: '2026-02-15' +status: active From 0a4b3a16aed0c96ca57a4340a7e8735d3d274b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 23 Feb 2026 09:54:43 +0100 Subject: [PATCH 193/455] Update docs/features/software-catalog/api.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Fredrik Adelöw --- docs/features/software-catalog/api.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/features/software-catalog/api.md b/docs/features/software-catalog/api.md index 3cd70538c2..97f579c5a3 100644 --- a/docs/features/software-catalog/api.md +++ b/docs/features/software-catalog/api.md @@ -383,20 +383,18 @@ meaning. ``` The other use case is for arrays where you match with a primitive value, such - as labels. Example: + as tags. Example: ```js { - // Works for any field, as long as the value is a primitive - // (either string, number, or boolean) - "metadata.labels": { + // Works for array fields whose items are primitive values + // (typically strings, but numbers and booleans are also supported) + "metadata.tags": { "$contains": "java" } } ``` - In every case, the matching is case insensitive. - ### `GET /entities` Lists entities. From b06bcdcb353ddb93c2291f11f1e30fd37c55a2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 23 Feb 2026 13:54:29 +0100 Subject: [PATCH 194/455] transfer filters across to the query too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/CatalogClient.ts | 38 +++++++-- packages/catalog-client/src/utils.test.ts | 82 +++++++++++++++++++- packages/catalog-client/src/utils.ts | 45 +++++++++++ 3 files changed, 159 insertions(+), 6 deletions(-) diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index bd557cfdd2..2bdf63cc49 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -20,7 +20,8 @@ import { parseEntityRef, stringifyLocationRef, } from '@backstage/catalog-model'; -import { ResponseError } from '@backstage/errors'; +import { InputError, ResponseError } from '@backstage/errors'; +import { FilterPredicate } from '@backstage/filter-predicates'; import { AddLocationRequest, AddLocationResponse, @@ -47,6 +48,7 @@ import { ValidateEntityResponse, } from './types/api'; import { + convertFilterToPredicate, isQueryEntitiesInitialRequest, splitRefsIntoChunks, cursorContainsQuery, @@ -352,11 +354,37 @@ export class CatalogClient implements CatalogApi { const body: QueryEntitiesByPredicateRequest = {}; if (isQueryEntitiesInitialRequest(request)) { - const { query, limit, offset, orderFields, fullTextFilter, fields } = - request; - if (query && typeof query === 'object') { - body.query = query; + const { + filter, + query, + limit, + offset, + orderFields, + fullTextFilter, + fields, + } = request; + + let filterPredicate: FilterPredicate | undefined; + if (query !== undefined) { + if ( + typeof query !== 'object' || + query === null || + Array.isArray(query) + ) { + throw new InputError('Query must be an object'); + } + filterPredicate = query; } + if (filter !== undefined) { + const converted = convertFilterToPredicate(filter); + filterPredicate = filterPredicate + ? { $all: [filterPredicate, converted] } + : converted; + } + if (filterPredicate !== undefined) { + body.query = filterPredicate as unknown as { [key: string]: any }; + } + if (limit !== undefined) { body.limit = limit; } diff --git a/packages/catalog-client/src/utils.test.ts b/packages/catalog-client/src/utils.test.ts index 2f00859985..ce60cc3083 100644 --- a/packages/catalog-client/src/utils.test.ts +++ b/packages/catalog-client/src/utils.test.ts @@ -14,7 +14,87 @@ * limitations under the License. */ -import { splitRefsIntoChunks } from './utils'; +import { CATALOG_FILTER_EXISTS } from './types/api'; +import { convertFilterToPredicate, splitRefsIntoChunks } from './utils'; + +describe('convertFilterToPredicate', () => { + it('converts a single string value', () => { + expect(convertFilterToPredicate({ kind: 'component' })).toEqual({ + kind: 'component', + }); + }); + + it('converts multiple keys into $all', () => { + expect( + convertFilterToPredicate({ + kind: 'component', + 'spec.type': 'service', + }), + ).toEqual({ + $all: [{ kind: 'component' }, { 'spec.type': 'service' }], + }); + }); + + it('converts an array of string values into $in', () => { + expect( + convertFilterToPredicate({ 'spec.type': ['service', 'website'] }), + ).toEqual({ + 'spec.type': { $in: ['service', 'website'] }, + }); + }); + + it('converts CATALOG_FILTER_EXISTS into $exists', () => { + expect( + convertFilterToPredicate({ 'spec.owner': CATALOG_FILTER_EXISTS }), + ).toEqual({ + 'spec.owner': { $exists: true }, + }); + }); + + it('converts an array of records into $any (OR)', () => { + expect( + convertFilterToPredicate([{ kind: 'component' }, { kind: 'api' }]), + ).toEqual({ + $any: [{ kind: 'component' }, { kind: 'api' }], + }); + }); + + it('converts array of records with multiple keys each', () => { + expect( + convertFilterToPredicate([ + { kind: 'component', 'spec.type': 'service' }, + { kind: 'api' }, + ]), + ).toEqual({ + $any: [ + { $all: [{ kind: 'component' }, { 'spec.type': 'service' }] }, + { kind: 'api' }, + ], + }); + }); + + it('treats CATALOG_FILTER_EXISTS mixed with string values as just existence', () => { + expect( + convertFilterToPredicate({ + 'spec.owner': [CATALOG_FILTER_EXISTS, 'team-a'], + }), + ).toEqual({ + 'spec.owner': { $exists: true }, + }); + }); + + it('converts a single-element array filter without wrapping in $any', () => { + expect(convertFilterToPredicate([{ kind: 'component' }])).toEqual({ + kind: 'component', + }); + }); + + it('ignores entries with no valid values', () => { + expect( + convertFilterToPredicate({ kind: 'component', other: [] as string[] }), + ).toEqual({ kind: 'component' }); + }); +}); describe('splitRefsIntoChunks', () => { it('splits by count limit', () => { diff --git a/packages/catalog-client/src/utils.ts b/packages/catalog-client/src/utils.ts index fc867d8670..231aa2409f 100644 --- a/packages/catalog-client/src/utils.ts +++ b/packages/catalog-client/src/utils.ts @@ -14,7 +14,13 @@ * limitations under the License. */ +import type { + FilterPredicate, + FilterPredicateExpression, +} from '@backstage/filter-predicates'; import { + CATALOG_FILTER_EXISTS, + EntityFilterQuery, QueryEntitiesCursorRequest, QueryEntitiesInitialRequest, QueryEntitiesRequest, @@ -39,6 +45,45 @@ export function cursorContainsQuery(cursor: string): boolean { } } +/** + * Converts an {@link EntityFilterQuery} into a predicate query object. + * @internal + */ +export function convertFilterToPredicate(filter: EntityFilterQuery): + | FilterPredicateExpression + | { + $all: FilterPredicate[]; + } + | { + $any: FilterPredicate[]; + } { + const records = [filter].flat(); + + const clauses = records.map(record => { + const parts: FilterPredicateExpression[] = []; + + for (const [key, value] of Object.entries(record)) { + const values = [value].flat(); + const strings = values.filter((v): v is string => typeof v === 'string'); + const hasExists = values.some(v => v === CATALOG_FILTER_EXISTS); + + if (hasExists) { + // Ignore whether there ALSO were some strings - that would boil down to + // just existence anyway since there's effectively an OR between them + parts.push({ [key]: { $exists: true } } as FilterPredicateExpression); + } else if (strings.length === 1) { + parts.push({ [key]: strings[0] } as FilterPredicateExpression); + } else if (strings.length > 1) { + parts.push({ [key]: { $in: strings } } as FilterPredicateExpression); + } + } + + return parts.length === 1 ? parts[0] : { $all: parts }; + }); + + return clauses.length === 1 ? clauses[0] : { $any: clauses }; +} + /** * Takes a set of entity refs, and splits them into chunks (groups) such that * the total string length in each chunk does not exceed the default Express.js From 63ad13904b0bb9e72aa077e621cb9de3ee5f679c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 23 Feb 2026 16:43:36 +0100 Subject: [PATCH 195/455] do not use the very particular 'true' array syntax, but instead the normal one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../request/applyPredicateEntityFilterToQuery.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts index a44f878abd..d915b8c4b5 100644 --- a/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts +++ b/plugins/catalog-backend/src/service/request/applyPredicateEntityFilterToQuery.ts @@ -175,18 +175,18 @@ function applyFieldCondition(options: { // // FROM: `{ "a": { "$contains": "b" } }` // - // TO: `{ "a.b": "true" }` + // TO: `{ "a": "b" }` // // The search table does not actually show us that "a" was an array to // begin with, so this can mistakenly also match on an object that had a - // "b" key with a true value. We'll consider that an acceptable tradeoff - // though. + // "b" key with a primitive value. We'll consider that an acceptable + // tradeoff though. if (isPrimitive(target)) { const matchQuery = knex('search') .select('search.entity_id') .where({ - key: `${key}.${String(target).toLocaleLowerCase('en-US')}`, - value: 'true', + key, + value: String(target).toLocaleLowerCase('en-US'), }); return targetQuery.andWhere(onEntityIdField, 'in', matchQuery); } From cc91faf318ef5d4c7ea70c729192ab1ea2fb89f9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 23:10:10 +0000 Subject: [PATCH 196/455] chore(deps): update dependency nodemon to v3.1.13 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 64f87ae3eb..897069dfa0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40565,13 +40565,13 @@ __metadata: linkType: hard "nodemon@npm:^3.0.1": - version: 3.1.11 - resolution: "nodemon@npm:3.1.11" + version: 3.1.14 + resolution: "nodemon@npm:3.1.14" dependencies: chokidar: "npm:^3.5.2" debug: "npm:^4" ignore-by-default: "npm:^1.0.1" - minimatch: "npm:^3.1.2" + minimatch: "npm:^10.2.1" pstree.remy: "npm:^1.1.8" semver: "npm:^7.5.3" simple-update-notifier: "npm:^2.0.0" @@ -40580,7 +40580,7 @@ __metadata: undefsafe: "npm:^2.0.5" bin: nodemon: bin/nodemon.js - checksum: 10/0f43d2c70abe0764e26e438dbe0c78bc429746a558dabf5dd94b13f6f3a79b4bd7d5793347acafddaee5eab594a806c2ad43efc999d342e28d185661718da8dc + checksum: 10/187aa93fc461bb001bac5de63df49a38a7b1cb3c60a5fd6a3b0f2b15da68fe5adfd0f91244be2fd1f57263cbd351e3113cb04c4edf4af23699dd95b2782fbf9b languageName: node linkType: hard From 33495b0d15b34527bb4f3ebdb6eef7bc7b33675b Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Tue, 24 Feb 2026 09:41:09 -0500 Subject: [PATCH 197/455] Update component creation instructions with NODE_OPTIONS note Added a note about the required NODE_OPTIONS environment variable for templates. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/create-a-component.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/create-a-component.md b/docs/getting-started/create-a-component.md index 68dce5753d..87e483858c 100644 --- a/docs/getting-started/create-a-component.md +++ b/docs/getting-started/create-a-component.md @@ -62,8 +62,11 @@ Perform the following steps: export NODE_OPTIONS=--no-node-snapshot ``` -4. Enter `yarn start` to restart the Backstage application. -5. Repeat steps to create the component. + > **NOTE:** + > The [no-node-snapshot](../features/software-templates/index.md#prerequisites) `NODE_OPTIONS` environment variable is required in order to use the templates. + +5. Enter `yarn start` to restart the Backstage application. +6. Repeat steps to create the component. Otherwise, you can follow along with the progress, and as soon as every step is finished, you can take a look at your new service in either the repository or the Catalog. From 8f3a37aec69597002fe878e5a8c9c739c555ec82 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:31:56 -0500 Subject: [PATCH 198/455] Try to fix prettier errors in create-a-component Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/create-a-component.md | 33 +++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/docs/getting-started/create-a-component.md b/docs/getting-started/create-a-component.md index 87e483858c..b4e5c6ab19 100644 --- a/docs/getting-started/create-a-component.md +++ b/docs/getting-started/create-a-component.md @@ -42,9 +42,10 @@ To create the component: 6. Enter your GitHub user name as the `Owner`. 7. Enter `tutorial` for the `Repository` and select `REVIEW`. - + ![select review create component](../assets/uiguide/select-review-create-component.png) -9. Review the information and select `CREATE`. + +8. Review the information and select `CREATE`. ![select create to make component](../assets/uiguide/select-create-to-make-component.png) @@ -64,28 +65,28 @@ Perform the following steps: > **NOTE:** > The [no-node-snapshot](../features/software-templates/index.md#prerequisites) `NODE_OPTIONS` environment variable is required in order to use the templates. - -5. Enter `yarn start` to restart the Backstage application. -6. Repeat steps to create the component. + +4. Enter `yarn start` to restart the Backstage application. +5. Repeat steps to create the component. Otherwise, you can follow along with the progress, and as soon as every step is finished, you can take a look at your new service in either the repository or the Catalog. ![run of example of create component](../assets/uiguide/successful-create-new-component.png) -Selecting `REPOSITORY` displays the `catalog-info.yaml`file and other project setup files that were created for the new component in the main branch of the `tutorial` repository. +Selecting `REPOSITORY` displays the `catalog-info.yaml`file and other project setup files that were created for the new component in the main branch of the `tutorial` repository. The `catalog-info.yaml` file describes the entity for the Software Catalog. [Descriptor Format of Catalog Entities](../features/software-catalog/descriptor-format.md) provides additional information. - ``` - apiVersion: backstage.io/v1alpha1 - kind: Component - metadata: - name: "tutorial" - spec: - type: service - owner: user:guest - lifecycle: experimental - ``` +``` + apiVersion: backstage.io/v1alpha1 + kind: Component + metadata: + name: "tutorial" + spec: + type: service + owner: user:guest + lifecycle: experimental +``` Selecting `OPEN IN CATALOG` displays details of the new component, such as its relationships, links, and subcomponents. From 1ee5b28e41c274ea38c16a07290387763b5e2284 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 24 Feb 2026 16:57:02 +0100 Subject: [PATCH 199/455] `feat(metrics)`: Implement `MetricsService` (#32977) * feat: add MetricsService alpha release Introduces MetricsService as a new @alpha core service wrapping @opentelemetry/api. Includes migration of existing catalog metrics to use the new service. Signed-off-by: benjdlambert * chore: duplicate otel types, add plugin-scoped factory and tests Signed-off-by: benjdlambert * chore: update BEP-0012 metrics service design Signed-off-by: Kurt King * chore: address PR feedback from freben and rugvip Rename instrument types with MetricsService prefix for namespace clarity, move config to backend.metrics.plugin.{pluginId}, add config.d.ts schema, and improve factory test assertions. Signed-off-by: benjdlambert --------- Signed-off-by: benjdlambert Signed-off-by: Kurt King Co-authored-by: Kurt King --- .changeset/ninety-corners-flash.md | 5 + .changeset/rare-adults-attack.md | 6 + .changeset/twenty-worlds-create.md | 5 + beps/0012-metrics-service/README.md | 69 +++-- packages/backend-defaults/config.d.ts | 30 ++ packages/backend-defaults/report-alpha.api.md | 8 + .../backend-defaults/src/CreateBackend.ts | 2 + .../metrics/DefaultMetricsService.test.ts | 117 ++++++++ .../metrics/DefaultMetricsService.ts | 123 ++++++++ .../src/alpha/entrypoints/metrics/index.ts | 16 + .../metrics/metricsServiceFactory.test.ts | 130 +++++++++ .../metrics/metricsServiceFactory.ts | 48 +++ packages/backend-defaults/src/alpha/index.ts | 1 + .../backend-plugin-api/report-alpha.api.md | 144 +++++++++ .../src/alpha/MetricsService.ts | 273 ++++++++++++++++++ .../backend-plugin-api/src/alpha/index.ts | 19 ++ packages/backend-plugin-api/src/alpha/refs.ts | 11 + .../backend-test-utils/report-alpha.api.md | 11 + .../src/alpha/services/MetricsServiceMock.ts | 59 ++++ .../src/alpha/services/index.ts | 1 + .../src/wiring/TestBackend.ts | 2 + .../DefaultProcessingDatabase.test.ts | 2 + .../src/database/DefaultProcessingDatabase.ts | 5 +- .../catalog-backend/src/database/metrics.ts | 12 +- .../DefaultCatalogProcessingEngine.test.ts | 10 + .../DefaultCatalogProcessingEngine.ts | 17 +- .../src/service/CatalogBuilder.ts | 6 + .../src/service/CatalogPlugin.ts | 13 +- .../src/service/DefaultRefreshService.test.ts | 4 + .../src/stitching/DefaultStitcher.test.ts | 2 + .../src/stitching/DefaultStitcher.ts | 10 +- .../src/stitching/progressTracker.ts | 18 +- .../src/tests/integration.test.ts | 4 + .../getProcessableEntitiesPerformance.test.ts | 2 + 34 files changed, 1121 insertions(+), 64 deletions(-) create mode 100644 .changeset/ninety-corners-flash.md create mode 100644 .changeset/rare-adults-attack.md create mode 100644 .changeset/twenty-worlds-create.md create mode 100644 packages/backend-defaults/src/alpha/entrypoints/metrics/DefaultMetricsService.test.ts create mode 100644 packages/backend-defaults/src/alpha/entrypoints/metrics/DefaultMetricsService.ts create mode 100644 packages/backend-defaults/src/alpha/entrypoints/metrics/index.ts create mode 100644 packages/backend-defaults/src/alpha/entrypoints/metrics/metricsServiceFactory.test.ts create mode 100644 packages/backend-defaults/src/alpha/entrypoints/metrics/metricsServiceFactory.ts create mode 100644 packages/backend-plugin-api/src/alpha/MetricsService.ts create mode 100644 packages/backend-test-utils/src/alpha/services/MetricsServiceMock.ts diff --git a/.changeset/ninety-corners-flash.md b/.changeset/ninety-corners-flash.md new file mode 100644 index 0000000000..f858ec0593 --- /dev/null +++ b/.changeset/ninety-corners-flash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Migrates existing catalog metrics to use the alpha MetricsService. This release is a 1:1 migration with no breaking changes. diff --git a/.changeset/rare-adults-attack.md b/.changeset/rare-adults-attack.md new file mode 100644 index 0000000000..8117f26dea --- /dev/null +++ b/.changeset/rare-adults-attack.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-plugin-api': patch +'@backstage/backend-defaults': patch +--- + +Adds an alpha `MetricsService` to provide a unified interface for metrics instrumentation across Backstage plugins. diff --git a/.changeset/twenty-worlds-create.md b/.changeset/twenty-worlds-create.md new file mode 100644 index 0000000000..e7e4770938 --- /dev/null +++ b/.changeset/twenty-worlds-create.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Adds a new metrics service mock to be leveraged in tests diff --git a/beps/0012-metrics-service/README.md b/beps/0012-metrics-service/README.md index 59096d11d8..87b2059f02 100644 --- a/beps/0012-metrics-service/README.md +++ b/beps/0012-metrics-service/README.md @@ -23,7 +23,6 @@ creation-date: 2025-06-23 - [Integration with OpenTelemetry Auto-Instrumentation](#integration-with-opentelemetry-auto-instrumentation) - [Configuration](#configuration) - [Interface](#interface) - - [Root Metrics Service](#root-metrics-service) - [Plugin Metrics Service](#plugin-metrics-service) - [Example](#example) - [Release Plan](#release-plan) @@ -36,7 +35,7 @@ Add a core `MetricsService` to Backstage's framework to provide a unified interf ## Motivation -While individual plugins may implement their own metrics, there's no standardized approach leading to inconsistent metrics patterns across the ecosystem. For example, both `catalog_entities_count` and `catalog.processed.entities.count` are examples of existing metric patterns. Ideally, these would be standardized to `backstage.plugin.catalog.entities.count` and `backstage.plugin.catalog.entities.processed.total` respectively. +While individual plugins may implement their own metrics, there's no standardized approach leading to inconsistent metrics patterns across the ecosystem and incompatibility with OpenTelemetry semantic conventions. For example, a plugin implementing MCP functionality might incorrectly namespace metrics as `backstage_mcp_client_duration` when OpenTelemetry semantic conventions explicitly define `mcp.client.operation.duration` as the standard. By providing a core metrics service: @@ -45,7 +44,7 @@ By providing a core metrics service: ### Goals -- Plugin-scoped metric namespacing +- Plugin identification via OpenTelemetry Instrumentation Scope - Consistent metrics patterns across all plugins - Aligned with OpenTelemetry industry standards - Provide a familiar interface as other core services @@ -124,9 +123,12 @@ The `MetricsService` **complements** rather than duplicates auto-instrumentation // MetricsService provides (manually): const entityMetrics = metricsService.createCounter('entities.processed.total'); -entityMetrics.add(entities.length, { operation: 'refresh', kind: 'Component' }); +entityMetrics.add(entities.length, { + operation: 'refresh', + 'entity.kind': 'Component', +}); -// Metric is now available as `backstage.plugin.catalog.entities.processed.total` +// Metric is now available as `entities.processed.total` ``` ### Configuration @@ -162,43 +164,21 @@ interface MetricsService { } ``` -#### Root Metrics Service - -The `RootMetricsService` is responsible for providing metrics to other root services and creating both plugin-scoped and core-scoped `MetricsService` instances. - -```ts -interface RootMetricsService { - // note: no config is provided to the root service. - static forRoot(): RootMetricsService; - forPlugin(pluginId: string): MetricsService; - - // final implementation will be similar to - forService(serviceName: string, scope: 'plugin' | 'core'): MetricsService; -} - -export const rootMetricsServiceFactory = createServiceFactory({ - // depends on as little as possible so that it can be initialized as early as possible. - service: rootMetricsServiceRef, - deps: {}, - factory: () => { - return DefaultRootMetricsService.forRoot(); - }, -}); -``` - #### Plugin Metrics Service -Each plugin receives a metrics service that automatically namespaces all metrics to match the naming conventions. +Each plugin receives a metrics service that automatically configures the Instrumentation Scope to identify the plugin. The scope name follows the pattern `backstage-plugin-{pluginId}`. ```ts -const metricsServiceFactory = createServiceFactory({ - service: metricsServiceRef, +export const metricsServiceFactory = createServiceFactory({ + service: coreServices.metrics, deps: { - rootMetrics: coreServices.rootMetrics, pluginMetadata: coreServices.pluginMetadata, }, - factory: ({ rootMetrics, pluginMetadata }) => { - return rootMetrics.forPlugin(pluginMetadata.getId()); + factory: ({ pluginMetadata }) => { + const pluginId = pluginMetadata.getId(); + const scopeName = `backstage-plugin-${pluginId}`; + + return new DefaultMetricsService(scopeName, version, ...); }, }); ``` @@ -248,3 +228,22 @@ entitiesProcessed.add(100); - Plugin authors continue to implement their own metrics as they see fit. - A combined TelemetryService that provides both metrics and tracing. + +### Rejected: Forced Namespace Prefixes + +Prepend `backstage.plugin.{pluginId}.` to all metric names. This was the original proposal but conflicts with OpenTelemetry semantic conventions. + +**Problems:** + +- Makes it impossible to use standard semantic conventions like `mcp.*`, `gen_ai.*`, `http.*` +- Breaks compatibility with industry-standard observability tooling +- Prevents cross-service metric aggregation +- Goes against OpenTelemetry best practices and official guidance + +**Example of conflict:** + +```ts +// Plugin wants to emit: mcp.client.operation.duration +// Framework forces: backstage.plugin.mcp-actions.mcp.client.operation.duration +// This violates the semantic convention and breaks tooling +``` diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts index 64aabe5cc8..3d09146b0d 100644 --- a/packages/backend-defaults/config.d.ts +++ b/packages/backend-defaults/config.d.ts @@ -1127,6 +1127,36 @@ export interface Config { headers?: { [name: string]: string }; }; + /** + * Options for the metrics service. + */ + metrics?: { + /** + * Plugin-specific metrics configuration. Each plugin can override meter metadata. + */ + plugin?: { + [pluginId: string]: { + /** + * Meter configuration for this plugin. + */ + meter?: { + /** + * Custom meter name. If not set, defaults to backstage-plugin-{pluginId}. + */ + name?: string; + /** + * Version for the meter. + */ + version?: string; + /** + * Schema URL for the meter. + */ + schemaUrl?: string; + }; + }; + }; + }; + /** * Options to configure the default RootLoggerService. */ diff --git a/packages/backend-defaults/report-alpha.api.md b/packages/backend-defaults/report-alpha.api.md index c40517863a..352ec1d688 100644 --- a/packages/backend-defaults/report-alpha.api.md +++ b/packages/backend-defaults/report-alpha.api.md @@ -5,6 +5,7 @@ ```ts import { ActionsRegistryService } from '@backstage/backend-plugin-api/alpha'; import { ActionsService } from '@backstage/backend-plugin-api/alpha'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; import { RootSystemMetadataService } from '@backstage/backend-plugin-api/alpha'; import { ServiceFactory } from '@backstage/backend-plugin-api'; @@ -22,6 +23,13 @@ export const actionsServiceFactory: ServiceFactory< 'singleton' >; +// @alpha +export const metricsServiceFactory: ServiceFactory< + MetricsService, + 'plugin', + 'singleton' +>; + // @alpha export const rootSystemMetadataServiceFactory: ServiceFactory< RootSystemMetadataService, diff --git a/packages/backend-defaults/src/CreateBackend.ts b/packages/backend-defaults/src/CreateBackend.ts index 9f8116a996..2b4ee5befa 100644 --- a/packages/backend-defaults/src/CreateBackend.ts +++ b/packages/backend-defaults/src/CreateBackend.ts @@ -38,6 +38,7 @@ import { eventsServiceFactory } from '@backstage/plugin-events-node'; import { actionsRegistryServiceFactory, actionsServiceFactory, + metricsServiceFactory, } from '@backstage/backend-defaults/alpha'; import { instanceMetadataServiceFactory } from './alpha/entrypoints/instanceMetadata/instanceMetadataServiceFactory'; @@ -66,6 +67,7 @@ export const defaultServiceFactories = [ // alpha services actionsRegistryServiceFactory, actionsServiceFactory, + metricsServiceFactory, // Unexported alpha services kept around for compatibility reasons instanceMetadataServiceFactory, diff --git a/packages/backend-defaults/src/alpha/entrypoints/metrics/DefaultMetricsService.test.ts b/packages/backend-defaults/src/alpha/entrypoints/metrics/DefaultMetricsService.test.ts new file mode 100644 index 0000000000..75e5104754 --- /dev/null +++ b/packages/backend-defaults/src/alpha/entrypoints/metrics/DefaultMetricsService.test.ts @@ -0,0 +1,117 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { metrics } from '@opentelemetry/api'; +import { DefaultMetricsService } from './DefaultMetricsService'; + +const mockGetMeter = jest.spyOn(metrics, 'getMeter'); + +describe('DefaultMetricsService', () => { + beforeEach(() => { + mockGetMeter.mockClear(); + }); + + describe('create', () => { + it('should create a MetricsService with name only', () => { + const service = DefaultMetricsService.create({ name: 'test-meter' }); + + expect(mockGetMeter).toHaveBeenCalledTimes(1); + expect(mockGetMeter).toHaveBeenCalledWith('test-meter', undefined, { + schemaUrl: undefined, + }); + + expect(service).toBeDefined(); + }); + + it('should create a MetricsService with name, version, and schemaUrl', () => { + const service = DefaultMetricsService.create({ + name: 'test-meter', + version: '1.2.3', + schemaUrl: 'https://example.com/schema', + }); + + expect(mockGetMeter).toHaveBeenCalledTimes(1); + expect(mockGetMeter).toHaveBeenCalledWith('test-meter', '1.2.3', { + schemaUrl: 'https://example.com/schema', + }); + + expect(service).toBeDefined(); + }); + }); + + describe('metric instruments', () => { + it('should create a counter', () => { + const service = DefaultMetricsService.create({ name: 'test' }); + const counter = service.createCounter('my_counter', { + description: 'A test counter', + unit: 'bytes', + }); + + expect(counter).toBeDefined(); + expect(counter.add).toBeDefined(); + }); + + it('should create an up-down counter', () => { + const service = DefaultMetricsService.create({ name: 'test' }); + const upDownCounter = service.createUpDownCounter('my_updown'); + + expect(upDownCounter).toBeDefined(); + expect(upDownCounter.add).toBeDefined(); + }); + + it('should create a histogram', () => { + const service = DefaultMetricsService.create({ name: 'test' }); + const histogram = service.createHistogram('my_histogram'); + + expect(histogram).toBeDefined(); + expect(histogram.record).toBeDefined(); + }); + + it('should create a gauge', () => { + const service = DefaultMetricsService.create({ name: 'test' }); + const gauge = service.createGauge('my_gauge'); + + expect(gauge).toBeDefined(); + expect(gauge.record).toBeDefined(); + }); + + it('should create an observable counter', () => { + const service = DefaultMetricsService.create({ name: 'test' }); + const counter = service.createObservableCounter('my_observable_counter'); + + expect(counter).toBeDefined(); + expect(counter.addCallback).toBeDefined(); + expect(counter.removeCallback).toBeDefined(); + }); + + it('should create an observable up-down counter', () => { + const service = DefaultMetricsService.create({ name: 'test' }); + const counter = service.createObservableUpDownCounter( + 'my_observable_updown', + ); + + expect(counter).toBeDefined(); + expect(counter.addCallback).toBeDefined(); + }); + + it('should create an observable gauge', () => { + const service = DefaultMetricsService.create({ name: 'test' }); + const gauge = service.createObservableGauge('my_observable_gauge'); + + expect(gauge).toBeDefined(); + expect(gauge.addCallback).toBeDefined(); + }); + }); +}); diff --git a/packages/backend-defaults/src/alpha/entrypoints/metrics/DefaultMetricsService.ts b/packages/backend-defaults/src/alpha/entrypoints/metrics/DefaultMetricsService.ts new file mode 100644 index 0000000000..764c6d6d1c --- /dev/null +++ b/packages/backend-defaults/src/alpha/entrypoints/metrics/DefaultMetricsService.ts @@ -0,0 +1,123 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Meter, metrics } from '@opentelemetry/api'; +import { + MetricsService, + MetricAttributes, + MetricOptions, + MetricsServiceCounter, + MetricsServiceUpDownCounter, + MetricsServiceHistogram, + MetricsServiceGauge, + MetricsServiceObservableCounter, + MetricsServiceObservableGauge, + MetricsServiceObservableUpDownCounter, +} from '@backstage/backend-plugin-api/alpha'; + +/** + * Options for creating a {@link DefaultMetricsService}. + * + * @alpha + */ +export interface DefaultMetricsServiceOptions { + name: string; + version?: string; + schemaUrl?: string; +} + +/** + * Default implementation of the {@link MetricsService} interface. + * + * This implementation provides a thin wrapper around the OpenTelemetry Meter API. + * + * @alpha + */ +export class DefaultMetricsService implements MetricsService { + private readonly meter: Meter; + + private constructor(opts: DefaultMetricsServiceOptions) { + // The meter name sets the OpenTelemetry Instrumentation Scope which identifies the source of metrics in telemetry backends. + this.meter = metrics.getMeter(opts.name, opts.version, { + schemaUrl: opts.schemaUrl, + }); + } + + /** + * Creates a new {@link MetricsService} instance. + * + * @param opts - Options for configuring the meter scope + * @returns A new MetricsService instance + */ + static create(opts: DefaultMetricsServiceOptions): MetricsService { + return new DefaultMetricsService(opts); + } + + createCounter( + name: string, + opts?: MetricOptions, + ): MetricsServiceCounter { + return this.meter.createCounter(name, opts); + } + + createUpDownCounter( + name: string, + opts?: MetricOptions, + ): MetricsServiceUpDownCounter { + return this.meter.createUpDownCounter(name, opts); + } + + createHistogram( + name: string, + opts?: MetricOptions, + ): MetricsServiceHistogram { + return this.meter.createHistogram(name, opts); + } + + createGauge( + name: string, + opts?: MetricOptions, + ): MetricsServiceGauge { + return this.meter.createGauge(name, opts); + } + + createObservableCounter< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableCounter { + return this.meter.createObservableCounter(name, opts); + } + + createObservableUpDownCounter< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableUpDownCounter { + return this.meter.createObservableUpDownCounter(name, opts); + } + + createObservableGauge< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableGauge { + return this.meter.createObservableGauge(name, opts); + } +} diff --git a/packages/backend-defaults/src/alpha/entrypoints/metrics/index.ts b/packages/backend-defaults/src/alpha/entrypoints/metrics/index.ts new file mode 100644 index 0000000000..fc3e04a855 --- /dev/null +++ b/packages/backend-defaults/src/alpha/entrypoints/metrics/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { metricsServiceFactory } from './metricsServiceFactory'; diff --git a/packages/backend-defaults/src/alpha/entrypoints/metrics/metricsServiceFactory.test.ts b/packages/backend-defaults/src/alpha/entrypoints/metrics/metricsServiceFactory.test.ts new file mode 100644 index 0000000000..854fcfd389 --- /dev/null +++ b/packages/backend-defaults/src/alpha/entrypoints/metrics/metricsServiceFactory.test.ts @@ -0,0 +1,130 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + mockServices, + ServiceFactoryTester, +} from '@backstage/backend-test-utils'; +import { metricsServiceFactory } from './metricsServiceFactory'; +import { DefaultMetricsService } from './DefaultMetricsService'; + +describe('metricsServiceFactory', () => { + let createSpy: jest.SpyInstance; + + beforeEach(() => { + createSpy = jest.spyOn(DefaultMetricsService, 'create'); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + const defaultServices = [ + mockServices.rootConfig.factory(), + metricsServiceFactory, + ]; + + it('should use backstage-plugin-{pluginId} as meter name when no config is set', async () => { + await ServiceFactoryTester.from(metricsServiceFactory, { + dependencies: defaultServices, + }).getSubject('my-plugin'); + + expect(createSpy).toHaveBeenCalledWith({ + name: 'backstage-plugin-my-plugin', + version: undefined, + schemaUrl: undefined, + }); + }); + + it('should use custom name from config', async () => { + await ServiceFactoryTester.from(metricsServiceFactory, { + dependencies: [ + mockServices.rootConfig.factory({ + data: { + backend: { + metrics: { + plugin: { + 'my-plugin': { + meter: { + name: 'custom-metrics-name', + }, + }, + }, + }, + }, + }, + }), + metricsServiceFactory, + ], + }).getSubject('my-plugin'); + + expect(createSpy).toHaveBeenCalledWith({ + name: 'custom-metrics-name', + version: undefined, + schemaUrl: undefined, + }); + }); + + it('should accept version and schemaUrl from config', async () => { + await ServiceFactoryTester.from(metricsServiceFactory, { + dependencies: [ + mockServices.rootConfig.factory({ + data: { + backend: { + metrics: { + plugin: { + 'my-plugin': { + meter: { + name: 'my-plugin-metrics', + version: '1.2.3', + schemaUrl: 'https://example.com/schema', + }, + }, + }, + }, + }, + }, + }), + metricsServiceFactory, + ], + }).getSubject('my-plugin'); + + expect(createSpy).toHaveBeenCalledWith({ + name: 'my-plugin-metrics', + version: '1.2.3', + schemaUrl: 'https://example.com/schema', + }); + }); + + it('should implement the full MetricsService interface', async () => { + const subject = await ServiceFactoryTester.from(metricsServiceFactory, { + dependencies: defaultServices, + }).getSubject('test-plugin'); + + expect(createSpy).toHaveBeenCalledWith({ + name: 'backstage-plugin-test-plugin', + version: undefined, + schemaUrl: undefined, + }); + + expect(subject.createCounter).toBeDefined(); + expect(subject.createUpDownCounter).toBeDefined(); + expect(subject.createHistogram).toBeDefined(); + expect(subject.createGauge).toBeDefined(); + expect(subject.createObservableCounter).toBeDefined(); + expect(subject.createObservableUpDownCounter).toBeDefined(); + expect(subject.createObservableGauge).toBeDefined(); + }); +}); diff --git a/packages/backend-defaults/src/alpha/entrypoints/metrics/metricsServiceFactory.ts b/packages/backend-defaults/src/alpha/entrypoints/metrics/metricsServiceFactory.ts new file mode 100644 index 0000000000..a62ad0411a --- /dev/null +++ b/packages/backend-defaults/src/alpha/entrypoints/metrics/metricsServiceFactory.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { metricsServiceRef } from '@backstage/backend-plugin-api/alpha'; +import { + coreServices, + createServiceFactory, +} from '@backstage/backend-plugin-api'; +import { DefaultMetricsService } from './DefaultMetricsService'; + +/** + * Service factory for collecting plugin-scoped metrics. + * + * @alpha + */ +export const metricsServiceFactory = createServiceFactory({ + service: metricsServiceRef, + deps: { + config: coreServices.rootConfig, + pluginMetadata: coreServices.pluginMetadata, + }, + factory: ({ config, pluginMetadata }) => { + const pluginId = pluginMetadata.getId(); + + const meterConfig = config.getOptionalConfig( + `backend.metrics.plugin.${pluginId}.meter`, + ); + const scopeName = `backstage-plugin-${pluginId}`; + const name = meterConfig?.getOptionalString('name') ?? scopeName; + const version = meterConfig?.getOptionalString('version'); + const schemaUrl = meterConfig?.getOptionalString('schemaUrl'); + + return DefaultMetricsService.create({ name, version, schemaUrl }); + }, +}); diff --git a/packages/backend-defaults/src/alpha/index.ts b/packages/backend-defaults/src/alpha/index.ts index c17e0e71cb..1d0ec158af 100644 --- a/packages/backend-defaults/src/alpha/index.ts +++ b/packages/backend-defaults/src/alpha/index.ts @@ -16,4 +16,5 @@ export { actionsRegistryServiceFactory } from './entrypoints/actionsRegistry'; export { actionsServiceFactory } from './entrypoints/actions'; +export { metricsServiceFactory } from './entrypoints/metrics'; export { rootSystemMetadataServiceFactory } from './entrypoints/rootSystemMetadata'; diff --git a/packages/backend-plugin-api/report-alpha.api.md b/packages/backend-plugin-api/report-alpha.api.md index e06e0c45d2..7d6786b97e 100644 --- a/packages/backend-plugin-api/report-alpha.api.md +++ b/packages/backend-plugin-api/report-alpha.api.md @@ -103,6 +103,150 @@ export const actionsServiceRef: ServiceRef< 'singleton' >; +// @alpha +export interface MetricAdvice { + explicitBucketBoundaries?: number[]; +} + +// @alpha +export interface MetricAttributes { + // (undocumented) + [attributeKey: string]: MetricAttributeValue | undefined; +} + +// @alpha +export type MetricAttributeValue = + | string + | number + | boolean + | Array + | Array + | Array; + +// @alpha +export interface MetricOptions { + advice?: MetricAdvice; + description?: string; + unit?: string; +} + +// @alpha +export interface MetricsService { + createCounter( + name: string, + opts?: MetricOptions, + ): MetricsServiceCounter; + createGauge( + name: string, + opts?: MetricOptions, + ): MetricsServiceGauge; + createHistogram( + name: string, + opts?: MetricOptions, + ): MetricsServiceHistogram; + createObservableCounter< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableCounter; + createObservableGauge< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableGauge; + createObservableUpDownCounter< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableUpDownCounter; + createUpDownCounter( + name: string, + opts?: MetricOptions, + ): MetricsServiceUpDownCounter; +} + +// @alpha +export interface MetricsServiceCounter< + TAttributes extends MetricAttributes = MetricAttributes, +> { + // (undocumented) + add(value: number, attributes?: TAttributes): void; +} + +// @alpha +export interface MetricsServiceGauge< + TAttributes extends MetricAttributes = MetricAttributes, +> { + // (undocumented) + record(value: number, attributes?: TAttributes): void; +} + +// @alpha +export interface MetricsServiceHistogram< + TAttributes extends MetricAttributes = MetricAttributes, +> { + // (undocumented) + record(value: number, attributes?: TAttributes): void; +} + +// @alpha +export interface MetricsServiceObservable< + TAttributes extends MetricAttributes = MetricAttributes, +> { + // (undocumented) + addCallback(callback: MetricsServiceObservableCallback): void; + // (undocumented) + removeCallback(callback: MetricsServiceObservableCallback): void; +} + +// @alpha +export type MetricsServiceObservableCallback< + TAttributes extends MetricAttributes = MetricAttributes, +> = ( + observableResult: MetricsServiceObservableResult, +) => void | Promise; + +// @alpha +export type MetricsServiceObservableCounter< + TAttributes extends MetricAttributes = MetricAttributes, +> = MetricsServiceObservable; + +// @alpha +export type MetricsServiceObservableGauge< + TAttributes extends MetricAttributes = MetricAttributes, +> = MetricsServiceObservable; + +// @alpha +export interface MetricsServiceObservableResult< + TAttributes extends MetricAttributes = MetricAttributes, +> { + // (undocumented) + observe(value: number, attributes?: TAttributes): void; +} + +// @alpha +export type MetricsServiceObservableUpDownCounter< + TAttributes extends MetricAttributes = MetricAttributes, +> = MetricsServiceObservable; + +// @alpha +export const metricsServiceRef: ServiceRef< + MetricsService, + 'plugin', + 'singleton' +>; + +// @alpha +export interface MetricsServiceUpDownCounter< + TAttributes extends MetricAttributes = MetricAttributes, +> { + // (undocumented) + add(value: number, attributes?: TAttributes): void; +} + // @public (undocumented) export interface RootSystemMetadataService { // (undocumented) diff --git a/packages/backend-plugin-api/src/alpha/MetricsService.ts b/packages/backend-plugin-api/src/alpha/MetricsService.ts new file mode 100644 index 0000000000..1c92ea9e09 --- /dev/null +++ b/packages/backend-plugin-api/src/alpha/MetricsService.ts @@ -0,0 +1,273 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Attribute values that can be attached to metric measurements. + * + * @alpha + */ +export type MetricAttributeValue = + | string + | number + | boolean + | Array + | Array + | Array; + +/** + * A set of key-value pairs that can be attached to metric measurements. + * + * @alpha + */ +export interface MetricAttributes { + [attributeKey: string]: MetricAttributeValue | undefined; +} + +/** + * Advisory options that influence aggregation configuration. + * + * @alpha + */ +export interface MetricAdvice { + /** + * Hint the explicit bucket boundaries for histogram aggregation. + */ + explicitBucketBoundaries?: number[]; +} + +/** + * Options for creating a metric instrument. + * + * @alpha + */ +export interface MetricOptions { + /** + * The description of the Metric. + */ + description?: string; + /** + * The unit of the Metric values. + */ + unit?: string; + /** + * Advisory options that influence aggregation configuration. + */ + advice?: MetricAdvice; +} + +/** + * A counter metric that only supports non-negative increments. + * + * @alpha + */ +export interface MetricsServiceCounter< + TAttributes extends MetricAttributes = MetricAttributes, +> { + add(value: number, attributes?: TAttributes): void; +} + +/** + * A counter metric that supports both positive and negative increments. + * + * @alpha + */ +export interface MetricsServiceUpDownCounter< + TAttributes extends MetricAttributes = MetricAttributes, +> { + add(value: number, attributes?: TAttributes): void; +} + +/** + * A histogram metric for recording distributions of values. + * + * @alpha + */ +export interface MetricsServiceHistogram< + TAttributes extends MetricAttributes = MetricAttributes, +> { + record(value: number, attributes?: TAttributes): void; +} + +/** + * A gauge metric for recording instantaneous values. + * + * @alpha + */ +export interface MetricsServiceGauge< + TAttributes extends MetricAttributes = MetricAttributes, +> { + record(value: number, attributes?: TAttributes): void; +} + +/** + * The result object passed to observable metric callbacks. + * + * @alpha + */ +export interface MetricsServiceObservableResult< + TAttributes extends MetricAttributes = MetricAttributes, +> { + observe(value: number, attributes?: TAttributes): void; +} + +/** + * A callback function for observable metrics. Called whenever a metric + * collection is initiated. + * + * @alpha + */ +export type MetricsServiceObservableCallback< + TAttributes extends MetricAttributes = MetricAttributes, +> = ( + observableResult: MetricsServiceObservableResult, +) => void | Promise; + +/** + * An observable metric instrument that reports values via callbacks. + * + * @alpha + */ +export interface MetricsServiceObservable< + TAttributes extends MetricAttributes = MetricAttributes, +> { + addCallback(callback: MetricsServiceObservableCallback): void; + removeCallback(callback: MetricsServiceObservableCallback): void; +} + +/** + * An observable counter metric that reports non-negative sums via callbacks. + * + * @alpha + */ +export type MetricsServiceObservableCounter< + TAttributes extends MetricAttributes = MetricAttributes, +> = MetricsServiceObservable; + +/** + * An observable counter metric that reports sums that can go up or down + * via callbacks. + * + * @alpha + */ +export type MetricsServiceObservableUpDownCounter< + TAttributes extends MetricAttributes = MetricAttributes, +> = MetricsServiceObservable; + +/** + * An observable gauge metric that reports instantaneous values via callbacks. + * + * @alpha + */ +export type MetricsServiceObservableGauge< + TAttributes extends MetricAttributes = MetricAttributes, +> = MetricsServiceObservable; + +/** + * A service that provides a facility for emitting metrics. + * + * @alpha + */ +export interface MetricsService { + /** + * Creates a new counter metric. + * + * @param name - The name of the metric. + * @param opts - The options for the metric. + * @returns The counter metric. + */ + createCounter( + name: string, + opts?: MetricOptions, + ): MetricsServiceCounter; + + /** + * Creates a new up-down counter metric. + * + * @param name - The name of the metric. + * @param opts - The options for the metric. + * @returns The up-down counter metric. + */ + createUpDownCounter( + name: string, + opts?: MetricOptions, + ): MetricsServiceUpDownCounter; + + /** + * Creates a new histogram metric. + * + * @param name - The name of the metric. + * @param opts - The options for the metric. + * @returns The histogram metric. + */ + createHistogram( + name: string, + opts?: MetricOptions, + ): MetricsServiceHistogram; + + /** + * Creates a new gauge metric. + * + * @param name - The name of the metric. + * @param opts - The options for the metric. + * @returns The gauge metric. + */ + createGauge( + name: string, + opts?: MetricOptions, + ): MetricsServiceGauge; + + /** + * Creates a new observable counter metric. + * + * @param name - The name of the metric. + * @param opts - The options for the metric. + * @returns The observable counter metric. + */ + createObservableCounter< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableCounter; + + /** + * Creates a new observable up-down counter metric. + * + * @param name - The name of the metric. + * @param opts - The options for the metric. + * @returns The observable up-down counter metric. + */ + createObservableUpDownCounter< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableUpDownCounter; + + /** + * Creates a new observable gauge metric. + * + * @param name - The name of the metric. + * @param opts - The options for the metric. + * @returns The observable gauge metric. + */ + createObservableGauge< + TAttributes extends MetricAttributes = MetricAttributes, + >( + name: string, + opts?: MetricOptions, + ): MetricsServiceObservableGauge; +} diff --git a/packages/backend-plugin-api/src/alpha/index.ts b/packages/backend-plugin-api/src/alpha/index.ts index 56f02f5275..c487686338 100644 --- a/packages/backend-plugin-api/src/alpha/index.ts +++ b/packages/backend-plugin-api/src/alpha/index.ts @@ -27,8 +27,27 @@ export type { export type { ActionsService, ActionsServiceAction } from './ActionsService'; +export type { + MetricsService, + MetricAdvice, + MetricAttributes, + MetricAttributeValue, + MetricOptions, + MetricsServiceCounter, + MetricsServiceUpDownCounter, + MetricsServiceHistogram, + MetricsServiceGauge, + MetricsServiceObservable, + MetricsServiceObservableCallback, + MetricsServiceObservableCounter, + MetricsServiceObservableGauge, + MetricsServiceObservableResult, + MetricsServiceObservableUpDownCounter, +} from './MetricsService'; + export { actionsRegistryServiceRef, actionsServiceRef, + metricsServiceRef, rootSystemMetadataServiceRef, } from './refs'; diff --git a/packages/backend-plugin-api/src/alpha/refs.ts b/packages/backend-plugin-api/src/alpha/refs.ts index a890271364..bd87ea8467 100644 --- a/packages/backend-plugin-api/src/alpha/refs.ts +++ b/packages/backend-plugin-api/src/alpha/refs.ts @@ -56,3 +56,14 @@ export const rootSystemMetadataServiceRef = createServiceRef< id: 'alpha.core.rootSystemMetadata', scope: 'root', }); + +/** + * Service for managing metrics. + * + * @alpha + */ +export const metricsServiceRef = createServiceRef< + import('./MetricsService').MetricsService +>({ + id: 'alpha.core.metrics', +}); diff --git a/packages/backend-test-utils/report-alpha.api.md b/packages/backend-test-utils/report-alpha.api.md index ca6f47191d..b6bf9e883d 100644 --- a/packages/backend-test-utils/report-alpha.api.md +++ b/packages/backend-test-utils/report-alpha.api.md @@ -12,6 +12,7 @@ import { BackstageCredentials } from '@backstage/backend-plugin-api'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; import { ServiceFactory } from '@backstage/backend-plugin-api'; // @alpha (undocumented) @@ -43,6 +44,16 @@ export namespace actionsServiceMock { ) => ServiceMock; } +// @alpha (undocumented) +export namespace metricsServiceMock { + const // (undocumented) + factory: () => ServiceFactory; + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ServiceMock; +} + // @alpha export class MockActionsRegistry implements ActionsRegistryService, ActionsService diff --git a/packages/backend-test-utils/src/alpha/services/MetricsServiceMock.ts b/packages/backend-test-utils/src/alpha/services/MetricsServiceMock.ts new file mode 100644 index 0000000000..301d47fb2e --- /dev/null +++ b/packages/backend-test-utils/src/alpha/services/MetricsServiceMock.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createServiceMock } from './alphaCreateServiceMock'; +import { + MetricsService, + metricsServiceRef, +} from '@backstage/backend-plugin-api/alpha'; +import { metricsServiceFactory } from '@backstage/backend-defaults/alpha'; + +/** + * @alpha + */ +export namespace metricsServiceMock { + export const factory = () => metricsServiceFactory; + + export const mock = createServiceMock( + metricsServiceRef, + () => ({ + createCounter: jest.fn().mockImplementation(() => ({ + add: jest.fn(), + })), + createUpDownCounter: jest.fn().mockImplementation(() => ({ + add: jest.fn(), + })), + createHistogram: jest.fn().mockImplementation(() => ({ + record: jest.fn(), + })), + createGauge: jest.fn().mockImplementation(() => ({ + record: jest.fn(), + })), + createObservableCounter: jest.fn().mockImplementation(() => ({ + addCallback: jest.fn(), + removeCallback: jest.fn(), + })), + createObservableUpDownCounter: jest.fn().mockImplementation(() => ({ + addCallback: jest.fn(), + removeCallback: jest.fn(), + })), + createObservableGauge: jest.fn().mockImplementation(() => ({ + addCallback: jest.fn(), + removeCallback: jest.fn(), + })), + }), + ); +} diff --git a/packages/backend-test-utils/src/alpha/services/index.ts b/packages/backend-test-utils/src/alpha/services/index.ts index ac92033ff8..527bb1822f 100644 --- a/packages/backend-test-utils/src/alpha/services/index.ts +++ b/packages/backend-test-utils/src/alpha/services/index.ts @@ -17,4 +17,5 @@ export { actionsRegistryServiceMock } from './ActionsRegistryServiceMock'; export { MockActionsRegistry } from './MockActionsRegistry'; export { actionsServiceMock } from './ActionsServiceMock'; +export { metricsServiceMock } from './MetricsServiceMock'; export { type ServiceMock } from './alphaCreateServiceMock'; diff --git a/packages/backend-test-utils/src/wiring/TestBackend.ts b/packages/backend-test-utils/src/wiring/TestBackend.ts index 43a63a49e5..11decb883d 100644 --- a/packages/backend-test-utils/src/wiring/TestBackend.ts +++ b/packages/backend-test-utils/src/wiring/TestBackend.ts @@ -43,6 +43,7 @@ import { HostDiscovery } from '@backstage/backend-defaults/discovery'; import { actionsRegistryServiceMock, actionsServiceMock, + metricsServiceMock, } from '../alpha/services'; /** @public */ @@ -92,6 +93,7 @@ export const defaultServiceFactories = [ // Alpha services actionsRegistryServiceMock.factory(), actionsServiceMock.factory(), + metricsServiceMock.factory(), ]; /** diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index 790762a428..b9f3599b19 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -36,6 +36,7 @@ import { createRandomProcessingInterval } from '../processing/refresh'; import { timestampToDateTime } from './conversion'; import { generateStableHash } from './util'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { metricsServiceMock } from '@backstage/backend-test-utils/alpha'; jest.setTimeout(60_000); @@ -59,6 +60,7 @@ describe('DefaultProcessingDatabase', () => { maxSeconds: 150, }), events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }), }; } diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index a421ca19b2..264c11055d 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -47,6 +47,7 @@ import { DateTime } from 'luxon'; import { CATALOG_CONFLICTS_TOPIC } from '../constants'; import { CatalogConflictEventPayload } from '../catalog/types'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; // The number of items that are sent per batch to the database layer, when // doing .batchInsert calls to knex. This needs to be low enough to not cause @@ -60,6 +61,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { logger: LoggerService; refreshInterval: ProcessingIntervalFunction; events: EventsService; + metrics: MetricsService; }; constructor(options: { @@ -67,9 +69,10 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { logger: LoggerService; refreshInterval: ProcessingIntervalFunction; events: EventsService; + metrics: MetricsService; }) { this.options = options; - initDatabaseMetrics(options.database); + initDatabaseMetrics(options.database, options.metrics); } async updateProcessedEntity( diff --git a/plugins/catalog-backend/src/database/metrics.ts b/plugins/catalog-backend/src/database/metrics.ts index 809405d69f..f6a1464b3a 100644 --- a/plugins/catalog-backend/src/database/metrics.ts +++ b/plugins/catalog-backend/src/database/metrics.ts @@ -17,12 +17,12 @@ import { Knex } from 'knex'; import { createGaugeMetric } from '../util/metrics'; import { DbRelationsRow, DbLocationsRow, DbSearchRow } from './tables'; -import { metrics } from '@opentelemetry/api'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; -export function initDatabaseMetrics(knex: Knex) { +export function initDatabaseMetrics(knex: Knex, metrics: MetricsService) { const seenProm = new Set(); const seen = new Set(); - const meter = metrics.getMeter('default'); + return { entities_count_prom: createGaugeMetric({ name: 'catalog_entities_count', @@ -69,7 +69,7 @@ export function initDatabaseMetrics(knex: Knex) { this.set(Number(total[0].count)); }, }), - entities_count: meter + entities_count: metrics .createObservableGauge('catalog_entities_count', { description: 'Total amount of entities in the catalog', }) @@ -93,7 +93,7 @@ export function initDatabaseMetrics(knex: Knex) { } }); }), - registered_locations: meter + registered_locations: metrics .createObservableGauge('catalog_registered_locations_count', { description: 'Total amount of registered locations in the catalog', }) @@ -113,7 +113,7 @@ export function initDatabaseMetrics(knex: Knex) { gauge.observe(Number(total[0].count)); } }), - relations: meter + relations: metrics .createObservableGauge('catalog_relations_count', { description: 'Total amount of relations between entities', }) diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts index ae23830712..88829fc448 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts @@ -23,6 +23,7 @@ import { CatalogProcessingOrchestrator } from './types'; import { Stitcher } from '../stitching/types'; import { ConfigReader } from '@backstage/config'; import { mockServices } from '@backstage/backend-test-utils'; +import { metricsServiceMock } from '@backstage/backend-test-utils/alpha'; describe('DefaultCatalogProcessingEngine', () => { const db = { @@ -72,6 +73,7 @@ describe('DefaultCatalogProcessingEngine', () => { createHash: () => hash, scheduler: mockServices.scheduler(), events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -141,6 +143,7 @@ describe('DefaultCatalogProcessingEngine', () => { scheduler: mockServices.scheduler(), createHash: () => hash, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -226,6 +229,7 @@ describe('DefaultCatalogProcessingEngine', () => { scheduler: mockServices.scheduler(), createHash: () => hash, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -305,6 +309,7 @@ describe('DefaultCatalogProcessingEngine', () => { scheduler: mockServices.scheduler(), createHash: () => hash, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -367,6 +372,7 @@ describe('DefaultCatalogProcessingEngine', () => { createHash: () => hash, pollingIntervalMs: 100, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -484,6 +490,7 @@ describe('DefaultCatalogProcessingEngine', () => { createHash: () => hash, pollingIntervalMs: 100, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -591,6 +598,7 @@ describe('DefaultCatalogProcessingEngine', () => { createHash: () => hash, pollingIntervalMs: 100, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -676,6 +684,7 @@ describe('DefaultCatalogProcessingEngine', () => { createHash: () => hash, pollingIntervalMs: 100, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); @@ -766,6 +775,7 @@ describe('DefaultCatalogProcessingEngine', () => { createHash: () => hash, pollingIntervalMs: 100, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); db.transaction.mockImplementation(cb => cb((() => {}) as any)); diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index 3bcd4fcf44..9416fceea1 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -23,7 +23,7 @@ import { assertError, serializeError, stringifyError } from '@backstage/errors'; import { Hash } from 'node:crypto'; import stableStringify from 'fast-json-stable-stringify'; import { Knex } from 'knex'; -import { metrics, trace } from '@opentelemetry/api'; +import { trace } from '@opentelemetry/api'; import { ProcessingDatabase, RefreshStateItem } from '../database/types'; import { createCounterMetric, createSummaryMetric } from '../util/metrics'; import { CatalogProcessingOrchestrator, EntityProcessingResult } from './types'; @@ -39,6 +39,7 @@ import { deleteOrphanedEntities } from '../database/operations/util/deleteOrphan import { EventsService } from '@backstage/plugin-events-node'; import { CATALOG_ERRORS_TOPIC } from '../constants'; import { LoggerService, SchedulerService } from '@backstage/backend-plugin-api'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; const CACHE_TTL = 5; @@ -94,6 +95,7 @@ export class DefaultCatalogProcessingEngine { }) => Promise | void; tracker?: ProgressTracker; events: EventsService; + metrics: MetricsService; }) { this.config = options.config; this.scheduler = options.scheduler; @@ -106,7 +108,7 @@ export class DefaultCatalogProcessingEngine { this.pollingIntervalMs = options.pollingIntervalMs ?? 1_000; this.orphanCleanupIntervalMs = options.orphanCleanupIntervalMs ?? 30_000; this.onProcessingError = options.onProcessingError; - this.tracker = options.tracker ?? progressTracker(); + this.tracker = options.tracker ?? progressTracker(options.metrics); this.events = options.events; this.stopFunc = undefined; @@ -386,7 +388,7 @@ export class DefaultCatalogProcessingEngine { } // Helps wrap the timing and logging behaviors -function progressTracker() { +function progressTracker(metrics: MetricsService) { // prom-client metrics are deprecated in favour of OpenTelemetry metrics. const promProcessedEntities = createCounterMetric({ name: 'catalog_processed_entities_count', @@ -408,13 +410,12 @@ function progressTracker() { help: 'The amount of delay between being scheduled for processing, and the start of actually being processed, DEPRECATED, use OpenTelemetry metrics instead', }); - const meter = metrics.getMeter('default'); - const processedEntities = meter.createCounter( + const processedEntities = metrics.createCounter( 'catalog.processed.entities.count', { description: 'Amount of entities processed' }, ); - const processingDuration = meter.createHistogram( + const processingDuration = metrics.createHistogram( 'catalog.processing.duration', { description: 'Time spent executing the full processing flow', @@ -422,7 +423,7 @@ function progressTracker() { }, ); - const processorsDuration = meter.createHistogram( + const processorsDuration = metrics.createHistogram( 'catalog.processors.duration', { description: 'Time spent executing catalog processors', @@ -430,7 +431,7 @@ function progressTracker() { }, ); - const processingQueueDelay = meter.createHistogram( + const processingQueueDelay = metrics.createHistogram( 'catalog.processing.queue.delay', { description: diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index e3d0c26b0f..d0f2442f0c 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -117,6 +117,7 @@ import { import { filterAndSortProcessors, filterProviders } from './util'; import { GenericScmEventRefreshProvider } from '../providers/GenericScmEventRefreshProvider'; import { readScmEventHandlingConfig } from '../util/readScmEventHandlingConfig'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; export type CatalogEnvironment = { logger: LoggerService; @@ -131,6 +132,7 @@ export type CatalogEnvironment = { auditor: AuditorService; events: EventsService; catalogScmEvents: CatalogScmEventsService; + metrics: MetricsService; }; /** @@ -429,6 +431,7 @@ export class CatalogBuilder { httpAuth, events, catalogScmEvents, + metrics, } = this.env; const enableRelationsCompatibility = Boolean( @@ -448,6 +451,7 @@ export class CatalogBuilder { const stitcher = DefaultStitcher.fromConfig(config, { knex: dbClient, logger, + metrics, }); const processingDatabase = new DefaultProcessingDatabase({ @@ -455,6 +459,7 @@ export class CatalogBuilder { logger, events, refreshInterval: this.processingInterval, + metrics, }); const providerDatabase = new DefaultProviderDatabase({ database: dbClient, @@ -577,6 +582,7 @@ export class CatalogBuilder { this.onProcessingError?.(event); }, events, + metrics, }); const locationAnalyzer = diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index a032fd732e..915dd80dd9 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -43,10 +43,12 @@ import { } from '@backstage/plugin-catalog-node/alpha'; import { eventsServiceRef } from '@backstage/plugin-events-node'; import { Permission } from '@backstage/plugin-permission-common'; -import { metrics } from '@opentelemetry/api'; import { merge } from 'lodash'; import { CatalogBuilder } from './CatalogBuilder'; -import { actionsRegistryServiceRef } from '@backstage/backend-plugin-api/alpha'; +import { + actionsRegistryServiceRef, + metricsServiceRef, +} from '@backstage/backend-plugin-api/alpha'; import { createCatalogActions } from '../actions'; import type { EntityProviderEntry } from '../processing/connectEntityProviders'; @@ -220,6 +222,7 @@ export const catalogPlugin = createBackendPlugin({ catalog: catalogServiceRef, actionsRegistry: actionsRegistryServiceRef, catalogScmEvents: catalogScmEventsServiceRef, + metrics: metricsServiceRef, }, async init({ logger, @@ -238,6 +241,7 @@ export const catalogPlugin = createBackendPlugin({ auditor, events, catalogScmEvents, + metrics, }) { const builder = await CatalogBuilder.create({ config, @@ -252,6 +256,7 @@ export const catalogPlugin = createBackendPlugin({ auditor, events, catalogScmEvents, + metrics, }); if (onProcessingError) { @@ -303,9 +308,7 @@ export const catalogPlugin = createBackendPlugin({ actionsRegistry, }); - // Track SCM event message counts as a metric - const meter = metrics.getMeter('default'); - const scmEventsMessagesCounter = meter.createCounter<{ + const scmEventsMessagesCounter = metrics.createCounter<{ eventType: string; }>('catalog.events.scm.messages', { description: diff --git a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts index fffe2467b5..00ce749b4a 100644 --- a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts +++ b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts @@ -38,6 +38,7 @@ import { DefaultRefreshService } from './DefaultRefreshService'; import { ConfigReader } from '@backstage/config'; import { DefaultStitcher } from '../stitching/DefaultStitcher'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { metricsServiceMock } from '@backstage/backend-test-utils/alpha'; jest.setTimeout(60_000); @@ -58,6 +59,7 @@ describe('DefaultRefreshService', () => { logger, refreshInterval: () => 100, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }), catalogDb: new DefaultCatalogDatabase({ database: knex, @@ -115,6 +117,7 @@ describe('DefaultRefreshService', () => { const stitcher = DefaultStitcher.fromConfig(new ConfigReader({}), { knex, logger: defaultLogger, + metrics: metricsServiceMock.mock(), }); const engine = new DefaultCatalogProcessingEngine({ config: new ConfigReader({}), @@ -164,6 +167,7 @@ describe('DefaultRefreshService', () => { createHash: () => createHash('sha1'), pollingIntervalMs: 50, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); return engine; diff --git a/plugins/catalog-backend/src/stitching/DefaultStitcher.test.ts b/plugins/catalog-backend/src/stitching/DefaultStitcher.test.ts index 251aaa9080..88acf68dd3 100644 --- a/plugins/catalog-backend/src/stitching/DefaultStitcher.test.ts +++ b/plugins/catalog-backend/src/stitching/DefaultStitcher.test.ts @@ -25,6 +25,7 @@ import { DbSearchRow, } from '../database/tables'; import { DefaultStitcher } from './DefaultStitcher'; +import { metricsServiceMock } from '@backstage/backend-test-utils/alpha'; jest.setTimeout(60_000); @@ -42,6 +43,7 @@ describe('Stitcher', () => { knex: db, logger, strategy: { mode: 'immediate' }, + metrics: metricsServiceMock.mock(), }); let entities: DbFinalEntitiesRow[]; let entity: Entity; diff --git a/plugins/catalog-backend/src/stitching/DefaultStitcher.ts b/plugins/catalog-backend/src/stitching/DefaultStitcher.ts index 14b3eca0d4..e7848961a6 100644 --- a/plugins/catalog-backend/src/stitching/DefaultStitcher.ts +++ b/plugins/catalog-backend/src/stitching/DefaultStitcher.ts @@ -31,6 +31,7 @@ import { stitchingStrategyFromConfig, } from './types'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; type DeferredStitchItem = Awaited< ReturnType @@ -55,11 +56,13 @@ export class DefaultStitcher implements Stitcher { options: { knex: Knex; logger: LoggerService; + metrics: MetricsService; }, ): DefaultStitcher { return new DefaultStitcher({ knex: options.knex, logger: options.logger, + metrics: options.metrics, strategy: stitchingStrategyFromConfig(config), }); } @@ -67,12 +70,17 @@ export class DefaultStitcher implements Stitcher { constructor(options: { knex: Knex; logger: LoggerService; + metrics: MetricsService; strategy: StitchingStrategy; }) { this.knex = options.knex; this.logger = options.logger; this.strategy = options.strategy; - this.tracker = progressTracker(options.knex, options.logger); + this.tracker = progressTracker( + options.knex, + options.logger, + options.metrics, + ); } async stitch(options: { diff --git a/plugins/catalog-backend/src/stitching/progressTracker.ts b/plugins/catalog-backend/src/stitching/progressTracker.ts index 9e00a1a01b..f460a17a51 100644 --- a/plugins/catalog-backend/src/stitching/progressTracker.ts +++ b/plugins/catalog-backend/src/stitching/progressTracker.ts @@ -15,31 +15,33 @@ */ import { stringifyError } from '@backstage/errors'; -import { metrics } from '@opentelemetry/api'; import { Knex } from 'knex'; import { DateTime } from 'luxon'; import { DbRefreshStateRow } from '../database/tables'; import { createCounterMetric } from '../util/metrics'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; // Helps wrap the timing and logging behaviors -export function progressTracker(knex: Knex, logger: LoggerService) { +export function progressTracker( + knex: Knex, + logger: LoggerService, + metrics: MetricsService, +) { // prom-client metrics are deprecated in favour of OpenTelemetry metrics. const promStitchedEntities = createCounterMetric({ name: 'catalog_stitched_entities_count', help: 'Amount of entities stitched. DEPRECATED, use OpenTelemetry metrics instead', }); - const meter = metrics.getMeter('default'); - - const stitchedEntities = meter.createCounter( + const stitchedEntities = metrics.createCounter( 'catalog.stitched.entities.count', { description: 'Amount of entities stitched', }, ); - const stitchingDuration = meter.createHistogram( + const stitchingDuration = metrics.createHistogram( 'catalog.stitching.duration', { description: 'Time spent executing the full stitching flow', @@ -47,7 +49,7 @@ export function progressTracker(knex: Knex, logger: LoggerService) { }, ); - const stitchingQueueCount = meter.createObservableGauge( + const stitchingQueueCount = metrics.createObservableGauge( 'catalog.stitching.queue.length', { description: 'Number of entities currently in the stitching queue' }, ); @@ -58,7 +60,7 @@ export function progressTracker(knex: Knex, logger: LoggerService) { result.observe(Number(total[0].count)); }); - const stitchingQueueDelay = meter.createHistogram( + const stitchingQueueDelay = metrics.createHistogram( 'catalog.stitching.queue.delay', { description: diff --git a/plugins/catalog-backend/src/tests/integration.test.ts b/plugins/catalog-backend/src/tests/integration.test.ts index a213d41efb..d03a23f896 100644 --- a/plugins/catalog-backend/src/tests/integration.test.ts +++ b/plugins/catalog-backend/src/tests/integration.test.ts @@ -56,6 +56,7 @@ import { mockServices, TestDatabases } from '@backstage/backend-test-utils'; import { LoggerService } from '@backstage/backend-plugin-api'; import { entitiesResponseToObjects } from '../service/response'; import { deleteOrphanedEntities } from '../database/operations/util/deleteOrphanedEntities'; +import { metricsServiceMock } from '@backstage/backend-test-utils/alpha'; const voidLogger = mockServices.logger.mock(); @@ -248,6 +249,7 @@ class TestHarness { logger, events: mockServices.events.mock(), refreshInterval: () => 0.05, + metrics: metricsServiceMock.mock(), }); const integrations = ScmIntegrations.fromConfig(config); @@ -280,6 +282,7 @@ class TestHarness { const stitcher = DefaultStitcher.fromConfig(config, { knex: options.db, logger, + metrics: metricsServiceMock.mock(), }); const catalog = new DefaultEntitiesCatalog({ database: options.db, @@ -306,6 +309,7 @@ class TestHarness { }, tracker: proxyProgressTracker, events: mockServices.events.mock(), + metrics: metricsServiceMock.mock(), }); const refresh = new DefaultRefreshService({ database: catalogDatabase }); diff --git a/plugins/catalog-backend/src/tests/performance/getProcessableEntitiesPerformance.test.ts b/plugins/catalog-backend/src/tests/performance/getProcessableEntitiesPerformance.test.ts index 6efa3abbc7..53991e4416 100644 --- a/plugins/catalog-backend/src/tests/performance/getProcessableEntitiesPerformance.test.ts +++ b/plugins/catalog-backend/src/tests/performance/getProcessableEntitiesPerformance.test.ts @@ -19,6 +19,7 @@ import { Knex } from 'knex'; import { DefaultProcessingDatabase } from '../../database/DefaultProcessingDatabase'; import { applyDatabaseMigrations } from '../../database/migrations'; import { describePerformanceTest, performanceTraceEnabled } from './lib/env'; +import { metricsServiceMock } from '@backstage/backend-test-utils/alpha'; // #region Helpers @@ -81,6 +82,7 @@ describePerformanceTest('getProcessableEntities', () => { logger: mockServices.logger.mock(), events: mockServices.events.mock(), refreshInterval: () => 0, + metrics: metricsServiceMock.mock(), }); const start = Date.now(); From 68d8a1acc3a9cad70f39d89aad75dc32ea7aaf60 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:09:43 -0500 Subject: [PATCH 200/455] Fix prettier errors viewing-catalog.md viewing-entity-relationships.md filter-catalog.md register-a-component.md unregister-delete-component.md Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/register-a-component.md | 6 +++--- docs/getting-started/unregister-delete-component.md | 3 +-- docs/getting-started/viewing-catalog.md | 10 +++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/getting-started/register-a-component.md b/docs/getting-started/register-a-component.md index e249838c5e..1f2fda2871 100644 --- a/docs/getting-started/register-a-component.md +++ b/docs/getting-started/register-a-component.md @@ -49,12 +49,12 @@ To manually register a component in the Software Catalog: 4. Select `ANALYZE`. 5. If the changes from `ANALYZE` are correct, select `IMPORT`. - ![review and select import.](../assets/uiguide/review-select-import.png) + ![review and select import.](../assets/uiguide/review-select-import.png) If your entity was successfully imported, the details will be displayed. - ![details of registered component.](../assets/uiguide/details-for-registered-backstage-website.png) + ![details of registered component.](../assets/uiguide/details-for-registered-backstage-website.png) 6. Select `Home` to view your new entity in the Software Catalog. - ![Backstage website component in software catalog.](../assets/uiguide/backstage-website-registered-catalog-view.png) + ![Backstage website component in software catalog.](../assets/uiguide/backstage-website-registered-catalog-view.png) diff --git a/docs/getting-started/unregister-delete-component.md b/docs/getting-started/unregister-delete-component.md index eb9a691819..196b0202ba 100644 --- a/docs/getting-started/unregister-delete-component.md +++ b/docs/getting-started/unregister-delete-component.md @@ -12,7 +12,7 @@ URLs to YAML files that you registered either using the `Create` button or by ad [Implicit deletion](../features/software-catalog/life-of-an-entity.md#implicit-deletion) occurs when an entity provider issues a deletion of an entity. That entity, as well as the entire tree of entities processed out of it are considered for immediate deletion. -However, you are also able to manually unregister an entity from the Catalog or perform a direct, [explicit deletion](../features/software-catalog/life-of-an-entity.md#explicit-deletion) of individual entities. +However, you are also able to manually unregister an entity from the Catalog or perform a direct, [explicit deletion](../features/software-catalog/life-of-an-entity.md#explicit-deletion) of individual entities. ## Unregistering an entity @@ -39,7 +39,6 @@ You can also delete an entity from the Catalog. However, this requires that you To delete an entity: 1. Delete the following entity definition files for the entity in the repository: - - catalog-info.yaml - index.js - package.json diff --git a/docs/getting-started/viewing-catalog.md b/docs/getting-started/viewing-catalog.md index db0416eb0f..acfa470cc2 100644 --- a/docs/getting-started/viewing-catalog.md +++ b/docs/getting-started/viewing-catalog.md @@ -13,10 +13,10 @@ Initially, when you log into your standalone Backstage App, `Home` is selected i There are four main entities that you should become familiar with: - - `Components` - Individual pieces of software that can be tracked in source control and can implement APIs for other components to consume. - - `Resources` - The physical or virtual infrastructure needed to operate a component. - - `Systems` - A collection of resources and components that cooperate to perform a function by exposing one or several public APIs. It hides the resources and private APIs between the components from the consumer. - - `Domains` - A collection of systems that share terminology, domain models, metrics, KPIs, business purpose, or documentation. +- `Components` - Individual pieces of software that can be tracked in source control and can implement APIs for other components to consume. +- `Resources` - The physical or virtual infrastructure needed to operate a component. +- `Systems` - A collection of resources and components that cooperate to perform a function by exposing one or several public APIs. It hides the resources and private APIs between the components from the consumer. +- `Domains` - A collection of systems that share terminology, domain models, metrics, KPIs, business purpose, or documentation. The [Technical Overview](../overview/technical-overview.md#software-catalog-system-model) provides a description of all of the types of entities displayed in the Catalog. @@ -59,7 +59,7 @@ You can modify the columns associated with each kind of entity, following the in ## Catalog Actions -For each entity, there are a set of actions that are available. +For each entity, there are a set of actions that are available. ![Screenshot explaining entity actions.](../assets/uiguide/entity-actions.png) From dc81af158f3ec81acd6e4bf7dd73e27b625f2cfe Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 24 Feb 2026 17:18:02 +0100 Subject: [PATCH 201/455] feat(mcp-actions): add server operation and session duration metrics (#32978) Signed-off-by: Kurt King Co-authored-by: Kurt King --- .changeset/swift-ravens-jog.md | 8 + plugins/mcp-actions-backend/README.md | 9 +- plugins/mcp-actions-backend/src/metrics.ts | 73 ++++++++ .../mcp-actions-backend/src/plugin.test.ts | 2 + plugins/mcp-actions-backend/src/plugin.ts | 5 + .../src/routers/createStreamableRouter.ts | 37 ++++ .../src/services/McpService.test.ts | 150 +++++++++++++++- .../src/services/McpService.ts | 160 +++++++++++++----- 8 files changed, 395 insertions(+), 49 deletions(-) create mode 100644 .changeset/swift-ravens-jog.md create mode 100644 plugins/mcp-actions-backend/src/metrics.ts diff --git a/.changeset/swift-ravens-jog.md b/.changeset/swift-ravens-jog.md new file mode 100644 index 0000000000..db92764560 --- /dev/null +++ b/.changeset/swift-ravens-jog.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-mcp-actions-backend': patch +--- + +Adds two new metrics to track MCP server operations and sessions. + +- `mcp.server.operation.duration`: The duration taken to process an individual MCP operation +- `mcp.server.session.duration`: The duration of the MCP session from the perspective of the server diff --git a/plugins/mcp-actions-backend/README.md b/plugins/mcp-actions-backend/README.md index c2eba60c80..095aa46122 100644 --- a/plugins/mcp-actions-backend/README.md +++ b/plugins/mcp-actions-backend/README.md @@ -75,7 +75,7 @@ export const myPlugin = createBackendPlugin({ When errors are thrown from MCP actions, the backend will handle and surface error message for any error from `@backstage/errors`. Unknown errors will be handled by `@modelcontextprotocol/sdk`'s default error handling, which may result in a generic `500 Server Error` being returned. As a result, we recommend using errors from `@backstage/errors` when applicable. -See https://backstage.io/api/stable/modules/_backstage_errors.html for a full list of supported errors. +See [Backstage Errors](https://backstage.io/docs/reference/errors/) for a full list of supported errors. When writing MCP tools, use the appropriate error from `@backstage/errors` when applicable: @@ -178,6 +178,13 @@ There's a few different ways to configure MCP tools, but here's a snippet of the } ``` +## Metrics + +The MCP Actions Backend emits metrics for the following operations: + +- `mcp.server.operation.duration`: The duration taken to process an individual MCP operation +- `mcp.server.session.duration`: The duration of the MCP session from the perspective of the server + ## Development This plugin backend can be started in a standalone mode from directly in this package with `yarn start`. It is a limited setup that is most convenient when developing the plugin backend itself. diff --git a/plugins/mcp-actions-backend/src/metrics.ts b/plugins/mcp-actions-backend/src/metrics.ts new file mode 100644 index 0000000000..ddaa75edbd --- /dev/null +++ b/plugins/mcp-actions-backend/src/metrics.ts @@ -0,0 +1,73 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MetricAttributes } from '@backstage/backend-plugin-api/alpha'; + +/** + * Attributes for mcp.server.operation.duration + * Following OTel requirement levels from the spec + * + * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/#metric-mcpserveroperationduration + */ +export interface McpServerOperationAttributes extends MetricAttributes { + // Required + 'mcp.method.name': string; + + // Conditionally Required + 'error.type'?: string; + 'gen_ai.tool.name'?: string; + 'gen_ai.prompt.name'?: string; + 'mcp.resource.uri'?: string; + 'rpc.response.status_code'?: string; + + // Recommended + 'gen_ai.operation.name'?: 'execute_tool'; + 'mcp.protocol.version'?: string; + 'mcp.session.id'?: string; + 'network.transport'?: 'tcp' | 'quic' | 'pipe' | 'unix'; + 'network.protocol.name'?: string; + 'network.protocol.version'?: string; +} + +/** + * Attributes for mcp.server.session.duration + * Following OTel requirement levels from the spec + * + * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/#metric-mcpserversessionduration + */ +export interface McpServerSessionAttributes extends MetricAttributes { + // Conditionally Required + 'error.type'?: string; + + // Recommended + 'mcp.protocol.version'?: string; + 'network.transport'?: 'tcp' | 'quic' | 'pipe' | 'unix'; + 'network.protocol.name'?: string; + 'network.protocol.version'?: string; +} + +/** + * OTel recommended bucket boundaries for MCP metrics + * + * @remarks + * + * Based on the MCP metrics defined in the OTel semantic conventions v1.39.0 + * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/mcp/ + * + */ +export const bucketBoundaries = [ + 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 30, 60, 120, 300, +]; diff --git a/plugins/mcp-actions-backend/src/plugin.test.ts b/plugins/mcp-actions-backend/src/plugin.test.ts index 0bbe5d5340..1e3297792a 100644 --- a/plugins/mcp-actions-backend/src/plugin.test.ts +++ b/plugins/mcp-actions-backend/src/plugin.test.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import { mockServices, startTestBackend } from '@backstage/backend-test-utils'; +import { metricsServiceMock } from '@backstage/backend-test-utils/alpha'; import { mcpPlugin } from './plugin'; import { actionsRegistryServiceRef } from '@backstage/backend-plugin-api/alpha'; import { createBackendPlugin } from '@backstage/backend-plugin-api'; @@ -52,6 +53,7 @@ describe('Mcp Backend', () => { features: [ mcpPlugin, mockPluginWithActions, + metricsServiceMock.mock().factory, mockServices.rootConfig.factory({ data: { backend: { diff --git a/plugins/mcp-actions-backend/src/plugin.ts b/plugins/mcp-actions-backend/src/plugin.ts index 34a9501fed..71a40db18d 100644 --- a/plugins/mcp-actions-backend/src/plugin.ts +++ b/plugins/mcp-actions-backend/src/plugin.ts @@ -25,6 +25,7 @@ import { createSseRouter } from './routers/createSseRouter'; import { actionsRegistryServiceRef, actionsServiceRef, + metricsServiceRef, } from '@backstage/backend-plugin-api/alpha'; /** @@ -46,6 +47,7 @@ export const mcpPlugin = createBackendPlugin({ rootRouter: coreServices.rootHttpRouter, discovery: coreServices.discovery, config: coreServices.rootConfig, + metrics: metricsServiceRef, }, async init({ actions, @@ -55,9 +57,11 @@ export const mcpPlugin = createBackendPlugin({ rootRouter, discovery, config, + metrics, }) { const mcpService = await McpService.create({ actions, + metrics, }); const sseRouter = createSseRouter({ @@ -69,6 +73,7 @@ export const mcpPlugin = createBackendPlugin({ mcpService, httpAuth, logger, + metrics, }); const router = Router(); diff --git a/plugins/mcp-actions-backend/src/routers/createStreamableRouter.ts b/plugins/mcp-actions-backend/src/routers/createStreamableRouter.ts index 9d6fd1840b..b08605337d 100644 --- a/plugins/mcp-actions-backend/src/routers/createStreamableRouter.ts +++ b/plugins/mcp-actions-backend/src/routers/createStreamableRouter.ts @@ -15,23 +15,47 @@ */ import PromiseRouter from 'express-promise-router'; import { Router } from 'express'; +import { performance } from 'node:perf_hooks'; import { McpService } from '../services/McpService'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; +import { LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/sdk/types.js'; import { HttpAuthService, LoggerService } from '@backstage/backend-plugin-api'; import { isError } from '@backstage/errors'; +import { MetricsService } from '@backstage/backend-plugin-api/alpha'; +import { bucketBoundaries, McpServerSessionAttributes } from '../metrics'; export const createStreamableRouter = ({ mcpService, httpAuth, logger, + metrics, }: { mcpService: McpService; logger: LoggerService; httpAuth: HttpAuthService; + metrics: MetricsService; }): Router => { const router = PromiseRouter(); + const sessionDuration = metrics.createHistogram( + 'mcp.server.session.duration', + { + description: + 'The duration of the MCP session as observed on the MCP server', + unit: 's', + advice: { explicitBucketBoundaries: bucketBoundaries }, + }, + ); + router.post('/', async (req, res) => { + const sessionStart = performance.now(); + + const baseAttributes: McpServerSessionAttributes = { + 'mcp.protocol.version': LATEST_PROTOCOL_VERSION, + 'network.transport': 'tcp', + 'network.protocol.name': 'http', + }; + try { const server = mcpService.getServer({ credentials: await httpAuth.credentials(req), @@ -49,8 +73,14 @@ export const createStreamableRouter = ({ res.on('close', () => { transport.close(); server.close(); + + const durationSeconds = (performance.now() - sessionStart) / 1000; + + sessionDuration.record(durationSeconds, baseAttributes); }); } catch (error) { + const errorType = isError(error) ? error.name : 'Error'; + if (isError(error)) { logger.error(error.message); } @@ -65,6 +95,13 @@ export const createStreamableRouter = ({ id: null, }); } + + const durationSeconds = (performance.now() - sessionStart) / 1000; + + sessionDuration.record(durationSeconds, { + ...baseAttributes, + 'error.type': errorType, + }); } }); diff --git a/plugins/mcp-actions-backend/src/services/McpService.test.ts b/plugins/mcp-actions-backend/src/services/McpService.test.ts index cd1c98f5b1..038700c4a5 100644 --- a/plugins/mcp-actions-backend/src/services/McpService.test.ts +++ b/plugins/mcp-actions-backend/src/services/McpService.test.ts @@ -16,7 +16,10 @@ import { mockCredentials } from '@backstage/backend-test-utils'; import { McpService } from './McpService'; -import { actionsRegistryServiceMock } from '@backstage/backend-test-utils/alpha'; +import { + actionsRegistryServiceMock, + metricsServiceMock, +} from '@backstage/backend-test-utils/alpha'; import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js'; import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { @@ -38,8 +41,10 @@ describe('McpService', () => { action: async () => ({ output: { output: 'test' } }), }); + const mockMetrics = metricsServiceMock.mock(); const mcpService = await McpService.create({ actions: mockActionsRegistry, + metrics: mockMetrics, }); const server = mcpService.getServer({ @@ -90,6 +95,60 @@ describe('McpService', () => { name: 'mock-action', }, ]); + + const histogram = mockMetrics.createHistogram.mock.results[0]?.value; + expect(histogram.record).toHaveBeenCalledTimes(1); + expect(histogram.record).toHaveBeenCalledWith( + expect.any(Number), + expect.objectContaining({ + 'mcp.method.name': 'tools/list', + }), + ); + expect(histogram.record.mock.calls[0][1]).not.toHaveProperty('error.type'); + }); + + it('should record metrics with error.type when tools/list fails', async () => { + const mockActionsRegistry = actionsRegistryServiceMock(); + mockActionsRegistry.list = jest + .fn() + .mockRejectedValue(new Error('List failed')); + + const mockMetrics = metricsServiceMock.mock(); + const mcpService = await McpService.create({ + actions: mockActionsRegistry, + metrics: mockMetrics, + }); + + const server = mcpService.getServer({ + credentials: mockCredentials.user(), + }); + + const client = new Client({ + name: 'test client', + version: '1.0', + }); + + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair(); + + await Promise.all([ + client.connect(clientTransport), + server.connect(serverTransport), + ]); + + await expect( + client.request({ method: 'tools/list' }, ListToolsResultSchema), + ).rejects.toThrow(); + + const histogram = mockMetrics.createHistogram.mock.results[0]?.value; + expect(histogram.record).toHaveBeenCalledTimes(1); + expect(histogram.record).toHaveBeenCalledWith( + expect.any(Number), + expect.objectContaining({ + 'mcp.method.name': 'tools/list', + 'error.type': 'Error', + }), + ); }); it('should call the action when the tool is invoked', async () => { @@ -107,8 +166,10 @@ describe('McpService', () => { action: mockAction, }); + const mockMetrics = metricsServiceMock.mock(); const mcpService = await McpService.create({ actions: mockActionsRegistry, + metrics: mockMetrics, }); const server = mcpService.getServer({ @@ -154,11 +215,25 @@ describe('McpService', () => { ].join('\n'), }, ]); + + const histogram = mockMetrics.createHistogram.mock.results[0]?.value; + expect(histogram.record).toHaveBeenCalledTimes(1); + expect(histogram.record).toHaveBeenCalledWith( + expect.any(Number), + expect.objectContaining({ + 'mcp.method.name': 'tools/call', + 'gen_ai.tool.name': 'mock-action', + 'gen_ai.operation.name': 'execute_tool', + }), + ); + expect(histogram.record.mock.calls[0][1]).not.toHaveProperty('error.type'); }); it('should return an error when the action is not found', async () => { + const mockMetrics = metricsServiceMock.mock(); const mcpService = await McpService.create({ actions: actionsRegistryServiceMock(), + metrics: mockMetrics, }); const server = mcpService.getServer({ @@ -194,5 +269,78 @@ describe('McpService', () => { ], isError: true, }); + + const histogram = mockMetrics.createHistogram.mock.results[0]?.value; + expect(histogram.record).toHaveBeenCalledTimes(1); + expect(histogram.record).toHaveBeenCalledWith( + expect.any(Number), + expect.objectContaining({ + 'mcp.method.name': 'tools/call', + 'gen_ai.tool.name': 'mock-action', + 'gen_ai.operation.name': 'execute_tool', + 'error.type': 'tool_error', + }), + ); + }); + + it('should record metrics with error.type when tool invocation throws', async () => { + const mockActionsRegistry = actionsRegistryServiceMock(); + const customError = new Error('Action failed'); + customError.name = 'CustomError'; + mockActionsRegistry.register({ + name: 'failing-action', + title: 'Failing', + description: 'Fails', + schema: { + input: z => z.object({}), + output: z => z.object({}), + }, + action: jest.fn().mockRejectedValue(customError), + }); + + const mockMetrics = metricsServiceMock.mock(); + const mcpService = await McpService.create({ + actions: mockActionsRegistry, + metrics: mockMetrics, + }); + + const server = mcpService.getServer({ + credentials: mockCredentials.user(), + }); + + const client = new Client({ + name: 'test client', + version: '1.0', + }); + + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair(); + + await Promise.all([ + client.connect(clientTransport), + server.connect(serverTransport), + ]); + + await expect( + client.request( + { + method: 'tools/call', + params: { name: 'failing-action', arguments: {} }, + }, + CallToolResultSchema, + ), + ).rejects.toThrow('Action failed'); + + const histogram = mockMetrics.createHistogram.mock.results[0]?.value; + expect(histogram.record).toHaveBeenCalledTimes(1); + expect(histogram.record).toHaveBeenCalledWith( + expect.any(Number), + expect.objectContaining({ + 'mcp.method.name': 'tools/call', + 'gen_ai.tool.name': 'failing-action', + 'gen_ai.operation.name': 'execute_tool', + 'error.type': 'CustomError', + }), + ); }); }); diff --git a/plugins/mcp-actions-backend/src/services/McpService.ts b/plugins/mcp-actions-backend/src/services/McpService.ts index c6cdf901d7..b6338a0e1d 100644 --- a/plugins/mcp-actions-backend/src/services/McpService.ts +++ b/plugins/mcp-actions-backend/src/services/McpService.ts @@ -20,21 +20,43 @@ import { CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { JsonObject } from '@backstage/types'; -import { ActionsService } from '@backstage/backend-plugin-api/alpha'; +import { + ActionsService, + MetricsServiceHistogram, + MetricsService, +} from '@backstage/backend-plugin-api/alpha'; import { version } from '@backstage/plugin-mcp-actions-backend/package.json'; import { NotFoundError } from '@backstage/errors'; +import { performance } from 'node:perf_hooks'; import { handleErrors } from './handleErrors'; +import { bucketBoundaries, McpServerOperationAttributes } from '../metrics'; export class McpService { private readonly actions: ActionsService; + private readonly operationDuration: MetricsServiceHistogram; - constructor(actions: ActionsService) { + constructor(actions: ActionsService, metrics: MetricsService) { this.actions = actions; + this.operationDuration = + metrics.createHistogram( + 'mcp.server.operation.duration', + { + description: 'MCP request duration as observed on the receiver', + unit: 's', + advice: { explicitBucketBoundaries: bucketBoundaries }, + }, + ); } - static async create({ actions }: { actions: ActionsService }) { - return new McpService(actions); + static async create({ + actions, + metrics, + }: { + actions: ActionsService; + metrics: MetricsService; + }) { + return new McpService(actions, metrics); } getServer({ credentials }: { credentials: BackstageCredentials }) { @@ -48,57 +70,101 @@ export class McpService { ); server.setRequestHandler(ListToolsRequestSchema, async () => { - // TODO: switch this to be configuration based later - const { actions } = await this.actions.list({ credentials }); + const startTime = performance.now(); + let errorType: string | undefined; - return { - tools: actions.map(action => ({ - inputSchema: action.schema.input, - // todo(blam): this is unfortunately not supported by most clients yet. - // When this is provided you need to provide structuredContent instead. - // outputSchema: action.schema.output, - name: action.name, - description: action.description, - annotations: { - title: action.title, - destructiveHint: action.attributes.destructive, - idempotentHint: action.attributes.idempotent, - readOnlyHint: action.attributes.readOnly, - openWorldHint: false, - }, - })), - }; + try { + // TODO: switch this to be configuration based later + const { actions } = await this.actions.list({ credentials }); + + return { + tools: actions.map(action => ({ + inputSchema: action.schema.input, + // todo(blam): this is unfortunately not supported by most clients yet. + // When this is provided you need to provide structuredContent instead. + // outputSchema: action.schema.output, + name: action.name, + description: action.description, + annotations: { + title: action.title, + destructiveHint: action.attributes.destructive, + idempotentHint: action.attributes.idempotent, + readOnlyHint: action.attributes.readOnly, + openWorldHint: false, + }, + })), + }; + } catch (err) { + errorType = err instanceof Error ? err.name : 'Error'; + throw err; + } finally { + const durationSeconds = (performance.now() - startTime) / 1000; + + this.operationDuration.record(durationSeconds, { + 'mcp.method.name': 'tools/list', + ...(errorType && { 'error.type': errorType }), + }); + } }); server.setRequestHandler(CallToolRequestSchema, async ({ params }) => { - return handleErrors(async () => { - const { actions } = await this.actions.list({ credentials }); - const action = actions.find(a => a.name === params.name); + const startTime = performance.now(); + let errorType: string | undefined; + let isError = false; - if (!action) { - throw new NotFoundError(`Action "${params.name}" not found`); - } + try { + const result = await handleErrors(async () => { + const { actions } = await this.actions.list({ credentials }); + const action = actions.find(a => a.name === params.name); - const { output } = await this.actions.invoke({ - id: action.id, - input: params.arguments as JsonObject, - credentials, + if (!action) { + throw new NotFoundError(`Action "${params.name}" not found`); + } + + const { output } = await this.actions.invoke({ + id: action.id, + input: params.arguments as JsonObject, + credentials, + }); + + return { + // todo(blam): unfortunately structuredContent is not supported by most clients yet. + // so the validation for the output happens in the default actions registry + // and we return it as json text instead for now. + content: [ + { + type: 'text', + text: ['```json', JSON.stringify(output, null, 2), '```'].join( + '\n', + ), + }, + ], + }; }); - return { - // todo(blam): unfortunately structuredContent is not supported by most clients yet. - // so the validation for the output happens in the default actions registry - // and we return it as json text instead for now. - content: [ - { - type: 'text', - text: ['```json', JSON.stringify(output, null, 2), '```'].join( - '\n', - ), - }, - ], - }; - }); + isError = !!(result as { isError?: boolean })?.isError; + return result; + } catch (err) { + errorType = err instanceof Error ? err.name : 'Error'; + throw err; + } finally { + const durationSeconds = (performance.now() - startTime) / 1000; + + // Determine error.type per OTel MCP spec: + // - Thrown exceptions use the error name + // - CallToolResult with isError=true uses 'tool_error' + let errorAttribute: string | undefined = errorType; + if (!errorAttribute && isError) { + errorAttribute = 'tool_error'; + } + + this.operationDuration.record(durationSeconds, { + 'mcp.method.name': 'tools/call', + 'gen_ai.tool.name': params.name, + 'gen_ai.operation.name': 'execute_tool', + ...(errorAttribute && { 'error.type': errorAttribute }), + }); + } }); return server; From 890935951bab4498c8d88ff3115e3fbffbf175b0 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 24 Feb 2026 17:28:32 +0100 Subject: [PATCH 202/455] fix(ui): CSS accessibility fixes for Menu, Select, and RadioGroup (#32983) * fix(ui): add focus-visible outlines to Menu and Select Replace the default browser focus-visible outline with a consistent ring style using the data-focus-visible attribute on Menu items and Select options. Signed-off-by: Johan Persson * fix(ui): add cursor styles to RadioGroup items Add pointer cursor to radio items and not-allowed cursor for readonly state. Signed-off-by: Johan Persson --------- Signed-off-by: Johan Persson --- .changeset/mean-fans-decide.md | 7 +++++++ .changeset/silver-pigs-remain.md | 7 +++++++ packages/ui/src/components/Menu/Menu.module.css | 9 +++++++++ .../ui/src/components/RadioGroup/RadioGroup.module.css | 5 +++++ packages/ui/src/components/Select/Select.module.css | 5 +++++ 5 files changed, 33 insertions(+) create mode 100644 .changeset/mean-fans-decide.md create mode 100644 .changeset/silver-pigs-remain.md diff --git a/.changeset/mean-fans-decide.md b/.changeset/mean-fans-decide.md new file mode 100644 index 0000000000..5fe04beb40 --- /dev/null +++ b/.changeset/mean-fans-decide.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Fixed focus-visible outline styles for Menu and Select components. + +**Affected components:** Menu, Select diff --git a/.changeset/silver-pigs-remain.md b/.changeset/silver-pigs-remain.md new file mode 100644 index 0000000000..d6481f2990 --- /dev/null +++ b/.changeset/silver-pigs-remain.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Added proper cursor styles for RadioGroup items. + +**Affected components:** RadioGroup diff --git a/packages/ui/src/components/Menu/Menu.module.css b/packages/ui/src/components/Menu/Menu.module.css index 4967d26551..6dca183395 100644 --- a/packages/ui/src/components/Menu/Menu.module.css +++ b/packages/ui/src/components/Menu/Menu.module.css @@ -69,6 +69,15 @@ padding-inline: var(--bui-space-1); display: block; + &:focus-visible { + outline: none; + } + + &[data-focus-visible] { + outline: 2px solid var(--bui-ring); + outline-offset: -2px; + } + &[data-focused] .bui-MenuItemWrapper { background: var(--bui-bg-neutral-2); color: var(--bui-fg-primary); diff --git a/packages/ui/src/components/RadioGroup/RadioGroup.module.css b/packages/ui/src/components/RadioGroup/RadioGroup.module.css index 1a2cd221ca..f6b7de0795 100644 --- a/packages/ui/src/components/RadioGroup/RadioGroup.module.css +++ b/packages/ui/src/components/RadioGroup/RadioGroup.module.css @@ -43,6 +43,7 @@ font-size: var(--bui-font-size-2); color: var(--bui-fg-primary); forced-color-adjust: none; + cursor: pointer; &:before { content: ''; @@ -103,5 +104,9 @@ background: var(--bui-bg-disabled); } } + + &[data-readonly] { + cursor: not-allowed; + } } } diff --git a/packages/ui/src/components/Select/Select.module.css b/packages/ui/src/components/Select/Select.module.css index 19118acf3c..3a5d066d1d 100644 --- a/packages/ui/src/components/Select/Select.module.css +++ b/packages/ui/src/components/Select/Select.module.css @@ -143,6 +143,11 @@ gap: var(--bui-space-2); outline: none; + &[data-focus-visible] { + outline: 2px solid var(--bui-ring); + outline-offset: 2px; + } + &[data-focused]::before { content: ''; position: absolute; From 798fea1218651d4a09d513f7745c62d63d47fc1b Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Tue, 24 Feb 2026 18:57:56 +0000 Subject: [PATCH 203/455] feat(ui): add Guidelines section with Cards + Table page layout story - Add `packages/ui/src/guidelines/CardsWithTable.stories.tsx` as the first guideline story, showing three data-driven metric cards in a 3-column grid above a paginated table of catalog services. - Update Storybook `storySort` order so the new `Guidelines` group appears at the top of the `Backstage UI` section. - Wrap story content in a `Box bg="neutral-1"` when the Spotify theme is active, preserving `layout: centered` centering and always applying `borderRadius`. - Import `Box` from the UI package into the Storybook preview. - Remove `transition` from `Container` CSS to avoid animation on resize. - Set `padding-inline: 0` on `.bui-Container` inside the Spotify theme so containers render flush within the themed wrapper. Signed-off-by: Charles de Dreuille Co-authored-by: Cursor --- .storybook/preview.tsx | 40 ++- .storybook/themes/spotify.css | 4 + .../components/Container/Container.module.css | 1 - .../src/guidelines/CardsWithTable.stories.tsx | 279 ++++++++++++++++++ 4 files changed, 320 insertions(+), 4 deletions(-) create mode 100644 packages/ui/src/guidelines/CardsWithTable.stories.tsx diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 6a0177cafe..3d9e197bbc 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -10,6 +10,7 @@ import { apis } from './support/apis'; import { useGlobals } from 'storybook/preview-api'; import { UnifiedThemeProvider, themes } from '@backstage/theme'; import { allModes } from './modes'; +import { Box } from '../packages/ui/src/components/Box'; // Default Backstage theme CSS (from packages/ui) import '../packages/ui/src/css/styles.css'; @@ -70,7 +71,13 @@ export default definePreview({ options: { storySort: { - order: ['Backstage UI', 'Plugins', 'Layout', 'Navigation'], + order: [ + 'Backstage UI', + 'Guidelines', + 'Plugins', + 'Layout', + 'Navigation', + ], }, }, @@ -114,7 +121,7 @@ export default definePreview({ }, decorators: [ - Story => { + (Story, context) => { const [globals] = useGlobals(); const selectedTheme = globals.themeMode === 'light' ? themes.light : themes.dark; @@ -138,7 +145,7 @@ export default definePreview({ (element as HTMLElement).style.backgroundColor = 'var(--bui-bg-app)'; }); - return ( + const content = ( {/* @ts-ignore */} @@ -147,6 +154,33 @@ export default definePreview({ ); + + if (selectedThemeName !== 'spotify') { + return content; + } + + const layout = context.parameters?.layout ?? 'padded'; + const isFullscreen = context.parameters?.layout === 'fullscreen'; + + return ( + + {content} + + ); }, ], diff --git a/.storybook/themes/spotify.css b/.storybook/themes/spotify.css index b72683f53e..89b71c48d3 100644 --- a/.storybook/themes/spotify.css +++ b/.storybook/themes/spotify.css @@ -213,6 +213,10 @@ .bui-Tag { border-radius: var(--bui-radius-full); } + + .bui-Container { + padding-inline: 0; + } } [data-theme-mode='light'][data-theme-name='spotify'] { diff --git a/packages/ui/src/components/Container/Container.module.css b/packages/ui/src/components/Container/Container.module.css index a0dec1e581..ef1d85c66c 100644 --- a/packages/ui/src/components/Container/Container.module.css +++ b/packages/ui/src/components/Container/Container.module.css @@ -21,7 +21,6 @@ max-width: 120rem; padding-inline: var(--bui-space-4); margin-inline: auto; - transition: padding 0.2s ease-in-out; } @media (min-width: 640px) { diff --git a/packages/ui/src/guidelines/CardsWithTable.stories.tsx b/packages/ui/src/guidelines/CardsWithTable.stories.tsx new file mode 100644 index 0000000000..51cc416423 --- /dev/null +++ b/packages/ui/src/guidelines/CardsWithTable.stories.tsx @@ -0,0 +1,279 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable no-restricted-syntax */ + +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { MemoryRouter } from 'react-router-dom'; +import { + Card, + CardHeader, + CardBody, + Container, + Grid, + Flex, + Text, + Table, + CellText, + CellProfile, + useTable, + type ColumnConfig, + PluginHeader, + HeaderPage, + Button, +} from '..'; + +// --------------------------------------------------------------------------- +// Metric card data +// --------------------------------------------------------------------------- + +interface MetricCard { + label: string; + value: string; + trend: string; + trendColor: 'primary' | 'secondary' | 'success' | 'danger' | 'warning'; +} + +const metrics: MetricCard[] = [ + { + label: 'Total Components', + value: '142', + trend: '+12 this week', + trendColor: 'success', + }, + { + label: 'Active Services', + value: '58', + trend: '94% healthy', + trendColor: 'success', + }, + { + label: 'Recent Deployments', + value: '23', + trend: 'in the last 24 h', + trendColor: 'secondary', + }, +]; + +// --------------------------------------------------------------------------- +// Table data +// --------------------------------------------------------------------------- + +interface ServiceItem { + id: string; + name: string; + owner: string; + ownerAvatar: string; + type: 'service' | 'library' | 'website' | 'documentation'; + lifecycle: 'production' | 'experimental'; + description: string; +} + +const services: ServiceItem[] = [ + { + id: '1', + name: 'authentication-service', + owner: 'security-team', + ownerAvatar: 'https://github.com/identicons/security-team.png', + type: 'service', + lifecycle: 'production', + description: 'Handles user authentication, sessions and token refresh.', + }, + { + id: '2', + name: 'api-gateway', + owner: 'platform-team', + ownerAvatar: 'https://github.com/identicons/platform-team.png', + type: 'service', + lifecycle: 'production', + description: 'Routes and validates all inbound API requests.', + }, + { + id: '3', + name: 'frontend-core', + owner: 'design-system', + ownerAvatar: 'https://github.com/identicons/design-system.png', + type: 'library', + lifecycle: 'production', + description: 'Shared UI components and design tokens.', + }, + { + id: '4', + name: 'data-pipeline', + owner: 'data-team', + ownerAvatar: 'https://github.com/identicons/data-team.png', + type: 'service', + lifecycle: 'experimental', + description: 'Streaming data ingestion pipeline for analytics.', + }, + { + id: '5', + name: 'developer-portal', + owner: 'devex-team', + ownerAvatar: 'https://github.com/identicons/devex-team.png', + type: 'website', + lifecycle: 'production', + description: 'Internal developer portal built on Backstage.', + }, + { + id: '6', + name: 'notification-service', + owner: 'platform-team', + ownerAvatar: 'https://github.com/identicons/platform-team.png', + type: 'service', + lifecycle: 'production', + description: 'Sends emails, Slack messages and push notifications.', + }, + { + id: '7', + name: 'search-indexer', + owner: 'search-team', + ownerAvatar: 'https://github.com/identicons/search-team.png', + type: 'service', + lifecycle: 'experimental', + description: 'Indexes catalog entities for full-text search.', + }, + { + id: '8', + name: 'billing-service', + owner: 'payments-team', + ownerAvatar: 'https://github.com/identicons/payments-team.png', + type: 'service', + lifecycle: 'production', + description: 'Manages subscriptions, invoices and payment processing.', + }, +]; + +// --------------------------------------------------------------------------- +// Stat card component +// --------------------------------------------------------------------------- + +const StatCard = ({ label, value, trend, trendColor }: MetricCard) => ( + + {label} + + + + {value} + + + {trend} + + + + +); + +// --------------------------------------------------------------------------- +// Page layout component (the actual story render) +// --------------------------------------------------------------------------- + +const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + defaultWidth: '3fr', + cell: item => ( + + ), + }, + { + id: 'owner', + label: 'Owner', + defaultWidth: '2fr', + cell: item => , + }, + { + id: 'type', + label: 'Type', + defaultWidth: '1fr', + cell: item => , + }, + { + id: 'lifecycle', + label: 'Lifecycle', + defaultWidth: '1fr', + cell: item => ( + + ), + }, +]; + +const CardsWithTableLayout = () => { + const { tableProps } = useTable({ + mode: 'complete', + getData: () => services, + paginationOptions: { pageSize: 5 }, + }); + + return ( + <> + + Custom action} + /> + + + + {metrics.map(metric => ( + + ))} + + + + + + ); +}; + +// --------------------------------------------------------------------------- +// Storybook meta +// --------------------------------------------------------------------------- + +const meta = { + title: 'Guidelines/Cards with Table', + parameters: { + layout: 'fullscreen', + }, + decorators: [ + (Story: () => JSX.Element) => ( + + + + ), + ], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => , +}; From 4c2c350490a4f8d83a9ae004521143bd8ec4ccbe Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Tue, 24 Feb 2026 19:05:25 +0000 Subject: [PATCH 204/455] Create chatty-wasps-sink.md Signed-off-by: Charles de Dreuille --- .changeset/chatty-wasps-sink.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/chatty-wasps-sink.md diff --git a/.changeset/chatty-wasps-sink.md b/.changeset/chatty-wasps-sink.md new file mode 100644 index 0000000000..4b9d5d3525 --- /dev/null +++ b/.changeset/chatty-wasps-sink.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Removed the `transition` on `Container` padding to prevent an unwanted animation when the viewport is resized. From b5fae7405566e61b2699bbc1370b9d7e7afb3f2e Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Tue, 24 Feb 2026 19:07:59 +0000 Subject: [PATCH 205/455] Update preview.tsx Signed-off-by: Charles de Dreuille --- .storybook/preview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 3d9e197bbc..9ba9057142 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -168,7 +168,7 @@ export default definePreview({ style={{ minHeight: 'calc(100vh - 32px)', width: 'calc(100vw - 32px)', - borderRadius: '8px', + borderRadius: 'var(--bui-radius-3)', ...(layout === 'centered' && { display: 'flex', alignItems: 'center', From 4bd6a3a1afd007b1d87359de5ea74dce7288021f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 24 Feb 2026 19:24:06 +0000 Subject: [PATCH 206/455] Version Packages (next) --- .changeset/pre.json | 40 +- docs/releases/v1.49.0-next.0-changelog.md | 2362 +++++++++++++++++ package.json | 2 +- packages/app-defaults/CHANGELOG.md | 11 + packages/app-defaults/package.json | 2 +- packages/app-example-plugin/CHANGELOG.md | 8 + packages/app-example-plugin/package.json | 2 +- packages/app-legacy/CHANGELOG.md | 44 + packages/app-legacy/package.json | 2 +- packages/app/CHANGELOG.md | 50 + packages/app/package.json | 2 +- packages/backend-app-api/CHANGELOG.md | 9 + packages/backend-app-api/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 25 + packages/backend-defaults/package.json | 2 +- .../CHANGELOG.md | 26 + .../package.json | 2 +- packages/backend-openapi-utils/CHANGELOG.md | 9 + packages/backend-openapi-utils/package.json | 2 +- packages/backend-plugin-api/CHANGELOG.md | 14 + packages/backend-plugin-api/package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 16 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 42 + packages/backend/package.json | 2 +- packages/catalog-client/CHANGELOG.md | 10 + packages/catalog-client/package.json | 2 +- packages/cli-common/CHANGELOG.md | 34 + packages/cli-common/package.json | 2 +- packages/cli-node/CHANGELOG.md | 11 + packages/cli-node/package.json | 2 +- packages/cli/CHANGELOG.md | 29 + packages/cli/package.json | 2 +- packages/codemods/CHANGELOG.md | 9 + packages/codemods/package.json | 2 +- packages/config-loader/CHANGELOG.md | 11 + packages/config-loader/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 10 + packages/core-app-api/package.json | 2 +- packages/core-compat-api/CHANGELOG.md | 12 + packages/core-compat-api/package.json | 2 +- packages/core-components/CHANGELOG.md | 11 + packages/core-components/package.json | 2 +- packages/core-plugin-api/CHANGELOG.md | 11 + packages/core-plugin-api/package.json | 2 +- packages/create-app/CHANGELOG.md | 9 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 15 + packages/dev-utils/package.json | 2 +- packages/e2e-test/CHANGELOG.md | 9 + packages/e2e-test/package.json | 2 +- packages/eslint-plugin/CHANGELOG.md | 6 + packages/eslint-plugin/package.json | 2 +- packages/frontend-app-api/CHANGELOG.md | 14 + packages/frontend-app-api/package.json | 2 +- packages/frontend-defaults/CHANGELOG.md | 12 + packages/frontend-defaults/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- packages/frontend-internal/CHANGELOG.md | 9 + packages/frontend-internal/package.json | 2 +- packages/frontend-plugin-api/CHANGELOG.md | 10 + packages/frontend-plugin-api/package.json | 2 +- packages/frontend-test-utils/CHANGELOG.md | 19 + packages/frontend-test-utils/package.json | 2 +- packages/integration-react/CHANGELOG.md | 9 + packages/integration-react/package.json | 2 +- packages/integration/CHANGELOG.md | 12 + packages/integration/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 17 + packages/repo-tools/package.json | 2 +- packages/scaffolder-internal/CHANGELOG.md | 8 + packages/scaffolder-internal/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 21 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 13 + packages/techdocs-cli/package.json | 2 +- packages/test-utils/CHANGELOG.md | 13 + packages/test-utils/package.json | 2 +- packages/ui/CHANGELOG.md | 17 + packages/ui/package.json | 2 +- packages/yarn-plugin/CHANGELOG.md | 9 + packages/yarn-plugin/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 15 + plugins/api-docs/package.json | 2 +- plugins/app-backend/CHANGELOG.md | 13 + plugins/app-backend/package.json | 2 +- plugins/app-node/CHANGELOG.md | 8 + plugins/app-node/package.json | 2 +- plugins/app-react/CHANGELOG.md | 8 + plugins/app-react/package.json | 2 +- plugins/app-visualizer/CHANGELOG.md | 10 + plugins/app-visualizer/package.json | 2 +- plugins/app/CHANGELOG.md | 17 + plugins/app/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 15 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 12 + plugins/auth-node/package.json | 2 +- plugins/auth-react/CHANGELOG.md | 9 + plugins/auth-react/package.json | 2 +- plugins/auth/CHANGELOG.md | 10 + plugins/auth/package.json | 2 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 7 + plugins/bitbucket-cloud-common/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 16 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 11 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../catalog-backend-module-gcp/CHANGELOG.md | 11 + .../catalog-backend-module-gcp/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../catalog-backend-module-gitea/CHANGELOG.md | 12 + .../catalog-backend-module-gitea/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../catalog-backend-module-ldap/CHANGELOG.md | 13 + .../catalog-backend-module-ldap/package.json | 2 +- .../catalog-backend-module-logs/CHANGELOG.md | 9 + .../catalog-backend-module-logs/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 30 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 13 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 18 + plugins/catalog-import/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 21 + plugins/catalog-node/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 22 + plugins/catalog-react/package.json | 2 +- .../catalog-unprocessed-entities/CHANGELOG.md | 13 + .../catalog-unprocessed-entities/package.json | 2 +- plugins/catalog/CHANGELOG.md | 25 + plugins/catalog/package.json | 2 +- plugins/config-schema/CHANGELOG.md | 10 + plugins/config-schema/package.json | 2 +- plugins/devtools-backend/CHANGELOG.md | 15 + plugins/devtools-backend/package.json | 2 +- plugins/devtools-react/CHANGELOG.md | 8 + plugins/devtools-react/package.json | 2 +- plugins/devtools/CHANGELOG.md | 14 + plugins/devtools/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../events-backend-module-azure/CHANGELOG.md | 8 + .../events-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../events-backend-module-gerrit/CHANGELOG.md | 8 + .../events-backend-module-gerrit/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 11 + .../events-backend-module-github/package.json | 2 +- .../events-backend-module-gitlab/CHANGELOG.md | 9 + .../events-backend-module-gitlab/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../events-backend-module-kafka/CHANGELOG.md | 10 + .../events-backend-module-kafka/package.json | 2 +- .../events-backend-test-utils/CHANGELOG.md | 7 + .../events-backend-test-utils/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 12 + plugins/events-backend/package.json | 2 +- plugins/events-node/CHANGELOG.md | 9 + plugins/events-node/package.json | 2 +- .../example-todo-list-backend/CHANGELOG.md | 8 + .../example-todo-list-backend/package.json | 2 +- plugins/example-todo-list/CHANGELOG.md | 8 + plugins/example-todo-list/package.json | 2 +- plugins/gateway-backend/CHANGELOG.md | 7 + plugins/gateway-backend/package.json | 2 +- plugins/home-react/CHANGELOG.md | 10 + plugins/home-react/package.json | 2 +- plugins/home/CHANGELOG.md | 17 + plugins/home/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 18 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-cluster/CHANGELOG.md | 13 + plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes-node/CHANGELOG.md | 10 + plugins/kubernetes-node/package.json | 2 +- plugins/kubernetes-react/CHANGELOG.md | 12 + plugins/kubernetes-react/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 14 + plugins/kubernetes/package.json | 2 +- plugins/mcp-actions-backend/CHANGELOG.md | 16 + plugins/mcp-actions-backend/package.json | 2 +- plugins/mui-to-bui/CHANGELOG.md | 10 + plugins/mui-to-bui/package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- .../CHANGELOG.md | 18 + .../package.json | 2 +- plugins/notifications-backend/CHANGELOG.md | 15 + plugins/notifications-backend/package.json | 2 +- plugins/notifications-node/CHANGELOG.md | 11 + plugins/notifications-node/package.json | 2 +- plugins/notifications/CHANGELOG.md | 13 + plugins/notifications/package.json | 2 +- plugins/org-react/CHANGELOG.md | 11 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 12 + plugins/org/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/permission-backend/CHANGELOG.md | 12 + plugins/permission-backend/package.json | 2 +- plugins/permission-node/CHANGELOG.md | 11 + plugins/permission-node/package.json | 2 +- plugins/permission-react/CHANGELOG.md | 9 + plugins/permission-react/package.json | 2 +- plugins/proxy-backend/CHANGELOG.md | 9 + plugins/proxy-backend/package.json | 2 +- plugins/proxy-node/CHANGELOG.md | 7 + plugins/proxy-node/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 20 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-common/CHANGELOG.md | 11 + plugins/scaffolder-common/package.json | 2 +- .../scaffolder-node-test-utils/CHANGELOG.md | 10 + .../scaffolder-node-test-utils/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 13 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 17 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 24 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/search-backend-module-pg/CHANGELOG.md | 10 + plugins/search-backend-module-pg/package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- plugins/search-backend-node/CHANGELOG.md | 11 + plugins/search-backend-node/package.json | 2 +- plugins/search-backend/CHANGELOG.md | 15 + plugins/search-backend/package.json | 2 +- plugins/search-react/CHANGELOG.md | 14 + plugins/search-react/package.json | 2 +- plugins/search/CHANGELOG.md | 16 + plugins/search/package.json | 2 +- plugins/signals-backend/CHANGELOG.md | 11 + plugins/signals-backend/package.json | 2 +- plugins/signals-node/CHANGELOG.md | 11 + plugins/signals-node/package.json | 2 +- plugins/signals-react/CHANGELOG.md | 8 + plugins/signals-react/package.json | 2 +- plugins/signals/CHANGELOG.md | 12 + plugins/signals/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 15 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 15 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 14 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs-react/CHANGELOG.md | 13 + plugins/techdocs-react/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 22 + plugins/techdocs/package.json | 2 +- plugins/user-settings-backend/CHANGELOG.md | 12 + plugins/user-settings-backend/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 17 + plugins/user-settings/package.json | 2 +- 369 files changed, 4936 insertions(+), 185 deletions(-) create mode 100644 docs/releases/v1.49.0-next.0-changelog.md diff --git a/.changeset/pre.json b/.changeset/pre.json index 00dbb0f757..7113b1ee96 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -210,5 +210,43 @@ "@backstage/plugin-user-settings-backend": "0.4.0", "@backstage/plugin-user-settings-common": "0.1.0" }, - "changesets": [] + "changesets": [ + "add-masked-and-hidden-option", + "blue-moons-crash", + "bright-moons-open", + "brown-towns-find", + "bump-bfj-v9", + "cli-common-cached-paths", + "cli-internal-refactor", + "cli-node-parallel-helpers", + "cli-translations-export-import", + "dependabot-d2ec7e9", + "fancy-ends-turn", + "fix-frontend-feature-compat", + "fix-prettier-existence-check", + "fluffy-owls-act", + "long-hairs-throw", + "mean-fans-decide", + "metal-humans-move", + "migrate-to-target-paths", + "ninety-corners-flash", + "orange-mugs-post-1", + "orange-mugs-post-2", + "pink-terms-know", + "polite-singers-lead", + "pretty-days-taste", + "rare-adults-attack", + "renovate-8b1c21e", + "rude-groups-shout", + "scaffolder-export-form-fields-api", + "silver-pigs-remain", + "sixty-pianos-begin", + "stable-translation-plugin-app", + "stable-translation-test-utils", + "stupid-pans-hope", + "swift-flowers-grin", + "swift-ravens-jog", + "tired-bushes-write", + "twenty-worlds-create" + ] } diff --git a/docs/releases/v1.49.0-next.0-changelog.md b/docs/releases/v1.49.0-next.0-changelog.md new file mode 100644 index 0000000000..fcfc092d5e --- /dev/null +++ b/docs/releases/v1.49.0-next.0-changelog.md @@ -0,0 +1,2362 @@ +# Release v1.49.0-next.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.49.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.49.0-next.0) + +## @backstage/cli-common@0.2.0-next.0 + +### Minor Changes + +- 56bd494: Added `targetPaths` and `findOwnPaths` as replacements for `findPaths`, with a cleaner separation between target project paths and package-relative paths. + + To migrate existing `findPaths` usage: + + ```ts + // Before + import { findPaths } from '@backstage/cli-common'; + const paths = findPaths(__dirname); + + // After — for target project paths (cwd-based): + import { targetPaths } from '@backstage/cli-common'; + // paths.targetDir → targetPaths.dir + // paths.targetRoot → targetPaths.rootDir + // paths.resolveTarget('src') → targetPaths.resolve('src') + // paths.resolveTargetRoot('yarn.lock') → targetPaths.resolveRoot('yarn.lock') + + // After — for package-relative paths: + import { findOwnPaths } from '@backstage/cli-common'; + const own = findOwnPaths(__dirname); + // paths.ownDir → own.dir + // paths.ownRoot → own.rootDir + // paths.resolveOwn('config/jest.js') → own.resolve('config/jest.js') + // paths.resolveOwnRoot('tsconfig.json') → own.resolveRoot('tsconfig.json') + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.7 + +## @backstage/integration@1.21.0-next.0 + +### Minor Changes + +- d933f62: Add configurable throttling and retry mechanism for GitLab integration. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-catalog-backend@3.5.0-next.0 + +### Minor Changes + +- bf71677: Added opentelemetry metrics for SCM events: + + - `catalog.events.scm.messages` with attribute `eventType`: Counter for the number of SCM events actually received by the catalog backend. The `eventType` is currently either `location` or `repository`. + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- fbf382f: Minor internal optimisation +- 1ee5b28: Migrates existing catalog metrics to use the alpha MetricsService. This release is a 1:1 migration with no breaking changes. +- 3181973: Changed the `search` table foreign key to point to `final_entities` instead of `refresh_state` +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-catalog-node@2.1.0-next.0 + +### Minor Changes + +- bf71677: Added the ability for SCM events subscribers to mark the fact that they have taken actions based on events, which produces output metrics: + + - `catalog.events.scm.actions` with attribute `action`: Counter for the number of actions actually taken by catalog internals or other subscribers, based on SCM events. The `action` is currently either `create`, `delete`, `refresh`, or `move`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/backend-test-utils@1.11.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-notifications-backend-module-slack@0.4.0-next.0 + +### Minor Changes + +- 749ba60: Add an extension for custom Slack message layouts + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-notifications-node@0.2.24-next.0 + +## @backstage/app-defaults@1.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/backend-app-api@1.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/backend-defaults@0.15.3-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- d933f62: Add configurable throttling and retry mechanism for GitLab integration. +- b99158a: Fixed `yarn backstage-cli config:check --strict --config app-config.yaml` config validation error by adding + an optional `default` type discriminator to PostgreSQL connection configuration, + allowing `config:check` to properly validate `default` connection configurations. +- 1ee5b28: Adds an alpha `MetricsService` to provide a unified interface for metrics instrumentation across Backstage plugins. +- Updated dependencies + - @backstage/cli-node@0.2.19-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-app-api@1.5.1-next.0 + - @backstage/backend-dev-utils@0.1.7 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/backend-dynamic-feature-service@0.7.10-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/cli-node@0.2.19-next.0 + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/plugin-catalog-backend@3.5.0-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.43-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-events-backend@0.5.12-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/backend-openapi-utils@0.6.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/backend-plugin-api@1.7.1-next.0 + +### Patch Changes + +- 1ee5b28: Adds an alpha `MetricsService` to provide a unified interface for metrics instrumentation across Backstage plugins. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/backend-test-utils@1.11.1-next.0 + +### Patch Changes + +- 1ee5b28: Adds a new metrics service mock to be leveraged in tests +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-app-api@1.5.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/catalog-client@1.13.1-next.0 + +### Patch Changes + +- d2494d6: Minor update to catalog client docs +- Updated dependencies + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + +## @backstage/cli@0.35.5-next.0 + +### Patch Changes + +- 246877a: Updated dependency `bfj` to `^9.0.2`. + +- bba2e49: Internal refactor to use new concurrency utilities from `@backstage/cli-node`. + +- fd50cb3: Added `translations export` and `translations import` commands for managing translation files. + + The `translations export` command discovers all `TranslationRef` definitions across frontend plugin dependencies and exports their default messages as JSON files. The `translations import` command generates `TranslationResource` wiring code from translated JSON files, ready to be plugged into the app. + + Both commands support a `--pattern` option for controlling the message file layout, for example `--pattern '{lang}/{id}.json'` for language-based directory grouping. + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. + +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. + +- 092b41f: Updated dependency `webpack` to `~5.105.0`. + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/cli-node@0.2.19-next.0 + - @backstage/eslint-plugin@0.2.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/module-federation-common@0.1.0 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + +## @backstage/cli-node@0.2.19-next.0 + +### Patch Changes + +- 06c2015: Added `runConcurrentTasks` and `runWorkerQueueThreads` utilities, moved from the `@backstage/cli` internal code. +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/codemods@0.1.55-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + +## @backstage/config-loader@1.10.9-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/core-app-api@1.19.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/core-compat-api@0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + +## @backstage/core-components@0.18.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/core-plugin-api@1.12.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/create-app@0.7.10-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + +## @backstage/dev-utils@1.1.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + +## @backstage/eslint-plugin@0.2.2-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 + +## @backstage/frontend-app-api@0.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/frontend-defaults@0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-app@0.4.1-next.0 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-app-api@0.15.1-next.0 + +## @backstage/frontend-dynamic-feature-loader@0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/config@1.3.6 + - @backstage/module-federation-common@0.1.0 + +## @backstage/frontend-plugin-api@0.14.2-next.0 + +### Patch Changes + +- 9c81af9: Made the `pluginId` property optional in the `FrontendFeature` type, allowing plugins published against older versions of the framework to be used without type errors. +- Updated dependencies + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @backstage/frontend-test-utils@0.5.1-next.0 + +### Patch Changes + +- 909c742: Switched `MockTranslationApi` and related test utility imports from `@backstage/core-plugin-api/alpha` to the stable `@backstage/frontend-plugin-api` export. The `TranslationApi` type in the API report is now sourced from a single package. This has no effect on runtime behavior. +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-app@0.4.1-next.0 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/integration-react@1.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @backstage/repo-tools@0.16.6-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- 2a51546: Fixed prettier existence checks in OpenAPI commands to use `fs.pathExists` instead of checking the resolved path string, which was always truthy. +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- 18a946c: Updated `@microsoft/api-extractor` to `7.57.3` and added tests for `getTsDocConfig` +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/cli-node@0.2.19-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## @techdocs/cli@1.10.6-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-techdocs-node@1.14.3-next.0 + +## @backstage/test-utils@1.7.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/ui@0.12.1-next.0 + +### Patch Changes + +- a1f4bee: Made Accordion a `bg` provider so nested components like Button auto-increment their background level. Updated `useDefinition` to resolve `bg` `propDef` defaults for provider components. + +- 8909359: Fixed focus-visible outline styles for Menu and Select components. + + **Affected components:** Menu, Select + +- 0f462f8: Improved type safety in `useDefinition` by centralizing prop resolution and strengthening the `BgPropsConstraint` to require that `bg` provider components declare `children` as a required prop in their OwnProps type. + +- 8909359: Added proper cursor styles for RadioGroup items. + + **Affected components:** RadioGroup + +- Updated dependencies + - @backstage/version-bridge@1.0.12 + +## @backstage/plugin-api-docs@0.13.5-next.0 + +### Patch Changes + +- 9c9d425: Fixed invisible text in parameter input fields when using dark mode in OpenAPI definition pages +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-app@0.4.1-next.0 + +### Patch Changes + +- 909c742: Switched translation API imports (`translationApiRef`, `appLanguageApiRef`) from the alpha `@backstage/core-plugin-api/alpha` path to the stable `@backstage/frontend-plugin-api` export. This has no effect on runtime behavior. +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-app-backend@0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.43-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-app-node@0.1.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + +## @backstage/plugin-app-react@0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @backstage/plugin-app-visualizer@0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @backstage/plugin-auth@0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.2 + +## @backstage/plugin-auth-backend@0.27.1-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- 619be54: Update migrations to be reversible +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.27.1-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-github-provider@0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-google-provider@0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.27.1-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-okta-provider@0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-openshift-provider@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.3.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-auth-node@0.6.14-next.0 + +## @backstage/plugin-auth-node@0.6.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-react@0.1.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + +## @backstage/plugin-bitbucket-cloud-common@0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + +## @backstage/plugin-catalog@1.33.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.4.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-kubernetes-common@0.9.10 + +## @backstage/plugin-catalog-backend-module-azure@0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-bitbucket-cloud-common@0.3.8-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-kubernetes-common@0.9.10 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-github@0.12.3-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.12.3-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.8.1-next.0 + +### Patch Changes + +- d933f62: Add configurable throttling and retry mechanism for GitLab integration. +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.8.1-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/plugin-catalog-backend@3.5.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/plugin-catalog-backend-module-ldap@0.12.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-logs@0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.5.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.6.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/plugin-catalog-graph@0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-import@0.13.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-catalog-react@2.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/frontend-test-utils@0.5.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13 + - @backstage/plugin-devtools-react@0.1.2-next.0 + +## @backstage/plugin-config-schema@0.1.78-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-devtools@0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-devtools-common@0.1.22 + - @backstage/plugin-devtools-react@0.1.2-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-devtools-backend@0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.22 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-devtools-react@0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @backstage/plugin-events-backend@0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-azure@0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-server@0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-gerrit@0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-github@0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-gitlab@0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-google-pubsub@0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-module-kafka@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-backend-test-utils@0.1.53-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-events-node@0.4.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-gateway-backend@1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + +## @backstage/plugin-home@0.9.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-home-react@0.1.36-next.0 + +## @backstage/plugin-home-react@0.1.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @backstage/plugin-kubernetes@0.12.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-react@0.5.17-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-kubernetes-backend@0.21.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-node@0.4.2-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-react@0.5.17-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-kubernetes-node@0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10 + +## @backstage/plugin-kubernetes-react@0.5.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10 + +## @backstage/plugin-mcp-actions-backend@0.1.10-next.0 + +### Patch Changes + +- dc81af1: Adds two new metrics to track MCP server operations and sessions. + + - `mcp.server.operation.duration`: The duration taken to process an individual MCP operation + - `mcp.server.session.duration`: The duration of the MCP session from the perspective of the server + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-mui-to-bui@0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + +## @backstage/plugin-notifications@0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.2 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-signals-react@0.0.20-next.0 + +## @backstage/plugin-notifications-backend@0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-notifications-node@0.2.24-next.0 + - @backstage/plugin-signals-node@0.1.29-next.0 + +## @backstage/plugin-notifications-backend-module-email@0.3.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-notifications-node@0.2.24-next.0 + +## @backstage/plugin-notifications-node@0.2.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-signals-node@0.1.29-next.0 + +## @backstage/plugin-org@0.6.50-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-org-react@0.1.48-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @backstage/plugin-permission-backend@0.7.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-permission-node@0.10.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/plugin-permission-react@0.4.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/plugin-proxy-backend@0.6.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-proxy-node@0.1.13-next.0 + +## @backstage/plugin-proxy-node@0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + +## @backstage/plugin-scaffolder@1.35.5-next.0 + +### Patch Changes + +- bd5b842: Added a new `ui:autoSelect` option to the EntityPicker field that controls whether an entity is automatically selected when the field loses focus. When set to `false`, the field will remain empty if the user closes it without explicitly selecting an entity, preventing unintentional selections. Defaults to `true` for backward compatibility. +- ee87720: Added back the `formFieldsApiRef` and `ScaffolderFormFieldsApi` alpha exports that were unintentionally removed. +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + - @backstage/plugin-scaffolder-react@1.19.8-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-scaffolder-backend@3.1.4-next.0 + +### Patch Changes + +- 4e39e63: Removed unused dependencies +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.4-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.19-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-bitbucket-cloud-common@0.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.4-next.0 + +### Patch Changes + +- 5730c8e: Added `maskedAndHidden` option to `gitlab:projectVariable:create` and `publish:gitlab` action to support creating GitLab project variables that are both masked and hidden. Updated gitbeaker to version 43.8.0 for proper type support. +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-notifications-node@0.2.24-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + - @backstage/plugin-scaffolder-node-test-utils@0.3.9-next.0 + +## @backstage/plugin-scaffolder-common@1.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/plugin-scaffolder-node@0.12.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-test-utils@1.11.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + +## @backstage/plugin-scaffolder-react@1.19.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + +## @backstage/plugin-search@1.6.2-next.0 + +### Patch Changes + +- d5eb954: Fixes the search component not registering the first search on navigate to the search page. +- Updated dependencies + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-backend@2.0.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-backend-module-catalog@0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-backend-module-elasticsearch@1.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-backend-module-explore@0.3.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-backend-module-pg@0.5.53-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-backend-module-techdocs@0.4.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-node@1.14.3-next.0 + +## @backstage/plugin-search-backend-node@1.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-react@1.10.5-next.0 + +### Patch Changes + +- d5eb954: Fixes the search component not registering the first search on navigate to the search page. +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-signals@0.0.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.20-next.0 + +## @backstage/plugin-signals-backend@0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-signals-node@0.1.29-next.0 + +## @backstage/plugin-signals-node@0.1.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-signals-react@0.0.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-techdocs@1.17.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/plugin-techdocs@1.17.1-next.0 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-techdocs-backend@2.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-techdocs-node@1.14.3-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-techdocs-node@1.14.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-techdocs-react@1.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-user-settings@0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.20-next.0 + - @backstage/plugin-user-settings-common@0.1.0 + +## @backstage/plugin-user-settings-backend@0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-signals-node@0.1.29-next.0 + - @backstage/plugin-user-settings-common@0.1.0 + +## example-app@0.0.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-search@1.6.2-next.0 + - @backstage/plugin-api-docs@0.13.5-next.0 + - @backstage/cli@0.35.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-scaffolder@1.35.5-next.0 + - @backstage/plugin-app@0.4.1-next.0 + - @backstage/plugin-app-visualizer@0.2.1-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/plugin-techdocs@1.17.1-next.0 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-auth@0.1.6-next.0 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-catalog-graph@0.5.8-next.0 + - @backstage/plugin-catalog-import@0.13.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + - @backstage/plugin-devtools@0.1.37-next.0 + - @backstage/plugin-home@0.9.3-next.0 + - @backstage/plugin-home-react@0.1.36-next.0 + - @backstage/plugin-kubernetes@0.12.17-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.35-next.0 + - @backstage/plugin-notifications@0.5.15-next.0 + - @backstage/plugin-org@0.6.50-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-react@1.19.8-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-signals@0.0.29-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + - @backstage/plugin-user-settings@0.9.1-next.0 + +## app-example-plugin@0.0.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + +## example-app-legacy@0.2.119-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-search@1.6.2-next.0 + - @backstage/plugin-api-docs@0.13.5-next.0 + - @backstage/cli@0.35.5-next.0 + - @backstage/plugin-scaffolder@1.35.5-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/plugin-mui-to-bui@0.2.5-next.0 + - @backstage/plugin-techdocs@1.17.1-next.0 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-catalog-graph@0.5.8-next.0 + - @backstage/plugin-catalog-import@0.13.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + - @backstage/plugin-devtools@0.1.37-next.0 + - @backstage/plugin-home@0.9.3-next.0 + - @backstage/plugin-home-react@0.1.36-next.0 + - @backstage/plugin-kubernetes@0.12.17-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.35-next.0 + - @backstage/plugin-notifications@0.5.15-next.0 + - @backstage/plugin-org@0.6.50-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-react@1.19.8-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-signals@0.0.29-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + - @backstage/plugin-user-settings@0.9.1-next.0 + +## example-backend@0.0.48-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/plugin-auth-backend@0.27.1-next.0 + - @backstage/plugin-catalog-backend@3.5.0-next.0 + - @backstage/plugin-scaffolder-backend@3.1.4-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.10-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-app-backend@0.5.12-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.5.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.17-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.5-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.12-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.20-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.18-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.9-next.0 + - @backstage/plugin-devtools-backend@0.5.15-next.0 + - @backstage/plugin-events-backend@0.5.12-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.2.1-next.0 + - @backstage/plugin-kubernetes-backend@0.21.2-next.0 + - @backstage/plugin-notifications-backend@0.6.3-next.0 + - @backstage/plugin-permission-backend@0.7.10-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.17-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-proxy-backend@0.6.11-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.7-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.20-next.0 + - @backstage/plugin-search-backend@2.0.13-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.13-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.12-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.12-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-signals-backend@0.3.13-next.0 + - @backstage/plugin-techdocs-backend@2.1.6-next.0 + +## e2e-test@0.2.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/create-app@0.7.10-next.0 + - @backstage/errors@1.2.7 + +## @internal/frontend@0.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + +## @internal/scaffolder@0.0.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-scaffolder-react@1.19.8-next.0 + +## techdocs-cli-embedded-app@0.2.118-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/cli@0.35.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-techdocs@1.17.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## yarn-plugin-backstage@0.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/release-manifests@0.0.13 + +## @internal/plugin-todo-list@1.0.49-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @internal/plugin-todo-list-backend@1.0.48-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 diff --git a/package.json b/package.json index a0a530adb8..a6a5ca8084 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.48.0", + "version": "1.49.0-next.0", "backstage": { "cli": { "new": { diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index a5516a33a9..e7bfdf0c89 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/app-defaults +## 1.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 1.7.5 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 71b5da64d7..b35830dbd1 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.7.5", + "version": "1.7.6-next.0", "description": "Provides the default wiring of a Backstage App", "backstage": { "role": "web-library" diff --git a/packages/app-example-plugin/CHANGELOG.md b/packages/app-example-plugin/CHANGELOG.md index a23772bb3b..f0784d88d2 100644 --- a/packages/app-example-plugin/CHANGELOG.md +++ b/packages/app-example-plugin/CHANGELOG.md @@ -1,5 +1,13 @@ # app-example-plugin +## 0.0.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + ## 0.0.32 ### Patch Changes diff --git a/packages/app-example-plugin/package.json b/packages/app-example-plugin/package.json index 2bdfd931fd..93f2954355 100644 --- a/packages/app-example-plugin/package.json +++ b/packages/app-example-plugin/package.json @@ -1,6 +1,6 @@ { "name": "app-example-plugin", - "version": "0.0.32", + "version": "0.0.33-next.0", "description": "Backstage internal example plugin", "backstage": { "role": "frontend-plugin", diff --git a/packages/app-legacy/CHANGELOG.md b/packages/app-legacy/CHANGELOG.md index 2212011ecd..c0e84cb9d7 100644 --- a/packages/app-legacy/CHANGELOG.md +++ b/packages/app-legacy/CHANGELOG.md @@ -1,5 +1,49 @@ # example-app-legacy +## 0.2.119-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-search@1.6.2-next.0 + - @backstage/plugin-api-docs@0.13.5-next.0 + - @backstage/cli@0.35.5-next.0 + - @backstage/plugin-scaffolder@1.35.5-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/plugin-mui-to-bui@0.2.5-next.0 + - @backstage/plugin-techdocs@1.17.1-next.0 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-catalog-graph@0.5.8-next.0 + - @backstage/plugin-catalog-import@0.13.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + - @backstage/plugin-devtools@0.1.37-next.0 + - @backstage/plugin-home@0.9.3-next.0 + - @backstage/plugin-home-react@0.1.36-next.0 + - @backstage/plugin-kubernetes@0.12.17-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.35-next.0 + - @backstage/plugin-notifications@0.5.15-next.0 + - @backstage/plugin-org@0.6.50-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-react@1.19.8-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-signals@0.0.29-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + - @backstage/plugin-user-settings@0.9.1-next.0 + ## 0.2.118 ### Patch Changes diff --git a/packages/app-legacy/package.json b/packages/app-legacy/package.json index 6be63b7a14..4bdf649665 100644 --- a/packages/app-legacy/package.json +++ b/packages/app-legacy/package.json @@ -1,6 +1,6 @@ { "name": "example-app-legacy", - "version": "0.2.118", + "version": "0.2.119-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index daa9908400..37e2dcfdb5 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,55 @@ # example-app +## 0.0.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-search@1.6.2-next.0 + - @backstage/plugin-api-docs@0.13.5-next.0 + - @backstage/cli@0.35.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-scaffolder@1.35.5-next.0 + - @backstage/plugin-app@0.4.1-next.0 + - @backstage/plugin-app-visualizer@0.2.1-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/plugin-techdocs@1.17.1-next.0 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-auth@0.1.6-next.0 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-catalog-graph@0.5.8-next.0 + - @backstage/plugin-catalog-import@0.13.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + - @backstage/plugin-devtools@0.1.37-next.0 + - @backstage/plugin-home@0.9.3-next.0 + - @backstage/plugin-home-react@0.1.36-next.0 + - @backstage/plugin-kubernetes@0.12.17-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.35-next.0 + - @backstage/plugin-notifications@0.5.15-next.0 + - @backstage/plugin-org@0.6.50-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-react@1.19.8-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-signals@0.0.29-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + - @backstage/plugin-user-settings@0.9.1-next.0 + ## 0.0.32 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index b0d46befa8..7283f3064f 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.0.32", + "version": "0.0.33-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/backend-app-api/CHANGELOG.md b/packages/backend-app-api/CHANGELOG.md index f1d26a7f4a..b07cb0869d 100644 --- a/packages/backend-app-api/CHANGELOG.md +++ b/packages/backend-app-api/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-app-api +## 1.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 1.5.0 ### Minor Changes diff --git a/packages/backend-app-api/package.json b/packages/backend-app-api/package.json index 97e5964e39..08b12d7d6d 100644 --- a/packages/backend-app-api/package.json +++ b/packages/backend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-app-api", - "version": "1.5.0", + "version": "1.5.1-next.0", "description": "Core API used by Backstage backend apps", "backstage": { "role": "node-library" diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index da970f1f45..9ca1fae948 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/backend-defaults +## 0.15.3-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- d933f62: Add configurable throttling and retry mechanism for GitLab integration. +- b99158a: Fixed `yarn backstage-cli config:check --strict --config app-config.yaml` config validation error by adding + an optional `default` type discriminator to PostgreSQL connection configuration, + allowing `config:check` to properly validate `default` connection configurations. +- 1ee5b28: Adds an alpha `MetricsService` to provide a unified interface for metrics instrumentation across Backstage plugins. +- Updated dependencies + - @backstage/cli-node@0.2.19-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-app-api@1.5.1-next.0 + - @backstage/backend-dev-utils@0.1.7 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 0.15.2 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 6f705de7ba..1a7e6f7e41 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.15.2", + "version": "0.15.3-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 a9be5cd0ba..24c8b882db 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/backend-dynamic-feature-service +## 0.7.10-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/cli-node@0.2.19-next.0 + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/plugin-catalog-backend@3.5.0-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.43-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-events-backend@0.5.12-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 0.7.9 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index c197ad041c..2ba6bbc68f 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.7.9", + "version": "0.7.10-next.0", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md index 58436b3235..ce142b728e 100644 --- a/packages/backend-openapi-utils/CHANGELOG.md +++ b/packages/backend-openapi-utils/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/backend-openapi-utils +## 0.6.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.6.6 ### Patch Changes diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json index 5c6a9c5773..1f5bc417a8 100644 --- a/packages/backend-openapi-utils/package.json +++ b/packages/backend-openapi-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-openapi-utils", - "version": "0.6.6", + "version": "0.6.7-next.0", "description": "OpenAPI typescript support.", "backstage": { "role": "node-library" diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md index 94768add54..b100b47e26 100644 --- a/packages/backend-plugin-api/CHANGELOG.md +++ b/packages/backend-plugin-api/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/backend-plugin-api +## 1.7.1-next.0 + +### Patch Changes + +- 1ee5b28: Adds an alpha `MetricsService` to provide a unified interface for metrics instrumentation across Backstage plugins. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 1.7.0 ### Minor Changes diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json index 131f24bafb..6acc8a384b 100644 --- a/packages/backend-plugin-api/package.json +++ b/packages/backend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-plugin-api", - "version": "1.7.0", + "version": "1.7.1-next.0", "description": "Core API used by Backstage backend plugins", "backstage": { "role": "node-library" diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 0b144df1da..4e9f955a83 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-test-utils +## 1.11.1-next.0 + +### Patch Changes + +- 1ee5b28: Adds a new metrics service mock to be leveraged in tests +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-app-api@1.5.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + ## 1.11.0 ### Minor Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index ee65ddbc78..a4fe84b9c0 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.11.0", + "version": "1.11.1-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 27ef95a0f3..b871e48357 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,47 @@ # example-backend +## 0.0.48-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/plugin-auth-backend@0.27.1-next.0 + - @backstage/plugin-catalog-backend@3.5.0-next.0 + - @backstage/plugin-scaffolder-backend@3.1.4-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.10-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-app-backend@0.5.12-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.5.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.17-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.5-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.12-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.20-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.18-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.9-next.0 + - @backstage/plugin-devtools-backend@0.5.15-next.0 + - @backstage/plugin-events-backend@0.5.12-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.2.1-next.0 + - @backstage/plugin-kubernetes-backend@0.21.2-next.0 + - @backstage/plugin-notifications-backend@0.6.3-next.0 + - @backstage/plugin-permission-backend@0.7.10-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.17-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-proxy-backend@0.6.11-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.7-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.20-next.0 + - @backstage/plugin-search-backend@2.0.13-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.13-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.12-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.12-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-signals-backend@0.3.13-next.0 + - @backstage/plugin-techdocs-backend@2.1.6-next.0 + ## 0.0.47 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index b6b97f214e..b53b1933bb 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.47", + "version": "0.0.48-next.0", "backstage": { "role": "backend" }, diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 563a0ef828..03f4e627b2 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/catalog-client +## 1.13.1-next.0 + +### Patch Changes + +- d2494d6: Minor update to catalog client docs +- Updated dependencies + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + ## 1.13.0 ### Minor Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index 1a299182e8..9ca0335241 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-client", - "version": "1.13.0", + "version": "1.13.1-next.0", "description": "An isomorphic client for the catalog backend", "backstage": { "role": "common-library" diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index c36322d60f..6f527693b4 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,39 @@ # @backstage/cli-common +## 0.2.0-next.0 + +### Minor Changes + +- 56bd494: Added `targetPaths` and `findOwnPaths` as replacements for `findPaths`, with a cleaner separation between target project paths and package-relative paths. + + To migrate existing `findPaths` usage: + + ```ts + // Before + import { findPaths } from '@backstage/cli-common'; + const paths = findPaths(__dirname); + + // After — for target project paths (cwd-based): + import { targetPaths } from '@backstage/cli-common'; + // paths.targetDir → targetPaths.dir + // paths.targetRoot → targetPaths.rootDir + // paths.resolveTarget('src') → targetPaths.resolve('src') + // paths.resolveTargetRoot('yarn.lock') → targetPaths.resolveRoot('yarn.lock') + + // After — for package-relative paths: + import { findOwnPaths } from '@backstage/cli-common'; + const own = findOwnPaths(__dirname); + // paths.ownDir → own.dir + // paths.ownRoot → own.rootDir + // paths.resolveOwn('config/jest.js') → own.resolve('config/jest.js') + // paths.resolveOwnRoot('tsconfig.json') → own.resolveRoot('tsconfig.json') + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.7 + ## 0.1.18 ### Patch Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index 4eae1d96a4..4e38607467 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-common", - "version": "0.1.18", + "version": "0.2.0-next.0", "description": "Common functionality used by cli, backend, and create-app", "backstage": { "role": "node-library" diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index b960abfbac..074ba4097c 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/cli-node +## 0.2.19-next.0 + +### Patch Changes + +- 06c2015: Added `runConcurrentTasks` and `runWorkerQueueThreads` utilities, moved from the `@backstage/cli` internal code. +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.2.18 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index a4629c3de2..7d198f0a3f 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-node", - "version": "0.2.18", + "version": "0.2.19-next.0", "description": "Node.js library for Backstage CLIs", "backstage": { "role": "node-library" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 0fe123854c..6ccd21fb31 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/cli +## 0.35.5-next.0 + +### Patch Changes + +- 246877a: Updated dependency `bfj` to `^9.0.2`. +- bba2e49: Internal refactor to use new concurrency utilities from `@backstage/cli-node`. +- fd50cb3: Added `translations export` and `translations import` commands for managing translation files. + + The `translations export` command discovers all `TranslationRef` definitions across frontend plugin dependencies and exports their default messages as JSON files. The `translations import` command generates `TranslationResource` wiring code from translated JSON files, ready to be plugged into the app. + + Both commands support a `--pattern` option for controlling the message file layout, for example `--pattern '{lang}/{id}.json'` for language-based directory grouping. + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- 092b41f: Updated dependency `webpack` to `~5.105.0`. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/cli-node@0.2.19-next.0 + - @backstage/eslint-plugin@0.2.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/module-federation-common@0.1.0 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + ## 0.35.4 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 9e1d0b77f0..27a1b92471 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.35.4", + "version": "0.35.5-next.0", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index 77b4d0f9cb..38ccd0f874 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/codemods +## 0.1.55-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + ## 0.1.54 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 6a8a464a37..c531c4ee69 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/codemods", - "version": "0.1.54", + "version": "0.1.55-next.0", "description": "A collection of codemods for Backstage projects", "backstage": { "role": "cli" diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md index 97831338a6..22a9f2c76f 100644 --- a/packages/config-loader/CHANGELOG.md +++ b/packages/config-loader/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/config-loader +## 1.10.9-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 1.10.8 ### Patch Changes diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 985bdef1a5..18b16787ab 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/config-loader", - "version": "1.10.8", + "version": "1.10.9-next.0", "description": "Config loading functionality used by Backstage backend, and CLI", "backstage": { "role": "node-library" diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index b9d741ea9c..42d0581f64 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/core-app-api +## 1.19.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 1.19.5 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 242db797ad..231ee0f4c1 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-app-api", - "version": "1.19.5", + "version": "1.19.6-next.0", "description": "Core app API used by Backstage apps", "backstage": { "role": "web-library" diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index 7a45beca2d..9b6e2a4576 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/core-compat-api +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + ## 0.5.8 ### Patch Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 1a03a36bd2..3a27730600 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.5.8", + "version": "0.5.9-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index a9b0d68ddf..4407f55bd7 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-components +## 0.18.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.2 + - @backstage/version-bridge@1.0.12 + ## 0.18.7 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index 0ba7a89ceb..02f9b782c1 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-components", - "version": "0.18.7", + "version": "0.18.8-next.0", "description": "Core components used by Backstage plugins and apps", "backstage": { "role": "web-library" diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index eebb94a45f..61c5d409c2 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/core-plugin-api +## 1.12.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 1.12.3 ### Patch Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index 202f532b95..d199bfa8da 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/core-plugin-api", - "version": "1.12.3", + "version": "1.12.4-next.0", "description": "Core API used by Backstage plugins", "backstage": { "role": "web-library" diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 39c6951d85..834d31aef9 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/create-app +## 0.7.10-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + ## 0.7.9 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 4841169251..31a6e5347d 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.7.9", + "version": "0.7.10-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 51957793b4..0ce067fe4f 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/dev-utils +## 1.1.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + ## 1.1.20 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 0f59ec8d27..9f83d94cd1 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.20", + "version": "1.1.21-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 7fbdca51c4..525bc47606 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,14 @@ # e2e-test +## 0.2.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/create-app@0.7.10-next.0 + - @backstage/errors@1.2.7 + ## 0.2.37 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index 1a2142d6e9..782fea0710 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,6 +1,6 @@ { "name": "e2e-test", - "version": "0.2.37", + "version": "0.2.38-next.0", "description": "E2E test for verifying Backstage packages", "backstage": { "role": "cli" diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index fa9e3d5c84..71b385bcfe 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/eslint-plugin +## 0.2.2-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 + ## 0.2.1 ### Patch Changes diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index bfc3996ee3..89e08206ce 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/eslint-plugin", - "version": "0.2.1", + "version": "0.2.2-next.0", "description": "Backstage ESLint plugin", "publishConfig": { "access": "public" diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 0ca0df5ac2..d35e1a6dfc 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/frontend-app-api +## 0.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 0.15.0 ### Minor Changes diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index b3e978990c..997c3c6110 100644 --- a/packages/frontend-app-api/package.json +++ b/packages/frontend-app-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-app-api", - "version": "0.15.0", + "version": "0.15.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index b157fd2907..9168af715c 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/frontend-defaults +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-app@0.4.1-next.0 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-app-api@0.15.1-next.0 + ## 0.4.0 ### Minor Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 26411b6d98..92951da7c5 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.4.0", + "version": "0.4.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-dynamic-feature-loader/CHANGELOG.md b/packages/frontend-dynamic-feature-loader/CHANGELOG.md index 1525b390d8..d29ecadc52 100644 --- a/packages/frontend-dynamic-feature-loader/CHANGELOG.md +++ b/packages/frontend-dynamic-feature-loader/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/frontend-dynamic-feature-loader +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/config@1.3.6 + - @backstage/module-federation-common@0.1.0 + ## 0.1.9 ### Patch Changes diff --git a/packages/frontend-dynamic-feature-loader/package.json b/packages/frontend-dynamic-feature-loader/package.json index 49007bdd39..36480783db 100644 --- a/packages/frontend-dynamic-feature-loader/package.json +++ b/packages/frontend-dynamic-feature-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-dynamic-feature-loader", - "version": "0.1.9", + "version": "0.1.10-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md index 958c0f3fb6..4005f83616 100644 --- a/packages/frontend-internal/CHANGELOG.md +++ b/packages/frontend-internal/CHANGELOG.md @@ -1,5 +1,14 @@ # @internal/frontend +## 0.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 0.0.17 ### Patch Changes diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index 57b4eba729..cab3779acd 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/frontend", - "version": "0.0.17", + "version": "0.0.18-next.0", "backstage": { "role": "web-library", "inline": true diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index 7238a08512..ed6349d9e4 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/frontend-plugin-api +## 0.14.2-next.0 + +### Patch Changes + +- 9c81af9: Made the `pluginId` property optional in the `FrontendFeature` type, allowing plugins published against older versions of the framework to be used without type errors. +- Updated dependencies + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + ## 0.14.0 ### Minor Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index 7b4ae8f36b..5002ed98a0 100644 --- a/packages/frontend-plugin-api/package.json +++ b/packages/frontend-plugin-api/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-plugin-api", - "version": "0.14.0", + "version": "0.14.2-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 040cdac005..74e112c067 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/frontend-test-utils +## 0.5.1-next.0 + +### Patch Changes + +- 909c742: Switched `MockTranslationApi` and related test utility imports from `@backstage/core-plugin-api/alpha` to the stable `@backstage/frontend-plugin-api` export. The `TranslationApi` type in the API report is now sourced from a single package. This has no effect on runtime behavior. +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-app@0.4.1-next.0 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.5.0 ### Minor Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index 6e7f487654..aa35b3dff9 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.5.0", + "version": "0.5.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index c5b3247473..a038cd3ac5 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration-react +## 1.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 1.2.15 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index a2c4cd7e78..b8a7f6a678 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.15", + "version": "1.2.16-next.0", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 888613617f..947f559196 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/integration +## 1.21.0-next.0 + +### Minor Changes + +- d933f62: Add configurable throttling and retry mechanism for GitLab integration. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 1.20.0 ### Minor Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index c3e0b07340..8f5bfd3e8b 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.20.0", + "version": "1.21.0-next.0", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 8f1d51361f..67ebd2fec6 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/repo-tools +## 0.16.6-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- 2a51546: Fixed prettier existence checks in OpenAPI commands to use `fs.pathExists` instead of checking the resolved path string, which was always truthy. +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- 18a946c: Updated `@microsoft/api-extractor` to `7.57.3` and added tests for `getTsDocConfig` +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/cli-node@0.2.19-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + ## 0.16.4 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index bc27ae4a42..cca2b5a86a 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.16.4", + "version": "0.16.6-next.0", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md index 3ae462b888..13e8c5694c 100644 --- a/packages/scaffolder-internal/CHANGELOG.md +++ b/packages/scaffolder-internal/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/scaffolder +## 0.0.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-scaffolder-react@1.19.8-next.0 + ## 0.0.18 ### Patch Changes diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json index d249b46969..32d77a2b31 100644 --- a/packages/scaffolder-internal/package.json +++ b/packages/scaffolder-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/scaffolder", - "version": "0.0.18", + "version": "0.0.19-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 5dab0b834b..2557e1f13b 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,26 @@ # techdocs-cli-embedded-app +## 0.2.118-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/cli@0.35.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-techdocs@1.17.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 0.2.117 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index 027ab9f5a0..b903033a0d 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.117", + "version": "0.2.118-next.0", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 6c96f392ba..ce38cf8516 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,18 @@ # @techdocs/cli +## 1.10.6-next.0 + +### Patch Changes + +- 70fc178: Migrated from deprecated `findPaths` to `targetPaths` and `findOwnPaths` from `@backstage/cli-common`. +- de62a9d: Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-techdocs-node@1.14.3-next.0 + ## 1.10.5 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 8299e76a2f..bccab2c228 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.10.5", + "version": "1.10.6-next.0", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 6d01201f32..86a6b08bb6 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/test-utils +## 1.7.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 1.7.15 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 138b27126c..c5b4f771d2 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/test-utils", - "version": "1.7.15", + "version": "1.7.16-next.0", "description": "Utilities to test Backstage plugins and apps.", "backstage": { "role": "web-library" diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 5911274c45..d5c6a13f66 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/ui +## 0.12.1-next.0 + +### Patch Changes + +- a1f4bee: Made Accordion a `bg` provider so nested components like Button auto-increment their background level. Updated `useDefinition` to resolve `bg` `propDef` defaults for provider components. +- 8909359: Fixed focus-visible outline styles for Menu and Select components. + + **Affected components:** Menu, Select + +- 0f462f8: Improved type safety in `useDefinition` by centralizing prop resolution and strengthening the `BgPropsConstraint` to require that `bg` provider components declare `children` as a required prop in their OwnProps type. +- 8909359: Added proper cursor styles for RadioGroup items. + + **Affected components:** RadioGroup + +- Updated dependencies + - @backstage/version-bridge@1.0.12 + ## 0.12.0 ### Minor Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index 39e99b4be7..e43f31c6c4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/ui", - "version": "0.12.0", + "version": "0.12.1-next.0", "backstage": { "role": "web-library" }, diff --git a/packages/yarn-plugin/CHANGELOG.md b/packages/yarn-plugin/CHANGELOG.md index f110bdf7d0..e5ee13b8f0 100644 --- a/packages/yarn-plugin/CHANGELOG.md +++ b/packages/yarn-plugin/CHANGELOG.md @@ -1,5 +1,14 @@ # yarn-plugin-backstage +## 0.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/release-manifests@0.0.13 + ## 0.0.9 ### Patch Changes diff --git a/packages/yarn-plugin/package.json b/packages/yarn-plugin/package.json index 1508d76d47..0326e3d4e9 100644 --- a/packages/yarn-plugin/package.json +++ b/packages/yarn-plugin/package.json @@ -1,6 +1,6 @@ { "name": "yarn-plugin-backstage", - "version": "0.0.9", + "version": "0.0.10-next.0", "description": "Yarn plugin for working with Backstage monorepos", "backstage": { "role": "node-library" diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index db43c0c9dd..9db7a5ed41 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-api-docs +## 0.13.5-next.0 + +### Patch Changes + +- 9c9d425: Fixed invisible text in parameter input fields when using dark mode in OpenAPI definition pages +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.13.4 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index 72562c51bd..c3f5a2c42b 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.13.4", + "version": "0.13.5-next.0", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app-backend/CHANGELOG.md b/plugins/app-backend/CHANGELOG.md index 1750238b78..ea52804fdf 100644 --- a/plugins/app-backend/CHANGELOG.md +++ b/plugins/app-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-app-backend +## 0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.43-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.5.11 ### Patch Changes diff --git a/plugins/app-backend/package.json b/plugins/app-backend/package.json index d38826ddc4..298208ac61 100644 --- a/plugins/app-backend/package.json +++ b/plugins/app-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-backend", - "version": "0.5.11", + "version": "0.5.12-next.0", "description": "A Backstage backend plugin that serves the Backstage frontend app", "backstage": { "role": "backend-plugin", diff --git a/plugins/app-node/CHANGELOG.md b/plugins/app-node/CHANGELOG.md index c21429e06a..9d5856ac62 100644 --- a/plugins/app-node/CHANGELOG.md +++ b/plugins/app-node/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-app-node +## 0.1.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + ## 0.1.42 ### Patch Changes diff --git a/plugins/app-node/package.json b/plugins/app-node/package.json index 3ef2f0a682..2454c3563a 100644 --- a/plugins/app-node/package.json +++ b/plugins/app-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-node", - "version": "0.1.42", + "version": "0.1.43-next.0", "description": "Node.js library for the app plugin", "backstage": { "role": "node-library", diff --git a/plugins/app-react/CHANGELOG.md b/plugins/app-react/CHANGELOG.md index 75e91969e7..6374706f5c 100644 --- a/plugins/app-react/CHANGELOG.md +++ b/plugins/app-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-app-react +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 0.2.0 ### Minor Changes diff --git a/plugins/app-react/package.json b/plugins/app-react/package.json index 3dc8213bc8..9c6887c1ba 100644 --- a/plugins/app-react/package.json +++ b/plugins/app-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-react", - "version": "0.2.0", + "version": "0.2.1-next.0", "description": "Web library for the app plugin", "backstage": { "role": "web-library", diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index 3cd61a7955..f61e2935b9 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-app-visualizer +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 0.2.0 ### Minor Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 173c1cb9f1..5353caa37e 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-visualizer", - "version": "0.2.0", + "version": "0.2.1-next.0", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index a13ad26fff..e4cd22f5b4 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-app +## 0.4.1-next.0 + +### Patch Changes + +- 909c742: Switched translation API imports (`translationApiRef`, `appLanguageApiRef`) from the alpha `@backstage/core-plugin-api/alpha` path to the stable `@backstage/frontend-plugin-api` export. This has no effect on runtime behavior. +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.4.0 ### Minor Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index 780996e3b0..3572d7da28 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.4.0", + "version": "0.4.1-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md index 88849b31dc..08e0dac595 100644 --- a/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-atlassian-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-atlassian-provider +## 0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.4.12 ### Patch Changes diff --git a/plugins/auth-backend-module-atlassian-provider/package.json b/plugins/auth-backend-module-atlassian-provider/package.json index cc5c8243b9..86a75917e8 100644 --- a/plugins/auth-backend-module-atlassian-provider/package.json +++ b/plugins/auth-backend-module-atlassian-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-atlassian-provider", - "version": "0.4.12", + "version": "0.4.13-next.0", "description": "The atlassian-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md index 9626a18c37..79ff975f48 100644 --- a/plugins/auth-backend-module-auth0-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-auth0-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-auth0-provider +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.3.0 ### Minor Changes diff --git a/plugins/auth-backend-module-auth0-provider/package.json b/plugins/auth-backend-module-auth0-provider/package.json index 2d39019295..e1d8ef0cd8 100644 --- a/plugins/auth-backend-module-auth0-provider/package.json +++ b/plugins/auth-backend-module-auth0-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-auth0-provider", - "version": "0.3.0", + "version": "0.3.1-next.0", "description": "The auth0-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md b/plugins/auth-backend-module-aws-alb-provider/CHANGELOG.md index c510c9dcc0..ec48ad5eb2 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.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.27.1-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.4.13 ### 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 d61cadd863..e86e425ccd 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.13", + "version": "0.4.14-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-azure-easyauth-provider/CHANGELOG.md b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md index 8583ca3ff0..ae68e22115 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-azure-easyauth-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-azure-easyauth-provider +## 0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.2.17 ### Patch Changes diff --git a/plugins/auth-backend-module-azure-easyauth-provider/package.json b/plugins/auth-backend-module-azure-easyauth-provider/package.json index 71c5c7366a..78f55326d8 100644 --- a/plugins/auth-backend-module-azure-easyauth-provider/package.json +++ b/plugins/auth-backend-module-azure-easyauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-azure-easyauth-provider", - "version": "0.2.17", + "version": "0.2.18-next.0", "description": "The azure-easyauth-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md index 365bbb6172..d25a7748a2 100644 --- a/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-bitbucket-provider +## 0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.3.12 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-provider/package.json b/plugins/auth-backend-module-bitbucket-provider/package.json index 2584bdf8fa..e5368834e7 100644 --- a/plugins/auth-backend-module-bitbucket-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-provider", - "version": "0.3.12", + "version": "0.3.13-next.0", "description": "The bitbucket-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md index 4bee591f4e..31d965325e 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-bitbucket-server-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-bitbucket-server-provider +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.2.12 ### Patch Changes diff --git a/plugins/auth-backend-module-bitbucket-server-provider/package.json b/plugins/auth-backend-module-bitbucket-server-provider/package.json index 7dd8b610af..dceb88d24d 100644 --- a/plugins/auth-backend-module-bitbucket-server-provider/package.json +++ b/plugins/auth-backend-module-bitbucket-server-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-bitbucket-server-provider", - "version": "0.2.12", + "version": "0.2.13-next.0", "description": "The bitbucket-server-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md index e5c120a1e8..22625985a7 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-cloudflare-access-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-cloudflare-access-provider +## 0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.4.12 ### Patch Changes diff --git a/plugins/auth-backend-module-cloudflare-access-provider/package.json b/plugins/auth-backend-module-cloudflare-access-provider/package.json index 3a318f6dd4..cb471664db 100644 --- a/plugins/auth-backend-module-cloudflare-access-provider/package.json +++ b/plugins/auth-backend-module-cloudflare-access-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-cloudflare-access-provider", - "version": "0.4.12", + "version": "0.4.13-next.0", "description": "The cloudflare-access-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md index cc0568608c..1180e9a217 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gcp-iap-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-gcp-iap-provider +## 0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.4.12 ### Patch Changes diff --git a/plugins/auth-backend-module-gcp-iap-provider/package.json b/plugins/auth-backend-module-gcp-iap-provider/package.json index 029b66a509..29af42c8ae 100644 --- a/plugins/auth-backend-module-gcp-iap-provider/package.json +++ b/plugins/auth-backend-module-gcp-iap-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gcp-iap-provider", - "version": "0.4.12", + "version": "0.4.13-next.0", "description": "A GCP IAP auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-github-provider/CHANGELOG.md b/plugins/auth-backend-module-github-provider/CHANGELOG.md index 528a53ffc7..d864e8389f 100644 --- a/plugins/auth-backend-module-github-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-github-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-github-provider +## 0.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.5.0 ### Minor Changes diff --git a/plugins/auth-backend-module-github-provider/package.json b/plugins/auth-backend-module-github-provider/package.json index da0c22725b..e507be91f6 100644 --- a/plugins/auth-backend-module-github-provider/package.json +++ b/plugins/auth-backend-module-github-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-github-provider", - "version": "0.5.0", + "version": "0.5.1-next.0", "description": "The github-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md index 11352547a4..42c087bf03 100644 --- a/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-gitlab-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-gitlab-provider +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.4.0 ### Minor Changes diff --git a/plugins/auth-backend-module-gitlab-provider/package.json b/plugins/auth-backend-module-gitlab-provider/package.json index b933bb50a2..195560d8e9 100644 --- a/plugins/auth-backend-module-gitlab-provider/package.json +++ b/plugins/auth-backend-module-gitlab-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-gitlab-provider", - "version": "0.4.0", + "version": "0.4.1-next.0", "description": "The gitlab-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-google-provider/CHANGELOG.md b/plugins/auth-backend-module-google-provider/CHANGELOG.md index 4b3ee7ecb0..2d260538af 100644 --- a/plugins/auth-backend-module-google-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-google-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-google-provider +## 0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.3.12 ### Patch Changes diff --git a/plugins/auth-backend-module-google-provider/package.json b/plugins/auth-backend-module-google-provider/package.json index 1683c8447f..d9a355d204 100644 --- a/plugins/auth-backend-module-google-provider/package.json +++ b/plugins/auth-backend-module-google-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-google-provider", - "version": "0.3.12", + "version": "0.3.13-next.0", "description": "A Google auth provider module for the Backstage auth backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-guest-provider/CHANGELOG.md b/plugins/auth-backend-module-guest-provider/CHANGELOG.md index c249a36e78..bf229cf304 100644 --- a/plugins/auth-backend-module-guest-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-guest-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-guest-provider +## 0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.2.16 ### Patch Changes diff --git a/plugins/auth-backend-module-guest-provider/package.json b/plugins/auth-backend-module-guest-provider/package.json index 0cda2cd9cd..2b05b628be 100644 --- a/plugins/auth-backend-module-guest-provider/package.json +++ b/plugins/auth-backend-module-guest-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-guest-provider", - "version": "0.2.16", + "version": "0.2.17-next.0", "description": "The guest-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md index e5597b1bb2..045decf2fb 100644 --- a/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-microsoft-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-microsoft-provider +## 0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.3.12 ### Patch Changes diff --git a/plugins/auth-backend-module-microsoft-provider/package.json b/plugins/auth-backend-module-microsoft-provider/package.json index 3bdc28d423..2ad18ac6de 100644 --- a/plugins/auth-backend-module-microsoft-provider/package.json +++ b/plugins/auth-backend-module-microsoft-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-microsoft-provider", - "version": "0.3.12", + "version": "0.3.13-next.0", "description": "The microsoft-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md index 77dcbeb9e5..8b04f8824b 100644 --- a/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-oauth2-provider +## 0.4.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.4.12 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-provider/package.json b/plugins/auth-backend-module-oauth2-provider/package.json index 6dc9f68157..b2b929bb11 100644 --- a/plugins/auth-backend-module-oauth2-provider/package.json +++ b/plugins/auth-backend-module-oauth2-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-provider", - "version": "0.4.12", + "version": "0.4.13-next.0", "description": "The oauth2-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md index e22f2a783e..2053d99d83 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oauth2-proxy-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-oauth2-proxy-provider +## 0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.2.17 ### Patch Changes diff --git a/plugins/auth-backend-module-oauth2-proxy-provider/package.json b/plugins/auth-backend-module-oauth2-proxy-provider/package.json index c1adcc93fe..299c00ea19 100644 --- a/plugins/auth-backend-module-oauth2-proxy-provider/package.json +++ b/plugins/auth-backend-module-oauth2-proxy-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-oauth2-proxy-provider", - "version": "0.2.17", + "version": "0.2.18-next.0", "description": "The oauth2-proxy-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md index 71936899b9..4acdfe423b 100644 --- a/plugins/auth-backend-module-oidc-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-oidc-provider/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-auth-backend-module-oidc-provider +## 0.4.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.27.1-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.4.13 ### Patch Changes diff --git a/plugins/auth-backend-module-oidc-provider/package.json b/plugins/auth-backend-module-oidc-provider/package.json index 813846adcc..662c6dcd58 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.13", + "version": "0.4.14-next.0", "description": "The oidc-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-okta-provider/CHANGELOG.md b/plugins/auth-backend-module-okta-provider/CHANGELOG.md index d8a1fbe809..2bca29cbde 100644 --- a/plugins/auth-backend-module-okta-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-okta-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-okta-provider +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.2.12 ### Patch Changes diff --git a/plugins/auth-backend-module-okta-provider/package.json b/plugins/auth-backend-module-okta-provider/package.json index 8e7e96a930..021fc5a9cd 100644 --- a/plugins/auth-backend-module-okta-provider/package.json +++ b/plugins/auth-backend-module-okta-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-okta-provider", - "version": "0.2.12", + "version": "0.2.13-next.0", "description": "The okta-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md index 8b1b1a0474..cf8e8e89e5 100644 --- a/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-onelogin-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-auth-backend-module-onelogin-provider +## 0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.3.12 ### Patch Changes diff --git a/plugins/auth-backend-module-onelogin-provider/package.json b/plugins/auth-backend-module-onelogin-provider/package.json index bed4161c81..c36dea44be 100644 --- a/plugins/auth-backend-module-onelogin-provider/package.json +++ b/plugins/auth-backend-module-onelogin-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-onelogin-provider", - "version": "0.3.12", + "version": "0.3.13-next.0", "description": "The onelogin-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-openshift-provider/CHANGELOG.md b/plugins/auth-backend-module-openshift-provider/CHANGELOG.md index aa1dc8fb84..02ae1c6562 100644 --- a/plugins/auth-backend-module-openshift-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-openshift-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-openshift-provider +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.1.4 ### Patch Changes diff --git a/plugins/auth-backend-module-openshift-provider/package.json b/plugins/auth-backend-module-openshift-provider/package.json index 35e405e9e5..40b8bdd241 100644 --- a/plugins/auth-backend-module-openshift-provider/package.json +++ b/plugins/auth-backend-module-openshift-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-openshift-provider", - "version": "0.1.4", + "version": "0.1.5-next.0", "description": "The OpenShift backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md index 9c85d5ae24..10f9e6d561 100644 --- a/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-pinniped-provider/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth-backend-module-pinniped-provider +## 0.3.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.3.11 ### Patch Changes diff --git a/plugins/auth-backend-module-pinniped-provider/package.json b/plugins/auth-backend-module-pinniped-provider/package.json index d3206effae..2d05830c78 100644 --- a/plugins/auth-backend-module-pinniped-provider/package.json +++ b/plugins/auth-backend-module-pinniped-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-pinniped-provider", - "version": "0.3.11", + "version": "0.3.12-next.0", "description": "The pinniped-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md index 35b2761818..2235daf7e0 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md +++ b/plugins/auth-backend-module-vmware-cloud-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-backend-module-vmware-cloud-provider +## 0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.5.11 ### Patch Changes diff --git a/plugins/auth-backend-module-vmware-cloud-provider/package.json b/plugins/auth-backend-module-vmware-cloud-provider/package.json index 203234d90c..d0b8034ae7 100644 --- a/plugins/auth-backend-module-vmware-cloud-provider/package.json +++ b/plugins/auth-backend-module-vmware-cloud-provider/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend-module-vmware-cloud-provider", - "version": "0.5.11", + "version": "0.5.12-next.0", "description": "The vmware-cloud-provider backend module for the auth plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 9f77de97e7..068a085520 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-auth-backend +## 0.27.1-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- 619be54: Update migrations to be reversible +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + ## 0.27.0 ### Minor Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index da5f9c4ea6..45d17d6f6d 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend", - "version": "0.27.0", + "version": "0.27.1-next.0", "description": "A Backstage backend plugin that handles authentication", "backstage": { "role": "backend-plugin", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index ece86309bd..651d2752d3 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-auth-node +## 0.6.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.6.13 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index c6eb92e607..440f6a4913 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.6.13", + "version": "0.6.14-next.0", "backstage": { "role": "node-library", "pluginId": "auth", diff --git a/plugins/auth-react/CHANGELOG.md b/plugins/auth-react/CHANGELOG.md index 6028f0218c..1b8da082e0 100644 --- a/plugins/auth-react/CHANGELOG.md +++ b/plugins/auth-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-auth-react +## 0.1.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + ## 0.1.24 ### Patch Changes diff --git a/plugins/auth-react/package.json b/plugins/auth-react/package.json index f61542d1a3..9466e09e19 100644 --- a/plugins/auth-react/package.json +++ b/plugins/auth-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-react", - "version": "0.1.24", + "version": "0.1.25-next.0", "description": "Web library for the auth plugin", "backstage": { "role": "web-library", diff --git a/plugins/auth/CHANGELOG.md b/plugins/auth/CHANGELOG.md index e2e1da46d0..469964a57c 100644 --- a/plugins/auth/CHANGELOG.md +++ b/plugins/auth/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-auth +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.2 + ## 0.1.5 ### Patch Changes diff --git a/plugins/auth/package.json b/plugins/auth/package.json index 23484cc5e5..02d5073f2b 100644 --- a/plugins/auth/package.json +++ b/plugins/auth/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth", - "version": "0.1.5", + "version": "0.1.6-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "auth", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 134a370bda..9ad8a14276 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + ## 0.3.7 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index e40040081a..41f7f8b49e 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", - "version": "0.3.7", + "version": "0.3.8-next.0", "description": "Common functionalities for bitbucket-cloud plugins", "backstage": { "role": "common-library", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 84d0ffe183..104db8bed8 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.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-kubernetes-common@0.9.10 + ## 0.4.20 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index efcb7f76cd..657190a2ac 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.20", + "version": "0.4.21-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-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index cd350fb453..71ffc6eb5f 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.3.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.3.14 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index bb5291ef9a..c73d71073a 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.3.14", + "version": "0.3.15-next.0", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md index b75a3831e4..44454b6645 100644 --- a/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-backstage-openapi/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-backstage-openapi +## 0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.5.11 ### Patch Changes diff --git a/plugins/catalog-backend-module-backstage-openapi/package.json b/plugins/catalog-backend-module-backstage-openapi/package.json index 948e0f0cdf..69a41a3a2a 100644 --- a/plugins/catalog-backend-module-backstage-openapi/package.json +++ b/plugins/catalog-backend-module-backstage-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-backstage-openapi", - "version": "0.5.11", + "version": "0.5.12-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index b1acf9790a..570ed41256 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-bitbucket-cloud-common@0.3.8-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.5.8 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index ebfd1104bd..1f7bd194be 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", - "version": "0.5.8", + "version": "0.5.9-next.0", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 925debc5c0..92bb46d3c0 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.5.8 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index fb0df6172c..8f4e3b97b5 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.5.8", + "version": "0.5.9-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gcp/CHANGELOG.md b/plugins/catalog-backend-module-gcp/CHANGELOG.md index d1e8b8cc13..210468d544 100644 --- a/plugins/catalog-backend-module-gcp/CHANGELOG.md +++ b/plugins/catalog-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-gcp +## 0.3.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-kubernetes-common@0.9.10 + ## 0.3.16 ### Patch Changes diff --git a/plugins/catalog-backend-module-gcp/package.json b/plugins/catalog-backend-module-gcp/package.json index 446769a5df..51c6791c36 100644 --- a/plugins/catalog-backend-module-gcp/package.json +++ b/plugins/catalog-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gcp", - "version": "0.3.16", + "version": "0.3.17-next.0", "description": "A Backstage catalog backend module that helps integrate towards GCP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 3eaee80cc6..6a14e2fa96 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.3.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.3.11 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index 72d28a5f13..e2b12b1872 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.3.11", + "version": "0.3.12-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gitea/CHANGELOG.md b/plugins/catalog-backend-module-gitea/CHANGELOG.md index 92dd71ee81..b7c152b7ec 100644 --- a/plugins/catalog-backend-module-gitea/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gitea +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.1.9 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitea/package.json b/plugins/catalog-backend-module-gitea/package.json index 044f074c9e..9d23fa2ca0 100644 --- a/plugins/catalog-backend-module-gitea/package.json +++ b/plugins/catalog-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitea", - "version": "0.1.9", + "version": "0.1.10-next.0", "description": "The gitea backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index f537919ae8..fd442dab13 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.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.12.3-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.3.19 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index b302739caf..be85ed65a3 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.19", + "version": "0.3.20-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 d0d993a928..586ea98c43 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.12.3-next.0 + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.12.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index 5787333e52..fdef1a8aab 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.12.2", + "version": "0.12.3-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 8826f23fe9..3584e8ce8c 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.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.8.1-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.2.18 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab-org/package.json b/plugins/catalog-backend-module-gitlab-org/package.json index ff0cd55ce0..19d2bd5aa4 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.18", + "version": "0.2.19-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 2bfa7c354c..e8ee9a0b17 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.8.1-next.0 + +### Patch Changes + +- d933f62: Add configurable throttling and retry mechanism for GitLab integration. +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.8.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index b0dad1bef8..88661729b2 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.8.0", + "version": "0.8.1-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-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index c7d4c8b3ae..c30dc39d18 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.7.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/plugin-catalog-backend@3.5.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + ## 0.7.9 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index 5ad2ecf499..d03ac523c3 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.7.9", + "version": "0.7.10-next.0", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index 5db5d368e0..b9959ad209 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.12.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.12.2 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index cf3e12c297..9b1ff77957 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", - "version": "0.12.2", + "version": "0.12.3-next.0", "description": "A Backstage catalog backend module that helps integrate towards LDAP", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-logs/CHANGELOG.md b/plugins/catalog-backend-module-logs/CHANGELOG.md index 04b21b02b8..9520d32d3f 100644 --- a/plugins/catalog-backend-module-logs/CHANGELOG.md +++ b/plugins/catalog-backend-module-logs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-catalog-backend-module-logs +## 0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.5.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.1.19 ### Patch Changes diff --git a/plugins/catalog-backend-module-logs/package.json b/plugins/catalog-backend-module-logs/package.json index 5bd890359c..d3c65991a2 100644 --- a/plugins/catalog-backend-module-logs/package.json +++ b/plugins/catalog-backend-module-logs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-logs", - "version": "0.1.19", + "version": "0.1.20-next.0", "description": "A module that subscribes to catalog related events and logs them.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index 82a20987bc..5e525e9f0e 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.9.0 ### Minor Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 4791527b95..14ccfbef18 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", - "version": "0.9.0", + "version": "0.9.1-next.0", "description": "A Backstage catalog backend module that helps integrate towards Microsoft Graph", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index f985321a83..69cd786a0a 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.2.19 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 42650d9e8e..2ab5d94ff6 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.2.19", + "version": "0.2.20-next.0", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md index ed5a970212..28d5bec889 100644 --- a/plugins/catalog-backend-module-puppetdb/CHANGELOG.md +++ b/plugins/catalog-backend-module-puppetdb/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-puppetdb +## 0.2.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.2.19 ### Patch Changes diff --git a/plugins/catalog-backend-module-puppetdb/package.json b/plugins/catalog-backend-module-puppetdb/package.json index bdeee6b26e..8ae9637017 100644 --- a/plugins/catalog-backend-module-puppetdb/package.json +++ b/plugins/catalog-backend-module-puppetdb/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-puppetdb", - "version": "0.2.19", + "version": "0.2.20-next.0", "description": "A Backstage catalog backend module that helps integrate towards PuppetDB", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index 7ddee70b70..c5b40cc991 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + ## 0.2.17 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index 0dcc437ef9..df180ee6bc 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", - "version": "0.2.17", + "version": "0.2.18-next.0", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md index 748c191e84..31f4f425fa 100644 --- a/plugins/catalog-backend-module-unprocessed/CHANGELOG.md +++ b/plugins/catalog-backend-module-unprocessed/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-backend-module-unprocessed +## 0.6.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13 + - @backstage/plugin-permission-common@0.9.6 + ## 0.6.8 ### Patch Changes diff --git a/plugins/catalog-backend-module-unprocessed/package.json b/plugins/catalog-backend-module-unprocessed/package.json index 2c1ea51ce4..748c6a081e 100644 --- a/plugins/catalog-backend-module-unprocessed/package.json +++ b/plugins/catalog-backend-module-unprocessed/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-unprocessed", - "version": "0.6.8", + "version": "0.6.9-next.0", "description": "Backstage Catalog module to view unprocessed entities", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 4431c15402..cbca2a2b92 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog-backend +## 3.5.0-next.0 + +### Minor Changes + +- bf71677: Added opentelemetry metrics for SCM events: + + - `catalog.events.scm.messages` with attribute `eventType`: Counter for the number of SCM events actually received by the catalog backend. The `eventType` is currently either `location` or `repository`. + +### Patch Changes + +- 6738cf0: build(deps): bump `minimatch` from 9.0.5 to 10.2.1 +- fbf382f: Minor internal optimisation +- 1ee5b28: Migrates existing catalog metrics to use the alpha MetricsService. This release is a 1:1 migration with no breaking changes. +- 3181973: Changed the `search` table foreign key to point to `final_entities` instead of `refresh_state` +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 3.4.0 ### Minor Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 8cb7b8f64d..b1f0175c81 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "3.4.0", + "version": "3.5.0-next.0", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index e9cfd3fc59..80fcb546b8 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-graph +## 0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/types@1.2.2 + ## 0.5.7 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index e6cef531e1..9b94d69113 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.5.7", + "version": "0.5.8-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-graph", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index f0bc160164..139b565af2 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-import +## 0.13.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.13.10 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index a481fe889c..52b8379ed5 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-import", - "version": "0.13.10", + "version": "0.13.11-next.0", "description": "A Backstage plugin the helps you import entities into your catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 1e2d35507f..22db08b9b9 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-catalog-node +## 2.1.0-next.0 + +### Minor Changes + +- bf71677: Added the ability for SCM events subscribers to mark the fact that they have taken actions based on events, which produces output metrics: + + - `catalog.events.scm.actions` with attribute `action`: Counter for the number of actions actually taken by catalog internals or other subscribers, based on SCM events. The `action` is currently either `create`, `delete`, `refresh`, or `move`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/backend-test-utils@1.11.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 2.0.0 ### Minor Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index b06bd8ca08..9d37ae31ed 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-node", - "version": "2.0.0", + "version": "2.1.0-next.0", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", "backstage": { "role": "node-library", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 903ce74e04..550c9616ec 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-catalog-react +## 2.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/frontend-test-utils@0.5.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 2.0.0 ### Minor Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index 9fbd58a3b5..c383c52691 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "2.0.0", + "version": "2.0.1-next.0", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog-unprocessed-entities/CHANGELOG.md b/plugins/catalog-unprocessed-entities/CHANGELOG.md index 5c3516a3a9..3a5f49f5a9 100644 --- a/plugins/catalog-unprocessed-entities/CHANGELOG.md +++ b/plugins/catalog-unprocessed-entities/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-unprocessed-entities +## 0.2.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13 + - @backstage/plugin-devtools-react@0.1.2-next.0 + ## 0.2.26 ### Patch Changes diff --git a/plugins/catalog-unprocessed-entities/package.json b/plugins/catalog-unprocessed-entities/package.json index 3485342d4d..2efd04a781 100644 --- a/plugins/catalog-unprocessed-entities/package.json +++ b/plugins/catalog-unprocessed-entities/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-unprocessed-entities", - "version": "0.2.26", + "version": "0.2.27-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-unprocessed-entities", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index d68a9a4209..8242b7f125 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-catalog +## 1.33.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 1.33.0 ### Minor Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index b97267d8d4..f04e147638 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.33.0", + "version": "1.33.1-next.0", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index 95fbfd9d0f..b617811885 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-config-schema +## 0.1.78-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.1.77 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index d9a16c4bb7..c643d6b1f4 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-config-schema", - "version": "0.1.77", + "version": "0.1.78-next.0", "description": "A Backstage plugin that lets you browse the configuration schema of your app", "backstage": { "role": "frontend-plugin", diff --git a/plugins/devtools-backend/CHANGELOG.md b/plugins/devtools-backend/CHANGELOG.md index eedd6300de..77400b17ed 100644 --- a/plugins/devtools-backend/CHANGELOG.md +++ b/plugins/devtools-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-devtools-backend +## 0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.0 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.22 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 0.5.14 ### Patch Changes diff --git a/plugins/devtools-backend/package.json b/plugins/devtools-backend/package.json index 69d87c54fc..3b025b052a 100644 --- a/plugins/devtools-backend/package.json +++ b/plugins/devtools-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-backend", - "version": "0.5.14", + "version": "0.5.15-next.0", "backstage": { "role": "backend-plugin", "pluginId": "devtools", diff --git a/plugins/devtools-react/CHANGELOG.md b/plugins/devtools-react/CHANGELOG.md index bf8751ffe8..799bbafdda 100644 --- a/plugins/devtools-react/CHANGELOG.md +++ b/plugins/devtools-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-devtools-react +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 0.1.1 ### Patch Changes diff --git a/plugins/devtools-react/package.json b/plugins/devtools-react/package.json index cf6d34b466..0b9e40187f 100644 --- a/plugins/devtools-react/package.json +++ b/plugins/devtools-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools-react", - "version": "0.1.1", + "version": "0.1.2-next.0", "description": "Web library for the devtools plugin", "backstage": { "role": "web-library", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index c63d7850a3..b62339220b 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-devtools +## 0.1.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-devtools-common@0.1.22 + - @backstage/plugin-devtools-react@0.1.2-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.1.36 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index b03eef9dcb..61160edb46 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.36", + "version": "0.1.37-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "devtools", diff --git a/plugins/events-backend-module-aws-sqs/CHANGELOG.md b/plugins/events-backend-module-aws-sqs/CHANGELOG.md index 5cd2e5eac7..2125e080b3 100644 --- a/plugins/events-backend-module-aws-sqs/CHANGELOG.md +++ b/plugins/events-backend-module-aws-sqs/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-aws-sqs +## 0.4.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.4.19 ### Patch Changes diff --git a/plugins/events-backend-module-aws-sqs/package.json b/plugins/events-backend-module-aws-sqs/package.json index 3e6cdb4b57..dd704866a7 100644 --- a/plugins/events-backend-module-aws-sqs/package.json +++ b/plugins/events-backend-module-aws-sqs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-aws-sqs", - "version": "0.4.19", + "version": "0.4.20-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-azure/CHANGELOG.md b/plugins/events-backend-module-azure/CHANGELOG.md index 8191e4faca..27b8884997 100644 --- a/plugins/events-backend-module-azure/CHANGELOG.md +++ b/plugins/events-backend-module-azure/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-azure +## 0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.2.28 ### Patch Changes diff --git a/plugins/events-backend-module-azure/package.json b/plugins/events-backend-module-azure/package.json index 5715981263..cadcc17085 100644 --- a/plugins/events-backend-module-azure/package.json +++ b/plugins/events-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-azure", - "version": "0.2.28", + "version": "0.2.29-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md index e83960dc3f..ec5c6f7e51 100644 --- a/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-cloud +## 0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.2.28 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-cloud/package.json b/plugins/events-backend-module-bitbucket-cloud/package.json index ddd6c64471..85ea3db464 100644 --- a/plugins/events-backend-module-bitbucket-cloud/package.json +++ b/plugins/events-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-cloud", - "version": "0.2.28", + "version": "0.2.29-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-bitbucket-server/CHANGELOG.md b/plugins/events-backend-module-bitbucket-server/CHANGELOG.md index 79ae4419f4..66c8523ed0 100644 --- a/plugins/events-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/events-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-bitbucket-server +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.1.9 ### Patch Changes diff --git a/plugins/events-backend-module-bitbucket-server/package.json b/plugins/events-backend-module-bitbucket-server/package.json index 83d8d470b6..94e6c9f280 100644 --- a/plugins/events-backend-module-bitbucket-server/package.json +++ b/plugins/events-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-bitbucket-server", - "version": "0.1.9", + "version": "0.1.10-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gerrit/CHANGELOG.md b/plugins/events-backend-module-gerrit/CHANGELOG.md index b3eb366a87..56033f47e8 100644 --- a/plugins/events-backend-module-gerrit/CHANGELOG.md +++ b/plugins/events-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-events-backend-module-gerrit +## 0.2.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.2.28 ### Patch Changes diff --git a/plugins/events-backend-module-gerrit/package.json b/plugins/events-backend-module-gerrit/package.json index 7dfff9961e..9d28dc1dc6 100644 --- a/plugins/events-backend-module-gerrit/package.json +++ b/plugins/events-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gerrit", - "version": "0.2.28", + "version": "0.2.29-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index c7656fce90..99906c12cf 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-github +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.4.9 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index b1bb43b902..79e4bf6ec1 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.4.9", + "version": "0.4.10-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-gitlab/CHANGELOG.md b/plugins/events-backend-module-gitlab/CHANGELOG.md index eff3f72ec6..c81c9a244e 100644 --- a/plugins/events-backend-module-gitlab/CHANGELOG.md +++ b/plugins/events-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-backend-module-gitlab +## 0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.3.9 ### Patch Changes diff --git a/plugins/events-backend-module-gitlab/package.json b/plugins/events-backend-module-gitlab/package.json index 3ed8e2eefc..1f05d6de5a 100644 --- a/plugins/events-backend-module-gitlab/package.json +++ b/plugins/events-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-gitlab", - "version": "0.3.9", + "version": "0.3.10-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend-module-google-pubsub/CHANGELOG.md b/plugins/events-backend-module-google-pubsub/CHANGELOG.md index c3e7a19b4f..1bbf060b95 100644 --- a/plugins/events-backend-module-google-pubsub/CHANGELOG.md +++ b/plugins/events-backend-module-google-pubsub/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-events-backend-module-google-pubsub +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.2.0 ### Minor Changes diff --git a/plugins/events-backend-module-google-pubsub/package.json b/plugins/events-backend-module-google-pubsub/package.json index b9fc748895..29ed2f230b 100644 --- a/plugins/events-backend-module-google-pubsub/package.json +++ b/plugins/events-backend-module-google-pubsub/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-google-pubsub", - "version": "0.2.0", + "version": "0.2.1-next.0", "description": "The google-pubsub backend module for the events plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/events-backend-module-kafka/CHANGELOG.md b/plugins/events-backend-module-kafka/CHANGELOG.md index 3e1e527d48..8b601a3f3b 100644 --- a/plugins/events-backend-module-kafka/CHANGELOG.md +++ b/plugins/events-backend-module-kafka/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-events-backend-module-kafka +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.3.1 ### Patch Changes diff --git a/plugins/events-backend-module-kafka/package.json b/plugins/events-backend-module-kafka/package.json index 2e795242cf..cb2c1fcde6 100644 --- a/plugins/events-backend-module-kafka/package.json +++ b/plugins/events-backend-module-kafka/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-kafka", - "version": "0.3.1", + "version": "0.3.2-next.0", "description": "The kafka backend module for the events plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/events-backend-test-utils/CHANGELOG.md b/plugins/events-backend-test-utils/CHANGELOG.md index 9bf8093c1a..4e48326968 100644 --- a/plugins/events-backend-test-utils/CHANGELOG.md +++ b/plugins/events-backend-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-events-backend-test-utils +## 0.1.53-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.1.52 ### Patch Changes diff --git a/plugins/events-backend-test-utils/package.json b/plugins/events-backend-test-utils/package.json index 9fefe66a44..e5ea9a9e90 100644 --- a/plugins/events-backend-test-utils/package.json +++ b/plugins/events-backend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-test-utils", - "version": "0.1.52", + "version": "0.1.53-next.0", "description": "The plugin-events-backend-test-utils for @backstage/plugin-events-node", "backstage": { "role": "node-library", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 9b534b57c7..4a60681d58 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-events-backend +## 0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.5.11 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index c4faa91b99..4642f4e92d 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.5.11", + "version": "0.5.12-next.0", "backstage": { "role": "backend-plugin", "pluginId": "events", diff --git a/plugins/events-node/CHANGELOG.md b/plugins/events-node/CHANGELOG.md index 01834edfb4..8db15b5573 100644 --- a/plugins/events-node/CHANGELOG.md +++ b/plugins/events-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-events-node +## 0.4.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.4.19 ### Patch Changes diff --git a/plugins/events-node/package.json b/plugins/events-node/package.json index b7dfaa6f00..4bec93ecee 100644 --- a/plugins/events-node/package.json +++ b/plugins/events-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-node", - "version": "0.4.19", + "version": "0.4.20-next.0", "description": "The plugin-events-node module for @backstage/plugin-events-backend", "backstage": { "role": "node-library", diff --git a/plugins/example-todo-list-backend/CHANGELOG.md b/plugins/example-todo-list-backend/CHANGELOG.md index 656a72b24b..2859e0ee97 100644 --- a/plugins/example-todo-list-backend/CHANGELOG.md +++ b/plugins/example-todo-list-backend/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list-backend +## 1.0.48-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + ## 1.0.47 ### Patch Changes diff --git a/plugins/example-todo-list-backend/package.json b/plugins/example-todo-list-backend/package.json index e59787ada2..f2f3d4bba9 100644 --- a/plugins/example-todo-list-backend/package.json +++ b/plugins/example-todo-list-backend/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list-backend", - "version": "1.0.47", + "version": "1.0.48-next.0", "backstage": { "role": "backend-plugin", "pluginId": "todo-list", diff --git a/plugins/example-todo-list/CHANGELOG.md b/plugins/example-todo-list/CHANGELOG.md index 70f667b7bb..7a17541264 100644 --- a/plugins/example-todo-list/CHANGELOG.md +++ b/plugins/example-todo-list/CHANGELOG.md @@ -1,5 +1,13 @@ # @internal/plugin-todo-list +## 1.0.49-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 1.0.48 ### Patch Changes diff --git a/plugins/example-todo-list/package.json b/plugins/example-todo-list/package.json index d671bf504a..d6065a1f9c 100644 --- a/plugins/example-todo-list/package.json +++ b/plugins/example-todo-list/package.json @@ -1,6 +1,6 @@ { "name": "@internal/plugin-todo-list", - "version": "1.0.48", + "version": "1.0.49-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "todo-list", diff --git a/plugins/gateway-backend/CHANGELOG.md b/plugins/gateway-backend/CHANGELOG.md index 9bd5f6699e..98cec7069e 100644 --- a/plugins/gateway-backend/CHANGELOG.md +++ b/plugins/gateway-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-gateway-backend +## 1.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + ## 1.1.2 ### Patch Changes diff --git a/plugins/gateway-backend/package.json b/plugins/gateway-backend/package.json index 8f600ebf02..ef35c22f46 100644 --- a/plugins/gateway-backend/package.json +++ b/plugins/gateway-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-gateway-backend", - "version": "1.1.2", + "version": "1.1.3-next.0", "backstage": { "role": "backend-plugin", "pluginId": "gateway", diff --git a/plugins/home-react/CHANGELOG.md b/plugins/home-react/CHANGELOG.md index 5817aa34cd..d80608269d 100644 --- a/plugins/home-react/CHANGELOG.md +++ b/plugins/home-react/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-home-react +## 0.1.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 0.1.35 ### Patch Changes diff --git a/plugins/home-react/package.json b/plugins/home-react/package.json index 419bf9b770..682beb6edd 100644 --- a/plugins/home-react/package.json +++ b/plugins/home-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home-react", - "version": "0.1.35", + "version": "0.1.36-next.0", "description": "A Backstage plugin that contains react components helps you build a home page", "backstage": { "role": "web-library", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index ecfd1ea38e..045b8737a4 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-home +## 0.9.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-home-react@0.1.36-next.0 + ## 0.9.2 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 561ed37309..4c38991714 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.9.2", + "version": "0.9.3-next.0", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 6d6b537cfd..4886067c19 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-kubernetes-backend +## 0.21.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-node@0.4.2-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 0.21.1 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index dc65304fb9..d773535a99 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-backend", - "version": "0.21.1", + "version": "0.21.2-next.0", "description": "A Backstage backend plugin that integrates towards Kubernetes", "backstage": { "role": "backend-plugin", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index 94f9e3ee52..38dd2155a5 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-react@0.5.17-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.0.34 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 4455308bf4..876986e001 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.34", + "version": "0.0.35-next.0", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-node/CHANGELOG.md b/plugins/kubernetes-node/CHANGELOG.md index 0c8087afaf..f902343fae 100644 --- a/plugins/kubernetes-node/CHANGELOG.md +++ b/plugins/kubernetes-node/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes-node +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10 + ## 0.4.1 ### Patch Changes diff --git a/plugins/kubernetes-node/package.json b/plugins/kubernetes-node/package.json index b56016e044..6b4ff1650d 100644 --- a/plugins/kubernetes-node/package.json +++ b/plugins/kubernetes-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-node", - "version": "0.4.1", + "version": "0.4.2-next.0", "description": "Node.js library for the kubernetes plugin", "backstage": { "role": "node-library", diff --git a/plugins/kubernetes-react/CHANGELOG.md b/plugins/kubernetes-react/CHANGELOG.md index a1f5092472..bc698a616c 100644 --- a/plugins/kubernetes-react/CHANGELOG.md +++ b/plugins/kubernetes-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-kubernetes-react +## 0.5.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10 + ## 0.5.16 ### Patch Changes diff --git a/plugins/kubernetes-react/package.json b/plugins/kubernetes-react/package.json index d4b61ef75a..abed58b6e7 100644 --- a/plugins/kubernetes-react/package.json +++ b/plugins/kubernetes-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-react", - "version": "0.5.16", + "version": "0.5.17-next.0", "description": "Web library for the kubernetes-react plugin", "backstage": { "role": "web-library", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 01779f7b6e..8e4cd54658 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes +## 0.12.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-react@0.5.17-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.12.16 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 92e2c83244..b43665e711 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.16", + "version": "0.12.17-next.0", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/mcp-actions-backend/CHANGELOG.md b/plugins/mcp-actions-backend/CHANGELOG.md index 87e5def870..9cccc03c2f 100644 --- a/plugins/mcp-actions-backend/CHANGELOG.md +++ b/plugins/mcp-actions-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-mcp-actions-backend +## 0.1.10-next.0 + +### Patch Changes + +- dc81af1: Adds two new metrics to track MCP server operations and sessions. + + - `mcp.server.operation.duration`: The duration taken to process an individual MCP operation + - `mcp.server.session.duration`: The duration of the MCP session from the perspective of the server + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.1.9 ### Patch Changes diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index 71129e8589..6d66add868 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mcp-actions-backend", - "version": "0.1.9", + "version": "0.1.10-next.0", "backstage": { "role": "backend-plugin", "pluginId": "mcp-actions", diff --git a/plugins/mui-to-bui/CHANGELOG.md b/plugins/mui-to-bui/CHANGELOG.md index ad24084330..6164b75fd5 100644 --- a/plugins/mui-to-bui/CHANGELOG.md +++ b/plugins/mui-to-bui/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-mui-to-bui +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + ## 0.2.4 ### Patch Changes diff --git a/plugins/mui-to-bui/package.json b/plugins/mui-to-bui/package.json index de5334e46c..c9d563aa94 100644 --- a/plugins/mui-to-bui/package.json +++ b/plugins/mui-to-bui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mui-to-bui", - "version": "0.2.4", + "version": "0.2.5-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "mui-to-bui", diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md index 8032c0448a..d39ec31c88 100644 --- a/plugins/notifications-backend-module-email/CHANGELOG.md +++ b/plugins/notifications-backend-module-email/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-notifications-backend-module-email +## 0.3.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-notifications-node@0.2.24-next.0 + ## 0.3.18 ### Patch Changes diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index cf57cf11bd..515cbe6409 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-email", - "version": "0.3.18", + "version": "0.3.19-next.0", "description": "The email backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend-module-slack/CHANGELOG.md b/plugins/notifications-backend-module-slack/CHANGELOG.md index 39894a62fb..19ab1967ef 100644 --- a/plugins/notifications-backend-module-slack/CHANGELOG.md +++ b/plugins/notifications-backend-module-slack/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-notifications-backend-module-slack +## 0.4.0-next.0 + +### Minor Changes + +- 749ba60: Add an extension for custom Slack message layouts + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-notifications-node@0.2.24-next.0 + ## 0.3.1 ### Patch Changes diff --git a/plugins/notifications-backend-module-slack/package.json b/plugins/notifications-backend-module-slack/package.json index 66a9fe6d6f..f8ced6fce5 100644 --- a/plugins/notifications-backend-module-slack/package.json +++ b/plugins/notifications-backend-module-slack/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-slack", - "version": "0.3.1", + "version": "0.4.0-next.0", "description": "The slack backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md index 683d823808..903420657e 100644 --- a/plugins/notifications-backend/CHANGELOG.md +++ b/plugins/notifications-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-notifications-backend +## 0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-notifications-node@0.2.24-next.0 + - @backstage/plugin-signals-node@0.1.29-next.0 + ## 0.6.2 ### Patch Changes diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index be863ed61f..0aebccc5de 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend", - "version": "0.6.2", + "version": "0.6.3-next.0", "backstage": { "role": "backend-plugin", "pluginId": "notifications", diff --git a/plugins/notifications-node/CHANGELOG.md b/plugins/notifications-node/CHANGELOG.md index db2f7c5329..1b569a1493 100644 --- a/plugins/notifications-node/CHANGELOG.md +++ b/plugins/notifications-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-notifications-node +## 0.2.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-signals-node@0.1.29-next.0 + ## 0.2.23 ### Patch Changes diff --git a/plugins/notifications-node/package.json b/plugins/notifications-node/package.json index b1cc1ad49f..87f62a7e3b 100644 --- a/plugins/notifications-node/package.json +++ b/plugins/notifications-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-node", - "version": "0.2.23", + "version": "0.2.24-next.0", "description": "Node.js library for the notifications plugin", "backstage": { "role": "node-library", diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 49b4f3b174..b838b58087 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-notifications +## 0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.2 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-signals-react@0.0.20-next.0 + ## 0.5.14 ### Patch Changes diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index 37beefdab5..891b7f38bc 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.5.14", + "version": "0.5.15-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "notifications", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index d8963590c5..3f468b6339 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-org-react +## 0.1.48-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 0.1.47 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index d96e1b9efe..cc51eb5c1c 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.47", + "version": "0.1.48-next.0", "backstage": { "role": "web-library", "pluginId": "org", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index ecdcefeaa5..a77e649b38 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-org +## 0.6.50-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.6.49 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 9de7bf3536..62a4c9fd1b 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.49", + "version": "0.6.50-next.0", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md index a097f7e4ac..90291ecb49 100644 --- a/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md +++ b/plugins/permission-backend-module-policy-allow-all/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-permission-backend-module-allow-all-policy +## 0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 0.2.16 ### Patch Changes diff --git a/plugins/permission-backend-module-policy-allow-all/package.json b/plugins/permission-backend-module-policy-allow-all/package.json index 01cd3cb2e8..9038d05635 100644 --- a/plugins/permission-backend-module-policy-allow-all/package.json +++ b/plugins/permission-backend-module-policy-allow-all/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend-module-allow-all-policy", - "version": "0.2.16", + "version": "0.2.17-next.0", "description": "Allow all policy backend module for the permission plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md index 3d4730cfbd..53754d5674 100644 --- a/plugins/permission-backend/CHANGELOG.md +++ b/plugins/permission-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-permission-backend +## 0.7.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 0.7.9 ### Patch Changes diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 9d1bbcfe1f..9a79b28680 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.7.9", + "version": "0.7.10-next.0", "backstage": { "role": "backend-plugin", "pluginId": "permission", diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md index 4a6d9f7086..6105e5af1d 100644 --- a/plugins/permission-node/CHANGELOG.md +++ b/plugins/permission-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-permission-node +## 0.10.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-permission-common@0.9.6 + ## 0.10.10 ### Patch Changes diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index b9b992cb14..2d9372559b 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-node", - "version": "0.10.10", + "version": "0.10.11-next.0", "description": "Common permission and authorization utilities for backend plugins", "backstage": { "role": "node-library", diff --git a/plugins/permission-react/CHANGELOG.md b/plugins/permission-react/CHANGELOG.md index 5ffd696728..ccdb6b5e22 100644 --- a/plugins/permission-react/CHANGELOG.md +++ b/plugins/permission-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-permission-react +## 0.4.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-permission-common@0.9.6 + ## 0.4.40 ### Patch Changes diff --git a/plugins/permission-react/package.json b/plugins/permission-react/package.json index 3c62e2c853..eb98150e64 100644 --- a/plugins/permission-react/package.json +++ b/plugins/permission-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-react", - "version": "0.4.40", + "version": "0.4.41-next.0", "backstage": { "role": "web-library", "pluginId": "permission", diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index c8d4e78489..c98b874891 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-proxy-backend +## 0.6.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-proxy-node@0.1.13-next.0 + ## 0.6.10 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index f813c858d4..e1485befc7 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-proxy-backend", - "version": "0.6.10", + "version": "0.6.11-next.0", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", "backstage": { "role": "backend-plugin", diff --git a/plugins/proxy-node/CHANGELOG.md b/plugins/proxy-node/CHANGELOG.md index 0a88dfc7fe..e27731f61c 100644 --- a/plugins/proxy-node/CHANGELOG.md +++ b/plugins/proxy-node/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-proxy-node +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + ## 0.1.12 ### Patch Changes diff --git a/plugins/proxy-node/package.json b/plugins/proxy-node/package.json index 378af6e3ff..e3da75c78c 100644 --- a/plugins/proxy-node/package.json +++ b/plugins/proxy-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-proxy-node", - "version": "0.1.12", + "version": "0.1.13-next.0", "description": "The plugin-proxy-node module for @backstage/plugin-proxy-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index 69bf4716e1..27b6f2e934 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.2.18 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index 2c88b0d1e3..a5735fa15c 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.2.18", + "version": "0.2.19-next.0", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index b707fd65eb..ee15ba6f59 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-bitbucket-cloud-common@0.3.8-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.3.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index a1701d704f..c57240f97b 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.3.3", + "version": "0.3.4-next.0", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index 1cd3c24adc..cba6cdc118 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.2.18 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 38881b8d44..6b813c33cf 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.2.18", + "version": "0.2.19-next.0", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md index 7fe5027422..286dcbece7 100644 --- a/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket +## 0.3.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.4-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.19-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.3.19 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket/package.json b/plugins/scaffolder-backend-module-bitbucket/package.json index 31ef4d0a94..d048f9dcc9 100644 --- a/plugins/scaffolder-backend-module-bitbucket/package.json +++ b/plugins/scaffolder-backend-module-bitbucket/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket", - "version": "0.3.19", + "version": "0.3.20-next.0", "description": "The bitbucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 7d935f288c..585925ca27 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.3.18 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 37494f321e..69bcd089c0 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.3.18", + "version": "0.3.19-next.0", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index aae0ad9a09..55d0e78017 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.3-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.3.20 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 85d9b6a61f..b1cb303441 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.3.20", + "version": "0.3.21-next.0", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md index 558c8af8a3..bf9c2606fe 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.2.18 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index 2a30a03b54..f2c354feaf 100644 --- a/plugins/scaffolder-backend-module-gcp/package.json +++ b/plugins/scaffolder-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gcp", - "version": "0.2.18", + "version": "0.2.19-next.0", "description": "The GCP Bucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index f0ca02b932..c300740667 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.2.18 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index 91fb27faad..d16e7fdc29 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.2.18", + "version": "0.2.19-next.0", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index d9a2504e73..c8d640494f 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.2.18 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index 28c565b481..693e9560f2 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.2.18", + "version": "0.2.19-next.0", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index ae8efce7ad..567787aeb7 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.9.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.9.6 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index f1b8bd053d..1b599c8558 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.9.6", + "version": "0.9.7-next.0", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index 9062c4316a..c6a07bd53a 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.11.4-next.0 + +### Patch Changes + +- 5730c8e: Added `maskedAndHidden` option to `gitlab:projectVariable:create` and `publish:gitlab` action to support creating GitLab project variables that are both masked and hidden. Updated gitbeaker to version 43.8.0 for proper type support. +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.11.3 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index a4e123682e..558de71045 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.11.3", + "version": "0.11.4-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index 37ee4d20db..84c719266e 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-notifications-node@0.2.24-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.1.19 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index b364d93ef7..5dd0a94d32 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.1.19", + "version": "0.1.20-next.0", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 5b7036235b..e7590507a9 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.5.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.5.18 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 0ec751cde4..73b18d7daa 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.5.18", + "version": "0.5.19-next.0", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index 4f53ef6710..b42cf8bb61 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.3.1 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index d084c92eb6..96484013a8 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.3.1", + "version": "0.3.2-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 89b05fc273..7f5bf1a9a2 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.4.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + - @backstage/plugin-scaffolder-node-test-utils@0.3.9-next.0 + ## 0.4.19 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 4302bfb29c..8b41d9a053 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.4.19", + "version": "0.4.20-next.0", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index e3e87f80ff..460664fc2e 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-backend +## 3.1.4-next.0 + +### Patch Changes + +- 4e39e63: Removed unused dependencies +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 3.1.3 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index d26941076a..64e8ce29e7 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "3.1.3", + "version": "3.1.4-next.0", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 66a2dc78fc..80bc88bbe5 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-common +## 1.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + ## 1.7.6 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index 55ca47472e..98520a4381 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-common", - "version": "1.7.6", + "version": "1.7.7-next.0", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index 95204f458e..1f93005bfe 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-test-utils@1.11.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.6-next.0 + ## 0.3.8 ### Patch Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index f9eb2af520..57686d0b6a 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node-test-utils", - "version": "0.3.8", + "version": "0.3.9-next.0", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index ca84b88546..506640c822 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-node +## 0.12.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + ## 0.12.5 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 1c3147ab2f..44924831cb 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.12.5", + "version": "0.12.6-next.0", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index c8dc8208fa..56e46e55ac 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-scaffolder-react +## 1.19.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + ## 1.19.7 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index ad95d45ace..8738088664 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.19.7", + "version": "1.19.8-next.0", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 3fcd488f9a..c321001bd3 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-scaffolder +## 1.35.5-next.0 + +### Patch Changes + +- bd5b842: Added a new `ui:autoSelect` option to the EntityPicker field that controls whether an entity is automatically selected when the field loses focus. When set to `false`, the field will remain empty if the user closes it without explicitly selecting an entity, preventing unintentional selections. Defaults to `true` for backward compatibility. +- ee87720: Added back the `formFieldsApiRef` and `ScaffolderFormFieldsApi` alpha exports that were unintentionally removed. +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-scaffolder-common@1.7.7-next.0 + - @backstage/plugin-scaffolder-react@1.19.8-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 1.35.3 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index b69cea955b..a36b5016e4 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.35.3", + "version": "1.35.5-next.0", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index 8fb7cf396c..eb5fcd9b28 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-catalog +## 0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 0.3.12 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index 8e3a58a003..d6b3318020 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-catalog", - "version": "0.3.12", + "version": "0.3.13-next.0", "description": "A module for the search backend that exports catalog modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-elasticsearch/CHANGELOG.md b/plugins/search-backend-module-elasticsearch/CHANGELOG.md index a5db94bfb0..fa550ad601 100644 --- a/plugins/search-backend-module-elasticsearch/CHANGELOG.md +++ b/plugins/search-backend-module-elasticsearch/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-module-elasticsearch +## 1.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 1.8.0 ### Minor Changes diff --git a/plugins/search-backend-module-elasticsearch/package.json b/plugins/search-backend-module-elasticsearch/package.json index 6cbd4133a5..0f64dda6a9 100644 --- a/plugins/search-backend-module-elasticsearch/package.json +++ b/plugins/search-backend-module-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-elasticsearch", - "version": "1.8.0", + "version": "1.8.1-next.0", "description": "A module for the search backend that implements search using ElasticSearch", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-explore/CHANGELOG.md b/plugins/search-backend-module-explore/CHANGELOG.md index 1d8db5cf83..501a052f05 100644 --- a/plugins/search-backend-module-explore/CHANGELOG.md +++ b/plugins/search-backend-module-explore/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-explore +## 0.3.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 0.3.11 ### Patch Changes diff --git a/plugins/search-backend-module-explore/package.json b/plugins/search-backend-module-explore/package.json index 6a2c89e334..5185962af0 100644 --- a/plugins/search-backend-module-explore/package.json +++ b/plugins/search-backend-module-explore/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-explore", - "version": "0.3.11", + "version": "0.3.12-next.0", "description": "A module for the search backend that exports explore modules", "backstage": { "moved": "@backstage-community/plugin-search-backend-module-explore", diff --git a/plugins/search-backend-module-pg/CHANGELOG.md b/plugins/search-backend-module-pg/CHANGELOG.md index de608e769e..f76197bf7f 100644 --- a/plugins/search-backend-module-pg/CHANGELOG.md +++ b/plugins/search-backend-module-pg/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-pg +## 0.5.53-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 0.5.52 ### Patch Changes diff --git a/plugins/search-backend-module-pg/package.json b/plugins/search-backend-module-pg/package.json index 74688066e1..28ad927826 100644 --- a/plugins/search-backend-module-pg/package.json +++ b/plugins/search-backend-module-pg/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-pg", - "version": "0.5.52", + "version": "0.5.53-next.0", "description": "A module for the search backend that implements search using PostgreSQL", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md index 89061fca05..60a6719132 100644 --- a/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md +++ b/plugins/search-backend-module-stack-overflow-collator/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-search-backend-module-stack-overflow-collator +## 0.3.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 0.3.17 ### Patch Changes diff --git a/plugins/search-backend-module-stack-overflow-collator/package.json b/plugins/search-backend-module-stack-overflow-collator/package.json index 8500b396f5..c5c8ba0218 100644 --- a/plugins/search-backend-module-stack-overflow-collator/package.json +++ b/plugins/search-backend-module-stack-overflow-collator/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-stack-overflow-collator", - "version": "0.3.17", + "version": "0.3.18-next.0", "description": "A module for the search backend that exports stack overflow modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index dc4aac2f8a..b445ae0477 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.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-node@1.14.3-next.0 + ## 0.4.11 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index a9e845030c..b85abc2715 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.11", + "version": "0.4.12-next.0", "description": "A module for the search backend that exports techdocs modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-node/CHANGELOG.md b/plugins/search-backend-node/CHANGELOG.md index 35bb537506..ba1c8f1197 100644 --- a/plugins/search-backend-node/CHANGELOG.md +++ b/plugins/search-backend-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-search-backend-node +## 1.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-common@1.2.22 + ## 1.4.1 ### Patch Changes diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 4d80beabb9..32bfd43019 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-node", - "version": "1.4.1", + "version": "1.4.2-next.0", "description": "A library for Backstage backend plugins that want to interact with the search backend plugin", "backstage": { "role": "node-library", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index 36d4330543..0b18e1ccce 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-search-backend +## 2.0.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 2.0.12 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 28070714b5..4c4739e967 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.12", + "version": "2.0.13-next.0", "description": "The Backstage backend plugin that provides your backstage app with search", "backstage": { "role": "backend-plugin", diff --git a/plugins/search-react/CHANGELOG.md b/plugins/search-react/CHANGELOG.md index e9668c0f6a..53739b9a14 100644 --- a/plugins/search-react/CHANGELOG.md +++ b/plugins/search-react/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-search-react +## 1.10.5-next.0 + +### Patch Changes + +- d5eb954: Fixes the search component not registering the first search on navigate to the search page. +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-search-common@1.2.22 + ## 1.10.3 ### Patch Changes diff --git a/plugins/search-react/package.json b/plugins/search-react/package.json index 76b575b5c9..b7a5a99bff 100644 --- a/plugins/search-react/package.json +++ b/plugins/search-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-react", - "version": "1.10.3", + "version": "1.10.5-next.0", "backstage": { "role": "web-library", "pluginId": "search", diff --git a/plugins/search/CHANGELOG.md b/plugins/search/CHANGELOG.md index 67d6d87ed6..93711e086f 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search +## 1.6.2-next.0 + +### Patch Changes + +- d5eb954: Fixes the search component not registering the first search on navigate to the search page. +- Updated dependencies + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-search-common@1.2.22 + ## 1.6.0 ### Minor Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index 0ab2bd3511..e65a07c145 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.6.0", + "version": "1.6.2-next.0", "description": "The Backstage plugin that provides your backstage app with search", "backstage": { "role": "frontend-plugin", diff --git a/plugins/signals-backend/CHANGELOG.md b/plugins/signals-backend/CHANGELOG.md index 9ab368e27d..a9a76f761f 100644 --- a/plugins/signals-backend/CHANGELOG.md +++ b/plugins/signals-backend/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-signals-backend +## 0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-signals-node@0.1.29-next.0 + ## 0.3.12 ### Patch Changes diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index 456607f2ea..df7ef8c99f 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-backend", - "version": "0.3.12", + "version": "0.3.13-next.0", "backstage": { "role": "backend-plugin", "pluginId": "signals", diff --git a/plugins/signals-node/CHANGELOG.md b/plugins/signals-node/CHANGELOG.md index 94b0a03575..cc28371c6a 100644 --- a/plugins/signals-node/CHANGELOG.md +++ b/plugins/signals-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-signals-node +## 0.1.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.1.28 ### Patch Changes diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json index 7453a7ed0f..ee254ef5e8 100644 --- a/plugins/signals-node/package.json +++ b/plugins/signals-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-node", - "version": "0.1.28", + "version": "0.1.29-next.0", "description": "Node.js library for the signals plugin", "backstage": { "role": "node-library", diff --git a/plugins/signals-react/CHANGELOG.md b/plugins/signals-react/CHANGELOG.md index 8509cc043d..c21647cc29 100644 --- a/plugins/signals-react/CHANGELOG.md +++ b/plugins/signals-react/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-signals-react +## 0.0.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/types@1.2.2 + ## 0.0.19 ### Patch Changes diff --git a/plugins/signals-react/package.json b/plugins/signals-react/package.json index a24132d283..12723e0bf3 100644 --- a/plugins/signals-react/package.json +++ b/plugins/signals-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals-react", - "version": "0.0.19", + "version": "0.0.20-next.0", "description": "Web library for the signals plugin", "backstage": { "role": "web-library", diff --git a/plugins/signals/CHANGELOG.md b/plugins/signals/CHANGELOG.md index 85073ae23f..d135b27ade 100644 --- a/plugins/signals/CHANGELOG.md +++ b/plugins/signals/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-signals +## 0.0.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.20-next.0 + ## 0.0.28 ### Patch Changes diff --git a/plugins/signals/package.json b/plugins/signals/package.json index 962b1b6fda..4f390f1ddc 100644 --- a/plugins/signals/package.json +++ b/plugins/signals/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-signals", - "version": "0.0.28", + "version": "0.0.29-next.0", "backstage": { "role": "frontend-plugin", "pluginId": "signals", diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index 988bbd7dbf..c7ceb95718 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 +## 2.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-catalog@1.33.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/plugin-techdocs@1.17.1-next.0 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 2.0.2 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 03e7809f22..639fc90db1 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": "2.0.2", + "version": "2.0.3-next.0", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index 8d7934b086..a75cfe6671 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-techdocs-backend +## 2.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/plugin-catalog-node@2.1.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-techdocs-node@1.14.3-next.0 + ## 2.1.5 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index f128a954db..31d6797f15 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "2.1.5", + "version": "2.1.6-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/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index 617c97aed0..da2ac1bcb7 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 1.1.33 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index d7819741bc..86ef3743a0 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.33", + "version": "1.1.34-next.0", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index da459e9bd2..fd02995625 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-techdocs-node +## 1.14.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.14.2 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index f4e4cd930d..163e8d3c12 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.14.2", + "version": "1.14.3-next.0", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library", diff --git a/plugins/techdocs-react/CHANGELOG.md b/plugins/techdocs-react/CHANGELOG.md index 8981a5df01..bca81bc172 100644 --- a/plugins/techdocs-react/CHANGELOG.md +++ b/plugins/techdocs-react/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-techdocs-react +## 1.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.3.8 ### Patch Changes diff --git a/plugins/techdocs-react/package.json b/plugins/techdocs-react/package.json index e44b42417c..51acffebcc 100644 --- a/plugins/techdocs-react/package.json +++ b/plugins/techdocs-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-react", - "version": "1.3.8", + "version": "1.3.9-next.0", "description": "Shared frontend utilities for TechDocs and Addons", "backstage": { "role": "web-library", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 0572da3823..0a636c06f2 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-techdocs +## 1.17.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration@1.21.0-next.0 + - @backstage/catalog-client@1.13.1-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 1.17.0 ### Minor Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 7852273cdb..91c49699ea 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.17.0", + "version": "1.17.1-next.0", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", diff --git a/plugins/user-settings-backend/CHANGELOG.md b/plugins/user-settings-backend/CHANGELOG.md index 1b21b58172..6149ad3704 100644 --- a/plugins/user-settings-backend/CHANGELOG.md +++ b/plugins/user-settings-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-user-settings-backend +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.14-next.0 + - @backstage/plugin-signals-node@0.1.29-next.0 + - @backstage/plugin-user-settings-common@0.1.0 + ## 0.4.0 ### Minor Changes diff --git a/plugins/user-settings-backend/package.json b/plugins/user-settings-backend/package.json index f96e813330..0dd097def1 100644 --- a/plugins/user-settings-backend/package.json +++ b/plugins/user-settings-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings-backend", - "version": "0.4.0", + "version": "0.4.1-next.0", "description": "The Backstage backend plugin to manage user settings", "backstage": { "role": "backend-plugin", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 0401f61fab..46a1ed955e 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-user-settings +## 0.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-react@2.0.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.20-next.0 + - @backstage/plugin-user-settings-common@0.1.0 + ## 0.9.0 ### Minor Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 4178d04a39..8dbc35fd40 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings", - "version": "0.9.0", + "version": "0.9.1-next.0", "description": "A Backstage plugin that provides a settings page", "backstage": { "role": "frontend-plugin", From 6a1c9550b5ae34e37a834f3ae7fad0a214e73905 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 21:01:03 +0100 Subject: [PATCH 207/455] repo: migrate to AGENTS.md Move agent instructions from `.github/copilot-instructions.md` to `AGENTS.md` at the repo root for broader AI agent tool compatibility, and remove the Cursor rule that pointed at the old file. Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor --- .cursor/rules/general.mdc | 7 ----- .github/copilot-instructions.md | 46 --------------------------------- AGENTS.md | 45 ++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 53 deletions(-) delete mode 100644 .cursor/rules/general.mdc create mode 100644 AGENTS.md diff --git a/.cursor/rules/general.mdc b/.cursor/rules/general.mdc deleted file mode 100644 index 3a81a0cb5f..0000000000 --- a/.cursor/rules/general.mdc +++ /dev/null @@ -1,7 +0,0 @@ ---- -description: General project guidelines for Backstage development -globs: -alwaysApply: true ---- - -Follow the instructions at /.github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 2157025b7b..9ded15067a 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,49 +1,3 @@ -Backstage is an open platform for building developer portals. This is a TypeScript monorepo using Yarn workspaces. - -## Key Directories - -- `/packages`: Core framework packages (prefixed `@backstage/`) -- `/plugins`: Plugin packages (prefixed `@backstage/plugin-*`) -- `/packages/app` and `/packages/backend`: Example app for local development -- `/packages/app`: Main example app using the new frontend system -- `/packages/app-legacy`: Example app using the old frontend system -- `/docs`: Documentation files - -Packages prefixed with `core-` (e.g., `@backstage/core-plugin-api`) are part of the old frontend system. Packages prefixed with `frontend-` (e.g., `@backstage/frontend-plugin-api`) are part of the new frontend system (NFS). Packages prefixed with `backend-` (e.g., `@backstage/backend-plugin-api`) are part of the backend system. - -## Code Standards - -The following files contain guidelines for the project: - -- `/CONTRIBUTING.md`: comprehensive contribution guidelines. -- `/STYLE.md`: guidelines for code style. -- `/REVIEWING.md`: guidelines for pull requests and writing changesets. -- `/SECURITY.md`: guidelines for security. -- `/docs/architecture-decisions/`: contains the architecture decisions for the project. - -## Development Flow - -Before any of these commands can be run, you need to run `yarn install` in the project root. - -- Build: There is no need to build the project during development, and it is verified automatically in the CI pipeline. -- Test: Use `yarn test --no-watch ` in the project root to run tests. The path can be either a single file or a directory. Always provide a path, avoid running all tests. -- Type checking: Use `yarn tsc` in the project root to run the type checker. -- Code formatting: Use `yarn prettier --write ` to format code. -- Lint: Use `yarn lint --fix` in the project root to run the linter. -- API reports: Before submitting a pull request with changes to any package in the workspace, run `yarn build:api-reports` in the project root to generate API reports for all packages. -- Dev server: Use `yarn start` to run the example app locally (frontend on :3000, backend on :7007). -- Create: Use `yarn new` to scaffold new plugins, packages, or modules. - -You MUST NOT create a release by running `yarn changesets version` or `yarn release` as part of any changes. Releases are created by separate workflows. - -All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher. - -Never update ESLint, Prettier, or TypeScript configuration files unless specifically requested. - -## Repository Structure - -See `/docs/contribute/project-structure.md` for a detailed description of the repository structure. - ## Pull Request Reviews When reviewing a pull request you MUST calculate a priority score between 0 and 100, where a higher score indicates higher priority. You MUST include the score as an HTML comment at the very beginning of the "PR Overview" section, using the following format: ``. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..ebf597cecc --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,45 @@ +Backstage is an open platform for building developer portals. This is a TypeScript monorepo using Yarn workspaces. + +## Key Directories + +- `/packages`: Core framework packages (prefixed `@backstage/`) +- `/plugins`: Plugin packages (prefixed `@backstage/plugin-*`) +- `/packages/app` and `/packages/backend`: Example app for local development +- `/packages/app`: Main example app using the new frontend system +- `/packages/app-legacy`: Example app using the old frontend system +- `/docs`: Documentation files + +Packages prefixed with `core-` (e.g., `@backstage/core-plugin-api`) are part of the old frontend system. Packages prefixed with `frontend-` (e.g., `@backstage/frontend-plugin-api`) are part of the new frontend system (NFS). Packages prefixed with `backend-` (e.g., `@backstage/backend-plugin-api`) are part of the backend system. + +## Code Standards + +The following files contain guidelines for the project: + +- `/CONTRIBUTING.md`: comprehensive contribution guidelines. +- `/STYLE.md`: guidelines for code style. +- `/REVIEWING.md`: guidelines for pull requests and writing changesets. +- `/SECURITY.md`: guidelines for security. +- `/docs/architecture-decisions/`: contains the architecture decisions for the project. + +## Development Flow + +Before any of these commands can be run, you need to run `yarn install` in the project root. + +- Build: There is no need to build the project during development, and it is verified automatically in the CI pipeline. +- Test: Use `yarn test --no-watch ` in the project root to run tests. The path can be either a single file or a directory. Always provide a path, avoid running all tests. +- Type checking: Use `yarn tsc` in the project root to run the type checker. +- Code formatting: Use `yarn prettier --write ` to format code. +- Lint: Use `yarn lint --fix` in the project root to run the linter. +- API reports: Before submitting a pull request with changes to any package in the workspace, run `yarn build:api-reports` in the project root to generate API reports for all packages. +- Dev server: Use `yarn start` to run the example app locally (frontend on :3000, backend on :7007). +- Create: Use `yarn new` to scaffold new plugins, packages, or modules. + +You MUST NOT create a release by running `yarn changesets version` or `yarn release` as part of any changes. Releases are created by separate workflows. + +All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher. + +Never update ESLint, Prettier, or TypeScript configuration files unless specifically requested. + +## Repository Structure + +See `/docs/contribute/project-structure.md` for a detailed description of the repository structure. From 410e867616953b001383760ab2f68584a38b5dfe Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 21:12:09 +0100 Subject: [PATCH 208/455] AGENTS.md: some more pointers for changesets and code style Signed-off-by: Patrik Oldsberg --- AGENTS.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index ebf597cecc..b4372229d8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,6 +21,10 @@ The following files contain guidelines for the project: - `/SECURITY.md`: guidelines for security. - `/docs/architecture-decisions/`: contains the architecture decisions for the project. +When writing or generating code, always match the existing coding style of each individual package and file. Different packages in the monorepo may have different conventions — consistency within a package is more important than consistency across the repo. + +When writing or generating tests, prefer fewer thorough tests with multiple assertions over many small tests. When using React Testing Library, prefer using `screen` and `.findBy*` queries over `waitFor`, and avoid adding test IDs to the implementation. + ## Development Flow Before any of these commands can be run, you need to run `yarn install` in the project root. @@ -36,10 +40,14 @@ Before any of these commands can be run, you need to run `yarn install` in the p You MUST NOT create a release by running `yarn changesets version` or `yarn release` as part of any changes. Releases are created by separate workflows. -All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher. +All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory and should be created by writing changeset files directly — never use the changeset CLI. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher. For non-breaking changes, use `minor` for packages at version `1.0.0` or higher, and `patch` for packages below `1.0.0`. Each changeset message should be relevant to the specific package it targets and written for Backstage adopters as the audience — avoid referencing internal implementation details. If a change spans multiple packages you often need to create separate changesets to make sure they are tailored to each package. + +When creating pull requests, use the template at `/.github/PULL_REQUEST_TEMPLATE.md`. Never update ESLint, Prettier, or TypeScript configuration files unless specifically requested. +Never make changes to the release notes in `/docs/releases` unless explicitly asked. These document past releases and should not be updated based on newer changes. + ## Repository Structure See `/docs/contribute/project-structure.md` for a detailed description of the repository structure. From 60cdf5b80cb59826903b50a6e76f4f8d64938a33 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 21:14:27 +0100 Subject: [PATCH 209/455] repo: expand AGENTS.md with additional guidelines Add coding style, testing, changeset, and PR template guidelines. Remove the now-redundant .claude/CLAUDE.md pointer file. Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor --- .claude/CLAUDE.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .claude/CLAUDE.md diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md deleted file mode 100644 index 170a4eb868..0000000000 --- a/.claude/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -Follow the instructions at /.github/copilot-instructions.md From 614f524ace82d77b28def1fcc0dc8c575f8abc90 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 21:48:12 +0100 Subject: [PATCH 210/455] AGENTS.md: minor for significant changes only Signed-off-by: Patrik Oldsberg --- AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index b4372229d8..fc8468b98c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -40,7 +40,7 @@ Before any of these commands can be run, you need to run `yarn install` in the p You MUST NOT create a release by running `yarn changesets version` or `yarn release` as part of any changes. Releases are created by separate workflows. -All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory and should be created by writing changeset files directly — never use the changeset CLI. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher. For non-breaking changes, use `minor` for packages at version `1.0.0` or higher, and `patch` for packages below `1.0.0`. Each changeset message should be relevant to the specific package it targets and written for Backstage adopters as the audience — avoid referencing internal implementation details. If a change spans multiple packages you often need to create separate changesets to make sure they are tailored to each package. +All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory and should be created by writing changeset files directly — never use the changeset CLI. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher. For non-breaking changes that introduce new APIs or features, use `minor` for packages at version `1.0.0` or higher, and `patch` for packages below `1.0.0`. Each changeset message should be relevant to the specific package it targets and written for Backstage adopters as the audience — avoid referencing internal implementation details. If a change spans multiple packages you often need to create separate changesets to make sure they are tailored to each package. When creating pull requests, use the template at `/.github/PULL_REQUEST_TEMPLATE.md`. From 9657061e648b7241089ddb914369581ef493e96d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 21:50:16 +0100 Subject: [PATCH 211/455] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: Patrik Oldsberg --- AGENTS.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index fc8468b98c..001989d9b6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -30,15 +30,15 @@ When writing or generating tests, prefer fewer thorough tests with multiple asse Before any of these commands can be run, you need to run `yarn install` in the project root. - Build: There is no need to build the project during development, and it is verified automatically in the CI pipeline. -- Test: Use `yarn test --no-watch ` in the project root to run tests. The path can be either a single file or a directory. Always provide a path, avoid running all tests. -- Type checking: Use `yarn tsc` in the project root to run the type checker. -- Code formatting: Use `yarn prettier --write ` to format code. +- Test: Use `CI=1 yarn test ` in the project root to run tests. The path can be either a single file or a directory. Always provide a path, avoid running all tests. +- Type checking: Use `yarn tsc` in the project root to run the type checker. Do not try to run it somewhere else than the project root and do not supply any options. +- Code formatting: Use `yarn prettier --write <...paths>` to format code. Run it explicitly for file paths that you know are changed, not for entire folders - otherwise it may change formatting of unrelated files. - Lint: Use `yarn lint --fix` in the project root to run the linter. - API reports: Before submitting a pull request with changes to any package in the workspace, run `yarn build:api-reports` in the project root to generate API reports for all packages. - Dev server: Use `yarn start` to run the example app locally (frontend on :3000, backend on :7007). - Create: Use `yarn new` to scaffold new plugins, packages, or modules. -You MUST NOT create a release by running `yarn changesets version` or `yarn release` as part of any changes. Releases are created by separate workflows. +You MUST NOT run builds or create a release by running `yarn build`, `yarn changesets version`, or `yarn release` as part of any changes. Builds and releases are made by separate workflows. All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory and should be created by writing changeset files directly — never use the changeset CLI. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher. For non-breaking changes that introduce new APIs or features, use `minor` for packages at version `1.0.0` or higher, and `patch` for packages below `1.0.0`. Each changeset message should be relevant to the specific package it targets and written for Backstage adopters as the audience — avoid referencing internal implementation details. If a change spans multiple packages you often need to create separate changesets to make sure they are tailored to each package. From e44b6a9079a0d64dc9b3020485eebbd63dd7bd0c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 13:21:41 +0100 Subject: [PATCH 212/455] cli-common: Remove unused `findOwnDir` and validate `findOwnRootDir` Addresses review feedback from PR #32939: - Remove the `findOwnDir` function which is no longer needed - Add validation to `findOwnRootDir` to verify the resolved path actually contains a monorepo root with a `package.json` that has a `workspaces` field Signed-off-by: Patrik Oldsberg --- .changeset/clean-up-own-root-dir.md | 5 +++++ packages/cli-common/src/paths.test.ts | 10 +++++----- packages/cli-common/src/paths.ts | 23 +++++++++++++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 .changeset/clean-up-own-root-dir.md diff --git a/.changeset/clean-up-own-root-dir.md b/.changeset/clean-up-own-root-dir.md new file mode 100644 index 0000000000..e702330140 --- /dev/null +++ b/.changeset/clean-up-own-root-dir.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli-common': patch +--- + +The `findOwnRootDir` utility now searches for the monorepo root by traversing up the directory tree looking for a `package.json` with `workspaces`, instead of assuming a fixed `../..` relative path. diff --git a/packages/cli-common/src/paths.test.ts b/packages/cli-common/src/paths.test.ts index 6ade904e12..d54dd8838b 100644 --- a/packages/cli-common/src/paths.test.ts +++ b/packages/cli-common/src/paths.test.ts @@ -16,18 +16,18 @@ /* eslint-disable no-restricted-syntax */ import { resolve as resolvePath } from 'node:path'; -import { findPaths, findRootPath, findOwnDir, findOwnRootDir } from './paths'; +import { findPaths, findRootPath, findOwnRootDir, findOwnPaths } from './paths'; describe('paths', () => { afterEach(() => { jest.restoreAllMocks(); }); - it('findOwnDir and findOwnRootDir should find owns paths', () => { - const dir = findOwnDir(__dirname); - const root = findOwnRootDir(dir); + it('findOwnPaths and findOwnRootDir should find own paths', () => { + const own = findOwnPaths(__dirname); + const root = findOwnRootDir(own.dir); - expect(dir).toBe(resolvePath(__dirname, '..')); + expect(own.dir).toBe(resolvePath(__dirname, '..')); expect(root).toBe(resolvePath(__dirname, '../../..')); }); diff --git a/packages/cli-common/src/paths.ts b/packages/cli-common/src/paths.ts index 1cd84d4f5b..c6bedc77e4 100644 --- a/packages/cli-common/src/paths.ts +++ b/packages/cli-common/src/paths.ts @@ -119,7 +119,23 @@ export function findOwnRootDir(ownDir: string) { ); } - return resolvePath(ownDir, '../..'); + const rootDir = findRootPath(ownDir, pkgJsonPath => { + try { + const content = fs.readFileSync(pkgJsonPath, 'utf8'); + const data = JSON.parse(content); + return Boolean(data.workspaces); + } catch (error) { + throw new Error( + `Failed to read package.json at '${pkgJsonPath}', ${error}`, + ); + } + }); + + if (!rootDir) { + throw new Error(`No monorepo root found when searching from '${ownDir}'`); + } + + return rootDir; } // Hierarchical directory cache shared across all OwnPathsImpl instances. @@ -199,11 +215,6 @@ class OwnPathsImpl implements OwnPaths { }; } -// Finds the root of a given package -export function findOwnDir(searchDir: string) { - return OwnPathsImpl.findDir(searchDir); -} - // Used by the test utility in testUtils.ts to override targetPaths export let targetPathsOverride: TargetPaths | undefined; From 560f5876453fab5c92d885a9f351218587328262 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 21:57:52 +0100 Subject: [PATCH 213/455] repo: symlink .claude/CLAUDE.md to AGENTS.md Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor --- .claude/CLAUDE.md | 1 + 1 file changed, 1 insertion(+) create mode 120000 .claude/CLAUDE.md diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 120000 index 0000000000..be77ac83a1 --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1 @@ +../AGENTS.md \ No newline at end of file From 59824058ff5c61705ec8fdb1ccde85235e778fbd Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 22:21:11 +0100 Subject: [PATCH 214/455] retrigger CI Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor From c7eb58261dc2e77be372661b91303783099302d5 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 24 Feb 2026 23:55:15 +0100 Subject: [PATCH 215/455] Update .changeset/clean-up-own-root-dir.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Patrik Oldsberg --- .changeset/clean-up-own-root-dir.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/clean-up-own-root-dir.md b/.changeset/clean-up-own-root-dir.md index e702330140..c668073688 100644 --- a/.changeset/clean-up-own-root-dir.md +++ b/.changeset/clean-up-own-root-dir.md @@ -2,4 +2,4 @@ '@backstage/cli-common': patch --- -The `findOwnRootDir` utility now searches for the monorepo root by traversing up the directory tree looking for a `package.json` with `workspaces`, instead of assuming a fixed `../..` relative path. +The `findOwnRootDir` utility now searches for the monorepo root by traversing up the directory tree looking for a `package.json` with `workspaces`, instead of assuming a fixed `../..` relative path. If no workspaces root is found during this traversal, `findOwnRootDir` now throws to enforce stricter validation of the repository layout. From 2e1f98b687ffed78c51c5431acaff2e2718cc34b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 05:24:30 +0000 Subject: [PATCH 216/455] build(deps): bump minimatch from 3.1.2 to 10.2.3 Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.1.2 to 10.2.3. - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v10.2.3) --- updated-dependencies: - dependency-name: minimatch dependency-version: 10.2.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 2a41ca71e4..14a3f7453e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39425,7 +39425,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:10.2.1, minimatch@npm:^10.1.1, minimatch@npm:^10.2.0, minimatch@npm:^10.2.1": +"minimatch@npm:10.2.1": version: 10.2.1 resolution: "minimatch@npm:10.2.1" dependencies: @@ -39452,6 +39452,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.1.1, minimatch@npm:^10.2.0, minimatch@npm:^10.2.1": + version: 10.2.3 + resolution: "minimatch@npm:10.2.3" + dependencies: + brace-expansion: "npm:^5.0.2" + checksum: 10/186c6a6ce9f7a79ae7776efc799c32d1a6670ebbcc2a8756e6cb6ec4aab7439a6ca6e592e1a6aac5f21674eefae5b19821b8fa95072a4f4567da1ae40eb6075d + languageName: node + linkType: hard + "minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": version: 5.1.6 resolution: "minimatch@npm:5.1.6" From bf14b6e877cd197c1fa28d0d8ff7aa53601aedd8 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Wed, 25 Feb 2026 08:37:48 +0000 Subject: [PATCH 217/455] Update chatty-wasps-sink.md Signed-off-by: Charles de Dreuille --- .changeset/chatty-wasps-sink.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.changeset/chatty-wasps-sink.md b/.changeset/chatty-wasps-sink.md index 4b9d5d3525..7f12c5372c 100644 --- a/.changeset/chatty-wasps-sink.md +++ b/.changeset/chatty-wasps-sink.md @@ -3,3 +3,5 @@ --- Removed the `transition` on `Container` padding to prevent an unwanted animation when the viewport is resized. + +Affected components: Container From b42fcdca2e7c8a520454865645e80274310f23c2 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 24 Feb 2026 12:58:10 +0100 Subject: [PATCH 218/455] feat(ui): replace --bui-bg-popover with layered bg approach Remove the --bui-bg-popover token and adopt a two-layer background pattern across overlay components: outer shell uses --bui-bg-app, inner content uses Box bg="neutral-1". Components updated: Popover, Tooltip, Menu, Dialog. Each component gets a local border-radius CSS variable, a Box content wrapper with neutral-1 background, and updated arrow fills where applicable. Story "is open" variants for each component now use a dot-grid background pattern to detect background transparency issues in Chromatic snapshots. Signed-off-by: Johan Persson --- .changeset/early-baboons-roll.md | 16 ++ docs/conf/user-interface/index.md | 1 - packages/ui/report.api.md | 3 + .../src/components/Dialog/Dialog.module.css | 13 +- .../src/components/Dialog/Dialog.stories.tsx | 18 ++ packages/ui/src/components/Dialog/Dialog.tsx | 8 +- .../ui/src/components/Dialog/definition.ts | 1 + .../ui/src/components/Menu/Menu.module.css | 9 +- .../ui/src/components/Menu/Menu.stories.tsx | 18 ++ packages/ui/src/components/Menu/Menu.tsx | 213 ++++++++++-------- packages/ui/src/components/Menu/definition.ts | 1 + .../src/components/Popover/Popover.module.css | 15 +- .../components/Popover/Popover.stories.tsx | 22 ++ .../ui/src/components/Popover/Popover.tsx | 20 +- .../src/components/Tooltip/Tooltip.module.css | 20 +- .../components/Tooltip/Tooltip.stories.tsx | 18 ++ .../ui/src/components/Tooltip/Tooltip.tsx | 22 +- .../ui/src/components/Tooltip/definition.ts | 1 + packages/ui/src/css/tokens.css | 2 - 19 files changed, 300 insertions(+), 121 deletions(-) create mode 100644 .changeset/early-baboons-roll.md diff --git a/.changeset/early-baboons-roll.md b/.changeset/early-baboons-roll.md new file mode 100644 index 0000000000..bdd55ec507 --- /dev/null +++ b/.changeset/early-baboons-roll.md @@ -0,0 +1,16 @@ +--- +'@backstage/ui': minor +--- + +**BREAKING**: Removed `--bui-bg-popover` CSS token. Popover, Tooltip, Menu, and Dialog now use `--bui-bg-app` for their outer shell and `Box bg="neutral-1"` for content areas, providing better theme consistency and eliminating a redundant token. + +**Migration:** + +Replace any usage of `--bui-bg-popover` with `--bui-bg-neutral-1` (for content surfaces) or `--bui-bg-app` (for outer shells): + +```diff +- background: var(--bui-bg-popover); ++ background: var(--bui-bg-neutral-1); +``` + +**Affected components:** Popover, Tooltip, Menu, Dialog diff --git a/docs/conf/user-interface/index.md b/docs/conf/user-interface/index.md index cb53ebe81c..107fde3d57 100644 --- a/docs/conf/user-interface/index.md +++ b/docs/conf/user-interface/index.md @@ -156,7 +156,6 @@ These colors form a layered neutral scale for your application backgrounds. `--b | Token Name | Description | | ----------------------------- | ------------------------------------------------------------ | | `--bui-bg-app` | The base background color of your Backstage instance. | -| `--bui-bg-popover` | The background color used for popovers, tooltips, and menus. | | `--bui-bg-neutral-1` | First elevated layer. Use for cards, dialogs, and panels. | | `--bui-bg-neutral-1-hover` | Hover state for elements on neutral-1. | | `--bui-bg-neutral-1-pressed` | Pressed state for elements on neutral-1. | diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index 5922155e93..25522f1825 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -897,6 +897,7 @@ export const DialogDefinition: { readonly classNames: { readonly overlay: 'bui-DialogOverlay'; readonly dialog: 'bui-Dialog'; + readonly content: 'bui-DialogContent'; readonly header: 'bui-DialogHeader'; readonly headerTitle: 'bui-DialogHeaderTitle'; readonly body: 'bui-DialogBody'; @@ -1331,6 +1332,7 @@ export const MenuDefinition: { readonly classNames: { readonly root: 'bui-Menu'; readonly popover: 'bui-MenuPopover'; + readonly inner: 'bui-MenuInner'; readonly content: 'bui-MenuContent'; readonly section: 'bui-MenuSection'; readonly sectionHeader: 'bui-MenuSectionHeader'; @@ -2218,6 +2220,7 @@ export const Tooltip: ForwardRefExoticComponent< export const TooltipDefinition: { readonly classNames: { readonly tooltip: 'bui-Tooltip'; + readonly content: 'bui-TooltipContent'; readonly arrow: 'bui-TooltipArrow'; }; }; diff --git a/packages/ui/src/components/Dialog/Dialog.module.css b/packages/ui/src/components/Dialog/Dialog.module.css index f5968820a2..da82509134 100644 --- a/packages/ui/src/components/Dialog/Dialog.module.css +++ b/packages/ui/src/components/Dialog/Dialog.module.css @@ -43,8 +43,10 @@ } .bui-Dialog { - background: var(--bui-bg-popover); - border-radius: 0.5rem; + --dialog-border-radius: 0.5rem; + background: var(--bui-bg-app); + box-shadow: var(--bui-shadow); + border-radius: var(--dialog-border-radius); border: 1px solid var(--bui-border-1); color: var(--bui-fg-primary); position: relative; @@ -52,9 +54,14 @@ max-width: calc(100vw - 3rem); height: min(var(--bui-dialog-min-height, auto), calc(100vh - 3rem)); max-height: calc(100vh - 3rem); + outline: none; + } + + .bui-DialogContent { display: flex; flex-direction: column; - outline: none; + border-radius: var(--dialog-border-radius); + height: 100%; } /* Dialog entering animation */ diff --git a/packages/ui/src/components/Dialog/Dialog.stories.tsx b/packages/ui/src/components/Dialog/Dialog.stories.tsx index 0392959a59..9084bfa7e4 100644 --- a/packages/ui/src/components/Dialog/Dialog.stories.tsx +++ b/packages/ui/src/components/Dialog/Dialog.stories.tsx @@ -63,6 +63,24 @@ export const Default = meta.story({ }); export const Open = Default.extend({ + parameters: { layout: 'fullscreen' }, + decorators: [ + Story => ( +
    + +
    + ), + ], args: { defaultOpen: true, }, diff --git a/packages/ui/src/components/Dialog/Dialog.tsx b/packages/ui/src/components/Dialog/Dialog.tsx index 1c33588306..efdc6c4567 100644 --- a/packages/ui/src/components/Dialog/Dialog.tsx +++ b/packages/ui/src/components/Dialog/Dialog.tsx @@ -33,6 +33,7 @@ import { Button } from '../Button'; import { useStyles } from '../../hooks/useStyles'; import { DialogDefinition } from './definition'; import { Flex } from '../Flex'; +import { Box } from '../Box'; import styles from './Dialog.module.css'; /** @public */ @@ -71,7 +72,12 @@ export const Dialog = forwardRef, DialogProps>( ...style, }} > - {children} + + {children} + ); diff --git a/packages/ui/src/components/Dialog/definition.ts b/packages/ui/src/components/Dialog/definition.ts index d2fcb7bb4d..f9aadc9147 100644 --- a/packages/ui/src/components/Dialog/definition.ts +++ b/packages/ui/src/components/Dialog/definition.ts @@ -24,6 +24,7 @@ export const DialogDefinition = { classNames: { overlay: 'bui-DialogOverlay', dialog: 'bui-Dialog', + content: 'bui-DialogContent', header: 'bui-DialogHeader', headerTitle: 'bui-DialogHeaderTitle', body: 'bui-DialogBody', diff --git a/packages/ui/src/components/Menu/Menu.module.css b/packages/ui/src/components/Menu/Menu.module.css index 6dca183395..0717a9468d 100644 --- a/packages/ui/src/components/Menu/Menu.module.css +++ b/packages/ui/src/components/Menu/Menu.module.css @@ -18,12 +18,13 @@ @layer components { .bui-MenuPopover { + --menu-border-radius: var(--bui-radius-2); display: flex; flex-direction: column; box-shadow: var(--bui-shadow); border: 1px solid var(--bui-border-1); - border-radius: var(--bui-radius-2); - background: var(--bui-bg-popover); + border-radius: var(--menu-border-radius); + background: var(--bui-bg-app); color: var(--bui-fg-primary); outline: none; transition: transform 200ms, opacity 200ms; @@ -55,6 +56,10 @@ } } + .bui-MenuInner { + border-radius: var(--menu-border-radius); + } + .bui-MenuContent { max-height: inherit; box-sizing: border-box; diff --git a/packages/ui/src/components/Menu/Menu.stories.tsx b/packages/ui/src/components/Menu/Menu.stories.tsx index ffe184d4ae..982055ade1 100644 --- a/packages/ui/src/components/Menu/Menu.stories.tsx +++ b/packages/ui/src/components/Menu/Menu.stories.tsx @@ -198,6 +198,24 @@ export const PreviewLinks = meta.story({ }); export const Opened = meta.story({ + parameters: { layout: 'fullscreen' }, + decorators: [ + Story => ( +
    + +
    + ), + ], args: { ...Preview.input.args, }, diff --git a/packages/ui/src/components/Menu/Menu.tsx b/packages/ui/src/components/Menu/Menu.tsx index e02292ba44..da4243f643 100644 --- a/packages/ui/src/components/Menu/Menu.tsx +++ b/packages/ui/src/components/Menu/Menu.tsx @@ -58,6 +58,7 @@ import { } from '../InternalLinkProvider'; import styles from './Menu.module.css'; import clsx from 'clsx'; +import { Box } from '../Box'; const { RoutingProvider, useRoutingRegistrationEffect } = createRoutingRegistration(); @@ -119,18 +120,23 @@ export const Menu = (props: MenuProps) => { )} placement={placement} > - {virtualized ? ( - - {menuContent} - - ) : ( - menuContent - )} + + {virtualized ? ( + + {menuContent} + + ) : ( + menuContent + )} + ); @@ -169,18 +175,23 @@ export const MenuListBox = (props: MenuListBoxProps) => { )} placement={placement} > - {virtualized ? ( - - {listBoxContent} - - ) : ( - listBoxContent - )} + + {virtualized ? ( + + {listBoxContent} + + ) : ( + listBoxContent + )} + ); }; @@ -219,43 +230,48 @@ export const MenuAutocomplete = (props: MenuAutocompleteProps) => { )} placement={placement} > - - + + + + + + + + {virtualized ? ( + + {menuContent} + + ) : ( + menuContent )} - aria-label={props.placeholder || 'Search'} - > - - - - - - {virtualized ? ( - - {menuContent} - - ) : ( - menuContent - )} - + + ); @@ -298,43 +314,48 @@ export const MenuAutocompleteListbox = ( )} placement={placement} > - - + + + + + + + + {virtualized ? ( + + {listBoxContent} + + ) : ( + listBoxContent )} - aria-label={props.placeholder || 'Search'} - > - - - - - - {virtualized ? ( - - {listBoxContent} - - ) : ( - listBoxContent - )} - + + ); }; diff --git a/packages/ui/src/components/Menu/definition.ts b/packages/ui/src/components/Menu/definition.ts index e4ba0d83ab..860ad1d729 100644 --- a/packages/ui/src/components/Menu/definition.ts +++ b/packages/ui/src/components/Menu/definition.ts @@ -24,6 +24,7 @@ export const MenuDefinition = { classNames: { root: 'bui-Menu', popover: 'bui-MenuPopover', + inner: 'bui-MenuInner', content: 'bui-MenuContent', section: 'bui-MenuSection', sectionHeader: 'bui-MenuSectionHeader', diff --git a/packages/ui/src/components/Popover/Popover.module.css b/packages/ui/src/components/Popover/Popover.module.css index 69d2acffcf..cdd323817c 100644 --- a/packages/ui/src/components/Popover/Popover.module.css +++ b/packages/ui/src/components/Popover/Popover.module.css @@ -18,9 +18,10 @@ @layer components { .bui-Popover { + --popover-border-radius: var(--bui-radius-3); box-shadow: var(--bui-shadow); - border-radius: var(--bui-radius-3); - background: var(--bui-bg-popover); + border-radius: var(--popover-border-radius); + background: var(--bui-bg-app); border: 1px solid var(--bui-border-1); forced-color-adjust: none; outline: none; @@ -76,6 +77,7 @@ padding: var(--bui-space-4); flex: 1 1 auto; min-height: 0; + border-radius: var(--popover-border-radius); } .bui-PopoverArrow { @@ -89,11 +91,14 @@ we split the stroke and fill across separate elements in order to guarantee that the stroke is always overlaying a consistent color. */ - path:nth-child(1) { - fill: var(--bui-bg-popover); + use:nth-of-type(1) { + fill: var(--bui-bg-app); + } + use:nth-of-type(2) { + fill: var(--bui-bg-neutral-1); } - path:nth-child(2) { + path { fill: var(--bui-border-1); } diff --git a/packages/ui/src/components/Popover/Popover.stories.tsx b/packages/ui/src/components/Popover/Popover.stories.tsx index ea92bf9d5c..e05b352fc9 100644 --- a/packages/ui/src/components/Popover/Popover.stories.tsx +++ b/packages/ui/src/components/Popover/Popover.stories.tsx @@ -19,6 +19,7 @@ import { Button } from '../Button/Button'; import { DialogTrigger } from '../Dialog/Dialog'; import { Text } from '../Text/Text'; import { Flex } from '../Flex/Flex'; +import { Box } from '../Box'; const meta = preview.meta({ title: 'Backstage UI/Popover', @@ -74,6 +75,24 @@ export const Default = meta.story({ }); export const IsOpen = Default.extend({ + parameters: { layout: 'fullscreen' }, + decorators: [ + Story => ( +
    + +
    + ), + ], args: { isOpen: true, }, @@ -189,6 +208,9 @@ export const WithRichContent = Default.extend({ This is a popover with rich content. It can contain multiple elements and formatted text. + + You can also use the automatic bg system inside it. + - - - - - - + + + + - - Neutral 1 - - - - - - - - - - - Neutral 2 - - - - - - - - - - - Neutral 3 - - - - - - - - + + + + ), @@ -208,20 +146,6 @@ export const Destructive = meta.story({ - - On Neutral 1 - - - - - - Sizes diff --git a/packages/ui/src/components/Container/Container.module.css b/packages/ui/src/components/Container/Container.module.css index ef1d85c66c..b93665525f 100644 --- a/packages/ui/src/components/Container/Container.module.css +++ b/packages/ui/src/components/Container/Container.module.css @@ -21,6 +21,7 @@ max-width: 120rem; padding-inline: var(--bui-space-4); margin-inline: auto; + padding-bottom: var(--bui-space-8); } @media (min-width: 640px) { From 98faba9d21f01a4316d20b37519d71c6841651ce Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 11:17:54 +0100 Subject: [PATCH 221/455] changeset: simplify message to internal refactor Signed-off-by: Patrik Oldsberg --- .changeset/move-clean-pack-to-build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/move-clean-pack-to-build.md b/.changeset/move-clean-pack-to-build.md index 40db4df15a..9f1969ec41 100644 --- a/.changeset/move-clean-pack-to-build.md +++ b/.changeset/move-clean-pack-to-build.md @@ -2,4 +2,4 @@ '@backstage/cli': patch --- -Moved the `clean` and `pack` commands from the internal maintenance module to the build module. +Internal refactor of CLI command modules. From b11c2cd8e21dfbf0db4976f9a973fdf53eccc402 Mon Sep 17 00:00:00 2001 From: djamaile Date: Wed, 25 Feb 2026 10:57:05 +0100 Subject: [PATCH 222/455] feat(catalog-backend-module-github): prefer verified org emails in default user transformer Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: djamaile --- .changeset/github-org-verified-emails.md | 34 +++++ .../src/lib/defaultTransformers.test.ts | 131 ++++++++++++++++++ .../src/lib/defaultTransformers.ts | 7 +- 3 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 .changeset/github-org-verified-emails.md create mode 100644 plugins/catalog-backend-module-github/src/lib/defaultTransformers.test.ts diff --git a/.changeset/github-org-verified-emails.md b/.changeset/github-org-verified-emails.md new file mode 100644 index 0000000000..b825395556 --- /dev/null +++ b/.changeset/github-org-verified-emails.md @@ -0,0 +1,34 @@ +--- +'@backstage/plugin-catalog-backend-module-github': minor +--- + +The default user transformer now prefers organization verified domain emails over the user's public GitHub email when populating the user entity profile. It also strips plus-addressed routing tags that GitHub adds to these emails. + +If you want to retain the old behavior, you can do so with a custom user transformer using the `githubOrgEntityProviderTransformsExtensionPoint`: + +```ts +import { createBackendModule } from '@backstage/backend-plugin-api'; +import { githubOrgEntityProviderTransformsExtensionPoint } from '@backstage/plugin-catalog-backend-module-github-org'; +import { defaultUserTransformer } from '@backstage/plugin-catalog-backend-module-github'; + +export default createBackendModule({ + pluginId: 'catalog', + moduleId: 'github-org-custom-transforms', + register(env) { + env.registerInit({ + deps: { + transforms: githubOrgEntityProviderTransformsExtensionPoint, + }, + async init({ transforms }) { + transforms.setUserTransformer(async (item, ctx) => { + const entity = await defaultUserTransformer(item, ctx); + if (entity && item.email) { + entity.spec.profile!.email = item.email; + } + return entity; + }); + }, + }); + }, +}); +``` diff --git a/plugins/catalog-backend-module-github/src/lib/defaultTransformers.test.ts b/plugins/catalog-backend-module-github/src/lib/defaultTransformers.test.ts new file mode 100644 index 0000000000..f90d67bcc9 --- /dev/null +++ b/plugins/catalog-backend-module-github/src/lib/defaultTransformers.test.ts @@ -0,0 +1,131 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { UserEntity } from '@backstage/catalog-model'; +import { graphql } from '@octokit/graphql'; +import { + defaultUserTransformer, + TransformerContext, +} from './defaultTransformers'; +import { GithubUser } from './github'; + +const ctx: TransformerContext = { + client: graphql, + query: '', + org: 'test-org', +}; + +function makeUser(overrides: Partial = {}): GithubUser { + return { + login: 'testuser', + avatarUrl: '', + ...overrides, + }; +} + +describe('defaultUserTransformer', () => { + it('populates all fields correctly', async () => { + const result = (await defaultUserTransformer( + makeUser({ + name: 'Test User', + email: 'test@example.com', + bio: 'A test bio', + avatarUrl: 'https://example.com/avatar.png', + id: 'user-id-123', + }), + ctx, + )) as UserEntity; + + expect(result.metadata.name).toBe('testuser'); + expect(result.metadata.description).toBe('A test bio'); + expect(result.metadata.annotations).toEqual({ + 'github.com/user-login': 'testuser', + 'github.com/user-id': 'user-id-123', + }); + expect(result.spec.profile).toEqual({ + displayName: 'Test User', + email: 'test@example.com', + picture: 'https://example.com/avatar.png', + }); + expect(result.spec.memberOf).toEqual([]); + }); + + it('prefers verified domain email over regular email', async () => { + const result = (await defaultUserTransformer( + makeUser({ + email: 'public@gmail.com', + organizationVerifiedDomainEmails: ['corp@company.com'], + }), + ctx, + )) as UserEntity; + + expect(result.spec.profile!.email).toBe('corp@company.com'); + }); + + it('strips plus-addressed tag from verified domain email', async () => { + const result = (await defaultUserTransformer( + makeUser({ + organizationVerifiedDomainEmails: ['amckay+2jc29kv2@spotify.com'], + }), + ctx, + )) as UserEntity; + + expect(result.spec.profile!.email).toBe('amckay@spotify.com'); + }); + + it('uses verified domain email when regular email is absent', async () => { + const result = (await defaultUserTransformer( + makeUser({ + organizationVerifiedDomainEmails: ['corp@company.com'], + }), + ctx, + )) as UserEntity; + + expect(result.spec.profile!.email).toBe('corp@company.com'); + }); + + it('falls back to regular email when verified array is empty', async () => { + const result = (await defaultUserTransformer( + makeUser({ + email: 'public@gmail.com', + organizationVerifiedDomainEmails: [], + }), + ctx, + )) as UserEntity; + + expect(result.spec.profile!.email).toBe('public@gmail.com'); + }); + + it('falls back to regular email when verified array is undefined', async () => { + const result = (await defaultUserTransformer( + makeUser({ + email: 'public@gmail.com', + }), + ctx, + )) as UserEntity; + + expect(result.spec.profile!.email).toBe('public@gmail.com'); + }); + + it('sets no email when both are absent', async () => { + const result = (await defaultUserTransformer( + makeUser(), + ctx, + )) as UserEntity; + + expect(result.spec.profile!.email).toBeUndefined(); + }); +}); diff --git a/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts b/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts index 4de9af89c8..d71cda270d 100644 --- a/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts +++ b/plugins/catalog-backend-module-github/src/lib/defaultTransformers.ts @@ -81,7 +81,12 @@ export const defaultUserTransformer = async ( if (item.bio) entity.metadata.description = item.bio; if (item.name) entity.spec.profile!.displayName = item.name; - if (item.email) entity.spec.profile!.email = item.email; + // GitHub returns verified domain emails as plus-addressed routing aliases + // (e.g. user+abc123@example.com). Strip the tag to get the real address. + const email = item.organizationVerifiedDomainEmails?.length + ? item.organizationVerifiedDomainEmails[0].replace(/\+[^@]*/, '') + : item.email; + if (email) entity.spec.profile!.email = email; if (item.avatarUrl) entity.spec.profile!.picture = item.avatarUrl; return entity; }; From 86c424fa8e6c5ea4cb190ad05e66aecdea8dd26d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 11:43:38 +0100 Subject: [PATCH 223/455] chore(cli): move lazy.ts and errors.ts to wiring/ These are CLI framework infrastructure files that belong alongside createCliPlugin and CliInitializer rather than in the general lib/ directory. Signed-off-by: Patrik Oldsberg --- packages/cli/src/modules/build/index.ts | 2 +- packages/cli/src/modules/config/index.ts | 2 +- packages/cli/src/modules/create-github-app/index.ts | 2 +- packages/cli/src/modules/info/index.ts | 2 +- packages/cli/src/modules/lint/index.ts | 2 +- packages/cli/src/modules/maintenance/index.ts | 2 +- packages/cli/src/modules/migrate/index.ts | 2 +- packages/cli/src/modules/new/index.ts | 2 +- packages/cli/src/modules/test/index.ts | 2 +- packages/cli/src/modules/translations/index.ts | 2 +- packages/cli/src/wiring/CliInitializer.ts | 2 +- packages/cli/src/{lib => wiring}/errors.ts | 0 packages/cli/src/{lib => wiring}/lazy.ts | 2 +- 13 files changed, 12 insertions(+), 12 deletions(-) rename packages/cli/src/{lib => wiring}/errors.ts (100%) rename packages/cli/src/{lib => wiring}/lazy.ts (96%) diff --git a/packages/cli/src/modules/build/index.ts b/packages/cli/src/modules/build/index.ts index 9b37efaa8b..1bb01e547e 100644 --- a/packages/cli/src/modules/build/index.ts +++ b/packages/cli/src/modules/build/index.ts @@ -16,7 +16,7 @@ import { Command, Option } from 'commander'; import { createCliPlugin } from '../../wiring/factory'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; import { configOption } from '../config'; export function registerPackageCommands(command: Command) { diff --git a/packages/cli/src/modules/config/index.ts b/packages/cli/src/modules/config/index.ts index 3eabf5e9fc..234e62fde0 100644 --- a/packages/cli/src/modules/config/index.ts +++ b/packages/cli/src/modules/config/index.ts @@ -16,7 +16,7 @@ import { createCliPlugin } from '../../wiring/factory'; import yargs from 'yargs'; import { Command } from 'commander'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; export const configOption = [ '--config ', diff --git a/packages/cli/src/modules/create-github-app/index.ts b/packages/cli/src/modules/create-github-app/index.ts index da1e04aaac..5a3e30e870 100644 --- a/packages/cli/src/modules/create-github-app/index.ts +++ b/packages/cli/src/modules/create-github-app/index.ts @@ -15,7 +15,7 @@ */ import { createCliPlugin } from '../../wiring/factory'; import { Command } from 'commander'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; export default createCliPlugin({ pluginId: 'new', diff --git a/packages/cli/src/modules/info/index.ts b/packages/cli/src/modules/info/index.ts index c14926df85..0919c2ce07 100644 --- a/packages/cli/src/modules/info/index.ts +++ b/packages/cli/src/modules/info/index.ts @@ -15,7 +15,7 @@ */ import yargs from 'yargs'; import { createCliPlugin } from '../../wiring/factory'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; export default createCliPlugin({ pluginId: 'info', diff --git a/packages/cli/src/modules/lint/index.ts b/packages/cli/src/modules/lint/index.ts index 6cba232da9..40c374aa3b 100644 --- a/packages/cli/src/modules/lint/index.ts +++ b/packages/cli/src/modules/lint/index.ts @@ -15,7 +15,7 @@ */ import { createCliPlugin } from '../../wiring/factory'; import { Command } from 'commander'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; export function registerPackageLintCommand(command: Command) { command.arguments('[directories...]'); diff --git a/packages/cli/src/modules/maintenance/index.ts b/packages/cli/src/modules/maintenance/index.ts index 41192afdc4..a658cc3cc7 100644 --- a/packages/cli/src/modules/maintenance/index.ts +++ b/packages/cli/src/modules/maintenance/index.ts @@ -15,7 +15,7 @@ */ import { Command } from 'commander'; import { createCliPlugin } from '../../wiring/factory'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; export default createCliPlugin({ pluginId: 'maintenance', diff --git a/packages/cli/src/modules/migrate/index.ts b/packages/cli/src/modules/migrate/index.ts index ac56c06b7a..d94d04ed8d 100644 --- a/packages/cli/src/modules/migrate/index.ts +++ b/packages/cli/src/modules/migrate/index.ts @@ -15,7 +15,7 @@ */ import { createCliPlugin } from '../../wiring/factory'; import { Command } from 'commander'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; export default createCliPlugin({ pluginId: 'migrate', diff --git a/packages/cli/src/modules/new/index.ts b/packages/cli/src/modules/new/index.ts index 120e77c7c0..ac21b825fe 100644 --- a/packages/cli/src/modules/new/index.ts +++ b/packages/cli/src/modules/new/index.ts @@ -15,7 +15,7 @@ */ import { createCliPlugin } from '../../wiring/factory'; import { Command } from 'commander'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; import { NotImplementedError } from '@backstage/errors'; export default createCliPlugin({ diff --git a/packages/cli/src/modules/test/index.ts b/packages/cli/src/modules/test/index.ts index ecc546aee3..f003d9c054 100644 --- a/packages/cli/src/modules/test/index.ts +++ b/packages/cli/src/modules/test/index.ts @@ -15,7 +15,7 @@ */ import { createCliPlugin } from '../../wiring/factory'; import { Command } from 'commander'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; export default createCliPlugin({ pluginId: 'test', diff --git a/packages/cli/src/modules/translations/index.ts b/packages/cli/src/modules/translations/index.ts index 702b0f4f49..1a700b3505 100644 --- a/packages/cli/src/modules/translations/index.ts +++ b/packages/cli/src/modules/translations/index.ts @@ -15,7 +15,7 @@ */ import yargs from 'yargs'; import { createCliPlugin } from '../../wiring/factory'; -import { lazy } from '../../lib/lazy'; +import { lazy } from '../../wiring/lazy'; import { DEFAULT_MESSAGE_PATTERN } from './lib/messageFilePath'; export default createCliPlugin({ diff --git a/packages/cli/src/wiring/CliInitializer.ts b/packages/cli/src/wiring/CliInitializer.ts index eab7961b40..8d0b844c78 100644 --- a/packages/cli/src/wiring/CliInitializer.ts +++ b/packages/cli/src/wiring/CliInitializer.ts @@ -20,7 +20,7 @@ import { CommandRegistry } from './CommandRegistry'; import { Command } from 'commander'; import { version } from '../lib/version'; import chalk from 'chalk'; -import { exitWithError } from '../lib/errors'; +import { exitWithError } from './errors'; import { ForwardedError } from '@backstage/errors'; import { isPromise } from 'node:util/types'; diff --git a/packages/cli/src/lib/errors.ts b/packages/cli/src/wiring/errors.ts similarity index 100% rename from packages/cli/src/lib/errors.ts rename to packages/cli/src/wiring/errors.ts diff --git a/packages/cli/src/lib/lazy.ts b/packages/cli/src/wiring/lazy.ts similarity index 96% rename from packages/cli/src/lib/lazy.ts rename to packages/cli/src/wiring/lazy.ts index d1255ea1bc..64a4d43ef4 100644 --- a/packages/cli/src/lib/lazy.ts +++ b/packages/cli/src/wiring/lazy.ts @@ -15,7 +15,7 @@ */ import { assertError } from '@backstage/errors'; -import { exitWithError } from '../lib/errors'; +import { exitWithError } from './errors'; type ActionFunc = (...args: any[]) => Promise; type ActionExports = { From 61cb9762075b5a40bffd4ce58fd17da354275224 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 11:59:30 +0100 Subject: [PATCH 224/455] Consolidate Lockfile classes: move toString() and versioning utils to cli-node Signed-off-by: Patrik Oldsberg --- .changeset/cli-node-lockfile-tostring.md | 5 + .changeset/cli-versioning-consolidation.md | 5 + packages/cli-node/package.json | 5 +- packages/cli-node/report.api.md | 30 ++++ packages/cli-node/src/index.ts | 1 + .../cli-node/src/monorepo/Lockfile.test.ts | 70 ++++++++- packages/cli-node/src/monorepo/Lockfile.ts | 28 +++- .../lib => cli-node/src}/versioning/index.ts | 4 +- .../src}/versioning/packages.test.ts | 0 .../src}/versioning/packages.ts | 24 ++- .../lib => cli-node/src}/versioning/yarn.ts | 5 + packages/cli/package.json | 3 - packages/cli/src/lib/version.test.ts | 2 +- packages/cli/src/lib/version.ts | 2 +- .../cli/src/lib/versioning/Lockfile.test.ts | 102 ------------- packages/cli/src/lib/versioning/Lockfile.ts | 138 ------------------ .../cli/src/modules/info/commands/info.ts | 7 +- .../migrate/commands/versions/bump.test.ts | 6 +- .../modules/migrate/commands/versions/bump.ts | 4 +- .../new/lib/execution/PortableTemplater.ts | 2 +- yarn.lock | 6 +- 21 files changed, 184 insertions(+), 265 deletions(-) create mode 100644 .changeset/cli-node-lockfile-tostring.md create mode 100644 .changeset/cli-versioning-consolidation.md rename packages/{cli/src/lib => cli-node/src}/versioning/index.ts (85%) rename packages/{cli/src/lib => cli-node/src}/versioning/packages.test.ts (100%) rename packages/{cli/src/lib => cli-node/src}/versioning/packages.ts (89%) rename packages/{cli/src/lib => cli-node/src}/versioning/yarn.ts (95%) delete mode 100644 packages/cli/src/lib/versioning/Lockfile.test.ts delete mode 100644 packages/cli/src/lib/versioning/Lockfile.ts diff --git a/.changeset/cli-node-lockfile-tostring.md b/.changeset/cli-node-lockfile-tostring.md new file mode 100644 index 0000000000..b808002578 --- /dev/null +++ b/.changeset/cli-node-lockfile-tostring.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli-node': patch +--- + +Added `toString()` method to `Lockfile` for serializing lockfiles back to string format. Also added new exports: `detectYarnVersion`, `fetchPackageInfo`, `mapDependencies`, and `YarnInfoInspectData`. diff --git a/.changeset/cli-versioning-consolidation.md b/.changeset/cli-versioning-consolidation.md new file mode 100644 index 0000000000..114b931c9b --- /dev/null +++ b/.changeset/cli-versioning-consolidation.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Migrated internal versioning utilities to use `@backstage/cli-node` instead of a local implementation. diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 7d198f0a3f..2853733ff2 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -35,14 +35,17 @@ "@backstage/errors": "workspace:^", "@backstage/types": "workspace:^", "@manypkg/get-packages": "^1.1.3", + "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "^3.0.0", "fs-extra": "^11.2.0", + "minimatch": "^10.2.1", "semver": "^7.5.3", "zod": "^3.25.76" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", - "@backstage/test-utils": "workspace:^" + "@backstage/test-utils": "workspace:^", + "@types/yarnpkg__lockfile": "^1.1.4" } } diff --git a/packages/cli-node/report.api.md b/packages/cli-node/report.api.md index b3d8fe5641..9de5d1ffed 100644 --- a/packages/cli-node/report.api.md +++ b/packages/cli-node/report.api.md @@ -93,6 +93,12 @@ export type ConcurrentTasksOptions = { worker: (item: TItem) => Promise; }; +// @public +export function detectYarnVersion(dir?: string): Promise<'classic' | 'berry'>; + +// @public +export function fetchPackageInfo(name: string): Promise; + // @public export class GitUtils { static listChangedFiles(ref: string): Promise; @@ -111,6 +117,7 @@ export class Lockfile { keys(): IterableIterator; static load(path: string): Promise; static parse(content: string): Lockfile; + toString(): string; } // @public @@ -133,6 +140,12 @@ export type LockfileQueryEntry = { dataKey: string; }; +// @public +export function mapDependencies( + targetDir: string, + pattern: string, +): Promise>; + // @public export const packageFeatureType: readonly [ '@backstage/BackendFeature', @@ -208,6 +221,13 @@ export class PackageRoles { static getRoleInfo(role: string): PackageRoleInfo; } +// @public +export type PkgVersionInfo = { + range: string; + name: string; + location: string; +}; + // @public export function runConcurrentTasks( options: ConcurrentTasksOptions, @@ -230,4 +250,14 @@ export type WorkerQueueThreadsOptions = { | Promise<(item: TItem) => Promise>; context?: TContext; }; + +// @public +export type YarnInfoInspectData = { + name: string; + 'dist-tags': Record; + versions: string[]; + time: { + [version: string]: string; + }; +}; ``` diff --git a/packages/cli-node/src/index.ts b/packages/cli-node/src/index.ts index 5540666a05..6fc26b19d5 100644 --- a/packages/cli-node/src/index.ts +++ b/packages/cli-node/src/index.ts @@ -24,3 +24,4 @@ export * from './git'; export * from './monorepo'; export * from './concurrency'; export * from './roles'; +export * from './versioning'; diff --git a/packages/cli-node/src/monorepo/Lockfile.test.ts b/packages/cli-node/src/monorepo/Lockfile.test.ts index 03b50fea90..c2d35f7352 100644 --- a/packages/cli-node/src/monorepo/Lockfile.test.ts +++ b/packages/cli-node/src/monorepo/Lockfile.test.ts @@ -15,6 +15,7 @@ */ import { Lockfile } from './Lockfile'; +import { createMockDirectory } from '@backstage/backend-test-utils'; const LEGACY_HEADER = `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 @@ -29,7 +30,74 @@ __metadata: cacheKey: 8 `; -describe('New Lockfile', () => { +const mockLegacy = `${LEGACY_HEADER} +a@^1: + version "1.0.1" + resolved "https://my-registry/a-1.0.01.tgz#abc123" + integrity sha512-xyz + dependencies: + b "^2" + +b@2.0.x: + version "2.0.1" + +b@^2: + version "2.0.0" +`; + +const mockModern = `${MODERN_HEADER} +a@^1: + version: 1.0.1 + dependencies: + b: ^2 + integrity: sha512-xyz + resolved: "https://my-registry/a-1.0.01.tgz#abc123" + +"b@2.0.x, b@^2.0.1": + version: 2.0.1 + +b@^2: + version: 2.0.0 +`; + +describe('Lockfile', () => { + const mockDir = createMockDirectory(); + + it('should load and serialize a legacy lockfile', async () => { + mockDir.setContent({ + 'yarn.lock': mockLegacy, + }); + + const lockfile = await Lockfile.load(mockDir.resolve('yarn.lock')); + expect(lockfile.get('a')).toEqual([ + { range: '^1', version: '1.0.1', dataKey: 'a@^1' }, + ]); + expect(lockfile.get('b')).toEqual([ + { range: '2.0.x', version: '2.0.1', dataKey: 'b@2.0.x' }, + { range: '^2', version: '2.0.0', dataKey: 'b@^2' }, + ]); + expect(lockfile.toString()).toBe(mockLegacy); + }); + + it('should load and serialize a modern lockfile', async () => { + mockDir.setContent({ + 'yarn.lock': mockModern, + }); + + const lockfile = await Lockfile.load(mockDir.resolve('yarn.lock')); + expect(lockfile.get('a')).toEqual([ + { range: '^1', version: '1.0.1', dataKey: 'a@^1' }, + ]); + expect(lockfile.get('b')).toEqual([ + { range: '2.0.x', version: '2.0.1', dataKey: 'b@2.0.x, b@^2.0.1' }, + { range: '^2.0.1', version: '2.0.1', dataKey: 'b@2.0.x, b@^2.0.1' }, + { range: '^2', version: '2.0.0', dataKey: 'b@^2' }, + ]); + expect(lockfile.toString()).toBe(mockModern); + }); +}); + +describe('Lockfile advanced', () => { describe('diff', () => { const lockfileLegacyA = Lockfile.parse(`${LEGACY_HEADER} a@^1: diff --git a/packages/cli-node/src/monorepo/Lockfile.ts b/packages/cli-node/src/monorepo/Lockfile.ts index ff624191af..65e22dcf13 100644 --- a/packages/cli-node/src/monorepo/Lockfile.ts +++ b/packages/cli-node/src/monorepo/Lockfile.ts @@ -14,12 +14,22 @@ * limitations under the License. */ -import { parseSyml } from '@yarnpkg/parsers'; +import { parseSyml, stringifySyml } from '@yarnpkg/parsers'; +import { stringify as legacyStringifyLockfile } from '@yarnpkg/lockfile'; import crypto from 'node:crypto'; import fs from 'fs-extra'; const ENTRY_PATTERN = /^((?:@[^/]+\/)?[^@/]+)@(.+)$/; +// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-core/sources/Project.ts#L1741-L1746 +const NEW_HEADER = `${[ + `# This file is generated by running "yarn install" inside your project.\n`, + `# Manual changes might be lost - proceed with caution!\n`, +].join(``)}\n`; + +// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-parsers/sources/syml.ts#L136 +const LEGACY_REGEX = /^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i; + /** @internal */ type LockfileData = { [entry: string]: { @@ -97,6 +107,8 @@ export class Lockfile { * @public */ static parse(content: string): Lockfile { + const legacy = LEGACY_REGEX.test(content); + let data: LockfileData; try { data = parseSyml(content); @@ -130,18 +142,21 @@ export class Lockfile { } } - return new Lockfile(packages, data); + return new Lockfile(packages, data, legacy); } private readonly packages: Map; private readonly data: LockfileData; + private readonly legacy: boolean; private constructor( packages: Map, data: LockfileData, + legacy: boolean = false, ) { this.packages = packages; this.data = data; + this.legacy = legacy; } /** Returns the name of all packages available in the lockfile */ @@ -154,6 +169,15 @@ export class Lockfile { return this.packages.keys(); } + /** + * Serialize the lockfile back to a string. + */ + toString(): string { + return this.legacy + ? legacyStringifyLockfile(this.data) + : NEW_HEADER + stringifySyml(this.data); + } + /** * Creates a simplified dependency graph from the lockfile data, where each * key is a package, and the value is a set of all packages that it depends on diff --git a/packages/cli/src/lib/versioning/index.ts b/packages/cli-node/src/versioning/index.ts similarity index 85% rename from packages/cli/src/lib/versioning/index.ts rename to packages/cli-node/src/versioning/index.ts index e0b9280ee6..99cbc0803c 100644 --- a/packages/cli/src/lib/versioning/index.ts +++ b/packages/cli-node/src/versioning/index.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -export { Lockfile } from './Lockfile'; +export { detectYarnVersion } from './yarn'; export { fetchPackageInfo, mapDependencies } from './packages'; -export type { YarnInfoInspectData } from './packages'; +export type { PkgVersionInfo, YarnInfoInspectData } from './packages'; diff --git a/packages/cli/src/lib/versioning/packages.test.ts b/packages/cli-node/src/versioning/packages.test.ts similarity index 100% rename from packages/cli/src/lib/versioning/packages.test.ts rename to packages/cli-node/src/versioning/packages.test.ts diff --git a/packages/cli/src/lib/versioning/packages.ts b/packages/cli-node/src/versioning/packages.ts similarity index 89% rename from packages/cli/src/lib/versioning/packages.ts rename to packages/cli-node/src/versioning/packages.ts index 11f1ba3041..7cfcf132ed 100644 --- a/packages/cli/src/lib/versioning/packages.ts +++ b/packages/cli-node/src/versioning/packages.ts @@ -27,7 +27,11 @@ const DEP_TYPES = [ 'optionalDependencies', ] as const; -// Package data as returned by `yarn info` +/** + * Package data as returned by `yarn info`. + * + * @public + */ export type YarnInfoInspectData = { name: string; 'dist-tags': Record; @@ -41,12 +45,22 @@ type YarnInfo = { data: YarnInfoInspectData | { type: string; data: unknown }; }; -type PkgVersionInfo = { +/** + * Version information for a package dependency. + * + * @public + */ +export type PkgVersionInfo = { range: string; name: string; location: string; }; +/** + * Fetches package information from the registry using `yarn info` or `yarn npm info`. + * + * @public + */ export async function fetchPackageInfo( name: string, ): Promise { @@ -92,7 +106,11 @@ export async function fetchPackageInfo( } } -/** Map all dependencies in the repo as dependency => dependents */ +/** + * Map all dependencies in the repo as dependency to dependents. + * + * @public + */ export async function mapDependencies( targetDir: string, pattern: string, diff --git a/packages/cli/src/lib/versioning/yarn.ts b/packages/cli-node/src/versioning/yarn.ts similarity index 95% rename from packages/cli/src/lib/versioning/yarn.ts rename to packages/cli-node/src/versioning/yarn.ts index 908ddca949..200c8866ce 100644 --- a/packages/cli/src/lib/versioning/yarn.ts +++ b/packages/cli-node/src/versioning/yarn.ts @@ -19,6 +19,11 @@ import { runOutput } from '@backstage/cli-common'; const versions = new Map>(); +/** + * Detects the version of Yarn in use. + * + * @public + */ export function detectYarnVersion(dir?: string): Promise<'classic' | 'berry'> { const cwd = dir ?? process.cwd(); if (versions.has(cwd)) { diff --git a/packages/cli/package.json b/packages/cli/package.json index 27a1b92471..9a4e690e92 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -77,8 +77,6 @@ "@types/webpack-env": "^1.15.2", "@typescript-eslint/eslint-plugin": "^8.17.0", "@typescript-eslint/parser": "^8.16.0", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "^3.0.0", "bfj": "^9.0.2", "buffer": "^6.0.3", "chalk": "^4.0.0", @@ -182,7 +180,6 @@ "@types/tar": "^6.1.1", "@types/terser-webpack-plugin": "^5.0.4", "@types/webpack-sources": "^3.2.3", - "@types/yarnpkg__lockfile": "^1.1.4", "del": "^8.0.0", "esbuild-loader": "^4.0.0", "eslint-webpack-plugin": "^4.2.0", diff --git a/packages/cli/src/lib/version.test.ts b/packages/cli/src/lib/version.test.ts index d582c397c3..86b92e35c3 100644 --- a/packages/cli/src/lib/version.test.ts +++ b/packages/cli/src/lib/version.test.ts @@ -15,7 +15,7 @@ */ import { packageVersions, createPackageVersionProvider } from './version'; -import { Lockfile } from './versioning'; +import { Lockfile } from '@backstage/cli-node'; import corePluginApiPkg from '@backstage/core-plugin-api/package.json'; import { createMockDirectory } from '@backstage/backend-test-utils'; diff --git a/packages/cli/src/lib/version.ts b/packages/cli/src/lib/version.ts index aa8556534f..94337710d6 100644 --- a/packages/cli/src/lib/version.ts +++ b/packages/cli/src/lib/version.ts @@ -17,7 +17,7 @@ import fs from 'fs-extra'; import semver from 'semver'; import { findOwnPaths } from '@backstage/cli-common'; -import { Lockfile } from './versioning'; +import { Lockfile } from '@backstage/cli-node'; /* eslint-disable-next-line no-restricted-syntax */ const ownPaths = findOwnPaths(__dirname); diff --git a/packages/cli/src/lib/versioning/Lockfile.test.ts b/packages/cli/src/lib/versioning/Lockfile.test.ts deleted file mode 100644 index d6996b9143..0000000000 --- a/packages/cli/src/lib/versioning/Lockfile.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Lockfile } from './Lockfile'; -import { createMockDirectory } from '@backstage/backend-test-utils'; - -const LEGACY_HEADER = `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - -`; - -const MODERN_HEADER = `# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 -`; - -const mockA = `${LEGACY_HEADER} -a@^1: - version "1.0.1" - resolved "https://my-registry/a-1.0.01.tgz#abc123" - integrity sha512-xyz - dependencies: - b "^2" - -b@2.0.x: - version "2.0.1" - -b@^2: - version "2.0.0" -`; - -describe('Lockfile', () => { - const mockDir = createMockDirectory(); - - it('should load and serialize mockA', async () => { - mockDir.setContent({ - 'yarn.lock': mockA, - }); - - const lockfile = await Lockfile.load(mockDir.resolve('yarn.lock')); - expect(lockfile.get('a')).toEqual([ - { range: '^1', version: '1.0.1', dataKey: 'a@^1' }, - ]); - expect(lockfile.get('b')).toEqual([ - { range: '2.0.x', version: '2.0.1', dataKey: 'b@2.0.x' }, - { range: '^2', version: '2.0.0', dataKey: 'b@^2' }, - ]); - expect(lockfile.toString()).toBe(mockA); - }); -}); - -const mockANew = `${MODERN_HEADER} -a@^1: - version: 1.0.1 - dependencies: - b: ^2 - integrity: sha512-xyz - resolved: "https://my-registry/a-1.0.01.tgz#abc123" - -"b@2.0.x, b@^2.0.1": - version: 2.0.1 - -b@^2: - version: 2.0.0 -`; - -describe('New Lockfile', () => { - const mockDir = createMockDirectory(); - - it('should load and serialize mockANew', async () => { - mockDir.setContent({ - 'yarn.lock': mockANew, - }); - - const lockfile = await Lockfile.load(mockDir.resolve('yarn.lock')); - expect(lockfile.get('a')).toEqual([ - { range: '^1', version: '1.0.1', dataKey: 'a@^1' }, - ]); - expect(lockfile.get('b')).toEqual([ - { range: '2.0.x', version: '2.0.1', dataKey: 'b@2.0.x, b@^2.0.1' }, - { range: '^2.0.1', version: '2.0.1', dataKey: 'b@2.0.x, b@^2.0.1' }, - { range: '^2', version: '2.0.0', dataKey: 'b@^2' }, - ]); - expect(lockfile.toString()).toBe(mockANew); - }); -}); diff --git a/packages/cli/src/lib/versioning/Lockfile.ts b/packages/cli/src/lib/versioning/Lockfile.ts deleted file mode 100644 index 7a9a2c801a..0000000000 --- a/packages/cli/src/lib/versioning/Lockfile.ts +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import fs from 'fs-extra'; -import { parseSyml, stringifySyml } from '@yarnpkg/parsers'; -import { stringify as legacyStringifyLockfile } from '@yarnpkg/lockfile'; - -const ENTRY_PATTERN = /^((?:@[^/]+\/)?[^@/]+)@(.+)$/; - -type LockfileData = { - [entry: string]: { - version: string; - resolved?: string; - integrity?: string /* old */; - checksum?: string /* new */; - dependencies?: { [name: string]: string }; - peerDependencies?: { [name: string]: string }; - }; -}; - -type LockfileQueryEntry = { - range: string; - version: string; - dataKey: string; -}; - -// the new yarn header is handled out of band of the parsing -// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-core/sources/Project.ts#L1741-L1746 -const NEW_HEADER = `${[ - `# This file is generated by running "yarn install" inside your project.\n`, - `# Manual changes might be lost - proceed with caution!\n`, -].join(``)}\n`; - -// taken from yarn parser package -// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-parsers/sources/syml.ts#L136 -const LEGACY_REGEX = /^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i; - -// these are special top level yarn keys. -// https://github.com/yarnpkg/berry/blob/9bd61fbffb83d0b8166a9cc26bec3a58743aa453/packages/yarnpkg-parsers/sources/syml.ts#L9 -const SPECIAL_OBJECT_KEYS = [ - `__metadata`, - `version`, - `resolution`, - `dependencies`, - `peerDependencies`, - `dependenciesMeta`, - `peerDependenciesMeta`, - `binaries`, -]; - -export class Lockfile { - static async load(path: string) { - const lockfileContents = await fs.readFile(path, 'utf8'); - return Lockfile.parse(lockfileContents); - } - - static parse(content: string) { - const legacy = LEGACY_REGEX.test(content); - - let data: LockfileData; - try { - data = parseSyml(content); - } catch (err) { - throw new Error(`Failed yarn.lock parse, ${err}`); - } - - const packages = new Map(); - - for (const [key, value] of Object.entries(data)) { - if (SPECIAL_OBJECT_KEYS.includes(key)) continue; - - const [, name, ranges] = ENTRY_PATTERN.exec(key) ?? []; - if (!name) { - throw new Error(`Failed to parse yarn.lock entry '${key}'`); - } - - let queries = packages.get(name); - if (!queries) { - queries = []; - packages.set(name, queries); - } - for (let range of ranges.split(/\s*,\s*/)) { - if (range.startsWith(`${name}@`)) { - range = range.slice(`${name}@`.length); - } - if (range.startsWith('npm:')) { - range = range.slice('npm:'.length); - } - queries.push({ range, version: value.version, dataKey: key }); - } - } - - return new Lockfile(packages, data, legacy); - } - - private readonly packages: Map; - private readonly data: LockfileData; - private readonly legacy: boolean; - - private constructor( - packages: Map, - data: LockfileData, - legacy: boolean = false, - ) { - this.packages = packages; - this.data = data; - this.legacy = legacy; - } - - /** Get the entries for a single package in the lockfile */ - get(name: string): LockfileQueryEntry[] | undefined { - return this.packages.get(name); - } - - /** Returns the name of all packages available in the lockfile */ - keys(): IterableIterator { - return this.packages.keys(); - } - - toString() { - return this.legacy - ? legacyStringifyLockfile(this.data) - : NEW_HEADER + stringifySyml(this.data); - } -} diff --git a/packages/cli/src/modules/info/commands/info.ts b/packages/cli/src/modules/info/commands/info.ts index c50a9da373..c6732e2af1 100644 --- a/packages/cli/src/modules/info/commands/info.ts +++ b/packages/cli/src/modules/info/commands/info.ts @@ -17,8 +17,11 @@ import { version as cliVersion } from '../../../../package.json'; import os from 'node:os'; import { runOutput, targetPaths, findOwnPaths } from '@backstage/cli-common'; -import { Lockfile } from '../../../lib/versioning'; -import { BackstagePackageJson, PackageGraph } from '@backstage/cli-node'; +import { + BackstagePackageJson, + Lockfile, + PackageGraph, +} from '@backstage/cli-node'; import { minimatch } from 'minimatch'; import fs from 'fs-extra'; diff --git a/packages/cli/src/modules/migrate/commands/versions/bump.test.ts b/packages/cli/src/modules/migrate/commands/versions/bump.test.ts index cc662f9d5e..7ee65db712 100644 --- a/packages/cli/src/modules/migrate/commands/versions/bump.test.ts +++ b/packages/cli/src/modules/migrate/commands/versions/bump.test.ts @@ -19,7 +19,7 @@ import * as runObj from '@backstage/cli-common'; import { overrideTargetPaths } from '@backstage/cli-common/testUtils'; import bump, { bumpBackstageJsonVersion, createVersionFinder } from './bump'; import { registerMswTestHooks, withLogCollector } from '@backstage/test-utils'; -import { YarnInfoInspectData } from '../../../../lib/versioning/packages'; +import { YarnInfoInspectData } from '@backstage/cli-node'; import { setupServer } from 'msw/node'; import { rest } from 'msw'; import { NotFoundError } from '@backstage/errors'; @@ -69,8 +69,8 @@ jest.mock('@backstage/cli-common', () => { }); const mockFetchPackageInfo = jest.fn(); -jest.mock('../../../../lib/versioning/packages', () => { - const actual = jest.requireActual('../../../../lib/versioning/packages'); +jest.mock('@backstage/cli-node', () => { + const actual = jest.requireActual('@backstage/cli-node'); return { ...actual, fetchPackageInfo: (name: string) => mockFetchPackageInfo(name), diff --git a/packages/cli/src/modules/migrate/commands/versions/bump.ts b/packages/cli/src/modules/migrate/commands/versions/bump.ts index 4283028216..2f310561b7 100644 --- a/packages/cli/src/modules/migrate/commands/versions/bump.ts +++ b/packages/cli/src/modules/migrate/commands/versions/bump.ts @@ -35,9 +35,9 @@ import { fetchPackageInfo, Lockfile, mapDependencies, + runConcurrentTasks, YarnInfoInspectData, -} from '../../../../lib/versioning'; -import { runConcurrentTasks } from '@backstage/cli-node'; +} from '@backstage/cli-node'; import { getManifestByReleaseLine, getManifestByVersion, diff --git a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts index 511e656c91..45478957ac 100644 --- a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts +++ b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts @@ -24,7 +24,7 @@ import startCase from 'lodash/startCase'; import upperCase from 'lodash/upperCase'; import upperFirst from 'lodash/upperFirst'; import lowerFirst from 'lodash/lowerFirst'; -import { Lockfile } from '../../../../lib/versioning'; +import { Lockfile } from '@backstage/cli-node'; import { targetPaths } from '@backstage/cli-common'; import { createPackageVersionProvider } from '../../../../lib/version'; diff --git a/yarn.lock b/yarn.lock index 14a3f7453e..3cc1c9c756 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3272,8 +3272,11 @@ __metadata: "@backstage/test-utils": "workspace:^" "@backstage/types": "workspace:^" "@manypkg/get-packages": "npm:^1.1.3" + "@types/yarnpkg__lockfile": "npm:^1.1.4" + "@yarnpkg/lockfile": "npm:^1.1.0" "@yarnpkg/parsers": "npm:^3.0.0" fs-extra: "npm:^11.2.0" + minimatch: "npm:^10.2.1" semver: "npm:^7.5.3" zod: "npm:^3.25.76" languageName: unknown @@ -3343,11 +3346,8 @@ __metadata: "@types/terser-webpack-plugin": "npm:^5.0.4" "@types/webpack-env": "npm:^1.15.2" "@types/webpack-sources": "npm:^3.2.3" - "@types/yarnpkg__lockfile": "npm:^1.1.4" "@typescript-eslint/eslint-plugin": "npm:^8.17.0" "@typescript-eslint/parser": "npm:^8.16.0" - "@yarnpkg/lockfile": "npm:^1.1.0" - "@yarnpkg/parsers": "npm:^3.0.0" bfj: "npm:^9.0.2" buffer: "npm:^6.0.3" chalk: "npm:^4.0.0" From a27dc7795d8c6e27edf2515c1c788a458a0dce6e Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Wed, 25 Feb 2026 12:53:35 +0000 Subject: [PATCH 225/455] feat(ui): simplify neutral bg prop to single auto-incrementing 'neutral' value Signed-off-by: Charles de Dreuille --- .../Accordion/Accordion.stories.tsx | 64 ++++++++-------- .../ui/src/components/Accordion/definition.ts | 2 +- .../ui/src/components/Alert/Alert.stories.tsx | 26 ++++--- .../ui/src/components/Box/Box.stories.tsx | 27 ++++--- .../src/components/Button/Button.stories.tsx | 32 ++++---- .../ui/src/components/Card/Card.stories.tsx | 62 +++++++++------- packages/ui/src/components/Card/Card.tsx | 2 +- .../ui/src/components/Flex/Flex.stories.tsx | 39 +++++----- .../ui/src/components/Grid/Grid.stories.tsx | 73 ++++++++++--------- .../ToggleButton/ToggleButton.stories.tsx | 21 ++++-- .../ToggleButtonGroup.stories.tsx | 49 +++++++------ packages/ui/src/hooks/useBg.tsx | 10 +-- packages/ui/src/types.ts | 16 ++-- 13 files changed, 237 insertions(+), 186 deletions(-) diff --git a/packages/ui/src/components/Accordion/Accordion.stories.tsx b/packages/ui/src/components/Accordion/Accordion.stories.tsx index b88b547e08..5def4f57d3 100644 --- a/packages/ui/src/components/Accordion/Accordion.stories.tsx +++ b/packages/ui/src/components/Accordion/Accordion.stories.tsx @@ -195,7 +195,7 @@ export const AutoBg = meta.story({ - + Neutral 1 container @@ -210,35 +210,41 @@ export const AutoBg = meta.story({ - - Neutral 2 container - - - - - - - - - - - - + + + Neutral 2 container + + + + + + + + + + + + + - - Neutral 3 container - - - - - - - - - - - - + + + + Neutral 3 container + + + + + + + + + + + + + + ), diff --git a/packages/ui/src/components/Accordion/definition.ts b/packages/ui/src/components/Accordion/definition.ts index 69ef9be3a7..2e76f0cd77 100644 --- a/packages/ui/src/components/Accordion/definition.ts +++ b/packages/ui/src/components/Accordion/definition.ts @@ -34,7 +34,7 @@ export const AccordionDefinition = defineComponent()({ }, bg: 'provider', propDefs: { - bg: { dataAttribute: true, default: 'neutral-auto' }, + bg: { dataAttribute: true, default: 'neutral' }, children: {}, className: {}, }, diff --git a/packages/ui/src/components/Alert/Alert.stories.tsx b/packages/ui/src/components/Alert/Alert.stories.tsx index 28239becb9..589d55b7dd 100644 --- a/packages/ui/src/components/Alert/Alert.stories.tsx +++ b/packages/ui/src/components/Alert/Alert.stories.tsx @@ -297,7 +297,7 @@ export const OnDifferentBackgrounds = meta.story({ On Neutral 1 - + @@ -305,18 +305,24 @@ export const OnDifferentBackgrounds = meta.story({ On Neutral 2 - - - - + + + + + + On Neutral 3 - - - - + + + + + + + + ), @@ -337,7 +343,7 @@ export const Responsive = meta.story({ export const WithUtilityProps = meta.story({ render: () => ( - + ( Default - - Neutral 1 + + Neutral (level 1) - - Neutral 2 + + + Neutral (level 2) + - - Neutral 3 - - - Responsive Neutral + + + + Neutral (level 3) + + Danger @@ -381,11 +384,11 @@ export const BackgroundColors = meta.story({ export const NestedNeutralColors = meta.story({ args: { px: '6', py: '4', children: null }, render: args => ( - + - + - + diff --git a/packages/ui/src/components/Button/Button.stories.tsx b/packages/ui/src/components/Button/Button.stories.tsx index 2e2f94b4e1..5781daca6a 100644 --- a/packages/ui/src/components/Button/Button.stories.tsx +++ b/packages/ui/src/components/Button/Button.stories.tsx @@ -357,26 +357,32 @@ export const AutoBg = meta.story({ neutral level by 1. No prop is needed on the button -- it's fully automatic. - + Neutral 1 container - - Neutral 2 container - - - - + + + Neutral 2 container + + + + + - - Neutral 3 container - - - - + + + + Neutral 3 container + + + + + + ), diff --git a/packages/ui/src/components/Card/Card.stories.tsx b/packages/ui/src/components/Card/Card.stories.tsx index 3957b7beff..87671c4cf6 100644 --- a/packages/ui/src/components/Card/Card.stories.tsx +++ b/packages/ui/src/components/Card/Card.stories.tsx @@ -135,23 +135,29 @@ export const Backgrounds = meta.story({ No parent Defaults to neutral-1 - + On neutral-1 Auto-increments to neutral-2 - - - On neutral-2 - Auto-increments to neutral-3 - + + + + On neutral-2 + Auto-increments to neutral-3 + + - - - On neutral-3 - Steps up to neutral-4 - + + + + + On neutral-3 + Steps up to neutral-4 + + + ), @@ -197,23 +203,29 @@ export const BgOnProviders = meta.story({ No provider Card defaults to neutral-1 - + On neutral-1 Card auto-increments to neutral-2 - - - On neutral-2 - Card auto-increments to neutral-3 - + + + + On neutral-2 + Card auto-increments to neutral-3 + + - - - On neutral-3 - Card visually at neutral-4 - + + + + + On neutral-3 + Card visually at neutral-4 + + + ), @@ -226,11 +238,7 @@ export const CustomCardWithBox = meta.story({ A custom card built with Box. Use Box with an explicit bg prop to create a card-like container that participates in the bg system as a provider. - + diff --git a/packages/ui/src/components/Card/Card.tsx b/packages/ui/src/components/Card/Card.tsx index e3e4781eac..5eb09f2edc 100644 --- a/packages/ui/src/components/Card/Card.tsx +++ b/packages/ui/src/components/Card/Card.tsx @@ -44,7 +44,7 @@ export const Card = forwardRef((props, ref) => { return ( ( Default - - Neutral 1 - - - Neutral 2 - - - Neutral 3 - - - Responsive Bg + + Neutral (level 1) + + + Neutral (level 2) + + + + + + Neutral (level 3) + + + Danger @@ -278,20 +281,20 @@ export const Backgrounds = meta.story({ ), }); -export const BgNeutralAuto = meta.story({ +export const BgNeutral = meta.story({ args: { px: '6', py: '4', gap: '4' }, render: args => (
    - Using bg="neutral-auto" on Flex auto-increments from the parent context. - The first Flex defaults to neutral-1 (no parent), then each nested Flex + Using bg="neutral" on Flex auto-increments from the parent context. The + first Flex defaults to neutral-1 (no parent), then each nested Flex increments by one, capping at neutral-3.
    - -
    Neutral 1 (auto, no parent)
    - + +
    Neutral 1 (no parent)
    +
    Neutral 2 (auto-incremented)
    - +
    Neutral 3 (auto-incremented, capped)
    diff --git a/packages/ui/src/components/Grid/Grid.stories.tsx b/packages/ui/src/components/Grid/Grid.stories.tsx index b3b6957359..f60517bc31 100644 --- a/packages/ui/src/components/Grid/Grid.stories.tsx +++ b/packages/ui/src/components/Grid/Grid.stories.tsx @@ -113,18 +113,21 @@ export const Backgrounds = meta.story({ render: args => ( - - Neutral 1 - - - Neutral 2 - - - Neutral 3 - - - Responsive Bg + + Neutral (level 1) + + + Neutral (level 2) + + + + + + Neutral (level 3) + + + Danger @@ -137,28 +140,26 @@ export const Backgrounds = meta.story({ - - Neutral 1 - - - - - Neutral 2 - - - - - Neutral 3 - - - - - Responsive Bg + + Neutral (level 1) + + + + Neutral (level 2) + + + + + + + + Neutral (level 3) + + + + Danger @@ -179,7 +180,7 @@ export const Backgrounds = meta.story({ ), }); -export const BgNeutralAuto = meta.story({ +export const BgNeutral = meta.story({ args: { px: '6', py: '4', columns: '2', gap: '4' }, render: args => ( @@ -188,12 +189,12 @@ export const BgNeutralAuto = meta.story({ default. Only an explicit bg prop establishes a new bg level. Nested grids without a bg prop inherit the parent context unchanged. - + Neutral 1 (Grid.Root) - - Nested: neutral-2 (explicit) - Nested: neutral-2 (explicit) + + Nested: neutral-2 (auto-incremented) + Nested: neutral-2 (auto-incremented) diff --git a/packages/ui/src/components/ToggleButton/ToggleButton.stories.tsx b/packages/ui/src/components/ToggleButton/ToggleButton.stories.tsx index a89bbe3862..876ff654b0 100644 --- a/packages/ui/src/components/ToggleButton/ToggleButton.stories.tsx +++ b/packages/ui/src/components/ToggleButton/ToggleButton.stories.tsx @@ -16,6 +16,7 @@ import preview from '../../../../../.storybook/preview'; import { ToggleButton } from './ToggleButton'; +import { Box } from '../Box'; import { Flex } from '../Flex'; import { Text } from '../Text'; import { useState } from 'react'; @@ -65,21 +66,27 @@ export const Backgrounds = meta.story({ On Neutral 1 - + Toggle On Neutral 2 - - Toggle - + + + Toggle + + On Neutral 3 - - Toggle - + + + + Toggle + + + ), diff --git a/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx b/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx index 617cd0c0fa..c98a2e18f1 100644 --- a/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx +++ b/packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup.stories.tsx @@ -17,6 +17,7 @@ import preview from '../../../../../.storybook/preview'; import { ToggleButtonGroup } from './ToggleButtonGroup'; import { ToggleButton } from '../ToggleButton/ToggleButton'; +import { Box } from '../Box'; import { Flex } from '../Flex'; import { Text } from '../Text'; import { useState } from 'react'; @@ -100,7 +101,7 @@ export const Backgrounds = meta.story({ On Neutral 1 - + On Neutral 2 - - - Option 1 - Option 2 - Option 3 - - + + + + Option 1 + Option 2 + Option 3 + + + On Neutral 3 - - - Option 1 - Option 2 - Option 3 - - + + + + + Option 1 + Option 2 + Option 3 + + + + ), diff --git a/packages/ui/src/hooks/useBg.tsx b/packages/ui/src/hooks/useBg.tsx index 6e298fedf9..ea9376b039 100644 --- a/packages/ui/src/hooks/useBg.tsx +++ b/packages/ui/src/hooks/useBg.tsx @@ -90,10 +90,10 @@ export function useBgConsumer(): BgContextValue { * * - `bg` is `undefined` -- transparent, no context change, returns `{ bg: undefined }`. * This is the default for Box, Flex, and Grid (they do **not** auto-increment). - * - `bg` is a `ContainerBg` value -- uses that value directly (e.g. `'neutral-1'`). - * - `bg` is `'neutral-auto'` -- increments the neutral level from the parent context, - * capping at `neutral-3`. Only components that explicitly pass `'neutral-auto'` - * (e.g. Card) will auto-increment; it is never implicit. + * - `bg` is `'neutral'` -- increments the neutral level from the parent context, + * capping at `neutral-3`. The increment is always relative to the parent; it is + * not possible to pin a container to an explicit neutral level. + * - `bg` is `'danger'` | `'warning'` | `'success'` -- used as-is. * * **Capping:** * @@ -116,7 +116,7 @@ export function useBgProvider(bg?: Responsive): BgContextValue { const resolved = resolveResponsiveValue(bg, breakpoint); - if (resolved === 'neutral-auto') { + if (resolved === 'neutral') { return { bg: incrementNeutralBg(context.bg) }; } diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts index d3dfd996aa..05ef25d5dc 100644 --- a/packages/ui/src/types.ts +++ b/packages/ui/src/types.ts @@ -182,7 +182,7 @@ export interface ComponentDefinition { } /** - * Background type for the neutral bg system. + * Resolved background level stored in context and applied as `data-bg` on DOM elements. * * Supports neutral levels ('neutral-1' through 'neutral-3') and * intent backgrounds ('danger', 'warning', 'success'). @@ -190,7 +190,9 @@ export interface ComponentDefinition { * The 'neutral-4' level is not exposed as a prop value -- it is reserved * for leaf component CSS (e.g. Button on a 'neutral-3' surface). * - * @public + * This type is internal. Use `ProviderBg` for component prop types. + * + * @internal */ export type ContainerBg = | 'neutral-1' @@ -201,11 +203,13 @@ export type ContainerBg = | 'success'; /** - * Background values accepted by provider components. + * Background values accepted by provider components (Box, Flex, Grid, Card, etc.). * - * Includes all `ContainerBg` values plus `'neutral-auto'` which - * automatically increments the neutral level from the parent context. + * - `'neutral'` — automatically increments the neutral level from the parent context, + * capping at the maximum level. This is always incremental; explicit levels cannot + * be set directly. + * - `'danger'` | `'warning'` | `'success'` — intent backgrounds used as-is. * * @public */ -export type ProviderBg = ContainerBg | 'neutral-auto'; +export type ProviderBg = 'neutral' | 'danger' | 'warning' | 'success'; From 503393640184a7d95e2273f6e16e2d1e279ea957 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 14:09:25 +0100 Subject: [PATCH 226/455] Keep versioning utilities internal to CLI migrate module Signed-off-by: Patrik Oldsberg --- .changeset/cli-node-lockfile-tostring.md | 2 +- packages/cli-node/package.json | 1 - packages/cli-node/report.api.md | 29 ------------------- packages/cli-node/src/index.ts | 1 - packages/cli-node/src/versioning/index.ts | 19 ------------ .../migrate/commands/versions/bump.test.ts | 6 ++-- .../modules/migrate/commands/versions/bump.ts | 5 ++-- .../migrate/lib}/versioning/packages.test.ts | 0 .../migrate/lib}/versioning/packages.ts | 24 ++------------- .../modules/migrate/lib}/versioning/yarn.ts | 5 ---- yarn.lock | 1 - 11 files changed, 9 insertions(+), 84 deletions(-) delete mode 100644 packages/cli-node/src/versioning/index.ts rename packages/{cli-node/src => cli/src/modules/migrate/lib}/versioning/packages.test.ts (100%) rename packages/{cli-node/src => cli/src/modules/migrate/lib}/versioning/packages.ts (89%) rename packages/{cli-node/src => cli/src/modules/migrate/lib}/versioning/yarn.ts (95%) diff --git a/.changeset/cli-node-lockfile-tostring.md b/.changeset/cli-node-lockfile-tostring.md index b808002578..bf4fc31225 100644 --- a/.changeset/cli-node-lockfile-tostring.md +++ b/.changeset/cli-node-lockfile-tostring.md @@ -2,4 +2,4 @@ '@backstage/cli-node': patch --- -Added `toString()` method to `Lockfile` for serializing lockfiles back to string format. Also added new exports: `detectYarnVersion`, `fetchPackageInfo`, `mapDependencies`, and `YarnInfoInspectData`. +Added `toString()` method to `Lockfile` for serializing lockfiles back to string format. diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 2853733ff2..014ed56992 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -38,7 +38,6 @@ "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "^3.0.0", "fs-extra": "^11.2.0", - "minimatch": "^10.2.1", "semver": "^7.5.3", "zod": "^3.25.76" }, diff --git a/packages/cli-node/report.api.md b/packages/cli-node/report.api.md index 9de5d1ffed..cf27d92894 100644 --- a/packages/cli-node/report.api.md +++ b/packages/cli-node/report.api.md @@ -93,12 +93,6 @@ export type ConcurrentTasksOptions = { worker: (item: TItem) => Promise; }; -// @public -export function detectYarnVersion(dir?: string): Promise<'classic' | 'berry'>; - -// @public -export function fetchPackageInfo(name: string): Promise; - // @public export class GitUtils { static listChangedFiles(ref: string): Promise; @@ -140,12 +134,6 @@ export type LockfileQueryEntry = { dataKey: string; }; -// @public -export function mapDependencies( - targetDir: string, - pattern: string, -): Promise>; - // @public export const packageFeatureType: readonly [ '@backstage/BackendFeature', @@ -221,13 +209,6 @@ export class PackageRoles { static getRoleInfo(role: string): PackageRoleInfo; } -// @public -export type PkgVersionInfo = { - range: string; - name: string; - location: string; -}; - // @public export function runConcurrentTasks( options: ConcurrentTasksOptions, @@ -250,14 +231,4 @@ export type WorkerQueueThreadsOptions = { | Promise<(item: TItem) => Promise>; context?: TContext; }; - -// @public -export type YarnInfoInspectData = { - name: string; - 'dist-tags': Record; - versions: string[]; - time: { - [version: string]: string; - }; -}; ``` diff --git a/packages/cli-node/src/index.ts b/packages/cli-node/src/index.ts index 6fc26b19d5..5540666a05 100644 --- a/packages/cli-node/src/index.ts +++ b/packages/cli-node/src/index.ts @@ -24,4 +24,3 @@ export * from './git'; export * from './monorepo'; export * from './concurrency'; export * from './roles'; -export * from './versioning'; diff --git a/packages/cli-node/src/versioning/index.ts b/packages/cli-node/src/versioning/index.ts deleted file mode 100644 index 99cbc0803c..0000000000 --- a/packages/cli-node/src/versioning/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export { detectYarnVersion } from './yarn'; -export { fetchPackageInfo, mapDependencies } from './packages'; -export type { PkgVersionInfo, YarnInfoInspectData } from './packages'; diff --git a/packages/cli/src/modules/migrate/commands/versions/bump.test.ts b/packages/cli/src/modules/migrate/commands/versions/bump.test.ts index 7ee65db712..0061d07eba 100644 --- a/packages/cli/src/modules/migrate/commands/versions/bump.test.ts +++ b/packages/cli/src/modules/migrate/commands/versions/bump.test.ts @@ -19,7 +19,7 @@ import * as runObj from '@backstage/cli-common'; import { overrideTargetPaths } from '@backstage/cli-common/testUtils'; import bump, { bumpBackstageJsonVersion, createVersionFinder } from './bump'; import { registerMswTestHooks, withLogCollector } from '@backstage/test-utils'; -import { YarnInfoInspectData } from '@backstage/cli-node'; +import { YarnInfoInspectData } from '../../lib/versioning/packages'; import { setupServer } from 'msw/node'; import { rest } from 'msw'; import { NotFoundError } from '@backstage/errors'; @@ -69,8 +69,8 @@ jest.mock('@backstage/cli-common', () => { }); const mockFetchPackageInfo = jest.fn(); -jest.mock('@backstage/cli-node', () => { - const actual = jest.requireActual('@backstage/cli-node'); +jest.mock('../../lib/versioning/packages', () => { + const actual = jest.requireActual('../../lib/versioning/packages'); return { ...actual, fetchPackageInfo: (name: string) => mockFetchPackageInfo(name), diff --git a/packages/cli/src/modules/migrate/commands/versions/bump.ts b/packages/cli/src/modules/migrate/commands/versions/bump.ts index 2f310561b7..7ecd908d8a 100644 --- a/packages/cli/src/modules/migrate/commands/versions/bump.ts +++ b/packages/cli/src/modules/migrate/commands/versions/bump.ts @@ -31,13 +31,12 @@ import { isError, NotFoundError } from '@backstage/errors'; import { resolve as resolvePath } from 'node:path'; import { getHasYarnPlugin } from '../../../../lib/yarnPlugin'; +import { Lockfile, runConcurrentTasks } from '@backstage/cli-node'; import { fetchPackageInfo, - Lockfile, mapDependencies, - runConcurrentTasks, YarnInfoInspectData, -} from '@backstage/cli-node'; +} from '../../lib/versioning/packages'; import { getManifestByReleaseLine, getManifestByVersion, diff --git a/packages/cli-node/src/versioning/packages.test.ts b/packages/cli/src/modules/migrate/lib/versioning/packages.test.ts similarity index 100% rename from packages/cli-node/src/versioning/packages.test.ts rename to packages/cli/src/modules/migrate/lib/versioning/packages.test.ts diff --git a/packages/cli-node/src/versioning/packages.ts b/packages/cli/src/modules/migrate/lib/versioning/packages.ts similarity index 89% rename from packages/cli-node/src/versioning/packages.ts rename to packages/cli/src/modules/migrate/lib/versioning/packages.ts index 7cfcf132ed..11f1ba3041 100644 --- a/packages/cli-node/src/versioning/packages.ts +++ b/packages/cli/src/modules/migrate/lib/versioning/packages.ts @@ -27,11 +27,7 @@ const DEP_TYPES = [ 'optionalDependencies', ] as const; -/** - * Package data as returned by `yarn info`. - * - * @public - */ +// Package data as returned by `yarn info` export type YarnInfoInspectData = { name: string; 'dist-tags': Record; @@ -45,22 +41,12 @@ type YarnInfo = { data: YarnInfoInspectData | { type: string; data: unknown }; }; -/** - * Version information for a package dependency. - * - * @public - */ -export type PkgVersionInfo = { +type PkgVersionInfo = { range: string; name: string; location: string; }; -/** - * Fetches package information from the registry using `yarn info` or `yarn npm info`. - * - * @public - */ export async function fetchPackageInfo( name: string, ): Promise { @@ -106,11 +92,7 @@ export async function fetchPackageInfo( } } -/** - * Map all dependencies in the repo as dependency to dependents. - * - * @public - */ +/** Map all dependencies in the repo as dependency => dependents */ export async function mapDependencies( targetDir: string, pattern: string, diff --git a/packages/cli-node/src/versioning/yarn.ts b/packages/cli/src/modules/migrate/lib/versioning/yarn.ts similarity index 95% rename from packages/cli-node/src/versioning/yarn.ts rename to packages/cli/src/modules/migrate/lib/versioning/yarn.ts index 200c8866ce..908ddca949 100644 --- a/packages/cli-node/src/versioning/yarn.ts +++ b/packages/cli/src/modules/migrate/lib/versioning/yarn.ts @@ -19,11 +19,6 @@ import { runOutput } from '@backstage/cli-common'; const versions = new Map>(); -/** - * Detects the version of Yarn in use. - * - * @public - */ export function detectYarnVersion(dir?: string): Promise<'classic' | 'berry'> { const cwd = dir ?? process.cwd(); if (versions.has(cwd)) { diff --git a/yarn.lock b/yarn.lock index 3cc1c9c756..74484a0056 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3276,7 +3276,6 @@ __metadata: "@yarnpkg/lockfile": "npm:^1.1.0" "@yarnpkg/parsers": "npm:^3.0.0" fs-extra: "npm:^11.2.0" - minimatch: "npm:^10.2.1" semver: "npm:^7.5.3" zod: "npm:^3.25.76" languageName: unknown From f7ada5ce14f592b4edfab39f7750de1bd02d92ca Mon Sep 17 00:00:00 2001 From: Rinke Hoekstra Date: Wed, 25 Feb 2026 14:46:33 +0100 Subject: [PATCH 227/455] Fix capitalization in resource description Corrected capitalization of 'A Resource' at the beginning of the sentence (as it is a proper noun) Signed-off-by: Rinke Hoekstra --- docs/features/software-catalog/descriptor-format.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/software-catalog/descriptor-format.md b/docs/features/software-catalog/descriptor-format.md index ac8baadad5..7fdb9056ab 100644 --- a/docs/features/software-catalog/descriptor-format.md +++ b/docs/features/software-catalog/descriptor-format.md @@ -1121,7 +1121,7 @@ Describes the following entity kind: | `apiVersion` | `backstage.io/v1alpha1` | | `kind` | `Resource` | -A resource describes the infrastructure a system needs to operate, like BigTable +A Resource describes the infrastructure a system needs to operate, like BigTable databases, Pub/Sub topics, S3 buckets or CDNs. Modelling them together with components and systems allows to visualize resource footprint, and create tooling around them. From 07ba74684a5f0c7e416aab127ea3f23f0f7feae9 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 14:50:20 +0100 Subject: [PATCH 228/455] catalog: fix entity page tab group ordering The entity page tab groups were rendered in extension tree order rather than respecting the order defined in the groups configuration. This sorts the rendered groups based on the key order from groupDefinitions. Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor --- .changeset/fix-entity-tab-group-ordering.md | 5 +++ .../components/EntityTabs/EntityTabsList.tsx | 44 ++++++++++++------- 2 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 .changeset/fix-entity-tab-group-ordering.md diff --git a/.changeset/fix-entity-tab-group-ordering.md b/.changeset/fix-entity-tab-group-ordering.md new file mode 100644 index 0000000000..6fab3f77af --- /dev/null +++ b/.changeset/fix-entity-tab-group-ordering.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Fixed entity page tab groups not respecting the ordering from the `groups` configuration. diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx index d77cc5e444..9267e083f5 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx @@ -88,20 +88,34 @@ export function EntityTabsList(props: EntityTabsListProps) { const { tabs: items, selectedIndex = 0, showIcons, groupDefinitions } = props; - const groups = useMemo( - () => - items.reduce((result, tab) => { - const group = tab.group ? groupDefinitions[tab.group] : undefined; - const groupOrId = group && tab.group ? tab.group : tab.id; - result[groupOrId] = result[groupOrId] ?? { - group, - items: [], - }; - result[groupOrId].items.push(tab); - return result; - }, {} as Record), - [items, groupDefinitions], - ); + const groups = useMemo(() => { + const byKey = items.reduce((result, tab) => { + const group = tab.group ? groupDefinitions[tab.group] : undefined; + const groupOrId = group && tab.group ? tab.group : tab.id; + result[groupOrId] = result[groupOrId] ?? { + group, + items: [], + }; + result[groupOrId].items.push(tab); + return result; + }, {} as Record); + + const groupOrder = Object.keys(groupDefinitions); + return Object.entries(byKey).sort(([a], [b]) => { + const ai = groupOrder.indexOf(a); + const bi = groupOrder.indexOf(b); + if (ai !== -1 && bi !== -1) { + return ai - bi; + } + if (ai !== -1) { + return -1; + } + if (bi !== -1) { + return 1; + } + return 0; + }); + }, [items, groupDefinitions]); const selectedItem = items[selectedIndex]; return ( @@ -115,7 +129,7 @@ export function EntityTabsList(props: EntityTabsListProps) { aria-label={t('entityTabs.tabsAriaLabel')} value={selectedItem?.group ?? selectedItem?.id} > - {Object.entries(groups).map(([id, tabGroup]) => ( + {groups.map(([id, tabGroup]) => ( Date: Wed, 25 Feb 2026 14:51:28 +0100 Subject: [PATCH 229/455] patches: add patch for #33004 Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor --- .patches/pr-33004.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .patches/pr-33004.txt diff --git a/.patches/pr-33004.txt b/.patches/pr-33004.txt new file mode 100644 index 0000000000..5594a76e6b --- /dev/null +++ b/.patches/pr-33004.txt @@ -0,0 +1 @@ +Fixes entity page tab groups not respecting the ordering from the groups configuration. \ No newline at end of file From f0fc4ab8de07b9befec93878aba325703fc13886 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 15:05:30 +0100 Subject: [PATCH 230/455] catalog: add tests for entity tab group ordering Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor --- .../components/EntityTabs/EntityTabs.test.tsx | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.test.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.test.tsx index 3bca08288f..a85d795cd8 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.test.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.test.tsx @@ -16,8 +16,10 @@ import { screen } from '@testing-library/react'; import { useSelectedSubRoute } from './EntityTabs'; +import { EntityTabsList } from './EntityTabsList'; import { MemoryRouter, Route, Routes } from 'react-router-dom'; import { render } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/frontend-test-utils'; function TestSubRouteHook(props: { subRoutes: Array<{ @@ -37,6 +39,83 @@ function TestSubRouteHook(props: { ); } +describe('EntityTabsList', () => { + it('should render groups in the order defined by groupDefinitions', () => { + const tabs = [ + { id: '/cicd', label: 'CI/CD', path: 'cicd', group: 'cicd' }, + { + id: '/overview', + label: 'Overview', + path: 'overview', + group: 'overview', + }, + { + id: '/techdocs', + label: 'TechDocs', + path: 'techdocs', + group: 'techdocs', + }, + ]; + + const groupDefinitions = { + overview: { title: 'Overview' }, + techdocs: { title: 'TechDocs' }, + cicd: { title: 'CI/CD' }, + }; + + renderInTestApp( + , + ); + + const tabElements = screen.getAllByRole('tab'); + expect(tabElements).toHaveLength(3); + expect(tabElements[0]).toHaveTextContent('Overview'); + expect(tabElements[1]).toHaveTextContent('TechDocs'); + expect(tabElements[2]).toHaveTextContent('CI/CD'); + }); + + it('should place ungrouped tabs after defined groups', () => { + const tabs = [ + { id: '/standalone', label: 'Standalone', path: 'standalone' }, + { + id: '/overview', + label: 'Overview', + path: 'overview', + group: 'overview', + }, + { + id: '/techdocs', + label: 'TechDocs', + path: 'techdocs', + group: 'techdocs', + }, + ]; + + const groupDefinitions = { + overview: { title: 'Overview' }, + techdocs: { title: 'TechDocs' }, + }; + + renderInTestApp( + , + ); + + const tabElements = screen.getAllByRole('tab'); + expect(tabElements).toHaveLength(3); + expect(tabElements[0]).toHaveTextContent('Overview'); + expect(tabElements[1]).toHaveTextContent('TechDocs'); + expect(tabElements[2]).toHaveTextContent('Standalone'); + }); +}); + describe('EntityTabs', () => { const subRoutes = [ { From 30e08dfbcc3c4ade49c6c04cc6ef6cd6e1e6fec6 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 15:37:10 +0100 Subject: [PATCH 231/455] Add default entity content groups for techdocs and api-docs plugins Signed-off-by: Patrik Oldsberg --- .changeset/entity-content-group-api-docs.md | 5 +++++ .changeset/entity-content-group-techdocs.md | 5 +++++ packages/app/app-config.yaml | 9 +++------ plugins/api-docs/src/alpha.tsx | 2 ++ plugins/techdocs/src/alpha/index.tsx | 1 + 5 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 .changeset/entity-content-group-api-docs.md create mode 100644 .changeset/entity-content-group-techdocs.md diff --git a/.changeset/entity-content-group-api-docs.md b/.changeset/entity-content-group-api-docs.md new file mode 100644 index 0000000000..8eb3e12435 --- /dev/null +++ b/.changeset/entity-content-group-api-docs.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +Added default entity content groups for the API docs entity content tabs. The API definition tab defaults to the `documentation` group and the APIs tab defaults to the `development` group. diff --git a/.changeset/entity-content-group-techdocs.md b/.changeset/entity-content-group-techdocs.md new file mode 100644 index 0000000000..a99992301c --- /dev/null +++ b/.changeset/entity-content-group-techdocs.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Added `documentation` as the default entity content group for the TechDocs entity content tab. diff --git a/packages/app/app-config.yaml b/packages/app/app-config.yaml index 2000e785b3..0fef43fbb5 100644 --- a/packages/app/app-config.yaml +++ b/packages/app/app-config.yaml @@ -97,22 +97,19 @@ app: # - entity-card:azure-devops/readme # Entity page contents - - entity-content:catalog/overview: - config: - group: overview + - entity-content:catalog/overview - entity-content:api-docs/definition - entity-content:api-docs/apis: config: - # example associating with a default group + # example overriding the default group group: documentation icon: kind:api - entity-content:techdocs: config: - group: documentation icon: techdocs - entity-content:kubernetes/kubernetes: config: - # example disassociating with a default group + # example disassociating from the default group group: false # - entity-content:azure-devops/pipelines # - entity-content:azure-devops/pull-requests diff --git a/plugins/api-docs/src/alpha.tsx b/plugins/api-docs/src/alpha.tsx index 0c44d5d51c..4afe97dee9 100644 --- a/plugins/api-docs/src/alpha.tsx +++ b/plugins/api-docs/src/alpha.tsx @@ -174,6 +174,7 @@ const apiDocsDefinitionEntityContent = EntityContentBlueprint.make({ params: { path: '/definition', title: 'Definition', + group: 'documentation', filter: { kind: 'api' }, loader: async () => import('./components/ApiDefinitionCard').then(m => ( @@ -191,6 +192,7 @@ const apiDocsApisEntityContent = EntityContentBlueprint.make({ params: { path: '/apis', title: 'APIs', + group: 'development', filter: { kind: 'component' }, loader: async () => import('./components/ApisCards').then(m => ( diff --git a/plugins/techdocs/src/alpha/index.tsx b/plugins/techdocs/src/alpha/index.tsx index 409bf03269..6acc6b5e6d 100644 --- a/plugins/techdocs/src/alpha/index.tsx +++ b/plugins/techdocs/src/alpha/index.tsx @@ -223,6 +223,7 @@ const techDocsEntityContent = EntityContentBlueprint.makeWithOverrides({ { path: 'docs', title: 'TechDocs', + group: 'documentation', routeRef: rootCatalogDocsRouteRef, loader: () => { // Merge addons from the API with old-style direct attachments From 2fcba39deaf8050fb256fdc9fc0e033df4e10bba Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 11:47:27 +0100 Subject: [PATCH 232/455] Internalize CLI lib utilities into consuming modules Move typeDistProject.ts into the build module, duplicate optionsParser.ts into build and lint modules, inline configOption in the build module, and simplify the deprecated migrate package-exports command to remove cross-module dependencies. Signed-off-by: Patrik Oldsberg --- .changeset/cli-internalize-lib-modules.md | 5 ++ .../modules/build/commands/package/pack.ts | 2 +- .../src/modules/build/commands/repo/build.ts | 2 +- packages/cli/src/modules/build/index.ts | 8 ++- .../__testUtils__/createFeatureEnvironment.ts | 0 .../build/lib/bundler/moduleFederation.ts | 2 +- .../{ => modules/build}/lib/optionsParser.ts | 0 .../build/lib/packager/createDistWorkspace.ts | 2 +- .../build/lib/packager/productionPack.ts | 2 +- .../build}/lib/typeDistProject.test.ts | 0 .../build}/lib/typeDistProject.ts | 0 .../src/modules/lint/commands/repo/lint.ts | 2 +- .../cli/src/modules/lint/lib/optionsParser.ts | 70 +++++++++++++++++++ .../migrate/commands/packageExports.ts | 15 +--- 14 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 .changeset/cli-internalize-lib-modules.md rename packages/cli/src/{ => modules/build}/lib/__testUtils__/createFeatureEnvironment.ts (100%) rename packages/cli/src/{ => modules/build}/lib/optionsParser.ts (100%) rename packages/cli/src/{ => modules/build}/lib/typeDistProject.test.ts (100%) rename packages/cli/src/{ => modules/build}/lib/typeDistProject.ts (100%) create mode 100644 packages/cli/src/modules/lint/lib/optionsParser.ts diff --git a/.changeset/cli-internalize-lib-modules.md b/.changeset/cli-internalize-lib-modules.md new file mode 100644 index 0000000000..f9ef219a3a --- /dev/null +++ b/.changeset/cli-internalize-lib-modules.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Internal refactor to move shared utilities into their consuming modules, reducing cross-module dependencies. diff --git a/packages/cli/src/modules/build/commands/package/pack.ts b/packages/cli/src/modules/build/commands/package/pack.ts index 737b4b6931..67ef7bca8b 100644 --- a/packages/cli/src/modules/build/commands/package/pack.ts +++ b/packages/cli/src/modules/build/commands/package/pack.ts @@ -22,7 +22,7 @@ import { targetPaths } from '@backstage/cli-common'; import fs from 'fs-extra'; import { publishPreflightCheck } from '../../lib/publishing'; -import { createTypeDistProject } from '../../../../lib/typeDistProject'; +import { createTypeDistProject } from '../../../build/lib/typeDistProject'; export const pre = async () => { publishPreflightCheck({ diff --git a/packages/cli/src/modules/build/commands/repo/build.ts b/packages/cli/src/modules/build/commands/repo/build.ts index dd65e926b2..59d0a839e4 100644 --- a/packages/cli/src/modules/build/commands/repo/build.ts +++ b/packages/cli/src/modules/build/commands/repo/build.ts @@ -28,7 +28,7 @@ import { } from '@backstage/cli-node'; import { buildFrontend } from '../../lib/buildFrontend'; import { buildBackend } from '../../lib/buildBackend'; -import { createScriptOptionsParser } from '../../../../lib/optionsParser'; +import { createScriptOptionsParser } from '../../lib/optionsParser'; export async function command(opts: OptionValues, cmd: Command): Promise { let packages = await PackageGraph.listTargetPackages(); diff --git a/packages/cli/src/modules/build/index.ts b/packages/cli/src/modules/build/index.ts index 277993d252..30a9b3a19e 100644 --- a/packages/cli/src/modules/build/index.ts +++ b/packages/cli/src/modules/build/index.ts @@ -17,7 +17,13 @@ import { Command, Option } from 'commander'; import { createCliPlugin } from '../../wiring/factory'; import { lazy } from '../../wiring/lazy'; -import { configOption } from '../config'; + +const configOption = [ + '--config ', + 'Config files to load instead of app-config.yaml', + (opt: string, opts: string[]) => (opts ? [...opts, opt] : [opt]), + Array(), +] as const; export function registerPackageCommands(command: Command) { command diff --git a/packages/cli/src/lib/__testUtils__/createFeatureEnvironment.ts b/packages/cli/src/modules/build/lib/__testUtils__/createFeatureEnvironment.ts similarity index 100% rename from packages/cli/src/lib/__testUtils__/createFeatureEnvironment.ts rename to packages/cli/src/modules/build/lib/__testUtils__/createFeatureEnvironment.ts diff --git a/packages/cli/src/modules/build/lib/bundler/moduleFederation.ts b/packages/cli/src/modules/build/lib/bundler/moduleFederation.ts index 307cb5cebc..69e1415b5d 100644 --- a/packages/cli/src/modules/build/lib/bundler/moduleFederation.ts +++ b/packages/cli/src/modules/build/lib/bundler/moduleFederation.ts @@ -20,7 +20,7 @@ import { readEntryPoints } from '../entryPoints'; import { createTypeDistProject, getEntryPointDefaultFeatureType, -} from '../../../../lib/typeDistProject'; +} from '../typeDistProject'; import { BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL, defaultRemoteSharedDependencies, diff --git a/packages/cli/src/lib/optionsParser.ts b/packages/cli/src/modules/build/lib/optionsParser.ts similarity index 100% rename from packages/cli/src/lib/optionsParser.ts rename to packages/cli/src/modules/build/lib/optionsParser.ts diff --git a/packages/cli/src/modules/build/lib/packager/createDistWorkspace.ts b/packages/cli/src/modules/build/lib/packager/createDistWorkspace.ts index 50fb0f4e31..9f63525186 100644 --- a/packages/cli/src/modules/build/lib/packager/createDistWorkspace.ts +++ b/packages/cli/src/modules/build/lib/packager/createDistWorkspace.ts @@ -44,7 +44,7 @@ import { PackageGraphNode, runConcurrentTasks, } from '@backstage/cli-node'; -import { createTypeDistProject } from '../../../../lib/typeDistProject'; +import { createTypeDistProject } from '../typeDistProject'; // These packages aren't safe to pack in parallel since the CLI depends on them const UNSAFE_PACKAGES = [ diff --git a/packages/cli/src/modules/build/lib/packager/productionPack.ts b/packages/cli/src/modules/build/lib/packager/productionPack.ts index ce9f15388c..55eb6edc48 100644 --- a/packages/cli/src/modules/build/lib/packager/productionPack.ts +++ b/packages/cli/src/modules/build/lib/packager/productionPack.ts @@ -19,7 +19,7 @@ import npmPackList from 'npm-packlist'; import { resolve as resolvePath, posix as posixPath } from 'node:path'; import { BackstagePackageJson } from '@backstage/cli-node'; import { readEntryPoints } from '../entryPoints'; -import { getEntryPointDefaultFeatureType } from '../../../../lib/typeDistProject'; +import { getEntryPointDefaultFeatureType } from '../typeDistProject'; import { Project } from 'ts-morph'; const PKG_PATH = 'package.json'; diff --git a/packages/cli/src/lib/typeDistProject.test.ts b/packages/cli/src/modules/build/lib/typeDistProject.test.ts similarity index 100% rename from packages/cli/src/lib/typeDistProject.test.ts rename to packages/cli/src/modules/build/lib/typeDistProject.test.ts diff --git a/packages/cli/src/lib/typeDistProject.ts b/packages/cli/src/modules/build/lib/typeDistProject.ts similarity index 100% rename from packages/cli/src/lib/typeDistProject.ts rename to packages/cli/src/modules/build/lib/typeDistProject.ts diff --git a/packages/cli/src/modules/lint/commands/repo/lint.ts b/packages/cli/src/modules/lint/commands/repo/lint.ts index dafcff45c6..d0b4f6f37e 100644 --- a/packages/cli/src/modules/lint/commands/repo/lint.ts +++ b/packages/cli/src/modules/lint/commands/repo/lint.ts @@ -27,7 +27,7 @@ import { } from '@backstage/cli-node'; import { targetPaths } from '@backstage/cli-common'; -import { createScriptOptionsParser } from '../../../../lib/optionsParser'; +import { createScriptOptionsParser } from '../../lib/optionsParser'; import { SuccessCache } from '../../../../lib/cache/SuccessCache'; function depCount(pkg: BackstagePackageJson) { diff --git a/packages/cli/src/modules/lint/lib/optionsParser.ts b/packages/cli/src/modules/lint/lib/optionsParser.ts new file mode 100644 index 0000000000..45c7eac0aa --- /dev/null +++ b/packages/cli/src/modules/lint/lib/optionsParser.ts @@ -0,0 +1,70 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Command } from 'commander'; + +export function createScriptOptionsParser( + anyCmd: Command, + commandPath: string[], +) { + // Regardless of what command instance is passed in we want to find + // the root command and resolve the path from there + let rootCmd = anyCmd; + while (rootCmd.parent) { + rootCmd = rootCmd.parent; + } + + // Now find the command that was requested + let targetCmd = rootCmd as Command | undefined; + for (const name of commandPath) { + targetCmd = targetCmd?.commands.find(c => c.name() === name) as + | Command + | undefined; + } + + if (!targetCmd) { + throw new Error( + `Could not find package command '${commandPath.join(' ')}'`, + ); + } + const cmd = targetCmd; + + const expectedScript = `backstage-cli ${commandPath.join(' ')}`; + + return (scriptStr?: string) => { + if (!scriptStr || !scriptStr.startsWith(expectedScript)) { + return undefined; + } + + const argsStr = scriptStr.slice(expectedScript.length).trim(); + + // Can't clone or copy or even use commands as prototype, so we mutate + // the necessary members instead, and then reset them once we're done + const currentOpts = (cmd as any)._optionValues; + const currentStore = (cmd as any)._storeOptionsAsProperties; + + const result: Record = {}; + (cmd as any)._storeOptionsAsProperties = false; + (cmd as any)._optionValues = result; + + // Triggers the writing of options to the result object + cmd.parseOptions(argsStr.split(' ')); + + (cmd as any)._storeOptionsAsProperties = currentOpts; + (cmd as any)._optionValues = currentStore; + + return result; + }; +} diff --git a/packages/cli/src/modules/migrate/commands/packageExports.ts b/packages/cli/src/modules/migrate/commands/packageExports.ts index 4eb741ce4d..0d02782509 100644 --- a/packages/cli/src/modules/migrate/commands/packageExports.ts +++ b/packages/cli/src/modules/migrate/commands/packageExports.ts @@ -14,21 +14,8 @@ * limitations under the License. */ -import { - fixPackageExports, - readFixablePackages, - writeFixedPackages, -} from '../../maintenance/commands/repo/fix'; - export async function command() { console.log( - 'The `migrate package-exports` command is deprecated, use `repo fix` instead.', + 'The `migrate package-exports` command has been removed, use `repo fix` instead.', ); - const packages = await readFixablePackages(); - - for (const pkg of packages) { - fixPackageExports(pkg); - } - - await writeFixedPackages(packages); } From b36a60dc45660ebacf0241450f0de808d83d3141 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 14:08:47 +0100 Subject: [PATCH 233/455] Address review feedback Add separate breaking changeset for the removal of `migrate package-exports`, and fix a pre-existing bug where the restore assignments in `createScriptOptionsParser` were swapped. Signed-off-by: Patrik Oldsberg --- .changeset/cli-remove-migrate-package-exports.md | 5 +++++ packages/cli/src/modules/build/lib/optionsParser.ts | 4 ++-- packages/cli/src/modules/lint/lib/optionsParser.ts | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 .changeset/cli-remove-migrate-package-exports.md diff --git a/.changeset/cli-remove-migrate-package-exports.md b/.changeset/cli-remove-migrate-package-exports.md new file mode 100644 index 0000000000..03ad1974d8 --- /dev/null +++ b/.changeset/cli-remove-migrate-package-exports.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': minor +--- + +**BREAKING**: The `migrate package-exports` command has been removed. Use `repo fix` instead. diff --git a/packages/cli/src/modules/build/lib/optionsParser.ts b/packages/cli/src/modules/build/lib/optionsParser.ts index 45c7eac0aa..15561a2e42 100644 --- a/packages/cli/src/modules/build/lib/optionsParser.ts +++ b/packages/cli/src/modules/build/lib/optionsParser.ts @@ -62,8 +62,8 @@ export function createScriptOptionsParser( // Triggers the writing of options to the result object cmd.parseOptions(argsStr.split(' ')); - (cmd as any)._storeOptionsAsProperties = currentOpts; - (cmd as any)._optionValues = currentStore; + (cmd as any)._optionValues = currentOpts; + (cmd as any)._storeOptionsAsProperties = currentStore; return result; }; diff --git a/packages/cli/src/modules/lint/lib/optionsParser.ts b/packages/cli/src/modules/lint/lib/optionsParser.ts index 45c7eac0aa..15561a2e42 100644 --- a/packages/cli/src/modules/lint/lib/optionsParser.ts +++ b/packages/cli/src/modules/lint/lib/optionsParser.ts @@ -62,8 +62,8 @@ export function createScriptOptionsParser( // Triggers the writing of options to the result object cmd.parseOptions(argsStr.split(' ')); - (cmd as any)._storeOptionsAsProperties = currentOpts; - (cmd as any)._optionValues = currentStore; + (cmd as any)._optionValues = currentOpts; + (cmd as any)._storeOptionsAsProperties = currentStore; return result; }; From c85ac861172ae2c32a2a460e7265b464ae01dc22 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 16:11:57 +0100 Subject: [PATCH 234/455] cli: split loadCliConfig into separate build and config implementations Split the shared loadCliConfig function into two separate implementations to remove the cross-module dependency from build to config. The build module's version keeps the watch/streaming capability needed by the dev server, while the config module's version is simplified to one-shot loading since no config commands need watching. Signed-off-by: Patrik Oldsberg --- .changeset/cli-split-loadCliConfig.md | 5 + .../src/modules/build/lib/buildFrontend.ts | 2 +- .../src/modules/build/lib/bundler/server.ts | 2 +- packages/cli/src/modules/build/lib/config.ts | 128 ++++++++++++++++++ packages/cli/src/modules/config/lib/config.ts | 34 +---- 5 files changed, 141 insertions(+), 30 deletions(-) create mode 100644 .changeset/cli-split-loadCliConfig.md create mode 100644 packages/cli/src/modules/build/lib/config.ts diff --git a/.changeset/cli-split-loadCliConfig.md b/.changeset/cli-split-loadCliConfig.md new file mode 100644 index 0000000000..d9c3571fe0 --- /dev/null +++ b/.changeset/cli-split-loadCliConfig.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Internal refactor to split `loadCliConfig` into separate implementations for the build and config CLI modules, removing a cross-module dependency. diff --git a/packages/cli/src/modules/build/lib/buildFrontend.ts b/packages/cli/src/modules/build/lib/buildFrontend.ts index 6a5785a5b9..7ca337cfdb 100644 --- a/packages/cli/src/modules/build/lib/buildFrontend.ts +++ b/packages/cli/src/modules/build/lib/buildFrontend.ts @@ -18,7 +18,7 @@ import fs from 'fs-extra'; import { resolve as resolvePath } from 'node:path'; import { buildBundle, getModuleFederationRemoteOptions } from './bundler'; import { BackstagePackageJson } from '@backstage/cli-node'; -import { loadCliConfig } from '../../config/lib/config'; +import { loadCliConfig } from './config'; interface BuildAppOptions { targetDir: string; diff --git a/packages/cli/src/modules/build/lib/bundler/server.ts b/packages/cli/src/modules/build/lib/bundler/server.ts index 57d6bed052..e474157c7c 100644 --- a/packages/cli/src/modules/build/lib/bundler/server.ts +++ b/packages/cli/src/modules/build/lib/bundler/server.ts @@ -24,7 +24,7 @@ import { RspackDevServer } from '@rspack/dev-server'; import { targetPaths } from '@backstage/cli-common'; -import { loadCliConfig } from '../../../config/lib/config'; +import { loadCliConfig } from '../config'; import { createConfig, resolveBaseUrl, resolveEndpoint } from './config'; import { createDetectedModulesEntryPoint } from './packageDetection'; import { resolveBundlingPaths, resolveOptionalBundlingPaths } from './paths'; diff --git a/packages/cli/src/modules/build/lib/config.ts b/packages/cli/src/modules/build/lib/config.ts new file mode 100644 index 0000000000..56bfc68ced --- /dev/null +++ b/packages/cli/src/modules/build/lib/config.ts @@ -0,0 +1,128 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ConfigSources, loadConfigSchema } from '@backstage/config-loader'; +import { AppConfig, ConfigReader } from '@backstage/config'; +import { targetPaths } from '@backstage/cli-common'; + +import { getPackages } from '@manypkg/get-packages'; +import { PackageGraph } from '@backstage/cli-node'; +import { resolve as resolvePath } from 'node:path'; + +type Options = { + args: string[]; + targetDir?: string; + fromPackage?: string; + withFilteredKeys?: boolean; + watch?: (newFrontendAppConfigs: AppConfig[]) => void; +}; + +export async function loadCliConfig(options: Options) { + const targetDir = options.targetDir ?? targetPaths.dir; + + const { packages } = await getPackages(targetDir); + + let localPackageNames; + if (options.fromPackage) { + if (packages.length) { + const graph = PackageGraph.fromPackages(packages); + localPackageNames = Array.from( + graph.collectPackageNames([options.fromPackage], node => { + // Workaround for Backstage main repo only, since the CLI has some artificial devDependencies + if (node.name === '@backstage/cli') { + return undefined; + } + return node.localDependencies.keys(); + }), + ); + } else { + localPackageNames = [options.fromPackage]; + } + } else { + localPackageNames = packages.map(p => p.packageJson.name); + } + + const schema = await loadConfigSchema({ + dependencies: localPackageNames, + packagePaths: [targetPaths.resolveRoot('package.json')], + }); + + const source = ConfigSources.default({ + allowMissingDefaultConfig: true, + watch: Boolean(options.watch), + rootDir: targetPaths.rootDir, + argv: options.args.flatMap(t => ['--config', resolvePath(targetDir, t)]), + }); + + const appConfigs = await new Promise((resolve, reject) => { + async function loadConfigReaderLoop() { + let loaded = false; + + try { + const abortController = new AbortController(); + for await (const { configs } of source.readConfigData({ + signal: abortController.signal, + })) { + if (loaded) { + const newFrontendAppConfigs = schema.process(configs, { + visibility: ['frontend'], + withFilteredKeys: options.withFilteredKeys, + ignoreSchemaErrors: true, + }); + options.watch?.(newFrontendAppConfigs); + } else { + resolve(configs); + loaded = true; + + if (!options.watch) { + abortController.abort(); + } + } + } + } catch (error) { + if (loaded) { + console.error(`Failed to reload configuration, ${error}`); + } else { + reject(error); + } + } + } + loadConfigReaderLoop(); + }); + + const configurationLoadedMessage = appConfigs.length + ? `Loaded config from ${appConfigs.map(c => c.context).join(', ')}` + : `No configuration files found, running without config`; + + process.stderr.write(`${configurationLoadedMessage}\n`); + + const frontendAppConfigs = schema.process(appConfigs, { + visibility: ['frontend'], + withFilteredKeys: options.withFilteredKeys, + ignoreSchemaErrors: true, + }); + const frontendConfig = ConfigReader.fromConfigs(frontendAppConfigs); + + const fullConfig = ConfigReader.fromConfigs(appConfigs); + + return { + schema, + appConfigs, + frontendConfig, + frontendAppConfigs, + fullConfig, + }; +} diff --git a/packages/cli/src/modules/config/lib/config.ts b/packages/cli/src/modules/config/lib/config.ts index 1d920eb31e..763af2174f 100644 --- a/packages/cli/src/modules/config/lib/config.ts +++ b/packages/cli/src/modules/config/lib/config.ts @@ -27,11 +27,9 @@ type Options = { targetDir?: string; fromPackage?: string; mockEnv?: boolean; - withFilteredKeys?: boolean; withDeprecatedKeys?: boolean; fullVisibility?: boolean; strict?: boolean; - watch?: (newFrontendAppConfigs: AppConfig[]) => void; }; export async function loadCliConfig(options: Options) { @@ -73,48 +71,29 @@ export async function loadCliConfig(options: Options) { substitutionFunc: options.mockEnv ? async name => process.env[name] || 'x' : undefined, - watch: Boolean(options.watch), rootDir: targetPaths.rootDir, argv: options.args.flatMap(t => ['--config', resolvePath(targetDir, t)]), }); const appConfigs = await new Promise((resolve, reject) => { - async function loadConfigReaderLoop() { + async function readConfig() { let loaded = false; - try { const abortController = new AbortController(); for await (const { configs } of source.readConfigData({ signal: abortController.signal, })) { - if (loaded) { - const newFrontendAppConfigs = schema.process(configs, { - visibility: options.fullVisibility - ? ['frontend', 'backend', 'secret'] - : ['frontend'], - withFilteredKeys: options.withFilteredKeys, - withDeprecatedKeys: options.withDeprecatedKeys, - ignoreSchemaErrors: !options.strict, - }); - options.watch?.(newFrontendAppConfigs); - } else { - resolve(configs); - loaded = true; - - if (!options.watch) { - abortController.abort(); - } - } + resolve(configs); + loaded = true; + abortController.abort(); } } catch (error) { - if (loaded) { - console.error(`Failed to reload configuration, ${error}`); - } else { + if (!loaded) { reject(error); } } } - loadConfigReaderLoop(); + readConfig(); }); const configurationLoadedMessage = appConfigs.length @@ -130,7 +109,6 @@ export async function loadCliConfig(options: Options) { visibility: options.fullVisibility ? ['frontend', 'backend', 'secret'] : ['frontend'], - withFilteredKeys: options.withFilteredKeys, withDeprecatedKeys: options.withDeprecatedKeys, ignoreSchemaErrors: !options.strict, }); From bd2c923d8e379d5e87f637609559d9ad137eb521 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 17:11:07 +0100 Subject: [PATCH 235/455] Throw error for removed migrate package-exports command Signed-off-by: Patrik Oldsberg --- packages/cli/src/modules/migrate/commands/packageExports.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/modules/migrate/commands/packageExports.ts b/packages/cli/src/modules/migrate/commands/packageExports.ts index 0d02782509..ea42638e58 100644 --- a/packages/cli/src/modules/migrate/commands/packageExports.ts +++ b/packages/cli/src/modules/migrate/commands/packageExports.ts @@ -15,7 +15,7 @@ */ export async function command() { - console.log( + throw new Error( 'The `migrate package-exports` command has been removed, use `repo fix` instead.', ); } From 4868ff07b6ddf644bfafe59fb6234c004f8fcf76 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 17:31:30 +0100 Subject: [PATCH 236/455] Fix typeDistProject import path in pack.ts The file was moved from maintenance to build on master, so the cross-module import is no longer needed. Signed-off-by: Patrik Oldsberg --- packages/cli/src/modules/build/commands/package/pack.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/modules/build/commands/package/pack.ts b/packages/cli/src/modules/build/commands/package/pack.ts index 67ef7bca8b..0265c07093 100644 --- a/packages/cli/src/modules/build/commands/package/pack.ts +++ b/packages/cli/src/modules/build/commands/package/pack.ts @@ -22,7 +22,7 @@ import { targetPaths } from '@backstage/cli-common'; import fs from 'fs-extra'; import { publishPreflightCheck } from '../../lib/publishing'; -import { createTypeDistProject } from '../../../build/lib/typeDistProject'; +import { createTypeDistProject } from '../../lib/typeDistProject'; export const pre = async () => { publishPreflightCheck({ From 53268fa77233b25a9c30198f4c229ca66430a64b Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Wed, 25 Feb 2026 16:55:08 +0000 Subject: [PATCH 237/455] Add BgReset Signed-off-by: Charles de Dreuille --- .storybook/preview.tsx | 2 +- packages/ui/report.api.md | 4 +- packages/ui/src/components/Dialog/Dialog.tsx | 15 +- packages/ui/src/components/Menu/Menu.tsx | 241 +++++++++--------- .../components/Popover/Popover.stories.tsx | 2 +- .../ui/src/components/Popover/Popover.tsx | 15 +- .../ui/src/components/Tooltip/Tooltip.tsx | 15 +- packages/ui/src/hooks/useBg.tsx | 18 ++ packages/ui/src/types.ts | 5 +- 9 files changed, 177 insertions(+), 140 deletions(-) diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index c5074f7749..9734cee295 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -176,7 +176,7 @@ export default definePreview({ : parseInt(selectedBackground.split('-')[1], 10), }).reduce( children => ( - + {children} ), diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index 25522f1825..3ca30cd73c 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -76,7 +76,7 @@ export const AccordionDefinition: { readonly propDefs: { readonly bg: { readonly dataAttribute: true; - readonly default: 'neutral-auto'; + readonly default: 'neutral'; }; readonly children: {}; readonly className: {}; @@ -1604,7 +1604,7 @@ export interface PopoverProps extends Omit { } // @public -export type ProviderBg = ContainerBg | 'neutral-auto'; +export type ProviderBg = 'neutral' | 'danger' | 'warning' | 'success'; // @public (undocumented) export interface QueryOptions { diff --git a/packages/ui/src/components/Dialog/Dialog.tsx b/packages/ui/src/components/Dialog/Dialog.tsx index efdc6c4567..0c0f4bf53f 100644 --- a/packages/ui/src/components/Dialog/Dialog.tsx +++ b/packages/ui/src/components/Dialog/Dialog.tsx @@ -34,6 +34,7 @@ import { useStyles } from '../../hooks/useStyles'; import { DialogDefinition } from './definition'; import { Flex } from '../Flex'; import { Box } from '../Box'; +import { BgReset } from '../../hooks/useBg'; import styles from './Dialog.module.css'; /** @public */ @@ -72,12 +73,14 @@ export const Dialog = forwardRef, DialogProps>( ...style, }} > - - {children} - + + + {children} + + ); diff --git a/packages/ui/src/components/Menu/Menu.tsx b/packages/ui/src/components/Menu/Menu.tsx index da4243f643..a9835b2f68 100644 --- a/packages/ui/src/components/Menu/Menu.tsx +++ b/packages/ui/src/components/Menu/Menu.tsx @@ -59,6 +59,7 @@ import { import styles from './Menu.module.css'; import clsx from 'clsx'; import { Box } from '../Box'; +import { BgReset } from '../../hooks/useBg'; const { RoutingProvider, useRoutingRegistrationEffect } = createRoutingRegistration(); @@ -120,23 +121,25 @@ export const Menu = (props: MenuProps) => { )} placement={placement} > - - {virtualized ? ( - - {menuContent} - - ) : ( - menuContent - )} - + + + {virtualized ? ( + + {menuContent} + + ) : ( + menuContent + )} + + ); @@ -175,23 +178,25 @@ export const MenuListBox = (props: MenuListBoxProps) => { )} placement={placement} > - - {virtualized ? ( - - {listBoxContent} - - ) : ( - listBoxContent - )} - + + + {virtualized ? ( + + {listBoxContent} + + ) : ( + listBoxContent + )} + + ); }; @@ -230,48 +235,50 @@ export const MenuAutocomplete = (props: MenuAutocompleteProps) => { )} placement={placement} > - - - + + + + + + + + + {virtualized ? ( + + {menuContent} + + ) : ( + menuContent )} - aria-label={props.placeholder || 'Search'} - > - - - - - - {virtualized ? ( - - {menuContent} - - ) : ( - menuContent - )} - - + + + ); @@ -314,48 +321,50 @@ export const MenuAutocompleteListbox = ( )} placement={placement} > - - - + + + + + + + + + {virtualized ? ( + + {listBoxContent} + + ) : ( + listBoxContent )} - aria-label={props.placeholder || 'Search'} - > - - - - - - {virtualized ? ( - - {listBoxContent} - - ) : ( - listBoxContent - )} - - + + + ); }; diff --git a/packages/ui/src/components/Popover/Popover.stories.tsx b/packages/ui/src/components/Popover/Popover.stories.tsx index e05b352fc9..0a0e68b572 100644 --- a/packages/ui/src/components/Popover/Popover.stories.tsx +++ b/packages/ui/src/components/Popover/Popover.stories.tsx @@ -208,7 +208,7 @@ export const WithRichContent = Default.extend({ This is a popover with rich content. It can contain multiple elements and formatted text. - + You can also use the automatic bg system inside it. diff --git a/packages/ui/src/components/Popover/Popover.tsx b/packages/ui/src/components/Popover/Popover.tsx index ad8a203558..ed13328a94 100644 --- a/packages/ui/src/components/Popover/Popover.tsx +++ b/packages/ui/src/components/Popover/Popover.tsx @@ -23,6 +23,7 @@ import { useStyles } from '../../hooks/useStyles'; import { PopoverDefinition } from './definition'; import styles from './Popover.module.css'; import { Box } from '../Box'; +import { BgReset } from '../../hooks/useBg'; /** * A popover component built on React Aria Components that displays floating @@ -95,12 +96,14 @@ export const Popover = forwardRef( )} - - {children} - + + + {children} + + )} diff --git a/packages/ui/src/components/Tooltip/Tooltip.tsx b/packages/ui/src/components/Tooltip/Tooltip.tsx index a64c8c072d..d7fb97005b 100644 --- a/packages/ui/src/components/Tooltip/Tooltip.tsx +++ b/packages/ui/src/components/Tooltip/Tooltip.tsx @@ -28,6 +28,7 @@ import { useStyles } from '../../hooks/useStyles'; import { TooltipDefinition } from './definition'; import styles from './Tooltip.module.css'; import { Box } from '../Box'; +import { BgReset } from '../../hooks/useBg'; /** @public */ export const TooltipTrigger = (props: TooltipTriggerComponentProps) => { @@ -71,12 +72,14 @@ export const Tooltip = forwardRef( - - {children} - + + + {children} + + ); }, diff --git a/packages/ui/src/hooks/useBg.tsx b/packages/ui/src/hooks/useBg.tsx index ea9376b039..e67c47da49 100644 --- a/packages/ui/src/hooks/useBg.tsx +++ b/packages/ui/src/hooks/useBg.tsx @@ -69,6 +69,24 @@ export const BgProvider = ({ bg, children }: BgProviderProps) => { ); }; +/** + * Resets the bg context to undefined, cutting any inherited neutral chain. + * Use this inside overlay components (Popover, Tooltip, Dialog, Menu) so + * their content always starts from neutral-1 regardless of where the trigger + * is placed in the tree. + * + * @internal + */ +export const BgReset = ({ children }: { children: ReactNode }) => { + return ( + + {children} + + ); +}; + /** * Hook for consumer components (e.g. Button) to read the parent bg context. * diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts index 05ef25d5dc..af87bfb20b 100644 --- a/packages/ui/src/types.ts +++ b/packages/ui/src/types.ts @@ -190,9 +190,10 @@ export interface ComponentDefinition { * The 'neutral-4' level is not exposed as a prop value -- it is reserved * for leaf component CSS (e.g. Button on a 'neutral-3' surface). * - * This type is internal. Use `ProviderBg` for component prop types. + * This is the resolved/internal representation used by the bg context system. + * For the prop type accepted by container components, use `ProviderBg` instead. * - * @internal + * @public */ export type ContainerBg = | 'neutral-1' From 768f09d49c3372fd691bdd7dd697aa0d739c6598 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Wed, 25 Feb 2026 17:01:55 +0000 Subject: [PATCH 238/455] Create dark-snakes-nail.md Signed-off-by: Charles de Dreuille --- .changeset/dark-snakes-nail.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .changeset/dark-snakes-nail.md diff --git a/.changeset/dark-snakes-nail.md b/.changeset/dark-snakes-nail.md new file mode 100644 index 0000000000..d4eb6f0dd2 --- /dev/null +++ b/.changeset/dark-snakes-nail.md @@ -0,0 +1,21 @@ +--- +'@backstage/ui': minor +--- + +**BREAKING**: Simplified the neutral background prop API for container components. The explicit `neutral-1`, `neutral-2`, `neutral-3`, and `neutral-auto` values have been removed from `ProviderBg`. They are replaced by a single `'neutral'` value that always auto-increments from the parent context, making it impossible to skip or pin to an explicit neutral level. + +**Migration:** + +Replace any explicit `bg="neutral-1"`, `bg="neutral-2"`, `bg="neutral-3"`, or `bg="neutral-auto"` props with `bg="neutral"`. To achieve a specific neutral level in stories or tests, use nested containers — each additional `bg="neutral"` wrapper increments by one level. + +```tsx +// Before +... + +// After + + ... + +``` + +**Affected components:** Box, Flex, Grid, Card, Accordion, Popover, Tooltip, Dialog, Menu From f0974f3e6020ccb0b151e8d22203e0e77403b42e Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Wed, 25 Feb 2026 12:03:21 -0600 Subject: [PATCH 239/455] Blog - Get a jump on ContribFest Signed-off-by: Andre Wanlin --- .../2026-02-25-get-a-jump-on-contribfest.mdx | 48 ++++++++++++++++++ ...age-contribfest-kubecon-web-app-header.png | Bin 0 -> 277104 bytes 2 files changed, 48 insertions(+) create mode 100644 microsite/blog/2026-02-25-get-a-jump-on-contribfest.mdx create mode 100644 microsite/blog/assets/2026-02-25/backstage-contribfest-kubecon-web-app-header.png diff --git a/microsite/blog/2026-02-25-get-a-jump-on-contribfest.mdx b/microsite/blog/2026-02-25-get-a-jump-on-contribfest.mdx new file mode 100644 index 0000000000..7e4eacab50 --- /dev/null +++ b/microsite/blog/2026-02-25-get-a-jump-on-contribfest.mdx @@ -0,0 +1,48 @@ +--- +title: 'Get a jump on ContribFest with the new web app' +author: Elaine de Mattos Silva Bezerra, DB Systel GmbH, Heikki Hellgren, OP Financial Group & André Wanlin, Spotify +--- + +![Get a jump on ContribFest with the new web app](assets/2026-02-25/backstage-contribfest-kubecon-web-app-header.png) + +Become a Contrib Champ and join us at ContribFest, where commits become legendary! + +We are once again hosting ContribFest at KubeCon + CloudNativeCon. This time around, it's taking place in Amsterdam on March 26, 2026, at 13:45 CET — make sure to [add it to your schedule](https://kccnceu2026.sched.com/event/2EF7v/contribfest-supercharge-your-open-source-impact-backstage-contribfest-live-andre-wanlin-emma-indal-spotify-heikki-hellgren-op-financial-group-elaine-bezerra-db-systel-gmbh?iframe=no). Learn more about what to expect below and get started now by exploring the new [ContribFest web app](https://contribfest.backstage.io/). + +{/* truncate */} + +## Introducing the ContribFest web app + +We're excited to announce the new ContribFest web app: [https://contribfest.backstage.io/](https://contribfest.backstage.io/). The app simplifies local setup and helps you quickly find good issues to work on from the curated list pre-selected by your ContribFest co-hosts. + +You'll see that the app is broken down into five sections: + +* [Welcome](https://contribfest.backstage.io/): This is where you'll find links to all the things, including the session's slide deck, assignment sheet, the Backstage and Community Plugins repositories, and their respective contribution guides. +* [Getting Started](https://contribfest.backstage.io/getting-started/): Whether you are new to Backstage or an old hat, use this handy checklist to help you get your local environment set up for contributing, including all the commands. (Make sure you check all the boxes, you never know what might happen! 😉) +* [Curated Issues](https://contribfest.backstage.io/issues/): This is what you come to the session for: finding an issue that speaks to you and contributing towards it. This section has a list of issues that we've curated — and filters, so you can slice and dice the list to find the perfect issue to work on. +* [Contrib Champs](https://contribfest.backstage.io/contrib-champs/): We've hosted three other ContribFests in the past — this is where you'll find merged PRs from those sessions, a place to celebrate contributions. Make sure to tag your PRs with “ContribFest”, and maybe your name will show up here one day, too! 🏆 +* [Hall of Hosts](https://contribfest.backstage.io/hall-of-hosts/): ContribFest would not take place without the various community members who have stepped up to help co-host the sessions. This is where you'll see an honor roll of past co-hosts. 🙏 + +## About those Contrib Champs + +The goals of the Backstage ContribFest sessions are many — foster community, work with experts, etc. — but it's pretty obvious that contributions are the most important. It's in the name after all. Here are a few past contributions that we wanted to share to give you an idea of what that looks like: + +* [#27694](https://github.com/backstage/backstage/pull/27694) by [hyb175](https://github.com/hyb175) — Add Pagination to Tech Docs Table: for those with lots of entities with TechDocs, this is a massive performance improvement. +* [#29470](https://github.com/backstage/backstage/pull/29470) by [ioboi](https://github.com/ioboi) — Openshift Auth provider: this allows those using OpenShift to use it to sign into their Backstage instance. +* [#31770](https://github.com/backstage/backstage/pull/31770) by [theZMC](https://github.com/theZMC) — Render HTML in GitHub-flavored Markdown: with this change in place, HTML will now render correctly in the MarkdownContent component when you are using the GitHub-flavored Markdown mode. + +Check out the [Contrib Champs page](https://contribfest.backstage.io/contrib-champs/) to see the full list! + +## Using Dev Containers + +Along with the new ContribFest web app, we are also looking to use Dev Containers this time around to help streamline the session for those who'd like to use that option to get started. On the [Getting Started page](https://contribfest.backstage.io/getting-started/), pick the Dev Containers radio button and then follow the checklist. To give you a quick preview, you'll need to have the following installed: + +* Git, you'll need this to be able to pull down the code +* Docker Desktop (or Docker Engine on Linux) +* VS Code with the Dev Containers extension or IntelliJ IDEA Ultimate + +Check out our [Dev Containers tutorial](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/devcontainer.md) for a deeper dive into the subject. + +## Amsterdam, here we come! + +On behalf of the Backstage ContribFest co-host team, thank you for following along. We're looking forward to meeting you in Amsterdam and working together on your contributions. Please be sure to introduce yourself! \ No newline at end of file diff --git a/microsite/blog/assets/2026-02-25/backstage-contribfest-kubecon-web-app-header.png b/microsite/blog/assets/2026-02-25/backstage-contribfest-kubecon-web-app-header.png new file mode 100644 index 0000000000000000000000000000000000000000..21e726aeb7c4d8521e4332624ede47609db8a5b7 GIT binary patch literal 277104 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 ^|1ODd^9oTZId2EclHwB+7WP&NVf#GR*D9n` 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%0AEfy)i? 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�3iOkoi3v3}V5{oiYnBYc}J*A?E!GU5opc56wW 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≪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≠f4wvralqZ*ShVmG@fJ!uKsOuxQ7e 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


    ~SnLI<1LXSB}&kOdLs`F8^ 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

    00(Smv0S5U*)=poJ(L3E^!IeWG_LWK1hd4I) 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 Date: Wed, 25 Feb 2026 11:52:36 +0100 Subject: [PATCH 240/455] cli-node, cli: move yarnPlugin and SuccessCache to cli-node Move `getHasYarnPlugin` and `SuccessCache` from `@backstage/cli` internal modules to `@backstage/cli-node` as public exports, making them available for reuse by other CLI tooling. Signed-off-by: Patrik Oldsberg --- .changeset/cli-use-cli-node-utils.md | 5 +++++ .changeset/move-utils-to-cli-node.md | 5 +++++ packages/cli-node/package.json | 1 + packages/cli-node/report.api.md | 13 +++++++++++++ .../lib => cli-node/src}/cache/SuccessCache.ts | 7 ++++++- packages/cli-node/src/cache/index.ts | 17 +++++++++++++++++ packages/cli-node/src/index.ts | 4 +++- packages/cli-node/src/yarn/index.ts | 17 +++++++++++++++++ .../src/yarn}/yarnPlugin.test.ts | 0 .../src/lib => cli-node/src/yarn}/yarnPlugin.ts | 2 +- .../cli/src/modules/lint/commands/repo/lint.ts | 2 +- .../modules/migrate/commands/versions/bump.ts | 7 +++++-- .../new/lib/execution/PortableTemplater.ts | 2 +- .../cli/src/modules/test/commands/repo/test.ts | 2 +- yarn.lock | 1 + 15 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 .changeset/cli-use-cli-node-utils.md create mode 100644 .changeset/move-utils-to-cli-node.md rename packages/{cli/src/lib => cli-node/src}/cache/SuccessCache.ts (95%) create mode 100644 packages/cli-node/src/cache/index.ts create mode 100644 packages/cli-node/src/yarn/index.ts rename packages/{cli/src/lib => cli-node/src/yarn}/yarnPlugin.test.ts (100%) rename packages/{cli/src/lib => cli-node/src/yarn}/yarnPlugin.ts (96%) diff --git a/.changeset/cli-use-cli-node-utils.md b/.changeset/cli-use-cli-node-utils.md new file mode 100644 index 0000000000..6b1d6be92d --- /dev/null +++ b/.changeset/cli-use-cli-node-utils.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Migrated `getHasYarnPlugin` and `SuccessCache` to use the implementations from `@backstage/cli-node`. diff --git a/.changeset/move-utils-to-cli-node.md b/.changeset/move-utils-to-cli-node.md new file mode 100644 index 0000000000..cf91e0b54f --- /dev/null +++ b/.changeset/move-utils-to-cli-node.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli-node': patch +--- + +Added `getHasYarnPlugin` and `SuccessCache` exports, moved from `@backstage/cli`. diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 014ed56992..16cfba3c0d 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -39,6 +39,7 @@ "@yarnpkg/parsers": "^3.0.0", "fs-extra": "^11.2.0", "semver": "^7.5.3", + "yaml": "^2.0.0", "zod": "^3.25.76" }, "devDependencies": { diff --git a/packages/cli-node/report.api.md b/packages/cli-node/report.api.md index cf27d92894..372bf34206 100644 --- a/packages/cli-node/report.api.md +++ b/packages/cli-node/report.api.md @@ -93,6 +93,9 @@ export type ConcurrentTasksOptions = { worker: (item: TItem) => Promise; }; +// @public +export function getHasYarnPlugin(): Promise; + // @public export class GitUtils { static listChangedFiles(ref: string): Promise; @@ -221,6 +224,16 @@ export function runWorkerQueueThreads( results: TResult[]; }>; +// @public +export class SuccessCache { + constructor(name: string, basePath?: string); + // (undocumented) + read(): Promise>; + static trimPaths(input: string): string; + // (undocumented) + write(newEntries: Iterable): Promise; +} + // @public export type WorkerQueueThreadsOptions = { items: Iterable; diff --git a/packages/cli/src/lib/cache/SuccessCache.ts b/packages/cli-node/src/cache/SuccessCache.ts similarity index 95% rename from packages/cli/src/lib/cache/SuccessCache.ts rename to packages/cli-node/src/cache/SuccessCache.ts index 8131a469a4..ba5c07ea30 100644 --- a/packages/cli/src/lib/cache/SuccessCache.ts +++ b/packages/cli-node/src/cache/SuccessCache.ts @@ -22,6 +22,12 @@ const DEFAULT_CACHE_BASE_PATH = 'node_modules/.cache/backstage-cli'; const CACHE_MAX_AGE_MS = 7 * 24 * 3600_000; +/** + * A file-system-based cache that tracks successful operations by storing + * timestamped marker files. + * + * @public + */ export class SuccessCache { readonly #path: string; @@ -89,7 +95,6 @@ export class SuccessCache { const empty = Buffer.alloc(0); for (const key of newEntries) { - // Remove any existing items with the key we're about to add const trimmedItems = existingItems.filter(item => item.endsWith(`_${key}`), ); diff --git a/packages/cli-node/src/cache/index.ts b/packages/cli-node/src/cache/index.ts new file mode 100644 index 0000000000..53c9f0e4e4 --- /dev/null +++ b/packages/cli-node/src/cache/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2024 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { SuccessCache } from './SuccessCache'; diff --git a/packages/cli-node/src/index.ts b/packages/cli-node/src/index.ts index 5540666a05..35074507c4 100644 --- a/packages/cli-node/src/index.ts +++ b/packages/cli-node/src/index.ts @@ -20,7 +20,9 @@ * @packageDocumentation */ +export * from './cache'; +export * from './concurrency'; export * from './git'; export * from './monorepo'; -export * from './concurrency'; export * from './roles'; +export * from './yarn'; diff --git a/packages/cli-node/src/yarn/index.ts b/packages/cli-node/src/yarn/index.ts new file mode 100644 index 0000000000..21b2efca3a --- /dev/null +++ b/packages/cli-node/src/yarn/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { getHasYarnPlugin } from './yarnPlugin'; diff --git a/packages/cli/src/lib/yarnPlugin.test.ts b/packages/cli-node/src/yarn/yarnPlugin.test.ts similarity index 100% rename from packages/cli/src/lib/yarnPlugin.test.ts rename to packages/cli-node/src/yarn/yarnPlugin.test.ts diff --git a/packages/cli/src/lib/yarnPlugin.ts b/packages/cli-node/src/yarn/yarnPlugin.ts similarity index 96% rename from packages/cli/src/lib/yarnPlugin.ts rename to packages/cli-node/src/yarn/yarnPlugin.ts index 0390345651..5be89704ea 100644 --- a/packages/cli/src/lib/yarnPlugin.ts +++ b/packages/cli-node/src/yarn/yarnPlugin.ts @@ -33,12 +33,12 @@ const yarnRcSchema = z.object({ * Detects whether the Backstage Yarn plugin is installed in the target repository. * * @returns Promise - true if the plugin is installed, false otherwise + * @public */ export async function getHasYarnPlugin(): Promise { const yarnRcPath = targetPaths.resolveRoot('.yarnrc.yml'); const yarnRcContent = await fs.readFile(yarnRcPath, 'utf-8').catch(e => { if (e.code === 'ENOENT') { - // gracefully continue in case the file doesn't exist return ''; } throw e; diff --git a/packages/cli/src/modules/lint/commands/repo/lint.ts b/packages/cli/src/modules/lint/commands/repo/lint.ts index d0b4f6f37e..ad560935cd 100644 --- a/packages/cli/src/modules/lint/commands/repo/lint.ts +++ b/packages/cli/src/modules/lint/commands/repo/lint.ts @@ -28,7 +28,7 @@ import { import { targetPaths } from '@backstage/cli-common'; import { createScriptOptionsParser } from '../../lib/optionsParser'; -import { SuccessCache } from '../../../../lib/cache/SuccessCache'; +import { SuccessCache } from '@backstage/cli-node'; function depCount(pkg: BackstagePackageJson) { const deps = pkg.dependencies ? Object.keys(pkg.dependencies).length : 0; diff --git a/packages/cli/src/modules/migrate/commands/versions/bump.ts b/packages/cli/src/modules/migrate/commands/versions/bump.ts index 7ecd908d8a..943bd3ab71 100644 --- a/packages/cli/src/modules/migrate/commands/versions/bump.ts +++ b/packages/cli/src/modules/migrate/commands/versions/bump.ts @@ -30,8 +30,11 @@ import { OptionValues } from 'commander'; import { isError, NotFoundError } from '@backstage/errors'; import { resolve as resolvePath } from 'node:path'; -import { getHasYarnPlugin } from '../../../../lib/yarnPlugin'; -import { Lockfile, runConcurrentTasks } from '@backstage/cli-node'; +import { + getHasYarnPlugin, + Lockfile, + runConcurrentTasks, +} from '@backstage/cli-node'; import { fetchPackageInfo, mapDependencies, diff --git a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts index 45478957ac..bc8ff19307 100644 --- a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts +++ b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts @@ -28,7 +28,7 @@ import { Lockfile } from '@backstage/cli-node'; import { targetPaths } from '@backstage/cli-common'; import { createPackageVersionProvider } from '../../../../lib/version'; -import { getHasYarnPlugin } from '../../../../lib/yarnPlugin'; +import { getHasYarnPlugin } from '@backstage/cli-node'; const builtInHelpers = { camelCase, diff --git a/packages/cli/src/modules/test/commands/repo/test.ts b/packages/cli/src/modules/test/commands/repo/test.ts index 1f57279935..2e4095f88a 100644 --- a/packages/cli/src/modules/test/commands/repo/test.ts +++ b/packages/cli/src/modules/test/commands/repo/test.ts @@ -31,7 +31,7 @@ import { findOwnPaths, isChildPath, } from '@backstage/cli-common'; -import { SuccessCache } from '../../../../lib/cache/SuccessCache'; +import { SuccessCache } from '@backstage/cli-node'; type JestProject = { displayName: string; diff --git a/yarn.lock b/yarn.lock index 74484a0056..1447977846 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3277,6 +3277,7 @@ __metadata: "@yarnpkg/parsers": "npm:^3.0.0" fs-extra: "npm:^11.2.0" semver: "npm:^7.5.3" + yaml: "npm:^2.0.0" zod: "npm:^3.25.76" languageName: unknown linkType: soft From 968570bbb54189349c106a84f1186eeba6bb80db Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 12:46:55 +0100 Subject: [PATCH 241/455] Address review feedback - Remove cli changeset, piggy-back on existing ones - Rename getHasYarnPlugin -> hasYarnPlugin(workspaceDir?) - Make SuccessCache constructor private, add static create() - Consolidate duplicate @backstage/cli-node imports Signed-off-by: Patrik Oldsberg --- .changeset/cli-use-cli-node-utils.md | 5 ---- .changeset/move-utils-to-cli-node.md | 2 +- packages/cli-node/report.api.md | 9 +++--- packages/cli-node/src/cache/SuccessCache.ts | 6 +++- packages/cli-node/src/yarn/index.ts | 2 +- packages/cli-node/src/yarn/yarnPlugin.test.ts | 29 ++++++++++--------- packages/cli-node/src/yarn/yarnPlugin.ts | 13 ++++++--- .../src/modules/lint/commands/repo/lint.ts | 4 +-- .../modules/migrate/commands/versions/bump.ts | 12 ++++---- .../new/lib/execution/PortableTemplater.ts | 6 ++-- .../src/modules/test/commands/repo/test.ts | 5 ++-- 11 files changed, 49 insertions(+), 44 deletions(-) delete mode 100644 .changeset/cli-use-cli-node-utils.md diff --git a/.changeset/cli-use-cli-node-utils.md b/.changeset/cli-use-cli-node-utils.md deleted file mode 100644 index 6b1d6be92d..0000000000 --- a/.changeset/cli-use-cli-node-utils.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Migrated `getHasYarnPlugin` and `SuccessCache` to use the implementations from `@backstage/cli-node`. diff --git a/.changeset/move-utils-to-cli-node.md b/.changeset/move-utils-to-cli-node.md index cf91e0b54f..7c14536ccf 100644 --- a/.changeset/move-utils-to-cli-node.md +++ b/.changeset/move-utils-to-cli-node.md @@ -2,4 +2,4 @@ '@backstage/cli-node': patch --- -Added `getHasYarnPlugin` and `SuccessCache` exports, moved from `@backstage/cli`. +Added `hasYarnPlugin` and `SuccessCache` exports, moved from `@backstage/cli`. diff --git a/packages/cli-node/report.api.md b/packages/cli-node/report.api.md index 372bf34206..187f56640c 100644 --- a/packages/cli-node/report.api.md +++ b/packages/cli-node/report.api.md @@ -93,15 +93,15 @@ export type ConcurrentTasksOptions = { worker: (item: TItem) => Promise; }; -// @public -export function getHasYarnPlugin(): Promise; - // @public export class GitUtils { static listChangedFiles(ref: string): Promise; static readFileAtRef(path: string, ref: string): Promise; } +// @public +export function hasYarnPlugin(workspaceDir?: string): Promise; + // @public export function isMonoRepo(): Promise; @@ -226,7 +226,8 @@ export function runWorkerQueueThreads( // @public export class SuccessCache { - constructor(name: string, basePath?: string); + // (undocumented) + static create(name: string, basePath?: string): SuccessCache; // (undocumented) read(): Promise>; static trimPaths(input: string): string; diff --git a/packages/cli-node/src/cache/SuccessCache.ts b/packages/cli-node/src/cache/SuccessCache.ts index ba5c07ea30..62bef34137 100644 --- a/packages/cli-node/src/cache/SuccessCache.ts +++ b/packages/cli-node/src/cache/SuccessCache.ts @@ -40,7 +40,11 @@ export class SuccessCache { return input.replaceAll(targetPaths.rootDir, ''); } - constructor(name: string, basePath?: string) { + static create(name: string, basePath?: string): SuccessCache { + return new SuccessCache(name, basePath); + } + + private constructor(name: string, basePath?: string) { this.#path = resolvePath(basePath ?? DEFAULT_CACHE_BASE_PATH, name); } diff --git a/packages/cli-node/src/yarn/index.ts b/packages/cli-node/src/yarn/index.ts index 21b2efca3a..ce4eb4231c 100644 --- a/packages/cli-node/src/yarn/index.ts +++ b/packages/cli-node/src/yarn/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { getHasYarnPlugin } from './yarnPlugin'; +export { hasYarnPlugin } from './yarnPlugin'; diff --git a/packages/cli-node/src/yarn/yarnPlugin.test.ts b/packages/cli-node/src/yarn/yarnPlugin.test.ts index a07c2a2ac6..aba1dda579 100644 --- a/packages/cli-node/src/yarn/yarnPlugin.test.ts +++ b/packages/cli-node/src/yarn/yarnPlugin.test.ts @@ -16,12 +16,12 @@ import { createMockDirectory } from '@backstage/backend-test-utils'; import { overrideTargetPaths } from '@backstage/cli-common/testUtils'; -import { getHasYarnPlugin } from './yarnPlugin'; +import { hasYarnPlugin } from './yarnPlugin'; const mockDir = createMockDirectory(); overrideTargetPaths(mockDir.path); -describe('getHasYarnPlugin', () => { +describe('hasYarnPlugin', () => { beforeEach(() => { mockDir.clear(); }); @@ -29,7 +29,7 @@ describe('getHasYarnPlugin', () => { it('should return false when .yarnrc.yml does not exist', async () => { mockDir.setContent({}); - const result = await getHasYarnPlugin(); + const result = await hasYarnPlugin(); expect(result).toBe(false); }); @@ -38,7 +38,7 @@ describe('getHasYarnPlugin', () => { '.yarnrc.yml': '', }); - const result = await getHasYarnPlugin(); + const result = await hasYarnPlugin(); expect(result).toBe(false); }); @@ -47,7 +47,7 @@ describe('getHasYarnPlugin', () => { '.yarnrc.yml': 'plugins: []', }); - const result = await getHasYarnPlugin(); + const result = await hasYarnPlugin(); expect(result).toBe(false); }); @@ -60,7 +60,7 @@ plugins: `, }); - const result = await getHasYarnPlugin(); + const result = await hasYarnPlugin(); expect(result).toBe(false); }); @@ -74,7 +74,7 @@ plugins: `, }); - const result = await getHasYarnPlugin(); + const result = await hasYarnPlugin(); expect(result).toBe(true); }); @@ -86,7 +86,7 @@ plugins: `, }); - const result = await getHasYarnPlugin(); + const result = await hasYarnPlugin(); expect(result).toBe(true); }); @@ -95,7 +95,7 @@ plugins: '.yarnrc.yml': 'invalid: yaml: content: [', }); - await expect(getHasYarnPlugin()).rejects.toThrow(); + await expect(hasYarnPlugin()).rejects.toThrow(); }); it('should throw error when .yarnrc.yml has unexpected structure', async () => { @@ -105,21 +105,22 @@ plugins: "not an array" `, }); - await expect(getHasYarnPlugin()).rejects.toThrow( + await expect(hasYarnPlugin()).rejects.toThrow( 'Unexpected content in .yarnrc.yml', ); }); - it('should handle plugins with different structure', async () => { + it('should resolve from a custom workspace directory', async () => { mockDir.setContent({ - '.yarnrc.yml': ` + 'custom-dir': { + '.yarnrc.yml': ` plugins: - path: .yarn/plugins/@yarnpkg/plugin-backstage.cjs - - path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs `, + }, }); - const result = await getHasYarnPlugin(); + const result = await hasYarnPlugin(mockDir.resolve('custom-dir')); expect(result).toBe(true); }); }); diff --git a/packages/cli-node/src/yarn/yarnPlugin.ts b/packages/cli-node/src/yarn/yarnPlugin.ts index 5be89704ea..87a3b98973 100644 --- a/packages/cli-node/src/yarn/yarnPlugin.ts +++ b/packages/cli-node/src/yarn/yarnPlugin.ts @@ -15,6 +15,7 @@ */ import fs from 'fs-extra'; +import { resolve as resolvePath } from 'node:path'; import yaml from 'yaml'; import z from 'zod'; import { targetPaths } from '@backstage/cli-common'; @@ -30,13 +31,17 @@ const yarnRcSchema = z.object({ }); /** - * Detects whether the Backstage Yarn plugin is installed in the target repository. + * Detects whether the Backstage Yarn plugin is installed in the given workspace directory. * - * @returns Promise - true if the plugin is installed, false otherwise + * @param workspaceDir - The workspace root directory to check. Defaults to the target root. + * @returns Promise resolving to true if the plugin is installed, false otherwise * @public */ -export async function getHasYarnPlugin(): Promise { - const yarnRcPath = targetPaths.resolveRoot('.yarnrc.yml'); +export async function hasYarnPlugin(workspaceDir?: string): Promise { + const yarnRcPath = resolvePath( + workspaceDir ?? targetPaths.rootDir, + '.yarnrc.yml', + ); const yarnRcContent = await fs.readFile(yarnRcPath, 'utf-8').catch(e => { if (e.code === 'ENOENT') { return ''; diff --git a/packages/cli/src/modules/lint/commands/repo/lint.ts b/packages/cli/src/modules/lint/commands/repo/lint.ts index ad560935cd..4351725d57 100644 --- a/packages/cli/src/modules/lint/commands/repo/lint.ts +++ b/packages/cli/src/modules/lint/commands/repo/lint.ts @@ -24,11 +24,11 @@ import { BackstagePackageJson, Lockfile, runWorkerQueueThreads, + SuccessCache, } from '@backstage/cli-node'; import { targetPaths } from '@backstage/cli-common'; import { createScriptOptionsParser } from '../../lib/optionsParser'; -import { SuccessCache } from '@backstage/cli-node'; function depCount(pkg: BackstagePackageJson) { const deps = pkg.dependencies ? Object.keys(pkg.dependencies).length : 0; @@ -41,7 +41,7 @@ function depCount(pkg: BackstagePackageJson) { export async function command(opts: OptionValues, cmd: Command): Promise { let packages = await PackageGraph.listTargetPackages(); - const cache = new SuccessCache('lint', opts.successCacheDir); + const cache = SuccessCache.create('lint', opts.successCacheDir); const cacheContext = opts.successCache ? { entries: await cache.read(), diff --git a/packages/cli/src/modules/migrate/commands/versions/bump.ts b/packages/cli/src/modules/migrate/commands/versions/bump.ts index 943bd3ab71..4b15da4676 100644 --- a/packages/cli/src/modules/migrate/commands/versions/bump.ts +++ b/packages/cli/src/modules/migrate/commands/versions/bump.ts @@ -31,7 +31,7 @@ import { isError, NotFoundError } from '@backstage/errors'; import { resolve as resolvePath } from 'node:path'; import { - getHasYarnPlugin, + hasYarnPlugin, Lockfile, runConcurrentTasks, } from '@backstage/cli-node'; @@ -76,7 +76,7 @@ function extendsDefaultPattern(pattern: string): boolean { export default async (opts: OptionValues) => { const lockfilePath = targetPaths.resolveRoot('yarn.lock'); const lockfile = await Lockfile.load(lockfilePath); - const hasYarnPlugin = await getHasYarnPlugin(); + const yarnPluginEnabled = await hasYarnPlugin(); let pattern = opts.pattern; @@ -130,7 +130,7 @@ export default async (opts: OptionValues) => { }); } - if (hasYarnPlugin) { + if (yarnPluginEnabled) { console.log(); console.log( `Updating yarn plugin to v${releaseManifest.releaseVersion}...`, @@ -214,7 +214,7 @@ export default async (opts: OptionValues) => { const oldLockfileRange = await asLockfileVersion(oldRange); const useBackstageRange = - hasYarnPlugin && + yarnPluginEnabled && // Only use backstage:^ versions if the package is present in // the manifest for the release we're bumping to. releaseManifest.packages.find( @@ -254,7 +254,7 @@ export default async (opts: OptionValues) => { if (extendsDefaultPattern(pattern)) { await bumpBackstageJsonVersion( releaseManifest.releaseVersion, - hasYarnPlugin, + yarnPluginEnabled, ); } else { console.log( @@ -319,7 +319,7 @@ export default async (opts: OptionValues) => { console.log(); } - if (hasYarnPlugin) { + if (yarnPluginEnabled) { console.log(); console.log( chalk.blue( diff --git a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts index bc8ff19307..2c94e3639d 100644 --- a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts +++ b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts @@ -28,7 +28,7 @@ import { Lockfile } from '@backstage/cli-node'; import { targetPaths } from '@backstage/cli-common'; import { createPackageVersionProvider } from '../../../../lib/version'; -import { getHasYarnPlugin } from '@backstage/cli-node'; +import { hasYarnPlugin } from '@backstage/cli-node'; const builtInHelpers = { camelCase, @@ -55,9 +55,9 @@ export class PortableTemplater { /* ignored */ } - const hasYarnPlugin = await getHasYarnPlugin(); + const yarnPluginEnabled = await hasYarnPlugin(); const versionProvider = createPackageVersionProvider(lockfile, { - preferBackstageProtocol: hasYarnPlugin, + preferBackstageProtocol: yarnPluginEnabled, }); const templater = new PortableTemplater( diff --git a/packages/cli/src/modules/test/commands/repo/test.ts b/packages/cli/src/modules/test/commands/repo/test.ts index 2e4095f88a..0ccac5c9b5 100644 --- a/packages/cli/src/modules/test/commands/repo/test.ts +++ b/packages/cli/src/modules/test/commands/repo/test.ts @@ -22,7 +22,7 @@ import yargs from 'yargs'; import { run as runJest, yargsOptions as jestYargsOptions } from 'jest-cli'; import { relative as relativePath } from 'node:path'; import { Command, OptionValues } from 'commander'; -import { Lockfile, PackageGraph } from '@backstage/cli-node'; +import { Lockfile, PackageGraph, SuccessCache } from '@backstage/cli-node'; import { runCheck, @@ -31,7 +31,6 @@ import { findOwnPaths, isChildPath, } from '@backstage/cli-common'; -import { SuccessCache } from '@backstage/cli-node'; type JestProject = { displayName: string; @@ -333,7 +332,7 @@ export async function command(opts: OptionValues, cmd: Command): Promise { ); } - const cache = new SuccessCache('test', opts.successCacheDir); + const cache = SuccessCache.create('test', opts.successCacheDir); const graph = await getPackageGraph(); // Shared state for the bridge From 09eb6b518779f8328969f90dae90a534e3dd2c68 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 15:25:11 +0100 Subject: [PATCH 242/455] Address further review feedback - Rename hasYarnPlugin -> hasBackstageYarnPlugin for clarity - Change SuccessCache.create to accept an options object Signed-off-by: Patrik Oldsberg --- .changeset/move-utils-to-cli-node.md | 2 +- packages/cli-node/report.api.md | 4 ++-- packages/cli-node/src/cache/SuccessCache.ts | 11 ++++++---- packages/cli-node/src/yarn/index.ts | 2 +- packages/cli-node/src/yarn/yarnPlugin.test.ts | 22 +++++++++---------- packages/cli-node/src/yarn/yarnPlugin.ts | 4 +++- .../src/modules/lint/commands/repo/lint.ts | 5 ++++- .../modules/migrate/commands/versions/bump.ts | 4 ++-- .../new/lib/execution/PortableTemplater.ts | 4 ++-- .../src/modules/test/commands/repo/test.ts | 5 ++++- 10 files changed, 37 insertions(+), 26 deletions(-) diff --git a/.changeset/move-utils-to-cli-node.md b/.changeset/move-utils-to-cli-node.md index 7c14536ccf..f708dde666 100644 --- a/.changeset/move-utils-to-cli-node.md +++ b/.changeset/move-utils-to-cli-node.md @@ -2,4 +2,4 @@ '@backstage/cli-node': patch --- -Added `hasYarnPlugin` and `SuccessCache` exports, moved from `@backstage/cli`. +Added `hasBackstageYarnPlugin` and `SuccessCache` exports, moved from `@backstage/cli`. diff --git a/packages/cli-node/report.api.md b/packages/cli-node/report.api.md index 187f56640c..9d4887ca59 100644 --- a/packages/cli-node/report.api.md +++ b/packages/cli-node/report.api.md @@ -100,7 +100,7 @@ export class GitUtils { } // @public -export function hasYarnPlugin(workspaceDir?: string): Promise; +export function hasBackstageYarnPlugin(workspaceDir?: string): Promise; // @public export function isMonoRepo(): Promise; @@ -227,7 +227,7 @@ export function runWorkerQueueThreads( // @public export class SuccessCache { // (undocumented) - static create(name: string, basePath?: string): SuccessCache; + static create(options: { name: string; basePath?: string }): SuccessCache; // (undocumented) read(): Promise>; static trimPaths(input: string): string; diff --git a/packages/cli-node/src/cache/SuccessCache.ts b/packages/cli-node/src/cache/SuccessCache.ts index 62bef34137..78913ed0b6 100644 --- a/packages/cli-node/src/cache/SuccessCache.ts +++ b/packages/cli-node/src/cache/SuccessCache.ts @@ -40,12 +40,15 @@ export class SuccessCache { return input.replaceAll(targetPaths.rootDir, ''); } - static create(name: string, basePath?: string): SuccessCache { - return new SuccessCache(name, basePath); + static create(options: { name: string; basePath?: string }): SuccessCache { + return new SuccessCache(options); } - private constructor(name: string, basePath?: string) { - this.#path = resolvePath(basePath ?? DEFAULT_CACHE_BASE_PATH, name); + private constructor(options: { name: string; basePath?: string }) { + this.#path = resolvePath( + options.basePath ?? DEFAULT_CACHE_BASE_PATH, + options.name, + ); } async read(): Promise> { diff --git a/packages/cli-node/src/yarn/index.ts b/packages/cli-node/src/yarn/index.ts index ce4eb4231c..871aa14ca8 100644 --- a/packages/cli-node/src/yarn/index.ts +++ b/packages/cli-node/src/yarn/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { hasYarnPlugin } from './yarnPlugin'; +export { hasBackstageYarnPlugin } from './yarnPlugin'; diff --git a/packages/cli-node/src/yarn/yarnPlugin.test.ts b/packages/cli-node/src/yarn/yarnPlugin.test.ts index aba1dda579..ecbff45ba7 100644 --- a/packages/cli-node/src/yarn/yarnPlugin.test.ts +++ b/packages/cli-node/src/yarn/yarnPlugin.test.ts @@ -16,12 +16,12 @@ import { createMockDirectory } from '@backstage/backend-test-utils'; import { overrideTargetPaths } from '@backstage/cli-common/testUtils'; -import { hasYarnPlugin } from './yarnPlugin'; +import { hasBackstageYarnPlugin } from './yarnPlugin'; const mockDir = createMockDirectory(); overrideTargetPaths(mockDir.path); -describe('hasYarnPlugin', () => { +describe('hasBackstageYarnPlugin', () => { beforeEach(() => { mockDir.clear(); }); @@ -29,7 +29,7 @@ describe('hasYarnPlugin', () => { it('should return false when .yarnrc.yml does not exist', async () => { mockDir.setContent({}); - const result = await hasYarnPlugin(); + const result = await hasBackstageYarnPlugin(); expect(result).toBe(false); }); @@ -38,7 +38,7 @@ describe('hasYarnPlugin', () => { '.yarnrc.yml': '', }); - const result = await hasYarnPlugin(); + const result = await hasBackstageYarnPlugin(); expect(result).toBe(false); }); @@ -47,7 +47,7 @@ describe('hasYarnPlugin', () => { '.yarnrc.yml': 'plugins: []', }); - const result = await hasYarnPlugin(); + const result = await hasBackstageYarnPlugin(); expect(result).toBe(false); }); @@ -60,7 +60,7 @@ plugins: `, }); - const result = await hasYarnPlugin(); + const result = await hasBackstageYarnPlugin(); expect(result).toBe(false); }); @@ -74,7 +74,7 @@ plugins: `, }); - const result = await hasYarnPlugin(); + const result = await hasBackstageYarnPlugin(); expect(result).toBe(true); }); @@ -86,7 +86,7 @@ plugins: `, }); - const result = await hasYarnPlugin(); + const result = await hasBackstageYarnPlugin(); expect(result).toBe(true); }); @@ -95,7 +95,7 @@ plugins: '.yarnrc.yml': 'invalid: yaml: content: [', }); - await expect(hasYarnPlugin()).rejects.toThrow(); + await expect(hasBackstageYarnPlugin()).rejects.toThrow(); }); it('should throw error when .yarnrc.yml has unexpected structure', async () => { @@ -105,7 +105,7 @@ plugins: "not an array" `, }); - await expect(hasYarnPlugin()).rejects.toThrow( + await expect(hasBackstageYarnPlugin()).rejects.toThrow( 'Unexpected content in .yarnrc.yml', ); }); @@ -120,7 +120,7 @@ plugins: }, }); - const result = await hasYarnPlugin(mockDir.resolve('custom-dir')); + const result = await hasBackstageYarnPlugin(mockDir.resolve('custom-dir')); expect(result).toBe(true); }); }); diff --git a/packages/cli-node/src/yarn/yarnPlugin.ts b/packages/cli-node/src/yarn/yarnPlugin.ts index 87a3b98973..65383edd0c 100644 --- a/packages/cli-node/src/yarn/yarnPlugin.ts +++ b/packages/cli-node/src/yarn/yarnPlugin.ts @@ -37,7 +37,9 @@ const yarnRcSchema = z.object({ * @returns Promise resolving to true if the plugin is installed, false otherwise * @public */ -export async function hasYarnPlugin(workspaceDir?: string): Promise { +export async function hasBackstageYarnPlugin( + workspaceDir?: string, +): Promise { const yarnRcPath = resolvePath( workspaceDir ?? targetPaths.rootDir, '.yarnrc.yml', diff --git a/packages/cli/src/modules/lint/commands/repo/lint.ts b/packages/cli/src/modules/lint/commands/repo/lint.ts index 4351725d57..a3ae69302c 100644 --- a/packages/cli/src/modules/lint/commands/repo/lint.ts +++ b/packages/cli/src/modules/lint/commands/repo/lint.ts @@ -41,7 +41,10 @@ function depCount(pkg: BackstagePackageJson) { export async function command(opts: OptionValues, cmd: Command): Promise { let packages = await PackageGraph.listTargetPackages(); - const cache = SuccessCache.create('lint', opts.successCacheDir); + const cache = SuccessCache.create({ + name: 'lint', + basePath: opts.successCacheDir, + }); const cacheContext = opts.successCache ? { entries: await cache.read(), diff --git a/packages/cli/src/modules/migrate/commands/versions/bump.ts b/packages/cli/src/modules/migrate/commands/versions/bump.ts index 4b15da4676..8fe7013ac8 100644 --- a/packages/cli/src/modules/migrate/commands/versions/bump.ts +++ b/packages/cli/src/modules/migrate/commands/versions/bump.ts @@ -31,7 +31,7 @@ import { isError, NotFoundError } from '@backstage/errors'; import { resolve as resolvePath } from 'node:path'; import { - hasYarnPlugin, + hasBackstageYarnPlugin, Lockfile, runConcurrentTasks, } from '@backstage/cli-node'; @@ -76,7 +76,7 @@ function extendsDefaultPattern(pattern: string): boolean { export default async (opts: OptionValues) => { const lockfilePath = targetPaths.resolveRoot('yarn.lock'); const lockfile = await Lockfile.load(lockfilePath); - const yarnPluginEnabled = await hasYarnPlugin(); + const yarnPluginEnabled = await hasBackstageYarnPlugin(); let pattern = opts.pattern; diff --git a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts index 2c94e3639d..42285259b3 100644 --- a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts +++ b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts @@ -28,7 +28,7 @@ import { Lockfile } from '@backstage/cli-node'; import { targetPaths } from '@backstage/cli-common'; import { createPackageVersionProvider } from '../../../../lib/version'; -import { hasYarnPlugin } from '@backstage/cli-node'; +import { hasBackstageYarnPlugin } from '@backstage/cli-node'; const builtInHelpers = { camelCase, @@ -55,7 +55,7 @@ export class PortableTemplater { /* ignored */ } - const yarnPluginEnabled = await hasYarnPlugin(); + const yarnPluginEnabled = await hasBackstageYarnPlugin(); const versionProvider = createPackageVersionProvider(lockfile, { preferBackstageProtocol: yarnPluginEnabled, }); diff --git a/packages/cli/src/modules/test/commands/repo/test.ts b/packages/cli/src/modules/test/commands/repo/test.ts index 0ccac5c9b5..53f86fd635 100644 --- a/packages/cli/src/modules/test/commands/repo/test.ts +++ b/packages/cli/src/modules/test/commands/repo/test.ts @@ -332,7 +332,10 @@ export async function command(opts: OptionValues, cmd: Command): Promise { ); } - const cache = SuccessCache.create('test', opts.successCacheDir); + const cache = SuccessCache.create({ + name: 'test', + basePath: opts.successCacheDir, + }); const graph = await getPackageGraph(); // Shared state for the bridge From fb14783d9b137c51e7020a7b3ca03e7b3a726cf6 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 15:42:07 +0100 Subject: [PATCH 243/455] ci: trigger Signed-off-by: Patrik Oldsberg Co-authored-by: Cursor From b6412b1b4436643cdb756ff70907a9b6cdeaa4ea Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Wed, 25 Feb 2026 13:32:32 -0600 Subject: [PATCH 244/455] Prettier Signed-off-by: Andre Wanlin --- .../2026-02-25-get-a-jump-on-contribfest.mdx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/microsite/blog/2026-02-25-get-a-jump-on-contribfest.mdx b/microsite/blog/2026-02-25-get-a-jump-on-contribfest.mdx index 7e4eacab50..67941fa436 100644 --- a/microsite/blog/2026-02-25-get-a-jump-on-contribfest.mdx +++ b/microsite/blog/2026-02-25-get-a-jump-on-contribfest.mdx @@ -17,19 +17,19 @@ We're excited to announce the new ContribFest web app: [https://contribfest.back You'll see that the app is broken down into five sections: -* [Welcome](https://contribfest.backstage.io/): This is where you'll find links to all the things, including the session's slide deck, assignment sheet, the Backstage and Community Plugins repositories, and their respective contribution guides. -* [Getting Started](https://contribfest.backstage.io/getting-started/): Whether you are new to Backstage or an old hat, use this handy checklist to help you get your local environment set up for contributing, including all the commands. (Make sure you check all the boxes, you never know what might happen! 😉) -* [Curated Issues](https://contribfest.backstage.io/issues/): This is what you come to the session for: finding an issue that speaks to you and contributing towards it. This section has a list of issues that we've curated — and filters, so you can slice and dice the list to find the perfect issue to work on. -* [Contrib Champs](https://contribfest.backstage.io/contrib-champs/): We've hosted three other ContribFests in the past — this is where you'll find merged PRs from those sessions, a place to celebrate contributions. Make sure to tag your PRs with “ContribFest”, and maybe your name will show up here one day, too! 🏆 -* [Hall of Hosts](https://contribfest.backstage.io/hall-of-hosts/): ContribFest would not take place without the various community members who have stepped up to help co-host the sessions. This is where you'll see an honor roll of past co-hosts. 🙏 +- [Welcome](https://contribfest.backstage.io/): This is where you'll find links to all the things, including the session's slide deck, assignment sheet, the Backstage and Community Plugins repositories, and their respective contribution guides. +- [Getting Started](https://contribfest.backstage.io/getting-started/): Whether you are new to Backstage or an old hat, use this handy checklist to help you get your local environment set up for contributing, including all the commands. (Make sure you check all the boxes, you never know what might happen! 😉) +- [Curated Issues](https://contribfest.backstage.io/issues/): This is what you come to the session for: finding an issue that speaks to you and contributing towards it. This section has a list of issues that we've curated — and filters, so you can slice and dice the list to find the perfect issue to work on. +- [Contrib Champs](https://contribfest.backstage.io/contrib-champs/): We've hosted three other ContribFests in the past — this is where you'll find merged PRs from those sessions, a place to celebrate contributions. Make sure to tag your PRs with “ContribFest”, and maybe your name will show up here one day, too! 🏆 +- [Hall of Hosts](https://contribfest.backstage.io/hall-of-hosts/): ContribFest would not take place without the various community members who have stepped up to help co-host the sessions. This is where you'll see an honor roll of past co-hosts. 🙏 ## About those Contrib Champs The goals of the Backstage ContribFest sessions are many — foster community, work with experts, etc. — but it's pretty obvious that contributions are the most important. It's in the name after all. Here are a few past contributions that we wanted to share to give you an idea of what that looks like: -* [#27694](https://github.com/backstage/backstage/pull/27694) by [hyb175](https://github.com/hyb175) — Add Pagination to Tech Docs Table: for those with lots of entities with TechDocs, this is a massive performance improvement. -* [#29470](https://github.com/backstage/backstage/pull/29470) by [ioboi](https://github.com/ioboi) — Openshift Auth provider: this allows those using OpenShift to use it to sign into their Backstage instance. -* [#31770](https://github.com/backstage/backstage/pull/31770) by [theZMC](https://github.com/theZMC) — Render HTML in GitHub-flavored Markdown: with this change in place, HTML will now render correctly in the MarkdownContent component when you are using the GitHub-flavored Markdown mode. +- [#27694](https://github.com/backstage/backstage/pull/27694) by [hyb175](https://github.com/hyb175) — Add Pagination to Tech Docs Table: for those with lots of entities with TechDocs, this is a massive performance improvement. +- [#29470](https://github.com/backstage/backstage/pull/29470) by [ioboi](https://github.com/ioboi) — Openshift Auth provider: this allows those using OpenShift to use it to sign into their Backstage instance. +- [#31770](https://github.com/backstage/backstage/pull/31770) by [theZMC](https://github.com/theZMC) — Render HTML in GitHub-flavored Markdown: with this change in place, HTML will now render correctly in the MarkdownContent component when you are using the GitHub-flavored Markdown mode. Check out the [Contrib Champs page](https://contribfest.backstage.io/contrib-champs/) to see the full list! @@ -37,12 +37,12 @@ Check out the [Contrib Champs page](https://contribfest.backstage.io/contrib-cha Along with the new ContribFest web app, we are also looking to use Dev Containers this time around to help streamline the session for those who'd like to use that option to get started. On the [Getting Started page](https://contribfest.backstage.io/getting-started/), pick the Dev Containers radio button and then follow the checklist. To give you a quick preview, you'll need to have the following installed: -* Git, you'll need this to be able to pull down the code -* Docker Desktop (or Docker Engine on Linux) -* VS Code with the Dev Containers extension or IntelliJ IDEA Ultimate +- Git, you'll need this to be able to pull down the code +- Docker Desktop (or Docker Engine on Linux) +- VS Code with the Dev Containers extension or IntelliJ IDEA Ultimate Check out our [Dev Containers tutorial](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/devcontainer.md) for a deeper dive into the subject. ## Amsterdam, here we come! -On behalf of the Backstage ContribFest co-host team, thank you for following along. We're looking forward to meeting you in Amsterdam and working together on your contributions. Please be sure to introduce yourself! \ No newline at end of file +On behalf of the Backstage ContribFest co-host team, thank you for following along. We're looking forward to meeting you in Amsterdam and working together on your contributions. Please be sure to introduce yourself! From 1afa036222f5e0002835b3760badafa57125ec9a Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Wed, 25 Feb 2026 19:46:17 +0000 Subject: [PATCH 245/455] Cleanup Signed-off-by: Charles de Dreuille --- docs-ui/src/app/snippets.ts | 8 +++--- packages/ui/report.api.md | 27 +++---------------- packages/ui/src/components/Flex/definition.ts | 9 +------ packages/ui/src/components/Grid/definition.ts | 18 ++----------- packages/ui/src/hooks/useBg.tsx | 12 ++++++--- 5 files changed, 18 insertions(+), 56 deletions(-) diff --git a/docs-ui/src/app/snippets.ts b/docs-ui/src/app/snippets.ts index e16463a085..4a93c31831 100644 --- a/docs-ui/src/app/snippets.ts +++ b/docs-ui/src/app/snippets.ts @@ -1,19 +1,19 @@ export const surfacesSnippet = ` - + - + `; -export const adaptiveSnippet = ` +export const adaptiveSnippet = ` {/* automatically set background to neutral-2 */} `; -export const customCardSnippet = ` +export const customCardSnippet = ` Hello World `; diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index 3ca30cd73c..1a015747a8 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -1012,14 +1012,7 @@ export const FlexDefinition: { 'direction', ]; readonly dataAttributes: { - readonly bg: readonly [ - 'neutral-1', - 'neutral-2', - 'neutral-3', - 'danger', - 'warning', - 'success', - ]; + readonly bg: readonly ['neutral', 'danger', 'warning', 'success']; }; }; @@ -1096,14 +1089,7 @@ export const GridDefinition: { 'py', ]; readonly dataAttributes: { - readonly bg: readonly [ - 'neutral-1', - 'neutral-2', - 'neutral-3', - 'danger', - 'warning', - 'success', - ]; + readonly bg: readonly ['neutral', 'danger', 'warning', 'success']; }; }; @@ -1114,14 +1100,7 @@ export const GridItemDefinition: { }; readonly utilityProps: ['colSpan', 'colEnd', 'colStart', 'rowSpan']; readonly dataAttributes: { - readonly bg: readonly [ - 'neutral-1', - 'neutral-2', - 'neutral-3', - 'danger', - 'warning', - 'success', - ]; + readonly bg: readonly ['neutral', 'danger', 'warning', 'success']; }; }; diff --git a/packages/ui/src/components/Flex/definition.ts b/packages/ui/src/components/Flex/definition.ts index d0452d6b2c..2701ce5e10 100644 --- a/packages/ui/src/components/Flex/definition.ts +++ b/packages/ui/src/components/Flex/definition.ts @@ -45,13 +45,6 @@ export const FlexDefinition = { 'direction', ], dataAttributes: { - bg: [ - 'neutral-1', - 'neutral-2', - 'neutral-3', - 'danger', - 'warning', - 'success', - ] as const, + bg: ['neutral', 'danger', 'warning', 'success'] as const, }, } as const satisfies ComponentDefinition; diff --git a/packages/ui/src/components/Grid/definition.ts b/packages/ui/src/components/Grid/definition.ts index c3acb59274..2f417ab34b 100644 --- a/packages/ui/src/components/Grid/definition.ts +++ b/packages/ui/src/components/Grid/definition.ts @@ -43,14 +43,7 @@ export const GridDefinition = { 'py', ], dataAttributes: { - bg: [ - 'neutral-1', - 'neutral-2', - 'neutral-3', - 'danger', - 'warning', - 'success', - ] as const, + bg: ['neutral', 'danger', 'warning', 'success'] as const, }, } as const satisfies ComponentDefinition; @@ -64,13 +57,6 @@ export const GridItemDefinition = { }, utilityProps: ['colSpan', 'colEnd', 'colStart', 'rowSpan'], dataAttributes: { - bg: [ - 'neutral-1', - 'neutral-2', - 'neutral-3', - 'danger', - 'warning', - 'success', - ] as const, + bg: ['neutral', 'danger', 'warning', 'success'] as const, }, } as const satisfies ComponentDefinition; diff --git a/packages/ui/src/hooks/useBg.tsx b/packages/ui/src/hooks/useBg.tsx index e67c47da49..2284e5f337 100644 --- a/packages/ui/src/hooks/useBg.tsx +++ b/packages/ui/src/hooks/useBg.tsx @@ -108,10 +108,14 @@ export function useBgConsumer(): BgContextValue { * * - `bg` is `undefined` -- transparent, no context change, returns `{ bg: undefined }`. * This is the default for Box, Flex, and Grid (they do **not** auto-increment). - * - `bg` is `'neutral'` -- increments the neutral level from the parent context, - * capping at `neutral-3`. The increment is always relative to the parent; it is - * not possible to pin a container to an explicit neutral level. - * - `bg` is `'danger'` | `'warning'` | `'success'` -- used as-is. + * - `bg` is `'neutral'` -- when the parent bg is neutral, increments the neutral + * level from the parent context, capping at `neutral-3`. When the parent bg is + * an intent (`'danger'` | `'warning'` | `'success'`), the intent passes through + * unchanged (i.e. `bg: 'neutral'` does not override the parent intent). The + * increment is always relative to the parent; it is not possible to pin a + * container to an explicit neutral level. + * - `bg` is `'danger'` | `'warning'` | `'success'` -- sets the bg to that intent + * explicitly, regardless of the parent value. * * **Capping:** * From 0cb56465ddc86f6a6f00f598c0ccb2e17c7efe82 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 10:51:57 +0100 Subject: [PATCH 246/455] fix(module-federation): remove trailing slash from `@mui/material/styles` shared dependency key The shared dependency key `@mui/material/styles/` (with trailing slash) caused module resolution failures because MUI's package.json exports map only defines `./styles`, not `./styles/`. This resulted in errors like: Package subpath './styles/' is not defined by "exports" in @mui/material/package.json Signed-off-by: Patrik Oldsberg --- .changeset/fix-mui-styles-shared-dep.md | 5 +++++ .patches/pr-32996.txt | 1 + packages/frontend-dynamic-feature-loader/src/loader.test.tsx | 2 +- packages/module-federation-common/src/defaults.ts | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 .changeset/fix-mui-styles-shared-dep.md create mode 100644 .patches/pr-32996.txt diff --git a/.changeset/fix-mui-styles-shared-dep.md b/.changeset/fix-mui-styles-shared-dep.md new file mode 100644 index 0000000000..0154c15559 --- /dev/null +++ b/.changeset/fix-mui-styles-shared-dep.md @@ -0,0 +1,5 @@ +--- +'@backstage/module-federation-common': patch +--- + +Fixed the `@mui/material/styles` shared dependency key by removing a trailing slash that caused module resolution failures with MUI package exports. diff --git a/.patches/pr-32996.txt b/.patches/pr-32996.txt new file mode 100644 index 0000000000..2dd0fde602 --- /dev/null +++ b/.patches/pr-32996.txt @@ -0,0 +1 @@ +Fixes the `@mui/material/styles` shared dependency key by removing a trailing slash that caused module resolution failures with MUI package exports. \ No newline at end of file diff --git a/packages/frontend-dynamic-feature-loader/src/loader.test.tsx b/packages/frontend-dynamic-feature-loader/src/loader.test.tsx index cb066e8b21..081b3c730a 100644 --- a/packages/frontend-dynamic-feature-loader/src/loader.test.tsx +++ b/packages/frontend-dynamic-feature-loader/src/loader.test.tsx @@ -165,7 +165,7 @@ describe('dynamicFrontendFeaturesLoader', () => { shareConfig: { singleton: true, requiredVersion: '*', eager: true }, }, { - name: '@mui/material/styles/', + name: '@mui/material/styles', version: '5.16.14', lib: async () => ({ default: {} }), shareConfig: { singleton: true, requiredVersion: '*', eager: true }, diff --git a/packages/module-federation-common/src/defaults.ts b/packages/module-federation-common/src/defaults.ts index 27e0e292cf..644d4ee480 100644 --- a/packages/module-federation-common/src/defaults.ts +++ b/packages/module-federation-common/src/defaults.ts @@ -55,7 +55,7 @@ const defaultSharedDependencies = { // MUI v5 // not setting import: false for MUI packages as this // will break once Backstage moves to BUI - '@mui/material/styles/': { + '@mui/material/styles': { host: {}, remote: {}, }, From cb6f3907edd0ea8c32a181a312899f49a1492585 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 23:28:48 +0100 Subject: [PATCH 247/455] microsite: add missing status field to plugin directory entry Signed-off-by: Patrik Oldsberg --- .../plugins/balajisiva-backstage-plugin-template-builder.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/microsite/data/plugins/balajisiva-backstage-plugin-template-builder.yaml b/microsite/data/plugins/balajisiva-backstage-plugin-template-builder.yaml index 91ea3e5c6e..6b8227c629 100644 --- a/microsite/data/plugins/balajisiva-backstage-plugin-template-builder.yaml +++ b/microsite/data/plugins/balajisiva-backstage-plugin-template-builder.yaml @@ -8,3 +8,4 @@ documentation: https://github.com/balajisiva/backstage-template-builder#readme iconUrl: https://raw.githubusercontent.com/balajisiva/backstage-template-builder/main/plugins/backstage-template-builder/icon.svg npmPackageName: '@balajisiva/backstage-plugin-template-builder' addedDate: '2026-02-16' +status: active From c482b2c385722b290e6c3551934fd27287e6f136 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 23:35:46 +0100 Subject: [PATCH 248/455] ci: run CI for changes to microsite/data/ The paths-ignore for microsite/** was also skipping CI for changes to microsite/data/plugins/, which is where the plugin directory YAML files live. This meant the verify plugin directory step never ran for the files it was supposed to validate. Switch from paths-ignore to paths with negation so that microsite/data/ changes still trigger CI while other microsite changes remain excluded. Signed-off-by: Patrik Oldsberg --- .github/workflows/ci-noop.yml | 1 + .github/workflows/ci.yml | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index d9851778c6..0fca26a12c 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -6,6 +6,7 @@ on: pull_request: paths: - 'microsite/**' + - '!microsite/data/**' - 'beps/**' permissions: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ac6120d28..8f2b4af0f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,11 @@ name: CI on: # NOTE: If you change these you must update ci-noop.yml as well pull_request: - paths-ignore: - - 'microsite/**' - - 'beps/**' + paths: + - '**' + - '!microsite/**' + - 'microsite/data/**' + - '!beps/**' concurrency: group: ${{ github.workflow }}-${{ github.ref }} From beab3cc456d3d3408e5785d391ce86b8fd57a39f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 25 Feb 2026 23:06:11 +0100 Subject: [PATCH 249/455] cli: eliminate src/lib/ directory and last cross-module import Split version.ts into two locations: - Template version provider moved to modules/new/lib/version.ts - CLI version info moved to wiring/version.ts Remove publishPreflightCheck from repo fix command (still runs during package prepack). Fix build module self-references to use shorter within-module paths. Signed-off-by: Patrik Oldsberg --- .changeset/cli-final-lib-cleanup.md | 5 ++ .../commands/package/start/startFrontend.ts | 4 +- .../src/modules/build/lib/bundler/config.ts | 2 +- .../modules/maintenance/commands/repo/fix.ts | 4 -- .../new/lib/execution/PortableTemplater.ts | 2 +- .../src/{ => modules/new}/lib/version.test.ts | 0 .../cli/src/{ => modules/new}/lib/version.ts | 57 +++++++------------ packages/cli/src/wiring/CliInitializer.ts | 2 +- packages/cli/src/wiring/version.ts | 29 ++++++++++ 9 files changed, 61 insertions(+), 44 deletions(-) create mode 100644 .changeset/cli-final-lib-cleanup.md rename packages/cli/src/{ => modules/new}/lib/version.test.ts (100%) rename packages/cli/src/{ => modules/new}/lib/version.ts (62%) create mode 100644 packages/cli/src/wiring/version.ts diff --git a/.changeset/cli-final-lib-cleanup.md b/.changeset/cli-final-lib-cleanup.md new file mode 100644 index 0000000000..0884a7fc11 --- /dev/null +++ b/.changeset/cli-final-lib-cleanup.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Internal refactor to remove the `src/lib/` directory and eliminate the last cross-module import in the CLI package. diff --git a/packages/cli/src/modules/build/commands/package/start/startFrontend.ts b/packages/cli/src/modules/build/commands/package/start/startFrontend.ts index c81fd2fd66..689cd20f7a 100644 --- a/packages/cli/src/modules/build/commands/package/start/startFrontend.ts +++ b/packages/cli/src/modules/build/commands/package/start/startFrontend.ts @@ -19,11 +19,11 @@ import { resolve as resolvePath } from 'node:path'; import { getModuleFederationRemoteOptions, serveBundle, -} from '../../../../build/lib/bundler'; +} from '../../../lib/bundler'; import { targetPaths } from '@backstage/cli-common'; import { BackstagePackageJson } from '@backstage/cli-node'; -import { hasReactDomClient } from '../../../../build/lib/bundler/hasReactDomClient'; +import { hasReactDomClient } from '../../../lib/bundler/hasReactDomClient'; interface StartAppOptions { verifyVersions?: boolean; diff --git a/packages/cli/src/modules/build/lib/bundler/config.ts b/packages/cli/src/modules/build/lib/bundler/config.ts index 1fe81cbec8..c3676ecf70 100644 --- a/packages/cli/src/modules/build/lib/bundler/config.ts +++ b/packages/cli/src/modules/build/lib/bundler/config.ts @@ -32,7 +32,7 @@ import pickBy from 'lodash/pickBy'; import { runOutput, targetPaths } from '@backstage/cli-common'; import { transforms } from './transforms'; -import { version } from '../../../../lib/version'; +import { version } from '../../../../wiring/version'; import yn from 'yn'; import { hasReactDomClient } from './hasReactDomClient'; import { createWorkspaceLinkingPlugins } from './linkWorkspaces'; diff --git a/packages/cli/src/modules/maintenance/commands/repo/fix.ts b/packages/cli/src/modules/maintenance/commands/repo/fix.ts index cb745b9b48..de09d8b490 100644 --- a/packages/cli/src/modules/maintenance/commands/repo/fix.ts +++ b/packages/cli/src/modules/maintenance/commands/repo/fix.ts @@ -31,8 +31,6 @@ import { } from 'node:path'; import { targetPaths } from '@backstage/cli-common'; -import { publishPreflightCheck } from '../../../build/lib/publishing'; - const SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx', '.json']; /** @@ -507,8 +505,6 @@ export async function command(opts: OptionValues): Promise { fixPluginId, fixPluginPackages, fixPeerModules, - // Run the publish preflight check too, to make sure we don't uncover errors during publishing - publishPreflightCheck, ); } diff --git a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts index 42285259b3..dd6f43b9a7 100644 --- a/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts +++ b/packages/cli/src/modules/new/lib/execution/PortableTemplater.ts @@ -27,7 +27,7 @@ import lowerFirst from 'lodash/lowerFirst'; import { Lockfile } from '@backstage/cli-node'; import { targetPaths } from '@backstage/cli-common'; -import { createPackageVersionProvider } from '../../../../lib/version'; +import { createPackageVersionProvider } from '../version'; import { hasBackstageYarnPlugin } from '@backstage/cli-node'; const builtInHelpers = { diff --git a/packages/cli/src/lib/version.test.ts b/packages/cli/src/modules/new/lib/version.test.ts similarity index 100% rename from packages/cli/src/lib/version.test.ts rename to packages/cli/src/modules/new/lib/version.test.ts diff --git a/packages/cli/src/lib/version.ts b/packages/cli/src/modules/new/lib/version.ts similarity index 62% rename from packages/cli/src/lib/version.ts rename to packages/cli/src/modules/new/lib/version.ts index 94337710d6..0849e8a9e8 100644 --- a/packages/cli/src/lib/version.ts +++ b/packages/cli/src/modules/new/lib/version.ts @@ -14,14 +14,9 @@ * limitations under the License. */ -import fs from 'fs-extra'; import semver from 'semver'; -import { findOwnPaths } from '@backstage/cli-common'; import { Lockfile } from '@backstage/cli-node'; -/* eslint-disable-next-line no-restricted-syntax */ -const ownPaths = findOwnPaths(__dirname); - /* eslint-disable @backstage/no-relative-monorepo-imports */ /* This is a list of all packages used by the templates. If dependencies are added or removed, @@ -35,28 +30,28 @@ This does not create an actual dependency on these packages and does not bring i Rollup will extract the value of the version field in each package at build time without leaving any imports in place. */ -import { version as backendPluginApi } from '../../../../packages/backend-plugin-api/package.json'; -import { version as backendTestUtils } from '../../../../packages/backend-test-utils/package.json'; -import { version as catalogClient } from '../../../../packages/catalog-client/package.json'; -import { version as cli } from '../../../../packages/cli/package.json'; -import { version as config } from '../../../../packages/config/package.json'; -import { version as coreAppApi } from '../../../../packages/core-app-api/package.json'; -import { version as coreComponents } from '../../../../packages/core-components/package.json'; -import { version as corePluginApi } from '../../../../packages/core-plugin-api/package.json'; -import { version as devUtils } from '../../../../packages/dev-utils/package.json'; -import { version as errors } from '../../../../packages/errors/package.json'; -import { version as frontendDefaults } from '../../../../packages/frontend-defaults/package.json'; -import { version as frontendPluginApi } from '../../../../packages/frontend-plugin-api/package.json'; -import { version as frontendTestUtils } from '../../../../packages/frontend-test-utils/package.json'; -import { version as testUtils } from '../../../../packages/test-utils/package.json'; -import { version as scaffolderNode } from '../../../../plugins/scaffolder-node/package.json'; -import { version as scaffolderNodeTestUtils } from '../../../../plugins/scaffolder-node-test-utils/package.json'; -import { version as authBackend } from '../../../../plugins/auth-backend/package.json'; -import { version as authBackendModuleGuestProvider } from '../../../../plugins/auth-backend-module-guest-provider/package.json'; -import { version as catalogNode } from '../../../../plugins/catalog-node/package.json'; -import { version as theme } from '../../../../packages/theme/package.json'; -import { version as types } from '../../../../packages/types/package.json'; -import { version as backendDefaults } from '../../../../packages/backend-defaults/package.json'; +import { version as backendPluginApi } from '../../../../../../packages/backend-plugin-api/package.json'; +import { version as backendTestUtils } from '../../../../../../packages/backend-test-utils/package.json'; +import { version as catalogClient } from '../../../../../../packages/catalog-client/package.json'; +import { version as cli } from '../../../../../../packages/cli/package.json'; +import { version as config } from '../../../../../../packages/config/package.json'; +import { version as coreAppApi } from '../../../../../../packages/core-app-api/package.json'; +import { version as coreComponents } from '../../../../../../packages/core-components/package.json'; +import { version as corePluginApi } from '../../../../../../packages/core-plugin-api/package.json'; +import { version as devUtils } from '../../../../../../packages/dev-utils/package.json'; +import { version as errors } from '../../../../../../packages/errors/package.json'; +import { version as frontendDefaults } from '../../../../../../packages/frontend-defaults/package.json'; +import { version as frontendPluginApi } from '../../../../../../packages/frontend-plugin-api/package.json'; +import { version as frontendTestUtils } from '../../../../../../packages/frontend-test-utils/package.json'; +import { version as testUtils } from '../../../../../../packages/test-utils/package.json'; +import { version as scaffolderNode } from '../../../../../../plugins/scaffolder-node/package.json'; +import { version as scaffolderNodeTestUtils } from '../../../../../../plugins/scaffolder-node-test-utils/package.json'; +import { version as authBackend } from '../../../../../../plugins/auth-backend/package.json'; +import { version as authBackendModuleGuestProvider } from '../../../../../../plugins/auth-backend-module-guest-provider/package.json'; +import { version as catalogNode } from '../../../../../../plugins/catalog-node/package.json'; +import { version as theme } from '../../../../../../packages/theme/package.json'; +import { version as types } from '../../../../../../packages/types/package.json'; +import { version as backendDefaults } from '../../../../../../packages/backend-defaults/package.json'; export const packageVersions: Record = { '@backstage/backend-defaults': backendDefaults, @@ -84,14 +79,6 @@ export const packageVersions: Record = { '@backstage/plugin-catalog-node': catalogNode, }; -export function findVersion() { - const pkgContent = fs.readFileSync(ownPaths.resolve('package.json'), 'utf8'); - return JSON.parse(pkgContent).version; -} - -export const version = findVersion(); -export const isDev = fs.pathExistsSync(ownPaths.resolve('src')); - export function createPackageVersionProvider( lockfile?: Lockfile, options?: { diff --git a/packages/cli/src/wiring/CliInitializer.ts b/packages/cli/src/wiring/CliInitializer.ts index 8d0b844c78..a605199179 100644 --- a/packages/cli/src/wiring/CliInitializer.ts +++ b/packages/cli/src/wiring/CliInitializer.ts @@ -18,7 +18,7 @@ import { CommandGraph } from './CommandGraph'; import { CliFeature, OpaqueCliPlugin } from './types'; import { CommandRegistry } from './CommandRegistry'; import { Command } from 'commander'; -import { version } from '../lib/version'; +import { version } from './version'; import chalk from 'chalk'; import { exitWithError } from './errors'; import { ForwardedError } from '@backstage/errors'; diff --git a/packages/cli/src/wiring/version.ts b/packages/cli/src/wiring/version.ts new file mode 100644 index 0000000000..d7d0b3a2fe --- /dev/null +++ b/packages/cli/src/wiring/version.ts @@ -0,0 +1,29 @@ +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import fs from 'fs-extra'; +import { findOwnPaths } from '@backstage/cli-common'; + +/* eslint-disable-next-line no-restricted-syntax */ +const ownPaths = findOwnPaths(__dirname); + +export function findVersion() { + const pkgContent = fs.readFileSync(ownPaths.resolve('package.json'), 'utf8'); + return JSON.parse(pkgContent).version; +} + +export const version = findVersion(); +export const isDev = fs.pathExistsSync(ownPaths.resolve('src')); From 3aa4af57ecdebd72239a33afa2c33ff68ba2f78a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 22:57:15 +0000 Subject: [PATCH 250/455] build(deps): bump basic-ftp from 5.0.3 to 5.2.0 Bumps [basic-ftp](https://github.com/patrickjuchli/basic-ftp) from 5.0.3 to 5.2.0. - [Release notes](https://github.com/patrickjuchli/basic-ftp/releases) - [Changelog](https://github.com/patrickjuchli/basic-ftp/blob/master/CHANGELOG.md) - [Commits](https://github.com/patrickjuchli/basic-ftp/compare/v5.0.3...v5.2.0) --- updated-dependencies: - dependency-name: basic-ftp dependency-version: 5.2.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1447977846..8650a19f0e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26091,9 +26091,9 @@ __metadata: linkType: hard "basic-ftp@npm:^5.0.2": - version: 5.0.3 - resolution: "basic-ftp@npm:5.0.3" - checksum: 10/8f69811a7f4088c5ae39025f1a662522aad517b4065365fbbe80676dc9ccf7a188463dfcb2d9573af2af859d7de70015f612c20a04a311b520efbf7c21dc1ff2 + version: 5.2.0 + resolution: "basic-ftp@npm:5.2.0" + checksum: 10/f5a15d789aa98859af4da9e976154b2aeae19052e1762dc68d259d2bce631dafa40c667aa06d7346cd630aa6f9cc9a26f515b468e0bd24243fbae2149c7d01ad languageName: node linkType: hard From 5411f0a8f83aa0cab6b894a484f7e4e3ce3c56a1 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 00:03:40 +0100 Subject: [PATCH 251/455] remove changeset Signed-off-by: Patrik Oldsberg --- .changeset/cli-final-lib-cleanup.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/cli-final-lib-cleanup.md diff --git a/.changeset/cli-final-lib-cleanup.md b/.changeset/cli-final-lib-cleanup.md deleted file mode 100644 index 0884a7fc11..0000000000 --- a/.changeset/cli-final-lib-cleanup.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Internal refactor to remove the `src/lib/` directory and eliminate the last cross-module import in the CLI package. From 4d588942d5c78be5707ff513182f568df66f984b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 00:15:17 +0100 Subject: [PATCH 252/455] Add group aliases and configurable content ordering to entity page Add two new configuration features for entity page groups: - Group alias IDs: groups can declare aliases so that content targeting an aliased group ID is included in the aliasing group - Configurable content ordering: a new contentOrder option (alpha/natural) controls how content items within each group are sorted, with support for both a page-level default and per-group overrides. The new default is alpha (alphabetical by title). Signed-off-by: Patrik Oldsberg --- ...page-group-aliases-and-ordering-catalog.md | 5 + .../entity-page-group-aliases-and-ordering.md | 5 + packages/app/app-config.yaml | 5 + plugins/catalog-react/report-alpha.api.md | 13 +- .../src/alpha/blueprints/extensionData.tsx | 15 +- .../src/alpha/blueprints/index.ts | 1 + plugins/catalog/report-alpha.api.md | 6 + .../components/EntityLayout/EntityLayout.tsx | 3 + .../components/EntityTabs/EntityTabs.tsx | 4 +- .../components/EntityTabs/EntityTabsList.tsx | 47 ++++- plugins/catalog/src/alpha/pages.test.tsx | 180 ++++++++++++++++++ plugins/catalog/src/alpha/pages.tsx | 5 + 12 files changed, 275 insertions(+), 14 deletions(-) create mode 100644 .changeset/entity-page-group-aliases-and-ordering-catalog.md create mode 100644 .changeset/entity-page-group-aliases-and-ordering.md diff --git a/.changeset/entity-page-group-aliases-and-ordering-catalog.md b/.changeset/entity-page-group-aliases-and-ordering-catalog.md new file mode 100644 index 0000000000..b29bd483bc --- /dev/null +++ b/.changeset/entity-page-group-aliases-and-ordering-catalog.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +Added support for group alias IDs and configurable content ordering on the entity page. Groups can now declare `aliases` so that content targeting an aliased group is included in the group. A new `contentOrder` option (default `alpha`) controls how content items within each group are sorted, with support for both a page-level default and per-group overrides. diff --git a/.changeset/entity-page-group-aliases-and-ordering.md b/.changeset/entity-page-group-aliases-and-ordering.md new file mode 100644 index 0000000000..35b18063d9 --- /dev/null +++ b/.changeset/entity-page-group-aliases-and-ordering.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': minor +--- + +Added `aliases` and `contentOrder` fields to `EntityContentGroupDefinition`, allowing groups to declare alias IDs and control the sort order of their content items. diff --git a/packages/app/app-config.yaml b/packages/app/app-config.yaml index 0fef43fbb5..d22a7e2fbd 100644 --- a/packages/app/app-config.yaml +++ b/packages/app/app-config.yaml @@ -48,6 +48,8 @@ app: - page:catalog/entity: config: showNavItemIcons: true + # default content order for all groups, can be 'alpha' or 'natural' + # contentOrder: alpha groups: # placing a tab at the beginning - overview: @@ -58,6 +60,9 @@ app: - documentation: title: Docs icon: docs + # example aliasing a group + # aliases: + # - docs - deployment: title: Deployments # example adding a new group diff --git a/plugins/catalog-react/report-alpha.api.md b/plugins/catalog-react/report-alpha.api.md index acd85b5540..a9a054da26 100644 --- a/plugins/catalog-react/report-alpha.api.md +++ b/plugins/catalog-react/report-alpha.api.md @@ -339,13 +339,18 @@ export const EntityContentBlueprint: ExtensionBlueprint<{ }; }>; +// @alpha (undocumented) +export type EntityContentGroupDefinition = { + title: string; + icon?: string | ReactElement; + aliases?: string[]; + contentOrder?: 'alpha' | 'natural'; +}; + // @alpha (undocumented) export type EntityContentGroupDefinitions = Record< string, - { - title: string; - icon?: string | ReactElement; - } + EntityContentGroupDefinition >; // @alpha (undocumented) diff --git a/plugins/catalog-react/src/alpha/blueprints/extensionData.tsx b/plugins/catalog-react/src/alpha/blueprints/extensionData.tsx index 83b9aa983b..292c9f367a 100644 --- a/plugins/catalog-react/src/alpha/blueprints/extensionData.tsx +++ b/plugins/catalog-react/src/alpha/blueprints/extensionData.tsx @@ -41,13 +41,20 @@ export const entityFilterExpressionDataRef = id: 'catalog.entity-filter-expression', }); +/** @alpha */ +export type EntityContentGroupDefinition = { + title: string; + icon?: string | ReactElement; + /** Other group IDs that should be treated as aliases for this group. */ + aliases?: string[]; + /** How to sort the content items within this group. Overrides the page-level default. */ + contentOrder?: 'alpha' | 'natural'; +}; + /** @alpha */ export type EntityContentGroupDefinitions = Record< string, - { - title: string; - icon?: string | ReactElement; - } + EntityContentGroupDefinition >; /** diff --git a/plugins/catalog-react/src/alpha/blueprints/index.ts b/plugins/catalog-react/src/alpha/blueprints/index.ts index 07401018cb..507511358e 100644 --- a/plugins/catalog-react/src/alpha/blueprints/index.ts +++ b/plugins/catalog-react/src/alpha/blueprints/index.ts @@ -24,6 +24,7 @@ export { EntityHeaderBlueprint } from './EntityHeaderBlueprint'; export { defaultEntityContentGroups, defaultEntityContentGroupDefinitions, + type EntityContentGroupDefinition, type EntityContentGroupDefinitions, } from './extensionData'; export type { EntityCardType } from './extensionData'; diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index c2d856561f..d164c4401f 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -1097,9 +1097,12 @@ const _default: OverridableFrontendPlugin< { title: string; icon?: string | undefined; + contentOrder?: 'alpha' | 'natural' | undefined; + aliases?: string[] | undefined; } >[] | undefined; + contentOrder: 'alpha' | 'natural'; showNavItemIcons: boolean; path: string | undefined; title: string | undefined; @@ -1111,10 +1114,13 @@ const _default: OverridableFrontendPlugin< { title: string; icon?: string | undefined; + contentOrder?: 'alpha' | 'natural' | undefined; + aliases?: string[] | undefined; } >[] | undefined; showNavItemIcons?: boolean | undefined; + contentOrder?: 'alpha' | 'natural' | undefined; title?: string | undefined; path?: string | undefined; }; diff --git a/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx b/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx index ee6e2fc012..1e86c92ef8 100644 --- a/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx +++ b/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx @@ -80,6 +80,7 @@ export interface EntityLayoutProps { */ parentEntityRelations?: string[]; groupDefinitions: EntityContentGroupDefinitions; + defaultContentOrder?: 'alpha' | 'natural'; showNavItemIcons?: boolean; } @@ -110,6 +111,7 @@ export const EntityLayout = (props: EntityLayoutProps) => { NotFoundComponent, parentEntityRelations, groupDefinitions, + defaultContentOrder, showNavItemIcons, } = props; const { kind } = useRouteRefParams(entityRouteRef); @@ -164,6 +166,7 @@ export const EntityLayout = (props: EntityLayoutProps) => { )} diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx index ed737266a5..14a2e755a6 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx @@ -72,11 +72,12 @@ export function useSelectedSubRoute(subRoutes: SubRoute[]): { type EntityTabsProps = { routes: SubRoute[]; groupDefinitions: EntityContentGroupDefinitions; + defaultContentOrder?: 'alpha' | 'natural'; showIcons?: boolean; }; export function EntityTabs(props: EntityTabsProps) { - const { routes, groupDefinitions, showIcons } = props; + const { routes, groupDefinitions, defaultContentOrder, showIcons } = props; const { index, route, element } = useSelectedSubRoute(routes); @@ -107,6 +108,7 @@ export function EntityTabs(props: EntityTabsProps) { selectedIndex={index} showIcons={showIcons} groupDefinitions={groupDefinitions} + defaultContentOrder={defaultContentOrder} /> diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx index 9267e083f5..3f5d735e30 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx @@ -78,6 +78,7 @@ type TabGroup = { type EntityTabsListProps = { tabs: Tab[]; groupDefinitions: EntityContentGroupDefinitions; + defaultContentOrder?: 'alpha' | 'natural'; showIcons?: boolean; selectedIndex?: number; }; @@ -86,12 +87,36 @@ export function EntityTabsList(props: EntityTabsListProps) { const styles = useStyles(); const { t } = useTranslationRef(catalogTranslationRef); - const { tabs: items, selectedIndex = 0, showIcons, groupDefinitions } = props; + const { + tabs: items, + selectedIndex = 0, + showIcons, + groupDefinitions, + defaultContentOrder = 'alpha', + } = props; + + const aliasToGroup = useMemo( + () => + Object.entries(groupDefinitions).reduce((map, [groupId, def]) => { + for (const alias of def.aliases ?? []) { + map[alias] = groupId; + } + return map; + }, {} as Record), + [groupDefinitions], + ); const groups = useMemo(() => { const byKey = items.reduce((result, tab) => { - const group = tab.group ? groupDefinitions[tab.group] : undefined; - const groupOrId = group && tab.group ? tab.group : tab.id; + const resolvedGroupId = tab.group + ? groupDefinitions[tab.group] + ? tab.group + : aliasToGroup[tab.group] + : undefined; + const group = resolvedGroupId + ? groupDefinitions[resolvedGroupId] + : undefined; + const groupOrId = group && resolvedGroupId ? resolvedGroupId : tab.id; result[groupOrId] = result[groupOrId] ?? { group, items: [], @@ -101,7 +126,7 @@ export function EntityTabsList(props: EntityTabsListProps) { }, {} as Record); const groupOrder = Object.keys(groupDefinitions); - return Object.entries(byKey).sort(([a], [b]) => { + const sorted = Object.entries(byKey).sort(([a], [b]) => { const ai = groupOrder.indexOf(a); const bi = groupOrder.indexOf(b); if (ai !== -1 && bi !== -1) { @@ -115,7 +140,19 @@ export function EntityTabsList(props: EntityTabsListProps) { } return 0; }); - }, [items, groupDefinitions]); + + for (const [id, tabGroup] of sorted) { + const groupDef = groupDefinitions[id]; + const order = groupDef?.contentOrder ?? defaultContentOrder; + if (order === 'alpha') { + tabGroup.items.sort((a, b) => + a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }), + ); + } + } + + return sorted; + }, [items, groupDefinitions, aliasToGroup, defaultContentOrder]); const selectedItem = items[selectedIndex]; return ( diff --git a/plugins/catalog/src/alpha/pages.test.tsx b/plugins/catalog/src/alpha/pages.test.tsx index e6bf4a05cf..2c6dfb5c9f 100644 --- a/plugins/catalog/src/alpha/pages.test.tsx +++ b/plugins/catalog/src/alpha/pages.test.tsx @@ -428,6 +428,186 @@ describe('Entity page', () => { expect(screen.getAllByRole('tab')[1]).toHaveTextContent('Overview'); }); + it('Should resolve group aliases', async () => { + const tester = createExtensionTester( + Object.assign({ namespace: 'catalog' }, catalogEntityPage), + { + config: { + groups: [ + { + docs: { title: 'Docs', aliases: ['documentation'] }, + }, + ], + }, + }, + ) + .add(techdocsEntityContent) + .add(apidocsEntityContent); + + await renderInTestApp(tester.reactElement(), { + apis: [ + [catalogApiRef, mockCatalogApi], + [starredEntitiesApiRef, mockStarredEntitiesApi], + ], + config: { + app: { + title: 'Custom app', + }, + backend: { baseUrl: 'http://localhost:7000' }, + }, + mountedRoutes: { + '/catalog': convertLegacyRouteRef(rootRouteRef), + '/catalog/:namespace/:kind/:name': + convertLegacyRouteRef(entityRouteRef), + }, + }); + + await waitFor(() => + expect(screen.getByRole('tab', { name: /Docs/ })).toBeInTheDocument(), + ); + + await userEvent.click(screen.getByRole('tab', { name: /Docs/ })); + + await waitFor(() => + expect( + screen.getByRole('button', { name: /TechDocs/ }), + ).toHaveAttribute('href', '/techdocs'), + ); + + await waitFor(() => + expect(screen.getByRole('button', { name: /ApiDocs/ })).toHaveAttribute( + 'href', + '/apidocs', + ), + ); + }); + + it('Should sort content alphabetically by default', async () => { + const tester = createExtensionTester( + Object.assign({ namespace: 'catalog' }, catalogEntityPage), + ) + .add(techdocsEntityContent) + .add(apidocsEntityContent); + + await renderInTestApp(tester.reactElement(), { + apis: [ + [catalogApiRef, mockCatalogApi], + [starredEntitiesApiRef, mockStarredEntitiesApi], + ], + config: { + app: { + title: 'Custom app', + }, + backend: { baseUrl: 'http://localhost:7000' }, + }, + mountedRoutes: { + '/catalog': convertLegacyRouteRef(rootRouteRef), + '/catalog/:namespace/:kind/:name': + convertLegacyRouteRef(entityRouteRef), + }, + }); + + await userEvent.click( + await screen.findByRole('tab', { name: /Documentation/ }), + ); + + const buttons = await screen.findAllByRole('button', { + name: /Docs/, + }); + expect(buttons[0]).toHaveTextContent('ApiDocs'); + expect(buttons[1]).toHaveTextContent('TechDocs'); + }); + + it('Should preserve natural order when configured', async () => { + const tester = createExtensionTester( + Object.assign({ namespace: 'catalog' }, catalogEntityPage), + { + config: { + contentOrder: 'natural', + }, + }, + ) + .add(techdocsEntityContent) + .add(apidocsEntityContent); + + await renderInTestApp(tester.reactElement(), { + apis: [ + [catalogApiRef, mockCatalogApi], + [starredEntitiesApiRef, mockStarredEntitiesApi], + ], + config: { + app: { + title: 'Custom app', + }, + backend: { baseUrl: 'http://localhost:7000' }, + }, + mountedRoutes: { + '/catalog': convertLegacyRouteRef(rootRouteRef), + '/catalog/:namespace/:kind/:name': + convertLegacyRouteRef(entityRouteRef), + }, + }); + + await userEvent.click( + await screen.findByRole('tab', { name: /Documentation/ }), + ); + + const buttons = await screen.findAllByRole('button', { + name: /Docs/, + }); + expect(buttons[0]).toHaveTextContent('TechDocs'); + expect(buttons[1]).toHaveTextContent('ApiDocs'); + }); + + it('Should support per-group content order override', async () => { + const tester = createExtensionTester( + Object.assign({ namespace: 'catalog' }, catalogEntityPage), + { + config: { + contentOrder: 'alpha', + groups: [ + { + documentation: { + title: 'Documentation', + contentOrder: 'natural', + }, + }, + ], + }, + }, + ) + .add(techdocsEntityContent) + .add(apidocsEntityContent); + + await renderInTestApp(tester.reactElement(), { + apis: [ + [catalogApiRef, mockCatalogApi], + [starredEntitiesApiRef, mockStarredEntitiesApi], + ], + config: { + app: { + title: 'Custom app', + }, + backend: { baseUrl: 'http://localhost:7000' }, + }, + mountedRoutes: { + '/catalog': convertLegacyRouteRef(rootRouteRef), + '/catalog/:namespace/:kind/:name': + convertLegacyRouteRef(entityRouteRef), + }, + }); + + await userEvent.click( + await screen.findByRole('tab', { name: /Documentation/ }), + ); + + const buttons = await screen.findAllByRole('button', { + name: /Docs/, + }); + expect(buttons[0]).toHaveTextContent('TechDocs'); + expect(buttons[1]).toHaveTextContent('ApiDocs'); + }); + it('Should render groups on the correct order', async () => { const tester = createExtensionTester( Object.assign({ namespace: 'catalog' }, catalogEntityPage), diff --git a/plugins/catalog/src/alpha/pages.tsx b/plugins/catalog/src/alpha/pages.tsx index acb9ec8d51..40aa217442 100644 --- a/plugins/catalog/src/alpha/pages.tsx +++ b/plugins/catalog/src/alpha/pages.tsx @@ -109,10 +109,14 @@ export const catalogEntityPage = PageBlueprint.makeWithOverrides({ z.object({ title: z.string(), icon: z.string().optional(), + aliases: z.array(z.string()).optional(), + contentOrder: z.enum(['alpha', 'natural']).optional(), }), ), ) .optional(), + contentOrder: z => + z.enum(['alpha', 'natural']).optional().default('alpha'), showNavItemIcons: z => z.boolean().optional().default(false), }, }, @@ -174,6 +178,7 @@ export const catalogEntityPage = PageBlueprint.makeWithOverrides({ header={header} contextMenuItems={filteredMenuItems} groupDefinitions={groupDefinitions} + defaultContentOrder={config.contentOrder} showNavItemIcons={config.showNavItemIcons} > {inputs.contents.map(output => ( From deb4476146018f963c879dfcdaa09de2a76555a0 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 00:32:23 +0100 Subject: [PATCH 253/455] Address review feedback - Rename 'alpha' to 'title' for content order enum value - Inline EntityContentGroupDefinition type into EntityContentGroupDefinitions - Rename defaultContentOrder prop to contentOrder - Apply content ordering to ungrouped tabs as well - Fix no-nested-ternary lint error Signed-off-by: Patrik Oldsberg --- ...page-group-aliases-and-ordering-catalog.md | 2 +- packages/app/app-config.yaml | 4 +-- plugins/catalog-react/report-alpha.api.md | 15 ++++---- .../src/alpha/blueprints/extensionData.tsx | 19 +++++------ .../src/alpha/blueprints/index.ts | 1 - plugins/catalog/report-alpha.api.md | 8 ++--- .../components/EntityLayout/EntityLayout.tsx | 6 ++-- .../components/EntityTabs/EntityTabs.tsx | 6 ++-- .../components/EntityTabs/EntityTabsList.tsx | 34 +++++++++++++------ plugins/catalog/src/alpha/pages.test.tsx | 4 +-- plugins/catalog/src/alpha/pages.tsx | 6 ++-- 11 files changed, 56 insertions(+), 49 deletions(-) diff --git a/.changeset/entity-page-group-aliases-and-ordering-catalog.md b/.changeset/entity-page-group-aliases-and-ordering-catalog.md index b29bd483bc..c2a17ae773 100644 --- a/.changeset/entity-page-group-aliases-and-ordering-catalog.md +++ b/.changeset/entity-page-group-aliases-and-ordering-catalog.md @@ -2,4 +2,4 @@ '@backstage/plugin-catalog': minor --- -Added support for group alias IDs and configurable content ordering on the entity page. Groups can now declare `aliases` so that content targeting an aliased group is included in the group. A new `contentOrder` option (default `alpha`) controls how content items within each group are sorted, with support for both a page-level default and per-group overrides. +Added support for group alias IDs and configurable content ordering on the entity page. Groups can now declare `aliases` so that content targeting an aliased group is included in the group. A new `contentOrder` option (default `title`) controls how content items within each group are sorted, with support for both a page-level default and per-group overrides. diff --git a/packages/app/app-config.yaml b/packages/app/app-config.yaml index d22a7e2fbd..0e49365c08 100644 --- a/packages/app/app-config.yaml +++ b/packages/app/app-config.yaml @@ -48,8 +48,8 @@ app: - page:catalog/entity: config: showNavItemIcons: true - # default content order for all groups, can be 'alpha' or 'natural' - # contentOrder: alpha + # default content order for all groups, can be 'title' or 'natural' + # contentOrder: title groups: # placing a tab at the beginning - overview: diff --git a/plugins/catalog-react/report-alpha.api.md b/plugins/catalog-react/report-alpha.api.md index a9a054da26..9c76a221dc 100644 --- a/plugins/catalog-react/report-alpha.api.md +++ b/plugins/catalog-react/report-alpha.api.md @@ -339,18 +339,15 @@ export const EntityContentBlueprint: ExtensionBlueprint<{ }; }>; -// @alpha (undocumented) -export type EntityContentGroupDefinition = { - title: string; - icon?: string | ReactElement; - aliases?: string[]; - contentOrder?: 'alpha' | 'natural'; -}; - // @alpha (undocumented) export type EntityContentGroupDefinitions = Record< string, - EntityContentGroupDefinition + { + title: string; + icon?: string | ReactElement; + aliases?: string[]; + contentOrder?: 'title' | 'natural'; + } >; // @alpha (undocumented) diff --git a/plugins/catalog-react/src/alpha/blueprints/extensionData.tsx b/plugins/catalog-react/src/alpha/blueprints/extensionData.tsx index 292c9f367a..04c13db484 100644 --- a/plugins/catalog-react/src/alpha/blueprints/extensionData.tsx +++ b/plugins/catalog-react/src/alpha/blueprints/extensionData.tsx @@ -41,20 +41,17 @@ export const entityFilterExpressionDataRef = id: 'catalog.entity-filter-expression', }); -/** @alpha */ -export type EntityContentGroupDefinition = { - title: string; - icon?: string | ReactElement; - /** Other group IDs that should be treated as aliases for this group. */ - aliases?: string[]; - /** How to sort the content items within this group. Overrides the page-level default. */ - contentOrder?: 'alpha' | 'natural'; -}; - /** @alpha */ export type EntityContentGroupDefinitions = Record< string, - EntityContentGroupDefinition + { + title: string; + icon?: string | ReactElement; + /** Other group IDs that should be treated as aliases for this group. */ + aliases?: string[]; + /** How to sort the content items within this group. Overrides the page-level default. */ + contentOrder?: 'title' | 'natural'; + } >; /** diff --git a/plugins/catalog-react/src/alpha/blueprints/index.ts b/plugins/catalog-react/src/alpha/blueprints/index.ts index 507511358e..07401018cb 100644 --- a/plugins/catalog-react/src/alpha/blueprints/index.ts +++ b/plugins/catalog-react/src/alpha/blueprints/index.ts @@ -24,7 +24,6 @@ export { EntityHeaderBlueprint } from './EntityHeaderBlueprint'; export { defaultEntityContentGroups, defaultEntityContentGroupDefinitions, - type EntityContentGroupDefinition, type EntityContentGroupDefinitions, } from './extensionData'; export type { EntityCardType } from './extensionData'; diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index d164c4401f..2c44d0cefc 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -1097,12 +1097,12 @@ const _default: OverridableFrontendPlugin< { title: string; icon?: string | undefined; - contentOrder?: 'alpha' | 'natural' | undefined; + contentOrder?: 'title' | 'natural' | undefined; aliases?: string[] | undefined; } >[] | undefined; - contentOrder: 'alpha' | 'natural'; + contentOrder: 'title' | 'natural'; showNavItemIcons: boolean; path: string | undefined; title: string | undefined; @@ -1114,13 +1114,13 @@ const _default: OverridableFrontendPlugin< { title: string; icon?: string | undefined; - contentOrder?: 'alpha' | 'natural' | undefined; + contentOrder?: 'title' | 'natural' | undefined; aliases?: string[] | undefined; } >[] | undefined; + contentOrder?: 'title' | 'natural' | undefined; showNavItemIcons?: boolean | undefined; - contentOrder?: 'alpha' | 'natural' | undefined; title?: string | undefined; path?: string | undefined; }; diff --git a/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx b/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx index 1e86c92ef8..ecee929cde 100644 --- a/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx +++ b/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx @@ -80,7 +80,7 @@ export interface EntityLayoutProps { */ parentEntityRelations?: string[]; groupDefinitions: EntityContentGroupDefinitions; - defaultContentOrder?: 'alpha' | 'natural'; + contentOrder?: 'title' | 'natural'; showNavItemIcons?: boolean; } @@ -111,7 +111,7 @@ export const EntityLayout = (props: EntityLayoutProps) => { NotFoundComponent, parentEntityRelations, groupDefinitions, - defaultContentOrder, + contentOrder, showNavItemIcons, } = props; const { kind } = useRouteRefParams(entityRouteRef); @@ -166,7 +166,7 @@ export const EntityLayout = (props: EntityLayoutProps) => { )} diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx index 14a2e755a6..22ae70d726 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx @@ -72,12 +72,12 @@ export function useSelectedSubRoute(subRoutes: SubRoute[]): { type EntityTabsProps = { routes: SubRoute[]; groupDefinitions: EntityContentGroupDefinitions; - defaultContentOrder?: 'alpha' | 'natural'; + contentOrder?: 'title' | 'natural'; showIcons?: boolean; }; export function EntityTabs(props: EntityTabsProps) { - const { routes, groupDefinitions, defaultContentOrder, showIcons } = props; + const { routes, groupDefinitions, contentOrder, showIcons } = props; const { index, route, element } = useSelectedSubRoute(routes); @@ -108,7 +108,7 @@ export function EntityTabs(props: EntityTabsProps) { selectedIndex={index} showIcons={showIcons} groupDefinitions={groupDefinitions} - defaultContentOrder={defaultContentOrder} + contentOrder={contentOrder} /> diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx index 3f5d735e30..e55129c573 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx @@ -78,11 +78,25 @@ type TabGroup = { type EntityTabsListProps = { tabs: Tab[]; groupDefinitions: EntityContentGroupDefinitions; - defaultContentOrder?: 'alpha' | 'natural'; + contentOrder?: 'title' | 'natural'; showIcons?: boolean; selectedIndex?: number; }; +function resolveGroupId( + tabGroup: string | undefined, + groupDefinitions: EntityContentGroupDefinitions, + aliasToGroup: Record, +): string | undefined { + if (!tabGroup) { + return undefined; + } + if (groupDefinitions[tabGroup]) { + return tabGroup; + } + return aliasToGroup[tabGroup]; +} + export function EntityTabsList(props: EntityTabsListProps) { const styles = useStyles(); const { t } = useTranslationRef(catalogTranslationRef); @@ -92,7 +106,7 @@ export function EntityTabsList(props: EntityTabsListProps) { selectedIndex = 0, showIcons, groupDefinitions, - defaultContentOrder = 'alpha', + contentOrder = 'title', } = props; const aliasToGroup = useMemo( @@ -108,11 +122,11 @@ export function EntityTabsList(props: EntityTabsListProps) { const groups = useMemo(() => { const byKey = items.reduce((result, tab) => { - const resolvedGroupId = tab.group - ? groupDefinitions[tab.group] - ? tab.group - : aliasToGroup[tab.group] - : undefined; + const resolvedGroupId = resolveGroupId( + tab.group, + groupDefinitions, + aliasToGroup, + ); const group = resolvedGroupId ? groupDefinitions[resolvedGroupId] : undefined; @@ -143,8 +157,8 @@ export function EntityTabsList(props: EntityTabsListProps) { for (const [id, tabGroup] of sorted) { const groupDef = groupDefinitions[id]; - const order = groupDef?.contentOrder ?? defaultContentOrder; - if (order === 'alpha') { + const order = groupDef?.contentOrder ?? contentOrder; + if (order === 'title') { tabGroup.items.sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }), ); @@ -152,7 +166,7 @@ export function EntityTabsList(props: EntityTabsListProps) { } return sorted; - }, [items, groupDefinitions, aliasToGroup, defaultContentOrder]); + }, [items, groupDefinitions, aliasToGroup, contentOrder]); const selectedItem = items[selectedIndex]; return ( diff --git a/plugins/catalog/src/alpha/pages.test.tsx b/plugins/catalog/src/alpha/pages.test.tsx index 2c6dfb5c9f..39f96f8d5e 100644 --- a/plugins/catalog/src/alpha/pages.test.tsx +++ b/plugins/catalog/src/alpha/pages.test.tsx @@ -482,7 +482,7 @@ describe('Entity page', () => { ); }); - it('Should sort content alphabetically by default', async () => { + it('Should sort content by title by default', async () => { const tester = createExtensionTester( Object.assign({ namespace: 'catalog' }, catalogEntityPage), ) @@ -564,7 +564,7 @@ describe('Entity page', () => { Object.assign({ namespace: 'catalog' }, catalogEntityPage), { config: { - contentOrder: 'alpha', + contentOrder: 'title', groups: [ { documentation: { diff --git a/plugins/catalog/src/alpha/pages.tsx b/plugins/catalog/src/alpha/pages.tsx index 40aa217442..61801478f7 100644 --- a/plugins/catalog/src/alpha/pages.tsx +++ b/plugins/catalog/src/alpha/pages.tsx @@ -110,13 +110,13 @@ export const catalogEntityPage = PageBlueprint.makeWithOverrides({ title: z.string(), icon: z.string().optional(), aliases: z.array(z.string()).optional(), - contentOrder: z.enum(['alpha', 'natural']).optional(), + contentOrder: z.enum(['title', 'natural']).optional(), }), ), ) .optional(), contentOrder: z => - z.enum(['alpha', 'natural']).optional().default('alpha'), + z.enum(['title', 'natural']).optional().default('title'), showNavItemIcons: z => z.boolean().optional().default(false), }, }, @@ -178,7 +178,7 @@ export const catalogEntityPage = PageBlueprint.makeWithOverrides({ header={header} contextMenuItems={filteredMenuItems} groupDefinitions={groupDefinitions} - defaultContentOrder={config.contentOrder} + contentOrder={config.contentOrder} showNavItemIcons={config.showNavItemIcons} > {inputs.contents.map(output => ( From cbaab589453f19934cdb8646d359fc87db608cdf Mon Sep 17 00:00:00 2001 From: Kurt King Date: Wed, 25 Feb 2026 22:30:39 -0700 Subject: [PATCH 254/455] docs: metrics service alpha Signed-off-by: Kurt King --- docs/backend-system/core-services/01-index.md | 1 + docs/backend-system/core-services/metrics.md | 175 ++++++++++++++++++ microsite/sidebars.ts | 1 + 3 files changed, 177 insertions(+) create mode 100644 docs/backend-system/core-services/metrics.md diff --git a/docs/backend-system/core-services/01-index.md b/docs/backend-system/core-services/01-index.md index 50ebea0e4f..7da7fc1efa 100644 --- a/docs/backend-system/core-services/01-index.md +++ b/docs/backend-system/core-services/01-index.md @@ -24,6 +24,7 @@ import { coreServices } from '@backstage/backend-plugin-api'; - [Identity Service](./identity.md) - Deprecated user authentication service, use the [Auth Service](./auth.md) instead. - [Lifecycle Service](./lifecycle.md) - Registration of plugin startup and shutdown lifecycle hooks. - [Logger Service](./logger.md) - Plugin-level logging. +- [Metrics Service](./metrics.md) - Plugin-scoped metrics instrumentation (alpha). - [Permissions Service](./permissions.md) - Permission system integration for authorization of user actions. - [Plugin Metadata Service](./plugin-metadata.md) - Built-in service for accessing metadata about the current plugin. - [Root Config Service](./root-config.md) - Access to static configuration. diff --git a/docs/backend-system/core-services/metrics.md b/docs/backend-system/core-services/metrics.md new file mode 100644 index 0000000000..6396143fad --- /dev/null +++ b/docs/backend-system/core-services/metrics.md @@ -0,0 +1,175 @@ +--- +id: metrics +title: Metrics Service (alpha) +sidebar_label: Metrics Service (alpha) +description: Documentation for the Metrics service +--- + +The Metrics Service provides a unified interface for emitting application-level metrics from Backstage backend plugins. It wraps the [OpenTelemetry](https://opentelemetry.io/) Meter API and automatically scopes each plugin's metrics using the OpenTelemetry [Instrumentation Scope](https://opentelemetry.io/docs/concepts/instrumentation-scope/), so telemetry backends can identify which plugin produced each metric. + +:::note +This service is currently in **alpha** and is imported from `@backstage/backend-plugin-api/alpha`. The API may change in future releases. +::: + +## Setting up OpenTelemetry + +The Metrics Service does **not** configure the OpenTelemetry SDK itself. You are responsible for initializing the OpenTelemetry Node SDK — including exporters, resource attributes, and views — before starting the Backstage backend. Follow the [tutorial](../../tutorials/setup-opentelemetry.md) for more information. + +## How it Relates to OpenTelemetry Auto-Instrumentation + +The Metrics Service **complements** auto-instrumentation rather than replacing it. Auto-instrumentation captures infrastructure-level signals like HTTP request counts and durations automatically. The Metrics Service is for **application-level metrics** that only your plugin can provide — things like entities processed, tasks completed, or active sessions. + +```ts +// Auto-instrumentation provides automatically: +// http.server.request.duration{method="GET", route="/catalog/entities"} + +// MetricsService provides manually: +const processed = metrics.createCounter('entities.processed.total', { + description: 'Total entities processed during refresh', +}); +processed.add(entities.length, { operation: 'refresh' }); +``` + +## Using the Service + +Since the Metrics Service is an alpha API, the service reference is imported from `@backstage/backend-plugin-api/alpha` instead of `coreServices`. + +```ts +import { createBackendPlugin } from '@backstage/backend-plugin-api'; +import { metricsServiceRef } from '@backstage/backend-plugin-api/alpha'; + +createBackendPlugin({ + pluginId: 'todos', + register(env) { + env.registerInit({ + deps: { + metrics: metricsServiceRef, + }, + async init({ metrics }) { + const todoCount = metrics.createCounter('todos.total', { + description: 'Total number of todos', + }); + + // Later, when adding a todo: + todoCount.add(1, { 'todo.category': 'personal' }); + }, + }); + }, +}); +``` + +## Instrument Types + +The service provides both synchronous and observable (asynchronous) instrument types, matching the OpenTelemetry specification. + +### Synchronous Instruments + +Synchronous instruments are used inline where the measurement occurs. + +| Method | Description | Example Use Case | +| --------------------- | ------------------------------------------------------ | ---------------------------------- | +| `createCounter` | Monotonically increasing sum (non-negative increments) | Total requests, entities processed | +| `createUpDownCounter` | Sum that can increase or decrease | Active connections, queue depth | +| `createHistogram` | Distribution of values (e.g. durations, sizes) | Request latency, payload sizes | +| `createGauge` | Point-in-time value | CPU usage, memory utilization | + +```ts +const counter = metrics.createCounter('todos.completed.total', { + description: 'Total todos completed', +}); +counter.add(1, { 'todo.status': 'completed' }); + +const histogram = metrics.createHistogram('todo.duration', { + description: 'Time spent processing a todo', + unit: 'seconds', + advice: { explicitBucketBoundaries: [0.01, 0.05, 0.1, 0.5, 1, 5] }, +}); +histogram.record(durationInSeconds, { + 'todo.category': 'personal', + 'todo.status': 'completed', +}); + +const upDown = metrics.createUpDownCounter('todos.in_flight', { + description: 'Number of todos currently in flight', +}); +upDown.add(1); +// ... later +upDown.add(-1); +``` + +### Observable Instruments + +Observable instruments use callbacks that are invoked when a metric collection occurs. This is useful for metrics that are expensive to compute or that come from external sources like databases. + +| Method | Description | Example Use Case | +| ------------------------------- | --------------------------------------------------- | -------------------------------------- | +| `createObservableCounter` | Monotonically increasing sum, reported via callback | Total items ingested from external API | +| `createObservableUpDownCounter` | Sum that can go up or down, reported via callback | Connection pool size | +| `createObservableGauge` | Point-in-time value, reported via callback | Row counts, cache hit ratios | + +```ts +const entityCount = metrics.createObservableGauge('catalog.entities.count', { + description: 'Total amount of entities in the catalog', +}); + +entityCount.addCallback(async gauge => { + const results = await getEntityCountsByKind(); + for (const { kind, count } of results) { + gauge.observe(count, { kind }); + } +}); +``` + +## Metric Options + +All `create*` methods accept an optional `MetricOptions` object: + +| Property | Type | Description | +| ------------- | -------- | -------------------------------------------------------------------- | +| `description` | `string` | Human-readable description of the metric | +| `unit` | `string` | Unit of measurement (e.g. `'seconds'`, `'{entity}'`, `'bytes'`) | +| `advice` | `object` | Aggregation hints, such as `explicitBucketBoundaries` for histograms | + +## Type-Safe Attributes + +Metric instruments accept a generic type parameter that constrains the attributes passed to `add`, `record`, or `observe`: + +```ts +interface TodoAttributes { + 'todo.category': string; + 'todo.status': 'completed' | 'in_progress' | 'blocked'; +} + +const completed = metrics.createCounter( + 'todos.completed.total', + { description: 'Total todos completed' }, +); + +// Type-safe attributes are enforced +completed.add(1, { 'todo.category': 'personal', 'todo.status': 'completed' }); +``` + +## Advanced Configuration + +The service reads optional configuration from `app-config.yaml` under `backend.metrics.plugin..meter`. This lets operators override the OpenTelemetry Instrumentation Scope for a specific plugin without code changes. + +:::tip +Each plugin automatically receives a meter named `backstage-plugin-`. You typically won't need to configure it. +::: + +```yaml +backend: + metrics: + plugin: + catalog: + meter: + name: 'custom-catalog-meter' + version: '2.0.0' + schemaUrl: 'https://example.com/schema' +``` + +| Property | Type | Default | Description | +| ----------- | -------- | ----------------------------- | ------------------------------- | +| `name` | `string` | `backstage-plugin-` | Name of the OpenTelemetry meter | +| `version` | `string` | — | Version string for the meter | +| `schemaUrl` | `string` | — | Schema URL for the meter | diff --git a/microsite/sidebars.ts b/microsite/sidebars.ts index edbbcbe10c..e07a1db123 100644 --- a/microsite/sidebars.ts +++ b/microsite/sidebars.ts @@ -521,6 +521,7 @@ export default { 'backend-system/core-services/identity', 'backend-system/core-services/lifecycle', 'backend-system/core-services/logger', + 'backend-system/core-services/metrics', 'backend-system/core-services/permissions', 'backend-system/core-services/permissions-registry', 'backend-system/core-services/plugin-metadata', From 62f0a53d65f535f83002c29007c75e45be077c3d Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Thu, 26 Feb 2026 09:59:58 +0100 Subject: [PATCH 255/455] Fix error forwarding in actions registry to preserve original status codes (#33021) Signed-off-by: benjdlambert --- .changeset/fix-mcp-error-forwarding.md | 7 + .../DefaultActionsRegistryService.ts | 42 ++--- .../actionsRegistryServiceFactory.test.ts | 33 +++- .../src/alpha/services/MockActionsRegistry.ts | 37 ++--- ...reateRegisterCatalogEntitiesAction.test.ts | 11 +- ...ateUnregisterCatalogEntitiesAction.test.ts | 49 ++---- .../src/services/McpService.test.ts | 113 ++++++++++++++ .../src/services/handleErrors.test.ts | 144 ++++++++++++++++++ .../src/services/handleErrors.ts | 6 +- 9 files changed, 345 insertions(+), 97 deletions(-) create mode 100644 .changeset/fix-mcp-error-forwarding.md create mode 100644 plugins/mcp-actions-backend/src/services/handleErrors.test.ts diff --git a/.changeset/fix-mcp-error-forwarding.md b/.changeset/fix-mcp-error-forwarding.md new file mode 100644 index 0000000000..fa12e224a9 --- /dev/null +++ b/.changeset/fix-mcp-error-forwarding.md @@ -0,0 +1,7 @@ +--- +'@backstage/backend-defaults': patch +'@backstage/backend-test-utils': patch +'@backstage/plugin-mcp-actions-backend': patch +--- + +Fixed error forwarding in the actions registry so that known errors like `InputError` and `NotFoundError` thrown by actions preserve their original status codes and messages instead of being wrapped in `ForwardedError` and coerced to 500. diff --git a/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts b/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts index 7348e0a185..ffe74f81d9 100644 --- a/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts +++ b/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/DefaultActionsRegistryService.ts @@ -28,12 +28,7 @@ import { ActionsRegistryActionOptions, ActionsRegistryService, } from '@backstage/backend-plugin-api/alpha'; -import { - ForwardedError, - InputError, - NotAllowedError, - NotFoundError, -} from '@backstage/errors'; +import { InputError, NotAllowedError, NotFoundError } from '@backstage/errors'; export class DefaultActionsRegistryService implements ActionsRegistryService { private actions: Map> = @@ -131,31 +126,24 @@ export class DefaultActionsRegistryService implements ActionsRegistryService { ); } - try { - const result = await action.action({ - input: input.data, - credentials, - logger: this.logger, - }); + const result = await action.action({ + input: input.data, + credentials, + logger: this.logger, + }); - const output = action.schema?.output - ? action.schema.output(z).safeParse(result?.output) - : ({ success: true, data: result?.output } as const); + const output = action.schema?.output + ? action.schema.output(z).safeParse(result?.output) + : ({ success: true, data: result?.output } as const); - if (!output.success) { - throw new InputError( - `Invalid output from action "${req.params.actionId}"`, - output.error, - ); - } - - res.json({ output: output.data }); - } catch (error) { - throw new ForwardedError( - `Failed execution of action "${req.params.actionId}"`, - error, + if (!output.success) { + throw new InputError( + `Invalid output from action "${req.params.actionId}"`, + output.error, ); } + + res.json({ output: output.data }); }, ); return router; diff --git a/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/actionsRegistryServiceFactory.test.ts b/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/actionsRegistryServiceFactory.test.ts index 79c103c284..1e7c27960e 100644 --- a/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/actionsRegistryServiceFactory.test.ts +++ b/packages/backend-defaults/src/alpha/entrypoints/actionsRegistry/actionsRegistryServiceFactory.test.ts @@ -22,7 +22,7 @@ import { import { httpRouterServiceFactory } from '../../../entrypoints/httpRouter'; import request from 'supertest'; import { actionsRegistryServiceFactory } from './actionsRegistryServiceFactory'; -import { InputError } from '@backstage/errors'; +import { InputError, NotFoundError } from '@backstage/errors'; import { actionsRegistryServiceRef } from '@backstage/backend-plugin-api/alpha'; describe('actionsRegistryServiceFactory', () => { @@ -510,7 +510,7 @@ describe('actionsRegistryServiceFactory', () => { expect(body).toMatchObject({ output: { ok: true } }); }); - it('should return the error from the action if it throws', async () => { + it('should forward the original error when the action throws a known error', async () => { const { server } = await startTestBackend({ features: [pluginSubject, ...defaultServices], }); @@ -528,9 +528,32 @@ describe('actionsRegistryServiceFactory', () => { expect(status).toBe(400); expect(body).toMatchObject({ error: { - message: expect.stringContaining( - 'Failed execution of action "my-plugin:test"', - ), + name: 'InputError', + message: 'test', + }, + }); + }); + + it('should forward a NotFoundError from the action with 404 status', async () => { + const { server } = await startTestBackend({ + features: [pluginSubject, ...defaultServices], + }); + + mockAction.mockRejectedValue(new NotFoundError('entity not found')); + + const { body, status } = await request(server) + .post( + '/api/my-plugin/.backstage/actions/v1/actions/my-plugin:test/invoke', + ) + .send({ + name: 'test', + }); + + expect(status).toBe(404); + expect(body).toMatchObject({ + error: { + name: 'NotFoundError', + message: 'entity not found', }, }); }); diff --git a/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts b/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts index 94e5987afd..384a5e8e95 100644 --- a/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts +++ b/packages/backend-test-utils/src/alpha/services/MockActionsRegistry.ts @@ -17,7 +17,7 @@ import { BackstageCredentials, LoggerService, } from '@backstage/backend-plugin-api'; -import { ForwardedError, InputError, NotFoundError } from '@backstage/errors'; +import { InputError, NotFoundError } from '@backstage/errors'; import { JsonObject, JsonValue } from '@backstage/types'; import { z, AnyZodObject } from 'zod'; import zodToJsonSchema from 'zod-to-json-schema'; @@ -126,31 +126,24 @@ export class MockActionsRegistry throw new InputError(`Invalid input to action "${opts.id}"`, input.error); } - try { - const result = await action.action({ - input: input.data, - credentials: opts.credentials ?? mockCredentials.none(), - logger: this.logger, - }); + const result = await action.action({ + input: input.data, + credentials: opts.credentials ?? mockCredentials.none(), + logger: this.logger, + }); - const output = action.schema?.output - ? action.schema.output(z).safeParse(result?.output) - : ({ success: true, data: result?.output } as const); + const output = action.schema?.output + ? action.schema.output(z).safeParse(result?.output) + : ({ success: true, data: result?.output } as const); - if (!output.success) { - throw new InputError( - `Invalid output from action "${opts.id}"`, - output.error, - ); - } - - return { output: output.data }; - } catch (error) { - throw new ForwardedError( - `Failed execution of action "${opts.id}"`, - error, + if (!output.success) { + throw new InputError( + `Invalid output from action "${opts.id}"`, + output.error, ); } + + return { output: output.data }; } register< diff --git a/plugins/catalog-backend/src/actions/createRegisterCatalogEntitiesAction.test.ts b/plugins/catalog-backend/src/actions/createRegisterCatalogEntitiesAction.test.ts index 31a89a31f3..a6926a2fd9 100644 --- a/plugins/catalog-backend/src/actions/createRegisterCatalogEntitiesAction.test.ts +++ b/plugins/catalog-backend/src/actions/createRegisterCatalogEntitiesAction.test.ts @@ -16,7 +16,6 @@ import { createRegisterCatalogEntitiesAction } from './createRegisterCatalogEntitiesAction'; import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; import { actionsRegistryServiceMock } from '@backstage/backend-test-utils/alpha'; -import { ForwardedError } from '@backstage/errors'; describe('createRegisterCatalogEntitiesAction', () => { it('should successfully register a catalog location with a valid URL', async () => { @@ -78,14 +77,13 @@ describe('createRegisterCatalogEntitiesAction', () => { ).rejects.toThrow('not-a-valid-url is an invalid URL'); }); - it('should throw a ForwardedError if catalog.addLocation throws an error', async () => { + it('should throw the original error if catalog.addLocation fails', async () => { const mockActionsRegistry = actionsRegistryServiceMock(); const mockCatalog = catalogServiceMock(); - const errorMessage = 'Failed to add location'; mockCatalog.addLocation = jest .fn() - .mockRejectedValue(new Error(errorMessage)); + .mockRejectedValue(new Error('Failed to add location')); createRegisterCatalogEntitiesAction({ catalog: mockCatalog, @@ -100,6 +98,9 @@ describe('createRegisterCatalogEntitiesAction', () => { 'https://github.com/example/repo/blob/main/catalog-info.yaml', }, }), - ).rejects.toThrow(ForwardedError); + ).rejects.toMatchObject({ + name: 'Error', + message: 'Failed to add location', + }); }); }); diff --git a/plugins/catalog-backend/src/actions/createUnregisterCatalogEntitiesAction.test.ts b/plugins/catalog-backend/src/actions/createUnregisterCatalogEntitiesAction.test.ts index 492a427630..bd886e37ba 100644 --- a/plugins/catalog-backend/src/actions/createUnregisterCatalogEntitiesAction.test.ts +++ b/plugins/catalog-backend/src/actions/createUnregisterCatalogEntitiesAction.test.ts @@ -192,10 +192,13 @@ describe('createUnregisterCatalogEntitiesAction', () => { ); }); - it('should throw NotFoundError if no location matches the URL', async () => { + it('should throw NotFoundError with the original message if no location matches the URL', async () => { const mockActionsRegistry = actionsRegistryServiceMock(); const mockCatalog = catalogServiceMock(); + const locationUrl = + 'https://github.com/backstage/demo/blob/master/catalog-info.yaml'; + mockCatalog.getLocations = jest.fn().mockResolvedValue({ items: [ { id: 'location-id-1', target: 'https://other-url.com/catalog.yaml' }, @@ -207,51 +210,24 @@ describe('createUnregisterCatalogEntitiesAction', () => { actionsRegistry: mockActionsRegistry, }); - await expect( - mockActionsRegistry.invoke({ - id: 'test:unregister-entity', - input: { - type: { - locationUrl: - 'https://github.com/backstage/demo/blob/master/catalog-info.yaml', - }, - }, - }), - ).rejects.toThrow(/NotFoundError/); - }); - - it('should throw NotFoundError with descriptive message when location not found', async () => { - const mockActionsRegistry = actionsRegistryServiceMock(); - const mockCatalog = catalogServiceMock(); - - const locationUrl = - 'https://github.com/backstage/demo/blob/master/catalog-info.yaml'; - - mockCatalog.getLocations = jest.fn().mockResolvedValue({ - items: [], - }); - - createUnregisterCatalogEntitiesAction({ - catalog: mockCatalog, - actionsRegistry: mockActionsRegistry, - }); - await expect( mockActionsRegistry.invoke({ id: 'test:unregister-entity', input: { type: { locationUrl } }, }), - ).rejects.toThrow(`Location with URL ${locationUrl} not found`); + ).rejects.toMatchObject({ + name: 'NotFoundError', + message: `Location with URL ${locationUrl} not found`, + }); }); - it('should throw an error if catalog.getLocations throws an error', async () => { + it('should throw the original error if catalog.getLocations fails', async () => { const mockActionsRegistry = actionsRegistryServiceMock(); const mockCatalog = catalogServiceMock(); - const errorMessage = 'Failed to get locations'; mockCatalog.getLocations = jest .fn() - .mockRejectedValue(new Error(errorMessage)); + .mockRejectedValue(new Error('Failed to get locations')); createUnregisterCatalogEntitiesAction({ catalog: mockCatalog, @@ -268,7 +244,10 @@ describe('createUnregisterCatalogEntitiesAction', () => { }, }, }), - ).rejects.toThrow(errorMessage); + ).rejects.toMatchObject({ + name: 'Error', + message: 'Failed to get locations', + }); }); }); }); diff --git a/plugins/mcp-actions-backend/src/services/McpService.test.ts b/plugins/mcp-actions-backend/src/services/McpService.test.ts index 038700c4a5..c75572bf20 100644 --- a/plugins/mcp-actions-backend/src/services/McpService.test.ts +++ b/plugins/mcp-actions-backend/src/services/McpService.test.ts @@ -26,6 +26,7 @@ import { CallToolResultSchema, ListToolsResultSchema, } from '@modelcontextprotocol/sdk/types.js'; +import { InputError, NotFoundError } from '@backstage/errors'; describe('McpService', () => { it('should list the available actions as tools in the mcp backend', async () => { @@ -343,4 +344,116 @@ describe('McpService', () => { }), ); }); + + it('should forward the original InputError when an action throws one', async () => { + const mockActionsRegistry = actionsRegistryServiceMock(); + mockActionsRegistry.register({ + name: 'failing-action', + title: 'Failing', + description: 'An action that throws InputError', + schema: { + input: z => z.object({ value: z.string() }), + output: z => z.object({}), + }, + action: async () => { + throw new InputError('the value was invalid'); + }, + }); + + const mcpService = await McpService.create({ + actions: mockActionsRegistry, + metrics: metricsServiceMock.mock(), + }); + + const server = mcpService.getServer({ + credentials: mockCredentials.user(), + }); + + const client = new Client({ + name: 'test client', + version: '1.0', + }); + + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair(); + + await Promise.all([ + client.connect(clientTransport), + server.connect(serverTransport), + ]); + + const result = await client.request( + { + method: 'tools/call', + params: { name: 'failing-action', arguments: { value: 'test' } }, + }, + CallToolResultSchema, + ); + + expect(result).toEqual({ + content: [ + { + type: 'text', + text: 'InputError: the value was invalid', + }, + ], + isError: true, + }); + }); + + it('should forward the original NotFoundError when an action throws one', async () => { + const mockActionsRegistry = actionsRegistryServiceMock(); + mockActionsRegistry.register({ + name: 'not-found-action', + title: 'Not Found', + description: 'An action that throws NotFoundError', + schema: { + input: z => z.object({ id: z.string() }), + output: z => z.object({}), + }, + action: async () => { + throw new NotFoundError('entity does not exist'); + }, + }); + + const mcpService = await McpService.create({ + actions: mockActionsRegistry, + metrics: metricsServiceMock.mock(), + }); + + const server = mcpService.getServer({ + credentials: mockCredentials.user(), + }); + + const client = new Client({ + name: 'test client', + version: '1.0', + }); + + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair(); + + await Promise.all([ + client.connect(clientTransport), + server.connect(serverTransport), + ]); + + const result = await client.request( + { + method: 'tools/call', + params: { name: 'not-found-action', arguments: { id: 'abc' } }, + }, + CallToolResultSchema, + ); + + expect(result).toEqual({ + content: [ + { + type: 'text', + text: 'NotFoundError: entity does not exist', + }, + ], + isError: true, + }); + }); }); diff --git a/plugins/mcp-actions-backend/src/services/handleErrors.test.ts b/plugins/mcp-actions-backend/src/services/handleErrors.test.ts new file mode 100644 index 0000000000..17fe6de0a6 --- /dev/null +++ b/plugins/mcp-actions-backend/src/services/handleErrors.test.ts @@ -0,0 +1,144 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + InputError, + NotFoundError, + NotAllowedError, + ForwardedError, + ResponseError, +} from '@backstage/errors'; +import { handleErrors } from './handleErrors'; + +describe('handleErrors', () => { + it('should return the error description for a known error', async () => { + const result = await handleErrors(async () => { + throw new InputError('bad input'); + }); + + expect(result).toEqual({ + content: [{ type: 'text', text: 'InputError: bad input' }], + isError: true, + }); + }); + + it('should return the error description for a NotFoundError', async () => { + const result = await handleErrors(async () => { + throw new NotFoundError('entity not found'); + }); + + expect(result).toEqual({ + content: [{ type: 'text', text: 'NotFoundError: entity not found' }], + isError: true, + }); + }); + + it('should return the error description for a NotAllowedError', async () => { + const result = await handleErrors(async () => { + throw new NotAllowedError('forbidden'); + }); + + expect(result).toEqual({ + content: [{ type: 'text', text: 'NotAllowedError: forbidden' }], + isError: true, + }); + }); + + it('should rethrow an unknown error', async () => { + await expect( + handleErrors(async () => { + throw new Error('unknown problem'); + }), + ).rejects.toThrow('unknown problem'); + }); + + it('should handle a ForwardedError that inherits the cause name', async () => { + const result = await handleErrors(async () => { + throw new ForwardedError( + 'wrapper message', + new InputError('original error'), + ); + }); + + // ForwardedError inherits name from cause and CustomErrorBase + // concatenates the cause message into the full message + expect(result).toEqual({ + content: [ + { + type: 'text', + text: 'InputError: wrapper message; caused by InputError: original error', + }, + ], + isError: true, + }); + }); + + it('should extract the cause from a ResponseError', async () => { + const response = { + ok: false, + status: 400, + statusText: 'Bad Request', + headers: new Headers({ 'content-type': 'application/json' }), + text: async () => + JSON.stringify({ + error: { name: 'InputError', message: 'bad value' }, + response: { statusCode: 400 }, + }), + }; + + const responseError = await ResponseError.fromResponse(response as any); + + const result = await handleErrors(async () => { + throw responseError; + }); + + expect(result).toEqual({ + content: [{ type: 'text', text: 'InputError: bad value' }], + isError: true, + }); + }); + + it('should recursively extract through nested ResponseErrors', async () => { + const innerResponse = { + ok: false, + status: 400, + statusText: 'Bad Request', + headers: new Headers({ 'content-type': 'application/json' }), + text: async () => + JSON.stringify({ + error: { + name: 'ResponseError', + message: 'Request failed with 400 Bad Request', + cause: { name: 'InputError', message: 'deeply nested error' }, + }, + response: { statusCode: 400 }, + }), + }; + + const responseError = await ResponseError.fromResponse( + innerResponse as any, + ); + + const result = await handleErrors(async () => { + throw responseError; + }); + + expect(result).toEqual({ + content: [{ type: 'text', text: 'InputError: deeply nested error' }], + isError: true, + }); + }); +}); diff --git a/plugins/mcp-actions-backend/src/services/handleErrors.ts b/plugins/mcp-actions-backend/src/services/handleErrors.ts index 5266c80e75..97070bb723 100644 --- a/plugins/mcp-actions-backend/src/services/handleErrors.ts +++ b/plugins/mcp-actions-backend/src/services/handleErrors.ts @@ -35,14 +35,14 @@ const knownErrors = new Set([ 'ServiceUnavailableError', ]); -// Extracts the cause error, if the provided error is `ResponseError` or -// `ForwardedError` with a cause. +// Recursively extracts the innermost cause from ResponseError or +// ForwardedError wrappers to surface the original error. function extractCause(err: ErrorLike): ErrorLike { if ( (err.name === 'ResponseError' || err instanceof ForwardedError) && isError(err.cause) ) { - return err.cause; + return extractCause(err.cause); } return err; } From 3eac7e204cb7bf092aac011e50547c03c43348ec Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 10:04:27 +0100 Subject: [PATCH 256/455] Revert contentOrder to defaultContentOrder, only sort within groups Keep ungrouped tabs in their natural order and only apply content ordering within actual groups. Rename the contentOrder prop back to defaultContentOrder to clarify its scope. Signed-off-by: Patrik Oldsberg --- plugins/catalog/report-alpha.api.md | 2 +- .../components/EntityLayout/EntityLayout.tsx | 6 +++--- .../alpha/components/EntityTabs/EntityTabs.tsx | 6 +++--- .../components/EntityTabs/EntityTabsList.tsx | 18 ++++++++++-------- plugins/catalog/src/alpha/pages.tsx | 2 +- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index 2c44d0cefc..3aae7d8920 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -1119,8 +1119,8 @@ const _default: OverridableFrontendPlugin< } >[] | undefined; - contentOrder?: 'title' | 'natural' | undefined; showNavItemIcons?: boolean | undefined; + contentOrder?: 'title' | 'natural' | undefined; title?: string | undefined; path?: string | undefined; }; diff --git a/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx b/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx index ecee929cde..895f36150f 100644 --- a/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx +++ b/plugins/catalog/src/alpha/components/EntityLayout/EntityLayout.tsx @@ -80,7 +80,7 @@ export interface EntityLayoutProps { */ parentEntityRelations?: string[]; groupDefinitions: EntityContentGroupDefinitions; - contentOrder?: 'title' | 'natural'; + defaultContentOrder?: 'title' | 'natural'; showNavItemIcons?: boolean; } @@ -111,7 +111,7 @@ export const EntityLayout = (props: EntityLayoutProps) => { NotFoundComponent, parentEntityRelations, groupDefinitions, - contentOrder, + defaultContentOrder, showNavItemIcons, } = props; const { kind } = useRouteRefParams(entityRouteRef); @@ -166,7 +166,7 @@ export const EntityLayout = (props: EntityLayoutProps) => { )} diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx index 22ae70d726..102df76042 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabs.tsx @@ -72,12 +72,12 @@ export function useSelectedSubRoute(subRoutes: SubRoute[]): { type EntityTabsProps = { routes: SubRoute[]; groupDefinitions: EntityContentGroupDefinitions; - contentOrder?: 'title' | 'natural'; + defaultContentOrder?: 'title' | 'natural'; showIcons?: boolean; }; export function EntityTabs(props: EntityTabsProps) { - const { routes, groupDefinitions, contentOrder, showIcons } = props; + const { routes, groupDefinitions, defaultContentOrder, showIcons } = props; const { index, route, element } = useSelectedSubRoute(routes); @@ -108,7 +108,7 @@ export function EntityTabs(props: EntityTabsProps) { selectedIndex={index} showIcons={showIcons} groupDefinitions={groupDefinitions} - contentOrder={contentOrder} + defaultContentOrder={defaultContentOrder} /> diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx index e55129c573..d647b52afb 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx @@ -78,7 +78,7 @@ type TabGroup = { type EntityTabsListProps = { tabs: Tab[]; groupDefinitions: EntityContentGroupDefinitions; - contentOrder?: 'title' | 'natural'; + defaultContentOrder?: 'title' | 'natural'; showIcons?: boolean; selectedIndex?: number; }; @@ -106,7 +106,7 @@ export function EntityTabsList(props: EntityTabsListProps) { selectedIndex = 0, showIcons, groupDefinitions, - contentOrder = 'title', + defaultContentOrder = 'title', } = props; const aliasToGroup = useMemo( @@ -157,16 +157,18 @@ export function EntityTabsList(props: EntityTabsListProps) { for (const [id, tabGroup] of sorted) { const groupDef = groupDefinitions[id]; - const order = groupDef?.contentOrder ?? contentOrder; - if (order === 'title') { - tabGroup.items.sort((a, b) => - a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }), - ); + if (groupDef) { + const order = groupDef.contentOrder ?? defaultContentOrder; + if (order === 'title') { + tabGroup.items.sort((a, b) => + a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }), + ); + } } } return sorted; - }, [items, groupDefinitions, aliasToGroup, contentOrder]); + }, [items, groupDefinitions, aliasToGroup, defaultContentOrder]); const selectedItem = items[selectedIndex]; return ( diff --git a/plugins/catalog/src/alpha/pages.tsx b/plugins/catalog/src/alpha/pages.tsx index 61801478f7..4d37a18c98 100644 --- a/plugins/catalog/src/alpha/pages.tsx +++ b/plugins/catalog/src/alpha/pages.tsx @@ -178,7 +178,7 @@ export const catalogEntityPage = PageBlueprint.makeWithOverrides({ header={header} contextMenuItems={filteredMenuItems} groupDefinitions={groupDefinitions} - contentOrder={config.contentOrder} + defaultContentOrder={config.contentOrder} showNavItemIcons={config.showNavItemIcons} > {inputs.contents.map(output => ( From 3be516b73acb5d2d0fbeff9c603fa46cfd3bf2f4 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 10:15:35 +0100 Subject: [PATCH 257/455] Document group aliases and content ordering configuration Add documentation for the new group aliases and contentOrder options to the catalog customization guide. Signed-off-by: Patrik Oldsberg --- .../config/vocabularies/Backstage/accept.txt | 1 + .../software-catalog/catalog-customization.md | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index f6f37b17cf..81ef949651 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -527,6 +527,7 @@ unassign unbreak Unconference undici +ungrouped unicode unmanaged unmount diff --git a/docs/features/software-catalog/catalog-customization.md b/docs/features/software-catalog/catalog-customization.md index d62bb34505..5ddcb7d5a4 100644 --- a/docs/features/software-catalog/catalog-customization.md +++ b/docs/features/software-catalog/catalog-customization.md @@ -728,6 +728,49 @@ Notes: - Icons for groups and tabs are resolved via the app's IconsApi. When using a string icon id (for example `"dashboard"`), ensure that the corresponding icon bundles are enabled/installed in your app (see the [IconBundleBlueprint documentation](https://backstage.io/api/stable/variables/_backstage_plugin-app-react.IconBundleBlueprint.html)). - Group icons are only rendered if `showNavItemIcons` is set to `true`. +### Content ordering within groups + +By default, content items within each group are sorted alphabetically by title. You can change this with the `contentOrder` option, which supports two modes: + +- **`title`** (default) — sort alphabetically by the content extension's title (case-insensitive). +- **`natural`** — preserve the natural extension discovery/registration order. + +A page-level `contentOrder` sets the default for all groups, and individual groups can override it: + +```yaml +app: + extensions: + - page:catalog/entity: + config: + # Default content order for all groups + contentOrder: title + + groups: + - documentation: + title: Docs + # Override: keep natural order for this group + contentOrder: natural +``` + +Note that content ordering only applies to content items within groups. Ungrouped tabs (those not matching any group definition) always retain their natural order. + +### Group aliases + +Groups can declare `aliases` — a list of other group IDs that should be treated as equivalent. Any entity content extension targeting an aliased group ID will be included in the aliasing group. This is useful when renaming or merging groups without having to reconfigure individual extensions: + +```yaml +app: + extensions: + - page:catalog/entity: + config: + groups: + - develop: + title: Develop + # Content targeting 'development' will appear in this group + aliases: + - development +``` + ### Overriding or disabling a tab's group (per extension) Each entity content extension (tabs on the entity page) can declare a default `group` in code. You can override or disable this per installation in `app-config.yaml` using the extension's config: From 1b32ec6a8b4e9c4e60b4dc4d89f18735b25d25e7 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 11:48:51 +0100 Subject: [PATCH 258/455] Resolve selected tab value through alias map When the selected tab uses an aliased group ID, resolve it through the alias map so the MUI Tabs selection indicator matches the rendered group key. Signed-off-by: Patrik Oldsberg --- .../src/alpha/components/EntityTabs/EntityTabsList.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx index d647b52afb..9abbfb69d9 100644 --- a/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx +++ b/plugins/catalog/src/alpha/components/EntityTabs/EntityTabsList.tsx @@ -171,6 +171,11 @@ export function EntityTabsList(props: EntityTabsListProps) { }, [items, groupDefinitions, aliasToGroup, defaultContentOrder]); const selectedItem = items[selectedIndex]; + const selectedGroup = resolveGroupId( + selectedItem?.group, + groupDefinitions, + aliasToGroup, + ); return ( {groups.map(([id, tabGroup]) => ( Date: Thu, 26 Feb 2026 13:27:30 +0100 Subject: [PATCH 259/455] Move transform tests into the build module Move the transform tests from packages/cli/src/tests/transforms/ into packages/cli/src/modules/build/tests/transforms/ so that the build module is self-contained and can eventually become its own package. Signed-off-by: Patrik Oldsberg --- .../build}/tests/transforms/__fixtures__/.gitignore | 0 .../__fixtures__/node_modules/dep-commonjs/a-default.js | 0 .../__fixtures__/node_modules/dep-commonjs/a-named.js | 0 .../__fixtures__/node_modules/dep-commonjs/b-default.mjs | 0 .../__fixtures__/node_modules/dep-commonjs/b-named.mjs | 0 .../__fixtures__/node_modules/dep-commonjs/c-default.cjs | 0 .../__fixtures__/node_modules/dep-commonjs/c-named.cjs | 0 .../transforms/__fixtures__/node_modules/dep-commonjs/main.d.ts | 0 .../transforms/__fixtures__/node_modules/dep-commonjs/main.js | 0 .../__fixtures__/node_modules/dep-commonjs/package.json | 0 .../__fixtures__/node_modules/dep-default/a-default.js | 0 .../transforms/__fixtures__/node_modules/dep-default/a-named.js | 0 .../__fixtures__/node_modules/dep-default/b-default.mjs | 0 .../__fixtures__/node_modules/dep-default/b-named.mjs | 0 .../__fixtures__/node_modules/dep-default/c-default.cjs | 0 .../__fixtures__/node_modules/dep-default/c-named.cjs | 0 .../transforms/__fixtures__/node_modules/dep-default/main.d.ts | 0 .../transforms/__fixtures__/node_modules/dep-default/main.js | 0 .../__fixtures__/node_modules/dep-default/package.json | 0 .../__fixtures__/node_modules/dep-module/a-default.js | 0 .../transforms/__fixtures__/node_modules/dep-module/a-named.js | 0 .../__fixtures__/node_modules/dep-module/b-default.mjs | 0 .../transforms/__fixtures__/node_modules/dep-module/b-named.mjs | 0 .../__fixtures__/node_modules/dep-module/c-default.cjs | 0 .../transforms/__fixtures__/node_modules/dep-module/c-named.cjs | 0 .../transforms/__fixtures__/node_modules/dep-module/main.d.ts | 0 .../transforms/__fixtures__/node_modules/dep-module/main.js | 0 .../__fixtures__/node_modules/dep-module/package.json | 0 .../tests/transforms/__fixtures__/pkg-commonjs/a-default.ts | 0 .../tests/transforms/__fixtures__/pkg-commonjs/a-named.ts | 0 .../tests/transforms/__fixtures__/pkg-commonjs/b-default.mts | 0 .../tests/transforms/__fixtures__/pkg-commonjs/b-named.mts | 0 .../tests/transforms/__fixtures__/pkg-commonjs/c-default.cts | 0 .../tests/transforms/__fixtures__/pkg-commonjs/c-named.cts | 0 .../build}/tests/transforms/__fixtures__/pkg-commonjs/main.ts | 0 .../tests/transforms/__fixtures__/pkg-commonjs/package.json | 0 .../build}/tests/transforms/__fixtures__/pkg-commonjs/print.ts | 0 .../tests/transforms/__fixtures__/pkg-default/a-default.ts | 0 .../build}/tests/transforms/__fixtures__/pkg-default/a-named.ts | 0 .../tests/transforms/__fixtures__/pkg-default/b-default.mts | 0 .../tests/transforms/__fixtures__/pkg-default/b-named.mts | 0 .../tests/transforms/__fixtures__/pkg-default/c-default.cts | 0 .../tests/transforms/__fixtures__/pkg-default/c-named.cts | 0 .../build}/tests/transforms/__fixtures__/pkg-default/main.ts | 0 .../tests/transforms/__fixtures__/pkg-default/package.json | 0 .../build}/tests/transforms/__fixtures__/pkg-default/print.ts | 0 .../transforms/__fixtures__/pkg-module/a-default-explicit.mts | 0 .../tests/transforms/__fixtures__/pkg-module/a-default.ts | 0 .../transforms/__fixtures__/pkg-module/a-named-explicit.mts | 0 .../build}/tests/transforms/__fixtures__/pkg-module/a-named.ts | 0 .../tests/transforms/__fixtures__/pkg-module/b-default.mts | 0 .../build}/tests/transforms/__fixtures__/pkg-module/b-named.mts | 0 .../tests/transforms/__fixtures__/pkg-module/c-default.cts | 0 .../build}/tests/transforms/__fixtures__/pkg-module/c-named.cts | 0 .../tests/transforms/__fixtures__/pkg-module/main-explicit.mts | 0 .../build}/tests/transforms/__fixtures__/pkg-module/main.ts | 0 .../tests/transforms/__fixtures__/pkg-module/package.json | 0 .../build}/tests/transforms/__fixtures__/pkg-module/print.ts | 0 .../src/{ => modules/build}/tests/transforms/transforms.test.ts | 2 +- 59 files changed, 1 insertion(+), 1 deletion(-) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/.gitignore (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-default.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-named.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-default.mjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-named.mjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-default.cjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-named.cjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.d.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-commonjs/package.json (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/a-default.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/a-named.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/b-default.mjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/b-named.mjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/c-default.cjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/c-named.cjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/main.d.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/main.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-default/package.json (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/a-default.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/a-named.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/b-default.mjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/b-named.mjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/c-default.cjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/c-named.cjs (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/main.d.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/main.js (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/node_modules/dep-module/package.json (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/a-default.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/a-named.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/b-default.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/b-named.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/c-default.cts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/c-named.cts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/main.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/package.json (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-commonjs/print.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/a-default.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/a-named.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/b-default.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/b-named.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/c-default.cts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/c-named.cts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/main.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/package.json (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-default/print.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/a-default-explicit.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/a-default.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/a-named-explicit.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/a-named.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/b-default.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/b-named.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/c-default.cts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/c-named.cts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/main-explicit.mts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/main.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/package.json (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/__fixtures__/pkg-module/print.ts (100%) rename packages/cli/src/{ => modules/build}/tests/transforms/transforms.test.ts (99%) diff --git a/packages/cli/src/tests/transforms/__fixtures__/.gitignore b/packages/cli/src/modules/build/tests/transforms/__fixtures__/.gitignore similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/.gitignore rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/.gitignore diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-default.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-default.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-default.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-default.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-named.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-named.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-named.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/a-named.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-default.mjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-default.mjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-default.mjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-default.mjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-named.mjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-named.mjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-named.mjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/b-named.mjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-default.cjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-default.cjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-default.cjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-default.cjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-named.cjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-named.cjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-named.cjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/c-named.cjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.d.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.d.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.d.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.d.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/main.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/package.json b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/package.json similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-commonjs/package.json rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-commonjs/package.json diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/a-default.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/a-default.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/a-default.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/a-default.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/a-named.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/a-named.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/a-named.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/a-named.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/b-default.mjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/b-default.mjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/b-default.mjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/b-default.mjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/b-named.mjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/b-named.mjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/b-named.mjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/b-named.mjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/c-default.cjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/c-default.cjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/c-default.cjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/c-default.cjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/c-named.cjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/c-named.cjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/c-named.cjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/c-named.cjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/main.d.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/main.d.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/main.d.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/main.d.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/main.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/main.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/main.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/main.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/package.json b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/package.json similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-default/package.json rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-default/package.json diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/a-default.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/a-default.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/a-default.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/a-default.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/a-named.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/a-named.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/a-named.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/a-named.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/b-default.mjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/b-default.mjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/b-default.mjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/b-default.mjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/b-named.mjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/b-named.mjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/b-named.mjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/b-named.mjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/c-default.cjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/c-default.cjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/c-default.cjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/c-default.cjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/c-named.cjs b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/c-named.cjs similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/c-named.cjs rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/c-named.cjs diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/main.d.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/main.d.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/main.d.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/main.d.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/main.js b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/main.js similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/main.js rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/main.js diff --git a/packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/package.json b/packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/package.json similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/node_modules/dep-module/package.json rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/node_modules/dep-module/package.json diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/a-default.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/a-default.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/a-default.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/a-default.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/a-named.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/a-named.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/a-named.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/a-named.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/b-default.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/b-default.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/b-default.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/b-default.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/b-named.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/b-named.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/b-named.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/b-named.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/c-default.cts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/c-default.cts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/c-default.cts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/c-default.cts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/c-named.cts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/c-named.cts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/c-named.cts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/c-named.cts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/main.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/main.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/main.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/main.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/package.json b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/package.json similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/package.json rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/package.json diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/print.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/print.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-commonjs/print.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-commonjs/print.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/a-default.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/a-default.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/a-default.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/a-default.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/a-named.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/a-named.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/a-named.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/a-named.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/b-default.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/b-default.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/b-default.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/b-default.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/b-named.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/b-named.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/b-named.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/b-named.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/c-default.cts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/c-default.cts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/c-default.cts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/c-default.cts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/c-named.cts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/c-named.cts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/c-named.cts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/c-named.cts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/main.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/main.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/main.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/main.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/package.json b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/package.json similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/package.json rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/package.json diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-default/print.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/print.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-default/print.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-default/print.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/a-default-explicit.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/a-default-explicit.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/a-default-explicit.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/a-default-explicit.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/a-default.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/a-default.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/a-default.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/a-default.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/a-named-explicit.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/a-named-explicit.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/a-named-explicit.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/a-named-explicit.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/a-named.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/a-named.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/a-named.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/a-named.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/b-default.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/b-default.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/b-default.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/b-default.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/b-named.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/b-named.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/b-named.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/b-named.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/c-default.cts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/c-default.cts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/c-default.cts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/c-default.cts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/c-named.cts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/c-named.cts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/c-named.cts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/c-named.cts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/main-explicit.mts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/main-explicit.mts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/main-explicit.mts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/main-explicit.mts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/main.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/main.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/main.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/main.ts diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/package.json b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/package.json similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/package.json rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/package.json diff --git a/packages/cli/src/tests/transforms/__fixtures__/pkg-module/print.ts b/packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/print.ts similarity index 100% rename from packages/cli/src/tests/transforms/__fixtures__/pkg-module/print.ts rename to packages/cli/src/modules/build/tests/transforms/__fixtures__/pkg-module/print.ts diff --git a/packages/cli/src/tests/transforms/transforms.test.ts b/packages/cli/src/modules/build/tests/transforms/transforms.test.ts similarity index 99% rename from packages/cli/src/tests/transforms/transforms.test.ts rename to packages/cli/src/modules/build/tests/transforms/transforms.test.ts index 71661ded01..9e4fca8c63 100644 --- a/packages/cli/src/tests/transforms/transforms.test.ts +++ b/packages/cli/src/modules/build/tests/transforms/transforms.test.ts @@ -16,7 +16,7 @@ import { execFileSync } from 'node:child_process'; import { resolve as resolvePath } from 'node:path'; -import { Output, buildPackage } from '../../modules/build/lib/builder'; +import { Output, buildPackage } from '../../lib/builder'; const exportValues = { all: { From b35f3595aa31c8ae8ea0b91d42a91555c2063639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 24 Feb 2026 21:15:41 +0100 Subject: [PATCH 260/455] run vale directly instead of through the action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .github/workflows/verify_docs-quality.yml | 32 +++++---- scripts/check-docs-quality.js | 86 ++++++++++++++++++++++- 2 files changed, 102 insertions(+), 16 deletions(-) diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index af42f25390..7aa855e189 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -7,7 +7,7 @@ on: - '**.md' jobs: - check-all-files: + check-docs: runs-on: ubuntu-latest steps: @@ -18,18 +18,20 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - # Vale does not support file excludes, so we use the script to generate a list of files instead - # The action also does not allow args or a local config file to be passed in, so the files array - # also contains an "--config=.github/vale/config.ini" option - - name: generate vale args - id: generate - run: echo "args=$(node scripts/check-docs-quality.js --ci-args)" >> $GITHUB_OUTPUT - - - name: documentation quality check - uses: errata-ai/vale-action@d89dee975228ae261d22c15adcd03578634d429c # v2.1.1 - with: - # This also contains --config=.github/vale/config.ini ... :/ - files: '${{ steps.generate.outputs.args }}' - version: latest + - name: Install vale + run: | + gh release download --repo errata-ai/vale -p 'vale_*_Linux_64-bit.tar.gz' -D /tmp + tar -xzf /tmp/vale_*_Linux_64-bit.tar.gz -C /usr/local/bin vale + vale --version env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ github.token }} + + - name: Get changed files + run: | + gh api "repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files" \ + --paginate -q '.[] | select(.status != "removed") | .filename' > /tmp/pr-files.txt + env: + GH_TOKEN: ${{ github.token }} + + - name: Documentation quality check + run: node scripts/check-docs-quality.js --ci /tmp/pr-files.txt diff --git a/scripts/check-docs-quality.js b/scripts/check-docs-quality.js index fbedcfe077..4769496ba2 100755 --- a/scripts/check-docs-quality.js +++ b/scripts/check-docs-quality.js @@ -71,7 +71,7 @@ async function exitIfMissingVale() { try { // eslint-disable-next-line @backstage/no-undeclared-imports await require('command-exists')('vale'); - } catch (e) { + } catch { console.log( `Language linter (vale) was not found. Please install vale linter (https://vale.sh/docs/vale-cli/installation/).\n`, ); @@ -101,7 +101,91 @@ async function runVale(files) { return true; } +async function ciCheck(prFilesPath) { + const content = await fs.readFile(prFilesPath, 'utf8'); + const prFiles = content.split('\n').filter(f => f.trim()); + + const mdFiles = prFiles + .filter(f => f.endsWith('.md')) + .filter(f => !IGNORED_WHEN_LISTING.some(p => p.test(f))); + + if (mdFiles.length === 0) { + console.log('No documentation files to check.'); + return; + } + + console.log(`Checking ${mdFiles.length} changed documentation file(s)...`); + + const result = spawnSync( + 'vale', + [ + '--config', + resolvePath(rootDir, '.vale.ini'), + '--output=JSON', + ...mdFiles, + ], + { encoding: 'utf8', maxBuffer: 50 * 1024 * 1024 }, + ); + + if (result.error) { + console.error('Failed to run vale:', result.error.message); + process.exit(1); + } + + let issueCount = 0; + + if (result.stdout && result.stdout.trim()) { + try { + const data = JSON.parse(result.stdout); + for (const [file, alerts] of Object.entries(data)) { + for (const alert of alerts) { + const severityLevels = { + error: 'error', + warning: 'warning', + }; + const level = severityLevels[alert.Severity] ?? 'notice'; + const col = alert.Span ? alert.Span[0] : 1; + const endCol = alert.Span ? `,endColumn=${alert.Span[1] + 1}` : ''; + console.log( + `::${level} file=${file},line=${alert.Line},col=${col}${endCol},title=${alert.Check}::${alert.Message}`, + ); + issueCount++; + } + } + } catch { + console.error('Failed to parse vale output:'); + console.error(result.stdout); + process.exit(1); + } + } + + if (result.stderr && result.stderr.trim()) { + console.error(result.stderr); + } + + if (issueCount > 0) { + console.log( + `\nFound ${issueCount} documentation quality issue(s). Please review the annotations above.`, + ); + } + + if (result.status !== 0) { + process.exit(1); + } +} + async function main() { + if (process.argv.includes('--ci')) { + const idx = process.argv.indexOf('--ci'); + const prFilesPath = process.argv[idx + 1]; + if (!prFilesPath) { + console.error('Usage: check-docs-quality.js --ci '); + process.exit(1); + } + await ciCheck(prFilesPath); + return; + } + if (process.argv.includes('--ci-args')) { const files = await listFiles(); From 2690d416f8b73c748597cbba3783ded5babedab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 24 Feb 2026 21:30:27 +0100 Subject: [PATCH 261/455] Update scripts/check-docs-quality.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Fredrik Adelöw --- scripts/check-docs-quality.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/check-docs-quality.js b/scripts/check-docs-quality.js index 4769496ba2..057d4580df 100755 --- a/scripts/check-docs-quality.js +++ b/scripts/check-docs-quality.js @@ -142,6 +142,7 @@ async function ciCheck(prFilesPath) { const severityLevels = { error: 'error', warning: 'warning', + suggestion: 'notice', }; const level = severityLevels[alert.Severity] ?? 'notice'; const col = alert.Span ? alert.Span[0] : 1; From 0c0f46de09f85d8a40098393a781031a0bc301dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 24 Feb 2026 21:30:33 +0100 Subject: [PATCH 262/455] Update .github/workflows/verify_docs-quality.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Fredrik Adelöw --- .github/workflows/verify_docs-quality.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index 7aa855e189..6f9798169e 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -21,7 +21,9 @@ jobs: - name: Install vale run: | gh release download --repo errata-ai/vale -p 'vale_*_Linux_64-bit.tar.gz' -D /tmp - tar -xzf /tmp/vale_*_Linux_64-bit.tar.gz -C /usr/local/bin vale + mkdir -p "$HOME/.local/bin" + tar -xzf /tmp/vale_*_Linux_64-bit.tar.gz -C "$HOME/.local/bin" vale + echo "$HOME/.local/bin" >> "$GITHUB_PATH" vale --version env: GH_TOKEN: ${{ github.token }} From 356d1662d833989327e9ccde0773ab8673d9b70d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 24 Feb 2026 21:40:56 +0100 Subject: [PATCH 263/455] Update .github/workflows/verify_docs-quality.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Fredrik Adelöw --- .github/workflows/verify_docs-quality.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index 6f9798169e..1989b39814 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -8,6 +8,9 @@ on: jobs: check-docs: + permissions: + contents: read + pull-requests: read runs-on: ubuntu-latest steps: From 4e85e7b0b3692316075d12ff9d5f07df227b5290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 24 Feb 2026 21:42:10 +0100 Subject: [PATCH 264/455] Update .github/workflows/verify_docs-quality.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Fredrik Adelöw --- .github/workflows/verify_docs-quality.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index 1989b39814..ef8bb40d18 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -23,9 +23,21 @@ jobs: - name: Install vale run: | - gh release download --repo errata-ai/vale -p 'vale_*_Linux_64-bit.tar.gz' -D /tmp + VALE_VERSION="3.7.1" + VALE_REPO="errata-ai/vale" + VALE_DIST_DIR="/tmp/vale-dist" + + mkdir -p "$VALE_DIST_DIR" + + # Download pinned Vale binary and corresponding checksums file + gh release download "v${VALE_VERSION}" --repo "$VALE_REPO" --pattern "vale_${VALE_VERSION}_Linux_64-bit.tar.gz" --dir "$VALE_DIST_DIR" + gh release download "v${VALE_VERSION}" --repo "$VALE_REPO" --pattern "vale_${VALE_VERSION}_checksums.txt" --dir "$VALE_DIST_DIR" + + # Verify the integrity of the downloaded archive + (cd "$VALE_DIST_DIR" && sha256sum --check --ignore-missing "vale_${VALE_VERSION}_checksums.txt") + mkdir -p "$HOME/.local/bin" - tar -xzf /tmp/vale_*_Linux_64-bit.tar.gz -C "$HOME/.local/bin" vale + tar -xzf "$VALE_DIST_DIR/vale_${VALE_VERSION}_Linux_64-bit.tar.gz" -C "$HOME/.local/bin" vale echo "$HOME/.local/bin" >> "$GITHUB_PATH" vale --version env: From a6b28199e541da0819e2ce63ad53f04ac102f0e5 Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Thu, 26 Feb 2026 14:45:10 +0100 Subject: [PATCH 265/455] `feat(catalog)`: Implement `query-catalog-entities` on top of the filter predicates (#33022) * chore: create query catalog Signed-off-by: benjdlambert Signed-off-by: benjdlambert * feat(catalog-backend): add query-catalog-entities action Signed-off-by: benjdlambert * fix: address PR review feedback Signed-off-by: benjdlambert --------- Signed-off-by: benjdlambert --- .../add-query-catalog-entities-action.md | 5 + .../createQueryCatalogEntitiesAction.test.ts | 344 ++++++++++++++++++ .../createQueryCatalogEntitiesAction.ts | 220 +++++++++++ plugins/catalog-backend/src/actions/index.ts | 2 + 4 files changed, 571 insertions(+) create mode 100644 .changeset/add-query-catalog-entities-action.md create mode 100644 plugins/catalog-backend/src/actions/createQueryCatalogEntitiesAction.test.ts create mode 100644 plugins/catalog-backend/src/actions/createQueryCatalogEntitiesAction.ts diff --git a/.changeset/add-query-catalog-entities-action.md b/.changeset/add-query-catalog-entities-action.md new file mode 100644 index 0000000000..78fb30d584 --- /dev/null +++ b/.changeset/add-query-catalog-entities-action.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Added `query-catalog-entities` action to the catalog backend actions registry. Supports predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. diff --git a/plugins/catalog-backend/src/actions/createQueryCatalogEntitiesAction.test.ts b/plugins/catalog-backend/src/actions/createQueryCatalogEntitiesAction.test.ts new file mode 100644 index 0000000000..3be032a161 --- /dev/null +++ b/plugins/catalog-backend/src/actions/createQueryCatalogEntitiesAction.test.ts @@ -0,0 +1,344 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createQueryCatalogEntitiesAction } from './createQueryCatalogEntitiesAction'; +import { catalogServiceMock } from '@backstage/plugin-catalog-node/testUtils'; +import { actionsRegistryServiceMock } from '@backstage/backend-test-utils/alpha'; + +const testEntities = [ + { + kind: 'Component', + apiVersion: 'backstage.io/v1alpha1', + metadata: { + name: 'service-a', + namespace: 'default', + annotations: { 'backstage.io/techdocs-ref': 'dir:.' }, + }, + spec: { + type: 'service', + dependsOn: ['component:default/shared-lib', 'api:default/user-api'], + }, + }, + { + kind: 'Component', + apiVersion: 'backstage.io/v1alpha1', + metadata: { name: 'website-b', namespace: 'default' }, + spec: { type: 'website' }, + }, + { + kind: 'API', + apiVersion: 'backstage.io/v1alpha1', + metadata: { name: 'user-api', namespace: 'default' }, + spec: { type: 'openapi' }, + }, + { + kind: 'Group', + apiVersion: 'backstage.io/v1alpha1', + metadata: { name: 'team-alpha', namespace: 'default' }, + }, +]; + +function createCatalogQueryAction(options?: { + entities?: typeof testEntities; +}) { + const mockActionsRegistry = actionsRegistryServiceMock(); + const mockCatalog = catalogServiceMock({ + entities: options?.entities ?? testEntities, + }); + createQueryCatalogEntitiesAction({ + catalog: mockCatalog, + actionsRegistry: mockActionsRegistry, + }); + return { invoke: mockActionsRegistry.invoke.bind(mockActionsRegistry) }; +} + +describe('createQueryCatalogEntitiesAction', () => { + it('should return all entities when no filter is provided', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: {}, + }); + + expect(result.output).toEqual({ + items: testEntities, + totalItems: 4, + hasMoreEntities: false, + nextPageCursor: undefined, + }); + }); + + it('should return empty results when no entities match', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { query: { kind: 'NonExistent' } }, + }); + + expect(result.output).toEqual({ + items: [], + totalItems: 0, + hasMoreEntities: false, + nextPageCursor: undefined, + }); + }); + + it('should filter by kind', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { query: { kind: 'Component' } }, + }); + + expect(result.output).toMatchObject({ + totalItems: 2, + items: expect.arrayContaining([ + expect.objectContaining({ + metadata: { + name: 'service-a', + namespace: 'default', + annotations: { 'backstage.io/techdocs-ref': 'dir:.' }, + }, + }), + expect.objectContaining({ + metadata: { name: 'website-b', namespace: 'default' }, + }), + ]), + }); + }); + + it('should filter with multiple conditions', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { kind: 'Component', 'spec.type': 'service' }, + }, + }); + + expect(result.output).toMatchObject({ + totalItems: 1, + items: [ + expect.objectContaining({ + metadata: expect.objectContaining({ name: 'service-a' }), + }), + ], + }); + }); + + it('should support $not operator', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { query: { $not: { kind: 'Group' } } }, + }); + + expect(result.output).toMatchObject({ totalItems: 3 }); + const items = (result.output as any).items; + expect(items.every((e: any) => e.kind !== 'Group')).toBe(true); + }); + + it('should support $all operator', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { + $all: [{ kind: 'Component' }, { 'spec.type': 'service' }], + }, + }, + }); + + expect(result.output).toMatchObject({ + totalItems: 1, + items: [ + expect.objectContaining({ + metadata: expect.objectContaining({ name: 'service-a' }), + }), + ], + }); + }); + + it('should support $any operator', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { + $any: [{ kind: 'API' }, { kind: 'Group' }], + }, + }, + }); + + expect(result.output).toMatchObject({ totalItems: 2 }); + const items = (result.output as any).items; + expect( + items.every((e: any) => e.kind === 'API' || e.kind === 'Group'), + ).toBe(true); + }); + + it('should support $exists: true', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { + 'metadata.annotations.backstage.io/techdocs-ref': { $exists: true }, + }, + }, + }); + + expect(result.output).toMatchObject({ + totalItems: 1, + items: [ + expect.objectContaining({ + metadata: expect.objectContaining({ name: 'service-a' }), + }), + ], + }); + }); + + it('should support $exists: false', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { + 'metadata.annotations.backstage.io/techdocs-ref': { $exists: false }, + }, + }, + }); + + expect(result.output).toMatchObject({ totalItems: 3 }); + const items = (result.output as any).items; + expect(items.every((e: any) => e.metadata.name !== 'service-a')).toBe(true); + }); + + it('should support $in operator', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { 'spec.type': { $in: ['service', 'openapi'] } }, + }, + }); + + expect(result.output).toMatchObject({ totalItems: 2 }); + const names = (result.output as any).items.map((e: any) => e.metadata.name); + expect(names).toEqual(expect.arrayContaining(['service-a', 'user-api'])); + }); + + it('should support $contains operator', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { + 'spec.dependsOn': { $contains: 'component:default/shared-lib' }, + }, + }, + }); + + expect(result.output).toMatchObject({ + totalItems: 1, + items: [ + expect.objectContaining({ + metadata: expect.objectContaining({ name: 'service-a' }), + }), + ], + }); + }); + + it('should support pagination with limit', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { limit: 2 }, + }); + + const output = result.output as any; + expect(output.items).toHaveLength(2); + expect(output.totalItems).toBe(4); + expect(output.hasMoreEntities).toBe(true); + expect(output.nextPageCursor).toBeDefined(); + }); + + it('should support cursor-based pagination', async () => { + const { invoke } = createCatalogQueryAction(); + + const firstPage = await invoke({ + id: 'test:query-catalog-entities', + input: { limit: 2 }, + }); + const firstOutput = firstPage.output as any; + + const secondPage = await invoke({ + id: 'test:query-catalog-entities', + input: { cursor: firstOutput.nextPageCursor, limit: 2 }, + }); + const secondOutput = secondPage.output as any; + + expect(secondOutput.items).toHaveLength(2); + expect(secondOutput.hasMoreEntities).toBe(false); + }); + + it('should support orderFields', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { kind: 'Component' }, + orderFields: { field: 'metadata.name', order: 'desc' }, + }, + }); + + const names = (result.output as any).items.map((e: any) => e.metadata.name); + expect(names).toEqual(['website-b', 'service-a']); + }); + + it('should support array orderFields for multi-field sorting', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + orderFields: [ + { field: 'kind', order: 'asc' }, + { field: 'metadata.name', order: 'asc' }, + ], + }, + }); + + const kinds = (result.output as any).items.map((e: any) => e.kind); + expect(kinds).toEqual(['API', 'Component', 'Component', 'Group']); + }); + + it('should support fields projection', async () => { + const { invoke } = createCatalogQueryAction(); + const result = await invoke({ + id: 'test:query-catalog-entities', + input: { + query: { kind: 'Component', 'spec.type': 'service' }, + fields: ['kind', 'metadata.name'], + }, + }); + + const items = (result.output as any).items; + expect(items).toHaveLength(1); + expect(items[0]).toEqual({ + kind: 'Component', + metadata: { name: 'service-a' }, + }); + }); +}); diff --git a/plugins/catalog-backend/src/actions/createQueryCatalogEntitiesAction.ts b/plugins/catalog-backend/src/actions/createQueryCatalogEntitiesAction.ts new file mode 100644 index 0000000000..6bf4171163 --- /dev/null +++ b/plugins/catalog-backend/src/actions/createQueryCatalogEntitiesAction.ts @@ -0,0 +1,220 @@ +/* + * Copyright 2025 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ActionsRegistryService } from '@backstage/backend-plugin-api/alpha'; +import { CatalogService } from '@backstage/plugin-catalog-node'; +import { createZodV3FilterPredicateSchema } from '@backstage/filter-predicates'; + +export const createQueryCatalogEntitiesAction = ({ + catalog, + actionsRegistry, +}: { + catalog: CatalogService; + actionsRegistry: ActionsRegistryService; +}) => { + actionsRegistry.register({ + name: 'query-catalog-entities', + title: 'Query Catalog Entities', + attributes: { + destructive: false, + readOnly: true, + idempotent: true, + }, + description: ` +Query entities from the Backstage Software Catalog using predicate filters. + +## Catalog Model + +The catalog contains entities of different kinds. Every entity has "kind", "apiVersion", "metadata", and optionally "spec" and "relations". Fields use dot notation for querying. + +Common metadata fields on all entities: name, namespace (default: "default"), title, description, labels, annotations, tags (string array), links. + +Entity references use the format "kind:namespace/name", e.g. "component:default/my-service" or "user:default/jane.doe". + +### Entity Kinds + +**Component** - A piece of software such as a service, website, or library. + spec fields: type (e.g. "service", "website", "library"), lifecycle (e.g. "production", "experimental", "deprecated"), owner (entity ref), system, subcomponentOf, providesApis, consumesApis, dependsOn, dependencyOf. + +**API** - An interface that components expose, such as REST APIs or event streams. + spec fields: type (e.g. "openapi", "asyncapi", "graphql", "grpc"), lifecycle, owner (entity ref), definition (the API spec content), system. + +**System** - A collection of components, APIs, and resources that together expose some functionality. + spec fields: owner (entity ref), domain, type. + +**Domain** - A grouping of systems that share terminology, domain models, and business purpose. + spec fields: owner (entity ref), subdomainOf, type. + +**Resource** - Infrastructure required to operate a component, such as databases or storage buckets. + spec fields: type, owner (entity ref), system, dependsOn, dependencyOf. + +**Group** - An organizational entity such as a team or business unit. + spec fields: type (e.g. "team", "business-unit"), children (entity refs), parent (entity ref), members (entity refs), profile (displayName, email, picture). + +**User** - A person, such as an employee or contractor. + spec fields: memberOf (entity refs), profile (displayName, email, picture). + +**Location** - A marker that references other catalog descriptor files to be ingested. + spec fields: type, target, targets, presence. + +### Relations + +Entities have bidirectional relations stored in the "relations" array. Common relation types: ownedBy/ownerOf, dependsOn/dependencyOf, providesApi/apiProvidedBy, consumesApi/apiConsumedBy, parentOf/childOf, memberOf/hasMember, partOf/hasPart. + +Relations can be queried via "relations." e.g. "relations.ownedby: user:default/jane-doe". The value there must always be a valid entity reference. + +When querying for entity relationships, prefer using relations over spec fields. For example, use "relations.ownedby" instead of "spec.owner" to find entities owned by a particular group or user. + +## Query Syntax + +The query uses predicate expressions with dot-notation field paths. + +Simple matching: + { query: { kind: "Component" } } + { query: { kind: "Component", "spec.type": "service" } } + +Value operators: + { query: { kind: { "$in": ["API", "Component"] } } } + { query: { "metadata.annotations.backstage.io/techdocs-ref": { "$exists": true } } } + { query: { "metadata.tags": { "$contains": "java" } } } + { query: { "metadata.name": { "$hasPrefix": "team-" } } } + +Logical operators: + { query: { "$all": [{ kind: "Component" }, { "spec.lifecycle": "production" }] } } + { query: { "$any": [{ "spec.type": "service" }, { "spec.type": "website" }] } } + { query: { "$not": { kind: "Group" } } } + +Querying relations - find all entities owned by a specific group: + { query: { "relations.ownedby": "group:default/team-alpha" } } + +Combined example - find production services or websites with TechDocs: + { query: { "$all": [ + { kind: "Component", "spec.lifecycle": "production" }, + { "$any": [{ "spec.type": "service" }, { "spec.type": "website" }] }, + { "metadata.annotations.backstage.io/techdocs-ref": { "$exists": true } } + ] } } + +## Other Options + +Limit returned fields: { fields: ["kind", "metadata.name", "metadata.namespace"] } +Sort results: { orderFields: { field: "metadata.name", order: "asc" } } +Full text search: { fullTextFilter: { term: "auth", fields: ["metadata.name", "metadata.title"] } } +Pagination: Use limit (e.g. 20) and the returned nextPageCursor for subsequent requests via cursor. + `, + schema: { + input: z => + z.object({ + query: createZodV3FilterPredicateSchema(z) + .optional() + .describe( + 'Entity predicate query. Supports field matching, $all, $any, $not, $exists, $in, $contains, and $hasPrefix operators.', + ), + fields: z + .array(z.string()) + .optional() + .describe( + 'Specific fields to include in the response. If not provided, all fields are returned. Each entry is a dot separated path into an entity, e.g. `spec.type`.', + ), + limit: z + .number() + .int() + .positive() + .optional() + .describe('Maximum number of entities to return at a time.'), + offset: z + .number() + .int() + .min(0) + .optional() + .describe('Number of entities to skip before returning results.'), + orderFields: z + .union([ + z.object({ + field: z + .string() + .describe( + 'Field to order by. The format is a dot separated path into an entity, e.g. `spec.type`.', + ), + order: z.enum(['asc', 'desc']).describe('Sort order'), + }), + z.array( + z.object({ + field: z + .string() + .describe( + 'Field to order by. The format is a dot separated path into an entity, e.g. `spec.type`.', + ), + order: z.enum(['asc', 'desc']).describe('Sort order'), + }), + ), + ]) + .optional() + .describe( + 'Ordering criteria for the results. Can be a single order directive or an array for multi-field sorting.', + ), + fullTextFilter: z + .object({ + term: z.string().describe('Full text search term'), + fields: z + .array(z.string()) + .optional() + .describe( + 'Fields to search within. Each entry is a dot separated path into an entity, e.g. `spec.type`.', + ), + }) + .optional() + .describe('Full text search criteria'), + cursor: z + .string() + .optional() + .describe( + 'Cursor for pagination. This can be used only after the first request with a response containing a cursor. If a cursor is given it takes precedence over `offset`.', + ), + }), + output: z => + z.object({ + items: z + .array(z.object({}).passthrough()) + .describe('List of entities'), + totalItems: z.number().describe('Total number of entities'), + hasMoreEntities: z + .boolean() + .describe('Whether more entities are available'), + nextPageCursor: z + .string() + .optional() + .describe('Next page cursor used to fetch next page of entities'), + }), + }, + action: async ({ input, credentials }) => { + const response = await catalog.queryEntities( + { + ...input, + query: input.query, + }, + { credentials }, + ); + + return { + output: { + items: response.items, + totalItems: response.totalItems, + hasMoreEntities: !!response.pageInfo.nextCursor, + nextPageCursor: response.pageInfo.nextCursor, + }, + }; + }, + }); +}; diff --git a/plugins/catalog-backend/src/actions/index.ts b/plugins/catalog-backend/src/actions/index.ts index 5940bc32f1..04587c1a4e 100644 --- a/plugins/catalog-backend/src/actions/index.ts +++ b/plugins/catalog-backend/src/actions/index.ts @@ -19,6 +19,7 @@ import { createGetCatalogEntityAction } from './createGetCatalogEntityAction.ts' import { createValidateEntityAction } from './createValidateEntityAction.ts'; import { createRegisterCatalogEntitiesAction } from './createRegisterCatalogEntitiesAction.ts'; import { createUnregisterCatalogEntitiesAction } from './createUnregisterCatalogEntitiesAction.ts'; +import { createQueryCatalogEntitiesAction } from './createQueryCatalogEntitiesAction.ts'; export const createCatalogActions = (options: { actionsRegistry: ActionsRegistryService; @@ -28,4 +29,5 @@ export const createCatalogActions = (options: { createValidateEntityAction(options); createRegisterCatalogEntitiesAction(options); createUnregisterCatalogEntitiesAction(options); + createQueryCatalogEntitiesAction(options); }; From a22c0a368e6bb5a89ad669034ba0390a94a9243d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 14:44:02 +0100 Subject: [PATCH 266/455] use a distinct hash instead MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .github/workflows/verify_docs-quality.yml | 12 ++++++------ scripts/check-docs-quality.js | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index ef8bb40d18..6ace7d72a3 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -24,20 +24,20 @@ jobs: - name: Install vale run: | VALE_VERSION="3.7.1" - VALE_REPO="errata-ai/vale" + VALE_CHECKSUM="ba4924bf2c5884499f09b02a6eb3318b29df40a3e81701c0804b9b1aefcd9483" VALE_DIST_DIR="/tmp/vale-dist" + VALE_ARCHIVE="vale_${VALE_VERSION}_Linux_64-bit.tar.gz" mkdir -p "$VALE_DIST_DIR" - # Download pinned Vale binary and corresponding checksums file - gh release download "v${VALE_VERSION}" --repo "$VALE_REPO" --pattern "vale_${VALE_VERSION}_Linux_64-bit.tar.gz" --dir "$VALE_DIST_DIR" - gh release download "v${VALE_VERSION}" --repo "$VALE_REPO" --pattern "vale_${VALE_VERSION}_checksums.txt" --dir "$VALE_DIST_DIR" + # Download pinned Vale binary + curl -fsSL -H "Authorization: token $GH_TOKEN" "https://github.com/errata-ai/vale/releases/download/v${VALE_VERSION}/${VALE_ARCHIVE}" -o "$VALE_DIST_DIR/$VALE_ARCHIVE" # Verify the integrity of the downloaded archive - (cd "$VALE_DIST_DIR" && sha256sum --check --ignore-missing "vale_${VALE_VERSION}_checksums.txt") + echo "$VALE_CHECKSUM $VALE_DIST_DIR/$VALE_ARCHIVE" | sha256sum --check mkdir -p "$HOME/.local/bin" - tar -xzf "$VALE_DIST_DIR/vale_${VALE_VERSION}_Linux_64-bit.tar.gz" -C "$HOME/.local/bin" vale + tar -xzf "$VALE_DIST_DIR/$VALE_ARCHIVE" -C "$HOME/.local/bin" vale echo "$HOME/.local/bin" >> "$GITHUB_PATH" vale --version env: diff --git a/scripts/check-docs-quality.js b/scripts/check-docs-quality.js index 057d4580df..06383539c3 100755 --- a/scripts/check-docs-quality.js +++ b/scripts/check-docs-quality.js @@ -36,6 +36,7 @@ const IGNORED_WHEN_LISTING = [ const IGNORED_WHEN_EXPLICIT = [ /^ADOPTERS\.md$/, /^OWNERS\.md$/, + /^.*[/\\]CHANGELOG\.md$/, // generated from changesets anyway - THOSE should have been checked earlier /^.*[/\\]knip-report\.md$/, ]; From bed4174d86545cf28c85970f4ce0636902ff1157 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 15:51:59 +0100 Subject: [PATCH 267/455] docs: add design for predicate-based facets filtering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- ...02-26-facets-predicate-filtering-design.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 docs/plans/2026-02-26-facets-predicate-filtering-design.md diff --git a/docs/plans/2026-02-26-facets-predicate-filtering-design.md b/docs/plans/2026-02-26-facets-predicate-filtering-design.md new file mode 100644 index 0000000000..9b086fb8df --- /dev/null +++ b/docs/plans/2026-02-26-facets-predicate-filtering-design.md @@ -0,0 +1,43 @@ +# Predicate-based filtering for the catalog facets endpoint + +## Problem + +The `/entity-facets` endpoint only supports the old filter query parameter syntax. The `queryEntities` endpoint already has a POST variant that accepts predicate-based filtering (`$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, `$hasPrefix`). We need the same capability for facets. + +## Approach + +Mirror the pattern from `queryEntities`: add a POST variant of `/entity-facets` that accepts a JSON body with a `query` predicate, while keeping the existing GET endpoint for backward compatibility. + +## Changes + +### Client types (`packages/catalog-client/src/types/api.ts`) + +Add optional `query: FilterPredicate` field to `GetEntityFacetsRequest`. When both `filter` and `query` are provided, the client converts `filter` to a predicate and merges them with `$all`. + +### Client implementation (`packages/catalog-client/src/CatalogClient.ts`) + +If `query` is present, route to a new private method that POSTs to `/entity-facets`. Otherwise, use existing GET endpoint. + +### OpenAPI schema (`plugins/catalog-backend/src/schema/openapi.yaml`) + +Add POST operation `QueryEntityFacetsByPredicate` on `/entity-facets` with JSON body containing required `facets` array and optional `query` (JsonObject). + +### Generated OpenAPI client + +Add `queryEntityFacetsByPredicate` method. + +### Backend internal types (`plugins/catalog-backend/src/catalog/types.ts`) + +Add optional `query?: FilterPredicate` to `EntityFacetsRequest`. + +### Backend router (`plugins/catalog-backend/src/service/createRouter.ts`) + +Add POST handler that validates the query predicate with zod and calls `entitiesCatalog.facets`. + +### DefaultEntitiesCatalog.facets + +Pass `query` through to `applyEntityFilterToQuery` alongside existing `filter`. + +### AuthorizedEntitiesCatalog.facets + +No changes needed — permission conditions merge into `filter` only. From 193bd00374543d45c16456b2e03c69b2258618f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 15:55:37 +0100 Subject: [PATCH 268/455] docs: add implementation plan for facets predicate filtering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- .../2026-02-26-facets-predicate-filtering.md | 684 ++++++++++++++++++ 1 file changed, 684 insertions(+) create mode 100644 docs/plans/2026-02-26-facets-predicate-filtering.md diff --git a/docs/plans/2026-02-26-facets-predicate-filtering.md b/docs/plans/2026-02-26-facets-predicate-filtering.md new file mode 100644 index 0000000000..9f07d336c2 --- /dev/null +++ b/docs/plans/2026-02-26-facets-predicate-filtering.md @@ -0,0 +1,684 @@ +# Facets Predicate Filtering Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Add predicate-based filtering (`$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, `$hasPrefix`) to the catalog `/entity-facets` endpoint, mirroring the pattern already used by `/entities/by-query`. + +**Architecture:** Add a POST variant of `/entity-facets` that accepts a JSON body with `query` (predicate) and `facets`. The client routes to POST when a `query` field is present, otherwise falls back to the existing GET endpoint. The backend validates the predicate with zod, then passes it through to `applyEntityFilterToQuery` which already supports both `filter` and `query`. + +**Tech Stack:** TypeScript, Express, Knex, zod, OpenAPI + +--- + +### Task 1: Backend internal types — add `query` to `EntityFacetsRequest` + +**Files:** + +- Modify: `plugins/catalog-backend/src/catalog/types.ts:118-137` + +**Step 1: Add `query` field to `EntityFacetsRequest`** + +In `plugins/catalog-backend/src/catalog/types.ts`, add an optional `query` field to `EntityFacetsRequest` after the existing `filter` field: + +```typescript +export interface EntityFacetsRequest { + filter?: EntityFilter; + /** Predicate-based query for filtering entities. */ + query?: FilterPredicate; + facets: string[]; + credentials: BackstageCredentials; +} +``` + +`FilterPredicate` is already imported at the top of this file from `@backstage/filter-predicates`. + +**Step 2: Run type checker** + +Run: `yarn tsc` in project root. +Expected: Should pass (the new field is optional, so no callers break). + +**Step 3: Commit** + +``` +feat(catalog): add query predicate field to EntityFacetsRequest +``` + +--- + +### Task 2: DefaultEntitiesCatalog — pass `query` through to filter application + +**Files:** + +- Modify: `plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts:675-712` + +**Step 1: Update the `facets` method to pass `query` to `applyEntityFilterToQuery`** + +Change the filter application block (lines 689-696) from: + +```typescript +if (request.filter) { + applyEntityFilterToQuery({ + filter: request.filter, + targetQuery: query, + onEntityIdField: 'search.entity_id', + knex: this.database, + }); +} +``` + +To: + +```typescript +if (request.filter || request.query) { + applyEntityFilterToQuery({ + filter: request.filter, + query: request.query, + targetQuery: query, + onEntityIdField: 'search.entity_id', + knex: this.database, + }); +} +``` + +**Step 2: Run type checker** + +Run: `yarn tsc` in project root. +Expected: Should pass. + +**Step 3: Commit** + +``` +feat(catalog): support query predicates in DefaultEntitiesCatalog.facets +``` + +--- + +### Task 3: Backend router — add POST `/entity-facets` handler + +**Files:** + +- Modify: `plugins/catalog-backend/src/service/createRouter.ts:552-574` +- Create: `plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.ts` + +**Step 1: Create the request parser for POST facets** + +Create `plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.ts`: + +```typescript +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { InputError } from '@backstage/errors'; +import { + createZodV3FilterPredicateSchema, + FilterPredicate, +} from '@backstage/filter-predicates'; +import { z } from 'zod/v3'; +import { fromZodError } from 'zod-validation-error/v3'; + +const filterPredicateSchema = createZodV3FilterPredicateSchema(z); + +export interface ParsedEntityFacetsQuery { + facets: string[]; + query?: FilterPredicate; +} + +export function parseEntityFacetsQuery( + body: Record, +): ParsedEntityFacetsQuery { + // Parse facets + if (!Array.isArray(body.facets) || body.facets.length === 0) { + throw new InputError('Missing or empty facets parameter'); + } + const facets = body.facets.filter( + (f): f is string => typeof f === 'string' && f.length > 0, + ); + if (facets.length === 0) { + throw new InputError('Missing or empty facets parameter'); + } + + // Parse query predicate + let query: FilterPredicate | undefined; + if (body.query !== undefined) { + if ( + typeof body.query !== 'object' || + body.query === null || + Array.isArray(body.query) + ) { + throw new InputError('Query must be an object'); + } + const result = filterPredicateSchema.safeParse(body.query); + if (!result.success) { + throw new InputError(`Invalid query: ${fromZodError(result.error)}`); + } + query = result.data; + } + + return { facets, query }; +} +``` + +**Step 2: Add the POST handler in createRouter.ts** + +After the existing `.get('/entity-facets', ...)` block (which ends around line 574), add a new `.post('/entity-facets', ...)` handler. Change line 574 from: + +```typescript + }); +``` + +to: + +```typescript + }) + .post('/entity-facets', async (req, res) => { + const auditorEvent = await auditor.createEvent({ + eventId: 'entity-facets', + request: req, + }); + + try { + const { facets, query } = parseEntityFacetsQuery(req.body ?? {}); + + const response = await entitiesCatalog.facets({ + filter: undefined, + query, + facets, + credentials: await httpAuth.credentials(req), + }); + + await auditorEvent?.success(); + + res.status(200).json(response); + } catch (err) { + await auditorEvent?.fail({ + error: err, + }); + throw err; + } + }); +``` + +Add the import at the top of createRouter.ts, alongside the other request parser imports: + +```typescript +import { parseEntityFacetsQuery } from './request/parseEntityFacetsQuery'; +``` + +**Step 3: Run type checker** + +Run: `yarn tsc` in project root. +Expected: Should pass. + +**Step 4: Commit** + +``` +feat(catalog): add POST /entity-facets endpoint with predicate support +``` + +--- + +### Task 4: Backend router tests — test the POST endpoint + +**Files:** + +- Modify: `plugins/catalog-backend/src/service/createRouter.test.ts` +- Create: `plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.test.ts` + +**Step 1: Write unit tests for `parseEntityFacetsQuery`** + +Create `plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.test.ts`: + +```typescript +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { parseEntityFacetsQuery } from './parseEntityFacetsQuery'; + +describe('parseEntityFacetsQuery', () => { + it('parses facets with no query', () => { + expect(parseEntityFacetsQuery({ facets: ['kind'] })).toEqual({ + facets: ['kind'], + query: undefined, + }); + }); + + it('parses facets with a simple query', () => { + expect( + parseEntityFacetsQuery({ + facets: ['spec.type'], + query: { kind: 'Component' }, + }), + ).toEqual({ + facets: ['spec.type'], + query: { kind: 'Component' }, + }); + }); + + it('parses facets with complex predicate query', () => { + const query = { + $all: [{ kind: 'Component' }, { 'spec.lifecycle': 'production' }], + }; + expect(parseEntityFacetsQuery({ facets: ['spec.type'], query })).toEqual({ + facets: ['spec.type'], + query, + }); + }); + + it('throws on missing facets', () => { + expect(() => parseEntityFacetsQuery({})).toThrow( + 'Missing or empty facets parameter', + ); + }); + + it('throws on empty facets array', () => { + expect(() => parseEntityFacetsQuery({ facets: [] })).toThrow( + 'Missing or empty facets parameter', + ); + }); + + it('throws on invalid query (not an object)', () => { + expect(() => + parseEntityFacetsQuery({ facets: ['kind'], query: 'bad' }), + ).toThrow('Query must be an object'); + }); + + it('throws on invalid query (array)', () => { + expect(() => + parseEntityFacetsQuery({ facets: ['kind'], query: [] }), + ).toThrow('Query must be an object'); + }); +}); +``` + +**Step 2: Run the parser tests** + +Run: `CI=1 yarn --cwd plugins/catalog-backend test src/service/request/parseEntityFacetsQuery.test.ts` +Expected: All tests pass. + +**Step 3: Add route-level tests in `createRouter.test.ts`** + +Add a new describe block for `POST /entity-facets` and `GET /entity-facets` to the existing test file. Find a suitable location (near end of the `'createRouter readonly disabled'` describe block, before its closing `}`). The test should exercise both the POST and GET routes using the mocked `entitiesCatalog.facets`. + +Look at how other route tests are structured in the file (e.g. `POST /entities/by-query`) and follow the same pattern with `request(app).post(...)`. + +**Step 4: Run the router tests** + +Run: `CI=1 yarn --cwd plugins/catalog-backend test src/service/createRouter.test.ts` +Expected: All tests pass. + +**Step 5: Commit** + +``` +test(catalog): add tests for POST /entity-facets endpoint +``` + +--- + +### Task 5: OpenAPI schema — add POST operation for `/entity-facets` + +**Files:** + +- Modify: `plugins/catalog-backend/src/schema/openapi.yaml:1160-1196` + +**Step 1: Add POST operation to the `/entity-facets` path** + +After the existing `get` operation block (which ends at line 1196 with `- $ref: '#/components/parameters/filter'`), add: + +```yaml +post: + operationId: QueryEntityFacetsByPredicate + tags: + - Entity + description: Get entity facets using predicate-based filters. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntityFacetsResponse' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - facets + properties: + facets: + type: array + items: + type: string + query: + $ref: '#/components/schemas/JsonObject' +``` + +**Step 2: Commit** + +``` +feat(catalog): add POST /entity-facets to OpenAPI schema +``` + +--- + +### Task 6: Generated OpenAPI client — add `queryEntityFacetsByPredicate` method + +**Files:** + +- Modify: `packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts` +- Create: `packages/catalog-client/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts` + +**Step 1: Create the request model** + +Create `packages/catalog-client/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts`: + +```typescript +// ****************************************************************** +// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. * +// ****************************************************************** + +/** + * @public + */ +export interface QueryEntityFacetsByPredicateRequest { + facets: Array; + /** + * A type representing all allowed JSON object values. + */ + query?: { [key: string]: any }; +} +``` + +**Step 2: Add the request type and method to the API client** + +In `packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts`: + +Add the import near the other model imports: + +```typescript +import { QueryEntityFacetsByPredicateRequest } from '../models/QueryEntityFacetsByPredicateRequest.model'; +``` + +Add the request type alongside the other exported types (after `QueryEntitiesByPredicate`): + +```typescript +export type QueryEntityFacetsByPredicate = { + body: QueryEntityFacetsByPredicateRequest; +}; +``` + +Add the method after the `getEntityFacets` method: + +```typescript + public async queryEntityFacetsByPredicate( + // @ts-ignore + request: QueryEntityFacetsByPredicate, + options?: RequestOptions, + ): Promise> { + const baseUrl = await this.discoveryApi.getBaseUrl(pluginId); + + const uriTemplate = `/entity-facets`; + + const uri = parser.parse(uriTemplate).expand({}); + + return await this.fetchApi.fetch(`${baseUrl}${uri}`, { + headers: { + 'Content-Type': 'application/json', + ...(options?.token && { Authorization: `Bearer ${options?.token}` }), + }, + method: 'POST', + body: JSON.stringify(request.body), + }); + } +``` + +**Step 3: Run type checker** + +Run: `yarn tsc` in project root. +Expected: Should pass. + +**Step 4: Commit** + +``` +feat(catalog): add queryEntityFacetsByPredicate to generated OpenAPI client +``` + +--- + +### Task 7: Client types — add `query` field to `GetEntityFacetsRequest` + +**Files:** + +- Modify: `packages/catalog-client/src/types/api.ts:261-323` + +**Step 1: Add `query` field to `GetEntityFacetsRequest`** + +Add after the existing `filter` field (line 299): + +```typescript + /** + * If given, return only entities that match the given predicate query. + * + * @remarks + * + * Supports operators like `$all`, `$any`, `$not`, `$exists`, `$in`, + * `$contains`, and `$hasPrefix`. When both `filter` and `query` are + * provided, they are combined with `$all`. + */ + query?: FilterPredicate; +``` + +`FilterPredicate` is already imported at the top of this file. + +**Step 2: Run type checker** + +Run: `yarn tsc` in project root. +Expected: Should pass. + +**Step 3: Commit** + +``` +feat(catalog): add query predicate to GetEntityFacetsRequest +``` + +--- + +### Task 8: Client implementation — route to POST when `query` is present + +**Files:** + +- Modify: `packages/catalog-client/src/CatalogClient.ts:478-491` + +**Step 1: Update `getEntityFacets` to route to POST when `query` is present** + +Replace the current `getEntityFacets` method (lines 478-491) with: + +```typescript + async getEntityFacets( + request: GetEntityFacetsRequest, + options?: CatalogRequestOptions, + ): Promise { + const { filter, query, facets } = request; + + // Route to POST endpoint if query predicate is provided + if (query || filter) { + return this.getEntityFacetsByPredicate(request, options); + } + + return await this.requestOptional( + await this.apiClient.getEntityFacets( + { + query: { facet: facets }, + }, + options, + ), + ); + } +``` + +**Step 2: Add the private `getEntityFacetsByPredicate` method** + +Add after `getEntityFacets`: + +```typescript + /** + * Get entity facets using predicate-based filters (POST endpoint). + * @internal + */ + private async getEntityFacetsByPredicate( + request: GetEntityFacetsRequest, + options?: CatalogRequestOptions, + ): Promise { + const { filter, query, facets } = request; + + let filterPredicate: FilterPredicate | undefined; + if (query !== undefined) { + if ( + typeof query !== 'object' || + query === null || + Array.isArray(query) + ) { + throw new InputError('Query must be an object'); + } + filterPredicate = query; + } + if (filter !== undefined) { + const converted = convertFilterToPredicate(filter); + filterPredicate = filterPredicate + ? { $all: [filterPredicate, converted] } + : converted; + } + + return await this.requestOptional( + await this.apiClient.queryEntityFacetsByPredicate( + { + body: { + facets, + ...(filterPredicate && { + query: filterPredicate as unknown as { [key: string]: any }, + }), + }, + }, + options, + ), + ); + } +``` + +Make sure `InputError` is imported from `@backstage/errors` and `convertFilterToPredicate` is imported from `./utils` (check existing imports — `convertFilterToPredicate` is already used by `queryEntitiesByPredicate`). + +**Step 3: Run type checker** + +Run: `yarn tsc` in project root. +Expected: Should pass. + +**Step 4: Run existing client tests** + +Run: `CI=1 yarn --cwd packages/catalog-client test` +Expected: All tests pass. + +**Step 5: Commit** + +``` +feat(catalog): route facets requests to POST when query is present +``` + +--- + +### Task 9: Generate API reports and create changesets + +**Files:** + +- Create: `.changeset/.md` (two changesets) + +**Step 1: Run API reports** + +Run: `yarn build:api-reports` in project root. + +**Step 2: Create changeset for catalog-backend** + +Create `.changeset/facets-predicate-backend.md`: + +```markdown +--- +'@backstage/plugin-catalog-backend': minor +--- + +Added support for predicate-based filtering on the `/entity-facets` endpoint via a new `POST` method. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +``` + +**Step 3: Create changeset for catalog-client** + +Create `.changeset/facets-predicate-client.md`: + +```markdown +--- +'@backstage/catalog-client': minor +--- + +Added support for the `query` field in `getEntityFacets` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +``` + +**Step 4: Commit changesets and API reports** + +``` +chore: add changesets and API reports for facets predicate support +``` + +--- + +### Task 10: Final verification + +**Step 1: Run type checker** + +Run: `yarn tsc` in project root. +Expected: Should pass. + +**Step 2: Run backend tests** + +Run: `CI=1 yarn --cwd plugins/catalog-backend test` +Expected: All tests pass. + +**Step 3: Run client tests** + +Run: `CI=1 yarn --cwd packages/catalog-client test` +Expected: All tests pass. + +**Step 4: Run linter** + +Run: `yarn lint --fix` in project root. +Expected: Should pass. From 2d1580b9bd764a518a85c21161150733e6da96c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 16:02:34 +0100 Subject: [PATCH 269/455] feat(catalog): add query predicate field to EntityFacetsRequest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- plugins/catalog-backend/src/catalog/types.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index 5d733ad14c..d5c4b2b675 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -120,6 +120,10 @@ export interface EntityFacetsRequest { * A filter to apply on the full list of entities before computing the facets. */ filter?: EntityFilter; + /** + * Predicate-based query for filtering entities. + */ + query?: FilterPredicate; /** * The facets to compute. * From adcd98eb0b62b2404ed8bded0c8358dac059f41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 16:02:46 +0100 Subject: [PATCH 270/455] feat(catalog): support query predicates in DefaultEntitiesCatalog.facets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index dab605d176..a9d706582a 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -686,9 +686,10 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { }) .groupBy(['search.key', 'search.original_value']); - if (request.filter) { + if (request.filter || request.query) { applyEntityFilterToQuery({ filter: request.filter, + query: request.query, targetQuery: query, onEntityIdField: 'search.entity_id', knex: this.database, From e0fc8ddaec79e823fe27a35e3414347c4f6cd578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 16:03:16 +0100 Subject: [PATCH 271/455] feat(catalog): add POST /entity-facets endpoint with predicate support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- .../openapi/generated/apis/Api.client.ts | 32 +++++++++++ ...eryEntityFacetsByPredicateRequest.model.ts | 30 ++++++++++ .../schema/openapi/generated/models/index.ts | 1 + .../catalog-backend/src/schema/openapi.yaml | 34 +++++++++++ .../openapi/generated/apis/Api.server.ts | 10 ++++ ...eryEntityFacetsByPredicateRequest.model.ts | 30 ++++++++++ .../schema/openapi/generated/models/index.ts | 1 + .../src/schema/openapi/generated/router.ts | 51 +++++++++++++++++ .../src/service/createRouter.ts | 26 +++++++++ .../service/request/parseEntityFacetsQuery.ts | 56 +++++++++++++++++++ 10 files changed, 271 insertions(+) create mode 100644 packages/catalog-client/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts create mode 100644 plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts create mode 100644 plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.ts diff --git a/packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts b/packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts index 086f3695d4..899e310e94 100644 --- a/packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts +++ b/packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts @@ -30,6 +30,7 @@ import { EntityAncestryResponse } from '../models/EntityAncestryResponse.model'; import { EntityFacetsResponse } from '../models/EntityFacetsResponse.model'; import { GetEntitiesByRefsRequest } from '../models/GetEntitiesByRefsRequest.model'; import { QueryEntitiesByPredicateRequest } from '../models/QueryEntitiesByPredicateRequest.model'; +import { QueryEntityFacetsByPredicateRequest } from '../models/QueryEntityFacetsByPredicateRequest.model'; import { RefreshEntityRequest } from '../models/RefreshEntityRequest.model'; import { ValidateEntityRequest } from '../models/ValidateEntityRequest.model'; import { AnalyzeLocationRequest } from '../models/AnalyzeLocationRequest.model'; @@ -146,6 +147,12 @@ export type GetEntityFacets = { export type QueryEntitiesByPredicate = { body: QueryEntitiesByPredicateRequest; }; +/** + * @public + */ +export type QueryEntityFacetsByPredicate = { + body: QueryEntityFacetsByPredicateRequest; +}; /** * @public */ @@ -481,6 +488,31 @@ export class DefaultApiClient { }); } + /** + * Get entity facets using predicate-based filters. + * @param queryEntityFacetsByPredicateRequest - + */ + public async queryEntityFacetsByPredicate( + // @ts-ignore + request: QueryEntityFacetsByPredicate, + options?: RequestOptions, + ): Promise> { + const baseUrl = await this.discoveryApi.getBaseUrl(pluginId); + + const uriTemplate = `/entity-facets`; + + const uri = parser.parse(uriTemplate).expand({}); + + return await this.fetchApi.fetch(`${baseUrl}${uri}`, { + headers: { + 'Content-Type': 'application/json', + ...(options?.token && { Authorization: `Bearer ${options?.token}` }), + }, + method: 'POST', + body: JSON.stringify(request.body), + }); + } + /** * Refresh the entity related to entityRef. * @param refreshEntityRequest - diff --git a/packages/catalog-client/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts b/packages/catalog-client/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts new file mode 100644 index 0000000000..14fd3a8bc0 --- /dev/null +++ b/packages/catalog-client/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ****************************************************************** +// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. * +// ****************************************************************** + +/** + * @public + */ +export interface QueryEntityFacetsByPredicateRequest { + facets: Array; + /** + * A type representing all allowed JSON object values. + */ + query?: { [key: string]: any }; +} diff --git a/packages/catalog-client/src/schema/openapi/generated/models/index.ts b/packages/catalog-client/src/schema/openapi/generated/models/index.ts index 9461ac8d28..ebecb8dbb7 100644 --- a/packages/catalog-client/src/schema/openapi/generated/models/index.ts +++ b/packages/catalog-client/src/schema/openapi/generated/models/index.ts @@ -48,6 +48,7 @@ export * from '../models/NullableEntity.model'; export * from '../models/QueryEntitiesByPredicateRequest.model'; export * from '../models/QueryEntitiesByPredicateRequestFullTextFilter.model'; export * from '../models/QueryEntitiesByPredicateRequestOrderByInner.model'; +export * from '../models/QueryEntityFacetsByPredicateRequest.model'; export * from '../models/RecursivePartialEntity.model'; export * from '../models/RecursivePartialEntityMeta.model'; export * from '../models/RecursivePartialEntityMetaAllOf.model'; diff --git a/plugins/catalog-backend/src/schema/openapi.yaml b/plugins/catalog-backend/src/schema/openapi.yaml index 0531a9a1d3..58d7fed4ac 100644 --- a/plugins/catalog-backend/src/schema/openapi.yaml +++ b/plugins/catalog-backend/src/schema/openapi.yaml @@ -1194,6 +1194,40 @@ paths: value: - spec.type - $ref: '#/components/parameters/filter' + post: + operationId: QueryEntityFacetsByPredicate + tags: + - Entity + description: Get entity facets using predicate-based filters. + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/EntityFacetsResponse' + '400': + $ref: '#/components/responses/ErrorResponse' + default: + $ref: '#/components/responses/ErrorResponse' + security: + - {} + - JWT: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - facets + properties: + facets: + type: array + items: + type: string + query: + $ref: '#/components/schemas/JsonObject' /locations: post: operationId: CreateLocation diff --git a/plugins/catalog-backend/src/schema/openapi/generated/apis/Api.server.ts b/plugins/catalog-backend/src/schema/openapi/generated/apis/Api.server.ts index dfb111359c..3362f903d0 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/apis/Api.server.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/apis/Api.server.ts @@ -27,6 +27,7 @@ import { EntityAncestryResponse } from '../models/EntityAncestryResponse.model'; import { EntityFacetsResponse } from '../models/EntityFacetsResponse.model'; import { GetEntitiesByRefsRequest } from '../models/GetEntitiesByRefsRequest.model'; import { QueryEntitiesByPredicateRequest } from '../models/QueryEntitiesByPredicateRequest.model'; +import { QueryEntityFacetsByPredicateRequest } from '../models/QueryEntityFacetsByPredicateRequest.model'; import { RefreshEntityRequest } from '../models/RefreshEntityRequest.model'; import { ValidateEntity400Response } from '../models/ValidateEntity400Response.model'; import { ValidateEntityRequest } from '../models/ValidateEntityRequest.model'; @@ -128,6 +129,13 @@ export type QueryEntitiesByPredicate = { body: QueryEntitiesByPredicateRequest; response: EntitiesQueryResponse | Error | Error; }; +/** + * @public + */ +export type QueryEntityFacetsByPredicate = { + body: QueryEntityFacetsByPredicateRequest; + response: EntityFacetsResponse | Error | Error; +}; /** * @public */ @@ -230,6 +238,8 @@ export type EndpointMap = { '#post|/entities/by-query': QueryEntitiesByPredicate; + '#post|/entity-facets': QueryEntityFacetsByPredicate; + '#post|/refresh': RefreshEntity; '#post|/validate-entity': ValidateEntity; diff --git a/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts b/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts new file mode 100644 index 0000000000..14fd3a8bc0 --- /dev/null +++ b/plugins/catalog-backend/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// ****************************************************************** +// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. * +// ****************************************************************** + +/** + * @public + */ +export interface QueryEntityFacetsByPredicateRequest { + facets: Array; + /** + * A type representing all allowed JSON object values. + */ + query?: { [key: string]: any }; +} diff --git a/plugins/catalog-backend/src/schema/openapi/generated/models/index.ts b/plugins/catalog-backend/src/schema/openapi/generated/models/index.ts index 9461ac8d28..ebecb8dbb7 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/models/index.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/models/index.ts @@ -48,6 +48,7 @@ export * from '../models/NullableEntity.model'; export * from '../models/QueryEntitiesByPredicateRequest.model'; export * from '../models/QueryEntitiesByPredicateRequestFullTextFilter.model'; export * from '../models/QueryEntitiesByPredicateRequestOrderByInner.model'; +export * from '../models/QueryEntityFacetsByPredicateRequest.model'; export * from '../models/RecursivePartialEntity.model'; export * from '../models/RecursivePartialEntityMeta.model'; export * from '../models/RecursivePartialEntityMetaAllOf.model'; diff --git a/plugins/catalog-backend/src/schema/openapi/generated/router.ts b/plugins/catalog-backend/src/schema/openapi/generated/router.ts index 6c739eb2ee..b423905955 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/router.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/router.ts @@ -1373,6 +1373,57 @@ export const spec = { }, ], }, + post: { + operationId: 'QueryEntityFacetsByPredicate', + tags: ['Entity'], + description: 'Get entity facets using predicate-based filters.', + responses: { + '200': { + description: 'Ok', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/EntityFacetsResponse', + }, + }, + }, + }, + '400': { + $ref: '#/components/responses/ErrorResponse', + }, + default: { + $ref: '#/components/responses/ErrorResponse', + }, + }, + security: [ + {}, + { + JWT: [], + }, + ], + requestBody: { + required: true, + content: { + 'application/json': { + schema: { + type: 'object', + required: ['facets'], + properties: { + facets: { + type: 'array', + items: { + type: 'string', + }, + }, + query: { + $ref: '#/components/schemas/JsonObject', + }, + }, + }, + }, + }, + }, + }, }, '/locations': { post: { diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index 48bf7961b8..90c76cc4d4 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -47,6 +47,7 @@ import { parseQueryEntitiesParams, } from './request'; import { parseEntityFacetParams } from './request/parseEntityFacetParams'; +import { parseEntityFacetsQuery } from './request/parseEntityFacetsQuery'; import { parseEntityOrderParams } from './request/parseEntityOrderParams'; import { parseEntityPaginationParams } from './request/parseEntityPaginationParams'; import { @@ -564,6 +565,31 @@ export async function createRouter( await auditorEvent?.success(); + res.status(200).json(response); + } catch (err) { + await auditorEvent?.fail({ + error: err, + }); + throw err; + } + }) + .post('/entity-facets', async (req, res) => { + const auditorEvent = await auditor.createEvent({ + eventId: 'entity-facets', + request: req, + }); + + try { + const { facets, query } = parseEntityFacetsQuery(req.body ?? {}); + + const response = await entitiesCatalog.facets({ + query, + facets, + credentials: await httpAuth.credentials(req), + }); + + await auditorEvent?.success(); + res.status(200).json(response); } catch (err) { await auditorEvent?.fail({ diff --git a/plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.ts b/plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.ts new file mode 100644 index 0000000000..04e5e2ab82 --- /dev/null +++ b/plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.ts @@ -0,0 +1,56 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { InputError } from '@backstage/errors'; +import { + createZodV3FilterPredicateSchema, + FilterPredicate, +} from '@backstage/filter-predicates'; +import { z } from 'zod/v3'; +import { fromZodError } from 'zod-validation-error/v3'; +import { QueryEntityFacetsByPredicateRequest } from '../../schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model'; + +const filterPredicateSchema = createZodV3FilterPredicateSchema(z); + +export interface ParsedEntityFacetsQuery { + facets: string[]; + query?: FilterPredicate; +} + +export function parseEntityFacetsQuery( + request: Readonly, +): ParsedEntityFacetsQuery { + // Parse facets + if (!request.facets || request.facets.length === 0) { + throw new InputError('Missing or empty facets parameter'); + } + const facets = request.facets.filter(f => f.length > 0); + if (facets.length === 0) { + throw new InputError('Missing or empty facets parameter'); + } + + // Parse query predicate + let query: FilterPredicate | undefined; + if (request.query !== undefined) { + const result = filterPredicateSchema.safeParse(request.query); + if (!result.success) { + throw new InputError(`Invalid query: ${fromZodError(result.error)}`); + } + query = result.data; + } + + return { facets, query }; +} From 7a29905ba06aab72130d30d228ec2d1df02b773e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 16:19:43 +0100 Subject: [PATCH 272/455] feat(catalog): add query predicate to GetEntityFacetsRequest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/types/api.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/catalog-client/src/types/api.ts b/packages/catalog-client/src/types/api.ts index afd26076c9..13a7822df9 100644 --- a/packages/catalog-client/src/types/api.ts +++ b/packages/catalog-client/src/types/api.ts @@ -297,6 +297,16 @@ export interface GetEntityFacetsRequest { * of that key, no matter what its value is. */ filter?: EntityFilterQuery; + /** + * If given, return only entities that match the given predicate query. + * + * @remarks + * + * Supports operators like `$all`, `$any`, `$not`, `$exists`, `$in`, + * `$contains`, and `$hasPrefix`. When both `filter` and `query` are + * provided, they are combined with `$all`. + */ + query?: FilterPredicate; /** * Dot separated paths for the facets to extract from each entity. * From be6c10ef8cbc81f35359c8deb4135db27ce7ce47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 16:21:12 +0100 Subject: [PATCH 273/455] test(catalog): add tests for POST /entity-facets endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add unit tests for parseEntityFacetsQuery covering valid inputs (simple queries, complex predicate queries, no query) and error cases (missing facets, empty facets, invalid query types). Add route-level tests for both GET and POST /entity-facets in createRouter.test.ts. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- .../src/service/createRouter.test.ts | 63 +++++++++++++++ .../request/parseEntityFacetsQuery.test.ts | 81 +++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.test.ts diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 842a08c2d3..6d2b8ca70a 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -1190,6 +1190,69 @@ describe('createRouter readonly disabled', () => { ); }); }); + + describe('GET /entity-facets', () => { + it('returns facets', async () => { + entitiesCatalog.facets.mockResolvedValue({ + facets: { kind: [{ value: 'Component', count: 5 }] }, + }); + + const response = await request(app).get('/entity-facets?facet=kind'); + expect(response.status).toBe(200); + expect(response.body).toEqual({ + facets: { kind: [{ value: 'Component', count: 5 }] }, + }); + }); + }); + + describe('POST /entity-facets', () => { + it('returns facets with predicate query', async () => { + entitiesCatalog.facets.mockResolvedValue({ + facets: { 'spec.type': [{ value: 'service', count: 3 }] }, + }); + + const response = await request(app) + .post('/entity-facets') + .send({ + facets: ['spec.type'], + query: { kind: 'Component' }, + }); + + expect(response.status).toBe(200); + expect(response.body).toEqual({ + facets: { 'spec.type': [{ value: 'service', count: 3 }] }, + }); + expect(entitiesCatalog.facets).toHaveBeenCalledWith( + expect.objectContaining({ + facets: ['spec.type'], + query: { kind: 'Component' }, + }), + ); + }); + + it('returns facets without query predicate', async () => { + entitiesCatalog.facets.mockResolvedValue({ + facets: { kind: [{ value: 'Component', count: 5 }] }, + }); + + const response = await request(app) + .post('/entity-facets') + .send({ facets: ['kind'] }); + + expect(response.status).toBe(200); + expect(response.body).toEqual({ + facets: { kind: [{ value: 'Component', count: 5 }] }, + }); + }); + + it('returns 400 for missing facets', async () => { + const response = await request(app) + .post('/entity-facets') + .send({ query: { kind: 'Component' } }); + + expect(response.status).toBe(400); + }); + }); }); describe('createRouter readonly and raw json enabled', () => { diff --git a/plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.test.ts b/plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.test.ts new file mode 100644 index 0000000000..473466f950 --- /dev/null +++ b/plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.test.ts @@ -0,0 +1,81 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { parseEntityFacetsQuery } from './parseEntityFacetsQuery'; + +describe('parseEntityFacetsQuery', () => { + it('parses facets with no query', () => { + expect(parseEntityFacetsQuery({ facets: ['kind'] })).toEqual({ + facets: ['kind'], + query: undefined, + }); + }); + + it('parses facets with a simple query', () => { + expect( + parseEntityFacetsQuery({ + facets: ['spec.type'], + query: { kind: 'Component' }, + }), + ).toEqual({ + facets: ['spec.type'], + query: { kind: 'Component' }, + }); + }); + + it('parses facets with complex predicate query', () => { + const query = { + $all: [{ kind: 'Component' }, { 'spec.lifecycle': 'production' }], + }; + expect(parseEntityFacetsQuery({ facets: ['spec.type'], query })).toEqual({ + facets: ['spec.type'], + query, + }); + }); + + it('throws on missing facets', () => { + expect(() => parseEntityFacetsQuery({} as any)).toThrow( + 'Missing or empty facets parameter', + ); + }); + + it('throws on empty facets array', () => { + expect(() => parseEntityFacetsQuery({ facets: [] })).toThrow( + 'Missing or empty facets parameter', + ); + }); + + it('throws on invalid query (null)', () => { + expect(() => + parseEntityFacetsQuery({ facets: ['kind'], query: null as any }), + ).toThrow(); + }); + + it('throws on invalid query (array)', () => { + expect(() => + parseEntityFacetsQuery({ facets: ['kind'], query: [] as any }), + ).toThrow(); + }); + + it('throws on invalid query (invalid operator)', () => { + expect(() => + parseEntityFacetsQuery({ + facets: ['kind'], + query: { $invalid: 'bad' } as any, + }), + ).toThrow(); + }); +}); From bd179b0d3ba71895f256ffa8b5d72df8b4db59f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 16:21:24 +0100 Subject: [PATCH 274/455] feat(catalog): route facets requests to POST when query is present MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/CatalogClient.ts | 49 +++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index d1196bd8ba..cef743e5c6 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -479,11 +479,56 @@ export class CatalogClient implements CatalogApi { request: GetEntityFacetsRequest, options?: CatalogRequestOptions, ): Promise { - const { filter = [], facets } = request; + const { filter, query, facets } = request; + + // Route to POST endpoint if query predicate is provided + if (query || filter) { + return this.getEntityFacetsByPredicate(request, options); + } + return await this.requestOptional( await this.apiClient.getEntityFacets( { - query: { facet: facets, filter: this.getFilterValue(filter) }, + query: { facet: facets }, + }, + options, + ), + ); + } + + /** + * Get entity facets using predicate-based filters (POST endpoint). + * @internal + */ + private async getEntityFacetsByPredicate( + request: GetEntityFacetsRequest, + options?: CatalogRequestOptions, + ): Promise { + const { filter, query, facets } = request; + + let filterPredicate: FilterPredicate | undefined; + if (query !== undefined) { + if (typeof query !== 'object' || query === null || Array.isArray(query)) { + throw new InputError('Query must be an object'); + } + filterPredicate = query; + } + if (filter !== undefined) { + const converted = convertFilterToPredicate(filter); + filterPredicate = filterPredicate + ? { $all: [filterPredicate, converted] } + : converted; + } + + return await this.requestOptional( + await this.apiClient.queryEntityFacetsByPredicate( + { + body: { + facets, + ...(filterPredicate && { + query: filterPredicate as unknown as { [key: string]: any }, + }), + }, }, options, ), From 56c908eed591497bcf85e8f5c0f15ea109814d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 16:25:31 +0100 Subject: [PATCH 275/455] chore: add changesets and API reports for facets predicate support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- .changeset/facets-predicate-backend.md | 5 +++++ .changeset/facets-predicate-client.md | 5 +++++ packages/catalog-client/report.api.md | 1 + 3 files changed, 11 insertions(+) create mode 100644 .changeset/facets-predicate-backend.md create mode 100644 .changeset/facets-predicate-client.md diff --git a/.changeset/facets-predicate-backend.md b/.changeset/facets-predicate-backend.md new file mode 100644 index 0000000000..9ecdef11b6 --- /dev/null +++ b/.changeset/facets-predicate-backend.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Added support for predicate-based filtering on the `/entity-facets` endpoint via a new `POST` method. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. diff --git a/.changeset/facets-predicate-client.md b/.changeset/facets-predicate-client.md new file mode 100644 index 0000000000..5493d7c82a --- /dev/null +++ b/.changeset/facets-predicate-client.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-client': minor +--- + +Added support for the `query` field in `getEntityFacets` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. diff --git a/packages/catalog-client/report.api.md b/packages/catalog-client/report.api.md index 0d71e6bc59..8bfebe6ab1 100644 --- a/packages/catalog-client/report.api.md +++ b/packages/catalog-client/report.api.md @@ -280,6 +280,7 @@ export interface GetEntityAncestorsResponse { export interface GetEntityFacetsRequest { facets: string[]; filter?: EntityFilterQuery; + query?: FilterPredicate; } // @public From 12b790d3c3fe26f29d7188584a6827efe58a5d12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 16:31:22 +0100 Subject: [PATCH 276/455] chore: remove working plan documents MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- ...02-26-facets-predicate-filtering-design.md | 43 -- .../2026-02-26-facets-predicate-filtering.md | 684 ------------------ 2 files changed, 727 deletions(-) delete mode 100644 docs/plans/2026-02-26-facets-predicate-filtering-design.md delete mode 100644 docs/plans/2026-02-26-facets-predicate-filtering.md diff --git a/docs/plans/2026-02-26-facets-predicate-filtering-design.md b/docs/plans/2026-02-26-facets-predicate-filtering-design.md deleted file mode 100644 index 9b086fb8df..0000000000 --- a/docs/plans/2026-02-26-facets-predicate-filtering-design.md +++ /dev/null @@ -1,43 +0,0 @@ -# Predicate-based filtering for the catalog facets endpoint - -## Problem - -The `/entity-facets` endpoint only supports the old filter query parameter syntax. The `queryEntities` endpoint already has a POST variant that accepts predicate-based filtering (`$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, `$hasPrefix`). We need the same capability for facets. - -## Approach - -Mirror the pattern from `queryEntities`: add a POST variant of `/entity-facets` that accepts a JSON body with a `query` predicate, while keeping the existing GET endpoint for backward compatibility. - -## Changes - -### Client types (`packages/catalog-client/src/types/api.ts`) - -Add optional `query: FilterPredicate` field to `GetEntityFacetsRequest`. When both `filter` and `query` are provided, the client converts `filter` to a predicate and merges them with `$all`. - -### Client implementation (`packages/catalog-client/src/CatalogClient.ts`) - -If `query` is present, route to a new private method that POSTs to `/entity-facets`. Otherwise, use existing GET endpoint. - -### OpenAPI schema (`plugins/catalog-backend/src/schema/openapi.yaml`) - -Add POST operation `QueryEntityFacetsByPredicate` on `/entity-facets` with JSON body containing required `facets` array and optional `query` (JsonObject). - -### Generated OpenAPI client - -Add `queryEntityFacetsByPredicate` method. - -### Backend internal types (`plugins/catalog-backend/src/catalog/types.ts`) - -Add optional `query?: FilterPredicate` to `EntityFacetsRequest`. - -### Backend router (`plugins/catalog-backend/src/service/createRouter.ts`) - -Add POST handler that validates the query predicate with zod and calls `entitiesCatalog.facets`. - -### DefaultEntitiesCatalog.facets - -Pass `query` through to `applyEntityFilterToQuery` alongside existing `filter`. - -### AuthorizedEntitiesCatalog.facets - -No changes needed — permission conditions merge into `filter` only. diff --git a/docs/plans/2026-02-26-facets-predicate-filtering.md b/docs/plans/2026-02-26-facets-predicate-filtering.md deleted file mode 100644 index 9f07d336c2..0000000000 --- a/docs/plans/2026-02-26-facets-predicate-filtering.md +++ /dev/null @@ -1,684 +0,0 @@ -# Facets Predicate Filtering Implementation Plan - -> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. - -**Goal:** Add predicate-based filtering (`$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, `$hasPrefix`) to the catalog `/entity-facets` endpoint, mirroring the pattern already used by `/entities/by-query`. - -**Architecture:** Add a POST variant of `/entity-facets` that accepts a JSON body with `query` (predicate) and `facets`. The client routes to POST when a `query` field is present, otherwise falls back to the existing GET endpoint. The backend validates the predicate with zod, then passes it through to `applyEntityFilterToQuery` which already supports both `filter` and `query`. - -**Tech Stack:** TypeScript, Express, Knex, zod, OpenAPI - ---- - -### Task 1: Backend internal types — add `query` to `EntityFacetsRequest` - -**Files:** - -- Modify: `plugins/catalog-backend/src/catalog/types.ts:118-137` - -**Step 1: Add `query` field to `EntityFacetsRequest`** - -In `plugins/catalog-backend/src/catalog/types.ts`, add an optional `query` field to `EntityFacetsRequest` after the existing `filter` field: - -```typescript -export interface EntityFacetsRequest { - filter?: EntityFilter; - /** Predicate-based query for filtering entities. */ - query?: FilterPredicate; - facets: string[]; - credentials: BackstageCredentials; -} -``` - -`FilterPredicate` is already imported at the top of this file from `@backstage/filter-predicates`. - -**Step 2: Run type checker** - -Run: `yarn tsc` in project root. -Expected: Should pass (the new field is optional, so no callers break). - -**Step 3: Commit** - -``` -feat(catalog): add query predicate field to EntityFacetsRequest -``` - ---- - -### Task 2: DefaultEntitiesCatalog — pass `query` through to filter application - -**Files:** - -- Modify: `plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts:675-712` - -**Step 1: Update the `facets` method to pass `query` to `applyEntityFilterToQuery`** - -Change the filter application block (lines 689-696) from: - -```typescript -if (request.filter) { - applyEntityFilterToQuery({ - filter: request.filter, - targetQuery: query, - onEntityIdField: 'search.entity_id', - knex: this.database, - }); -} -``` - -To: - -```typescript -if (request.filter || request.query) { - applyEntityFilterToQuery({ - filter: request.filter, - query: request.query, - targetQuery: query, - onEntityIdField: 'search.entity_id', - knex: this.database, - }); -} -``` - -**Step 2: Run type checker** - -Run: `yarn tsc` in project root. -Expected: Should pass. - -**Step 3: Commit** - -``` -feat(catalog): support query predicates in DefaultEntitiesCatalog.facets -``` - ---- - -### Task 3: Backend router — add POST `/entity-facets` handler - -**Files:** - -- Modify: `plugins/catalog-backend/src/service/createRouter.ts:552-574` -- Create: `plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.ts` - -**Step 1: Create the request parser for POST facets** - -Create `plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.ts`: - -```typescript -/* - * Copyright 2026 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { InputError } from '@backstage/errors'; -import { - createZodV3FilterPredicateSchema, - FilterPredicate, -} from '@backstage/filter-predicates'; -import { z } from 'zod/v3'; -import { fromZodError } from 'zod-validation-error/v3'; - -const filterPredicateSchema = createZodV3FilterPredicateSchema(z); - -export interface ParsedEntityFacetsQuery { - facets: string[]; - query?: FilterPredicate; -} - -export function parseEntityFacetsQuery( - body: Record, -): ParsedEntityFacetsQuery { - // Parse facets - if (!Array.isArray(body.facets) || body.facets.length === 0) { - throw new InputError('Missing or empty facets parameter'); - } - const facets = body.facets.filter( - (f): f is string => typeof f === 'string' && f.length > 0, - ); - if (facets.length === 0) { - throw new InputError('Missing or empty facets parameter'); - } - - // Parse query predicate - let query: FilterPredicate | undefined; - if (body.query !== undefined) { - if ( - typeof body.query !== 'object' || - body.query === null || - Array.isArray(body.query) - ) { - throw new InputError('Query must be an object'); - } - const result = filterPredicateSchema.safeParse(body.query); - if (!result.success) { - throw new InputError(`Invalid query: ${fromZodError(result.error)}`); - } - query = result.data; - } - - return { facets, query }; -} -``` - -**Step 2: Add the POST handler in createRouter.ts** - -After the existing `.get('/entity-facets', ...)` block (which ends around line 574), add a new `.post('/entity-facets', ...)` handler. Change line 574 from: - -```typescript - }); -``` - -to: - -```typescript - }) - .post('/entity-facets', async (req, res) => { - const auditorEvent = await auditor.createEvent({ - eventId: 'entity-facets', - request: req, - }); - - try { - const { facets, query } = parseEntityFacetsQuery(req.body ?? {}); - - const response = await entitiesCatalog.facets({ - filter: undefined, - query, - facets, - credentials: await httpAuth.credentials(req), - }); - - await auditorEvent?.success(); - - res.status(200).json(response); - } catch (err) { - await auditorEvent?.fail({ - error: err, - }); - throw err; - } - }); -``` - -Add the import at the top of createRouter.ts, alongside the other request parser imports: - -```typescript -import { parseEntityFacetsQuery } from './request/parseEntityFacetsQuery'; -``` - -**Step 3: Run type checker** - -Run: `yarn tsc` in project root. -Expected: Should pass. - -**Step 4: Commit** - -``` -feat(catalog): add POST /entity-facets endpoint with predicate support -``` - ---- - -### Task 4: Backend router tests — test the POST endpoint - -**Files:** - -- Modify: `plugins/catalog-backend/src/service/createRouter.test.ts` -- Create: `plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.test.ts` - -**Step 1: Write unit tests for `parseEntityFacetsQuery`** - -Create `plugins/catalog-backend/src/service/request/parseEntityFacetsQuery.test.ts`: - -```typescript -/* - * Copyright 2026 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { parseEntityFacetsQuery } from './parseEntityFacetsQuery'; - -describe('parseEntityFacetsQuery', () => { - it('parses facets with no query', () => { - expect(parseEntityFacetsQuery({ facets: ['kind'] })).toEqual({ - facets: ['kind'], - query: undefined, - }); - }); - - it('parses facets with a simple query', () => { - expect( - parseEntityFacetsQuery({ - facets: ['spec.type'], - query: { kind: 'Component' }, - }), - ).toEqual({ - facets: ['spec.type'], - query: { kind: 'Component' }, - }); - }); - - it('parses facets with complex predicate query', () => { - const query = { - $all: [{ kind: 'Component' }, { 'spec.lifecycle': 'production' }], - }; - expect(parseEntityFacetsQuery({ facets: ['spec.type'], query })).toEqual({ - facets: ['spec.type'], - query, - }); - }); - - it('throws on missing facets', () => { - expect(() => parseEntityFacetsQuery({})).toThrow( - 'Missing or empty facets parameter', - ); - }); - - it('throws on empty facets array', () => { - expect(() => parseEntityFacetsQuery({ facets: [] })).toThrow( - 'Missing or empty facets parameter', - ); - }); - - it('throws on invalid query (not an object)', () => { - expect(() => - parseEntityFacetsQuery({ facets: ['kind'], query: 'bad' }), - ).toThrow('Query must be an object'); - }); - - it('throws on invalid query (array)', () => { - expect(() => - parseEntityFacetsQuery({ facets: ['kind'], query: [] }), - ).toThrow('Query must be an object'); - }); -}); -``` - -**Step 2: Run the parser tests** - -Run: `CI=1 yarn --cwd plugins/catalog-backend test src/service/request/parseEntityFacetsQuery.test.ts` -Expected: All tests pass. - -**Step 3: Add route-level tests in `createRouter.test.ts`** - -Add a new describe block for `POST /entity-facets` and `GET /entity-facets` to the existing test file. Find a suitable location (near end of the `'createRouter readonly disabled'` describe block, before its closing `}`). The test should exercise both the POST and GET routes using the mocked `entitiesCatalog.facets`. - -Look at how other route tests are structured in the file (e.g. `POST /entities/by-query`) and follow the same pattern with `request(app).post(...)`. - -**Step 4: Run the router tests** - -Run: `CI=1 yarn --cwd plugins/catalog-backend test src/service/createRouter.test.ts` -Expected: All tests pass. - -**Step 5: Commit** - -``` -test(catalog): add tests for POST /entity-facets endpoint -``` - ---- - -### Task 5: OpenAPI schema — add POST operation for `/entity-facets` - -**Files:** - -- Modify: `plugins/catalog-backend/src/schema/openapi.yaml:1160-1196` - -**Step 1: Add POST operation to the `/entity-facets` path** - -After the existing `get` operation block (which ends at line 1196 with `- $ref: '#/components/parameters/filter'`), add: - -```yaml -post: - operationId: QueryEntityFacetsByPredicate - tags: - - Entity - description: Get entity facets using predicate-based filters. - responses: - '200': - description: Ok - content: - application/json: - schema: - $ref: '#/components/schemas/EntityFacetsResponse' - '400': - $ref: '#/components/responses/ErrorResponse' - default: - $ref: '#/components/responses/ErrorResponse' - security: - - {} - - JWT: [] - requestBody: - required: true - content: - application/json: - schema: - type: object - required: - - facets - properties: - facets: - type: array - items: - type: string - query: - $ref: '#/components/schemas/JsonObject' -``` - -**Step 2: Commit** - -``` -feat(catalog): add POST /entity-facets to OpenAPI schema -``` - ---- - -### Task 6: Generated OpenAPI client — add `queryEntityFacetsByPredicate` method - -**Files:** - -- Modify: `packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts` -- Create: `packages/catalog-client/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts` - -**Step 1: Create the request model** - -Create `packages/catalog-client/src/schema/openapi/generated/models/QueryEntityFacetsByPredicateRequest.model.ts`: - -```typescript -// ****************************************************************** -// * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. * -// ****************************************************************** - -/** - * @public - */ -export interface QueryEntityFacetsByPredicateRequest { - facets: Array; - /** - * A type representing all allowed JSON object values. - */ - query?: { [key: string]: any }; -} -``` - -**Step 2: Add the request type and method to the API client** - -In `packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts`: - -Add the import near the other model imports: - -```typescript -import { QueryEntityFacetsByPredicateRequest } from '../models/QueryEntityFacetsByPredicateRequest.model'; -``` - -Add the request type alongside the other exported types (after `QueryEntitiesByPredicate`): - -```typescript -export type QueryEntityFacetsByPredicate = { - body: QueryEntityFacetsByPredicateRequest; -}; -``` - -Add the method after the `getEntityFacets` method: - -```typescript - public async queryEntityFacetsByPredicate( - // @ts-ignore - request: QueryEntityFacetsByPredicate, - options?: RequestOptions, - ): Promise> { - const baseUrl = await this.discoveryApi.getBaseUrl(pluginId); - - const uriTemplate = `/entity-facets`; - - const uri = parser.parse(uriTemplate).expand({}); - - return await this.fetchApi.fetch(`${baseUrl}${uri}`, { - headers: { - 'Content-Type': 'application/json', - ...(options?.token && { Authorization: `Bearer ${options?.token}` }), - }, - method: 'POST', - body: JSON.stringify(request.body), - }); - } -``` - -**Step 3: Run type checker** - -Run: `yarn tsc` in project root. -Expected: Should pass. - -**Step 4: Commit** - -``` -feat(catalog): add queryEntityFacetsByPredicate to generated OpenAPI client -``` - ---- - -### Task 7: Client types — add `query` field to `GetEntityFacetsRequest` - -**Files:** - -- Modify: `packages/catalog-client/src/types/api.ts:261-323` - -**Step 1: Add `query` field to `GetEntityFacetsRequest`** - -Add after the existing `filter` field (line 299): - -```typescript - /** - * If given, return only entities that match the given predicate query. - * - * @remarks - * - * Supports operators like `$all`, `$any`, `$not`, `$exists`, `$in`, - * `$contains`, and `$hasPrefix`. When both `filter` and `query` are - * provided, they are combined with `$all`. - */ - query?: FilterPredicate; -``` - -`FilterPredicate` is already imported at the top of this file. - -**Step 2: Run type checker** - -Run: `yarn tsc` in project root. -Expected: Should pass. - -**Step 3: Commit** - -``` -feat(catalog): add query predicate to GetEntityFacetsRequest -``` - ---- - -### Task 8: Client implementation — route to POST when `query` is present - -**Files:** - -- Modify: `packages/catalog-client/src/CatalogClient.ts:478-491` - -**Step 1: Update `getEntityFacets` to route to POST when `query` is present** - -Replace the current `getEntityFacets` method (lines 478-491) with: - -```typescript - async getEntityFacets( - request: GetEntityFacetsRequest, - options?: CatalogRequestOptions, - ): Promise { - const { filter, query, facets } = request; - - // Route to POST endpoint if query predicate is provided - if (query || filter) { - return this.getEntityFacetsByPredicate(request, options); - } - - return await this.requestOptional( - await this.apiClient.getEntityFacets( - { - query: { facet: facets }, - }, - options, - ), - ); - } -``` - -**Step 2: Add the private `getEntityFacetsByPredicate` method** - -Add after `getEntityFacets`: - -```typescript - /** - * Get entity facets using predicate-based filters (POST endpoint). - * @internal - */ - private async getEntityFacetsByPredicate( - request: GetEntityFacetsRequest, - options?: CatalogRequestOptions, - ): Promise { - const { filter, query, facets } = request; - - let filterPredicate: FilterPredicate | undefined; - if (query !== undefined) { - if ( - typeof query !== 'object' || - query === null || - Array.isArray(query) - ) { - throw new InputError('Query must be an object'); - } - filterPredicate = query; - } - if (filter !== undefined) { - const converted = convertFilterToPredicate(filter); - filterPredicate = filterPredicate - ? { $all: [filterPredicate, converted] } - : converted; - } - - return await this.requestOptional( - await this.apiClient.queryEntityFacetsByPredicate( - { - body: { - facets, - ...(filterPredicate && { - query: filterPredicate as unknown as { [key: string]: any }, - }), - }, - }, - options, - ), - ); - } -``` - -Make sure `InputError` is imported from `@backstage/errors` and `convertFilterToPredicate` is imported from `./utils` (check existing imports — `convertFilterToPredicate` is already used by `queryEntitiesByPredicate`). - -**Step 3: Run type checker** - -Run: `yarn tsc` in project root. -Expected: Should pass. - -**Step 4: Run existing client tests** - -Run: `CI=1 yarn --cwd packages/catalog-client test` -Expected: All tests pass. - -**Step 5: Commit** - -``` -feat(catalog): route facets requests to POST when query is present -``` - ---- - -### Task 9: Generate API reports and create changesets - -**Files:** - -- Create: `.changeset/.md` (two changesets) - -**Step 1: Run API reports** - -Run: `yarn build:api-reports` in project root. - -**Step 2: Create changeset for catalog-backend** - -Create `.changeset/facets-predicate-backend.md`: - -```markdown ---- -'@backstage/plugin-catalog-backend': minor ---- - -Added support for predicate-based filtering on the `/entity-facets` endpoint via a new `POST` method. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. -``` - -**Step 3: Create changeset for catalog-client** - -Create `.changeset/facets-predicate-client.md`: - -```markdown ---- -'@backstage/catalog-client': minor ---- - -Added support for the `query` field in `getEntityFacets` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. -``` - -**Step 4: Commit changesets and API reports** - -``` -chore: add changesets and API reports for facets predicate support -``` - ---- - -### Task 10: Final verification - -**Step 1: Run type checker** - -Run: `yarn tsc` in project root. -Expected: Should pass. - -**Step 2: Run backend tests** - -Run: `CI=1 yarn --cwd plugins/catalog-backend test` -Expected: All tests pass. - -**Step 3: Run client tests** - -Run: `CI=1 yarn --cwd packages/catalog-client test` -Expected: All tests pass. - -**Step 4: Run linter** - -Run: `yarn lint --fix` in project root. -Expected: Should pass. From afabb37104c358ad8799a83c3f2d960b58a1012e Mon Sep 17 00:00:00 2001 From: thomvaill Date: Thu, 26 Feb 2026 16:50:57 +0100 Subject: [PATCH 277/455] fix(devtools): urlencode task IDs when calling trigger route Signed-off-by: thomvaill --- .changeset/cold-dodos-think.md | 5 ++ .../devtools/src/api/DevToolsClient.test.ts | 49 +++++++++++++++++++ plugins/devtools/src/api/DevToolsClient.ts | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .changeset/cold-dodos-think.md create mode 100644 plugins/devtools/src/api/DevToolsClient.test.ts diff --git a/.changeset/cold-dodos-think.md b/.changeset/cold-dodos-think.md new file mode 100644 index 0000000000..021e5f679e --- /dev/null +++ b/.changeset/cold-dodos-think.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-devtools': patch +--- + +Fixed URL encoding of task IDs for the trigger feature (tasks that contained a "/" in their ID were not triggered) diff --git a/plugins/devtools/src/api/DevToolsClient.test.ts b/plugins/devtools/src/api/DevToolsClient.test.ts new file mode 100644 index 0000000000..d1972cd528 --- /dev/null +++ b/plugins/devtools/src/api/DevToolsClient.test.ts @@ -0,0 +1,49 @@ +/* + * Copyright 2026 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DevToolsClient } from './DevToolsClient'; + +describe('DevToolsClient', () => { + const mockBaseUrl = 'http://backstage/api/catalog'; + const discoveryApi = { + getBaseUrl: async (pluginId: string) => `${mockBaseUrl}/${pluginId}`, + }; + const mockFetch = jest.fn(); + const fetchApi = { fetch: mockFetch }; + + let client: DevToolsClient; + beforeEach(() => { + mockFetch.mockResolvedValue({ + ok: true, + json: async () => ({ status: 'triggered' }), + }); + client = new DevToolsClient({ discoveryApi, fetchApi }); + }); + + afterEach(() => jest.resetAllMocks()); + + it('should URL-encode the taskId when triggering a scheduled task', async () => { + await client.triggerScheduledTask( + 'my-plugin', + 'task/with/slashes:and-special-chars', + ); + + expect(mockFetch).toHaveBeenCalledWith( + `${mockBaseUrl}/my-plugin/.backstage/scheduler/v1/tasks/task%2Fwith%2Fslashes%3Aand-special-chars/trigger`, + { method: 'POST' }, + ); + }); +}); diff --git a/plugins/devtools/src/api/DevToolsClient.ts b/plugins/devtools/src/api/DevToolsClient.ts index cd4f53fa81..0577757838 100644 --- a/plugins/devtools/src/api/DevToolsClient.ts +++ b/plugins/devtools/src/api/DevToolsClient.ts @@ -70,7 +70,7 @@ export class DevToolsClient implements DevToolsApi { ): Promise { const baseUrl = `${await this.discoveryApi.getBaseUrl(plugin)}/`; const url = new URL( - `.backstage/scheduler/v1/tasks/${taskId}/trigger`, + `.backstage/scheduler/v1/tasks/${encodeURIComponent(taskId)}/trigger`, baseUrl, ); From 4c4632ce1be7bb18d28ec09d9ff765b999a12221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 17:13:01 +0100 Subject: [PATCH 278/455] test(catalog): add GET /entity-facets backward compatibility test with filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- .../src/service/createRouter.test.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 6d2b8ca70a..ccdd034cae 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -1203,6 +1203,26 @@ describe('createRouter readonly disabled', () => { facets: { kind: [{ value: 'Component', count: 5 }] }, }); }); + + it('returns facets with filter parameter', async () => { + entitiesCatalog.facets.mockResolvedValue({ + facets: { 'spec.type': [{ value: 'service', count: 3 }] }, + }); + + const response = await request(app).get( + '/entity-facets?facet=spec.type&filter=kind=Component', + ); + expect(response.status).toBe(200); + expect(response.body).toEqual({ + facets: { 'spec.type': [{ value: 'service', count: 3 }] }, + }); + expect(entitiesCatalog.facets).toHaveBeenCalledWith( + expect.objectContaining({ + facets: ['spec.type'], + filter: { key: 'kind', values: ['Component'] }, + }), + ); + }); }); describe('POST /entity-facets', () => { From 105befbbf0e31cee01cf82461a672c13efa9799e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 17:13:47 +0100 Subject: [PATCH 279/455] fix(catalog): only route facets to POST when query predicate is present MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Preserve backward compatibility by keeping filter-only requests on the existing GET endpoint. Only route to POST when query is present, matching the pattern used by queryEntities. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/CatalogClient.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index cef743e5c6..0d173022a3 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -479,17 +479,17 @@ export class CatalogClient implements CatalogApi { request: GetEntityFacetsRequest, options?: CatalogRequestOptions, ): Promise { - const { filter, query, facets } = request; + const { filter = [], query, facets } = request; // Route to POST endpoint if query predicate is provided - if (query || filter) { + if (query) { return this.getEntityFacetsByPredicate(request, options); } return await this.requestOptional( await this.apiClient.getEntityFacets( { - query: { facet: facets }, + query: { facet: facets, filter: this.getFilterValue(filter) }, }, options, ), From 004b5c120897bf7deef5088f0aa7e95113a0feed Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 18:06:57 +0100 Subject: [PATCH 280/455] Move formFieldsApiRef and ScaffolderFormFieldsApi to scaffolder-react The formFieldsApiRef and ScaffolderFormFieldsApi type are now defined and exported from @backstage/plugin-scaffolder-react/alpha, and re-exported from @backstage/plugin-scaffolder/alpha for backwards compatibility. Signed-off-by: Patrik Oldsberg --- .changeset/fix-form-fields-api-export-react.md | 5 +++++ .../fix-form-fields-api-export-scaffolder.md | 5 +++++ plugins/scaffolder-react/report-alpha.api.md | 10 ++++++++++ plugins/scaffolder-react/src/next/api/index.ts | 10 +++++++++- plugins/scaffolder-react/src/next/api/types.ts | 5 +++++ plugins/scaffolder/report-alpha.api.md | 11 ++++------- plugins/scaffolder/src/alpha/extensions.tsx | 6 ++++-- plugins/scaffolder/src/alpha/formFieldsApi.ts | 18 +++++------------- 8 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 .changeset/fix-form-fields-api-export-react.md create mode 100644 .changeset/fix-form-fields-api-export-scaffolder.md diff --git a/.changeset/fix-form-fields-api-export-react.md b/.changeset/fix-form-fields-api-export-react.md new file mode 100644 index 0000000000..ff6d260e0f --- /dev/null +++ b/.changeset/fix-form-fields-api-export-react.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': minor +--- + +Added `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. diff --git a/.changeset/fix-form-fields-api-export-scaffolder.md b/.changeset/fix-form-fields-api-export-scaffolder.md new file mode 100644 index 0000000000..8ad31c5593 --- /dev/null +++ b/.changeset/fix-form-fields-api-export-scaffolder.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +The `formFieldsApiRef` and `ScaffolderFormFieldsApi` alpha exports are now re-exported from `@backstage/plugin-scaffolder-react`. diff --git a/plugins/scaffolder-react/report-alpha.api.md b/plugins/scaffolder-react/report-alpha.api.md index 1b6fb99838..c546f265be 100644 --- a/plugins/scaffolder-react/report-alpha.api.md +++ b/plugins/scaffolder-react/report-alpha.api.md @@ -5,6 +5,7 @@ ```ts import { AnyApiRef } from '@backstage/core-plugin-api'; import { ApiHolder } from '@backstage/core-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { ComponentType } from 'react'; import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; import { CustomFieldValidator } from '@backstage/plugin-scaffolder-react'; @@ -198,6 +199,9 @@ export type FormFieldExtensionData< schema?: FieldSchema, z.output>; }; +// @alpha (undocumented) +export const formFieldsApiRef: ApiRef; + // @alpha (undocumented) export type FormValidation = { [name: string]: FieldValidation | FormValidation; @@ -272,6 +276,12 @@ export type ScaffolderFormDecoratorContext< ) => void; }; +// @alpha (undocumented) +export interface ScaffolderFormFieldsApi { + // (undocumented) + loadFormFields(): Promise; +} + // @alpha (undocumented) export function ScaffolderPageContextMenu( props: ScaffolderPageContextMenuProps, diff --git a/plugins/scaffolder-react/src/next/api/index.ts b/plugins/scaffolder-react/src/next/api/index.ts index 9988f4dd82..1ecddeaf41 100644 --- a/plugins/scaffolder-react/src/next/api/index.ts +++ b/plugins/scaffolder-react/src/next/api/index.ts @@ -14,4 +14,12 @@ * limitations under the License. */ -export { type FormField } from './types'; +import { createApiRef } from '@backstage/frontend-plugin-api'; +import { ScaffolderFormFieldsApi } from './types'; + +export { type FormField, type ScaffolderFormFieldsApi } from './types'; + +/** @alpha */ +export const formFieldsApiRef = createApiRef({ + id: 'plugin.scaffolder.form-fields-loader', +}); diff --git a/plugins/scaffolder-react/src/next/api/types.ts b/plugins/scaffolder-react/src/next/api/types.ts index 38929ee189..e3ab855708 100644 --- a/plugins/scaffolder-react/src/next/api/types.ts +++ b/plugins/scaffolder-react/src/next/api/types.ts @@ -18,3 +18,8 @@ export interface FormField { readonly $$type: '@backstage/scaffolder/FormField'; } + +/** @alpha */ +export interface ScaffolderFormFieldsApi { + loadFormFields(): Promise; +} diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index e553e706da..9baa74407f 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -17,6 +17,7 @@ import { ExternalRouteRef } from '@backstage/core-plugin-api'; import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { FilterPredicate } from '@backstage/filter-predicates'; import { FormField } from '@backstage/plugin-scaffolder-react/alpha'; +import { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha'; import type { FormProps as FormProps_2 } from '@rjsf/core'; import { FormProps as FormProps_3 } from '@backstage/plugin-scaffolder-react'; import { IconComponent } from '@backstage/frontend-plugin-api'; @@ -31,6 +32,7 @@ import { ReviewStepProps } from '@backstage/plugin-scaffolder-react'; import { RouteRef } from '@backstage/core-plugin-api'; import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; +import { ScaffolderFormFieldsApi } from '@backstage/plugin-scaffolder-react/alpha'; import { SubRouteRef } from '@backstage/core-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react'; @@ -480,8 +482,7 @@ export const formDecoratorsApi: OverridableExtensionDefinition<{ // @alpha (undocumented) export const formDecoratorsApiRef: ApiRef; -// @alpha (undocumented) -export const formFieldsApiRef: ApiRef; +export { formFieldsApiRef }; // @alpha @deprecated export type FormProps = Pick< @@ -502,11 +503,7 @@ export interface ScaffolderFormDecoratorsApi { getFormDecorators(): Promise; } -// @alpha (undocumented) -export interface ScaffolderFormFieldsApi { - // (undocumented) - loadFormFields(): Promise; -} +export { ScaffolderFormFieldsApi }; // @public (undocumented) export type ScaffolderTemplateEditorClassKey = diff --git a/plugins/scaffolder/src/alpha/extensions.tsx b/plugins/scaffolder/src/alpha/extensions.tsx index 8c17f8cc1c..91306bf5fd 100644 --- a/plugins/scaffolder/src/alpha/extensions.tsx +++ b/plugins/scaffolder/src/alpha/extensions.tsx @@ -25,11 +25,13 @@ import { } from '@backstage/frontend-plugin-api'; import { rootRouteRef } from '../routes'; import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; -import { FormFieldBlueprint } from '@backstage/plugin-scaffolder-react/alpha'; +import { + FormFieldBlueprint, + formFieldsApiRef, +} from '@backstage/plugin-scaffolder-react/alpha'; import { scmIntegrationsApiRef } from '@backstage/integration-react'; import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react'; import { ScaffolderClient } from '../api'; -import { formFieldsApiRef } from './formFieldsApi'; export const scaffolderPage = PageBlueprint.makeWithOverrides({ inputs: { diff --git a/plugins/scaffolder/src/alpha/formFieldsApi.ts b/plugins/scaffolder/src/alpha/formFieldsApi.ts index bcc2190f7e..b065af9a82 100644 --- a/plugins/scaffolder/src/alpha/formFieldsApi.ts +++ b/plugins/scaffolder/src/alpha/formFieldsApi.ts @@ -16,25 +16,14 @@ import { ApiBlueprint, - createApiRef, createExtensionInput, } from '@backstage/frontend-plugin-api'; import { FormFieldBlueprint, - type FormField, + formFieldsApiRef, } from '@backstage/plugin-scaffolder-react/alpha'; import { OpaqueFormField } from '@internal/scaffolder'; -/** @alpha */ -export interface ScaffolderFormFieldsApi { - loadFormFields(): Promise; -} - -/** @alpha */ -const formFieldsApiRef = createApiRef({ - id: 'plugin.scaffolder.form-fields-loader', -}); - export const formFieldsApi = ApiBlueprint.makeWithOverrides({ name: 'form-fields', inputs: { @@ -69,4 +58,7 @@ export const formFieldsApi = ApiBlueprint.makeWithOverrides({ }, }); -export { formFieldsApiRef }; +export { + formFieldsApiRef, + type ScaffolderFormFieldsApi, +} from '@backstage/plugin-scaffolder-react/alpha'; From 33cc7b218ea168cb4ba02c608f71125ba3588796 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 18:15:08 +0100 Subject: [PATCH 281/455] Address review feedback on changesets Signed-off-by: Patrik Oldsberg --- .changeset/fix-form-fields-api-export-react.md | 5 +++-- .changeset/fix-form-fields-api-export-scaffolder.md | 5 ----- 2 files changed, 3 insertions(+), 7 deletions(-) delete mode 100644 .changeset/fix-form-fields-api-export-scaffolder.md diff --git a/.changeset/fix-form-fields-api-export-react.md b/.changeset/fix-form-fields-api-export-react.md index ff6d260e0f..82e00c8351 100644 --- a/.changeset/fix-form-fields-api-export-react.md +++ b/.changeset/fix-form-fields-api-export-react.md @@ -1,5 +1,6 @@ --- -'@backstage/plugin-scaffolder-react': minor +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch --- -Added `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. +Added back `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. diff --git a/.changeset/fix-form-fields-api-export-scaffolder.md b/.changeset/fix-form-fields-api-export-scaffolder.md deleted file mode 100644 index 8ad31c5593..0000000000 --- a/.changeset/fix-form-fields-api-export-scaffolder.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -The `formFieldsApiRef` and `ScaffolderFormFieldsApi` alpha exports are now re-exported from `@backstage/plugin-scaffolder-react`. From 743e4e3a1b42dbb407dd672141d1e472d76dd675 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 18:31:18 +0100 Subject: [PATCH 282/455] Remove scaffolder changeset, note API signature change Signed-off-by: Patrik Oldsberg --- .changeset/fix-form-fields-api-export-react.md | 3 +-- .changeset/scaffolder-export-form-fields-api.md | 5 ----- 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 .changeset/scaffolder-export-form-fields-api.md diff --git a/.changeset/fix-form-fields-api-export-react.md b/.changeset/fix-form-fields-api-export-react.md index 82e00c8351..9ea6ec4930 100644 --- a/.changeset/fix-form-fields-api-export-react.md +++ b/.changeset/fix-form-fields-api-export-react.md @@ -1,6 +1,5 @@ --- '@backstage/plugin-scaffolder-react': patch -'@backstage/plugin-scaffolder': patch --- -Added back `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. +Added back `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. The API signature of `@backstage/plugin-scaffolder` changed as these are now re-exported from `@backstage/plugin-scaffolder-react`. diff --git a/.changeset/scaffolder-export-form-fields-api.md b/.changeset/scaffolder-export-form-fields-api.md deleted file mode 100644 index 02ead2d2b2..0000000000 --- a/.changeset/scaffolder-export-form-fields-api.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Added back the `formFieldsApiRef` and `ScaffolderFormFieldsApi` alpha exports that were unintentionally removed. From 4a9b1891255404a493322ff3619057760d4bcbbc Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 18:31:50 +0100 Subject: [PATCH 283/455] Add .patches entry for patch release Signed-off-by: Patrik Oldsberg --- .patches/pr-33034.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .patches/pr-33034.txt diff --git a/.patches/pr-33034.txt b/.patches/pr-33034.txt new file mode 100644 index 0000000000..ab8beea429 --- /dev/null +++ b/.patches/pr-33034.txt @@ -0,0 +1 @@ +Moves `formFieldsApiRef` and `ScaffolderFormFieldsApi` alpha exports to `@backstage/plugin-scaffolder-react`. The API signature of `@backstage/plugin-scaffolder` changed as these are now re-exported from `@backstage/plugin-scaffolder-react`. \ No newline at end of file From 6b70a2abcf8ced8b6d5dbe0bfcf7d2d68cdf6934 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 19:09:44 +0100 Subject: [PATCH 284/455] Apply suggestions from code review Signed-off-by: Patrik Oldsberg --- .changeset/fix-form-fields-api-export-react.md | 2 +- .patches/pr-33034.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/fix-form-fields-api-export-react.md b/.changeset/fix-form-fields-api-export-react.md index 9ea6ec4930..787131280a 100644 --- a/.changeset/fix-form-fields-api-export-react.md +++ b/.changeset/fix-form-fields-api-export-react.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder-react': patch --- -Added back `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. The API signature of `@backstage/plugin-scaffolder` changed as these are now re-exported from `@backstage/plugin-scaffolder-react`. +Added back `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. diff --git a/.patches/pr-33034.txt b/.patches/pr-33034.txt index ab8beea429..4648da00b2 100644 --- a/.patches/pr-33034.txt +++ b/.patches/pr-33034.txt @@ -1 +1 @@ -Moves `formFieldsApiRef` and `ScaffolderFormFieldsApi` alpha exports to `@backstage/plugin-scaffolder-react`. The API signature of `@backstage/plugin-scaffolder` changed as these are now re-exported from `@backstage/plugin-scaffolder-react`. \ No newline at end of file +Added back `formFieldsApiRef` and `ScaffolderFormFieldsApi` alpha exports to `@backstage/plugin-scaffolder-react`. This change was incorrectly applied to `@backstage/plugin-scaffolder` in the 1.48.2 release, which is now gone. Note that the API signature of this API has still changed since the 1.47 release. \ No newline at end of file From 0d2d0f2e07ac4096e37793a95018a26976145128 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 19:27:34 +0100 Subject: [PATCH 285/455] Add lazy loader pattern for CLI command execution Extend `BackstageCommand.execute` to accept either a direct function or a `{ loader }` object for lazy loading command implementations. Convert several build and migrate commands to use the new pattern. Switch from `program.parse` to `program.parseAsync` to properly await async actions. Signed-off-by: Patrik Oldsberg --- .changeset/cli-execute-loader.md | 5 ++ packages/cli/package.json | 1 + .../src/modules/build/commands/repo/clean.ts | 2 +- packages/cli/src/modules/build/index.ts | 38 +++----- .../cli/src/modules/config/commands/docs.ts | 24 ++++- .../cli/src/modules/config/commands/print.ts | 55 +++++++++--- .../cli/src/modules/config/commands/schema.ts | 29 ++++-- .../src/modules/config/commands/validate.ts | 47 ++++++++-- packages/cli/src/modules/config/index.ts | 90 ++----------------- .../cli/src/modules/info/commands/info.ts | 33 +++++-- packages/cli/src/modules/info/index.ts | 24 +---- .../migrate/commands/packageExports.ts | 2 +- .../migrate/commands/packageLintConfigs.ts | 2 +- .../migrate/commands/packageScripts.ts | 2 +- .../migrate/commands/reactRouterDeps.ts | 2 +- packages/cli/src/modules/migrate/index.ts | 45 +++------- .../modules/translations/commands/export.ts | 33 +++++-- .../modules/translations/commands/import.ts | 33 +++++-- .../cli/src/modules/translations/index.ts | 44 +-------- .../cli/src/wiring/CliInitializer.test.ts | 25 ++++++ packages/cli/src/wiring/CliInitializer.ts | 18 +++- packages/cli/src/wiring/types.ts | 34 ++++--- packages/eslint-plugin/package.json | 3 + yarn.lock | 25 ++++++ 24 files changed, 338 insertions(+), 278 deletions(-) create mode 100644 .changeset/cli-execute-loader.md diff --git a/.changeset/cli-execute-loader.md b/.changeset/cli-execute-loader.md new file mode 100644 index 0000000000..4636468864 --- /dev/null +++ b/.changeset/cli-execute-loader.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Added support for lazy loading of CLI command implementations through a new loader pattern for `BackstageCommand.execute`. diff --git a/packages/cli/package.json b/packages/cli/package.json index 9a4e690e92..17d2189beb 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -81,6 +81,7 @@ "buffer": "^6.0.3", "chalk": "^4.0.0", "chokidar": "^3.3.1", + "cleye": "^2.2.1", "commander": "^14.0.3", "cross-fetch": "^4.0.0", "cross-spawn": "^7.0.3", diff --git a/packages/cli/src/modules/build/commands/repo/clean.ts b/packages/cli/src/modules/build/commands/repo/clean.ts index 28b123fa9e..a3c6e9cbbd 100644 --- a/packages/cli/src/modules/build/commands/repo/clean.ts +++ b/packages/cli/src/modules/build/commands/repo/clean.ts @@ -20,7 +20,7 @@ import { PackageGraph } from '@backstage/cli-node'; import { run, targetPaths } from '@backstage/cli-common'; -export async function command(): Promise { +export default async function command(): Promise { const packages = await PackageGraph.listTargetPackages(); await fs.remove(targetPaths.resolveRoot('dist')); diff --git a/packages/cli/src/modules/build/index.ts b/packages/cli/src/modules/build/index.ts index 30a9b3a19e..7a116f5d8a 100644 --- a/packages/cli/src/modules/build/index.ts +++ b/packages/cli/src/modules/build/index.ts @@ -206,52 +206,34 @@ export const buildPlugin = createCliPlugin({ reg.addCommand({ path: ['package', 'clean'], description: 'Delete cache directories', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/package/clean'), 'default'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: { + loader: () => import('./commands/package/clean'), }, }); reg.addCommand({ path: ['package', 'prepack'], description: 'Prepares a package for packaging before publishing', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/package/pack'), 'pre'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: async () => { + const { pre } = await import('./commands/package/pack'); + await pre(); }, }); reg.addCommand({ path: ['package', 'postpack'], description: 'Restores the changes made by the prepack command', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/package/pack'), 'post'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: async () => { + const { post } = await import('./commands/package/pack'); + await post(); }, }); reg.addCommand({ path: ['repo', 'clean'], description: 'Delete cache and output directories', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/repo/clean'), 'command'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: { + loader: () => import('./commands/repo/clean'), }, }); diff --git a/packages/cli/src/modules/config/commands/docs.ts b/packages/cli/src/modules/config/commands/docs.ts index e7d3ac13ee..ed949c695f 100644 --- a/packages/cli/src/modules/config/commands/docs.ts +++ b/packages/cli/src/modules/config/commands/docs.ts @@ -14,20 +14,38 @@ * limitations under the License. */ +import { cli } from 'cleye'; import { JsonObject } from '@backstage/types'; import { mergeConfigSchemas } from '@backstage/config-loader'; -import { OptionValues } from 'commander'; import { JSONSchema7 as JSONSchema } from 'json-schema'; import openBrowser from 'react-dev-utils/openBrowser'; import chalk from 'chalk'; import { loadCliConfig } from '../lib/config'; +import type { CommandContext } from '../../../wiring/types'; const DOCS_URL = 'https://config.backstage.io'; -export default async (opts: OptionValues) => { +export default async ({ args, info }: CommandContext) => { + const { + flags: { package: pkg }, + } = cli( + { + help: info, + flags: { + package: { + type: String, + description: + 'Only include the schema that applies to the given package', + }, + }, + }, + undefined, + args, + ); + const { schema: appSchemas } = await loadCliConfig({ args: [], - fromPackage: opts.package, + fromPackage: pkg, mockEnv: true, }); diff --git a/packages/cli/src/modules/config/commands/print.ts b/packages/cli/src/modules/config/commands/print.ts index 98833a7946..412fdd69ff 100644 --- a/packages/cli/src/modules/config/commands/print.ts +++ b/packages/cli/src/modules/config/commands/print.ts @@ -14,36 +14,67 @@ * limitations under the License. */ -import { OptionValues } from 'commander'; +import { cli } from 'cleye'; import { stringify as stringifyYaml } from 'yaml'; import { AppConfig, ConfigReader } from '@backstage/config'; import { loadCliConfig } from '../lib/config'; import { ConfigSchema, ConfigVisibility } from '@backstage/config-loader'; +import type { CommandContext } from '../../../wiring/types'; + +export default async ({ args, info }: CommandContext) => { + const { + flags: { config, lax, frontend, withSecrets, format, package: pkg }, + } = cli( + { + help: info, + flags: { + package: { type: String, description: 'Package to print config for' }, + lax: { + type: Boolean, + description: 'Do not require environment variables to be set', + }, + frontend: { type: Boolean, description: 'Only print frontend config' }, + withSecrets: { + type: Boolean, + description: 'Include secrets in the output', + }, + format: { type: String, description: 'Output format (yaml or json)' }, + config: { + type: [String], + description: 'Config files to load instead of app-config.yaml', + }, + }, + }, + undefined, + args, + ); -export default async (opts: OptionValues) => { const { schema, appConfigs } = await loadCliConfig({ - args: opts.config, - fromPackage: opts.package, - mockEnv: opts.lax, - fullVisibility: !opts.frontend, + args: config, + fromPackage: pkg, + mockEnv: lax, + fullVisibility: !frontend, }); - const visibility = getVisibilityOption(opts); + const visibility = getVisibilityOption(frontend, withSecrets); const data = serializeConfigData(appConfigs, schema, visibility); - if (opts.format === 'json') { + if (format === 'json') { process.stdout.write(`${JSON.stringify(data, null, 2)}\n`); } else { process.stdout.write(`${stringifyYaml(data)}\n`); } }; -function getVisibilityOption(opts: OptionValues): ConfigVisibility { - if (opts.frontend && opts.withSecrets) { +function getVisibilityOption( + frontend: boolean | undefined, + withSecrets: boolean | undefined, +): ConfigVisibility { + if (frontend && withSecrets) { throw new Error('Not allowed to combine frontend and secret config'); } - if (opts.frontend) { + if (frontend) { return 'frontend'; - } else if (opts.withSecrets) { + } else if (withSecrets) { return 'secret'; } return 'backend'; diff --git a/packages/cli/src/modules/config/commands/schema.ts b/packages/cli/src/modules/config/commands/schema.ts index 73eb487d60..b41264e4b7 100644 --- a/packages/cli/src/modules/config/commands/schema.ts +++ b/packages/cli/src/modules/config/commands/schema.ts @@ -14,22 +14,41 @@ * limitations under the License. */ -import { OptionValues } from 'commander'; +import { cli } from 'cleye'; import { JSONSchema7 as JSONSchema } from 'json-schema'; import { stringify as stringifyYaml } from 'yaml'; import { loadCliConfig } from '../lib/config'; import { JsonObject } from '@backstage/types'; import { mergeConfigSchemas } from '@backstage/config-loader'; +import type { CommandContext } from '../../../wiring/types'; + +export default async ({ args, info }: CommandContext) => { + const { + flags: { merge, format, package: pkg }, + } = cli( + { + help: info, + flags: { + package: { type: String, description: 'Package to print schema for' }, + format: { type: String, description: 'Output format (yaml or json)' }, + merge: { + type: Boolean, + description: 'Merge all schemas into a single schema', + }, + }, + }, + undefined, + args, + ); -export default async (opts: OptionValues) => { const { schema } = await loadCliConfig({ args: [], - fromPackage: opts.package, + fromPackage: pkg, mockEnv: true, }); let configSchema: JsonObject | JSONSchema; - if (opts.merge) { + if (merge) { configSchema = mergeConfigSchemas( (schema.serialize().schemas as JsonObject[]).map( _ => _.value as JSONSchema, @@ -42,7 +61,7 @@ export default async (opts: OptionValues) => { configSchema = schema.serialize(); } - if (opts.format === 'json') { + if (format === 'json') { process.stdout.write(`${JSON.stringify(configSchema, null, 2)}\n`); } else { process.stdout.write(`${stringifyYaml(configSchema)}\n`); diff --git a/packages/cli/src/modules/config/commands/validate.ts b/packages/cli/src/modules/config/commands/validate.ts index ac0b9d15e0..abbbd7a176 100644 --- a/packages/cli/src/modules/config/commands/validate.ts +++ b/packages/cli/src/modules/config/commands/validate.ts @@ -14,16 +14,47 @@ * limitations under the License. */ -import { OptionValues } from 'commander'; +import { cli } from 'cleye'; import { loadCliConfig } from '../lib/config'; +import type { CommandContext } from '../../../wiring/types'; + +export default async ({ args, info }: CommandContext) => { + const { + flags: { config, lax, frontend, deprecated, strict, package: pkg }, + } = cli( + { + help: info, + flags: { + package: { + type: String, + description: 'Package to validate config for', + }, + lax: { + type: Boolean, + description: 'Do not require environment variables to be set', + }, + frontend: { + type: Boolean, + description: 'Only validate frontend config', + }, + deprecated: { type: Boolean, description: 'Output deprecated keys' }, + strict: { type: Boolean, description: 'Enable strict validation' }, + config: { + type: [String], + description: 'Config files to load instead of app-config.yaml', + }, + }, + }, + undefined, + args, + ); -export default async (opts: OptionValues) => { await loadCliConfig({ - args: opts.config, - fromPackage: opts.package, - mockEnv: opts.lax, - fullVisibility: !opts.frontend, - withDeprecatedKeys: opts.deprecated, - strict: opts.strict, + args: config, + fromPackage: pkg, + mockEnv: lax, + fullVisibility: !frontend, + withDeprecatedKeys: deprecated, + strict, }); }; diff --git a/packages/cli/src/modules/config/index.ts b/packages/cli/src/modules/config/index.ts index 234e62fde0..0d90037f18 100644 --- a/packages/cli/src/modules/config/index.ts +++ b/packages/cli/src/modules/config/index.ts @@ -14,9 +14,6 @@ * limitations under the License. */ import { createCliPlugin } from '../../wiring/factory'; -import yargs from 'yargs'; -import { Command } from 'commander'; -import { lazy } from '../../wiring/lazy'; export const configOption = [ '--config ', @@ -31,108 +28,33 @@ export default createCliPlugin({ reg.addCommand({ path: ['config:docs'], description: 'Browse the configuration reference documentation', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command - .option( - '--package ', - 'Only include the schema that applies to the given package', - ) - .description('Browse the configuration reference documentation') - .action(lazy(() => import('./commands/docs'), 'default')); - - await defaultCommand.parseAsync(args, { from: 'user' }); - }, + execute: { loader: () => import('./commands/docs') }, }); reg.addCommand({ path: ['config', 'docs'], description: 'Browse the configuration reference documentation', - execute: async ({ args, info }) => { - await new Command(info.usage) - .option( - '--package ', - 'Only include the schema that applies to the given package', - ) - .description(info.description) - .action(lazy(() => import('./commands/docs'), 'default')) - .parseAsync(args, { from: 'user' }); - }, + execute: { loader: () => import('./commands/docs') }, }); reg.addCommand({ path: ['config:print'], description: 'Print the app configuration for the current package', - execute: async ({ args, info }) => { - const argv = await yargs() - .options({ - package: { type: 'string' }, - lax: { type: 'boolean' }, - frontend: { type: 'boolean' }, - 'with-secrets': { type: 'boolean' }, - format: { type: 'string' }, - config: { type: 'string', array: true, default: [] }, - }) - .usage('$0', info.description) - .help() - .parse(args); - await lazy(() => import('./commands/print'), 'default')(argv); - }, + execute: { loader: () => import('./commands/print') }, }); reg.addCommand({ path: ['config:check'], description: 'Validate that the given configuration loads and matches schema', - execute: async ({ args }) => { - const argv = await yargs() - .options({ - package: { type: 'string' }, - lax: { type: 'boolean' }, - frontend: { type: 'boolean' }, - deprecated: { type: 'boolean' }, - strict: { type: 'boolean' }, - config: { - type: 'string', - array: true, - default: [], - }, - }) - .help() - .parse(args); - await lazy(() => import('./commands/validate'), 'default')(argv); - }, + execute: { loader: () => import('./commands/validate') }, }); - reg.addCommand({ path: ['config:schema'], description: 'Print the JSON schema for the given configuration', - execute: async ({ args }) => { - const argv = await yargs() - .options({ - package: { type: 'string' }, - format: { type: 'string' }, - merge: { type: 'boolean' }, - 'no-merge': { type: 'boolean' }, - }) - .help() - .parse(args); - await lazy(() => import('./commands/schema'), 'default')(argv); - }, + execute: { loader: () => import('./commands/schema') }, }); - reg.addCommand({ path: ['config', 'schema'], description: 'Print the JSON schema for the given configuration', - execute: async ({ args }) => { - const argv = await yargs() - .options({ - package: { type: 'string' }, - format: { type: 'string' }, - merge: { type: 'boolean' }, - 'no-merge': { type: 'boolean' }, - }) - .help() - .parse(args); - await lazy(() => import('./commands/schema'), 'default')(argv); - }, + execute: { loader: () => import('./commands/schema') }, }); }, }); diff --git a/packages/cli/src/modules/info/commands/info.ts b/packages/cli/src/modules/info/commands/info.ts index c6732e2af1..c423d2b1dc 100644 --- a/packages/cli/src/modules/info/commands/info.ts +++ b/packages/cli/src/modules/info/commands/info.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { cli } from 'cleye'; import { version as cliVersion } from '../../../../package.json'; import os from 'node:os'; import { runOutput, targetPaths, findOwnPaths } from '@backstage/cli-common'; @@ -24,11 +25,7 @@ import { } from '@backstage/cli-node'; import { minimatch } from 'minimatch'; import fs from 'fs-extra'; - -interface InfoOptions { - include: string[]; - format: 'text' | 'json'; -} +import type { CommandContext } from '../../../wiring/types'; /** * Attempts to read package.json from node_modules for a given package name. @@ -55,7 +52,31 @@ function hasBackstageField(packageName: string, targetPath: string): boolean { return pkg?.backstage !== undefined; } -export default async (options: InfoOptions) => { +export default async ({ args, info }: CommandContext) => { + const { + flags: { include, format }, + } = cli( + { + help: info, + flags: { + include: { + type: [String], + description: + 'Glob patterns for additional packages to include (e.g., @spotify/backstage*)', + }, + format: { + type: String, + description: 'Output format (text or json)', + default: 'text', + }, + }, + }, + undefined, + args, + ); + + const options = { include, format: format as 'text' | 'json' }; + await new Promise(async () => { const yarnVersion = await runOutput(['yarn', '--version']); /* eslint-disable-next-line no-restricted-syntax */ diff --git a/packages/cli/src/modules/info/index.ts b/packages/cli/src/modules/info/index.ts index 0919c2ce07..8e1fe9cbff 100644 --- a/packages/cli/src/modules/info/index.ts +++ b/packages/cli/src/modules/info/index.ts @@ -13,9 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import yargs from 'yargs'; import { createCliPlugin } from '../../wiring/factory'; -import { lazy } from '../../wiring/lazy'; export default createCliPlugin({ pluginId: 'info', @@ -23,27 +21,7 @@ export default createCliPlugin({ reg.addCommand({ path: ['info'], description: 'Show helpful information for debugging and reporting bugs', - execute: async ({ args }) => { - const argv = await yargs() - .options({ - include: { - type: 'string', - array: true, - default: [], - description: - 'Glob patterns for additional packages to include (e.g., @spotify/backstage*)', - }, - format: { - type: 'string', - choices: ['text', 'json'], - default: 'text', - description: 'Output format (text or json)', - }, - }) - .help() - .parse(args); - await lazy(() => import('./commands/info'), 'default')(argv); - }, + execute: { loader: () => import('./commands/info') }, }); }, }); diff --git a/packages/cli/src/modules/migrate/commands/packageExports.ts b/packages/cli/src/modules/migrate/commands/packageExports.ts index ea42638e58..581c334c6f 100644 --- a/packages/cli/src/modules/migrate/commands/packageExports.ts +++ b/packages/cli/src/modules/migrate/commands/packageExports.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -export async function command() { +export default async function command() { throw new Error( 'The `migrate package-exports` command has been removed, use `repo fix` instead.', ); diff --git a/packages/cli/src/modules/migrate/commands/packageLintConfigs.ts b/packages/cli/src/modules/migrate/commands/packageLintConfigs.ts index d6e6183b83..4df76a51ac 100644 --- a/packages/cli/src/modules/migrate/commands/packageLintConfigs.ts +++ b/packages/cli/src/modules/migrate/commands/packageLintConfigs.ts @@ -21,7 +21,7 @@ import { runOutput } from '@backstage/cli-common'; const PREFIX = `module.exports = require('@backstage/cli/config/eslint-factory')`; -export async function command() { +export default async function command() { const packages = await PackageGraph.listTargetPackages(); const oldConfigs = [ diff --git a/packages/cli/src/modules/migrate/commands/packageScripts.ts b/packages/cli/src/modules/migrate/commands/packageScripts.ts index 6c4e41c3ec..f875bf14fc 100644 --- a/packages/cli/src/modules/migrate/commands/packageScripts.ts +++ b/packages/cli/src/modules/migrate/commands/packageScripts.ts @@ -22,7 +22,7 @@ const configArgPattern = /--config[=\s][^\s$]+/; const noStartRoles: PackageRole[] = ['cli', 'common-library']; -export async function command() { +export default async function command() { const packages = await PackageGraph.listTargetPackages(); await Promise.all( diff --git a/packages/cli/src/modules/migrate/commands/reactRouterDeps.ts b/packages/cli/src/modules/migrate/commands/reactRouterDeps.ts index 3f187dd534..3c2cf46560 100644 --- a/packages/cli/src/modules/migrate/commands/reactRouterDeps.ts +++ b/packages/cli/src/modules/migrate/commands/reactRouterDeps.ts @@ -21,7 +21,7 @@ import { PackageGraph, PackageRoles } from '@backstage/cli-node'; const REACT_ROUTER_DEPS = ['react-router', 'react-router-dom']; const REACT_ROUTER_RANGE = '6.0.0-beta.0 || ^6.3.0'; -export async function command() { +export default async function command() { const packages = await PackageGraph.listTargetPackages(); await Promise.all( diff --git a/packages/cli/src/modules/migrate/index.ts b/packages/cli/src/modules/migrate/index.ts index d94d04ed8d..2dc4ed452d 100644 --- a/packages/cli/src/modules/migrate/index.ts +++ b/packages/cli/src/modules/migrate/index.ts @@ -68,39 +68,24 @@ export default createCliPlugin({ reg.addCommand({ path: ['migrate', 'package-roles'], description: `Add package role field to packages that don't have it`, - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/packageRole'), 'default'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: { + loader: () => import('./commands/packageRole'), }, }); reg.addCommand({ path: ['migrate', 'package-scripts'], description: 'Set package scripts according to each package role', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/packageScripts'), 'command'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: { + loader: () => import('./commands/packageScripts'), }, }); reg.addCommand({ path: ['migrate', 'package-exports'], description: 'Synchronize package subpath export definitions', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/packageExports'), 'command'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: { + loader: () => import('./commands/packageExports'), }, }); @@ -108,13 +93,8 @@ export default createCliPlugin({ path: ['migrate', 'package-lint-configs'], description: 'Migrates all packages to use @backstage/cli/config/eslint-factory', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/packageLintConfigs'), 'command'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: { + loader: () => import('./commands/packageLintConfigs'), }, }); @@ -122,13 +102,8 @@ export default createCliPlugin({ path: ['migrate', 'react-router-deps'], description: 'Migrates the react-router dependencies for all packages to be peer dependencies', - execute: async ({ args }) => { - const command = new Command(); - const defaultCommand = command.action( - lazy(() => import('./commands/reactRouterDeps'), 'command'), - ); - - await defaultCommand.parseAsync(args, { from: 'user' }); + execute: { + loader: () => import('./commands/reactRouterDeps'), }, }); }, diff --git a/packages/cli/src/modules/translations/commands/export.ts b/packages/cli/src/modules/translations/commands/export.ts index 0329b1241a..4ee5658489 100644 --- a/packages/cli/src/modules/translations/commands/export.ts +++ b/packages/cli/src/modules/translations/commands/export.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { cli } from 'cleye'; import { targetPaths } from '@backstage/cli-common'; import fs from 'fs-extra'; import { dirname, resolve as resolvePath } from 'node:path'; @@ -28,16 +29,38 @@ import { } from '../lib/extractTranslations'; import { DEFAULT_LANGUAGE, + DEFAULT_MESSAGE_PATTERN, formatMessagePath, validatePattern, } from '../lib/messageFilePath'; +import type { CommandContext } from '../../../wiring/types'; -interface ExportOptions { - output: string; - pattern: string; -} +export default async ({ args, info }: CommandContext) => { + const { + flags: { output, pattern }, + } = cli( + { + help: info, + flags: { + output: { + type: String, + default: 'translations', + description: 'Output directory for exported messages and manifest', + }, + pattern: { + type: String, + default: DEFAULT_MESSAGE_PATTERN, + description: + 'File path pattern for message files, with {id} and {lang} placeholders', + }, + }, + }, + undefined, + args, + ); + + const options = { output, pattern }; -export default async (options: ExportOptions) => { validatePattern(options.pattern); const targetPackageJson = await readTargetPackage( diff --git a/packages/cli/src/modules/translations/commands/import.ts b/packages/cli/src/modules/translations/commands/import.ts index c104275f46..67b600b495 100644 --- a/packages/cli/src/modules/translations/commands/import.ts +++ b/packages/cli/src/modules/translations/commands/import.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { cli } from 'cleye'; import { targetPaths } from '@backstage/cli-common'; import fs from 'fs-extra'; import { @@ -27,11 +28,7 @@ import { createMessagePathParser, formatMessagePath, } from '../lib/messageFilePath'; - -interface ImportOptions { - input: string; - output: string; -} +import type { CommandContext } from '../../../wiring/types'; interface ManifestRefEntry { package: string; @@ -44,7 +41,31 @@ interface Manifest { refs: Record; } -export default async (options: ImportOptions) => { +export default async ({ args, info }: CommandContext) => { + const { + flags: { input, output }, + } = cli( + { + help: info, + flags: { + input: { + type: String, + default: 'translations', + description: + 'Input directory containing the manifest and translated message files', + }, + output: { + type: String, + default: 'src/translations/resources.ts', + description: 'Output path for the generated wiring module', + }, + }, + }, + undefined, + args, + ); + + const options = { input, output }; await readTargetPackage(targetPaths.dir, targetPaths.rootDir); const inputDir = resolvePath(targetPaths.dir, options.input); diff --git a/packages/cli/src/modules/translations/index.ts b/packages/cli/src/modules/translations/index.ts index 1a700b3505..43263831d5 100644 --- a/packages/cli/src/modules/translations/index.ts +++ b/packages/cli/src/modules/translations/index.ts @@ -13,10 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import yargs from 'yargs'; import { createCliPlugin } from '../../wiring/factory'; -import { lazy } from '../../wiring/lazy'; -import { DEFAULT_MESSAGE_PATTERN } from './lib/messageFilePath'; export default createCliPlugin({ pluginId: 'translations', @@ -25,51 +22,14 @@ export default createCliPlugin({ path: ['translations', 'export'], description: 'Export translation messages from an app and all of its frontend plugins to JSON files', - execute: async ({ args }) => { - const argv = await yargs() - .options({ - output: { - type: 'string', - default: 'translations', - description: - 'Output directory for exported messages and manifest', - }, - pattern: { - type: 'string', - default: DEFAULT_MESSAGE_PATTERN, - description: - 'File path pattern for message files, with {id} and {lang} placeholders', - }, - }) - .help() - .parse(args); - await lazy(() => import('./commands/export'), 'default')(argv); - }, + execute: { loader: () => import('./commands/export') }, }); reg.addCommand({ path: ['translations', 'import'], description: 'Generate translation resource wiring from translated JSON files', - execute: async ({ args }) => { - const argv = await yargs() - .options({ - input: { - type: 'string', - default: 'translations', - description: - 'Input directory containing the manifest and translated message files', - }, - output: { - type: 'string', - default: 'src/translations/resources.ts', - description: 'Output path for the generated wiring module', - }, - }) - .help() - .parse(args); - await lazy(() => import('./commands/import'), 'default')(argv); - }, + execute: { loader: () => import('./commands/import') }, }); }, }); diff --git a/packages/cli/src/wiring/CliInitializer.test.ts b/packages/cli/src/wiring/CliInitializer.test.ts index 9ee252cfc5..e04a429ede 100644 --- a/packages/cli/src/wiring/CliInitializer.test.ts +++ b/packages/cli/src/wiring/CliInitializer.test.ts @@ -67,6 +67,31 @@ describe('CliInitializer', () => { expect(process.exit).toHaveBeenCalledWith(0); }); + it('should run commands using a loader', async () => { + expect.assertions(2); + process.argv = ['node', 'cli', 'test', '--verbose']; + const initializer = new CliInitializer(); + initializer.add( + createCliPlugin({ + pluginId: 'test', + init: async reg => + reg.addCommand({ + path: ['test'], + description: 'test', + execute: { + loader: async () => ({ + default: async ({ args }) => { + expect(args).toEqual(['--verbose']); + }, + }), + }, + }), + }), + ); + await initializer.run(); + expect(process.exit).toHaveBeenCalledWith(0); + }); + it('should pass positional args to the subcommand if nested', async () => { expect.assertions(2); process.argv = [ diff --git a/packages/cli/src/wiring/CliInitializer.ts b/packages/cli/src/wiring/CliInitializer.ts index a605199179..c07fbb26f3 100644 --- a/packages/cli/src/wiring/CliInitializer.ts +++ b/packages/cli/src/wiring/CliInitializer.ts @@ -118,13 +118,25 @@ export class CliInitializer { } positionalArgs.push(nonProcessArgs[argIndex]); } - await node.command.execute({ + const context = { args: [...positionalArgs, ...args.unknown], info: { usage: [programName, ...node.command.path].join(' '), description: node.command.description, }, - }); + }; + + if (typeof node.command.execute === 'function') { + await node.command.execute(context); + } else { + const mod = await node.command.execute.loader(); + // Handle CJS double-wrapping of default exports + const fn = + typeof mod.default === 'function' + ? mod.default + : (mod.default as any).default; + await fn(context); + } process.exit(0); } catch (error: unknown) { exitWithError(error); @@ -144,7 +156,7 @@ export class CliInitializer { exitWithError(new ForwardedError('Unhandled rejection', rejection)); }); - program.parse(process.argv); + await program.parseAsync(process.argv); } } diff --git a/packages/cli/src/wiring/types.ts b/packages/cli/src/wiring/types.ts index fc2c2b454d..e0f697990f 100644 --- a/packages/cli/src/wiring/types.ts +++ b/packages/cli/src/wiring/types.ts @@ -15,23 +15,31 @@ */ import { OpaqueType } from '@internal/opaque'; +export interface CommandContext { + args: string[]; + info: { + /** + * The usage string of the current command, for example: "backstage-cli repo test" + */ + usage: string; + /** + * The description provided for the command + */ + description: string; + }; +} + +export type CommandExecuteFn = (context: CommandContext) => Promise; + export interface BackstageCommand { path: string[]; description: string; deprecated?: boolean; - execute: (context: { - args: string[]; - info: { - /** - * The usage string of the current command, for example: "backstage-cli repo test" - */ - usage: string; - /** - * The description provided for the command - */ - description: string; - }; - }) => Promise; + execute: + | CommandExecuteFn + | { + loader: () => Promise<{ default: CommandExecuteFn }>; + }; } export type CliFeature = CliPlugin; diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 89e08206ce..2a85462335 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -5,6 +5,9 @@ "publishConfig": { "access": "public" }, + "backstage": { + "role": "cli" + }, "homepage": "https://backstage.io", "repository": { "type": "git", diff --git a/yarn.lock b/yarn.lock index 9a951c6f98..e06cf2d7f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3352,6 +3352,7 @@ __metadata: buffer: "npm:^6.0.3" chalk: "npm:^4.0.0" chokidar: "npm:^3.3.1" + cleye: "npm:^2.2.1" commander: "npm:^14.0.3" cross-fetch: "npm:^4.0.0" cross-spawn: "npm:^7.0.3" @@ -27244,6 +27245,16 @@ __metadata: languageName: node linkType: hard +"cleye@npm:^2.2.1": + version: 2.2.1 + resolution: "cleye@npm:2.2.1" + dependencies: + terminal-columns: "npm:^2.0.0" + type-flag: "npm:^4.0.3" + checksum: 10/4d24a7e4863d38b9a40c01ca332baa7526b320c14fc488e7fb2d3f54b0ad5baa8c5defa6fc6adc079f50f629409056d9da74be6611f6394b709c9062d39b2216 + languageName: node + linkType: hard + "cli-boxes@npm:^2.2.0, cli-boxes@npm:^2.2.1": version: 2.2.1 resolution: "cli-boxes@npm:2.2.1" @@ -48462,6 +48473,13 @@ __metadata: languageName: node linkType: hard +"terminal-columns@npm:^2.0.0": + version: 2.0.0 + resolution: "terminal-columns@npm:2.0.0" + checksum: 10/f958993886e09d7c0780f47833316532a0c7dd7db2fb43da9d34a88c821633408a6e7084af59f99c20b045776814748f14a8e33573886186be7a30174092964f + languageName: node + linkType: hard + "terser-webpack-plugin@npm:*, terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.3.16": version: 5.3.16 resolution: "terser-webpack-plugin@npm:5.3.16" @@ -49321,6 +49339,13 @@ __metadata: languageName: node linkType: hard +"type-flag@npm:^4.0.3": + version: 4.0.3 + resolution: "type-flag@npm:4.0.3" + checksum: 10/ffa9e56e50ed73ed802aa45b8d47eeba7677d2d66785e9153bfbc758c2613b6ba78b621d7766b713a287dbbe6758a61000f57d2ce8afc94e1876a37de914c73c + languageName: node + linkType: hard + "type-is@npm:^1.6.18, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" From d5779e525c2f01faf4cb42e15a4b23599750c917 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 20:31:55 +0100 Subject: [PATCH 286/455] Fix CLI report generation and --help handling for loader-based commands Add cleye-based --help handling to all commands using the loader pattern. Update the CLI report parser to support cleye's USAGE: and FLAGS: sections. Revert accidental backstage.role addition to eslint-plugin. Signed-off-by: Patrik Oldsberg --- .changeset/cli-report-parser-cleye.md | 5 + packages/cli/cli-report.md | 93 +++++++++---------- .../modules/build/commands/package/clean.ts | 7 +- .../src/modules/build/commands/repo/clean.ts | 8 +- packages/cli/src/modules/build/index.ts | 7 +- .../migrate/commands/packageExports.ts | 8 +- .../migrate/commands/packageLintConfigs.ts | 7 +- .../modules/migrate/commands/packageRole.ts | 5 +- .../migrate/commands/packageScripts.ts | 7 +- .../migrate/commands/reactRouterDeps.ts | 7 +- packages/eslint-plugin/package.json | 3 - .../cli-reports/runCliExtraction.ts | 25 +++-- 12 files changed, 106 insertions(+), 76 deletions(-) create mode 100644 .changeset/cli-report-parser-cleye.md diff --git a/.changeset/cli-report-parser-cleye.md b/.changeset/cli-report-parser-cleye.md new file mode 100644 index 0000000000..f805aeb5d4 --- /dev/null +++ b/.changeset/cli-report-parser-cleye.md @@ -0,0 +1,5 @@ +--- +'@backstage/repo-tools': patch +--- + +Updated CLI report parser to support cleye-style help output sections (`USAGE:` and `FLAGS:`). diff --git a/packages/cli/cli-report.md b/packages/cli/cli-report.md index ee4b03cbca..591b32ead7 100644 --- a/packages/cli/cli-report.md +++ b/packages/cli/cli-report.md @@ -57,81 +57,75 @@ Commands: ### `backstage-cli config docs` ``` -Usage: backstage-cli config docs [options] +Usage: backstage-cli config docs Options: - --package + --package -h, --help ``` ### `backstage-cli config schema` ``` -Usage: +Usage: backstage-cli config schema Options: - --format - --help + --format --merge - --no-merge - --package - --version + --package + -h, --help ``` ### `backstage-cli config:check` ``` -Usage: +Usage: backstage-cli config:check Options: - --config + --config --deprecated --frontend - --help --lax - --package + --package --strict - --version + -h, --help ``` ### `backstage-cli config:docs` ``` -Usage: program [options] +Usage: backstage-cli config:docs Options: - --package + --package -h, --help ``` ### `backstage-cli config:print` ``` -Usage: +Usage: backstage-cli config:print Options: - --config - --format + --config + --format --frontend - --help --lax - --package - --version + --package --with-secrets + -h, --help ``` ### `backstage-cli config:schema` ``` -Usage: +Usage: backstage-cli config:schema Options: - --format - --help + --format --merge - --no-merge - --package - --version + --package + -h, --help ``` ### `backstage-cli create-github-app` @@ -146,13 +140,12 @@ Options: ### `backstage-cli info` ``` -Usage: +Usage: backstage-cli info Options: - --format - --help - --include - --version + --format + --include + -h, --help ``` ### `backstage-cli migrate` @@ -175,7 +168,7 @@ Commands: ### `backstage-cli migrate package-exports` ``` -Usage: program [options] +Usage: backstage-cli migrate package-exports Options: -h, --help @@ -184,7 +177,7 @@ Options: ### `backstage-cli migrate package-lint-configs` ``` -Usage: program [options] +Usage: backstage-cli migrate package-lint-configs Options: -h, --help @@ -193,7 +186,7 @@ Options: ### `backstage-cli migrate package-roles` ``` -Usage: program [options] +Usage: backstage-cli migrate package-roles Options: -h, --help @@ -202,7 +195,7 @@ Options: ### `backstage-cli migrate package-scripts` ``` -Usage: program [options] +Usage: backstage-cli migrate package-scripts Options: -h, --help @@ -211,7 +204,7 @@ Options: ### `backstage-cli migrate react-router-deps` ``` -Usage: program [options] +Usage: backstage-cli migrate react-router-deps Options: -h, --help @@ -271,7 +264,7 @@ Options: ### `backstage-cli package clean` ``` -Usage: program [options] +Usage: backstage-cli package clean Options: -h, --help @@ -293,7 +286,7 @@ Options: ### `backstage-cli package postpack` ``` -Usage: program [options] +Usage: backstage-cli package postpack Options: -h, --help @@ -302,7 +295,7 @@ Options: ### `backstage-cli package prepack` ``` -Usage: program [options] +Usage: backstage-cli package prepack Options: -h, --help @@ -472,7 +465,7 @@ Options: ### `backstage-cli repo clean` ``` -Usage: program [options] +Usage: backstage-cli repo clean Options: -h, --help @@ -560,25 +553,23 @@ Commands: ### `backstage-cli translations export` ``` -Usage: +Usage: backstage-cli translations export Options: - --help - --output - --pattern - --version + --output + --pattern + -h, --help ``` ### `backstage-cli translations import` ``` -Usage: +Usage: backstage-cli translations import Options: - --help - --input - --output - --version + --input + --output + -h, --help ``` ### `backstage-cli versions:bump` diff --git a/packages/cli/src/modules/build/commands/package/clean.ts b/packages/cli/src/modules/build/commands/package/clean.ts index 70d7ea3771..f222c23666 100644 --- a/packages/cli/src/modules/build/commands/package/clean.ts +++ b/packages/cli/src/modules/build/commands/package/clean.ts @@ -14,11 +14,14 @@ * limitations under the License. */ +import { cli } from 'cleye'; import fs from 'fs-extra'; import { targetPaths } from '@backstage/cli-common'; +import type { CommandContext } from '../../../../wiring/types'; -export default async function clean() { +export default async ({ args, info }: CommandContext) => { + cli({ help: info }, undefined, args); await fs.remove(targetPaths.resolve('dist')); await fs.remove(targetPaths.resolve('dist-types')); await fs.remove(targetPaths.resolve('coverage')); -} +}; diff --git a/packages/cli/src/modules/build/commands/repo/clean.ts b/packages/cli/src/modules/build/commands/repo/clean.ts index a3c6e9cbbd..efafdae510 100644 --- a/packages/cli/src/modules/build/commands/repo/clean.ts +++ b/packages/cli/src/modules/build/commands/repo/clean.ts @@ -14,13 +14,15 @@ * limitations under the License. */ +import { cli } from 'cleye'; import fs from 'fs-extra'; import { resolve as resolvePath } from 'node:path'; import { PackageGraph } from '@backstage/cli-node'; - import { run, targetPaths } from '@backstage/cli-common'; +import type { CommandContext } from '../../../../wiring/types'; -export default async function command(): Promise { +export default async ({ args, info }: CommandContext) => { + cli({ help: info }, undefined, args); const packages = await PackageGraph.listTargetPackages(); await fs.remove(targetPaths.resolveRoot('dist')); @@ -48,4 +50,4 @@ export default async function command(): Promise { } }), ); -} +}; diff --git a/packages/cli/src/modules/build/index.ts b/packages/cli/src/modules/build/index.ts index 7a116f5d8a..fd94cb5db6 100644 --- a/packages/cli/src/modules/build/index.ts +++ b/packages/cli/src/modules/build/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { cli } from 'cleye'; import { Command, Option } from 'commander'; import { createCliPlugin } from '../../wiring/factory'; import { lazy } from '../../wiring/lazy'; @@ -214,7 +215,8 @@ export const buildPlugin = createCliPlugin({ reg.addCommand({ path: ['package', 'prepack'], description: 'Prepares a package for packaging before publishing', - execute: async () => { + execute: async ({ args, info }) => { + cli({ help: info }, undefined, args); const { pre } = await import('./commands/package/pack'); await pre(); }, @@ -223,7 +225,8 @@ export const buildPlugin = createCliPlugin({ reg.addCommand({ path: ['package', 'postpack'], description: 'Restores the changes made by the prepack command', - execute: async () => { + execute: async ({ args, info }) => { + cli({ help: info }, undefined, args); const { post } = await import('./commands/package/pack'); await post(); }, diff --git a/packages/cli/src/modules/migrate/commands/packageExports.ts b/packages/cli/src/modules/migrate/commands/packageExports.ts index 581c334c6f..3307e55721 100644 --- a/packages/cli/src/modules/migrate/commands/packageExports.ts +++ b/packages/cli/src/modules/migrate/commands/packageExports.ts @@ -14,8 +14,12 @@ * limitations under the License. */ -export default async function command() { +import { cli } from 'cleye'; +import type { CommandContext } from '../../../wiring/types'; + +export default async ({ args, info }: CommandContext) => { + cli({ help: info }, undefined, args); throw new Error( 'The `migrate package-exports` command has been removed, use `repo fix` instead.', ); -} +}; diff --git a/packages/cli/src/modules/migrate/commands/packageLintConfigs.ts b/packages/cli/src/modules/migrate/commands/packageLintConfigs.ts index 4df76a51ac..c6839fe28b 100644 --- a/packages/cli/src/modules/migrate/commands/packageLintConfigs.ts +++ b/packages/cli/src/modules/migrate/commands/packageLintConfigs.ts @@ -14,14 +14,17 @@ * limitations under the License. */ +import { cli } from 'cleye'; import fs from 'fs-extra'; import { resolve as resolvePath } from 'node:path'; import { PackageGraph } from '@backstage/cli-node'; import { runOutput } from '@backstage/cli-common'; +import type { CommandContext } from '../../../wiring/types'; const PREFIX = `module.exports = require('@backstage/cli/config/eslint-factory')`; -export default async function command() { +export default async ({ args, info }: CommandContext) => { + cli({ help: info }, undefined, args); const packages = await PackageGraph.listTargetPackages(); const oldConfigs = [ @@ -86,4 +89,4 @@ export default async function command() { if (hasPrettier) { await runOutput(['prettier', '--write', ...configPaths]); } -} +}; diff --git a/packages/cli/src/modules/migrate/commands/packageRole.ts b/packages/cli/src/modules/migrate/commands/packageRole.ts index 6b422c375e..8d8c04b735 100644 --- a/packages/cli/src/modules/migrate/commands/packageRole.ts +++ b/packages/cli/src/modules/migrate/commands/packageRole.ts @@ -14,13 +14,16 @@ * limitations under the License. */ +import { cli } from 'cleye'; import fs from 'fs-extra'; import { resolve as resolvePath } from 'node:path'; import { getPackages } from '@manypkg/get-packages'; import { PackageRoles } from '@backstage/cli-node'; import { targetPaths } from '@backstage/cli-common'; +import type { CommandContext } from '../../../wiring/types'; -export default async () => { +export default async ({ args, info }: CommandContext) => { + cli({ help: info }, undefined, args); const { packages } = await getPackages(targetPaths.dir); await Promise.all( diff --git a/packages/cli/src/modules/migrate/commands/packageScripts.ts b/packages/cli/src/modules/migrate/commands/packageScripts.ts index f875bf14fc..e76c684a6f 100644 --- a/packages/cli/src/modules/migrate/commands/packageScripts.ts +++ b/packages/cli/src/modules/migrate/commands/packageScripts.ts @@ -14,15 +14,18 @@ * limitations under the License. */ +import { cli } from 'cleye'; import fs from 'fs-extra'; import { resolve as resolvePath } from 'node:path'; import { PackageGraph, PackageRoles, PackageRole } from '@backstage/cli-node'; +import type { CommandContext } from '../../../wiring/types'; const configArgPattern = /--config[=\s][^\s$]+/; const noStartRoles: PackageRole[] = ['cli', 'common-library']; -export default async function command() { +export default async ({ args, info }: CommandContext) => { + cli({ help: info }, undefined, args); const packages = await PackageGraph.listTargetPackages(); await Promise.all( @@ -104,4 +107,4 @@ export default async function command() { } }), ); -} +}; diff --git a/packages/cli/src/modules/migrate/commands/reactRouterDeps.ts b/packages/cli/src/modules/migrate/commands/reactRouterDeps.ts index 3c2cf46560..702593c366 100644 --- a/packages/cli/src/modules/migrate/commands/reactRouterDeps.ts +++ b/packages/cli/src/modules/migrate/commands/reactRouterDeps.ts @@ -14,14 +14,17 @@ * limitations under the License. */ +import { cli } from 'cleye'; import fs from 'fs-extra'; import { resolve as resolvePath } from 'node:path'; import { PackageGraph, PackageRoles } from '@backstage/cli-node'; +import type { CommandContext } from '../../../wiring/types'; const REACT_ROUTER_DEPS = ['react-router', 'react-router-dom']; const REACT_ROUTER_RANGE = '6.0.0-beta.0 || ^6.3.0'; -export default async function command() { +export default async ({ args, info }: CommandContext) => { + cli({ help: info }, undefined, args); const packages = await PackageGraph.listTargetPackages(); await Promise.all( @@ -56,4 +59,4 @@ export default async function command() { } }), ); -} +}; diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 2a85462335..89e08206ce 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -5,9 +5,6 @@ "publishConfig": { "access": "public" }, - "backstage": { - "role": "cli" - }, "homepage": "https://backstage.io", "repository": { "type": "git", diff --git a/packages/repo-tools/src/commands/api-reports/cli-reports/runCliExtraction.ts b/packages/repo-tools/src/commands/api-reports/cli-reports/runCliExtraction.ts index 146c83bcfb..ae49c95f39 100644 --- a/packages/repo-tools/src/commands/api-reports/cli-reports/runCliExtraction.ts +++ b/packages/repo-tools/src/commands/api-reports/cli-reports/runCliExtraction.ts @@ -27,7 +27,14 @@ import { generateCliReport } from './generateCliReport'; import { logApiReportInstructions } from '../common'; function parseHelpPage(helpPageContent: string) { - const [, usage] = helpPageContent.match(/^\s*Usage: (.*)$/im) ?? []; + let usage: string | undefined; + + // Commander format: "Usage: backstage-cli ..." + const commanderUsage = helpPageContent.match(/^\s*Usage: (.*)$/im); + if (commanderUsage) { + usage = commanderUsage[1]; + } + const lines = helpPageContent.split(/\r?\n/); let options = new Array(); @@ -39,8 +46,8 @@ function parseHelpPage(helpPageContent: string) { lines.shift(); } if (lines.length > 0) { - // Start of a new section, e.g. "Options:" - const sectionName = lines.shift(); + // Start of a new section, e.g. "Options:" or "FLAGS:" + const sectionName = lines.shift()?.toLocaleLowerCase('en-US'); // Take lines until we hit the next section or the end const sectionEndIndex = lines.findIndex( line => line && !line.match(/^\s/), @@ -53,12 +60,18 @@ function parseHelpPage(helpPageContent: string) { .map(line => line.match(/^\s{1,8}(.*?)\s\s+/)?.[1]) .filter(Boolean) as string[]; - if (sectionName?.toLocaleLowerCase('en-US') === 'options:') { + if (sectionName === 'options:' || sectionName === 'flags:') { options = sectionItems; - } else if (sectionName?.toLocaleLowerCase('en-US') === 'commands:') { + } else if (sectionName === 'commands:') { commands = sectionItems; - } else if (sectionName?.toLocaleLowerCase('en-US') === 'arguments:') { + } else if (sectionName === 'arguments:') { commandArguments = sectionItems; + } else if (sectionName === 'usage:') { + // cleye format: usage line is inside the USAGE: section + const usageLine = sectionLines.find(l => l.trim().length > 0)?.trim(); + if (usageLine) { + usage = usageLine; + } } else { throw new Error(`Unknown CLI section: ${sectionName}`); } From 972f686958350199d706e03892c4fe611aca9859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 21:03:25 +0100 Subject: [PATCH 287/455] feat(catalog): Add predicate-based filtering to the by-refs endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds support for predicate-based filtering (`$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, `$hasPrefix`) to the catalog `/entities/by-refs` endpoint via a `query` field in the request body. The existing `filter` query parameter behavior is preserved for backward compatibility. The `query` predicate is only used when explicitly provided, and when both `filter` and `query` are given, they are merged with `$all`. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- .changeset/by-refs-predicate-backend.md | 5 + .changeset/by-refs-predicate-client.md | 5 + packages/catalog-client/report.api.md | 1 + .../catalog-client/src/CatalogClient.test.ts | 97 +++++++++++++++++++ packages/catalog-client/src/CatalogClient.ts | 29 +++++- .../models/GetEntitiesByRefsRequest.model.ts | 4 + packages/catalog-client/src/types/api.ts | 10 ++ plugins/catalog-backend/src/catalog/types.ts | 4 + .../catalog-backend/src/schema/openapi.yaml | 2 + .../models/GetEntitiesByRefsRequest.model.ts | 4 + .../src/schema/openapi/generated/router.ts | 3 + .../src/service/DefaultEntitiesCatalog.ts | 3 +- .../src/service/createRouter.test.ts | 48 +++++++++ .../src/service/createRouter.ts | 1 + .../service/request/entitiesBatchRequest.ts | 35 ++++++- 15 files changed, 246 insertions(+), 5 deletions(-) create mode 100644 .changeset/by-refs-predicate-backend.md create mode 100644 .changeset/by-refs-predicate-client.md diff --git a/.changeset/by-refs-predicate-backend.md b/.changeset/by-refs-predicate-backend.md new file mode 100644 index 0000000000..a2a0346122 --- /dev/null +++ b/.changeset/by-refs-predicate-backend.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Added support for predicate-based filtering on the `/entities/by-refs` endpoint via the `query` field in the request body. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. diff --git a/.changeset/by-refs-predicate-client.md b/.changeset/by-refs-predicate-client.md new file mode 100644 index 0000000000..5ed136fbe1 --- /dev/null +++ b/.changeset/by-refs-predicate-client.md @@ -0,0 +1,5 @@ +--- +'@backstage/catalog-client': minor +--- + +Added support for the `query` field in `getEntitiesByRefs` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. diff --git a/packages/catalog-client/report.api.md b/packages/catalog-client/report.api.md index 8bfebe6ab1..c155084ccd 100644 --- a/packages/catalog-client/report.api.md +++ b/packages/catalog-client/report.api.md @@ -236,6 +236,7 @@ export interface GetEntitiesByRefsRequest { entityRefs: string[]; fields?: EntityFieldsQuery | undefined; filter?: EntityFilterQuery; + query?: FilterPredicate; } // @public diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index 819fa70381..70265bd6cb 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -302,6 +302,103 @@ describe('CatalogClient', () => { expect(response).toEqual({ items: [entity, undefined] }); }); + + it('sends only query predicate in the body when query is provided without filter', async () => { + expect.assertions(3); + const entity = { + apiVersion: '1', + kind: 'Component', + metadata: { + name: 'Test2', + namespace: 'test1', + }, + }; + server.use( + rest.post(`${mockBaseUrl}/entities/by-refs`, async (req, res, ctx) => { + expect(req.url.search).toBe(''); + await expect(req.json()).resolves.toEqual({ + entityRefs: ['k:n/a'], + query: { kind: 'Component' }, + }); + return res(ctx.json({ items: [entity] })); + }), + ); + + const response = await client.getEntitiesByRefs( + { + entityRefs: ['k:n/a'], + query: { kind: 'Component' }, + }, + { token }, + ); + + expect(response).toEqual({ items: [entity] }); + }); + + it('merges filter and query into $all predicate when both are provided', async () => { + expect.assertions(4); + const entity = { + apiVersion: '1', + kind: 'Component', + metadata: { + name: 'Test2', + namespace: 'test1', + }, + }; + server.use( + rest.post(`${mockBaseUrl}/entities/by-refs`, async (req, res, ctx) => { + expect(req.url.search).toBe(''); + const body = await req.json(); + expect(body.entityRefs).toEqual(['k:n/a']); + expect(body.query).toEqual({ + $all: [{ kind: 'Component' }, { kind: 'API' }], + }); + return res(ctx.json({ items: [entity] })); + }), + ); + + const response = await client.getEntitiesByRefs( + { + entityRefs: ['k:n/a'], + query: { kind: 'Component' }, + filter: { kind: ['API'] }, + }, + { token }, + ); + + expect(response).toEqual({ items: [entity] }); + }); + + it('sends filter as query parameter when only filter is provided (backward compat)', async () => { + expect.assertions(4); + const entity = { + apiVersion: '1', + kind: 'Component', + metadata: { + name: 'Test2', + namespace: 'test1', + }, + }; + server.use( + rest.post(`${mockBaseUrl}/entities/by-refs`, async (req, res, ctx) => { + expect(req.url.search).toBe('?filter=kind%3DAPI'); + const body = await req.json(); + expect(body).toEqual({ entityRefs: ['k:n/a'] }); + expect(body.query).toBeUndefined(); + return res(ctx.json({ items: [entity] })); + }), + ); + + const response = await client.getEntitiesByRefs( + { + entityRefs: ['k:n/a'], + filter: { kind: ['API'] }, + }, + { token }, + ); + + expect(response).toEqual({ items: [entity] }); + }); }); describe('queryEntities', () => { diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index 0d173022a3..a671a155d3 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -237,11 +237,36 @@ export class CatalogClient implements CatalogApi { request: GetEntitiesByRefsRequest, options?: CatalogRequestOptions, ): Promise { + const { filter, query } = request; + + // Only convert and merge if both filter and query are provided, or if + // query alone is provided. When only filter is given, preserve the old + // query-parameter behavior for backward compatibility. + let filterPredicate: FilterPredicate | undefined; + if (query !== undefined) { + if (typeof query !== 'object' || query === null || Array.isArray(query)) { + throw new InputError('Query must be an object'); + } + filterPredicate = query; + if (filter !== undefined) { + const converted = convertFilterToPredicate(filter); + filterPredicate = { $all: [filterPredicate, converted] }; + } + } + const getOneChunk = async (refs: string[]) => { const response = await this.apiClient.getEntitiesByRefs( { - body: { entityRefs: refs, fields: request.fields }, - query: { filter: this.getFilterValue(request.filter) }, + body: { + entityRefs: refs, + fields: request.fields, + ...(filterPredicate && { + query: filterPredicate as unknown as { [key: string]: any }, + }), + }, + query: filterPredicate + ? {} + : { filter: this.getFilterValue(request.filter) }, }, options, ); diff --git a/packages/catalog-client/src/schema/openapi/generated/models/GetEntitiesByRefsRequest.model.ts b/packages/catalog-client/src/schema/openapi/generated/models/GetEntitiesByRefsRequest.model.ts index 0e7255f9c6..607c992ace 100644 --- a/packages/catalog-client/src/schema/openapi/generated/models/GetEntitiesByRefsRequest.model.ts +++ b/packages/catalog-client/src/schema/openapi/generated/models/GetEntitiesByRefsRequest.model.ts @@ -24,4 +24,8 @@ export interface GetEntitiesByRefsRequest { entityRefs: Array; fields?: Array; + /** + * A type representing all allowed JSON object values. + */ + query?: { [key: string]: any }; } diff --git a/packages/catalog-client/src/types/api.ts b/packages/catalog-client/src/types/api.ts index 13a7822df9..fac4ed5928 100644 --- a/packages/catalog-client/src/types/api.ts +++ b/packages/catalog-client/src/types/api.ts @@ -212,6 +212,16 @@ export interface GetEntitiesByRefsRequest { * If given, return only entities that match the given filter. */ filter?: EntityFilterQuery; + /** + * If given, return only entities that match the given predicate query. + * + * @remarks + * + * Supports operators like `$all`, `$any`, `$not`, `$exists`, `$in`, + * `$contains`, and `$hasPrefix`. When both `filter` and `query` are + * provided, they are combined with `$all`. + */ + query?: FilterPredicate; } /** diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index d5c4b2b675..3d6aff55ba 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -86,6 +86,10 @@ export interface EntitiesBatchRequest { * they did not exist. */ filter?: EntityFilter; + /** + * Predicate-based query for filtering entities. + */ + query?: FilterPredicate; /** * Strips out only the parts of the entity bodies to include in the response. */ diff --git a/plugins/catalog-backend/src/schema/openapi.yaml b/plugins/catalog-backend/src/schema/openapi.yaml index 58d7fed4ac..382dfedade 100644 --- a/plugins/catalog-backend/src/schema/openapi.yaml +++ b/plugins/catalog-backend/src/schema/openapi.yaml @@ -1036,6 +1036,8 @@ paths: type: array items: type: string + query: + $ref: '#/components/schemas/JsonObject' examples: Fetch Backstage entities: value: diff --git a/plugins/catalog-backend/src/schema/openapi/generated/models/GetEntitiesByRefsRequest.model.ts b/plugins/catalog-backend/src/schema/openapi/generated/models/GetEntitiesByRefsRequest.model.ts index 0e7255f9c6..607c992ace 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/models/GetEntitiesByRefsRequest.model.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/models/GetEntitiesByRefsRequest.model.ts @@ -24,4 +24,8 @@ export interface GetEntitiesByRefsRequest { entityRefs: Array; fields?: Array; + /** + * A type representing all allowed JSON object values. + */ + query?: { [key: string]: any }; } diff --git a/plugins/catalog-backend/src/schema/openapi/generated/router.ts b/plugins/catalog-backend/src/schema/openapi/generated/router.ts index b423905955..74668310c5 100644 --- a/plugins/catalog-backend/src/schema/openapi/generated/router.ts +++ b/plugins/catalog-backend/src/schema/openapi/generated/router.ts @@ -1124,6 +1124,9 @@ export const spec = { type: 'string', }, }, + query: { + $ref: '#/components/schemas/JsonObject', + }, }, }, examples: { diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index a9d706582a..38cd145421 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -224,9 +224,10 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { }) .whereIn('final_entities.entity_ref', chunk); - if (request?.filter) { + if (request?.filter || request?.query) { query = applyEntityFilterToQuery({ filter: request.filter, + query: request.query, targetQuery: query, onEntityIdField: 'final_entities.entity_id', knex: this.database, diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index ccdd034cae..62856ba7e4 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -725,6 +725,54 @@ describe('createRouter readonly disabled', () => { }); }); + describe('POST /entities/by-refs with query predicate', () => { + it('can fetch entities by refs with a predicate query', async () => { + const entity: Entity = { + apiVersion: 'a', + kind: 'component', + metadata: { + name: 'a', + }, + }; + const entityRef = stringifyEntityRef(entity); + entitiesCatalog.entitiesBatch.mockResolvedValue({ + items: { type: 'object', entities: [entity] }, + }); + const response = await request(app) + .post('/entities/by-refs') + .set('Content-Type', 'application/json') + .send( + JSON.stringify({ + entityRefs: [entityRef], + query: { kind: 'Component' }, + }), + ); + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledWith({ + entityRefs: [entityRef], + fields: undefined, + credentials: mockCredentials.user(), + filter: undefined, + query: { kind: 'Component' }, + }); + expect(response.status).toEqual(200); + expect(response.body).toEqual({ items: [entity] }); + }); + + it('rejects invalid query predicate', async () => { + const response = await request(app) + .post('/entities/by-refs') + .set('Content-Type', 'application/json') + .send( + JSON.stringify({ + entityRefs: ['component:default/a'], + query: { $invalid: 'bad' }, + }), + ); + expect(response.status).toEqual(400); + }); + }); + describe('GET /locations', () => { it('happy path: lists locations', async () => { const locations: Location[] = [ diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index 90c76cc4d4..1a7f1bf6fc 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -525,6 +525,7 @@ export async function createRouter( const { items } = await entitiesCatalog.entitiesBatch({ entityRefs: request.entityRefs, filter: parseEntityFilterParams(req.query), + query: request.query, fields: parseEntityTransformParams(req.query, request.fields), credentials: await httpAuth.credentials(req), }); diff --git a/plugins/catalog-backend/src/service/request/entitiesBatchRequest.ts b/plugins/catalog-backend/src/service/request/entitiesBatchRequest.ts index d5469315be..e3d8252d4c 100644 --- a/plugins/catalog-backend/src/service/request/entitiesBatchRequest.ts +++ b/plugins/catalog-backend/src/service/request/entitiesBatchRequest.ts @@ -15,20 +15,51 @@ */ import { InputError } from '@backstage/errors'; +import { + createZodV3FilterPredicateSchema, + FilterPredicate, +} from '@backstage/filter-predicates'; import { Request } from 'express'; import { z } from 'zod'; +import { z as zodV3 } from 'zod/v3'; +import { fromZodError } from 'zod-validation-error/v3'; const schema = z.object({ entityRefs: z.array(z.string()), fields: z.array(z.string()).optional(), + query: z.record(z.unknown()).optional(), }); -export function entitiesBatchRequest(req: Request): z.infer { +const filterPredicateSchema = createZodV3FilterPredicateSchema(zodV3); + +export interface ParsedEntitiesBatchRequest { + entityRefs: string[]; + fields?: string[]; + query?: FilterPredicate; +} + +export function entitiesBatchRequest(req: Request): ParsedEntitiesBatchRequest { + let parsed: z.infer; try { - return schema.parse(req.body); + parsed = schema.parse(req.body); } catch (error) { throw new InputError( `Malformed request body (did you remember to specify an application/json content type?), ${error.message}`, ); } + + let query: FilterPredicate | undefined; + if (parsed.query !== undefined) { + const result = filterPredicateSchema.safeParse(parsed.query); + if (!result.success) { + throw new InputError(`Invalid query: ${fromZodError(result.error)}`); + } + query = result.data; + } + + return { + entityRefs: parsed.entityRefs, + fields: parsed.fields, + query, + }; } From 5aea009eddfd8e886d6b411bd2892f9cf27ccf0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 21:11:06 +0100 Subject: [PATCH 288/455] refactor: simplify entitiesBatchRequest to use filterPredicateSchema directly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- .../service/request/entitiesBatchRequest.ts | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/plugins/catalog-backend/src/service/request/entitiesBatchRequest.ts b/plugins/catalog-backend/src/service/request/entitiesBatchRequest.ts index e3d8252d4c..02ad1d5566 100644 --- a/plugins/catalog-backend/src/service/request/entitiesBatchRequest.ts +++ b/plugins/catalog-backend/src/service/request/entitiesBatchRequest.ts @@ -20,18 +20,17 @@ import { FilterPredicate, } from '@backstage/filter-predicates'; import { Request } from 'express'; -import { z } from 'zod'; -import { z as zodV3 } from 'zod/v3'; +import { z } from 'zod/v3'; import { fromZodError } from 'zod-validation-error/v3'; +const filterPredicateSchema = createZodV3FilterPredicateSchema(z); + const schema = z.object({ entityRefs: z.array(z.string()), fields: z.array(z.string()).optional(), - query: z.record(z.unknown()).optional(), + query: filterPredicateSchema.optional(), }); -const filterPredicateSchema = createZodV3FilterPredicateSchema(zodV3); - export interface ParsedEntitiesBatchRequest { entityRefs: string[]; fields?: string[]; @@ -39,27 +38,13 @@ export interface ParsedEntitiesBatchRequest { } export function entitiesBatchRequest(req: Request): ParsedEntitiesBatchRequest { - let parsed: z.infer; - try { - parsed = schema.parse(req.body); - } catch (error) { + const result = schema.safeParse(req.body); + if (!result.success) { throw new InputError( - `Malformed request body (did you remember to specify an application/json content type?), ${error.message}`, + `Malformed request body (did you remember to specify an application/json content type?), ${fromZodError( + result.error, + )}`, ); } - - let query: FilterPredicate | undefined; - if (parsed.query !== undefined) { - const result = filterPredicateSchema.safeParse(parsed.query); - if (!result.success) { - throw new InputError(`Invalid query: ${fromZodError(result.error)}`); - } - query = result.data; - } - - return { - entityRefs: parsed.entityRefs, - fields: parsed.fields, - query, - }; + return result.data; } From 2ffb23df02e63f56096c0c22b8cac6ddea779e5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 21:26:33 +0100 Subject: [PATCH 289/455] Update packages/catalog-client/src/CatalogClient.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/CatalogClient.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index a671a155d3..404c980128 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -249,8 +249,11 @@ export class CatalogClient implements CatalogApi { } filterPredicate = query; if (filter !== undefined) { - const converted = convertFilterToPredicate(filter); - filterPredicate = { $all: [filterPredicate, converted] }; + const filterValue = this.getFilterValue(filter); + if (filterValue && Object.keys(filterValue).length > 0) { + const converted = convertFilterToPredicate(filter); + filterPredicate = { $all: [filterPredicate, converted] }; + } } } From ec411a01ae8933d96f48f4ab957b2410fcbfd915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 21:50:33 +0100 Subject: [PATCH 290/455] feat: add query predicate support to InMemoryCatalogClient MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds support for the `query` field in `getEntitiesByRefs` and `getEntityFacets` on InMemoryCatalogClient, matching the backend behavior. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Fredrik Adelöw --- .../testUtils/InMemoryCatalogClient.test.ts | 42 +++++++++++++++++++ .../src/testUtils/InMemoryCatalogClient.ts | 14 ++++++- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/catalog-client/src/testUtils/InMemoryCatalogClient.test.ts b/packages/catalog-client/src/testUtils/InMemoryCatalogClient.test.ts index aa3b624050..98b5d5c034 100644 --- a/packages/catalog-client/src/testUtils/InMemoryCatalogClient.test.ts +++ b/packages/catalog-client/src/testUtils/InMemoryCatalogClient.test.ts @@ -370,6 +370,25 @@ describe('InMemoryCatalogClient', () => { { kind: 'CustomKind', metadata: { name: 'e1' } }, ]); }); + + it('supports query predicate filter', async () => { + const client = new InMemoryCatalogClient({ entities }); + const result = await client.getEntitiesByRefs({ + entityRefs: ['secondcustomkind:default/e2', 'customkind:default/e1'], + query: { kind: 'CustomKind' }, + }); + expect(result.items).toEqual([undefined, entity1]); + }); + + it('supports both filter and query predicate together', async () => { + const client = new InMemoryCatalogClient({ entities }); + const result = await client.getEntitiesByRefs({ + entityRefs: ['customkind:default/e1', 'customkind:other/e3'], + filter: { kind: 'CustomKind' }, + query: { 'metadata.namespace': 'other' }, + }); + expect(result.items).toEqual([undefined, entity3]); + }); }); describe('queryEntities', () => { @@ -975,6 +994,29 @@ describe('InMemoryCatalogClient', () => { }); expect(result.facets['spec.nonexistent']).toEqual([]); }); + + it('supports query predicate filter', async () => { + const client = new InMemoryCatalogClient({ entities }); + const result = await client.getEntityFacets({ + facets: ['spec.type'], + query: { kind: 'CustomKind' }, + }); + expect(result.facets['spec.type']).toEqual([ + { value: 'service', count: 2 }, + ]); + }); + + it('supports both filter and query predicate together', async () => { + const client = new InMemoryCatalogClient({ entities }); + const result = await client.getEntityFacets({ + facets: ['spec.type'], + filter: { kind: 'CustomKind' }, + query: { 'metadata.namespace': 'default' }, + }); + expect(result.facets['spec.type']).toEqual([ + { value: 'service', count: 1 }, + ]); + }); }); describe('not implemented methods', () => { diff --git a/packages/catalog-client/src/testUtils/InMemoryCatalogClient.ts b/packages/catalog-client/src/testUtils/InMemoryCatalogClient.ts index 0a4dc57386..dd7f269188 100644 --- a/packages/catalog-client/src/testUtils/InMemoryCatalogClient.ts +++ b/packages/catalog-client/src/testUtils/InMemoryCatalogClient.ts @@ -361,10 +361,15 @@ export class InMemoryCatalogClient implements CatalogApi { request: GetEntitiesByRefsRequest, ): Promise { const filter = createFilter(request.filter); + const queryFilter = request.query + ? filterPredicateToFilterFunction(request.query) + : undefined; const refMap = this.#createEntityRefMap(); const items = request.entityRefs .map(ref => refMap.get(ref)) - .map(e => (e && filter(e) ? e : undefined)); + .map(e => + e && filter(e) && (!queryFilter || queryFilter(e)) ? e : undefined, + ); return { items: request.fields ? items.map(e => (e ? applyFieldsFilter(e, request.fields) : undefined)) @@ -506,7 +511,12 @@ export class InMemoryCatalogClient implements CatalogApi { request: GetEntityFacetsRequest, ): Promise { const filter = createFilter(request.filter); - const filteredEntities = this.#entities.filter(filter); + let filteredEntities = this.#entities.filter(filter); + if (request.query) { + filteredEntities = filteredEntities.filter( + filterPredicateToFilterFunction(request.query), + ); + } const facets = Object.fromEntries( request.facets.map(facet => { const facetValues = new Map(); From 3880820c62c75d62d9bfa5f5b2d380e05396073d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 26 Feb 2026 21:59:36 +0100 Subject: [PATCH 291/455] fix: clean up filter merging logic and add combined filter+query test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace incorrect Object.keys-on-array guard with direct filter conversion, matching the pattern used in getEntityFacetsByPredicate - Add backend router test covering combined filter query param + body query predicate being forwarded independently to entitiesBatch Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: Fredrik Adelöw --- packages/catalog-client/src/CatalogClient.ts | 7 ++--- .../src/service/createRouter.test.ts | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index 404c980128..a671a155d3 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -249,11 +249,8 @@ export class CatalogClient implements CatalogApi { } filterPredicate = query; if (filter !== undefined) { - const filterValue = this.getFilterValue(filter); - if (filterValue && Object.keys(filterValue).length > 0) { - const converted = convertFilterToPredicate(filter); - filterPredicate = { $all: [filterPredicate, converted] }; - } + const converted = convertFilterToPredicate(filter); + filterPredicate = { $all: [filterPredicate, converted] }; } } diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 62856ba7e4..1984f2f04f 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -759,6 +759,37 @@ describe('createRouter readonly disabled', () => { expect(response.body).toEqual({ items: [entity] }); }); + it('forwards both filter query param and body query predicate independently', async () => { + const entity: Entity = { + apiVersion: 'a', + kind: 'component', + metadata: { + name: 'a', + }, + }; + const entityRef = stringifyEntityRef(entity); + entitiesCatalog.entitiesBatch.mockResolvedValue({ + items: { type: 'object', entities: [entity] }, + }); + const response = await request(app) + .post('/entities/by-refs?filter=kind=Component') + .set('Content-Type', 'application/json') + .send( + JSON.stringify({ + entityRefs: [entityRef], + query: { 'metadata.namespace': 'default' }, + }), + ); + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledWith({ + entityRefs: [entityRef], + fields: undefined, + credentials: mockCredentials.user(), + filter: { key: 'kind', values: ['Component'] }, + query: { 'metadata.namespace': 'default' }, + }); + expect(response.status).toEqual(200); + }); + it('rejects invalid query predicate', async () => { const response = await request(app) .post('/entities/by-refs') From cb7c6b1bc0d6dafe49144dc829394e470c1c4b9f Mon Sep 17 00:00:00 2001 From: Bond Yan Date: Thu, 26 Feb 2026 17:27:23 -0500 Subject: [PATCH 292/455] allowed keys implementation Signed-off-by: Bond Yan --- .changeset/crazy-ravens-reply.md | 6 ++ plugins/techdocs-backend/config.d.ts | 12 +++ .../src/stages/generate/helpers.test.ts | 77 +++++++++++++++++++ .../src/stages/generate/mkdocsPatchers.ts | 17 +++- .../src/stages/generate/techdocs.ts | 9 ++- .../src/stages/generate/types.ts | 1 + 6 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 .changeset/crazy-ravens-reply.md diff --git a/.changeset/crazy-ravens-reply.md b/.changeset/crazy-ravens-reply.md new file mode 100644 index 0000000000..48bc36c464 --- /dev/null +++ b/.changeset/crazy-ravens-reply.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-techdocs-node': patch +--- + +Added `techdocs.generator.mkdocs.dangerouslyAllowAdditionalKeys` configuration option to explicit bypass MkDocs configuration key restrictions. This enables support for additional MkDocs configuration keys beyond the default safe allowlist, such as the `hooks` key which some MkDocs plugins require. diff --git a/plugins/techdocs-backend/config.d.ts b/plugins/techdocs-backend/config.d.ts index 5d3baa940a..87369f2ccd 100644 --- a/plugins/techdocs-backend/config.d.ts +++ b/plugins/techdocs-backend/config.d.ts @@ -64,6 +64,18 @@ export interface Config { * List of mkdocs plugins which should be added as default to all mkdocs.yml files. */ defaultPlugins?: string[]; + + /** + * List of additional MkDocs configuration keys to allow beyond + * the default safe allowlist. This can introduce security vulnerabilities. + * + * WARNING: Some MkDocs configuration keys can execute arbitrary code. For example, the + * 'hooks' key allows running arbitrary Python code during documentation generation. + * Only use this in trusted environments where all mkdocs.yml files are audited. + * + * @see https://www.mkdocs.org/user-guide/configuration/#hooks + */ + dangerouslyAllowAdditionalKeys?: string[]; }; }; diff --git a/plugins/techdocs-node/src/stages/generate/helpers.test.ts b/plugins/techdocs-node/src/stages/generate/helpers.test.ts index fd428fd23a..eb3c32a464 100644 --- a/plugins/techdocs-node/src/stages/generate/helpers.test.ts +++ b/plugins/techdocs-node/src/stages/generate/helpers.test.ts @@ -910,6 +910,83 @@ another_unknown: true expect(warn).toHaveBeenCalledWith(expect.stringContaining('hooks')); }); + + it('should allow additional keys when configured via dangerouslyAllowAdditionalKeys', async () => { + const mkdocsWithHooksAndCustom = `site_name: Test +hooks: + - hook.py +custom_dir: custom +some_unknown_key: value +`; + mockDir.setContent({ + 'mkdocs_allowed.yml': mkdocsWithHooksAndCustom, + }); + + // Allow 'hooks' and 'custom_dir' but not 'some_unknown_key' + await sanitizeMkdocsYml( + mockDir.resolve('mkdocs_allowed.yml'), + mockLogger, + ['hooks', 'custom_dir'], + ); + + const updatedMkdocsYml = await fs.readFile( + mockDir.resolve('mkdocs_allowed.yml'), + ); + const parsedYml = yaml.load(updatedMkdocsYml.toString()) as Record< + string, + unknown + >; + + // 'hooks' and 'custom_dir' should be preserved + expect(parsedYml.hooks).toEqual(['hook.py']); + expect(parsedYml.custom_dir).toBe('custom'); + // 'some_unknown_key' should still be removed + expect(parsedYml.some_unknown_key).toBeUndefined(); + expect(parsedYml.site_name).toBe('Test'); + + // Should warn about the dangerous configuration AND the removed key + expect(warn).toHaveBeenCalledWith( + expect.stringContaining( + 'DANGEROUS: Allowing additional MkDocs configuration keys beyond the default safe allowlist: hooks, custom_dir', + ), + ); + expect(warn).toHaveBeenCalledWith( + expect.stringContaining( + 'Removed the following unsupported configuration keys from mkdocs.yml: some_unknown_key', + ), + ); + }); + + it('should warn about dangerous keys even when no keys are removed', async () => { + mockDir.setContent({ + 'mkdocs_with_hooks.yml': mkdocsYmlWithHooks, + }); + + await sanitizeMkdocsYml( + mockDir.resolve('mkdocs_with_hooks.yml'), + mockLogger, + ['hooks'], + ); + + const updatedMkdocsYml = await fs.readFile( + mockDir.resolve('mkdocs_with_hooks.yml'), + ); + const parsedYml = yaml.load(updatedMkdocsYml.toString()) as { + hooks?: string[]; + site_name: string; + }; + + // Hooks should be preserved + expect(parsedYml.hooks).toBeDefined(); + expect(parsedYml.site_name).toBe('Test site name'); + + // Should warn about dangerous configuration + expect(warn).toHaveBeenCalledWith( + expect.stringContaining( + 'DANGEROUS: Allowing additional MkDocs configuration keys beyond the default safe allowlist: hooks', + ), + ); + }); }); describe('validateDocsDirectory', () => { diff --git a/plugins/techdocs-node/src/stages/generate/mkdocsPatchers.ts b/plugins/techdocs-node/src/stages/generate/mkdocsPatchers.ts index cd506d3b28..d676237b01 100644 --- a/plugins/techdocs-node/src/stages/generate/mkdocsPatchers.ts +++ b/plugins/techdocs-node/src/stages/generate/mkdocsPatchers.ts @@ -198,15 +198,28 @@ export const patchMkdocsYmlWithPlugins = async ( * * @param mkdocsYmlPath - Absolute path to mkdocs.yml or equivalent of a docs site * @param logger - A logger instance + * @param additionalAllowedKeys - Optional array of additional keys to allow beyond the default allowlist */ export const sanitizeMkdocsYml = async ( mkdocsYmlPath: string, logger: LoggerService, + additionalAllowedKeys?: string[], ) => { await patchMkdocsFile(mkdocsYmlPath, logger, mkdocsYml => { + // Combine default allowed keys with additional keys + const allowedKeys = new Set(ALLOWED_MKDOCS_KEYS); + if (additionalAllowedKeys && additionalAllowedKeys.length > 0) { + logger.warn( + `DANGEROUS: Allowing additional MkDocs configuration keys beyond the default safe allowlist: ${additionalAllowedKeys.join( + ', ', + )}. This may introduce security vulnerabilities. Only use in trusted environments.`, + ); + additionalAllowedKeys.forEach(key => allowedKeys.add(key)); + } + // Identify keys that will be removed for logging const removedKeys = Object.keys(mkdocsYml).filter( - key => !ALLOWED_MKDOCS_KEYS.has(key), + key => !allowedKeys.has(key), ); if (removedKeys.length > 0) { @@ -220,7 +233,7 @@ export const sanitizeMkdocsYml = async ( // Build a new object with only allowed keys const sanitized: Record = {}; - for (const key of ALLOWED_MKDOCS_KEYS) { + for (const key of allowedKeys) { if (key in mkdocsYml) { sanitized[key] = (mkdocsYml as Record)[key]; } diff --git a/plugins/techdocs-node/src/stages/generate/techdocs.ts b/plugins/techdocs-node/src/stages/generate/techdocs.ts index ed357c5c81..8a764eb391 100644 --- a/plugins/techdocs-node/src/stages/generate/techdocs.ts +++ b/plugins/techdocs-node/src/stages/generate/techdocs.ts @@ -115,7 +115,11 @@ export class TechdocsGenerator implements GeneratorBase { const docsDir = await validateMkdocsYaml(inputDir, content); // Remove unsupported configuration keys - await sanitizeMkdocsYml(mkdocsYmlPath, childLogger); + await sanitizeMkdocsYml( + mkdocsYmlPath, + childLogger, + this.options.dangerouslyAllowAdditionalKeys, + ); // Validate that no symlinks in the docs directory point outside the input directory // This prevents path traversal attacks where malicious symlinks could leak host files @@ -257,5 +261,8 @@ export function readGeneratorConfig( defaultPlugins: config.getOptionalStringArray( 'techdocs.generator.mkdocs.defaultPlugins', ), + dangerouslyAllowAdditionalKeys: config.getOptionalStringArray( + 'techdocs.generator.mkdocs.dangerouslyAllowAdditionalKeys', + ), }; } diff --git a/plugins/techdocs-node/src/stages/generate/types.ts b/plugins/techdocs-node/src/stages/generate/types.ts index 418260b819..b716e9510b 100644 --- a/plugins/techdocs-node/src/stages/generate/types.ts +++ b/plugins/techdocs-node/src/stages/generate/types.ts @@ -45,6 +45,7 @@ export type GeneratorConfig = { omitTechdocsCoreMkdocsPlugin?: boolean; legacyCopyReadmeMdToIndexMd?: boolean; defaultPlugins?: string[]; + dangerouslyAllowAdditionalKeys?: string[]; }; /** From fab449cf9e6979b83f7b95ec8087471d4688c570 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 23:43:46 +0100 Subject: [PATCH 293/455] cli: lint fix Signed-off-by: Patrik Oldsberg Made-with: Cursor --- .../cli/src/modules/migrate/commands/packageScripts.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/modules/migrate/commands/packageScripts.ts b/packages/cli/src/modules/migrate/commands/packageScripts.ts index e76c684a6f..0b7d9fc2ce 100644 --- a/packages/cli/src/modules/migrate/commands/packageScripts.ts +++ b/packages/cli/src/modules/migrate/commands/packageScripts.ts @@ -59,14 +59,14 @@ export default async ({ args, info }: CommandContext) => { // For test scripts we keep all existing flags except for --passWithNoTests, since that's now default const testCmd = ['test']; if (scripts.test?.startsWith('backstage-cli test')) { - const args = scripts.test + const testArgs = scripts.test .slice('backstage-cli test'.length) .split(' ') .filter(Boolean); - if (args.includes('--passWithNoTests')) { - args.splice(args.indexOf('--passWithNoTests'), 1); + if (testArgs.includes('--passWithNoTests')) { + testArgs.splice(testArgs.indexOf('--passWithNoTests'), 1); } - testCmd.push(...args); + testCmd.push(...testArgs); } const expectedScripts = { From b4fea2bc29f59a5a2580f67ce5d6cbd9abdc7f5e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 23:54:48 +0100 Subject: [PATCH 294/455] repo-tools: Use spawnSync for CLI report extraction Use spawnSync instead of spawn for child processes in createBinRunner. This avoids stdout data loss when child processes call process.exit() before Node.js flushes its internal stream buffer to the pipe. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 72 ++++++++---------------- 1 file changed, 24 insertions(+), 48 deletions(-) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index 3ca8fa2f17..c1bf6e2a20 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -14,58 +14,34 @@ * limitations under the License. */ -import { spawn } from 'node:child_process'; -import os from 'node:os'; -import pLimit from 'p-limit'; - -// Some commands launch full node processes doing heavy work, which at high -// concurrency levels risk exhausting system resources. Placing the limiter here -// at the root level ensures that the concurrency boundary applies globally, not -// just per-runner. -const limiter = pLimit(os.cpus().length); +import { spawnSync } from 'node:child_process'; export function createBinRunner(cwd: string, path: string) { - return async (...command: string[]) => - limiter( - () => - new Promise((resolve, reject) => { - // Handle the case where path is empty and the script path is the first command argument - const args = path ? [path, ...command] : command; - const child = spawn('node', args, { - cwd, - stdio: ['ignore', 'pipe', 'pipe'], - }); + return async (...command: string[]) => { + const args = path ? [path, ...command] : command; + const result = spawnSync('node', args, { + cwd, + stdio: ['ignore', 'pipe', 'pipe'], + maxBuffer: 10 * 1024 * 1024, + }); - let stdout = ''; - let stderr = ''; + if (result.error) { + throw new Error(`Process error: ${result.error.message}`); + } - child.stdout?.on('data', data => { - stdout += data.toString(); - }); + const stderr = result.stderr?.toString() ?? ''; + const stdout = result.stdout?.toString() ?? ''; - child.stderr?.on('data', data => { - stderr += data.toString(); - }); + if (result.signal) { + throw new Error( + `Process was killed with signal ${result.signal}\n${stderr}`, + ); + } else if (result.status !== 0) { + throw new Error(`Process exited with code ${result.status}\n${stderr}`); + } else if (stderr.trim()) { + throw new Error(`Command printed error output: ${stderr}`); + } - child.on('error', err => { - reject(new Error(`Process error: ${err.message}`)); - }); - - child.on('close', (code, signal) => { - if (signal) { - reject( - new Error( - `Process was killed with signal ${signal}\n${stderr}`, - ), - ); - } else if (code !== 0) { - reject(new Error(`Process exited with code ${code}\n${stderr}`)); - } else if (stderr.trim()) { - reject(new Error(`Command printed error output: ${stderr}`)); - } else { - resolve(stdout); - } - }); - }), - ); + return stdout; + }; } From a2653cd11270785c728bceaa6481bb478510f5b8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 26 Feb 2026 23:56:23 +0100 Subject: [PATCH 295/455] Update repo-tools changeset to cover spawnSync change Signed-off-by: Patrik Oldsberg Made-with: Cursor --- .changeset/cli-report-parser-cleye.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/cli-report-parser-cleye.md b/.changeset/cli-report-parser-cleye.md index f805aeb5d4..f374abb097 100644 --- a/.changeset/cli-report-parser-cleye.md +++ b/.changeset/cli-report-parser-cleye.md @@ -2,4 +2,4 @@ '@backstage/repo-tools': patch --- -Updated CLI report parser to support cleye-style help output sections (`USAGE:` and `FLAGS:`). +Updated CLI report parser to support cleye-style help output sections (`USAGE:` and `FLAGS:`). Switched to synchronous child process execution for CLI report extraction to avoid stdout data loss. From d9dde597c9b2cf5c20a0ca4d9cf10f598360c85e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 01:21:53 +0100 Subject: [PATCH 296/455] repo-tools: Redirect child stdout to file for CLI reports Use a temp file instead of a pipe for child process stdout in createBinRunner. Node.js uses a SyncWriteStream for regular files, so all writes complete synchronously before process.exit() can discard them. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 69 ++++++++++++++++-------- 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index c1bf6e2a20..bce2359589 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -15,33 +15,58 @@ */ import { spawnSync } from 'node:child_process'; +import { openSync, closeSync, readFileSync, unlinkSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +/** + * Redirect stdout to a temp file so that Node.js creates a SyncWriteStream + * (synchronous writes) in the child instead of an async pipe stream. This + * prevents data loss when child processes call process.exit() before the + * async stream buffer has been flushed. + */ export function createBinRunner(cwd: string, path: string) { return async (...command: string[]) => { const args = path ? [path, ...command] : command; - const result = spawnSync('node', args, { - cwd, - stdio: ['ignore', 'pipe', 'pipe'], - maxBuffer: 10 * 1024 * 1024, - }); + const outPath = join( + tmpdir(), + `backstage-cli-out-${process.pid}-${Date.now()}.txt`, + ); + const outFd = openSync(outPath, 'w'); - if (result.error) { - throw new Error(`Process error: ${result.error.message}`); + try { + const result = spawnSync('node', args, { + cwd, + stdio: ['ignore', outFd, 'pipe'], + maxBuffer: 10 * 1024 * 1024, + }); + + closeSync(outFd); + const stdout = readFileSync(outPath, 'utf8'); + + if (result.error) { + throw new Error(`Process error: ${result.error.message}`); + } + + const stderr = result.stderr?.toString() ?? ''; + + if (result.signal) { + throw new Error( + `Process was killed with signal ${result.signal}\n${stderr}`, + ); + } else if (result.status !== 0) { + throw new Error(`Process exited with code ${result.status}\n${stderr}`); + } else if (stderr.trim()) { + throw new Error(`Command printed error output: ${stderr}`); + } + + return stdout; + } finally { + try { + unlinkSync(outPath); + } catch { + /* ignore cleanup errors */ + } } - - const stderr = result.stderr?.toString() ?? ''; - const stdout = result.stdout?.toString() ?? ''; - - if (result.signal) { - throw new Error( - `Process was killed with signal ${result.signal}\n${stderr}`, - ); - } else if (result.status !== 0) { - throw new Error(`Process exited with code ${result.status}\n${stderr}`); - } else if (stderr.trim()) { - throw new Error(`Command printed error output: ${stderr}`); - } - - return stdout; }; } From 5e01ab714a1d68091383a1a4135d7fd4543b66f8 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 08:46:44 +0100 Subject: [PATCH 297/455] repo-tools: Add _handle stub preload for file-backed stdout Add a --require preload that stubs process.stdout._handle when stdout is a SyncWriteStream (file-backed). Some CLI code accesses _handle.setBlocking directly and would crash without the stub. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 48 +++++++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index bce2359589..c56a98fc04 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -15,10 +15,42 @@ */ import { spawnSync } from 'node:child_process'; -import { openSync, closeSync, readFileSync, unlinkSync } from 'node:fs'; +import { + openSync, + closeSync, + readFileSync, + unlinkSync, + writeFileSync, +} from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; +// Preload script that stubs process.stdout._handle when stdout is backed by a +// file (SyncWriteStream). Some CLI code accesses _handle.setBlocking directly +// and would crash without this. +const preloadContent = ` +if (process.stdout && !process.stdout._handle) { + process.stdout._handle = { setBlocking() {} }; +} +`; + +let preloadPath: string | undefined; + +function getPreloadPath() { + if (!preloadPath) { + preloadPath = join(tmpdir(), `backstage-stdout-preload-${process.pid}.cjs`); + writeFileSync(preloadPath, preloadContent); + process.on('exit', () => { + try { + unlinkSync(preloadPath!); + } catch { + /* ignore */ + } + }); + } + return preloadPath; +} + /** * Redirect stdout to a temp file so that Node.js creates a SyncWriteStream * (synchronous writes) in the child instead of an async pipe stream. This @@ -35,11 +67,15 @@ export function createBinRunner(cwd: string, path: string) { const outFd = openSync(outPath, 'w'); try { - const result = spawnSync('node', args, { - cwd, - stdio: ['ignore', outFd, 'pipe'], - maxBuffer: 10 * 1024 * 1024, - }); + const result = spawnSync( + 'node', + ['--require', getPreloadPath(), ...args], + { + cwd, + stdio: ['ignore', outFd, 'pipe'], + maxBuffer: 10 * 1024 * 1024, + }, + ); closeSync(outFd); const stdout = readFileSync(outPath, 'utf8'); From 2481126013fad85be8e7f213f5113ae061648bc4 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 08:48:19 +0100 Subject: [PATCH 298/455] Remove setBlocking calls and simplify file-redirect approach Remove fragile process.stdout._handle.setBlocking calls from CLI test commands. Revert the preload workaround in repo-tools since the root cause is removed. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- .../src/modules/test/commands/package/test.ts | 5 -- .../src/modules/test/commands/repo/test.ts | 2 - packages/repo-tools/src/commands/util.ts | 48 +++---------------- 3 files changed, 6 insertions(+), 49 deletions(-) diff --git a/packages/cli/src/modules/test/commands/package/test.ts b/packages/cli/src/modules/test/commands/package/test.ts index c4acfb287b..9c13019bb5 100644 --- a/packages/cli/src/modules/test/commands/package/test.ts +++ b/packages/cli/src/modules/test/commands/package/test.ts @@ -87,11 +87,6 @@ export default async (_opts: OptionValues, cmd: Command) => { }--no-node-snapshot`; } - // This ensures that the process doesn't exit too early before stdout is flushed - if (args.includes('--help')) { - (process.stdout as any)._handle.setBlocking(true); - } - // Because of the ongoing migration to v30 of jest, jest is no longer hard-depended to allow // opt-in migration. Users instead need to add jest as a devDependency themselves and specify // the version they want. This prints a helpful error message if jest is not found, i.e. they diff --git a/packages/cli/src/modules/test/commands/repo/test.ts b/packages/cli/src/modules/test/commands/repo/test.ts index 53f86fd635..bb614798b4 100644 --- a/packages/cli/src/modules/test/commands/repo/test.ts +++ b/packages/cli/src/modules/test/commands/repo/test.ts @@ -304,11 +304,9 @@ export async function command(opts: OptionValues, cmd: Command): Promise { }--no-node-snapshot`; } - // This ensures that the process doesn't exit too early before stdout is flushed if (args.includes('--jest-help')) { removeOptionArg(args, '--jest-help'); args.push('--help'); - (process.stdout as any)._handle.setBlocking(true); } // This code path is enabled by the --successCache flag, which is specific to diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index c56a98fc04..bce2359589 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -15,42 +15,10 @@ */ import { spawnSync } from 'node:child_process'; -import { - openSync, - closeSync, - readFileSync, - unlinkSync, - writeFileSync, -} from 'node:fs'; +import { openSync, closeSync, readFileSync, unlinkSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; -// Preload script that stubs process.stdout._handle when stdout is backed by a -// file (SyncWriteStream). Some CLI code accesses _handle.setBlocking directly -// and would crash without this. -const preloadContent = ` -if (process.stdout && !process.stdout._handle) { - process.stdout._handle = { setBlocking() {} }; -} -`; - -let preloadPath: string | undefined; - -function getPreloadPath() { - if (!preloadPath) { - preloadPath = join(tmpdir(), `backstage-stdout-preload-${process.pid}.cjs`); - writeFileSync(preloadPath, preloadContent); - process.on('exit', () => { - try { - unlinkSync(preloadPath!); - } catch { - /* ignore */ - } - }); - } - return preloadPath; -} - /** * Redirect stdout to a temp file so that Node.js creates a SyncWriteStream * (synchronous writes) in the child instead of an async pipe stream. This @@ -67,15 +35,11 @@ export function createBinRunner(cwd: string, path: string) { const outFd = openSync(outPath, 'w'); try { - const result = spawnSync( - 'node', - ['--require', getPreloadPath(), ...args], - { - cwd, - stdio: ['ignore', outFd, 'pipe'], - maxBuffer: 10 * 1024 * 1024, - }, - ); + const result = spawnSync('node', args, { + cwd, + stdio: ['ignore', outFd, 'pipe'], + maxBuffer: 10 * 1024 * 1024, + }); closeSync(outFd); const stdout = readFileSync(outPath, 'utf8'); From f586daee1f1a1d467dc3e6cca7c7820b411fb971 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 09:59:15 +0100 Subject: [PATCH 299/455] repo-tools: Add debug logging for empty stdout in createBinRunner Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index bce2359589..a67b3335bf 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -15,7 +15,13 @@ */ import { spawnSync } from 'node:child_process'; -import { openSync, closeSync, readFileSync, unlinkSync } from 'node:fs'; +import { + openSync, + closeSync, + readFileSync, + unlinkSync, + statSync, +} from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; @@ -42,8 +48,19 @@ export function createBinRunner(cwd: string, path: string) { }); closeSync(outFd); + const fileSize = statSync(outPath).size; const stdout = readFileSync(outPath, 'utf8'); + // Temporary debug: log when file redirect produces no output + if (stdout.length === 0) { + console.error( + `[createBinRunner debug] empty stdout for: node ${args.join(' ')} ` + + `(exit=${result.status}, fileSize=${fileSize}, stderr=${( + result.stderr?.toString() ?? '' + ).slice(0, 200)})`, + ); + } + if (result.error) { throw new Error(`Process error: ${result.error.message}`); } From b7c9a8df12986d0145fc268d228f8b2694d89a76 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 10:11:23 +0100 Subject: [PATCH 300/455] repo-tools: Add module-level debug log to verify util.ts is loaded Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index a67b3335bf..a3db36d2e8 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -25,6 +25,8 @@ import { import { tmpdir } from 'node:os'; import { join } from 'node:path'; +console.error('[util.ts] createBinRunner module loaded'); + /** * Redirect stdout to a temp file so that Node.js creates a SyncWriteStream * (synchronous writes) in the child instead of an async pipe stream. This From 3a1054f51d0dbe8a002d75fed424cd486f800d16 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 10:21:09 +0100 Subject: [PATCH 301/455] repo-tools: Log stdout content when help markers missing Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index a3db36d2e8..c64368f169 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -53,13 +53,15 @@ export function createBinRunner(cwd: string, path: string) { const fileSize = statSync(outPath).size; const stdout = readFileSync(outPath, 'utf8'); - // Temporary debug: log when file redirect produces no output - if (stdout.length === 0) { + // Temporary debug: log stdout when no help markers found + if (!stdout.includes('Usage:') && !stdout.includes('USAGE:')) { console.error( - `[createBinRunner debug] empty stdout for: node ${args.join(' ')} ` + - `(exit=${result.status}, fileSize=${fileSize}, stderr=${( - result.stderr?.toString() ?? '' - ).slice(0, 200)})`, + `[createBinRunner debug] no help markers for: node ${args.join( + ' ', + )} ` + + `(exit=${result.status}, size=${fileSize}, content=${JSON.stringify( + stdout.slice(0, 300), + )})`, ); } From f2a8299d7a51c98624f3c5d7053257210d308d3d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 10:33:15 +0100 Subject: [PATCH 302/455] repo-tools: Log all command outputs for debugging Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index c64368f169..11f44a15d6 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -53,17 +53,14 @@ export function createBinRunner(cwd: string, path: string) { const fileSize = statSync(outPath).size; const stdout = readFileSync(outPath, 'utf8'); - // Temporary debug: log stdout when no help markers found - if (!stdout.includes('Usage:') && !stdout.includes('USAGE:')) { - console.error( - `[createBinRunner debug] no help markers for: node ${args.join( - ' ', - )} ` + - `(exit=${result.status}, size=${fileSize}, content=${JSON.stringify( - stdout.slice(0, 300), - )})`, - ); - } + // Temporary debug: log first 200 chars of every command + console.error( + `[debug] ${args + .slice(-2) + .join(' ')} size=${fileSize} out=${JSON.stringify( + stdout.slice(0, 200), + )}`, + ); if (result.error) { throw new Error(`Process error: ${result.error.message}`); From aac8cd4cc27ed3ec4677ad90fcce155bfd9441fd Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 10:45:56 +0100 Subject: [PATCH 303/455] repo-tools: Strip ANSI codes and set NO_COLOR for CLI report extraction Cleye outputs ANSI bold escape sequences around section headers (e.g. Usage:, Flags:) unconditionally, which prevented the help page parser from recognizing them. Strip ANSI SGR sequences from captured output and set NO_COLOR=1 in the child environment. Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 25 +++++------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index 11f44a15d6..2d7425336b 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -15,17 +15,12 @@ */ import { spawnSync } from 'node:child_process'; -import { - openSync, - closeSync, - readFileSync, - unlinkSync, - statSync, -} from 'node:fs'; +import { openSync, closeSync, readFileSync, unlinkSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; -console.error('[util.ts] createBinRunner module loaded'); +// Matches ANSI SGR escape sequences (e.g. bold, color, reset) +const ansiPattern = new RegExp(`${String.fromCharCode(0x1b)}\\[[0-9;]*m`, 'g'); /** * Redirect stdout to a temp file so that Node.js creates a SyncWriteStream @@ -45,22 +40,12 @@ export function createBinRunner(cwd: string, path: string) { try { const result = spawnSync('node', args, { cwd, + env: { ...process.env, NO_COLOR: '1' }, stdio: ['ignore', outFd, 'pipe'], - maxBuffer: 10 * 1024 * 1024, }); closeSync(outFd); - const fileSize = statSync(outPath).size; - const stdout = readFileSync(outPath, 'utf8'); - - // Temporary debug: log first 200 chars of every command - console.error( - `[debug] ${args - .slice(-2) - .join(' ')} size=${fileSize} out=${JSON.stringify( - stdout.slice(0, 200), - )}`, - ); + const stdout = readFileSync(outPath, 'utf8').replace(ansiPattern, ''); if (result.error) { throw new Error(`Process error: ${result.error.message}`); From 37a309e7e20afd33e5ec1bac2553ca5b2b3da9a8 Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Fri, 27 Feb 2026 12:04:16 +0100 Subject: [PATCH 304/455] Update .changeset/slow-items-pull.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Gabriel Dugny --- .changeset/slow-items-pull.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/slow-items-pull.md b/.changeset/slow-items-pull.md index 50f4897fa5..e3fe6e26c5 100644 --- a/.changeset/slow-items-pull.md +++ b/.changeset/slow-items-pull.md @@ -2,7 +2,7 @@ '@backstage/create-app': patch --- -Replace `package.json` deprecated `workspaces.packages` by `workspaces` +Replace deprecated `workspaces.packages` with `workspaces` in `package.json` This change is **not** required, but you can edit your main `package.json`, to fit the more modern & more common pattern: From 154492c05f68d63e1764bea1c8a691b280f6c0d8 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Thu, 26 Feb 2026 16:41:56 +0100 Subject: [PATCH 305/455] chore(ui): add use-sync-external-store dependency Signed-off-by: Johan Persson --- packages/ui/package.json | 4 +++- yarn.lock | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index e43f31c6c4..311153eddc 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -50,12 +50,14 @@ "@remixicon/react": "^4.6.0", "@tanstack/react-table": "^8.21.3", "clsx": "^2.1.1", - "react-aria-components": "^1.14.0" + "react-aria-components": "^1.14.0", + "use-sync-external-store": "^1.4.0" }, "devDependencies": { "@backstage/cli": "workspace:^", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", + "@types/use-sync-external-store": "^0.0.6", "eslint-plugin-storybook": "^10.3.0-alpha.1", "glob": "^11.0.1", "globals": "^15.11.0", diff --git a/yarn.lock b/yarn.lock index 9a951c6f98..7a50733f03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8111,6 +8111,7 @@ __metadata: "@tanstack/react-table": "npm:^8.21.3" "@types/react": "npm:^18.0.0" "@types/react-dom": "npm:^18.0.0" + "@types/use-sync-external-store": "npm:^0.0.6" clsx: "npm:^2.1.1" eslint-plugin-storybook: "npm:^10.3.0-alpha.1" glob: "npm:^11.0.1" @@ -8120,6 +8121,7 @@ __metadata: react-dom: "npm:^18.0.2" react-router-dom: "npm:^6.30.2" storybook: "npm:^10.3.0-alpha.1" + use-sync-external-store: "npm:^1.4.0" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 From b39c2d3893ed5d67e8e18d212ba0a1bfce36f271 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Thu, 26 Feb 2026 16:45:46 +0100 Subject: [PATCH 306/455] perf(ui): rewrite useBreakpoint with singleton useSyncExternalStore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace per-instance useState + matchMedia pattern with a module-level singleton that shares 6 matchMedia listeners across all callers. Reduces listener count from 18×N to a fixed 6. Signed-off-by: Johan Persson --- packages/ui/src/hooks/useBreakpoint.ts | 111 ++++++++++++++++++------- 1 file changed, 81 insertions(+), 30 deletions(-) diff --git a/packages/ui/src/hooks/useBreakpoint.ts b/packages/ui/src/hooks/useBreakpoint.ts index ac2d0567be..b870033f8d 100644 --- a/packages/ui/src/hooks/useBreakpoint.ts +++ b/packages/ui/src/hooks/useBreakpoint.ts @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { useMediaQuery } from './useMediaQuery'; +import { useMemo } from 'react'; +import { useSyncExternalStore } from 'use-sync-external-store/shim'; import type { Breakpoint } from '../types'; export const breakpoints: { name: string; id: Breakpoint; value: number }[] = [ @@ -25,40 +26,90 @@ export const breakpoints: { name: string; id: Breakpoint; value: number }[] = [ { name: 'Extra Large', id: 'xl', value: 1536 }, ]; -/** @public */ -export const useBreakpoint = () => { - // Call all media queries at the top level - const matches = breakpoints.map(breakpoint => { - return useMediaQuery(`(min-width: ${breakpoint.value}px)`); - }); +const breakpointIndex = new Map( + breakpoints.map((bp, i) => [bp.id, i]), +); - // Pre-calculate all the up/down values we need - const upMatches = new Map( - breakpoints.map(bp => [bp.id, useMediaQuery(`(min-width: ${bp.value}px)`)]), - ); +function bpIndex(key: Breakpoint): number { + return breakpointIndex.get(key) ?? 0; +} - const downMatches = new Map( - breakpoints.map(bp => [ - bp.id, - useMediaQuery(`(max-width: ${bp.value - 1}px)`), - ]), - ); +const IS_SERVER = + typeof window === 'undefined' || typeof window.matchMedia === 'undefined'; - let breakpoint: Breakpoint = breakpoints[0].id; - for (let i = matches.length - 1; i >= 0; i--) { - if (matches[i]) { - breakpoint = breakpoints[i].id; - break; +function computeBreakpoint(): Breakpoint { + if (IS_SERVER) { + return 'initial'; + } + for (let i = breakpoints.length - 1; i >= 0; i--) { + if (window.matchMedia(`(min-width: ${breakpoints[i].value}px)`).matches) { + return breakpoints[i].id; } } + return 'initial'; +} - return { - breakpoint, - up: (key: Breakpoint): boolean => { - return upMatches.get(key) ?? false; - }, - down: (key: Breakpoint): boolean => { - return downMatches.get(key) ?? false; - }, +// --- Singleton store --- +// Created lazily on first subscribe/getSnapshot call. + +let current: Breakpoint | undefined; +let listeners: Set<() => void> | undefined; +let initialized = false; + +function ensureInitialized(): void { + if (initialized || IS_SERVER) { + return; + } + initialized = true; + current = computeBreakpoint(); + listeners = new Set(); + + for (const bp of breakpoints) { + const mql = window.matchMedia(`(min-width: ${bp.value}px)`); + const onChange = () => { + const next = computeBreakpoint(); + if (next !== current) { + current = next; + for (const cb of listeners!) { + cb(); + } + } + }; + mql.addEventListener('change', onChange); + } +} + +function subscribe(callback: () => void): () => void { + ensureInitialized(); + listeners!.add(callback); + return () => { + listeners!.delete(callback); }; +} + +function getSnapshot(): Breakpoint { + ensureInitialized(); + return current!; +} + +function getServerSnapshot(): Breakpoint { + return 'initial'; +} + +/** @public */ +export const useBreakpoint = () => { + const breakpoint = useSyncExternalStore( + subscribe, + getSnapshot, + getServerSnapshot, + ); + + return useMemo( + () => ({ + breakpoint, + up: (key: Breakpoint): boolean => bpIndex(breakpoint) >= bpIndex(key), + down: (key: Breakpoint): boolean => bpIndex(breakpoint) < bpIndex(key), + }), + [breakpoint], + ); }; From cd3cb0f35a29c405919d9fe0003f803a7c67847a Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Thu, 26 Feb 2026 16:46:53 +0100 Subject: [PATCH 307/455] chore: add changeset for useBreakpoint performance improvement Signed-off-by: Johan Persson --- .changeset/violet-friends-buy.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/violet-friends-buy.md diff --git a/.changeset/violet-friends-buy.md b/.changeset/violet-friends-buy.md new file mode 100644 index 0000000000..a2a620b870 --- /dev/null +++ b/.changeset/violet-friends-buy.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Improved `useBreakpoint` performance by sharing a single set of `matchMedia` listeners across all component instances instead of creating independent listeners per hook call. From f10b3b8d7d931457218719cb7a939b1250f15f59 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Fri, 27 Feb 2026 09:46:18 +0100 Subject: [PATCH 308/455] refactor(ui): simplify useBreakpoint singleton store Initialize listeners as an eager Set to eliminate the undefined union type and non-null assertions. Add comment explaining the change listener algorithm. Signed-off-by: Johan Persson --- packages/ui/src/hooks/useBreakpoint.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/hooks/useBreakpoint.ts b/packages/ui/src/hooks/useBreakpoint.ts index b870033f8d..7364fb29d0 100644 --- a/packages/ui/src/hooks/useBreakpoint.ts +++ b/packages/ui/src/hooks/useBreakpoint.ts @@ -50,10 +50,11 @@ function computeBreakpoint(): Breakpoint { } // --- Singleton store --- -// Created lazily on first subscribe/getSnapshot call. +// `current` is initialized lazily on first client-side access. +// `listeners` is eagerly initialized since Set is safe to create on the server. let current: Breakpoint | undefined; -let listeners: Set<() => void> | undefined; +const listeners = new Set<() => void>(); let initialized = false; function ensureInitialized(): void { @@ -62,34 +63,35 @@ function ensureInitialized(): void { } initialized = true; current = computeBreakpoint(); - listeners = new Set(); + // Register one listener per breakpoint. When any query fires, re-evaluate + // all breakpoints to find the new active one. Notify subscribers only if + // the active breakpoint actually changed. for (const bp of breakpoints) { const mql = window.matchMedia(`(min-width: ${bp.value}px)`); - const onChange = () => { + mql.addEventListener('change', () => { const next = computeBreakpoint(); if (next !== current) { current = next; - for (const cb of listeners!) { + for (const cb of listeners) { cb(); } } - }; - mql.addEventListener('change', onChange); + }); } } function subscribe(callback: () => void): () => void { ensureInitialized(); - listeners!.add(callback); + listeners.add(callback); return () => { - listeners!.delete(callback); + listeners.delete(callback); }; } function getSnapshot(): Breakpoint { ensureInitialized(); - return current!; + return current ?? 'initial'; } function getServerSnapshot(): Breakpoint { From 33324d45ac56ba62fcdfff4c8dd10a10facdfd56 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Fri, 27 Feb 2026 11:54:18 +0100 Subject: [PATCH 309/455] docs(ui): clarify module-scoped singleton in useBreakpoint Signed-off-by: Johan Persson --- packages/ui/src/hooks/useBreakpoint.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/hooks/useBreakpoint.ts b/packages/ui/src/hooks/useBreakpoint.ts index 7364fb29d0..bd37eec4c4 100644 --- a/packages/ui/src/hooks/useBreakpoint.ts +++ b/packages/ui/src/hooks/useBreakpoint.ts @@ -49,9 +49,12 @@ function computeBreakpoint(): Breakpoint { return 'initial'; } -// --- Singleton store --- +// --- Module-scoped singleton store --- +// This is intentionally not a global singleton. Multiple copies of this module +// (e.g. different package versions or module federation remotes) each get their +// own store. This avoids cross-version coupling at the cost of a few extra +// listeners, which is a fine trade-off. // `current` is initialized lazily on first client-side access. -// `listeners` is eagerly initialized since Set is safe to create on the server. let current: Breakpoint | undefined; const listeners = new Set<() => void>(); From 98103107817e4e6869b9c26da0dad570ce3013ff Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 12:56:54 +0100 Subject: [PATCH 310/455] Update changeset messages per review feedback Signed-off-by: Patrik Oldsberg Made-with: Cursor --- .changeset/cli-execute-loader.md | 2 +- .changeset/cli-report-parser-cleye.md | 2 +- .github/vale/config/vocabularies/Backstage/accept.txt | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.changeset/cli-execute-loader.md b/.changeset/cli-execute-loader.md index 4636468864..ce9665e01d 100644 --- a/.changeset/cli-execute-loader.md +++ b/.changeset/cli-execute-loader.md @@ -2,4 +2,4 @@ '@backstage/cli': patch --- -Added support for lazy loading of CLI command implementations through a new loader pattern for `BackstageCommand.execute`. +Internal refactor of CLI modularization, moving individual commands to be implemented with cleye. diff --git a/.changeset/cli-report-parser-cleye.md b/.changeset/cli-report-parser-cleye.md index f374abb097..f8d9141c66 100644 --- a/.changeset/cli-report-parser-cleye.md +++ b/.changeset/cli-report-parser-cleye.md @@ -2,4 +2,4 @@ '@backstage/repo-tools': patch --- -Updated CLI report parser to support cleye-style help output sections (`USAGE:` and `FLAGS:`). Switched to synchronous child process execution for CLI report extraction to avoid stdout data loss. +Updated the CLI report parser to support cleye-style help output, and strip ANSI escape codes from captured output. diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index f6f37b17cf..cbe8ee2adf 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -576,3 +576,4 @@ zsh resizable enums LLMs +cleye From 9027b10643eb495153806d0958840a9991c5b4d1 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Fri, 27 Feb 2026 13:10:13 +0100 Subject: [PATCH 311/455] fix(ui): fix scroll overflow in Menu and Select popovers When viewport height constrains the popover, content now scrolls instead of overflowing. - Menu: add flex column layout and overflow hidden to .bui-MenuInner - Select: add overflow auto and min-height 0 to .bui-SelectList Signed-off-by: Johan Persson --- .changeset/khaki-days-arrive.md | 7 +++++++ packages/ui/src/components/Menu/Menu.module.css | 4 ++++ .../ui/src/components/Select/Select.module.css | 17 +++++++++++------ 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 .changeset/khaki-days-arrive.md diff --git a/.changeset/khaki-days-arrive.md b/.changeset/khaki-days-arrive.md new file mode 100644 index 0000000000..ac9d97c394 --- /dev/null +++ b/.changeset/khaki-days-arrive.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Fixed scroll overflow in Menu and Select popover content when constrained by viewport height. + +**Affected components:** Menu, Select diff --git a/packages/ui/src/components/Menu/Menu.module.css b/packages/ui/src/components/Menu/Menu.module.css index 0717a9468d..e16f87ee5a 100644 --- a/packages/ui/src/components/Menu/Menu.module.css +++ b/packages/ui/src/components/Menu/Menu.module.css @@ -58,6 +58,10 @@ .bui-MenuInner { border-radius: var(--menu-border-radius); + display: flex; + flex-direction: column; + min-height: 0; + overflow: hidden; } .bui-MenuContent { diff --git a/packages/ui/src/components/Select/Select.module.css b/packages/ui/src/components/Select/Select.module.css index 3a5d066d1d..8ceaa2528e 100644 --- a/packages/ui/src/components/Select/Select.module.css +++ b/packages/ui/src/components/Select/Select.module.css @@ -116,12 +116,17 @@ } } - .bui-SelectList:focus-visible { - /* Remove default focus-visible outline because React Aria - * triggers it on mouse click open of the list for some reason. - * On keyboard use, the top item receives the focus style, - * so it's not needed anyway. */ - outline: none; + .bui-SelectList { + overflow: auto; + min-height: 0; + + &:focus-visible { + /* Remove default focus-visible outline because React Aria + * triggers it on mouse click open of the list for some reason. + * On keyboard use, the top item receives the focus style, + * so it's not needed anyway. */ + outline: none; + } } .bui-SelectItem { From 992e37b93f48062cd7732dbe98b6db9c221c0e60 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 27 Feb 2026 14:56:22 +0100 Subject: [PATCH 312/455] repo-tools: Use randomUUID for temp files and document sequential execution Signed-off-by: Patrik Oldsberg Made-with: Cursor --- packages/repo-tools/src/commands/util.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index 2d7425336b..bb29cdf441 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -15,6 +15,7 @@ */ import { spawnSync } from 'node:child_process'; +import { randomUUID } from 'node:crypto'; import { openSync, closeSync, readFileSync, unlinkSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; @@ -27,14 +28,14 @@ const ansiPattern = new RegExp(`${String.fromCharCode(0x1b)}\\[[0-9;]*m`, 'g'); * (synchronous writes) in the child instead of an async pipe stream. This * prevents data loss when child processes call process.exit() before the * async stream buffer has been flushed. + * + * Uses spawnSync which blocks the event loop, so no concurrency limiter is + * needed — each call naturally runs sequentially. */ export function createBinRunner(cwd: string, path: string) { return async (...command: string[]) => { const args = path ? [path, ...command] : command; - const outPath = join( - tmpdir(), - `backstage-cli-out-${process.pid}-${Date.now()}.txt`, - ); + const outPath = join(tmpdir(), `backstage-cli-out-${randomUUID()}.txt`); const outFd = openSync(outPath, 'w'); try { From 06366a7fa4eb546bb64e7eb66a15520e3ff41aff Mon Sep 17 00:00:00 2001 From: aramissennyeydd Date: Fri, 27 Feb 2026 10:07:15 -0500 Subject: [PATCH 313/455] fix prettier Signed-off-by: aramissennyeydd --- docs/getting-started/filter-catalog.md | 1 + docs/getting-started/unregister-delete-component.md | 1 + docs/getting-started/viewing-entity-relationships.md | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/docs/getting-started/filter-catalog.md b/docs/getting-started/filter-catalog.md index 742f982013..3e0de8cdeb 100644 --- a/docs/getting-started/filter-catalog.md +++ b/docs/getting-started/filter-catalog.md @@ -27,6 +27,7 @@ You can filter the Catalog using a combination of the following: - **Filter by kind** Use the `Kind` dropdown list to select which kind of entity to show in the list: + - API - Component - Group diff --git a/docs/getting-started/unregister-delete-component.md b/docs/getting-started/unregister-delete-component.md index 196b0202ba..f8034bf3ed 100644 --- a/docs/getting-started/unregister-delete-component.md +++ b/docs/getting-started/unregister-delete-component.md @@ -39,6 +39,7 @@ You can also delete an entity from the Catalog. However, this requires that you To delete an entity: 1. Delete the following entity definition files for the entity in the repository: + - catalog-info.yaml - index.js - package.json diff --git a/docs/getting-started/viewing-entity-relationships.md b/docs/getting-started/viewing-entity-relationships.md index 087f86014c..c791ab5bc7 100644 --- a/docs/getting-started/viewing-entity-relationships.md +++ b/docs/getting-started/viewing-entity-relationships.md @@ -43,6 +43,7 @@ To display the Catalog Graph: The `Catalog Graph` automatically reflects any changes you make to the filter settings. You can set the following filters: - `MAX DEPTH` + - `MAX DEPTH` = 1 ![Max Depth at 1](../assets/uiguide/max-depth-1.png) @@ -59,6 +60,7 @@ The `Catalog Graph` automatically reflects any changes you make to the filter se - Left to right - Right to left - `Curve` + - `Curve` = Monotone ![Curve at Monotone.](../assets/uiguide/curve-monotone.png) @@ -73,10 +75,12 @@ You can also toggle: - On = simple view - Off = detailed view - `Merge relations` + - On = You see the relationship from the selected entity to the nodes and from the nodes to the selected entity. - Off = You only see relations from the selected entity to its nodes. The following graphics illustrate the view of the nodes and relationships, based on the combination of the settings of `Simplified` and `Merge relations`. + - `Simplified` = On and `Merge Relations` = On ![Simplified is On and Merge Relations is On.](../assets/uiguide/simplify-on-merge-relations-on.png) From 1caca7b0c34bc2a9151653a210113182c3e62145 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:56:53 -0500 Subject: [PATCH 314/455] Update redirect from '/docs' back to what-is-backstage Undo change to redirect to new landing page. That will be in a separate PR. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- microsite/docusaurus.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/docusaurus.config.ts b/microsite/docusaurus.config.ts index a3ab5f1466..ce75a2e063 100644 --- a/microsite/docusaurus.config.ts +++ b/microsite/docusaurus.config.ts @@ -209,7 +209,7 @@ const config: Config = { redirects: [ { from: '/docs', - to: '/docs/landing-page/doc-landing-page', + to: '/docs/overview/what-is-backstage', }, { from: '/docs/features/software-catalog/software-catalog-overview', From 2e20bf20d76c1fc31e1933c6a8feb1c5780d4ddb Mon Sep 17 00:00:00 2001 From: Bond Yan Date: Fri, 27 Feb 2026 11:15:27 -0500 Subject: [PATCH 315/455] changeset typo Signed-off-by: Bond Yan --- .changeset/crazy-ravens-reply.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/crazy-ravens-reply.md b/.changeset/crazy-ravens-reply.md index 48bc36c464..d52b62880e 100644 --- a/.changeset/crazy-ravens-reply.md +++ b/.changeset/crazy-ravens-reply.md @@ -3,4 +3,4 @@ '@backstage/plugin-techdocs-node': patch --- -Added `techdocs.generator.mkdocs.dangerouslyAllowAdditionalKeys` configuration option to explicit bypass MkDocs configuration key restrictions. This enables support for additional MkDocs configuration keys beyond the default safe allowlist, such as the `hooks` key which some MkDocs plugins require. +Added `techdocs.generator.mkdocs.dangerouslyAllowAdditionalKeys` configuration option to explicitly bypass MkDocs configuration key restrictions. This enables support for additional MkDocs configuration keys beyond the default safe allow list, such as the `hooks` key which some MkDocs plugins require. From e363e8265dd8f9b3a25780dabf79887fb35df0c6 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 24 Feb 2026 09:33:05 +0100 Subject: [PATCH 316/455] Migrate Avatar component from useStyles to useDefinition Replace ComponentDefinition with defineComponent pattern, move CSS module import and prop defaults into the definition, and switch the component to useDefinition hook. Signed-off-by: Johan Persson --- packages/ui/report.api.md | 18 ++++++++-- packages/ui/src/components/Avatar/Avatar.tsx | 34 ++++++------------- .../ui/src/components/Avatar/definition.ts | 19 ++++++++--- packages/ui/src/components/Avatar/types.ts | 11 ++++++ 4 files changed, 51 insertions(+), 31 deletions(-) diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index 1a015747a8..4a94c2fd9f 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -256,13 +256,27 @@ export const Avatar: ForwardRefExoticComponent< // @public export const AvatarDefinition: { + readonly styles: { + readonly [key: string]: string; + }; readonly classNames: { readonly root: 'bui-AvatarRoot'; readonly image: 'bui-AvatarImage'; readonly fallback: 'bui-AvatarFallback'; }; - readonly dataAttributes: { - readonly size: readonly ['small', 'medium', 'large']; + readonly propDefs: { + readonly size: { + readonly dataAttribute: true; + readonly default: 'medium'; + }; + readonly purpose: { + readonly default: 'informative'; + }; + readonly src: {}; + readonly name: {}; + readonly children: {}; + readonly className: {}; + readonly style: {}; }; }; diff --git a/packages/ui/src/components/Avatar/Avatar.tsx b/packages/ui/src/components/Avatar/Avatar.tsx index 920a9b127f..c36c5f02a0 100644 --- a/packages/ui/src/components/Avatar/Avatar.tsx +++ b/packages/ui/src/components/Avatar/Avatar.tsx @@ -15,24 +15,18 @@ */ import { forwardRef, useState, useEffect } from 'react'; -import clsx from 'clsx'; import { AvatarProps } from './types'; -import { useStyles } from '../../hooks/useStyles'; +import { useDefinition } from '../../hooks/useDefinition'; import { AvatarDefinition } from './definition'; -import styles from './Avatar.module.css'; /** @public */ export const Avatar = forwardRef((props, ref) => { - const { classNames, dataAttributes, cleanedProps } = useStyles( + const { ownProps, restProps, dataAttributes } = useDefinition( AvatarDefinition, - { - size: 'medium', - purpose: 'informative', - ...props, - }, + props, ); - const { className, src, name, purpose, ...rest } = cleanedProps; + const { classes, size, src, name, purpose, style } = ownProps; const [imageStatus, setImageStatus] = useState< 'loading' | 'loaded' | 'error' @@ -51,9 +45,7 @@ export const Avatar = forwardRef((props, ref) => { }; }, [src]); - const initialsCount = ['x-small', 'small'].includes(cleanedProps.size) - ? 1 - : 2; + const initialsCount = ['x-small', 'small'].includes(size) ? 1 : 2; const initials = name .split(' ') @@ -68,21 +60,15 @@ export const Avatar = forwardRef((props, ref) => { role="img" aria-label={purpose === 'informative' ? name : undefined} aria-hidden={purpose === 'decoration' ? true : undefined} - className={clsx(classNames.root, styles[classNames.root], className)} + className={classes.root} + style={style} {...dataAttributes} - {...rest} + {...restProps} > {imageStatus === 'loaded' ? ( - + ) : ( -

    ({ + id: labelKey, key: labelKey, value: labels[labelKey], }))} - options={{ - search: false, - showTitle: true, - loadingType: 'linear', - header: false, - padding: 'dense', - pageSize: 5, - toolbar: false, - paging: Object.keys(labels).length > 5, - }} + pagination={{ type: 'none' }} /> )} From 951997f7f0813b753cbd1f943d6faa34539d2bb6 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 11:27:19 +0100 Subject: [PATCH 418/455] refactor(org): use BUI Avatar in GroupProfileCard and UserProfileCard titles Signed-off-by: Johan Persson --- .../Group/GroupProfile/GroupProfileCard.tsx | 21 +-- .../User/UserProfileCard/UserProfileCard.tsx | 121 +++++++++--------- 2 files changed, 70 insertions(+), 72 deletions(-) diff --git a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx index 1cda4c7399..0bd1100633 100644 --- a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx +++ b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx @@ -22,8 +22,7 @@ import { RELATION_PARENT_OF, stringifyEntityRef, } from '@backstage/catalog-model'; -import { Avatar, Link } from '@backstage/core-components'; -import Box from '@material-ui/core/Box'; +import { Link } from '@backstage/core-components'; import IconButton from '@material-ui/core/IconButton'; import List from '@material-ui/core/List'; import ListItem from '@material-ui/core/ListItem'; @@ -53,7 +52,7 @@ import { catalogEntityRefreshPermission } from '@backstage/plugin-catalog-common import { useTranslationRef } from '@backstage/frontend-plugin-api'; import { orgTranslationRef } from '../../../../translation'; import { makeStyles } from '@material-ui/core/styles'; -import { Flex, Text } from '@backstage/ui'; +import { Avatar, Flex, Box, Text } from '@backstage/ui'; const useStyles = makeStyles(theme => ({ container: { @@ -68,9 +67,14 @@ const useStyles = makeStyles(theme => ({ }, })); -const CardTitle = (props: { title: string }) => ( - - +const CardTitle = (props: { title: string; pictureSrc?: string }) => ( + + {props.title} ); @@ -150,7 +154,7 @@ export const GroupProfileCard = (props: { return ( } + title={} headerActions={ <> {allowRefresh && canRefresh && ( @@ -167,8 +171,7 @@ export const GroupProfileCard = (props: { } > {description && {description}} - - + diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx index 67c0a2c52a..12a996cb4b 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx @@ -19,11 +19,10 @@ import { RELATION_MEMBER_OF, UserEntity, } from '@backstage/catalog-model'; -import { Avatar, Link } from '@backstage/core-components'; +import { Link } from '@backstage/core-components'; import { EntityInfoCard } from '@backstage/plugin-catalog-react'; -import { Flex, Text } from '@backstage/ui'; +import { Avatar, Box, Flex, Text } from '@backstage/ui'; import { createStyles, makeStyles } from '@material-ui/core/styles'; -import Grid from '@material-ui/core/Grid'; import BaseButton from '@material-ui/core/ButtonBase'; import IconButton from '@material-ui/core/IconButton'; import List from '@material-ui/core/List'; @@ -48,7 +47,6 @@ import EditIcon from '@material-ui/icons/Edit'; import EmailIcon from '@material-ui/icons/Email'; import GroupIcon from '@material-ui/icons/Group'; import { LinksGroup } from '../../Meta'; -import PersonIcon from '@material-ui/icons/Person'; import { useCallback, useState } from 'react'; import { useTranslationRef } from '@backstage/frontend-plugin-api'; @@ -80,10 +78,15 @@ const useStyles = makeStyles( { name: 'PluginOrgUserProfileCard' }, ); -const CardTitle = (props: { title?: string }) => +const CardTitle = (props: { title: string; pictureSrc?: string }) => props.title ? ( - - + + {props.title} ) : null; @@ -132,7 +135,7 @@ export const UserProfileCard = (props: { return ( } + title={} headerActions={ <> {entityMetadataEditUrl && ( @@ -149,62 +152,54 @@ export const UserProfileCard = (props: { } > {description && {description}} - - - - + + + {profile?.email && ( + + + + + + + + {profile.email} + + + )} - - - {profile?.email && ( - - - - - - - - {profile.email} - - - )} - - {maxRelations === undefined || maxRelations > 0 ? ( - - - - - - - - - {maxRelations && memberOfRelations.length > maxRelations ? ( - <> - , - - {t('userProfileCard.moreGroupButtonTitle', { - number: String( - memberOfRelations.length - maxRelations, - ), - })} - - - ) : null} - - - ) : null} - {props?.showLinks && } - - - + {maxRelations === undefined || maxRelations > 0 ? ( + + + + + + + + + {maxRelations && memberOfRelations.length > maxRelations ? ( + <> + , + + {t('userProfileCard.moreGroupButtonTitle', { + number: String(memberOfRelations.length - maxRelations), + })} + + + ) : null} + + + ) : null} + {props?.showLinks && } + + Date: Mon, 2 Mar 2026 11:55:14 +0100 Subject: [PATCH 419/455] test(org): update UserProfileCard test for BUI Avatar Signed-off-by: Johan Persson --- .../Cards/User/UserProfileCard/UserProfileCard.test.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx index b5932dfb8e..d1ecc09b01 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx @@ -61,10 +61,10 @@ describe('UserSummary Test', () => { ); expect(screen.getByText('calum-leavy@example.com')).toBeInTheDocument(); - expect(screen.getByAltText('Calum Leavy')).toHaveAttribute( - 'src', - 'https://example.com/staff/calum.jpeg', - ); + // BUI Avatar is decorative (aria-hidden), so the name must be + // present as text for the information to be accessible. + expect(screen.getByRole('img', { hidden: true })).toBeInTheDocument(); + expect(screen.getByText('Calum Leavy')).toBeInTheDocument(); expect(screen.getByText('examplegroup').closest('a')).toHaveAttribute( 'href', '/catalog/default/group/examplegroup', From 99ef00b4e4bc65ebd4062f35ca840ab003ba9ba7 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 12:27:27 +0100 Subject: [PATCH 420/455] chore: update changeset and API reports Signed-off-by: Johan Persson --- .changeset/thirty-kiwis-trade.md | 4 +--- plugins/catalog/report.api.md | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.changeset/thirty-kiwis-trade.md b/.changeset/thirty-kiwis-trade.md index e84fafd525..b2cdc5fb01 100644 --- a/.changeset/thirty-kiwis-trade.md +++ b/.changeset/thirty-kiwis-trade.md @@ -4,6 +4,4 @@ '@backstage/plugin-org': patch --- -Added `EntityInfoCard` component to `@backstage/plugin-catalog-react` as a BUI-based card wrapper for entity page cards. Migrated `EntityAboutCard`, `EntityLinksCard`, `EntityLabelsCard`, `GroupProfileCard`, and `UserProfileCard` from MUI/InfoCard to use the new BUI card layout. - -**Affected components:** EntityInfoCard, EntityAboutCard, EntityLinksCard, EntityLabelsCard, GroupProfileCard, UserProfileCard +Added `EntityInfoCard` component to `@backstage/plugin-catalog-react` as a BUI-based card wrapper for entity page cards. Migrated `EntityAboutCard`, `EntityLinksCard`, `EntityLabelsCard`, `GroupProfileCard`, and `UserProfileCard` from MUI/InfoCard to use the new BUI card layout. Replaced MUI ImageList and Grid internals in LinksGridList and AboutContent with BUI Grid. Migrated EntityLabelsCard from core-components Table to BUI Table. Updated GroupProfileCard and UserProfileCard to use BUI Avatar in card titles. diff --git a/plugins/catalog/report.api.md b/plugins/catalog/report.api.md index f0696387fb..4539364917 100644 --- a/plugins/catalog/report.api.md +++ b/plugins/catalog/report.api.md @@ -8,6 +8,7 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CatalogApi } from '@backstage/plugin-catalog-react'; import { ComponentEntity } from '@backstage/catalog-model'; import { CompoundEntityRef } from '@backstage/catalog-model'; +import { CSSProperties } from 'react'; import { DomainEntity } from '@backstage/catalog-model'; import { ElementType } from 'react'; import { Entity } from '@backstage/catalog-model'; @@ -68,6 +69,8 @@ export interface AboutFieldProps { // (undocumented) label: string; // (undocumented) + style?: CSSProperties; + // (undocumented) value?: string; } From be4810234c5975f8a913289d0aa54a8d547945e0 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 14:58:50 +0100 Subject: [PATCH 421/455] chore: polish comments. Signed-off-by: Johan Persson --- .../src/components/EntityInfoCard/EntityInfoCard.test.tsx | 2 +- .../src/components/EntityInfoCard/EntityInfoCard.tsx | 2 +- .../Cards/User/UserProfileCard/UserProfileCard.test.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.test.tsx b/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.test.tsx index 9fa1e351ff..b3b0efd596 100644 --- a/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.test.tsx +++ b/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Backstage Authors + * Copyright 2026 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.tsx b/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.tsx index 84cca25b21..c31bd133e0 100644 --- a/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.tsx +++ b/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.tsx @@ -1,5 +1,5 @@ /* - * Copyright 2025 The Backstage Authors + * Copyright 2026 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx index d1ecc09b01..bd446c8c6e 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx @@ -61,8 +61,8 @@ describe('UserSummary Test', () => { ); expect(screen.getByText('calum-leavy@example.com')).toBeInTheDocument(); - // BUI Avatar is decorative (aria-hidden), so the name must be - // present as text for the information to be accessible. + // BUI Avatar is decorative (aria-hidden), because the name is + // present as text right beside it. expect(screen.getByRole('img', { hidden: true })).toBeInTheDocument(); expect(screen.getByText('Calum Leavy')).toBeInTheDocument(); expect(screen.getByText('examplegroup').closest('a')).toHaveAttribute( From c4832a18d1d22a745ea71e415ae54bf3fb6125e3 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 16:12:18 +0100 Subject: [PATCH 422/455] refactor: Remove obsolete variant prop from Entity card components. Signed-off-by: Johan Persson --- .../src/components/catalog/EntityPage.tsx | 12 ++++----- .../src/collectLegacyRoutes.test.tsx | 2 +- plugins/catalog/report-alpha.api.md | 8 +++--- plugins/catalog/report.api.md | 11 +------- .../src/components/AboutCard/AboutCard.tsx | 26 +++++-------------- .../catalog/src/components/AboutCard/index.ts | 1 - .../EntityLabelsCard/EntityLabelsCard.tsx | 6 +---- .../EntityLinksCard/EntityLinksCard.tsx | 6 +---- plugins/catalog/src/index.ts | 1 - plugins/catalog/src/plugin.ts | 18 ++++++------- plugins/org/report.api.md | 4 --- .../Group/GroupProfile/GroupProfileCard.tsx | 12 +++------ .../UserProfileCard.stories.tsx | 6 ++--- .../UserProfileCard/UserProfileCard.test.tsx | 18 ++++++------- .../User/UserProfileCard/UserProfileCard.tsx | 3 +-- 15 files changed, 45 insertions(+), 89 deletions(-) diff --git a/packages/app-legacy/src/components/catalog/EntityPage.tsx b/packages/app-legacy/src/components/catalog/EntityPage.tsx index 08d4d921b5..32249cb84a 100644 --- a/packages/app-legacy/src/components/catalog/EntityPage.tsx +++ b/packages/app-legacy/src/components/catalog/EntityPage.tsx @@ -166,7 +166,7 @@ const overviewContent = ( {entityWarningContent} - + @@ -330,7 +330,7 @@ const userPage = ( {entityWarningContent} - + {entityWarningContent} - + {entityWarningContent} - + @@ -418,7 +418,7 @@ const domainPage = ( {entityWarningContent} - + @@ -437,7 +437,7 @@ const resourcePage = ( {entityWarningContent} - + diff --git a/packages/core-compat-api/src/collectLegacyRoutes.test.tsx b/packages/core-compat-api/src/collectLegacyRoutes.test.tsx index c5138dac3d..f9e8793613 100644 --- a/packages/core-compat-api/src/collectLegacyRoutes.test.tsx +++ b/packages/core-compat-api/src/collectLegacyRoutes.test.tsx @@ -156,7 +156,7 @@ describe('collectLegacyRoutes', () => { if={isKind('component')} children={ - + } /> diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index 82b6837cc7..0b8376c8f6 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -74,8 +74,8 @@ export const catalogTranslationRef: TranslationRef< readonly 'aboutCard.targetsField.label': 'Targets'; readonly 'searchResultItem.type': 'Type'; readonly 'searchResultItem.kind': 'Kind'; - readonly 'searchResultItem.owner': 'Owner'; readonly 'searchResultItem.lifecycle': 'Lifecycle'; + readonly 'searchResultItem.owner': 'Owner'; readonly 'catalogTable.allFilters': 'All'; readonly 'catalogTable.warningPanelTitle': 'Could not fetch catalog entities.'; readonly 'catalogTable.viewActionTitle': 'View'; @@ -95,14 +95,14 @@ export const catalogTranslationRef: TranslationRef< readonly 'entityContextMenu.unregisterMenuTitle': 'Unregister entity'; readonly 'entityContextMenu.moreButtonAriaLabel': 'more'; readonly 'entityLabelsCard.title': 'Labels'; - readonly 'entityLabelsCard.readMoreButtonTitle': 'Read more'; readonly 'entityLabelsCard.emptyDescription': 'No labels defined for this entity. You can add labels to your entity YAML as shown in the highlighted example below:'; - readonly 'entityLabels.ownerLabel': 'Owner'; + readonly 'entityLabelsCard.readMoreButtonTitle': 'Read more'; readonly 'entityLabels.warningPanelTitle': 'Entity not found'; + readonly 'entityLabels.ownerLabel': 'Owner'; readonly 'entityLabels.lifecycleLabel': 'Lifecycle'; readonly 'entityLinksCard.title': 'Links'; - readonly 'entityLinksCard.readMoreButtonTitle': 'Read more'; readonly 'entityLinksCard.emptyDescription': 'No links defined for this entity. You can add links to your entity YAML as shown in the highlighted example below:'; + readonly 'entityLinksCard.readMoreButtonTitle': 'Read more'; readonly 'entityNotFound.title': 'Entity was not found'; readonly 'entityNotFound.description': 'Want to help us build this? Check out our Getting Started documentation.'; readonly 'entityNotFound.docButtonTitle': 'DOCS'; diff --git a/plugins/catalog/report.api.md b/plugins/catalog/report.api.md index 4539364917..411d60076e 100644 --- a/plugins/catalog/report.api.md +++ b/plugins/catalog/report.api.md @@ -41,11 +41,6 @@ import { TableProps } from '@backstage/core-components'; import { TabProps } from '@material-ui/core/Tab'; import { UserListFilterKind } from '@backstage/plugin-catalog-react'; -// @public -export type AboutCardProps = { - variant?: string; -}; - // @public (undocumented) export function AboutContent(props: AboutContentProps): JSX_2.Element; @@ -337,7 +332,7 @@ export interface DependsOnResourcesCardProps { } // @public -export const EntityAboutCard: (props: AboutCardProps) => JSX.Element; +export const EntityAboutCard: () => JSX.Element; // @public (undocumented) export type EntityContextMenuClassKey = 'button'; @@ -387,8 +382,6 @@ export const EntityLabelsCard: (props: EntityLabelsCardProps) => JSX_2.Element; export interface EntityLabelsCardProps { // (undocumented) title?: string; - // (undocumented) - variant?: string; } // @public (undocumented) @@ -438,8 +431,6 @@ export const EntityLinksCard: (props: EntityLinksCardProps) => JSX_2.Element; export interface EntityLinksCardProps { // (undocumented) cols?: ColumnBreakpoints | number; - // (undocumented) - variant?: string; } // @public (undocumented) diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.tsx index 3c2dcb1b34..e516432dad 100644 --- a/plugins/catalog/src/components/AboutCard/AboutCard.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutCard.tsx @@ -147,25 +147,13 @@ function DefaultAboutCardSubheader() { return ; } -/** - * Props for {@link EntityAboutCard}. - * - * @public - */ -export type AboutCardProps = { - // Accepted for API compatibility but not applied. - // The new entity page layout handles card sizing. - // TODO: Discuss removal in code review. - variant?: string; -}; - -export interface InternalAboutCardProps extends AboutCardProps { +export interface InternalAboutCardProps { /** Icon link row rendered at the top of the card body. */ iconLinks?: JSX.Element; } export function InternalAboutCard(props: InternalAboutCardProps) { - const { variant: _variant, iconLinks } = props; + const { iconLinks } = props; const { entity } = useEntity(); const catalogApi = useApi(catalogApiRef); const alertApi = useApi(alertApiRef); @@ -244,10 +232,10 @@ export function InternalAboutCard(props: InternalAboutCardProps) { /** * Exported publicly via the EntityAboutCard * - * NOTE: We generally do not accept pull requests to extend this class with more - * props and customizability. If you need to tweak it, consider making a bespoke - * card in your own repository instead, that is perfect for your own needs. + * NOTE: We generally do not accept pull requests to extend this class with props + * and customizability. If you need to tweak it, consider making a bespoke card + * in your own repository instead, that is perfect for your own needs. */ -export function AboutCard(props: AboutCardProps) { - return ; +export function AboutCard() { + return ; } diff --git a/plugins/catalog/src/components/AboutCard/index.ts b/plugins/catalog/src/components/AboutCard/index.ts index 9660a5e2e2..f6a11dfbb7 100644 --- a/plugins/catalog/src/components/AboutCard/index.ts +++ b/plugins/catalog/src/components/AboutCard/index.ts @@ -15,7 +15,6 @@ */ export { AboutCard } from './AboutCard'; -export type { AboutCardProps } from './AboutCard'; export { AboutContent } from './AboutContent'; export type { AboutContentProps } from './AboutContent'; export { AboutField } from './AboutField'; diff --git a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx index 8c096932f8..403ecefd1f 100644 --- a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx +++ b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx @@ -27,10 +27,6 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; /** @public */ export interface EntityLabelsCardProps { - // Accepted for API compatibility but not applied. - // The new entity page layout handles card sizing. - // TODO: Discuss removal in code review. - variant?: string; title?: string; } @@ -55,7 +51,7 @@ const columnConfig: ColumnConfig[] = [ ]; export const EntityLabelsCard = (props: EntityLabelsCardProps) => { - const { variant: _variant, title } = props; + const { title } = props; const { entity } = useEntity(); const { t } = useTranslationRef(catalogTranslationRef); diff --git a/plugins/catalog/src/components/EntityLinksCard/EntityLinksCard.tsx b/plugins/catalog/src/components/EntityLinksCard/EntityLinksCard.tsx index 60b5811ce9..e090effb55 100644 --- a/plugins/catalog/src/components/EntityLinksCard/EntityLinksCard.tsx +++ b/plugins/catalog/src/components/EntityLinksCard/EntityLinksCard.tsx @@ -26,14 +26,10 @@ import { catalogTranslationRef } from '../../alpha/translation'; /** @public */ export interface EntityLinksCardProps { cols?: ColumnBreakpoints | number; - // Accepted for API compatibility but not applied. - // The new entity page layout handles card sizing. - // TODO: Discuss removal in code review. - variant?: string; } export const EntityLinksCard = (props: EntityLinksCardProps) => { - const { cols = undefined, variant: _variant } = props; + const { cols = undefined } = props; const { entity } = useEntity(); const app = useApp(); const { t } = useTranslationRef(catalogTranslationRef); diff --git a/plugins/catalog/src/index.ts b/plugins/catalog/src/index.ts index f3cc7d3d0b..a59283c677 100644 --- a/plugins/catalog/src/index.ts +++ b/plugins/catalog/src/index.ts @@ -23,7 +23,6 @@ export * from './apis'; export type { - AboutCardProps, AboutContentProps, AboutFieldProps, } from './components/AboutCard'; diff --git a/plugins/catalog/src/plugin.ts b/plugins/catalog/src/plugin.ts index 50d858a45f..6fe531418b 100644 --- a/plugins/catalog/src/plugin.ts +++ b/plugins/catalog/src/plugin.ts @@ -43,7 +43,6 @@ import { SearchResultListItemExtensionProps, } from '@backstage/plugin-search-react'; import { DefaultStarredEntitiesApi } from './apis'; -import { AboutCardProps } from './components/AboutCard'; import { DefaultCatalogPageProps } from './components/CatalogPage'; import { DependencyOfComponentsCardProps } from './components/DependencyOfComponentsCard'; import { DependsOnComponentsCardProps } from './components/DependsOnComponentsCard'; @@ -128,15 +127,14 @@ export const CatalogEntityPage: () => JSX.Element = catalogPlugin.provide( * not extremely customizable; feel free to make a copy of it as a starting * point if you like. */ -export const EntityAboutCard: (props: AboutCardProps) => JSX.Element = - catalogPlugin.provide( - createComponentExtension({ - name: 'EntityAboutCard', - component: { - lazy: () => import('./components/AboutCard').then(m => m.AboutCard), - }, - }), - ); +export const EntityAboutCard: () => JSX.Element = catalogPlugin.provide( + createComponentExtension({ + name: 'EntityAboutCard', + component: { + lazy: () => import('./components/AboutCard').then(m => m.AboutCard), + }, + }), +); /** @public */ export const EntityLinksCard = catalogPlugin.provide( diff --git a/plugins/org/report.api.md b/plugins/org/report.api.md index 776affbb9f..0d6b15b308 100644 --- a/plugins/org/report.api.md +++ b/plugins/org/report.api.md @@ -18,7 +18,6 @@ export type ComponentsGridClassKey = // @public (undocumented) export const EntityGroupProfileCard: (props: { - variant?: string; showLinks?: boolean; }) => JSX_2.Element; @@ -48,7 +47,6 @@ export type EntityRelationAggregation = 'direct' | 'aggregated'; // @public (undocumented) export const EntityUserProfileCard: (props: { - variant?: string; showLinks?: boolean; maxRelations?: number; hideIcons?: boolean; @@ -56,7 +54,6 @@ export const EntityUserProfileCard: (props: { // @public (undocumented) export const GroupProfileCard: (props: { - variant?: string; showLinks?: boolean; }) => JSX_2.Element; @@ -116,7 +113,6 @@ export type OwnershipCardClassKey = // @public (undocumented) export const UserProfileCard: (props: { - variant?: string; showLinks?: boolean; maxRelations?: number; hideIcons?: boolean; diff --git a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx index 0bd1100633..5810a0447d 100644 --- a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx +++ b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx @@ -80,14 +80,8 @@ const CardTitle = (props: { title: string; pictureSrc?: string }) => ( ); /** @public */ -export const GroupProfileCard = (props: { - // Accepted for API compatibility but not applied. - // The new entity page layout handles card sizing. - // TODO: Discuss removal in code review. - variant?: string; - showLinks?: boolean; -}) => { - const { variant: _variant } = props; +export const GroupProfileCard = (props: { showLinks?: boolean }) => { + const { showLinks } = props; const catalogApi = useApi(catalogApiRef); const alertApi = useApi(alertApiRef); const { entity: group } = useEntity(); @@ -237,7 +231,7 @@ export const GroupProfileCard = (props: { secondary={t('groupProfileCard.listItemTitle.childGroups')} /> - {props?.showLinks && } + {showLinks && } diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.stories.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.stories.tsx index 0463cc78ad..aa1bf978e6 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.stories.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.stories.tsx @@ -55,7 +55,7 @@ export const Default = () => ( - + @@ -82,7 +82,7 @@ export const NoImage = () => ( - + @@ -134,7 +134,7 @@ export const ExtraDetails = () => ( - + diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx index bd446c8c6e..45936c564f 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx @@ -51,7 +51,7 @@ describe('UserSummary Test', () => { it('Display Profile Card', async () => { await renderInTestApp( - + , { mountedRoutes: { @@ -87,7 +87,7 @@ describe('UserSummary Test', () => { it('Should limit the number of displayed groups in the card', async () => { await renderInTestApp( - + , { mountedRoutes: { @@ -109,7 +109,7 @@ describe('UserSummary Test', () => { it('Show more groups button when there are more user relations than the maximum', async () => { await renderInTestApp( - + , { mountedRoutes: { @@ -128,7 +128,7 @@ describe('UserSummary Test', () => { it('Hide more groups button when limit value is less than or equal to user relations', async () => { await renderInTestApp( - + , { mountedRoutes: { @@ -148,7 +148,7 @@ describe('UserSummary Test', () => { it('Hide all groups when max relations is equals to zero', async () => { await renderInTestApp( - + , { mountedRoutes: { @@ -193,7 +193,7 @@ describe('Edit Button', () => { await renderInTestApp( - + , { mountedRoutes: { @@ -234,7 +234,7 @@ describe('Edit Button', () => { await renderInTestApp( - + , { mountedRoutes: { @@ -285,7 +285,7 @@ describe('Edit Button', () => { await renderInTestApp( - + , { mountedRoutes: { @@ -337,7 +337,7 @@ describe('Edit Button', () => { await renderInTestApp( - + , { mountedRoutes: { diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx index 12a996cb4b..d35682101e 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx @@ -96,12 +96,11 @@ export const UserProfileCard = (props: { // Accepted for API compatibility but not applied. // The new entity page layout handles card sizing. // TODO: Discuss removal in code review. - variant?: string; showLinks?: boolean; maxRelations?: number; hideIcons?: boolean; }) => { - const { maxRelations, hideIcons, variant: _variant } = props; + const { maxRelations, hideIcons } = props; const classes = useStyles(); const { entity: user } = useEntity(); From c6080eb0b067386ccd46c1140c1057dba7be019f Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 16:17:57 +0100 Subject: [PATCH 423/455] chore: update changeset. Signed-off-by: Johan Persson --- .changeset/social-worlds-report.md | 5 +++++ .changeset/thirty-kiwis-trade.md | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 .changeset/social-worlds-report.md diff --git a/.changeset/social-worlds-report.md b/.changeset/social-worlds-report.md new file mode 100644 index 0000000000..58acda40a8 --- /dev/null +++ b/.changeset/social-worlds-report.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': minor +--- + +Added `EntityInfoCard` component to `@backstage/plugin-catalog-react` as a BUI-based card wrapper for entity page cards. diff --git a/.changeset/thirty-kiwis-trade.md b/.changeset/thirty-kiwis-trade.md index b2cdc5fb01..73fc21724b 100644 --- a/.changeset/thirty-kiwis-trade.md +++ b/.changeset/thirty-kiwis-trade.md @@ -1,7 +1,17 @@ --- -'@backstage/plugin-catalog-react': minor -'@backstage/plugin-catalog': patch -'@backstage/plugin-org': patch +'@backstage/plugin-catalog': major +'@backstage/plugin-org': major --- -Added `EntityInfoCard` component to `@backstage/plugin-catalog-react` as a BUI-based card wrapper for entity page cards. Migrated `EntityAboutCard`, `EntityLinksCard`, `EntityLabelsCard`, `GroupProfileCard`, and `UserProfileCard` from MUI/InfoCard to use the new BUI card layout. Replaced MUI ImageList and Grid internals in LinksGridList and AboutContent with BUI Grid. Migrated EntityLabelsCard from core-components Table to BUI Table. Updated GroupProfileCard and UserProfileCard to use BUI Avatar in card titles. +Migrated `EntityAboutCard`, `EntityLinksCard`, `EntityLabelsCard`, `GroupProfileCard`, and `UserProfileCard` from MUI/InfoCard to use the new BUI card layout and BUI components where possible. + +**BREAKING**: Removed `variant` prop from EntityAboutCard, EntityUserProfileCard, EntityGroupProfileCard, EntityLabelsCard, EntityLinksCard + +**Migration:** + +Simply delete the obsolete `variant` prop, e.g: + +```diff +- ++ +``` From 7388c6516d725f5d21c1b288298ce0b618720dd8 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 16:40:47 +0100 Subject: [PATCH 424/455] refactor(catalog): use Grid.Item colSpan for full-width AboutFields Replace inline `style={{ gridColumn: '1 / -1' }}` with BUI-native `Grid.Item colSpan` for full-width fields in AboutContent. Extract grid columns into a shared variable used by both Grid.Root and Grid.Item to keep them in sync. Remove the `style` prop from AboutField that was only added to support the inline gridColumn approach. Signed-off-by: Johan Persson --- .../src/components/AboutCard/AboutContent.tsx | 64 ++++++++++--------- .../src/components/AboutCard/AboutField.tsx | 14 +--- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/plugins/catalog/src/components/AboutCard/AboutContent.tsx b/plugins/catalog/src/components/AboutCard/AboutContent.tsx index d35891cd05..503d963575 100644 --- a/plugins/catalog/src/components/AboutCard/AboutContent.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutContent.tsx @@ -114,20 +114,21 @@ export function AboutContent(props: AboutContentProps) { entitySourceLocation = undefined; } + const columns = { initial: '1', sm: '2', lg: '3' } as const; + return ( - - - - + + + + + + {isLocation && (entity?.spec?.targets || entity?.spec?.target) && ( - - target as string) - .map(target => ({ - text: target, - href: getLocationTargetHref( - target, - (entity?.spec?.type || t('aboutCard.unknown')) as string, - entitySourceLocation!, - ), - }))} - /> - + + + target as string) + .map(target => ({ + text: target, + href: getLocationTargetHref( + target, + (entity?.spec?.type || t('aboutCard.unknown')) as string, + entitySourceLocation!, + ), + }))} + /> + + )} ); diff --git a/plugins/catalog/src/components/AboutCard/AboutField.tsx b/plugins/catalog/src/components/AboutCard/AboutField.tsx index 87f817c643..36a0406876 100644 --- a/plugins/catalog/src/components/AboutCard/AboutField.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutField.tsx @@ -17,7 +17,7 @@ import { useElementFilter } from '@backstage/core-plugin-api'; import Typography from '@material-ui/core/Typography'; import { makeStyles } from '@material-ui/core/styles'; -import { CSSProperties, ReactNode } from 'react'; +import { ReactNode } from 'react'; import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; import { catalogTranslationRef } from '../../alpha/translation'; @@ -50,19 +50,11 @@ export interface AboutFieldProps { gridSizes?: Record; children?: ReactNode; className?: string; - style?: CSSProperties; } /** @public */ export function AboutField(props: AboutFieldProps) { - const { - label, - value, - gridSizes: _gridSizes, - children, - className, - style, - } = props; + const { label, value, gridSizes: _gridSizes, children, className } = props; const classes = useStyles(); const { t } = useTranslationRef(catalogTranslationRef); @@ -78,7 +70,7 @@ export function AboutField(props: AboutFieldProps) { ); return ( -
    +
    {label} From 2aaacb50951533a3773544af95a023ed66a61230 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 16:49:04 +0100 Subject: [PATCH 425/455] refactor(catalog): remove obsolete gridSizes prop from AboutField Remove the unused `gridSizes` prop from AboutField. Grid layout is now owned by the parent Grid.Root in AboutContent, making this prop unnecessary. Update changeset with breaking change and migration guide. Signed-off-by: Johan Persson --- .changeset/thirty-kiwis-trade.md | 9 +++++++-- plugins/catalog/report.api.md | 5 ----- .../catalog/src/components/AboutCard/AboutContent.tsx | 7 ------- plugins/catalog/src/components/AboutCard/AboutField.tsx | 3 +-- .../Cards/User/UserProfileCard/UserProfileCard.tsx | 3 --- 5 files changed, 8 insertions(+), 19 deletions(-) diff --git a/.changeset/thirty-kiwis-trade.md b/.changeset/thirty-kiwis-trade.md index 73fc21724b..08ddbaa1a4 100644 --- a/.changeset/thirty-kiwis-trade.md +++ b/.changeset/thirty-kiwis-trade.md @@ -5,13 +5,18 @@ Migrated `EntityAboutCard`, `EntityLinksCard`, `EntityLabelsCard`, `GroupProfileCard`, and `UserProfileCard` from MUI/InfoCard to use the new BUI card layout and BUI components where possible. -**BREAKING**: Removed `variant` prop from EntityAboutCard, EntityUserProfileCard, EntityGroupProfileCard, EntityLabelsCard, EntityLinksCard +**BREAKING**: Removed `variant` prop from EntityAboutCard, EntityUserProfileCard, EntityGroupProfileCard, EntityLabelsCard, EntityLinksCard. Removed `gridSizes` prop from `AboutField`. **Migration:** -Simply delete the obsolete `variant` prop, e.g: +Simply delete the obsolete `variant` and `gridSizes` props, e.g: ```diff - + ``` + +```diff +- ++ +``` diff --git a/plugins/catalog/report.api.md b/plugins/catalog/report.api.md index 411d60076e..48e3f53de2 100644 --- a/plugins/catalog/report.api.md +++ b/plugins/catalog/report.api.md @@ -8,7 +8,6 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { CatalogApi } from '@backstage/plugin-catalog-react'; import { ComponentEntity } from '@backstage/catalog-model'; import { CompoundEntityRef } from '@backstage/catalog-model'; -import { CSSProperties } from 'react'; import { DomainEntity } from '@backstage/catalog-model'; import { ElementType } from 'react'; import { Entity } from '@backstage/catalog-model'; @@ -60,12 +59,8 @@ export interface AboutFieldProps { // (undocumented) className?: string; // (undocumented) - gridSizes?: Record; - // (undocumented) label: string; // (undocumented) - style?: CSSProperties; - // (undocumented) value?: string; } diff --git a/plugins/catalog/src/components/AboutCard/AboutContent.tsx b/plugins/catalog/src/components/AboutCard/AboutContent.tsx index 503d963575..eff9ae7da3 100644 --- a/plugins/catalog/src/components/AboutCard/AboutContent.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutContent.tsx @@ -133,7 +133,6 @@ export function AboutContent(props: AboutContentProps) { label={t('aboutCard.ownerField.label')} value={t('aboutCard.ownerField.value')} className={classes.description} - gridSizes={{ xs: 12, sm: 6, lg: 4 }} > {ownedByRelations.length > 0 && ( @@ -143,7 +142,6 @@ export function AboutContent(props: AboutContentProps) { {partOfDomainRelations.length > 0 && ( {partOfSystemRelations.length > 0 && ( )} {(isAPI || @@ -201,13 +196,11 @@ export function AboutContent(props: AboutContentProps) { )} {(entity?.metadata?.tags || []).map(tag => ( diff --git a/plugins/catalog/src/components/AboutCard/AboutField.tsx b/plugins/catalog/src/components/AboutCard/AboutField.tsx index 36a0406876..725a82612a 100644 --- a/plugins/catalog/src/components/AboutCard/AboutField.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutField.tsx @@ -47,14 +47,13 @@ const useStyles = makeStyles(theme => ({ export interface AboutFieldProps { label: string; value?: string; - gridSizes?: Record; children?: ReactNode; className?: string; } /** @public */ export function AboutField(props: AboutFieldProps) { - const { label, value, gridSizes: _gridSizes, children, className } = props; + const { label, value, children, className } = props; const classes = useStyles(); const { t } = useTranslationRef(catalogTranslationRef); diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx index d35682101e..e34adde670 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx @@ -93,9 +93,6 @@ const CardTitle = (props: { title: string; pictureSrc?: string }) => /** @public */ export const UserProfileCard = (props: { - // Accepted for API compatibility but not applied. - // The new entity page layout handles card sizing. - // TODO: Discuss removal in code review. showLinks?: boolean; maxRelations?: number; hideIcons?: boolean; From 3d422028d3d4595f56e306ffa6ba7cf6160ac116 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 17:56:08 +0100 Subject: [PATCH 426/455] fix(catalog): address review feedback for BUI card migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace `as any` cast with type-safe `as Columns` in LinksGridList, clamping column count to the valid 1–12 range - Restore pagination (pageSize: 5) in EntityLabelsCard using the BUI `useTable` hook - Use translation ref for EntityLabelsCard column headers instead of hard-coded English strings Signed-off-by: Johan Persson --- plugins/catalog/src/alpha/translation.ts | 2 + .../EntityLabelsCard/EntityLabelsCard.tsx | 59 +++++++++++-------- .../EntityLinksCard/LinksGridList.tsx | 7 ++- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/plugins/catalog/src/alpha/translation.ts b/plugins/catalog/src/alpha/translation.ts index f346c408b9..3d48c0915a 100644 --- a/plugins/catalog/src/alpha/translation.ts +++ b/plugins/catalog/src/alpha/translation.ts @@ -111,6 +111,8 @@ export const catalogTranslationRef = createTranslationRef({ }, entityLabelsCard: { title: 'Labels', + columnKeyLabel: 'Label', + columnValueLabel: 'Value', emptyDescription: 'No labels defined for this entity. You can add labels to your entity YAML as shown in the highlighted example below:', readMoreButtonTitle: 'Read more', diff --git a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx index 403ecefd1f..95985f31c3 100644 --- a/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx +++ b/plugins/catalog/src/components/EntityLabelsCard/EntityLabelsCard.tsx @@ -19,11 +19,13 @@ import { EntityLabelsEmptyState } from './EntityLabelsEmptyState'; import { Table, CellText, + useTable, type ColumnConfig, type TableItem, } from '@backstage/ui'; import { catalogTranslationRef } from '../../alpha/translation'; import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; +import { useMemo } from 'react'; /** @public */ export interface EntityLabelsCardProps { @@ -36,20 +38,6 @@ interface LabelItem extends TableItem { value: string; } -const columnConfig: ColumnConfig[] = [ - { - id: 'key', - label: 'Label', - isRowHeader: true, - cell: item => , - }, - { - id: 'value', - label: 'Value', - cell: item => , - }, -]; - export const EntityLabelsCard = (props: EntityLabelsCardProps) => { const { title } = props; const { entity } = useEntity(); @@ -57,20 +45,45 @@ export const EntityLabelsCard = (props: EntityLabelsCardProps) => { const labels = entity?.metadata?.labels; + const columnConfig: ColumnConfig[] = useMemo( + () => [ + { + id: 'key', + label: t('entityLabelsCard.columnKeyLabel'), + isRowHeader: true, + cell: item => , + }, + { + id: 'value', + label: t('entityLabelsCard.columnValueLabel'), + cell: item => , + }, + ], + [t], + ); + + const data = useMemo( + () => + Object.keys(labels ?? {}).map(labelKey => ({ + id: labelKey, + key: labelKey, + value: labels![labelKey], + })), + [labels], + ); + + const { tableProps } = useTable({ + mode: 'complete', + data, + paginationOptions: { pageSize: 5 }, + }); + return ( {!labels || Object.keys(labels).length === 0 ? ( ) : ( -
    ({ - id: labelKey, - key: labelKey, - value: labels[labelKey], - }))} - pagination={{ type: 'none' }} - /> +
    )} ); diff --git a/plugins/catalog/src/components/EntityLinksCard/LinksGridList.tsx b/plugins/catalog/src/components/EntityLinksCard/LinksGridList.tsx index 90b7e2058b..dfb0b280ff 100644 --- a/plugins/catalog/src/components/EntityLinksCard/LinksGridList.tsx +++ b/plugins/catalog/src/components/EntityLinksCard/LinksGridList.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Grid } from '@backstage/ui'; +import { Grid, type Columns } from '@backstage/ui'; import { IconLink } from './IconLink'; import { ColumnBreakpoints } from './types'; import { useDynamicColumns } from './useDynamicColumns'; @@ -36,7 +36,10 @@ export function LinksGridList(props: LinksGridListProps) { const numOfCols = useDynamicColumns(cols); return ( - + {items.map(({ text, href, Icon }, i) => ( ))} From 20cb5117e1351fbb6ab4774a5b620d1324bb3d9c Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Mon, 2 Mar 2026 17:58:19 +0100 Subject: [PATCH 427/455] fix: remove variant prop from create-app template for migrated cards The E2E tests scaffold a new app from the create-app template, which still passed variant="gridItem" to EntityAboutCard, EntityUserProfileCard, and EntityGroupProfileCard after the prop was removed. Signed-off-by: Johan Persson --- .../packages/app/src/components/catalog/EntityPage.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx b/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx index f75d984366..750dfe6cea 100644 --- a/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/create-app/templates/default-app/packages/app/src/components/catalog/EntityPage.tsx @@ -128,7 +128,7 @@ const overviewContent = ( {entityWarningContent} - + @@ -298,7 +298,7 @@ const userPage = ( {entityWarningContent} - + @@ -314,7 +314,7 @@ const groupPage = ( {entityWarningContent} - + @@ -336,7 +336,7 @@ const systemPage = ( {entityWarningContent} - + @@ -383,7 +383,7 @@ const domainPage = ( {entityWarningContent} - + From cccf0c47e28912dbf026ff8f286ac4b7b4cc06f6 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 09:14:10 +0100 Subject: [PATCH 428/455] Update api report, code-sample files and docs. Signed-off-by: Johan Persson --- .../integrating-plugin-into-software-catalog.md | 2 +- plugins/catalog/report-alpha.api.md | 10 ++++++---- .../docs/code/code-sample.md | 2 +- .../documented-component/docs/code/code-sample.md | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/plugins/integrating-plugin-into-software-catalog.md b/docs/plugins/integrating-plugin-into-software-catalog.md index 911d74b019..417b932451 100644 --- a/docs/plugins/integrating-plugin-into-software-catalog.md +++ b/docs/plugins/integrating-plugin-into-software-catalog.md @@ -94,7 +94,7 @@ const systemPage = ( - + diff --git a/plugins/catalog/report-alpha.api.md b/plugins/catalog/report-alpha.api.md index 0b8376c8f6..fbe90f461c 100644 --- a/plugins/catalog/report-alpha.api.md +++ b/plugins/catalog/report-alpha.api.md @@ -74,8 +74,8 @@ export const catalogTranslationRef: TranslationRef< readonly 'aboutCard.targetsField.label': 'Targets'; readonly 'searchResultItem.type': 'Type'; readonly 'searchResultItem.kind': 'Kind'; - readonly 'searchResultItem.lifecycle': 'Lifecycle'; readonly 'searchResultItem.owner': 'Owner'; + readonly 'searchResultItem.lifecycle': 'Lifecycle'; readonly 'catalogTable.allFilters': 'All'; readonly 'catalogTable.warningPanelTitle': 'Could not fetch catalog entities.'; readonly 'catalogTable.viewActionTitle': 'View'; @@ -95,14 +95,16 @@ export const catalogTranslationRef: TranslationRef< readonly 'entityContextMenu.unregisterMenuTitle': 'Unregister entity'; readonly 'entityContextMenu.moreButtonAriaLabel': 'more'; readonly 'entityLabelsCard.title': 'Labels'; - readonly 'entityLabelsCard.emptyDescription': 'No labels defined for this entity. You can add labels to your entity YAML as shown in the highlighted example below:'; readonly 'entityLabelsCard.readMoreButtonTitle': 'Read more'; - readonly 'entityLabels.warningPanelTitle': 'Entity not found'; + readonly 'entityLabelsCard.columnKeyLabel': 'Label'; + readonly 'entityLabelsCard.columnValueLabel': 'Value'; + readonly 'entityLabelsCard.emptyDescription': 'No labels defined for this entity. You can add labels to your entity YAML as shown in the highlighted example below:'; readonly 'entityLabels.ownerLabel': 'Owner'; + readonly 'entityLabels.warningPanelTitle': 'Entity not found'; readonly 'entityLabels.lifecycleLabel': 'Lifecycle'; readonly 'entityLinksCard.title': 'Links'; - readonly 'entityLinksCard.emptyDescription': 'No links defined for this entity. You can add links to your entity YAML as shown in the highlighted example below:'; readonly 'entityLinksCard.readMoreButtonTitle': 'Read more'; + readonly 'entityLinksCard.emptyDescription': 'No links defined for this entity. You can add links to your entity YAML as shown in the highlighted example below:'; readonly 'entityNotFound.title': 'Entity was not found'; readonly 'entityNotFound.description': 'Want to help us build this? Check out our Getting Started documentation.'; readonly 'entityNotFound.docButtonTitle': 'DOCS'; diff --git a/plugins/techdocs-backend/examples/documented-component-uffizzi/docs/code/code-sample.md b/plugins/techdocs-backend/examples/documented-component-uffizzi/docs/code/code-sample.md index f41ab1d506..d1172aaceb 100644 --- a/plugins/techdocs-backend/examples/documented-component-uffizzi/docs/code/code-sample.md +++ b/plugins/techdocs-backend/examples/documented-component-uffizzi/docs/code/code-sample.md @@ -10,7 +10,7 @@ const serviceEntityPage = ( - + diff --git a/plugins/techdocs-backend/examples/documented-component/docs/code/code-sample.md b/plugins/techdocs-backend/examples/documented-component/docs/code/code-sample.md index f41ab1d506..d1172aaceb 100644 --- a/plugins/techdocs-backend/examples/documented-component/docs/code/code-sample.md +++ b/plugins/techdocs-backend/examples/documented-component/docs/code/code-sample.md @@ -10,7 +10,7 @@ const serviceEntityPage = ( - + From 74fd81c28dc5f1e783ade8d1c4388e9b4c0f4e66 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 11:31:05 +0100 Subject: [PATCH 429/455] fix(catalog-react): make EntityInfoCard fill available container height Set `height: 100%` on EntityInfoCard so cards fill their grid cell, matching the row height of sibling cards. This replaces the behavior previously provided by `variant="gridItem"` on the old InfoCard. Signed-off-by: Johan Persson --- .../src/components/EntityInfoCard/EntityInfoCard.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.tsx b/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.tsx index c31bd133e0..a0c7c20ffe 100644 --- a/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.tsx +++ b/plugins/catalog-react/src/components/EntityInfoCard/EntityInfoCard.tsx @@ -23,6 +23,14 @@ import { Text, Flex, } from '@backstage/ui'; +import { makeStyles } from '@material-ui/core/styles'; +import classNames from 'classnames'; + +const useStyles = makeStyles({ + root: { + height: '100%', + }, +}); /** @public */ export interface EntityInfoCardProps { @@ -36,9 +44,10 @@ export interface EntityInfoCardProps { /** @public */ export function EntityInfoCard(props: EntityInfoCardProps) { const { title, headerActions, footerActions, children, className } = props; + const classes = useStyles(); return ( - + {title && ( From aef79e0af46c85e177d104347453829144bb946f Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 12:44:06 +0100 Subject: [PATCH 430/455] fix(catalog): style icon links section in AboutCard Add horizontal borders and bottom margin to the icon links container in the AboutCard to visually separate it from the card content. Signed-off-by: Johan Persson --- .../src/components/AboutCard/AboutCard.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.tsx index e516432dad..065d786a13 100644 --- a/plugins/catalog/src/components/AboutCard/AboutCard.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutCard.tsx @@ -72,6 +72,16 @@ import { createFromTemplateRouteRef, viewTechDocRouteRef } from '../../routes'; import { catalogTranslationRef } from '../../alpha/translation'; import { useSourceTemplateCompoundEntityRef } from './hooks'; import { AboutContent } from './AboutContent'; +import { makeStyles } from '@material-ui/core/styles'; + +const useStyles = makeStyles({ + linkContainer: { + border: '1px solid var(--bui-border-1)', + borderLeft: 'none', + borderRight: 'none', + marginBottom: 'var(--bui-space-6)', + }, +}); export function useCatalogSourceIconLinkProps() { const { entity } = useEntity(); @@ -154,6 +164,7 @@ export interface InternalAboutCardProps { export function InternalAboutCard(props: InternalAboutCardProps) { const { iconLinks } = props; + const classes = useStyles(); const { entity } = useEntity(); const catalogApi = useApi(catalogApiRef); const alertApi = useApi(alertApiRef); @@ -223,7 +234,9 @@ export function InternalAboutCard(props: InternalAboutCardProps) { } > - {iconLinks ?? } +
    + {iconLinks ?? } +
    ); From aa59ab0edee372daa1e4037af9b38c0979c6101c Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 14:41:57 +0100 Subject: [PATCH 431/455] chore: add design-system-maintainers as code owners for .storybook and docs-ui These directories were previously only covered by the catch-all rule, requiring review from @backstage/maintainers. Since they fall under the Design System project area scope, assign them to @backstage/design-system-maintainers. Signed-off-by: Johan Persson --- .github/CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 725c6c676b..7e5cc36bdf 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,8 +12,10 @@ yarn.lock @backstage/maintainers @backst /.github @backstage/operations-maintainers /.github/vale @backstage/maintainers @backstage/documentation-maintainers /.patches @backstage/operations-maintainers +/.storybook @backstage/design-system-maintainers /beps/0001-notifications-system @backstage/maintainers @backstage/notifications-maintainers /docs @backstage/maintainers @backstage/documentation-maintainers +/docs-ui @backstage/design-system-maintainers /docs/assets/search @backstage/search-maintainers /docs/auth @backstage/auth-maintainers /docs/backend-system @backstage/framework-maintainers From 8d40a035dca2baaa5a6e620081beea42ecdc9a6d Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 12:44:04 +0100 Subject: [PATCH 432/455] fix(ui): extend DialogBodyProps with native div element props DialogBodyProps previously only extended DialogBodyOwnProps, meaning native HTML attributes like aria-*, data-*, etc. could not be passed to the underlying div element. Signed-off-by: Johan Persson --- packages/ui/src/components/Dialog/types.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/Dialog/types.ts b/packages/ui/src/components/Dialog/types.ts index ad88f59e8e..c7b500b211 100644 --- a/packages/ui/src/components/Dialog/types.ts +++ b/packages/ui/src/components/Dialog/types.ts @@ -68,7 +68,9 @@ export type DialogBodyOwnProps = { * Props for the DialogBody component. * @public */ -export interface DialogBodyProps extends DialogBodyOwnProps {} +export interface DialogBodyProps + extends DialogBodyOwnProps, + Omit, keyof DialogBodyOwnProps> {} /** @public */ export type DialogFooterOwnProps = { From bd671414bbb6c00e57188f115db594b3033135c6 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 12:45:36 +0100 Subject: [PATCH 433/455] fix(ui): remove unused style prop from ButtonIconOwnProps The style prop was defined in ButtonIconOwnProps but never destructured or applied in the component, causing it to be silently dropped. Removing it lets style flow through to the underlying RAC Button via restProps instead. Signed-off-by: Johan Persson --- packages/ui/src/components/ButtonIcon/definition.ts | 1 - packages/ui/src/components/ButtonIcon/types.ts | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/components/ButtonIcon/definition.ts b/packages/ui/src/components/ButtonIcon/definition.ts index 76f6be68ce..0027227094 100644 --- a/packages/ui/src/components/ButtonIcon/definition.ts +++ b/packages/ui/src/components/ButtonIcon/definition.ts @@ -36,6 +36,5 @@ export const ButtonIconDefinition = defineComponent()({ loading: { dataAttribute: true }, icon: {}, className: {}, - style: {}, }, }); diff --git a/packages/ui/src/components/ButtonIcon/types.ts b/packages/ui/src/components/ButtonIcon/types.ts index 92618d5ff6..f30f01ff99 100644 --- a/packages/ui/src/components/ButtonIcon/types.ts +++ b/packages/ui/src/components/ButtonIcon/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { ReactElement, CSSProperties } from 'react'; +import type { ReactElement } from 'react'; import type { ButtonProps as RAButtonProps } from 'react-aria-components'; import type { Responsive } from '../../types'; @@ -25,7 +25,6 @@ export type ButtonIconOwnProps = { icon?: ReactElement; loading?: boolean; className?: string; - style?: CSSProperties; }; /** @@ -34,5 +33,5 @@ export type ButtonIconOwnProps = { * @public */ export interface ButtonIconProps - extends Omit, + extends Omit, ButtonIconOwnProps {} From 00bf7c7e4203c2e20a5f76f909f094dcf2a43d15 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 12:49:32 +0100 Subject: [PATCH 434/455] fix(ui): remove unused style prop from ButtonOwnProps The style prop was defined in ButtonOwnProps but never destructured or applied in the component, causing it to be silently dropped. Removing it lets style flow through to the underlying RAC Button via restProps instead. Signed-off-by: Johan Persson --- packages/ui/src/components/Button/definition.ts | 1 - packages/ui/src/components/Button/types.ts | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/components/Button/definition.ts b/packages/ui/src/components/Button/definition.ts index d15ceabd77..21d3c7017b 100644 --- a/packages/ui/src/components/Button/definition.ts +++ b/packages/ui/src/components/Button/definition.ts @@ -39,6 +39,5 @@ export const ButtonDefinition = defineComponent()({ iconEnd: {}, children: {}, className: {}, - style: {}, }, }); diff --git a/packages/ui/src/components/Button/types.ts b/packages/ui/src/components/Button/types.ts index a18d9e9164..2bf36d808e 100644 --- a/packages/ui/src/components/Button/types.ts +++ b/packages/ui/src/components/Button/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { ReactElement, ReactNode, CSSProperties } from 'react'; +import type { ReactElement, ReactNode } from 'react'; import type { ButtonProps as RAButtonProps } from 'react-aria-components'; import type { Responsive } from '../../types'; @@ -28,7 +28,6 @@ export type ButtonOwnProps = { loading?: boolean; children?: ReactNode; className?: string; - style?: CSSProperties; }; /** @@ -37,5 +36,5 @@ export type ButtonOwnProps = { * @public */ export interface ButtonProps - extends Omit, + extends Omit, ButtonOwnProps {} From 6edae0e9596d3989c59b81a8bdda0b645c6286f8 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 12:52:00 +0100 Subject: [PATCH 435/455] fix(ui): remove unused style prop from ButtonLinkOwnProps The style prop was defined in ButtonLinkOwnProps but never destructured or applied in the component, causing it to be silently dropped. Removing it lets style flow through to the underlying RAC Link via restProps instead. Signed-off-by: Johan Persson --- packages/ui/src/components/ButtonLink/definition.ts | 1 - packages/ui/src/components/ButtonLink/types.ts | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/components/ButtonLink/definition.ts b/packages/ui/src/components/ButtonLink/definition.ts index c86cb026b5..ea271a966e 100644 --- a/packages/ui/src/components/ButtonLink/definition.ts +++ b/packages/ui/src/components/ButtonLink/definition.ts @@ -36,6 +36,5 @@ export const ButtonLinkDefinition = defineComponent()({ iconEnd: {}, children: {}, className: {}, - style: {}, }, }); diff --git a/packages/ui/src/components/ButtonLink/types.ts b/packages/ui/src/components/ButtonLink/types.ts index 0f01c3cf40..f2753eafe5 100644 --- a/packages/ui/src/components/ButtonLink/types.ts +++ b/packages/ui/src/components/ButtonLink/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { ReactElement, ReactNode, CSSProperties } from 'react'; +import type { ReactElement, ReactNode } from 'react'; import type { LinkProps as RALinkProps } from 'react-aria-components'; import type { Responsive } from '../../types'; @@ -26,7 +26,6 @@ export type ButtonLinkOwnProps = { iconEnd?: ReactElement; children?: ReactNode; className?: string; - style?: CSSProperties; }; /** @@ -35,5 +34,5 @@ export type ButtonLinkOwnProps = { * @public */ export interface ButtonLinkProps - extends Omit, + extends Omit, ButtonLinkOwnProps {} From 68e0cc14686e522fdab52195bfadb686779b76d4 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 14:03:24 +0100 Subject: [PATCH 436/455] fix(ui): extend AlertProps with native div element props Alert renders a div and spreads restProps onto it, but AlertProps didn't extend native div props. This meant attributes like aria-*, data-*, role, etc. couldn't be passed with type safety. Signed-off-by: Johan Persson --- packages/ui/src/components/Alert/types.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/Alert/types.ts b/packages/ui/src/components/Alert/types.ts index c0829899f4..ce36d4c5fd 100644 --- a/packages/ui/src/components/Alert/types.ts +++ b/packages/ui/src/components/Alert/types.ts @@ -34,4 +34,10 @@ export type AlertOwnProps = { * * @public */ -export interface AlertProps extends MarginProps, AlertOwnProps {} +export interface AlertProps + extends MarginProps, + AlertOwnProps, + Omit< + React.ComponentPropsWithoutRef<'div'>, + keyof AlertOwnProps | keyof MarginProps + > {} From 8236a3d7c315bb394fde661480a4abf7d7e36de6 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 14:03:59 +0100 Subject: [PATCH 437/455] fix(ui): extend ContainerProps with native div element props Container renders a div and spreads restProps onto it, but ContainerProps didn't extend native div props. This meant attributes like aria-*, data-*, role, etc. couldn't be passed with type safety. Signed-off-by: Johan Persson --- packages/ui/src/components/Container/types.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/Container/types.ts b/packages/ui/src/components/Container/types.ts index c6f9758fd2..375f3a4a38 100644 --- a/packages/ui/src/components/Container/types.ts +++ b/packages/ui/src/components/Container/types.ts @@ -23,7 +23,9 @@ export type ContainerOwnProps = { }; /** @public */ -export interface ContainerProps extends ContainerOwnProps { +export interface ContainerProps + extends ContainerOwnProps, + Omit, keyof ContainerOwnProps> { my?: SpaceProps['my']; mb?: SpaceProps['mb']; mt?: SpaceProps['mt']; From bfd121436b9bd2a4b29cc5f4502595698cf2712e Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 14:04:38 +0100 Subject: [PATCH 438/455] fix(ui): extend FieldLabelProps with native div element props FieldLabel renders a div and spreads restProps onto it, but FieldLabelProps didn't extend native div props. This meant attributes like aria-*, data-*, role, etc. couldn't be passed with type safety. Signed-off-by: Johan Persson --- packages/ui/src/components/FieldLabel/types.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/FieldLabel/types.ts b/packages/ui/src/components/FieldLabel/types.ts index 89cea5fae4..f1d2857e06 100644 --- a/packages/ui/src/components/FieldLabel/types.ts +++ b/packages/ui/src/components/FieldLabel/types.ts @@ -45,4 +45,6 @@ export type FieldLabelOwnProps = { }; /** @public */ -export interface FieldLabelProps extends FieldLabelOwnProps {} +export interface FieldLabelProps + extends FieldLabelOwnProps, + Omit, keyof FieldLabelOwnProps> {} From 36987dbdfd919481651e2d66622ba88810c40c61 Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 14:18:29 +0100 Subject: [PATCH 439/455] chore(ui): add changesets and update API report Signed-off-by: Johan Persson --- .changeset/giant-singers-rush.md | 7 +++++++ .changeset/wide-pianos-pay.md | 7 +++++++ packages/ui/report.api.md | 32 +++++++++++++++++++------------- 3 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 .changeset/giant-singers-rush.md create mode 100644 .changeset/wide-pianos-pay.md diff --git a/.changeset/giant-singers-rush.md b/.changeset/giant-singers-rush.md new file mode 100644 index 0000000000..e1f0493caa --- /dev/null +++ b/.changeset/giant-singers-rush.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Fixed handling of the `style` prop on `Button`, `ButtonIcon`, and `ButtonLink` so that it is now correctly forwarded to the underlying element instead of being silently dropped. + +**Affected components:** Button, ButtonIcon, ButtonLink diff --git a/.changeset/wide-pianos-pay.md b/.changeset/wide-pianos-pay.md new file mode 100644 index 0000000000..1cbcfd993c --- /dev/null +++ b/.changeset/wide-pianos-pay.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Extended `AlertProps`, `ContainerProps`, `DialogBodyProps`, and `FieldLabelProps` with native div element props to allow passing attributes like `aria-*` and `data-*`. + +**Affected components:** Alert, Container, DialogBody, FieldLabel diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index 572b6701d7..b51c9722ed 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -243,7 +243,13 @@ export type AlertOwnProps = { }; // @public -export interface AlertProps extends MarginProps, AlertOwnProps {} +export interface AlertProps + extends MarginProps, + AlertOwnProps, + Omit< + React.ComponentPropsWithoutRef<'div'>, + keyof AlertOwnProps | keyof MarginProps + > {} // @public (undocumented) export type AlignItems = 'stretch' | 'start' | 'center' | 'end'; @@ -441,7 +447,6 @@ export const ButtonDefinition: { readonly iconEnd: {}; readonly children: {}; readonly className: {}; - readonly style: {}; }; }; @@ -475,7 +480,6 @@ export const ButtonIconDefinition: { }; readonly icon: {}; readonly className: {}; - readonly style: {}; }; }; @@ -486,12 +490,11 @@ export type ButtonIconOwnProps = { icon?: ReactElement; loading?: boolean; className?: string; - style?: CSSProperties; }; // @public export interface ButtonIconProps - extends Omit, + extends Omit, ButtonIconOwnProps {} // @public (undocumented) @@ -522,7 +525,6 @@ export const ButtonLinkDefinition: { readonly iconEnd: {}; readonly children: {}; readonly className: {}; - readonly style: {}; }; }; @@ -534,12 +536,11 @@ export type ButtonLinkOwnProps = { iconEnd?: ReactElement; children?: ReactNode; className?: string; - style?: CSSProperties; }; // @public export interface ButtonLinkProps - extends Omit, + extends Omit, ButtonLinkOwnProps {} // @public (undocumented) @@ -552,12 +553,11 @@ export type ButtonOwnProps = { loading?: boolean; children?: ReactNode; className?: string; - style?: CSSProperties; }; // @public export interface ButtonProps - extends Omit, + extends Omit, ButtonOwnProps {} // @public @@ -876,7 +876,9 @@ export type ContainerOwnProps = { }; // @public (undocumented) -export interface ContainerProps extends ContainerOwnProps { +export interface ContainerProps + extends ContainerOwnProps, + Omit, keyof ContainerOwnProps> { // (undocumented) mb?: SpaceProps['mb']; // (undocumented) @@ -950,7 +952,9 @@ export type DialogBodyOwnProps = { }; // @public -export interface DialogBodyProps extends DialogBodyOwnProps {} +export interface DialogBodyProps + extends DialogBodyOwnProps, + Omit, keyof DialogBodyOwnProps> {} // @public export const DialogDefinition: { @@ -1092,7 +1096,9 @@ export type FieldLabelOwnProps = { }; // @public (undocumented) -export interface FieldLabelProps extends FieldLabelOwnProps {} +export interface FieldLabelProps + extends FieldLabelOwnProps, + Omit, keyof FieldLabelOwnProps> {} // @public (undocumented) export interface FilterState { From 8211dc0f70060f5c81ddbaf2071fab14a69572ea Mon Sep 17 00:00:00 2001 From: Johan Persson Date: Tue, 3 Mar 2026 14:55:35 +0100 Subject: [PATCH 440/455] chore(ui): remove inline style from Button in Card story Signed-off-by: Johan Persson --- packages/ui/src/components/Card/Card.stories.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/ui/src/components/Card/Card.stories.tsx b/packages/ui/src/components/Card/Card.stories.tsx index 87671c4cf6..3ddde49806 100644 --- a/packages/ui/src/components/Card/Card.stories.tsx +++ b/packages/ui/src/components/Card/Card.stories.tsx @@ -239,9 +239,7 @@ export const CustomCardWithBox = meta.story({ a card-like container that participates in the bg system as a provider. - + Header From db0d17151132bd48716e124e85ca38b9140eaaad Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Mar 2026 14:16:49 +0000 Subject: [PATCH 441/455] Version Packages (next) --- .changeset/pre.json | 68 +- docs/releases/v1.49.0-next.1-changelog.md | 1567 +++++++++++++++++ package.json | 2 +- packages/app-legacy/CHANGELOG.md | 44 + packages/app-legacy/package.json | 2 +- packages/app/CHANGELOG.md | 50 + packages/app/package.json | 2 +- packages/backend-defaults/CHANGELOG.md | 25 + packages/backend-defaults/package.json | 2 +- .../CHANGELOG.md | 29 + .../package.json | 2 +- packages/backend-test-utils/CHANGELOG.md | 16 + packages/backend-test-utils/package.json | 2 +- packages/backend/CHANGELOG.md | 42 + packages/backend/package.json | 2 +- packages/catalog-client/CHANGELOG.md | 20 + packages/catalog-client/package.json | 2 +- packages/cli-common/CHANGELOG.md | 8 + packages/cli-common/package.json | 2 +- packages/cli-node/CHANGELOG.md | 12 + packages/cli-node/package.json | 2 +- packages/cli/CHANGELOG.md | 27 + packages/cli/package.json | 2 +- packages/core-compat-api/CHANGELOG.md | 12 + packages/core-compat-api/package.json | 2 +- packages/create-app/CHANGELOG.md | 23 + packages/create-app/package.json | 2 +- packages/dev-utils/CHANGELOG.md | 15 + packages/dev-utils/package.json | 2 +- .../CHANGELOG.md | 9 + .../package.json | 2 +- packages/frontend-test-utils/CHANGELOG.md | 19 + packages/frontend-test-utils/package.json | 2 +- packages/integration-react/CHANGELOG.md | 9 + packages/integration-react/package.json | 2 +- packages/integration/CHANGELOG.md | 18 + packages/integration/package.json | 2 +- .../module-federation-common/CHANGELOG.md | 10 + .../module-federation-common/package.json | 2 +- packages/repo-tools/CHANGELOG.md | 18 + packages/repo-tools/package.json | 2 +- .../techdocs-cli-embedded-app/CHANGELOG.md | 21 + .../techdocs-cli-embedded-app/package.json | 2 +- packages/techdocs-cli/CHANGELOG.md | 11 + packages/techdocs-cli/package.json | 2 +- packages/ui/CHANGELOG.md | 103 ++ packages/ui/package.json | 2 +- plugins/api-docs/CHANGELOG.md | 15 + plugins/api-docs/package.json | 2 +- plugins/app-visualizer/CHANGELOG.md | 10 + plugins/app-visualizer/package.json | 2 +- plugins/app/CHANGELOG.md | 16 + plugins/app/package.json | 2 +- plugins/auth-backend/CHANGELOG.md | 14 + plugins/auth-backend/package.json | 2 +- plugins/auth-node/CHANGELOG.md | 12 + plugins/auth-node/package.json | 2 +- plugins/bitbucket-cloud-common/CHANGELOG.md | 7 + plugins/bitbucket-cloud-common/package.json | 2 +- .../catalog-backend-module-aws/CHANGELOG.md | 16 + .../catalog-backend-module-aws/package.json | 2 +- .../catalog-backend-module-azure/CHANGELOG.md | 11 + .../catalog-backend-module-azure/package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../catalog-backend-module-gitea/CHANGELOG.md | 12 + .../catalog-backend-module-gitea/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 48 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- plugins/catalog-backend/CHANGELOG.md | 37 + plugins/catalog-backend/package.json | 2 +- plugins/catalog-graph/CHANGELOG.md | 13 + plugins/catalog-graph/package.json | 2 +- plugins/catalog-import/CHANGELOG.md | 18 + plugins/catalog-import/package.json | 2 +- plugins/catalog-node/CHANGELOG.md | 15 + plugins/catalog-node/package.json | 2 +- plugins/catalog-react/CHANGELOG.md | 26 + plugins/catalog-react/package.json | 2 +- plugins/catalog/CHANGELOG.md | 30 + plugins/catalog/package.json | 2 +- plugins/devtools/CHANGELOG.md | 15 + plugins/devtools/package.json | 2 +- .../events-backend-module-github/CHANGELOG.md | 11 + .../events-backend-module-github/package.json | 2 +- plugins/events-backend/CHANGELOG.md | 16 + plugins/events-backend/package.json | 2 +- plugins/home/CHANGELOG.md | 17 + plugins/home/package.json | 2 +- plugins/kubernetes-backend/CHANGELOG.md | 18 + plugins/kubernetes-backend/package.json | 2 +- plugins/kubernetes-cluster/CHANGELOG.md | 13 + plugins/kubernetes-cluster/package.json | 2 +- plugins/kubernetes/CHANGELOG.md | 14 + plugins/kubernetes/package.json | 2 +- plugins/mcp-actions-backend/CHANGELOG.md | 12 + plugins/mcp-actions-backend/package.json | 2 +- plugins/mui-to-bui/CHANGELOG.md | 10 + plugins/mui-to-bui/package.json | 2 +- .../CHANGELOG.md | 15 + .../package.json | 2 +- plugins/notifications-node/CHANGELOG.md | 11 + plugins/notifications-node/package.json | 2 +- plugins/org-react/CHANGELOG.md | 11 + plugins/org-react/package.json | 2 +- plugins/org/CHANGELOG.md | 12 + plugins/org/package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 13 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 11 + .../package.json | 2 +- .../CHANGELOG.md | 14 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- .../CHANGELOG.md | 10 + .../package.json | 2 +- plugins/scaffolder-backend/CHANGELOG.md | 27 + plugins/scaffolder-backend/package.json | 2 +- plugins/scaffolder-common/CHANGELOG.md | 19 + plugins/scaffolder-common/package.json | 2 +- .../scaffolder-node-test-utils/CHANGELOG.md | 10 + .../scaffolder-node-test-utils/package.json | 2 +- plugins/scaffolder-node/CHANGELOG.md | 19 + plugins/scaffolder-node/package.json | 2 +- plugins/scaffolder-react/CHANGELOG.md | 20 + plugins/scaffolder-react/package.json | 2 +- plugins/scaffolder/CHANGELOG.md | 23 + plugins/scaffolder/package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- .../CHANGELOG.md | 16 + .../package.json | 2 +- plugins/search-backend/CHANGELOG.md | 19 + plugins/search-backend/package.json | 2 +- plugins/search/CHANGELOG.md | 15 + plugins/search/package.json | 2 +- .../techdocs-addons-test-utils/CHANGELOG.md | 15 + .../techdocs-addons-test-utils/package.json | 2 +- plugins/techdocs-backend/CHANGELOG.md | 16 + plugins/techdocs-backend/package.json | 2 +- .../CHANGELOG.md | 12 + .../package.json | 2 +- plugins/techdocs-node/CHANGELOG.md | 15 + plugins/techdocs-node/package.json | 2 +- plugins/techdocs/CHANGELOG.md | 23 + plugins/techdocs/package.json | 2 +- plugins/user-settings/CHANGELOG.md | 17 + plugins/user-settings/package.json | 2 +- 181 files changed, 3284 insertions(+), 92 deletions(-) create mode 100644 docs/releases/v1.49.0-next.1-changelog.md diff --git a/.changeset/pre.json b/.changeset/pre.json index 7113b1ee96..22e669095e 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -212,41 +212,105 @@ }, "changesets": [ "add-masked-and-hidden-option", + "add-query-catalog-entities-action", + "add-who-am-i-action", "blue-moons-crash", + "bright-items-see", "bright-moons-open", "brown-towns-find", "bump-bfj-v9", + "bumpy-colts-teach", + "bumpy-keys-pay", + "by-refs-predicate-backend", + "by-refs-predicate-client", + "calm-vans-play", + "chatty-wasps-sink", + "clean-up-own-root-dir", "cli-common-cached-paths", + "cli-execute-loader", "cli-internal-refactor", + "cli-internalize-lib-modules", + "cli-node-lockfile-tostring", "cli-node-parallel-helpers", + "cli-remove-migrate-package-exports", + "cli-report-parser-cleye", + "cli-split-loadCliConfig", "cli-translations-export-import", + "cli-versioning-consolidation", + "cold-dodos-think", + "crazy-ravens-reply", + "cyan-falcons-serve", + "dark-snakes-nail", + "deep-files-clap", + "deep-moments-deny", "dependabot-d2ec7e9", + "early-baboons-roll", + "entity-content-group-api-docs", + "entity-content-group-techdocs", + "entity-page-group-aliases-and-ordering-catalog", + "entity-page-group-aliases-and-ordering", + "facets-predicate-backend", + "facets-predicate-client", "fancy-ends-turn", + "fine-poems-sit", + "fix-entity-tab-group-ordering", + "fix-form-fields-api-export-react", "fix-frontend-feature-compat", + "fix-mcp-error-forwarding", + "fix-mui-styles-shared-dep", "fix-prettier-existence-check", + "fix-tab-match-query-params", + "fix-test-api-pair-inference", "fluffy-owls-act", + "free-pigs-itch", + "giant-singers-rush", + "github-org-verified-emails", + "heavy-baths-mix", + "itchy-words-crash", + "khaki-days-arrive", + "legal-ants-show", "long-hairs-throw", + "loud-cups-tickle", + "lucky-baboons-follow", "mean-fans-decide", "metal-humans-move", "migrate-to-target-paths", + "move-clean-pack-to-build", + "move-utils-to-cli-node", "ninety-corners-flash", + "odd-laws-attack", "orange-mugs-post-1", "orange-mugs-post-2", "pink-terms-know", "polite-singers-lead", "pretty-days-taste", "rare-adults-attack", + "rare-falcons-pump", "renovate-8b1c21e", + "rich-ducks-ring", "rude-groups-shout", - "scaffolder-export-form-fields-api", + "scaffolder-common-required-methods", + "scaffolder-react-api-mock", + "scaffolder-service-ref", + "sharp-ravens-shop", + "silly-shrimps-start", "silver-pigs-remain", + "six-trees-carry", "sixty-pianos-begin", + "slick-dogs-pay", + "slow-items-pull", "stable-translation-plugin-app", "stable-translation-test-utils", "stupid-pans-hope", "swift-flowers-grin", "swift-ravens-jog", + "tangy-clouds-repeat", + "tiny-zoos-smash", "tired-bushes-write", - "twenty-worlds-create" + "tired-clocks-repeat", + "twenty-worlds-create", + "two-lies-leave", + "violet-friends-buy", + "wide-pianos-pay" ] } diff --git a/docs/releases/v1.49.0-next.1-changelog.md b/docs/releases/v1.49.0-next.1-changelog.md new file mode 100644 index 0000000000..7110b3d0d5 --- /dev/null +++ b/docs/releases/v1.49.0-next.1-changelog.md @@ -0,0 +1,1567 @@ +# Release v1.49.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.49.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.49.0-next.1) + +## @backstage/integration@2.0.0-next.1 + +### Major Changes + +- 527cf88: **BREAKING** Removed deprecated Azure DevOps, Bitbucket, Gerrit and GitHub code: + + - For Azure DevOps, the long deprecated `token` string and `credential` object have been removed from the `config.d.ts`. Use the `credentials` array object instead. + - For Bitbucket, the long deprecated `bitbucket` object has been removed from the `config.d.ts`. Use the `bitbucketCloud` or `bitbucketServer` objects instead. + - For Gerrit, the `parseGerritGitilesUrl` function has been removed, use `parseGitilesUrlRef` instead. The `buildGerritGitilesArchiveUrl` function has also been removed, use `buildGerritGitilesArchiveUrlFromLocation` instead. + - For GitHub, the `getGitHubRequestOptions` function has been removed. + +### Patch Changes + +- 993a598: Fixed Azure integration config schema visibility annotations to use per-field `@visibility secret` instead of `@deepVisibility secret` on parent objects, so that non-secret fields like `clientId`, `tenantId`, `organizations`, and `managedIdentityClientId` are no longer incorrectly marked as secret. +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-common@2.0.0-next.1 + +### Major Changes + +- 527cf88: **BREAKING** Removed deprecated `bitbucket` integration from being registered in the `ScaffolderClient`. Use the `bitbucketCloud` or `bitbucketServer` integrations instead. + +### Minor Changes + +- f598909: **BREAKING PRODUCERS**: Made `retry`, `listTasks`, `listTemplatingExtensions`, `dryRun`, and `autocomplete` required methods on the `ScaffolderApi` interface. Implementations of `ScaffolderApi` must now provide these methods. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/backend-defaults@0.16.0-next.1 + +### Minor Changes + +- 0e7d8f9: The scheduler service now uses the metrics service to create metrics, providing plugin-scoped attribution. +- 527cf88: **BREAKING** Removed deprecated `BitbucketUrlReader`. Use the `BitbucketCloudUrlReader` or the `BitbucketServerUrlReader` instead. + +### Patch Changes + +- 62f0a53: Fixed error forwarding in the actions registry so that known errors like `InputError` and `NotFoundError` thrown by actions preserve their original status codes and messages instead of being wrapped in `ForwardedError` and coerced to 500. +- Updated dependencies + - @backstage/cli-node@0.2.19-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/backend-app-api@1.5.1-next.0 + - @backstage/backend-dev-utils@0.1.7 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/backend-dynamic-feature-service@0.8.0-next.1 + +### Minor Changes + +- 0fbcf23: Migrated OpenAPI schemas to 3.1. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.5.0-next.1 + - @backstage/cli-common@0.2.0-next.1 + - @backstage/cli-node@0.2.19-next.1 + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/plugin-events-backend@0.6.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.43-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/catalog-client@1.14.0-next.1 + +### Minor Changes + +- 972f686: Added support for the `query` field in `getEntitiesByRefs` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 56c908e: Added support for the `query` field in `getEntityFacets` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 0fbcf23: Migrated OpenAPI schemas to 3.1. +- 51e23eb: Added predicate-based entity filtering via POST /entities/by-query endpoint. + + Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$hasPrefix`, and (partially) `$contains` operators for expressive entity queries. Integrated into the existing `queryEntities` flow with full cursor-based pagination, permission enforcement, and `totalItems` support. + + The catalog client's `queryEntities()` method automatically routes to the POST endpoint when a `query` predicate is provided. + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + +## @backstage/cli@0.36.0-next.1 + +### Minor Changes + +- b36a60d: **BREAKING**: The `migrate package-exports` command has been removed. Use `repo fix` instead. + +### Patch Changes + +- 0d2d0f2: Internal refactor of CLI modularization, moving individual commands to be implemented with cleye. +- 2fcba39: Internal refactor to move shared utilities into their consuming modules, reducing cross-module dependencies. +- c85ac86: Internal refactor to split `loadCliConfig` into separate implementations for the build and config CLI modules, removing a cross-module dependency. +- 61cb976: Migrated internal versioning utilities to use `@backstage/cli-node` instead of a local implementation. +- 825c81d: Internal refactor of CLI command modules. +- a9d23c4: Properly support `package.json` `workspaces` field +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + - @backstage/cli-node@0.2.19-next.1 + - @backstage/module-federation-common@0.1.2-next.0 + - @backstage/integration@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.2.2-next.0 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + +## @backstage/repo-tools@0.17.0-next.1 + +### Minor Changes + +- 0fbcf23: Added support for OpenAPI 3.1 to all `schema openapi` commands. The commands now auto-detect the OpenAPI version from the spec file and use the appropriate generator, supporting both OpenAPI 3.0.x and 3.1.x specifications. + +### Patch Changes + +- 426edbe: Fixed `generate-catalog-info` command failing with "too many arguments" when invoked by lint-staged via the pre-commit hook. +- d5779e5: Updated the CLI report parser to support cleye-style help output, and strip ANSI escape codes from captured output. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + - @backstage/cli-node@0.2.19-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/errors@1.2.7 + +## @backstage/ui@0.13.0-next.1 + +### Minor Changes + +- 768f09d: **BREAKING**: Simplified the neutral background prop API for container components. The explicit `neutral-1`, `neutral-2`, `neutral-3`, and `neutral-auto` values have been removed from `ProviderBg`. They are replaced by a single `'neutral'` value that always auto-increments from the parent context, making it impossible to skip or pin to an explicit neutral level. + + **Migration:** + + Replace any explicit `bg="neutral-1"`, `bg="neutral-2"`, `bg="neutral-3"`, or `bg="neutral-auto"` props with `bg="neutral"`. To achieve a specific neutral level in stories or tests, use nested containers — each additional `bg="neutral"` wrapper increments by one level. + + ```tsx + // Before + ... + + // After + + ... + + ``` + + **Affected components:** Box, Flex, Grid, Card, Accordion, Popover, Tooltip, Dialog, Menu + +- b42fcdc: **BREAKING**: Removed `--bui-bg-popover` CSS token. Popover, Tooltip, Menu, and Dialog now use `--bui-bg-app` for their outer shell and `Box bg="neutral-1"` for content areas, providing better theme consistency and eliminating a redundant token. + + **Migration:** + + Replace any usage of `--bui-bg-popover` with `--bui-bg-neutral-1` (for content surfaces) or `--bui-bg-app` (for outer shells): + + ```diff + - background: var(--bui-bg-popover); + + background: var(--bui-bg-neutral-1); + ``` + + **Affected components:** Popover, Tooltip, Menu, Dialog + +- bd3a76e: **BREAKING**: Data attributes rendered by components are now always lowercase. This affects CSS selectors targeting camelCase data attributes. + + **Migration:** + + Update any custom CSS selectors that target camelCase data attributes to use lowercase instead: + + ```diff + - [data-startCollapsed='true'] { ... } + + [data-startcollapsed='true'] { ... } + ``` + + **Affected components:** SearchField + +- 95702ab: **BREAKING**: Removed deprecated types `ComponentDefinition`, `ClassNamesMap`, `DataAttributeValues`, and `DataAttributesMap` from the public API. These were internal styling infrastructure types that have been replaced by the `defineComponent` system. + + **Migration:** + + Remove any direct usage of these types. Component definitions now use `defineComponent()` and their shapes are not part of the public API contract. + + ```diff + - import type { ComponentDefinition, ClassNamesMap } from '@backstage/ui'; + ``` + + If you were reading `definition.dataAttributes`, use `definition.propDefs` instead — props with `dataAttribute: true` in `propDefs` are the equivalent. + +### Patch Changes + +- 58224d3: Fixed neutral-1 hover & pressed state in light mode. + +- 95702ab: Migrated all components from `useStyles` to `useDefinition` hook. Exported `OwnProps` types for each component, enabling better type composition for consumers. + + **Affected components:** Avatar, Checkbox, Container, Dialog, FieldError, FieldLabel, Flex, FullPage, Grid, HeaderPage, Link, Menu, PasswordField, PluginHeader, Popover, RadioGroup, SearchField, Select, Skeleton, Switch, Table, TablePagination, Tabs, TagGroup, Text, TextField, ToggleButton, ToggleButtonGroup, Tooltip, VisuallyHidden + +- 4c2c350: Removed the `transition` on `Container` padding to prevent an unwanted animation when the viewport is resized. + + Affected components: Container + +- d4fa5b4: Fixed tab `matchStrategy` matching to ignore query parameters and hash fragments in tab `href` values. Previously, tabs with query params in their `href` (e.g., `/page?group=foo`) would never show as active since matching compared the full `href` string against `location.pathname` which never includes query params. + + **Affected components:** Tabs, PluginHeader + +- 36987db: Fixed handling of the `style` prop on `Button`, `ButtonIcon`, and `ButtonLink` so that it is now correctly forwarded to the underlying element instead of being silently dropped. + + **Affected components:** Button, ButtonIcon, ButtonLink + +- 95702ab: Fixed Link variant default from `'body'` to `'body-medium'` to match actual CSS selectors. The previous default did not correspond to a valid variant value. + + **Affected components:** Link + +- 9027b10: Fixed scroll overflow in Menu and Select popover content when constrained by viewport height. + + **Affected components:** Menu, Select + +- 4105a78: Merged the internal `PluginHeaderToolbar` component into `PluginHeader`, removing the separate component and its associated types (`PluginHeaderToolbarOwnProps`, `PluginHeaderToolbarProps`) and definition (`PluginHeaderToolbarDefinition`). This is an internal refactor with no changes to the public API of `PluginHeader`. + + **Affected components:** PluginHeader + +- b303857: Fixed `isRequired` prop not being passed to the underlying React Aria field components in TextField, SearchField, and PasswordField. Previously, `isRequired` was consumed locally for the secondary label text but never forwarded, which meant the input elements lacked `aria-required="true"` and React Aria's built-in required validation was not activated. + + **Affected components:** TextField, SearchField, PasswordField + +- cd3cb0f: Improved `useBreakpoint` performance by sharing a single set of `matchMedia` listeners across all component instances instead of creating independent listeners per hook call. + +- 36987db: Extended `AlertProps`, `ContainerProps`, `DialogBodyProps`, and `FieldLabelProps` with native div element props to allow passing attributes like `aria-*` and `data-*`. + + **Affected components:** Alert, Container, DialogBody, FieldLabel + +- Updated dependencies + - @backstage/version-bridge@1.0.12 + +## @backstage/plugin-catalog@1.34.0-next.1 + +### Minor Changes + +- 4d58894: Added support for group alias IDs and configurable content ordering on the entity page. Groups can now declare `aliases` so that content targeting an aliased group is included in the group. A new `defaultContentOrder` option (default `title`) controls how content items within each group are sorted, with support for both a page-level default and per-group overrides. + +### Patch Changes + +- 07ba746: Fixed entity page tab groups not respecting the ordering from the `groups` configuration. +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-catalog-backend@3.5.0-next.1 + +### Minor Changes + +- a6b2819: Added `query-catalog-entities` action to the catalog backend actions registry. Supports predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 972f686: Added support for predicate-based filtering on the `/entities/by-refs` endpoint via the `query` field in the request body. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 56c908e: Added support for predicate-based filtering on the `/entity-facets` endpoint via a new `POST` method. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 0fbcf23: Migrated OpenAPI schemas to 3.1. +- 51e23eb: Added predicate-based entity filtering via POST /entities/by-query endpoint. + + Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$hasPrefix`, and (partially) `$contains` operators for expressive entity queries. Integrated into the existing `queryEntities` flow with full cursor-based pagination, permission enforcement, and `totalItems` support. + + The catalog client's `queryEntities()` method automatically routes to the POST endpoint when a `query` predicate is provided. + +### Patch Changes + +- 72747b4: Deprecated two processors as they have been moved to the Community Plugins repo with their own backend modules: + + - `AnnotateScmSlugEntityProcessor`: Use `@backstage-community/plugin-catalog-backend-module-annotate-scm-slug` instead + - `CodeOwnersProcessor`: Use `@backstage-community/plugin-catalog-backend-module-codeowners` instead + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.13.0-next.1 + +### Minor Changes + +- b11c2cd: The default user transformer now prefers organization verified domain emails over the user's public GitHub email when populating the user entity profile. It also strips plus-addressed routing tags that GitHub adds to these emails. + + If you want to retain the old behavior, you can do so with a custom user transformer using the `githubOrgEntityProviderTransformsExtensionPoint`: + + ```ts + import { createBackendModule } from '@backstage/backend-plugin-api'; + import { githubOrgEntityProviderTransformsExtensionPoint } from '@backstage/plugin-catalog-backend-module-github-org'; + import { defaultUserTransformer } from '@backstage/plugin-catalog-backend-module-github'; + + export default createBackendModule({ + pluginId: 'catalog', + moduleId: 'github-org-custom-transforms', + register(env) { + env.registerInit({ + deps: { + transforms: githubOrgEntityProviderTransformsExtensionPoint, + }, + async init({ transforms }) { + transforms.setUserTransformer(async (item, ctx) => { + const entity = await defaultUserTransformer(item, ctx); + if (entity && item.email) { + entity.spec.profile!.email = item.email; + } + return entity; + }); + }, + }); + }, + }); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-react@2.1.0-next.1 + +### Minor Changes + +- 4d58894: Added `aliases` and `contentOrder` fields to `EntityContentGroupDefinition`, allowing groups to declare alias IDs and control the sort order of their content items. + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/frontend-test-utils@0.5.1-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-events-backend@0.6.0-next.1 + +### Minor Changes + +- 0fbcf23: Migrated OpenAPI schemas to 3.1. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-scaffolder-backend@3.2.0-next.1 + +### Minor Changes + +- c9b11eb: Added a new `list-scaffolder-tasks` action that allows querying scaffolder tasks with optional ownership filtering and pagination support +- 0fbcf23: Migrated OpenAPI schemas to 3.1. +- 7695dd2: Added a new `list-scaffolder-actions` action that returns all installed scaffolder actions with their schemas and examples + +### Patch Changes + +- e27bd4e: Removed `@backstage/plugin-scaffolder-backend-module-bitbucket` from `package.json` as the package itself has been deprecated and the code deleted. +- ccc20cf: create scaffolder MCP action to dry run a provided scaffolder template +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-scaffolder-node@0.13.0-next.1 + +### Minor Changes + +- e27bd4e: **BREAKING** Removed deprecated `bitbucket` integration from being used in the `parseRepoUrl` function. It will use the `bitbucketCloud` or `bitbucketServer` integrations instead. + +### Patch Changes + +- f598909: Added `scaffolderServiceRef` and `ScaffolderService` interface for backend plugins that need to interact with the scaffolder API using `BackstageCredentials` instead of raw tokens. +- Updated dependencies + - @backstage/backend-test-utils@1.11.1-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/plugin-search-backend@2.1.0-next.1 + +### Minor Changes + +- 0fbcf23: Migrated OpenAPI schemas to 3.1. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/backend-test-utils@1.11.1-next.1 + +### Patch Changes + +- 62f0a53: Fixed error forwarding in the actions registry so that known errors like `InputError` and `NotFoundError` thrown by actions preserve their original status codes and messages instead of being wrapped in `ForwardedError` and coerced to 500. +- Updated dependencies + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/backend-app-api@1.5.1-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/cli-common@0.2.0-next.1 + +### Patch Changes + +- e44b6a9: The `findOwnRootDir` utility now searches for the monorepo root by traversing up the directory tree looking for a `package.json` with `workspaces`, instead of assuming a fixed `../..` relative path. If no workspaces root is found during this traversal, `findOwnRootDir` now throws to enforce stricter validation of the repository layout. +- Updated dependencies + - @backstage/errors@1.2.7 + +## @backstage/cli-node@0.2.19-next.1 + +### Patch Changes + +- 61cb976: Added `toString()` method to `Lockfile` for serializing lockfiles back to string format. +- 3c811bf: Added `hasBackstageYarnPlugin` and `SuccessCache` exports, moved from `@backstage/cli`. +- a9d23c4: Properly support `package.json` `workspaces` field +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/core-compat-api@0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + +## @backstage/create-app@0.7.10-next.1 + +### Patch Changes + +- a9d23c4: Properly support `package.json` `workspaces` field + +- ebd4630: Replace deprecated `workspaces.packages` with `workspaces` in `package.json` + + This change is **not** required, but you can edit your main `package.json`, to fit the more modern & more common pattern: + + ```diff + - "workspaces": { + - "packages": [ + "workspaces": [ + "packages/*", + "plugins/*" + - ] + - }, + ], + ``` + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + +## @backstage/dev-utils@1.1.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + +## @backstage/frontend-dynamic-feature-loader@0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/module-federation-common@0.1.2-next.0 + - @backstage/config@1.3.6 + - @backstage/frontend-plugin-api@0.14.2-next.0 + +## @backstage/frontend-test-utils@0.5.1-next.1 + +### Patch Changes + +- 479282f: Fixed type inference of `TestApiPair` when using tuple syntax by wrapping `MockWithApiFactory` in `NoInfer`. +- Updated dependencies + - @backstage/plugin-app@0.4.1-next.1 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/integration-react@1.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @backstage/module-federation-common@0.1.2-next.0 + +### Patch Changes + +- 0cb5646: Fixed the `@mui/material/styles` shared dependency key by removing a trailing slash that caused module resolution failures with MUI package exports. +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @techdocs/cli@1.10.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + - @backstage/plugin-techdocs-node@1.14.3-next.1 + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + +## @backstage/plugin-api-docs@0.13.5-next.1 + +### Patch Changes + +- 30e08df: Added default entity content groups for the API docs entity content tabs. The API definition tab defaults to the `documentation` group and the APIs tab defaults to the `development` group. +- Updated dependencies + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-app@0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-app-visualizer@0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + +## @backstage/plugin-auth-backend@0.27.1-next.1 + +### Patch Changes + +- 1ccad86: Added `who-am-i` action to the auth backend actions registry. Returns the catalog entity and user info for the currently authenticated user. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-node@0.6.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-bitbucket-cloud-common@0.3.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-kubernetes-common@0.9.10 + +## @backstage/plugin-catalog-backend-module-azure@0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-bitbucket-cloud-common@0.3.8-next.1 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.13.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.5.0-next.1 + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-catalog-graph@0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-import@0.13.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-catalog-node@2.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/backend-test-utils@1.11.1-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-devtools@0.1.37-next.1 + +### Patch Changes + +- afabb37: Fixed URL encoding of task IDs for the trigger feature (tasks that contained a "/" in their ID were not triggered) +- Updated dependencies + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-devtools-common@0.1.22 + - @backstage/plugin-devtools-react@0.1.2-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-events-backend-module-github@0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + +## @backstage/plugin-home@0.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-home-react@0.1.36-next.0 + +## @backstage/plugin-kubernetes@0.12.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-react@0.5.17-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-kubernetes-backend@0.21.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-node@0.4.2-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-react@0.5.17-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-mcp-actions-backend@0.1.10-next.1 + +### Patch Changes + +- 62f0a53: Fixed error forwarding in the actions registry so that known errors like `InputError` and `NotFoundError` thrown by actions preserve their original status codes and messages instead of being wrapped in `ForwardedError` and coerced to 500. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-mui-to-bui@0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + +## @backstage/plugin-notifications-backend-module-email@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/plugin-notifications-node@0.2.24-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.1 + +## @backstage/plugin-notifications-node@0.2.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-signals-node@0.1.29-next.0 + +## @backstage/plugin-org@0.6.50-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-common@1.1.8 + +## @backstage/plugin-org-react@0.1.48-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + +## @backstage/plugin-scaffolder@1.35.5-next.1 + +### Patch Changes + +- e27bd4e: Removed check for deprecated `bitbucket` integration from `repoPickerValidation` function used by the `RepoUrlPicker`, it now validates the `bitbucketServer` and `bitbucketCloud` integrations instead. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/plugin-scaffolder-react@1.19.8-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-bitbucket-cloud-common@0.3.8-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.4-next.1 + +### Patch Changes + +- 0c1726a: Added new `gitlab:group:access` scaffolder action to add or remove users and groups as members of GitLab groups. The action supports specifying members via `userIds` and/or `groupIds` array parameters, configurable access levels (Guest, Reporter, Developer, Maintainer, Owner), and defaults to the 'add' action when not specified. +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/plugin-notifications-node@0.2.24-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-notifications-common@0.2.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node-test-utils@0.3.9-next.1 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.11.1-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-react@1.19.8-next.1 + +### Patch Changes + +- 004b5c1: Added back `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. +- f598909: Added `scaffolderApiMock` test utility, exported from `@backstage/plugin-scaffolder-react/testUtils`. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/frontend-test-utils@0.5.1-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.4.41-next.0 + +## @backstage/plugin-search@1.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.3.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-search-backend-module-techdocs@0.4.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-techdocs-node@1.14.3-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + +## @backstage/plugin-techdocs@1.17.1-next.1 + +### Patch Changes + +- 30e08df: Added `documentation` as the default entity content group for the TechDocs entity content tab. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.17.1-next.1 + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-techdocs-backend@2.1.6-next.1 + +### Patch Changes + +- cb7c6b1: Added `techdocs.generator.mkdocs.dangerouslyAllowAdditionalKeys` configuration option to explicitly bypass MkDocs configuration key restrictions. This enables support for additional MkDocs configuration keys beyond the default safe allow list, such as the `hooks` key which some MkDocs plugins require. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-techdocs-node@1.14.3-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + +## @backstage/plugin-techdocs-node@1.14.3-next.1 + +### Patch Changes + +- cb7c6b1: Added `techdocs.generator.mkdocs.dangerouslyAllowAdditionalKeys` configuration option to explicitly bypass MkDocs configuration key restrictions. This enables support for additional MkDocs configuration keys beyond the default safe allow list, such as the `hooks` key which some MkDocs plugins require. +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-user-settings@0.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.20-next.0 + - @backstage/plugin-user-settings-common@0.1.0 + +## example-app@0.0.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/cli@0.36.0-next.1 + - @backstage/plugin-devtools@0.1.37-next.1 + - @backstage/plugin-scaffolder@1.35.5-next.1 + - @backstage/plugin-api-docs@0.13.5-next.1 + - @backstage/plugin-techdocs@1.17.1-next.1 + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/plugin-scaffolder-react@1.19.8-next.1 + - @backstage/plugin-app@0.4.1-next.1 + - @backstage/plugin-app-visualizer@0.2.1-next.1 + - @backstage/plugin-catalog-graph@0.5.8-next.1 + - @backstage/plugin-catalog-import@0.13.11-next.1 + - @backstage/plugin-home@0.9.3-next.1 + - @backstage/plugin-org@0.6.50-next.1 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-auth@0.1.6-next.0 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + - @backstage/plugin-home-react@0.1.36-next.0 + - @backstage/plugin-kubernetes@0.12.17-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.35-next.1 + - @backstage/plugin-notifications@0.5.15-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-search@1.6.2-next.1 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-signals@0.0.29-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + - @backstage/plugin-user-settings@0.9.1-next.1 + +## example-app-legacy@0.2.119-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/cli@0.36.0-next.1 + - @backstage/plugin-devtools@0.1.37-next.1 + - @backstage/plugin-scaffolder@1.35.5-next.1 + - @backstage/plugin-api-docs@0.13.5-next.1 + - @backstage/plugin-techdocs@1.17.1-next.1 + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/plugin-scaffolder-react@1.19.8-next.1 + - @backstage/plugin-mui-to-bui@0.2.5-next.1 + - @backstage/plugin-catalog-graph@0.5.8-next.1 + - @backstage/plugin-catalog-import@0.13.11-next.1 + - @backstage/plugin-home@0.9.3-next.1 + - @backstage/plugin-org@0.6.50-next.1 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + - @backstage/plugin-home-react@0.1.36-next.0 + - @backstage/plugin-kubernetes@0.12.17-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.35-next.1 + - @backstage/plugin-notifications@0.5.15-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-search@1.6.2-next.1 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-signals@0.0.29-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + - @backstage/plugin-user-settings@0.9.1-next.1 + +## example-backend@0.0.48-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.5.0-next.1 + - @backstage/plugin-auth-backend@0.27.1-next.1 + - @backstage/plugin-techdocs-backend@2.1.6-next.1 + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/plugin-scaffolder-backend@3.2.0-next.1 + - @backstage/plugin-mcp-actions-backend@0.1.10-next.1 + - @backstage/plugin-events-backend@0.6.0-next.1 + - @backstage/plugin-search-backend@2.1.0-next.1 + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/plugin-kubernetes-backend@0.21.2-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.13-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.12-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-app-backend@0.5.12-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.5.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.17-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.5-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.12-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.20-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.18-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.9-next.0 + - @backstage/plugin-devtools-backend@0.5.15-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.2.1-next.0 + - @backstage/plugin-notifications-backend@0.6.3-next.0 + - @backstage/plugin-permission-backend@0.7.10-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.17-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-proxy-backend@0.6.11-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.7-next.1 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.20-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.12-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-signals-backend@0.3.13-next.0 + +## techdocs-cli-embedded-app@0.2.118-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/cli@0.36.0-next.1 + - @backstage/plugin-techdocs@1.17.1-next.1 + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 diff --git a/package.json b/package.json index 7fcbb27ccb..ac79d5976c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.49.0-next.0", + "version": "1.49.0-next.1", "backstage": { "cli": { "new": { diff --git a/packages/app-legacy/CHANGELOG.md b/packages/app-legacy/CHANGELOG.md index c0e84cb9d7..2ce716d27e 100644 --- a/packages/app-legacy/CHANGELOG.md +++ b/packages/app-legacy/CHANGELOG.md @@ -1,5 +1,49 @@ # example-app-legacy +## 0.2.119-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/cli@0.36.0-next.1 + - @backstage/plugin-devtools@0.1.37-next.1 + - @backstage/plugin-scaffolder@1.35.5-next.1 + - @backstage/plugin-api-docs@0.13.5-next.1 + - @backstage/plugin-techdocs@1.17.1-next.1 + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/plugin-scaffolder-react@1.19.8-next.1 + - @backstage/plugin-mui-to-bui@0.2.5-next.1 + - @backstage/plugin-catalog-graph@0.5.8-next.1 + - @backstage/plugin-catalog-import@0.13.11-next.1 + - @backstage/plugin-home@0.9.3-next.1 + - @backstage/plugin-org@0.6.50-next.1 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + - @backstage/plugin-home-react@0.1.36-next.0 + - @backstage/plugin-kubernetes@0.12.17-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.35-next.1 + - @backstage/plugin-notifications@0.5.15-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-search@1.6.2-next.1 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-signals@0.0.29-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + - @backstage/plugin-user-settings@0.9.1-next.1 + ## 0.2.119-next.0 ### Patch Changes diff --git a/packages/app-legacy/package.json b/packages/app-legacy/package.json index 4bdf649665..0de94c265a 100644 --- a/packages/app-legacy/package.json +++ b/packages/app-legacy/package.json @@ -1,6 +1,6 @@ { "name": "example-app-legacy", - "version": "0.2.119-next.0", + "version": "0.2.119-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 37e2dcfdb5..59f5989650 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,55 @@ # example-app +## 0.0.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/cli@0.36.0-next.1 + - @backstage/plugin-devtools@0.1.37-next.1 + - @backstage/plugin-scaffolder@1.35.5-next.1 + - @backstage/plugin-api-docs@0.13.5-next.1 + - @backstage/plugin-techdocs@1.17.1-next.1 + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/plugin-scaffolder-react@1.19.8-next.1 + - @backstage/plugin-app@0.4.1-next.1 + - @backstage/plugin-app-visualizer@0.2.1-next.1 + - @backstage/plugin-catalog-graph@0.5.8-next.1 + - @backstage/plugin-catalog-import@0.13.11-next.1 + - @backstage/plugin-home@0.9.3-next.1 + - @backstage/plugin-org@0.6.50-next.1 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-auth@0.1.6-next.0 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-catalog-unprocessed-entities@0.2.27-next.0 + - @backstage/plugin-home-react@0.1.36-next.0 + - @backstage/plugin-kubernetes@0.12.17-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.35-next.1 + - @backstage/plugin-notifications@0.5.15-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-search@1.6.2-next.1 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-signals@0.0.29-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.34-next.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + - @backstage/plugin-user-settings@0.9.1-next.1 + ## 0.0.33-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 7283f3064f..e79ba2775c 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.0.33-next.0", + "version": "0.0.33-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md index 9ca1fae948..05f54be89f 100644 --- a/packages/backend-defaults/CHANGELOG.md +++ b/packages/backend-defaults/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/backend-defaults +## 0.16.0-next.1 + +### Minor Changes + +- 0e7d8f9: The scheduler service now uses the metrics service to create metrics, providing plugin-scoped attribution. +- 527cf88: **BREAKING** Removed deprecated `BitbucketUrlReader`. Use the `BitbucketCloudUrlReader` or the `BitbucketServerUrlReader` instead. + +### Patch Changes + +- 62f0a53: Fixed error forwarding in the actions registry so that known errors like `InputError` and `NotFoundError` thrown by actions preserve their original status codes and messages instead of being wrapped in `ForwardedError` and coerced to 500. +- Updated dependencies + - @backstage/cli-node@0.2.19-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/backend-app-api@1.5.1-next.0 + - @backstage/backend-dev-utils@0.1.7 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 0.15.3-next.0 ### Patch Changes diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json index 1a7e6f7e41..4aaf0408b4 100644 --- a/packages/backend-defaults/package.json +++ b/packages/backend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/backend-defaults", - "version": "0.15.3-next.0", + "version": "0.16.0-next.1", "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 24c8b882db..85387c2b74 100644 --- a/packages/backend-dynamic-feature-service/CHANGELOG.md +++ b/packages/backend-dynamic-feature-service/CHANGELOG.md @@ -1,5 +1,34 @@ # @backstage/backend-dynamic-feature-service +## 0.8.0-next.1 + +### Minor Changes + +- 0fbcf23: Migrated OpenAPI schemas to 3.1. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.5.0-next.1 + - @backstage/cli-common@0.2.0-next.1 + - @backstage/cli-node@0.2.19-next.1 + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/plugin-events-backend@0.6.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.43-next.0 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 0.7.10-next.0 ### Patch Changes diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json index 2ba6bbc68f..0e95427ca3 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.7.10-next.0", + "version": "0.8.0-next.1", "description": "Backstage dynamic feature service", "backstage": { "role": "node-library" diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md index 4e9f955a83..e372736ab0 100644 --- a/packages/backend-test-utils/CHANGELOG.md +++ b/packages/backend-test-utils/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/backend-test-utils +## 1.11.1-next.1 + +### Patch Changes + +- 62f0a53: Fixed error forwarding in the actions registry so that known errors like `InputError` and `NotFoundError` thrown by actions preserve their original status codes and messages instead of being wrapped in `ForwardedError` and coerced to 500. +- Updated dependencies + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/backend-app-api@1.5.1-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + ## 1.11.1-next.0 ### Patch Changes diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json index a4fe84b9c0..c8a6fe812d 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.11.1-next.0", + "version": "1.11.1-next.1", "description": "Test helpers library for Backstage backends", "backstage": { "role": "node-library" diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index b871e48357..8e744ff611 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,47 @@ # example-backend +## 0.0.48-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.5.0-next.1 + - @backstage/plugin-auth-backend@0.27.1-next.1 + - @backstage/plugin-techdocs-backend@2.1.6-next.1 + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/plugin-scaffolder-backend@3.2.0-next.1 + - @backstage/plugin-mcp-actions-backend@0.1.10-next.1 + - @backstage/plugin-events-backend@0.6.0-next.1 + - @backstage/plugin-search-backend@2.1.0-next.1 + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/plugin-kubernetes-backend@0.21.2-next.1 + - @backstage/plugin-search-backend-module-catalog@0.3.13-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.12-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-app-backend@0.5.12-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.5.1-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.17-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.5-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.12-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.20-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.18-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.9-next.0 + - @backstage/plugin-devtools-backend@0.5.15-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.2.1-next.0 + - @backstage/plugin-notifications-backend@0.6.3-next.0 + - @backstage/plugin-permission-backend@0.7.10-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.17-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-proxy-backend@0.6.11-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.7-next.1 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.20-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.1-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.12-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-signals-backend@0.3.13-next.0 + ## 0.0.48-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index b53b1933bb..01de1d1626 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.0.48-next.0", + "version": "0.0.48-next.1", "backstage": { "role": "backend" }, diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md index 03f4e627b2..62b214a403 100644 --- a/packages/catalog-client/CHANGELOG.md +++ b/packages/catalog-client/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/catalog-client +## 1.14.0-next.1 + +### Minor Changes + +- 972f686: Added support for the `query` field in `getEntitiesByRefs` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 56c908e: Added support for the `query` field in `getEntityFacets` requests, enabling predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 0fbcf23: Migrated OpenAPI schemas to 3.1. +- 51e23eb: Added predicate-based entity filtering via POST /entities/by-query endpoint. + + Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$hasPrefix`, and (partially) `$contains` operators for expressive entity queries. Integrated into the existing `queryEntities` flow with full cursor-based pagination, permission enforcement, and `totalItems` support. + + The catalog client's `queryEntities()` method automatically routes to the POST endpoint when a `query` predicate is provided. + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + ## 1.13.1-next.0 ### Patch Changes diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json index 9ca0335241..20a68905a0 100644 --- a/packages/catalog-client/package.json +++ b/packages/catalog-client/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-client", - "version": "1.13.1-next.0", + "version": "1.14.0-next.1", "description": "An isomorphic client for the catalog backend", "backstage": { "role": "common-library" diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md index 6f527693b4..d7a5679026 100644 --- a/packages/cli-common/CHANGELOG.md +++ b/packages/cli-common/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/cli-common +## 0.2.0-next.1 + +### Patch Changes + +- e44b6a9: The `findOwnRootDir` utility now searches for the monorepo root by traversing up the directory tree looking for a `package.json` with `workspaces`, instead of assuming a fixed `../..` relative path. If no workspaces root is found during this traversal, `findOwnRootDir` now throws to enforce stricter validation of the repository layout. +- Updated dependencies + - @backstage/errors@1.2.7 + ## 0.2.0-next.0 ### Minor Changes diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json index 4e38607467..7e44334900 100644 --- a/packages/cli-common/package.json +++ b/packages/cli-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-common", - "version": "0.2.0-next.0", + "version": "0.2.0-next.1", "description": "Common functionality used by cli, backend, and create-app", "backstage": { "role": "node-library" diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md index 074ba4097c..96a404989e 100644 --- a/packages/cli-node/CHANGELOG.md +++ b/packages/cli-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/cli-node +## 0.2.19-next.1 + +### Patch Changes + +- 61cb976: Added `toString()` method to `Lockfile` for serializing lockfiles back to string format. +- 3c811bf: Added `hasBackstageYarnPlugin` and `SuccessCache` exports, moved from `@backstage/cli`. +- a9d23c4: Properly support `package.json` `workspaces` field +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.2.19-next.0 ### Patch Changes diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json index 16cfba3c0d..4fa5af208c 100644 --- a/packages/cli-node/package.json +++ b/packages/cli-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli-node", - "version": "0.2.19-next.0", + "version": "0.2.19-next.1", "description": "Node.js library for Backstage CLIs", "backstage": { "role": "node-library" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 6ccd21fb31..4d5c2691a7 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/cli +## 0.36.0-next.1 + +### Minor Changes + +- b36a60d: **BREAKING**: The `migrate package-exports` command has been removed. Use `repo fix` instead. + +### Patch Changes + +- 0d2d0f2: Internal refactor of CLI modularization, moving individual commands to be implemented with cleye. +- 2fcba39: Internal refactor to move shared utilities into their consuming modules, reducing cross-module dependencies. +- c85ac86: Internal refactor to split `loadCliConfig` into separate implementations for the build and config CLI modules, removing a cross-module dependency. +- 61cb976: Migrated internal versioning utilities to use `@backstage/cli-node` instead of a local implementation. +- 825c81d: Internal refactor of CLI command modules. +- a9d23c4: Properly support `package.json` `workspaces` field +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + - @backstage/cli-node@0.2.19-next.1 + - @backstage/module-federation-common@0.1.2-next.0 + - @backstage/integration@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.2.2-next.0 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + ## 0.35.5-next.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 17d2189beb..4350836d22 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/cli", - "version": "0.35.5-next.0", + "version": "0.36.0-next.1", "description": "CLI for developing Backstage plugins and apps", "backstage": { "role": "cli" diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md index 9b6e2a4576..f05a32f697 100644 --- a/packages/core-compat-api/CHANGELOG.md +++ b/packages/core-compat-api/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/core-compat-api +## 0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + ## 0.5.9-next.0 ### Patch Changes diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json index 3a27730600..605c6b2bd9 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.5.9-next.0", + "version": "0.5.9-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 834d31aef9..5923a75a26 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/create-app +## 0.7.10-next.1 + +### Patch Changes + +- a9d23c4: Properly support `package.json` `workspaces` field +- ebd4630: Replace deprecated `workspaces.packages` with `workspaces` in `package.json` + + This change is **not** required, but you can edit your main `package.json`, to fit the more modern & more common pattern: + + ```diff + - "workspaces": { + - "packages": [ + "workspaces": [ + "packages/*", + "plugins/*" + - ] + - }, + ], + ``` + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + ## 0.7.10-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 31a6e5347d..8a4526d63b 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.7.10-next.0", + "version": "0.7.10-next.1", "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 0ce067fe4f..f00681aa3c 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/dev-utils +## 1.1.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/app-defaults@1.7.6-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + ## 1.1.21-next.0 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index 9f83d94cd1..7ddfd34b57 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.21-next.0", + "version": "1.1.21-next.1", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" diff --git a/packages/frontend-dynamic-feature-loader/CHANGELOG.md b/packages/frontend-dynamic-feature-loader/CHANGELOG.md index d29ecadc52..c616f235e4 100644 --- a/packages/frontend-dynamic-feature-loader/CHANGELOG.md +++ b/packages/frontend-dynamic-feature-loader/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/frontend-dynamic-feature-loader +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/module-federation-common@0.1.2-next.0 + - @backstage/config@1.3.6 + - @backstage/frontend-plugin-api@0.14.2-next.0 + ## 0.1.10-next.0 ### Patch Changes diff --git a/packages/frontend-dynamic-feature-loader/package.json b/packages/frontend-dynamic-feature-loader/package.json index 36480783db..860fe56bb5 100644 --- a/packages/frontend-dynamic-feature-loader/package.json +++ b/packages/frontend-dynamic-feature-loader/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-dynamic-feature-loader", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index 74e112c067..49a007e798 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/frontend-test-utils +## 0.5.1-next.1 + +### Patch Changes + +- 479282f: Fixed type inference of `TestApiPair` when using tuple syntax by wrapping `MockWithApiFactory` in `NoInfer`. +- Updated dependencies + - @backstage/plugin-app@0.4.1-next.1 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.15.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.5.1-next.0 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index aa35b3dff9..bcea275124 100644 --- a/packages/frontend-test-utils/package.json +++ b/packages/frontend-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-test-utils", - "version": "0.5.1-next.0", + "version": "0.5.1-next.1", "backstage": { "role": "web-library" }, diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index a038cd3ac5..507d66ce4e 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration-react +## 1.2.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 1.2.16-next.0 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index b8a7f6a678..ba38b2fc33 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.16-next.0", + "version": "1.2.16-next.1", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index 947f559196..1ca9d407af 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/integration +## 2.0.0-next.1 + +### Major Changes + +- 527cf88: **BREAKING** Removed deprecated Azure DevOps, Bitbucket, Gerrit and GitHub code: + + - For Azure DevOps, the long deprecated `token` string and `credential` object have been removed from the `config.d.ts`. Use the `credentials` array object instead. + - For Bitbucket, the long deprecated `bitbucket` object has been removed from the `config.d.ts`. Use the `bitbucketCloud` or `bitbucketServer` objects instead. + - For Gerrit, the `parseGerritGitilesUrl` function has been removed, use `parseGitilesUrlRef` instead. The `buildGerritGitilesArchiveUrl` function has also been removed, use `buildGerritGitilesArchiveUrlFromLocation` instead. + - For GitHub, the `getGitHubRequestOptions` function has been removed. + +### Patch Changes + +- 993a598: Fixed Azure integration config schema visibility annotations to use per-field `@visibility secret` instead of `@deepVisibility secret` on parent objects, so that non-secret fields like `clientId`, `tenantId`, `organizations`, and `managedIdentityClientId` are no longer incorrectly marked as secret. +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 1.21.0-next.0 ### Minor Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index 8f5bfd3e8b..0fbd80b1b3 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.21.0-next.0", + "version": "2.0.0-next.1", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/module-federation-common/CHANGELOG.md b/packages/module-federation-common/CHANGELOG.md index 4c15a4b215..9017b9b96d 100644 --- a/packages/module-federation-common/CHANGELOG.md +++ b/packages/module-federation-common/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/module-federation-common +## 0.1.2-next.0 + +### Patch Changes + +- 0cb5646: Fixed the `@mui/material/styles` shared dependency key by removing a trailing slash that caused module resolution failures with MUI package exports. +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.1.0 ### Minor Changes diff --git a/packages/module-federation-common/package.json b/packages/module-federation-common/package.json index d0dc128548..1670773e3e 100644 --- a/packages/module-federation-common/package.json +++ b/packages/module-federation-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/module-federation-common", - "version": "0.1.0", + "version": "0.1.2-next.0", "description": "Helper library for module federation", "backstage": { "role": "common-library" diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 67ebd2fec6..0be622296b 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/repo-tools +## 0.17.0-next.1 + +### Minor Changes + +- 0fbcf23: Added support for OpenAPI 3.1 to all `schema openapi` commands. The commands now auto-detect the OpenAPI version from the spec file and use the appropriate generator, supporting both OpenAPI 3.0.x and 3.1.x specifications. + +### Patch Changes + +- 426edbe: Fixed `generate-catalog-info` command failing with "too many arguments" when invoked by lint-staged via the pre-commit hook. +- d5779e5: Updated the CLI report parser to support cleye-style help output, and strip ANSI escape codes from captured output. +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + - @backstage/cli-node@0.2.19-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config-loader@1.10.9-next.0 + - @backstage/errors@1.2.7 + ## 0.16.6-next.0 ### Patch Changes diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index cca2b5a86a..a9809f614d 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.16.6-next.0", + "version": "0.17.0-next.1", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 2557e1f13b..efc871e9c6 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,26 @@ # techdocs-cli-embedded-app +## 0.2.118-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/cli@0.36.0-next.1 + - @backstage/plugin-techdocs@1.17.1-next.1 + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/frontend-defaults@0.4.1-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 0.2.118-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index b903033a0d..7c70e1a47c 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.118-next.0", + "version": "0.2.118-next.1", "backstage": { "role": "frontend" }, diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index ce38cf8516..5eff559128 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # @techdocs/cli +## 1.10.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.2.0-next.1 + - @backstage/plugin-techdocs-node@1.14.3-next.1 + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + ## 1.10.6-next.0 ### Patch Changes diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index bccab2c228..8b6a70f952 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.10.6-next.0", + "version": "1.10.6-next.1", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index d5c6a13f66..bcf0ee3734 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,108 @@ # @backstage/ui +## 0.13.0-next.1 + +### Minor Changes + +- 768f09d: **BREAKING**: Simplified the neutral background prop API for container components. The explicit `neutral-1`, `neutral-2`, `neutral-3`, and `neutral-auto` values have been removed from `ProviderBg`. They are replaced by a single `'neutral'` value that always auto-increments from the parent context, making it impossible to skip or pin to an explicit neutral level. + + **Migration:** + + Replace any explicit `bg="neutral-1"`, `bg="neutral-2"`, `bg="neutral-3"`, or `bg="neutral-auto"` props with `bg="neutral"`. To achieve a specific neutral level in stories or tests, use nested containers — each additional `bg="neutral"` wrapper increments by one level. + + ```tsx + // Before + ... + + // After + + ... + + ``` + + **Affected components:** Box, Flex, Grid, Card, Accordion, Popover, Tooltip, Dialog, Menu + +- b42fcdc: **BREAKING**: Removed `--bui-bg-popover` CSS token. Popover, Tooltip, Menu, and Dialog now use `--bui-bg-app` for their outer shell and `Box bg="neutral-1"` for content areas, providing better theme consistency and eliminating a redundant token. + + **Migration:** + + Replace any usage of `--bui-bg-popover` with `--bui-bg-neutral-1` (for content surfaces) or `--bui-bg-app` (for outer shells): + + ```diff + - background: var(--bui-bg-popover); + + background: var(--bui-bg-neutral-1); + ``` + + **Affected components:** Popover, Tooltip, Menu, Dialog + +- bd3a76e: **BREAKING**: Data attributes rendered by components are now always lowercase. This affects CSS selectors targeting camelCase data attributes. + + **Migration:** + + Update any custom CSS selectors that target camelCase data attributes to use lowercase instead: + + ```diff + - [data-startCollapsed='true'] { ... } + + [data-startcollapsed='true'] { ... } + ``` + + **Affected components:** SearchField + +- 95702ab: **BREAKING**: Removed deprecated types `ComponentDefinition`, `ClassNamesMap`, `DataAttributeValues`, and `DataAttributesMap` from the public API. These were internal styling infrastructure types that have been replaced by the `defineComponent` system. + + **Migration:** + + Remove any direct usage of these types. Component definitions now use `defineComponent()` and their shapes are not part of the public API contract. + + ```diff + - import type { ComponentDefinition, ClassNamesMap } from '@backstage/ui'; + ``` + + If you were reading `definition.dataAttributes`, use `definition.propDefs` instead — props with `dataAttribute: true` in `propDefs` are the equivalent. + +### Patch Changes + +- 58224d3: Fixed neutral-1 hover & pressed state in light mode. +- 95702ab: Migrated all components from `useStyles` to `useDefinition` hook. Exported `OwnProps` types for each component, enabling better type composition for consumers. + + **Affected components:** Avatar, Checkbox, Container, Dialog, FieldError, FieldLabel, Flex, FullPage, Grid, HeaderPage, Link, Menu, PasswordField, PluginHeader, Popover, RadioGroup, SearchField, Select, Skeleton, Switch, Table, TablePagination, Tabs, TagGroup, Text, TextField, ToggleButton, ToggleButtonGroup, Tooltip, VisuallyHidden + +- 4c2c350: Removed the `transition` on `Container` padding to prevent an unwanted animation when the viewport is resized. + + Affected components: Container + +- d4fa5b4: Fixed tab `matchStrategy` matching to ignore query parameters and hash fragments in tab `href` values. Previously, tabs with query params in their `href` (e.g., `/page?group=foo`) would never show as active since matching compared the full `href` string against `location.pathname` which never includes query params. + + **Affected components:** Tabs, PluginHeader + +- 36987db: Fixed handling of the `style` prop on `Button`, `ButtonIcon`, and `ButtonLink` so that it is now correctly forwarded to the underlying element instead of being silently dropped. + + **Affected components:** Button, ButtonIcon, ButtonLink + +- 95702ab: Fixed Link variant default from `'body'` to `'body-medium'` to match actual CSS selectors. The previous default did not correspond to a valid variant value. + + **Affected components:** Link + +- 9027b10: Fixed scroll overflow in Menu and Select popover content when constrained by viewport height. + + **Affected components:** Menu, Select + +- 4105a78: Merged the internal `PluginHeaderToolbar` component into `PluginHeader`, removing the separate component and its associated types (`PluginHeaderToolbarOwnProps`, `PluginHeaderToolbarProps`) and definition (`PluginHeaderToolbarDefinition`). This is an internal refactor with no changes to the public API of `PluginHeader`. + + **Affected components:** PluginHeader + +- b303857: Fixed `isRequired` prop not being passed to the underlying React Aria field components in TextField, SearchField, and PasswordField. Previously, `isRequired` was consumed locally for the secondary label text but never forwarded, which meant the input elements lacked `aria-required="true"` and React Aria's built-in required validation was not activated. + + **Affected components:** TextField, SearchField, PasswordField + +- cd3cb0f: Improved `useBreakpoint` performance by sharing a single set of `matchMedia` listeners across all component instances instead of creating independent listeners per hook call. +- 36987db: Extended `AlertProps`, `ContainerProps`, `DialogBodyProps`, and `FieldLabelProps` with native div element props to allow passing attributes like `aria-*` and `data-*`. + + **Affected components:** Alert, Container, DialogBody, FieldLabel + +- Updated dependencies + - @backstage/version-bridge@1.0.12 + ## 0.12.1-next.0 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index 311153eddc..1440a40831 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/ui", - "version": "0.12.1-next.0", + "version": "0.13.0-next.1", "backstage": { "role": "web-library" }, diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 9db7a5ed41..e519fef39e 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-api-docs +## 0.13.5-next.1 + +### Patch Changes + +- 30e08df: Added default entity content groups for the API docs entity content tabs. The API definition tab defaults to the `documentation` group and the APIs tab defaults to the `development` group. +- Updated dependencies + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.13.5-next.0 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index c3f5a2c42b..ba2def9480 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-api-docs", - "version": "0.13.5-next.0", + "version": "0.13.5-next.1", "description": "A Backstage plugin that helps represent API entities in the frontend", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app-visualizer/CHANGELOG.md b/plugins/app-visualizer/CHANGELOG.md index f61e2935b9..bce72f98f9 100644 --- a/plugins/app-visualizer/CHANGELOG.md +++ b/plugins/app-visualizer/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-app-visualizer +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/app-visualizer/package.json b/plugins/app-visualizer/package.json index 5353caa37e..2dcb4cd03e 100644 --- a/plugins/app-visualizer/package.json +++ b/plugins/app-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app-visualizer", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "description": "Visualizes the Backstage app structure", "backstage": { "role": "frontend-plugin", diff --git a/plugins/app/CHANGELOG.md b/plugins/app/CHANGELOG.md index e4cd22f5b4..6e6b6bc32b 100644 --- a/plugins/app/CHANGELOG.md +++ b/plugins/app/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-app +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-app-react@0.2.1-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.4.1-next.0 ### Patch Changes diff --git a/plugins/app/package.json b/plugins/app/package.json index 3572d7da28..62d644894f 100644 --- a/plugins/app/package.json +++ b/plugins/app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-app", - "version": "0.4.1-next.0", + "version": "0.4.1-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "app", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 068a085520..1c04518409 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-auth-backend +## 0.27.1-next.1 + +### Patch Changes + +- 1ccad86: Added `who-am-i` action to the auth backend actions registry. Returns the catalog entity and user info for the currently authenticated user. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.14-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.27.1-next.0 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 45d17d6f6d..912650a48d 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend", - "version": "0.27.1-next.0", + "version": "0.27.1-next.1", "description": "A Backstage backend plugin that handles authentication", "backstage": { "role": "backend-plugin", diff --git a/plugins/auth-node/CHANGELOG.md b/plugins/auth-node/CHANGELOG.md index 651d2752d3..aadd899b15 100644 --- a/plugins/auth-node/CHANGELOG.md +++ b/plugins/auth-node/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-auth-node +## 0.6.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.6.14-next.0 ### Patch Changes diff --git a/plugins/auth-node/package.json b/plugins/auth-node/package.json index 440f6a4913..5364358450 100644 --- a/plugins/auth-node/package.json +++ b/plugins/auth-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-node", - "version": "0.6.14-next.0", + "version": "0.6.14-next.1", "backstage": { "role": "node-library", "pluginId": "auth", diff --git a/plugins/bitbucket-cloud-common/CHANGELOG.md b/plugins/bitbucket-cloud-common/CHANGELOG.md index 9ad8a14276..721c7247cf 100644 --- a/plugins/bitbucket-cloud-common/CHANGELOG.md +++ b/plugins/bitbucket-cloud-common/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-bitbucket-cloud-common +## 0.3.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + ## 0.3.8-next.0 ### Patch Changes diff --git a/plugins/bitbucket-cloud-common/package.json b/plugins/bitbucket-cloud-common/package.json index 41f7f8b49e..010a284f60 100644 --- a/plugins/bitbucket-cloud-common/package.json +++ b/plugins/bitbucket-cloud-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bitbucket-cloud-common", - "version": "0.3.8-next.0", + "version": "0.3.8-next.1", "description": "Common functionalities for bitbucket-cloud plugins", "backstage": { "role": "common-library", diff --git a/plugins/catalog-backend-module-aws/CHANGELOG.md b/plugins/catalog-backend-module-aws/CHANGELOG.md index 104db8bed8..7e26c396fd 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.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-kubernetes-common@0.9.10 + ## 0.4.21-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-aws/package.json b/plugins/catalog-backend-module-aws/package.json index 657190a2ac..34393de22b 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.21-next.0", + "version": "0.4.21-next.1", "description": "A Backstage catalog backend module that helps integrate towards AWS", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-azure/CHANGELOG.md b/plugins/catalog-backend-module-azure/CHANGELOG.md index 71ffc6eb5f..e9b19a59bb 100644 --- a/plugins/catalog-backend-module-azure/CHANGELOG.md +++ b/plugins/catalog-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-azure +## 0.3.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.3.15-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-azure/package.json b/plugins/catalog-backend-module-azure/package.json index c73d71073a..49c1e830b4 100644 --- a/plugins/catalog-backend-module-azure/package.json +++ b/plugins/catalog-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-azure", - "version": "0.3.15-next.0", + "version": "0.3.15-next.1", "description": "A Backstage catalog backend module that helps integrate towards Azure", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md index 570ed41256..918c97b191 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket-cloud +## 0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-bitbucket-cloud-common@0.3.8-next.1 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.5.9-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index 1f7bd194be..a3d964fa9d 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud", - "version": "0.5.9-next.0", + "version": "0.5.9-next.1", "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md index 92bb46d3c0..b35ec3eabf 100644 --- a/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/catalog-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-bitbucket-server +## 0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.5.9-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-bitbucket-server/package.json b/plugins/catalog-backend-module-bitbucket-server/package.json index 8f4e3b97b5..39908a8f44 100644 --- a/plugins/catalog-backend-module-bitbucket-server/package.json +++ b/plugins/catalog-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-bitbucket-server", - "version": "0.5.9-next.0", + "version": "0.5.9-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gerrit/CHANGELOG.md b/plugins/catalog-backend-module-gerrit/CHANGELOG.md index 6a14e2fa96..ffc253d255 100644 --- a/plugins/catalog-backend-module-gerrit/CHANGELOG.md +++ b/plugins/catalog-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gerrit +## 0.3.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.3.12-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gerrit/package.json b/plugins/catalog-backend-module-gerrit/package.json index e2b12b1872..1022e92e46 100644 --- a/plugins/catalog-backend-module-gerrit/package.json +++ b/plugins/catalog-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gerrit", - "version": "0.3.12-next.0", + "version": "0.3.12-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "catalog", diff --git a/plugins/catalog-backend-module-gitea/CHANGELOG.md b/plugins/catalog-backend-module-gitea/CHANGELOG.md index b7c152b7ec..ffd7ec8cb3 100644 --- a/plugins/catalog-backend-module-gitea/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-gitea +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitea/package.json b/plugins/catalog-backend-module-gitea/package.json index 9d23fa2ca0..4c7b81b979 100644 --- a/plugins/catalog-backend-module-gitea/package.json +++ b/plugins/catalog-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-gitea", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "description": "The gitea backend module for the catalog plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-github-org/CHANGELOG.md b/plugins/catalog-backend-module-github-org/CHANGELOG.md index fd442dab13..f702769d08 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.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.13.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.3.20-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github-org/package.json b/plugins/catalog-backend-module-github-org/package.json index be85ed65a3..38be9f87f8 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.20-next.0", + "version": "0.3.20-next.1", "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 586ea98c43..35c32dc516 100644 --- a/plugins/catalog-backend-module-github/CHANGELOG.md +++ b/plugins/catalog-backend-module-github/CHANGELOG.md @@ -1,5 +1,53 @@ # @backstage/plugin-catalog-backend-module-github +## 0.13.0-next.1 + +### Minor Changes + +- b11c2cd: The default user transformer now prefers organization verified domain emails over the user's public GitHub email when populating the user entity profile. It also strips plus-addressed routing tags that GitHub adds to these emails. + + If you want to retain the old behavior, you can do so with a custom user transformer using the `githubOrgEntityProviderTransformsExtensionPoint`: + + ```ts + import { createBackendModule } from '@backstage/backend-plugin-api'; + import { githubOrgEntityProviderTransformsExtensionPoint } from '@backstage/plugin-catalog-backend-module-github-org'; + import { defaultUserTransformer } from '@backstage/plugin-catalog-backend-module-github'; + + export default createBackendModule({ + pluginId: 'catalog', + moduleId: 'github-org-custom-transforms', + register(env) { + env.registerInit({ + deps: { + transforms: githubOrgEntityProviderTransformsExtensionPoint, + }, + async init({ transforms }) { + transforms.setUserTransformer(async (item, ctx) => { + const entity = await defaultUserTransformer(item, ctx); + if (entity && item.email) { + entity.spec.profile!.email = item.email; + } + return entity; + }); + }, + }); + }, + }); + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.12.3-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-github/package.json b/plugins/catalog-backend-module-github/package.json index fdef1a8aab..85ae8e2e9d 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.12.3-next.0", + "version": "0.13.0-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitHub", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-gitlab/CHANGELOG.md b/plugins/catalog-backend-module-gitlab/CHANGELOG.md index e8ee9a0b17..2734ee697e 100644 --- a/plugins/catalog-backend-module-gitlab/CHANGELOG.md +++ b/plugins/catalog-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-catalog-backend-module-gitlab +## 0.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.8.1-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-gitlab/package.json b/plugins/catalog-backend-module-gitlab/package.json index 88661729b2..1d6b745202 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.8.1-next.0", + "version": "0.8.1-next.1", "description": "A Backstage catalog backend module that helps integrate towards GitLab", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md index c30dc39d18..4725c517d7 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md +++ b/plugins/catalog-backend-module-incremental-ingestion/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-catalog-backend-module-incremental-ingestion +## 0.7.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.5.0-next.1 + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + ## 0.7.10-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-incremental-ingestion/package.json b/plugins/catalog-backend-module-incremental-ingestion/package.json index d03ac523c3..a61424a590 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/package.json +++ b/plugins/catalog-backend-module-incremental-ingestion/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-incremental-ingestion", - "version": "0.7.10-next.0", + "version": "0.7.10-next.1", "description": "An entity provider for streaming large asset sources into the catalog", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-openapi/CHANGELOG.md b/plugins/catalog-backend-module-openapi/CHANGELOG.md index 69cd786a0a..73e1a5a170 100644 --- a/plugins/catalog-backend-module-openapi/CHANGELOG.md +++ b/plugins/catalog-backend-module-openapi/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-catalog-backend-module-openapi +## 0.2.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.2.20-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-openapi/package.json b/plugins/catalog-backend-module-openapi/package.json index 2ab5d94ff6..3179898805 100644 --- a/plugins/catalog-backend-module-openapi/package.json +++ b/plugins/catalog-backend-module-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-openapi", - "version": "0.2.20-next.0", + "version": "0.2.20-next.1", "description": "A Backstage catalog backend module that helps with OpenAPI specifications", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md index c5b40cc991..7330a26403 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md +++ b/plugins/catalog-backend-module-scaffolder-entity-model/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-catalog-backend-module-scaffolder-entity-model +## 0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.2.18-next.0 ### Patch Changes diff --git a/plugins/catalog-backend-module-scaffolder-entity-model/package.json b/plugins/catalog-backend-module-scaffolder-entity-model/package.json index df180ee6bc..dc9ad63768 100644 --- a/plugins/catalog-backend-module-scaffolder-entity-model/package.json +++ b/plugins/catalog-backend-module-scaffolder-entity-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend-module-scaffolder-entity-model", - "version": "0.2.18-next.0", + "version": "0.2.18-next.1", "description": "Adds support for the scaffolder specific entity model (e.g. the Template kind) to the catalog backend plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index cbca2a2b92..a54b82a393 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,42 @@ # @backstage/plugin-catalog-backend +## 3.5.0-next.1 + +### Minor Changes + +- a6b2819: Added `query-catalog-entities` action to the catalog backend actions registry. Supports predicate-based filtering with `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 972f686: Added support for predicate-based filtering on the `/entities/by-refs` endpoint via the `query` field in the request body. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 56c908e: Added support for predicate-based filtering on the `/entity-facets` endpoint via a new `POST` method. Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$contains`, and `$hasPrefix` operators. +- 0fbcf23: Migrated OpenAPI schemas to 3.1. +- 51e23eb: Added predicate-based entity filtering via POST /entities/by-query endpoint. + + Supports `$all`, `$any`, `$not`, `$exists`, `$in`, `$hasPrefix`, and (partially) `$contains` operators for expressive entity queries. Integrated into the existing `queryEntities` flow with full cursor-based pagination, permission enforcement, and `totalItems` support. + + The catalog client's `queryEntities()` method automatically routes to the POST endpoint when a `query` predicate is provided. + +### Patch Changes + +- 72747b4: Deprecated two processors as they have been moved to the Community Plugins repo with their own backend modules: + + - `AnnotateScmSlugEntityProcessor`: Use `@backstage-community/plugin-catalog-backend-module-annotate-scm-slug` instead + - `CodeOwnersProcessor`: Use `@backstage-community/plugin-catalog-backend-module-codeowners` instead + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 3.5.0-next.0 ### Minor Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index b1f0175c81..d514a37d96 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "3.5.0-next.0", + "version": "3.5.0-next.1", "description": "The Backstage backend plugin that provides the Backstage catalog", "backstage": { "role": "backend-plugin", diff --git a/plugins/catalog-graph/CHANGELOG.md b/plugins/catalog-graph/CHANGELOG.md index 80fcb546b8..290d121a98 100644 --- a/plugins/catalog-graph/CHANGELOG.md +++ b/plugins/catalog-graph/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-catalog-graph +## 0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/types@1.2.2 + ## 0.5.8-next.0 ### Patch Changes diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 9b94d69113..dbb4c69899 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-graph", - "version": "0.5.8-next.0", + "version": "0.5.8-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "catalog-graph", diff --git a/plugins/catalog-import/CHANGELOG.md b/plugins/catalog-import/CHANGELOG.md index 139b565af2..4ff4b1c246 100644 --- a/plugins/catalog-import/CHANGELOG.md +++ b/plugins/catalog-import/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-catalog-import +## 0.13.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.13.11-next.0 ### Patch Changes diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 52b8379ed5..9fa35f6033 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-import", - "version": "0.13.11-next.0", + "version": "0.13.11-next.1", "description": "A Backstage plugin the helps you import entities into your catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/catalog-node/CHANGELOG.md b/plugins/catalog-node/CHANGELOG.md index 22db08b9b9..7f4a116d02 100644 --- a/plugins/catalog-node/CHANGELOG.md +++ b/plugins/catalog-node/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-catalog-node +## 2.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/backend-test-utils@1.11.1-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 2.1.0-next.0 ### Minor Changes diff --git a/plugins/catalog-node/package.json b/plugins/catalog-node/package.json index 9d37ae31ed..ffa1447b7e 100644 --- a/plugins/catalog-node/package.json +++ b/plugins/catalog-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-node", - "version": "2.1.0-next.0", + "version": "2.1.0-next.1", "description": "The plugin-catalog-node module for @backstage/plugin-catalog-backend", "backstage": { "role": "node-library", diff --git a/plugins/catalog-react/CHANGELOG.md b/plugins/catalog-react/CHANGELOG.md index 550c9616ec..2280b2f932 100644 --- a/plugins/catalog-react/CHANGELOG.md +++ b/plugins/catalog-react/CHANGELOG.md @@ -1,5 +1,31 @@ # @backstage/plugin-catalog-react +## 2.1.0-next.1 + +### Minor Changes + +- 4d58894: Added `aliases` and `contentOrder` fields to `EntityContentGroupDefinition`, allowing groups to declare alias IDs and control the sort order of their content items. + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/frontend-test-utils@0.5.1-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/filter-predicates@0.1.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 2.0.1-next.0 ### Patch Changes diff --git a/plugins/catalog-react/package.json b/plugins/catalog-react/package.json index c383c52691..eeafab8273 100644 --- a/plugins/catalog-react/package.json +++ b/plugins/catalog-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-react", - "version": "2.0.1-next.0", + "version": "2.1.0-next.1", "description": "A frontend library that helps other Backstage plugins interact with the catalog", "backstage": { "role": "web-library", diff --git a/plugins/catalog/CHANGELOG.md b/plugins/catalog/CHANGELOG.md index 8242b7f125..c80d843bbf 100644 --- a/plugins/catalog/CHANGELOG.md +++ b/plugins/catalog/CHANGELOG.md @@ -1,5 +1,35 @@ # @backstage/plugin-catalog +## 1.34.0-next.1 + +### Minor Changes + +- 4d58894: Added support for group alias IDs and configurable content ordering on the entity page. Groups can now declare `aliases` so that content targeting an aliased group is included in the group. A new `defaultContentOrder` option (default `title`) controls how content items within each group are sorted, with support for both a page-level default and per-group overrides. + +### Patch Changes + +- 07ba746: Fixed entity page tab groups not respecting the ordering from the `groups` configuration. +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 1.33.1-next.0 ### Patch Changes diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index f04e147638..e3486a2549 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "1.33.1-next.0", + "version": "1.34.0-next.1", "description": "The Backstage plugin for browsing the Backstage catalog", "backstage": { "role": "frontend-plugin", diff --git a/plugins/devtools/CHANGELOG.md b/plugins/devtools/CHANGELOG.md index b62339220b..d47dfec881 100644 --- a/plugins/devtools/CHANGELOG.md +++ b/plugins/devtools/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-devtools +## 0.1.37-next.1 + +### Patch Changes + +- afabb37: Fixed URL encoding of task IDs for the trigger feature (tasks that contained a "/" in their ID were not triggered) +- Updated dependencies + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-devtools-common@0.1.22 + - @backstage/plugin-devtools-react@0.1.2-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.1.37-next.0 ### Patch Changes diff --git a/plugins/devtools/package.json b/plugins/devtools/package.json index 61160edb46..582c2fd4e5 100644 --- a/plugins/devtools/package.json +++ b/plugins/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-devtools", - "version": "0.1.37-next.0", + "version": "0.1.37-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "devtools", diff --git a/plugins/events-backend-module-github/CHANGELOG.md b/plugins/events-backend-module-github/CHANGELOG.md index 99906c12cf..ae3fcaaf15 100644 --- a/plugins/events-backend-module-github/CHANGELOG.md +++ b/plugins/events-backend-module-github/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-events-backend-module-github +## 0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.4.10-next.0 ### Patch Changes diff --git a/plugins/events-backend-module-github/package.json b/plugins/events-backend-module-github/package.json index 79e4bf6ec1..94eb6cf913 100644 --- a/plugins/events-backend-module-github/package.json +++ b/plugins/events-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend-module-github", - "version": "0.4.10-next.0", + "version": "0.4.10-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "events", diff --git a/plugins/events-backend/CHANGELOG.md b/plugins/events-backend/CHANGELOG.md index 4a60681d58..0d96ad1af1 100644 --- a/plugins/events-backend/CHANGELOG.md +++ b/plugins/events-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-events-backend +## 0.6.0-next.1 + +### Minor Changes + +- 0fbcf23: Migrated OpenAPI schemas to 3.1. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + ## 0.5.12-next.0 ### Patch Changes diff --git a/plugins/events-backend/package.json b/plugins/events-backend/package.json index 4642f4e92d..6074645e91 100644 --- a/plugins/events-backend/package.json +++ b/plugins/events-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-events-backend", - "version": "0.5.12-next.0", + "version": "0.6.0-next.1", "backstage": { "role": "backend-plugin", "pluginId": "events", diff --git a/plugins/home/CHANGELOG.md b/plugins/home/CHANGELOG.md index 045b8737a4..7cf8efb392 100644 --- a/plugins/home/CHANGELOG.md +++ b/plugins/home/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-home +## 0.9.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-compat-api@0.5.9-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + - @backstage/plugin-home-react@0.1.36-next.0 + ## 0.9.3-next.0 ### Patch Changes diff --git a/plugins/home/package.json b/plugins/home/package.json index 4c38991714..7c6ed3ffbf 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home", - "version": "0.9.3-next.0", + "version": "0.9.3-next.1", "description": "A Backstage plugin that helps you build a home page", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index 4886067c19..064ebef037 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,23 @@ # @backstage/plugin-kubernetes-backend +## 0.21.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-node@0.4.2-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 0.21.2-next.0 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index d773535a99..67876c7919 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-backend", - "version": "0.21.2-next.0", + "version": "0.21.2-next.1", "description": "A Backstage backend plugin that integrates towards Kubernetes", "backstage": { "role": "backend-plugin", diff --git a/plugins/kubernetes-cluster/CHANGELOG.md b/plugins/kubernetes-cluster/CHANGELOG.md index 38dd2155a5..7c3da576c6 100644 --- a/plugins/kubernetes-cluster/CHANGELOG.md +++ b/plugins/kubernetes-cluster/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-kubernetes-cluster +## 0.0.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-react@0.5.17-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.0.35-next.0 ### Patch Changes diff --git a/plugins/kubernetes-cluster/package.json b/plugins/kubernetes-cluster/package.json index 876986e001..090a721323 100644 --- a/plugins/kubernetes-cluster/package.json +++ b/plugins/kubernetes-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes-cluster", - "version": "0.0.35-next.0", + "version": "0.0.35-next.1", "description": "A Backstage plugin that shows details of Kubernetes clusters", "backstage": { "role": "frontend-plugin", diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 8e4cd54658..6137e9df46 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-kubernetes +## 0.12.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-kubernetes-common@0.9.10 + - @backstage/plugin-kubernetes-react@0.5.17-next.0 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 0.12.17-next.0 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index b43665e711..699d6ce3f2 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.17-next.0", + "version": "0.12.17-next.1", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", diff --git a/plugins/mcp-actions-backend/CHANGELOG.md b/plugins/mcp-actions-backend/CHANGELOG.md index 9cccc03c2f..c21b592167 100644 --- a/plugins/mcp-actions-backend/CHANGELOG.md +++ b/plugins/mcp-actions-backend/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-mcp-actions-backend +## 0.1.10-next.1 + +### Patch Changes + +- 62f0a53: Fixed error forwarding in the actions registry so that known errors like `InputError` and `NotFoundError` thrown by actions preserve their original status codes and messages instead of being wrapped in `ForwardedError` and coerced to 500. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.1.10-next.0 ### Patch Changes diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index 6d66add868..dca19fd279 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mcp-actions-backend", - "version": "0.1.10-next.0", + "version": "0.1.10-next.1", "backstage": { "role": "backend-plugin", "pluginId": "mcp-actions", diff --git a/plugins/mui-to-bui/CHANGELOG.md b/plugins/mui-to-bui/CHANGELOG.md index 6164b75fd5..b68e326e25 100644 --- a/plugins/mui-to-bui/CHANGELOG.md +++ b/plugins/mui-to-bui/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-mui-to-bui +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.13.0-next.1 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + ## 0.2.5-next.0 ### Patch Changes diff --git a/plugins/mui-to-bui/package.json b/plugins/mui-to-bui/package.json index c9d563aa94..59cf5574c3 100644 --- a/plugins/mui-to-bui/package.json +++ b/plugins/mui-to-bui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mui-to-bui", - "version": "0.2.5-next.0", + "version": "0.2.5-next.1", "backstage": { "role": "frontend-plugin", "pluginId": "mui-to-bui", diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md index d39ec31c88..1c4b4dbd4e 100644 --- a/plugins/notifications-backend-module-email/CHANGELOG.md +++ b/plugins/notifications-backend-module-email/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-notifications-backend-module-email +## 0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/plugin-notifications-node@0.2.24-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-aws-node@0.1.20 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.1 + ## 0.3.19-next.0 ### Patch Changes diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index 515cbe6409..9fdbf51f98 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-email", - "version": "0.3.19-next.0", + "version": "0.3.19-next.1", "description": "The email backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-node/CHANGELOG.md b/plugins/notifications-node/CHANGELOG.md index 1b569a1493..4dfbf1bbd3 100644 --- a/plugins/notifications-node/CHANGELOG.md +++ b/plugins/notifications-node/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-notifications-node +## 0.2.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-notifications-common@0.2.1 + - @backstage/plugin-signals-node@0.1.29-next.0 + ## 0.2.24-next.0 ### Patch Changes diff --git a/plugins/notifications-node/package.json b/plugins/notifications-node/package.json index 87f62a7e3b..695547344f 100644 --- a/plugins/notifications-node/package.json +++ b/plugins/notifications-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-node", - "version": "0.2.24-next.0", + "version": "0.2.24-next.1", "description": "Node.js library for the notifications plugin", "backstage": { "role": "node-library", diff --git a/plugins/org-react/CHANGELOG.md b/plugins/org-react/CHANGELOG.md index 3f468b6339..1fc4b58097 100644 --- a/plugins/org-react/CHANGELOG.md +++ b/plugins/org-react/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-org-react +## 0.1.48-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + ## 0.1.48-next.0 ### Patch Changes diff --git a/plugins/org-react/package.json b/plugins/org-react/package.json index cc51eb5c1c..191a63b696 100644 --- a/plugins/org-react/package.json +++ b/plugins/org-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org-react", - "version": "0.1.48-next.0", + "version": "0.1.48-next.1", "backstage": { "role": "web-library", "pluginId": "org", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index a77e649b38..4eb45136a9 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-org +## 0.6.50-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/plugin-catalog-common@1.1.8 + ## 0.6.50-next.0 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index 62a4c9fd1b..8aa539a66d 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-org", - "version": "0.6.50-next.0", + "version": "0.6.50-next.1", "description": "A Backstage plugin that helps you create entity pages for your organization", "backstage": { "role": "frontend-plugin", diff --git a/plugins/scaffolder-backend-module-azure/CHANGELOG.md b/plugins/scaffolder-backend-module-azure/CHANGELOG.md index 27b6f2e934..4e82ae649d 100644 --- a/plugins/scaffolder-backend-module-azure/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-azure/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-azure +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index a5735fa15c..7cdb73ee12 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-azure", - "version": "0.2.19-next.0", + "version": "0.2.19-next.1", "description": "The azure module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md index ee15ba6f59..c6be138aa3 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-cloud +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-bitbucket-cloud-common@0.3.8-next.1 + ## 0.3.4-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json index c57240f97b..8b2b2e0744 100644 --- a/plugins/scaffolder-backend-module-bitbucket-cloud/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud", - "version": "0.3.4-next.0", + "version": "0.3.4-next.1", "description": "The Bitbucket Cloud module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md index cba6cdc118..07af66c23b 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-bitbucket-server/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-bitbucket-server +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-bitbucket-server/package.json b/plugins/scaffolder-backend-module-bitbucket-server/package.json index 6b813c33cf..1ef650ee5e 100644 --- a/plugins/scaffolder-backend-module-bitbucket-server/package.json +++ b/plugins/scaffolder-backend-module-bitbucket-server/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-bitbucket-server", - "version": "0.2.19-next.0", + "version": "0.2.19-next.1", "description": "The Bitbucket Server module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md index 585925ca27..cafd934280 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-confluence-to-markdown +## 0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.3.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json index 69bcd089c0..58cb808292 100644 --- a/plugins/scaffolder-backend-module-confluence-to-markdown/package.json +++ b/plugins/scaffolder-backend-module-confluence-to-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown", - "version": "0.3.19-next.0", + "version": "0.3.19-next.1", "description": "The confluence-to-markdown module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 55d0e78017..0cbfa84c98 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.3.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.16.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.3.21-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index b1cb303441..274e033625 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", - "version": "0.3.21-next.0", + "version": "0.3.21-next.1", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md index bf9c2606fe..c532cf5f1f 100644 --- a/plugins/scaffolder-backend-module-gcp/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gcp/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gcp +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gcp/package.json b/plugins/scaffolder-backend-module-gcp/package.json index f2c354feaf..719bd864dc 100644 --- a/plugins/scaffolder-backend-module-gcp/package.json +++ b/plugins/scaffolder-backend-module-gcp/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gcp", - "version": "0.2.19-next.0", + "version": "0.2.19-next.1", "description": "The GCP Bucket module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md index c300740667..c1eb24ddf5 100644 --- a/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gerrit/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gerrit +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gerrit/package.json b/plugins/scaffolder-backend-module-gerrit/package.json index d16e7fdc29..f4d7276939 100644 --- a/plugins/scaffolder-backend-module-gerrit/package.json +++ b/plugins/scaffolder-backend-module-gerrit/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gerrit", - "version": "0.2.19-next.0", + "version": "0.2.19-next.1", "description": "The gerrit module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md index c8d640494f..743dfd56da 100644 --- a/plugins/scaffolder-backend-module-gitea/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitea/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder-backend-module-gitea +## 0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.2.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitea/package.json b/plugins/scaffolder-backend-module-gitea/package.json index 693e9560f2..911ac096d6 100644 --- a/plugins/scaffolder-backend-module-gitea/package.json +++ b/plugins/scaffolder-backend-module-gitea/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitea", - "version": "0.2.19-next.0", + "version": "0.2.19-next.1", "description": "The gitea module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-github/CHANGELOG.md b/plugins/scaffolder-backend-module-github/CHANGELOG.md index 567787aeb7..4cba7c737a 100644 --- a/plugins/scaffolder-backend-module-github/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-github/CHANGELOG.md @@ -1,5 +1,19 @@ # @backstage/plugin-scaffolder-backend-module-github +## 0.9.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.9.7-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-github/package.json b/plugins/scaffolder-backend-module-github/package.json index 1b599c8558..031b5d2320 100644 --- a/plugins/scaffolder-backend-module-github/package.json +++ b/plugins/scaffolder-backend-module-github/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-github", - "version": "0.9.7-next.0", + "version": "0.9.7-next.1", "description": "The github module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md index c6a07bd53a..9eb65d54ed 100644 --- a/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-gitlab/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-gitlab +## 0.11.4-next.1 + +### Patch Changes + +- 0c1726a: Added new `gitlab:group:access` scaffolder action to add or remove users and groups as members of GitLab groups. The action supports specifying members via `userIds` and/or `groupIds` array parameters, configurable access levels (Guest, Reporter, Developer, Maintainer, Owner), and defaults to the 'add' action when not specified. +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.11.4-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-gitlab/package.json b/plugins/scaffolder-backend-module-gitlab/package.json index ac0cf1b9ad..c5153faaaf 100644 --- a/plugins/scaffolder-backend-module-gitlab/package.json +++ b/plugins/scaffolder-backend-module-gitlab/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-gitlab", - "version": "0.11.4-next.0", + "version": "0.11.4-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md index 84c719266e..8e93dc95e3 100644 --- a/plugins/scaffolder-backend-module-notifications/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-notifications/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-notifications +## 0.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/plugin-notifications-node@0.2.24-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/plugin-notifications-common@0.2.1 + ## 0.1.20-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-notifications/package.json b/plugins/scaffolder-backend-module-notifications/package.json index 5dd0a94d32..bb1a0bf299 100644 --- a/plugins/scaffolder-backend-module-notifications/package.json +++ b/plugins/scaffolder-backend-module-notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-notifications", - "version": "0.1.20-next.0", + "version": "0.1.20-next.1", "description": "The notifications backend module for the scaffolder plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index e7590507a9..d271c35e5d 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.5.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 0.5.19-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 73b18d7daa..cccd695c79 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", - "version": "0.5.19-next.0", + "version": "0.5.19-next.1", "description": "A module for the scaffolder backend that lets you template projects using Rails", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md index b42cf8bb61..e6d34b00a3 100644 --- a/plugins/scaffolder-backend-module-sentry/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-sentry/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-sentry +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.3.2-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-sentry/package.json b/plugins/scaffolder-backend-module-sentry/package.json index 96484013a8..6c31b067bc 100644 --- a/plugins/scaffolder-backend-module-sentry/package.json +++ b/plugins/scaffolder-backend-module-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-sentry", - "version": "0.3.2-next.0", + "version": "0.3.2-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 7f5bf1a9a2..5612323dd7 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.4.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node-test-utils@0.3.9-next.1 + ## 0.4.20-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index 8b41d9a053..ab29e1ce38 100644 --- a/plugins/scaffolder-backend-module-yeoman/package.json +++ b/plugins/scaffolder-backend-module-yeoman/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend-module-yeoman", - "version": "0.4.20-next.0", + "version": "0.4.20-next.1", "backstage": { "role": "backend-plugin-module", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index 460664fc2e..304a429826 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,32 @@ # @backstage/plugin-scaffolder-backend +## 3.2.0-next.1 + +### Minor Changes + +- c9b11eb: Added a new `list-scaffolder-tasks` action that allows querying scaffolder tasks with optional ownership filtering and pagination support +- 0fbcf23: Migrated OpenAPI schemas to 3.1. +- 7695dd2: Added a new `list-scaffolder-actions` action that returns all installed scaffolder actions with their schemas and examples + +### Patch Changes + +- e27bd4e: Removed `@backstage/plugin-scaffolder-backend-module-bitbucket` from `package.json` as the package itself has been deprecated and the code deleted. +- ccc20cf: create scaffolder MCP action to dry run a provided scaffolder template +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.20-next.0 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + ## 3.1.4-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 64e8ce29e7..041a0cce8c 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "3.1.4-next.0", + "version": "3.2.0-next.1", "description": "The Backstage backend plugin that helps you create new things", "backstage": { "role": "backend-plugin", diff --git a/plugins/scaffolder-common/CHANGELOG.md b/plugins/scaffolder-common/CHANGELOG.md index 80bc88bbe5..edfd06fa5d 100644 --- a/plugins/scaffolder-common/CHANGELOG.md +++ b/plugins/scaffolder-common/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-scaffolder-common +## 2.0.0-next.1 + +### Major Changes + +- 527cf88: **BREAKING** Removed deprecated `bitbucket` integration from being registered in the `ScaffolderClient`. Use the `bitbucketCloud` or `bitbucketServer` integrations instead. + +### Minor Changes + +- f598909: **BREAKING PRODUCERS**: Made `retry`, `listTasks`, `listTemplatingExtensions`, `dryRun`, and `autocomplete` required methods on the `ScaffolderApi` interface. Implementations of `ScaffolderApi` must now provide these methods. + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + ## 1.7.7-next.0 ### Patch Changes diff --git a/plugins/scaffolder-common/package.json b/plugins/scaffolder-common/package.json index 98520a4381..cad8a7749d 100644 --- a/plugins/scaffolder-common/package.json +++ b/plugins/scaffolder-common/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-common", - "version": "1.7.7-next.0", + "version": "2.0.0-next.1", "description": "Common functionalities for the scaffolder, to be shared between scaffolder and scaffolder-backend plugin", "backstage": { "role": "common-library", diff --git a/plugins/scaffolder-node-test-utils/CHANGELOG.md b/plugins/scaffolder-node-test-utils/CHANGELOG.md index 1f93005bfe..e20e871bea 100644 --- a/plugins/scaffolder-node-test-utils/CHANGELOG.md +++ b/plugins/scaffolder-node-test-utils/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-scaffolder-node-test-utils +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-test-utils@1.11.1-next.1 + - @backstage/plugin-scaffolder-node@0.13.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/types@1.2.2 + ## 0.3.9-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node-test-utils/package.json b/plugins/scaffolder-node-test-utils/package.json index 57686d0b6a..a12f02f0af 100644 --- a/plugins/scaffolder-node-test-utils/package.json +++ b/plugins/scaffolder-node-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node-test-utils", - "version": "0.3.9-next.0", + "version": "0.3.9-next.1", "backstage": { "role": "node-library", "pluginId": "scaffolder", diff --git a/plugins/scaffolder-node/CHANGELOG.md b/plugins/scaffolder-node/CHANGELOG.md index 506640c822..18293c242c 100644 --- a/plugins/scaffolder-node/CHANGELOG.md +++ b/plugins/scaffolder-node/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-scaffolder-node +## 0.13.0-next.1 + +### Minor Changes + +- e27bd4e: **BREAKING** Removed deprecated `bitbucket` integration from being used in the `parseRepoUrl` function. It will use the `bitbucketCloud` or `bitbucketServer` integrations instead. + +### Patch Changes + +- f598909: Added `scaffolderServiceRef` and `ScaffolderService` interface for backend plugins that need to interact with the scaffolder API using `BackstageCredentials` instead of raw tokens. +- Updated dependencies + - @backstage/backend-test-utils@1.11.1-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + ## 0.12.6-next.0 ### Patch Changes diff --git a/plugins/scaffolder-node/package.json b/plugins/scaffolder-node/package.json index 10af899c19..80375ba15c 100644 --- a/plugins/scaffolder-node/package.json +++ b/plugins/scaffolder-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-node", - "version": "0.12.6-next.0", + "version": "0.13.0-next.1", "description": "The plugin-scaffolder-node module for @backstage/plugin-scaffolder-backend", "backstage": { "role": "node-library", diff --git a/plugins/scaffolder-react/CHANGELOG.md b/plugins/scaffolder-react/CHANGELOG.md index 56e46e55ac..1520f5487b 100644 --- a/plugins/scaffolder-react/CHANGELOG.md +++ b/plugins/scaffolder-react/CHANGELOG.md @@ -1,5 +1,25 @@ # @backstage/plugin-scaffolder-react +## 1.19.8-next.1 + +### Patch Changes + +- 004b5c1: Added back `formFieldsApiRef` and `ScaffolderFormFieldsApi` as alpha exports. +- f598909: Added `scaffolderApiMock` test utility, exported from `@backstage/plugin-scaffolder-react/testUtils`. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/frontend-test-utils@0.5.1-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-permission-react@0.4.41-next.0 + ## 1.19.8-next.0 ### Patch Changes diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index f09310ea5e..20865ba208 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-react", - "version": "1.19.8-next.0", + "version": "1.19.8-next.1", "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder", "backstage": { "role": "web-library", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index c321001bd3..cad983202c 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-scaffolder +## 1.35.5-next.1 + +### Patch Changes + +- e27bd4e: Removed check for deprecated `bitbucket` integration from `repoPickerValidation` function used by the `RepoUrlPicker`, it now validates the `bitbucketServer` and `bitbucketCloud` integrations instead. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/plugin-scaffolder-react@1.19.8-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-scaffolder-common@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-react@0.4.41-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 1.35.5-next.0 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index a36b5016e4..e32cf4f079 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "1.35.5-next.0", + "version": "1.35.5-next.1", "description": "The Backstage plugin that helps you create new things", "backstage": { "role": "frontend-plugin", diff --git a/plugins/search-backend-module-catalog/CHANGELOG.md b/plugins/search-backend-module-catalog/CHANGELOG.md index eb5fcd9b28..07e7288c52 100644 --- a/plugins/search-backend-module-catalog/CHANGELOG.md +++ b/plugins/search-backend-module-catalog/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-search-backend-module-catalog +## 0.3.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 0.3.13-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-catalog/package.json b/plugins/search-backend-module-catalog/package.json index d6b3318020..1220a07b2b 100644 --- a/plugins/search-backend-module-catalog/package.json +++ b/plugins/search-backend-module-catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search-backend-module-catalog", - "version": "0.3.13-next.0", + "version": "0.3.13-next.1", "description": "A module for the search backend that exports catalog modules", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/search-backend-module-techdocs/CHANGELOG.md b/plugins/search-backend-module-techdocs/CHANGELOG.md index b445ae0477..d687a8a93d 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.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-techdocs-node@1.14.3-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 0.4.12-next.0 ### Patch Changes diff --git a/plugins/search-backend-module-techdocs/package.json b/plugins/search-backend-module-techdocs/package.json index b85abc2715..5331fdeab6 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.12-next.0", + "version": "0.4.12-next.1", "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 0b18e1ccce..e565a08fc1 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-search-backend +## 2.1.0-next.1 + +### Minor Changes + +- 0fbcf23: Migrated OpenAPI schemas to 3.1. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.7-next.0 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.6 + - @backstage/plugin-permission-node@0.10.11-next.0 + - @backstage/plugin-search-backend-node@1.4.2-next.0 + - @backstage/plugin-search-common@1.2.22 + ## 2.0.13-next.0 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 4c4739e967..22e54af118 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.13-next.0", + "version": "2.1.0-next.1", "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 93711e086f..5da0be9bef 100644 --- a/plugins/search/CHANGELOG.md +++ b/plugins/search/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-search +## 1.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.12 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + ## 1.6.2-next.0 ### Patch Changes diff --git a/plugins/search/package.json b/plugins/search/package.json index e65a07c145..117368c2d7 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-search", - "version": "1.6.2-next.0", + "version": "1.6.2-next.1", "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 c7ceb95718..f23163dca5 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 +## 2.0.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.17.1-next.1 + - @backstage/plugin-catalog@1.34.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/test-utils@1.7.16-next.0 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 2.0.3-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index 639fc90db1..6121d06272 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": "2.0.3-next.0", + "version": "2.0.3-next.1", "backstage": { "role": "web-library", "pluginId": "techdocs-addons", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index a75cfe6671..76220acb88 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/plugin-techdocs-backend +## 2.1.6-next.1 + +### Patch Changes + +- cb7c6b1: Added `techdocs.generator.mkdocs.dangerouslyAllowAdditionalKeys` configuration option to explicitly bypass MkDocs configuration key restrictions. This enables support for additional MkDocs configuration keys beyond the default safe allow list, such as the `hooks` key which some MkDocs plugins require. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-techdocs-node@1.14.3-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/plugin-catalog-node@2.1.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + ## 2.1.6-next.0 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 31d6797f15..033b05aeea 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-backend", - "version": "2.1.6-next.0", + "version": "2.1.6-next.1", "description": "The Backstage backend plugin that renders technical documentation for your components", "backstage": { "role": "backend-plugin", diff --git a/plugins/techdocs-module-addons-contrib/CHANGELOG.md b/plugins/techdocs-module-addons-contrib/CHANGELOG.md index da2ac1bcb7..91b3a481c2 100644 --- a/plugins/techdocs-module-addons-contrib/CHANGELOG.md +++ b/plugins/techdocs-module-addons-contrib/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/plugin-techdocs-module-addons-contrib +## 1.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 1.1.34-next.0 ### Patch Changes diff --git a/plugins/techdocs-module-addons-contrib/package.json b/plugins/techdocs-module-addons-contrib/package.json index 86ef3743a0..d0a25072b2 100644 --- a/plugins/techdocs-module-addons-contrib/package.json +++ b/plugins/techdocs-module-addons-contrib/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-module-addons-contrib", - "version": "1.1.34-next.0", + "version": "1.1.34-next.1", "description": "Plugin module for contributed TechDocs Addons", "backstage": { "role": "frontend-plugin-module", diff --git a/plugins/techdocs-node/CHANGELOG.md b/plugins/techdocs-node/CHANGELOG.md index fd02995625..2fe338b8f6 100644 --- a/plugins/techdocs-node/CHANGELOG.md +++ b/plugins/techdocs-node/CHANGELOG.md @@ -1,5 +1,20 @@ # @backstage/plugin-techdocs-node +## 1.14.3-next.1 + +### Patch Changes + +- cb7c6b1: Added `techdocs.generator.mkdocs.dangerouslyAllowAdditionalKeys` configuration option to explicitly bypass MkDocs configuration key restrictions. This enables support for additional MkDocs configuration keys beyond the default safe allow list, such as the `hooks` key which some MkDocs plugins require. +- Updated dependencies + - @backstage/integration@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-aws-node@0.1.20 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-techdocs-common@0.1.1 + ## 1.14.3-next.0 ### Patch Changes diff --git a/plugins/techdocs-node/package.json b/plugins/techdocs-node/package.json index 163e8d3c12..613c935fce 100644 --- a/plugins/techdocs-node/package.json +++ b/plugins/techdocs-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-node", - "version": "1.14.3-next.0", + "version": "1.14.3-next.1", "description": "Common node.js functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", "backstage": { "role": "node-library", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 0a636c06f2..b16a6ba4aa 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-techdocs +## 1.17.1-next.1 + +### Patch Changes + +- 30e08df: Added `documentation` as the default entity content group for the TechDocs entity content tab. +- Updated dependencies + - @backstage/catalog-client@1.14.0-next.1 + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/integration@2.0.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/integration-react@1.2.16-next.1 + - @backstage/theme@0.7.2 + - @backstage/plugin-auth-react@0.1.25-next.0 + - @backstage/plugin-search-common@1.2.22 + - @backstage/plugin-search-react@1.10.5-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + - @backstage/plugin-techdocs-react@1.3.9-next.0 + ## 1.17.1-next.0 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 91c49699ea..2d0a51563d 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs", - "version": "1.17.1-next.0", + "version": "1.17.1-next.1", "description": "The Backstage plugin that renders technical documentation for your components", "backstage": { "role": "frontend-plugin", diff --git a/plugins/user-settings/CHANGELOG.md b/plugins/user-settings/CHANGELOG.md index 46a1ed955e..023b7f817a 100644 --- a/plugins/user-settings/CHANGELOG.md +++ b/plugins/user-settings/CHANGELOG.md @@ -1,5 +1,22 @@ # @backstage/plugin-user-settings +## 0.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@2.1.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.6-next.0 + - @backstage/core-components@0.18.8-next.0 + - @backstage/core-plugin-api@1.12.4-next.0 + - @backstage/errors@1.2.7 + - @backstage/frontend-plugin-api@0.14.2-next.0 + - @backstage/theme@0.7.2 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.20-next.0 + - @backstage/plugin-user-settings-common@0.1.0 + ## 0.9.1-next.0 ### Patch Changes diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index 8dbc35fd40..7e6fb2fd72 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-user-settings", - "version": "0.9.1-next.0", + "version": "0.9.1-next.1", "description": "A Backstage plugin that provides a settings page", "backstage": { "role": "frontend-plugin", From bb66b8617bbe21fc9a24b4a4d57530c9c6965ae0 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Tue, 3 Mar 2026 17:57:26 +0000 Subject: [PATCH 442/455] Improve Select style Signed-off-by: Charles de Dreuille --- .changeset/odd-ears-grab.md | 7 +++ .../src/components/Select/Select.module.css | 46 ++++++++++--------- .../src/components/Select/Select.stories.tsx | 37 +++++++++++++++ .../src/components/Select/SelectTrigger.tsx | 7 ++- .../ui/src/components/Select/definition.ts | 1 + 5 files changed, 75 insertions(+), 23 deletions(-) create mode 100644 .changeset/odd-ears-grab.md diff --git a/.changeset/odd-ears-grab.md b/.changeset/odd-ears-grab.md new file mode 100644 index 0000000000..a683f3e6f5 --- /dev/null +++ b/.changeset/odd-ears-grab.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +The `Select` trigger now automatically adapts its background colour based on the parent background context. + +**Affected components:** Select diff --git a/packages/ui/src/components/Select/Select.module.css b/packages/ui/src/components/Select/Select.module.css index 8ceaa2528e..74801de1a9 100644 --- a/packages/ui/src/components/Select/Select.module.css +++ b/packages/ui/src/components/Select/Select.module.css @@ -35,8 +35,26 @@ .bui-SelectTrigger { box-sizing: border-box; border-radius: var(--bui-radius-3); - border: 1px solid var(--bui-border-2); + border: none; + outline: none; background-color: var(--bui-bg-neutral-1); + transition: box-shadow 0.2s ease-in-out; + + &[data-on-bg='neutral-1'] { + background-color: var(--bui-bg-neutral-2); + } + + &[data-on-bg='neutral-2'] { + background-color: var(--bui-bg-neutral-3); + } + + &[data-on-bg='neutral-3'] { + background-color: var(--bui-bg-neutral-4); + } + + .bui-Select[data-focused] & { + box-shadow: inset 0 0 0 1px var(--bui-ring); + } display: flex; justify-content: space-between; align-items: center; @@ -73,12 +91,7 @@ } .bui-Select[data-invalid] & { - border-color: var(--bui-fg-danger); - - &:focus-visible, - &:hover { - outline: 1px solid var(--bui-fg-danger); - } + box-shadow: inset 0 0 0 1px var(--bui-border-danger); } &[disabled] { @@ -119,6 +132,8 @@ .bui-SelectList { overflow: auto; min-height: 0; + padding-block: var(--bui-space-1); + padding-inline: var(--bui-space-1); &:focus-visible { /* Remove default focus-visible outline because React Aria @@ -132,7 +147,6 @@ .bui-SelectItem { box-sizing: border-box; position: relative; - width: var(--anchor-width); display: grid; grid-template-areas: 'icon text'; grid-template-columns: 1rem 1fr; @@ -147,20 +161,10 @@ font-size: var(--bui-font-size-3); gap: var(--bui-space-2); outline: none; + border-radius: var(--bui-radius-2); - &[data-focus-visible] { - outline: 2px solid var(--bui-ring); - outline-offset: 2px; - } - - &[data-focused]::before { - content: ''; - position: absolute; - inset-block: 0; - inset-inline: var(--bui-space-1); - border-radius: var(--bui-radius-2); - background: var(--bui-bg-neutral-2); - z-index: -1; + &[data-focused] { + background-color: var(--bui-bg-neutral-2); } &[data-disabled] { diff --git a/packages/ui/src/components/Select/Select.stories.tsx b/packages/ui/src/components/Select/Select.stories.tsx index e3c2ad41aa..cf410e43a1 100644 --- a/packages/ui/src/components/Select/Select.stories.tsx +++ b/packages/ui/src/components/Select/Select.stories.tsx @@ -17,6 +17,8 @@ import preview from '../../../../../.storybook/preview'; import { Select } from './Select'; import { Flex } from '../Flex'; +import { Box } from '../Box'; +import { Text } from '../Text'; import { Form } from 'react-aria-components'; import { RiCloudLine } from '@remixicon/react'; @@ -391,6 +393,41 @@ export const WithLongNamesAndPadding = meta.story({ ], }); +export const AutoBg = meta.story({ + render: () => ( + +
    + Select automatically detects its parent bg context and increments the + neutral level by 1. No prop is needed — it's fully automatic. +
    + + Neutral 1 container + + + + + + + + + Neutral 3 container + +

    H)P?lO*0fBvn@Bp`o z!|mSXoNGLPvY97(2MpnLC&sxxy2(+b?!gt56uj|=$8csnm2oIhmBhGPEc3RvSXyck z)jSkso6(o|eh%|v7LPkW*tTinFL@mk*#RR8A%11t^Bm>(o`3#7Wbuq8tb;i^=qGwP z3_%xLV@)-aiCaY4$d|ewA1t|K{<#LZ|L3h%Vr04k<21V0^c2k(nnfiX48hVNV}<;j zP{P4T?L{i^*#nWUCx(h(TZ8IbM|+2sGURWX!-Y59iPV+nLh0B!W2<88kLAoH#XDp{ z&#)#W{0ZAk&U0{izoyYX@nc+w0tJ;`r_)27FFyn32$lB!HsP%v;wv`lZ+Hl0$~Y`I9Y3ARVzCv>5upEWZ-taR^}>L z;wE5QF0NpuT)QND&QS2RPy1RfF6r0>)e`+Dc^^0Sw`EVK&=k=N=qc`6dg@K$$3#HdP`XuZ{gSjxmflifNIlm7w+~i5ZSo)-;$qCwMlW&?Z}qIlZK0~FsSqwT6pmap$5RCl1>VGzX2 zeSbxH+EZ&sfQZ-~{$VY~qLuBvM6zm8OSYYs?DPR8dvDL|aoI#m)dD8agKUi6-=9u& zotO$(lF9})N%TFbp`x(4#{YIhF3MA94O372^D}md!L2Y^NZxv68Tvob2N6-poFs5O zy=2)w4Fn-hiL>~}R3X=39qvQj)`H=ow7j%HcagL$?I~j|~}6(;Gp?-S84PMiim* z?pW@WHv_o#v4m0$yeEi5^S|HugK#kk$d#r4?;pwS5PA7;b8L-LT~^5LEX;8WrC$}f z43rcU{_p5&&J=O-D&J7}f71YJgsL(f`U&oMuS3qhfAOy6a-ZsZQpjAnqkyndOBq&ww~6W2X+{~@AGGP zzgT*9Kk7yxhS2U7AY9vrf@O(k*+H%D`UL_q&4mcA7DRr`i>tf-Js{ede1KQqK-oY` z?v7v@VM(I3+;67xvf(OljPOr7yEP_afA^%2K@5vfwx}nk$>Y zN5%{;ZcSRAh^>M(8p`<4nTf5!H1Y)ou1v1*d8r6CE+npW-s=$)*Az6-F;>8!lVwCX zFnS36<45^w@|c5@@7wVD!B;-f(TT@qR7F4ds)8VUtDJnwawY@0yCkKxm}u$uKWJkO z$24-{Q^XvP$;go4qv=bC-X4+c`=Am_m;UZ~Ei9aonwo0S+SJtK2KYQLFr#hL=}SP& zipK9D7iu{zKjyy-3ZmxV4Jn2t&t$7@?_AWi+<5G*ea9Nsdvfo$XkycE9u~4Ke}=QJA$QA1!ims(?t` zBH8p^T8sCdeuc9;Oh3GxldJxB6U1j<{_BAhb(|jihgy!`)CdT^V$!9O7;>;k7Z!YK zY5|sjD&!hsDSl}`Lwa3!Vzg2YQ?a8`|Xv%7qxuh=)zy z5l40LzwA;9s(WtU;=|#~eVY!+3i&$ID1qXF0s?RFQTFccJhmTUq5Ou>5IB!8Rht(- z?9XeM=UhrDBB$S3#tW#~9MRC_9^@B)zeeTUvw_jpc(ljDED%)pC8w)6b3-lLruE30 zPYKOQFs-`Zi=cj&mIfO}y?K6HG6MhAKY1umEGsgU6)CXOvxx)>%F1D8(=(}9IlAX? zm`qA^V9T5R{3#`l-=N97@bvRR074n2)>z)&$R2;IZ9xOW$y?@>DOVpiK`#9Wr450i zn`Gy*(fv!+0@aQ4TLca$DB@XvZX~l<`4L}RUXS;>djs3Z@8+Bdj8t2Q=+91FvMkPt z4Yw!^mx7uq?qcdxM=hr~dw%7GDl;EcYf8)P{jv%D<7%HfrcEHLm?q0p(KPXd%6X|aXKnJ@qAd3FX1Jde*1c2P14;P$n Date: Wed, 19 Nov 2025 14:08:37 -0500 Subject: [PATCH 025/455] Fixed formatting in viewing-catalog documentation Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/viewing-catalog.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/viewing-catalog.md b/docs/getting-started/viewing-catalog.md index 1c48072268..15aad36691 100644 --- a/docs/getting-started/viewing-catalog.md +++ b/docs/getting-started/viewing-catalog.md @@ -114,15 +114,16 @@ Each of the entities in the Catalog have various relationships to each other. Fo To see these relationships: -1. select the name of the component in the main panel, in this example, **example-website**. +1. Select the name of the component in the main panel, in this example, **example-website**. ![Screenshot of the Backstage portal with example-website selected.](../assets/uiguide/select-example-website.png) -A page is displayed that includes a **Relations** section. This section displays the selected entity and any other types of entities to which it is related. Each relationship is also designated, such as `hasPart/partOf` and `apiProvidedBy/providesApi`. [Well-known Relations between Catalog Entities](../features/software-catalog/well-known-relations.md) describes the most common relationships but you can also [create your own relationships](../features/software-catalog/extending-the-model.md#adding-a-new-relation-type). +A page is displayed that includes a `Relations` section. This section displays the selected entity and any other types of entities to which it is related. Each relationship is also designated, such as `hasPart/partOf` and `apiProvidedBy/providesApi`. [Well-known Relations between Catalog Entities](../features/software-catalog/well-known-relations.md) describes the most common relationships but you can also [create your own relationships](../features/software-catalog/extending-the-model.md#adding-a-new-relation-type). Selecting any of the related entities allows you to drill down further through the system model. ![Screenshot of the example-website Relations panel.](../assets/uiguide/example-website-relationships.png) + From ffd993647ecc143d172acd8771c3730d3d2f02d7 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 20 Nov 2025 09:18:24 -0500 Subject: [PATCH 026/455] Revise viewing catalog documentation Removed the two sections, Viewing entity relationships, and Viewing what you own, and made them into 2 separate files. Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/viewing-catalog.md | 35 +------------------------ 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/docs/getting-started/viewing-catalog.md b/docs/getting-started/viewing-catalog.md index 15aad36691..f7f6828c0c 100644 --- a/docs/getting-started/viewing-catalog.md +++ b/docs/getting-started/viewing-catalog.md @@ -74,7 +74,7 @@ For each entity, there are a set of actions that are available. - View - View the `catalog-info.yaml` file that defines the entity. - Edit - Edit the `catalog-info.yaml` file that defines the entity. See [Updating a Component](../getting-started/update-a-component.md) -- Star - Designate the entity as a favorite. You can filter and search for starred entities. +- Star - Designate the entity as a favorite. You can filter and [search](../getting-started/search-catalog.md) for starred entities. ![Screenshot explaining entity actions.](../assets/uiguide/entity-actions.png) @@ -93,37 +93,4 @@ Selecting a System, such as `examples`, displays `About`, `Relations`, and `Link ![Details of system entity.](../assets/uiguide/details-system-entity.png) -## Viewing what you own - -To view the entities that you own: - -1. Select `Home` in the sidebar. -2. Select `User` in the `Kind` dropdown list. -3. Select your username in the `All Users` list. - -A page is displayed that shows the entities of which you have owenership, either directly, or through a group of which you are a member. You can toggle between showing: - -- `Direct Relations` - entities that you directly own -- `Aggregated Relations` - entities that you own through your group - -![Entities guest user owns.](../assets/uiguide/entities-owned-by-me.png) - -## Viewing entitiy relationships - -Each of the entities in the Catalog have various relationships to each other. For example, the demo data includes an API that provides data to a website. `guests` is the owner of the API and the website, and anyone signed in as part of the `guests` group can maintain them. - -To see these relationships: - -1. Select the name of the component in the main panel, in this example, **example-website**. - - ![Screenshot of the Backstage portal with example-website selected.](../assets/uiguide/select-example-website.png) - - -A page is displayed that includes a `Relations` section. This section displays the selected entity and any other types of entities to which it is related. Each relationship is also designated, such as `hasPart/partOf` and `apiProvidedBy/providesApi`. [Well-known Relations between Catalog Entities](../features/software-catalog/well-known-relations.md) describes the most common relationships but you can also [create your own relationships](../features/software-catalog/extending-the-model.md#adding-a-new-relation-type). - -Selecting any of the related entities allows you to drill down further through the system model. - -![Screenshot of the example-website Relations panel.](../assets/uiguide/example-website-relationships.png) - - From 2ba74769ce60501c776e48f2167842f7f8c4f0fc Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:34:15 -0500 Subject: [PATCH 027/455] Add two new files Added viewing-entity-relationships.md and view-what-you-own.md Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/getting-started/view-what-you-own.md | 22 ++++++ .../viewing-entity-relationships.md | 72 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 docs/getting-started/view-what-you-own.md create mode 100644 docs/getting-started/viewing-entity-relationships.md diff --git a/docs/getting-started/view-what-you-own.md b/docs/getting-started/view-what-you-own.md new file mode 100644 index 0000000000..a731696747 --- /dev/null +++ b/docs/getting-started/view-what-you-own.md @@ -0,0 +1,22 @@ +--- +id: view-what-you-own +title: Viewing what you own +description: View the entities that you own either directly or through a group +--- + +Audience: Developers + +You can own entities either directly or through a group of which you are a part. + +To view the entities that you own: + +1. Select `Home` in the sidebar. +2. Select `User` in the `Kind` dropdown list. +3. Select your username in the `All Users` list. + +A page is displayed that shows the entities of which you have owenership, either directly, or through a group of which you are a member. You can toggle between showing: + +- `Direct Relations` - entities that you directly own +- `Aggregated Relations `- entities that you own through your group + +![Screenshot of the Backstage portal entities owned by guest user.](../assets/uiguide/entities-owned-by-me.png) diff --git a/docs/getting-started/viewing-entity-relationships.md b/docs/getting-started/viewing-entity-relationships.md new file mode 100644 index 0000000000..b3bc50e319 --- /dev/null +++ b/docs/getting-started/viewing-entity-relationships.md @@ -0,0 +1,72 @@ +--- +id: viewing-entity-relationships +title: Viewing entity relationships +description: View the relationships between the entities in the Catalog +--- + +Audience: Developers + +Each of the entities in the Catalog have various relationships to each other. For example, the demo data includes an API that provides data to a website. `guests` is the owner of the API and the website, and anyone signed in as part of the `guests` group can maintain them. + +To see these relationships: + +1. Select the name of the component in the main panel, in this example, `example-website`. + + ![Screenshot of the Backstage portal with example-website selected.](../assets/uiguide/select-example-website.png) + +A page is displayed that includes a `Relations` section. This section displays the selected entity and any other types of entities to which it is related. Each relationship is also designated, such as `hasPart/partOf` and `apiProvidedBy/providesApi`. [Well-known Relations between Catalog Entities](../features/software-catalog/well-known-relations.md) describes the most common relationships but you can also [create your own relationships](../features/software-catalog/extending-the-model.md#adding-a-new-relation-type). + +Selecting any of the related entities allows you to drill down further through the system model. + +![Screenshot of the example-website Relations panel.](../assets/uiguide/example-website-relationships.png) + +## Filtering the relationships + +You can also view the relationships in the [Catalog Graph](../features/software-catalog/creating-the-catalog-graph.md)). This view allows you to filter what entities and relationships to display. + +To display the Catalog Graph: + +1. Select the name of the component in the main panel, in this example, `example-website`. + + A page is displayed that includes a `Relations` section. + +2. Select `View graph` in the `Relations` section. + + ![Select View graph.](../assets/uiguide/select-view-graph.png) + +The `Catalog Graph` is displayed. + +![Screenshot of Catalog Graph.](../assets/uiguide/catalog-graph.png) + +You can set the following filters: + +- `MAX DEPTH` - 1 or infinite + + ![Max Depth at 1 and inifite.](../assets/uiguide/max-depth-1-and-infinite.png) + +- `KINDS` - select what kinds of entities you want to view, default is all kinds +- `RELATIONS` - select which relationships you want to view, default is all relationships +- `Direction`- orientation in which you want to view the entity and its associated nodes + - Top to botton + - Bottom to top + - Left to right + - Right to left +- `Curve` + + - Monotone + - Step Before + + ![Curve at Monotone and Step Before.](../assets/uiguide/curve-monotone-step-before.png) + +You can also toggle: + +- `Simplified` + - On = simple view + - Off = detailed view +- `Merge relations` + + - On = You see the relationship from the selected entity to the nodes and from the nodes to the selected entity. + + - Off = You only see relations from the selected entity to its nodes. + + ![Graphic showing results of toggling Merge relations.](../assets/uiguide/simplify-merge-relations-on-off.png) From 8e9f2afdbf671c7d00c31747d8fdcc860c843015 Mon Sep 17 00:00:00 2001 From: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:39:31 -0500 Subject: [PATCH 028/455] Upload graphics for two new files Added graphics for viewing-entity-relationships.md and view-what-you-own.md Signed-off-by: milliehartnt123 <108491788+milliehartnt123@users.noreply.github.com> --- docs/assets/uiguide/catalog-graph.png | Bin 0 -> 63404 bytes .../uiguide/curve-monotone-step-before.png | Bin 0 -> 20127 bytes .../assets/uiguide/max-depth-1-and-infinite.png | Bin 0 -> 32268 bytes docs/assets/uiguide/select-view-graph.png | Bin 0 -> 17726 bytes .../uiguide/simplify-merge-relations-on-off.png | Bin 0 -> 91229 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/uiguide/catalog-graph.png create mode 100644 docs/assets/uiguide/curve-monotone-step-before.png create mode 100644 docs/assets/uiguide/max-depth-1-and-infinite.png create mode 100644 docs/assets/uiguide/select-view-graph.png create mode 100644 docs/assets/uiguide/simplify-merge-relations-on-off.png diff --git a/docs/assets/uiguide/catalog-graph.png b/docs/assets/uiguide/catalog-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..59e290b0f0d9af28bdb1b3b7840cb3bb3a562064 GIT binary patch literal 63404 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%0D@P5P(g$W&o})=7&Y{-U^9pVzO@DA)yu2I;;tc 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 Ohbju1@EW*c literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/curve-monotone-step-before.png b/docs/assets/uiguide/curve-monotone-step-before.png new file mode 100644 index 0000000000000000000000000000000000000000..5adf6fa40ff3c2f6d7c3260ddcc177a84fb935b0 GIT binary patch literal 20127 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%0D$n6^s!nUw2p&%AdDAq)GD3 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/select-view-graph.png b/docs/assets/uiguide/select-view-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..79886a82b435c815c9408a140541f612ab1237e6 GIT binary patch literal 17726 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 literal 0 HcmV?d00001 diff --git a/docs/assets/uiguide/simplify-merge-relations-on-off.png b/docs/assets/uiguide/simplify-merge-relations-on-off.png new file mode 100644 index 0000000000000000000000000000000000000000..ecee5e678c298a1b0475804bdf677e8061ebd917 GIT binary patch literal 91229 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