From 5ca80ad93556f81a360c4e7b0b71fbb3a2e1d7c7 Mon Sep 17 00:00:00 2001 From: ivgo Date: Mon, 23 May 2022 14:35:08 +0200 Subject: [PATCH] Apply changes, update tests & change vault icon temporarilly Signed-off-by: ivgo --- microsite/static/img/vault.png | Bin 13714 -> 6364 bytes plugins/vault-backend/README.md | 18 +- plugins/vault-backend/api-report.md | 82 +-- plugins/vault-backend/package.json | 12 +- .../src/service/VaultBuilder.tsx | 89 ++- .../vault-backend/src/service/router.test.ts | 19 +- plugins/vault-backend/src/service/router.ts | 19 +- .../src/service/runPeriodically.ts | 54 -- .../src/service/standaloneApplication.ts | 20 +- .../src/service/vaultApi.test.ts | 4 +- plugins/vault-backend/src/service/vaultApi.ts | 39 +- plugins/vault/api-report.md | 8 +- plugins/vault/package.json | 20 +- plugins/vault/src/api.test.ts | 6 +- plugins/vault/src/api.ts | 14 +- .../EntityVaultTable.test.tsx | 4 +- .../EntityVaultTable/EntityVaultTable.tsx | 6 +- plugins/vault/src/plugin.ts | 8 + yarn.lock | 641 ++---------------- 19 files changed, 304 insertions(+), 759 deletions(-) delete mode 100644 plugins/vault-backend/src/service/runPeriodically.ts diff --git a/microsite/static/img/vault.png b/microsite/static/img/vault.png index ecd443c0555387dcac49af62ac89038214281cc9..9b5d59622d430fa9269c682168ead2c16d96f966 100644 GIT binary patch literal 6364 zcmbW6cT^MIyYD9Dv*+30=Q9s&tV}uCh1dZA z;50)R*#ZEFVS<2DER5<#z>8aq3KD2&W`BxNB2V2+V(hc|Bb)*OfYsyQ4WxOmV1m(j zF31=eWaoD)DAYZ`69^3rRl4Kr9f)!F_f+x=@G4x>6#{^>PG&}b+lLjcPKLh~@hs@w zT%W6rlQKwBFau)G<2b-d=Vd?g-h>!u7~3aos-%^wq;YU9Z9WCFznQ^F);3Q!5t_~y zo<>QybMV-}zwsoopNfl<%J9$jZ{F%1@_F+ZW!>)J;^23EY(3BlKRa9f=3dLtcF;)c z{iOeWu`g8)0n)z2E|T&{ESZ?UKFv7MuF>GMmmi74hTh5>Qx+sHRZ9pbpPMF+_!FPm6GO#lT3OaJE&r>2ip~WCjrO-Z#Cc zm&>TkkPM0dcDqhPL%?Ubf3RXjwYW0R3IIBwehl+h@#QW>8E~Re+TT)nY$QPCf+L{1 z4)lPmX;TOK%r{tcUCfN2-QW4cOqa=0WN(eF;}Obb~Dci2ZEl;s`TOHjmB@K zJ>4w*3>{qX&vt$Yl9{HVE|? zRvSVzO_L^p&i+V5_&J@rk@khUuue{gmZT5z507-VW603>ms{N`e>HJw^5ydrPNZlPr26WyN9wLFe54){7F{AzGbxxq zqMd*!9Z?1S0SSU?mS|^dd__xZGLnq`d6mXSbHmX&GzX6NwppNhHNI?5#rGm(dv)UH zPbcw)KWu^Fm^KOzkMGl8`Hg)~10Aodbe!23z3;*I65m2UXz!LQ5Zm$NW_k>6 zWU|9!T(2R5pqK0#b#Pl+xc+c%mUEPggZ2ci{Jo^8ueCWo>{ORUxIxjgzK0mD(>!Z+?= zo8P*`t`Z$HzN+#h$A*)xkS0l%l(JXK{9-SS${}BMDgaZkA1n1#$}$bfN1UsvU^*E- zX#9mk5v7NcV>?3pBNutifo-@L>g7&5iJF6|yePJOxm|yQlV(B#(+m}~5S%Z03B_W_7GjMzj$m$YDVtPXD_6MbHX8)AB_kWr8=mY zTgrllJGDu@IM!Hh@Nze&mpz6s_jVo=Dl>VuH03GeD}9G$jd=ioFKr-S<2=aXx=&QB>47V0=%Aa$({%{OK9&g30ZW_D(F=HX@oGemY-hU>IwVy7`+^1#z%o51~ zT6&2jaTxm6!~CMa9&F>8+Jh|rU<-h(?OCYlNzIR`acqcO-7JlbHO6 zscVI(dq((HzU1wM9Qr6YIwcjEgILM~ltTLsV*7C?-6q|l;|GUxdyS)1)&949qc;Qx zF>9Ad{r#MkHYoRX69Ur$ zebOgEcGep)uX{9xm2DW9e4;N=^ zfL7Sr7TVxJ5t)(R90Jp=pv~YcNCi;xLF}A1y=Wd>()ImhXtsH8Vxo~L%?$>_WzAUv z=-gZQXyO%lYM;MR!dcS^0SuW^Ixe!u4zIsnSwjBk1B3J4?T-swH#|=6Xm1~)&%P>$ z*wk9_8t9LngRKj$R(8ESp+H)3?UZ6OIq?rlZ(R~ZL!)TRNE!Td<)h3AVB^y9yAH#J z?vfp9F|@7l?syJhK57OAT5;ChF%_cC)hzE2Z4R+yvxnu#qL;haTiB&J?d%v{NO()XReLM#gD7F(y4m5Io;<&FOSY#sjbXS3JN!(z#RCUV z__6VCKgk{O#QO5bcc+ygYos30A1U>d`qu`VeQD)5I1^pTHNBi|H zyx!*v;@sMC03m zcAW-kgBN9P$J5c=kz_gjxJZ4-GdOVkejFa++PX=gx0H`O4|x*6N((-4`g>2I#Z;^J zT(rhr@M0lkOHZ>vRBP@+Y$tB&R?=&`Mt8vqjrhIHxYYVRrsFCTsxG%v zu2Uu8NOZbj4$L{FfBPkKTStFGv&35NL;~;dXD;{xJUdfHai>9C+cVMTMqu!{U`YqD z4u8hk1qokbHJ&&i`COi~Zx(Jw$A1au>31TLi+)G36>iK3O6`tNGMe->Bb=3kAxm)T zE6uviUmDo0X!pn8M7NgkI7^!+>II9NW!5)Z_?I)AtPS^Fk>qYQ#ZGzAA#BQ&5%NL{ zlWh89;0=2i9dhJM_XE;zJz6M-OJD^&$R#MElorq78S9xSX$J+>9Sph^w~9K`WqS^W z`+YUE&zCEVu47iLgvD)0cTFDV>@Md#mIX>9QO%6Fa*s>Y>m?Ox_v zugl?*1?6DuvLceIrK@_5Z7NqPDU^K$*E9zK*ZZ*8=}pTnXCb9dlQqjvVJpVfGt!$> ziwPI0^k0;s0YQ`8YYgvB@2MD`WqRH%jY={n)}y5m(FTkIH-O zv~;WeVeB;G6bu&-#)gh2EjI$vu$*crs%{FoGN!c{X7;Ni2g?^c0NodiRC5nKL-i_! z*nsQ7Ih}x_8V+Rk_OI~a7ucso^rx{jyS?*I~ zGgAjO9}cEv#_wbC{>7gOevY2e6{(D1#^nc1vGQ#G=sK69NV;`Ya6k2?MHc*XaFg-5 zoiFC00L%s~Yx*(3E!;C4yT$tri*+BC*_@!&{khj~tC8tYP;v+JlIy9+1#{hyyvN8;-Z#8~E3A%|F!IUWwJ?AWy zrL`DQts;^eyi~o9nDcjW1fkunU{Ft@@if8vPglDobbA6)c=Wt6Qk`Ktc9wNUj=3 zy=p!l(xj9IdDWo7HR>^-|A`PYkxroEo>gS%w(loXBFtyDcQ_XRmSf1#oX+JcJ~eJy zoz!l!8%M{Wue!LzME8-mYm4nQA-|nceI7^UpHXlpZ38og%nJA{)7%i|jeUz2S`Qg7 zl=N3;LJsa(V}GYgk%5xitA*-q8lS#djaT8uticWDvcgg*mpF(mShhC+`#eQz2%I); zSzoU)UinD~axC2XF%1-rtL6+-+@Ozk_;3`ZP3icnxBg65|3kGX+%5RrTY|F>u!W(+ zeWBq%|7D7ERB-|F%l_?ZP!!25&hoA5U>)VFi{GBFV+kz$)3yvk90EB8UKFbJWcMb- zjgbF*4njZG!KsBeZk!LC>;P^o-y(E3HT@VJHHZxp=A_fgI* z6#)~rr@GX~J0o$HO`Duqeo==6x6S+qH+z`8bmlG)d(+hIHU$yYP>^~SuR*vNL@cnc z-Mp?rf2KxUCATTtzBs;v(!-7GfQa-SDu|h!!IfVF%aVCU7iB&jBBFi8*7}i((ODQA zIX=-LpA0@($i2rN2G=Aioxgba**%7b6?zOKY2WM{`qdT4dy3dOwjd|Pfp zqMrueXi@ISP8{sn`41H!R*K}DrVPK}@zfu8jOv^BHLGqbUG-suiT)^bE zIXFM5zFnp}4{pGM7Q|v>7HYl$8x9{FXU#5xgl*I_rjIyKsu2f-o4G+LFy`)(F*&xo zobFTgRV`|u7hF#xlQ(6$e(-hpohTvw+AYO~xP_EGo=x1+d9ZAo--a!k`hWN&Udm>b>E)QIlT zOhyJ?CxX09wpLkI5~q~JpW`7^@R6_4I7C4e=2T#-r1$irDK3>T|GaF5p0a0Qfqxh? z5lKy=he}WQ#5DSHgfHrXrYyoO7n~uU|8z+jTs4-$1rw!fJqL*2Cu&FEd5&g9NPBE8 zhpUQx`>yflXUDlPS#(EjL--zfvlJF9X}1$~zlnV8V-CQU)j`-;McIOFiwMDS!48GK zyK+Ru?&8!dO2-A1styd%H0eEVjK7}Kqj3R)QvG~7?8}GI2n&nRbuxWXz=9!c@KQK4 zFU!z&uX_6c_S{ zZND}?#8GZAjk2O??8*=w%!Ss31&$MwssI(UN;9+^0UvnuiV+nQ{J?ujTP;_V(MVVxT|npk~Za3>vLX`T^H)^ z{C(2diHWPfm9-kqz{5WZ#vT?0{uulI3s1_^BIo|Hq8%0elF#Nf`1D%}_jZl2>z-}r zJN%u>^@E|qs`#)1p1RW=19h^#?eDYkTSYg%YW29QCbl)Ah&qYBLrIXYif5FbwRwF# z#4VD}P_||VN2fyla$yD6kU`_RtRe=#S2{Y|!OI$Mf zKVPR@7K_k=S6n8m_V1|s^BfCBqw7w&J*5A>=_E|}XBpj5GzQLQyffZC(-qaL(3dFi zMoZW6sN9x7Il}q=Yxyl)D6K{sGU{=c*PnI&@qzr1Fv0W*Ih)#2d&(k`3YNExZGizb z9|j69{n}@wBz+<)0#k+NZ9an7FYl7gii4ZXQD~-6U&$5Ue?X(@68+ChZL=7euj@_( zHt0t?=A#$ zWxVhiiksgu2eu>-f#I ztz`~SO%~yhcWIVcndPA_pM3!Dd#TO0%_@igLbQBPqh*t%z2)uIM#yUdDvkb}+^H?7 z7ne%3DWQuoh{D8oLE^_3_H43)XiGD|!9L~Tu+=0l>0^0a!qzpz!_SRGLW{aDJ00xzei4IWbtR?U2uWuciuuTd9By&#YkeL3)h;PL;MafE&WqX@}7Zsxe9G&I}a9v*At)JCf@#b&j=s zKJJRPFZ;Ii1o%DxxH3hG$GG5PM=$GO?3|KMZCeBAEy(eO26bdsP2*018w2iL`o_T~ z5$C&WZ1OFK0k%qQ{;#x+(2~mX*_)d-M0}9pJT4gmI55@;N=^O4k1F>d|BdIC%OM+M z6c7UQ=d)2Q1DL&GcI@FYyhjCgT$cZZY4eysh%6hziG{FEkt8z7nKSTNBzF_2P%Lt} z=@}y33AkaIu9)-Pn+;g8qOA`_96=tlH;Z!pWJYNY^B-pyAlEAw_#MoZ&tN9%lARR ztICW6XAVuCL#2qR?ZwQWrOKlZiQKCVJ&l3G=V%Uzf84bi6hF!_xKc_$d7We^P;n(5GWS>l~HaNn5 zmhhMY;i7;Drm=1Yy@l2hZ@qsZsE;%@)(8`80+3u+nR>c7P0RQ#VzY6W*k90Ia8R!# z2~h|(Wl99Kf|h$22PI$Qv`95Lad$eX#Y96IH+_IJqa;2acDyIzZ<_e4nTsO(46CmY zXhFvs{VtueJ)(x6ugGj;9}%faIAMcc+KgY=DSw|pQ0k_CTx>&fx27w@ySCvDgmGhUW~L-ToYhzI|2(f=`!jT%e|VcZ)DT0B^q z+QbDnV3D~SK(-?>k9ne6Z<5DB3(Z^x5-8T TPx{3869JeRTN%AEMBo1}q0RU% literal 13714 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 diff --git a/plugins/vault-backend/README.md b/plugins/vault-backend/README.md index 4e425f9630..d7d227607d 100644 --- a/plugins/vault-backend/README.md +++ b/plugins/vault-backend/README.md @@ -33,6 +33,7 @@ To get started, first you need a running instance of Vault. You can follow [this return await createRouter({ logger: env.logger, config: env.config, + scheduler: env.scheduler, }); } ``` @@ -106,25 +107,28 @@ You will set the `vault.io/secret-path` to `test/backstage`. If the folder `back ## Renew token -In a secure Vault instance, it's usual that the tokens are refreshed after some time. In order to always have a valid token to fetch the secrets, it might be necessary to execute a renew action after some time. By default this is deactivated, but it can be easily activated and configured to be executed periodically. In order to do that, modify your `src/plugins/vault.ts` file to look like this one: +In a secure Vault instance, it's usual that the tokens are refreshed after some time. In order to always have a valid token to fetch the secrets, it might be necessary to execute a renew action after some time. By default this is deactivated, but it can be easily activated and configured to be executed periodically (hourly by default, but customizable by the user). In order to do that, modify your `src/plugins/vault.ts` file to look like this one: ```typescript import { VaultBuilder } from '@backstage/plugin-vault-backend'; import { Router } from 'express'; -import { Duration } from 'luxon'; import { PluginEnvironment } from '../types'; export default async function createPlugin( env: PluginEnvironment, ): Promise { - const builder = VaultBuilder.createBuilder({ + const builder = await VaultBuilder.createBuilder({ logger: env.logger, config: env.config, - }) - .setVaultTokenRefreshInterval(Duration.fromObject({ hours: 5 })) // Optional, by default it's executed every hour - .enableTokenRenew(); + scheduler: env.scheduler, + }).enableTokenRenew( + env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 10 }, + timeout: { minutes: 1 }, + }), + ); - const { router } = await builder.build(); + const { router } = builder.build(); return router; } diff --git a/plugins/vault-backend/api-report.md b/plugins/vault-backend/api-report.md index eba8a660ed..1c7e669ef2 100644 --- a/plugins/vault-backend/api-report.md +++ b/plugins/vault-backend/api-report.md @@ -4,111 +4,85 @@ ```ts import { Config } from '@backstage/config'; -import { Duration } from 'luxon'; import express from 'express'; import { Logger } from 'winston'; +import { PluginTaskScheduler } from '@backstage/backend-tasks'; +import { TaskRunner } from '@backstage/backend-tasks'; -// Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function createRouter(options: RouterOptions): Promise; +// @public +export function createRouter(options: RouterOptions): express.Router; -// Warning: (ae-missing-release-tag) "RenewTokenResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export type RenewTokenResponse = { auth: { client_token: string; }; }; -// Warning: (ae-missing-release-tag) "RouterOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export interface RouterOptions { // (undocumented) config: Config; // (undocumented) logger: Logger; + // (undocumented) + scheduler: PluginTaskScheduler; } -// Warning: (ae-missing-release-tag) "Secret" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type Secret = { - name: string; - showUrl: string; - editUrl: string; -}; - -// Warning: (ae-missing-release-tag) "VaultApi" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export interface VaultApi { - // (undocumented) getFrontendSecretsUrl(): string; - // (undocumented) - listSecrets(secretPath: string): Promise; - // (undocumented) + listSecrets(secretPath: string): Promise; renewToken?(): Promise; } -// Warning: (ae-missing-release-tag) "VaultBuilder" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export class VaultBuilder { constructor(env: VaultEnvironment); - // (undocumented) build(): VaultBuilderReturn; - // (undocumented) protected buildRouter(vaultClient: VaultClient): express.Router; - // (undocumented) static createBuilder(env: VaultEnvironment): VaultBuilder; - // (undocumented) - enableTokenRenew(): this; + enableTokenRenew(schedule?: TaskRunner): Promise; // (undocumented) protected readonly env: VaultEnvironment; - // (undocumented) protected renewToken(vaultClient: VaultClient): Promise; - // (undocumented) setVaultClient(vaultClient: VaultClient): this; - // (undocumented) - setVaultTokenRefreshInterval(refreshInterval: Duration): this; } -// Warning: (ae-missing-release-tag) "VaultBuilderReturn" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export type VaultBuilderReturn = Promise<{ +// @public +export type VaultBuilderReturn = { router: express.Router; -}>; +}; -// Warning: (ae-missing-release-tag) "VaultClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export class VaultClient implements VaultApi { constructor({ config }: { config: Config }); // (undocumented) getFrontendSecretsUrl(): string; // (undocumented) - listSecrets(secretPath: string): Promise; + listSecrets(secretPath: string): Promise; // (undocumented) renewToken(): Promise; } -// Warning: (ae-missing-release-tag) "VaultEnvironment" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export interface VaultEnvironment { // (undocumented) config: Config; // (undocumented) logger: Logger; + // (undocumented) + scheduler: PluginTaskScheduler; } -// Warning: (ae-missing-release-tag) "VaultSecretList" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public +export type VaultSecret = { + name: string; + showUrl: string; + editUrl: string; +}; + +// @public export type VaultSecretList = { data: { keys: string[]; diff --git a/plugins/vault-backend/package.json b/plugins/vault-backend/package.json index d9469d81e3..efdf4ffd83 100644 --- a/plugins/vault-backend/package.json +++ b/plugins/vault-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault-backend", "description": "A Backstage backend plugin that integrates towards Vault", - "version": "0.1.0", + "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,9 +34,10 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/backend-common": "^0.13.2", - "@backstage/backend-test-utils": "^0.1.23", - "@backstage/config": "^1.0.0", + "@backstage/backend-common": "^0.13.5", + "@backstage/backend-tasks": "^0.3.1", + "@backstage/backend-test-utils": "^0.1.24", + "@backstage/config": "^1.0.1", "@types/compression": "^1.7.2", "@types/express": "*", "compression": "^1.7.4", @@ -45,12 +46,11 @@ "express": "^4.17.1", "express-promise-router": "^4.1.0", "helmet": "^5.0.2", - "luxon": "^2.4.0", "winston": "^3.7.2", "yn": "^5.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.0", + "@backstage/cli": "^0.17.1", "@types/compression": "^1.7.2", "@types/supertest": "^2.0.8", "msw": "^0.35.0", diff --git a/plugins/vault-backend/src/service/VaultBuilder.tsx b/plugins/vault-backend/src/service/VaultBuilder.tsx index 03179bcd41..20d5eab8e4 100644 --- a/plugins/vault-backend/src/service/VaultBuilder.tsx +++ b/plugins/vault-backend/src/service/VaultBuilder.tsx @@ -17,31 +17,55 @@ import { Config } from '@backstage/config'; import { Logger } from 'winston'; import express, { Router } from 'express'; -import { Duration } from 'luxon'; import { VaultClient } from './vaultApi'; -import { runPeriodically } from './runPeriodically'; +import { TaskRunner, PluginTaskScheduler } from '@backstage/backend-tasks'; +/** + * Environment values needed by the VaultBuilder + * @public + */ export interface VaultEnvironment { logger: Logger; config: Config; + scheduler: PluginTaskScheduler; } -export type VaultBuilderReturn = Promise<{ +/** + * The object returned by the VaultBuilder.build() function + * @public + */ +export type VaultBuilderReturn = { router: express.Router; -}>; +}; +/** + * Implementation for Vault. It creates the routing and initializes the backend + * to allow the use of the Vault's frontend plugin. + * @public + */ export class VaultBuilder { - private vaultTokenRefreshInterval: Duration = Duration.fromObject({ - minutes: 60, - }); + // private vaultTokenRefreshInterval: Duration = Duration.fromObject({ + // minutes: 60, + // }); private vaultClient?: VaultClient; + /** + * Creates a new instance of the VaultBuilder. + * + * @param env - The backstage environment + * @returns A new instance of the VaultBuilder + */ static createBuilder(env: VaultEnvironment) { return new VaultBuilder(env); } constructor(protected readonly env: VaultEnvironment) {} - public async build(): VaultBuilderReturn { + /** + * Builds the routes for Vault. + * + * @returns The router configured for Vault + */ + public build(): VaultBuilderReturn { const { logger, config } = this.env; logger.info('Initializing Vault backend'); @@ -64,25 +88,46 @@ export class VaultBuilder { }; } + /** + * Overwrites the current vault client. + * + * @param vaultClient - The new Vault client + * @returns + */ public setVaultClient(vaultClient: VaultClient) { this.vaultClient = vaultClient; return this; } - public setVaultTokenRefreshInterval(refreshInterval: Duration) { - this.vaultTokenRefreshInterval = refreshInterval; - return this; - } - - public enableTokenRenew() { - runPeriodically(async () => { - this.env.logger.info('Renewing Vault token'); - const vaultClient = this.vaultClient ?? new VaultClient(this.env); - await this.renewToken(vaultClient); - }, this.vaultTokenRefreshInterval.toMillis()); + /** + * Enables the token renewal for Vault. + * + * @param schedule - The TaskRunner used to schedule the renewal, if not set, renewing hourly + * @returns + */ + public async enableTokenRenew(schedule?: TaskRunner) { + const taskRunner = schedule + ? schedule + : this.env.scheduler.createScheduledTaskRunner({ + frequency: { hours: 1 }, + timeout: { hours: 1 }, + }); + await taskRunner.run({ + id: 'refresh-vault-token', + fn: async () => { + this.env.logger.info('Renewing Vault token'); + const vaultClient = this.vaultClient ?? new VaultClient(this.env); + await this.renewToken(vaultClient); + }, + }); return this; } + /** + * Renews the token for vault using a defined client. + * + * @param vaultClient - The vault client used to renew the token + */ protected async renewToken(vaultClient: VaultClient) { const result = await vaultClient.renewToken(); if (!result) { @@ -92,6 +137,12 @@ export class VaultBuilder { } } + /** + * Builds the backend routes for Vault. + * + * @param vaultClient - The Vault client used to list the secrets. + * @returns The generated backend router + */ protected buildRouter(vaultClient: VaultClient): express.Router { const router = Router(); router.use(express.json()); diff --git a/plugins/vault-backend/src/service/router.test.ts b/plugins/vault-backend/src/service/router.test.ts index a4799fc2d8..97997b30ef 100644 --- a/plugins/vault-backend/src/service/router.test.ts +++ b/plugins/vault-backend/src/service/router.test.ts @@ -14,18 +14,32 @@ * limitations under the License. */ -import { getVoidLogger } from '@backstage/backend-common'; +import { getVoidLogger, DatabaseManager } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import express from 'express'; import request from 'supertest'; +import { TestDatabases } from '@backstage/backend-test-utils'; +import { TaskScheduler } from '@backstage/backend-tasks'; import { createRouter } from './router'; describe('createRouter', () => { let app: express.Express; + const databases = TestDatabases.create({ + ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + }); beforeAll(async () => { - const router = await createRouter({ + const knex = await databases.init('SQLITE_3'); + const databaseManager: Partial = { + forPlugin: (_: string) => ({ + getClient: async () => knex, + }), + }; + const manager = databaseManager as DatabaseManager; + const scheduler = new TaskScheduler(manager, getVoidLogger()); + + const router = createRouter({ logger: getVoidLogger(), config: new ConfigReader({ vault: { @@ -33,6 +47,7 @@ describe('createRouter', () => { token: '1234567890', }, }), + scheduler: scheduler.forPlugin('vault'), }); app = express().use(router); }); diff --git a/plugins/vault-backend/src/service/router.ts b/plugins/vault-backend/src/service/router.ts index 5ad98b5610..45e2ca8c86 100644 --- a/plugins/vault-backend/src/service/router.ts +++ b/plugins/vault-backend/src/service/router.ts @@ -14,20 +14,31 @@ * limitations under the License. */ +import { PluginTaskScheduler } from '@backstage/backend-tasks'; import { Config } from '@backstage/config'; import express from 'express'; import { Logger } from 'winston'; import { VaultBuilder } from './VaultBuilder'; +/** + * Options for the router creation. + * @public + */ export interface RouterOptions { logger: Logger; config: Config; + scheduler: PluginTaskScheduler; } -export async function createRouter( - options: RouterOptions, -): Promise { - const { router } = await VaultBuilder.createBuilder(options).build(); +/** + * Creates the routes used for Vault. + * + * @param options - The options used for the Vault's router creation + * @returns The router for Vault + * @public + */ +export function createRouter(options: RouterOptions): express.Router { + const { router } = VaultBuilder.createBuilder(options).build(); return router; } diff --git a/plugins/vault-backend/src/service/runPeriodically.ts b/plugins/vault-backend/src/service/runPeriodically.ts deleted file mode 100644 index 2f3104e221..0000000000 --- a/plugins/vault-backend/src/service/runPeriodically.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Runs a function repeatedly, with a fixed wait between invocations. - * - * Supports async functions, and silently ignores exceptions and rejections. - * - * @param fn - The function to run. May return a Promise. - * @param delayMs - The delay between a completed function invocation and the - * next. - * @returns A function that, when called, stops the invocation loop. - */ -export function runPeriodically(fn: () => any, delayMs: number): () => void { - let cancel: () => void; - let cancelled = false; - const cancellationPromise = new Promise(resolve => { - cancel = () => { - resolve(); - cancelled = true; - }; - }); - - const startRefresh = async () => { - while (!cancelled) { - try { - await fn(); - } catch { - // ignore intentionally - } - - await Promise.race([ - new Promise(resolve => setTimeout(resolve, delayMs)), - cancellationPromise, - ]); - } - }; - startRefresh(); - - return cancel!; -} diff --git a/plugins/vault-backend/src/service/standaloneApplication.ts b/plugins/vault-backend/src/service/standaloneApplication.ts index 29262744e5..bcec8ca419 100644 --- a/plugins/vault-backend/src/service/standaloneApplication.ts +++ b/plugins/vault-backend/src/service/standaloneApplication.ts @@ -18,6 +18,8 @@ import { errorHandler, notFoundHandler, requestLoggingHandler, + DatabaseManager, + getVoidLogger, } from '@backstage/backend-common'; import compression from 'compression'; import cors from 'cors'; @@ -26,6 +28,8 @@ import helmet from 'helmet'; import { Logger } from 'winston'; import { createRouter } from './router'; import { ConfigReader } from '@backstage/config'; +import { TestDatabases } from '@backstage/backend-test-utils'; +import { TaskScheduler } from '@backstage/backend-tasks'; export interface ApplicationOptions { enableCors: boolean; @@ -39,6 +43,20 @@ export async function createStandaloneApplication( const config = new ConfigReader({}); const app = express(); + const databases = TestDatabases.create({ + ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + }); + const knex = await databases.init('SQLITE_3'); + const databaseManager: Partial = { + forPlugin: (_: string) => ({ + getClient: async () => knex, + }), + }; + const manager = databaseManager as DatabaseManager; + const scheduler = new TaskScheduler(manager, getVoidLogger()).forPlugin( + 'vault', + ); + app.use(helmet()); if (enableCors) { app.use(cors()); @@ -46,7 +64,7 @@ export async function createStandaloneApplication( app.use(compression()); app.use(express.json()); app.use(requestLoggingHandler()); - app.use('/', await createRouter({ logger, config })); + app.use('/', createRouter({ logger, config, scheduler })); app.use(notFoundHandler()); app.use(errorHandler()); diff --git a/plugins/vault-backend/src/service/vaultApi.test.ts b/plugins/vault-backend/src/service/vaultApi.test.ts index 6e2ab24c3f..5a29633933 100644 --- a/plugins/vault-backend/src/service/vaultApi.test.ts +++ b/plugins/vault-backend/src/service/vaultApi.test.ts @@ -17,7 +17,7 @@ import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { Secret, VaultClient, VaultSecretList } from './vaultApi'; +import { VaultSecret, VaultClient, VaultSecretList } from './vaultApi'; import { ConfigReader } from '@backstage/config'; describe('VaultApi', () => { @@ -43,7 +43,7 @@ describe('VaultApi', () => { }, }; - const mockSecretsResult: Secret[] = [ + const mockSecretsResult: VaultSecret[] = [ { name: 'secret::one', editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::one`, diff --git a/plugins/vault-backend/src/service/vaultApi.ts b/plugins/vault-backend/src/service/vaultApi.ts index 89ff578727..af85fbec72 100644 --- a/plugins/vault-backend/src/service/vaultApi.ts +++ b/plugins/vault-backend/src/service/vaultApi.ts @@ -18,30 +18,61 @@ import { Config } from '@backstage/config'; import fetch from 'cross-fetch'; import { getVaultConfig, VaultConfig } from '../config'; +/** + * Object received as a response from the Vault API when fetching secrets + * @public + */ export type VaultSecretList = { data: { keys: string[]; }; }; -export type Secret = { +/** + * Object containing the secret name and some links + * @public + */ +export type VaultSecret = { name: string; showUrl: string; editUrl: string; }; +/** + * Object received as response when the token is renewed using the Vault API + * @public + */ export type RenewTokenResponse = { auth: { client_token: string; }; }; +/** + * Interface for the Vault API + * @public + */ export interface VaultApi { + /** + * Returns the URL to acces the Vault UI with the defined config. + */ getFrontendSecretsUrl(): string; - listSecrets(secretPath: string): Promise; + /** + * Returns a list of secrets used to show in a table. + * @param secretPath - The path where the secrets are stored in Vault + */ + listSecrets(secretPath: string): Promise; + /** + * Optional, to renew the token used to list the secrets. Returns true + * if the action was successfull, false otherwise. + */ renewToken?(): Promise; } +/** + * Implementation of the Vault API to list secrets and renew the token if necessary + * @public + */ export class VaultClient implements VaultApi { private vaultConfig: VaultConfig; @@ -81,7 +112,7 @@ export class VaultClient implements VaultApi { return `${this.vaultConfig.baseUrl}/ui/vault/secrets/${this.vaultConfig.secretEngine}`; } - async listSecrets(secretPath: string): Promise { + async listSecrets(secretPath: string): Promise { const listUrl = this.vaultConfig.kvVersion === 2 ? `v1/${this.vaultConfig.secretEngine}/metadata/${secretPath}` @@ -91,7 +122,7 @@ export class VaultClient implements VaultApi { return []; } - const secrets: Secret[] = []; + const secrets: VaultSecret[] = []; await Promise.all( result.data.keys.map(async secret => { if (this.isFolder(secret)) { diff --git a/plugins/vault/api-report.md b/plugins/vault/api-report.md index a5b38f50c7..a0b5773c70 100644 --- a/plugins/vault/api-report.md +++ b/plugins/vault/api-report.md @@ -7,14 +7,10 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; -// Warning: (ae-missing-release-tag) "EntityVaultCard" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export const EntityVaultCard: () => JSX.Element; -// Warning: (ae-missing-release-tag) "vaultPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export const vaultPlugin: BackstagePlugin<{}, {}>; // (No @packageDocumentation comment for this package) diff --git a/plugins/vault/package.json b/plugins/vault/package.json index b4be19adec..ec6ec0e643 100644 --- a/plugins/vault/package.json +++ b/plugins/vault/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-vault", "description": "A Backstage plugin that integrates towards Vault", - "version": "0.1.0", + "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,11 +34,11 @@ "postpack": "backstage-cli package postpack" }, "dependencies": { - "@backstage/backend-test-utils": "^0.1.23", - "@backstage/catalog-model": "^1.0.1", - "@backstage/core-components": "^0.9.3", - "@backstage/core-plugin-api": "^1.0.1", - "@backstage/plugin-catalog-react": "^1.0.1", + "@backstage/backend-test-utils": "^0.1.24", + "@backstage/catalog-model": "^1.0.2", + "@backstage/core-components": "^0.9.4", + "@backstage/core-plugin-api": "^1.0.2", + "@backstage/plugin-catalog-react": "^1.1.0", "@backstage/theme": "^0.2.15", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -49,10 +49,10 @@ "react": "^16.13.1 || ^17.0.0" }, "devDependencies": { - "@backstage/cli": "^0.17.0", - "@backstage/core-app-api": "^1.0.1", - "@backstage/dev-utils": "^1.0.1", - "@backstage/test-utils": "^1.0.1", + "@backstage/cli": "^0.17.1", + "@backstage/core-app-api": "^1.0.2", + "@backstage/dev-utils": "^1.0.2", + "@backstage/test-utils": "^1.1.0", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", "@testing-library/user-event": "^14.0.0", diff --git a/plugins/vault/src/api.test.ts b/plugins/vault/src/api.test.ts index f1337241c2..a913be01be 100644 --- a/plugins/vault/src/api.test.ts +++ b/plugins/vault/src/api.test.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; +import { setupRequestMockHandlers } from '@backstage/test-utils'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { Secret, VaultClient } from './api'; +import { VaultSecret, VaultClient } from './api'; import { UrlPatternDiscovery } from '@backstage/core-app-api'; describe('api', () => { @@ -27,7 +27,7 @@ describe('api', () => { const mockBaseUrl = 'https://api-vault.com/api/vault'; const discoveryApi = UrlPatternDiscovery.compile(mockBaseUrl); - const mockSecretsResult: Secret[] = [ + const mockSecretsResult: VaultSecret[] = [ { name: 'secret::one', editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::one`, diff --git a/plugins/vault/src/api.ts b/plugins/vault/src/api.ts index 0b9c2ddc94..ce92eb7538 100644 --- a/plugins/vault/src/api.ts +++ b/plugins/vault/src/api.ts @@ -19,20 +19,14 @@ export const vaultApiRef = createApiRef({ id: 'plugin.vault.service', }); -export type VaultSecretList = { - data: { - keys: string[]; - }; -}; - -export type Secret = { +export type VaultSecret = { name: string; showUrl: string; editUrl: string; }; export interface VaultApi { - listSecrets(secretPath: string): Promise; + listSecrets(secretPath: string): Promise; } export class VaultClient implements VaultApi { @@ -61,8 +55,8 @@ export class VaultClient implements VaultApi { return undefined; } - async listSecrets(secretPath: string): Promise { - const result = await this.callApi('v1/secrets', { + async listSecrets(secretPath: string): Promise { + const result = await this.callApi('v1/secrets', { path: secretPath, }); if (!result) { diff --git a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx index 17353974a1..805039e2ea 100644 --- a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx +++ b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.test.tsx @@ -24,7 +24,7 @@ import { ComponentEntity } from '@backstage/catalog-model'; import { renderInTestApp } from '@backstage/test-utils'; import { EntityVaultTable } from './EntityVaultTable'; import { ApiProvider, UrlPatternDiscovery } from '@backstage/core-app-api'; -import { Secret, vaultApiRef, VaultClient } from '../../api'; +import { VaultSecret, vaultApiRef, VaultClient } from '../../api'; import { rest } from 'msw'; describe('EntityVautTable', () => { @@ -68,7 +68,7 @@ describe('EntityVautTable', () => { }, }; - const mockSecretsResult: Secret[] = [ + const mockSecretsResult: VaultSecret[] = [ { name: 'secret::one', editUrl: `${mockBaseUrl}/ui/vault/secrets/secrets/edit/test/success/secret::one`, diff --git a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx index 5356342a5c..197c82c5b8 100644 --- a/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx +++ b/plugins/vault/src/components/EntityVaultTable/EntityVaultTable.tsx @@ -22,7 +22,7 @@ import Edit from '@material-ui/icons/Edit'; import Visibility from '@material-ui/icons/Visibility'; import Alert from '@material-ui/lab/Alert'; import useAsync from 'react-use/lib/useAsync'; -import { Secret, vaultApiRef } from '../../api'; +import { VaultSecret, vaultApiRef } from '../../api'; import { VAULT_SECRET_PATH_ANNOTATION } from '../../constants'; export const vaultSecretPath = (entity: Entity) => { @@ -35,7 +35,9 @@ export const vaultSecretPath = (entity: Entity) => { export const EntityVaultTable = ({ entity }: { entity: Entity }) => { const vaultApi = useApi(vaultApiRef); const { secretPath } = vaultSecretPath(entity); - const { value, loading, error } = useAsync(async (): Promise => { + const { value, loading, error } = useAsync(async (): Promise< + VaultSecret[] + > => { return vaultApi.listSecrets(secretPath); }, []); diff --git a/plugins/vault/src/plugin.ts b/plugins/vault/src/plugin.ts index b07d7820f3..8275505abb 100644 --- a/plugins/vault/src/plugin.ts +++ b/plugins/vault/src/plugin.ts @@ -23,6 +23,10 @@ import { import { VaultClient, vaultApiRef } from './api'; +/** + * The vault plugin. + * @public + */ export const vaultPlugin = createPlugin({ id: 'vault', apis: [ @@ -37,6 +41,10 @@ export const vaultPlugin = createPlugin({ ], }); +/** + * Card used to show the list of Vault secrets. + * @public + */ export const EntityVaultCard = vaultPlugin.provide( createComponentExtension({ name: 'EntityVaultCard', diff --git a/yarn.lock b/yarn.lock index c287b11e76..88ad1e15aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1467,30 +1467,16 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@backstage/app-defaults@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/app-defaults/-/app-defaults-1.0.1.tgz#adb7a1f974463fb9fde18dd4038d80ca4839ce4e" - integrity sha512-+RKNsADsd2s5XFiFxkfxHf/OxMwY3X7avYFhk+Y9Ho/mPMbMHvlXcW9NAr4h9jC8uy9TNLB5XGTqWwe4HPU0xA== +"@backstage/backend-common@^0.13.5": + version "0.13.5" + resolved "https://registry.npmjs.org/@backstage/backend-common/-/backend-common-0.13.5.tgz#9ff55e1da2a9cf65d0c4782cb360f9b6abd0754c" + integrity sha512-37kLw1BolfstantREuawbyRKXD+xKHUta3A63j0868JZPxRSCfiysBzF3uAorH/3WIh0p2lswutmunbVQFsXDA== dependencies: - "@backstage/core-app-api" "^1.0.1" - "@backstage/core-components" "^0.9.3" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/plugin-permission-react" "^0.4.0" - "@backstage/theme" "^0.2.15" - "@material-ui/core" "^4.12.2" - "@material-ui/icons" "^4.9.1" - react-router-dom "6.0.0-beta.0" - -"@backstage/backend-common@^0.13.2": - version "0.13.2" - resolved "https://registry.npmjs.org/@backstage/backend-common/-/backend-common-0.13.2.tgz#c3619dee671936f306f49eae9c8bbde436cbc40d" - integrity sha512-FblxaHCw29N4ME1uHb+513EXcbn30vA224+6cj8159Wje2Rcv8EdMFtuf2awCNcYgoIdDD/R1wwBPeRmZhtERw== - dependencies: - "@backstage/cli-common" "^0.1.8" - "@backstage/config" "^1.0.0" - "@backstage/config-loader" "^1.1.0" + "@backstage/cli-common" "^0.1.9" + "@backstage/config" "^1.0.1" + "@backstage/config-loader" "^1.1.1" "@backstage/errors" "^1.0.0" - "@backstage/integration" "^1.1.0" + "@backstage/integration" "^1.2.0" "@backstage/types" "^1.0.0" "@google-cloud/storage" "^5.8.0" "@keyv/redis" "^2.2.3" @@ -1503,23 +1489,24 @@ "@types/webpack-env" "^1.15.2" archiver "^5.0.2" aws-sdk "^2.840.0" + base64-stream "^1.0.0" compression "^1.7.4" concat-stream "^2.0.0" cors "^2.8.5" dockerode "^3.3.1" express "^4.17.1" express-promise-router "^4.1.0" - fs-extra "10.0.1" + fs-extra "10.1.0" git-url-parse "^11.6.0" helmet "^5.0.2" isomorphic-git "^1.8.0" - jose "^1.27.1" + jose "^4.6.0" keyv "^4.0.3" keyv-memcache "^1.2.5" knex "^1.0.2" lodash "^4.17.21" logform "^2.3.2" - luxon "^2.0.2" + luxon "^2.3.1" minimatch "^5.0.0" minimist "^1.2.5" morgan "^1.10.0" @@ -1533,443 +1520,6 @@ winston "^3.2.1" yn "^4.0.0" -"@backstage/backend-test-utils@^0.1.23": - version "0.1.23" - resolved "https://registry.npmjs.org/@backstage/backend-test-utils/-/backend-test-utils-0.1.23.tgz#30f003efa1e5fbdd039a945637eaea089cf06f8f" - integrity sha512-tr5/GGumq0z97aQ1lOna9veqwgmVcFZgjFLuApfdeim+QkI0E8PvBLGaq5H3Vo6xw6Z21UKX0SeGE81QUi6pZw== - dependencies: - "@backstage/backend-common" "^0.13.2" - "@backstage/cli" "^0.17.0" - "@backstage/config" "^1.0.0" - better-sqlite3 "^7.5.0" - knex "^1.0.2" - msw "^0.35.0" - mysql2 "^2.2.5" - pg "^8.3.0" - testcontainers "^8.1.2" - uuid "^8.0.0" - -"@backstage/catalog-client@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/catalog-client/-/catalog-client-1.0.1.tgz#f19888635825b3104b0e293409d924fb5e21feb9" - integrity sha512-2JUEqtR3v361JM6JDjTt8k/tlZd27RB/ZQ2Vwp5seJf4QYXfR9s5AM4M35l/A5vosDKhGrxMAq3t2s4gcH9vVg== - dependencies: - "@backstage/catalog-model" "^1.0.1" - "@backstage/errors" "^1.0.0" - cross-fetch "^3.1.5" - -"@backstage/catalog-model@^1.0.0", "@backstage/catalog-model@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/catalog-model/-/catalog-model-1.0.1.tgz#16acb8cf52083dd038da7d9fae38811fd88d55e5" - integrity sha512-VxKQ+WzcsxAWtwWyeGw04vTefkmwxi6XweXSNRhNddXAVqsAbDcCYBUc9jylu0bYVXXWYJkEl8kiwyawUloPPQ== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/errors" "^1.0.0" - "@backstage/types" "^1.0.0" - ajv "^8.10.0" - json-schema "^0.4.0" - lodash "^4.17.21" - uuid "^8.0.0" - -"@backstage/cli-common@^0.1.8": - version "0.1.8" - resolved "https://registry.npmjs.org/@backstage/cli-common/-/cli-common-0.1.8.tgz#a20777b0448cada100b3967592925dc15fa25be5" - integrity sha512-OSFUhEaPMbdGvB130GRlJ+tZvvIRYGZK10sIcOGuXg3cl/K+sVAWh1XuewBLa+YI6wspAsReNiMR/+YbH8q2/A== - -"@backstage/cli@^0.17.0": - version "0.17.0" - resolved "https://registry.npmjs.org/@backstage/cli/-/cli-0.17.0.tgz#d9fa2fd14ba8984950398f9e7b018d2970b5ce26" - integrity sha512-DWM5GRnvkehoNvPZWgmbl36DfzcDsUMYCT8Mh0ThiyllnS7VwU1EYBtvUR6IubxVZIVy6RIdwzCXnVczp4kAOQ== - dependencies: - "@backstage/cli-common" "^0.1.8" - "@backstage/config" "^1.0.0" - "@backstage/config-loader" "^1.1.0" - "@backstage/errors" "^1.0.0" - "@backstage/release-manifests" "^0.0.2" - "@backstage/types" "^1.0.0" - "@hot-loader/react-dom-v16" "npm:@hot-loader/react-dom@^16.0.2" - "@hot-loader/react-dom-v17" "npm:@hot-loader/react-dom@^17.0.2" - "@manypkg/get-packages" "^1.1.3" - "@octokit/request" "^5.4.12" - "@rollup/plugin-commonjs" "^21.0.1" - "@rollup/plugin-json" "^4.1.0" - "@rollup/plugin-node-resolve" "^13.0.0" - "@rollup/plugin-yaml" "^3.1.0" - "@spotify/eslint-config-base" "^13.0.0" - "@spotify/eslint-config-react" "^13.0.0" - "@spotify/eslint-config-typescript" "^13.0.0" - "@sucrase/jest-plugin" "^2.1.1" - "@sucrase/webpack-loader" "^2.0.0" - "@svgr/plugin-jsx" "6.2.x" - "@svgr/plugin-svgo" "6.2.x" - "@svgr/rollup" "6.2.x" - "@svgr/webpack" "6.2.x" - "@types/webpack-env" "^1.15.2" - "@typescript-eslint/eslint-plugin" "^5.9.0" - "@typescript-eslint/parser" "^5.9.0" - "@yarnpkg/lockfile" "^1.1.0" - bfj "^7.0.2" - buffer "^6.0.3" - chalk "^4.0.0" - chokidar "^3.3.1" - commander "^6.1.0" - css-loader "^6.5.1" - diff "^5.0.0" - esbuild "^0.14.10" - esbuild-loader "^2.18.0" - eslint "^8.6.0" - eslint-config-prettier "^8.3.0" - eslint-formatter-friendly "^7.0.0" - eslint-plugin-deprecation "^1.3.2" - eslint-plugin-import "^2.25.4" - eslint-plugin-jest "^26.1.2" - eslint-plugin-jsx-a11y "^6.5.1" - eslint-plugin-monorepo "^0.3.2" - eslint-plugin-react "^7.28.0" - eslint-plugin-react-hooks "^4.3.0" - eslint-webpack-plugin "^3.1.1" - express "^4.17.1" - fork-ts-checker-webpack-plugin "^7.0.0-alpha.8" - fs-extra "10.0.1" - glob "^7.1.7" - handlebars "^4.7.3" - html-webpack-plugin "^5.3.1" - inquirer "^8.2.0" - jest "^27.5.1" - jest-css-modules "^2.1.0" - jest-runtime "^27.5.1" - jest-transform-yaml "^1.0.0" - json-schema "^0.4.0" - lodash "^4.17.21" - mini-css-extract-plugin "^2.4.2" - minimatch "5.0.1" - node-libs-browser "^2.2.1" - npm-packlist "^5.0.0" - ora "^5.3.0" - postcss "^8.1.0" - process "^0.11.10" - react-dev-utils "^12.0.0-next.60" - react-hot-loader "^4.13.0" - recursive-readdir "^2.2.2" - replace-in-file "^6.0.0" - rollup "^2.60.2" - rollup-plugin-dts "^4.0.1" - rollup-plugin-esbuild "^4.7.2" - rollup-plugin-postcss "^4.0.0" - rollup-pluginutils "^2.8.2" - run-script-webpack-plugin "^0.0.11" - semver "^7.3.2" - style-loader "^3.3.1" - sucrase "^3.20.2" - tar "^6.1.2" - terser-webpack-plugin "^5.1.3" - util "^0.12.3" - webpack "^5.66.0" - webpack-dev-server "^4.7.3" - webpack-node-externals "^3.0.0" - yaml "^1.10.0" - yml-loader "^2.1.0" - yn "^4.0.0" - zod "^3.11.6" - -"@backstage/config-loader@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@backstage/config-loader/-/config-loader-1.1.0.tgz#477127d84705ed9a63451563c31ecb4592e58dbc" - integrity sha512-pZJz54pOSfZ5MC8vhDVrq1yM4p/T2O1iQNW5br5iv/e1JjHWpGt00yeZOxsHpsOeAfTl2JRpooUQQxpJQ47uUQ== - dependencies: - "@backstage/cli-common" "^0.1.8" - "@backstage/config" "^1.0.0" - "@backstage/errors" "^1.0.0" - "@backstage/types" "^1.0.0" - "@types/json-schema" "^7.0.6" - ajv "^8.10.0" - chokidar "^3.5.2" - fs-extra "10.0.1" - json-schema "^0.4.0" - json-schema-merge-allof "^0.8.1" - json-schema-traverse "^1.0.0" - node-fetch "^2.6.7" - typescript-json-schema "^0.53.0" - yaml "^1.9.2" - yup "^0.32.9" - -"@backstage/config@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@backstage/config/-/config-1.0.0.tgz#7af40758ae3f8e1d9ef3a07f063a1fd9cf5c364e" - integrity sha512-0M8UPHjCev3i/Puz/DGV7hor/vujx27bpWip5UTjachzBorI5xB0CBV1GfZ1UZMm5R5py7RJ+lKdmSJVFdw9IA== - dependencies: - "@backstage/types" "^1.0.0" - lodash "^4.17.21" - -"@backstage/core-app-api@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/core-app-api/-/core-app-api-1.0.1.tgz#56743fb135588f522e97e7e88a848c9a8f351406" - integrity sha512-DLsEOpmvUA+LRbhlHiYWGq360lm/WcD2uk27HXWmhEcOnvY/xUItR/aFkHF9QRuGLsU3DQkJb4/ts6/vPjuvvQ== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/types" "^1.0.0" - "@backstage/version-bridge" "^1.0.1" - "@types/prop-types" "^15.7.3" - prop-types "^15.7.2" - react-router-dom "6.0.0-beta.0" - react-use "^17.2.4" - zen-observable "^0.8.15" - zod "^3.11.6" - -"@backstage/core-components@^0.9.0", "@backstage/core-components@^0.9.3": - version "0.9.3" - resolved "https://registry.npmjs.org/@backstage/core-components/-/core-components-0.9.3.tgz#79d8bcea06281da492730fe8eb14aa18877b27c4" - integrity sha512-cZr6pT3Q7whzdKvB/M3P4NH2/J4+GHKLvQsnRNoel+DE6PmenyAPDslSRf62Lu17+n6qZNHPMfySK1rePnf0Kg== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/errors" "^1.0.0" - "@backstage/theme" "^0.2.15" - "@material-table/core" "^3.1.0" - "@material-ui/core" "^4.12.2" - "@material-ui/icons" "^4.9.1" - "@material-ui/lab" "4.0.0-alpha.57" - "@react-hookz/web" "^13.0.0" - "@types/react-sparklines" "^1.7.0" - "@types/react-text-truncate" "^0.14.0" - ansi-regex "^6.0.1" - classnames "^2.2.6" - d3-selection "^3.0.0" - d3-shape "^3.0.0" - d3-zoom "^3.0.0" - dagre "^0.8.5" - history "^5.0.0" - immer "^9.0.1" - lodash "^4.17.21" - pluralize "^8.0.0" - prop-types "^15.7.2" - qs "^6.9.4" - rc-progress "3.2.4" - react-helmet "6.1.0" - react-hook-form "^7.12.2" - react-markdown "^8.0.0" - react-router "6.0.0-beta.0" - react-router-dom "6.0.0-beta.0" - react-sparklines "^1.7.0" - react-syntax-highlighter "^15.4.5" - react-text-truncate "^0.18.0" - react-use "^17.3.2" - react-virtualized-auto-sizer "^1.0.6" - react-window "^1.8.6" - remark-gfm "^3.0.1" - zen-observable "^0.8.15" - zod "^3.11.6" - -"@backstage/core-plugin-api@^1.0.0", "@backstage/core-plugin-api@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/core-plugin-api/-/core-plugin-api-1.0.1.tgz#2ad19da6765c40db353c6ae5bf4255dab1f47be2" - integrity sha512-x7xlSDqi7SuVgbq9NSdzciDEThIfytVmtbZasY/TtHH3upLre/5AFb8SiPEFiQJX6QBmPWeKG/I+LW+91cEMig== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/types" "^1.0.0" - "@backstage/version-bridge" "^1.0.1" - history "^5.0.0" - prop-types "^15.7.2" - react-router-dom "6.0.0-beta.0" - zen-observable "^0.8.15" - -"@backstage/dev-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/dev-utils/-/dev-utils-1.0.1.tgz#42c8c8cd2521c7908ad4f60769709a56ae173a2c" - integrity sha512-f3AYmGkqgKLUgWlAX9vKLjl7C86UGQlsJvYACCR4sU35TOfaL9L8uJ/Tr9jxkGT6warpaTWzpa/pyg6FGFgIOw== - dependencies: - "@backstage/app-defaults" "^1.0.1" - "@backstage/catalog-model" "^1.0.1" - "@backstage/core-app-api" "^1.0.1" - "@backstage/core-components" "^0.9.3" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/integration-react" "^1.0.1" - "@backstage/plugin-catalog-react" "^1.0.1" - "@backstage/test-utils" "^1.0.1" - "@backstage/theme" "^0.2.15" - "@material-ui/core" "^4.12.2" - "@material-ui/icons" "^4.9.1" - "@testing-library/jest-dom" "^5.10.1" - "@testing-library/react" "^12.1.3" - "@testing-library/user-event" "^14.0.0" - react-hot-loader "^4.13.0" - react-router "6.0.0-beta.0" - react-router-dom "6.0.0-beta.0" - react-use "^17.2.4" - zen-observable "^0.8.15" - -"@backstage/integration-react@^1.0.0", "@backstage/integration-react@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/integration-react/-/integration-react-1.0.1.tgz#47f56df1fdc9c30ab43be4471667769989b2192e" - integrity sha512-+ED8g3cJFjSrbeldhgjAaPfjygRM+iDPYKwpQGLRGT1u7gyyDVtCwrg1WFRihbvG0PFbv6Nf0+la/V2Y42whpg== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/core-components" "^0.9.3" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/integration" "^1.1.0" - "@backstage/theme" "^0.2.15" - "@material-ui/core" "^4.12.2" - "@material-ui/icons" "^4.9.1" - "@material-ui/lab" "4.0.0-alpha.57" - react-use "^17.2.4" - -"@backstage/integration@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@backstage/integration/-/integration-1.1.0.tgz#4784fe96cca5af0e9bf6ca98ee357338c43f797d" - integrity sha512-2yf1ioFsbivHf/PtQy66WT7pa9Mzazc44OORDO4EFEsJT4noIZHff2NZfHvg/5dFFQPPPY/esyEf83jhsOE7Wg== - dependencies: - "@backstage/config" "^1.0.0" - "@octokit/auth-app" "^3.4.0" - "@octokit/rest" "^18.5.3" - cross-fetch "^3.1.5" - git-url-parse "^11.6.0" - lodash "^4.17.21" - luxon "^2.0.2" - -"@backstage/plugin-catalog-common@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/plugin-catalog-common/-/plugin-catalog-common-1.0.1.tgz#97d70bfb6083e576e2163af19fd096e9f97f7b88" - integrity sha512-zPf8OGSjH+ZftMnjBxTgwLtgapnO1L7fzulLQ2RRaWrUcXGk8N3szQBDcqwxfBFiWSIX1G4vvRi/BGXFMUMlnw== - dependencies: - "@backstage/plugin-permission-common" "^0.6.0" - "@backstage/search-common" "^0.3.3" - -"@backstage/plugin-catalog-react@^1.0.0", "@backstage/plugin-catalog-react@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/plugin-catalog-react/-/plugin-catalog-react-1.0.1.tgz#647cb19bff2885bb4e1e289bb1b751a7e9a36477" - integrity sha512-oDHYsU6C9/h0X1qJV8YNSQjGpL51ZdgXLuxKFYmsQv3Bw/dbxUNfoaEd1/+rQLbGW/EVZj1ma9HyF3u32wNSiA== - dependencies: - "@backstage/catalog-client" "^1.0.1" - "@backstage/catalog-model" "^1.0.1" - "@backstage/core-components" "^0.9.3" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/errors" "^1.0.0" - "@backstage/integration" "^1.1.0" - "@backstage/plugin-catalog-common" "^1.0.1" - "@backstage/plugin-permission-common" "^0.6.0" - "@backstage/plugin-permission-react" "^0.4.0" - "@backstage/theme" "^0.2.15" - "@backstage/types" "^1.0.0" - "@backstage/version-bridge" "^1.0.1" - "@material-ui/core" "^4.12.2" - "@material-ui/icons" "^4.9.1" - "@material-ui/lab" "4.0.0-alpha.57" - classnames "^2.2.6" - jwt-decode "^3.1.0" - lodash "^4.17.21" - qs "^6.9.4" - react-router "6.0.0-beta.0" - react-use "^17.2.4" - yaml "^1.10.0" - zen-observable "^0.8.15" - -"@backstage/plugin-home@^0.4.19", "@backstage/plugin-home@^0.4.20": - version "0.4.20" - resolved "https://registry.npmjs.org/@backstage/plugin-home/-/plugin-home-0.4.20.tgz#ba66cad0c7c275a3add56fc09d3c550b4aa23d5d" - integrity sha512-OhOd69fZwbOMifb8+DkqJx72q8q7GB6btLho2JdGNqKv+i4hWmnodwNp6ibs32guPY6alqj7tsjUleOuVFASPA== - dependencies: - "@backstage/catalog-model" "^1.0.1" - "@backstage/config" "^1.0.0" - "@backstage/core-components" "^0.9.3" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/plugin-catalog-react" "^1.0.1" - "@backstage/plugin-stack-overflow" "^0.1.0" - "@backstage/theme" "^0.2.15" - "@material-ui/core" "^4.12.2" - "@material-ui/icons" "^4.9.1" - "@material-ui/lab" "4.0.0-alpha.57" - lodash "^4.17.21" - react-router "6.0.0-beta.0" - react-use "^17.2.4" - -"@backstage/plugin-permission-common@^0.6.0": - version "0.6.0" - resolved "https://registry.npmjs.org/@backstage/plugin-permission-common/-/plugin-permission-common-0.6.0.tgz#85464aa10d1f271252775e5eb30ecfd88e2af152" - integrity sha512-wx5TUDFilRqmMJP8TxjR5GuulFFOPHNwoK6eNMuz5ESzLzPhiJDovqaXjqpxsdCVGNb2VJOUlND3SzbwjQ65aA== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/errors" "^1.0.0" - cross-fetch "^3.1.5" - uuid "^8.0.0" - zod "^3.11.6" - -"@backstage/plugin-permission-react@^0.4.0": - version "0.4.0" - resolved "https://registry.npmjs.org/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.0.tgz#3135b8bbd0e303afafeeae7b9a0d4de7d9e1198c" - integrity sha512-bqyBWHKQKT7Lsk4Z3Y6m2FkczN/0I7cRHiBAqv8go8etYk+tEsud9Mk7lRMX/e4+RKg3i4bLcUHerWdEeNqagw== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/plugin-permission-common" "^0.6.0" - cross-fetch "^3.1.5" - react-router "6.0.0-beta.0" - react-use "^17.2.4" - swr "^1.1.2" - -"@backstage/plugin-search-common@0.3.3", "@backstage/plugin-search-common@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@backstage/plugin-search-common/-/plugin-search-common-0.3.3.tgz#e9251172163731aef61626b3e1ec40504a38cb11" - integrity sha512-CARcpoMFEQJdpe+Rm9m/mPhMOsWM0V+zncIHOLuKlzsMrQRTcwmcFoPqBdtlfdT9wEJTu1bci2ccsDsnZiSrhA== - dependencies: - "@backstage/plugin-permission-common" "^0.6.0" - "@backstage/types" "^1.0.0" - -"@backstage/plugin-stack-overflow@^0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@backstage/plugin-stack-overflow/-/plugin-stack-overflow-0.1.0.tgz#5f5ee8b30d684b7c71f746fe923c16875a62d621" - integrity sha512-ti0eEwkiu+cmihIISiEA5tqQil6gISyy34flQyxL0wukLNrKAOYCq+lgrN+N/MqJijXoy/FugWhX24+PKsocLQ== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/core-components" "^0.9.3" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/plugin-home" "^0.4.20" - "@backstage/plugin-search-common" "^0.3.3" - "@backstage/theme" "^0.2.15" - "@material-ui/core" "^4.12.2" - "@material-ui/icons" "^4.9.1" - "@testing-library/jest-dom" "^5.10.1" - cross-fetch "^3.1.5" - lodash "^4.17.21" - qs "^6.9.4" - react-use "^17.2.4" - -"@backstage/release-manifests@^0.0.2": - version "0.0.2" - resolved "https://registry.npmjs.org/@backstage/release-manifests/-/release-manifests-0.0.2.tgz#42faca60dae0c89cf6bc6fbf1b34e1e8cb2a564b" - integrity sha512-gBzcxIlDM3k0SXhVfyKQDxRvwS2hdXPy1qQU+wcVijImGez0CIIw1iD1+ksCYpWKb8uGZFovLj4fEvm5fA942g== - dependencies: - cross-fetch "^3.1.5" - -"@backstage/search-common@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@backstage/search-common/-/search-common-0.3.3.tgz#756af22187283b754aefdc436c651231054be269" - integrity sha512-DtWd1Nrpvm2fkJRkw6bW8WeB6cFOvxsJ//o/fcoMsD5NCnaFtE1kFlCEt6QuUl6chAg6d+cX0rU+DJjSIC1rgQ== - dependencies: - "@backstage/plugin-search-common" "0.3.3" - -"@backstage/test-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@backstage/test-utils/-/test-utils-1.0.1.tgz#ce8c6e75bcd424b527d4f903ee6f276a8d1855b7" - integrity sha512-KXG0VXqR+Q/GIJz0Ycasr5ZBOtUxAjA1prbY2L4NovaZNyCC/emIaOw/zqhvhhX6XdHV4pP5sQBbAhg4Ceoc6g== - dependencies: - "@backstage/config" "^1.0.0" - "@backstage/core-app-api" "^1.0.1" - "@backstage/core-plugin-api" "^1.0.1" - "@backstage/plugin-permission-common" "^0.6.0" - "@backstage/plugin-permission-react" "^0.4.0" - "@backstage/theme" "^0.2.15" - "@backstage/types" "^1.0.0" - "@material-ui/core" "^4.12.2" - "@material-ui/icons" "^4.11.2" - "@testing-library/jest-dom" "^5.10.1" - "@testing-library/react" "^12.1.3" - "@testing-library/user-event" "^14.0.0" - cross-fetch "^3.1.5" - react-router "6.0.0-beta.0" - react-router-dom "6.0.0-beta.0" - zen-observable "^0.8.15" - "@balena/dockerignore@^1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" @@ -7307,18 +6857,10 @@ "@typescript-eslint/types" "5.23.0" "@typescript-eslint/visitor-keys" "5.23.0" -"@typescript-eslint/scope-manager@5.9.0": - version "5.9.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz#02dfef920290c1dcd7b1999455a3eaae7a1a3117" - integrity sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg== - dependencies: - "@typescript-eslint/types" "5.9.0" - "@typescript-eslint/visitor-keys" "5.9.0" - -"@typescript-eslint/type-utils@5.23.0": - version "5.23.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.23.0.tgz#f852252f2fc27620d5bb279d8fed2a13d2e3685e" - integrity sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw== +"@typescript-eslint/scope-manager@5.24.0": + version "5.24.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.24.0.tgz#ac8c4d65064204b596909c204fe9b7e30c3f51b2" + integrity sha512-WpMWipcDzGmMzdT7NtTjRXFabx10WleLUGrJpuJLGaxSqpcyq5ACpKSD5VE40h2nz3melQ91aP4Du7lh9FliCA== dependencies: "@typescript-eslint/types" "5.27.0" "@typescript-eslint/visitor-keys" "5.27.0" @@ -7350,13 +6892,18 @@ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.23.0.tgz#8733de0f58ae0ed318dbdd8f09868cdbf9f9ad09" integrity sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw== -<<<<<<< HEAD "@typescript-eslint/types@5.24.0": version "5.24.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.24.0.tgz#565ff94a4b89073265e27514dc65225d18aabe6c" integrity sha512-Tpg1c3shTDgTmZd3qdUyd+16r/pGmVaVEbLs+ufuWP0EruVbUiEOmpBBQxBb9a8iPRxi8Rb2oiwOxuZJzSq11A== -======= +"@typescript-eslint/types@5.9.0": + version "5.9.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz#e5619803e39d24a03b3369506df196355736e1a3" + integrity sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg== + +"@typescript-eslint/typescript-estree@5.20.0": + version "5.20.0" resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz#ab73686ab18c8781bbf249c9459a55dc9417d6b0" integrity sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w== dependencies: @@ -7381,6 +6928,19 @@ semver "^7.3.5" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.24.0": + version "5.24.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.24.0.tgz#30b9cbc1af475b9e02aca34cfe9ba9e1bb820143" + integrity sha512-zcor6vQkQmZAQfebSPVwUk/FD+CvnsnlfKXYeQDsWXRF+t7SBPmIfNia/wQxCSeu1h1JIjwV2i9f5/DdSp/uDw== + dependencies: + "@typescript-eslint/types" "5.24.0" + "@typescript-eslint/visitor-keys" "5.24.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/typescript-estree@5.9.0": version "5.9.0" resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz#0e5c6f03f982931abbfbc3c1b9df5fbf92a3490f" @@ -7394,15 +6954,15 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.23.0": - version "5.23.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.23.0.tgz#4691c3d1b414da2c53d8943310df36ab1c50648a" - integrity sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA== +"@typescript-eslint/utils@5.24.0": + version "5.24.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.24.0.tgz#7a854028040a305ddea129328e45cfb2c6406e75" + integrity sha512-K05sbWoeCBJH8KXu6hetBJ+ukG0k2u2KlgD3bN+v+oBKm8adJqVHpSSLHNzqyuv0Lh4GVSAUgZ5lB4icmPmWLw== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.23.0" - "@typescript-eslint/types" "5.23.0" - "@typescript-eslint/typescript-estree" "5.23.0" + "@typescript-eslint/scope-manager" "5.24.0" + "@typescript-eslint/types" "5.24.0" + "@typescript-eslint/typescript-estree" "5.24.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -7431,24 +6991,17 @@ resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.23.0.tgz#057c60a7ca64667a39f991473059377a8067c87b" integrity sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg== dependencies: -<<<<<<< HEAD - "@typescript-eslint/types" "5.27.0" -======= "@typescript-eslint/types" "5.23.0" eslint-visitor-keys "^3.0.0" -<<<<<<< HEAD "@typescript-eslint/visitor-keys@5.24.0": version "5.24.0" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.24.0.tgz#bb3e9a788ccd50c53e03557e4e203599880c3123" integrity sha512-qzGwSXMyMnogcAo+/2fU+jhlPPVMXlIH2PeAonIKjJSoDKl1+lJVvG5Z5Oud36yU0TWK2cs1p/FaSN5J2OUFYA== dependencies: "@typescript-eslint/types" "5.24.0" ->>>>>>> Fix some typos and other requested changes eslint-visitor-keys "^3.3.0" -======= ->>>>>>> Fix some typos and other requested changes "@typescript-eslint/visitor-keys@5.9.0": version "5.9.0" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz#7585677732365e9d27f1878150fab3922784a1a6" @@ -8362,9 +7915,9 @@ aws-sdk-mock@^5.2.1: traverse "^0.6.6" aws-sdk@^2.1122.0, aws-sdk@^2.840.0, aws-sdk@^2.948.0: - version "2.1132.0" - resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1132.0.tgz#0cb615e97db5a5133914ba0f2bdc8ea10eef4069" - integrity sha512-NPDesfTrNx8UMQ5VuosQNlFFFhswJ8cGVcVltZBXKVl1kW0BCp52XQBySSruIznaRX7vG6Ir2+nox0NdL05qBQ== + version "2.1137.0" + resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1137.0.tgz#505e51b3c9ed31d54bbd620cb70d005e6086f23b" + integrity sha512-iOm81glo7Y3bj6bO6pUEhFlclfANe0ExBJOZ8TxFx2mE8KsaPkofAy8dSzwbn357yOyVxur9tkZgXM2f05ynlA== dependencies: buffer "4.9.2" events "1.1.1" @@ -9029,11 +8582,6 @@ btoa-lite@^1.0.0: resolved "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= -btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -9914,11 +9462,6 @@ commander@^5.1.0: resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - commander@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -10276,20 +9819,12 @@ cookie@0.4.2, cookie@^0.4.1, cookie@^0.4.2, cookie@~0.4.1: resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -<<<<<<< HEAD cookie@0.5.0, cookie@~0.5.0: -======= -cookie@0.5.0: ->>>>>>> Fix some typos and other requested changes version "0.5.0" resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -<<<<<<< HEAD -cookiejar@^2.1.3: -======= cookiejar@^2.1.0, cookiejar@^2.1.3: ->>>>>>> Fix some typos and other requested changes version "2.1.3" resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== @@ -11081,14 +10616,6 @@ dataloader@2.1.0, dataloader@^2.0.0: resolved "https://registry.npmjs.org/dataloader/-/dataloader-2.1.0.tgz#c69c538235e85e7ac6c6c444bae8ecabf5de9df7" integrity sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ== -<<<<<<< HEAD -======= -date-and-time@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/date-and-time/-/date-and-time-2.3.0.tgz#1b509be4c938dbbf5fc9c14d66e1daf9fe3cef13" - integrity sha512-DY53oj742mykXjZzDxT7NxH5cxwBRb7FsVG5+8pcV96qU9JQd0UhA21pQB18fwwsXOXeSM0RJV4OzgVxu8eatg== - ->>>>>>> Fix some typos and other requested changes date-fns@^1.27.2: version "1.30.1" resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" @@ -12105,8 +11632,8 @@ esbuild-windows-arm64@0.14.42: resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.42.tgz#79da8744626f24bc016dc40d016950b5a4a2bac5" integrity sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw== -<<<<<<< HEAD esbuild@^0.14.1, esbuild@^0.14.10, esbuild@^0.14.39: +<<<<<<< HEAD <<<<<<< HEAD version "0.14.42" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.42.tgz#98587df0b024d5f6341b12a1d735a2bff55e1836" @@ -12115,6 +11642,8 @@ esbuild@^0.14.1, esbuild@^0.14.10, esbuild@^0.14.39: ======= esbuild@^0.14.1, esbuild@^0.14.10, esbuild@^0.14.6: >>>>>>> Fix some typos and other requested changes +======= +>>>>>>> Apply changes, update tests & change vault icon temporarilly version "0.14.39" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz#c926b2259fe6f6d3a94f528fb42e103c5a6d909a" integrity sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ== @@ -13391,15 +12920,6 @@ fs-constants@^1.0.0: resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" - integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@10.1.0, fs-extra@^10.0.0, fs-extra@^10.0.1: version "10.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -16222,13 +15742,6 @@ joi@^17.4.0: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" -jose@^1.27.1: - version "1.28.1" - resolved "https://registry.npmjs.org/jose/-/jose-1.28.1.tgz#34a0f851a534be59ffab82a6e8845f6874e8c128" - integrity sha512-6JK28rFu5ENp/yxMwM+iN7YeaInnY9B9Bggjkz5fuwLiJhbVrl2O4SJr65bdNBPl9y27fdC3Mymh+FVCvozLIg== - dependencies: - "@panva/asn1.js" "^1.0.0" - jose@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz#29746a18d9fff7dcf9d5d2a6f62cb0c7cd27abd3" @@ -16799,9 +16312,9 @@ keyv@^3.0.0: json-buffer "3.0.0" keyv@^4.0.0, keyv@^4.0.3: - version "4.2.7" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.2.7.tgz#00b8994d46098e8eb8c933cb29aaaf18be5effea" - integrity sha512-HeOstD8SXvtWoQhMMBCelcUuZsiV7T7MwsADtOXT0KuwYP9nCxrSoMDeLXNDTLN3VFSuRp38JzoGbbTboq3QQw== + version "4.2.9" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.2.9.tgz#b8f25d4968b583ed7f07fceadab646d4baadad6b" + integrity sha512-vqRBrN4xQHud7UMAGzGGFbt96MtGB9pb0OOg8Dhtq5RtiswCb1pCFq878iqC4hdeOP6eDPnCoFxA+2TXx427Ow== dependencies: compress-brotli "^1.3.8" json-buffer "3.0.1" @@ -17579,6 +17092,7 @@ lunr@^2.3.9: resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== +<<<<<<< HEAD <<<<<<< HEAD luxon@^1.23.x: version "1.28.0" @@ -17588,10 +17102,9 @@ luxon@^1.23.x: ======= <<<<<<< HEAD >>>>>>> Fix some typos and other requested changes -luxon@^2.0.2, luxon@^2.3.0, luxon@^2.3.1: ======= -luxon@^2.0.2, luxon@^2.3.0, luxon@^2.4.0: ->>>>>>> Fix some typos and other requested changes +>>>>>>> Apply changes, update tests & change vault icon temporarilly +luxon@^2.0.2, luxon@^2.3.0, luxon@^2.3.1: version "2.4.0" resolved "https://registry.npmjs.org/luxon/-/luxon-2.4.0.tgz#9435806545bb32d4234dab766ab8a3d54847a765" integrity sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA== @@ -20924,17 +20437,10 @@ postgres-interval@^1.1.0: dependencies: xtend "^4.0.0" -<<<<<<< HEAD prebuild-install@^7.1.0: version "7.1.0" resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz#991b6ac16c81591ba40a6d5de93fb33673ac1370" integrity sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA== -======= -prebuild-install@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870" - integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg== ->>>>>>> Fix some typos and other requested changes dependencies: detect-libc "^2.0.0" expand-template "^2.0.3" @@ -24281,21 +23787,13 @@ svgo@^2.5.0, svgo@^2.7.0: picocolors "^1.0.0" stable "^0.1.8" -<<<<<<< HEAD swagger-client@^3.18.5: version "3.18.5" resolved "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.5.tgz#8034df561452f4bbd36871a8072394b7ca883106" integrity sha512-c0txGDtfQTJnaIBaEKCwtRNcUaaAfj+RXI4QVV9p3WW+AUCQqp4naCjaDNNsOfMkE4ySyhnblbL+jGqAVC7snw== -======= -swagger-client@^3.18.4: - version "3.18.4" - resolved "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.4.tgz#71be9df585157a3335a542c407733d2134fa75e9" - integrity sha512-Wj26oEctONq/u0uM+eSj18675YM5e2vFnx7Kr4neLeXEHKUsfceVQ/OdtrBXdrT3VbtdBbZfMTfl1JOBpix2MA== ->>>>>>> Fix some typos and other requested changes dependencies: "@babel/runtime-corejs3" "^7.11.2" - btoa "^1.2.1" - cookie "~0.4.1" + cookie "~0.5.0" cross-fetch "^3.1.5" deepmerge "~4.2.2" fast-json-patch "^3.0.0-1" @@ -26277,6 +25775,7 @@ write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" +<<<<<<< HEAD <<<<<<< HEAD ws@8.7.0, ws@^8.0.0, ws@^8.3.0: version "8.7.0" @@ -26284,10 +25783,13 @@ ws@8.7.0, ws@^8.0.0, ws@^8.3.0: integrity sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg== ======= <<<<<<< HEAD +======= +>>>>>>> Apply changes, update tests & change vault icon temporarilly ws@8.6.0, ws@^8.0.0, ws@^8.3.0: version "8.6.0" resolved "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== +<<<<<<< HEAD ======= ws@8.5.0, ws@^8.4.2: version "8.5.0" @@ -26295,23 +25797,18 @@ ws@8.5.0, ws@^8.4.2: integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== >>>>>>> Fix some typos and other requested changes >>>>>>> Fix some typos and other requested changes +======= +>>>>>>> Apply changes, update tests & change vault icon temporarilly ws@^7.3.1, ws@^7.4.6: version "7.5.7" resolved "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== -<<<<<<< HEAD ws@^8.4.2: version "8.5.0" resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== -======= -ws@^8.0.0, ws@^8.3.0: - version "8.6.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" - integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== ->>>>>>> Fix some typos and other requested changes ws@~7.4.2: version "7.4.6" @@ -26508,9 +26005,9 @@ yargs-parser@^20.2.2: integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.0.0: - version "21.0.0" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" - integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + version "21.0.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== yargs-parser@^3.2.0: version "3.2.0" @@ -26568,15 +26065,13 @@ yargs@^17.0.1, yargs@^17.3.1: ======= yargs@^17.3.1: <<<<<<< HEAD +<<<<<<< HEAD >>>>>>> Fix some typos and other requested changes +======= +>>>>>>> Apply changes, update tests & change vault icon temporarilly version "17.5.1" resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== -======= - version "17.4.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284" - integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g== ->>>>>>> Fix some typos and other requested changes dependencies: cliui "^7.0.2" escalade "^3.1.1"