diff --git a/.changeset/calm-clouds-smoke.md b/.changeset/calm-clouds-smoke.md new file mode 100644 index 0000000000..1209c6e071 --- /dev/null +++ b/.changeset/calm-clouds-smoke.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-github-actions': patch +--- + +Add error panel when the plugin fails. diff --git a/.changeset/cool-suns-add.md b/.changeset/cool-suns-add.md new file mode 100644 index 0000000000..c66de2e2ad --- /dev/null +++ b/.changeset/cool-suns-add.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-github-actions': patch +--- + +Fix wrong GitHub callback URL documentation diff --git a/.changeset/create-app-1667233110.md b/.changeset/create-app-1667233110.md new file mode 100644 index 0000000000..b50d431d4b --- /dev/null +++ b/.changeset/create-app-1667233110.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Bumped create-app version. diff --git a/.changeset/grumpy-clouds-drum.md b/.changeset/grumpy-clouds-drum.md new file mode 100644 index 0000000000..cf2d5d2a32 --- /dev/null +++ b/.changeset/grumpy-clouds-drum.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +- The GitLab Project ID for the `publish:gitlab:merge-request` action is now passed through the query parameter `project` in the `repoUrl`. It still allows people to not use the `projectid` and use the `repoUrl` with the `owner` and `repo` query parameters instead. This makes it easier to publish to repositories instead of writing the full path to the project. diff --git a/.changeset/lucky-cobras-sell.md b/.changeset/lucky-cobras-sell.md new file mode 100644 index 0000000000..16d86d52e8 --- /dev/null +++ b/.changeset/lucky-cobras-sell.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-playlist': patch +'@backstage/plugin-playlist-backend': patch +--- + +Updated Playlist plugin docs: + +- Updated `playlist` plugin README to include note about installing backend plugin and added images for the various features +- Updated `playlist-backend` plugin README to remove `IdentityClient` import in example as it is not used and made minor change to headings diff --git a/.changeset/metal-hairs-mix.md b/.changeset/metal-hairs-mix.md new file mode 100644 index 0000000000..f795c37506 --- /dev/null +++ b/.changeset/metal-hairs-mix.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-azure-devops-backend': patch +--- + +- Adjusted the asset parser to accept case sensitive +- Fixed fetching data that was using the deprecated function diff --git a/.changeset/popular-ants-mix.md b/.changeset/popular-ants-mix.md new file mode 100644 index 0000000000..f0e6b17f8d --- /dev/null +++ b/.changeset/popular-ants-mix.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': minor +--- + +Updates the User and Group Profile cards to add the links from the UserEntity or the GroupEntity diff --git a/.changeset/pre.json b/.changeset/pre.json index a2fd9eb458..9aa5bbdfdf 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -181,6 +181,7 @@ "changesets": [ "analyze-software-creation", "analyze-software-exploration", + "beige-gorillas-sip", "big-islands-add", "brave-eels-allow", "brown-days-pretend", @@ -188,6 +189,7 @@ "chatty-planets-flash", "clean-feet-remain", "clean-planets-rhyme", + "create-app-1667233110", "dirty-birds-burn", "dull-oranges-tap", "eight-pears-attack", @@ -203,6 +205,7 @@ "gorgeous-onions-thank", "gorgeous-queens-pull", "great-colts-invite", + "grumpy-clouds-drum", "grumpy-pigs-reflect", "happy-avocados-tan", "heavy-elephants-nail", @@ -211,9 +214,11 @@ "lazy-planes-repair", "little-bikes-eat", "lucky-cats-peel", + "lucky-cobras-sell", "lucky-spoons-hide", "mean-files-fly", "metal-dogs-swim", + "metal-hairs-mix", "nasty-crabs-share", "orange-trees-peel", "popular-bulldogs-lie", diff --git a/.changeset/silly-meals-teach.md b/.changeset/silly-meals-teach.md new file mode 100644 index 0000000000..ffd80463a3 --- /dev/null +++ b/.changeset/silly-meals-teach.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Improve logging diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml new file mode 100644 index 0000000000..782b5fdfa0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -0,0 +1,84 @@ +name: '๐Ÿ› Bug Report' +description: 'Submit a bug report to help us improve' +title: '๐Ÿ› Bug Report: ' +labels: + - bug +body: + - type: markdown + attributes: + value: We value your time and effort to submit this bug report. ๐Ÿ™ + - type: textarea + id: description + validations: + required: true + attributes: + label: '๐Ÿ“œ Description' + description: 'A clear and concise description of what the bug is.' + placeholder: 'It bugs out when ...' + - type: textarea + id: expected-behavior + validations: + required: true + attributes: + label: '๐Ÿ‘ Expected behavior' + description: 'What did you think should happen?' + placeholder: 'It should ...' + - type: textarea + id: actual-behavior + validations: + required: true + attributes: + label: '๐Ÿ‘Ž Actual Behavior with Screenshots' + description: 'What did actually happen? Add screenshots, if applicable.' + placeholder: 'It actually ...' + - type: textarea + id: steps-to-reproduce + validations: + required: true + attributes: + label: '๐Ÿ‘Ÿ Reproduction steps' + description: 'How do you trigger this bug? Please walk us through it step by step.' + placeholder: + "Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code or configuration to reproduce, if relevant.\n + 1. Go to '...'\n + 2. Click on '....'\n + 3. Scroll down to '....'" + - type: textarea + id: context + validations: + required: false + attributes: + label: '๐Ÿ“ƒ Provide the context for the Bug.' + description: 'How has this issue affected you? What are you trying to accomplish?' + placeholder: 'Providing context (e.g. links to configuration settings, stack trace or log data) helps us come up with a solution that is most useful in the real world.' + - type: textarea + id: environment + validations: + required: false + attributes: + label: '๐Ÿ–ฅ๏ธ Your Environment' + description: 'Provide Browser Information + Provide Output of `yarn backstage-cli info`' + placeholder: 'Include as many relevant details about the environment you experienced the bug in.' + - type: checkboxes + id: no-duplicate-issues + attributes: + label: '๐Ÿ‘€ Have you spent some time to check if this bug has been raised before?' + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: '๐Ÿข Have you read the Code of Conduct?' + options: + - label: 'I have read the [Code of Conduct](https://github.com/backstage/backstage/blob/master/CODE_OF_CONDUCT.md)' + required: true + - type: dropdown + attributes: + label: Are you willing to submit PR? + description: This is absolutely not required, but we are happy to guide you in the contribution process. + options: + - Yes I am willing to submit a PR! + - No, but I'm happy to collaborate on a PR with someone else + - No, I don't have time to work on this right now diff --git a/.github/ISSUE_TEMPLATE/bug_template.md b/.github/ISSUE_TEMPLATE/bug_template.md deleted file mode 100644 index 04f8fd68d0..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_template.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -name: 'Bug Report' -about: 'Create Bug Report' -labels: bug ---- - - - -## Expected Behavior - - - -## Actual Behavior - - - -## Steps to Reproduce - - - - -1. Step 1 -2. Step 2 -3. ... - -## Context - - - - - -## Your Environment - - - -- Browser Information: - -- Output of `yarn backstage-cli info`: - -```text - -``` diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml new file mode 100644 index 0000000000..9cac5055f1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -0,0 +1,54 @@ +name: ๐Ÿš€ Feature +description: 'Submit a proposal for a new feature' +title: '๐Ÿš€ Feature: ' +labels: [enhancement] +body: + - type: markdown + attributes: + value: | + We value your time and efforts to submit this Feature request form. ๐Ÿ™ + - type: textarea + id: feature-description + validations: + required: true + attributes: + label: '๐Ÿ”– Feature description' + description: 'A clear and concise description of what the feature is.' + placeholder: 'You should add ...' + - type: textarea + id: context + validations: + required: true + attributes: + label: '๐ŸŽค Context' + description: 'Please explain why this feature should be implemented and how it would be used. Add examples, if applicable.' + placeholder: 'In my use-case, ...' + - type: textarea + id: implementation + attributes: + label: 'โœŒ๏ธ Possible Implementation' + description: 'A clear and concise description of what you want to happen.' + placeholder: 'Not obligatory, but ideas as to the implementation of the addition or change' + - type: checkboxes + id: no-duplicate-issues + attributes: + label: '๐Ÿ‘€ Have you spent some time to check if this feature request has been raised before?' + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: '๐Ÿข Have you read the Code of Conduct?' + options: + - label: 'I have read the [Contributing Guidelines](https://github.com/backstage/backstage/blob/master/CODE_OF_CONDUCT.md)' + required: true + - type: dropdown + id: willing-to-submit-pr + attributes: + label: Are you willing to submit PR? + description: This is absolutely not required, but we are happy to guide you in the contribution process. + options: + - Yes I am willing to submit a PR! + - No, but I'm happy to collaborate on a PR with someone else + - No, I don't have time to work on this right now diff --git a/.github/ISSUE_TEMPLATE/feature_template.md b/.github/ISSUE_TEMPLATE/feature_template.md deleted file mode 100644 index d70622bf52..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_template.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -name: 'Feature Request' -about: 'Suggest new features and changes' -labels: enhancement ---- - - - -## Feature Suggestion - - - - -## Possible Implementation - - - -## Context - - - - diff --git a/.github/ISSUE_TEMPLATE/plugin.yaml b/.github/ISSUE_TEMPLATE/plugin.yaml new file mode 100644 index 0000000000..9f3a708b41 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/plugin.yaml @@ -0,0 +1,52 @@ +name: ๐Ÿ”Œ Plugin +description: 'Submit a proposal for a new Plugin' +title: '๐Ÿ”Œ Plugin: ' +labels: [plugin] +body: + - type: markdown + attributes: + value: | + We value your time and efforts to submit this Plugin request form. ๐Ÿ™ + - type: textarea + id: plugin-summary + validations: + required: true + attributes: + label: '๐Ÿ”– Summary' + description: 'Provide a general summary of the plugin and how it should work' + placeholder: 'You should add ...' + - type: textarea + id: website + attributes: + label: '๐ŸŒ Project website (if applicable)' + description: 'Add a link to the open source project or product this plugin will integrate with, if existing' + placeholder: 'Website Link is ...' + - type: textarea + id: context + attributes: + label: 'โœŒ๏ธ Context' + description: 'A clear and concise description about the Plugin.' + placeholder: 'Providing additional context' + - type: checkboxes + id: no-duplicate-issues + attributes: + label: '๐Ÿ‘€ Have you spent some time to check if this plugin request has been raised before?' + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: '๐Ÿข Have you read the Code of Conduct?' + options: + - label: 'I have read the [Contributing Guidelines](https://github.com/backstage/backstage/blob/master/CODE_OF_CONDUCT.md)' + required: true + - type: dropdown + id: willing-to-submit-pr + attributes: + label: Are you willing to submit PR? + description: This is absolutely not required, but we are happy to guide you in the contribution process. + options: + - Yes I am willing to submit a PR! + - No, but I'm happy to collaborate on a PR with someone else + - No, I don't have time to work on this right now diff --git a/.github/ISSUE_TEMPLATE/plugin_template.md b/.github/ISSUE_TEMPLATE/plugin_template.md deleted file mode 100644 index 75f0828848..0000000000 --- a/.github/ISSUE_TEMPLATE/plugin_template.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: 'Plugin suggestion' -about: 'Suggest a new Backstage plugin' -title: '[Plugin] THE PLUGIN NAME' -labels: plugin ---- - - - - -## Summary - - - -## Project website (if applicable) - - - -## Context - - diff --git a/.github/ISSUE_TEMPLATE/rfc.yaml b/.github/ISSUE_TEMPLATE/rfc.yaml new file mode 100644 index 0000000000..775c64e674 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/rfc.yaml @@ -0,0 +1,51 @@ +name: ๐Ÿ’ฌ RFC +description: 'Request For Comments (RFC) from the community' +title: '๐Ÿ’ฌ RFC: ' +labels: [rfc] +body: + - type: markdown + attributes: + value: | + We value your time and efforts to submit this RFC form. ๐Ÿ™ + - type: textarea + id: rfc-need + validations: + required: true + attributes: + label: '๐Ÿ”– Need' + description: 'Let us know why are you proposing this change' + placeholder: 'The problem weโ€™re trying to address and the benefits/impact we expect to get from this are ...' + - type: textarea + id: proposal + validations: + required: true + attributes: + label: '๐ŸŽ‰ Proposal' + description: 'Describe the proposal in as much detail as needed for reviewers to give concrete feedback.' + placeholder: 'Take special care in this section to describe any implications on data privacy or security.' + - type: textarea + id: alternatives + attributes: + label: 'ใ€ฝ๏ธ Alternatives' + description: 'What alternatives to the proposed solution were considered?' + placeholder: 'What criteria/data was used to discard these?' + - type: textarea + id: risk + attributes: + label: 'โŒ Risks' + description: 'What other things happening could conflict or compete (for example for resources) with the proposal?' + placeholder: 'What risk are there and how do we plan to handle them?' + - type: checkboxes + id: no-duplicate-issues + attributes: + label: '๐Ÿ‘€ Have you spent some time to check if this RFC has been raised before?' + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: '๐Ÿข Have you read the Code of Conduct?' + options: + - label: 'I have read the [Code of Conduct](https://github.com/backstage/backstage/blob/master/CODE_OF_CONDUCT.md)' + required: true diff --git a/.github/ISSUE_TEMPLATE/rfc_template.md b/.github/ISSUE_TEMPLATE/rfc_template.md deleted file mode 100644 index c4990ee5d6..0000000000 --- a/.github/ISSUE_TEMPLATE/rfc_template.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: 'RFC' -about: 'Request For Comments (RFC) from the community' -labels: rfc -title: '[RFC] ' ---- - -**Status:** Open for comments - - - -## Need - - - -## Proposal - - - -## Alternatives - - - -## Risks - - diff --git a/.github/ISSUE_TEMPLATE/ux-component_template.md b/.github/ISSUE_TEMPLATE/ux-component_template.md deleted file mode 100644 index 95b8f47615..0000000000 --- a/.github/ISSUE_TEMPLATE/ux-component_template.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -name: 'UX Component' -about: 'For designers to request UX components to be added to the Backstage Storybook' -labels: design ---- - -## ๐Ÿ—’ General - - - - -## ๐Ÿ’ป Usage - - - -## ๐Ÿ“ Specs - - - - -## ๐Ÿ”ฎ Future - - diff --git a/.github/ISSUE_TEMPLATE/ux_component.yaml b/.github/ISSUE_TEMPLATE/ux_component.yaml new file mode 100644 index 0000000000..453f1e8278 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ux_component.yaml @@ -0,0 +1,53 @@ +name: ๐Ÿฆ„ UX Component +description: 'For designers to request UX components to be added to the Backstage Storybook' +title: '๐Ÿฆ„ UX Component: ' +labels: [design] +body: + - type: markdown + attributes: + value: | + We value your time and efforts to submit this RFC form. ๐Ÿ™ + - type: textarea + id: ux-general + validations: + required: true + attributes: + label: '๐Ÿ”– General' + description: 'Write a nice note to the community requesting the creation of a new component.' + placeholder: 'Include an image of your component. Bonus points for a GIF!' + - type: textarea + id: usage + validations: + required: true + attributes: + label: '๐Ÿ’ป Usage' + description: "Tell us what's the point of this component/pattern is." + placeholder: 'How does it help? How should it work? Any rules?' + - type: textarea + id: specs + validations: + required: true + attributes: + label: '๐Ÿ“ Specs' + description: 'Include images that detail the redlines for your component.' + placeholder: "Once we get our Figma workspace set up, we'll be posting the Figma files rather than doing specs by hand." + - type: textarea + id: future + attributes: + label: '๐Ÿ”ฎ Future' + description: 'List out any upcoming, exciting functionality for this component.' + placeholder: 'The component will have ...' + - type: checkboxes + id: no-duplicate-issues + attributes: + label: '๐Ÿ‘€ Have you spent some time to check if this UX Component request has been raised before?' + options: + - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: '๐Ÿข Have you read the Code of Conduct?' + options: + - label: 'I have read the [Code of Conduct](https://github.com/backstage/backstage/blob/master/CODE_OF_CONDUCT.md)' + required: true diff --git a/.github/vale/Vocab/Backstage/accept.txt b/.github/vale/Vocab/Backstage/accept.txt index d21d0f9f25..839afaa256 100644 --- a/.github/vale/Vocab/Backstage/accept.txt +++ b/.github/vale/Vocab/Backstage/accept.txt @@ -4,9 +4,11 @@ ACLs addon addons ADRs +airbrake Airbrake Airbrakes -airbrake +Alaria +Alef Anddddd Apdex api @@ -26,9 +28,9 @@ Billett bitbucket Bitrise Blackbox -Brex bool boolean +Brex builtins callout CDNs @@ -42,6 +44,7 @@ CI/CD classname cli cloudbuild +Cloudflare Cloudformation cncf Cobertura @@ -49,11 +52,11 @@ codeblocks Codecov codehilite Codehilite -codescene -CodeScene codemod codemods codeowners +codescene +CodeScene composability composable config @@ -75,8 +78,8 @@ Debounce debuggability declaratively deduplicated -deps dependabot +deps destructured destructuring dev @@ -95,9 +98,9 @@ don'ts dynatrace Dynatrace ecco +elasticsearch env Env -elasticsearch esbuild eslint ESModule @@ -117,12 +120,12 @@ Francesco gerrit Gerrit gitbeaker +gitea +Gitea github Gitiles gitlab GitLab -gitea -Gitea Gource Grafana graphql @@ -140,6 +143,7 @@ hotspots http https Iain +Iglesias iLert img incentivised @@ -153,12 +157,12 @@ JaCoCo JavaScript jenkins Jira -JWTs jq js json jsonnet jsx +JWTs Kaewkasi Keyv Knex @@ -268,14 +272,13 @@ rebase Recharts Redash replicasets -statefulsets repo Repo repos rerender rerenders -Reusability reusability +Reusability roadmaps rollbar Rollbar @@ -298,9 +301,9 @@ semver serializable Serverless shoutout -siloed SIG SIGs +siloed Sinon Snyk Sonarqube @@ -313,9 +316,11 @@ Spotify sqlite squidfunk src +statefulsets stdout -stringify +storable stringified +stringify subcomponent subcomponents subfolder @@ -329,10 +334,10 @@ superfences Superfences superset supertype -storable SVGs talkdesk Talkdesk +Tanzu tasklist techdocs Telenor @@ -374,9 +379,11 @@ upvote URIs URLs utils +Valentina validator validators varchar +VMware VPCs VSCode Wayfair @@ -393,7 +400,6 @@ yaml Zalando Zhou zod +Zolotusky zoomable zsh -Alef -Cloudflare diff --git a/ADOPTERS.md b/ADOPTERS.md index cc5db5dea7..da56d592b3 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -215,4 +215,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Ferrovial](https://ferrovial.com) | [Jose Luis Rosado](mailto:jlrosado@ferrovial.com) | Backstage is helping us to improve and acelerate dev experience helping teams to quickly find technical documentation, infrastructure templates, pipelines, software components and quickstarters that have been developed by our squads in a inner source friendly environment. | | [Inter&Co](https://bancointer.com.br) | [Arnaud Lanna](https://github.com/arnaudlanna), [Adriano Silva](https://github.com/adrianovss), [Bruno Grossi](https://github.com/begrossi) | We're using Backstage as our internal Developer Portal to catalog and collect repositories and microservices pieces of information like ownership, deployment time, and documentation. | | [StatusNeo](https://statusneo.com/) | [Karan Nangru](mailto:nangru@statusneo.com), [@NishkarshRaj](https://github.com/NishkarshRaj), and [Gaurav Sarien](mailto:gaurav.sarien@statusneo.com) | Harnessing the power of central catalog inventory and self-serving software templates | -| [Alaska Airlines](https://alaskaair.com) | [@swerdick](https://github.com/swerdick) | Backstage is the developer portal for our 'software delivery platform'. Consolidating developer tools to one place, and providing automation to make it easy for developers to create and deploy applications to Kubernetes | +| [Alaska Airlines](https://alaskaair.com) | [@swerdick](https://github.com/swerdick) | Backstage is the developer portal for our 'software delivery platform'. Consolidating developer tools to one place, and providing automation to make it easy for developers to create and deploy applications to Kubernetes +| [Loft](https://loft.com.br) | [Squad DevTools](mailto:squad_devtools@loft.com.br) | We're using Backstage to give visibility and promote ownership of all our applications, resources and tools. Now moving to use it as a Developer Portal to create applications, AWS resources etc. | diff --git a/README.md b/README.md index 9a3c4cdb5a..8a2bd338d9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![Discord](https://img.shields.io/discord/687207715902193673)](https://discord.gg/EBHEGzX) ![Code style](https://img.shields.io/badge/code_style-prettier-ff69b4.svg) [![Codecov](https://img.shields.io/codecov/c/github/backstage/backstage)](https://codecov.io/gh/backstage/backstage) -[![](https://img.shields.io/npm/v/@backstage/core?label=Version)](https://github.com/backstage/backstage/releases) +[![](https://img.shields.io/github/v/release/backstage/backstage)](https://github.com/backstage/backstage/releases) ## What is Backstage? @@ -52,7 +52,7 @@ Check out [the documentation](https://backstage.io/docs/getting-started) on how - [Code of Conduct](CODE_OF_CONDUCT.md) - This is how we roll - [Adopters](ADOPTERS.md) - Companies already using Backstage - [Blog](https://backstage.io/blog/) - Announcements and updates -- [Newsletter](https://mailchi.mp/spotify/backstage-community) - Subscribe to our email newsletter +- [Newsletter](https://spoti.fi/backstagenewsletter) - Subscribe to our email newsletter - [Backstage Community Sessions](https://github.com/backstage/community) - Join monthly meetups and explore Backstage community - Give us a star โญ๏ธ - If you are using Backstage or think it is an interesting project, we would love a star โค๏ธ diff --git a/contrib/docs/tutorials/authenticate-api-requests.md b/contrib/docs/tutorials/authenticate-api-requests.md index 6c5fabd709..49b6ae0a4d 100644 --- a/contrib/docs/tutorials/authenticate-api-requests.md +++ b/contrib/docs/tutorials/authenticate-api-requests.md @@ -4,19 +4,15 @@ The Backstage backend APIs are by default available without authentication. To a API requests from frontend plugins include an authorization header with a Backstage identity token acquired when the user logs in. By adding a middleware that verifies said token to be valid and signed by Backstage, non-authenticated requests can be blocked with a 401 Unauthorized response. -**NOTE**: Enabling this means that Backstage will stop working for guests, as no token is issued for them. +**NOTE**: Enabling this means that Backstage will stop working for guests, as no token is issued for them. If you have not done so already, you will also need to implement [service-to-service auth](https://backstage.io/docs/auth/service-to-service-auth). As techdocs HTML pages load assets without an Authorization header the code below also sets a token cookie when the user logs in (and when the token is about to expire). Create `packages/backend/src/authMiddleware.ts`: ```typescript -import { SingleHostDiscovery } from '@backstage/backend-common'; import type { Config } from '@backstage/config'; -import { - getBearerTokenFromAuthorizationHeader, - IdentityClient, -} from '@backstage/plugin-auth-node'; +import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; import { NextFunction, Request, Response, RequestHandler } from 'express'; import { decodeJwt } from 'jose'; import { URL } from 'url'; @@ -45,11 +41,6 @@ export const createAuthMiddleware = async ( config: Config, appEnv: PluginEnvironment, ) => { - const discovery = SingleHostDiscovery.fromConfig(config); - const identity = IdentityClient.create({ - discovery, - issuer: await discovery.getExternalBaseUrl('auth'), - }); const baseUrl = config.getString('backend.baseUrl'); const secure = baseUrl.startsWith('https://'); const cookieDomain = new URL(baseUrl).hostname; @@ -61,13 +52,13 @@ export const createAuthMiddleware = async ( try { const token = getBearerTokenFromAuthorizationHeader(req.headers.authorization) || - (req.cookies.token as string | undefined); + (req.cookies?.token as string | undefined); if (!token) { res.status(401).send('Unauthorized'); return; } try { - req.user = await identity.authenticate(token); + req.user = await appEnv.identity.getIdentity({ request: req }); } catch { await appEnv.tokenManager.authenticate(token); } @@ -180,7 +171,12 @@ export async function setTokenCookie(url: string, identityApi: IdentityApi) { ``` ```typescript -// packages/app/src/App.tsx from a create-app deployment +// required types and packages for example below + +import type { IdentityApi } from '@backstage/core-plugin-api'; +import { discoveryApiRef, useApi } from '@backstage/core-plugin-api'; + +// additional packages/app/src/App.tsx from a create-app deployment import { setTokenCookie } from './cookieAuth'; diff --git a/contrib/scaffolder/README.md b/contrib/scaffolder/README.md new file mode 100644 index 0000000000..e22c4b391f --- /dev/null +++ b/contrib/scaffolder/README.md @@ -0,0 +1,15 @@ +# Scaffolder contrib tools + +## Testing Templates with Dry-run + +Scaffolder templates support anything that backstage.io and custom actions can do, so testing them is hard without actually running the instance of Backstage that they're designed for. + +Please leave [feedback on the RFC](https://github.com/backstage/backstage/issues/14280) on your experience with this approach. + +The [command line script](template-testing-dry-run.md) might offer a way for you to do so using the dry-run API used for the Template Editor. Run it against a running instance, either locally or remote, and use it like + +```sh +scaffolder-dry http://localhost:7007/ template-directory values.yml output-directory +``` + +If you're using backend permissions, pass a front-end auth token from a current browser session via `--token $FRONTEND_TOKEN`. diff --git a/contrib/scaffolder/template-testing-dry-run.md b/contrib/scaffolder/template-testing-dry-run.md new file mode 100644 index 0000000000..70e0c572ab --- /dev/null +++ b/contrib/scaffolder/template-testing-dry-run.md @@ -0,0 +1,150 @@ +```js +/* + * Copyright 2022 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. + */ + +/** + * A CLI that helps you test Backstage software templates + * + * @packageDocumentation + */ + +import { dirname, join, relative } from 'node:path'; +import { readFile, writeFile } from 'node:fs/promises'; +import { gzipSync } from 'node:zlib'; +import { ensureDir } from 'fs-extra'; +import { program } from 'commander'; +import fetch from 'node-fetch'; +import ora from 'ora'; +import readdir from 'recursive-readdir'; +import { parse } from 'yaml'; +import { version } from '../../../package.json'; +import type { ScaffolderDryRunResponse } from '@backstage/plugin-scaffolder'; + +const loadDirectoryContents = async (template_path: string) => { + const spinner = ora('Loading template').start(); + const files = await await readdir(template_path, ['.git']); + const contents = await Promise.all( + files.map(async p => { + return { + path: relative(template_path, p), + base64Content: (await readFile(p)).toString('base64'), + }; + }), + ); + spinner.succeed(); + return contents; +}; + +const writeResultContents = async ( + root: string, + directoryContents: ScaffolderDryRunResponse['directoryContents'], +) => { + const directories = new Set( + directoryContents.map(({ path }) => dirname(join(root, path))), + ); + await Promise.all(Array.from(directories).map(d => ensureDir(d))); + await Promise.all( + directoryContents.map(async ({ path, base64Content, executable }) => + writeFile(join(root, path), Buffer.from(base64Content, 'base64'), { + mode: executable ? 0o755 : 0o644, + }), + ), + ); +}; + +const api = async ( + bodyObj: Record, + { baseURL, token }: { baseURL: string; token: string | false }, +) => { + const body = gzipSync(JSON.stringify(bodyObj)); + return fetch(new URL('/api/scaffolder/v2/dry-run', baseURL), { + method: 'POST', + headers: { + Authorization: `Bearer ${token || ''}`, + 'Content-Type': 'application/json', + 'Content-Encoding': 'gzip', + }, + body, + }); +}; + +const handle = async ( + baseURL: string, + template_path: string, + data: string, + target: string, + { token }: { token: string | false }, +) => { + const directoryContents = await loadDirectoryContents(template_path); + const values = parse(await readFile(data, 'utf-8')); + const secrets = {}; + const template = parse( + await readFile(`${template_path}/template.yaml`, 'utf-8'), + ); + const response = await api( + { + directoryContents, + values, + secrets, + template, + }, + { baseURL, token }, + ); + if (!response.ok) { + const contentType = response.headers.get('content-type'); + if (contentType?.startsWith('application/json')) { + const responseData = await response.json(); + if (responseData.error) { + throw responseData.error; + } + if (responseData.errors) { + throw responseData.errors; + } + throw responseData; + } + throw await response.text(); + } + const { log, directoryContents: resultContents } = + (await response.json()) as ScaffolderDryRunResponse; + for (const logEntry of log) { + console.log(logEntry.body.message); + } + await writeResultContents(target, resultContents); +}; + +const main = async (argv: string[]) => { + program + .name('backstage-scaffolder') + .version(version) + .description('Creates a dry-run output of a given template') + .option('-t, --token ', 'JWT to use for auth') + .argument('url', 'URL of your Backstage instance') + .argument('template-path', 'Source directory of template') + .argument('data-path', 'YAML file with input to render') + .argument('target', 'Output directory') + .action(handle); + + await program.parseAsync(argv); + process.exit(); +}; + +process.on('unhandledRejection', rejection => { + console.error(rejection); + process.exit(1); +}); + +main(process.argv); +``` diff --git a/docs/auth/github/provider.md b/docs/auth/github/provider.md index a8c6020cae..353b8ebe08 100644 --- a/docs/auth/github/provider.md +++ b/docs/auth/github/provider.md @@ -24,7 +24,7 @@ Settings for local development: - Application name: Backstage (or your custom app name) - Homepage URL: `http://localhost:3000` -- Authorization callback URL: `http://localhost:7007/api/auth/github` +- Authorization callback URL: `http://localhost:7007/api/auth/github/handler/frame` ## Configuration diff --git a/docs/auth/identity-resolver.md b/docs/auth/identity-resolver.md index d96c9fc45a..a65f3d7899 100644 --- a/docs/auth/identity-resolver.md +++ b/docs/auth/identity-resolver.md @@ -49,7 +49,7 @@ A user identity within Backstage is built up from two pieces of information, a user [entity reference](../features/software-catalog/references.md), and a set of ownership entity references. When a user signs in, a Backstage token is generated with these two pieces of information, -which is then used to identity the user within the Backstage ecosystem. +which is then used to identify the user within the Backstage ecosystem. The user entity reference should uniquely identify the logged in user in Backstage. It is encouraged that a matching user entity also exists within the Software Catalog, diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md index 40f917e2f3..65f97fb8da 100644 --- a/docs/features/software-catalog/external-integrations.md +++ b/docs/features/software-catalog/external-integrations.md @@ -261,6 +261,129 @@ the `connect` call has been made to the provider. Start up the backend - it should now start reading from the previously registered location and you'll see your entities start to appear in Backstage. +### Example User Entity Provider + +If you have a 3rd party entity provider such as an internal HR system that you wish to use you are not limited to using our entity providers, (or simply wish to add to existing entity providers with your own data). + +We can create an entity provider to read entities that are based off that provider. + +We create a basic entity provider as shown above. In the example below we might want to extract our users from an HR system, I am assuming the HR system already has the slackUserId to get that information please see the [Slack Api](https://api.slack.com/methods). + +```typescript +import { + ANNOTATION_LOCATION, + ANNOTATION_ORIGIN_LOCATION, +} from '@backstage/catalog-model' +import { + EntityProvider, + EntityProviderConnection, +} from '@backstage/plugin-catalog-backend' +import { WebClient } from '@slack/web-api' +import {kebabCase} from 'lodash' + +interface Staff { + displayName: string + slackUserId: string + jobTitle: string + photoUrl: string + address: string + email:string +} + +export class UserEntityProvider implements EntityProvider { + private readonly getStaffUrl: string + protected readonly slackTeam: string + protected readonly slackToken: string + protected connection?: EntityProviderConnection + + static fromConfig(config: Config, options: { logger: Logger }) { + const getStaffUrl = config.getString('staff.url') + const slackToken = config.getString('slack.token') + const slackTeam = config.getString('slack.team') + return new UserEntityProvider({ + ...options, + getStaffUrl, + slackToken, + slackTeam, + }) + } + + private constructor(options: { + getStaffUrl: string + slackToken: string + slackTeam: string + }) { + this.getStaffUrl = options.getStaffUrl + this.slackToken = options.slackToken + this.slackTeam = options.slackTeam + } + + async getAllStaff(): Promise{ + await return axios.get(this.getStaffUrl) + } + + public async connect(connection: EntityProviderConnection): Promise { + this.connection = connection + } + + async run(): Promise { + if (!this.connection) { + throw new Error('User Connection Not initialized') + } + + const userResources: UserEntity[] = [] + const staff = await this.getAllStaff() + + for (const user of staff) { + // we can add any links here in this case it would be adding a slack link to the users so you can directly slack them. + const links = + user.slackUserId != null && user.slackUserId.length > 0 + ? [ + { + url: `slack://user?team=${this.slackTeam}&id=${user.slackUserId}`, + title: 'Slack', + icon: 'message', + }, + ] + : undefined + const userEntity: UserEntity = { + kind: 'User', + apiVersion: 'backstage.io/v1alpha1', + metadata: { + annotations: { + [ANNOTATION_LOCATION]: 'hr-user-https://www.hrurl.com/', + [ANNOTATION_ORIGIN_LOCATION]: 'hr-user-https://www.hrurl.com/', + }, + links, + // name of the entity + name: kebabCase(user.displayName), + // name for display purposes could be anything including email + title: user.displayName, + }, + spec: { + profile: { + displayName: user.displayName, + email: user.email, + picture: user.photoUrl, + }, + memberOf: [], + }, + } + + userResources.push(userEntity) + } + + await this.connection.applyMutation({ + type: 'full', + entities: userResources.map((entity) => ({ + entity, + locationKey: 'hr-user-https://www.hrurl.com/', + })), + }) +} + +``` + ## Custom Processors The other possible way of ingesting data into the catalog is through the use of diff --git a/docs/overview/architecture-overview.md b/docs/overview/architecture-overview.md index 3c9417268b..45f3190a5d 100644 --- a/docs/overview/architecture-overview.md +++ b/docs/overview/architecture-overview.md @@ -249,7 +249,7 @@ however likely to change in the future. The common packages are the packages effectively depended on by all other pages. This is a much smaller set of packages but they are also very pervasive. Because the common packages are isomorphic and must execute both in the frontend and -backend, they are never allowed to depend on any of the frontend of backend +backend, they are never allowed to depend on any of the frontend or backend packages. The Backstage CLI is in a category of its own and is depended on by virtually diff --git a/docs/releases/v1.8.0-next.1-changelog.md b/docs/releases/v1.8.0-next.1-changelog.md new file mode 100644 index 0000000000..1f65dfdc9c --- /dev/null +++ b/docs/releases/v1.8.0-next.1-changelog.md @@ -0,0 +1,106 @@ +# Release v1.8.0-next.1 + +## @backstage/plugin-scaffolder-backend@1.8.0-next.1 + +### Minor Changes + +- 5921b5ce49: - The GitLab Project ID for the `publish:gitlab:merge-request` action is now passed through the query parameter `project` in the `repoUrl`. It still allows people to not use the `projectid` and use the `repoUrl` with the `owner` and `repo` query parameters instead. This makes it easier to publish to repositories instead of writing the full path to the project. + +## @backstage/create-app@0.4.33-next.1 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/plugin-azure-devops-backend@0.3.17-next.1 + +### Patch Changes + +- 62f284e394: - Adjusted the asset parser to accept case sensitive + - Fixed fetching data that was using the deprecated function + +## @backstage/plugin-playlist@0.1.2-next.1 + +### Patch Changes + +- 605f269f0d: Updated Playlist plugin docs: + + - Updated `playlist` plugin README to include note about installing backend plugin and added images for the various features + - Updated `playlist-backend` plugin README to remove `IdentityClient` import in example as it is not used and made minor change to headings + +## @backstage/plugin-playlist-backend@0.2.1-next.1 + +### Patch Changes + +- 605f269f0d: Updated Playlist plugin docs: + + - Updated `playlist` plugin README to include note about installing backend plugin and added images for the various features + - Updated `playlist-backend` plugin README to remove `IdentityClient` import in example as it is not used and made minor change to headings + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + +## @backstage/plugin-techdocs@1.4.0-next.1 + +### Patch Changes + +- 9e4d8e6198: Fix logic bug that broke techdocs-cli-embedded-app + +## @backstage/plugin-techdocs-addons-test-utils@1.0.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.0-next.1 + +## example-app@0.2.77-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.0-next.1 + - @backstage/plugin-playlist@0.1.2-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.6-next.0 + +## example-backend@0.2.77-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + - @backstage/plugin-playlist-backend@0.2.1-next.1 + - @backstage/plugin-azure-devops-backend@0.3.17-next.1 + - example-app@0.2.77-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.1 + +## example-backend-next@0.0.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + +## techdocs-cli-embedded-app@0.2.76-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.0-next.1 diff --git a/microsite/blog/2022-10-28-backstagecon-kubecon-2022.md b/microsite/blog/2022-10-28-backstagecon-kubecon-2022.md new file mode 100644 index 0000000000..ffc44ed432 --- /dev/null +++ b/microsite/blog/2022-10-28-backstagecon-kubecon-2022.md @@ -0,0 +1,36 @@ +--- +title: 'ICYMI: BackstageCon & KubeCon NA 2022 Recap' +description: 'We had a great time in Detroit! Learn more about our first dedicated conference to Backstage and KubeCon NA 2022.' +author: Emma White, Spotify +authorURL: https://www.linkedin.com/in/emmamckeewhite/ +--- + +## ICYMI: BackstageCon & KubeCon NA 2022 Recap + +![blog header image](assets/2022-10-28/preview.png) + +What an action-packed and memorable week for the Backstage community meeting up IRL at KubeCon North America 2022 in (unseasonably warm and sunny) Detroit. Letโ€™s see what the community was up to: + +### BackstageCon: A full day of nothing but Backstage + +![BackstageCon group](assets/2022-10-28/groupimage.jpg) + +We started the week off strong, packing a ballroom for [BackstageCon](https://events.linuxfoundation.org/backstagecon-north-america/) on Monday. It was a smorgasbord of some of our active community members at the first official Backstage conference โ€” as well as some new faces interested in learning more about Backstage! To welcome us, Roadieโ€™s [Martina Iglesias Fernandez](https://github.com/martina-if) and Spotifyโ€™s [Suzanne Daniels](https://github.com/suuus) took center stage. Next up, we listened to three keynotes from the eventโ€™s top sponsors: Roadieโ€™s [David Tuite](https://github.com/dtuite) enlightened us on how to 10x developer effectiveness for teams, [Dave Zolotusky](https://github.com/dzolotusky) from Spotify discussed developer happiness and [announced](https://www.linkedin.com/posts/spotify-r%26d_backstage-devex-activity-6990305201710587904-SnDQ?utm_source=share&utm_medium=member_desktop) that [Spotify Plugins for Backstage](https://backstage.spotify.com/blog/spotify-plugins-for-backstage/) are launching soon, and [Valentina Alaria](https://www.linkedin.com/in/valentinaalaria/) from VMware Tanzu talked about how to curate the Backstage experience to enable developer velocity. In between some creative snacks (lemon blueberry popcorn, anyone?) and coffee breaks, we heard from adopters including [Telus](https://backstage.spotify.com/blog/building-for-simplicity-TELUS/), [DAZN](https://backstage.spotify.com/blog/adopter-spotlight/dazn/), HP, US Bank, and more on lessons learned through their adoption journeys, we talked about different ways to leverage data within Backstage, and we discussed new ways to customize Backstage for specific adopter needs. + +You can watch all the BackstageCon sessions, talks, and keynotes [here](https://www.youtube.com/playlist?list=PLj6h78yzYM2OKySsTuiip3BqmdYZQRnSf)! + +### Project Meeting: Building a better Backstage together + +![project meeting image](assets/2022-10-28/real_project_meeting.jpeg) + +The following day, the Backstage maintainers hosted a lively project meeting, where we engaged with a lot of folks that had been at BackstageCon the day before. Over the course of the meeting, the Backstage community talked through recommended approaches for maintaining your Software Catalog as a source of truth, sourcing internal contributors for organizationโ€™s Backstage apps, improving frontend performance in a few plugins, how Backstage maintainers work, and appreciation for the contributions from our community. You can read more detailed notes from the project meeting in the repo [here](https://github.com/backstage/community/blob/main/project-meetings/kubecon-na-2022.md). + +### KubeCon: Demos, swag, and standing-room only + +And last but not least: three days of [KubeCon North America](https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/)! At KubeCon, the Backstage team met and greeted so many new faces at our kiosk in the Project Pavilion. We ran demos, answered questions, and handed out lots and lots of SWAG! + +![maintainer presentation](assets/2022-10-28/project_meeting.jpg) + +Spotifyโ€™s [Francesco Corti](https://github.com/fcorti) and core maintainer [Ben Lambert](https://github.com/benjdlambert) took the stage on Wednesday to present the Backstage maintainer talk to a PACKED audience. They discussed how core features of Backstage are changing the way end-user developers interact and manage their ecosystem, and encouraged folks to create the future of developer experience with the rest of the Backstage community. If you missed it, no worries! Their talk track will be posted on the [CNCF YouTube channel](https://www.youtube.com/c/cloudnativefdn). + +โ€ฆand thatโ€™s a wrap! What an incredible week. Our growing Backstage community continues to amaze us with its dedication and enthusiasm. We canโ€™t wait to see you all again at KubeCon Europe in The Netherlands! In fact, weโ€™d love to see our adopters give Backstage talks next year (hint, hint). The KubeCon Europe [CFP is open](https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/program/cfp/#overview) until Friday, November 18, 2022. diff --git a/microsite/blog/assets/2022-10-28/groupimage.jpg b/microsite/blog/assets/2022-10-28/groupimage.jpg new file mode 100644 index 0000000000..ef12667e0a Binary files /dev/null and b/microsite/blog/assets/2022-10-28/groupimage.jpg differ diff --git a/microsite/blog/assets/2022-10-28/preview.png b/microsite/blog/assets/2022-10-28/preview.png new file mode 100644 index 0000000000..67774e7744 Binary files /dev/null and b/microsite/blog/assets/2022-10-28/preview.png differ diff --git a/microsite/blog/assets/2022-10-28/project_meeting.jpg b/microsite/blog/assets/2022-10-28/project_meeting.jpg new file mode 100644 index 0000000000..8e3bc91ddf Binary files /dev/null and b/microsite/blog/assets/2022-10-28/project_meeting.jpg differ diff --git a/microsite/blog/assets/2022-10-28/real_project_meeting.jpeg b/microsite/blog/assets/2022-10-28/real_project_meeting.jpeg new file mode 100644 index 0000000000..f1e0ff40bf Binary files /dev/null and b/microsite/blog/assets/2022-10-28/real_project_meeting.jpeg differ diff --git a/microsite/pages/en/community.js b/microsite/pages/en/community.js index 2e7801d581..0580ec045a 100644 --- a/microsite/pages/en/community.js +++ b/microsite/pages/en/community.js @@ -103,64 +103,79 @@ const Background = props => { Stay tuned to the latest developments + - - - Community sessions - - Maintainers and adopters meet monthly to share updates, demos, - and ideas. Yep, all sessions are recorded! - + + + + Community sessions + + Maintainers and adopters meet monthly to share updates, demos, + and ideas. Yep, all sessions are recorded! + + Join a session - - - Newsletter - - The official monthly Backstage newsletter. Don't miss the latest - news from your favorite project! - + + + + + Newsletter + + The official monthly Backstage newsletter. Don't miss the + latest news from your favorite project! + + Subscribe - - - Contributor Spotlight - - A recognition for valuable community work. Nominate contributing - members for their efforts! We'll put them in the spotlight โค๏ธ - + + + + + Contributor Spotlight + + A recognition for valuable community work. Nominate + contributing members for their efforts! We'll put them in the + spotlight โค๏ธ + + Nominate now + Community initiatives - - Open Mic Meetup - - A casual get together of Backstage users sharing their experiences - and helping each other. Hosted by{' '} - Roadie.io and{' '} - Frontside Software. - + + + Open Mic Meetup + + A casual get together of Backstage users sharing their + experiences and helping each other. Hosted by{' '} + Roadie.io and{' '} + Frontside Software. + + Learn more - - Backstage Weekly Newsletter - - A weekly newsletter with news, updates and things community from - your friends at Roadie.io. - + + + Backstage Weekly Newsletter + + A weekly newsletter with news, updates and things community from + your friends at Roadie.io. + + Learn more diff --git a/package.json b/package.json index 168f24787d..9f17e5ee36 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@types/react": "^17", "@types/react-dom": "^17" }, - "version": "1.8.0-next.0", + "version": "1.8.0-next.1", "dependencies": { "@backstage/errors": "workspace:^", "@manypkg/get-packages": "^1.1.3", diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index d909773ff4..b713987116 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,14 @@ # example-app +## 0.2.77-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.0-next.1 + - @backstage/plugin-playlist@0.1.2-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.6-next.0 + ## 0.2.77-next.0 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 9388f305f6..3f93c523a3 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "example-app", - "version": "0.2.77-next.0", + "version": "0.2.77-next.1", "private": true, "backstage": { "role": "frontend" diff --git a/packages/backend-next/CHANGELOG.md b/packages/backend-next/CHANGELOG.md index 60d4a9567c..6c66580e6f 100644 --- a/packages/backend-next/CHANGELOG.md +++ b/packages/backend-next/CHANGELOG.md @@ -1,5 +1,12 @@ # example-backend-next +## 0.0.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + ## 0.0.5-next.0 ### Patch Changes diff --git a/packages/backend-next/package.json b/packages/backend-next/package.json index 003ae5d791..cc689aa1a8 100644 --- a/packages/backend-next/package.json +++ b/packages/backend-next/package.json @@ -1,6 +1,6 @@ { "name": "example-backend-next", - "version": "0.0.5-next.0", + "version": "0.0.5-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 098c836bd5..bc8087bcc1 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,16 @@ # example-backend +## 0.2.77-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + - @backstage/plugin-playlist-backend@0.2.1-next.1 + - @backstage/plugin-azure-devops-backend@0.3.17-next.1 + - example-app@0.2.77-next.1 + - @backstage/plugin-scaffolder-backend-module-rails@0.4.6-next.1 + ## 0.2.77-next.0 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 0852985d82..d9500db73d 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.77-next.0", + "version": "0.2.77-next.1", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index d8d97e178c..702f3d4d4e 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/create-app +## 0.4.33-next.1 + +### Patch Changes + +- Bumped create-app version. + ## 0.4.33-next.0 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index a2a168b263..932d54ee03 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.33-next.0", + "version": "0.4.33-next.1", "publishConfig": { "access": "public" }, diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index fc7dbe743b..35515eb5d2 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,12 @@ # techdocs-cli-embedded-app +## 0.2.76-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.0-next.1 + ## 0.2.76-next.0 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index c34c52e3f2..740889a661 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.76-next.0", + "version": "0.2.76-next.1", "private": true, "backstage": { "role": "frontend" diff --git a/plugins/auth-backend/README.md b/plugins/auth-backend/README.md index d13a5e5a20..ba0042c6f9 100644 --- a/plugins/auth-backend/README.md +++ b/plugins/auth-backend/README.md @@ -34,8 +34,8 @@ Follow this link, [Create new OAuth App](https://github.com/settings/application 1. Set Application Name to `backstage-dev` or something along those lines. 1. You can set the Homepage URL to whatever you want to. 1. The Authorization Callback URL should match the redirect URI set in Backstage. - 1. Set this to `http://localhost:7007/api/auth/github` for local development. - 1. Set this to `http://{APP_FQDN}:{APP_BACKEND_PORT}/api/auth/github` for non-local deployments. + 1. Set this to `http://localhost:7007/api/auth/github/handler/frame` for local development. + 1. Set this to `http://{APP_FQDN}:{APP_BACKEND_PORT}/api/auth/github/handler/frame` for non-local deployments. ```bash export AUTH_GITHUB_CLIENT_ID=x diff --git a/plugins/auth-backend/src/service/router.ts b/plugins/auth-backend/src/service/router.ts index 8fd758f1b4..7240ba1bcb 100644 --- a/plugins/auth-backend/src/service/router.ts +++ b/plugins/auth-backend/src/service/router.ts @@ -114,7 +114,7 @@ export async function createRouter( allProviderFactories, )) { if (configuredProviders.includes(providerId)) { - logger.info(`Configuring provider, ${providerId}`); + logger.info(`Configuring auth provider: ${providerId}`); try { const provider = providerFactory({ providerId, diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index dfaffa8e35..ae57ae23a9 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-azure-devops-backend +## 0.3.17-next.1 + +### Patch Changes + +- 62f284e394: - Adjusted the asset parser to accept case sensitive + - Fixed fetching data that was using the deprecated function + ## 0.3.17-next.0 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index 940b24ed44..50a99dbc2a 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.3.17-next.0", + "version": "0.3.17-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 2bf2988a98..24c13020b6 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -408,14 +408,15 @@ export class AzureDevOpsApi { content: string; }> { const url = buildEncodedUrl(host, org, project, repo, 'README.md'); - const response = await this.urlReader.read(url); + const response = await this.urlReader.readUrl(url); + const buffer = await response.buffer(); const content = await replaceReadme( this.urlReader, host, org, project, repo, - response.toString(), + buffer.toString(), ); return { url, content }; } diff --git a/plugins/azure-devops-backend/src/utils/azure-devops-utils.test.ts b/plugins/azure-devops-backend/src/utils/azure-devops-utils.test.ts index f044a20968..74932c9653 100644 --- a/plugins/azure-devops-backend/src/utils/azure-devops-utils.test.ts +++ b/plugins/azure-devops-backend/src/utils/azure-devops-utils.test.ts @@ -167,30 +167,30 @@ describe('extractAssets', () => { it('should return assets', () => { const readme = ` ## Images - ![Image 1](./images/sample-4(2).png) + ![Image 1](./images/sample-4(2).PNG) ![Image 2](./images/cdCSj+-012340.jpg) ![Image 3](/images/test-4(2)))).jpeg) ![Image 4](./images/test-2211jd.webp) - ![Image 5](/images/sa)mple.gif) + ![Image 5](/images/sa)mple.GIf) `; const result = extractAssets(readme); expect(result).toEqual([ - '[Image 1](./images/sample-4(2).png)', + '[Image 1](./images/sample-4(2).PNG)', '[Image 2](./images/cdCSj+-012340.jpg)', '[Image 3](/images/test-4(2)))).jpeg)', '[Image 4](./images/test-2211jd.webp)', - '[Image 5](/images/sa)mple.gif)', + '[Image 5](/images/sa)mple.GIf)', ]); }); }); describe('extractPartsFromAsset', () => { it('should return parts from asset - PNG', () => { - const result = extractPartsFromAsset('[Image 1](./images/sample-4(2).png)'); + const result = extractPartsFromAsset('[Image 1](./images/sample-4(2).PNG)'); expect(result).toEqual({ label: 'Image 1', path: '/images/sample-4(2)', - ext: '.png', + ext: '.PNG', }); }); @@ -207,12 +207,12 @@ describe('extractPartsFromAsset', () => { it('should return parts from asset - JPEG', () => { const result = extractPartsFromAsset( - '[Image 2](/images/test-4(2)))).jpeg)', + '[Image 2](/images/test-4(2)))).JpEg)', ); expect(result).toEqual({ label: 'Image 2', path: '/images/test-4(2))))', - ext: '.jpeg', + ext: '.JpEg', }); }); @@ -247,10 +247,15 @@ describe('replaceReadme', () => { `; const reader: UrlReader = { - read: url => new Promise(resolve => resolve(Buffer.from(url))), + readUrl: url => + Promise.resolve({ + buffer: async () => Buffer.from(url), + etag: 'buffer', + stream: jest.fn(), + }), readTree: jest.fn(), search: jest.fn(), - readUrl: jest.fn(), + read: jest.fn(), }; const result = await replaceReadme( diff --git a/plugins/azure-devops-backend/src/utils/azure-devops-utils.ts b/plugins/azure-devops-backend/src/utils/azure-devops-utils.ts index 191486a925..0aafb54a0a 100644 --- a/plugins/azure-devops-backend/src/utils/azure-devops-utils.ts +++ b/plugins/azure-devops-backend/src/utils/azure-devops-utils.ts @@ -223,8 +223,9 @@ export async function replaceReadme( const { label, path, ext } = extractPartsFromAsset(filePath); const data = mime.lookup(ext); const url = buildEncodedUrl(host, org, project, repo, path + ext); - const buffer = await urlReader.read(url); - const file = await buffer.toString('base64'); + const response = await urlReader.readUrl(url); + const buffer = await response.buffer(); + const file = buffer.toString('base64'); return content.replace( filePath, `[${label}](data:${data};base64,${file})`, @@ -320,7 +321,7 @@ export function extractPartsFromAsset(content: string): { ext: string; } { const regExp = - /\[(.*?)\]\((?!https?:\/\/)(.*?)(\.png|\.jpg|\.jpeg|\.gif|\.webp)(.*)\)/; + /\[(.*?)\]\((?!https?:\/\/)(.*?)(\.png|\.jpg|\.jpeg|\.gif|\.webp)(.*)\)/i; const [_, label, path, ext] = regExp.exec(content) || []; return { ext, diff --git a/plugins/github-actions/README.md b/plugins/github-actions/README.md index 792d13280f..cb6867193c 100644 --- a/plugins/github-actions/README.md +++ b/plugins/github-actions/README.md @@ -11,7 +11,7 @@ TBD ### Generic Requirements 1. Provide OAuth credentials: - 1. [Create an OAuth App](https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/) in the GitHub organization with the callback URL set to `http://localhost:7007/api/auth/github`. + 1. [Create an OAuth App](https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/) in the GitHub organization with the callback URL set to `http://localhost:7007/api/auth/github/handler/frame`. 2. Take the Client ID and Client Secret from the newly created app's settings page and put them into `AUTH_GITHUB_CLIENT_ID` and `AUTH_GITHUB_CLIENT_SECRET` environment variables. 2. Annotate your component with a correct GitHub Actions repository and owner: diff --git a/plugins/github-actions/src/components/Cards/RecentWorkflowRunsCard.tsx b/plugins/github-actions/src/components/Cards/RecentWorkflowRunsCard.tsx index 89fd40da33..59d64af9c9 100644 --- a/plugins/github-actions/src/components/Cards/RecentWorkflowRunsCard.tsx +++ b/plugins/github-actions/src/components/Cards/RecentWorkflowRunsCard.tsx @@ -29,6 +29,7 @@ import { useRouteRef, } from '@backstage/core-plugin-api'; import { + ErrorPanel, InfoCard, InfoCardVariants, Link, @@ -76,6 +77,11 @@ export const RecentWorkflowRunsCard = (props: { const githubHost = hostname || 'github.com'; const routeLink = useRouteRef(buildRouteRef); + + if (error) { + return ; + } + return ( ( + + + + + + + +); diff --git a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx index dfdb566b20..3a6b7c238d 100644 --- a/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx +++ b/plugins/org/src/components/Cards/Group/GroupProfile/GroupProfileCard.tsx @@ -52,6 +52,7 @@ import { Link, } from '@backstage/core-components'; import { alertApiRef, useApi } from '@backstage/core-plugin-api'; +import { LinksGroup } from '../../Meta'; const CardTitle = (props: { title: string }) => ( @@ -76,7 +77,7 @@ export const GroupProfileCard = (props: { variant?: InfoCardVariants }) => { } const { - metadata: { name, description, annotations }, + metadata: { name, description, annotations, links }, spec: { profile }, } = group; @@ -190,6 +191,7 @@ export const GroupProfileCard = (props: { variant?: InfoCardVariants }) => { secondary="Child Groups" /> + diff --git a/plugins/org/src/components/Cards/Meta/LinksGroup.tsx b/plugins/org/src/components/Cards/Meta/LinksGroup.tsx new file mode 100644 index 0000000000..eeade18411 --- /dev/null +++ b/plugins/org/src/components/Cards/Meta/LinksGroup.tsx @@ -0,0 +1,66 @@ +/* + * Copyright 2022 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 { EntityLink } from '@backstage/catalog-model'; +import { IconComponent, useApp } from '@backstage/core-plugin-api'; +import LanguageIcon from '@material-ui/icons/Language'; +import { + ListItem, + ListItemIcon, + ListItemText, + Divider, +} from '@material-ui/core'; +import React from 'react'; + +const WebLink = ({ + href, + Icon, + text, +}: { + href: string; + text?: string; + Icon?: IconComponent; +}) => ( + + {Icon ? : } + {text} + +); + +export const LinksGroup = ({ links }: { links?: EntityLink[] }) => { + const app = useApp(); + const iconResolver = (key?: string): IconComponent => + key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon; + + if (links === undefined) { + return null; + } + + return ( + <> + + {links.map(link => { + return ( + + ); + })} + + ); +}; diff --git a/plugins/org/src/components/Cards/Meta/index.ts b/plugins/org/src/components/Cards/Meta/index.ts new file mode 100644 index 0000000000..076af49bf9 --- /dev/null +++ b/plugins/org/src/components/Cards/Meta/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 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 * from './LinksGroup'; 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 eb7b8fadda..a27be7857b 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.stories.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.stories.tsx @@ -102,3 +102,43 @@ export default { }), ], }; + +const extraDetailsEntity: UserEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name: 'guest', + description: 'Description for guest', + links: [ + { + url: 'slack://user?team=T00000000&id=U00000000', + title: 'Slack', + icon: 'chat', + }, + { + url: 'https://www.google.com', + title: 'Google', + }, + ], + }, + spec: { + profile: { + displayName: 'Guest User', + email: 'guest@example.com', + picture: + 'https://avatars.dicebear.com/api/avataaars/guest@example.com.svg?background=%23fff', + }, + memberOf: ['team-a'], + }, + relations: [dummyGroup], +}; + +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 f339a5828c..fb0df3d25f 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.test.tsx @@ -155,4 +155,58 @@ describe('Edit Button', () => { ); expect(rendered.getByRole('button')).toBeInTheDocument(); }); + + it('Should show the extra fields if either links or extra profile are filled', async () => { + const annotations: Record = { + 'backstage.io/edit-url': 'https://example.com/user.yaml', + }; + const userEntity: UserEntity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'User', + metadata: { + name: 'calum.leavy', + description: 'Super awesome human', + annotations, + links: [ + { + url: 'slack://user?team=T00000000&id=U00000000', + title: 'Slack', + icon: 'message', + }, + { + url: 'https://www.google.com', + title: 'Google', + }, + ], + }, + spec: { + profile: { + displayName: 'Calum Leavy', + email: 'calum-leavy@example.com', + }, + memberOf: ['ExampleGroup'], + }, + relations: [ + { + type: 'memberOf', + targetRef: 'group:default/examplegroup', + }, + ], + }; + + const rendered = await renderWithEffects( + wrapInTestApp( + + + , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }, + ), + ); + expect(rendered.getByText('Slack')).toBeInTheDocument(); + expect(rendered.getByText('Google')).toBeInTheDocument(); + }); }); diff --git a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx index dd75578687..a35c1c057b 100644 --- a/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx +++ b/plugins/org/src/components/Cards/User/UserProfileCard/UserProfileCard.tsx @@ -46,6 +46,7 @@ import { InfoCardVariants, Link, } from '@backstage/core-components'; +import { LinksGroup } from '../../Meta'; const CardTitle = (props: { title?: string }) => props.title ? ( @@ -66,7 +67,7 @@ export const UserProfileCard = (props: { variant?: InfoCardVariants }) => { user.metadata.annotations?.[ANNOTATION_EDIT_URL]; const { - metadata: { name: metaName, description }, + metadata: { name: metaName, description, links }, spec: { profile }, } = user; const displayName = profile?.displayName ?? metaName; @@ -128,6 +129,8 @@ export const UserProfileCard = (props: { variant?: InfoCardVariants }) => { /> + + diff --git a/plugins/playlist-backend/CHANGELOG.md b/plugins/playlist-backend/CHANGELOG.md index afb6a2867f..9798c12013 100644 --- a/plugins/playlist-backend/CHANGELOG.md +++ b/plugins/playlist-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-playlist-backend +## 0.2.1-next.1 + +### Patch Changes + +- 605f269f0d: Updated Playlist plugin docs: + + - Updated `playlist` plugin README to include note about installing backend plugin and added images for the various features + - Updated `playlist-backend` plugin README to remove `IdentityClient` import in example as it is not used and made minor change to headings + ## 0.2.1-next.0 ### Patch Changes diff --git a/plugins/playlist-backend/README.md b/plugins/playlist-backend/README.md index 14a39ca741..c0055ebdf7 100644 --- a/plugins/playlist-backend/README.md +++ b/plugins/playlist-backend/README.md @@ -2,21 +2,20 @@ Welcome to the playlist backend plugin! -# Installation +## Installation -## Install the package +### Install the package ```bash # From your Backstage root directory yarn add --cwd packages/backend @backstage/plugin-playlist-backend ``` -## Adding the plugin to your `packages/backend` +### Adding the plugin to your `packages/backend` You'll need to add the plugin to the router in your `backend` package. You can do this by creating a file called `packages/backend/src/plugins/playlist.ts` ```tsx -import { IdentityClient } from '@backstage/plugin-auth-node'; import { createRouter } from '@backstage/plugin-playlist-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; diff --git a/plugins/playlist-backend/package.json b/plugins/playlist-backend/package.json index 6bb557d8a3..8548a3e4b8 100644 --- a/plugins/playlist-backend/package.json +++ b/plugins/playlist-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist-backend", - "version": "0.2.1-next.0", + "version": "0.2.1-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/playlist/CHANGELOG.md b/plugins/playlist/CHANGELOG.md index b064b2e5b6..d7135e79a0 100644 --- a/plugins/playlist/CHANGELOG.md +++ b/plugins/playlist/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-playlist +## 0.1.2-next.1 + +### Patch Changes + +- 605f269f0d: Updated Playlist plugin docs: + + - Updated `playlist` plugin README to include note about installing backend plugin and added images for the various features + - Updated `playlist-backend` plugin README to remove `IdentityClient` import in example as it is not used and made minor change to headings + ## 0.1.2-next.0 ### Patch Changes diff --git a/plugins/playlist/README.md b/plugins/playlist/README.md index 7c814d302b..6ae3fb84ac 100644 --- a/plugins/playlist/README.md +++ b/plugins/playlist/README.md @@ -6,6 +6,14 @@ This plugin allows you to create, share, and follow custom collections of entiti ## Setup +The following sections will help you get the Playlist plugin setup and running + +### Backend + +You need to setup the [Playlist backend plugin](https://github.com/backstage/backstage/tree/master/plugins/playlist-backend) before you move forward with any of these steps if you haven't already + +### Installation + Install this plugin: ```bash @@ -123,6 +131,28 @@ const defaultEntityPage = ( Note: the above only shows an example for the `defaultEntityPage` for a full example of this you can look at [this EntityPage](../../packages/app/src/components/catalog/EntityPage.tsx) +## Features + +### View All Playlists + +![View all playlists example](./docs/playlist-view-all.png) + +### View Playlist + +![View Playlist example](./docs/playlist-view-single.png) + +### Create New Playlist + +![Create New Playlist example](./docs/playlist-create-new.png) + +### Add Entities to Playlist + +![Add Entities to Playlist example](./docs/playlist-add-entities.png) + +### Add to Playlist from Entity + +![Add to Playlist from Entity example](./docs/playlist-add-from-entity.png) + ## Links - [playlist-backend](../playlist-backend) provides the backend API for this frontend. diff --git a/plugins/playlist/docs/playlist-add-entities.png b/plugins/playlist/docs/playlist-add-entities.png new file mode 100644 index 0000000000..a53de49880 Binary files /dev/null and b/plugins/playlist/docs/playlist-add-entities.png differ diff --git a/plugins/playlist/docs/playlist-add-from-entity.png b/plugins/playlist/docs/playlist-add-from-entity.png new file mode 100644 index 0000000000..d41135064a Binary files /dev/null and b/plugins/playlist/docs/playlist-add-from-entity.png differ diff --git a/plugins/playlist/docs/playlist-create-new.png b/plugins/playlist/docs/playlist-create-new.png new file mode 100644 index 0000000000..cc369e26fa Binary files /dev/null and b/plugins/playlist/docs/playlist-create-new.png differ diff --git a/plugins/playlist/docs/playlist-view-all.png b/plugins/playlist/docs/playlist-view-all.png new file mode 100644 index 0000000000..1b65eb1af2 Binary files /dev/null and b/plugins/playlist/docs/playlist-view-all.png differ diff --git a/plugins/playlist/docs/playlist-view-single.png b/plugins/playlist/docs/playlist-view-single.png new file mode 100644 index 0000000000..0890c5013b Binary files /dev/null and b/plugins/playlist/docs/playlist-view-single.png differ diff --git a/plugins/playlist/package.json b/plugins/playlist/package.json index df620fc97a..e8fc47a2a9 100644 --- a/plugins/playlist/package.json +++ b/plugins/playlist/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-playlist", - "version": "0.1.2-next.0", + "version": "0.1.2-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -12,6 +12,11 @@ "backstage": { "role": "frontend-plugin" }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/playlist" + }, "scripts": { "start": "backstage-cli package start", "build": "backstage-cli package build", diff --git a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md index 1a73a7fc41..37d00c6885 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-cookiecutter/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-scaffolder-backend-module-cookiecutter +## 0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + ## 0.2.13-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index a42bfdcf60..939e2801da 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-cookiecutter", "description": "A module for the scaffolder backend that lets you template projects using cookiecutter", - "version": "0.2.13-next.0", + "version": "0.2.13-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-rails/CHANGELOG.md b/plugins/scaffolder-backend-module-rails/CHANGELOG.md index 388ad285f1..65f0b6cc49 100644 --- a/plugins/scaffolder-backend-module-rails/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-rails/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-scaffolder-backend-module-rails +## 0.4.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + ## 0.4.6-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-rails/package.json b/plugins/scaffolder-backend-module-rails/package.json index 6a08271e80..8f39024301 100644 --- a/plugins/scaffolder-backend-module-rails/package.json +++ b/plugins/scaffolder-backend-module-rails/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend-module-rails", "description": "A module for the scaffolder backend that lets you template projects using Rails", - "version": "0.4.6-next.0", + "version": "0.4.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md index 52654ecc2a..56cc580bbd 100644 --- a/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md +++ b/plugins/scaffolder-backend-module-yeoman/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-scaffolder-backend-module-yeoman +## 0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-backend@1.8.0-next.1 + ## 0.2.11-next.0 ### Patch Changes diff --git a/plugins/scaffolder-backend-module-yeoman/package.json b/plugins/scaffolder-backend-module-yeoman/package.json index d617fec38e..cf7a13a7a4 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.2.11-next.0", + "version": "0.2.11-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index caf413992b..0a86b5e9bb 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-scaffolder-backend +## 1.8.0-next.1 + +### Minor Changes + +- 5921b5ce49: - The GitLab Project ID for the `publish:gitlab:merge-request` action is now passed through the query parameter `project` in the `repoUrl`. It still allows people to not use the `projectid` and use the `repoUrl` with the `owner` and `repo` query parameters instead. This makes it easier to publish to repositories instead of writing the full path to the project. + ## 1.8.0-next.0 ### Minor Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 37565a8d7a..a52adf1cf7 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "1.8.0-next.0", + "version": "1.8.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts index 64761f0871..2a71c9f748 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/gitlabMergeRequest.ts @@ -42,7 +42,7 @@ export const createPublishGitlabMergeRequestAction = (options: { targetPath?: string; token?: string; commitAction?: 'create' | 'delete' | 'update'; - /** @deprecated Use projectPath instead */ + /** @deprecated projectID passed as query parameters in the repoUrl */ projectid?: string; removeSourceBranch?: boolean; assignee?: string; @@ -58,7 +58,7 @@ export const createPublishGitlabMergeRequestAction = (options: { title: 'Repository Location', description: `Accepts the format 'gitlab.com/group_name/project_name' where 'project_name' is the repository name and 'group_name' is a group or username`, }, - /** @deprecated Use projectPath instead */ + /** @deprecated projectID is passed as query parameters in the repoUrl */ projectid: { type: 'string', title: 'projectid', @@ -146,14 +146,12 @@ export const createPublishGitlabMergeRequestAction = (options: { title, token: providedToken, } = ctx.input; - const { host, owner, repo } = parseRepoUrl(repoUrl, integrations); - const projectPath = `${owner}/${repo}`; - if (ctx.input.projectid) { - const deprecationWarning = `Property "projectid" is deprecated and no longer to needed to create a MR`; - ctx.logger.warn(deprecationWarning); - console.warn(deprecationWarning); - } + const { host, owner, repo, project } = parseRepoUrl( + repoUrl, + integrations, + ); + const repoID = project ? project : `${owner}/${repo}`; const integrationConfig = integrations.gitlab.byHost(host); @@ -211,22 +209,19 @@ export const createPublishGitlabMergeRequestAction = (options: { content: file.content.toString('base64'), execute_filemode: file.executable, })); - const projects = await api.Projects.show(projectPath); + + const projects = await api.Projects.show(repoID); const { default_branch: defaultBranch } = projects; try { - await api.Branches.create( - projectPath, - branchName, - String(defaultBranch), - ); + await api.Branches.create(repoID, branchName, String(defaultBranch)); } catch (e) { throw new InputError(`The branch creation failed ${e}`); } try { - await api.Commits.create(projectPath, branchName, title, actions); + await api.Commits.create(repoID, branchName, ctx.input.title, actions); } catch (e) { throw new InputError( `Committing the changes to ${branchName} failed ${e}`, @@ -235,7 +230,7 @@ export const createPublishGitlabMergeRequestAction = (options: { try { const mergeRequestUrl = await api.MergeRequests.create( - projectPath, + repoID, branchName, String(defaultBranch), title, @@ -247,9 +242,8 @@ export const createPublishGitlabMergeRequestAction = (options: { ).then((mergeRequest: { web_url: string }) => { return mergeRequest.web_url; }); - /** @deprecated */ - ctx.output('projectid', projectPath); - ctx.output('projectPath', projectPath); + ctx.output('projectid', repoID); + ctx.output('projectPath', repoID); ctx.output('mergeRequestUrl', mergeRequestUrl); } catch (e) { throw new InputError(`Merge request creation failed${e}`); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/util.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/util.test.ts index cc879d4f55..5446109056 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/util.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/util.test.ts @@ -15,7 +15,9 @@ */ import path from 'path'; -import { getRepoSourceDirectory, isExecutable } from './util'; +import { getRepoSourceDirectory, isExecutable, parseRepoUrl } from './util'; +import { ScmIntegrations } from '@backstage/integration'; +import { ConfigReader } from '@backstage/config'; describe('getRepoSourceDirectory', () => { it('should return workspace root if no sub folder is given', () => { @@ -85,3 +87,95 @@ describe('isExecutable', () => { expect(isExecutable(0o100640)).toBe(false); }); }); + +describe('parseRepoUrl', () => { + const config = new ConfigReader({ + integrations: { + gitlab: [ + { + host: 'www.gitlab.com', + token: 'token', + apiBaseUrl: 'https://api.gitlab.com', + }, + ], + bitbucket: [ + { + host: 'www.bitbucket.net', + apiBaseUrl: 'https://api.hosted.bitbucket.net', + }, + { + host: 'www.bitbucket.org', + username: 'username', + appPassword: 'password', + apiBaseUrl: 'https://api.hosted.bitbucket.org', + }, + ], + }, + }); + const integrations = ScmIntegrations.fromConfig(config); + it('should throw an exception if no parameters are passed (gitlab)', () => { + expect(() => parseRepoUrl('www.gitlab.com', integrations)).toThrow( + 'Invalid repo URL passed to publisher: https://www.gitlab.com/, missing owner', + ); + }); + it('should return the project ID in the `project` parameter (gitlab)', () => { + expect( + parseRepoUrl('www.gitlab.com?project=234', integrations), + ).toStrictEqual({ + host: 'www.gitlab.com', + organization: undefined, + owner: undefined, + project: '234', + repo: null, + workspace: undefined, + }); + }); + it('should throw an exception if the repo parameter is missing, but owner parameter is set', () => { + expect(() => + parseRepoUrl('www.gitlab.com?owner=owner', integrations), + ).toThrow( + 'Invalid repo URL passed to publisher: https://www.gitlab.com/?owner=owner, missing repo', + ); + }); + it('should throw an exception if the owner parameter is missing, but repo parameter is set (gitlab)', () => { + expect(() => + parseRepoUrl('www.gitlab.com?repo=repo', integrations), + ).toThrow( + 'Invalid repo URL passed to publisher: https://www.gitlab.com/?repo=repo, missing owner', + ); + }); + it('should return the workspace, project and repo (bitbucket.org)', () => { + expect( + parseRepoUrl( + 'www.bitbucket.org?project=project&workspace=workspace&repo=repo', + integrations, + ), + ).toStrictEqual({ + host: 'www.bitbucket.org', + organization: undefined, + owner: undefined, + project: 'project', + repo: 'repo', + workspace: 'workspace', + }); + }); + it('should return the project and repo (another bitbucket instance)', () => { + expect( + parseRepoUrl('www.bitbucket.net?project=project&repo=repo', integrations), + ).toStrictEqual({ + host: 'www.bitbucket.net', + organization: undefined, + owner: undefined, + project: 'project', + repo: 'repo', + workspace: undefined, + }); + }); + it('should throw an exception if the workspace parameter is missing for bitbucket.org instance (bitbucket.org)', () => { + expect(() => + parseRepoUrl('www.bitbucket.org?project=project&repo=repo', integrations), + ).toThrow( + 'Invalid repo URL passed to publisher: https://www.bitbucket.org/?project=project&repo=repo, missing workspace', + ); + }); +}); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/util.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/util.ts index fff3213cb7..61bd704a0b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/util.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/util.ts @@ -71,32 +71,30 @@ export const parseRepoUrl = ( ); } - if (type === 'bitbucket') { - if (host === 'bitbucket.org') { - if (!workspace) { - throw new InputError( - `Invalid repo URL passed to publisher: ${repoUrl}, missing workspace`, - ); + const repo: string = parsed.searchParams.get('repo')!; + switch (type) { + case 'bitbucket': { + if (host === 'www.bitbucket.org') { + checkRequiredParams(parsed, 'workspace'); } + checkRequiredParams(parsed, 'project', 'repo'); + break; } - if (!project) { - throw new InputError( - `Invalid repo URL passed to publisher: ${repoUrl}, missing project`, - ); + case 'gitlab': { + // project is the projectID, and if defined, owner and repo won't be needed. + if (!project) { + checkRequiredParams(parsed, 'owner', 'repo'); + } + break; } - } else { - if (!owner && type !== 'gerrit') { - throw new InputError( - `Invalid repo URL passed to publisher: ${repoUrl}, missing owner`, - ); + case 'gerrit': { + checkRequiredParams(parsed, 'repo'); + break; + } + default: { + checkRequiredParams(parsed, 'repo', 'owner'); + break; } - } - - const repo = parsed.searchParams.get('repo'); - if (!repo) { - throw new InputError( - `Invalid repo URL passed to publisher: ${repoUrl}, missing repo`, - ); } return { host, owner, repo, organization, workspace, project }; @@ -106,3 +104,26 @@ export const isExecutable = (fileMode: number) => { const res = fileMode & executeBitMask; return res > 0; }; + +/** + * This function checks if the required parameters (given as the `params` argument) are present in the URL + * + * @param repoUrl - the URL for the repository + * @param params - a variadic list of URL query parameter names + * + * @throws + * An InputError exception is thrown if any of the required parameters is not in the URL. + * + * @public + */ +function checkRequiredParams(repoUrl: URL, ...params: string[]) { + for (let i = 0; i < params.length; i++) { + if (!repoUrl.searchParams.get(params[i])) { + throw new InputError( + `Invalid repo URL passed to publisher: ${repoUrl.toString()}, missing ${ + params[i] + }`, + ); + } + } +} diff --git a/plugins/stack-overflow-backend/README.md b/plugins/stack-overflow-backend/README.md index acff784cc6..a35a6678cb 100644 --- a/plugins/stack-overflow-backend/README.md +++ b/plugins/stack-overflow-backend/README.md @@ -41,7 +41,7 @@ When you have your `packages/backend/src/plugins/search.ts` file ready to make m ```ts indexBuilder.addCollator({ - defaultRefreshIntervalSeconds: 600, + schedule, factory: StackOverflowQuestionsCollatorFactory.fromConfig(env.config, { logger: env.logger, requestParams: { diff --git a/plugins/techdocs-addons-test-utils/CHANGELOG.md b/plugins/techdocs-addons-test-utils/CHANGELOG.md index baea1ab42f..ba3141919a 100644 --- a/plugins/techdocs-addons-test-utils/CHANGELOG.md +++ b/plugins/techdocs-addons-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-techdocs-addons-test-utils +## 1.0.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.0-next.1 + ## 1.0.6-next.0 ### Patch Changes diff --git a/plugins/techdocs-addons-test-utils/package.json b/plugins/techdocs-addons-test-utils/package.json index a3da234606..a7b6abd782 100644 --- a/plugins/techdocs-addons-test-utils/package.json +++ b/plugins/techdocs-addons-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-techdocs-addons-test-utils", - "version": "1.0.6-next.0", + "version": "1.0.6-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 9a6c681a82..d146a4d576 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-techdocs +## 1.4.0-next.1 + +### Patch Changes + +- 9e4d8e6198: Fix logic bug that broke techdocs-cli-embedded-app + ## 1.4.0-next.0 ### Minor Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 05b841fd0c..cb03cb9e3f 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "1.4.0-next.0", + "version": "1.4.0-next.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/storybook/yarn.lock b/storybook/yarn.lock index be9a98e42a..c864d817ab 100644 --- a/storybook/yarn.lock +++ b/storybook/yarn.lock @@ -3107,137 +3107,95 @@ __metadata: languageName: node linkType: hard -"@swc/core-android-arm-eabi@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-android-arm-eabi@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.122 - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@swc/core-android-arm64@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-android-arm64@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-darwin-arm64@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-darwin-arm64@npm:1.3.9" +"@swc/core-darwin-arm64@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-darwin-arm64@npm:1.3.14" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-darwin-x64@npm:1.3.9" +"@swc/core-darwin-x64@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-darwin-x64@npm:1.3.14" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-freebsd-x64@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-freebsd-x64@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@swc/core-linux-arm-gnueabihf@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-linux-arm-gnueabihf@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.14" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.9" +"@swc/core-linux-arm64-gnu@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.14" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.9" +"@swc/core-linux-arm64-musl@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.14" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.9" +"@swc/core-linux-x64-gnu@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.14" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-x64-musl@npm:1.3.9" +"@swc/core-linux-x64-musl@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-x64-musl@npm:1.3.14" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-win32-arm64-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.14" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-win32-ia32-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.14" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.9" +"@swc/core-win32-x64-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.14" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.9 - resolution: "@swc/core@npm:1.3.9" + version: 1.3.14 + resolution: "@swc/core@npm:1.3.14" dependencies: - "@swc/core-android-arm-eabi": 1.3.9 - "@swc/core-android-arm64": 1.3.9 - "@swc/core-darwin-arm64": 1.3.9 - "@swc/core-darwin-x64": 1.3.9 - "@swc/core-freebsd-x64": 1.3.9 - "@swc/core-linux-arm-gnueabihf": 1.3.9 - "@swc/core-linux-arm64-gnu": 1.3.9 - "@swc/core-linux-arm64-musl": 1.3.9 - "@swc/core-linux-x64-gnu": 1.3.9 - "@swc/core-linux-x64-musl": 1.3.9 - "@swc/core-win32-arm64-msvc": 1.3.9 - "@swc/core-win32-ia32-msvc": 1.3.9 - "@swc/core-win32-x64-msvc": 1.3.9 + "@swc/core-darwin-arm64": 1.3.14 + "@swc/core-darwin-x64": 1.3.14 + "@swc/core-linux-arm-gnueabihf": 1.3.14 + "@swc/core-linux-arm64-gnu": 1.3.14 + "@swc/core-linux-arm64-musl": 1.3.14 + "@swc/core-linux-x64-gnu": 1.3.14 + "@swc/core-linux-x64-musl": 1.3.14 + "@swc/core-win32-arm64-msvc": 1.3.14 + "@swc/core-win32-ia32-msvc": 1.3.14 + "@swc/core-win32-x64-msvc": 1.3.14 dependenciesMeta: - "@swc/core-android-arm-eabi": - optional: true - "@swc/core-android-arm64": - optional: true "@swc/core-darwin-arm64": optional: true "@swc/core-darwin-x64": optional: true - "@swc/core-freebsd-x64": - optional: true "@swc/core-linux-arm-gnueabihf": optional: true "@swc/core-linux-arm64-gnu": @@ -3256,21 +3214,7 @@ __metadata: optional: true bin: swcx: run_swcx.js - checksum: 761918f1bca5d494eaaafd49720717e3b3071df5bc6ef8b298a778ba4e4d20bc5a78c939a0b1c98623f9fe23e535a16a359179b72390cd1f5cbc891ea53c22fa - languageName: node - linkType: hard - -"@swc/wasm@npm:1.2.122": - version: 1.2.122 - resolution: "@swc/wasm@npm:1.2.122" - checksum: 563345370c5ad18373d3b403590ab880fe52dcd8fc8c8601be263fcd9886520b28a7f4e46236cf49ca2b136c79d4ef50c960bc34b7cdc2068118b0d84dfca1f4 - languageName: node - linkType: hard - -"@swc/wasm@npm:1.2.130": - version: 1.2.130 - resolution: "@swc/wasm@npm:1.2.130" - checksum: 02203bfef3e382c64cbbd63c138c8fdf61865e74d923b317e9d9e9f33f5a3f0a9533b5fdbc9505e76d78e864be04a82fc847eb987a1e47ccac5850146c858292 + checksum: 79e9857ee3d5af22d9a6e644d7608594fa8ccd9102dbc088addc0f6ee9e1e8e3fc8835545730707395aa47197ab119fa323aedf4184cf51892379b307aedddc0 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock index 2332db24c1..6657305c84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3314,7 +3314,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@npm:^1.1.1, @backstage/catalog-model@npm:^1.1.2": +"@backstage/catalog-model@npm:^1.1.2": version: 1.1.2 resolution: "@backstage/catalog-model@npm:1.1.2" dependencies: @@ -3599,7 +3599,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@npm:^0.11.1, @backstage/core-components@npm:^0.11.2": +"@backstage/core-components@npm:^0.11.2": version: 0.11.2 resolution: "@backstage/core-components@npm:0.11.2" dependencies: @@ -3722,7 +3722,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.0.6, @backstage/core-plugin-api@npm:^1.0.7": +"@backstage/core-plugin-api@npm:^1.0.7": version: 1.0.7 resolution: "@backstage/core-plugin-api@npm:1.0.7" dependencies: @@ -5066,7 +5066,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.1.4, @backstage/plugin-catalog-react@npm:^1.2.0": +"@backstage/plugin-catalog-react@npm:^1.2.0": version: 1.2.0 resolution: "@backstage/plugin-catalog-react@npm:1.2.0" dependencies: @@ -8028,9 +8028,9 @@ __metadata: languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^6.1.1": - version: 6.1.1 - resolution: "@changesets/apply-release-plan@npm:6.1.1" +"@changesets/apply-release-plan@npm:^6.1.2": + version: 6.1.2 + resolution: "@changesets/apply-release-plan@npm:6.1.2" dependencies: "@babel/runtime": ^7.10.4 "@changesets/config": ^2.2.0 @@ -8045,7 +8045,7 @@ __metadata: prettier: ^2.7.1 resolve-from: ^5.0.0 semver: ^5.4.1 - checksum: 34da2d52eced00bc5f51c8e8ce16c0e487743219f057da2b3e6c6597bb2d50498f3996c779e4fc29b19d357c9b700d82310d723395ba09350b9a139c9e0e0d23 + checksum: efe2cdc493cb2182140b73ff76e34ee7c90887bfa2f42b4ec07db0107ec94b9c0e95519912dafcf9eb530ad2414487fbd61ca6e6d5f853fe383db93856d0d362 languageName: node linkType: hard @@ -8073,11 +8073,11 @@ __metadata: linkType: hard "@changesets/cli@npm:^2.14.0": - version: 2.25.0 - resolution: "@changesets/cli@npm:2.25.0" + version: 2.25.2 + resolution: "@changesets/cli@npm:2.25.2" dependencies: "@babel/runtime": ^7.10.4 - "@changesets/apply-release-plan": ^6.1.1 + "@changesets/apply-release-plan": ^6.1.2 "@changesets/assemble-release-plan": ^5.2.2 "@changesets/changelog-git": ^0.1.13 "@changesets/config": ^2.2.0 @@ -8089,7 +8089,7 @@ __metadata: "@changesets/pre": ^1.0.13 "@changesets/read": ^0.5.8 "@changesets/types": ^5.2.0 - "@changesets/write": ^0.2.1 + "@changesets/write": ^0.2.2 "@manypkg/get-packages": ^1.1.3 "@types/is-ci": ^3.0.0 "@types/semver": ^6.0.0 @@ -8111,7 +8111,7 @@ __metadata: tty-table: ^4.1.5 bin: changeset: bin.js - checksum: 54439bdfa7ca115964482f6323e9475b5917d68c2e0752a272ed133b863fce51eeba86366d8740a275dc0b891af8e272602da69d04144f40e4bf3531f48fe8fb + checksum: 815c69cb6cee75ede88361582581d94a860d96335e7bab179481cd5e2bb1e60cc39662dccd2b2b87818e9c63a84ff9eb469ed27f13b6adf4401a699e49beb79c languageName: node linkType: hard @@ -8250,16 +8250,16 @@ __metadata: languageName: node linkType: hard -"@changesets/write@npm:^0.2.1": - version: 0.2.1 - resolution: "@changesets/write@npm:0.2.1" +"@changesets/write@npm:^0.2.2": + version: 0.2.2 + resolution: "@changesets/write@npm:0.2.2" dependencies: "@babel/runtime": ^7.10.4 "@changesets/types": ^5.2.0 fs-extra: ^7.0.1 human-id: ^1.0.2 prettier: ^2.7.1 - checksum: 98b4d9c12fe13177860407557979d475361076a596103895440f52b2724f7004d6c98af39105fda0eaa52ceca8c0dc0ec9c8ab10eec7a0cb9bf83301f2ca48b3 + checksum: e23fb4a88e12af32db59d2f1866380ec4a50e7fa55cb55d860619f0735c5078ed170f832125672bb007b7a0cced67d9304a1b81260a7224af6afe0e3957dc999 languageName: node linkType: hard @@ -8697,8 +8697,8 @@ __metadata: linkType: hard "@google-cloud/storage@npm:^6.0.0": - version: 6.5.3 - resolution: "@google-cloud/storage@npm:6.5.3" + version: 6.6.0 + resolution: "@google-cloud/storage@npm:6.6.0" dependencies: "@google-cloud/paginator": ^3.0.7 "@google-cloud/projectify": ^3.0.0 @@ -8717,7 +8717,7 @@ __metadata: retry-request: ^5.0.0 teeny-request: ^8.0.0 uuid: ^8.0.0 - checksum: 9b88a5bff4e8401dbd18223fe570882df632cbb0e515e7f3eca33dbea16568168b2c0397b02ad8030e6d114b6d73109283d17a49762f1833f077424bf90a676d + checksum: fef529fc83be01fc421e2ee8c8cd6a78dc5b0d50b1f0912e358285b2e4650a3111229feaef5b517fc90b718e7424251dadc59e12ab782303d57aa3e59dc019ab languageName: node linkType: hard @@ -9244,15 +9244,15 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/merge@npm:8.3.6": - version: 8.3.6 - resolution: "@graphql-tools/merge@npm:8.3.6" +"@graphql-tools/merge@npm:8.3.10": + version: 8.3.10 + resolution: "@graphql-tools/merge@npm:8.3.10" dependencies: - "@graphql-tools/utils": 8.12.0 + "@graphql-tools/utils": 9.0.1 tslib: ^2.4.0 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 3e45ebff0dce9524e72c4af1d2b9799c16515c1236290e07cd68fb2226c4e54734e2444d89a64b387b7ba991d15c6f948fdfc20c77a74b1d24babddd865ff32a + checksum: dbe2c6faee8034339c5708a43157b185b8523c131dde1b37bb511d96ac527da51f5be9501d9ffe0a8c424e419d64bb8415ec96e8443d3d0a5a6582a37b0aafa2 languageName: node linkType: hard @@ -9366,16 +9366,16 @@ __metadata: linkType: hard "@graphql-tools/schema@npm:^9.0.0": - version: 9.0.4 - resolution: "@graphql-tools/schema@npm:9.0.4" + version: 9.0.8 + resolution: "@graphql-tools/schema@npm:9.0.8" dependencies: - "@graphql-tools/merge": 8.3.6 - "@graphql-tools/utils": 8.12.0 + "@graphql-tools/merge": 8.3.10 + "@graphql-tools/utils": 9.0.1 tslib: ^2.4.0 value-or-promise: 1.0.11 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 0644ba225ff7fb03c6fb7f026b6a77a4ac5dd14fd10bb562ea0072bfe0258620fd4789b851b0b97007db8754d0b7d88a1061bb98bacc679b22e2eb7706e79e0e + checksum: fb29c29269622f2636ecccac868fa44a585622e16be74286a4cd97b259ba2d2dad5ec67e77b00117f70e500a9262e0edc58a35a83cea0618618993e5e1d809fb languageName: node linkType: hard @@ -9429,17 +9429,6 @@ __metadata: languageName: node linkType: hard -"@graphql-tools/utils@npm:8.12.0": - version: 8.12.0 - resolution: "@graphql-tools/utils@npm:8.12.0" - dependencies: - tslib: ^2.4.0 - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - checksum: 24edc6ba3bcfa9a4c1d1d37117c3f96d847beed9638325083c32c6ec9674729dc89fc8cc389d317ae5d9dba22e91443bd9788f1dc8de91a1b6f1e592112bd48f - languageName: node - linkType: hard - "@graphql-tools/utils@npm:8.6.9": version: 8.6.9 resolution: "@graphql-tools/utils@npm:8.6.9" @@ -9473,6 +9462,17 @@ __metadata: languageName: node linkType: hard +"@graphql-tools/utils@npm:9.0.1": + version: 9.0.1 + resolution: "@graphql-tools/utils@npm:9.0.1" + dependencies: + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: a41221d8568bfaafa76526eaa89550d67965c43e0cd1ff94979f61c117d0caf880938799b351c4b637ce26309ba5d2ef8c4a657298f5d46702f43759b89bfa05 + languageName: node + linkType: hard + "@graphql-tools/wrap@npm:8.5.0": version: 8.5.0 resolution: "@graphql-tools/wrap@npm:8.5.0" @@ -12822,137 +12822,95 @@ __metadata: languageName: node linkType: hard -"@swc/core-android-arm-eabi@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-android-arm-eabi@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.122 - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@swc/core-android-arm64@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-android-arm64@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@swc/core-darwin-arm64@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-darwin-arm64@npm:1.3.9" +"@swc/core-darwin-arm64@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-darwin-arm64@npm:1.3.14" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-darwin-x64@npm:1.3.9" +"@swc/core-darwin-x64@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-darwin-x64@npm:1.3.14" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-freebsd-x64@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-freebsd-x64@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@swc/core-linux-arm-gnueabihf@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-linux-arm-gnueabihf@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.14" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.9" +"@swc/core-linux-arm64-gnu@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.14" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.9" +"@swc/core-linux-arm64-musl@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.14" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.9" +"@swc/core-linux-x64-gnu@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.14" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-linux-x64-musl@npm:1.3.9" +"@swc/core-linux-x64-musl@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-linux-x64-musl@npm:1.3.14" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-win32-arm64-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.14" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.9" - dependencies: - "@swc/wasm": 1.2.130 +"@swc/core-win32-ia32-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.14" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.9": - version: 1.3.9 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.9" +"@swc/core-win32-x64-msvc@npm:1.3.14": + version: 1.3.14 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.14" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.3.9": - version: 1.3.9 - resolution: "@swc/core@npm:1.3.9" + version: 1.3.14 + resolution: "@swc/core@npm:1.3.14" dependencies: - "@swc/core-android-arm-eabi": 1.3.9 - "@swc/core-android-arm64": 1.3.9 - "@swc/core-darwin-arm64": 1.3.9 - "@swc/core-darwin-x64": 1.3.9 - "@swc/core-freebsd-x64": 1.3.9 - "@swc/core-linux-arm-gnueabihf": 1.3.9 - "@swc/core-linux-arm64-gnu": 1.3.9 - "@swc/core-linux-arm64-musl": 1.3.9 - "@swc/core-linux-x64-gnu": 1.3.9 - "@swc/core-linux-x64-musl": 1.3.9 - "@swc/core-win32-arm64-msvc": 1.3.9 - "@swc/core-win32-ia32-msvc": 1.3.9 - "@swc/core-win32-x64-msvc": 1.3.9 + "@swc/core-darwin-arm64": 1.3.14 + "@swc/core-darwin-x64": 1.3.14 + "@swc/core-linux-arm-gnueabihf": 1.3.14 + "@swc/core-linux-arm64-gnu": 1.3.14 + "@swc/core-linux-arm64-musl": 1.3.14 + "@swc/core-linux-x64-gnu": 1.3.14 + "@swc/core-linux-x64-musl": 1.3.14 + "@swc/core-win32-arm64-msvc": 1.3.14 + "@swc/core-win32-ia32-msvc": 1.3.14 + "@swc/core-win32-x64-msvc": 1.3.14 dependenciesMeta: - "@swc/core-android-arm-eabi": - optional: true - "@swc/core-android-arm64": - optional: true "@swc/core-darwin-arm64": optional: true "@swc/core-darwin-x64": optional: true - "@swc/core-freebsd-x64": - optional: true "@swc/core-linux-arm-gnueabihf": optional: true "@swc/core-linux-arm64-gnu": @@ -12971,7 +12929,7 @@ __metadata: optional: true bin: swcx: run_swcx.js - checksum: 761918f1bca5d494eaaafd49720717e3b3071df5bc6ef8b298a778ba4e4d20bc5a78c939a0b1c98623f9fe23e535a16a359179b72390cd1f5cbc891ea53c22fa + checksum: 79e9857ee3d5af22d9a6e644d7608594fa8ccd9102dbc088addc0f6ee9e1e8e3fc8835545730707395aa47197ab119fa323aedf4184cf51892379b307aedddc0 languageName: node linkType: hard @@ -12996,20 +12954,6 @@ __metadata: languageName: node linkType: hard -"@swc/wasm@npm:1.2.122": - version: 1.2.122 - resolution: "@swc/wasm@npm:1.2.122" - checksum: 563345370c5ad18373d3b403590ab880fe52dcd8fc8c8601be263fcd9886520b28a7f4e46236cf49ca2b136c79d4ef50c960bc34b7cdc2068118b0d84dfca1f4 - languageName: node - linkType: hard - -"@swc/wasm@npm:1.2.130": - version: 1.2.130 - resolution: "@swc/wasm@npm:1.2.130" - checksum: 02203bfef3e382c64cbbd63c138c8fdf61865e74d923b317e9d9e9f33f5a3f0a9533b5fdbc9505e76d78e864be04a82fc847eb987a1e47ccac5850146c858292 - languageName: node - linkType: hard - "@szmarczak/http-timer@npm:^4.0.5": version: 4.0.5 resolution: "@szmarczak/http-timer@npm:4.0.5" @@ -13699,12 +13643,12 @@ __metadata: linkType: hard "@types/dockerode@npm:^3.3.0": - version: 3.3.10 - resolution: "@types/dockerode@npm:3.3.10" + version: 3.3.12 + resolution: "@types/dockerode@npm:3.3.12" dependencies: "@types/docker-modem": "*" "@types/node": "*" - checksum: ef2231adebbdc1876a00fd16a51963ed2ea05a2305031467420c753f77a27a6f2a47617e2f4a42702be84c88046a5a5f6dfd471e3579f11f21166f539a3d2373 + checksum: 65f16894dca4d359395ed9619ed10d5297917a63b9d86660578e38b97380f5f871188556ab1a5003852e9535a5001ecd7d6c03a1da4391e7c31b30762de55e69 languageName: node linkType: hard @@ -14143,11 +14087,11 @@ __metadata: linkType: hard "@types/ldapjs@npm:^2.2.0": - version: 2.2.4 - resolution: "@types/ldapjs@npm:2.2.4" + version: 2.2.5 + resolution: "@types/ldapjs@npm:2.2.5" dependencies: "@types/node": "*" - checksum: 3f240809927e1292380e5977579d7edffb6e5e41b35510c7091b51da19e7387d4ebff0f254c0b145f3cf5d5485b6bb39c77335d857d092e6f4e9ce5a6682a872 + checksum: 779e462f118f8a6643b7f49d35646e4dae339ff1c6290198950327a736a79bc03beca882e1356ede4c8d54f6dc19bf544f0d23b09279558d69222a93bacd459c languageName: node linkType: hard @@ -14331,10 +14275,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 17.0.25 - resolution: "@types/node@npm:17.0.25" - checksum: 6a820bd624e69ea772f52a6cdb326484eff5829443dc981939373929ade109f58c21698b9f0a831bd6ceea799e722a75dc49c5fa7a6bc32a81e1cbdfc6507b64 +"@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": + version: 18.11.9 + resolution: "@types/node@npm:18.11.9" + checksum: cc0aae109e9b7adefc32eecb838d6fad931663bb06484b5e9cbbbf74865c721b03d16fd8d74ad90e31dbe093d956a7c2c306ba5429ba0c00f3f7505103d7a496 languageName: node linkType: hard @@ -14345,13 +14289,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:>= 8": - version: 18.7.4 - resolution: "@types/node@npm:18.7.4" - checksum: 051d2147e4d8129fceb63ee9384259b2f224dbc4e4b0c46d96a6b61cbaad4e3fe4060950e7f4fc3d5692b1e6ea47e68ad03b61155754bfa169593747cfe3f8f4 - languageName: node - linkType: hard - "@types/node@npm:^10.1.0, @types/node@npm:^10.12.0": version: 10.17.60 resolution: "@types/node@npm:10.17.60" @@ -14360,16 +14297,16 @@ __metadata: linkType: hard "@types/node@npm:^12.7.1": - version: 12.20.48 - resolution: "@types/node@npm:12.20.48" - checksum: 48bd705bda1af2332c50fb24819bba7b0eac791b07c24c098c39b10940170a53bd3c4755aedc3409c7114c539f1f86ea657aa6838d164fd135e3b89b9f9aa772 + version: 12.20.55 + resolution: "@types/node@npm:12.20.55" + checksum: e4f86785f4092706e0d3b0edff8dca5a13b45627e4b36700acd8dfe6ad53db71928c8dee914d4276c7fd3b6ccd829aa919811c9eb708a2c8e4c6eb3701178c37 languageName: node linkType: hard "@types/node@npm:^14.14.31": - version: 14.18.16 - resolution: "@types/node@npm:14.18.16" - checksum: 1999799309dc8620a2adf9a5d5e48416af87321bae4c950b4aa8018fcef2c3b6c1fcf98c39eae06f6492c03a643a5a44e2bb3750cd2574d9cf7eac33bac50e24 + version: 14.18.33 + resolution: "@types/node@npm:14.18.33" + checksum: 4e23f95186d8ae1d38c999bc6b46fe94e790da88744b0a3bfeedcbd0d9ffe2cb0ff39e85f43014f6739e5270292c1a1f6f97a1fc606fd573a0c17fda9a1d42de languageName: node linkType: hard @@ -14381,9 +14318,9 @@ __metadata: linkType: hard "@types/node@npm:^16.0.0, @types/node@npm:^16.11.26, @types/node@npm:^16.9.2": - version: 16.11.56 - resolution: "@types/node@npm:16.11.56" - checksum: b4efade16eb08a39810921c54a1637e69c8f3184a20d87e8fe74d557d9bda73f0829ac318e2a30a32b1903e4b099812defd1dfe438be70b98dbfbea5b0d99a53 + version: 16.18.3 + resolution: "@types/node@npm:16.18.3" + checksum: 6b8ba2ea5d842f7986e366cb9184c54d273d492784dc62e08fd5afeae938d9b61aec6e4222d2541cd18f9b1412ba361bbcb3f4204fb003608af80a2a6af959f9 languageName: node linkType: hard @@ -14661,13 +14598,13 @@ __metadata: linkType: hard "@types/react@npm:^17": - version: 17.0.45 - resolution: "@types/react@npm:17.0.45" + version: 17.0.52 + resolution: "@types/react@npm:17.0.52" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: 3cc13a02824c13f6fa4807a83abd065ac1d9943359e76bd995cc7cd2b4148c1176ebd54a30a9f4eb8a0f141ff359d712876f256c4fee707e4290607ef8410b3e + checksum: a51b98dd87838d161278fdf9dd78e6a4ff8c018f406d6647f77963e144fb52a8beee40c89fd0e7e840eaeaa8bd9fe2f34519410540b1a52d43a6f8b4d2fbce33 languageName: node linkType: hard