Merge branch 'backstage:master' into feature/support-aoss

This commit is contained in:
Andrew Ochsner
2023-10-03 14:48:39 -05:00
committed by GitHub
452 changed files with 6672 additions and 525 deletions
+10
View File
@@ -0,0 +1,10 @@
---
'@backstage/backend-tasks': patch
---
Instrument `backend-tasks` with some counters and histograms for duration.
`backend_tasks.task.runs.count`: Counter with the total number of times a task has been run.
`backend_tasks.task.runs.duration`: Histogram with the run durations for each task.
Both these metrics have come with `result` `taskId` and `scope` labels for finer grained grouping.
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-org': patch
---
Fixed the display of OwnershipCard with aggregated relations by loading relations when getting children of entity.
This allows the already existing recursive method to work properly when children of entity have children themselves.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog': patch
---
Create an experimental `CatalogSearchResultItemExtension` for declarative integration with Backstage; it can be accessed via the `/alpha` import.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-common': patch
---
Added the ability to fetch git tags through the `Git` class. This is useful for scaffolder actions that want to take action based on tag versions in a cloned repository
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': minor
---
Display meaningful error to the output if Gitlab namespace not found inside `publish:gitlab`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/backend-tasks': patch
---
Fix bug where backend tasks that are defined with HumanDuration are immediately triggered on application startup
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend-module-github': patch
---
Make `defaultUserTransformer` resolve to `UserEntity` instead of `Entity`
+35 -1
View File
@@ -245,53 +245,87 @@
"@backstage/plugin-vault": "0.1.19",
"@backstage/plugin-vault-backend": "0.3.8",
"@backstage/plugin-xcmetrics": "0.2.43",
"@backstage/e2e-test-utils": "0.0.0"
"@backstage/e2e-test-utils": "0.0.0",
"@backstage/plugin-kubernetes-react": "0.0.0"
},
"changesets": [
"angry-badgers-beg",
"big-spies-beam",
"breezy-dryers-thank",
"calm-scissors-rescue",
"chatty-papayas-care",
"clean-forks-love",
"cold-bees-jam",
"cold-seas-repeat",
"dull-bugs-build",
"dull-dolls-explode",
"dull-experts-kiss",
"dull-laws-camp",
"eight-melons-cough",
"eighty-actors-type",
"fair-frogs-enjoy",
"four-jars-protect",
"four-onions-clap",
"four-pans-sin",
"fresh-kangaroos-tap",
"gentle-elephants-fold",
"gentle-spies-deny",
"happy-books-smoke",
"heavy-forks-tie",
"itchy-bobcats-fly",
"itchy-monkeys-reply",
"itchy-rabbits-exist",
"large-comics-knock",
"late-papayas-push",
"lazy-doors-wink",
"lemon-cups-wait",
"lemon-masks-greet",
"lovely-coins-occur",
"lovely-fans-sniff",
"many-swans-eat",
"mean-dancers-burn",
"moody-lobsters-rescue",
"nervous-hounds-sleep",
"nice-clocks-smash",
"nice-dancers-explain",
"nine-garlics-attend",
"olive-cars-rescue",
"perfect-pumas-protect",
"plenty-llamas-double",
"polite-cooks-perform",
"polite-donuts-fail",
"polite-trainers-grin",
"popular-dots-design",
"pretty-apes-sneeze",
"pretty-steaks-serve",
"purple-chefs-wait",
"purple-forks-fetch",
"quick-weeks-explode",
"red-bees-try",
"renovate-a1c52e8",
"shy-clouds-reflect",
"shy-seas-sip",
"silent-years-bake",
"silly-swans-invent",
"small-pugs-build",
"spicy-chairs-film",
"spotty-badgers-wash",
"strong-falcons-tickle",
"stupid-drinks-trade",
"stupid-eagles-shave",
"tasty-avocados-hope",
"tasty-doors-switch",
"ten-seals-wait",
"thirty-coins-sneeze",
"tiny-garlics-cheer",
"twelve-clouds-design",
"violet-beers-cross",
"warm-drinks-argue",
"wet-olives-wave",
"wet-timers-chew",
"wicked-rings-flash",
"wild-jobs-greet",
"yellow-numbers-own",
"yellow-rings-invent"
]
}
+8
View File
@@ -0,0 +1,8 @@
---
'@backstage/backend-openapi-utils': patch
---
Adds new public utility types for common OpenAPI values, like request and response shapes and parameters available on an endpoint.
**deprecated** `internal` namespace
The internal namespace will continue to be exported but now uses OpenAPI format for path parameters. You should use the new utility types.
+2 -2
View File
@@ -2,6 +2,6 @@
'@backstage/create-app': patch
---
Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build.
Bump Docker base images to `node:18-bookworm-slim` to fix node compatibility issues raised during image build.
You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bullseye-slim`
You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bookworm-slim`
+11
View File
@@ -0,0 +1,11 @@
---
'@backstage/create-app': patch
---
Added missing `.eslintignore` file
To apply this change to an existing app, create a new `.eslintignore` file at the root of your project with the following content:
```diff
+ playwright.config.ts
```
+3 -3
View File
@@ -18,7 +18,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [18.x, 20.x]
node-version: [18.x]
env:
CI: true
@@ -49,7 +49,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [18.x, 20.x]
node-version: [18.x]
env:
CI: true
@@ -139,7 +139,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [18.x, 20.x]
node-version: [18.x]
name: Test ${{ matrix.node-version }}
services:
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [18.x, 20.x]
node-version: [18.x]
services:
postgres13:
+1 -1
View File
@@ -123,7 +123,7 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/
| [Contentful](https://www.contentful.com) | [James Bourne](https://github.com/jamesmbourne) | Centralized documentation of service ownership, APIs, and documentation, and new service creation with a custom scaffolder - [full case study with Roadie](https://roadie.io/case-studies/maintaining-velocity-through-hypergrowth-contentful/). |
| [Back Market](https://www.backmarket.com) | [Sami Farhat](https://github.com/skfarhat) | Internal Developer Portal featuring catalog, tech-radar, ownership management, component creation (scaffolder) and centralized infrastructure management -- probably more to come. |
| [Avalia Systems](https://avalia.io) | [Olivier Liechti](https://github.com/wasadigi), [Fabio Velloso](https://github.com/fabiovelloso) | Innersource, software analytics, knowledge base for 360 software assessments, collaborative applications, hub for tracking and sharing IP assets. |
| [Albert Heijn](https://ah.technology) | [Joost Hofman](https://github.com/joosthofman), [Reindrich Geerman](https://github.com/reinst) | Single point of entry for all our engineers (Developer portal), Tech radar, catalog, templates (paved roads) and tech documentation. |
| [Albert Heijn](https://ah.technology) | [Reindrich Geerman](https://github.com/reinst) | Single point of entry for all our engineers (Developer portal), Tech radar, catalog, templates (paved roads) and tech documentation. |
| [Wise, formerly TransferWise](https://wise.com) | [Andrew Beveridge](https://github.com/beveradb) | It's early days for us, we're trying to start small with catalog, tech docs and unified search. Future ambitious vision includes scaffolder for one-click component addition, building out integrations with CI/CD tooling, kubernetes clusters, monitoring/alerting tooling etc. and aiming for a frictionless "golden path" for engineers! 🚀 |
| [Happy Money](http://happymoney.com/) | [Akshit Lomash](mailto:alomash@happymoney.com) | We are moving from a monolith to microservices-based architecture. We are developing a developer portal based on Backstage to create a service catalog for our new services. All the services created are onboarded Backstage and engineering teams are using a cookie-cutter-based template from backstage to initiate a new service. |
| [Lightspeed](http://lightspeedhq.com/) | [Marcus Crane](mailto:marcus.crane@lightspeedhq.com) | We use it within our X-Series division (https://vendhq.com) to catalog ~100+ systems and ~350 components! |
+30 -20
View File
@@ -130,13 +130,14 @@ export default async function createPlugin(
builder.addProcessor(new ScaffolderEntitiesProcessor());
/* highlight-add-start */
const githubOrgProvider = GithubOrgEntityProvider.fromConfig(env.config, {
id: 'production',
orgUrl: 'https://github.com/backstage',
logger: env.logger,
schedule: env.scheduler.createScheduledTaskRunner({
frequency: { minutes: 60 },
timeout: { minutes: 15 },
}),
id: 'production',
orgUrl: 'https://github.com/backstage',
logger: env.logger,
schedule: env.scheduler.createScheduledTaskRunner({
frequency: { minutes: 60 },
timeout: { minutes: 15 },
}),
});
env.eventBroker.subscribe(githubOrgProvider);
builder.addEntityProvider(githubOrgProvider);
/* highlight-add-end */
@@ -254,23 +255,32 @@ configured such an email in their own account. The API will only return these
values when using GitHub App authentication and with the correct app permission
allowing access to emails.
You can decorate the `defaultUserTransformer` to replace the org email in the
You can decorate the default `userTransformer` to replace the org email in the
returned identity.
```typescript
async (user, ctx): Promise<UserEntity | undefined> => {
const entity = await defaultUserTransformer(user, ctx);
if (entity && user.organizationVerifiedDomainEmails?.length) {
entity.spec.profile!.email = user.organizationVerifiedDomainEmails[0];
}
return entity;
},
```ts title="packages/backend/src/plugins/catalog.ts"
const githubOrgProvider = GithubOrgEntityProvider.fromConfig(env.config, {
id: 'production',
orgUrl: 'https://github.com/backstage',
logger: env.logger,
schedule: env.scheduler.createScheduledTaskRunner({
frequency: { minutes: 60 },
timeout: { minutes: 15 },
}),
/* highlight-add-start */
userTransformer: async (user, ctx) => {
const entity = await defaultUserTransformer(user, ctx);
if (entity && user.organizationVerifiedDomainEmails?.length) {
entity.spec.profile!.email = user.organizationVerifiedDomainEmails[0];
}
return entity;
},
/* highlight-add-end */
});
```
Once you have imported the emails you can resolve users in your sign-in in
resolver using the catalog entity search via email
Once you have imported the emails you can resolve users in your [sign-in
resolver](../../auth/github/provider.md) using the catalog entity search via email
```typescript title="packages/backend/src/plugins/auth.ts"
ctx.signInWithCatalogUser({
+8 -7
View File
@@ -36,13 +36,14 @@ Example:
```yaml
# in app-config.yaml
proxy:
/simple-example: http://simple.example.com:8080
'/larger-example/v1':
target: http://larger.example.com:8080/svc.v1
headers:
Authorization: ${EXAMPLE_AUTH_HEADER}
# ...or interpolating a value into part of a string,
# Authorization: Bearer ${EXAMPLE_AUTH_TOKEN}
endpoints:
/simple-example: http://simple.example.com:8080
'/larger-example/v1':
target: http://larger.example.com:8080/svc.v1
headers:
Authorization: ${EXAMPLE_AUTH_HEADER}
# ...or interpolating a value into part of a string,
# Authorization: Bearer ${EXAMPLE_AUTH_TOKEN}
```
Each key under the proxy configuration entry is a route to match, below the
+2 -2
View File
@@ -297,9 +297,9 @@
- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`.
- 04a3f65e15: Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build.
- 04a3f65e15: Bump Docker base images to `node:18-bookworm-slim` to fix node compatibility issues raised during image build.
You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bullseye-slim`
You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bookworm-slim`
- 5eacd5d213: The E2E test setup based on Cypress has been replaced with one based on [Playwright](https://playwright.dev/). Migrating existing apps is not required as this is a standalone setup, only do so if you also want to switch from Cypress to Playwright.
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -51,7 +51,7 @@
"jest-haste-map@^29.4.3": "patch:jest-haste-map@npm%3A29.4.3#./.yarn/patches/jest-haste-map-npm-29.4.3-19b03fcef3.patch",
"mock-fs@^5.2.0": "patch:mock-fs@npm%3A5.2.0#./.yarn/patches/mock-fs-npm-5.2.0-5103a7b507.patch"
},
"version": "1.19.0-next.0",
"version": "1.19.0-next.1",
"dependencies": {
"@backstage/errors": "workspace:^",
"@manypkg/get-packages": "^1.1.3"
+12
View File
@@ -1,5 +1,17 @@
# @backstage/app-defaults
## 1.4.4-next.1
### Patch Changes
- 1a0616fa10: Add missing resource and template app icons
- Updated dependencies
- @backstage/core-components@0.13.6-next.1
- @backstage/core-app-api@1.10.1-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/plugin-permission-react@0.4.16-next.0
- @backstage/theme@0.4.2
## 1.4.4-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/app-defaults",
"description": "Provides the default wiring of a Backstage App",
"version": "1.4.4-next.0",
"version": "1.4.4-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
@@ -1,5 +1,13 @@
# app-next-example-plugin
## 0.0.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/frontend-plugin-api@0.1.1-next.1
- @backstage/core-components@0.13.6-next.1
## 0.0.2-next.0
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "app-next-example-plugin",
"description": "Backstage internal example plugin",
"version": "0.0.2-next.0",
"version": "0.0.2-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
+77
View File
@@ -1,5 +1,82 @@
# example-app-next
## 0.0.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-org@0.6.15-next.1
- @backstage/plugin-code-coverage@0.2.18-next.1
- @backstage/plugin-catalog@1.14.0-next.1
- @backstage/plugin-techdocs@1.7.1-next.1
- @backstage/plugin-home@0.5.9-next.1
- @backstage/frontend-plugin-api@0.1.1-next.1
- @backstage/core-components@0.13.6-next.1
- @backstage/core-app-api@1.10.1-next.1
- @backstage/app-defaults@1.4.4-next.1
- @backstage/frontend-app-api@0.2.0-next.1
- @backstage/plugin-search@1.4.1-next.1
- @backstage/cli@0.23.0-next.1
- @backstage/plugin-cost-insights@0.12.14-next.1
- @backstage/plugin-kubernetes@0.11.0-next.1
- @backstage/plugin-adr@0.6.8-next.1
- @backstage/plugin-explore@0.4.11-next.1
- @backstage/plugin-search-react@1.7.1-next.1
- @backstage/plugin-api-docs@0.9.12-next.1
- @backstage/plugin-catalog-graph@0.2.37-next.1
- @backstage/plugin-scaffolder@1.15.1-next.1
- @backstage/plugin-scaffolder-react@1.5.6-next.1
- @backstage/plugin-user-settings@0.7.11-next.1
- app-next-example-plugin@0.0.2-next.1
- @backstage/plugin-graphiql@0.2.55-next.1
- @backstage/plugin-tech-radar@0.6.9-next.1
- @backstage/integration-react@1.1.20-next.1
- @backstage/plugin-airbrake@0.3.25-next.1
- @backstage/plugin-apache-airflow@0.2.16-next.1
- @backstage/plugin-azure-devops@0.3.7-next.1
- @backstage/plugin-azure-sites@0.1.14-next.1
- @backstage/plugin-badges@0.2.49-next.1
- @backstage/plugin-catalog-import@0.10.1-next.1
- @backstage/plugin-catalog-react@1.8.5-next.1
- @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.1
- @backstage/plugin-circleci@0.3.25-next.1
- @backstage/plugin-cloudbuild@0.3.25-next.1
- @backstage/plugin-devtools@0.1.5-next.1
- @backstage/plugin-dynatrace@7.0.5-next.1
- @backstage/plugin-entity-feedback@0.2.8-next.1
- @backstage/plugin-gcalendar@0.3.19-next.1
- @backstage/plugin-gcp-projects@0.3.42-next.1
- @backstage/plugin-github-actions@0.6.6-next.1
- @backstage/plugin-gocd@0.1.31-next.1
- @backstage/plugin-jenkins@0.8.7-next.1
- @backstage/plugin-kafka@0.3.25-next.1
- @backstage/plugin-lighthouse@0.4.10-next.1
- @backstage/plugin-linguist@0.1.10-next.1
- @backstage/plugin-microsoft-calendar@0.1.8-next.1
- @backstage/plugin-newrelic@0.3.41-next.1
- @backstage/plugin-newrelic-dashboard@0.2.18-next.1
- @backstage/plugin-octopus-deploy@0.2.7-next.1
- @backstage/plugin-pagerduty@0.6.6-next.1
- @backstage/plugin-playlist@0.1.17-next.1
- @backstage/plugin-puppetdb@0.1.8-next.1
- @backstage/plugin-rollbar@0.4.25-next.1
- @backstage/plugin-sentry@0.5.10-next.1
- @backstage/plugin-shortcuts@0.3.15-next.1
- @backstage/plugin-stack-overflow@0.1.21-next.1
- @backstage/plugin-stackstorm@0.1.7-next.1
- @backstage/plugin-tech-insights@0.3.17-next.1
- @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.1
- @backstage/plugin-techdocs-react@1.1.12-next.1
- @backstage/plugin-todo@0.2.28-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/plugin-permission-react@0.4.16-next.0
- @backstage/catalog-model@1.4.2
- @backstage/theme@0.4.2
- @backstage/plugin-catalog-common@1.0.16
- @backstage/plugin-linguist-common@0.1.2
- @backstage/plugin-search-common@1.2.6
## 0.0.2-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
"version": "0.0.2-next.0",
"version": "0.0.2-next.1",
"private": true,
"backstage": {
"role": "frontend"
+76
View File
@@ -1,5 +1,81 @@
# example-app
## 0.2.88-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-org@0.6.15-next.1
- @backstage/plugin-code-coverage@0.2.18-next.1
- @backstage/plugin-catalog@1.14.0-next.1
- @backstage/plugin-techdocs@1.7.1-next.1
- @backstage/plugin-home@0.5.9-next.1
- @backstage/core-components@0.13.6-next.1
- @backstage/core-app-api@1.10.1-next.1
- @backstage/app-defaults@1.4.4-next.1
- @backstage/frontend-app-api@0.2.0-next.1
- @backstage/plugin-search@1.4.1-next.1
- @backstage/cli@0.23.0-next.1
- @backstage/plugin-cost-insights@0.12.14-next.1
- @backstage/plugin-kubernetes@0.11.0-next.1
- @backstage/plugin-adr@0.6.8-next.1
- @backstage/plugin-explore@0.4.11-next.1
- @backstage/plugin-search-react@1.7.1-next.1
- @backstage/plugin-api-docs@0.9.12-next.1
- @backstage/plugin-catalog-graph@0.2.37-next.1
- @backstage/plugin-scaffolder@1.15.1-next.1
- @backstage/plugin-scaffolder-react@1.5.6-next.1
- @backstage/plugin-user-settings@0.7.11-next.1
- @backstage/plugin-graphiql@0.2.55-next.1
- @backstage/plugin-tech-radar@0.6.9-next.1
- @backstage/integration-react@1.1.20-next.1
- @backstage/plugin-airbrake@0.3.25-next.1
- @backstage/plugin-apache-airflow@0.2.16-next.1
- @backstage/plugin-azure-devops@0.3.7-next.1
- @backstage/plugin-azure-sites@0.1.14-next.1
- @backstage/plugin-badges@0.2.49-next.1
- @backstage/plugin-catalog-import@0.10.1-next.1
- @backstage/plugin-catalog-react@1.8.5-next.1
- @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.1
- @backstage/plugin-circleci@0.3.25-next.1
- @backstage/plugin-cloudbuild@0.3.25-next.1
- @backstage/plugin-devtools@0.1.5-next.1
- @backstage/plugin-dynatrace@7.0.5-next.1
- @backstage/plugin-entity-feedback@0.2.8-next.1
- @backstage/plugin-gcalendar@0.3.19-next.1
- @backstage/plugin-gcp-projects@0.3.42-next.1
- @backstage/plugin-github-actions@0.6.6-next.1
- @backstage/plugin-gocd@0.1.31-next.1
- @backstage/plugin-jenkins@0.8.7-next.1
- @backstage/plugin-kafka@0.3.25-next.1
- @backstage/plugin-lighthouse@0.4.10-next.1
- @backstage/plugin-linguist@0.1.10-next.1
- @backstage/plugin-microsoft-calendar@0.1.8-next.1
- @backstage/plugin-newrelic@0.3.41-next.1
- @backstage/plugin-newrelic-dashboard@0.2.18-next.1
- @backstage/plugin-nomad@0.1.6-next.1
- @backstage/plugin-octopus-deploy@0.2.7-next.1
- @backstage/plugin-pagerduty@0.6.6-next.1
- @backstage/plugin-playlist@0.1.17-next.1
- @backstage/plugin-puppetdb@0.1.8-next.1
- @backstage/plugin-rollbar@0.4.25-next.1
- @backstage/plugin-sentry@0.5.10-next.1
- @backstage/plugin-shortcuts@0.3.15-next.1
- @backstage/plugin-stack-overflow@0.1.21-next.1
- @backstage/plugin-stackstorm@0.1.7-next.1
- @backstage/plugin-tech-insights@0.3.17-next.1
- @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.1
- @backstage/plugin-techdocs-react@1.1.12-next.1
- @backstage/plugin-todo@0.2.28-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/plugin-permission-react@0.4.16-next.0
- @backstage/catalog-model@1.4.2
- @backstage/theme@0.4.2
- @backstage/plugin-catalog-common@1.0.16
- @backstage/plugin-linguist-common@0.1.2
- @backstage/plugin-search-common@1.2.6
## 0.2.88-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-app",
"version": "0.2.88-next.0",
"version": "0.2.88-next.1",
"private": true,
"backstage": {
"role": "frontend"
+17
View File
@@ -1,5 +1,22 @@
# @backstage/backend-app-api
## 0.5.5-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-tasks@0.5.10-next.1
- @backstage/backend-common@0.19.7-next.1
- @backstage/backend-plugin-api@0.6.5-next.1
- @backstage/plugin-auth-node@0.3.2-next.1
- @backstage/plugin-permission-node@0.7.16-next.1
- @backstage/config@1.1.0
- @backstage/cli-common@0.1.13-next.0
- @backstage/cli-node@0.1.5-next.0
- @backstage/config-loader@1.5.1-next.0
- @backstage/errors@1.2.2
- @backstage/types@1.1.1
## 0.5.5-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-app-api",
"description": "Core API used by Backstage backend apps",
"version": "0.5.5-next.0",
"version": "0.5.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+17
View File
@@ -1,5 +1,22 @@
# @backstage/backend-common
## 0.19.7-next.1
### Patch Changes
- b94f32271e: Added the ability to fetch git tags through the `Git` class. This is useful for scaffolder actions that want to take action based on tag versions in a cloned repository
- Updated dependencies
- @backstage/backend-dev-utils@0.1.2-next.0
- @backstage/backend-app-api@0.5.5-next.1
- @backstage/backend-plugin-api@0.6.5-next.1
- @backstage/config@1.1.0
- @backstage/integration-aws-node@0.1.6
- @backstage/cli-common@0.1.13-next.0
- @backstage/config-loader@1.5.1-next.0
- @backstage/errors@1.2.2
- @backstage/integration@1.7.1-next.0
- @backstage/types@1.1.1
## 0.19.7-next.0
### Patch Changes
+5 -1
View File
@@ -377,7 +377,11 @@ export class Git {
}): Promise<string | undefined>;
// (undocumented)
deleteRemote(options: { dir: string; remote: string }): Promise<void>;
fetch(options: { dir: string; remote?: string }): Promise<void>;
fetch(options: {
dir: string;
remote?: string;
tags?: boolean;
}): Promise<void>;
// (undocumented)
static fromAuth: (options: {
username?: string;
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-common",
"description": "Common functionality library for Backstage backends",
"version": "0.19.7-next.0",
"version": "0.19.7-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+3 -1
View File
@@ -264,13 +264,14 @@ describe('Git', () => {
};
const git = Git.fromAuth(auth);
await git.fetch({ remote, dir });
await git.fetch({ remote, dir, tags: true });
expect(isomorphic.fetch).toHaveBeenCalledWith({
fs,
http,
remote,
dir,
tags: true,
onProgress: expect.any(Function),
headers: {
'user-agent': 'git/@isomorphic-git',
@@ -294,6 +295,7 @@ describe('Git', () => {
http,
remote,
dir,
tags: false,
onProgress: expect.any(Function),
headers: {
Authorization: 'Bearer test',
+7 -2
View File
@@ -160,8 +160,12 @@ export class Git {
}
/** https://isomorphic-git.org/docs/en/fetch */
async fetch(options: { dir: string; remote?: string }): Promise<void> {
const { dir, remote = 'origin' } = options;
async fetch(options: {
dir: string;
remote?: string;
tags?: boolean;
}): Promise<void> {
const { dir, remote = 'origin', tags = false } = options;
this.config.logger?.info(
`Fetching remote=${remote} for repository {dir=${dir}}`,
);
@@ -172,6 +176,7 @@ export class Git {
http,
dir,
remote,
tags,
onProgress: this.onProgressHandler(),
headers: this.headers,
onAuth: this.onAuth,
+9
View File
@@ -1,5 +1,14 @@
# @backstage/backend-defaults
## 0.2.5-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.19.7-next.1
- @backstage/backend-app-api@0.5.5-next.1
- @backstage/backend-plugin-api@0.6.5-next.1
## 0.2.5-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-defaults",
"description": "Backend defaults used by Backstage backend apps",
"version": "0.2.5-next.0",
"version": "0.2.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+6
View File
@@ -1,5 +1,11 @@
# @backstage/backend-dev-utils
## 0.1.2-next.0
### Patch Changes
- afa48341fb: Fix an issue where early IPC responses would be lost.
## 0.1.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-dev-utils",
"version": "0.1.1",
"version": "0.1.2-next.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+37
View File
@@ -1,5 +1,42 @@
# example-backend-next
## 0.0.16-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-tasks@0.5.10-next.1
- @backstage/plugin-catalog-backend@1.14.0-next.1
- @backstage/plugin-scaffolder-backend@1.18.0-next.1
- @backstage/plugin-badges-backend@0.3.2-next.1
- @backstage/backend-plugin-api@0.6.5-next.1
- @backstage/plugin-lighthouse-backend@0.3.2-next.1
- @backstage/plugin-linguist-backend@0.5.2-next.1
- @backstage/plugin-search-backend-module-catalog@0.1.9-next.1
- @backstage/plugin-search-backend-module-explore@0.1.9-next.1
- @backstage/plugin-search-backend-module-techdocs@0.1.9-next.1
- @backstage/plugin-search-backend-node@1.2.9-next.1
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.1
- @backstage/plugin-kubernetes-backend@0.12.2-next.1
- @backstage/plugin-todo-backend@0.3.3-next.1
- @backstage/backend-defaults@0.2.5-next.1
- @backstage/plugin-adr-backend@0.4.2-next.1
- @backstage/plugin-app-backend@0.3.53-next.1
- @backstage/plugin-auth-node@0.3.2-next.1
- @backstage/plugin-azure-devops-backend@0.4.2-next.1
- @backstage/plugin-devtools-backend@0.2.2-next.1
- @backstage/plugin-entity-feedback-backend@0.2.2-next.1
- @backstage/plugin-permission-backend@0.5.28-next.1
- @backstage/plugin-permission-backend-module-allow-all-policy@0.1.2-next.1
- @backstage/plugin-permission-node@0.7.16-next.1
- @backstage/plugin-playlist-backend@0.3.9-next.1
- @backstage/plugin-proxy-backend@0.4.2-next.1
- @backstage/plugin-search-backend@1.4.5-next.1
- @backstage/plugin-sonarqube-backend@0.2.7-next.1
- @backstage/plugin-techdocs-backend@1.7.2-next.1
- @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.1
- @backstage/plugin-permission-common@0.7.8
## 0.0.16-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend-next",
"version": "0.0.16-next.0",
"version": "0.0.16-next.1",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
+6
View File
@@ -61,6 +61,12 @@ export function createRouter() {
}
```
## FAQs
### Why am I getting `unknown` as the type for a response?
This can happen when you have a `charset` defined in your `response.content` section. Something like `response.content[ 'application/json; charset=utf-8:']` will cause this issue.
## INTERNAL
### Limitations
+118 -57
View File
@@ -75,11 +75,18 @@ interface CookieObject extends ParameterObject {
}
// @public (undocumented)
type CookieSchema<
export type CookieParameters<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = CookieSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
// @public (undocumented)
type CookieSchema<
Doc extends RequiredDoc,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ParametersSchema<Doc, DocPath<Doc, Path>, Method, ImmutableCookieObject>;
> = ParametersSchema<Doc, Path, Method, ImmutableCookieObject>;
// @public
export function createValidatedOpenApiRouter<T extends RequiredDoc>(
@@ -99,16 +106,16 @@ type DiscriminateUnion<T, K extends keyof T, V extends T[K]> = Extract<
// @public (undocumented)
type DocOperation<
Doc extends RequiredDoc,
Path extends keyof Doc['paths'],
Path extends DocPath<Doc>,
Method extends keyof Doc['paths'][Path],
> = Doc['paths'][Path][Method];
// @public (undocumented)
type DocParameter<
Doc extends RequiredDoc,
Path extends Extract<keyof Doc['paths'], string>,
Method extends keyof Doc['paths'][Path],
Parameter extends keyof Doc['paths'][Path][Method]['parameters'],
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
Parameter extends keyof DocOperation<Doc, Path, Method>['parameters'],
> = DocOperation<
Doc,
Path,
@@ -142,32 +149,28 @@ type DocParameters<
};
// @public
type DocPath<
Doc extends PathDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
> = ValueOf<{
[Template in Extract<
keyof Doc['paths'],
string
>]: Path extends PathTemplate<Template> ? Template : never;
}>;
type DocPath<Doc extends PathDoc> = Extract<keyof Doc['paths'], string>;
// @public (undocumented)
type DocPathMethod<
Doc extends Pick<RequiredDoc, 'paths'>,
Path extends DocPathTemplate<Doc>,
> = keyof Doc['paths'][DocPath<Doc, Path>];
Path extends DocPath<Doc>,
> = keyof Doc['paths'][Path];
// @public (undocumented)
type DocPathTemplate<Doc extends PathDoc> = PathTemplate<
Extract<keyof Doc['paths'], string>
>;
type DocPathTemplate<Doc extends PathDoc> = PathTemplate<DocPath<Doc>>;
// @public (undocumented)
type DocPathTemplateMethod<
Doc extends Pick<RequiredDoc, 'paths'>,
Path extends DocPathTemplate<Doc>,
> = keyof Doc['paths'][TemplateToDocPath<Doc, Path>];
// @public
type DocRequestHandler<
Doc extends RequiredDoc,
Path extends DocPathTemplate<Doc>,
Method extends keyof Doc['paths'][Path],
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = core.RequestHandler<
PathSchema<Doc, Path, Method>,
ResponseBodyToJsonSchema<Doc, Path, Method>,
@@ -179,8 +182,8 @@ type DocRequestHandler<
// @public
type DocRequestHandlerParams<
Doc extends RequiredDoc,
Path extends DocPathTemplate<Doc>,
Method extends keyof Doc['paths'][Path],
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = core.RequestHandlerParams<
PathSchema<Doc, Path, Method>,
ResponseBodyToJsonSchema<Doc, Path, Method>,
@@ -204,14 +207,30 @@ interface DocRequestMatcher<
| 'head',
> {
// (undocumented)
<Path extends MethodAwareDocPath<Doc, DocPathTemplate<Doc>, Method>>(
<
Path extends MethodAwareDocPath<
Doc,
PathTemplate<Extract<keyof Doc['paths'], string>>,
Method
>,
>(
path: Path,
...handlers: Array<DocRequestHandler<Doc, Path, Method>>
...handlers: Array<
DocRequestHandler<Doc, TemplateToDocPath<Doc, Path>, Method>
>
): T;
// (undocumented)
<Path extends MethodAwareDocPath<Doc, DocPathTemplate<Doc>, Method>>(
<
Path extends MethodAwareDocPath<
Doc,
PathTemplate<Extract<keyof Doc['paths'], string>>,
Method
>,
>(
path: Path,
...handlers: Array<DocRequestHandlerParams<Doc, Path, Method>>
...handlers: Array<
DocRequestHandlerParams<Doc, TemplateToDocPath<Doc, Path>, Method>
>
): T;
}
@@ -238,11 +257,18 @@ interface HeaderObject extends ParameterObject {
}
// @public (undocumented)
type HeaderSchema<
export type HeaderParameters<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = HeaderSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
// @public (undocumented)
type HeaderSchema<
Doc extends RequiredDoc,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ParametersSchema<Doc, DocPath<Doc, Path>, Method, ImmutableHeaderObject>;
> = ParametersSchema<Doc, Path, Method, ImmutableHeaderObject>;
// @public
type Immutable<T> = T extends
@@ -304,10 +330,12 @@ declare namespace internal {
RequiredDoc,
PathDoc,
ValueOf,
PathTemplate,
DocPath,
PathTemplate,
TemplateToDocPath,
DocPathTemplate,
DocPathMethod,
DocPathTemplateMethod,
MethodAwareDocPath,
DocOperation,
ComponentTypes,
@@ -362,7 +390,7 @@ declare namespace internal {
RequestBody,
RequestBodySchema,
RequestBodyToJsonSchema,
Response_2 as Response,
Response_3 as Response,
ResponseSchemas,
ResponseBodyToJsonSchema,
};
@@ -394,14 +422,11 @@ type MapToSchema<
// @public (undocumented)
type MethodAwareDocPath<
Doc extends PathDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends keyof Doc['paths'][Path],
Path extends DocPathTemplate<Doc>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = ValueOf<{
[Template in Extract<
keyof Doc['paths'],
string
>]: Path extends PathTemplate<Template>
? Method extends DocPathMethod<Doc, Path>
[Template in DocPath<Doc>]: Path extends PathTemplate<Template>
? Method extends DocPathTemplateMethod<Doc, Path>
? PathTemplate<Template>
: never
: never;
@@ -466,11 +491,18 @@ interface PathObject extends ParameterObject {
}
// @public (undocumented)
type PathSchema<
export type PathParameters<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = PathSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
// @public (undocumented)
type PathSchema<
Doc extends RequiredDoc,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ParametersSchema<Doc, DocPath<Doc, Path>, Method, ImmutablePathObject>;
> = ParametersSchema<Doc, Path, Method, ImmutablePathObject>;
// @public
type PathTemplate<Path extends string> =
@@ -508,11 +540,26 @@ interface QueryObject extends ParameterObject {
}
// @public (undocumented)
type QuerySchema<
export type QueryParameters<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = QuerySchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
// @public (undocumented)
type QuerySchema<
Doc extends RequiredDoc,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ParametersSchema<Doc, DocPath<Doc, Path>, Method, ImmutableQueryObject>;
> = ParametersSchema<Doc, Path, Method, ImmutableQueryObject>;
// @public (undocumented)
type Request_2<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = RequestBodyToJsonSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
export { Request_2 as Request };
// @public (undocumented)
type RequestBody<
@@ -536,20 +583,16 @@ type RequestBody<
// @public (undocumented)
type RequestBodySchema<
Doc extends RequiredDoc,
Path extends DocPathTemplate<Doc>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = RequestBody<
Doc,
DocPath<Doc, Path>,
Method
> extends ImmutableRequestBodyObject
? ObjectWithContentSchema<Doc, RequestBody<Doc, DocPath<Doc, Path>, Method>>
> = RequestBody<Doc, Path, Method> extends ImmutableRequestBodyObject
? ObjectWithContentSchema<Doc, RequestBody<Doc, Path, Method>>
: never;
// @public
type RequestBodyToJsonSchema<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ToTypeSafe<RequestBodySchema<Doc, Path, Method>>;
@@ -568,8 +611,16 @@ type RequiredMap<
// @public (undocumented)
type Response_2<
Doc extends RequiredDoc,
Path extends keyof Doc['paths'],
Method extends keyof Doc['paths'][Path],
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = ResponseBodyToJsonSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
export { Response_2 as Response };
// @public (undocumented)
type Response_3<
Doc extends RequiredDoc,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
StatusCode extends keyof DocOperation<Doc, Path, Method>['responses'],
> = DocOperation<
Doc,
@@ -588,27 +639,27 @@ type Response_2<
// @public
type ResponseBodyToJsonSchema<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ToTypeSafe<ValueOf<ResponseSchemas<Doc, Path, Method>>>;
// @public (undocumented)
type ResponseSchemas<
Doc extends RequiredDoc,
Path extends DocPathTemplate<Doc>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = {
[StatusCode in keyof DocOperation<
Doc,
Path,
Method
>['responses']]: Response_2<
>['responses']]: Response_3<
Doc,
Path,
Method,
StatusCode
> extends ImmutableResponseObject
? ObjectWithContentSchema<Doc, Response_2<Doc, Path, Method, StatusCode>>
? ObjectWithContentSchema<Doc, Response_3<Doc, Path, Method, StatusCode>>
: never;
};
@@ -625,6 +676,16 @@ type SchemaRef<Doc extends RequiredDoc, Schema> = Schema extends {
[Key in keyof Schema]: SchemaRef<Doc, Schema[Key]>;
};
// @public
type TemplateToDocPath<
Doc extends PathDoc,
Path extends DocPathTemplate<Doc>,
> = ValueOf<{
[Template in DocPath<Doc>]: Path extends PathTemplate<Template>
? Template
: never;
}>;
// @public (undocumented)
type ToTypeSafe<T> = UnknownIfNever<ConvertAll<TuplifyUnion<T>>[number]>;
@@ -22,5 +22,13 @@
import * as internal from './types';
export { internal };
export type {
Request,
Response,
QueryParameters,
HeaderParameters,
CookieParameters,
PathParameters,
} from './utility';
export type { ApiRouter } from './router';
export { createValidatedOpenApiRouter } from './stub';
@@ -18,15 +18,23 @@ import { createValidatedOpenApiRouter } from './stub';
import express from 'express';
import request from 'supertest';
import singlePathSpec from './___fixtures__/single-path';
import { Response } from './utility';
describe('createRouter', () => {
const pet: Response<typeof singlePathSpec, '/pet/:petId', 'get'> = {
id: 1,
name: 'rover',
status: 'available',
photoUrls: [],
};
it('does NOT override originalUrl and basePath after execution', async () => {
expect.assertions(2);
const router = createValidatedOpenApiRouter(singlePathSpec);
router.get('/pet/:petId', (req, res) => {
expect(req.baseUrl).toBe('/pet-store');
expect(req.originalUrl).toBe(`/pet-store/pet/${req.params.petId}`);
res.send('');
res.status(400).send();
});
const appRouter = express();
@@ -41,7 +49,7 @@ describe('createRouter', () => {
const routerGetFn = jest.fn();
router.get('/pet/:petId', (_, res) => {
routerGetFn();
res.send('');
res.json(pet);
});
const apiRouter = express.Router();
@@ -58,7 +66,7 @@ describe('createRouter', () => {
const router = createValidatedOpenApiRouter(singlePathSpec);
router.get('/pet/:petId', (req, res) => {
expect(typeof req.params.petId).toBe('integer');
res.send('');
res.json(pet);
});
const apiRouter = express.Router();
@@ -42,6 +42,13 @@ export type PathDoc = Pick<ImmutableOpenAPIObject, 'paths'>;
*/
export type ValueOf<T> = T[keyof T];
/**
* All paths for a given doc,
* @example `/pet/{petId}` | `/pet`
* @public
*/
export type DocPath<Doc extends PathDoc> = Extract<keyof Doc['paths'], string>;
/**
* Validate a string against OpenAPI path template, {@link https://spec.openapis.org/oas/v3.1.0#path-templating-matching}.
*
@@ -74,44 +81,46 @@ export type PathTemplate<Path extends string> =
*
* @public
*/
export type DocPath<
export type TemplateToDocPath<
Doc extends PathDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPathTemplate<Doc>,
> = ValueOf<{
[Template in Extract<
keyof Doc['paths'],
string
>]: Path extends PathTemplate<Template> ? Template : never;
[Template in DocPath<Doc>]: Path extends PathTemplate<Template>
? Template
: never;
}>;
/**
* @public
*/
export type DocPathTemplate<Doc extends PathDoc> = PathTemplate<
Extract<keyof Doc['paths'], string>
>;
export type DocPathTemplate<Doc extends PathDoc> = PathTemplate<DocPath<Doc>>;
/**
* @public
*/
export type DocPathMethod<
Doc extends Pick<RequiredDoc, 'paths'>,
Path extends DocPath<Doc>,
> = keyof Doc['paths'][Path];
/**
* @public
*/
export type DocPathTemplateMethod<
Doc extends Pick<RequiredDoc, 'paths'>,
Path extends DocPathTemplate<Doc>,
> = keyof Doc['paths'][DocPath<Doc, Path>];
> = keyof Doc['paths'][TemplateToDocPath<Doc, Path>];
/**
* @public
*/
export type MethodAwareDocPath<
Doc extends PathDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends keyof Doc['paths'][Path],
Path extends DocPathTemplate<Doc>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = ValueOf<{
[Template in Extract<
keyof Doc['paths'],
string
>]: Path extends PathTemplate<Template>
? Method extends DocPathMethod<Doc, Path>
[Template in DocPath<Doc>]: Path extends PathTemplate<Template>
? Method extends DocPathTemplateMethod<Doc, Path>
? PathTemplate<Template>
: never
: never;
@@ -122,7 +131,7 @@ export type MethodAwareDocPath<
*/
export type DocOperation<
Doc extends RequiredDoc,
Path extends keyof Doc['paths'],
Path extends DocPath<Doc>,
Method extends keyof Doc['paths'][Path],
> = Doc['paths'][Path][Method];
@@ -14,7 +14,14 @@
* limitations under the License.
*/
import type core from 'express-serve-static-core';
import { DocPathTemplate, MethodAwareDocPath, RequiredDoc } from './common';
import {
DocPath,
DocPathMethod,
MethodAwareDocPath,
PathTemplate,
RequiredDoc,
TemplateToDocPath,
} from './common';
import { PathSchema, QuerySchema } from './params';
import { RequestBodyToJsonSchema } from './requests';
import { ResponseBodyToJsonSchema } from './responses';
@@ -25,8 +32,8 @@ import { ResponseBodyToJsonSchema } from './responses';
*/
export type DocRequestHandler<
Doc extends RequiredDoc,
Path extends DocPathTemplate<Doc>,
Method extends keyof Doc['paths'][Path],
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = core.RequestHandler<
PathSchema<Doc, Path, Method>,
ResponseBodyToJsonSchema<Doc, Path, Method>,
@@ -41,8 +48,8 @@ export type DocRequestHandler<
*/
export type DocRequestHandlerParams<
Doc extends RequiredDoc,
Path extends DocPathTemplate<Doc>,
Method extends keyof Doc['paths'][Path],
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = core.RequestHandlerParams<
PathSchema<Doc, Path, Method>,
ResponseBodyToJsonSchema<Doc, Path, Method>,
@@ -68,12 +75,28 @@ export interface DocRequestMatcher<
| 'options'
| 'head',
> {
<Path extends MethodAwareDocPath<Doc, DocPathTemplate<Doc>, Method>>(
<
Path extends MethodAwareDocPath<
Doc,
PathTemplate<Extract<keyof Doc['paths'], string>>,
Method
>,
>(
path: Path,
...handlers: Array<DocRequestHandler<Doc, Path, Method>>
...handlers: Array<
DocRequestHandler<Doc, TemplateToDocPath<Doc, Path>, Method>
>
): T;
<Path extends MethodAwareDocPath<Doc, DocPathTemplate<Doc>, Method>>(
<
Path extends MethodAwareDocPath<
Doc,
PathTemplate<Extract<keyof Doc['paths'], string>>,
Method
>,
>(
path: Path,
...handlers: Array<DocRequestHandlerParams<Doc, Path, Method>>
...handlers: Array<
DocRequestHandlerParams<Doc, TemplateToDocPath<Doc, Path>, Method>
>
): T;
}
@@ -32,7 +32,6 @@ import {
Filter,
FullMap,
MapDiscriminatedUnion,
PathTemplate,
RequiredDoc,
SchemaRef,
ValueOf,
@@ -44,9 +43,9 @@ import { FromSchema, JSONSchema7 } from 'json-schema-to-ts';
*/
export type DocParameter<
Doc extends RequiredDoc,
Path extends Extract<keyof Doc['paths'], string>,
Method extends keyof Doc['paths'][Path],
Parameter extends keyof Doc['paths'][Path][Method]['parameters'],
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
Parameter extends keyof DocOperation<Doc, Path, Method>['parameters'],
> = DocOperation<
Doc,
Path,
@@ -138,33 +137,33 @@ export type ParametersSchema<
*/
export type HeaderSchema<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ParametersSchema<Doc, DocPath<Doc, Path>, Method, ImmutableHeaderObject>;
> = ParametersSchema<Doc, Path, Method, ImmutableHeaderObject>;
/**
* @public
*/
export type CookieSchema<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ParametersSchema<Doc, DocPath<Doc, Path>, Method, ImmutableCookieObject>;
> = ParametersSchema<Doc, Path, Method, ImmutableCookieObject>;
/**
* @public
*/
export type PathSchema<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ParametersSchema<Doc, DocPath<Doc, Path>, Method, ImmutablePathObject>;
> = ParametersSchema<Doc, Path, Method, ImmutablePathObject>;
/**
* @public
*/
export type QuerySchema<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ParametersSchema<Doc, DocPath<Doc, Path>, Method, ImmutableQueryObject>;
> = ParametersSchema<Doc, Path, Method, ImmutableQueryObject>;
@@ -26,8 +26,6 @@ import type {
DocOperation,
DocPath,
DocPathMethod,
DocPathTemplate,
PathTemplate,
ToTypeSafe,
} from './common';
import {
@@ -61,14 +59,10 @@ export type RequestBody<
*/
export type RequestBodySchema<
Doc extends RequiredDoc,
Path extends DocPathTemplate<Doc>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = RequestBody<
Doc,
DocPath<Doc, Path>,
Method
> extends ImmutableRequestBodyObject
? ObjectWithContentSchema<Doc, RequestBody<Doc, DocPath<Doc, Path>, Method>>
> = RequestBody<Doc, Path, Method> extends ImmutableRequestBodyObject
? ObjectWithContentSchema<Doc, RequestBody<Doc, Path, Method>>
: never;
/**
@@ -77,6 +71,6 @@ export type RequestBodySchema<
*/
export type RequestBodyToJsonSchema<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ToTypeSafe<RequestBodySchema<Doc, Path, Method>>;
@@ -25,10 +25,9 @@ import type {
RequiredDoc,
DocOperation,
DocPathMethod,
DocPathTemplate,
PathTemplate,
ToTypeSafe,
ValueOf,
DocPath,
} from './common';
import { ImmutableReferenceObject, ImmutableResponseObject } from './immutable';
@@ -37,8 +36,8 @@ import { ImmutableReferenceObject, ImmutableResponseObject } from './immutable';
*/
export type Response<
Doc extends RequiredDoc,
Path extends keyof Doc['paths'],
Method extends keyof Doc['paths'][Path],
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
StatusCode extends keyof DocOperation<Doc, Path, Method>['responses'],
> = DocOperation<
Doc,
@@ -59,7 +58,7 @@ export type Response<
*/
export type ResponseSchemas<
Doc extends RequiredDoc,
Path extends DocPathTemplate<Doc>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = {
[StatusCode in keyof DocOperation<Doc, Path, Method>['responses']]: Response<
@@ -78,6 +77,6 @@ export type ResponseSchemas<
*/
export type ResponseBodyToJsonSchema<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Path extends DocPath<Doc>,
Method extends DocPathMethod<Doc, Path>,
> = ToTypeSafe<ValueOf<ResponseSchemas<Doc, Path, Method>>>;
@@ -0,0 +1,81 @@
/*
* Copyright 2023 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
CookieSchema,
DocPathTemplateMethod,
HeaderSchema,
PathSchema,
PathTemplate,
QuerySchema,
RequestBodyToJsonSchema,
RequiredDoc,
ResponseBodyToJsonSchema,
TemplateToDocPath,
} from './types';
/**
* @public
*/
export type Response<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = ResponseBodyToJsonSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
/**
* @public
*/
export type Request<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = RequestBodyToJsonSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
/**
* @public
*/
export type HeaderParameters<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = HeaderSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
/**
* @public
*/
export type CookieParameters<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = CookieSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
/**
* @public
*/
export type PathParameters<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = PathSchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
/**
* @public
*/
export type QueryParameters<
Doc extends RequiredDoc,
Path extends PathTemplate<Extract<keyof Doc['paths'], string>>,
Method extends DocPathTemplateMethod<Doc, Path>,
> = QuerySchema<Doc, TemplateToDocPath<Doc, Path>, Method>;
+11
View File
@@ -1,5 +1,16 @@
# @backstage/backend-plugin-api
## 0.6.5-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-tasks@0.5.10-next.1
- @backstage/plugin-auth-node@0.3.2-next.1
- @backstage/config@1.1.0
- @backstage/types@1.1.1
- @backstage/plugin-permission-common@0.7.8
## 0.6.5-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-plugin-api",
"description": "Core API used by Backstage backend plugins",
"version": "0.6.5-next.0",
"version": "0.6.5-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -1,5 +1,28 @@
# @backstage/backend-plugin-manager
## 0.0.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-tasks@0.5.10-next.1
- @backstage/plugin-catalog-backend@1.14.0-next.1
- @backstage/backend-common@0.19.7-next.1
- @backstage/backend-plugin-api@0.6.5-next.1
- @backstage/plugin-search-backend-node@1.2.9-next.1
- @backstage/plugin-auth-node@0.3.2-next.1
- @backstage/plugin-events-backend@0.2.14-next.1
- @backstage/plugin-permission-node@0.7.16-next.1
- @backstage/plugin-scaffolder-node@0.2.5-next.1
- @backstage/config@1.1.0
- @backstage/cli-common@0.1.13-next.0
- @backstage/cli-node@0.1.5-next.0
- @backstage/errors@1.2.2
- @backstage/types@1.1.1
- @backstage/plugin-events-node@0.2.14-next.1
- @backstage/plugin-permission-common@0.7.8
- @backstage/plugin-search-common@1.2.6
## 0.0.2-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-plugin-manager",
"description": "Backstage plugin management backend",
"version": "0.0.2-next.0",
"version": "0.0.2-next.1",
"private": true,
"main": "src/index.ts",
"types": "src/index.ts",
+18
View File
@@ -1,5 +1,23 @@
# @backstage/backend-tasks
## 0.5.10-next.1
### Patch Changes
- 5db102bfdf: Instrument `backend-tasks` with some counters and histograms for duration.
`backend_tasks.task.runs.count`: Counter with the total number of times a task has been run.
`backend_tasks.task.runs.duration`: Histogram with the run durations for each task.
Both these metrics have come with `result` `taskId` and `scope` labels for finer grained grouping.
- ddd76ac98d: Fix bug where backend tasks that are defined with HumanDuration are immediately triggered on application startup
- Updated dependencies
- @backstage/backend-common@0.19.7-next.1
- @backstage/config@1.1.0
- @backstage/errors@1.2.2
- @backstage/types@1.1.1
## 0.5.10-next.0
### Patch Changes
+2 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-tasks",
"description": "Common distributed task management library for Backstage backends",
"version": "0.5.10-next.0",
"version": "0.5.10-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
@@ -36,6 +36,7 @@
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@backstage/types": "workspace:^",
"@opentelemetry/api": "^1.3.0",
"@types/luxon": "^3.0.0",
"cron": "^2.0.0",
"knex": "^2.0.0",
@@ -28,6 +28,8 @@ import {
TaskSettingsV2,
} from './types';
import { validateId } from './util';
import { TaskFunction } from './types';
import { metrics, Counter, Histogram } from '@opentelemetry/api';
/**
* Implements the actual task management.
@@ -36,10 +38,22 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
private readonly localTasksById = new Map<string, LocalTaskWorker>();
private readonly allScheduledTasks: TaskDescriptor[] = [];
private readonly counter: Counter;
private readonly duration: Histogram;
constructor(
private readonly databaseFactory: () => Promise<Knex>,
private readonly logger: Logger,
) {}
) {
const meter = metrics.getMeter('default');
this.counter = meter.createCounter('backend_tasks.task.runs.count', {
description: 'Total number of times a task has been run',
});
this.duration = meter.createHistogram('backend_tasks.task.runs.duration', {
description: 'Histogram of task run durations',
unit: 'seconds',
});
}
async triggerTask(id: string): Promise<void> {
const localTask = this.localTasksById.get(id);
@@ -70,7 +84,7 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
const knex = await this.databaseFactory();
const worker = new TaskWorker(
task.id,
task.fn,
this.wrapInMetrics(task.fn, { labels: { taskId: task.id, scope } }),
knex,
this.logger.child({ task: task.id }),
);
@@ -78,7 +92,7 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
} else {
const worker = new LocalTaskWorker(
task.id,
task.fn,
this.wrapInMetrics(task.fn, { labels: { taskId: task.id, scope } }),
this.logger.child({ task: task.id }),
);
worker.start(settings, { signal: task.signal });
@@ -103,6 +117,33 @@ export class PluginTaskSchedulerImpl implements PluginTaskScheduler {
async getScheduledTasks(): Promise<TaskDescriptor[]> {
return this.allScheduledTasks;
}
private wrapInMetrics(
fn: TaskFunction,
opts: { labels: Record<string, string> },
): TaskFunction {
return async abort => {
const labels = {
...opts.labels,
};
this.counter.add(1, { ...labels, result: 'started' });
const startTime = process.hrtime();
try {
await fn(abort);
labels.result = 'completed';
} catch (ex) {
labels.result = 'failed';
throw ex;
} finally {
const delta = process.hrtime(startTime);
const endTime = delta[0] + delta[1] / 1e9;
this.counter.add(1, labels);
this.duration.record(endTime, labels);
}
};
}
}
export function parseDuration(
@@ -16,7 +16,7 @@
import { getVoidLogger } from '@backstage/backend-common';
import { TestDatabases } from '@backstage/backend-test-utils';
import { Duration } from 'luxon';
import { Duration, DateTime } from 'luxon';
import waitForExpect from 'wait-for-expect';
import { migrateBackendTasks } from '../database/migrateBackendTasks';
import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables';
@@ -338,7 +338,7 @@ describe('TaskWorker', () => {
);
it.each(databases.eachSupportedId())(
'next_run_start_at is always the min between schedule changes, %p',
'next_run_start_at is always the min between schedule changes from cron frequency, %p',
async databaseId => {
const knex = await databases.init(databaseId);
await migrateBackendTasks(knex);
@@ -376,4 +376,127 @@ describe('TaskWorker', () => {
await knex.destroy();
},
);
it.each(databases.eachSupportedId())(
'next_run_start_at is always the min between schedule changes when using human duration frequency, %p',
async databaseId => {
const knex = await databases.init(databaseId);
await migrateBackendTasks(knex);
const fn = jest.fn(
async () => new Promise<void>(resolve => setTimeout(resolve, 50)),
);
const initialSettings: TaskSettingsV2 = {
version: 2,
cadence: 'PT120M',
timeoutAfterDuration: 'PT1M',
};
const worker = new TaskWorker('task99', fn, knex, logger);
await worker.persistTask(initialSettings);
// replicate task running, sets next_run_start_at based on cadence
await worker.tryClaimTask('ticket', initialSettings);
await worker.tryReleaseTask('ticket', initialSettings);
// grab initial row for comparisons later
const rowAfterClaimAndRelease = (
await knex<DbTasksRow>(DB_TASKS_TABLE)
)[0];
const settings: TaskSettingsV2 = {
...initialSettings,
cadence: 'PT60M',
};
await worker.persistTask(settings);
const row1 = (await knex<DbTasksRow>(DB_TASKS_TABLE))[0];
const rowAfterClaimAndReleaseNextStartAt = DateTime.fromJSDate(
new Date(rowAfterClaimAndRelease.next_run_start_at),
);
const row1NextStartAt = DateTime.fromJSDate(
new Date(row1.next_run_start_at),
);
const now = DateTime.now();
expect(
rowAfterClaimAndReleaseNextStartAt.diff(row1NextStartAt).as('minutes'),
).toBeCloseTo(60, 1); // ensure that next start at is sooner than initial by one hour
expect(row1NextStartAt.diff(now).as('minutes')).toBeCloseTo(60, 1); // ensure that next start at is later than now by one hour
expect(
rowAfterClaimAndReleaseNextStartAt.diff(now).as('minutes'),
).toBeCloseTo(120, 1);
const settings2 = {
...settings,
};
await worker.persistTask(settings2);
const row2 = (await knex<DbTasksRow>(DB_TASKS_TABLE))[0];
expect(row2.next_run_start_at).toStrictEqual(row1.next_run_start_at);
await knex.destroy();
},
);
it.each(databases.eachSupportedId())(
'next_run_start_at is always the min between schedule changes when using human duration frequency with initial start delay, %p',
async databaseId => {
const knex = await databases.init(databaseId);
await migrateBackendTasks(knex);
const fn = jest.fn(
async () => new Promise<void>(resolve => setTimeout(resolve, 50)),
);
const initialSettings: TaskSettingsV2 = {
version: 2,
cadence: 'PT120M',
initialDelayDuration: 'PT2M',
timeoutAfterDuration: 'PT1M',
};
const worker = new TaskWorker('task99', fn, knex, logger);
await worker.persistTask(initialSettings);
// replicate task running, sets next_run_start_at based on cadence
await worker.tryClaimTask('ticket', initialSettings);
await worker.tryReleaseTask('ticket', initialSettings);
// grab initial row for comparisons later
const rowAfterClaimAndRelease = (
await knex<DbTasksRow>(DB_TASKS_TABLE)
)[0];
const settings: TaskSettingsV2 = {
...initialSettings,
cadence: 'PT60M',
};
await worker.persistTask(settings);
const row1 = (await knex<DbTasksRow>(DB_TASKS_TABLE))[0];
const rowAfterClaimAndReleaseNextStartAt = DateTime.fromJSDate(
new Date(rowAfterClaimAndRelease.next_run_start_at),
);
const row1NextStartAt = DateTime.fromJSDate(
new Date(row1.next_run_start_at),
);
const now = DateTime.now();
expect(
rowAfterClaimAndReleaseNextStartAt.diff(row1NextStartAt).as('minutes'),
).toBeCloseTo(62, 1); // ensure that next start at is sooner than initial by one hour, plus the 2 minute delay (set my tryReleaseTask)
expect(row1NextStartAt.diff(now).as('minutes')).toBeCloseTo(60, 1); // ensure that next start at is later than now by one hour (2 minute delay doesn't take effect here)
expect(
rowAfterClaimAndReleaseNextStartAt.diff(now).as('minutes'),
).toBeCloseTo(122, 1); // includes 2 minute start delay (which is persisted from tryReleaseTask)
const settings2 = {
...settings,
};
await worker.persistTask(settings2);
const row2 = (await knex<DbTasksRow>(DB_TASKS_TABLE))[0];
expect(row2.next_run_start_at).toStrictEqual(row1.next_run_start_at);
await knex.destroy();
},
);
});
+29 -20
View File
@@ -50,6 +50,7 @@ export class TaskWorker {
this.logger.info(
`Task worker starting: ${this.taskId}, ${JSON.stringify(settings)}`,
);
let attemptNum = 1;
(async () => {
for (;;) {
@@ -63,6 +64,7 @@ export class TaskWorker {
while (!options?.signal?.aborted) {
const runResult = await this.runOnce(options?.signal);
if (runResult.result === 'abort') {
break;
}
@@ -165,27 +167,26 @@ export class TaskWorker {
const isCron = !settings?.cadence.startsWith('P');
let startAt: Knex.Raw;
let startAt: Knex.Raw | undefined;
let nextStartAt: Knex.Raw | undefined;
if (settings.initialDelayDuration) {
startAt = nowPlus(
Duration.fromISO(settings.initialDelayDuration),
this.knex,
);
} else if (isCron) {
}
if (isCron) {
const time = new CronTime(settings.cadence)
.sendAt()
.minus({ seconds: 1 }) // immediately, if "* * * * * *"
.toUTC();
if (this.knex.client.config.client.includes('sqlite3')) {
startAt = this.knex.raw('datetime(?)', [time.toISO()]);
} else if (this.knex.client.config.client.includes('mysql')) {
startAt = this.knex.raw(`?`, [time.toSQL({ includeOffset: false })]);
} else {
startAt = this.knex.raw(`?`, [time.toISO()]);
}
nextStartAt = this.nextRunAtRaw(time);
startAt ||= nextStartAt;
} else {
startAt = this.knex.fn.now();
startAt ||= this.knex.fn.now();
nextStartAt = nowPlus(Duration.fromISO(settings.cadence), this.knex);
}
this.logger.debug(`task: ${this.taskId} configured to run at: ${startAt}`);
@@ -206,7 +207,12 @@ export class TaskWorker {
settings_json: settingsJson,
next_run_start_at: this.knex.raw(
`CASE WHEN ?? < ?? THEN ?? ELSE ?? END`,
[startAt, 'next_run_start_at', startAt, 'next_run_start_at'],
[
nextStartAt,
'next_run_start_at',
nextStartAt,
'next_run_start_at',
],
),
}
: {
@@ -214,9 +220,9 @@ export class TaskWorker {
next_run_start_at: this.knex.raw(
`CASE WHEN ?? < ?? THEN ?? ELSE ?? END`,
[
'excluded.next_run_start_at',
nextStartAt,
`${DB_TASKS_TABLE}.next_run_start_at`,
'excluded.next_run_start_at',
nextStartAt,
`${DB_TASKS_TABLE}.next_run_start_at`,
],
),
@@ -308,13 +314,7 @@ export class TaskWorker {
const time = new CronTime(settings.cadence).sendAt().toUTC();
this.logger.debug(`task: ${this.taskId} will next occur around ${time}`);
if (this.knex.client.config.client.includes('sqlite3')) {
nextRun = this.knex.raw('datetime(?)', [time.toISO()]);
} else if (this.knex.client.config.client.includes('mysql')) {
nextRun = this.knex.raw(`?`, [time.toSQL({ includeOffset: false })]);
} else {
nextRun = this.knex.raw(`?`, [time.toISO()]);
}
nextRun = this.nextRunAtRaw(time);
} else {
const dt = Duration.fromISO(settings.cadence).as('seconds');
this.logger.debug(
@@ -351,4 +351,13 @@ export class TaskWorker {
return rows === 1;
}
private nextRunAtRaw(time: DateTime): Knex.Raw {
if (this.knex.client.config.client.includes('sqlite3')) {
return this.knex.raw('datetime(?)', [time.toISO()]);
} else if (this.knex.client.config.client.includes('mysql')) {
return this.knex.raw(`?`, [time.toSQL({ includeOffset: false })]);
}
return this.knex.raw(`?`, [time.toISO()]);
}
}
+12
View File
@@ -1,5 +1,17 @@
# @backstage/backend-test-utils
## 0.2.6-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.19.7-next.1
- @backstage/backend-app-api@0.5.5-next.1
- @backstage/backend-plugin-api@0.6.5-next.1
- @backstage/plugin-auth-node@0.3.2-next.1
- @backstage/config@1.1.0
- @backstage/types@1.1.1
## 0.2.6-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/backend-test-utils",
"description": "Test helpers library for Backstage backends",
"version": "0.2.6-next.0",
"version": "0.2.6-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"publishConfig": {
+59
View File
@@ -1,5 +1,64 @@
# example-backend
## 0.2.88-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-tasks@0.5.10-next.1
- @backstage/plugin-catalog-backend@1.14.0-next.1
- @backstage/plugin-catalog-node@1.4.6-next.1
- @backstage/backend-common@0.19.7-next.1
- @backstage/plugin-scaffolder-backend@1.18.0-next.1
- @backstage/plugin-badges-backend@0.3.2-next.1
- @backstage/plugin-lighthouse-backend@0.3.2-next.1
- @backstage/plugin-linguist-backend@0.5.2-next.1
- @backstage/plugin-search-backend-module-catalog@0.1.9-next.1
- @backstage/plugin-search-backend-module-explore@0.1.9-next.1
- @backstage/plugin-search-backend-module-techdocs@0.1.9-next.1
- @backstage/plugin-search-backend-node@1.2.9-next.1
- @backstage/plugin-tech-insights-backend@0.5.19-next.1
- @backstage/plugin-tech-insights-node@0.4.11-next.1
- example-app@0.2.88-next.1
- @backstage/plugin-auth-backend@0.19.2-next.1
- @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.1.2-next.1
- @backstage/plugin-kubernetes-backend@0.12.2-next.1
- @backstage/plugin-todo-backend@0.3.3-next.1
- @backstage/plugin-adr-backend@0.4.2-next.1
- @backstage/plugin-app-backend@0.3.53-next.1
- @backstage/plugin-auth-node@0.3.2-next.1
- @backstage/plugin-azure-devops-backend@0.4.2-next.1
- @backstage/plugin-azure-sites-backend@0.1.15-next.1
- @backstage/plugin-code-coverage-backend@0.2.19-next.1
- @backstage/plugin-devtools-backend@0.2.2-next.1
- @backstage/plugin-entity-feedback-backend@0.2.2-next.1
- @backstage/plugin-events-backend@0.2.14-next.1
- @backstage/plugin-explore-backend@0.0.15-next.1
- @backstage/plugin-graphql-backend@0.1.43-next.1
- @backstage/plugin-jenkins-backend@0.2.8-next.1
- @backstage/plugin-kafka-backend@0.3.2-next.1
- @backstage/plugin-nomad-backend@0.1.7-next.1
- @backstage/plugin-permission-backend@0.5.28-next.1
- @backstage/plugin-permission-node@0.7.16-next.1
- @backstage/plugin-playlist-backend@0.3.9-next.1
- @backstage/plugin-proxy-backend@0.4.2-next.1
- @backstage/plugin-rollbar-backend@0.1.50-next.1
- @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.2.6-next.1
- @backstage/plugin-scaffolder-backend-module-rails@0.4.22-next.1
- @backstage/plugin-search-backend@1.4.5-next.1
- @backstage/plugin-search-backend-module-elasticsearch@1.3.8-next.1
- @backstage/plugin-search-backend-module-pg@0.5.14-next.1
- @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.37-next.1
- @backstage/plugin-techdocs-backend@1.7.2-next.1
- @backstage/config@1.1.0
- @backstage/catalog-client@1.4.4
- @backstage/catalog-model@1.4.2
- @backstage/integration@1.7.1-next.0
- @backstage/plugin-catalog-backend-module-unprocessed@0.3.2-next.1
- @backstage/plugin-events-node@0.2.14-next.1
- @backstage/plugin-permission-common@0.7.8
- @backstage/plugin-search-common@1.2.6
## 0.2.88-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "example-backend",
"version": "0.2.88-next.0",
"version": "0.2.88-next.1",
"main": "dist/index.cjs.js",
"types": "src/index.ts",
"license": "Apache-2.0",
+17
View File
@@ -1,5 +1,22 @@
# @backstage/cli
## 0.23.0-next.1
### Patch Changes
- d0f26cfa4f: Fixed an issue where the new backend start command would not gracefully shut down the backend process on Windows.
- Updated dependencies
- @backstage/config@1.1.0
- @backstage/release-manifests@0.0.10
- @backstage/catalog-model@1.4.2
- @backstage/cli-common@0.1.13-next.0
- @backstage/cli-node@0.1.5-next.0
- @backstage/config-loader@1.5.1-next.0
- @backstage/errors@1.2.2
- @backstage/eslint-plugin@0.1.3
- @backstage/integration@1.7.1-next.0
- @backstage/types@1.1.1
## 0.23.0-next.0
### Minor Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/cli",
"description": "CLI for developing Backstage plugins and apps",
"version": "0.23.0-next.0",
"version": "0.23.0-next.1",
"publishConfig": {
"access": "public"
},
+11
View File
@@ -1,5 +1,16 @@
# @backstage/core-app-api
## 1.10.1-next.1
### Patch Changes
- 1a0616fa10: Add missing resource and template app icons
- Updated dependencies
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/types@1.1.1
- @backstage/version-bridge@1.0.5
## 1.10.1-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-app-api",
"description": "Core app API used by Backstage apps",
"version": "1.10.1-next.0",
"version": "1.10.1-next.1",
"publishConfig": {
"access": "public"
},
+16
View File
@@ -1,5 +1,21 @@
# @backstage/core-components
## 0.13.6-next.1
### Patch Changes
- 4eab5cf901: The `TabbedLayout` component will now also navigate when clicking the active tab, which allows for navigation back from any sub routes.
- 997a71850c: Changed SupportButton menuitems to support text wrap
- 16126dbe6a: Change overlay header colors in the mobile menu to use navigation color from the theme
- Updated dependencies
- @backstage/plugin-catalog-react@1.8.5-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/catalog-model@1.4.2
- @backstage/errors@1.2.2
- @backstage/theme@0.4.2
- @backstage/version-bridge@1.0.5
## 0.13.6-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/core-components",
"description": "Core components used by Backstage plugins and apps",
"version": "0.13.6-next.0",
"version": "0.13.6-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
+17 -2
View File
@@ -1,5 +1,20 @@
# @backstage/create-app
## 0.5.6-next.1
### Patch Changes
- 8d2e640af4: Added missing `.eslintignore` file
To apply this change to an existing app, create a new `.eslintignore` file at the root of your project with the following content:
```diff
+ playwright.config.ts
```
- Updated dependencies
- @backstage/cli-common@0.1.13-next.0
## 0.5.6-next.0
### Patch Changes
@@ -12,9 +27,9 @@
- deed089a3d: Bump `cypress` to fix the end-to-end tests
- de42eebaaf: Bumped dev dependencies `@types/node` and `mock-fs`.
- 04a3f65e15: Bump Docker base images to `node:18-bullseye-slim` to fix compatibility issues raised during image build.
- 04a3f65e15: Bump Docker base images to `node:18-bookworm-slim` to fix node compatibility issues raised during image build.
You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bullseye-slim`
You can apply these change to your own `Dockerfile` by replacing `node:16-bullseye-slim` with `node:18-bookworm-slim`
- 5eacd5d213: The E2E test setup based on Cypress has been replaced with one based on [Playwright](https://playwright.dev/). Migrating existing apps is not required as this is a standalone setup, only do so if you also want to switch from Cypress to Playwright.
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/create-app",
"description": "A CLI that helps you create your own Backstage app",
"version": "0.5.6-next.0",
"version": "0.5.6-next.1",
"publishConfig": {
"access": "public"
},
@@ -0,0 +1 @@
playwright.config.ts
+15
View File
@@ -1,5 +1,20 @@
# @backstage/dev-utils
## 1.0.22-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.13.6-next.1
- @backstage/core-app-api@1.10.1-next.1
- @backstage/app-defaults@1.4.4-next.1
- @backstage/test-utils@1.4.4-next.1
- @backstage/integration-react@1.1.20-next.1
- @backstage/plugin-catalog-react@1.8.5-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/catalog-model@1.4.2
- @backstage/theme@0.4.2
## 1.0.22-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/dev-utils",
"description": "Utilities for developing Backstage plugins.",
"version": "1.0.22-next.0",
"version": "1.0.22-next.1",
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
+9
View File
@@ -1,5 +1,14 @@
# e2e-test
## 0.2.8-next.1
### Patch Changes
- Updated dependencies
- @backstage/create-app@0.5.6-next.1
- @backstage/cli-common@0.1.13-next.0
- @backstage/errors@1.2.2
## 0.2.8-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "e2e-test",
"description": "E2E test for verifying Backstage packages",
"version": "0.2.8-next.0",
"version": "0.2.8-next.1",
"private": true,
"backstage": {
"role": "cli"
+16
View File
@@ -1,5 +1,21 @@
# @backstage/frontend-app-api
## 0.2.0-next.1
### Patch Changes
- 52366db5b3: Make themes configurable through extensions, and switched default themes to use extensions instead.
- e5a2956dd2: Register default api implementations when creating declarative integrated apps.
- Updated dependencies
- @backstage/frontend-plugin-api@0.1.1-next.1
- @backstage/core-components@0.13.6-next.1
- @backstage/core-app-api@1.10.1-next.1
- @backstage/plugin-graphiql@0.2.55-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/theme@0.4.2
- @backstage/types@1.1.1
## 0.2.0-next.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-app-api",
"version": "0.2.0-next.0",
"version": "0.2.0-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/frontend-plugin-api
## 0.1.1-next.1
### Patch Changes
- d3a37f55c0: Add support for `SidebarGroup` on the sidebar item extension.
- 52366db5b3: Added `createThemeExtension` and `coreExtensionData.theme`.
- Updated dependencies
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/types@1.1.1
## 0.1.1-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-plugin-api",
"version": "0.1.1-next.0",
"version": "0.1.1-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/integration-react
## 1.1.20-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.13.6-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/integration@1.7.1-next.0
- @backstage/theme@0.4.2
## 1.1.20-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/integration-react",
"description": "Frontend package for managing integrations towards external systems",
"version": "1.1.20-next.0",
"version": "1.1.20-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
@@ -1,5 +1,24 @@
# techdocs-cli-embedded-app
## 0.2.87-next.1
### Patch Changes
- Updated dependencies
- @backstage/plugin-catalog@1.14.0-next.1
- @backstage/plugin-techdocs@1.7.1-next.1
- @backstage/core-components@0.13.6-next.1
- @backstage/core-app-api@1.10.1-next.1
- @backstage/app-defaults@1.4.4-next.1
- @backstage/test-utils@1.4.4-next.1
- @backstage/cli@0.23.0-next.1
- @backstage/integration-react@1.1.20-next.1
- @backstage/plugin-techdocs-react@1.1.12-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/catalog-model@1.4.2
- @backstage/theme@0.4.2
## 0.2.87-next.0
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "techdocs-cli-embedded-app",
"version": "0.2.87-next.0",
"version": "0.2.87-next.1",
"private": true,
"backstage": {
"role": "frontend"
+11
View File
@@ -1,5 +1,16 @@
# @techdocs/cli
## 1.5.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.19.7-next.1
- @backstage/plugin-techdocs-node@1.8.2-next.1
- @backstage/config@1.1.0
- @backstage/catalog-model@1.4.2
- @backstage/cli-common@0.1.13-next.0
## 1.5.2-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@techdocs/cli",
"description": "Utility CLI for managing TechDocs sites in Backstage.",
"version": "1.5.2-next.0",
"version": "1.5.2-next.1",
"publishConfig": {
"access": "public"
},
+14
View File
@@ -1,5 +1,19 @@
# @backstage/test-utils
## 1.4.4-next.1
### Patch Changes
- 1a0616fa10: Add missing resource and template app icons
- Updated dependencies
- @backstage/core-app-api@1.10.1-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/plugin-permission-react@0.4.16-next.0
- @backstage/theme@0.4.2
- @backstage/types@1.1.1
- @backstage/plugin-permission-common@0.7.8
## 1.4.4-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/test-utils",
"description": "Utilities to test Backstage plugins and apps.",
"version": "1.4.4-next.0",
"version": "1.4.4-next.1",
"publishConfig": {
"access": "public"
},
+15
View File
@@ -1,5 +1,20 @@
# @backstage/plugin-adr-backend
## 0.4.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.19.7-next.1
- @backstage/backend-plugin-api@0.6.5-next.1
- @backstage/config@1.1.0
- @backstage/catalog-client@1.4.4
- @backstage/catalog-model@1.4.2
- @backstage/errors@1.2.2
- @backstage/integration@1.7.1-next.0
- @backstage/plugin-adr-common@0.2.16-next.0
- @backstage/plugin-search-common@1.2.6
## 0.4.2-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr-backend",
"version": "0.4.2-next.0",
"version": "0.4.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+17
View File
@@ -1,5 +1,22 @@
# @backstage/plugin-adr
## 0.6.8-next.1
### Patch Changes
- 1204e7628e: Create an experimental `AdrSearchResultItemExtension` for declarative integration with Backstage; it can be accessed via the `/alpha` import.
- Updated dependencies
- @backstage/frontend-plugin-api@0.1.1-next.1
- @backstage/core-components@0.13.6-next.1
- @backstage/plugin-search-react@1.7.1-next.1
- @backstage/integration-react@1.1.20-next.1
- @backstage/plugin-catalog-react@1.8.5-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/catalog-model@1.4.2
- @backstage/theme@0.4.2
- @backstage/plugin-adr-common@0.2.16-next.0
- @backstage/plugin-search-common@1.2.6
## 0.6.8-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-adr",
"version": "0.6.8-next.0",
"version": "0.6.8-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+9
View File
@@ -1,5 +1,14 @@
# @backstage/plugin-airbrake-backend
## 0.3.2-next.1
### Patch Changes
- Updated dependencies
- @backstage/backend-common@0.19.7-next.1
- @backstage/backend-plugin-api@0.6.5-next.1
- @backstage/config@1.1.0
## 0.3.2-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake-backend",
"version": "0.3.2-next.0",
"version": "0.3.2-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+13
View File
@@ -1,5 +1,18 @@
# @backstage/plugin-airbrake
## 0.3.25-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.13.6-next.1
- @backstage/test-utils@1.4.4-next.1
- @backstage/dev-utils@1.0.22-next.1
- @backstage/plugin-catalog-react@1.8.5-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/catalog-model@1.4.2
- @backstage/theme@0.4.2
## 0.3.25-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-airbrake",
"version": "0.3.25-next.0",
"version": "0.3.25-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+11
View File
@@ -1,5 +1,16 @@
# @backstage/plugin-allure
## 0.1.41-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.13.6-next.1
- @backstage/plugin-catalog-react@1.8.5-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/catalog-model@1.4.2
- @backstage/theme@0.4.2
## 0.1.41-next.0
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@backstage/plugin-allure",
"description": "A Backstage plugin that integrates with Allure",
"version": "0.1.41-next.0",
"version": "0.1.41-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
+10
View File
@@ -1,5 +1,15 @@
# @backstage/plugin-analytics-module-ga
## 0.1.34-next.1
### Patch Changes
- Updated dependencies
- @backstage/core-components@0.13.6-next.1
- @backstage/core-plugin-api@1.7.0-next.0
- @backstage/config@1.1.0
- @backstage/theme@0.4.2
## 0.1.34-next.0
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@backstage/plugin-analytics-module-ga",
"version": "0.1.34-next.0",
"version": "0.1.34-next.1",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",

Some files were not shown because too many files have changed in this diff Show More