From 4d4cb781ca9fc331a2c621583e9203f9e4585ee7 Mon Sep 17 00:00:00 2001 From: Marek Libra Date: Thu, 11 Jan 2024 15:57:43 +0100 Subject: [PATCH] feat(Notifications): new notifications FE plugin, API and backend (#933) * draft Signed-off-by: Yaron Dayagi * feat(parodos-notifications): parodos plugin for notifications * chore(parodos-notifications): add plugin metadata * Add Parodos to the left-side menu * Add ParodosNotificationsTable * Remove page header * Rename plugin to @backstage/plugin-parodos-notifications * Fix types in myplugin-backend * Hotfix Knex type * chore(parodos-notifications): Add tsconfig and turbo to the backend plugin * Fix typo in constants * Add DB mock for backend tests * Read notifications from backend * Add rxjs dependency * First Notifaction API with Observable * Rename backend plugin to notifications-backend * Reimplement the Notifications to use tabs * Fix endless "loading" state for an empty notifications list * Rename front-end plugin to notifications-frontend * Add coverage and passWithNoTests to notifications-frontend * filter paging users first version of our implementation it shows: - plugin independent of DB - text filtering - paging - users and groups validation Signed-off-by: Yaron Dayagi * fix flpath-659 catch DB errors in router handlers https://issues.redhat.com/browse/FLPATH-659 Signed-off-by: Yaron Dayagi * Add patternfly/react-core among dependencies * Remove rxjs dependency * Add new fields to the UI - UUID - Created - Title - Origin - Message - Topic - Links * Rename System notifications tab * Use Item instead of Group for the left-side menu * Mark "unread" notifications in the left-side menu * Update README to match recent endpoints * Add default sorting * Add pagination * Remove TODO * FLPATH-661: Add notification actions Closes FLPATH-661 Closes FLPATH-662 * Make the actions.title mandatory * BE- implement posting to users and groups FLPATH-665 https://issues.redhat.com/browse/FLPATH-665 Signed-off-by: Yaron Dayagi * FLPATH-670: Add filtering by text * Remove unused code - FE notificationsService.ts * Add @material-table/core among dependencies * FLPATH-671: Add Created After filter * FLPATH-671: Add Created After selection * FLPATH-668: Add sorting * Add stub for passing users To unblock due to conflicts now - will be done properly in a follow-up. * Move sorting params validation to handler * Polling in NotificationsSidebarItem can be configured * FLPATH-675: Show system-wide notifications in the Updates tab * FLPATH-675: Show system-wide alerts * update README Signed-off-by: Yaron Dayagi * Simplify BE cehck for orderBy * Avoid using Patternfly in the Notifications * Add react-router-dom to notifications-frontend * Implement creating of notifications * Add a page to create notifications Implemented as a tab on the NotificationsPage. The new tab is not displayed by default, only when directly navigated by the URL ([BACKSTAGE]/notifications/send). Meant for demonstration and debug purposes since the notifications are expected to be send by 3rd party FE/BE plugins or external systems. * BE - implement mark as read flpath-666 https://issues.redhat.com/browse/FLPATH-666 Signed-off-by: Yaron Dayagi * FLPATH-664: Implement Mark as Read on FE * FLPATH-663: Pass logged-in user name to the backend * Add defaut/guest user to the Catalog Within example data. * Update README for authentication section * FLPATH-667: Add notifications-common library * Add more descriptions * Fix package.json after rebase * Sync dependencies with main * add defaults for GET requests FLPATH-669 https://issues.redhat.com/browse/FLPATH-669 Signed-off-by: Yaron Dayagi * add indexes to db columns flpath727 https://issues.redhat.com/browse/FLPATH-727 Signed-off-by: Yaron Dayagi * FLPATH-738: render actions horizontally * FLPATH-738: use a dropdown for the Unread filter * FLPATH-738: Change "mark as read" icons * openapi yaml for rest api FLPATH-748 https://issues.redhat.com/browse/FLPATH-748 Signed-off-by: Yaron Dayagi * create DB client in BE that supports all Knex configuration flpath-660 https://issues.redhat.com/browse/FLPATH-660 Signed-off-by: Yaron Dayagi * add cascade to foreign key in actions table Signed-off-by: Yaron Dayagi * Add debouncing to the search filter * add date-time format to time fields Signed-off-by: Yaron Dayagi * Make 'count' required in response * Fix required action fields in the OpenApi spec * Add openapi client generator to the notifications-frontend * Regenerate openapi client in the frontend * Remove notifications-common from FE dependencies We do not need it anymore since we have the generated types from OpenApi. * Update frontend to use generated openapi calls * Add ts-nocheck to generated OpenApi code * Regenerate openapi * remove notifications-common FLPATH-755 https://issues.redhat.com/browse/FLPATH-755 Signed-off-by: Yaron Dayagi * Notifications-frontend install instructions and deregister The plugin is removed from the Backstage * Notifications-backend install instructions and deregister The plugin is removed from the Backstage * create router in BE based on openapi spec FLPATH756 https://issues.redhat.com/browse/FLPATH-756 Signed-off-by: Yaron Dayagi * fix getNotificationsCount to return type number Signed-off-by: Yaron Dayagi * support sqllite and other DBs FLPATH-811 https://issues.redhat.com/browse/FLPATH-811 Signed-off-by: Yaron Dayagi * FLPATH-809: get the user via Identity API With this patch, the username is not passed from FE to BE anymore but retrieved from via Identity API as the logged-in user. * chore(notifications-backend): add permissions related deps * chore: update README for authentication * chore: make service-to-service checks optional * chore: reduce notifications "read" permissions count * chore: separate getLoggedInUser and checkPermission funcs * Introduce auth.ts and shared secret for external callers * chore: update README for SQLite * add unit test to BE FLPATH-798 https://issues.redhat.com/browse/FLPATH-798 Signed-off-by: Yaron Dayagi * chore: docs linter * chore: use default/guest for external calls Authentication of external systems is not stable anyway, so using the default/guest for them will simplify testing. * chore: fix handling of promises in tests * chore: remove forgotten router-test-ts * chore: update yarn.lock after rebase * chore: add --coverage to tests to pass the CI * chore: hotfix for types mismatch for KNex MockClient * chore: unify dep versions in notifications-backend --------- Signed-off-by: Yaron Dayagi Co-authored-by: Yaron Dayagi --- .github/CODEOWNERS | 2 +- app-config.yaml | 1 - packages/app/package.json | 1 + packages/app/src/components/Root/Root.tsx | 1 + packages/backend/package.json | 1 + packages/cli/package.json | 2 +- plugins/matomo/package.json | 2 +- plugins/notifications-backend/.eslintrc.js | 1 + plugins/notifications-backend/README.md | 304 ++ plugins/notifications-backend/package.json | 61 + plugins/notifications-backend/src/index.ts | 2 + .../notifications-backend/src/openapi.d.ts | 217 ++ .../notifications-backend/src/openapi.yaml | 254 ++ plugins/notifications-backend/src/run.ts | 19 + .../notifications-backend/src/service/auth.ts | 110 + .../src/service/constants.ts | 6 + .../src/service/db.test.ts | 108 + .../notifications-backend/src/service/db.ts | 112 + .../src/service/handlers.test.ts | 230 ++ .../src/service/handlers.ts | 410 +++ .../src/service/permissions.ts | 22 + .../src/service/router.ts | 154 + .../src/service/standaloneServer.ts | 41 + .../src/service/types.ts | 69 + .../notifications-backend/src/setupTests.ts | 1 + plugins/notifications-backend/tsconfig.json | 9 + plugins/notifications-backend/turbo.json | 9 + plugins/notifications-backend/users.yaml | 60 + plugins/notifications-frontend/.eslintrc.js | 1 + plugins/notifications-frontend/README.md | 72 + plugins/notifications-frontend/dev/index.tsx | 14 + .../notifications-frontend/openapitools.json | 7 + plugins/notifications-frontend/package.json | 66 + .../src/api/NotificationsApiImpl.ts | 49 + .../notifications-frontend/src/api/index.ts | 2 + .../src/api/notificationsApi.ts | 37 + .../NotificationsPage/NotificationsPage.tsx | 43 + .../src/components/NotificationsPage/index.ts | 1 + .../components/NotificationsSidebarItem.tsx | 125 + .../NotificationsTable/MarkAsUnreadIcon.tsx | 35 + .../NotificationsTable/NotificationsTable.tsx | 243 ++ .../NotificationsToolbar.tsx | 130 + .../components/NotificationsTable/index.ts | 1 + .../PersonalNotifications.tsx | 7 + .../components/PersonalNotifications/index.ts | 1 + .../SendNotification/SendNotification.tsx | 192 ++ .../src/components/SendNotification/index.ts | 1 + .../SystemNotifications.tsx | 7 + .../components/SystemNotifications/index.ts | 1 + .../src/components/usePollingEffect.ts | 46 + .../notifications-frontend/src/constants.ts | 3 + plugins/notifications-frontend/src/index.ts | 19 + .../src/openapi/.openapi-generator-ignore | 23 + .../src/openapi/.openapi-generator/FILES | 11 + .../src/openapi/.openapi-generator/VERSION | 1 + .../src/openapi/README.md | 8 + .../src/openapi/apis/NotificationsApi.ts | 351 ++ .../src/openapi/apis/index.ts | 4 + .../src/openapi/index.ts | 6 + .../src/openapi/models/Action.ts | 86 + .../src/openapi/models/CreateBody.ts | 130 + .../openapi/models/CreateBodyActionsInner.ts | 81 + .../models/CreateNotification200Response.ts | 74 + .../GetNotificationsCount200Response.ts | 74 + .../src/openapi/models/Notification.ts | 140 + .../src/openapi/models/index.ts | 9 + .../src/openapi/runtime.ts | 529 +++ .../notifications-frontend/src/plugin.test.ts | 7 + plugins/notifications-frontend/src/plugin.ts | 37 + plugins/notifications-frontend/src/routes.ts | 7 + .../notifications-frontend/src/setupTests.ts | 1 + plugins/notifications-frontend/tsconfig.json | 9 + plugins/notifications-frontend/turbo.json | 9 + .../database/casbin-adapter-factory.test.ts | 2 +- yarn.lock | 3060 ++++++++++++++++- 75 files changed, 7830 insertions(+), 141 deletions(-) create mode 100644 plugins/notifications-backend/.eslintrc.js create mode 100644 plugins/notifications-backend/README.md create mode 100644 plugins/notifications-backend/package.json create mode 100644 plugins/notifications-backend/src/index.ts create mode 100644 plugins/notifications-backend/src/openapi.d.ts create mode 100644 plugins/notifications-backend/src/openapi.yaml create mode 100644 plugins/notifications-backend/src/run.ts create mode 100644 plugins/notifications-backend/src/service/auth.ts create mode 100644 plugins/notifications-backend/src/service/constants.ts create mode 100644 plugins/notifications-backend/src/service/db.test.ts create mode 100644 plugins/notifications-backend/src/service/db.ts create mode 100644 plugins/notifications-backend/src/service/handlers.test.ts create mode 100644 plugins/notifications-backend/src/service/handlers.ts create mode 100644 plugins/notifications-backend/src/service/permissions.ts create mode 100644 plugins/notifications-backend/src/service/router.ts create mode 100644 plugins/notifications-backend/src/service/standaloneServer.ts create mode 100644 plugins/notifications-backend/src/service/types.ts create mode 100644 plugins/notifications-backend/src/setupTests.ts create mode 100644 plugins/notifications-backend/tsconfig.json create mode 100644 plugins/notifications-backend/turbo.json create mode 100644 plugins/notifications-backend/users.yaml create mode 100644 plugins/notifications-frontend/.eslintrc.js create mode 100644 plugins/notifications-frontend/README.md create mode 100644 plugins/notifications-frontend/dev/index.tsx create mode 100644 plugins/notifications-frontend/openapitools.json create mode 100644 plugins/notifications-frontend/package.json create mode 100644 plugins/notifications-frontend/src/api/NotificationsApiImpl.ts create mode 100644 plugins/notifications-frontend/src/api/index.ts create mode 100644 plugins/notifications-frontend/src/api/notificationsApi.ts create mode 100644 plugins/notifications-frontend/src/components/NotificationsPage/NotificationsPage.tsx create mode 100644 plugins/notifications-frontend/src/components/NotificationsPage/index.ts create mode 100644 plugins/notifications-frontend/src/components/NotificationsSidebarItem.tsx create mode 100644 plugins/notifications-frontend/src/components/NotificationsTable/MarkAsUnreadIcon.tsx create mode 100644 plugins/notifications-frontend/src/components/NotificationsTable/NotificationsTable.tsx create mode 100644 plugins/notifications-frontend/src/components/NotificationsTable/NotificationsToolbar.tsx create mode 100644 plugins/notifications-frontend/src/components/NotificationsTable/index.ts create mode 100644 plugins/notifications-frontend/src/components/PersonalNotifications/PersonalNotifications.tsx create mode 100644 plugins/notifications-frontend/src/components/PersonalNotifications/index.ts create mode 100644 plugins/notifications-frontend/src/components/SendNotification/SendNotification.tsx create mode 100644 plugins/notifications-frontend/src/components/SendNotification/index.ts create mode 100644 plugins/notifications-frontend/src/components/SystemNotifications/SystemNotifications.tsx create mode 100644 plugins/notifications-frontend/src/components/SystemNotifications/index.ts create mode 100644 plugins/notifications-frontend/src/components/usePollingEffect.ts create mode 100644 plugins/notifications-frontend/src/constants.ts create mode 100644 plugins/notifications-frontend/src/index.ts create mode 100644 plugins/notifications-frontend/src/openapi/.openapi-generator-ignore create mode 100644 plugins/notifications-frontend/src/openapi/.openapi-generator/FILES create mode 100644 plugins/notifications-frontend/src/openapi/.openapi-generator/VERSION create mode 100644 plugins/notifications-frontend/src/openapi/README.md create mode 100644 plugins/notifications-frontend/src/openapi/apis/NotificationsApi.ts create mode 100644 plugins/notifications-frontend/src/openapi/apis/index.ts create mode 100644 plugins/notifications-frontend/src/openapi/index.ts create mode 100644 plugins/notifications-frontend/src/openapi/models/Action.ts create mode 100644 plugins/notifications-frontend/src/openapi/models/CreateBody.ts create mode 100644 plugins/notifications-frontend/src/openapi/models/CreateBodyActionsInner.ts create mode 100644 plugins/notifications-frontend/src/openapi/models/CreateNotification200Response.ts create mode 100644 plugins/notifications-frontend/src/openapi/models/GetNotificationsCount200Response.ts create mode 100644 plugins/notifications-frontend/src/openapi/models/Notification.ts create mode 100644 plugins/notifications-frontend/src/openapi/models/index.ts create mode 100644 plugins/notifications-frontend/src/openapi/runtime.ts create mode 100644 plugins/notifications-frontend/src/plugin.test.ts create mode 100644 plugins/notifications-frontend/src/plugin.ts create mode 100644 plugins/notifications-frontend/src/routes.ts create mode 100644 plugins/notifications-frontend/src/setupTests.ts create mode 100644 plugins/notifications-frontend/tsconfig.json create mode 100644 plugins/notifications-frontend/turbo.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 41aa10bfbb..b12d7f1212 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -27,4 +27,4 @@ yarn.lock @janus-idp/maintainers-plugins /plugins/tekton/ @janus-idp/maintainers-plugins @debsmita1 @divyanshiGupta /plugins/rbac-backend/ @janus-idp/maintainers-plugins @gorkem @AndrienkoAleksandr @PatAKnight /plugins/rbac-common/ @janus-idp/maintainers-plugins @gorkem @AndrienkoAleksandr @PatAKnight - +/plugins/notifications-frontend @janus-idp/maintainers-plugins @mareklibra diff --git a/app-config.yaml b/app-config.yaml index ca8b34ba45..cd01d53707 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -28,7 +28,6 @@ backend: # This is for local development only, it is not recommended to use this in production # The production database configuration is stored in app-config.production.yaml database: - client: better-sqlite3 connection: ':memory:' cache: store: memory diff --git a/packages/app/package.json b/packages/app/package.json index d326784f41..6cca6281c7 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -37,6 +37,7 @@ "@backstage/plugin-catalog-import": "^0.10.1", "@backstage/plugin-catalog-react": "^1.8.5", "@backstage/plugin-github-actions": "^0.6.6", + "@backstage/plugin-notifications-frontend": "0.1.0", "@backstage/plugin-org": "^0.6.15", "@backstage/plugin-permission-react": "^0.4.16", "@backstage/plugin-scaffolder": "^1.15.1", diff --git a/packages/app/src/components/Root/Root.tsx b/packages/app/src/components/Root/Root.tsx index 42107c4f4f..5f519654c8 100644 --- a/packages/app/src/components/Root/Root.tsx +++ b/packages/app/src/components/Root/Root.tsx @@ -75,6 +75,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => ( + { + const catalogClient = new CatalogClient({ discoveryApi: env.discovery }); + const dbConfig = env.config.getConfig('backend.database'); + // Following is optional + const externalCallerSecret = env.config.getOptionalString( + 'notifications.externalCallerSecret', + ); + + return await createRouter({ + identity: env.identity, + logger: env.logger, + permissions: env.permissions, + tokenManager: env.tokenManager, + dbConfig, + catalogClient, + externalCallerSecret, + }); +} +``` + +### Add to router + +In the `packages/backend/src/index.ts`: + +``` +import notifications from './plugins/notifications'; +... +{/* Existing code for reference: */} +const apiRouter = Router(); +... +{/* New code: */} +const notificationsEnv = useHotMemoize(module, () => + createEnv('notifications'), +); +apiRouter.use('/notifications', await notifications(notificationsEnv)); +``` + +### Configure + +#### Optional: Plugin's configuration + +If you have issues to create valid JWT tokens by an external caller, use following option to bypass the service-to-service configuration for them: + +``` +notifications: + # Workaround for issues with external caller JWT token creation. + # When following config option is not provided and the request "authentication" header is missing, the request is ALLOWED by default + # When following option is present, the request must contain either a valid JWT token or that provided shared secret in the "notifications-secret" header + externalCallerSecret: your-secret-token-shared-with-external-services +``` + +Mind using HTTPS to help preventing leaking the shared secret. + +Example of the request then: + +``` +curl -X POST http://localhost:7007/api/notifications/notifications -H "Content-Type: application/json" -H "notifications-secret: your-secret-token-shared-with-external-services" -d '{"title":"my-title","origin":"my-origin","message":"message one","topic":"my-topic"}' + +``` + +Notes: + +- The `externalCallerSecret` is an workaround, exclusive use of JWT tokens will probably be required in the future. +- Sharing the same shared secret with the "auth.secret" option is not recommended. + +#### Authentication + +Please refer https://backstage.io/docs/auth/ to set-up authentication. + +The Notifications flows are based on the identity of the user. + +All `targetUsers`, `targetGroups`` or signed-in users receiving notifications must have corresponding entities created in the Catalog. +Refer https://backstage.io/docs/auth/identity-resolver for details. + +For the purpose of development, there is `users.yaml` listing example data created. + +#### Authorization + +Every service endpoint is guarded by a permission check, enabled by default. + +It is up to particular deployment to provide corresponding permission policies based on https://backstage.io/docs/permissions/writing-a-policy. To register your permission policies, refer https://backstage.io/docs/permissions/getting-started#integrating-the-permission-framework-with-your-backstage-instance. + +#### Service-to-service and External Calls + +The notification-backend is expected to be called by FE plugins (including the notifications-frontend), other backend plugins or external services. + +To configure those two flows, refer + +- https://backstage.io/docs/auth/service-to-service-auth. +- https://backstage.io/docs/auth/service-to-service-auth#usage-in-external-callers + +#### Catalog + +The notifications require target users or groups (as receivers) to be listed in the Catalog. + +As an example how to do it, add following to the config: + +``` +catalog: + import: + entityFilename: catalog-info.yaml + pullRequestBranchName: backstage-integration + rules: + # *** Here is new change: + - allow: [Component, System, API, Resource, Location, User, Group] + locations: + # Local example data, file locations are relative to the backend process, typically `packages/backend` + - type: file + # *** Here is new change, referes to a file stored in the root of the Backstage: + target: ../../users.yaml +``` + +The example list of users is stored in the `plugins/notifications-backend/users.yaml` and can be copied to the root of the Backstage for development purposes. + +## REST API + +See `src/openapi.yaml` for full OpenAPI spec. + +### Posting a notification + +A notification without target users or groups is considered a system notification. That means it is intended for all users (listed among Updates in the UI). + +Request (User message and then system message): + +```bash +curl -X POST http://localhost:7007/api/notifications/notifications -H "Content-Type: application/json" -d '{"title": "My message title", "message": "I have nothing to say", "origin": "my-origin", "targetUsers": ["jdoe"], "targetGroups": ["jdoe"], "actions": [{"title": "my-title", "url": "http://foo.bar"}, {"title": "another action", "url": "https://foo.foo.bar"}]}' +``` + +```bash +curl -X POST http://localhost:7007/api/notifications/notifications -H "Content-Type: application/json" -d '{"title": "My message title", "message": "I have nothing to say", "origin": "my-origin", "actions": [{"title": "my-title", "url": "http://foo.bar"}, {"title": "another action", "url": "https://foo.foo.bar"}]}' +``` + +Optionally add `-H "Authorization: Bearer eyJh.....` with a valid JWT token if the service-to-service authorization is enabled (see above). + +Response: + +```json +{ "msgid": "2daac6ff-3aaa-420d-b755-d94e54248310" } +``` + +### Get notifications + +Page number starts at '1'. Page number '0' along with page size '0' means no paging. +User parameter is mandatory because it is needed for message status and filtering (read/unread). + +Query parameters: + +- `pageSize`. 0 means no paging. +- `pageNumber`. first page is 1. 0 means no paging. +- `orderBy`. +- `orderByDirec`. asc/desc +- `containsText`. filter title and message containing this text (case insensitive) +- `createdAfter`. fetch notifications created after this point in time +- `messageScope`. all/user/system. fetch notifications intended for specific user or system notifications or both +- `read`. true/false (read/unread) + +Request: + +```bash +curl 'http://localhost:7007/api/notifications/notifications?read=false&pageNumber=0&pageSize=0' +``` + +Response: + +```json +[ + { + "id": "2daac6ff-3aaa-420d-b755-d94e54248310", + "created": "2023-10-30T13:48:34.931Z", + "isSystem": false, + "readByUser": false, + "origin": "my-origin", + "title": "My title", + "message": "I have nothing to tell", + "topic": "my-topic", + "actions": [] + } +] +``` + +### Get count of notifications + +User parameter is mandatory because it is needed for filtering (read/unread). + +**Important: Logged-in user:** + +The query requires a signed-in user whose entity is listed in the Catalog. +With this condition is met, the HTTP `Authorization` header contains a JWT token with the user's identity. + +Optionally add `-H "Authorization: Bearer eyJh.....` with a valid JWT token to the `curl` commands bellow. + +Query parameters: + +- `containsText`. filter title and message containing this text (case insensitive) +- `createdAfter`. fetch notifications created after this point in time +- `messageScope`. all/user/system. fetch notifications intended for specific user or system notifications or both +- `read`. true/false (read/unread) + +Request: + +```bash +curl http://localhost:7007/api/notifications/notifications/count +``` + +Response: + +```json +{ "count": "1" } +``` + +### Set notification as read/unread + +Request: + +```bash +curl -X PUT 'http://localhost:7007/api/notifications/notifications/read?messageID=48bbf896-4b7c-4b68-a446-246b6a801000&read=true' +``` + +Response: just HTTP status + +## Building a client for the API + +We supply an Open API spec YAML file: openapi.yaml. diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json new file mode 100644 index 0000000000..37a3aa3b50 --- /dev/null +++ b/plugins/notifications-backend/package.json @@ -0,0 +1,61 @@ +{ + "name": "@backstage/plugin-notifications-backend", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "backend-plugin" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test --passWithNoTests --coverage", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "tsc": "tsc", + "openapi": "openapi typegen src/openapi.yaml > src/openapi.d.ts" + }, + "dependencies": { + "@backstage/backend-common": "^0.19.8", + "@backstage/backend-openapi-utils": "^0.1.0", + "@backstage/catalog-client": "^1.4.5", + "@backstage/config": "^1.1.1", + "@backstage/errors": "^1.2.3", + "@backstage/plugin-auth-node": "^0.4.0", + "@backstage/plugin-permission-common": "^0.7.9", + "@backstage/plugin-permission-node": "^0.7.17", + "ajv-formats": "^2.1.1", + "express": "^4.18.2", + "express-promise-router": "^4.1.1", + "knex": "2.5.1", + "lodash": "^4.17.21", + "node-fetch": "^3.3.2", + "openapi": "^1.0.1", + "openapi-backend": "^5.10.5", + "winston": "^3.11.0", + "yn": "^4.0.0" + }, + "devDependencies": { + "@backstage/backend-test-utils": "^0.2.7", + "@backstage/catalog-model": "^1.4.3", + "@backstage/cli": "0.23.0", + "@types/express": "*", + "@types/supertest": "2.0.16", + "knex-mock-client": "2.0.0", + "msw": "1.3.2", + "openapicmd": "^2.1.0", + "supertest": "6.3.3" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/notifications-backend/src/index.ts b/plugins/notifications-backend/src/index.ts new file mode 100644 index 0000000000..7d319394d7 --- /dev/null +++ b/plugins/notifications-backend/src/index.ts @@ -0,0 +1,2 @@ +export * from './service/router'; +export * from './service/permissions'; diff --git a/plugins/notifications-backend/src/openapi.d.ts b/plugins/notifications-backend/src/openapi.d.ts new file mode 100644 index 0000000000..59fa470129 --- /dev/null +++ b/plugins/notifications-backend/src/openapi.d.ts @@ -0,0 +1,217 @@ +import type { + AxiosRequestConfig, + OpenAPIClient, + OperationResponse, + Parameters, + UnknownParamsObject, +} from 'openapi-client-axios'; + +declare namespace Components { + namespace Schemas { + export interface Action { + id: string; + title: string; + url: string; + } + export interface CreateBody { + origin: string; + title: string; + message?: string; + actions?: { + title: string; + url: string; + }[]; + topic?: string; + targetUsers?: string[]; + targetGroups?: string[]; + } + export interface Notification { + id: string; + created: string; // date-time + readByUser: boolean; + isSystem: boolean; + origin: string; + title: string; + message?: string; + topic?: string; + actions: Action[]; + } + export type Notifications = Notification[]; + } +} +declare namespace Paths { + namespace CreateNotification { + export type RequestBody = Components.Schemas.CreateBody; + namespace Responses { + export interface $200 { + /** + * example: + * bc9f19de-8b7b-49a8-9262-c5036a1ed35e + */ + messageId: string; + } + } + } + namespace GetNotifications { + namespace Parameters { + export type ContainsText = string; + export type CreatedAfter = string; // date-time + export type MessageScope = 'all' | 'user' | 'system'; + export type OrderBy = + | 'title' + | 'message' + | 'created' + | 'topic' + | 'origin'; + export type OrderByDirec = 'asc' | 'desc'; + export type PageNumber = number; + export type PageSize = number; + export type Read = boolean; + export type User = string; + } + export interface QueryParameters { + pageSize?: Parameters.PageSize; + pageNumber?: Parameters.PageNumber; + orderBy?: Parameters.OrderBy; + orderByDirec?: Parameters.OrderByDirec; + containsText?: Parameters.ContainsText; + createdAfter?: Parameters.CreatedAfter /* date-time */; + messageScope?: Parameters.MessageScope; + user?: Parameters.User; + read?: Parameters.Read; + } + namespace Responses { + export type $200 = Components.Schemas.Notifications; + } + } + namespace GetNotificationsCount { + namespace Parameters { + export type ContainsText = string; + export type CreatedAfter = string; // date-time + export type MessageScope = 'all' | 'user' | 'system'; + export type Read = boolean; + export type User = string; + } + export interface QueryParameters { + containsText?: Parameters.ContainsText; + createdAfter?: Parameters.CreatedAfter /* date-time */; + messageScope?: Parameters.MessageScope; + user?: Parameters.User; + read?: Parameters.Read; + } + namespace Responses { + export interface $200 { + count: number; + } + } + } + namespace SetRead { + namespace Parameters { + export type MessageId = string; + export type Read = boolean; + export type User = string; + } + export interface QueryParameters { + messageId: Parameters.MessageId; + user: Parameters.User; + read: Parameters.Read; + } + namespace Responses { + export interface $200 {} + } + } +} + +export interface OperationMethods { + /** + * getNotifications - Gets notifications + * + * Gets notifications + */ + 'getNotifications'( + parameters?: Parameters | null, + data?: any, + config?: AxiosRequestConfig, + ): OperationResponse; + /** + * createNotification - Create notification + * + * Create notification + */ + 'createNotification'( + parameters?: Parameters | null, + data?: Paths.CreateNotification.RequestBody, + config?: AxiosRequestConfig, + ): OperationResponse; + /** + * getNotificationsCount - Get notifications count + * + * Gets notifications count + */ + 'getNotificationsCount'( + parameters?: Parameters | null, + data?: any, + config?: AxiosRequestConfig, + ): OperationResponse; + /** + * setRead - Set notification as read/unread + * + * Set notification as read/unread + */ + 'setRead'( + parameters?: Parameters | null, + data?: any, + config?: AxiosRequestConfig, + ): OperationResponse; +} + +export interface PathsDictionary { + ['/notifications']: { + /** + * createNotification - Create notification + * + * Create notification + */ + 'post'( + parameters?: Parameters | null, + data?: Paths.CreateNotification.RequestBody, + config?: AxiosRequestConfig, + ): OperationResponse; + /** + * getNotifications - Gets notifications + * + * Gets notifications + */ + 'get'( + parameters?: Parameters | null, + data?: any, + config?: AxiosRequestConfig, + ): OperationResponse; + }; + ['/notifications/count']: { + /** + * getNotificationsCount - Get notifications count + * + * Gets notifications count + */ + 'get'( + parameters?: Parameters | null, + data?: any, + config?: AxiosRequestConfig, + ): OperationResponse; + }; + ['/notifications/read']: { + /** + * setRead - Set notification as read/unread + * + * Set notification as read/unread + */ + 'put'( + parameters?: Parameters | null, + data?: any, + config?: AxiosRequestConfig, + ): OperationResponse; + }; +} + +export type Client = OpenAPIClient; diff --git a/plugins/notifications-backend/src/openapi.yaml b/plugins/notifications-backend/src/openapi.yaml new file mode 100644 index 0000000000..4ad93c82ec --- /dev/null +++ b/plugins/notifications-backend/src/openapi.yaml @@ -0,0 +1,254 @@ +openapi: 3.0.3 +info: + title: Notifications Plugin - OpenAPI Specs + description: |- + Notifications Plugin - OpenAPI Specs + version: 1.0.0 +tags: + - name: notifications + description: notifications plugin +servers: + - url: http://localhost:7007/api/notifications +paths: + /notifications: + post: + tags: + - notifications + summary: Create notification + description: Create notification + operationId: createNotification + requestBody: + description: Create a new notification + content: + application/json: + schema: + $ref: '#/components/schemas/CreateBody' + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: object + properties: + messageId: + type: string + example: bc9f19de-8b7b-49a8-9262-c5036a1ed35e + required: ['messageId'] + get: + tags: + - notifications + summary: Gets notifications + description: Gets notifications + operationId: getNotifications + parameters: + - name: pageSize + in: query + description: Page size of the result + required: false + schema: + type: integer + minimum: 0 + - name: pageNumber + in: query + description: Page number of the result + required: false + schema: + type: integer + minimum: 0 + - name: orderBy + in: query + description: order by field. e.g. created, origin. + required: false + schema: + type: string + enum: + - title + - message + - created + - topic + - origin + - name: orderByDirec + in: query + description: order ascending or descending + required: false + schema: + type: string + enum: + - asc + - desc + - name: containsText + in: query + description: Filter notifications whose either title or message contains the provided string + required: false + schema: + type: string + - name: createdAfter + in: query + description: Only notifications created after this timestamp will be included + required: false + schema: + type: string + format: date-time + - name: messageScope + in: query + description: retrieve either logged-in user messages, system messages or both + required: false + schema: + type: string + enum: + - all + - user + - system + - name: read + in: query + description: Notifications read or not + required: false + schema: + type: boolean + responses: + '200': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/Notifications' + /notifications/count: + get: + tags: + - notifications + summary: Get notifications count + description: Gets notifications count + operationId: getNotificationsCount + parameters: + - name: containsText + in: query + description: Filter notifications whose either title or message contains the provided string + required: false + schema: + type: string + - name: createdAfter + in: query + description: Only notifications created after this timestamp will be included + required: false + schema: + type: string + format: date-time + - name: messageScope + in: query + description: retrieve either logged-in user messages, system messages or both + required: false + schema: + type: string + enum: + - all + - user + - system + - name: read + in: query + description: Notifications read or not + required: false + schema: + type: boolean + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: object + properties: + count: + type: number + required: ['count'] + /notifications/read: + put: + tags: + - notifications + summary: Set notification as read/unread + description: Set notification as read/unread + operationId: setRead + parameters: + - name: messageId + in: query + description: The message ID + required: true + schema: + type: string + - name: read + in: query + description: read/unread + required: true + schema: + type: boolean + responses: + '200': + description: Successful operation +components: + schemas: + Notifications: + type: array + items: + $ref: '#/components/schemas/Notification' + Notification: + properties: + id: + type: string + created: + type: string + format: date-time + readByUser: + type: boolean + isSystem: + type: boolean + origin: + type: string + title: + type: string + message: + type: string + topic: + type: string + actions: + type: array + items: + $ref: '#/components/schemas/Action' + required: [id, created, readByUser, isSystem, origin, title, actions] + Action: + properties: + id: + type: string + title: + type: string + url: + type: string + required: [id, title, url] + CreateBody: + properties: + origin: + type: string + title: + type: string + message: + type: string + actions: + type: array + items: + type: object + properties: + title: + type: string + url: + type: string + required: [title, url] + topic: + type: string + targetUsers: + type: array + items: + type: string + targetGroups: + type: array + items: + type: string + required: [origin, title] diff --git a/plugins/notifications-backend/src/run.ts b/plugins/notifications-backend/src/run.ts new file mode 100644 index 0000000000..594839f2e1 --- /dev/null +++ b/plugins/notifications-backend/src/run.ts @@ -0,0 +1,19 @@ +import { getRootLogger } from '@backstage/backend-common'; + +import yn from 'yn'; + +import { startStandaloneServer } from './service/standaloneServer'; + +const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; +const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); +const logger = getRootLogger(); + +startStandaloneServer({ port, enableCors, logger }).catch(err => { + logger.error(err); + process.exit(1); +}); + +process.on('SIGINT', () => { + logger.info('CTRL+C pressed; exiting.'); + process.exit(0); +}); diff --git a/plugins/notifications-backend/src/service/auth.ts b/plugins/notifications-backend/src/service/auth.ts new file mode 100644 index 0000000000..009fdcb1f1 --- /dev/null +++ b/plugins/notifications-backend/src/service/auth.ts @@ -0,0 +1,110 @@ +import { AuthenticationError, NotAllowedError } from '@backstage/errors'; +import { getBearerTokenFromAuthorizationHeader } from '@backstage/plugin-auth-node'; +import { + AuthorizeResult, + BasicPermission, + PermissionEvaluator, +} from '@backstage/plugin-permission-common'; + +import express from 'express'; + +import { DefaultServiceUser } from './constants'; +import { RouterOptions } from './types'; + +export type GetLoggedInUserOptions = Pick< + RouterOptions, + 'identity' | 'tokenManager' | 'externalCallerSecret' +>; +export type CheckUserPermission = GetLoggedInUserOptions & + Pick; + +/* + * User's entity must be present in the catalog. + */ +export const getLoggedInUser = async ( + request: express.Request, + { identity, tokenManager, externalCallerSecret }: GetLoggedInUserOptions, +): Promise => { + const identityResponse = await identity.getIdentity({ request }); + + // To properly set identity, see packages/backend/src/plugins/auth.ts or https://backstage.io/docs/auth/identity-resolver + if (identityResponse) { + // The auth token contains user's identity, most probably originated in the FE + // Example: user:default/guest + let author = identityResponse?.identity.userEntityRef; + if (author) { + if (author.startsWith('user:')) { + author = author.slice('user:'.length); + } + } else { + throw new AuthenticationError( + 'Missing valid authentication data or the user is not in the Catalog.', + ); + } + return author; + } + + const token = getBearerTokenFromAuthorizationHeader( + request.header('authorization'), + ); + if (token) { + // backend service-to-service flow + await tokenManager.authenticate(token); + } + + // External call - workaround + // Following shared-secret is a workaround till we make the creation of valid JWT tokens by external callers simple. + // In such case, the flow would be identical with the service-to-service. + // https://github.com/backstage/backstage/issues/18622 + // https://github.com/backstage/backstage/issues/9374 + if (externalCallerSecret) { + if (request.header('notifications-secret') === externalCallerSecret) { + return DefaultServiceUser; + } + throw new AuthenticationError('Provided shared secret does not match.'); + } + + // Since the shared secret has not been requested in the configuration, we ALLOW the request + return DefaultServiceUser; +}; + +export const checkPermission = async ( + request: express.Request, + permissions: PermissionEvaluator, + permission: BasicPermission, + loggedInUser: string, +) => { + const token = getBearerTokenFromAuthorizationHeader( + request.header('authorization'), + ); + const decision = ( + await permissions.authorize([{ permission }], { + token, + }) + )[0]; + + if (decision.result === AuthorizeResult.DENY) { + throw new NotAllowedError( + `The user ${loggedInUser} is not authorized to ${permission.name}`, + ); + } +}; + +/** + * Checks if the logged-in user has the required permission + * and returns the username. + */ +export const checkUserPermission = async ( + request: express.Request, + options: CheckUserPermission, + requiredPermission: BasicPermission, +): Promise => { + const loggedInUser = await getLoggedInUser(request, options); + await checkPermission( + request, + options.permissions, + requiredPermission, + loggedInUser, + ); + return loggedInUser; +}; diff --git a/plugins/notifications-backend/src/service/constants.ts b/plugins/notifications-backend/src/service/constants.ts new file mode 100644 index 0000000000..bbdf8ce050 --- /dev/null +++ b/plugins/notifications-backend/src/service/constants.ts @@ -0,0 +1,6 @@ +export const DefaultServiceUser = 'default/guest'; +export const DefaultMessageScope = 'user'; +export const DefaultPageNumber = 1; +export const DefaultPageSize = 20; +export const DefaultOrderBy = 'created'; +export const DefaultOrderDirection = 'desc'; diff --git a/plugins/notifications-backend/src/service/db.test.ts b/plugins/notifications-backend/src/service/db.test.ts new file mode 100644 index 0000000000..b324c48a6d --- /dev/null +++ b/plugins/notifications-backend/src/service/db.test.ts @@ -0,0 +1,108 @@ +import { mockServices } from '@backstage/backend-test-utils'; + +import { initDB } from './db'; + +describe('db', () => { + it('init ok', async () => { + const dbClient = await initDB( + mockServices.rootConfig({ + data: { + client: 'better-sqlite3', + connection: { + filename: ':memory:', + }, + useNullAsDefault: true, + }, + }), + ); + + await Promise.all([ + dbClient.schema + .hasTable('messages') + .then(exists => expect(exists).toBeTruthy()), + dbClient.schema + .hasTable('users') + .then(exists => expect(exists).toBeTruthy()), + dbClient.schema + .hasTable('groups') + .then(exists => expect(exists).toBeTruthy()), + dbClient.schema + .hasTable('actions') + .then(exists => expect(exists).toBeTruthy()), + ]); + + expect(dbClient.client.config.connection.database).toEqual( + 'backstage_plugin_notifications', + ); + + await dbClient.destroy(); + }); + + it('set DB name and knex config', async () => { + const dbClient = await initDB( + mockServices.rootConfig({ + data: { + client: 'better-sqlite3', + connection: { + filename: ':memory:', + database: 'testdb', + }, + useNullAsDefault: true, + knexConfig: { + pool: { + min: 1, + max: 1, + }, + }, + }, + }), + ); + + expect(dbClient.client.config.connection.database).toEqual('testdb'); + expect(dbClient.client.config.pool.min).toEqual(1); + + await dbClient.destroy(); + }); + + it('set plugin config', async () => { + const dbClient = await initDB( + mockServices.rootConfig({ + data: { + client: 'better-sqlite3', + connection: { + filename: ':memory:', + database: 'testdb', + }, + useNullAsDefault: true, + knexConfig: { + pool: { + min: 1, + max: 1, + }, + }, + plugin: { + notifications: { + connection: { + filename: 'plugin', + database: 'plugin', + }, + knexConfig: { + pool: { + min: 3, + max: 3, + }, + }, + }, + }, + }, + }), + ); + + expect(dbClient.client.config.connection.database).toEqual('plugin'); + expect(dbClient.client.config.connection.filename).toEqual('plugin'); + expect(dbClient.client.config.pool.min).toEqual(3); + expect(dbClient.client.config.pool.max).toEqual(3); + + await dbClient.destroy(); + }); +}); diff --git a/plugins/notifications-backend/src/service/db.ts b/plugins/notifications-backend/src/service/db.ts new file mode 100644 index 0000000000..bb69b3f3fe --- /dev/null +++ b/plugins/notifications-backend/src/service/db.ts @@ -0,0 +1,112 @@ +import { Config } from '@backstage/config'; + +import knex, { Knex } from 'knex'; +import merge from 'lodash/merge'; + +// initDB +// creates DB client and tables +export async function initDB(dbConfig: Config): Promise> { + // create db client + const knexConfig = merge( + {}, + { connection: { database: 'backstage_plugin_notifications' } }, + dbConfig.getOptional('plugin.notifications'), + dbConfig.getOptional('plugin.notifications.knexConfig'), + dbConfig.get(), + dbConfig.getOptional('knexConfig'), + dbConfig.getOptional('plugin.notifications'), + dbConfig.getOptional('plugin.notifications.knexConfig'), + ); + const dbClient = knex(knexConfig); + + // create tables + if (!(await dbClient.schema.hasTable('messages'))) { + await dbClient.schema.createTable('messages', table => { + table.uuid('id').primary().notNullable().defaultTo(dbClient.fn.uuid()); + table.string('origin').notNullable(); + table.timestamp('created').defaultTo(dbClient.fn.now()).index(); + table.string('title').notNullable(); + table.text('message'); + table.string('topic'); + table.boolean('is_system').notNullable().index(); // is it a system message or a message for specific users and groups + }); + } + + if (!(await dbClient.schema.hasTable('users'))) { + await dbClient.schema.createTable('users', table => { + table.uuid('message_id').notNullable().index(); + table.string('user').notNullable().index(); + table.boolean('read').defaultTo('false'); + table + .foreign('message_id') + .references('id') + .inTable('messages') + .onDelete('CASCADE'); + table.primary(['message_id', 'user']); + }); + } + + if (!(await dbClient.schema.hasTable('groups'))) { + await dbClient.schema.createTable('groups', table => { + table.uuid('message_id').notNullable().index(); + table.string('group').notNullable().index(); + table + .foreign('message_id') + .references('id') + .inTable('messages') + .onDelete('CASCADE'); + table.primary(['message_id', 'group']); + }); + } + + if (!(await dbClient.schema.hasTable('actions'))) { + await dbClient.schema.createTable('actions', table => { + table.uuid('id', { primaryKey: true }).defaultTo(dbClient.fn.uuid()); + table.uuid('message_id').notNullable().index(); + table + .foreign('message_id') + .references('id') + .inTable('messages') + .onDelete('CASCADE'); + table.string('url').notNullable(); + table.string('title').notNullable(); + }); + } + + return dbClient; +} + +export type MessagesInsert = { + origin: string; + title: string; + message?: string; + topic?: string; + is_system: boolean; +}; + +export type ActionsInsert = { + message_id: string; + title: string; + url: string; +}; + +export function dbValToBoolean(val: any): boolean { + if (!val) { + return false; + } + + const valStr = val.toString(); + + switch (valStr) { + case 'true': + case 'TRUE': + case '1': + return true; + case 'false': + case 'FALSE': + case '0': + return false; + default: + throw new Error(`${valStr} is not a boolean value`); + } +} diff --git a/plugins/notifications-backend/src/service/handlers.test.ts b/plugins/notifications-backend/src/service/handlers.test.ts new file mode 100644 index 0000000000..db103a61de --- /dev/null +++ b/plugins/notifications-backend/src/service/handlers.test.ts @@ -0,0 +1,230 @@ +import { mockServices } from '@backstage/backend-test-utils'; +import { CatalogClient } from '@backstage/catalog-client'; +import { Entity } from '@backstage/catalog-model'; + +import { Knex } from 'knex'; + +import { initDB } from './db'; +import { + createNotification, + getNotifications, + getNotificationsCount, + setRead, +} from './handlers'; + +describe('handlers', () => { + // + // create global test vars + // + let dbClient: Knex; + let catalogClient: CatalogClient; + const catalogUser = 'test'; + const catalogGroup = 'test'; + const userEntity: Entity = { + apiVersion: 'v1', + kind: 'user', + metadata: { + name: catalogUser, + }, + spec: { + memberOf: ['test'], + }, + }; + const groupEntity: Entity = { + apiVersion: 'v1', + kind: 'group', + metadata: { + name: catalogGroup, + }, + }; + + // + // initialize global test vars + // + beforeAll(async () => { + dbClient = await initDB( + mockServices.rootConfig({ + data: { + client: 'better-sqlite3', + connection: ':memory:', + useNullAsDefault: true, + }, + }), + ); + + catalogClient = new CatalogClient({ + discoveryApi: { + getBaseUrl: jest.fn(), + }, + fetchApi: { + fetch: jest.fn(), + }, + }); + + catalogClient.getEntityByRef = jest + .fn() + .mockImplementation(async (s: string): Promise => { + const args = s.split(':', 2); + const kind = args[0]; + const entity = args[1]; + + switch (kind) { + case 'user': + if (entity === catalogUser) { + return userEntity; + } + break; + case 'group': + if (entity === catalogGroup) { + return groupEntity; + } + break; + default: + return undefined; + } + + return undefined; + }); + }); + + // + // tests + // + it('getNotifications - 0 notifications', async () => { + const notifications = await getNotifications( + dbClient, + catalogUser, + catalogClient, + {}, + undefined, + undefined, + {}, + ); + expect(Array.isArray(notifications)).toBeTruthy(); + }); + + it('getNotifications - unknown user', async () => { + let hadError = false; + + expect.assertions(1); + try { + await getNotifications( + dbClient, + 'unknown', + catalogClient, + {}, + undefined, + undefined, + {}, + ); + } catch (e) { + if (e instanceof Error) { + hadError = true; + } + } + + expect(hadError).toBeTruthy(); + }); + + it('getNotificationsCount - 0 notifications', async () => { + const result = await getNotificationsCount( + dbClient, + catalogUser, + catalogClient, + {}, + ); + expect(result.count).toEqual(0); + }); + + it('create and get - user notification', async () => { + const before = new Date(); + before.setMilliseconds(0); + + const resultCreate = await createNotification(dbClient, catalogClient, { + origin: 'test', + title: 'test', + targetUsers: [catalogUser], + }); + + const after = new Date(); + + expect(resultCreate.messageId).toBeTruthy(); + + const resultGet = await getNotifications( + dbClient, + catalogUser, + catalogClient, + {}, + undefined, + undefined, + {}, + ); + + const createdDate = new Date(resultGet[0].created); + + expect(resultGet).toHaveLength(1); + expect(createdDate >= before).toBeTruthy(); + expect(createdDate < after).toBeTruthy(); + expect(resultGet[0].isSystem).toBeFalsy(); + }); + + it('create and get - system notification', async () => { + const before = new Date(); + before.setMilliseconds(0); + + const resultCreate = await createNotification(dbClient, catalogClient, { + origin: 'test', + title: 'test', + }); + + const after = new Date(); + + expect(resultCreate.messageId).toBeTruthy(); + + const resultGet = await getNotifications( + dbClient, + catalogUser, + catalogClient, + { messageScope: 'system' }, + undefined, + undefined, + {}, + ); + + const createdDate = new Date(resultGet[0].created); + + expect(resultGet).toHaveLength(1); + expect(createdDate >= before).toBeTruthy(); + expect(createdDate < after).toBeTruthy(); + expect(resultGet[0].isSystem).toBeTruthy(); + }); + + it('mark as read', async () => { + const resultGet = await getNotifications( + dbClient, + catalogUser, + catalogClient, + { messageScope: 'all' }, + undefined, + undefined, + {}, + ); + + const setReadPromises: Promise[] = resultGet.map(notification => + setRead(dbClient, catalogUser, notification.id, true), + ); + await Promise.all(setReadPromises); + + const resultGetRead = await getNotifications( + dbClient, + catalogUser, + catalogClient, + { messageScope: 'all', read: true }, + undefined, + undefined, + {}, + ); + + expect(resultGetRead).toHaveLength(resultGet.length); + }); +}); diff --git a/plugins/notifications-backend/src/service/handlers.ts b/plugins/notifications-backend/src/service/handlers.ts new file mode 100644 index 0000000000..50ea662df9 --- /dev/null +++ b/plugins/notifications-backend/src/service/handlers.ts @@ -0,0 +1,410 @@ +/* eslint-disable func-names */ +import { CatalogClient } from '@backstage/catalog-client'; + +import { Knex } from 'knex'; + +import { Components, Paths } from '../openapi'; +import { + DefaultMessageScope, + DefaultOrderBy, + DefaultOrderDirection, + DefaultPageNumber, + DefaultPageSize, +} from './constants'; +import { ActionsInsert, dbValToBoolean, MessagesInsert } from './db'; +import { + MessageScopes, + NotificationsFilterRequest, + NotificationsOrderByDirections, + NotificationsOrderByFields, + NotificationsSortingRequest, +} from './types'; + +// createNotification +// returns string id of created notification +export async function createNotification( + dbClient: Knex, + catalogClient: CatalogClient, + req: Paths.CreateNotification.RequestBody, +): Promise { + let isUser = false; + + // validate users + if (Array.isArray(req.targetGroups) && req.targetGroups.length > 0) { + isUser = true; + const promises = req.targetGroups.map(group => { + return catalogClient.getEntityByRef(`group:${group}`).then(groupRef => { + if (!groupRef) { + throw new Error(`group '${group}' does not exist`); + } + }); + }); + + await Promise.all(promises); + } + + // validate groups + if (Array.isArray(req.targetUsers) && req.targetUsers.length > 0) { + isUser = true; + const promises = req.targetUsers.map(user => { + return catalogClient.getEntityByRef(`user:${user}`).then(userRef => { + if (!userRef) { + throw new Error(`user '${user}' does not exist`); + } + }); + }); + + await Promise.all(promises); + } + + // validate actions + if (Array.isArray(req.actions)) { + req.actions.forEach(action => { + if (!action.title || !action.url) { + throw new Error('Both action title and url are mandatory.'); + } + }); + } + + const row: MessagesInsert = { + origin: req.origin, + title: req.title, + message: req.message, + topic: req.topic, + is_system: !isUser, + }; + + let messageId: string; + + const ret = dbClient.transaction(trx => { + return trx + .insert(row) + .returning('id') + .into('messages') + .then(ids => { + messageId = ids[0].id; + if (Array.isArray(req.targetUsers)) { + const userInserts = req.targetUsers.map(user => { + return { + message_id: messageId, + user: user, + }; + }); + return trx('users').insert(userInserts); + } + + return undefined; + }) + .then(() => { + if (Array.isArray(req.targetGroups)) { + const groupInserts = req.targetGroups.map(group => { + return { + message_id: messageId, + group: group, + }; + }); + return trx('groups').insert(groupInserts); + } + + return undefined; + }) + .then(() => { + if (Array.isArray(req.actions)) { + const actionInserts: ActionsInsert[] = req.actions.map(action => { + return { + url: action.url, + title: action.title, + message_id: messageId, + }; + }); + + return trx('actions').insert(actionInserts); + } + + return undefined; + }) + .then(() => { + return { messageId: messageId }; + }); + }); + + return ret; +} + +// getNotifications +export async function getNotifications( + dbClient: Knex, + loggedInUser: string, + catalogClient: CatalogClient, + filter: NotificationsFilterRequest, + pageSize: number = DefaultPageSize, + pageNumber: number = DefaultPageNumber, + sorting: NotificationsSortingRequest, +): Promise { + if ( + pageSize < 0 || + pageNumber < 0 || + (pageSize === 0 && pageNumber > 0) || + (pageSize > 0 && pageNumber === 0) + ) { + throw new Error( + 'pageSize and pageNumber must both be either 0 or greater than 0', + ); + } + + if (!filter.messageScope) { + filter.messageScope = DefaultMessageScope; + } else if (!MessageScopes.includes(filter.messageScope)) { + throw new Error( + `messageScope parameter must be one of ${MessageScopes.join()}`, + ); + } + + const orderBy = sorting.orderBy || DefaultOrderBy; + const orderByDirec = sorting.OrderByDirec || DefaultOrderDirection; + if ( + !NotificationsOrderByFields.includes(orderBy) || + !NotificationsOrderByDirections.includes(orderByDirec) + ) { + throw new Error( + `The orderBy parameter can be one of ${NotificationsOrderByFields.join( + ',', + )}. The orderByDirec can be either ${NotificationsOrderByDirections.join( + ' or ', + )}.`, + ); + } + + const userGroups = await getUserGroups(catalogClient, loggedInUser); + + const query = createQuery(dbClient, loggedInUser, filter, userGroups); + + query.orderBy(orderBy, orderByDirec); + + if (pageNumber > 0) { + query.limit(pageSize).offset((pageNumber - 1) * pageSize); + } + + const notifications = await query.select('*').then(messages => + messages.map((message: any) => { + const notification: Components.Schemas.Notification = { + id: message.id, + created: message.created, + isSystem: dbValToBoolean(message.is_system), + readByUser: dbValToBoolean(message.read), + origin: message.origin, + title: message.title, + message: message.message, + topic: message.topic, + actions: [], + }; + return notification; + }), + ); + + const actionsMessageIds = notifications.map(notification => notification.id); + + const actionsQuery = dbClient('actions') + .select('*') + .whereIn('message_id', actionsMessageIds); + await actionsQuery.then(actions => { + actions.forEach(action => { + const notification = notifications.find(n => n.id === action.message_id); + if (notification) { + notification.actions.push({ + id: action.id, + url: action.url, + title: action.title, + }); + } + }); + }); + + return notifications; +} + +export async function getNotificationsCount( + dbClient: Knex, + loggedInUser: string, + catalogClient: CatalogClient, + filter: NotificationsFilterRequest, +): Promise { + if (!filter.messageScope) { + filter.messageScope = DefaultMessageScope; + } + + const userGroups = await getUserGroups(catalogClient, loggedInUser); + + const query = createQuery(dbClient, loggedInUser, filter, userGroups); + + const ret = query.count('* as CNT').then(count => { + const msgcount = Number.parseInt(count[0].CNT.toString(), 10); + const result: Paths.GetNotificationsCount.Responses.$200 = { + count: msgcount, + }; + return result; + }); + + return ret; +} + +export async function setRead( + dbClient: Knex, + loggedInUser: string, + messageId: string, + read: boolean, +) { + let isUpdate = false; + let isInsert = false; + + // verify that message id exists + await dbClient('messages') + .where('id', messageId) + .count('* as CNT') + .then(count => { + const msgcount = count[0].CNT.toString(); + + if (msgcount !== '1') { + throw new Error(`message ID ${messageId} does not exist`); + } + }); + + // check user row exists + await dbClient('users') + .where('message_id', messageId) + .andWhere('user', loggedInUser) + .select('*') + .then(rows => { + if (!Array.isArray(rows)) { + return; + } + if (rows.length === 1) { + isUpdate = true; + } else if (rows.length === 0) { + isInsert = true; + } + }); + + // insert/update user row + if (isInsert) { + await dbClient('users').insert({ + message_id: messageId, + user: loggedInUser, + read: read, + }); + } + + if (isUpdate) { + await dbClient('users') + .where('message_id', messageId) + .andWhere('user', loggedInUser) + .update('read', read); + } +} + +function createQuery( + dbClient: Knex, + loggedInUser: string, + filter: NotificationsFilterRequest, + userGroups: string[], +) { + // join messages table with users table to get message status. E.g read/unread + const query = dbClient('messages'); + + query.leftJoin( + function () { + this.select('*') + .from('users') + .where('users.user', loggedInUser) + .as('users'); + }, + function () { + this.on('messages.id', '=', 'users.message_id'); + }, + ); + + // select messages matching filter + + // select either system messages or messages intended for the user + query.where(function () { + if (filter.messageScope !== 'user') { + this.where('is_system', true); + } + + if (filter.messageScope !== 'system') { + this.orWhere(function () { + this.where('is_system', false).andWhere(function () { + this.whereIn('id', function () { + this.select('message_id').from('users').where('user', loggedInUser); + }); + + if (Array.isArray(userGroups) && userGroups.length > 0) { + this.orWhereIn('id', function () { + this.select('message_id') + .from('groups') + .whereIn('group', userGroups); + }); + } + }); + }); + } + }); + + // filter by text + if (filter.containsText) { + query.andWhere(function () { + this.whereILike('title', `%${filter.containsText}%`).orWhereILike( + 'message', + `%${filter.containsText}%`, + ); + }); + } + + // filter by time + if (filter.createdAfter) { + query.andWhere('created', '>', filter.createdAfter); + } + + // filter by read/unread + switch (filter.read) { + case true: + query.andWhere('read', true); + break; + case false: + query.andWhere(function () { + this.where('read', false).orWhereNull('read'); + }); + break; + case undefined: + break; + default: + throw new Error( + 'value of parameter "read" must be either "false" or "true"', + ); + } + + return query; +} + +function getUserGroups( + catalogClient: CatalogClient, + user: string, +): Promise { + return catalogClient.getEntityByRef(`user:${user}`).then(userRef => { + if (!userRef) { + throw new Error(`user '${user}' does not exist`); + } + + if (userRef.spec && Array.isArray(userRef.spec.memberOf)) { + return userRef.spec.memberOf.map(value => { + if (value) { + return value.toString(); + } + return ''; + }); + } + + return []; + }); +} +/* eslint-enable func-names */ diff --git a/plugins/notifications-backend/src/service/permissions.ts b/plugins/notifications-backend/src/service/permissions.ts new file mode 100644 index 0000000000..568cc972cd --- /dev/null +++ b/plugins/notifications-backend/src/service/permissions.ts @@ -0,0 +1,22 @@ +import { createPermission } from '@backstage/plugin-permission-common'; + +export const notificationsCreatePermission = createPermission({ + name: 'notifications.create', + attributes: { action: 'create' }, +}); + +export const notificationsReadPermission = createPermission({ + name: 'notifications.list', + attributes: { action: 'read' }, +}); + +export const notificationsSetReadPermission = createPermission({ + name: 'notifications.update.read', + attributes: { action: 'update' }, +}); + +export const notificationsPermissions = [ + notificationsCreatePermission, + notificationsReadPermission, + notificationsSetReadPermission, +]; diff --git a/plugins/notifications-backend/src/service/router.ts b/plugins/notifications-backend/src/service/router.ts new file mode 100644 index 0000000000..677067ce6c --- /dev/null +++ b/plugins/notifications-backend/src/service/router.ts @@ -0,0 +1,154 @@ +import { fullFormats } from 'ajv-formats/dist/formats'; +import express from 'express'; +import Router from 'express-promise-router'; +import { Context, OpenAPIBackend, Request } from 'openapi-backend'; + +import { Paths } from '../openapi'; +import { checkUserPermission } from './auth'; +import { initDB } from './db'; +import { + createNotification, + getNotifications, + getNotificationsCount, + setRead, +} from './handlers'; +import { + notificationsCreatePermission, + notificationsReadPermission, + notificationsSetReadPermission, +} from './permissions'; +import { RouterOptions } from './types'; + +export async function createRouter( + options: RouterOptions, +): Promise { + const { logger, dbConfig, catalogClient } = options; + + // create DB client and tables + if (!dbConfig) { + logger.error('Missing dbConfig'); + throw new Error('Missing database config'); + } + + const dbClient = await initDB(dbConfig); + + // create openapi requests handler + const api = new OpenAPIBackend({ + ajvOpts: { + formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280 + }, + validate: true, + definition: '../../plugins/notifications-backend/src/openapi.yaml', + }); + + await api.init(); + + api.register( + 'createNotification', + ( + c: Context, + req: express.Request, + res: express.Response, + ) => + checkUserPermission(req, options, notificationsCreatePermission).then( + () => + createNotification( + dbClient, + catalogClient, + c.request.requestBody, + ).then(result => res.json(result)), + ), + ); + + api.register( + 'getNotifications', + (c, req: express.Request, res: express.Response) => + checkUserPermission(req, options, notificationsReadPermission).then( + loggedInUser => { + const q: Paths.GetNotifications.QueryParameters = Object.assign( + {}, + c.request.query, + ); + // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571 + q.pageNumber = stringToNumber(q.pageNumber); + q.pageSize = stringToNumber(q.pageSize); + q.read = stringToBool(q.read); + + return getNotifications( + dbClient, + loggedInUser, + catalogClient, + q, + q.pageSize, + q.pageNumber, + q, + ).then(notifications => res.json(notifications)); + }, + ), + ); + + api.register( + 'getNotificationsCount', + (c, req: express.Request, res: express.Response) => + checkUserPermission(req, options, notificationsReadPermission).then( + loggedInUser => { + const q: Paths.GetNotificationsCount.QueryParameters = Object.assign( + {}, + c.request.query, + ); + + // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571 + q.read = q.read = stringToBool(q.read); + + return getNotificationsCount( + dbClient, + loggedInUser, + catalogClient, + q, + ).then(result => res.json(result)); + }, + ), + ); + + api.register('setRead', (c, req: express.Request, res: express.Response) => + checkUserPermission(req, options, notificationsSetReadPermission).then( + loggedInUser => { + const messageId = c.request.query.messageId.toString(); + const read = c.request.query.read.toString() === 'true'; + + return setRead(dbClient, loggedInUser, messageId, read).then(result => + res.json(result), + ); + }, + ), + ); + + // create router + const router = Router(); + router.use(express.json()); + router.use((req, res, next) => { + if (!next) { + throw new Error('next is undefined'); + } + const validation = api.validateRequest(req as Request); + if (!validation.valid) { + throw validation.errors; + } + + api.handleRequest(req as Request, req, res).catch(next); + }); + + return router; +} + +function stringToNumber(s: number | undefined): number | undefined { + return s ? Number.parseInt(s.toString(), 10) : undefined; +} + +function stringToBool(s: boolean | undefined): boolean | undefined { + if (!s) { + return undefined; + } + + return s.toString() === 'true' ? true : false; +} diff --git a/plugins/notifications-backend/src/service/standaloneServer.ts b/plugins/notifications-backend/src/service/standaloneServer.ts new file mode 100644 index 0000000000..2f10918b46 --- /dev/null +++ b/plugins/notifications-backend/src/service/standaloneServer.ts @@ -0,0 +1,41 @@ +import { createServiceBuilder } from '@backstage/backend-common'; + +import { Router } from 'express'; +import { Logger } from 'winston'; + +import { Server } from 'http'; + +// import { createRouter } from './router'; + +export interface ServerOptions { + port: number; + enableCors: boolean; + logger: Logger; +} + +export async function startStandaloneServer( + options: ServerOptions, +): Promise { + const logger = options.logger.child({ service: 'notifications-backend' }); + + logger.debug('Starting application server...'); + const router = Router(); + /* const router = await createRouter({ + logger, + // TODO: get dbClient in standalone mode + }); */ + + let service = createServiceBuilder(module) + .setPort(options.port) + .addRouter('/notifications', router); + if (options.enableCors) { + service = service.enableCors({ origin: 'http://localhost:3000' }); + } + + return await service.start().catch(err => { + logger.error(err); + process.exit(1); + }); +} + +module.hot?.accept(); diff --git a/plugins/notifications-backend/src/service/types.ts b/plugins/notifications-backend/src/service/types.ts new file mode 100644 index 0000000000..c5049e025d --- /dev/null +++ b/plugins/notifications-backend/src/service/types.ts @@ -0,0 +1,69 @@ +import { TokenManager } from '@backstage/backend-common'; +import { CatalogClient } from '@backstage/catalog-client'; +import { Config } from '@backstage/config'; +import { IdentityApi } from '@backstage/plugin-auth-node'; +import { PermissionEvaluator } from '@backstage/plugin-permission-common'; + +import { Logger } from 'winston'; + +export interface RouterOptions { + logger: Logger; + dbConfig: Config; + catalogClient: CatalogClient; + identity: IdentityApi; + permissions: PermissionEvaluator; + tokenManager: TokenManager; + + // Workaround - see auth.ts + externalCallerSecret?: string; +} + +export type NotificationsFilterRequest = { + /** + * Filter notifications whose either title or message contains the provided string. + */ + containsText?: string; + + /** + * Only notifications created after this timestamp will be included. + */ + createdAfter?: string; + + /** + * See MessageScopes + * Default: DefaultMessageScope + */ + messageScope?: string; + + /** + * 'false' for user's unread messages, 'true' for read ones. + * If undefined, then both marks. + */ + read?: boolean; +}; + +/** + * How the result set is sorted. + */ +export type NotificationsSortingRequest = { + orderBy?: string; + OrderByDirec?: string; +}; + +export const NotificationsOrderByFields: string[] = [ + 'title', + 'message', + 'created', + 'topic', + 'origin', +]; + +export const NotificationsOrderByDirections: string[] = ['asc', 'desc']; + +/** + * MessageScopes + * When 'user' is requested, then messages whose targetUsers or targetGroups are matching the "user". + * When "system" is requested, only system-wide messages will be filtered (read: those without targetUsers or targetGroups provided). + * When 'all' is requests then fetch both system and user messages + */ +export const MessageScopes = ['all', 'user', 'system']; diff --git a/plugins/notifications-backend/src/setupTests.ts b/plugins/notifications-backend/src/setupTests.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/plugins/notifications-backend/src/setupTests.ts @@ -0,0 +1 @@ +export {}; diff --git a/plugins/notifications-backend/tsconfig.json b/plugins/notifications-backend/tsconfig.json new file mode 100644 index 0000000000..5a52294bd8 --- /dev/null +++ b/plugins/notifications-backend/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": ["src", "dev", "migrations"], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "../../dist-types/plugins/notifications-backend", + "rootDir": "." + } +} diff --git a/plugins/notifications-backend/turbo.json b/plugins/notifications-backend/turbo.json new file mode 100644 index 0000000000..1969dd020e --- /dev/null +++ b/plugins/notifications-backend/turbo.json @@ -0,0 +1,9 @@ +{ + "extends": ["//"], + "pipeline": { + "tsc": { + "outputs": ["../../dist-types/plugins/notifications-backend/**"], + "dependsOn": ["^tsc"] + } + } +} diff --git a/plugins/notifications-backend/users.yaml b/plugins/notifications-backend/users.yaml new file mode 100644 index 0000000000..60fb810885 --- /dev/null +++ b/plugins/notifications-backend/users.yaml @@ -0,0 +1,60 @@ +apiVersion: backstage.io/v1alpha1 +kind: User +metadata: + name: guest +spec: + profile: + displayName: Guest User + memberOf: [] +--- +apiVersion: backstage.io/v1alpha1 +kind: User +metadata: + name: jdoe +spec: + profile: + displayName: Jenny Doe + email: jenny-doe@example.com + picture: https://example.com/staff/jenny-with-party-hat.jpeg + memberOf: [jdoe, jdoe-2] +--- +apiVersion: backstage.io/v1alpha1 +kind: User +metadata: + name: jdoe-2 +spec: + profile: + displayName: Jenny Doe + email: jenny-doe@example.com + picture: https://example.com/staff/jenny-with-party-hat.jpeg + memberOf: [jdoe] +--- +apiVersion: backstage.io/v1alpha1 +kind: Group +metadata: + name: jdoe + description: The infra business unit +spec: + type: business-unit + profile: + displayName: jdoe + email: infrastructure@example.com + picture: https://example.com/groups/bu-infrastructure.jpeg + parent: ops + children: [backstage, other] + members: [jdoe] +--- +apiVersion: backstage.io/v1alpha1 +kind: Group +metadata: + name: jdoe-2 + description: The infra business unit +spec: + type: business-unit + profile: + displayName: jdoe + email: infrastructure@example.com + picture: https://example.com/groups/bu-infrastructure.jpeg + parent: ops + children: [backstage, other] + members: [jdoe] diff --git a/plugins/notifications-frontend/.eslintrc.js b/plugins/notifications-frontend/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/notifications-frontend/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/notifications-frontend/README.md b/plugins/notifications-frontend/README.md new file mode 100644 index 0000000000..2c37d0be7a --- /dev/null +++ b/plugins/notifications-frontend/README.md @@ -0,0 +1,72 @@ +# Notifications + +This Backstage front-end plugin provides: + +- the Notifications page listing notifications from the logged-in user's perspective +- the NotificationsApi for accessing the notifications backend from front-end plugins +- an active item to the main left side menu to both notify the user about new messages and provide navigation to the Notifications page +- an alert about new system notifications + +## Getting started + +### Prerequisities + +Have `@backstage/plugin-notifications-backend` installed and running. + +### Add NPM dependency + +``` +cd packages/app +yarn add @backstage/plugin-notifications-frontend +``` + +### Add left-side menu item + +In the `packages/app/src/components/Root/Root.tsx`: + +``` +import { NotificationsSidebarItem } from '@backstage/plugin-notifications-frontend'; + +... +export const Root = ({ children }: PropsWithChildren<{}>) => ( + ... + {/* New code: */} + + + + {/* Existing code for reference: */} + + + + + { + ... + {/* New code: */} + } /> +``` + +## How to use the NotificationApi + +``` +import { notificationsApiRef, Notification } from '@backstage/plugin-notifications-frontend'; + +... + +const notificationsApi = useApi(notificationsApiRef); +const notifications: Notification[] = await notificationsApi.getNotifications(params); + +``` + +See `src/api/notificationsApi.ts` for more details. diff --git a/plugins/notifications-frontend/dev/index.tsx b/plugins/notifications-frontend/dev/index.tsx new file mode 100644 index 0000000000..d5e3f1e208 --- /dev/null +++ b/plugins/notifications-frontend/dev/index.tsx @@ -0,0 +1,14 @@ +import React from 'react'; + +import { createDevApp } from '@backstage/dev-utils'; + +import { NotificationsPage, notificationsPlugin } from '../src/plugin'; + +createDevApp() + .registerPlugin(notificationsPlugin) + .addPage({ + element: , + title: 'Root Page', + path: '/notifications', + }) + .render(); diff --git a/plugins/notifications-frontend/openapitools.json b/plugins/notifications-frontend/openapitools.json new file mode 100644 index 0000000000..15fef607c4 --- /dev/null +++ b/plugins/notifications-frontend/openapitools.json @@ -0,0 +1,7 @@ +{ + "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", + "spaces": 2, + "generator-cli": { + "version": "7.1.0" + } +} diff --git a/plugins/notifications-frontend/package.json b/plugins/notifications-frontend/package.json new file mode 100644 index 0000000000..befd2c26e9 --- /dev/null +++ b/plugins/notifications-frontend/package.json @@ -0,0 +1,66 @@ +{ + "name": "@backstage/plugin-notifications-frontend", + "description": "Frontend part of the notifications providing the Notifications API, Notifications page, left-side menu item and other REACT components.", + "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 --passWithNoTests --coverage", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "tsc": "tsc", + "openapi:generate": "openapi-generator-cli generate -i ../notifications-backend/src/openapi.yaml --enable-post-process-file -g typescript-fetch -o ./src/openapi && find ./src/openapi -name '*.ts' -exec sed -i '1i // @ts-nocheck' {} \\;" + }, + "dependencies": { + "@backstage/core-components": "^0.13.6", + "@backstage/core-plugin-api": "^1.7.0", + "@backstage/theme": "^0.4.3", + "@material-table/core": "^3.1.0", + "@material-ui/core": "^4.9.13", + "@material-ui/icons": "^4.11.3", + "@material-ui/lab": "^4.0.0-alpha.45", + "@mui/material": "^5.12.2", + "lodash": "^4.17.21", + "react-use": "^17.4.0" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0", + "react-router-dom": "^6.11.2" + }, + "devDependencies": { + "@backstage/cli": "0.23.0", + "@backstage/core-app-api": "1.11.0", + "@backstage/dev-utils": "1.0.22", + "@backstage/test-utils": "^1.4.4", + "@openapitools/openapi-generator-cli": "^2.7.0", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^12.1.5", + "@testing-library/user-event": "^14.5.1", + "@types/node": "*", + "msw": "1.3.2" + }, + "files": [ + "dist" + ], + "repository": "github:janus-idp/backstage-plugins", + "keywords": [ + "backstage", + "plugin" + ], + "homepage": "https://janus-idp.io/", + "bugs": "https://github.com/janus-idp/backstage-plugins/issues" +} diff --git a/plugins/notifications-frontend/src/api/NotificationsApiImpl.ts b/plugins/notifications-frontend/src/api/NotificationsApiImpl.ts new file mode 100644 index 0000000000..15e9560ed5 --- /dev/null +++ b/plugins/notifications-frontend/src/api/NotificationsApiImpl.ts @@ -0,0 +1,49 @@ +import { FetchApi } from '@backstage/core-plugin-api'; + +import { + Configuration, + CreateBody, + GetNotificationsRequest, + Notification, + NotificationsApi as NotificationsOpenApi, +} from '../openapi'; +import { + NotificationMarkAsRead, + NotificationsApi, + NotificationsCountQuery, +} from './notificationsApi'; + +export type NotificationsApiOptions = { + fetchApi: FetchApi; +}; + +export class NotificationsApiImpl implements NotificationsApi { + private readonly backendRestApi: NotificationsOpenApi; + + constructor(options: NotificationsApiOptions) { + const configuration = new Configuration({ + fetchApi: options.fetchApi.fetch, + }); + this.backendRestApi = new NotificationsOpenApi(configuration); + } + + async createNotification(notification: CreateBody): Promise { + const data = await this.backendRestApi.createNotification({ + createBody: notification, + }); + return data.messageId; + } + + getNotifications(query: GetNotificationsRequest): Promise { + return this.backendRestApi.getNotifications(query); + } + + async getNotificationsCount(query: NotificationsCountQuery): Promise { + const data = await this.backendRestApi.getNotificationsCount(query); + return data.count; + } + + async markAsRead(params: NotificationMarkAsRead): Promise { + return this.backendRestApi.setRead(params); + } +} diff --git a/plugins/notifications-frontend/src/api/index.ts b/plugins/notifications-frontend/src/api/index.ts new file mode 100644 index 0000000000..b260d8826b --- /dev/null +++ b/plugins/notifications-frontend/src/api/index.ts @@ -0,0 +1,2 @@ +export * from './notificationsApi'; +export * from './NotificationsApiImpl'; diff --git a/plugins/notifications-frontend/src/api/notificationsApi.ts b/plugins/notifications-frontend/src/api/notificationsApi.ts new file mode 100644 index 0000000000..3d4e5c2ba6 --- /dev/null +++ b/plugins/notifications-frontend/src/api/notificationsApi.ts @@ -0,0 +1,37 @@ +import { createApiRef } from '@backstage/core-plugin-api'; + +import { + CreateBody, + GetNotificationsCountRequest, + GetNotificationsRequest, + Notification, + SetReadRequest, +} from '../openapi'; + +export type NotificationsCreateRequest = CreateBody; + +export type NotificationsQuery = Omit; + +export type NotificationsCountQuery = Omit< + GetNotificationsCountRequest, + 'user' +>; + +export type NotificationMarkAsRead = Omit; +export interface NotificationsApi { + /** Create a notification. Returns its new ID. */ + createNotification(notification: NotificationsCreateRequest): Promise; + + /** Read a list of notifications based on filter parameters. */ + getNotifications(query?: NotificationsQuery): Promise; + + /** Returns the count of notifications for the user. */ + getNotificationsCount(query?: NotificationsCountQuery): Promise; + + /** Marks the notification as read by the user. */ + markAsRead(params: NotificationMarkAsRead): Promise; +} + +export const notificationsApiRef = createApiRef({ + id: 'plugin.notifications', +}); diff --git a/plugins/notifications-frontend/src/components/NotificationsPage/NotificationsPage.tsx b/plugins/notifications-frontend/src/components/NotificationsPage/NotificationsPage.tsx new file mode 100644 index 0000000000..a699844426 --- /dev/null +++ b/plugins/notifications-frontend/src/components/NotificationsPage/NotificationsPage.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { useParams } from 'react-router-dom'; + +import { Page, RoutedTabs } from '@backstage/core-components'; + +import { PersonalNotifications } from '../PersonalNotifications'; +import { SendNotification } from '../SendNotification'; +import { SystemNotifications } from '../SystemNotifications'; + +export const NotificationsPage = () => { + const params = useParams(); + const isSend = params['*'] === 'send'; + + const routes = [ + { + path: 'personal', + title: 'Personal', + children: , + }, + { + path: 'updates', + title: 'Updates', + children: , + }, + ]; + + if (isSend) { + // This tab is not displayed by default, only when directly navigated by the URL. + // Meant for demonstration and debug purposes, since the notifications are + // expected to be send by 3rd party FE/BE plugins or external systems. + routes.push({ + path: 'send', + title: 'Send', + children: , + }); + } + + return ( + + + + ); +}; diff --git a/plugins/notifications-frontend/src/components/NotificationsPage/index.ts b/plugins/notifications-frontend/src/components/NotificationsPage/index.ts new file mode 100644 index 0000000000..763b7aa964 --- /dev/null +++ b/plugins/notifications-frontend/src/components/NotificationsPage/index.ts @@ -0,0 +1 @@ +export * from './NotificationsPage'; diff --git a/plugins/notifications-frontend/src/components/NotificationsSidebarItem.tsx b/plugins/notifications-frontend/src/components/NotificationsSidebarItem.tsx new file mode 100644 index 0000000000..1c0fc5d38b --- /dev/null +++ b/plugins/notifications-frontend/src/components/NotificationsSidebarItem.tsx @@ -0,0 +1,125 @@ +import React from 'react'; + +import { SidebarItem } from '@backstage/core-components'; +import { useApi } from '@backstage/core-plugin-api'; + +import { + IconButton, + Link, + makeStyles, + Snackbar, + Tooltip, +} from '@material-ui/core'; +import CloseIcon from '@material-ui/icons/Close'; +import NotificationsIcon from '@material-ui/icons/Notifications'; +import NotificationsOffIcon from '@material-ui/icons/NotificationsOff'; + +import { notificationsApiRef } from '../api'; +import { NOTIFICATIONS_ROUTE } from '../constants'; +import { Notification } from '../openapi'; +import { usePollingEffect } from './usePollingEffect'; + +const NotificationsErrorIcon = () => ( + + + +); + +export type NotificationsSidebarItemProps = { + /** + * Number of milliseconds between polling the notifications backend. + * If negative or zero, the poling is not started. + * Example: 5000 + */ + pollingInterval?: number; +}; + +const useStyles = makeStyles(_theme => ({ + systemAlertAction: { + marginRight: '1rem', + }, +})); + +export const NotificationsSidebarItem = ({ + pollingInterval, +}: NotificationsSidebarItemProps) => { + const styles = useStyles(); + const notificationsApi = useApi(notificationsApiRef); + + const [error, setError] = React.useState(undefined); + const [unreadCount, setUnreadCount] = React.useState(0); + const [pageLoadingTime] = React.useState(new Date(Date.now())); + const [lastSystemWideNotification, setLastSystemWideNotification] = + React.useState(); + const [closedNotificationId, setClosedNotificationId] = + React.useState(); + + const pollCallback = React.useCallback(async () => { + try { + setUnreadCount( + await notificationsApi.getNotificationsCount({ + read: false, + messageScope: 'user', + }), + ); + + const data = await notificationsApi.getNotifications({ + pageSize: 1, + pageNumber: 1, + createdAfter: pageLoadingTime, + orderBy: 'created', + orderByDirec: 'desc', + messageScope: 'system', + }); + + setLastSystemWideNotification(data?.[0]); + } catch (e: unknown) { + setError(e as Error); + } + }, [notificationsApi, pageLoadingTime]); + + usePollingEffect(pollCallback, [], pollingInterval); + + let icon = NotificationsIcon; + if (!!error) { + icon = NotificationsErrorIcon; + } + + return ( + <> + + {lastSystemWideNotification && !lastSystemWideNotification.readByUser && ( + + + Show + + + setClosedNotificationId(lastSystemWideNotification.id) + } + > + + + + } + /> + )} + + ); +}; diff --git a/plugins/notifications-frontend/src/components/NotificationsTable/MarkAsUnreadIcon.tsx b/plugins/notifications-frontend/src/components/NotificationsTable/MarkAsUnreadIcon.tsx new file mode 100644 index 0000000000..0e6daf0731 --- /dev/null +++ b/plugins/notifications-frontend/src/components/NotificationsTable/MarkAsUnreadIcon.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import { makeStyles } from '@material-ui/core'; + +const useStyles = makeStyles({ + svg: { + width: 'auto', + height: 24, + }, + path: { + fill: '#7df3e1', + }, +}); + +const MarkAsUnreadIcon = () => { + const classes = useStyles(); + + return ( + + + + ); +}; + +export default MarkAsUnreadIcon; diff --git a/plugins/notifications-frontend/src/components/NotificationsTable/NotificationsTable.tsx b/plugins/notifications-frontend/src/components/NotificationsTable/NotificationsTable.tsx new file mode 100644 index 0000000000..58d7fe674c --- /dev/null +++ b/plugins/notifications-frontend/src/components/NotificationsTable/NotificationsTable.tsx @@ -0,0 +1,243 @@ +import React, { useMemo } from 'react'; +import { useAsync } from 'react-use'; + +import { + Link, + ResponseErrorPanel, + Table, + TableColumn, +} from '@backstage/core-components'; +import { useApi } from '@backstage/core-plugin-api'; + +import { MaterialTableProps } from '@material-table/core'; +import { Grid, IconButton, Tooltip } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; +import MarkAsReadIcon from '@material-ui/icons/CheckCircle'; +import debounce from 'lodash/debounce'; + +import { notificationsApiRef, NotificationsQuery } from '../../api'; +import { DebounceDelayMs } from '../../constants'; +import { + GetNotificationsCountMessageScopeEnum, + GetNotificationsOrderByDirecEnum, + GetNotificationsOrderByEnum, + Notification, +} from '../../openapi'; +import MarkAsUnreadIcon from './MarkAsUnreadIcon'; +import { + CreatedAfterOptions, + NotificationsToolbar, +} from './NotificationsToolbar'; + +const useStyles = makeStyles({ + actionsRoot: { + justifyContent: 'space-between', + paddingRight: '1rem', + }, + readActionIcon: { + color: 'black', + }, +}); + +export type NotificationsTableProps = { + messageScope: GetNotificationsCountMessageScopeEnum; +}; + +export const NotificationsTable = ({ + messageScope, +}: NotificationsTableProps) => { + const notificationsApi = useApi(notificationsApiRef); + const classes = useStyles(); + const [pageNumber, setPageNumber] = React.useState(0); + const [pageSize, setPageSize] = React.useState(5); + const [containsText, setContainsText] = React.useState(); + const [createdAfter, setCreatedAfter] = React.useState('lastWeek'); + const [unreadOnly, setUnreadOnly] = React.useState(true); + const [sorting, setSorting] = React.useState< + | { + orderBy: GetNotificationsOrderByEnum; + orderByDirec: GetNotificationsOrderByDirecEnum; + } + | undefined + >(); + const [reload, setReload] = React.useState(0); + + const onMarkAsReadSwitch = React.useCallback( + (notification: Notification) => { + notificationsApi + .markAsRead({ + messageId: notification.id, + read: !notification.readByUser, + }) + .then(() => setReload(Date.now())); + }, + [notificationsApi], + ); + + const debouncedContainsTextHandler = useMemo( + () => debounce(setContainsText, DebounceDelayMs), + [], + ); + + const { loading, value, error } = useAsync(async (): Promise<{ + notifications: Notification[]; + totalCount: number; + }> => { + const createdAfterDate = CreatedAfterOptions[createdAfter].getDate(); + + const commonParams: Pick< + NotificationsQuery, + 'containsText' | 'createdAfter' | 'messageScope' | 'read' + > = { + containsText, + createdAfter: createdAfterDate, + messageScope, + }; + + if (unreadOnly !== undefined) { + commonParams.read = !unreadOnly; + } + + const data = await notificationsApi.getNotifications({ + ...commonParams, + ...sorting, + pageSize, + pageNumber: pageNumber + 1 /* BE starts at 1 */, + }); + + // TODO: extend BE to get both in a single query/response + const total = await notificationsApi.getNotificationsCount({ + ...commonParams, + }); + + return { + notifications: data, + totalCount: total, + }; + }, [ + pageNumber, + pageSize, + containsText, + createdAfter, + sorting, + unreadOnly, + reload, + ]); + + const actionsColumn: TableColumn = React.useMemo( + () => ({ + title: 'Actions', + render: (notification: Notification): React.ReactNode => { + let actions; + if (!!notification.actions?.length) { + actions = ( + + {notification.actions.map(action => ( + + + {action.title || 'More info'} + + + ))} + + ); + } + + const markAsReadText = notification.readByUser + ? 'Return among unread' + : 'Mark as read'; + const IconComponent = notification.readByUser + ? MarkAsUnreadIcon + : MarkAsReadIcon; + + return ( + + + {actions} + + + + + { + onMarkAsReadSwitch(notification); + }} + > + + + + + + ); + }, + }), + [classes.actionsRoot, classes.readActionIcon, onMarkAsReadSwitch], + ); + + const onOrderChange = React.useCallback< + NonNullable['onOrderChange']> + >((orderBy, orderByDirec) => { + if (orderBy < 0) { + setSorting(undefined); + return; + } + + const fieldNames: GetNotificationsOrderByEnum[] = [ + /* Keep the order in sync with the column definitions bellow */ + 'title', + 'message', + 'created', + 'topic', + 'origin', + ]; + const fieldName = fieldNames[orderBy]; + + setSorting({ orderBy: fieldName, orderByDirec }); + }, []); + + const columns = React.useMemo( + (): TableColumn[] => [ + { title: 'Title', field: 'title' }, + { title: 'Message', field: 'message' }, + { title: 'Created', field: 'created', type: 'datetime' }, + { title: 'Topic', field: 'topic' }, + { title: 'Origin', field: 'origin' }, + // { title: 'ID', field: 'uuid' }, + actionsColumn, + ], + [actionsColumn], + ); + + if (error) { + return ; + } + + return ( + + isLoading={loading} + options={{ search: true, paging: true, pageSize }} + columns={columns} + data={value?.notifications || []} + onPageChange={setPageNumber} + onRowsPerPageChange={setPageSize} + page={pageNumber} + totalCount={value?.totalCount} + onSearchChange={debouncedContainsTextHandler} + onOrderChange={onOrderChange} + components={{ + Toolbar: props => ( + + ), + }} + /> + ); +}; diff --git a/plugins/notifications-frontend/src/components/NotificationsTable/NotificationsToolbar.tsx b/plugins/notifications-frontend/src/components/NotificationsTable/NotificationsToolbar.tsx new file mode 100644 index 0000000000..0f9614cf34 --- /dev/null +++ b/plugins/notifications-frontend/src/components/NotificationsTable/NotificationsToolbar.tsx @@ -0,0 +1,130 @@ +import React, { MutableRefObject } from 'react'; + +import { MTableToolbar } from '@material-table/core'; +import { + Grid, + makeStyles, + MenuItem, + Select, + withStyles, +} from '@material-ui/core'; +import FormGroup from '@mui/material/FormGroup'; + +const StyledMTableToolbar = withStyles( + _theme => ({ + root: { + alignItems: 'center', + }, + }), + { name: 'BackstageTableToolbar' }, +)(MTableToolbar); + +const useFilterStyles = makeStyles( + _theme => ({ + root: { + display: 'flex', + alignItems: 'center', + justifyContent: 'flex-end', + width: '100%', + }, + filter: { + fontSize: 18, + whiteSpace: 'nowrap', + }, + tool: { + marginLeft: '1rem', + }, + }), + { name: 'BackstageTableFiltersContainer' }, +); + +export const CreatedAfterOptions: { + [key: string]: { label: string; getDate: () => Date }; +} = { + last24h: { + label: 'Last 24h', + getDate: () => new Date(Date.now() - 24 * 3600 * 1000), + }, + lastWeek: { + label: 'Last week', + getDate: () => new Date(Date.now() - 7 * 24 * 3600 * 1000), + }, + all: { + label: 'Any time', + getDate: () => new Date(0), + }, +}; + +export const NotificationsToolbar = (toolbarProps: { + toolbarRef: MutableRefObject; + onSearchChanged: (value: string) => void; + createdAfter?: string; + unreadOnly: boolean; + onCreatedAfterChanged: (value: string) => void; + onUnreadOnlyChanged: (checked?: boolean) => void; +}) => { + const { toolbarRef, createdAfter, unreadOnly } = toolbarProps; + const filtersClasses = useFilterStyles(); + + const handleOnCreatedAfterChanged = ( + event: React.ChangeEvent<{ name?: string; value: unknown }>, + ) => { + toolbarProps.onCreatedAfterChanged(event.target.value as string); + }; + + const handleOnUnreadOnlyChanged = ( + event: React.ChangeEvent<{ name?: string; value: unknown }>, + ) => { + let value = undefined; + if (event.target.value === 'unread') value = true; + if (event.target.value === 'read') value = false; + toolbarProps.onUnreadOnlyChanged(value); + }; + + let unreadOnlyValue = 'all'; + if (unreadOnly) unreadOnlyValue = 'unread'; + if (unreadOnly === false) unreadOnlyValue = 'read'; + + return ( + + + + + + + + + + + + + + + + ); +}; diff --git a/plugins/notifications-frontend/src/components/NotificationsTable/index.ts b/plugins/notifications-frontend/src/components/NotificationsTable/index.ts new file mode 100644 index 0000000000..34b9b4a961 --- /dev/null +++ b/plugins/notifications-frontend/src/components/NotificationsTable/index.ts @@ -0,0 +1 @@ +export * from './NotificationsTable'; diff --git a/plugins/notifications-frontend/src/components/PersonalNotifications/PersonalNotifications.tsx b/plugins/notifications-frontend/src/components/PersonalNotifications/PersonalNotifications.tsx new file mode 100644 index 0000000000..7c816e8f9f --- /dev/null +++ b/plugins/notifications-frontend/src/components/PersonalNotifications/PersonalNotifications.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +import { NotificationsTable } from '../NotificationsTable'; + +export const PersonalNotifications = () => ( + +); diff --git a/plugins/notifications-frontend/src/components/PersonalNotifications/index.ts b/plugins/notifications-frontend/src/components/PersonalNotifications/index.ts new file mode 100644 index 0000000000..9269810652 --- /dev/null +++ b/plugins/notifications-frontend/src/components/PersonalNotifications/index.ts @@ -0,0 +1 @@ +export * from './PersonalNotifications'; diff --git a/plugins/notifications-frontend/src/components/SendNotification/SendNotification.tsx b/plugins/notifications-frontend/src/components/SendNotification/SendNotification.tsx new file mode 100644 index 0000000000..a851c79c30 --- /dev/null +++ b/plugins/notifications-frontend/src/components/SendNotification/SendNotification.tsx @@ -0,0 +1,192 @@ +import React from 'react'; + +import { configApiRef, useApi } from '@backstage/core-plugin-api'; + +import { makeStyles } from '@material-ui/core'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; + +import { notificationsApiRef, NotificationsCreateRequest } from '../../api'; + +const useStyles = makeStyles({ + container: { + width: '60%', + minWidth: '30rem', + }, +}); + +export const SendNotification = () => { + const notificationsApi = useApi(notificationsApiRef); + const configApi = useApi(configApiRef); + const styles = useStyles(); + + const [notificationId, setNotificationId] = React.useState(); + const [error, setError] = React.useState(); + + const [origin, setOrigin] = React.useState('my-origin'); + const [title, setTitle] = React.useState('my-title'); + const [message, setMessage] = React.useState(); + const [topic, setTopic] = React.useState(); + const [targetUsers, setTargetUsers] = React.useState(); + const [targetGroups, setTargetGroups] = React.useState(); + const [actions, setActions] = React.useState(); + + const handleSubmit = async () => { + try { + const parsedActions = actions ? JSON.parse(actions) : undefined; + + const notification: NotificationsCreateRequest = { + origin, + title, + message, + actions: parsedActions, + topic, + targetUsers, + targetGroups, + }; + + const id = await notificationsApi.createNotification(notification); + setNotificationId(id); + } catch (_e) { + const e = _e as Error; + setError(e.message); + } + }; + + const getCurl = () => { + const data: NotificationsCreateRequest = { + title, + origin, + }; + + try { + if (message) { + data.message = message; + } + if (topic) { + data.topic = topic; + } + if (actions) { + data.actions = JSON.parse(actions); + } + if (targetUsers && targetUsers.length > 0) { + data.targetUsers = targetUsers; + } + if (targetGroups && targetGroups.length > 0) { + data.targetGroups = targetGroups; + } + + return `curl -X POST ${configApi.getString( + 'backend.baseUrl', + )}/api/notifications/notifications -H "Content-Type: application/json" -d '${JSON.stringify( + data, + )}'`; + } catch { + return 'Incorrect input'; + } + }; + + return ( + <> + + {error && {error}} + + {notificationId && ( + + A notification has been created with id: ${notificationId} + + )} + +
+ + setTitle(e.target.value)} + value={title} + /> + + setMessage(e.target.value)} + value={message} + /> + + setOrigin(e.target.value)} + value={origin} + /> + + setTopic(e.target.value)} + value={topic} + /> + + + setTargetUsers( + e.target.value + ?.split(',') + .map(v => v.trim()) + .filter(Boolean), + ) + } + value={targetUsers?.join(',')} + helperText="Comma separated list. Example: jdoe,anotherUser" + /> + + + setTargetGroups( + e.target.value + ?.split(',') + .map(v => v.trim()) + .filter(Boolean), + ) + } + value={targetGroups?.join(',')} + helperText={ + <> + Comma separated list. Example: groupA,groupB +
+ If both targetUsers and targetGroups are empty, the + notification is system-wide (means: Updates) + + } + /> + + setActions(e.target.value)} + value={actions} + helperText='A JSON array of items with title and URL. Example: [ {"title": "My action", "url": "http://foo.bar"} ]' + /> +
+ + +
+
+ <> + Example cURL + {getCurl()} + + + ); +}; diff --git a/plugins/notifications-frontend/src/components/SendNotification/index.ts b/plugins/notifications-frontend/src/components/SendNotification/index.ts new file mode 100644 index 0000000000..9293edf773 --- /dev/null +++ b/plugins/notifications-frontend/src/components/SendNotification/index.ts @@ -0,0 +1 @@ +export * from './SendNotification'; diff --git a/plugins/notifications-frontend/src/components/SystemNotifications/SystemNotifications.tsx b/plugins/notifications-frontend/src/components/SystemNotifications/SystemNotifications.tsx new file mode 100644 index 0000000000..972940fb25 --- /dev/null +++ b/plugins/notifications-frontend/src/components/SystemNotifications/SystemNotifications.tsx @@ -0,0 +1,7 @@ +import React from 'react'; + +import { NotificationsTable } from '../NotificationsTable'; + +export const SystemNotifications = () => ( + +); diff --git a/plugins/notifications-frontend/src/components/SystemNotifications/index.ts b/plugins/notifications-frontend/src/components/SystemNotifications/index.ts new file mode 100644 index 0000000000..1b33e49f2e --- /dev/null +++ b/plugins/notifications-frontend/src/components/SystemNotifications/index.ts @@ -0,0 +1 @@ +export * from './SystemNotifications'; diff --git a/plugins/notifications-frontend/src/components/usePollingEffect.ts b/plugins/notifications-frontend/src/components/usePollingEffect.ts new file mode 100644 index 0000000000..1f2440c69b --- /dev/null +++ b/plugins/notifications-frontend/src/components/usePollingEffect.ts @@ -0,0 +1,46 @@ +import { useEffect, useRef } from 'react'; + +const noop = () => {}; + +export const usePollingEffect = ( + asyncCallback: () => Promise, + dependencies = [], + interval = 0, + onCleanUp = noop, +) => { + const timeoutIdRef = useRef(null); + + useEffect(() => { + if (!interval || interval < 0) { + return noop; + } + + let isStopped = false; + + (async function pollingCallback() { + try { + if (!isStopped) { + await asyncCallback(); + } + } finally { + // Set timeout after it finished, unless stopped + timeoutIdRef.current = + !isStopped && setTimeout(pollingCallback, interval); + } + })(); + + return () => { + isStopped = true; + if (!!timeoutIdRef.current) { + clearTimeout(timeoutIdRef.current); + } + onCleanUp(); + }; + }, [ + asyncCallback, + interval, + onCleanUp, + // eslint-disable-next-line react-hooks/exhaustive-deps + ...dependencies, + ]); +}; diff --git a/plugins/notifications-frontend/src/constants.ts b/plugins/notifications-frontend/src/constants.ts new file mode 100644 index 0000000000..fe0c79a340 --- /dev/null +++ b/plugins/notifications-frontend/src/constants.ts @@ -0,0 +1,3 @@ +export const NOTIFICATIONS_ROUTE = 'notifications'; + +export const DebounceDelayMs = 1000; diff --git a/plugins/notifications-frontend/src/index.ts b/plugins/notifications-frontend/src/index.ts new file mode 100644 index 0000000000..b6df883e3b --- /dev/null +++ b/plugins/notifications-frontend/src/index.ts @@ -0,0 +1,19 @@ +export { notificationsPlugin, NotificationsPage } from './plugin'; + +// API Reference +export { + notificationsApiRef, + type NotificationsApi, + type NotificationsCreateRequest, + type NotificationsQuery, + type NotificationsCountQuery, +} from './api'; + +export { type Notification } from './openapi'; + +// selected constants for export +export { NOTIFICATIONS_ROUTE } from './constants'; + +// selected components for export +export { NotificationsSidebarItem } from './components/NotificationsSidebarItem'; +export { usePollingEffect } from './components/usePollingEffect'; diff --git a/plugins/notifications-frontend/src/openapi/.openapi-generator-ignore b/plugins/notifications-frontend/src/openapi/.openapi-generator-ignore new file mode 100644 index 0000000000..7484ee590a --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/plugins/notifications-frontend/src/openapi/.openapi-generator/FILES b/plugins/notifications-frontend/src/openapi/.openapi-generator/FILES new file mode 100644 index 0000000000..d0367843c0 --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/.openapi-generator/FILES @@ -0,0 +1,11 @@ +apis/NotificationsApi.ts +apis/index.ts +index.ts +models/Action.ts +models/CreateBody.ts +models/CreateBodyActionsInner.ts +models/CreateNotification200Response.ts +models/GetNotificationsCount200Response.ts +models/Notification.ts +models/index.ts +runtime.ts diff --git a/plugins/notifications-frontend/src/openapi/.openapi-generator/VERSION b/plugins/notifications-frontend/src/openapi/.openapi-generator/VERSION new file mode 100644 index 0000000000..3769235d3e --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.1.0 \ No newline at end of file diff --git a/plugins/notifications-frontend/src/openapi/README.md b/plugins/notifications-frontend/src/openapi/README.md new file mode 100644 index 0000000000..f97dfb852a --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/README.md @@ -0,0 +1,8 @@ +The content of this folder is generated, do not update it manually. + +Generated by: + +``` +cd plugins/notifications-frontend +yarn openapi:generate +``` diff --git a/plugins/notifications-frontend/src/openapi/apis/NotificationsApi.ts b/plugins/notifications-frontend/src/openapi/apis/NotificationsApi.ts new file mode 100644 index 0000000000..711e65cc8c --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/apis/NotificationsApi.ts @@ -0,0 +1,351 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +/** + * Notifications Plugin - OpenAPI Specs + * Notifications Plugin - OpenAPI Specs + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import type { + CreateBody, + CreateNotification200Response, + GetNotificationsCount200Response, + Notification, +} from '../models/index'; +import { + CreateBodyFromJSON, + CreateBodyToJSON, + CreateNotification200ResponseFromJSON, + CreateNotification200ResponseToJSON, + GetNotificationsCount200ResponseFromJSON, + GetNotificationsCount200ResponseToJSON, + NotificationFromJSON, + NotificationToJSON, +} from '../models/index'; +import * as runtime from '../runtime'; + +export interface CreateNotificationRequest { + createBody?: CreateBody; +} + +export interface GetNotificationsRequest { + pageSize?: number; + pageNumber?: number; + orderBy?: GetNotificationsOrderByEnum; + orderByDirec?: GetNotificationsOrderByDirecEnum; + containsText?: string; + createdAfter?: Date; + messageScope?: GetNotificationsMessageScopeEnum; + read?: boolean; +} + +export interface GetNotificationsCountRequest { + containsText?: string; + createdAfter?: Date; + messageScope?: GetNotificationsCountMessageScopeEnum; + read?: boolean; +} + +export interface SetReadRequest { + messageId: string; + read: boolean; +} + +/** + * + */ +export class NotificationsApi extends runtime.BaseAPI { + /** + * Create notification + * Create notification + */ + async createNotificationRaw( + requestParameters: CreateNotificationRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + headerParameters['Content-Type'] = 'application/json'; + + const response = await this.request( + { + path: `/notifications`, + method: 'POST', + headers: headerParameters, + query: queryParameters, + body: CreateBodyToJSON(requestParameters.createBody), + }, + initOverrides, + ); + + return new runtime.JSONApiResponse(response, jsonValue => + CreateNotification200ResponseFromJSON(jsonValue), + ); + } + + /** + * Create notification + * Create notification + */ + async createNotification( + requestParameters: CreateNotificationRequest = {}, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise { + const response = await this.createNotificationRaw( + requestParameters, + initOverrides, + ); + return await response.value(); + } + + /** + * Gets notifications + * Gets notifications + */ + async getNotificationsRaw( + requestParameters: GetNotificationsRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise>> { + const queryParameters: any = {}; + + if (requestParameters.pageSize !== undefined) { + queryParameters['pageSize'] = requestParameters.pageSize; + } + + if (requestParameters.pageNumber !== undefined) { + queryParameters['pageNumber'] = requestParameters.pageNumber; + } + + if (requestParameters.orderBy !== undefined) { + queryParameters['orderBy'] = requestParameters.orderBy; + } + + if (requestParameters.orderByDirec !== undefined) { + queryParameters['orderByDirec'] = requestParameters.orderByDirec; + } + + if (requestParameters.containsText !== undefined) { + queryParameters['containsText'] = requestParameters.containsText; + } + + if (requestParameters.createdAfter !== undefined) { + queryParameters['createdAfter'] = ( + requestParameters.createdAfter as any + ).toISOString(); + } + + if (requestParameters.messageScope !== undefined) { + queryParameters['messageScope'] = requestParameters.messageScope; + } + + if (requestParameters.read !== undefined) { + queryParameters['read'] = requestParameters.read; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request( + { + path: `/notifications`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, + initOverrides, + ); + + return new runtime.JSONApiResponse(response, jsonValue => + jsonValue.map(NotificationFromJSON), + ); + } + + /** + * Gets notifications + * Gets notifications + */ + async getNotifications( + requestParameters: GetNotificationsRequest = {}, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + const response = await this.getNotificationsRaw( + requestParameters, + initOverrides, + ); + return await response.value(); + } + + /** + * Gets notifications count + * Get notifications count + */ + async getNotificationsCountRaw( + requestParameters: GetNotificationsCountRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + const queryParameters: any = {}; + + if (requestParameters.containsText !== undefined) { + queryParameters['containsText'] = requestParameters.containsText; + } + + if (requestParameters.createdAfter !== undefined) { + queryParameters['createdAfter'] = ( + requestParameters.createdAfter as any + ).toISOString(); + } + + if (requestParameters.messageScope !== undefined) { + queryParameters['messageScope'] = requestParameters.messageScope; + } + + if (requestParameters.read !== undefined) { + queryParameters['read'] = requestParameters.read; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request( + { + path: `/notifications/count`, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, + initOverrides, + ); + + return new runtime.JSONApiResponse(response, jsonValue => + GetNotificationsCount200ResponseFromJSON(jsonValue), + ); + } + + /** + * Gets notifications count + * Get notifications count + */ + async getNotificationsCount( + requestParameters: GetNotificationsCountRequest = {}, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise { + const response = await this.getNotificationsCountRaw( + requestParameters, + initOverrides, + ); + return await response.value(); + } + + /** + * Set notification as read/unread + * Set notification as read/unread + */ + async setReadRaw( + requestParameters: SetReadRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise> { + if ( + requestParameters.messageId === null || + requestParameters.messageId === undefined + ) { + throw new runtime.RequiredError( + 'messageId', + 'Required parameter requestParameters.messageId was null or undefined when calling setRead.', + ); + } + + if ( + requestParameters.read === null || + requestParameters.read === undefined + ) { + throw new runtime.RequiredError( + 'read', + 'Required parameter requestParameters.read was null or undefined when calling setRead.', + ); + } + + const queryParameters: any = {}; + + if (requestParameters.messageId !== undefined) { + queryParameters['messageId'] = requestParameters.messageId; + } + + if (requestParameters.read !== undefined) { + queryParameters['read'] = requestParameters.read; + } + + const headerParameters: runtime.HTTPHeaders = {}; + + const response = await this.request( + { + path: `/notifications/read`, + method: 'PUT', + headers: headerParameters, + query: queryParameters, + }, + initOverrides, + ); + + return new runtime.VoidApiResponse(response); + } + + /** + * Set notification as read/unread + * Set notification as read/unread + */ + async setRead( + requestParameters: SetReadRequest, + initOverrides?: RequestInit | runtime.InitOverrideFunction, + ): Promise { + await this.setReadRaw(requestParameters, initOverrides); + } +} + +/** + * @export + */ +export const GetNotificationsOrderByEnum = { + Title: 'title', + Message: 'message', + Created: 'created', + Topic: 'topic', + Origin: 'origin', +} as const; +export type GetNotificationsOrderByEnum = + (typeof GetNotificationsOrderByEnum)[keyof typeof GetNotificationsOrderByEnum]; +/** + * @export + */ +export const GetNotificationsOrderByDirecEnum = { + Asc: 'asc', + Desc: 'desc', +} as const; +export type GetNotificationsOrderByDirecEnum = + (typeof GetNotificationsOrderByDirecEnum)[keyof typeof GetNotificationsOrderByDirecEnum]; +/** + * @export + */ +export const GetNotificationsMessageScopeEnum = { + All: 'all', + User: 'user', + System: 'system', +} as const; +export type GetNotificationsMessageScopeEnum = + (typeof GetNotificationsMessageScopeEnum)[keyof typeof GetNotificationsMessageScopeEnum]; +/** + * @export + */ +export const GetNotificationsCountMessageScopeEnum = { + All: 'all', + User: 'user', + System: 'system', +} as const; +export type GetNotificationsCountMessageScopeEnum = + (typeof GetNotificationsCountMessageScopeEnum)[keyof typeof GetNotificationsCountMessageScopeEnum]; diff --git a/plugins/notifications-frontend/src/openapi/apis/index.ts b/plugins/notifications-frontend/src/openapi/apis/index.ts new file mode 100644 index 0000000000..d201cd0f61 --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/apis/index.ts @@ -0,0 +1,4 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +export * from './NotificationsApi'; diff --git a/plugins/notifications-frontend/src/openapi/index.ts b/plugins/notifications-frontend/src/openapi/index.ts new file mode 100644 index 0000000000..af50c5b678 --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/index.ts @@ -0,0 +1,6 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +export * from './runtime'; +export * from './apis/index'; +export * from './models/index'; diff --git a/plugins/notifications-frontend/src/openapi/models/Action.ts b/plugins/notifications-frontend/src/openapi/models/Action.ts new file mode 100644 index 0000000000..1b391706d3 --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/models/Action.ts @@ -0,0 +1,86 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +/** + * Notifications Plugin - OpenAPI Specs + * Notifications Plugin - OpenAPI Specs + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; + +/** + * + * @export + * @interface Action + */ +export interface Action { + /** + * + * @type {string} + * @memberof Action + */ + id: string; + /** + * + * @type {string} + * @memberof Action + */ + title: string; + /** + * + * @type {string} + * @memberof Action + */ + url: string; +} + +/** + * Check if a given object implements the Action interface. + */ +export function instanceOfAction(value: object): boolean { + let isInstance = true; + isInstance = isInstance && 'id' in value; + isInstance = isInstance && 'title' in value; + isInstance = isInstance && 'url' in value; + + return isInstance; +} + +export function ActionFromJSON(json: any): Action { + return ActionFromJSONTyped(json, false); +} + +export function ActionFromJSONTyped( + json: any, + ignoreDiscriminator: boolean, +): Action { + if (json === undefined || json === null) { + return json; + } + return { + id: json['id'], + title: json['title'], + url: json['url'], + }; +} + +export function ActionToJSON(value?: Action | null): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + id: value.id, + title: value.title, + url: value.url, + }; +} diff --git a/plugins/notifications-frontend/src/openapi/models/CreateBody.ts b/plugins/notifications-frontend/src/openapi/models/CreateBody.ts new file mode 100644 index 0000000000..803479986c --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/models/CreateBody.ts @@ -0,0 +1,130 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +/** + * Notifications Plugin - OpenAPI Specs + * Notifications Plugin - OpenAPI Specs + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; +import type { CreateBodyActionsInner } from './CreateBodyActionsInner'; +import { + CreateBodyActionsInnerFromJSON, + CreateBodyActionsInnerFromJSONTyped, + CreateBodyActionsInnerToJSON, +} from './CreateBodyActionsInner'; + +/** + * + * @export + * @interface CreateBody + */ +export interface CreateBody { + /** + * + * @type {string} + * @memberof CreateBody + */ + origin: string; + /** + * + * @type {string} + * @memberof CreateBody + */ + title: string; + /** + * + * @type {string} + * @memberof CreateBody + */ + message?: string; + /** + * + * @type {Array} + * @memberof CreateBody + */ + actions?: Array; + /** + * + * @type {string} + * @memberof CreateBody + */ + topic?: string; + /** + * + * @type {Array} + * @memberof CreateBody + */ + targetUsers?: Array; + /** + * + * @type {Array} + * @memberof CreateBody + */ + targetGroups?: Array; +} + +/** + * Check if a given object implements the CreateBody interface. + */ +export function instanceOfCreateBody(value: object): boolean { + let isInstance = true; + isInstance = isInstance && 'origin' in value; + isInstance = isInstance && 'title' in value; + + return isInstance; +} + +export function CreateBodyFromJSON(json: any): CreateBody { + return CreateBodyFromJSONTyped(json, false); +} + +export function CreateBodyFromJSONTyped( + json: any, + ignoreDiscriminator: boolean, +): CreateBody { + if (json === undefined || json === null) { + return json; + } + return { + origin: json['origin'], + title: json['title'], + message: !exists(json, 'message') ? undefined : json['message'], + actions: !exists(json, 'actions') + ? undefined + : (json['actions'] as Array).map(CreateBodyActionsInnerFromJSON), + topic: !exists(json, 'topic') ? undefined : json['topic'], + targetUsers: !exists(json, 'targetUsers') ? undefined : json['targetUsers'], + targetGroups: !exists(json, 'targetGroups') + ? undefined + : json['targetGroups'], + }; +} + +export function CreateBodyToJSON(value?: CreateBody | null): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + origin: value.origin, + title: value.title, + message: value.message, + actions: + value.actions === undefined + ? undefined + : (value.actions as Array).map(CreateBodyActionsInnerToJSON), + topic: value.topic, + targetUsers: value.targetUsers, + targetGroups: value.targetGroups, + }; +} diff --git a/plugins/notifications-frontend/src/openapi/models/CreateBodyActionsInner.ts b/plugins/notifications-frontend/src/openapi/models/CreateBodyActionsInner.ts new file mode 100644 index 0000000000..4bf3a3da3e --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/models/CreateBodyActionsInner.ts @@ -0,0 +1,81 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +/** + * Notifications Plugin - OpenAPI Specs + * Notifications Plugin - OpenAPI Specs + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; + +/** + * + * @export + * @interface CreateBodyActionsInner + */ +export interface CreateBodyActionsInner { + /** + * + * @type {string} + * @memberof CreateBodyActionsInner + */ + title: string; + /** + * + * @type {string} + * @memberof CreateBodyActionsInner + */ + url: string; +} + +/** + * Check if a given object implements the CreateBodyActionsInner interface. + */ +export function instanceOfCreateBodyActionsInner(value: object): boolean { + let isInstance = true; + isInstance = isInstance && 'title' in value; + isInstance = isInstance && 'url' in value; + + return isInstance; +} + +export function CreateBodyActionsInnerFromJSON( + json: any, +): CreateBodyActionsInner { + return CreateBodyActionsInnerFromJSONTyped(json, false); +} + +export function CreateBodyActionsInnerFromJSONTyped( + json: any, + ignoreDiscriminator: boolean, +): CreateBodyActionsInner { + if (json === undefined || json === null) { + return json; + } + return { + title: json['title'], + url: json['url'], + }; +} + +export function CreateBodyActionsInnerToJSON( + value?: CreateBodyActionsInner | null, +): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + title: value.title, + url: value.url, + }; +} diff --git a/plugins/notifications-frontend/src/openapi/models/CreateNotification200Response.ts b/plugins/notifications-frontend/src/openapi/models/CreateNotification200Response.ts new file mode 100644 index 0000000000..856942f98f --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/models/CreateNotification200Response.ts @@ -0,0 +1,74 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +/** + * Notifications Plugin - OpenAPI Specs + * Notifications Plugin - OpenAPI Specs + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; + +/** + * + * @export + * @interface CreateNotification200Response + */ +export interface CreateNotification200Response { + /** + * + * @type {string} + * @memberof CreateNotification200Response + */ + messageId: string; +} + +/** + * Check if a given object implements the CreateNotification200Response interface. + */ +export function instanceOfCreateNotification200Response( + value: object, +): boolean { + let isInstance = true; + isInstance = isInstance && 'messageId' in value; + + return isInstance; +} + +export function CreateNotification200ResponseFromJSON( + json: any, +): CreateNotification200Response { + return CreateNotification200ResponseFromJSONTyped(json, false); +} + +export function CreateNotification200ResponseFromJSONTyped( + json: any, + ignoreDiscriminator: boolean, +): CreateNotification200Response { + if (json === undefined || json === null) { + return json; + } + return { + messageId: json['messageId'], + }; +} + +export function CreateNotification200ResponseToJSON( + value?: CreateNotification200Response | null, +): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + messageId: value.messageId, + }; +} diff --git a/plugins/notifications-frontend/src/openapi/models/GetNotificationsCount200Response.ts b/plugins/notifications-frontend/src/openapi/models/GetNotificationsCount200Response.ts new file mode 100644 index 0000000000..464bd8f627 --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/models/GetNotificationsCount200Response.ts @@ -0,0 +1,74 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +/** + * Notifications Plugin - OpenAPI Specs + * Notifications Plugin - OpenAPI Specs + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; + +/** + * + * @export + * @interface GetNotificationsCount200Response + */ +export interface GetNotificationsCount200Response { + /** + * + * @type {number} + * @memberof GetNotificationsCount200Response + */ + count: number; +} + +/** + * Check if a given object implements the GetNotificationsCount200Response interface. + */ +export function instanceOfGetNotificationsCount200Response( + value: object, +): boolean { + let isInstance = true; + isInstance = isInstance && 'count' in value; + + return isInstance; +} + +export function GetNotificationsCount200ResponseFromJSON( + json: any, +): GetNotificationsCount200Response { + return GetNotificationsCount200ResponseFromJSONTyped(json, false); +} + +export function GetNotificationsCount200ResponseFromJSONTyped( + json: any, + ignoreDiscriminator: boolean, +): GetNotificationsCount200Response { + if (json === undefined || json === null) { + return json; + } + return { + count: json['count'], + }; +} + +export function GetNotificationsCount200ResponseToJSON( + value?: GetNotificationsCount200Response | null, +): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + count: value.count, + }; +} diff --git a/plugins/notifications-frontend/src/openapi/models/Notification.ts b/plugins/notifications-frontend/src/openapi/models/Notification.ts new file mode 100644 index 0000000000..b3cf5e5c05 --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/models/Notification.ts @@ -0,0 +1,140 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +/** + * Notifications Plugin - OpenAPI Specs + * Notifications Plugin - OpenAPI Specs + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { exists, mapValues } from '../runtime'; +import type { Action } from './Action'; +import { ActionFromJSON, ActionFromJSONTyped, ActionToJSON } from './Action'; + +/** + * + * @export + * @interface Notification + */ +export interface Notification { + /** + * + * @type {string} + * @memberof Notification + */ + id: string; + /** + * + * @type {Date} + * @memberof Notification + */ + created: Date; + /** + * + * @type {boolean} + * @memberof Notification + */ + readByUser: boolean; + /** + * + * @type {boolean} + * @memberof Notification + */ + isSystem: boolean; + /** + * + * @type {string} + * @memberof Notification + */ + origin: string; + /** + * + * @type {string} + * @memberof Notification + */ + title: string; + /** + * + * @type {string} + * @memberof Notification + */ + message?: string; + /** + * + * @type {string} + * @memberof Notification + */ + topic?: string; + /** + * + * @type {Array} + * @memberof Notification + */ + actions: Array; +} + +/** + * Check if a given object implements the Notification interface. + */ +export function instanceOfNotification(value: object): boolean { + let isInstance = true; + isInstance = isInstance && 'id' in value; + isInstance = isInstance && 'created' in value; + isInstance = isInstance && 'readByUser' in value; + isInstance = isInstance && 'isSystem' in value; + isInstance = isInstance && 'origin' in value; + isInstance = isInstance && 'title' in value; + isInstance = isInstance && 'actions' in value; + + return isInstance; +} + +export function NotificationFromJSON(json: any): Notification { + return NotificationFromJSONTyped(json, false); +} + +export function NotificationFromJSONTyped( + json: any, + ignoreDiscriminator: boolean, +): Notification { + if (json === undefined || json === null) { + return json; + } + return { + id: json['id'], + created: new Date(json['created']), + readByUser: json['readByUser'], + isSystem: json['isSystem'], + origin: json['origin'], + title: json['title'], + message: !exists(json, 'message') ? undefined : json['message'], + topic: !exists(json, 'topic') ? undefined : json['topic'], + actions: (json['actions'] as Array).map(ActionFromJSON), + }; +} + +export function NotificationToJSON(value?: Notification | null): any { + if (value === undefined) { + return undefined; + } + if (value === null) { + return null; + } + return { + id: value.id, + created: value.created.toISOString(), + readByUser: value.readByUser, + isSystem: value.isSystem, + origin: value.origin, + title: value.title, + message: value.message, + topic: value.topic, + actions: (value.actions as Array).map(ActionToJSON), + }; +} diff --git a/plugins/notifications-frontend/src/openapi/models/index.ts b/plugins/notifications-frontend/src/openapi/models/index.ts new file mode 100644 index 0000000000..5f553c5119 --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/models/index.ts @@ -0,0 +1,9 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +export * from './Action'; +export * from './CreateBody'; +export * from './CreateBodyActionsInner'; +export * from './CreateNotification200Response'; +export * from './GetNotificationsCount200Response'; +export * from './Notification'; diff --git a/plugins/notifications-frontend/src/openapi/runtime.ts b/plugins/notifications-frontend/src/openapi/runtime.ts new file mode 100644 index 0000000000..c03f16d4d7 --- /dev/null +++ b/plugins/notifications-frontend/src/openapi/runtime.ts @@ -0,0 +1,529 @@ +// @ts-nocheck +/* tslint:disable */ +/* eslint-disable */ +/** + * Notifications Plugin - OpenAPI Specs + * Notifications Plugin - OpenAPI Specs + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export const BASE_PATH = 'http://localhost:7007/api/notifications'; + +export interface ConfigurationParameters { + basePath?: string; // override base path + fetchApi?: FetchAPI; // override for fetch implementation + middleware?: Middleware[]; // middleware to apply before/after fetch requests + queryParamsStringify?: (params: HTTPQuery) => string; // stringify function for query strings + username?: string; // parameter for basic security + password?: string; // parameter for basic security + apiKey?: string | ((name: string) => string); // parameter for apiKey security + accessToken?: + | string + | Promise + | ((name?: string, scopes?: string[]) => string | Promise); // parameter for oauth2 security + headers?: HTTPHeaders; //header params we want to use on every request + credentials?: RequestCredentials; //value for the credentials param we want to use on each request +} + +export class Configuration { + constructor(private configuration: ConfigurationParameters = {}) {} + + set config(configuration: Configuration) { + this.configuration = configuration; + } + + get basePath(): string { + return this.configuration.basePath != null + ? this.configuration.basePath + : BASE_PATH; + } + + get fetchApi(): FetchAPI | undefined { + return this.configuration.fetchApi; + } + + get middleware(): Middleware[] { + return this.configuration.middleware || []; + } + + get queryParamsStringify(): (params: HTTPQuery) => string { + return this.configuration.queryParamsStringify || querystring; + } + + get username(): string | undefined { + return this.configuration.username; + } + + get password(): string | undefined { + return this.configuration.password; + } + + get apiKey(): ((name: string) => string) | undefined { + const apiKey = this.configuration.apiKey; + if (apiKey) { + return typeof apiKey === 'function' ? apiKey : () => apiKey; + } + return undefined; + } + + get accessToken(): + | ((name?: string, scopes?: string[]) => string | Promise) + | undefined { + const accessToken = this.configuration.accessToken; + if (accessToken) { + return typeof accessToken === 'function' + ? accessToken + : async () => accessToken; + } + return undefined; + } + + get headers(): HTTPHeaders | undefined { + return this.configuration.headers; + } + + get credentials(): RequestCredentials | undefined { + return this.configuration.credentials; + } +} + +export const DefaultConfig = new Configuration(); + +/** + * This is the base class for all generated API classes. + */ +export class BaseAPI { + private static readonly jsonRegex = new RegExp( + '^(:?application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(:?;.*)?$', + 'i', + ); + private middleware: Middleware[]; + + constructor(protected configuration = DefaultConfig) { + this.middleware = configuration.middleware; + } + + withMiddleware(this: T, ...middlewares: Middleware[]) { + const next = this.clone(); + next.middleware = next.middleware.concat(...middlewares); + return next; + } + + withPreMiddleware( + this: T, + ...preMiddlewares: Array + ) { + const middlewares = preMiddlewares.map(pre => ({ pre })); + return this.withMiddleware(...middlewares); + } + + withPostMiddleware( + this: T, + ...postMiddlewares: Array + ) { + const middlewares = postMiddlewares.map(post => ({ post })); + return this.withMiddleware(...middlewares); + } + + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + * application/vnd.company+json + * @param mime - MIME (Multipurpose Internet Mail Extensions) + * @return True if the given MIME is JSON, false otherwise. + */ + protected isJsonMime(mime: string | null | undefined): boolean { + if (!mime) { + return false; + } + return BaseAPI.jsonRegex.test(mime); + } + + protected async request( + context: RequestOpts, + initOverrides?: RequestInit | InitOverrideFunction, + ): Promise { + const { url, init } = await this.createFetchParams(context, initOverrides); + const response = await this.fetchApi(url, init); + if (response && response.status >= 200 && response.status < 300) { + return response; + } + throw new ResponseError(response, 'Response returned an error code'); + } + + private async createFetchParams( + context: RequestOpts, + initOverrides?: RequestInit | InitOverrideFunction, + ) { + let url = this.configuration.basePath + context.path; + if ( + context.query !== undefined && + Object.keys(context.query).length !== 0 + ) { + // only add the querystring to the URL if there are query parameters. + // this is done to avoid urls ending with a "?" character which buggy webservers + // do not handle correctly sometimes. + url += '?' + this.configuration.queryParamsStringify(context.query); + } + + const headers = Object.assign( + {}, + this.configuration.headers, + context.headers, + ); + Object.keys(headers).forEach(key => + headers[key] === undefined ? delete headers[key] : {}, + ); + + const initOverrideFn = + typeof initOverrides === 'function' + ? initOverrides + : async () => initOverrides; + + const initParams = { + method: context.method, + headers, + body: context.body, + credentials: this.configuration.credentials, + }; + + const overriddenInit: RequestInit = { + ...initParams, + ...(await initOverrideFn({ + init: initParams, + context, + })), + }; + + let body: any; + if ( + isFormData(overriddenInit.body) || + overriddenInit.body instanceof URLSearchParams || + isBlob(overriddenInit.body) + ) { + body = overriddenInit.body; + } else if (this.isJsonMime(headers['Content-Type'])) { + body = JSON.stringify(overriddenInit.body); + } else { + body = overriddenInit.body; + } + + const init: RequestInit = { + ...overriddenInit, + body, + }; + + return { url, init }; + } + + private fetchApi = async (url: string, init: RequestInit) => { + let fetchParams = { url, init }; + for (const middleware of this.middleware) { + if (middleware.pre) { + fetchParams = + (await middleware.pre({ + fetch: this.fetchApi, + ...fetchParams, + })) || fetchParams; + } + } + let response: Response | undefined = undefined; + try { + response = await (this.configuration.fetchApi || fetch)( + fetchParams.url, + fetchParams.init, + ); + } catch (e) { + for (const middleware of this.middleware) { + if (middleware.onError) { + response = + (await middleware.onError({ + fetch: this.fetchApi, + url: fetchParams.url, + init: fetchParams.init, + error: e, + response: response ? response.clone() : undefined, + })) || response; + } + } + if (response === undefined) { + if (e instanceof Error) { + throw new FetchError( + e, + 'The request failed and the interceptors did not return an alternative response', + ); + } else { + throw e; + } + } + } + for (const middleware of this.middleware) { + if (middleware.post) { + response = + (await middleware.post({ + fetch: this.fetchApi, + url: fetchParams.url, + init: fetchParams.init, + response: response.clone(), + })) || response; + } + } + return response; + }; + + /** + * Create a shallow clone of `this` by constructing a new instance + * and then shallow cloning data members. + */ + private clone(this: T): T { + const constructor = this.constructor as any; + const next = new constructor(this.configuration); + next.middleware = this.middleware.slice(); + return next; + } +} + +function isBlob(value: any): value is Blob { + return typeof Blob !== 'undefined' && value instanceof Blob; +} + +function isFormData(value: any): value is FormData { + return typeof FormData !== 'undefined' && value instanceof FormData; +} + +export class ResponseError extends Error { + override name: 'ResponseError' = 'ResponseError'; + constructor( + public response: Response, + msg?: string, + ) { + super(msg); + } +} + +export class FetchError extends Error { + override name: 'FetchError' = 'FetchError'; + constructor( + public cause: Error, + msg?: string, + ) { + super(msg); + } +} + +export class RequiredError extends Error { + override name: 'RequiredError' = 'RequiredError'; + constructor( + public field: string, + msg?: string, + ) { + super(msg); + } +} + +export const COLLECTION_FORMATS = { + csv: ',', + ssv: ' ', + tsv: '\t', + pipes: '|', +}; + +export type FetchAPI = WindowOrWorkerGlobalScope['fetch']; + +export type Json = any; +export type HTTPMethod = + | 'GET' + | 'POST' + | 'PUT' + | 'PATCH' + | 'DELETE' + | 'OPTIONS' + | 'HEAD'; +export type HTTPHeaders = { [key: string]: string }; +export type HTTPQuery = { + [key: string]: + | string + | number + | null + | boolean + | Array + | Set + | HTTPQuery; +}; +export type HTTPBody = Json | FormData | URLSearchParams; +export type HTTPRequestInit = { + headers?: HTTPHeaders; + method: HTTPMethod; + credentials?: RequestCredentials; + body?: HTTPBody; +}; +export type ModelPropertyNaming = + | 'camelCase' + | 'snake_case' + | 'PascalCase' + | 'original'; + +export type InitOverrideFunction = (requestContext: { + init: HTTPRequestInit; + context: RequestOpts; +}) => Promise; + +export interface FetchParams { + url: string; + init: RequestInit; +} + +export interface RequestOpts { + path: string; + method: HTTPMethod; + headers: HTTPHeaders; + query?: HTTPQuery; + body?: HTTPBody; +} + +export function exists(json: any, key: string) { + const value = json[key]; + return value !== null && value !== undefined; +} + +export function querystring(params: HTTPQuery, prefix: string = ''): string { + return Object.keys(params) + .map(key => querystringSingleKey(key, params[key], prefix)) + .filter(part => part.length > 0) + .join('&'); +} + +function querystringSingleKey( + key: string, + value: + | string + | number + | null + | undefined + | boolean + | Array + | Set + | HTTPQuery, + keyPrefix: string = '', +): string { + const fullKey = keyPrefix + (keyPrefix.length ? `[${key}]` : key); + if (value instanceof Array) { + const multiValue = value + .map(singleValue => encodeURIComponent(String(singleValue))) + .join(`&${encodeURIComponent(fullKey)}=`); + return `${encodeURIComponent(fullKey)}=${multiValue}`; + } + if (value instanceof Set) { + const valueAsArray = Array.from(value); + return querystringSingleKey(key, valueAsArray, keyPrefix); + } + if (value instanceof Date) { + return `${encodeURIComponent(fullKey)}=${encodeURIComponent( + value.toISOString(), + )}`; + } + if (value instanceof Object) { + return querystring(value as HTTPQuery, fullKey); + } + return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`; +} + +export function mapValues(data: any, fn: (item: any) => any) { + return Object.keys(data).reduce( + (acc, key) => ({ ...acc, [key]: fn(data[key]) }), + {}, + ); +} + +export function canConsumeForm(consumes: Consume[]): boolean { + for (const consume of consumes) { + if ('multipart/form-data' === consume.contentType) { + return true; + } + } + return false; +} + +export interface Consume { + contentType: string; +} + +export interface RequestContext { + fetch: FetchAPI; + url: string; + init: RequestInit; +} + +export interface ResponseContext { + fetch: FetchAPI; + url: string; + init: RequestInit; + response: Response; +} + +export interface ErrorContext { + fetch: FetchAPI; + url: string; + init: RequestInit; + error: unknown; + response?: Response; +} + +export interface Middleware { + pre?(context: RequestContext): Promise; + post?(context: ResponseContext): Promise; + onError?(context: ErrorContext): Promise; +} + +export interface ApiResponse { + raw: Response; + value(): Promise; +} + +export interface ResponseTransformer { + (json: any): T; +} + +export class JSONApiResponse { + constructor( + public raw: Response, + private transformer: ResponseTransformer = (jsonValue: any) => jsonValue, + ) {} + + async value(): Promise { + return this.transformer(await this.raw.json()); + } +} + +export class VoidApiResponse { + constructor(public raw: Response) {} + + async value(): Promise { + return undefined; + } +} + +export class BlobApiResponse { + constructor(public raw: Response) {} + + async value(): Promise { + return await this.raw.blob(); + } +} + +export class TextApiResponse { + constructor(public raw: Response) {} + + async value(): Promise { + return await this.raw.text(); + } +} diff --git a/plugins/notifications-frontend/src/plugin.test.ts b/plugins/notifications-frontend/src/plugin.test.ts new file mode 100644 index 0000000000..63644a975b --- /dev/null +++ b/plugins/notifications-frontend/src/plugin.test.ts @@ -0,0 +1,7 @@ +import { notificationsPlugin } from './plugin'; + +describe('notifications', () => { + it('should export plugin', () => { + expect(notificationsPlugin).toBeDefined(); + }); +}); diff --git a/plugins/notifications-frontend/src/plugin.ts b/plugins/notifications-frontend/src/plugin.ts new file mode 100644 index 0000000000..d9fde98ed7 --- /dev/null +++ b/plugins/notifications-frontend/src/plugin.ts @@ -0,0 +1,37 @@ +import { + createApiFactory, + createPlugin, + createRoutableExtension, + fetchApiRef, + // identityApiRef, +} from '@backstage/core-plugin-api'; + +import { NotificationsApiImpl, notificationsApiRef } from './api'; +import { rootRouteRef } from './routes'; + +export const notificationsPlugin = createPlugin({ + id: 'notifications', + routes: { + root: rootRouteRef, + }, + apis: [ + createApiFactory({ + api: notificationsApiRef, + deps: { fetchApi: fetchApiRef }, + factory({ fetchApi }) { + return new NotificationsApiImpl({ + fetchApi, + }); + }, + }), + ], +}); + +export const NotificationsPage = notificationsPlugin.provide( + createRoutableExtension({ + name: 'NotificationsPage', + component: () => + import('./components/NotificationsPage').then(m => m.NotificationsPage), + mountPoint: rootRouteRef, + }), +); diff --git a/plugins/notifications-frontend/src/routes.ts b/plugins/notifications-frontend/src/routes.ts new file mode 100644 index 0000000000..d07f175254 --- /dev/null +++ b/plugins/notifications-frontend/src/routes.ts @@ -0,0 +1,7 @@ +import { createRouteRef } from '@backstage/core-plugin-api'; + +import { NOTIFICATIONS_ROUTE } from './constants'; + +export const rootRouteRef = createRouteRef({ + id: NOTIFICATIONS_ROUTE, +}); diff --git a/plugins/notifications-frontend/src/setupTests.ts b/plugins/notifications-frontend/src/setupTests.ts new file mode 100644 index 0000000000..7b0828bfa8 --- /dev/null +++ b/plugins/notifications-frontend/src/setupTests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/plugins/notifications-frontend/tsconfig.json b/plugins/notifications-frontend/tsconfig.json new file mode 100644 index 0000000000..1964526a24 --- /dev/null +++ b/plugins/notifications-frontend/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": ["src", "dev", "migrations"], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "../../dist-types/plugins/notifications-frontend", + "rootDir": "." + } +} diff --git a/plugins/notifications-frontend/turbo.json b/plugins/notifications-frontend/turbo.json new file mode 100644 index 0000000000..ff7afb3c84 --- /dev/null +++ b/plugins/notifications-frontend/turbo.json @@ -0,0 +1,9 @@ +{ + "extends": ["//"], + "pipeline": { + "tsc": { + "outputs": ["../../dist-types/plugins/notifications-frontend/**"], + "dependsOn": ["^tsc"] + } + } +} diff --git a/plugins/rbac-backend/src/database/casbin-adapter-factory.test.ts b/plugins/rbac-backend/src/database/casbin-adapter-factory.test.ts index dc3b8790ee..1d25869e05 100644 --- a/plugins/rbac-backend/src/database/casbin-adapter-factory.test.ts +++ b/plugins/rbac-backend/src/database/casbin-adapter-factory.test.ts @@ -49,7 +49,7 @@ describe('CasbinAdapterFactory', () => { let mockDatabaseManager: DatabaseService; beforeEach(() => { - const db = Knex.knex({ client: MockClient }); + const db = Knex.knex({ client: MockClient as unknown as undefined }); db.client = { config: { connection: { diff --git a/yarn.lock b/yarn.lock index a3a9aaf8e9..a09ca2e8e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,6 +20,30 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@anttiviljami/dtsgenerator@^3.19.1": + version "3.19.1" + resolved "https://registry.yarnpkg.com/@anttiviljami/dtsgenerator/-/dtsgenerator-3.19.1.tgz#0e84474a21fb3c2e5ebbe5c61a73e1229171954d" + integrity sha512-FlGAPqih3CFH9YsktVDtW26UEORjlIj8alH+MR7eNad6z9Cun7M9auRUWRcrdo1pq4ES8q6PmICrev/LyyKKKg== + dependencies: + commander "^11.1.0" + cross-fetch "^4.0.0" + debug "^4.3.4" + glob "^10.3.10" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.2" + js-yaml "^4.1.0" + tslib "^2.6.2" + typescript "^5.2.2" + +"@apidevtools/json-schema-ref-parser@9.0.6": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz#5d9000a3ac1fd25404da886da6b266adcd99cf1c" + integrity sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg== + dependencies: + "@jsdevtools/ono" "^7.1.3" + call-me-maybe "^1.0.1" + js-yaml "^3.13.1" + "@apidevtools/json-schema-ref-parser@9.0.9": version "9.0.9" resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#d720f9256e3609621280584f2b47ae165359268b" @@ -30,6 +54,28 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" +"@apidevtools/json-schema-ref-parser@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-10.1.0.tgz#bf54494039a56fa7f77fed17dc6f01dfde50f64c" + integrity sha512-3e+viyMuXdrcK8v5pvP+SDoAQ77FH6OyRmuK48SZKmdHJRFm87RsSs8qm6kP39a/pOPURByJw+OXzQIqcfmKtA== + dependencies: + "@jsdevtools/ono" "^7.1.3" + "@types/json-schema" "^7.0.11" + "@types/lodash.clonedeep" "^4.5.7" + js-yaml "^4.1.0" + lodash.clonedeep "^4.5.0" + +"@apidevtools/json-schema-ref-parser@^11.1.0": + version "11.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.1.0.tgz#0608ed1ba47c377c6732e7185f2ea06731b58fde" + integrity sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag== + dependencies: + "@jsdevtools/ono" "^7.1.3" + "@types/json-schema" "^7.0.13" + "@types/lodash.clonedeep" "^4.5.7" + js-yaml "^4.1.0" + lodash.clonedeep "^4.5.0" + "@apidevtools/json-schema-ref-parser@^9.0.6", "@apidevtools/json-schema-ref-parser@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz#8ff5386b365d4c9faa7c8b566ff16a46a577d9b8" @@ -40,6 +86,29 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" +"@apidevtools/openapi-schemas@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17" + integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ== + +"@apidevtools/swagger-methods@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267" + integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== + +"@apidevtools/swagger-parser@^10.1.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz#a987d71e5be61feb623203be0c96e5985b192ab6" + integrity sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw== + dependencies: + "@apidevtools/json-schema-ref-parser" "9.0.6" + "@apidevtools/openapi-schemas" "^2.1.0" + "@apidevtools/swagger-methods" "^3.0.2" + "@jsdevtools/ono" "^7.1.3" + ajv "^8.6.3" + ajv-draft-04 "^1.0.0" + call-me-maybe "^1.0.1" + "@asyncapi/avro-schema-parser@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@asyncapi/avro-schema-parser/-/avro-schema-parser-1.1.0.tgz#5d0491b53331f0748d8f6e8c33781c27cafe0f30" @@ -907,6 +976,26 @@ tslib "^2.2.0" uuid "^8.3.0" +"@azure/identity@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.0.0.tgz#87d4c7b745f0855b83993518f1c7782dfb258bba" + integrity sha512-gtPYxIL0kI39Dw4t3HvlbfhOdXqKD2MqDgynlklF0j728j51dcKgRo6FLX0QzpBw/1gGfLxjMXqq3nKOSQ2lmA== + dependencies: + "@azure/abort-controller" "^1.0.0" + "@azure/core-auth" "^1.5.0" + "@azure/core-client" "^1.4.0" + "@azure/core-rest-pipeline" "^1.1.0" + "@azure/core-tracing" "^1.0.0" + "@azure/core-util" "^1.0.0" + "@azure/logger" "^1.0.0" + "@azure/msal-browser" "^3.5.0" + "@azure/msal-node" "^2.5.1" + events "^3.0.0" + jws "^4.0.0" + open "^8.0.0" + stoppable "^1.1.0" + tslib "^2.2.0" + "@azure/logger@^1.0.0": version "1.0.4" resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.0.4.tgz#28bc6d0e5b3c38ef29296b32d35da4e483593fa1" @@ -921,11 +1010,23 @@ dependencies: "@azure/msal-common" "13.3.0" +"@azure/msal-browser@^3.5.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.7.0.tgz#8536b7378c23be7374bb00ba19ffd1cdacbc3732" + integrity sha512-ktDB/Gf7UDgYBJOnoIlh70lxIo4e1/D2UgHuayB4RntN1IlusfTtIVH3k8NpJMdl+38tfTXIaUoR+qlr5voZEg== + dependencies: + "@azure/msal-common" "14.6.0" + "@azure/msal-common@13.3.0", "@azure/msal-common@^13.1.0": version "13.3.0" resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-13.3.0.tgz#dfa39810e0fbce6e07ca85a2cf305da58d30b7c9" integrity sha512-/VFWTicjcJbrGp3yQP7A24xU95NiDMe23vxIU1U6qdRPFsprMDNUohMudclnd+WSHE4/McqkZs/nUU3sAKkVjg== +"@azure/msal-common@14.6.0": + version "14.6.0" + resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.6.0.tgz#3a565f94e810a67ecbaa2cd8250e658876af8329" + integrity sha512-AGusT/JvxdzJIYi5u0n97cmhd3pUT6UuI6rEkT5iDeT2FGcV0/EB8pk+dy6GLPpYg9vhDCuyoYrEZGd+2UeCCQ== + "@azure/msal-node@^1.17.3": version "1.18.3" resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-1.18.3.tgz#e265556d4db0340590eeab5341469fb6740251d0" @@ -935,6 +1036,15 @@ jsonwebtoken "^9.0.0" uuid "^8.3.0" +"@azure/msal-node@^2.5.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.6.1.tgz#097f2def63b70acb11a84ee74d6989ba2315f4af" + integrity sha512-wYwz83pWatTNWUCkTi3cAOXbchad5FnZz/pbZz7b8Z6FuEqohXcTtg6BLip9SmcjN6FlbwUdJIZYOof2v1Gnrg== + dependencies: + "@azure/msal-common" "14.6.0" + jsonwebtoken "^9.0.0" + uuid "^8.3.0" + "@azure/storage-blob@^12.5.0": version "12.16.0" resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.16.0.tgz#c41fb1e538d6f6e2a6756bfcc69382eededf4fa1" @@ -2764,6 +2874,42 @@ winston "^3.2.1" winston-transport "^4.5.0" +"@backstage/backend-app-api@^0.5.9": + version "0.5.9" + resolved "https://registry.yarnpkg.com/@backstage/backend-app-api/-/backend-app-api-0.5.9.tgz#904030e4c23781ed5848c11e736470aab731727a" + integrity sha512-VPwZO+CTJsNR+vRsif+TpW021D0BtrW+uavW2BO5Vcf4tdjaC7O4ZfjMTBE5xJt8lJpvciz09mjbUb1zrc6HIw== + dependencies: + "@backstage/backend-common" "^0.20.0" + "@backstage/backend-plugin-api" "^0.6.8" + "@backstage/backend-tasks" "^0.5.13" + "@backstage/cli-common" "^0.1.13" + "@backstage/cli-node" "^0.2.1" + "@backstage/config" "^1.1.1" + "@backstage/config-loader" "^1.6.0" + "@backstage/errors" "^1.2.3" + "@backstage/plugin-auth-node" "^0.4.2" + "@backstage/plugin-permission-node" "^0.7.19" + "@backstage/types" "^1.1.1" + "@manypkg/get-packages" "^1.1.3" + "@types/cors" "^2.8.6" + "@types/express" "^4.17.6" + compression "^1.7.4" + cors "^2.8.5" + express "^4.17.1" + express-promise-router "^4.1.0" + fs-extra "10.1.0" + helmet "^6.0.0" + lodash "^4.17.21" + logform "^2.3.2" + minimatch "^5.0.0" + minimist "^1.2.5" + morgan "^1.10.0" + node-forge "^1.3.1" + selfsigned "^2.0.0" + stoppable "^1.1.0" + winston "^3.2.1" + winston-transport "^4.5.0" + "@backstage/backend-common@0.19.8", "@backstage/backend-common@^0.19.4", "@backstage/backend-common@^0.19.8": version "0.19.8" resolved "https://registry.yarnpkg.com/@backstage/backend-common/-/backend-common-0.19.8.tgz#df4cb4826edc8b60a74d34904eca349d913c257f" @@ -2824,6 +2970,67 @@ yauzl "^2.10.0" yn "^4.0.0" +"@backstage/backend-common@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@backstage/backend-common/-/backend-common-0.20.0.tgz#b3f6e7a33605ed8c32a4282186e8615169212cda" + integrity sha512-/zMfTYCY2YJCLjnjBSAxE1ALZfxxpWrz5HZnH1yjk1H/vdXfxa6YxYTXBtry7ClELokIWWcQzUMHaNy+9dLW5Q== + dependencies: + "@aws-sdk/abort-controller" "^3.347.0" + "@aws-sdk/client-s3" "^3.350.0" + "@aws-sdk/credential-providers" "^3.350.0" + "@aws-sdk/types" "^3.347.0" + "@backstage/backend-app-api" "^0.5.9" + "@backstage/backend-dev-utils" "^0.1.2" + "@backstage/backend-plugin-api" "^0.6.8" + "@backstage/cli-common" "^0.1.13" + "@backstage/config" "^1.1.1" + "@backstage/config-loader" "^1.6.0" + "@backstage/errors" "^1.2.3" + "@backstage/integration" "^1.8.0" + "@backstage/integration-aws-node" "^0.1.8" + "@backstage/types" "^1.1.1" + "@google-cloud/storage" "^7.0.0" + "@keyv/memcache" "^1.3.5" + "@keyv/redis" "^2.5.3" + "@kubernetes/client-node" "0.20.0" + "@manypkg/get-packages" "^1.1.3" + "@octokit/rest" "^19.0.3" + "@types/cors" "^2.8.6" + "@types/dockerode" "^3.3.0" + "@types/express" "^4.17.6" + "@types/luxon" "^3.0.0" + "@types/webpack-env" "^1.15.2" + archiver "^6.0.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.1.0" + git-url-parse "^13.0.0" + helmet "^6.0.0" + isomorphic-git "^1.23.0" + jose "^4.6.0" + keyv "^4.5.2" + knex "^3.0.0" + lodash "^4.17.21" + logform "^2.3.2" + luxon "^3.0.0" + minimatch "^5.0.0" + mysql2 "^2.2.5" + node-fetch "^2.6.7" + p-limit "^3.1.0" + pg "^8.11.3" + raw-body "^2.4.1" + tar "^6.1.12" + uuid "^8.3.2" + winston "^3.2.1" + winston-transport "^4.5.0" + yauzl "^2.10.0" + yn "^4.0.0" + "@backstage/backend-dev-utils@^0.1.2": version "0.1.2" resolved "https://registry.yarnpkg.com/@backstage/backend-dev-utils/-/backend-dev-utils-0.1.2.tgz#357f2b669bed0452d9dca511e35a61071c57ea20" @@ -2844,6 +3051,24 @@ lodash "^4.17.21" openapi3-ts "^3.1.2" +"@backstage/backend-openapi-utils@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@backstage/backend-openapi-utils/-/backend-openapi-utils-0.1.1.tgz#50935584d0640e8a74c3b26284965d34ead28fb4" + integrity sha512-3z2w6+NC6z7TNDJwEhSQRTXzyDREXgzAzK1ZK43JKAcZFbPiob/z4SiJm1WmdtABlZaw/3imakpb0xSavpfdfg== + dependencies: + "@backstage/backend-plugin-api" "^0.6.8" + "@backstage/config" "^1.1.1" + "@backstage/errors" "^1.2.3" + "@types/express" "^4.17.6" + "@types/express-serve-static-core" "^4.17.5" + express "^4.17.1" + express-openapi-validator "^5.0.4" + express-promise-router "^4.1.0" + json-schema-to-ts "^2.6.2" + lodash "^4.17.21" + openapi-merge "^1.3.2" + openapi3-ts "^3.1.2" + "@backstage/backend-plugin-api@0.6.6", "@backstage/backend-plugin-api@^0.6.6": version "0.6.6" resolved "https://registry.yarnpkg.com/@backstage/backend-plugin-api/-/backend-plugin-api-0.6.6.tgz#55e0ee5f7685438d808bb3ae7351c0b74d1a707c" @@ -2872,6 +3097,20 @@ express "^4.17.1" knex "^2.0.0" +"@backstage/backend-plugin-api@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@backstage/backend-plugin-api/-/backend-plugin-api-0.6.8.tgz#05f45db35c0eec191d2eb36df74c29c43c55ddab" + integrity sha512-Ylo/uZ1LrKyrJT4zZyjjeDJr/BP9Mf6x46Oi04aXiz3cyCUOxKxjN+NZjiBzdaUnANn4U9+4O2IoHyCd4beYnA== + dependencies: + "@backstage/backend-tasks" "^0.5.13" + "@backstage/config" "^1.1.1" + "@backstage/plugin-auth-node" "^0.4.2" + "@backstage/plugin-permission-common" "^0.7.11" + "@backstage/types" "^1.1.1" + "@types/express" "^4.17.6" + express "^4.17.1" + knex "^3.0.0" + "@backstage/backend-plugin-manager@npm:@janus-idp/backend-plugin-manager@0.0.2-janus.5": version "0.0.2-janus.5" resolved "https://registry.yarnpkg.com/@janus-idp/backend-plugin-manager/-/backend-plugin-manager-0.0.2-janus.5.tgz#58e3c9fa2fe096da7705b86f0262bae14b3bf0f5" @@ -2919,6 +3158,25 @@ winston "^3.2.1" zod "^3.21.4" +"@backstage/backend-tasks@^0.5.13": + version "0.5.13" + resolved "https://registry.yarnpkg.com/@backstage/backend-tasks/-/backend-tasks-0.5.13.tgz#535cd0f70f9c79e66cf2033401eecb1f4545138d" + integrity sha512-zMMNEolfi5dRWuom74n1piRp9Tkjc68SBNiMKSRvfEDjstTgACChVWl/Mt55LfLAZfKCynjZG1IBErxob5p6Ug== + dependencies: + "@backstage/backend-common" "^0.20.0" + "@backstage/config" "^1.1.1" + "@backstage/errors" "^1.2.3" + "@backstage/types" "^1.1.1" + "@opentelemetry/api" "^1.3.0" + "@types/luxon" "^3.0.0" + cron "^2.0.0" + knex "^3.0.0" + lodash "^4.17.21" + luxon "^3.0.0" + uuid "^8.0.0" + winston "^3.2.1" + zod "^3.22.4" + "@backstage/backend-test-utils@0.2.7", "@backstage/backend-test-utils@^0.2.7": version "0.2.7" resolved "https://registry.yarnpkg.com/@backstage/backend-test-utils/-/backend-test-utils-0.2.7.tgz#5fcd73e3013b7461d14995263f9b3a6009d458a1" @@ -2960,6 +3218,16 @@ "@backstage/errors" "^1.2.3" cross-fetch "^4.0.0" +"@backstage/catalog-client@^1.5.0": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@backstage/catalog-client/-/catalog-client-1.5.1.tgz#159c2442cbd3aefecb36ca6c61aec8a3355359a8" + integrity sha512-GWTwRaJd1i9f5OHSkt4yf3jxohJv5xvqZei1anFxjZvXfxFTa0zG6kWW43qomRiaKsbegohnM7HWVOOgpJ6Azw== + dependencies: + "@backstage/catalog-model" "^1.4.3" + "@backstage/errors" "^1.2.3" + cross-fetch "^4.0.0" + uri-template "^2.0.0" + "@backstage/catalog-model@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@backstage/catalog-model/-/catalog-model-1.4.1.tgz#8d57217647a3eef68ad7c7c268af573be9974201" @@ -3007,6 +3275,20 @@ semver "^7.5.3" zod "^3.21.4" +"@backstage/cli-node@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@backstage/cli-node/-/cli-node-0.2.1.tgz#7e7da0d6f3471e6843c55b547694def7dce9ee4a" + integrity sha512-S67miZbAjVVlQrLyc0hyci4grtSFcnh25Hg9XkPKs28bYEXFC6d0246sl0gpSG9+EMO2TdVQezwVfV3pZn/41w== + dependencies: + "@backstage/cli-common" "^0.1.13" + "@backstage/errors" "^1.2.3" + "@backstage/types" "^1.1.1" + "@manypkg/get-packages" "^1.1.3" + "@yarnpkg/parsers" "^3.0.0-rc.4" + fs-extra "10.1.0" + semver "^7.5.3" + zod "^3.22.4" + "@backstage/cli@0.22.9": version "0.22.9" resolved "https://registry.yarnpkg.com/@backstage/cli/-/cli-0.22.9.tgz#4f47b23366a2f438f27a0d37ea1790aad725e0b2" @@ -3257,6 +3539,28 @@ typescript-json-schema "^0.61.0" yaml "^2.0.0" +"@backstage/config-loader@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@backstage/config-loader/-/config-loader-1.6.0.tgz#f3486f099923838620f7e557753e0180a05cc955" + integrity sha512-T8knDbAJYdTqvXqXwyzRQiKQwjeBasy5I7wgKCCzM7xuZSswN6C2Y7Ljx0qmdVHejKclVxXpiUq5uRB9b0IVjg== + dependencies: + "@backstage/cli-common" "^0.1.13" + "@backstage/config" "^1.1.1" + "@backstage/errors" "^1.2.3" + "@backstage/types" "^1.1.1" + "@types/json-schema" "^7.0.6" + ajv "^8.10.0" + chokidar "^3.5.2" + fs-extra "10.1.0" + json-schema "^0.4.0" + json-schema-merge-allof "^0.8.1" + json-schema-traverse "^1.0.0" + lodash "^4.17.21" + minimist "^1.2.5" + node-fetch "^2.6.7" + typescript-json-schema "^0.62.0" + yaml "^2.0.0" + "@backstage/config@1.1.1", "@backstage/config@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@backstage/config/-/config-1.1.1.tgz#824ef3d74b391579060d5646fa1f45fcd553ce02" @@ -3293,6 +3597,25 @@ zen-observable "^0.10.0" zod "^3.21.4" +"@backstage/core-app-api@^1.11.2": + version "1.11.2" + resolved "https://registry.yarnpkg.com/@backstage/core-app-api/-/core-app-api-1.11.2.tgz#02e0f697b7594854a5c0c32e8f2d973971107590" + integrity sha512-ullzDYxavKYs4Xywp7Jsh2sppeUWZY5UGibEVJfcfDuJaaBL7I4KaZMlEPykkCXYfusK8PNPlz1IJJQDzDvbzw== + dependencies: + "@backstage/config" "^1.1.1" + "@backstage/core-plugin-api" "^1.8.1" + "@backstage/types" "^1.1.1" + "@backstage/version-bridge" "^1.0.7" + "@types/prop-types" "^15.7.3" + "@types/react" "^16.13.1 || ^17.0.0" + history "^5.0.0" + i18next "^22.4.15" + lodash "^4.17.21" + prop-types "^15.7.2" + react-use "^17.2.4" + zen-observable "^0.10.0" + zod "^3.22.4" + "@backstage/core-components@0.13.6", "@backstage/core-components@^0.13.6": version "0.13.6" resolved "https://registry.yarnpkg.com/@backstage/core-components/-/core-components-0.13.6.tgz#c34b9ec741c993db7a63634bc25b9d23e4939e6b" @@ -3413,6 +3736,18 @@ history "^5.0.0" i18next "^22.4.15" +"@backstage/core-plugin-api@^1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@backstage/core-plugin-api/-/core-plugin-api-1.8.1.tgz#8059389029d81b858a3774ff84707c71a5294157" + integrity sha512-koAOCkjP9mKHs3bsk2LQPDDjvFRKlW6PMlcc1APN1mD7eIo3RaszL7fi/a/MJBtuEpIjs2rhuE+rF/rcffXSyA== + dependencies: + "@backstage/config" "^1.1.1" + "@backstage/types" "^1.1.1" + "@backstage/version-bridge" "^1.0.7" + "@types/react" "^16.13.1 || ^17.0.0" + history "^5.0.0" + i18next "^22.4.15" + "@backstage/dev-utils@1.0.22": version "1.0.22" resolved "https://registry.yarnpkg.com/@backstage/dev-utils/-/dev-utils-1.0.22.tgz#3c6b3844bda776858e16361c6a990ec8c3873b6e" @@ -3506,6 +3841,19 @@ "@backstage/config" "^1.1.1" "@backstage/errors" "^1.2.3" +"@backstage/integration-aws-node@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@backstage/integration-aws-node/-/integration-aws-node-0.1.8.tgz#c0582a63e2348a42bbe172bdcd4609f024cc0051" + integrity sha512-WD/ahhk1d92ycjBOIRK2gtvuoP1nt5lNMKkfR1qsRBlgZFUPRCe7rkdELGpmRgrGBzU7ZyWfWGjLUh/Qpfva9Q== + dependencies: + "@aws-sdk/client-sts" "^3.350.0" + "@aws-sdk/credential-provider-node" "^3.350.0" + "@aws-sdk/credential-providers" "^3.350.0" + "@aws-sdk/types" "^3.347.0" + "@aws-sdk/util-arn-parser" "^3.310.0" + "@backstage/config" "^1.1.1" + "@backstage/errors" "^1.2.3" + "@backstage/integration-react@^1.1.20": version "1.1.20" resolved "https://registry.yarnpkg.com/@backstage/integration-react/-/integration-react-1.1.20.tgz#f2e6049494b3945cfc8588ec5641c4460ce967fa" @@ -3573,6 +3921,20 @@ lodash "^4.17.21" luxon "^3.0.0" +"@backstage/integration@^1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@backstage/integration/-/integration-1.8.0.tgz#affc54e1c12c5a4e68a92de4e42c6cf001bdf6ec" + integrity sha512-FCFOubvpKK2dt38sNATrImHrS0pkmvS2LPzvLQ01JzRy5F/QxsdRGxJmzB9irpLOUh7F3/Ilr7cBdG5nYyYVOA== + dependencies: + "@azure/identity" "^4.0.0" + "@backstage/config" "^1.1.1" + "@octokit/auth-app" "^4.0.0" + "@octokit/rest" "^19.0.3" + cross-fetch "^4.0.0" + git-url-parse "^13.0.0" + lodash "^4.17.21" + luxon "^3.0.0" + "@backstage/plugin-api-docs@^0.9.12": version "0.9.12" resolved "https://registry.yarnpkg.com/@backstage/plugin-api-docs/-/plugin-api-docs-0.9.12.tgz#76166304bfd96c1ad54fb552bbdb62cfc6fd0b88" @@ -3789,6 +4151,29 @@ node-fetch "^2.6.7" winston "^3.2.1" +"@backstage/plugin-auth-node@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@backstage/plugin-auth-node/-/plugin-auth-node-0.4.2.tgz#2101fa8c2fc640dc2c4ca964a5d749ebed9f072e" + integrity sha512-f0C+qelouM5Ej02qWw84aIbRXMtre9Lncx2zAlW8VxZfCXH/we7kjjsiY3zn8BR0DvBd9804mbXSFSuK7aEZ5w== + dependencies: + "@backstage/backend-common" "^0.20.0" + "@backstage/backend-plugin-api" "^0.6.8" + "@backstage/catalog-client" "^1.5.0" + "@backstage/catalog-model" "^1.4.3" + "@backstage/config" "^1.1.1" + "@backstage/errors" "^1.2.3" + "@backstage/types" "^1.1.1" + "@types/express" "*" + "@types/passport" "^1.0.3" + express "^4.17.1" + jose "^4.6.0" + lodash "^4.17.21" + node-fetch "^2.6.7" + passport "^0.7.0" + winston "^3.2.1" + zod "^3.22.4" + zod-to-json-schema "^3.21.4" + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-backend-module-scaffolder-entity-model/-/plugin-catalog-backend-module-scaffolder-entity-model-0.1.3.tgz#71cbe7c0508fde238d3a2dc52e9b0bb077b3e54c" @@ -4288,8 +4673,20 @@ uuid "^8.0.0" zod "^3.21.4" -"@backstage/plugin-permission-node@0.7.17", "@backstage/plugin-permission-node@^0.7.17": - version "0.7.17" +"@backstage/plugin-permission-common@^0.7.11": + version "0.7.11" + resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-common/-/plugin-permission-common-0.7.11.tgz#17f80f80ff8c95466031ba1e0554ce84fe50ba4b" + integrity sha512-EU/DY11suQt9I4YU7CxiW25ceiZzqdgAL400lHCCIEKBBmE5XFQkZ8DGOofwJJRfyYJ5Nr7Y2BOsdB40OxAxxQ== + dependencies: + "@backstage/config" "^1.1.1" + "@backstage/errors" "^1.2.3" + "@backstage/types" "^1.1.1" + cross-fetch "^4.0.0" + uuid "^8.0.0" + zod "^3.22.4" + +"@backstage/plugin-permission-node@0.7.17", "@backstage/plugin-permission-node@^0.7.17": + version "0.7.17" resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-node/-/plugin-permission-node-0.7.17.tgz#6ac25800642b9e6291fd38e571d0bf642a5893e6" integrity sha512-Q+/OOz1qYAJPb9HqS7nlFWVxCWug25ODOOOyk4NRtPiy6Buxqly6l2cRCqvBpJYv5nV/R0UvQuBk3SoiS5uXjw== dependencies: @@ -4305,6 +4702,23 @@ zod "^3.21.4" zod-to-json-schema "^3.20.4" +"@backstage/plugin-permission-node@^0.7.19": + version "0.7.19" + resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-node/-/plugin-permission-node-0.7.19.tgz#b114eec0d4341914b7553b030840962ec24813d4" + integrity sha512-ym/gjFVjMpSrHf8rcrrm8KQfuXM6eKaW4BcqIteNQ/oWJyCMPgtiE3wgqon0r8+EPzStngJMlvGQOxAMcIfSWA== + dependencies: + "@backstage/backend-common" "^0.20.0" + "@backstage/backend-plugin-api" "^0.6.8" + "@backstage/config" "^1.1.1" + "@backstage/errors" "^1.2.3" + "@backstage/plugin-auth-node" "^0.4.2" + "@backstage/plugin-permission-common" "^0.7.11" + "@types/express" "^4.17.6" + express "^4.17.1" + express-promise-router "^4.1.0" + zod "^3.22.4" + zod-to-json-schema "^3.20.4" + "@backstage/plugin-permission-react@^0.4.16": version "0.4.16" resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.16.tgz#016ff8fbb9411faf411e76690ca23a3553879442" @@ -4331,6 +4745,19 @@ react-use "^17.2.4" swr "^2.0.0" +"@backstage/plugin-permission-react@^0.4.18": + version "0.4.18" + resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.18.tgz#4339f4738e7991858d7d599e7c9802f9bb38e408" + integrity sha512-KU8kFiPM/lODGlGLVzite9hIf9nh8MAToqZamtgsyEQF/omkPWJ24rVqo4XW01dmjm4jUJi3nGIzXZoo5l5ysQ== + dependencies: + "@backstage/config" "^1.1.1" + "@backstage/core-plugin-api" "^1.8.1" + "@backstage/plugin-permission-common" "^0.7.11" + "@types/react" "^16.13.1 || ^17.0.0" + cross-fetch "^4.0.0" + react-use "^17.2.4" + swr "^2.0.0" + "@backstage/plugin-proxy-backend@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@backstage/plugin-proxy-backend/-/plugin-proxy-backend-0.4.3.tgz#45b877cabd8887f41559f5e1ffbe16292e6533dd" @@ -4935,6 +5362,25 @@ i18next "^22.4.15" zen-observable "^0.10.0" +"@backstage/test-utils@^1.4.4": + version "1.4.6" + resolved "https://registry.yarnpkg.com/@backstage/test-utils/-/test-utils-1.4.6.tgz#09fa814ee72fce418db17861b228f6d9d7679f86" + integrity sha512-zHLQzTODCvkJcznm4/ZkXMmldHbmW316VUKAkOy0kJUnO/VyidZuoB+KYGo/2lScXxJBfkBBscZiIQQpiGlOgQ== + dependencies: + "@backstage/config" "^1.1.1" + "@backstage/core-app-api" "^1.11.2" + "@backstage/core-plugin-api" "^1.8.1" + "@backstage/plugin-permission-common" "^0.7.11" + "@backstage/plugin-permission-react" "^0.4.18" + "@backstage/theme" "^0.5.0" + "@backstage/types" "^1.1.1" + "@material-ui/core" "^4.12.2" + "@material-ui/icons" "^4.9.1" + "@types/react" "^16.13.1 || ^17.0.0" + cross-fetch "^4.0.0" + i18next "^22.4.15" + zen-observable "^0.10.0" + "@backstage/theme@0.4.3", "@backstage/theme@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@backstage/theme/-/theme-0.4.3.tgz#58901531da6b2d9b3058f532ee15c866a06ab9af" @@ -4953,6 +5399,15 @@ "@emotion/styled" "^11.10.5" "@mui/material" "^5.12.2" +"@backstage/theme@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@backstage/theme/-/theme-0.5.0.tgz#4a4d0fa7dcf5335628f6c261e8bc82516327578a" + integrity sha512-lqYzmnNtnv0lkO6XOexUW/wzDFZNMg950WjEi6iTNpFn+D4T1XwC4n+CsF5uAMgYiGAoqZRkRYfGsK+xKciENw== + dependencies: + "@emotion/react" "^11.10.5" + "@emotion/styled" "^11.10.5" + "@mui/material" "^5.12.2" + "@backstage/types@1.1.1", "@backstage/types@^1.1.0", "@backstage/types@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@backstage/types/-/types-1.1.1.tgz#c9ccb30357005e7fb5fa2ac140198059976eb076" @@ -5659,6 +6114,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.51.0.tgz#6d419c240cfb2b66da37df230f7e7eef801c32fa" integrity sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg== +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" + integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== + "@fal-works/esbuild-plugin-global-externals@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz#c05ed35ad82df8e6ac616c68b92c2282bd083ba4" @@ -5765,16 +6225,34 @@ arrify "^2.0.0" extend "^3.0.2" +"@google-cloud/paginator@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-5.0.0.tgz#b8cc62f151685095d11467402cbf417c41bf14e6" + integrity sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w== + dependencies: + arrify "^2.0.0" + extend "^3.0.2" + "@google-cloud/projectify@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-3.0.0.tgz#302b25f55f674854dce65c2532d98919b118a408" integrity sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA== +"@google-cloud/projectify@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-4.0.0.tgz#d600e0433daf51b88c1fa95ac7f02e38e80a07be" + integrity sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA== + "@google-cloud/promisify@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-3.0.1.tgz#8d724fb280f47d1ff99953aee0c1669b25238c2e" integrity sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA== +"@google-cloud/promisify@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-4.0.0.tgz#a906e533ebdd0f754dca2509933334ce58b8c8b1" + integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g== + "@google-cloud/storage@^6.0.0": version "6.12.0" resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-6.12.0.tgz#a5d3093cc075252dca5bd19a3cfda406ad3a9de1" @@ -5799,6 +6277,29 @@ teeny-request "^8.0.0" uuid "^8.0.0" +"@google-cloud/storage@^7.0.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-7.7.0.tgz#d942ebea018386d276256bad93ceec9bdb955333" + integrity sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ== + dependencies: + "@google-cloud/paginator" "^5.0.0" + "@google-cloud/projectify" "^4.0.0" + "@google-cloud/promisify" "^4.0.0" + abort-controller "^3.0.0" + async-retry "^1.3.3" + compressible "^2.0.12" + duplexify "^4.0.0" + ent "^2.2.0" + fast-xml-parser "^4.3.0" + gaxios "^6.0.2" + google-auth-library "^9.0.0" + mime "^3.0.0" + mime-types "^2.0.8" + p-limit "^3.0.1" + retry-request "^7.0.0" + teeny-request "^9.0.0" + uuid "^8.0.0" + "@graphiql/react@^0.10.0": version "0.10.0" resolved "https://registry.yarnpkg.com/@graphiql/react/-/react-0.10.0.tgz#8d888949dc6c9ddebe0817aeba3e2c164bfbb1bb" @@ -5925,34 +6426,6 @@ "@backstage/config" "^1.1.1" deep-freeze "^0.0.1" -"@janus-idp/backstage-plugin-rbac-backend@^1.6.4": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@janus-idp/backstage-plugin-rbac-backend/-/backstage-plugin-rbac-backend-1.7.1.tgz#dfcd6bbf5357db3c88f6223d70ab0f6051abed55" - integrity sha512-KWFBfFfmteA//Lq/NH79LHXOCCWBHNsoakSMhaFnACt4R1ChlmgOsg0x56jKpIfE/5RqjYetxEDDhX6Pmx2sWw== - dependencies: - "@backstage/backend-common" "^0.19.8" - "@backstage/backend-plugin-api" "^0.5.4" - "@backstage/catalog-client" "^1.4.5" - "@backstage/catalog-model" "^1.4.3" - "@backstage/config" "^1.1.1" - "@backstage/core-plugin-api" "^1.7.0" - "@backstage/errors" "^1.2.3" - "@backstage/plugin-auth-node" "^0.4.0" - "@backstage/plugin-permission-backend" "^0.5.29" - "@backstage/plugin-permission-common" "^0.7.9" - "@backstage/plugin-permission-node" "^0.7.17" - "@dagrejs/graphlib" "^2.1.13" - "@janus-idp/backstage-plugin-rbac-common" "1.2.0" - casbin "^5.27.1" - express "^4.18.2" - express-promise-router "^4.1.1" - knex "^2.0.0" - lodash "^4.17.21" - qs "^6.11.2" - typeorm-adapter "^1.6.1" - winston "^3.11.0" - yn "^4.0.0" - "@jest/console@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" @@ -6140,6 +6613,17 @@ slash "^3.0.0" write-file-atomic "^4.0.2" +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@jest/types@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" @@ -6256,6 +6740,13 @@ dependencies: ioredis "^5.3.2" +"@koa/cors@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-4.0.0.tgz#b2d300d7368d2e0ad6faa1d918eff6d0cde0859a" + integrity sha512-Y4RrbvGTlAaa04DBoPBWJqDR5gPj32OOz827ULXfgB1F7piD1MB/zwn8JR2LAnvdILhxUbXbkXGWuNVsFuVFCQ== + dependencies: + vary "^1.1.2" + "@kubernetes-models/apimachinery@^1.1.0", "@kubernetes-models/apimachinery@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@kubernetes-models/apimachinery/-/apimachinery-1.2.1.tgz#39725bf5e1f50972475ee6e614d5d70e41876b13" @@ -6306,6 +6797,28 @@ optionalDependencies: openid-client "^5.3.0" +"@kubernetes/client-node@0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@kubernetes/client-node/-/client-node-0.20.0.tgz#4447ae27fd6eef3d4830a5a039f3b84ffd5c5913" + integrity sha512-xxlv5GLX4FVR/dDKEsmi4SPeuB49aRc35stndyxcC73XnUEEwF39vXbROpHOirmDse8WE9vxOjABnSVS+jb7EA== + dependencies: + "@types/js-yaml" "^4.0.1" + "@types/node" "^20.1.1" + "@types/request" "^2.47.1" + "@types/ws" "^8.5.3" + byline "^5.0.0" + isomorphic-ws "^5.0.0" + js-yaml "^4.1.0" + jsonpath-plus "^7.2.0" + request "^2.88.0" + rfc4648 "^1.3.0" + stream-buffers "^3.0.2" + tar "^6.1.11" + tslib "^2.4.1" + ws "^8.11.0" + optionalDependencies: + openid-client "^5.3.0" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" @@ -6330,7 +6843,7 @@ dependencies: "@lezer/common" "^1.0.0" -"@lukeed/csprng@^1.1.0": +"@lukeed/csprng@^1.0.0", "@lukeed/csprng@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe" integrity sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA== @@ -6700,6 +7213,34 @@ pump "^3.0.0" tar-fs "^2.1.1" +"@nestjs/axios@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nestjs/axios/-/axios-0.1.0.tgz#6cf93df11ef93b598b3c7411adb980eedd13b3e3" + integrity sha512-b2TT2X6BFbnNoeteiaxCIiHaFcSbVW+S5yygYqiIq5i6H77yIU3IVuLdpQkHq8/EqOWFwMopLN8jdkUT71Am9w== + dependencies: + axios "0.27.2" + +"@nestjs/common@9.3.11": + version "9.3.11" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-9.3.11.tgz#95a54a2dd0fec0a7abc1edba793c53a53b59c783" + integrity sha512-IFZ2G/5UKWC2Uo7tJ4SxGed2+aiA+sJyWeWsGTogKVDhq90oxVBToh+uCDeI31HNUpqYGoWmkletfty42zUd8A== + dependencies: + uid "2.0.1" + iterare "1.2.1" + tslib "2.5.0" + +"@nestjs/core@9.3.11": + version "9.3.11" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-9.3.11.tgz#1be65db0e889f8f12b87aec12c9cf66ea6043205" + integrity sha512-CI27a2JFd5rvvbgkalWqsiwQNhcP4EAG5BUK8usjp29wVp1kx30ghfBT8FLqIgmkRVo65A0IcEnWsxeXMntkxQ== + dependencies: + uid "2.0.1" + "@nuxtjs/opencollective" "0.3.2" + fast-safe-stringify "2.1.1" + iterare "1.2.1" + path-to-regexp "3.2.0" + tslib "2.5.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -6764,6 +7305,45 @@ treeverse "^2.0.0" walk-up-path "^1.0.0" +"@npmcli/arborist@^6.3.0", "@npmcli/arborist@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.5.0.tgz#ee24ecc56e4c387d78c3bce66918b386df6bd560" + integrity sha512-Ir14P+DyH4COJ9fVbmxVy+9GmyU3e/DnlBtijVN7B3Ri53Y9QmAqi1S9IifG0PTGsfa2U4zhAF8e6I/0VXfWjg== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/fs" "^3.1.0" + "@npmcli/installed-package-contents" "^2.0.2" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^5.0.0" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^4.0.0" + "@npmcli/query" "^3.0.0" + "@npmcli/run-script" "^6.0.0" + bin-links "^4.0.1" + cacache "^17.0.4" + common-ancestor-path "^1.0.1" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" + json-stringify-nice "^1.1.4" + minimatch "^9.0.0" + nopt "^7.0.0" + npm-install-checks "^6.2.0" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-registry-fetch "^14.0.3" + npmlog "^7.0.1" + pacote "^15.0.8" + parse-conflict-json "^3.0.0" + proc-log "^3.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^1.0.2" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + ssri "^10.0.1" + treeverse "^3.0.0" + walk-up-path "^3.0.1" + "@npmcli/ci-detect@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-2.0.0.tgz#e63c91bcd4185ac1e85720a34fc48e164ece5b89" @@ -6783,6 +7363,20 @@ semver "^7.3.5" walk-up-path "^1.0.0" +"@npmcli/config@^6.2.1": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-6.4.0.tgz#3b1ddfa0c452fd09beac2cf05ca49b76c7a36bc8" + integrity sha512-/fQjIbuNVIT/PbXvw178Tm97bxV0E0nVUFKHivMKtSI2pcs8xKdaWkHJxf9dTI0G/y5hp/KuCvgcUu5HwAtI1w== + dependencies: + "@npmcli/map-workspaces" "^3.0.2" + ci-info "^3.8.0" + ini "^4.1.0" + nopt "^7.0.0" + proc-log "^3.0.0" + read-package-json-fast "^3.0.2" + semver "^7.3.5" + walk-up-path "^3.0.1" + "@npmcli/disparity-colors@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-2.0.0.tgz#cb518166ee21573b96241a3613fef70acb2a60ba" @@ -6790,6 +7384,13 @@ dependencies: ansi-styles "^4.3.0" +"@npmcli/disparity-colors@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz#60ea8c6eb5ba9de2d1950e15b06205b2c3ab7833" + integrity sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg== + dependencies: + ansi-styles "^4.3.0" + "@npmcli/fs@^2.1.0", "@npmcli/fs@^2.1.1": version "2.1.2" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" @@ -6820,6 +7421,20 @@ semver "^7.3.5" which "^2.0.2" +"@npmcli/git@^4.0.0", "@npmcli/git@^4.0.1", "@npmcli/git@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + "@npmcli/installed-package-contents@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" @@ -6828,6 +7443,14 @@ npm-bundled "^1.1.1" npm-normalize-package-bin "^1.0.1" +"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + "@npmcli/map-workspaces@^2.0.2", "@npmcli/map-workspaces@^2.0.3": version "2.0.4" resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz#9e5e8ab655215a262aefabf139782b894e0504fc" @@ -6838,6 +7461,16 @@ minimatch "^5.0.1" read-package-json-fast "^2.0.3" +"@npmcli/map-workspaces@^3.0.2", "@npmcli/map-workspaces@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" + integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== + dependencies: + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" + "@npmcli/metavuln-calculator@^3.0.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz#9359bd72b400f8353f6a28a25c8457b562602622" @@ -6848,6 +7481,16 @@ pacote "^13.0.3" semver "^7.3.5" +"@npmcli/metavuln-calculator@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz#426b3e524c2008bcc82dbc2ef390aefedd643d76" + integrity sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q== + dependencies: + cacache "^17.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^15.0.0" + semver "^7.3.5" + "@npmcli/move-file@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" @@ -6861,11 +7504,21 @@ resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a" integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA== +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== + "@npmcli/node-gyp@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + "@npmcli/package-json@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-2.0.0.tgz#3bbcf4677e21055adbe673d9f08c9f9cde942e4a" @@ -6873,6 +7526,19 @@ dependencies: json-parse-even-better-errors "^2.3.1" +"@npmcli/package-json@^4.0.0", "@npmcli/package-json@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-4.0.1.tgz#1a07bf0e086b640500791f6bf245ff43cc27fa37" + integrity sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q== + dependencies: + "@npmcli/git" "^4.1.0" + glob "^10.2.2" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + proc-log "^3.0.0" + semver "^7.5.3" + "@npmcli/promise-spawn@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" @@ -6880,6 +7546,13 @@ dependencies: infer-owner "^1.0.4" +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1", "@npmcli/promise-spawn@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + "@npmcli/query@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-1.2.0.tgz#46468d583cf013aa92102970700f9555314aabe4" @@ -6889,6 +7562,13 @@ postcss-selector-parser "^6.0.10" semver "^7.3.7" +"@npmcli/query@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.1.tgz#77d63ceb7d27ed748da3cc8b50d45fc341448ed6" + integrity sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA== + dependencies: + postcss-selector-parser "^6.0.10" + "@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.2.0", "@npmcli/run-script@^4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.2.1.tgz#c07c5c71bc1c70a5f2a06b0d4da976641609b946" @@ -6900,6 +7580,239 @@ read-package-json-fast "^2.0.3" which "^2.0.2" +"@npmcli/run-script@^6.0.0", "@npmcli/run-script@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@nuxtjs/opencollective@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz#620ce1044f7ac77185e825e1936115bb38e2681c" + integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA== + dependencies: + chalk "^4.1.0" + consola "^2.15.0" + node-fetch "^2.6.1" + +"@oclif/command@^1.8.36": + version "1.8.36" + resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.36.tgz#9739b9c268580d064a50887c4597d1b4e86ca8b5" + integrity sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ== + dependencies: + "@oclif/config" "^1.18.2" + "@oclif/errors" "^1.3.6" + "@oclif/help" "^1.0.1" + "@oclif/parser" "^3.8.17" + debug "^4.1.1" + semver "^7.5.4" + +"@oclif/config@1.18.16": + version "1.18.16" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.16.tgz#3235d260ab1eb8388ebb6255bca3dd956249d796" + integrity sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA== + dependencies: + "@oclif/errors" "^1.3.6" + "@oclif/parser" "^3.8.16" + debug "^4.3.4" + globby "^11.1.0" + is-wsl "^2.1.1" + tslib "^2.6.1" + +"@oclif/config@^1.18.17", "@oclif/config@^1.18.2": + version "1.18.17" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.17.tgz#00aa4049da27edca8f06fc106832d9f0f38786a5" + integrity sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg== + dependencies: + "@oclif/errors" "^1.3.6" + "@oclif/parser" "^3.8.17" + debug "^4.3.4" + globby "^11.1.0" + is-wsl "^2.1.1" + tslib "^2.6.1" + +"@oclif/core@^1.1.1": + version "1.26.2" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-1.26.2.tgz#763c68dc91388225acd6f0819c90f93e5d8cde41" + integrity sha512-6jYuZgXvHfOIc9GIaS4T3CIKGTjPmfAxuMcbCbMRKJJl4aq/4xeRlEz0E8/hz8HxvxZBGvN2GwAUHlrGWQVrVw== + dependencies: + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^3.0.4" + ansi-escapes "^4.3.2" + ansi-styles "^4.3.0" + cardinal "^2.1.1" + chalk "^4.1.2" + clean-stack "^3.0.1" + cli-progress "^3.10.0" + debug "^4.3.4" + ejs "^3.1.6" + fs-extra "^9.1.0" + get-package-type "^0.1.0" + globby "^11.1.0" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.14.1" + natural-orderby "^2.0.3" + object-treeify "^1.1.33" + password-prompt "^1.1.2" + semver "^7.3.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + supports-color "^8.1.1" + supports-hyperlinks "^2.2.0" + tslib "^2.4.1" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +"@oclif/core@^2.15.0": + version "2.15.0" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-2.15.0.tgz#f27797b30a77d13279fba88c1698fc34a0bd0d2a" + integrity sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA== + dependencies: + "@types/cli-progress" "^3.11.0" + ansi-escapes "^4.3.2" + ansi-styles "^4.3.0" + cardinal "^2.1.1" + chalk "^4.1.2" + clean-stack "^3.0.1" + cli-progress "^3.12.0" + debug "^4.3.4" + ejs "^3.1.8" + get-package-type "^0.1.0" + globby "^11.1.0" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.14.1" + natural-orderby "^2.0.3" + object-treeify "^1.1.33" + password-prompt "^1.1.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + supports-color "^8.1.1" + supports-hyperlinks "^2.2.0" + ts-node "^10.9.1" + tslib "^2.5.0" + widest-line "^3.1.0" + wordwrap "^1.0.0" + wrap-ansi "^7.0.0" + +"@oclif/core@^3", "@oclif/core@^3.16.0": + version "3.18.1" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-3.18.1.tgz#a8c9ee3848ad663d5694bef6079116c70d32fc55" + integrity sha512-l0LsjzGcqjbUEdeSBX6bdZieVmEv82Q0W3StiyaDMEnPZ9KLH28HrLpcZg6d50mCYW9CUZNzmRo6qrCHWrgLKw== + dependencies: + "@types/cli-progress" "^3.11.5" + ansi-escapes "^4.3.2" + ansi-styles "^4.3.0" + cardinal "^2.1.1" + chalk "^4.1.2" + clean-stack "^3.0.1" + cli-progress "^3.12.0" + color "^4.2.3" + debug "^4.3.4" + ejs "^3.1.9" + get-package-type "^0.1.0" + globby "^11.1.0" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.14.1" + natural-orderby "^2.0.3" + object-treeify "^1.1.33" + password-prompt "^1.1.3" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + supports-color "^8.1.1" + supports-hyperlinks "^2.2.0" + widest-line "^3.1.0" + wordwrap "^1.0.0" + wrap-ansi "^7.0.0" + +"@oclif/errors@1.3.6", "@oclif/errors@^1.3.6": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.6.tgz#e8fe1fc12346cb77c4f274e26891964f5175f75d" + integrity sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ== + dependencies: + clean-stack "^3.0.0" + fs-extra "^8.1" + indent-string "^4.0.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +"@oclif/help@^1.0.1": + version "1.0.15" + resolved "https://registry.yarnpkg.com/@oclif/help/-/help-1.0.15.tgz#5e36e576b8132a4906d2662204ad9de7ece87e8f" + integrity sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g== + dependencies: + "@oclif/config" "1.18.16" + "@oclif/errors" "1.3.6" + chalk "^4.1.2" + indent-string "^4.0.0" + lodash "^4.17.21" + string-width "^4.2.0" + strip-ansi "^6.0.0" + widest-line "^3.1.0" + wrap-ansi "^6.2.0" + +"@oclif/linewrap@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" + integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== + +"@oclif/parser@^3.8.16", "@oclif/parser@^3.8.17": + version "3.8.17" + resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.17.tgz#e1ce0f29b22762d752d9da1c7abd57ad81c56188" + integrity sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A== + dependencies: + "@oclif/errors" "^1.3.6" + "@oclif/linewrap" "^1.0.0" + chalk "^4.1.0" + tslib "^2.6.2" + +"@oclif/plugin-help@^6.0.2": + version "6.0.11" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.0.11.tgz#f287edbc16ab94e4395d36c827999b1be043cbd2" + integrity sha512-4O96jKw7E3c222jaS/s/zOCNghtw52fVpd/h7CaejmV/99bkLTCrN2haeNcIR5WbwhyhvkO+GQsLMurLGdfB2Q== + dependencies: + "@oclif/core" "^3.16.0" + +"@oclif/plugin-plugins@^3.9.1": + version "3.9.4" + resolved "https://registry.yarnpkg.com/@oclif/plugin-plugins/-/plugin-plugins-3.9.4.tgz#e4fe13882f927360c543e53c9548a5aaf856c90a" + integrity sha512-JtumjspRdzJgHk1S10wu68tdlqSnyYRmSgCsmsc6AEvU+Orb0DQfrAgJEO77rPKPNo5MfnVAj0WyCDTi0JT/vw== + dependencies: + "@oclif/core" "^2.15.0" + chalk "^4.1.2" + debug "^4.3.4" + http-call "^5.2.2" + load-json-file "^5.3.0" + npm "9.8.1" + npm-run-path "^4.0.1" + semver "^7.5.4" + shelljs "^0.8.5" + tslib "^2.6.2" + validate-npm-package-name "^5.0.0" + yarn "^1.22.18" + +"@oclif/screen@^1.0.4 ": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" + integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== + +"@oclif/screen@^3.0.4": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-3.0.8.tgz#f746549c3ae52fdb7794dfc244dfba98ebca37f2" + integrity sha512-yx6KAqlt3TAHBduS2fMQtJDL2ufIHnDRArrJEOoTTuizxqmjLT+psGYOHpmMl3gvQpFJ11Hs76guUUktzAF9Bg== + "@octokit/app@^13.1.5": version "13.1.8" resolved "https://registry.yarnpkg.com/@octokit/app/-/app-13.1.8.tgz#9e43e7e1ffc8f028130cabdf587cbacccf0c0257" @@ -7273,6 +8186,28 @@ dependencies: fast-deep-equal "^3.1.3" +"@openapitools/openapi-generator-cli@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.7.0.tgz#5e8001a01b088bbb65ee7aa85cb73cdf88a0363e" + integrity sha512-ieEpHTA/KsDz7ANw03lLPYyjdedDEXYEyYoGBRWdduqXWSX65CJtttjqa8ZaB1mNmIjMtchUHwAYQmTLVQ8HYg== + dependencies: + "@nestjs/axios" "0.1.0" + "@nestjs/common" "9.3.11" + "@nestjs/core" "9.3.11" + "@nuxtjs/opencollective" "0.3.2" + chalk "4.1.2" + commander "8.3.0" + compare-versions "4.1.4" + concurrently "6.5.1" + console.table "0.10.0" + fs-extra "10.1.0" + glob "7.1.6" + inquirer "8.2.5" + lodash "4.17.21" + reflect-metadata "0.1.13" + rxjs "7.8.0" + tslib "2.0.3" + "@openshift/dynamic-plugin-sdk-webpack@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@openshift/dynamic-plugin-sdk-webpack/-/dynamic-plugin-sdk-webpack-3.0.1.tgz#ae62d6b48910ad652d20fd0a725c981826ed98be" @@ -8200,6 +9135,35 @@ resolved "https://registry.yarnpkg.com/@semrel-extra/npm/-/npm-1.2.2.tgz#bd754f9b13e397a70395c36f2229fd7b69f981e8" integrity sha512-QoOJFUd00ORaqOQUe2wYmwPwa7NRdGGfUhzjZ9UEZqoqymXaBDVmFF2hE3h8mFaTa/iWpAyRrrjTsg8HbSpZyw== +"@sigstore/bundle@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" + integrity sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + +"@sigstore/protobuf-specs@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" + integrity sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + make-fetch-happen "^11.0.1" + +"@sigstore/tuf@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.3.tgz#2a65986772ede996485728f027b0514c0b70b160" + integrity sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + tuf-js "^1.1.7" + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -11137,7 +12101,7 @@ "@babel/runtime" "^7.12.5" react-error-boundary "^3.1.0" -"@testing-library/react@12.1.5": +"@testing-library/react@12.1.5", "@testing-library/react@^12.1.5": version "12.1.5" resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b" integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== @@ -11151,6 +12115,11 @@ resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.1.tgz#27337d72046d5236b32fd977edee3f74c71d332f" integrity sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg== +"@testing-library/user-event@^14.5.1": + version "14.5.2" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== + "@tokenizer/token@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" @@ -11201,6 +12170,19 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" + "@types/archiver@^5.3.1": version "5.3.4" resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-5.3.4.tgz#32172d5a56f165b5b4ac902e366248bf03d3ae84" @@ -11302,6 +12284,13 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.4.tgz#1326429a519cc077028150343fd502b04686bd6f" integrity sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g== +"@types/cli-progress@^3.11.0", "@types/cli-progress@^3.11.5": + version "3.11.5" + resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.5.tgz#9518c745e78557efda057e3f96a5990c717268c3" + integrity sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g== + dependencies: + "@types/node" "*" + "@types/connect-history-api-fallback@^1.3.5": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" @@ -11764,6 +12753,14 @@ "@types/through" "*" rxjs "^7.2.0" +"@types/inquirer@^7.3.1": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-7.3.3.tgz#92e6676efb67fa6925c69a2ee638f67a822952ac" + integrity sha512-HhxyLejTHMfohAuhRun4csWigAMjXTmRyiJTU1Y/I1xmggikFMkOUoMQRlFm+zQcPEGHSs3io/0FAmNZf8EymQ== + dependencies: + "@types/through" "*" + rxjs "^6.4.0" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.5" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" @@ -11791,6 +12788,14 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/jest@^26.0.14": + version "26.0.24" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" + integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + "@types/js-cookie@^2.2.6": version "2.2.7" resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.7.tgz#226a9e31680835a6188e887f3988e60c04d3f6a3" @@ -11820,6 +12825,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== +"@types/json-schema@^7.0.13": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -11844,6 +12854,18 @@ resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.4.tgz#def6a9bb0ce78140860602f16ace37a9997f086a" integrity sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ== +"@types/lodash.clonedeep@^4.5.7": + version "4.5.9" + resolved "https://registry.yarnpkg.com/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz#ea48276c7cc18d080e00bb56cf965bcceb3f0fc1" + integrity sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.202" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" + integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== + "@types/lodash@4.14.200", "@types/lodash@^4.14.175": version "4.14.200" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149" @@ -12161,6 +13183,16 @@ "@types/tough-cookie" "*" form-data "^2.5.0" +"@types/request@^2.48.8": + version "2.48.12" + resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.12.tgz#0f590f615a10f87da18e9790ac94c29ec4c5ef30" + integrity sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw== + dependencies: + "@types/caseless" "*" + "@types/node" "*" + "@types/tough-cookie" "*" + form-data "^2.5.0" + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -12370,6 +13402,13 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== +"@types/yargs@^15.0.0": + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^16.0.0": version "16.0.6" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.6.tgz#cc0c63684d68d23498cf0b5f32aa4c3fb437c638" @@ -12840,6 +13879,11 @@ abbrev@1, abbrev@^1.0.0, abbrev@~1.1.1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -12847,7 +13891,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -12981,7 +14025,7 @@ ajv-formats-draft2019@^1.6.1: smtp-address-parser "^1.0.3" uri-js "^4.4.1" -ajv-formats@^2.1.1: +ajv-formats@^2.0.2, ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== @@ -13010,7 +14054,7 @@ ajv@^6.10.0, ajv@^6.10.1, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, aj json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.10.0, ajv@^8.11.2, ajv@^8.12.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.1.0, ajv@^8.10.0, ajv@^8.11.2, ajv@^8.12.0, ajv@^8.6.2, ajv@^8.6.3, ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -13020,7 +14064,7 @@ ajv@^8.0.0, ajv@^8.10.0, ajv@^8.11.2, ajv@^8.12.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -13051,7 +14095,7 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== -ansi-regex@^5.0.1: +ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -13068,7 +14112,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.2.0, ansi-styles@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -13155,6 +14199,18 @@ archiver-utils@^3.0.4: normalize-path "^3.0.0" readable-stream "^3.6.0" +archiver-utils@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-4.0.1.tgz#66ad15256e69589a77f706c90c6dbcc1b2775d2a" + integrity sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg== + dependencies: + glob "^8.0.0" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash "^4.17.15" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + archiver@^5.0.2, archiver@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.2.tgz#99991d5957e53bd0303a392979276ac4ddccf3b0" @@ -13168,6 +14224,19 @@ archiver@^5.0.2, archiver@^5.3.1: tar-stream "^2.2.0" zip-stream "^4.1.0" +archiver@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-6.0.1.tgz#d56968d4c09df309435adb5a1bbfc370dae48133" + integrity sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ== + dependencies: + archiver-utils "^4.0.1" + async "^3.2.4" + buffer-crc32 "^0.2.1" + readable-stream "^3.6.0" + readdir-glob "^1.1.2" + tar-stream "^3.0.0" + zip-stream "^5.0.1" + archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -13181,6 +14250,11 @@ are-we-there-yet@^3.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +are-we-there-yet@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.2.tgz#aed25dd0eae514660d49ac2b2366b175c614785a" + integrity sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg== + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -13410,6 +14484,11 @@ ast-types@^0.16.1: dependencies: tslib "^2.0.1" +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -13456,6 +14535,14 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atlassian-openapi@^1.0.8: + version "1.0.18" + resolved "https://registry.yarnpkg.com/atlassian-openapi/-/atlassian-openapi-1.0.18.tgz#963150c17426858b5ac51be9a07a9e9aef427ca9" + integrity sha512-IXgF/cYD8DW1mYB/ejDm/lKQMNXi2iCsxus2Y0ffZOxfa/SLoz0RuEZ4xu4suSRjtlda7qZDonQ6TAkQPVuQig== + dependencies: + jsonpointer "^5.0.0" + urijs "^1.19.10" + atomic-sleep@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" @@ -13522,6 +14609,23 @@ axios-cached-dns-resolve@0.5.2: pino "^5.12.2" pino-pretty "^2.6.0" +axios@0.27.2, axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +axios@>=0.25.0, axios@^1.3.4: + version "1.6.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.5.tgz#2c090da14aeeab3770ad30c3a1461bc970fb0cd8" + integrity sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axios@^0.21.1: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -13536,14 +14640,6 @@ axios@^0.26.1: dependencies: follow-redirects "^1.14.8" -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - axios@^1.4.0: version "1.6.1" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.1.tgz#76550d644bf0a2d469a01f9244db6753208397d7" @@ -13577,6 +14673,11 @@ azure-devops-node-api@^11.0.1: tunnel "0.0.6" typed-rest-client "^1.8.4" +b4a@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" + integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -13756,6 +14857,11 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== +bath-es5@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/bath-es5/-/bath-es5-3.0.3.tgz#4e2808e8b33b4a5e3328ec1e9032f370f042193d" + integrity sha512-PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg== + bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -13829,6 +14935,16 @@ bin-links@^3.0.3: rimraf "^3.0.0" write-file-atomic "^4.0.0" +bin-links@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.3.tgz#9e4a3c5900830aee3d7f52178b65e01dcdde64a5" + integrity sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" + binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -14154,7 +15270,7 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -bytes@3.1.2: +bytes@3.1.2, bytes@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -14201,7 +15317,7 @@ cacache@^16.0.0, cacache@^16.1.0, cacache@^16.1.3: tar "^6.1.11" unique-filename "^2.0.0" -cacache@^17.0.0: +cacache@^17.0.0, cacache@^17.0.4, cacache@^17.1.3: version "17.1.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== @@ -14219,6 +15335,14 @@ cacache@^17.0.0: tar "^6.1.11" unique-filename "^3.0.0" +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" @@ -14307,6 +15431,15 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001541: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001550.tgz#6ec6a2239eb2a8123cc26cfe0571db5c79eb8669" integrity sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ== +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + cardinal@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" @@ -14357,7 +15490,15 @@ chalk@2.4.2, chalk@^2.3.2, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@5.3.0, chalk@^5.2.0: +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@5.3.0, chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== @@ -14370,13 +15511,23 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +change-case@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" char-regex@^1.0.2: version "1.0.2" @@ -14448,6 +15599,11 @@ ci-info@^3.2.0, ci-info@^3.7.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== +ci-info@^3.6.1, ci-info@^3.7.1, ci-info@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + cidr-regex@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d" @@ -14490,6 +15646,13 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-stack@^3.0.0, clean-stack@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8" + integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== + dependencies: + escape-string-regexp "4.0.0" + clean-stack@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" @@ -14538,6 +15701,13 @@ cli-highlight@^2.1.11: parse5-htmlparser2-tree-adapter "^6.0.0" yargs "^16.0.0" +cli-progress@^3.10.0, cli-progress@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" + integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== + dependencies: + string-width "^4.2.3" + cli-spinners@^2.5.0: version "2.9.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" @@ -14560,6 +15730,37 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" +cli-ux@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-6.0.9.tgz#b5ab690314348b45b2c7458dad7621ae1be7c61d" + integrity sha512-0Ku29QLf+P6SeBNWM7zyoJ49eKKOjxZBZ4OH2aFeRtC0sNXU3ftdJxQPKJ1SJ+axX34I1NsfTFahpXdnxklZgA== + dependencies: + "@oclif/core" "^1.1.1" + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^1.0.4 " + ansi-escapes "^4.3.0" + ansi-styles "^4.2.0" + cardinal "^2.1.1" + chalk "^4.1.0" + clean-stack "^3.0.0" + cli-progress "^3.10.0" + extract-stack "^2.0.0" + fs-extra "^8.1" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.13.1" + lodash "^4.17.21" + natural-orderby "^2.0.1" + object-treeify "^1.1.4" + password-prompt "^1.1.2" + semver "^7.3.2" + string-width "^4.2.0" + strip-ansi "^6.0.0" + supports-color "^8.1.0" + supports-hyperlinks "^2.1.0" + tslib "^2.0.0" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -14636,6 +15837,21 @@ cmd-shim@^5.0.0: dependencies: mkdirp-infer-owner "^2.0.0" +cmd-shim@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.2.tgz#435fd9e5c95340e61715e19f90209ed6fcd9e0a4" + integrity sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw== + +co-body@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" + integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== + dependencies: + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -14731,7 +15947,7 @@ color@^3.1.3: color-convert "^1.9.3" color-string "^1.6.0" -color@^4.0.1: +color@^4.0.1, color@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== @@ -14792,7 +16008,7 @@ command-exists@^1.2.9: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== -commander@11.1.0, commander@^11.0.0: +commander@11.1.0, commander@^11.0.0, commander@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== @@ -14802,6 +16018,16 @@ commander@7, commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@8.3.0, commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -14817,16 +16043,11 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^6.2.1: +commander@^6.1.0, commander@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - commander@^9.1.0: version "9.5.0" resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" @@ -14842,6 +16063,11 @@ common-path-prefix@^3.0.0: resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== +common-tags@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -14855,6 +16081,11 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +compare-versions@4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.4.tgz#3571f4d610924d4414846a4183d386c8f3d51112" + integrity sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw== + complex.js@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.1.1.tgz#0675dac8e464ec431fb2ab7d30f41d889fb25c31" @@ -14875,6 +16106,16 @@ compress-commons@^4.1.2: normalize-path "^3.0.0" readable-stream "^3.6.0" +compress-commons@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-5.0.1.tgz#e46723ebbab41b50309b27a0e0f6f3baed2d6590" + integrity sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag== + dependencies: + crc-32 "^1.2.0" + crc32-stream "^5.0.0" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + compressible@^2.0.12, compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -14946,6 +16187,20 @@ concat-with-sourcemaps@^1.1.0: dependencies: source-map "^0.6.1" +concurrently@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.5.1.tgz#4518c67f7ac680cf5c34d5adf399a2a2047edc8c" + integrity sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag== + dependencies: + chalk "^4.1.0" + date-fns "^2.16.1" + lodash "^4.17.21" + rxjs "^6.6.3" + spawn-command "^0.0.2-1" + supports-color "^8.1.0" + tree-kill "^1.2.2" + yargs "^16.2.0" + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -14967,6 +16222,11 @@ connect-session-knex@^3.0.1: bluebird "^3.7.2" knex "^2.3.0" +consola@^2.15.0: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" @@ -14977,19 +16237,35 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +console.table@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/console.table/-/console.table-0.10.0.tgz#0917025588875befd70cf2eff4bef2c6e2d75d04" + integrity sha512-dPyZofqggxuvSf7WXvNjuRfnsOk1YazkVP8FdxH4tcH2c37wc79/Yl6Bhr7Lsu00KMgy2ql/qCMuNu8xctZM8g== + dependencies: + easy-table "1.1.0" + +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== -content-disposition@0.5.4: +content-disposition@0.5.4, content-disposition@~0.5.2: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" -content-type@^1.0.5, content-type@~1.0.4: +content-type@^1.0.4, content-type@^1.0.5, content-type@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== @@ -15086,7 +16362,7 @@ cookie@0.4.2, cookie@^0.4.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -cookie@0.5.0, cookie@~0.5.0: +cookie@0.5.0, cookie@^0.5.0, cookie@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== @@ -15096,6 +16372,14 @@ cookiejar@^2.1.4: resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== +cookies@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" + integrity sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw== + dependencies: + depd "~2.0.0" + keygrip "~1.1.0" + copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" @@ -15103,6 +16387,11 @@ copy-to-clipboard@^3.2.0, copy-to-clipboard@^3.3.1: dependencies: toggle-selection "^1.0.6" +copy-to@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" + integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w== + core-js-compat@^3.31.0, core-js-compat@^3.32.2: version "3.33.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" @@ -15201,6 +16490,14 @@ crc32-stream@^4.0.2: crc-32 "^1.2.0" readable-stream "^3.4.0" +crc32-stream@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-5.0.0.tgz#a97d3a802c8687f101c27cc17ca5253327354720" + integrity sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw== + dependencies: + crc-32 "^1.2.0" + readable-stream "^3.4.0" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -15891,14 +17188,14 @@ debug@2.6.9, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -15986,6 +17283,11 @@ deep-equal@^2.0.5: which-collection "^1.0.1" which-typed-array "^1.1.9" +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== + deep-extend@0.6.0, deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -16001,7 +17303,7 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@4.3.1, deepmerge@^4.2.2, deepmerge@^4.3.1, deepmerge@~4.3.0: +deepmerge@4.3.1, deepmerge@^4.2.2, deepmerge@^4.3.0, deepmerge@^4.3.1, deepmerge@~4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -16119,7 +17421,7 @@ denque@^2.0.1, denque@^2.1.0: resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== -depd@2.0.0, depd@~2.0.0: +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -16139,6 +17441,11 @@ dequal@^2.0.0, dequal@^2.0.2, dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +dereference-json-schema@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/dereference-json-schema/-/dereference-json-schema-0.2.1.tgz#fcad3c98e0116f7124b0989d39d947fa318cae09" + integrity sha512-uzJsrg225owJyRQ8FNTPHIuBOdSzIZlHhss9u6W8mp7jJldHqGuLv9cULagP/E26QVJDnjtG8U7Dw139mM1ydA== + des.js@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" @@ -16147,7 +17454,7 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@1.2.0: +destroy@1.2.0, destroy@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -16208,6 +17515,16 @@ dezalgo@^1.0.0, dezalgo@^1.0.4: asap "^2.0.0" wrappy "1" +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -16508,6 +17825,13 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +easy-table@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.1.0.tgz#86f9ab4c102f0371b7297b92a651d5824bc8cb73" + integrity sha512-oq33hWOSSnl2Hoh00tZWaIPi1ievrD9aFG82/IgjlycAnW9hHx5PkJiXpxPsgEE+H7BsbVQXFVFST8TEXS6/pA== + optionalDependencies: + wcwidth ">=1.0.1" + ebnf@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ebnf/-/ebnf-1.9.1.tgz#64c25d8208ec0d221ec11c3c5e8094015131a9d3" @@ -16533,7 +17857,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -ejs@^3.1.8: +ejs@^3.1.6, ejs@^3.1.8, ejs@^3.1.9: version "3.1.9" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== @@ -16583,7 +17907,7 @@ enabled@2.0.x: resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== -encodeurl@~1.0.2: +encodeurl@^1.0.2, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== @@ -16797,6 +18121,11 @@ es6-error@^4.1.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + esbuild-loader@^2.18.0: version "2.21.0" resolved "https://registry.yarnpkg.com/esbuild-loader/-/esbuild-loader-2.21.0.tgz#2698a3e565b0db2bb19a3dd91c2b6c9aad526c80" @@ -16920,6 +18249,11 @@ escape-latex@^1.2.0: resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw== +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" @@ -16935,11 +18269,6 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escodegen@^1.13.0, escodegen@^1.8.1: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" @@ -17540,6 +18869,11 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +extract-stack@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-2.0.0.tgz#11367bc865bfcd9bc0db3123e5edb57786f11f9b" + integrity sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ== + extract-zip@^1.6.6: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -17575,6 +18909,11 @@ fast-equals@^5.0.0: resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== +fast-fifo@^1.1.0, fast-fifo@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.1.1, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" @@ -17616,7 +18955,7 @@ fast-redact@^2.0.0: resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-2.1.0.tgz#dfe3c1ca69367fb226f110aa4ec10ec85462ffdf" integrity sha512-0LkHpTLyadJavq9sRzzyqIoMZemWli77K2/MGOkafrR64B9ItrvZ9aT+jluvNDsv0YEHjSNhlMBtbokuoqii4A== -fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.1.1: +fast-safe-stringify@2.1.1, fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.0.7, fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== @@ -17645,7 +18984,14 @@ fast-xml-parser@^4.2.2: dependencies: strnum "^1.0.5" -fastest-levenshtein@^1.0.12: +fast-xml-parser@^4.3.0: + version "4.3.3" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.3.tgz#aeaf5778392329f17168c40c51bcbfec8ff965be" + integrity sha512-coV/D1MhrShMvU6D0I+VAK3umz6hUaxxhL0yp/9RjfiYUfAv14rDhGQL+PLForhMdr0wq3PiV07WtkkNjJjNHg== + dependencies: + strnum "^1.0.5" + +fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== @@ -17924,6 +19270,11 @@ follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.8, fol resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.15.4: + version "1.15.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" + integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -18094,7 +19445,7 @@ fraction.js@4.3.4: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.4.tgz#b2bac8249a610c3396106da97c5a71da75b94b1c" integrity sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q== -fresh@0.5.2: +fresh@0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== @@ -18135,7 +19486,7 @@ fs-extra@11.1.1, fs-extra@^11.0.0, fs-extra@^11.1.0, fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^8.1.0: +fs-extra@^8.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -18144,7 +19495,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: +fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -18161,7 +19512,7 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-minipass@^3.0.0: +fs-minipass@^3.0.0, fs-minipass@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== @@ -18222,6 +19573,20 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" +gauge@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" + integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^4.0.1" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gaxios@^5.0.0, gaxios@^5.0.1: version "5.1.3" resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.1.3.tgz#f7fa92da0fe197c846441e5ead2573d4979e9013" @@ -18232,6 +19597,16 @@ gaxios@^5.0.0, gaxios@^5.0.1: is-stream "^2.0.0" node-fetch "^2.6.9" +gaxios@^6.0.0, gaxios@^6.0.2, gaxios@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.1.1.tgz#549629f86a13e756b900f9ff7c94624670102938" + integrity sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w== + dependencies: + extend "^3.0.2" + https-proxy-agent "^7.0.1" + is-stream "^2.0.0" + node-fetch "^2.6.9" + gcp-metadata@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.3.0.tgz#6f45eb473d0cb47d15001476b48b663744d25408" @@ -18240,6 +19615,14 @@ gcp-metadata@^5.3.0: gaxios "^5.0.0" json-bigint "^1.0.0" +gcp-metadata@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" + integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== + dependencies: + gaxios "^6.0.0" + json-bigint "^1.0.0" + generate-function@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" @@ -18294,7 +19677,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-port@^5.1.1: +get-port@^5.0.0, get-port@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== @@ -18424,7 +19807,7 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^10.0.0: +glob@^10.0.0, glob@^10.2.7, glob@^10.3.10: version "10.3.10" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== @@ -18446,7 +19829,7 @@ glob@^10.2.2: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0, glob@^7.2.3: +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -18566,6 +19949,18 @@ google-auth-library@^8.0.0, google-auth-library@^8.0.1, google-auth-library@^8.0 jws "^4.0.0" lru-cache "^6.0.0" +google-auth-library@^9.0.0: + version "9.4.2" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.4.2.tgz#4831150d2c049c37450a81141be34027657c38b6" + integrity sha512-rTLO4gjhqqo3WvYKL5IdtlCvRqeQ4hxUx/p4lObobY2xotFW3bCQC+Qf1N51CYOfiqfMecdMwW9RIo7dFWYjqw== + dependencies: + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + gaxios "^6.1.1" + gcp-metadata "^6.1.0" + gtoken "^7.0.0" + jws "^4.0.0" + google-gax@^3.5.7: version "3.6.1" resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-3.6.1.tgz#02c78fc496f5adf86f2ca9145545f4b6575f6118" @@ -18623,7 +20018,7 @@ graceful-fs@4.2.10: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -18690,6 +20085,14 @@ gtoken@^6.1.0: google-p12-pem "^4.0.0" jws "^4.0.0" +gtoken@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.0.1.tgz#b64bd01d88268ea3a3572c9076a85d1c48f1a455" + integrity sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ== + dependencies: + gaxios "^6.0.0" + jws "^4.0.0" + gunzip-maybe@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz#b913564ae3be0eda6f3de36464837a9cd94b98ac" @@ -18841,6 +20244,14 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + headers-polyfill@3.2.5: version "3.2.5" resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" @@ -18913,6 +20324,13 @@ hosted-git-info@^5.0.0, hosted-git-info@^5.2.1: dependencies: lru-cache "^7.5.1" +hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -18991,17 +20409,37 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" +http-assert@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" + integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== + dependencies: + deep-equal "~1.0.1" + http-errors "~1.8.0" + http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== +http-call@^5.2.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/http-call/-/http-call-5.3.0.tgz#4ded815b13f423de176eb0942d69c43b25b148db" + integrity sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w== + dependencies: + content-type "^1.0.4" + debug "^4.1.1" + is-retry-allowed "^1.1.0" + is-stream "^2.0.0" + parse-json "^4.0.0" + tunnel-agent "^0.6.0" + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@2.0.0: +http-errors@2.0.0, http-errors@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== @@ -19012,6 +20450,17 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@^1.6.3, http-errors@^1.7.3, http-errors@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -19101,6 +20550,11 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http2-client@^1.2.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" + integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" @@ -19130,7 +20584,7 @@ https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: agent-base "6" debug "4" -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.2: +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== @@ -19165,11 +20619,21 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +humanize-number@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18" + integrity sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ== + husky@8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== + hyphenate-style-name@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" @@ -19230,6 +20694,13 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" +ignore-walk@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" + integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== + dependencies: + minimatch "^9.0.0" + ignore@^5.1.4, ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -19305,6 +20776,11 @@ infer-owner@^1.0.4: resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== +inflation@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.1.0.tgz#9214db11a47e6f756d111c4f9df96971c60f886c" + integrity sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -19333,6 +20809,11 @@ ini@^3.0.0, ini@^3.0.1: resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.1.tgz#c76ec81007875bc44d544ff7a11a55d12294102d" integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== +ini@^4.1.0, ini@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + init-package-json@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69" @@ -19346,6 +20827,19 @@ init-package-json@^3.0.2: validate-npm-package-license "^3.0.4" validate-npm-package-name "^4.0.0" +init-package-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-5.0.0.tgz#030cf0ea9c84cfc1b0dc2e898b45d171393e4b40" + integrity sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw== + dependencies: + npm-package-arg "^10.0.0" + promzard "^1.0.0" + read "^2.0.0" + read-package-json "^6.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^5.0.0" + inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" @@ -19359,6 +20853,46 @@ inline-style-prefixer@^6.0.0: css-in-js-utils "^3.1.0" fast-loops "^1.1.3" +inquirer@8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +inquirer@^7.1.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + inquirer@^8.2.0: version "8.2.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" @@ -19394,6 +20928,11 @@ internal-slot@^1.0.4, internal-slot@^1.0.5: resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -19759,6 +21298,11 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-retry-allowed@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + is-root@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" @@ -19836,6 +21380,11 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -20002,6 +21551,11 @@ istanbul-reports@^3.1.3, istanbul-reports@^3.1.4: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterare@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" + integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== + iterator.prototype@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" @@ -20146,6 +21700,26 @@ jest-css-modules@^2.1.0: dependencies: identity-obj-proxy "3.0.0" +jest-diff@^26.0.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + jest-diff@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" @@ -20200,6 +21774,16 @@ jest-environment-node@^29.7.0: jest-mock "^29.7.0" jest-util "^29.7.0" +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" @@ -20224,6 +21808,16 @@ jest-haste-map@^29.7.0: optionalDependencies: fsevents "^2.3.2" +jest-json-schema@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jest-json-schema/-/jest-json-schema-6.1.0.tgz#68ccc23424a7b20550d59ab9186530f81113e6af" + integrity sha512-LMHuLmKjr/4X+H8v1xF5TEwfYEkzwGeWJ0epYQVQhlVTDDR5FWCdSO8vmsecb5cLf9NeWAqMKn3qhJvP9um0AA== + dependencies: + ajv "^8.8.2" + ajv-formats "^2.1.1" + chalk "^4.1.2" + jest-matcher-utils "^27.3.1" + jest-leak-detector@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" @@ -20232,6 +21826,16 @@ jest-leak-detector@^29.7.0: jest-get-type "^29.6.3" pretty-format "^29.7.0" +jest-matcher-utils@^27.3.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + jest-matcher-utils@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" @@ -20454,7 +22058,7 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.0.2: +jest@^29.0.2, jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== @@ -20521,7 +22125,7 @@ js-yaml@=4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.6.1, js-yaml@^3.8.3: +js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.14.1, js-yaml@^3.6.1, js-yaml@^3.8.3: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -20689,6 +22293,11 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" + integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== + json-pointer@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" @@ -20986,6 +22595,11 @@ just-diff@^5.0.1: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== +just-diff@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== + jwa@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" @@ -21033,6 +22647,13 @@ keycloak-js@^17.0.1: base64-js "^1.5.1" js-sha256 "^0.9.0" +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" + keyv@^4.0.0, keyv@^4.5.2, keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -21069,6 +22690,11 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== +klona@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + knex-mock-client@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/knex-mock-client/-/knex-mock-client-2.0.0.tgz#dfacec7a1771df10cb552c89f046a0a4f96932fd" @@ -21076,6 +22702,26 @@ knex-mock-client@2.0.0: dependencies: lodash.clonedeep "^4.5.0" +knex@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/knex/-/knex-2.5.1.tgz#a6c6b449866cf4229f070c17411f23871ba52ef9" + integrity sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA== + dependencies: + colorette "2.0.19" + commander "^10.0.0" + debug "4.3.4" + escalade "^3.1.1" + esm "^3.2.25" + get-package-type "^0.1.0" + getopts "2.3.0" + interpret "^2.2.0" + lodash "^4.17.21" + pg-connection-string "2.6.1" + rechoir "^0.8.0" + resolve-from "^5.0.0" + tarn "^3.0.2" + tildify "2.0.0" + knex@^2.0.0, knex@^2.3.0: version "2.4.2" resolved "https://registry.yarnpkg.com/knex/-/knex-2.4.2.tgz#a34a289d38406dc19a0447a78eeaf2d16ebedd61" @@ -21096,6 +22742,132 @@ knex@^2.0.0, knex@^2.3.0: tarn "^3.0.2" tildify "2.0.0" +knex@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/knex/-/knex-3.1.0.tgz#b6ddd5b5ad26a6315234a5b09ec38dc4a370bd8c" + integrity sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw== + dependencies: + colorette "2.0.19" + commander "^10.0.0" + debug "4.3.4" + escalade "^3.1.1" + esm "^3.2.25" + get-package-type "^0.1.0" + getopts "2.3.0" + interpret "^2.2.0" + lodash "^4.17.21" + pg-connection-string "2.6.2" + rechoir "^0.8.0" + resolve-from "^5.0.0" + tarn "^3.0.2" + tildify "2.0.0" + +koa-bodyparser@^4.3.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz#a908d848e142cc57d9eece478e932bf00dce3029" + integrity sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w== + dependencies: + co-body "^6.0.0" + copy-to "^2.0.1" + type-is "^1.6.18" + +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + +koa-convert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5" + integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA== + dependencies: + co "^4.6.0" + koa-compose "^4.1.0" + +koa-logger@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.2.1.tgz#ab9db879526db3837cc9ce4fd983c025b1689f22" + integrity sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg== + dependencies: + bytes "^3.1.0" + chalk "^2.4.2" + humanize-number "0.0.2" + passthrough-counter "^1.0.0" + +koa-mount@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-4.0.0.tgz#e0265e58198e1a14ef889514c607254ff386329c" + integrity sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ== + dependencies: + debug "^4.0.1" + koa-compose "^4.1.0" + +koa-proxy@^1.0.0-alpha.3: + version "1.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/koa-proxy/-/koa-proxy-1.0.0-alpha.3.tgz#afc61edc9dc6a195464664beccc162cfe994bf55" + integrity sha512-8ke0WoQKAsQ8BpkC9+I83lKsFaycE9fcLeTx12jQtEa5SrdTI6mNKR5M4LslHbvkX1hDhXreIszXsnom5Ej7RQ== + dependencies: + pause-stream "0.0.11" + request "^2.88.0" + request-promise-native "^1.0.5" + +koa-router@^12.0.0: + version "12.0.1" + resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-12.0.1.tgz#a3c1c331032d442da786f0631d23e74d51b6882e" + integrity sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w== + dependencies: + debug "^4.3.4" + http-errors "^2.0.0" + koa-compose "^4.1.0" + methods "^1.1.2" + path-to-regexp "^6.2.1" + +koa-send@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79" + integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ== + dependencies: + debug "^4.1.1" + http-errors "^1.7.3" + resolve-path "^1.4.0" + +koa-static@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" + integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ== + dependencies: + debug "^3.1.0" + koa-send "^5.0.0" + +koa@^2.14.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.15.0.tgz#d24ae1b0ff378bf12eb3df584ab4204e4c12ac2b" + integrity sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.9.0" + debug "^4.3.2" + delegates "^1.0.0" + depd "^2.0.0" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" + koa-convert "^2.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" + kubernetes-models@^4.1.0, kubernetes-models@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/kubernetes-models/-/kubernetes-models-4.3.1.tgz#14b8e465410f22d96270e71f9bb62bf7e5066e9c" @@ -21188,6 +22960,14 @@ libnpmaccess@^6.0.4: npm-package-arg "^9.0.1" npm-registry-fetch "^13.0.0" +libnpmaccess@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" + integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== + dependencies: + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + libnpmdiff@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-4.0.5.tgz#ffaf93fa9440ea759444b8830fdb5c661b09a7c0" @@ -21202,6 +22982,21 @@ libnpmdiff@^4.0.5: pacote "^13.6.1" tar "^6.1.0" +libnpmdiff@^5.0.19: + version "5.0.20" + resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-5.0.20.tgz#fc1d310521ce9765f7bf7693ba6affa02a11bcc1" + integrity sha512-oG+qEc0qzg++1YqLwguQvXAyG8BrKq+23RHr4sCa5XZnf1U+hcKUp8itgaBY9sGRYyGXtsRgXWWFHBmqXIctDA== + dependencies: + "@npmcli/arborist" "^6.5.0" + "@npmcli/disparity-colors" "^3.0.0" + "@npmcli/installed-package-contents" "^2.0.2" + binary-extensions "^2.2.0" + diff "^5.1.0" + minimatch "^9.0.0" + npm-package-arg "^10.1.0" + pacote "^15.0.8" + tar "^6.1.13" + libnpmexec@^4.0.14: version "4.0.14" resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-4.0.14.tgz#9ad44232434b374e477eb2c2e4548baaf698f773" @@ -21222,6 +23017,23 @@ libnpmexec@^4.0.14: semver "^7.3.7" walk-up-path "^1.0.0" +libnpmexec@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-6.0.4.tgz#205c7b77be5776576367c39f8d349e388025d77e" + integrity sha512-dhFp5yA9M2g8oLg/Ys9not+pNzW8B20pcz455TGqyU5VesXnEPQwK5EPVY8W24JJn7M0jMJ6/GxosywMPOTebA== + dependencies: + "@npmcli/arborist" "^6.5.0" + "@npmcli/run-script" "^6.0.0" + ci-info "^3.7.1" + npm-package-arg "^10.1.0" + npmlog "^7.0.1" + pacote "^15.0.8" + proc-log "^3.0.0" + read "^2.0.0" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + walk-up-path "^3.0.1" + libnpmfund@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-3.0.5.tgz#817f9e2120889beb483d9ba8eda142bb84293e4e" @@ -21229,6 +23041,13 @@ libnpmfund@^3.0.5: dependencies: "@npmcli/arborist" "^5.6.3" +libnpmfund@^4.0.19: + version "4.2.1" + resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-4.2.1.tgz#f52bed09060e003c001cdaae8904ee97a3d6d5c6" + integrity sha512-2fbmQMk3wPMdPx1gbYLNbzghj48XAsfytKrmy+A0eFXwDxCwL0BLdgXoeLQCZPpLUMSPPXdKyL6Wm4erWezhnA== + dependencies: + "@npmcli/arborist" "^6.5.0" + libnpmhook@^8.0.4: version "8.0.4" resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-8.0.4.tgz#6c58e5fe763ff5d600ae9c20457ea9a69d1f7d87" @@ -21237,6 +23056,14 @@ libnpmhook@^8.0.4: aproba "^2.0.0" npm-registry-fetch "^13.0.0" +libnpmhook@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-9.0.3.tgz#5dbd6a146feb7e11993d36a26f750ae2347bb1d9" + integrity sha512-wMZe58sI7KLhg0+nUWZW5KdMfjNNcOIIbkoP19BDHYoUF9El7eeUWkGNxUGzpHkPKiGoQ1z/v6CYin4deebeuw== + dependencies: + aproba "^2.0.0" + npm-registry-fetch "^14.0.3" + libnpmorg@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-4.0.4.tgz#2a01d49372cf0df90d79a61e69bddaf2ed704311" @@ -21245,6 +23072,14 @@ libnpmorg@^4.0.4: aproba "^2.0.0" npm-registry-fetch "^13.0.0" +libnpmorg@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-5.0.4.tgz#94eec2b84fbef736457eb27894c972ae6f5cac82" + integrity sha512-YqYXLMAN0Y1eJH4w3hUFN9648xfSdvJANMsdeZTOWJOW4Pqp8qapJFzQdqCfUkg+tEuQmnaFQQKXvkMZC51+Mw== + dependencies: + aproba "^2.0.0" + npm-registry-fetch "^14.0.3" + libnpmpack@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-4.1.3.tgz#025cfe39829acd8260662bf259e3a9331fc1e4b2" @@ -21254,6 +23089,16 @@ libnpmpack@^4.1.3: npm-package-arg "^9.0.1" pacote "^13.6.1" +libnpmpack@^5.0.19: + version "5.0.20" + resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-5.0.20.tgz#982e656e87bdfb69b458260d20c6ab243c661e5d" + integrity sha512-lPQXok0sU0V7hjb8oMD6HjYTR296aZvCJQZ1PGC7PeuKkBGuNeqSKVE2I9bwI80E4bFa9gfQ1I+rGfkNRjn6tQ== + dependencies: + "@npmcli/arborist" "^6.5.0" + "@npmcli/run-script" "^6.0.0" + npm-package-arg "^10.1.0" + pacote "^15.0.8" + libnpmpublish@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.5.tgz#5a894f3de2e267d62f86be2a508e362599b5a4b1" @@ -21265,6 +23110,20 @@ libnpmpublish@^6.0.5: semver "^7.3.7" ssri "^9.0.0" +libnpmpublish@^7.5.0: + version "7.5.1" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.5.1.tgz#80f0b5d30210156af7a1b98b1a7bff06bd868684" + integrity sha512-z/7HYMtuRrNgcftrI9ILXezZWHYHG0RaIZFfUvcLktE75vrScE3zOO+qvAbvQodQi4YvYoOGF1ySQ8tdbDCYQQ== + dependencies: + ci-info "^3.6.1" + normalize-package-data "^5.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + proc-log "^3.0.0" + semver "^7.3.7" + sigstore "^1.4.0" + ssri "^10.0.1" + libnpmsearch@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-5.0.4.tgz#b32aa2b23051c00cdcc0912274d0d416e6655d81" @@ -21272,6 +23131,13 @@ libnpmsearch@^5.0.4: dependencies: npm-registry-fetch "^13.0.0" +libnpmsearch@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-6.0.2.tgz#b6a531a312855dd3bf84dd273b1033dd09b4cbec" + integrity sha512-p+5BF19AvnVg8mcIQhy6yWhI6jHQRVMYaIaKeITEfYAffWsqbottA/WZdMtHL76hViC6SFM1WdclM1w5eAIa1g== + dependencies: + npm-registry-fetch "^14.0.3" + libnpmteam@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-4.0.4.tgz#ac26068808d93b1051d926457db14e4b3ff669ef" @@ -21280,6 +23146,14 @@ libnpmteam@^4.0.4: aproba "^2.0.0" npm-registry-fetch "^13.0.0" +libnpmteam@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-5.0.3.tgz#196657e9d87c0cc914c44fee588ad2b838074a3c" + integrity sha512-7XOGhi45s+ml6TyrhJUTyrErcoDMKGKfEtiTEco4ofU7BGGAUOalVztKMVLLJgJOOXdIAIlzCHqkTXEuSiyCiA== + dependencies: + aproba "^2.0.0" + npm-registry-fetch "^14.0.3" + libnpmversion@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-3.0.7.tgz#e4c6c07ee28cf351ce1e2293a5ac9922b09ea94d" @@ -21291,6 +23165,17 @@ libnpmversion@^3.0.7: proc-log "^2.0.0" semver "^7.3.7" +libnpmversion@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-4.0.2.tgz#cad9cd1b287fcf9576a64edfe71491b49a65d06f" + integrity sha512-n1X70mFHv8Piy4yos+MFWUARSkTbyV5cdsHScaIkuwYvRAF/s2VtYScDzWB4Oe8uNEuGNdjiRR1E/Dh1tMvv6g== + dependencies: + "@npmcli/git" "^4.0.1" + "@npmcli/run-script" "^6.0.0" + json-parse-even-better-errors "^3.0.0" + proc-log "^3.0.0" + semver "^7.3.7" + libsodium-wrappers@^0.7.11: version "0.7.13" resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" @@ -21385,6 +23270,17 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +load-json-file@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" + integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== + dependencies: + graceful-fs "^4.1.15" + parse-json "^4.0.0" + pify "^4.0.1" + strip-bom "^3.0.0" + type-fest "^0.3.0" + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -21550,7 +23446,7 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -lodash.merge@^4.6.2: +lodash.merge@^4.6.1, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -21580,7 +23476,7 @@ lodash.zipobject@^4.1.3: resolved "https://registry.yarnpkg.com/lodash.zipobject/-/lodash.zipobject-4.1.3.tgz#b399f5aba8ff62a746f6979bf20b214f964dbef8" integrity sha512-A9SzX4hMKWS25MyalwcOnNoplyHbkNVsjidhTp8ru0Sj23wY9GWBKS8gAIGDSAqeWjIjvE4KBEl24XXAs+v4wQ== -lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -21755,7 +23651,7 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^10.0.6, make-fetch-happen@^10.2.0: +make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6, make-fetch-happen@^10.2.0: version "10.2.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== @@ -21777,7 +23673,7 @@ make-fetch-happen@^10.0.6, make-fetch-happen@^10.2.0: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^11.0.3: +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, make-fetch-happen@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== @@ -22451,7 +24347,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.0.8, mime-types@^2.1.12, mime-types@^2.1.25, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.0.8, mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.25, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -22543,7 +24439,7 @@ minimatch@^7.4.2, minimatch@^7.4.3: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1: +minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== @@ -22707,6 +24603,13 @@ mock-fs@5.2.0: resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-5.2.0.tgz#3502a9499c84c0a1218ee4bf92ae5bf2ea9b2b5e" integrity sha512-2dF2R6YMSZbpip1V1WHKGLNjr/k48uQClqMVb5H3MOvwc9qhYis3/IWbj02qIg/Y8MDXKFF4c5v0rxx2o6xTZw== +mock-json-schema@^1.0.7: + version "1.1.1" + resolved "https://registry.yarnpkg.com/mock-json-schema/-/mock-json-schema-1.1.1.tgz#35cf35ae16e519986ff83c22b4a886a8fe5b9ba5" + integrity sha512-YV23vlsLP1EEOy0EviUvZTluXjLR+rhMzeayP2rcDiezj3RW01MhOSQkbQskdtg0K2fnGas5LKbSXgNjAOSX4A== + dependencies: + lodash "^4.17.21" + modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -22840,6 +24743,11 @@ mute-stream@0.0.8, mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + mysql2@^2.2.5: version "2.3.3" resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.3.3.tgz#944f3deca4b16629052ff8614fbf89d5552545a0" @@ -22914,6 +24822,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +natural-orderby@^2.0.1, natural-orderby@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" + integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== + ndjson@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-2.0.0.tgz#320ac86f6fe53f5681897349b86ac6f43bfa3a19" @@ -23011,6 +24924,13 @@ node-fetch-commonjs@^3.3.1: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + node-fetch-native@^1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.4.1.tgz#5a336e55b4e1b1e72b9927da09fecd2b374c9be5" @@ -23054,6 +24974,23 @@ node-gyp@^9.0.0, node-gyp@^9.1.0: tar "^6.1.2" which "^2.0.2" +node-gyp@^9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -23088,6 +25025,13 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== + dependencies: + es6-promise "^3.2.1" + node-releases@^2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" @@ -23116,6 +25060,13 @@ nopt@^6.0.0: dependencies: abbrev "^1.0.0" +nopt@^7.0.0, nopt@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" + integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== + dependencies: + abbrev "^2.0.0" + nopt@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -23153,6 +25104,16 @@ normalize-package-data@^4.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -23177,6 +25138,11 @@ npm-audit-report@^3.0.0: dependencies: chalk "^4.0.0" +npm-audit-report@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-5.0.0.tgz#83ac14aeff249484bde81eff53c3771d5048cf95" + integrity sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw== + npm-bundled@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" @@ -23191,6 +25157,13 @@ npm-bundled@^2.0.0: dependencies: npm-normalize-package-bin "^2.0.0" +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + npm-install-checks@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234" @@ -23198,6 +25171,13 @@ npm-install-checks@^5.0.0: dependencies: semver "^7.1.1" +npm-install-checks@^6.0.0, npm-install-checks@^6.1.1, npm-install-checks@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + npm-normalize-package-bin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" @@ -23208,6 +25188,21 @@ npm-normalize-package-bin@^2.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz#9447a1adaaf89d8ad0abe24c6c84ad614a675fff" integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + npm-package-arg@^9.0.0, npm-package-arg@^9.0.1, npm-package-arg@^9.1.0: version "9.1.2" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.2.tgz#fc8acecb00235f42270dda446f36926ddd9ac2bc" @@ -23228,6 +25223,13 @@ npm-packlist@^5.0.0, npm-packlist@^5.1.0: npm-bundled "^2.0.0" npm-normalize-package-bin "^2.0.0" +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== + dependencies: + ignore-walk "^6.0.0" + npm-pick-manifest@^7.0.0, npm-pick-manifest@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz#1d372b4e7ea7c6712316c0e99388a73ed3496e84" @@ -23238,6 +25240,16 @@ npm-pick-manifest@^7.0.0, npm-pick-manifest@^7.0.2: npm-package-arg "^9.0.0" semver "^7.3.5" +npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz#2159778d9c7360420c925c1a2287b5a884c713aa" + integrity sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + npm-profile@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-6.2.1.tgz#975c31ec75a6ae029ab5b8820ffdcbae3a1e3d5e" @@ -23246,6 +25258,14 @@ npm-profile@^6.2.0: npm-registry-fetch "^13.0.1" proc-log "^2.0.0" +npm-profile@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-7.0.1.tgz#a37dae08b22e662ece2c6e08946f9fcd9fdef663" + integrity sha512-VReArOY/fCx5dWL66cbJ2OMogTQAVVQA//8jjmjkarboki3V7UJ0XbGFW+khRwiAJFQjuH0Bqr/yF7Y5RZdkMQ== + dependencies: + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.3.1: version "13.3.1" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz#bb078b5fa6c52774116ae501ba1af2a33166af7e" @@ -23259,6 +25279,19 @@ npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.3 npm-package-arg "^9.0.1" proc-log "^2.0.0" +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3, npm-registry-fetch@^14.0.5: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -23278,6 +25311,85 @@ npm-user-validate@^1.0.1: resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561" integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw== +npm-user-validate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-2.0.0.tgz#7b69bbbff6f7992a1d9a8968d52fd6b6db5431b6" + integrity sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q== + +npm@9.8.1: + version "9.8.1" + resolved "https://registry.yarnpkg.com/npm/-/npm-9.8.1.tgz#b8f070cc770128b38017160491504184863329f0" + integrity sha512-AfDvThQzsIXhYgk9zhbk5R+lh811lKkLAeQMMhSypf1BM7zUafeIIBzMzespeuVEJ0+LvY36oRQYf7IKLzU3rw== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/arborist" "^6.3.0" + "@npmcli/config" "^6.2.1" + "@npmcli/fs" "^3.1.0" + "@npmcli/map-workspaces" "^3.0.4" + "@npmcli/package-json" "^4.0.1" + "@npmcli/promise-spawn" "^6.0.2" + "@npmcli/run-script" "^6.0.2" + abbrev "^2.0.0" + archy "~1.0.0" + cacache "^17.1.3" + chalk "^5.3.0" + ci-info "^3.8.0" + cli-columns "^4.0.0" + cli-table3 "^0.6.3" + columnify "^1.6.0" + fastest-levenshtein "^1.0.16" + fs-minipass "^3.0.2" + glob "^10.2.7" + graceful-fs "^4.2.11" + hosted-git-info "^6.1.1" + ini "^4.1.1" + init-package-json "^5.0.0" + is-cidr "^4.0.2" + json-parse-even-better-errors "^3.0.0" + libnpmaccess "^7.0.2" + libnpmdiff "^5.0.19" + libnpmexec "^6.0.3" + libnpmfund "^4.0.19" + libnpmhook "^9.0.3" + libnpmorg "^5.0.4" + libnpmpack "^5.0.19" + libnpmpublish "^7.5.0" + libnpmsearch "^6.0.2" + libnpmteam "^5.0.3" + libnpmversion "^4.0.2" + make-fetch-happen "^11.1.1" + minimatch "^9.0.3" + minipass "^5.0.0" + minipass-pipeline "^1.2.4" + ms "^2.1.2" + node-gyp "^9.4.0" + nopt "^7.2.0" + npm-audit-report "^5.0.0" + npm-install-checks "^6.1.1" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-profile "^7.0.1" + npm-registry-fetch "^14.0.5" + npm-user-validate "^2.0.0" + npmlog "^7.0.1" + p-map "^4.0.0" + pacote "^15.2.0" + parse-conflict-json "^3.0.1" + proc-log "^3.0.0" + qrcode-terminal "^0.12.0" + read "^2.1.0" + semver "^7.5.4" + sigstore "^1.7.0" + ssri "^10.0.4" + supports-color "^9.4.0" + tar "^6.1.15" + text-table "~0.2.0" + tiny-relative-date "^1.3.0" + treeverse "^3.0.0" + validate-npm-package-name "^5.0.0" + which "^3.0.1" + write-file-atomic "^5.0.1" + npm@^8.3.0: version "8.19.4" resolved "https://registry.yarnpkg.com/npm/-/npm-8.19.4.tgz#65ad6a2dfdd157a4ef4467fb86e8dcd35a43493f" @@ -23367,6 +25479,16 @@ npmlog@^6.0.0, npmlog@^6.0.2: gauge "^4.0.3" set-blocking "^2.0.0" +npmlog@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" + integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== + dependencies: + are-we-there-yet "^4.0.0" + console-control-strings "^1.1.0" + gauge "^5.0.0" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -23388,10 +25510,56 @@ nunjucks@^3.2.3: asap "^2.0.3" commander "^5.1.0" -nwsapi@^2.2.0, nwsapi@^2.2.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== +nwsapi@^2.2.0, nwsapi@^2.2.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" + integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver@^2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" + integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" + integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.2" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + reftools "^1.1.9" + should "^13.2.1" + yaml "^1.10.0" oauth-sign@~0.9.0: version "0.9.0" @@ -23413,7 +25581,7 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-hash@^2.2.0: +object-hash@^2.0.3, object-hash@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== @@ -23441,6 +25609,11 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-treeify@^1.1.33, object-treeify@^1.1.4: + version "1.1.33" + resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" + integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== + object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" @@ -23533,7 +25706,7 @@ oidc-token-hash@^5.0.3: resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== -on-finished@2.4.1: +on-finished@2.4.1, on-finished@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -23580,6 +25753,11 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +only@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ== + ono@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/ono/-/ono-7.1.3.tgz#a054e96a388f566a6c4c95e1e92b9b253722d286" @@ -23604,6 +25782,54 @@ open@^8.0.0, open@^8.0.4, open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +openapi-backend@^5.10.5, openapi-backend@^5.6.2: + version "5.10.5" + resolved "https://registry.yarnpkg.com/openapi-backend/-/openapi-backend-5.10.5.tgz#344905d7db0dcddbec827e9aa3e8dc8e7089b0a7" + integrity sha512-ivZfL0Lwj7rRctCqxAquGy4j/VcdUXUvDsEVM3NG/2jDuvYT2dS+sf9ntGo5vv4hkOnkWgPnR6HxHp7NPexqAA== + dependencies: + "@apidevtools/json-schema-ref-parser" "^11.1.0" + ajv "^8.6.2" + bath-es5 "^3.0.3" + cookie "^0.5.0" + dereference-json-schema "^0.2.1" + lodash "^4.17.15" + mock-json-schema "^1.0.7" + openapi-schema-validator "^12.0.0" + openapi-types "^12.0.2" + qs "^6.9.3" + +openapi-client-axios-typegen@^7.4.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/openapi-client-axios-typegen/-/openapi-client-axios-typegen-7.5.1.tgz#419f5fec82930c98f1f15c0b677df475f7e881cc" + integrity sha512-mvBaodjCZ6j/S7Id3qPhRV0F7oLQmY2GuEa4dmckhKMej6Pf4b7CiE+K1WHe5MZ7tb6sUt1dmgl8Shw0gA54Og== + dependencies: + "@anttiviljami/dtsgenerator" "^3.19.1" + "@apidevtools/json-schema-ref-parser" "^10.1.0" + axios ">=0.25.0" + indent-string "^4.0.0" + lodash "^4.17.21" + openapi-client-axios "^7.5.1" + openapi-types "^12.1.0" + yargs "^17.3.0" + +openapi-client-axios@^7.4.0, openapi-client-axios@^7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/openapi-client-axios/-/openapi-client-axios-7.5.1.tgz#0444660eca92a0ed7d5a6eb7a95fc8f4697bc894" + integrity sha512-mtPKqgQ/+u95SZAeJRobmT2K0q4akXvRVssO/5/muFsc5qfOQqmaP+awHcM4Xu2yFoD8Uumia2zjm8OtmpKqxA== + dependencies: + bath-es5 "^3.0.3" + dereference-json-schema "^0.2.1" + openapi-types "^12.1.3" + +openapi-merge@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/openapi-merge/-/openapi-merge-1.3.2.tgz#dc77a8e85ac63a5d7373eb63f05ab8b93ff78380" + integrity sha512-qRWBwPMiKIUrAcKW6lstMPKpFEWy32dBbP1UjHH9jlWgw++2BCqOVbsjO5Wa4H1Ll3c4cn+lyi4TinUy8iswzw== + dependencies: + atlassian-openapi "^1.0.8" + lodash "^4.17.15" + ts-is-present "^1.1.1" + openapi-sampler@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/openapi-sampler/-/openapi-sampler-1.3.1.tgz#eebb2a1048f830cc277398bc8022b415f887e859" @@ -23612,6 +25838,21 @@ openapi-sampler@^1.2.1: "@types/json-schema" "^7.0.7" json-pointer "0.6.2" +openapi-schema-validator@^12.0.0: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-schema-validator/-/openapi-schema-validator-12.1.3.tgz#c9234af67b00cdbbecfdd4eb546d7006bacfe518" + integrity sha512-xTHOmxU/VQGUgo7Cm0jhwbklOKobXby+/237EG967+3TQEYJztMgX9Q5UE2taZKwyKPUq0j11dngpGjUuxz1hQ== + dependencies: + ajv "^8.1.0" + ajv-formats "^2.0.2" + lodash.merge "^4.6.1" + openapi-types "^12.1.3" + +openapi-types@^12.0.2, openapi-types@^12.1.0, openapi-types@^12.1.3: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + openapi-typescript-codegen@0.25.0: version "0.25.0" resolved "https://registry.yarnpkg.com/openapi-typescript-codegen/-/openapi-typescript-codegen-0.25.0.tgz#0cb028f54b33b0a63bd9da3756c1c41b4e1a70e2" @@ -23630,6 +25871,64 @@ openapi3-ts@^3.1.2: dependencies: yaml "^2.2.1" +openapi@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/openapi/-/openapi-1.0.1.tgz#f70ba667cf55b1684a7bfe1e6bcea7134bc9bb72" + integrity sha512-hiQ6/K2Q2eFqlOoPQb8V2hzsVsbv31ipMCKfuwZQmqf+MnLzVUcYMBy0h/Y+Sv/HeDCTN4mf0GoOmET4EoJS8A== + dependencies: + "@types/jest" "^26.0.14" + change-case "^4.1.1" + commander "^6.1.0" + cosmiconfig "^6.0.0" + is-url "^1.2.4" + js-yaml "^3.13.1" + node-fetch "^2.6.0" + object-hash "^2.0.3" + url-parse "^1.4.7" + +openapicmd@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/openapicmd/-/openapicmd-2.1.0.tgz#ac68e0717fb63018486784f03ebda105ed939fbc" + integrity sha512-AMe2rEXUCMZoJ7s6rYyVXauRtI0vFhm70lsn+QrV4HLItFK959GghCblgO3BXxqJ4SP4P8f+BY/74RRn0t0ZNA== + dependencies: + "@apidevtools/swagger-parser" "^10.1.0" + "@koa/cors" "^4.0.0" + "@oclif/command" "^1.8.36" + "@oclif/config" "^1.18.17" + "@oclif/core" "^3" + "@oclif/errors" "^1.3.6" + "@oclif/plugin-help" "^6.0.2" + "@oclif/plugin-plugins" "^3.9.1" + "@types/inquirer" "^7.3.1" + ajv "^8.12.0" + axios "^1.3.4" + chalk "^4.0.0" + cli-ux "^6.0.9" + common-tags "^1.8.2" + debug "^4.1.1" + deepmerge "^4.3.0" + get-port "^5.0.0" + inquirer "^7.1.0" + jest "^29.7.0" + jest-json-schema "^6.1.0" + js-yaml "^4.1.0" + klona "^2.0.6" + koa "^2.14.1" + koa-bodyparser "^4.3.0" + koa-logger "^3.2.1" + koa-mount "^4.0.0" + koa-proxy "^1.0.0-alpha.3" + koa-router "^12.0.0" + koa-static "^5.0.0" + openapi-backend "^5.6.2" + openapi-client-axios "^7.4.0" + openapi-client-axios-typegen "^7.4.1" + swagger-editor-dist "^4.11.2" + swagger-ui-dist "^5.9.0" + swagger2openapi "^7.0.8" + tslib "^2.5.0" + yargs "^17.7.2" + opener@1.5.2, opener@^1.5.1, opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -23902,6 +26201,30 @@ pacote@^13.0.3, pacote@^13.6.1, pacote@^13.6.2: ssri "^9.0.0" tar "^6.1.11" +pacote@^15.0.0, pacote@^15.0.8, pacote@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" + pako@^1.0.10, pako@~1.0.2, pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -23947,6 +26270,15 @@ parse-conflict-json@^2.0.1, parse-conflict-json@^2.0.2: just-diff "^5.0.1" just-diff-apply "^5.2.0" +parse-conflict-json@^3.0.0, parse-conflict-json@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== + dependencies: + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" + just-diff-apply "^5.2.0" + parse-entities@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" @@ -24015,7 +26347,7 @@ parse5@^7.0.0, parse5@^7.1.1: dependencies: entities "^4.4.0" -parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -24149,6 +26481,28 @@ passport@^0.6.0: pause "0.0.1" utils-merge "^1.0.1" +passport@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.7.0.tgz#3688415a59a48cf8068417a8a8092d4492ca3a05" + integrity sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ== + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + utils-merge "^1.0.1" + +passthrough-counter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa" + integrity sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA== + +password-prompt@^1.1.2, password-prompt@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.3.tgz#05e539f4e7ca4d6c865d479313f10eb9db63ee5f" + integrity sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw== + dependencies: + ansi-escapes "^4.3.2" + cross-spawn "^7.0.3" + patch-package@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" @@ -24180,6 +26534,14 @@ path-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + path-equal@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/path-equal/-/path-equal-1.2.5.tgz#9fcbdd5e5daee448e96f43f3bac06c666b5e982a" @@ -24200,7 +26562,7 @@ path-exists@^5.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== -path-is-absolute@^1.0.0: +path-is-absolute@1.0.1, path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== @@ -24233,7 +26595,12 @@ 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: +path-to-regexp@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f" + integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA== + +path-to-regexp@^6.2.0, path-to-regexp@^6.2.1: 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== @@ -24248,6 +26615,13 @@ pathe@^1.1.1: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" @@ -24264,6 +26638,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pct-encode@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pct-encode/-/pct-encode-1.0.2.tgz#b99b7b044d6bd7c39e4839a7a80122ad7515caa5" + integrity sha512-8W3p1RpEfGKbY68uo/n+FMYf/vIpSiYJhtPCQ3ioxMuKJ8u4Q6j3pIh0LAeszEdPSIguxon8CGjx4aXX33l0Tg== + peek-readable@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72" @@ -24298,7 +26677,12 @@ pg-connection-string@2.5.0: resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== -pg-connection-string@^2.6.2: +pg-connection-string@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.1.tgz#78c23c21a35dd116f48e12e23c0965e8d9e2cbfb" + integrity sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg== + +pg-connection-string@2.6.2, pg-connection-string@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== @@ -24849,7 +27233,17 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@^27.0.2: +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -24887,6 +27281,11 @@ proc-log@^2.0.0, proc-log@^2.0.1: resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -24914,7 +27313,7 @@ promise-all-reject-late@^1.0.0: resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== -promise-call-limit@^1.0.1: +promise-call-limit@^1.0.1, promise-call-limit@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== @@ -24957,6 +27356,13 @@ promzard@^0.3.0: dependencies: read "1" +promzard@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" + integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== + dependencies: + read "^2.0.0" + prop-types@15.x, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -25172,7 +27578,7 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.10.0, qs@^6.10.1, qs@^6.10.2, qs@^6.11.0, qs@^6.11.2, qs@^6.4.0, qs@^6.9.1, qs@^6.9.4: +qs@^6.10.0, qs@^6.10.1, qs@^6.10.2, qs@^6.11.0, qs@^6.11.2, qs@^6.4.0, qs@^6.5.2, qs@^6.9.1, qs@^6.9.3, qs@^6.9.4: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== @@ -25209,6 +27615,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== + quick-format-unescaped@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz#fb3e468ac64c01d22305806c39f121ddac0d1fb9" @@ -25300,7 +27711,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@^2.4.1: +raw-body@^2.3.3, raw-body@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== @@ -25790,6 +28201,11 @@ read-cmd-shim@^3.0.0: resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz#868c235ec59d1de2db69e11aec885bc095aea087" integrity sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g== +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" @@ -25798,6 +28214,14 @@ read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + read-package-json@^5.0.0, read-package-json@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.2.tgz#b8779ccfd169f523b67208a89cc912e3f663f3fa" @@ -25808,6 +28232,16 @@ read-package-json@^5.0.0, read-package-json@^5.0.2: normalize-package-data "^4.0.0" npm-normalize-package-bin "^2.0.0" +read-package-json@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" + integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== + dependencies: + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" + read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -25844,6 +28278,13 @@ read@1, read@^1.0.7, read@~1.0.7: dependencies: mute-stream "~0.0.4" +read@^2.0.0, read@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" + integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== + dependencies: + mute-stream "~1.0.0" + readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -25940,6 +28381,13 @@ recharts@^2.9.0: tiny-invariant "^1.3.1" victory-vendor "^36.6.8" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + rechoir@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" @@ -25993,7 +28441,7 @@ redux@^4.0.0, redux@^4.0.4, redux@^4.1.2: dependencies: "@babel/runtime" "^7.9.2" -reflect-metadata@^0.1.13: +reflect-metadata@0.1.13, reflect-metadata@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== @@ -26019,6 +28467,11 @@ refractor@^3.6.0: parse-entities "^2.0.0" prismjs "~1.27.0" +reftools@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" + integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== + regenerate-unicode-properties@^10.1.0: version "10.1.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" @@ -26190,6 +28643,22 @@ replace-in-file@^6.0.0: glob "^7.2.0" yargs "^17.2.1" +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -26275,6 +28744,14 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + integrity sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w== + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" @@ -26285,7 +28762,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -26344,6 +28821,16 @@ retry-request@^5.0.0: debug "^4.1.1" extend "^3.0.2" +retry-request@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-7.0.1.tgz#b0163aeb934bd3fa2de76902d683b09b8ce364ba" + integrity sha512-ZI6vJp9rfB71mrZpw+n9p/B6HCsd7QJlSEQftZ+xfJzr3cQ9EPGKw1FF0BnViJ0fYREX6FhymBD2CARpmsFciQ== + dependencies: + "@types/request" "^2.48.8" + debug "^4.1.1" + extend "^3.0.2" + teeny-request "^9.0.0" + retry@0.13.1, retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -26509,6 +28996,20 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== +rxjs@7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + +rxjs@^6.4.0, rxjs@^6.6.0, rxjs@^6.6.3: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + rxjs@^7.2.0, rxjs@^7.5.5: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" @@ -26743,6 +29244,15 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + seq-queue@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" @@ -26871,11 +29381,64 @@ shell-quote@^1.7.3, shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + short-unique-id@^5.0.2: version "5.0.3" resolved "https://registry.yarnpkg.com/short-unique-id/-/short-unique-id-5.0.3.tgz#bc6975dc5e8b296960ff5ac91ddabbc7ddb693d9" integrity sha512-yhniEILouC0s4lpH0h7rJsfylZdca10W9mDJRAFh3EpcSUanCHGb0R7kcFOIUCZYSAPo0PUD5ZxWQdW0T4xaug== +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -26904,6 +29467,17 @@ signale@^1.2.1, signale@^1.4.0: figures "^2.0.0" pkg-conf "^2.1.0" +sigstore@^1.3.0, sigstore@^1.4.0, sigstore@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.9.0.tgz#1e7ad8933aa99b75c6898ddd0eeebc3eb0d59875" + integrity sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + "@sigstore/sign" "^1.0.0" + "@sigstore/tuf" "^1.0.3" + make-fetch-happen "^11.0.1" + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -26952,6 +29526,15 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" @@ -27080,6 +29663,11 @@ spark-md5@^3.0.1: resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc" integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== + spawn-error-forwarder@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029" @@ -27219,7 +29807,7 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^10.0.0: +ssri@^10.0.0, ssri@^10.0.1, ssri@^10.0.4: version "10.0.5" resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== @@ -27301,11 +29889,16 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.4.0 < 2": +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -27401,6 +29994,14 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +streamx@^2.15.0: + version "2.15.6" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.6.tgz#28bf36997ebc7bf6c08f9eba958735231b833887" + integrity sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw== + dependencies: + fast-fifo "^1.1.0" + queue-tick "^1.0.1" + 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" @@ -27436,7 +30037,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -27677,14 +30278,19 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.3.0: +supports-color@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== + +supports-hyperlinks@^2.1.0, supports-hyperlinks@^2.2.0, supports-hyperlinks@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== @@ -27748,6 +30354,16 @@ swagger-client@^3.22.3: traverse "~0.6.6" undici "^5.24.0" +swagger-editor-dist@^4.11.2: + version "4.11.2" + resolved "https://registry.yarnpkg.com/swagger-editor-dist/-/swagger-editor-dist-4.11.2.tgz#de55f0c604bb2b82e18213456f05044ed1a3e26f" + integrity sha512-6HtvF933+hUyHLwrEyAIGwqak3U5j5ZjSJPsVbSeoQG1w0T5bAMJBCl4HSqqM0IkD/BoaTUgKWZd7Rrn1NUGeQ== + +swagger-ui-dist@^5.9.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.11.0.tgz#9bcfd75278b1fa9c36fe52f206f8fc611470547c" + integrity sha512-j0PIATqQSEFGOLmiJOJZj1X1Jt6bFIur3JpY7+ghliUnfZs0fpWDdHEkn9q7QUlBtKbkn6TepvSxTqnE8l3s0A== + swagger-ui-react@^5.0.0: version "5.9.0" resolved "https://registry.yarnpkg.com/swagger-ui-react/-/swagger-ui-react-5.9.0.tgz#574411a191f454d2451d2f533caa397b503934fd" @@ -27788,6 +30404,23 @@ swagger-ui-react@^5.0.0: xml-but-prettier "^1.0.1" zenscroll "^4.0.2" +swagger2openapi@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" + integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + swc-loader@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.3.tgz#6792f1c2e4c9ae9bf9b933b3e010210e270c186d" @@ -27857,7 +30490,16 @@ tar-stream@^2.0.0, tar-stream@^2.1.4, tar-stream@^2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^6.1.0, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2, tar@^6.2.0: +tar-stream@^3.0.0: + version "3.1.6" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" + integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +tar@^6.1.0, tar@^6.1.11, tar@^6.1.12, tar@^6.1.13, tar@^6.1.15, tar@^6.1.2, tar@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== @@ -27892,6 +30534,17 @@ teeny-request@^8.0.0: stream-events "^1.0.5" uuid "^9.0.0" +teeny-request@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-9.0.0.tgz#18140de2eb6595771b1b02203312dfad79a4716d" + integrity sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g== + dependencies: + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.9" + stream-events "^1.0.5" + uuid "^9.0.0" + telejson@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/telejson/-/telejson-7.2.0.tgz#3994f6c9a8f8d7f2dba9be2c7c5bbb447e876f32" @@ -28024,7 +30677,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -28157,6 +30810,14 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tough-cookie@^4.0.0, tough-cookie@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" @@ -28167,14 +30828,6 @@ tough-cookie@^4.0.0, tough-cookie@^4.1.2: universalify "^0.2.0" url-parse "^1.5.3" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -28199,6 +30852,11 @@ traverse@~0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + tree-sitter-json@=0.20.1: version "0.20.1" resolved "https://registry.yarnpkg.com/tree-sitter-json/-/tree-sitter-json-0.20.1.tgz#d1fe6c59571dd3a987ebb3f5aeef404f37b3a453" @@ -28226,6 +30884,11 @@ treeverse@^2.0.0: resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca" integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A== +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== + trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -28276,6 +30939,11 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-is-present@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ts-is-present/-/ts-is-present-1.2.2.tgz#ba59b4a9d2bc22b99d1ba7f4af3d5eb320408d95" + integrity sha512-cA5MPLWGWYXvnlJb4TamUUx858HVHBsxxdy8l7jxODOLDyGYnQOllob2A2jyDghGa5iJHs2gzFNHvwGJ0ZfR8g== + ts-node@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.0.0.tgz#05f10b9a716b0b624129ad44f0ea05dac84ba3be" @@ -28326,16 +30994,31 @@ tsconfig-paths@^3.14.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.11.1, tslib@^1.13.0, tslib@^1.8.1: +tslib@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tslib@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tslib@^1.11.1, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -28348,6 +31031,15 @@ tty-browserify@0.0.0: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== +tuf-js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" + integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -28456,6 +31148,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -28481,7 +31178,7 @@ type-fest@^3.0.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== -type-is@^1.6.4, type-is@~1.6.18: +type-is@^1.6.16, type-is@^1.6.18, type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -28617,6 +31314,11 @@ typescript@5.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +typescript@^5.2.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + typescript@~5.1.0: version "5.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" @@ -28654,6 +31356,13 @@ uid2@^1.0.0: resolved "https://registry.yarnpkg.com/uid2/-/uid2-1.0.0.tgz#ef8d95a128d7c5c44defa1a3d052eecc17a06bfb" integrity sha512-+I6aJUv63YAcY9n4mQreLUt0d4lvwkkopDNmpomkAUz0fAkEMV9pRWxN0EjhW1YfRhcuyHg2v3mwddCDW1+LFQ== +uid@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/uid/-/uid-2.0.1.tgz#a3f57c962828ea65256cd622fc363028cdf4526b" + integrity sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A== + dependencies: + "@lukeed/csprng" "^1.0.0" + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -28917,6 +31626,20 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -28924,6 +31647,18 @@ uri-js@^4.2.2, uri-js@^4.4.1: dependencies: punycode "^2.1.0" +uri-template@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uri-template/-/uri-template-2.0.0.tgz#0ed7b34f8dd6f48b9774048336d2bcf2b7f55724" + integrity sha512-r/i44nPoo0ktEZDjx+hxp9PSjQuBBfsd6RgCRuuMqCP0FZEp+YE0SpihThI4UGc5ePqQEFsdyZc7UVlowp+LLw== + dependencies: + pct-encode "~1.0.0" + +urijs@^1.19.10: + version "1.19.11" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== + url-join@^4.0.0, url-join@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" @@ -28934,7 +31669,7 @@ url-join@^5.0.0: resolved "https://registry.yarnpkg.com/url-join/-/url-join-5.0.0.tgz#c2f1e5cbd95fa91082a93b58a1f42fecb4bdbcf1" integrity sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA== -url-parse@^1.5.10, url-parse@^1.5.3: +url-parse@^1.4.7, url-parse@^1.5.10, url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -29098,6 +31833,13 @@ validate-npm-package-name@^4.0.0: dependencies: builtins "^5.0.0" +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + validate.io-array@^1.0.3: version "1.0.6" resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" @@ -29128,7 +31870,7 @@ validate.io-number@^1.0.3: resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== -vary@^1, vary@~1.1.2: +vary@^1, vary@^1.1.2, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== @@ -29434,6 +32176,11 @@ walk-up-path@^1.0.0: resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -29456,7 +32203,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -wcwidth@^1.0.0, wcwidth@^1.0.1: +wcwidth@>=1.0.1, wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== @@ -29764,6 +32511,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +which@^3.0.0, which@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -29771,6 +32525,13 @@ wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + winston-transport@^4.5.0: version "4.6.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.6.0.tgz#f1c1a665ad1b366df72199e27892721832a19e1b" @@ -29816,7 +32577,7 @@ wordwrap@^1.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^6.0.1: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -29856,6 +32617,14 @@ write-file-atomic@^4.0.0, write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +write-file-atomic@^5.0.0, write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + ws@^6.1.0: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -30036,7 +32805,7 @@ yargs@^16.0.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.1.1, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: +yargs@^17.0.1, yargs@^17.1.1, yargs@^17.2.1, yargs@^17.3.0, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -30049,6 +32818,11 @@ yargs@^17.1.1, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yarn@^1.22.18: + version "1.22.21" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.21.tgz#1959a18351b811cdeedbd484a8f86c3cc3bbaf72" + integrity sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg== + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" @@ -30057,6 +32831,11 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" +ylru@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785" + integrity sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA== + yml-loader@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/yml-loader/-/yml-loader-2.1.0.tgz#b976b8691b537b6d3dc7d92a9a7d34b90de10870" @@ -30127,6 +32906,15 @@ zip-stream@^4.1.0: compress-commons "^4.1.2" readable-stream "^3.6.0" +zip-stream@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-5.0.1.tgz#cf3293bba121cad98be2ec7f05991d81d9f18134" + integrity sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA== + dependencies: + archiver-utils "^4.0.1" + compress-commons "^5.0.1" + readable-stream "^3.6.0" + zod-to-json-schema@^3.20.4, zod-to-json-schema@^3.21.4: version "3.21.4" resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.21.4.tgz#de97c5b6d4a25e9d444618486cb55c0c7fb949fd"