From 7e9e53dbbcc6b878fa0476926151d9e908f2a23c Mon Sep 17 00:00:00 2001 From: kjuulh Date: Thu, 22 Dec 2022 17:00:50 +0100 Subject: [PATCH] add base setup as well as catalog for gitea --- app-config.yaml | 12 +- packages/app/package.json | 3 +- packages/app/src/App.tsx | 23 ++- packages/backend/package.json | 7 +- packages/backend/src/plugins/auth.ts | 69 ++++--- packages/backend/src/plugins/catalog.ts | 29 +++ .../catalog-backend-module-gitea/.eslintrc.js | 1 + .../catalog-backend-module-gitea/README.md | 13 ++ .../dev/index.tsx | 12 ++ .../catalog-backend-module-gitea/package.json | 53 +++++ .../ExampleComponent.test.tsx | 32 +++ .../ExampleComponent/ExampleComponent.tsx | 38 ++++ .../src/components/ExampleComponent/index.ts | 1 + .../ExampleFetchComponent.test.tsx | 25 +++ .../ExampleFetchComponent.tsx | 90 +++++++++ .../components/ExampleFetchComponent/index.ts | 1 + .../catalog-backend-module-gitea/src/index.ts | 1 + .../src/plugin.test.ts | 7 + .../src/plugin.ts | 19 ++ .../src/routes.ts | 5 + .../src/setupTests.ts | 2 + yarn.lock | 189 +++++++++++++++++- 22 files changed, 584 insertions(+), 48 deletions(-) create mode 100644 plugins/catalog-backend-module-gitea/.eslintrc.js create mode 100644 plugins/catalog-backend-module-gitea/README.md create mode 100644 plugins/catalog-backend-module-gitea/dev/index.tsx create mode 100644 plugins/catalog-backend-module-gitea/package.json create mode 100644 plugins/catalog-backend-module-gitea/src/components/ExampleComponent/ExampleComponent.test.tsx create mode 100644 plugins/catalog-backend-module-gitea/src/components/ExampleComponent/ExampleComponent.tsx create mode 100644 plugins/catalog-backend-module-gitea/src/components/ExampleComponent/index.ts create mode 100644 plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx create mode 100644 plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx create mode 100644 plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/index.ts create mode 100644 plugins/catalog-backend-module-gitea/src/index.ts create mode 100644 plugins/catalog-backend-module-gitea/src/plugin.test.ts create mode 100644 plugins/catalog-backend-module-gitea/src/plugin.ts create mode 100644 plugins/catalog-backend-module-gitea/src/routes.ts create mode 100644 plugins/catalog-backend-module-gitea/src/setupTests.ts diff --git a/app-config.yaml b/app-config.yaml index 58cf98b..eb41c0f 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -51,11 +51,6 @@ integrations: username: kjuulh password: 1a52087b213ebcec826e3d7a5c19857224c9621b -proxy: - '/test': - target: 'https://example.com' - changeOrigin: true - # Reference documentation http://backstage.io/docs/features/techdocs/configuration # Note: After experimenting with basic setup, use CI/CD to generate docs # and an external cloud storage when deploying TechDocs for production use-case. @@ -68,6 +63,7 @@ techdocs: type: 'local' # Alternatives - 'googleGcs' or 'awsS3'. Read documentation for using alternatives. auth: + environment: development # see https://backstage.io/docs/auth/ to learn about auth providers providers: github: @@ -86,11 +82,13 @@ catalog: System, API, Resource, - Location + Location, + ] providers: github: - kjuulh: {} + kjuulh: + organization: "kjuulh" gitea: kjuulh: {} diff --git a/packages/app/package.json b/packages/app/package.json index f4cbcda..766e33f 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -28,10 +28,11 @@ "@backstage/plugin-search-react": "^0.2.1", "@backstage/plugin-tech-radar": "^0.5.13", "@backstage/plugin-techdocs": "^1.2.0", - "@backstage/plugin-techdocs-react": "^1.0.1", "@backstage/plugin-techdocs-module-addons-contrib": "^1.0.1", + "@backstage/plugin-techdocs-react": "^1.0.1", "@backstage/plugin-user-settings": "^0.4.5", "@backstage/theme": "^0.2.15", + "@internal/plugin-catalog-backend-module-gitea": "^0.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "history": "^5.0.0", diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index c487726..f02874a 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -27,15 +27,35 @@ import { entityPage } from './components/catalog/EntityPage'; import { searchPage } from './components/search/SearchPage'; import { Root } from './components/Root'; -import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; +import { + AlertDisplay, + OAuthRequestDialog, + SignInPage, +} from '@backstage/core-components'; import { createApp } from '@backstage/app-defaults'; import { FlatRoutes } from '@backstage/core-app-api'; import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; import { PermissionedRoute } from '@backstage/plugin-permission-react'; import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; +import { githubAuthApiRef } from '@backstage/core-plugin-api'; +import { CatalogBackendModuleGiteaPage } from '@internal/plugin-catalog-backend-module-gitea'; const app = createApp({ apis, + components: { + SignInPage: props => ( + + ), + }, bindRoutes({ bind }) { bind(catalogPlugin.externalRoutes, { createComponent: scaffolderPlugin.routes.root, @@ -91,6 +111,7 @@ const routes = ( } /> } /> + }/> ); diff --git a/packages/backend/package.json b/packages/backend/package.json index 2e377ca..34e9ff1 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -16,15 +16,15 @@ "build-image": "docker build ../.. -f Dockerfile --tag backstage" }, "dependencies": { - "app": "link:../app", "@backstage/backend-common": "^0.14.0", "@backstage/backend-tasks": "^0.3.2", - "@backstage/catalog-model": "^1.0.3", "@backstage/catalog-client": "^1.0.3", + "@backstage/catalog-model": "^1.0.3", "@backstage/config": "^1.0.1", "@backstage/plugin-app-backend": "^0.3.33", "@backstage/plugin-auth-backend": "^0.14.1", "@backstage/plugin-catalog-backend": "^1.2.0", + "@backstage/plugin-catalog-backend-module-github": "^0.2.2", "@backstage/plugin-permission-common": "^0.6.2", "@backstage/plugin-permission-node": "^0.6.2", "@backstage/plugin-proxy-backend": "^0.2.27", @@ -33,6 +33,7 @@ "@backstage/plugin-search-backend-module-pg": "^0.3.4", "@backstage/plugin-search-backend-node": "^0.6.2", "@backstage/plugin-techdocs-backend": "^1.1.2", + "app": "link:../app", "dockerode": "^3.3.1", "express": "^4.17.1", "express-promise-router": "^4.1.0", @@ -42,8 +43,8 @@ "devDependencies": { "@backstage/cli": "^0.17.2", "@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", "better-sqlite3": "^7.5.0" }, diff --git a/packages/backend/src/plugins/auth.ts b/packages/backend/src/plugins/auth.ts index 159116d..9ab957d 100644 --- a/packages/backend/src/plugins/auth.ts +++ b/packages/backend/src/plugins/auth.ts @@ -1,11 +1,41 @@ +import { + DEFAULT_NAMESPACE, + stringifyEntityRef, +} from '@backstage/catalog-model'; import { createRouter, providers, defaultAuthProviderFactories, + SignInInfo, + AuthResolverContext, } from '@backstage/plugin-auth-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; +const unknownUserSignInResolver = async ( + { profile }: SignInInfo, + ctx: AuthResolverContext, +) => { + if (!profile.email) { + throw new Error('Login failed, user profile does not contain an email'); + } + + //const [_, localPart] = profile.email.split('@'); + + const userEntityRef = stringifyEntityRef({ + kind: 'User', + name: 'kjuulh', + namespace: DEFAULT_NAMESPACE, + }); + + return ctx.issueToken({ + claims: { + sub: userEntityRef, + ent: [userEntityRef], + }, + }); +}; + export default async function createPlugin( env: PluginEnvironment, ): Promise { @@ -17,36 +47,19 @@ export default async function createPlugin( tokenManager: env.tokenManager, providerFactories: { ...defaultAuthProviderFactories, - - // This replaces the default GitHub auth provider with a customized one. - // The `signIn` option enables sign-in for this provider, using the - // identity resolution logic that's provided in the `resolver` callback. - // - // This particular resolver makes all users share a single "guest" identity. - // It should only be used for testing and trying out Backstage. - // - // If you want to use a production ready resolver you can switch to the - // the one that is commented out below, it looks up a user entity in the - // catalog using the GitHub username of the authenticated user. - // That resolver requires you to have user entities populated in the catalog, - // for example using https://backstage.io/docs/integrations/github/org - // - // There are other resolvers to choose from, and you can also create - // your own, see the auth documentation for more details: - // - // https://backstage.io/docs/auth/identity-resolver github: providers.github.create({ signIn: { - resolver(_, ctx) { - const userRef = 'user:default/guest'; // Must be a full entity reference - return ctx.issueToken({ - claims: { - sub: userRef, // The user's own identity - ent: [userRef], // A list of identities that the user claims ownership through - }, - }); - }, - // resolver: providers.github.resolvers.usernameMatchingUserEntityName(), + //resolver(_, ctx) { + // const userRef = 'user:default/guest'; // Must be a full entity reference + // return ctx.issueToken({ + // claims: { + // sub: userRef, // The user's own identity + // ent: [userRef], // A list of identities that the user claims ownership through + // }, + // }); + //}, + resolver: unknownUserSignInResolver, + //resolver: providers.github.resolvers.usernameMatchingUserEntityName(), }, }), }, diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index 876cb6b..ef4f6dc 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -2,11 +2,40 @@ import { CatalogBuilder } from '@backstage/plugin-catalog-backend'; import { ScaffolderEntitiesProcessor } from '@backstage/plugin-scaffolder-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; +import { GithubEntityProvider } from '@backstage/plugin-catalog-backend-module-github'; +import { stringifyEntityRef } from '@backstage/catalog-model'; export default async function createPlugin( env: PluginEnvironment, ): Promise { const builder = await CatalogBuilder.create(env); + + builder.subscribe({ + onProcessingError: event => { + env.logger.error( + `Catalog got processing errors on entity ${stringifyEntityRef( + event.unprocessedEntity, + )}`, + { + entity: stringifyEntityRef(event.unprocessedEntity), + entityDetails: event.unprocessedEntity, + errors: event.errors.map(err => JSON.stringify(err)), + }, + ); + }, + }); + + builder.addEntityProvider( + GithubEntityProvider.fromConfig(env.config, { + logger: env.logger, + schedule: env.scheduler.createScheduledTaskRunner({ + frequency: { minutes: 30 }, + timeout: { minutes: 3 }, + }), + scheduler: env.scheduler, + }), + ); + builder.addProcessor(new ScaffolderEntitiesProcessor()); const { processingEngine, router } = await builder.build(); await processingEngine.start(); diff --git a/plugins/catalog-backend-module-gitea/.eslintrc.js b/plugins/catalog-backend-module-gitea/.eslintrc.js new file mode 100644 index 0000000..e2a53a6 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/catalog-backend-module-gitea/README.md b/plugins/catalog-backend-module-gitea/README.md new file mode 100644 index 0000000..32f5776 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/README.md @@ -0,0 +1,13 @@ +# catalog-backend-module-gitea + +Welcome to the catalog-backend-module-gitea plugin! + +_This plugin was created through the Backstage CLI_ + +## Getting started + +Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/catalog-backend-module-gitea](http://localhost:3000/catalog-backend-module-gitea). + +You can also serve the plugin in isolation by running `yarn start` in the plugin directory. +This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads. +It is only meant for local development, and the setup for it can be found inside the [/dev](./dev) directory. diff --git a/plugins/catalog-backend-module-gitea/dev/index.tsx b/plugins/catalog-backend-module-gitea/dev/index.tsx new file mode 100644 index 0000000..d2902dd --- /dev/null +++ b/plugins/catalog-backend-module-gitea/dev/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { createDevApp } from '@backstage/dev-utils'; +import { catalogBackendModuleGiteaPlugin, CatalogBackendModuleGiteaPage } from '../src/plugin'; + +createDevApp() + .registerPlugin(catalogBackendModuleGiteaPlugin) + .addPage({ + element: , + title: 'Root Page', + path: '/catalog-backend-module-gitea' + }) + .render(); diff --git a/plugins/catalog-backend-module-gitea/package.json b/plugins/catalog-backend-module-gitea/package.json new file mode 100644 index 0000000..af546a3 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/package.json @@ -0,0 +1,53 @@ +{ + "name": "@internal/plugin-catalog-backend-module-gitea", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "frontend-plugin" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/core-components": "^0.9.5", + "@backstage/core-plugin-api": "^1.0.3", + "@backstage/theme": "^0.2.15", + "@material-ui/core": "^4.9.13", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.57", + "react-use": "^17.2.4" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.17.2", + "@backstage/core-app-api": "^1.0.3", + "@backstage/dev-utils": "^1.0.3", + "@backstage/test-utils": "^1.1.1", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^12.1.3", + "@testing-library/user-event": "^14.0.0", + "@types/jest": "*", + "@types/node": "*", + "msw": "^0.42.0", + "cross-fetch": "^3.1.5" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/ExampleComponent.test.tsx b/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/ExampleComponent.test.tsx new file mode 100644 index 0000000..07e2419 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/ExampleComponent.test.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { ExampleComponent } from './ExampleComponent'; +import { ThemeProvider } from '@material-ui/core'; +import { lightTheme } from '@backstage/theme'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { + setupRequestMockHandlers, + renderInTestApp, +} from "@backstage/test-utils"; + +describe('ExampleComponent', () => { + const server = setupServer(); + // Enable sane handlers for network requests + setupRequestMockHandlers(server); + + // setup mock response + beforeEach(() => { + server.use( + rest.get('/*', (_, res, ctx) => res(ctx.status(200), ctx.json({}))), + ); + }); + + it('should render', async () => { + const rendered = await renderInTestApp( + + + , + ); + expect(rendered.getByText('Welcome to catalog-backend-module-gitea!')).toBeInTheDocument(); + }); +}); diff --git a/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/ExampleComponent.tsx b/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/ExampleComponent.tsx new file mode 100644 index 0000000..858107d --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/ExampleComponent.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { Typography, Grid } from '@material-ui/core'; +import { + InfoCard, + Header, + Page, + Content, + ContentHeader, + HeaderLabel, + SupportButton, +} from '@backstage/core-components'; +import { ExampleFetchComponent } from '../ExampleFetchComponent'; + +export const ExampleComponent = () => ( + +
+ + +
+ + + A description of your plugin goes here. + + + + + + All content should be wrapped in a card like this. + + + + + + + + +
+); diff --git a/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/index.ts b/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/index.ts new file mode 100644 index 0000000..8b84375 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/components/ExampleComponent/index.ts @@ -0,0 +1 @@ +export { ExampleComponent } from './ExampleComponent'; diff --git a/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx b/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx new file mode 100644 index 0000000..95533c8 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import { ExampleFetchComponent } from './ExampleFetchComponent'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { setupRequestMockHandlers } from '@backstage/test-utils'; + +describe('ExampleFetchComponent', () => { + const server = setupServer(); + // Enable sane handlers for network requests + setupRequestMockHandlers(server); + + // setup mock response + beforeEach(() => { + server.use( + rest.get('https://randomuser.me/*', (_, res, ctx) => + res(ctx.status(200), ctx.delay(2000), ctx.json({})), + ), + ); + }); + it('should render', async () => { + const rendered = render(); + expect(await rendered.findByTestId('progress')).toBeInTheDocument(); + }); +}); diff --git a/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx b/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx new file mode 100644 index 0000000..8790e35 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import { Table, TableColumn, Progress } from '@backstage/core-components'; +import Alert from '@material-ui/lab/Alert'; +import useAsync from 'react-use/lib/useAsync'; + +const useStyles = makeStyles({ + avatar: { + height: 32, + width: 32, + borderRadius: '50%', + }, +}); + +type User = { + gender: string; // "male" + name: { + title: string; // "Mr", + first: string; // "Duane", + last: string; // "Reed" + }; + location: object; // {street: {number: 5060, name: "Hickory Creek Dr"}, city: "Albany", state: "New South Wales",…} + email: string; // "duane.reed@example.com" + login: object; // {uuid: "4b785022-9a23-4ab9-8a23-cb3fb43969a9", username: "blackdog796", password: "patch",…} + dob: object; // {date: "1983-06-22T12:30:23.016Z", age: 37} + registered: object; // {date: "2006-06-13T18:48:28.037Z", age: 14} + phone: string; // "07-2154-5651" + cell: string; // "0405-592-879" + id: { + name: string; // "TFN", + value: string; // "796260432" + }; + picture: { medium: string }; // {medium: "https://randomuser.me/api/portraits/men/95.jpg",…} + nat: string; // "AU" +}; + +type DenseTableProps = { + users: User[]; +}; + +export const DenseTable = ({ users }: DenseTableProps) => { + const classes = useStyles(); + + const columns: TableColumn[] = [ + { title: 'Avatar', field: 'avatar' }, + { title: 'Name', field: 'name' }, + { title: 'Email', field: 'email' }, + { title: 'Nationality', field: 'nationality' }, + ]; + + const data = users.map(user => { + return { + avatar: ( + {user.name.first} + ), + name: `${user.name.first} ${user.name.last}`, + email: user.email, + nationality: user.nat, + }; + }); + + return ( + + ); +}; + +export const ExampleFetchComponent = () => { + const { value, loading, error } = useAsync(async (): Promise => { + const response = await fetch('https://randomuser.me/api/?results=20'); + const data = await response.json(); + return data.results; + }, []); + + if (loading) { + return ; + } else if (error) { + return {error.message}; + } + + return ; +}; diff --git a/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/index.ts b/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/index.ts new file mode 100644 index 0000000..41a43e8 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/components/ExampleFetchComponent/index.ts @@ -0,0 +1 @@ +export { ExampleFetchComponent } from './ExampleFetchComponent'; diff --git a/plugins/catalog-backend-module-gitea/src/index.ts b/plugins/catalog-backend-module-gitea/src/index.ts new file mode 100644 index 0000000..bf735e2 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/index.ts @@ -0,0 +1 @@ +export { catalogBackendModuleGiteaPlugin, CatalogBackendModuleGiteaPage } from './plugin'; diff --git a/plugins/catalog-backend-module-gitea/src/plugin.test.ts b/plugins/catalog-backend-module-gitea/src/plugin.test.ts new file mode 100644 index 0000000..6e3082d --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/plugin.test.ts @@ -0,0 +1,7 @@ +import { catalogBackendModuleGiteaPlugin } from './plugin'; + +describe('catalog-backend-module-gitea', () => { + it('should export plugin', () => { + expect(catalogBackendModuleGiteaPlugin).toBeDefined(); + }); +}); diff --git a/plugins/catalog-backend-module-gitea/src/plugin.ts b/plugins/catalog-backend-module-gitea/src/plugin.ts new file mode 100644 index 0000000..ab4bd48 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/plugin.ts @@ -0,0 +1,19 @@ +import { createPlugin, createRoutableExtension } from '@backstage/core-plugin-api'; + +import { rootRouteRef } from './routes'; + +export const catalogBackendModuleGiteaPlugin = createPlugin({ + id: 'catalog-backend-module-gitea', + routes: { + root: rootRouteRef, + }, +}); + +export const CatalogBackendModuleGiteaPage = catalogBackendModuleGiteaPlugin.provide( + createRoutableExtension({ + name: 'CatalogBackendModuleGiteaPage', + component: () => + import('./components/ExampleComponent').then(m => m.ExampleComponent), + mountPoint: rootRouteRef, + }), +); diff --git a/plugins/catalog-backend-module-gitea/src/routes.ts b/plugins/catalog-backend-module-gitea/src/routes.ts new file mode 100644 index 0000000..80cbd13 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/routes.ts @@ -0,0 +1,5 @@ +import { createRouteRef } from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + id: 'catalog-backend-module-gitea', +}); diff --git a/plugins/catalog-backend-module-gitea/src/setupTests.ts b/plugins/catalog-backend-module-gitea/src/setupTests.ts new file mode 100644 index 0000000..48c09b5 --- /dev/null +++ b/plugins/catalog-backend-module-gitea/src/setupTests.ts @@ -0,0 +1,2 @@ +import '@testing-library/jest-dom'; +import 'cross-fetch/polyfill'; diff --git a/yarn.lock b/yarn.lock index c0ac788..d442ea5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2304,7 +2304,7 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@backstage/app-defaults@^1.0.3": +"@backstage/app-defaults@^1.0.10", "@backstage/app-defaults@^1.0.3": version "1.0.10" resolved "https://registry.yarnpkg.com/@backstage/app-defaults/-/app-defaults-1.0.10.tgz#0c1ac246e555d0175b5bf7161174e087a02959dc" integrity sha512-H7YCEm0Vx7nLS7JIdgWf2ab8xgMUoJhkpwcqfdbcVFym9ytTcgx6nIHhyJyZHZwOIUzISmen1FYjO5cN563p0A== @@ -2903,6 +2903,28 @@ prop-types "^15.7.2" zen-observable "^0.10.0" +"@backstage/dev-utils@^1.0.3": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@backstage/dev-utils/-/dev-utils-1.0.10.tgz#cd06c9cf19b309373d036041739fa434069a7282" + integrity sha512-+xskpUWetq1iwUzFYGE0Z3s7JsHhmHW7SeqIryD0gc6WY5GqXeCoU8JLUjcEEff0tlNgESTs53gfroNJxdCK8g== + dependencies: + "@backstage/app-defaults" "^1.0.10" + "@backstage/catalog-model" "^1.1.4" + "@backstage/core-app-api" "^1.3.0" + "@backstage/core-components" "^0.12.2" + "@backstage/core-plugin-api" "^1.2.0" + "@backstage/integration-react" "^1.1.8" + "@backstage/plugin-catalog-react" "^1.2.3" + "@backstage/test-utils" "^1.2.3" + "@backstage/theme" "^0.2.16" + "@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-use "^17.2.4" + zen-observable "^0.10.0" + "@backstage/errors@^1.0.0", "@backstage/errors@^1.1.0", "@backstage/errors@^1.1.1", "@backstage/errors@^1.1.2", "@backstage/errors@^1.1.3", "@backstage/errors@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@backstage/errors/-/errors-1.1.4.tgz#42bfc620f435a848abc4abccfd38b79e950642c7" @@ -3059,6 +3081,32 @@ node-fetch "^2.6.7" winston "^3.2.1" +"@backstage/plugin-catalog-backend-module-github@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-backend-module-github/-/plugin-catalog-backend-module-github-0.2.2.tgz#d0510d9ace9bc28567cf55b3a62d0a9457a64de5" + integrity sha512-KIoCTnsjyHArsRkIvqPDFr7Mou0aK01OajZDELXdC6bJgblW4Rqyd+8hviqo73loG8FxiegkyB4rOiZUMS4HcA== + dependencies: + "@backstage/backend-common" "^0.17.0" + "@backstage/backend-plugin-api" "^0.2.0" + "@backstage/backend-tasks" "^0.4.0" + "@backstage/catalog-client" "^1.2.0" + "@backstage/catalog-model" "^1.1.4" + "@backstage/config" "^1.0.5" + "@backstage/errors" "^1.1.4" + "@backstage/integration" "^1.4.1" + "@backstage/plugin-catalog-backend" "^1.6.0" + "@backstage/plugin-catalog-common" "^1.0.9" + "@backstage/plugin-catalog-node" "^1.3.0" + "@backstage/plugin-events-node" "^0.2.0" + "@backstage/types" "^1.0.2" + "@octokit/graphql" "^5.0.0" + "@octokit/rest" "^19.0.3" + git-url-parse "^13.0.0" + lodash "^4.17.21" + node-fetch "^2.6.7" + uuid "^8.0.0" + winston "^3.2.1" + "@backstage/plugin-catalog-backend@^1.2.0", "@backstage/plugin-catalog-backend@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-backend/-/plugin-catalog-backend-1.6.0.tgz#5f709380917ed23d35924d30bb3a46e504d00627" @@ -3222,6 +3270,13 @@ react-use "^17.2.4" zen-observable "^0.10.0" +"@backstage/plugin-events-node@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@backstage/plugin-events-node/-/plugin-events-node-0.2.0.tgz#0de382f305ee471dab5f07c48ff022ba0d6e1d6e" + integrity sha512-kIFq27otGy6A9T5gAjCS2rEDPLGKsVlkMVgIPVSy0A7JbTEhCZ7lmtFxXudA0emS3G43iE5AuIXisCFTgL+dyw== + dependencies: + "@backstage/backend-plugin-api" "^0.2.0" + "@backstage/plugin-github-actions@^0.5.6": version "0.5.13" resolved "https://registry.yarnpkg.com/@backstage/plugin-github-actions/-/plugin-github-actions-0.5.13.tgz#296997a0181ef18bc13614a6658a6d16a5c064e1" @@ -3765,7 +3820,7 @@ dependencies: cross-fetch "^3.1.5" -"@backstage/test-utils@^1.1.1": +"@backstage/test-utils@^1.1.1", "@backstage/test-utils@^1.2.3": version "1.2.3" resolved "https://registry.yarnpkg.com/@backstage/test-utils/-/test-utils-1.2.3.tgz#e79d911bcd4dec7f5c3db4e9c8b328eda2fe13a6" integrity sha512-gQifMe62GHaR/T3Zb4EnIhwbnfzvEcqjgDmaI33FtvIL+nJXZkHu1P35+sqp22E2s5VY7Ol9/IVXweoU0fJ2/w== @@ -5418,6 +5473,26 @@ prop-types "^15.7.2" react-is "^16.8.0 || ^17.0.0" +"@mswjs/cookies@^0.2.0": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" + integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== + dependencies: + "@types/set-cookie-parser" "^2.4.0" + set-cookie-parser "^2.4.6" + +"@mswjs/interceptors@^0.16.3": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.16.6.tgz#c1a777ed3f69b55bbbc725b2deb827f160c0107c" + integrity sha512-7ax1sRx5s4ZWl0KvVhhcPOUoPbCCkVh8M8hYaqOyvoAQOiqLVzy+Z6Mh2ywPhYw4zudr5Mo/E8UT/zJBO/Wxrw== + dependencies: + "@open-draft/until" "^1.0.3" + "@xmldom/xmldom" "^0.7.5" + debug "^4.3.3" + headers-polyfill "^3.0.4" + outvariant "^1.2.1" + strict-event-emitter "^0.2.4" + "@n1ru4l/push-pull-async-iterable-iterator@^3.1.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@n1ru4l/push-pull-async-iterable-iterator/-/push-pull-async-iterable-iterator-3.2.0.tgz#c15791112db68dd9315d329d652b7e797f737655" @@ -5850,6 +5925,11 @@ "@octokit/webhooks-types" "6.7.0" aggregate-error "^3.1.0" +"@open-draft/until@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" + integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== + "@openapi-contrib/openapi-schema-to-json-schema@^3.0.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.2.0.tgz#c4c92edd4478b5ecb3d99c29ecb355118259dccc" @@ -6483,6 +6563,11 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + "@types/cors@^2.8.6": version "2.8.13" resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" @@ -6654,6 +6739,11 @@ resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" integrity sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== +"@types/js-levenshtein@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz#ba05426a43f9e4e30b631941e0aa17bf0c890ed5" + integrity sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g== + "@types/js-yaml@^4.0.1": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" @@ -6918,6 +7008,13 @@ "@types/mime" "*" "@types/node" "*" +"@types/set-cookie-parser@^2.4.0": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz#b6a955219b54151bfebd4521170723df5e13caad" + integrity sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w== + dependencies: + "@types/node" "*" + "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" @@ -7291,7 +7388,7 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" -"@xmldom/xmldom@^0.7.0", "@xmldom/xmldom@^0.7.6", "@xmldom/xmldom@^0.7.9": +"@xmldom/xmldom@^0.7.0", "@xmldom/xmldom@^0.7.5", "@xmldom/xmldom@^0.7.6", "@xmldom/xmldom@^0.7.9": version "0.7.9" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.9.tgz#7f9278a50e737920e21b297b8a35286e9942c056" integrity sha512-yceMpm/xd4W2a85iqZyO09gTnHvXF6pyiWjD2jcOJs7hRoZtNNOO1eJlhHj1ixA+xip2hOyGn+LgcvLCMo5zXA== @@ -8589,6 +8686,14 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.3.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -9249,7 +9354,7 @@ cookie@0.4.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== -cookie@0.4.2: +cookie@0.4.2, cookie@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== @@ -11117,7 +11222,7 @@ events@1.1.1: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== -events@3.3.0, events@^3.0.0, events@^3.2.0: +events@3.3.0, events@^3.0.0, events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -12274,7 +12379,7 @@ graphql-ws@^5.4.1: resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.11.2.tgz#d5e0acae8b4d4a4cf7be410a24135cfcefd7ddc0" integrity sha512-4EiZ3/UXYcjm+xFGP544/yW1+DVI8ZpKASFbzrV5EDTFWJp0ZvLl4Dy2fSZAzz9imKp5pZMIcjB0x/H69Pv/6w== -graphql@^16.0.0: +graphql@^16.0.0, graphql@^16.3.0: version "16.6.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== @@ -12433,6 +12538,11 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +headers-polyfill@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.1.2.tgz#9a4dcb545c5b95d9569592ef7ec0708aab763fbe" + integrity sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA== + helmet@^5.0.2: version "5.1.1" resolved "https://registry.yarnpkg.com/helmet/-/helmet-5.1.1.tgz#609823c5c2e78aea62dd9afc8f544ca409da5e85" @@ -13151,6 +13261,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-node-process@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.0.1.tgz#4fc7ac3a91e8aac58175fe0578abbc56f2831b23" + integrity sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -13989,6 +14104,11 @@ js-file-download@^0.4.12: resolved "https://registry.yarnpkg.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821" integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg== +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-sdsl@^4.1.4: version "4.2.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" @@ -15804,6 +15924,32 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@^0.42.0: + version "0.42.3" + resolved "https://registry.yarnpkg.com/msw/-/msw-0.42.3.tgz#150c475e2cb6d53c67503bd0e3f6251bfd075328" + integrity sha512-zrKBIGCDsNUCZLd3DLSeUtRruZ0riwJgORg9/bSDw3D0PTI8XUGAK3nC0LJA9g0rChGuKaWK/SwObA8wpFrz4g== + dependencies: + "@mswjs/cookies" "^0.2.0" + "@mswjs/interceptors" "^0.16.3" + "@open-draft/until" "^1.0.3" + "@types/cookie" "^0.4.1" + "@types/js-levenshtein" "^1.1.1" + chalk "4.1.1" + chokidar "^3.4.2" + cookie "^0.4.2" + graphql "^16.3.0" + headers-polyfill "^3.0.4" + inquirer "^8.2.0" + is-node-process "^1.0.1" + js-levenshtein "^1.1.6" + node-fetch "^2.6.7" + outvariant "^1.3.0" + path-to-regexp "^6.2.0" + statuses "^2.0.0" + strict-event-emitter "^0.2.0" + type-fest "^1.2.2" + yargs "^17.3.1" + multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" @@ -16497,6 +16643,11 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== +outvariant@^1.2.1, outvariant@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.3.0.tgz#c39723b1d2cba729c930b74bf962317a81b9b1c9" + integrity sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ== + p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" @@ -16963,6 +17114,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -19072,6 +19228,11 @@ set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-cookie-parser@^2.4.6: + version "2.5.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" + integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== + set-harmonic-interval@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" @@ -19544,7 +19705,7 @@ start-server-and-test@^1.10.11: ps-tree "1.2.0" wait-on "6.0.1" -statuses@2.0.1: +statuses@2.0.1, statuses@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== @@ -19610,6 +19771,13 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +strict-event-emitter@^0.2.0, strict-event-emitter@^0.2.4: + version "0.2.8" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" + integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== + dependencies: + events "^3.3.0" + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -20457,6 +20625,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -21500,7 +21673,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.1.1, yargs@^17.2.1: +yargs@^17.1.1, yargs@^17.2.1, yargs@^17.3.1: version "17.6.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==