Merge branch 'backstage:master' into feature/support-aoss
This commit is contained in:
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend': minor
|
||||
---
|
||||
|
||||
Display meaningful error to the output if Gitlab namespace not found inside `publish:gitlab`.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/backend-tasks': patch
|
||||
---
|
||||
|
||||
Fix bug where backend tasks that are defined with HumanDuration are immediately triggered on application startup
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-catalog-backend-module-github': patch
|
||||
---
|
||||
|
||||
Make `defaultUserTransformer` resolve to `UserEntity` instead of `Entity`
|
||||
+35
-1
@@ -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"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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,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`
|
||||
|
||||
@@ -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
|
||||
```
|
||||
@@ -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:
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [18.x, 20.x]
|
||||
node-version: [18.x]
|
||||
|
||||
services:
|
||||
postgres13:
|
||||
|
||||
+1
-1
@@ -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! |
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "example-app-next",
|
||||
"version": "0.0.2-next.0",
|
||||
"version": "0.0.2-next.1",
|
||||
"private": true,
|
||||
"backstage": {
|
||||
"role": "frontend"
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "example-app",
|
||||
"version": "0.2.88-next.0",
|
||||
"version": "0.2.88-next.1",
|
||||
"private": true,
|
||||
"backstage": {
|
||||
"role": "frontend"
|
||||
|
||||
@@ -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,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": {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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": {
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,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": {
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>;
|
||||
@@ -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,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,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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
@@ -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()]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,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": {
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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"
|
||||
},
|
||||
|
||||
@@ -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,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"
|
||||
},
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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,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"
|
||||
},
|
||||
|
||||
@@ -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,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"
|
||||
},
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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,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
Reference in New Issue
Block a user