Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Clare Liguori
2022-12-07 08:15:18 -08:00
28 changed files with 1048 additions and 989 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
Fix dependency ordering in templated packages.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/create-app': patch
---
added default project name for CI job compatibility
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli': patch
---
Removed the unused dependency on `@sucrase/jest-plugin`.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-app-api': patch
---
Fix for the automatic rewriting of base URLs.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-airbrake': patch
---
Remove the `object-hash` dependency
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-components': patch
---
Internal refactor to remove deprecated symbols.
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/core-app-api': patch
---
Made `WebStorage` notify its subscribers when `localStorage` values change in other tabs/windows
+175 -193
View File
@@ -1360,13 +1360,13 @@ __metadata:
languageName: node
linkType: hard
"accepts@npm:~1.3.7":
version: 1.3.7
resolution: "accepts@npm:1.3.7"
"accepts@npm:~1.3.8":
version: 1.3.8
resolution: "accepts@npm:1.3.8"
dependencies:
mime-types: ~2.1.24
negotiator: 0.6.2
checksum: 27fc8060ffc69481ff6719cd3ee06387d2b88381cb0ce626f087781bbd02201a645a9febc8e7e7333558354b33b1d2f922ad13560be4ec1b7ba9e76fc1c1241d
mime-types: ~2.1.34
negotiator: 0.6.3
checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4
languageName: node
linkType: hard
@@ -1906,21 +1906,23 @@ __metadata:
languageName: node
linkType: hard
"body-parser@npm:1.19.0":
version: 1.19.0
resolution: "body-parser@npm:1.19.0"
"body-parser@npm:1.20.1":
version: 1.20.1
resolution: "body-parser@npm:1.20.1"
dependencies:
bytes: 3.1.0
bytes: 3.1.2
content-type: ~1.0.4
debug: 2.6.9
depd: ~1.1.2
http-errors: 1.7.2
depd: 2.0.0
destroy: 1.2.0
http-errors: 2.0.0
iconv-lite: 0.4.24
on-finished: ~2.3.0
qs: 6.7.0
raw-body: 2.4.0
type-is: ~1.6.17
checksum: 490231b4c89bbd43112762f7ba8e5342c174a6c9f64284a3b0fcabf63277e332f8316765596f1e5b15e4f3a6cf0422e005f4bb3149ed3a224bb025b7a36b9ac1
on-finished: 2.4.1
qs: 6.11.0
raw-body: 2.5.1
type-is: ~1.6.18
unpipe: 1.0.0
checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266
languageName: node
linkType: hard
@@ -2063,10 +2065,10 @@ __metadata:
languageName: node
linkType: hard
"bytes@npm:3.1.0":
version: 3.1.0
resolution: "bytes@npm:3.1.0"
checksum: 7c3b21c5d9d44ed455460d5d36a31abc6fa2ce3807964ba60a4b03fd44454c8cf07bb0585af83bfde1c5cc2ea4bbe5897bc3d18cd15e0acf25a3615a35aba2df
"bytes@npm:3.1.2":
version: 3.1.2
resolution: "bytes@npm:3.1.2"
checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e
languageName: node
linkType: hard
@@ -2566,12 +2568,12 @@ __metadata:
languageName: node
linkType: hard
"content-disposition@npm:0.5.3, content-disposition@npm:^0.5.2":
version: 0.5.3
resolution: "content-disposition@npm:0.5.3"
"content-disposition@npm:0.5.4, content-disposition@npm:^0.5.2":
version: 0.5.4
resolution: "content-disposition@npm:0.5.4"
dependencies:
safe-buffer: 5.1.2
checksum: 95bf164c0b0b8199d3f44b7631e51b37f683c6a90b9baa4315bd3d405a6d1bc81b7346f0981046aa004331fb3d7a28b629514d01fc209a5251573fc7e4d33380
safe-buffer: 5.2.1
checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3
languageName: node
linkType: hard
@@ -2605,10 +2607,10 @@ __metadata:
languageName: node
linkType: hard
"cookie@npm:0.4.0":
version: 0.4.0
resolution: "cookie@npm:0.4.0"
checksum: 760384ba0aef329c52523747e36a452b5e51bc49b34160363a6934e7b7df3f93fcc88b35e33450361535d40a92a96412da870e1816aba9aa6cc556a9fedd8492
"cookie@npm:0.5.0":
version: 0.5.0
resolution: "cookie@npm:0.5.0"
checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180
languageName: node
linkType: hard
@@ -3076,17 +3078,24 @@ __metadata:
languageName: node
linkType: hard
"depd@npm:^1.1.2, depd@npm:~1.1.2":
"depd@npm:2.0.0":
version: 2.0.0
resolution: "depd@npm:2.0.0"
checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a
languageName: node
linkType: hard
"depd@npm:^1.1.2":
version: 1.1.2
resolution: "depd@npm:1.1.2"
checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9
languageName: node
linkType: hard
"destroy@npm:~1.0.4":
version: 1.0.4
resolution: "destroy@npm:1.0.4"
checksum: da9ab4961dc61677c709da0c25ef01733042614453924d65636a7db37308fef8a24cd1e07172e61173d471ca175371295fbc984b0af5b2b4ff47cd57bd784c03
"destroy@npm:1.2.0":
version: 1.2.0
resolution: "destroy@npm:1.2.0"
checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38
languageName: node
linkType: hard
@@ -3611,40 +3620,41 @@ __metadata:
linkType: hard
"express@npm:^4.17.1":
version: 4.17.1
resolution: "express@npm:4.17.1"
version: 4.18.2
resolution: "express@npm:4.18.2"
dependencies:
accepts: ~1.3.7
accepts: ~1.3.8
array-flatten: 1.1.1
body-parser: 1.19.0
content-disposition: 0.5.3
body-parser: 1.20.1
content-disposition: 0.5.4
content-type: ~1.0.4
cookie: 0.4.0
cookie: 0.5.0
cookie-signature: 1.0.6
debug: 2.6.9
depd: ~1.1.2
depd: 2.0.0
encodeurl: ~1.0.2
escape-html: ~1.0.3
etag: ~1.8.1
finalhandler: ~1.1.2
finalhandler: 1.2.0
fresh: 0.5.2
http-errors: 2.0.0
merge-descriptors: 1.0.1
methods: ~1.1.2
on-finished: ~2.3.0
on-finished: 2.4.1
parseurl: ~1.3.3
path-to-regexp: 0.1.7
proxy-addr: ~2.0.5
qs: 6.7.0
proxy-addr: ~2.0.7
qs: 6.11.0
range-parser: ~1.2.1
safe-buffer: 5.1.2
send: 0.17.1
serve-static: 1.14.1
setprototypeof: 1.1.1
statuses: ~1.5.0
safe-buffer: 5.2.1
send: 0.18.0
serve-static: 1.15.0
setprototypeof: 1.2.0
statuses: 2.0.1
type-is: ~1.6.18
utils-merge: 1.0.1
vary: ~1.1.2
checksum: d964e9e17af331ea6fa2f84999b063bc47189dd71b4a735df83f9126d3bb2b92e830f1cb1d7c2742530eb625e2689d7a9a9c71f0c3cc4dd6015c3cd32a01abd5
checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037
languageName: node
linkType: hard
@@ -3916,18 +3926,18 @@ __metadata:
languageName: node
linkType: hard
"finalhandler@npm:~1.1.2":
version: 1.1.2
resolution: "finalhandler@npm:1.1.2"
"finalhandler@npm:1.2.0":
version: 1.2.0
resolution: "finalhandler@npm:1.2.0"
dependencies:
debug: 2.6.9
encodeurl: ~1.0.2
escape-html: ~1.0.3
on-finished: ~2.3.0
on-finished: 2.4.1
parseurl: ~1.3.3
statuses: ~1.5.0
statuses: 2.0.1
unpipe: ~1.0.0
checksum: 617880460c5138dd7ccfd555cb5dde4d8f170f4b31b8bd51e4b646bb2946c30f7db716428a1f2882d730d2b72afb47d1f67cc487b874cb15426f95753a88965e
checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716
languageName: node
linkType: hard
@@ -4020,10 +4030,10 @@ __metadata:
languageName: node
linkType: hard
"forwarded@npm:~0.1.2":
version: 0.1.2
resolution: "forwarded@npm:0.1.2"
checksum: 54695c574292f9bc6bfa52111844337bc2e61cfcc5ec82f16b816d721a67a0c76b4849a34b57e38e51d64ddbb81aef974f393579f610ed1b990470e75abad2e0
"forwarded@npm:0.2.0":
version: 0.2.0
resolution: "forwarded@npm:0.2.0"
checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6
languageName: node
linkType: hard
@@ -4148,14 +4158,14 @@ __metadata:
languageName: node
linkType: hard
"get-intrinsic@npm:^1.0.0":
version: 1.0.2
resolution: "get-intrinsic@npm:1.0.2"
"get-intrinsic@npm:^1.0.0, get-intrinsic@npm:^1.0.2":
version: 1.1.3
resolution: "get-intrinsic@npm:1.1.3"
dependencies:
function-bind: ^1.1.1
has: ^1.0.3
has-symbols: ^1.0.1
checksum: bed41c7426212d79982c23e9dddb7de2b6b05ca35e94e653edfed06188381ed4eae0e04adf7f4d3ea1f47f1c345b255405e8c44b1167185537a506eff5c519c8
has-symbols: ^1.0.3
checksum: 152d79e87251d536cf880ba75cfc3d6c6c50e12b3a64e1ea960e73a3752b47c69f46034456eae1b0894359ce3bc64c55c186f2811f8a788b75b638b06fab228a
languageName: node
linkType: hard
@@ -4486,10 +4496,10 @@ __metadata:
languageName: node
linkType: hard
"has-symbols@npm:^1.0.1":
version: 1.0.1
resolution: "has-symbols@npm:1.0.1"
checksum: 4f09be6682f9fc29855ded1101ad2a0f5d559d7d9ed68f7b68be1ea213c23991216d08d6585bf3ff6fded6f526cc506bda528d276f083602b55d232f132cfa27
"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.3":
version: 1.0.3
resolution: "has-symbols@npm:1.0.3"
checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410
languageName: node
linkType: hard
@@ -4627,29 +4637,16 @@ __metadata:
languageName: node
linkType: hard
"http-errors@npm:1.7.2":
version: 1.7.2
resolution: "http-errors@npm:1.7.2"
"http-errors@npm:2.0.0":
version: 2.0.0
resolution: "http-errors@npm:2.0.0"
dependencies:
depd: ~1.1.2
inherits: 2.0.3
setprototypeof: 1.1.1
statuses: ">= 1.5.0 < 2"
toidentifier: 1.0.0
checksum: 5534b0ae08e77f5a45a2380f500e781f6580c4ff75b816cb1f09f99a290b57e78a518be6d866db1b48cca6b052c09da2c75fc91fb16a2fe3da3c44d9acbb9972
languageName: node
linkType: hard
"http-errors@npm:~1.7.2":
version: 1.7.3
resolution: "http-errors@npm:1.7.3"
dependencies:
depd: ~1.1.2
depd: 2.0.0
inherits: 2.0.4
setprototypeof: 1.1.1
statuses: ">= 1.5.0 < 2"
toidentifier: 1.0.0
checksum: a59f359473f4b3ea78305beee90d186268d6075432622a46fb7483059068a2dd4c854a20ac8cd438883127e06afb78c1309168bde6cdfeed1e3700eb42487d99
setprototypeof: 1.2.0
statuses: 2.0.1
toidentifier: 1.0.1
checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920
languageName: node
linkType: hard
@@ -4868,13 +4865,6 @@ __metadata:
languageName: node
linkType: hard
"inherits@npm:2.0.3":
version: 2.0.3
resolution: "inherits@npm:2.0.3"
checksum: 78cb8d7d850d20a5e9a7f3620db31483aa00ad5f722ce03a55b110e5a723539b3716a3b463e2b96ce3fe286f33afc7c131fa2f91407528ba80cea98a7545d4c0
languageName: node
linkType: hard
"ini@npm:^1.3.4, ini@npm:^1.3.5":
version: 1.3.8
resolution: "ini@npm:1.3.8"
@@ -6109,19 +6099,19 @@ __metadata:
languageName: node
linkType: hard
"mime-db@npm:1.45.0, mime-db@npm:^1.28.0":
version: 1.45.0
resolution: "mime-db@npm:1.45.0"
checksum: 00aa67af7a2014c12380bec57b3efe988e45c51979acca792633e2ba4d45c601b4160ceaf9666e2b8fa6822f5cb81e12206f9921d1bc3d78226aee813d4244fd
"mime-db@npm:1.52.0, mime-db@npm:^1.28.0":
version: 1.52.0
resolution: "mime-db@npm:1.52.0"
checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f
languageName: node
linkType: hard
"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24":
version: 2.1.28
resolution: "mime-types@npm:2.1.28"
"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34":
version: 2.1.35
resolution: "mime-types@npm:2.1.35"
dependencies:
mime-db: 1.45.0
checksum: ea59cb885b5234cd7fcc2c8de1eff8543cf057be7daaf804a1b9b2cc6930c8dbcdc5e86b9732827a794d5282baa6f45ef93bc50eaba93839b9174cc6d36c9702
mime-db: 1.52.0
checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836
languageName: node
linkType: hard
@@ -6289,13 +6279,6 @@ __metadata:
languageName: node
linkType: hard
"ms@npm:2.1.1":
version: 2.1.1
resolution: "ms@npm:2.1.1"
checksum: 0078a23cd916a9a7435c413caa14c57d4b4f6e2470e0ab554b6964163c8a4436448ac7ae020e883685475da6b6796cc396b670f579cb275db288a21e3e57721e
languageName: node
linkType: hard
"ms@npm:2.1.2":
version: 2.1.2
resolution: "ms@npm:2.1.2"
@@ -6303,7 +6286,7 @@ __metadata:
languageName: node
linkType: hard
"ms@npm:^2.0.0, ms@npm:^2.1.1":
"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1":
version: 2.1.3
resolution: "ms@npm:2.1.3"
checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
@@ -6345,14 +6328,7 @@ __metadata:
languageName: node
linkType: hard
"negotiator@npm:0.6.2":
version: 0.6.2
resolution: "negotiator@npm:0.6.2"
checksum: dfddaff6c06792f1c4c3809e29a427b8daef8cd437c83b08dd51d7ee11bbd1c29d9512d66b801144d6c98e910ffd8723f2432e0cbf8b18d41d2a09599c975ab3
languageName: node
linkType: hard
"negotiator@npm:^0.6.3":
"negotiator@npm:0.6.3, negotiator@npm:^0.6.3":
version: 0.6.3
resolution: "negotiator@npm:0.6.3"
checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9
@@ -6536,10 +6512,10 @@ __metadata:
languageName: node
linkType: hard
"object-inspect@npm:^1.8.0":
version: 1.9.0
resolution: "object-inspect@npm:1.9.0"
checksum: 715d2ef5beebfecd5c6d5b29dd370b11bb37d46284d4c1e38463c1ab5dd182cb9d1b543b3f0ea682c84a1883863ea2fe6e6b7599a65a6ab043545189b06e8800
"object-inspect@npm:^1.8.0, object-inspect@npm:^1.9.0":
version: 1.12.2
resolution: "object-inspect@npm:1.12.2"
checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2
languageName: node
linkType: hard
@@ -6603,12 +6579,12 @@ __metadata:
languageName: node
linkType: hard
"on-finished@npm:~2.3.0":
version: 2.3.0
resolution: "on-finished@npm:2.3.0"
"on-finished@npm:2.4.1":
version: 2.4.1
resolution: "on-finished@npm:2.4.1"
dependencies:
ee-first: 1.1.1
checksum: 1db595bd963b0124d6fa261d18320422407b8f01dc65863840f3ddaaf7bcad5b28ff6847286703ca53f4ec19595bd67a2f1253db79fc4094911ec6aa8df1671b
checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0
languageName: node
linkType: hard
@@ -7450,13 +7426,13 @@ __metadata:
languageName: node
linkType: hard
"proxy-addr@npm:~2.0.5":
version: 2.0.6
resolution: "proxy-addr@npm:2.0.6"
"proxy-addr@npm:~2.0.7":
version: 2.0.7
resolution: "proxy-addr@npm:2.0.7"
dependencies:
forwarded: ~0.1.2
forwarded: 0.2.0
ipaddr.js: 1.9.1
checksum: 2bad9b7a56b847faf606a19328aaaf5fca3e561ebb4e933969a580d94a20f77e74fb21196028a6e417851b3d9d95a0c704732a3362e3ef515d45d96859ac7eb9
checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74
languageName: node
linkType: hard
@@ -7498,24 +7474,19 @@ __metadata:
languageName: node
linkType: hard
"qs@npm:6.7.0":
version: 6.7.0
resolution: "qs@npm:6.7.0"
checksum: dfd5f6adef50e36e908cfa70a6233871b5afe66fbaca37ecc1da352ba29eb2151a3797991948f158bb37fccde51bd57845cb619a8035287bfc24e4591172c347
languageName: node
linkType: hard
"qs@npm:^6.4.0":
version: 6.9.4
resolution: "qs@npm:6.9.4"
checksum: 5ac0bd145f32d346d20c2fdcf19c8e548c5916458851e32527efb25be0c2cff8a3a81140c145c98a1184779b5b625c91bc7c50e147073bffb978fb7f4a9c8c8a
"qs@npm:6.11.0, qs@npm:^6.4.0":
version: 6.11.0
resolution: "qs@npm:6.11.0"
dependencies:
side-channel: ^1.0.4
checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297
languageName: node
linkType: hard
"qs@npm:~6.5.2":
version: 6.5.2
resolution: "qs@npm:6.5.2"
checksum: 24af7b9928ba2141233fba2912876ff100403dba1b08b20c3b490da9ea6c636760445ea2211a079e7dfa882a5cf8f738337b3748c8bdd0f93358fa8881d2db8f
version: 6.5.3
resolution: "qs@npm:6.5.3"
checksum: 6f20bf08cabd90c458e50855559539a28d00b2f2e7dddcb66082b16a43188418cb3cb77cbd09268bcef6022935650f0534357b8af9eeb29bf0f27ccb17655692
languageName: node
linkType: hard
@@ -7555,15 +7526,15 @@ __metadata:
languageName: node
linkType: hard
"raw-body@npm:2.4.0":
version: 2.4.0
resolution: "raw-body@npm:2.4.0"
"raw-body@npm:2.5.1":
version: 2.5.1
resolution: "raw-body@npm:2.5.1"
dependencies:
bytes: 3.1.0
http-errors: 1.7.2
bytes: 3.1.2
http-errors: 2.0.0
iconv-lite: 0.4.24
unpipe: 1.0.0
checksum: 6343906939e018c6e633a34a938a5d6d1e93ffcfa48646e00207d53b418e941953b521473950c079347220944dc75ba10e7b3c08bf97e3ac72c7624882db09bb
checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e
languageName: node
linkType: hard
@@ -8030,20 +8001,20 @@ __metadata:
languageName: node
linkType: hard
"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1":
version: 5.1.2
resolution: "safe-buffer@npm:5.1.2"
checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c
languageName: node
linkType: hard
"safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0":
"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0":
version: 5.2.1
resolution: "safe-buffer@npm:5.2.1"
checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491
languageName: node
linkType: hard
"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1":
version: 5.1.2
resolution: "safe-buffer@npm:5.1.2"
checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c
languageName: node
linkType: hard
"safe-json-parse@npm:~1.0.1":
version: 1.0.1
resolution: "safe-json-parse@npm:1.0.1"
@@ -8141,36 +8112,36 @@ __metadata:
languageName: node
linkType: hard
"send@npm:0.17.1":
version: 0.17.1
resolution: "send@npm:0.17.1"
"send@npm:0.18.0":
version: 0.18.0
resolution: "send@npm:0.18.0"
dependencies:
debug: 2.6.9
depd: ~1.1.2
destroy: ~1.0.4
depd: 2.0.0
destroy: 1.2.0
encodeurl: ~1.0.2
escape-html: ~1.0.3
etag: ~1.8.1
fresh: 0.5.2
http-errors: ~1.7.2
http-errors: 2.0.0
mime: 1.6.0
ms: 2.1.1
on-finished: ~2.3.0
ms: 2.1.3
on-finished: 2.4.1
range-parser: ~1.2.1
statuses: ~1.5.0
checksum: d214c2fa42e7fae3f8fc1aa3931eeb3e6b78c2cf141574e09dbe159915c1e3a337269fc6b7512e7dfddcd7d6ff5974cb62f7c3637ba86a55bde20a92c18bdca0
statuses: 2.0.1
checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8
languageName: node
linkType: hard
"serve-static@npm:1.14.1":
version: 1.14.1
resolution: "serve-static@npm:1.14.1"
"serve-static@npm:1.15.0":
version: 1.15.0
resolution: "serve-static@npm:1.15.0"
dependencies:
encodeurl: ~1.0.2
escape-html: ~1.0.3
parseurl: ~1.3.3
send: 0.17.1
checksum: c6b268e8486d39ecd54b86c7f2d0ee4a38cd7514ddd9c92c8d5793bb005afde5e908b12395898ae206782306ccc848193d93daa15b86afb3cbe5a8414806abe8
send: 0.18.0
checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d
languageName: node
linkType: hard
@@ -8202,10 +8173,10 @@ __metadata:
languageName: node
linkType: hard
"setprototypeof@npm:1.1.1":
version: 1.1.1
resolution: "setprototypeof@npm:1.1.1"
checksum: a8bee29c1c64c245d460ce53f7460af8cbd0aceac68d66e5215153992cc8b3a7a123416353e0c642060e85cc5fd4241c92d1190eec97eda0dcb97436e8fcca3b
"setprototypeof@npm:1.2.0":
version: 1.2.0
resolution: "setprototypeof@npm:1.2.0"
checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89
languageName: node
linkType: hard
@@ -8245,6 +8216,17 @@ __metadata:
languageName: node
linkType: hard
"side-channel@npm:^1.0.4":
version: 1.0.4
resolution: "side-channel@npm:1.0.4"
dependencies:
call-bind: ^1.0.0
get-intrinsic: ^1.0.2
object-inspect: ^1.9.0
checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245
languageName: node
linkType: hard
"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"
@@ -8537,10 +8519,10 @@ __metadata:
languageName: node
linkType: hard
"statuses@npm:>= 1.5.0 < 2, statuses@npm:~1.5.0":
version: 1.5.0
resolution: "statuses@npm:1.5.0"
checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c
"statuses@npm:2.0.1":
version: 2.0.1
resolution: "statuses@npm:2.0.1"
checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb
languageName: node
linkType: hard
@@ -8947,10 +8929,10 @@ __metadata:
languageName: node
linkType: hard
"toidentifier@npm:1.0.0":
version: 1.0.0
resolution: "toidentifier@npm:1.0.0"
checksum: 199e6bfca1531d49b3506cff02353d53ec987c9ee10ee272ca6484ed97f1fc10fb77c6c009079ca16d5c5be4a10378178c3cacdb41ce9ec954c3297c74c6053e
"toidentifier@npm:1.0.1":
version: 1.0.1
resolution: "toidentifier@npm:1.0.1"
checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45
languageName: node
linkType: hard
@@ -9041,7 +9023,7 @@ __metadata:
languageName: node
linkType: hard
"type-is@npm:~1.6.17, type-is@npm:~1.6.18":
"type-is@npm:~1.6.18":
version: 1.6.18
resolution: "type-is@npm:1.6.18"
dependencies:
@@ -17,7 +17,6 @@
const { createHash } = require('crypto');
const { transform } = require('sucrase');
const sucrasePkg = require('sucrase/package.json');
const sucrasePluginPkg = require('@sucrase/jest-plugin/package.json');
const ESM_REGEX = /\b(?:import|export)\b/;
@@ -70,15 +69,12 @@ function createTransformer(config) {
return { code: source };
};
// TODO: contribute something like this to @sucrase/jest-plugin
const getCacheKey = sourceText => {
return createHash('md5')
.update(sourceText)
.update(Buffer.alloc(1))
.update(sucrasePkg.version)
.update(Buffer.alloc(1))
.update(sucrasePluginPkg.version)
.update(Buffer.alloc(1))
.update(JSON.stringify(config))
.update(Buffer.alloc(1))
.update('1') // increment whenever the transform logic in this file changes
-1
View File
@@ -46,7 +46,6 @@
"@spotify/eslint-config-base": "^14.0.0",
"@spotify/eslint-config-react": "^14.0.0",
"@spotify/eslint-config-typescript": "^14.0.0",
"@sucrase/jest-plugin": "^2.1.1",
"@sucrase/webpack-loader": "^2.0.0",
"@svgr/plugin-jsx": "6.5.x",
"@svgr/plugin-svgo": "6.5.x",
@@ -35,6 +35,8 @@ export class WebStorage implements StorageApi {
private readonly errorApi: ErrorApi,
) {}
private static hasSubscribed = false;
static create(options: {
errorApi: ErrorApi;
namespace?: string;
@@ -42,6 +44,16 @@ export class WebStorage implements StorageApi {
return new WebStorage(options.namespace ?? '', options.errorApi);
}
private static addStorageEventListener() {
window.addEventListener('storage', event => {
for (const [bucketPath, webStorage] of buckets.entries()) {
if (event.key?.startsWith(bucketPath)) {
webStorage.handleStorageChange(event.key);
}
}
});
}
get<T>(key: string): T | undefined {
return this.snapshot(key).value as T | undefined;
}
@@ -89,9 +101,19 @@ export class WebStorage implements StorageApi {
observe$<T extends JsonValue>(
key: string,
): Observable<StorageValueSnapshot<T>> {
if (!WebStorage.hasSubscribed) {
WebStorage.addStorageEventListener();
WebStorage.hasSubscribed = true;
}
return this.observable.filter(({ key: messageKey }) => messageKey === key);
}
private handleStorageChange(eventKey: StorageEvent['key']) {
if (!eventKey?.startsWith(this.namespace)) return;
const key = eventKey?.replace(`${this.namespace}/`, '');
this.notifyChanges(key);
}
private getKeyName(key: string) {
return `${this.namespace}/${encodeURIComponent(key)}`;
}
@@ -624,21 +624,18 @@ describe('Integration Test', () => {
describe('relative url resolvers', () => {
it.each([
[
[document.location.href, document.location.href],
['http://localhost', 'http://localhost'],
{
backend: {
baseUrl: 'http://localhost:8008/',
baseUrl: 'http://localhost:8008',
},
app: {
baseUrl: 'http://localhost:8008/',
baseUrl: 'http://localhost:8008',
},
},
],
[
[
`${document.location.origin}/backstage`,
`${document.location.origin}/backstage`,
],
['http://localhost/backstage', 'http://localhost/backstage'],
{
backend: {
baseUrl: 'http://test.com/backstage',
@@ -650,8 +647,8 @@ describe('Integration Test', () => {
],
[
[
`${document.location.origin}/backstage/instance`,
`${document.location.origin}/backstage/instance`,
'http://localhost/backstage/instance',
'http://localhost/backstage/instance',
],
{
backend: {
@@ -664,8 +661,8 @@ describe('Integration Test', () => {
],
[
[
`${document.location.origin}/backstage/instance`,
`http://test.com/backstage/instance`,
'http://localhost/backstage/instance',
'http://test.com/backstage/instance',
],
{
backend: {
+9 -7
View File
@@ -179,7 +179,7 @@ function useConfigLoader(
return new URL(
fullUrl.replace(getOrigin(fullUrl), ''),
document.location.origin,
).href;
).href.replace(/\/$/, '');
};
/**
@@ -199,15 +199,17 @@ function useConfigLoader(
const backendOrigin = getOrigin(backendBaseUrl);
if (appOrigin === backendOrigin) {
relativeResolverConfig.data.backend = {
baseUrl: overrideOrigin(backendBaseUrl),
};
const newBackendBaseUrl = overrideOrigin(backendBaseUrl);
if (backendBaseUrl !== newBackendBaseUrl) {
relativeResolverConfig.data.backend = { baseUrl: newBackendBaseUrl };
}
}
}
if (appBaseUrl) {
relativeResolverConfig.data.app = {
baseUrl: overrideOrigin(appBaseUrl),
};
const newAppBaseUrl = overrideOrigin(appBaseUrl);
if (appBaseUrl !== newAppBaseUrl) {
relativeResolverConfig.data.app = { baseUrl: newAppBaseUrl };
}
}
/**
* Only add the relative config if there is actually data to add.
@@ -48,7 +48,7 @@ describe('ProxiedSignInIdentity', () => {
it('handles a token that has no exp', async () => {
const [a, _b, c] = validBackstageToken.split('.');
const botched = `${a}.${btoa(JSON.stringify({}))}.${c}`;
const botched = `${a}.${window.btoa(JSON.stringify({}))}.${c}`;
expect(tokenToExpiry(botched)).toEqual(
new Date(new Date(Date.now() + DEFAULTS.defaultTokenExpiryMillis)),
);
@@ -81,16 +81,18 @@ describe('ProxiedSignInIdentity', () => {
backstageIdentity: {
token: [
'eyJhbGciOiJFUzI1NiIsImtpZCI6ImMxNTMzNDRiLWZjYzktNGIwOS1iN2ZhLTU3ZmM5MDhjMjBiNiJ9',
btoa(
JSON.stringify({
iss: 'http://localhost:7007/api/auth',
sub: 'user:default/freben',
aud: 'backstage',
iat,
exp,
ent: ['group:default/my-team'],
}),
).replace(/=/g, ''),
window
.btoa(
JSON.stringify({
iss: 'http://localhost:7007/api/auth',
sub: 'user:default/freben',
aud: 'backstage',
iat,
exp,
ent: ['group:default/my-team'],
}),
)
.replace(/=/g, ''),
'4nOTmPHPwhzaKTzikgUsHcszfcP-JamcojMnRfyfsKhyHCCEywe6uLFlvvmK5NbaX5Z7IIji-kg7bxKU58kwoQ',
].join('.'),
identity: {
@@ -40,7 +40,7 @@ export function tokenToExpiry(jwtToken: string | undefined): Date {
}
const [_header, rawPayload, _signature] = jwtToken.split('.');
const payload = JSON.parse(atob(rawPayload));
const payload = JSON.parse(window.atob(rawPayload));
if (typeof payload.exp !== 'number') {
return fallback;
}
@@ -22,7 +22,7 @@ import {
function parseJwtPayload(token: string) {
const [_header, payload, _signature] = token.split('.');
return JSON.parse(atob(payload));
return JSON.parse(window.atob(payload));
}
type LegacySignInResult = {
+1
View File
@@ -42,6 +42,7 @@ export default async (opts: OptionValues): Promise<void> => {
{
type: 'input',
name: 'name',
default: 'backstage',
message: chalk.blue('Enter a name for the app [required]'),
validate: (value: any) => {
if (!value) {
@@ -34,9 +34,9 @@
"@spotify/prettier-config": "^12.0.0",
"concurrently": "^6.0.0",
"lerna": "^4.0.0",
"node-gyp": "^9.0.0",
"prettier": "^2.3.2",
"typescript": "~4.6.4",
"node-gyp": "^9.0.0"
"typescript": "~4.6.4"
},
"resolutions": {
"@types/react": "^17",
@@ -39,8 +39,8 @@
"@backstage/plugin-search-react": "^{{version '@backstage/plugin-search-react'}}",
"@backstage/plugin-tech-radar": "^{{version '@backstage/plugin-tech-radar'}}",
"@backstage/plugin-techdocs": "^{{version '@backstage/plugin-techdocs'}}",
"@backstage/plugin-techdocs-react": "^{{version '@backstage/plugin-techdocs-react'}}",
"@backstage/plugin-techdocs-module-addons-contrib": "^{{version '@backstage/plugin-techdocs-module-addons-contrib'}}",
"@backstage/plugin-techdocs-react": "^{{version '@backstage/plugin-techdocs-react'}}",
"@backstage/plugin-user-settings": "^{{version '@backstage/plugin-user-settings'}}",
"@backstage/theme": "^{{version '@backstage/theme'}}",
"@material-ui/core": "^4.12.2",
@@ -16,11 +16,10 @@
"build-image": "docker build ../.. -f Dockerfile --tag backstage"
},
"dependencies": {
"app": "link:../app",
"@backstage/backend-common": "^{{version '@backstage/backend-common'}}",
"@backstage/backend-tasks": "^{{version '@backstage/backend-tasks'}}",
"@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}",
"@backstage/catalog-client": "^{{version '@backstage/catalog-client'}}",
"@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}",
"@backstage/config": "^{{version '@backstage/config'}}",
"@backstage/plugin-app-backend": "^{{version '@backstage/plugin-app-backend'}}",
"@backstage/plugin-auth-backend": "^{{version '@backstage/plugin-auth-backend'}}",
@@ -34,6 +33,7 @@
"@backstage/plugin-search-backend-module-pg": "^{{version '@backstage/plugin-search-backend-module-pg'}}",
"@backstage/plugin-search-backend-node": "^{{version '@backstage/plugin-search-backend-node'}}",
"@backstage/plugin-techdocs-backend": "^{{version '@backstage/plugin-techdocs-backend'}}",
"app": "link:../app",
"better-sqlite3": "^7.5.0",
"dockerode": "^3.3.1",
"express": "^4.17.1",
@@ -44,8 +44,8 @@
"devDependencies": {
"@backstage/cli": "^{{version '@backstage/cli'}}",
"@types/dockerode": "^3.3.0",
"@types/express-serve-static-core": "^4.17.5",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5",
"@types/luxon": "^2.0.4"
},
"files": [
+24 -27
View File
@@ -57,13 +57,14 @@ export async function run() {
const appDir = await createApp('test-app', workspaceDir, rootDir);
print('Creating a Backstage Plugin');
const pluginName = await createPlugin('test-plugin', appDir);
const pluginId = 'test';
await createPlugin({ appDir, pluginId, select: 'plugin' });
print('Creating a Backstage Backend Plugin');
await createPlugin('test-plugin', appDir, ['--backend']);
await createPlugin({ appDir, pluginId, select: 'backend-plugin' });
print('Starting the app');
await testAppServe(pluginName, appDir);
await testAppServe(pluginId, appDir);
if (Boolean(process.env.POSTGRES_USER)) {
print('Testing the PostgreSQL backend startup');
@@ -328,14 +329,18 @@ async function overrideModuleResolutions(appDir: string, workspaceDir: string) {
/**
* Uses create-plugin command to create a new plugin in the app
*/
async function createPlugin(
pluginName: string,
appDir: string,
options: string[] = [],
) {
const child = spawnPiped(['yarn', 'create-plugin', ...options], {
cwd: appDir,
});
async function createPlugin(options: {
appDir: string;
pluginId: string;
select: string;
}) {
const { appDir, pluginId, select } = options;
const child = spawnPiped(
['yarn', 'new', '--select', select, '--option', `id=${pluginId}`],
{
cwd: appDir,
},
);
try {
let stdout = '';
@@ -343,20 +348,14 @@ async function createPlugin(
stdout = stdout + data.toString('utf8');
});
await waitFor(() => stdout.includes('Enter an ID for the plugin'));
child.stdin?.write(`${pluginName}\n`);
// await waitFor(() => stdout.includes('Enter the owner(s) of the plugin'));
// child.stdin.write('@someuser\n');
print('Waiting for plugin create script to be done');
await waitForExit(child);
const canonicalName = options.includes('--backend')
? `${pluginName}-backend`
: pluginName;
const pluginDir = resolvePath(appDir, 'plugins', canonicalName);
const pluginDir = resolvePath(
appDir,
'plugins',
select === 'backend-plugin' ? `${pluginId}-backend` : pluginId,
);
print(`Running 'yarn tsc' in root for newly created plugin`);
await runPlain(['yarn', 'tsc'], { cwd: appDir });
@@ -365,8 +364,6 @@ async function createPlugin(
print(`Running 'yarn ${cmd.join(' ')}' in newly created plugin`);
await runPlain(['yarn', ...cmd], { cwd: pluginDir });
}
return canonicalName;
} finally {
child.kill();
}
@@ -375,7 +372,7 @@ async function createPlugin(
/**
* Start serving the newly created app and make sure that the create plugin is rendering correctly
*/
async function testAppServe(pluginName: string, appDir: string) {
async function testAppServe(pluginId: string, appDir: string) {
const startApp = spawnPiped(['yarn', 'start'], {
cwd: appDir,
env: {
@@ -398,8 +395,8 @@ async function testAppServe(pluginName: string, appDir: string) {
await waitForPageWithText(page, '/', 'My Company Catalog');
await waitForPageWithText(
page,
`/${pluginName}`,
`Welcome to ${pluginName}!`,
`/${pluginId}`,
`Welcome to ${pluginId}!`,
);
print('Both App and Plugin loaded correctly');
-2
View File
@@ -32,7 +32,6 @@
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "4.0.0-alpha.57",
"object-hash": "^3.0.0",
"react-use": "^17.2.4"
},
"peerDependencies": {
@@ -48,7 +47,6 @@
"@testing-library/react": "^12.1.3",
"@testing-library/user-event": "^14.0.0",
"@types/node": "^16.11.26",
"@types/object-hash": "^2.2.1",
"cross-fetch": "^3.1.5",
"msw": "^0.49.0"
},
@@ -13,9 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Entity } from '@backstage/catalog-model';
import React from 'react';
import { Grid, Typography } from '@material-ui/core';
import {
EmptyState,
ErrorPanel,
@@ -23,12 +22,13 @@ import {
MissingAnnotationEmptyState,
Progress,
} from '@backstage/core-components';
import hash from 'object-hash';
import { makeStyles } from '@material-ui/core/styles';
import { BackstageTheme } from '@backstage/theme';
import { useApi } from '@backstage/core-plugin-api';
import { airbrakeApiRef } from '../../api';
import { BackstageTheme } from '@backstage/theme';
import { Grid, Typography } from '@material-ui/core';
import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
import useAsync from 'react-use/lib/useAsync';
import { airbrakeApiRef } from '../../api';
import { AIRBRAKE_PROJECT_ID_ANNOTATION, useProjectId } from '../useProjectId';
const useStyles = makeStyles<BackstageTheme>(() => ({
@@ -64,8 +64,8 @@ export const EntityAirbrakeWidget = ({ entity }: { entity: Entity }) => {
<Grid container spacing={3} direction="column">
{value.groups?.map(group => (
<Grid item key={group.id}>
{group.errors?.map(groupError => (
<InfoCard title={groupError.type} key={hash(groupError)}>
{group.errors?.map((groupError, i) => (
<InfoCard title={groupError.type} key={i}>
<Typography variant="body1" className={classes.multilineText}>
{groupError.message}
</Typography>
@@ -17,7 +17,6 @@
import { PluginEndpointDiscovery } from '@backstage/backend-common';
import {
createBackendModule,
createServiceFactory,
coreServices,
} from '@backstage/backend-plugin-api';
import { startTestBackend } from '@backstage/backend-test-utils';
@@ -27,15 +26,6 @@ import { catalogServiceRef } from './catalogService';
describe('catalogServiceRef', () => {
it('should return a catalogClient', async () => {
expect.assertions(1);
const mockDiscoveryFactory = createServiceFactory({
service: coreServices.discovery,
deps: {},
factory: async ({}) => {
return async () => jest.fn() as unknown as PluginEndpointDiscovery;
},
});
const testModule = createBackendModule({
moduleId: 'test',
pluginId: 'test',
@@ -52,7 +42,9 @@ describe('catalogServiceRef', () => {
});
await startTestBackend({
services: [mockDiscoveryFactory],
services: [
[coreServices.discovery, {} as unknown as PluginEndpointDiscovery],
],
features: [testModule()],
});
});
+38 -1
View File
@@ -2,13 +2,17 @@
Welcome to the Dynatrace plugin!
![Example of the Dynatrace plugin](./assets/plugin.png)
## Getting started
This plugin uses the Backstage proxy to communicate with Dynatrace's REST APIs.
### Setup
#### Dynatrace API Key
#### Requirements
##### Dynatrace API Key
The Dynatrace plugin will require the following information, to be used in the configuration options detailed below:
@@ -17,6 +21,39 @@ The Dynatrace plugin will require the following information, to be used in the c
- `entities.read`
- `problems.read`
#### Install
1. Install the plugin on your frontend:
```
yarn add --cwd packages/app @backstage/plugin-dynatrace
```
2. We created in our catalog the interface for using the integration with Dynatrace.
```diff
# packages/app/src/components/catalog/EntityPage.tsx
[...]
+ import { DynatraceTab, isDynatraceAvailable } from '@backstage/plugin-dynatrace'
[...]
const serviceEntityPage = (
<EntityLayout>
[...]
+ <EntityLayout.Route
+ path="/dynatrace"
+ title="Dynatrace"
+ if={isDynatraceAvailable}
+ >
+ <DynatraceTab />
+ </EntityLayout.Route>
</EntityLaytou>
)
```
#### Plugin Configuration
This plugin requires a proxy endpoint for Dynatrace configured in `app-config.yaml` like so:
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

+5
View File
@@ -12,6 +12,11 @@
"backstage": {
"role": "frontend-plugin"
},
"repository": {
"type": "git",
"url": "https://github.com/backstage/backstage",
"directory": "plugins/dynatrace"
},
"scripts": {
"start": "backstage-cli package start",
"build": "backstage-cli package build",
+699 -705
View File
File diff suppressed because it is too large Load Diff