From ccd19463732e16ffaf8eccda5c367dbc1739c748 Mon Sep 17 00:00:00 2001 From: Kashish Mittal Date: Thu, 6 Feb 2025 08:57:27 -0500 Subject: [PATCH 1/3] chore: add audit-log-node back Signed-off-by: Kashish Mittal --- plugins/audit-log-node/.eslintignore | 2 + plugins/audit-log-node/.eslintrc.js | 1 + plugins/audit-log-node/.lintstagedrc.json | 4 + plugins/audit-log-node/.prettierignore | 12 + plugins/audit-log-node/.prettierrc.js | 20 ++ plugins/audit-log-node/.versionhistory.md | 2 + plugins/audit-log-node/CHANGELOG.md | 61 ++++ plugins/audit-log-node/README.md | 223 ++++++++++++- plugins/audit-log-node/catalog-info.yaml | 51 +++ plugins/audit-log-node/package.json | 69 ++++ .../src/DefaultAuditLogger.test.ts | 295 ++++++++++++++++++ .../audit-log-node/src/DefaultAuditLogger.ts | 152 +++++++++ plugins/audit-log-node/src/index.ts | 13 + plugins/audit-log-node/src/setupTests.ts | 1 + plugins/audit-log-node/src/types.ts | 109 +++++++ plugins/audit-log-node/tsconfig.json | 9 + plugins/audit-log-node/turbo.json | 8 + 17 files changed, 1030 insertions(+), 2 deletions(-) create mode 100644 plugins/audit-log-node/.eslintignore create mode 100644 plugins/audit-log-node/.eslintrc.js create mode 100644 plugins/audit-log-node/.lintstagedrc.json create mode 100644 plugins/audit-log-node/.prettierignore create mode 100644 plugins/audit-log-node/.prettierrc.js create mode 100644 plugins/audit-log-node/.versionhistory.md create mode 100644 plugins/audit-log-node/CHANGELOG.md create mode 100644 plugins/audit-log-node/catalog-info.yaml create mode 100644 plugins/audit-log-node/package.json create mode 100644 plugins/audit-log-node/src/DefaultAuditLogger.test.ts create mode 100644 plugins/audit-log-node/src/DefaultAuditLogger.ts create mode 100644 plugins/audit-log-node/src/index.ts create mode 100644 plugins/audit-log-node/src/setupTests.ts create mode 100644 plugins/audit-log-node/src/types.ts create mode 100644 plugins/audit-log-node/tsconfig.json create mode 100644 plugins/audit-log-node/turbo.json diff --git a/plugins/audit-log-node/.eslintignore b/plugins/audit-log-node/.eslintignore new file mode 100644 index 0000000000..55289f4a23 --- /dev/null +++ b/plugins/audit-log-node/.eslintignore @@ -0,0 +1,2 @@ +dist-dynamic +dist-scalprum diff --git a/plugins/audit-log-node/.eslintrc.js b/plugins/audit-log-node/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/audit-log-node/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/audit-log-node/.lintstagedrc.json b/plugins/audit-log-node/.lintstagedrc.json new file mode 100644 index 0000000000..14b2263def --- /dev/null +++ b/plugins/audit-log-node/.lintstagedrc.json @@ -0,0 +1,4 @@ +{ + "*": "prettier --ignore-unknown --write", + "*.{js,jsx,ts,tsx,mjs,cjs}": "backstage-cli package lint --fix" +} diff --git a/plugins/audit-log-node/.prettierignore b/plugins/audit-log-node/.prettierignore new file mode 100644 index 0000000000..fc8357d99e --- /dev/null +++ b/plugins/audit-log-node/.prettierignore @@ -0,0 +1,12 @@ +dist +dist-types +coverage +.vscode +CHANGELOG.md +generated +templates +*.hbs +renovate.json +dist-dynamic +dist-scalprum +playwright-report diff --git a/plugins/audit-log-node/.prettierrc.js b/plugins/audit-log-node/.prettierrc.js new file mode 100644 index 0000000000..84cbac65b5 --- /dev/null +++ b/plugins/audit-log-node/.prettierrc.js @@ -0,0 +1,20 @@ +// @ts-check + +/** @type {import("@ianvs/prettier-plugin-sort-imports").PrettierConfig} */ +module.exports = { + ...require('@spotify/prettier-config'), + plugins: ['@ianvs/prettier-plugin-sort-imports'], + importOrder: [ + '^react(.*)$', + '', + '^@backstage/(.*)$', + '', + '', + '', + '^@janus-idp/(.*)$', + '', + '', + '', + '^[.]', + ], +}; diff --git a/plugins/audit-log-node/.versionhistory.md b/plugins/audit-log-node/.versionhistory.md new file mode 100644 index 0000000000..558300db82 --- /dev/null +++ b/plugins/audit-log-node/.versionhistory.md @@ -0,0 +1,2 @@ +- Bumped to 1.5.0 in main branch for next release 1.3.0 +- Bumped to 1.8.0 in main branch, in prep for release of 1.4.0 diff --git a/plugins/audit-log-node/CHANGELOG.md b/plugins/audit-log-node/CHANGELOG.md new file mode 100644 index 0000000000..7d70b23ac4 --- /dev/null +++ b/plugins/audit-log-node/CHANGELOG.md @@ -0,0 +1,61 @@ +## @janus-idp/backstage-plugin-audit-log-node [1.4.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-audit-log-node@1.3.0...@janus-idp/backstage-plugin-audit-log-node@1.4.0) (2024-07-25) + +## 1.8.1 + +### Patch Changes + +- 837d5d0: bump express to 4.21.2 + +## 1.8.0 + +### Minor Changes + +- 9671df5: Bump plugins/audit-log-node to 1.8.0 in main branch, in prep for release of 1.4.0 + +## 1.7.1 + +### Patch Changes + +- 0e6bfd3: feat: update Backstage to the latest version + + Update to Backstage 1.32.5 + +## 1.7.0 + +### Minor Changes + +- 8244f28: chore(deps): update to backstage 1.32 + +## 1.6.0 + +### Minor Changes + +- d9551ae: feat(deps): update to backstage 1.31 + +### Patch Changes + +- d9551ae: upgrade to yarn v3 + +### Features + +- **deps:** update to backstage 1.29 ([#1900](https://github.com/janus-idp/backstage-plugins/issues/1900)) ([f53677f](https://github.com/janus-idp/backstage-plugins/commit/f53677fb02d6df43a9de98c43a9f101a6db76802)) + +## @janus-idp/backstage-plugin-audit-log-node [1.3.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-audit-log-node@1.2.0...@janus-idp/backstage-plugin-audit-log-node@1.3.0) (2024-07-23) + +### Features + +- **deps:** update to backstage 1.28 ([#1891](https://github.com/janus-idp/backstage-plugins/issues/1891)) ([1ba1108](https://github.com/janus-idp/backstage-plugins/commit/1ba11088e0de60e90d138944267b83600dc446e5)) + +## @janus-idp/backstage-plugin-audit-log-node [1.2.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-audit-log-node@1.1.0...@janus-idp/backstage-plugin-audit-log-node@1.2.0) (2024-06-13) + +### Features + +- **deps:** update to backstage 1.27 ([#1683](https://github.com/janus-idp/backstage-plugins/issues/1683)) ([a14869c](https://github.com/janus-idp/backstage-plugins/commit/a14869c3f4177049cb8d6552b36c3ffd17e7997d)) + +## @janus-idp/backstage-plugin-audit-log-node [1.1.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-audit-log-node@1.0.3...@janus-idp/backstage-plugin-audit-log-node@1.1.0) (2024-06-05) + +### Features + +- **rbac:** add type checks with generics for audit log ([#1789](https://github.com/janus-idp/backstage-plugins/issues/1789)) ([ac69838](https://github.com/janus-idp/backstage-plugins/commit/ac698382f64fe91e0f9f9232dd3eecd9cc9247be)) + +## @janus-idp/backstage-plugin-audit-log-node [1.0.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-audit-log-node@1.0.2...@janus-idp/backstage-plugin-audit-log-node@1.0.3) (2024-06-04) diff --git a/plugins/audit-log-node/README.md b/plugins/audit-log-node/README.md index 726984fcc6..dfa8815935 100644 --- a/plugins/audit-log-node/README.md +++ b/plugins/audit-log-node/README.md @@ -1,3 +1,222 @@ -# ❗DEPRECATED❗ +# @janus-idp/backstage-plugin-audit-log-node -Starting from Backstage v1.36.0, the Auditor Service will be included in Backstage's core services. As a result, this package is now deprecated. \ No newline at end of file +This package contains common types and utility functions for audit logging the backend + +## Installation + +To install this plugin in a package/plugin, run the following command: + +```console +yarn workspace add @janus-idp/backstage-plugin-audit-log-node +``` + +### Usage + +The audit logging node package contains a helper class for generating audit logs with a common structure, as well as logging them. + +The `auditLog` function can be used to log out an audit log using the backstage `LoggerService`. You can provide a log level to the `auditLog` function. The supported levels are: `info`, `debug`, `warn`, and `error`. If no log level is provided, it defaults to the `info` level. + +Alternatively, if you want to generate the audit log object (does not contain message) without it being logged out for you, the `createAuditLogDetails` helper function of the `DefaultAuditLogger` can be used. + +The `DefaultAuditLogger.createAuditLogDetails` will generate the `actorId` of the actor with the following priority (highest to lowest): + +- The `actorId` provided in the arguments +- The actor id generated from the `express.Request` object provided in the arguments +- `null` if neither of the above fields were provided in the arguments + +#### Event Naming Convention + +It is recommended that you prefix the `eventName` value with the name of the component you are audit logging. This will help with searchability in the central log collector. + +For example, "ScaffolderTaskRead", "CatalogEntityFetch", etc. + +--- + +**IMPORTANT** + +Any fields containing secrets provided to these helper functions should have secrets redacted or else they will be logged as is. + +For the `DefaultAuditLogger`, these fields would include: + +- The `metadata` field +- The following fields in the `request`: + - `request.body` + - `request.params` + - `request.query` +- The `response.body` field + +--- + +The `getActorId` helper function grabs the specified entityRef of the user or service associated with the provided credentials in the provided express Request object. If no request is provided or no user/service was associated to the request, `undefined` is returned. + +### Example + +#### Audit Log Example + +In the following example, we add a simple audit log for the `/health` endpoint of a plugin's router to the `debug` log level. + +```ts plugins/test/src/service/router.ts +import { + AuthService, + HttpAuthService, + LoggerService, +} from '@backstage/backend-plugin-api'; +import { Config } from '@backstage/config'; + +/* highlight-add-start */ +import { DefaultAuditLogger } from '@janus-idp/backstage-plugin-audit-log-node'; + +/* highlight-add-end */ + +export interface RouterOptions { + logger: LoggerService; + config: Config; + auth: AuthService; + httpAuth: HttpAuthService; +} + +export async function createRouter( + options: RouterOptions, +): Promise { + const { logger, config, auth, httpAuth } = options; + + /* highlight-add-start */ + const auditLogger = new DefaultAuditLogger({ + logger, + auth, + httpAuth, + }); + /* highlight-add-end */ + + const router = Router(); + router.use(express.json()); + + router.get('/health', async (request, response) => { + logger.info('PONG!'); + response.json({ status: 'ok' }); + + /* highlight-add-start */ + // Note: if `level` is not provided, it defaults to `info` + auditLogger.auditLog({ + eventName: 'HealthEndpointHit', + stage: 'completion', + status: 'succeeded', + level: 'debug', + request, + response: { + status: 200, + body: { status: 'ok' }, + }, + message: `The Health Endpoint was hit by ${await auditLogger.getActorId( + request, + )}`, + }); + /* highlight-add-end */ + }); + + const middleware = MiddlewareFactory.create({ logger, config }); + + router.use(middleware.error()); + return router; +} +``` + +Assuming the `user:default/tester` user hit requested this endpoint, something similar to the following would be outputted if the logger format is JSON: + +```JSON +{"actor":{"actorId":"user:default/tester","hostname":"localhost","ip":"::1","userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"},"eventName":"HealthEndpointHit","isAuditLog":true,"level":"debug","message":"The Health Endpoint was hit by user:default/tester","meta":{},"plugin":"test","request":{"body": "","method":"GET","params":{},"query":{},"url":"/api/test/health"},"service":"backstage","stage":"completion","status":"succeeded","timestamp":"2024-05-17 11:17:07","type":"plugin"} +``` + +#### Audit Log Error Example + +In the following example, we utilize the `auditLog` utility function to generate and output an error log to the `error` log level: + +```ts plugins/test/src/service/router.ts +import { + AuthService, + HttpAuthService, + LoggerService, +} from '@backstage/backend-plugin-api'; + +/* highlight-add-start */ +import { DefaultAuditLogger } from '@janus-idp/backstage-plugin-audit-log-node'; + +/* highlight-add-end */ + +export interface RouterOptions { + logger: LoggerService; + auth: AuthService; + httpAuth: HttpAuthService; +} + +export async function createRouter( + options: RouterOptions, +): Promise { + const { logger, auth, httpAuth } = options; + + /* highlight-add-start */ + const auditLogger = new DefaultAuditLogger({ + logger, + auth, + httpAuth, + }); + /* highlight-add-end */ + + const router = Router(); + router.use(express.json()); + + router.get('/error', async (request, response) => { + try { + const customErr = new Error('Custom Error Occurred'); + customErr.name = 'CustomError'; + + throw customErr; + + response.json({ + status: 'ok', + }); + } catch (err) { + /* highlight-add-start */ + auditLogger.auditLog({ + eventName: 'ErrorEndpointHit', + stage: 'completion', + status: 'failed', + level: 'error', + request, + response: { + status: 501, + body: { + errors: [ + { + name: (err as Error).name, + message: (err as Error).message, + }, + ], + }, + }, + errors: [customErr], + message: `An error occurred when querying the '/errors' endpoint`, + }); + /* highlight-add-end */ + // Do something with the caught error + response.status(501).json({ + errors: [ + { + name: (err as Error).name, + message: (err as Error).message, + }, + ], + }); + } + }); + router.use(errorHandler()); + return router; +} +``` + +An example error audit log would be in the following form: +Note: the stack trace was removed redacted in this example due to its size. + +```JSON +{"actor":{"actorId":"user:development/guest","hostname":"localhost","ip":"::1","userAgent":"curl/8.2.1"},"errors":[{"message":"Custom Error Occurred","name":"CustomError","stack":"CustomError: Custom Error Occurred\n at STACK_TRACE]"}],"eventName":"ErrorEndpointHit","isAuditLog":true,"level":"error","message":"An error occurred when querying the '/errors' endpoint","meta":{},"plugin":"test","request":{"body":{},"method":"GET","params":{},"query":{},"url":"/api/test/error"},"response":{"body":{"errors":[{"name":"CustomError","message":"Custom Error Occurred"}]},"status":501},"service":"backstage","stage":"completion","status":"failed","timestamp":"2024-05-23 10:09:04"} +``` diff --git a/plugins/audit-log-node/catalog-info.yaml b/plugins/audit-log-node/catalog-info.yaml new file mode 100644 index 0000000000..b2cd5f0260 --- /dev/null +++ b/plugins/audit-log-node/catalog-info.yaml @@ -0,0 +1,51 @@ +# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: janus-idp-audit-log + title: Audit Log plugin + description: Backend for the audit-log + annotations: + backstage.io/source-location: url:https://github.com/janus-idp/backstage-plugins/tree/main/plugins/audit-log-node + backstage.io/view-url: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/audit-log-node/catalog-info.yaml + backstage.io/edit-url: https://github.com/janus-idp/backstage-plugins/edit/main/plugins/audit-log-node/catalog-info.yaml + github.com/project-slug: janus-idp/backstage-plugins + github.com/team-slug: janus-idp/maintainers-plugins + sonarqube.org/project-key: janus-idp_backstage-plugins + links: + - url: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/audit-log-node + title: GitHub Source + icon: source + type: source +spec: + type: backstage-plugin + lifecycle: production + owner: rhdh-team + system: rhdh + subcomponentOf: janus-idp-backstage-plugins +--- +# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: janus-idp-audit-log-node + title: '@janus-idp/backstage-plugin-audit-log-node' + description: Node.js library for the audit-log plugin + annotations: + backstage.io/source-location: url:https://github.com/janus-idp/backstage-plugins/tree/main/plugins/audit-log-node + backstage.io/view-url: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/audit-log-node/catalog-info.yaml + backstage.io/edit-url: https://github.com/janus-idp/backstage-plugins/edit/main/plugins/audit-log-node/catalog-info.yaml + github.com/project-slug: janus-idp/backstage-plugins + github.com/team-slug: janus-idp/maintainers-plugins + sonarqube.org/project-key: janus-idp_backstage-plugins + links: + - url: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/audit-log-node + title: GitHub Source + icon: source + type: source +spec: + type: backstage-node-library + lifecycle: production + owner: rhdh-team + system: rhdh + subcomponentOf: janus-idp-audit-log diff --git a/plugins/audit-log-node/package.json b/plugins/audit-log-node/package.json new file mode 100644 index 0000000000..9f6581e2bb --- /dev/null +++ b/plugins/audit-log-node/package.json @@ -0,0 +1,69 @@ +{ + "name": "@janus-idp/backstage-plugin-audit-log-node", + "description": "Node.js library for the audit-log plugin", + "version": "1.8.1", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "node-library", + "supported-versions": "1.32.5", + "pluginId": "audit-log", + "pluginPackage": "@janus-idp/backstage-plugin-audit-log-node", + "pluginPackages": [ + "@janus-idp/backstage-plugin-audit-log-node" + ] + }, + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint:check": "backstage-cli package lint", + "lint:fix": "backstage-cli package lint --fix", + "postpack": "backstage-cli package postpack", + "prepack": "backstage-cli package prepack", + "start": "backstage-cli package start", + "test": "backstage-cli package test --passWithNoTests --coverage", + "tsc": "tsc", + "prettier:check": "prettier --ignore-unknown --check .", + "prettier:fix": "prettier --ignore-unknown --write ." + }, + "devDependencies": { + "@backstage/backend-plugin-api": "1.0.1", + "@backstage/backend-test-utils": "1.0.2", + "@backstage/cli": "0.28.2", + "@backstage/errors": "1.2.4", + "@backstage/types": "1.1.1", + "@types/lodash": "4.17.5", + "express": "4.21.2", + "jest-express": "1.12.0", + "prettier": "3.3.3" + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "https://github.com/janus-idp/backstage-plugins", + "directory": "plugins/audit-log-node" + }, + "keywords": [ + "support:production", + "lifecycle:active", + "backstage", + "plugin" + ], + "homepage": "https://red.ht/rhdh", + "bugs": "https://github.com/janus-idp/backstage-plugins/issues", + "dependencies": { + "lodash": "^4.17.21" + }, + "maintainers": [ + "@janus-idp/maintainers-plugins" + ], + "author": "Red Hat" +} diff --git a/plugins/audit-log-node/src/DefaultAuditLogger.test.ts b/plugins/audit-log-node/src/DefaultAuditLogger.test.ts new file mode 100644 index 0000000000..6ac67b2cb7 --- /dev/null +++ b/plugins/audit-log-node/src/DefaultAuditLogger.test.ts @@ -0,0 +1,295 @@ +import { mockCredentials, mockServices } from '@backstage/backend-test-utils'; + +import type { Request } from 'express'; +import { Request as JestRequest } from 'jest-express/lib/request'; + +import { DefaultAuditLogger } from './DefaultAuditLogger'; + +describe('DefaultAuditLogger', () => { + const logger = mockServices.logger.mock(); + const loggerSpy: jest.SpyInstance = jest.spyOn(logger, 'info'); + const loggerErrorSpy: jest.SpyInstance = jest.spyOn(logger, 'error'); + + const auditLogger = new DefaultAuditLogger({ + logger, + authService: mockServices.auth({ + pluginId: 'scaffolder', + disableDefaultAuthPolicy: false, + }), + httpAuthService: mockServices.httpAuth({ + pluginId: 'scaffolder', + defaultCredentials: mockCredentials.user(), + }), + }); + + describe('getActorId', () => { + it('Returns nothing if no request is provided', async () => { + const actorId = await auditLogger.getActorId(); + expect(actorId).toBeUndefined(); + }); + it('Returns a user if a request is provided', async () => { + const cred = mockCredentials.user.header('user:default/test'); + const request = new JestRequest(); + request.setHeaders('Authorization', cred); + const actorId = await auditLogger.getActorId( + request as unknown as Request, + ); + + expect(actorId).toEqual('user:default/test'); + }); + it('Returns nothing if request has invalid token', async () => { + const cred = mockCredentials.user.invalidHeader(); + const request = new JestRequest(); + request.setHeaders('Authorization', cred); + const actorId = await auditLogger.getActorId( + request as unknown as Request, + ); + + expect(actorId).toBeUndefined(); + }); + }); + + describe('createAuditLogDetails', () => { + it('Generates an audit log meta object with a null actor if neither actor id or request is provided', async () => { + const auditLogDetails = await auditLogger.createAuditLogDetails({ + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + }); + expect(auditLogDetails).toEqual({ + actor: { + actorId: null, + }, + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + meta: {}, + isAuditLog: true, + }); + }); + it('Generates an audit log meta object with a specified actor if actor id is provided', async () => { + const auditLogDetails = await auditLogger.createAuditLogDetails({ + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + actorId: 'user:default/tester', + }); + expect(auditLogDetails).toEqual({ + actor: { + actorId: 'user:default/tester', + }, + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + meta: {}, + isAuditLog: true, + }); + }); + it('Utilizes the provided actor id over the generated one from request', async () => { + const cred = mockCredentials.user.header('user:default/test'); + const request = new JestRequest('/api/endpoint', { + headers: { + Authorization: cred, + 'User-Agent': + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', + }, + }); + request.setIps('::1'); + request.setMethod('GET'); + request.setHostname('localhost'); + + const auditLogDetails = await auditLogger.createAuditLogDetails({ + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + actorId: 'user:default/tester', + request: request as unknown as Request, + }); + expect(auditLogDetails).toEqual({ + actor: { + actorId: 'user:default/tester', + ip: '::1', + hostname: 'localhost', + userAgent: + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', + }, + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + meta: {}, + isAuditLog: true, + request: { + method: 'GET', + body: '', + params: {}, + query: {}, + url: '/api/endpoint', + }, + }); + }); + it('Generates an audit log meta object with relevant audit information from a request and response', async () => { + const cred = mockCredentials.user.header('user:default/test'); + + const request = new JestRequest( + '/api/endpoint/a-random-id?query=test&other=thing', + { + headers: { + Authorization: cred, + 'User-Agent': + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', + }, + }, + ); + request.setIps('::1'); + request.setMethod('POST'); + request.setParams({ id: 'a-random-id' }); + request.setHostname('localhost'); + request.setBody({ + value: { + greatValue: 'blueberries', + }, + }); + + const response = { + status: 200, + body: { + content: 'wow', + }, + }; + + const auditLogDetails = await auditLogger.createAuditLogDetails({ + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + request: request as unknown as Request, + response, + metadata: { + test: 'value', + nested: { + inner: 'field', + }, + }, + }); + expect(auditLogDetails).toEqual({ + actor: { + actorId: 'user:default/test', + ip: '::1', + hostname: 'localhost', + userAgent: + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', + }, + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + meta: { + test: 'value', + nested: { + inner: 'field', + }, + }, + isAuditLog: true, + request: { + method: 'POST', + body: { + value: { + greatValue: 'blueberries', + }, + }, + params: { id: 'a-random-id' }, + query: { + query: 'test', + other: 'thing', + }, + url: '/api/endpoint/a-random-id?query=test&other=thing', + }, + response: response, + }); + }); + it('Generates audit logs for errors', async () => { + const customError = new Error( + 'This is a test error, so pay no attention to it', + ); + customError.name = 'TestError'; + + const auditLogDetails = await auditLogger.createAuditLogDetails({ + eventName: 'TestAuditLog', + stage: 'completion', + status: 'failed', + actorId: 'user:default/tester', + errors: [customError], + }); + + expect(auditLogDetails).toEqual({ + actor: { + actorId: 'user:default/tester', + }, + eventName: 'TestAuditLog', + stage: 'completion', + status: 'failed', + errors: [ + { + name: customError.name, + message: customError.message, + stack: customError.stack, + }, + ], + meta: {}, + isAuditLog: true, + }); + }); + }); + + describe('auditLog', () => { + it('Outputs the audit log to the info level of the logger', async () => { + await auditLogger.auditLog({ + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + actorId: 'user:default/tester', + message: 'Audit Log Triggered', + }); + expect(loggerSpy).toHaveBeenCalledWith('Audit Log Triggered', { + actor: { + actorId: 'user:default/tester', + }, + eventName: 'TestAuditLog', + stage: 'completion', + status: 'succeeded', + isAuditLog: true, + meta: {}, + }); + }); + it('Outputs the audit error log to the error level of the logger', async () => { + const customError = new Error( + 'This is a test error, so pay no attention to it', + ); + customError.name = 'TestError'; + await auditLogger.auditLog({ + eventName: 'TestAuditLog', + stage: 'completion', + status: 'failed', + level: 'error', + actorId: 'user:default/tester', + errors: [customError], + message: 'Audit Log Triggered', + }); + expect(loggerErrorSpy).toHaveBeenCalledWith('Audit Log Triggered', { + actor: { + actorId: 'user:default/tester', + }, + eventName: 'TestAuditLog', + stage: 'completion', + status: 'failed', + isAuditLog: true, + meta: {}, + errors: [ + { + name: customError.name, + message: customError.message, + stack: customError.stack, + }, + ], + }); + }); + }); +}); diff --git a/plugins/audit-log-node/src/DefaultAuditLogger.ts b/plugins/audit-log-node/src/DefaultAuditLogger.ts new file mode 100644 index 0000000000..f3821652f0 --- /dev/null +++ b/plugins/audit-log-node/src/DefaultAuditLogger.ts @@ -0,0 +1,152 @@ +import type { + AuthService, + HttpAuthService, + LoggerService, +} from '@backstage/backend-plugin-api'; +import type { ErrorLike } from '@backstage/errors'; +import type { JsonObject, JsonValue } from '@backstage/types'; + +import type { Request } from 'express'; +import { cloneDeep } from 'lodash'; + +import { + ActorDetails, + AuditLogDetails, + AuditLogDetailsOptions, + AuditLogger, + AuditLoggerOptions, + AuditLogOptions, +} from './types'; + +export class DefaultAuditLogger implements AuditLogger { + private readonly logger: LoggerService; + private readonly authService: AuthService; + private readonly httpAuthService: HttpAuthService; + + constructor(options: AuditLoggerOptions) { + this.logger = options.logger; + this.authService = options.authService; + this.httpAuthService = options.httpAuthService; + } + + async getActorId(request?: Request): Promise { + if (!(request && this.httpAuthService && this.authService)) { + return undefined; + } + try { + const credentials = await this.httpAuthService.credentials(request); + const userEntityRef = this.authService.isPrincipal(credentials, 'user') + ? credentials.principal.userEntityRef + : undefined; + + const serviceEntityRef = this.authService.isPrincipal( + credentials, + 'service', + ) + ? credentials.principal.subject + : undefined; + + return userEntityRef ?? serviceEntityRef; + } catch { + return undefined; + } + } + async createAuditLogDetails( + options: AuditLogDetailsOptions, + ): Promise { + const { eventName, stage, metadata, request, response, status } = options; + + const actorId = options.actorId || (await this.getActorId(request)) || null; + + // Secrets in the body field should be redacted by the user before passing in the request object + const auditRequest = request + ? { + method: request.method, + url: request.originalUrl, + params: cloneDeep(request.params), + query: cloneDeep(request.query), + body: cloneDeep(request.body), + } + : undefined; + + const actor: ActorDetails = { actorId }; + if (request) { + actor.ip = request.ip; + actor.hostname = request.hostname; + actor.userAgent = request.get('user-agent'); + } + + const auditLogCommonDetails = { + actor: cloneDeep(actor), + meta: cloneDeep(metadata) || {}, + request: auditRequest, + isAuditLog: true as const, + response: cloneDeep(response), + eventName, + stage, + }; + + if (status === 'failed') { + const errs = cloneDeep(options.errors) as ErrorLike[]; + return { + ...auditLogCommonDetails, + status, + errors: errs.map(err => { + return { + name: err.name, + message: err.message, + stack: err.stack, + }; + }), + }; + } + + return { + ...auditLogCommonDetails, + status, + }; + } + async auditLog( + options: AuditLogOptions, + ): Promise { + let auditLogDetails: AuditLogDetails; + const logLevel = options.level || 'info'; + const auditLogCommonDetails = { + eventName: options.eventName, + stage: options.stage, + actorId: options.actorId, + request: options.request, + response: options.response, + metadata: options.metadata, + }; + if (options.status === 'failed') { + auditLogDetails = await this.createAuditLogDetails({ + ...auditLogCommonDetails, + status: options.status, + errors: options.errors, + }); + } else { + auditLogDetails = await this.createAuditLogDetails({ + ...auditLogCommonDetails, + status: options.status, + }); + } + + switch (logLevel) { + case 'info': + this.logger.info(options.message, auditLogDetails as JsonObject); + return; + case 'debug': + this.logger.debug(options.message, auditLogDetails as JsonObject); + return; + case 'warn': + this.logger.warn(options.message, auditLogDetails as JsonObject); + return; + case 'error': + this.logger.error(options.message, auditLogDetails as JsonObject); + return; + default: + throw new Error(`Log level of ${logLevel} is not supported`); + } + } +} diff --git a/plugins/audit-log-node/src/index.ts b/plugins/audit-log-node/src/index.ts new file mode 100644 index 0000000000..ea04300032 --- /dev/null +++ b/plugins/audit-log-node/src/index.ts @@ -0,0 +1,13 @@ +/***/ +/** + * Node.js library for common audit logging types and functions + * + * @packageDocumentation + */ + +/** + * Default Audit Logger for constructing audit logs + * @public + */ +export * from './DefaultAuditLogger'; +export * from './types'; diff --git a/plugins/audit-log-node/src/setupTests.ts b/plugins/audit-log-node/src/setupTests.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/plugins/audit-log-node/src/setupTests.ts @@ -0,0 +1 @@ +export {}; diff --git a/plugins/audit-log-node/src/types.ts b/plugins/audit-log-node/src/types.ts new file mode 100644 index 0000000000..22e9c6b264 --- /dev/null +++ b/plugins/audit-log-node/src/types.ts @@ -0,0 +1,109 @@ +import type { + AuthService, + HttpAuthService, + LoggerService, +} from '@backstage/backend-plugin-api'; +import type { ErrorLike } from '@backstage/errors'; +import type { JsonValue } from '@backstage/types'; + +import type { Request } from 'express'; + +export type ActorDetails = { + actorId: string | null; + ip?: string; + hostname?: string; + userAgent?: string; +}; + +export type AuditRequest = { + body: any; + url: string; + method: string; + params?: any; + query?: any; +}; + +export type AuditResponse = { + status: number; + body?: any; +}; +export type AuditLogSuccessStatus = { status: 'succeeded' }; +export type AuditLogFailureStatus = { + status: 'failed'; + errors: ErrorLike[]; +}; +export type AuditLogUnknownFailureStatus = { + status: 'failed'; + errors: unknown[]; +}; + +export type AuditLogStatus = AuditLogSuccessStatus | AuditLogFailureStatus; + +/** + * Common fields of an audit log. Note: timestamp and pluginId are automatically added at log creation. + * + * @public + */ +export type AuditLogDetails = { + actor: ActorDetails; + eventName: string; + stage: string; + request?: AuditRequest; + response?: AuditResponse; + meta: JsonValue; + isAuditLog: true; +} & AuditLogStatus; + +export type AuditLogDetailsOptions = { + eventName: string; + stage: string; + metadata?: T; + response?: AuditResponse; + actorId?: string; + request?: Request; +} & (AuditLogSuccessStatus | AuditLogUnknownFailureStatus); + +export type AuditLogOptions = { + eventName: string; + message: string; + stage: string; + level?: 'info' | 'debug' | 'warn' | 'error'; + actorId?: string; + metadata?: T; + response?: AuditResponse; + request?: Request; +} & (AuditLogSuccessStatus | AuditLogUnknownFailureStatus); + +export type AuditLoggerOptions = { + logger: LoggerService; + authService: AuthService; + httpAuthService: HttpAuthService; +}; + +export interface AuditLogger { + /** + * Processes an express request and obtains the actorId from it. Returns undefined if actorId is not obtainable. + * + * @public + */ + getActorId(request?: Request): Promise; + + /** + * Generates the audit log details to place in the metadata argument of the logger + * + * Secrets in the metadata field and request body, params and query field should be redacted by the user before passing in the request object + * @public + */ + createAuditLogDetails( + options: AuditLogDetailsOptions, + ): Promise; + + /** + * Generates an Audit Log and logs it at the level passed by the user. + * Supports `info`, `debug`, `warn` or `error` level. Defaults to `info` if no level is passed. + * + * Secrets in the metadata field and request body, params and query field should be redacted by the user before passing in the request object + * @public + */ + auditLog(options: AuditLogOptions): Promise; +} diff --git a/plugins/audit-log-node/tsconfig.json b/plugins/audit-log-node/tsconfig.json new file mode 100644 index 0000000000..9213e846e0 --- /dev/null +++ b/plugins/audit-log-node/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@backstage/cli/config/tsconfig.json", + "include": ["src"], + "exclude": ["node_modules"], + "compilerOptions": { + "outDir": "../../dist-types/plugins/audit-log-node", + "rootDir": "." + } +} diff --git a/plugins/audit-log-node/turbo.json b/plugins/audit-log-node/turbo.json new file mode 100644 index 0000000000..21e5295a89 --- /dev/null +++ b/plugins/audit-log-node/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "tasks": { + "tsc": { + "outputs": ["../../dist-types/plugins/audit-log-node/**"] + } + } +} From ec42e9b968fb03a3e7e47d1cf00a36f6ca4dcc8f Mon Sep 17 00:00:00 2001 From: Kashish Mittal Date: Thu, 6 Feb 2025 09:00:19 -0500 Subject: [PATCH 2/3] regen yarn Signed-off-by: Kashish Mittal --- yarn.lock | 1050 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1017 insertions(+), 33 deletions(-) diff --git a/yarn.lock b/yarn.lock index 124b29ae24..dba5bce7d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3078,6 +3078,25 @@ __metadata: languageName: node linkType: hard +"@backstage/backend-plugin-api@npm:1.0.1": + version: 1.0.1 + resolution: "@backstage/backend-plugin-api@npm:1.0.1" + dependencies: + "@backstage/cli-common": ^0.1.14 + "@backstage/config": ^1.2.0 + "@backstage/errors": ^1.2.4 + "@backstage/plugin-auth-node": ^0.5.3 + "@backstage/plugin-permission-common": ^0.8.1 + "@backstage/types": ^1.1.1 + "@types/express": ^4.17.6 + "@types/luxon": ^3.0.0 + express: ^4.17.1 + knex: ^3.0.0 + luxon: ^3.0.0 + checksum: a0d1dce15c1c90eec64e4f8d7d2eddd4ab43ebf4573db041b1ee835f27939e97eb162c20661fbafb3e8bc223c422512eea1a0327700164e51e328d620ca925c8 + languageName: node + linkType: hard + "@backstage/backend-plugin-api@npm:^1.0.0, @backstage/backend-plugin-api@npm:^1.0.1, @backstage/backend-plugin-api@npm:^1.1.1": version: 1.1.1 resolution: "@backstage/backend-plugin-api@npm:1.1.1" @@ -3096,6 +3115,44 @@ __metadata: languageName: node linkType: hard +"@backstage/backend-test-utils@npm:1.0.2": + version: 1.0.2 + resolution: "@backstage/backend-test-utils@npm:1.0.2" + dependencies: + "@backstage/backend-app-api": ^1.0.1 + "@backstage/backend-defaults": ^0.5.2 + "@backstage/backend-plugin-api": ^1.0.1 + "@backstage/config": ^1.2.0 + "@backstage/errors": ^1.2.4 + "@backstage/plugin-auth-node": ^0.5.3 + "@backstage/plugin-events-node": ^0.4.2 + "@backstage/types": ^1.1.1 + "@keyv/memcache": ^1.3.5 + "@keyv/redis": ^2.5.3 + "@types/express": ^4.17.6 + "@types/express-serve-static-core": ^4.17.5 + "@types/keyv": ^4.2.0 + "@types/qs": ^6.9.6 + better-sqlite3: ^11.0.0 + cookie: ^0.7.0 + express: ^4.17.1 + fs-extra: ^11.0.0 + keyv: ^4.5.2 + knex: ^3.0.0 + msw: ^1.0.0 + mysql2: ^3.0.0 + pg: ^8.11.3 + pg-connection-string: ^2.3.0 + testcontainers: ^10.0.0 + textextensions: ^5.16.0 + uuid: ^9.0.0 + yn: ^4.0.0 + peerDependencies: + "@types/jest": "*" + checksum: c45d663b7aec8b3b821f8a7cd37a4fdb6a70164eb31fd16f52b5a9261982829dc3f499f1094f0ae5ab9b4539608440f45ef0a7cc1cfc671df816bc48e585351f + languageName: node + linkType: hard + "@backstage/catalog-client@npm:^1.7.1, @backstage/catalog-client@npm:^1.9.1": version: 1.9.1 resolution: "@backstage/catalog-client@npm:1.9.1" @@ -3143,6 +3200,158 @@ __metadata: languageName: node linkType: hard +"@backstage/cli@npm:0.28.2": + version: 0.28.2 + resolution: "@backstage/cli@npm:0.28.2" + dependencies: + "@backstage/catalog-model": ^1.7.0 + "@backstage/cli-common": ^0.1.14 + "@backstage/cli-node": ^0.2.9 + "@backstage/config": ^1.2.0 + "@backstage/config-loader": ^1.9.1 + "@backstage/errors": ^1.2.4 + "@backstage/eslint-plugin": ^0.1.10 + "@backstage/integration": ^1.15.1 + "@backstage/release-manifests": ^0.0.11 + "@backstage/types": ^1.1.1 + "@manypkg/get-packages": ^1.1.3 + "@module-federation/enhanced": ^0.6.0 + "@octokit/graphql": ^5.0.0 + "@octokit/graphql-schema": ^13.7.0 + "@octokit/oauth-app": ^4.2.0 + "@octokit/request": ^6.0.0 + "@pmmmwh/react-refresh-webpack-plugin": ^0.5.7 + "@rollup/plugin-commonjs": ^26.0.0 + "@rollup/plugin-json": ^6.0.0 + "@rollup/plugin-node-resolve": ^15.0.0 + "@rollup/plugin-yaml": ^4.0.0 + "@spotify/eslint-config-base": ^15.0.0 + "@spotify/eslint-config-react": ^15.0.0 + "@spotify/eslint-config-typescript": ^15.0.0 + "@sucrase/webpack-loader": ^2.0.0 + "@svgr/core": 6.5.x + "@svgr/plugin-jsx": 6.5.x + "@svgr/plugin-svgo": 6.5.x + "@svgr/rollup": 6.5.x + "@svgr/webpack": 6.5.x + "@swc/core": ^1.3.46 + "@swc/helpers": ^0.5.0 + "@swc/jest": ^0.2.22 + "@types/jest": ^29.5.11 + "@types/webpack-env": ^1.15.2 + "@typescript-eslint/eslint-plugin": ^6.12.0 + "@typescript-eslint/parser": ^6.7.2 + "@yarnpkg/lockfile": ^1.1.0 + "@yarnpkg/parsers": ^3.0.0 + bfj: ^8.0.0 + buffer: ^6.0.3 + chalk: ^4.0.0 + chokidar: ^3.3.1 + commander: ^12.0.0 + cross-fetch: ^4.0.0 + cross-spawn: ^7.0.3 + css-loader: ^6.5.1 + ctrlc-windows: ^2.1.0 + esbuild: ^0.24.0 + esbuild-loader: ^4.0.0 + eslint: ^8.6.0 + eslint-config-prettier: ^9.0.0 + eslint-formatter-friendly: ^7.0.0 + eslint-plugin-deprecation: ^2.0.0 + eslint-plugin-import: ^2.25.4 + eslint-plugin-jest: ^28.0.0 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + eslint-plugin-unused-imports: ^3.0.0 + eslint-webpack-plugin: ^4.0.0 + express: ^4.17.1 + fork-ts-checker-webpack-plugin: ^9.0.0 + fs-extra: ^11.2.0 + git-url-parse: ^15.0.0 + glob: ^7.1.7 + global-agent: ^3.0.0 + globby: ^11.1.0 + handlebars: ^4.7.3 + html-webpack-plugin: ^5.3.1 + inquirer: ^8.2.0 + jest: ^29.7.0 + jest-cli: ^29.7.0 + jest-css-modules: ^2.1.0 + jest-environment-jsdom: ^29.0.2 + jest-runtime: ^29.0.2 + json-schema: ^0.4.0 + lodash: ^4.17.21 + mini-css-extract-plugin: ^2.4.2 + minimatch: ^9.0.0 + node-fetch: ^2.7.0 + node-libs-browser: ^2.2.1 + npm-packlist: ^5.0.0 + ora: ^5.3.0 + p-limit: ^3.1.0 + p-queue: ^6.6.2 + pirates: ^4.0.6 + postcss: ^8.1.0 + process: ^0.11.10 + raw-loader: ^4.0.2 + react-dev-utils: ^12.0.0-next.60 + react-refresh: ^0.14.0 + recursive-readdir: ^2.2.2 + replace-in-file: ^7.1.0 + rollup: ^4.0.0 + rollup-plugin-dts: ^6.1.0 + rollup-plugin-esbuild: ^6.1.1 + rollup-plugin-postcss: ^4.0.0 + rollup-pluginutils: ^2.8.2 + run-script-webpack-plugin: ^0.2.0 + semver: ^7.5.3 + style-loader: ^3.3.1 + sucrase: ^3.20.2 + swc-loader: ^0.2.3 + tar: ^6.1.12 + terser-webpack-plugin: ^5.1.3 + ts-morph: ^23.0.0 + util: ^0.12.3 + webpack: ^5.94.0 + webpack-dev-server: ^5.0.0 + webpack-node-externals: ^3.0.0 + yaml: ^2.0.0 + yargs: ^16.2.0 + yml-loader: ^2.1.0 + yn: ^4.0.0 + zod: ^3.22.4 + peerDependencies: + "@modyfi/vite-plugin-yaml": ^1.1.0 + "@rspack/core": ^1.0.10 + "@rspack/dev-server": ^1.0.9 + "@rspack/plugin-react-refresh": ^1.0.0 + "@vitejs/plugin-react": ^4.0.4 + vite: ^4.4.9 + vite-plugin-html: ^3.2.0 + vite-plugin-node-polyfills: ^0.22.0 + peerDependenciesMeta: + "@modyfi/vite-plugin-yaml": + optional: true + "@rspack/core": + optional: true + "@rspack/dev-server": + optional: true + "@rspack/plugin-react-refresh": + optional: true + "@vitejs/plugin-react": + optional: true + vite: + optional: true + vite-plugin-html: + optional: true + vite-plugin-node-polyfills: + optional: true + bin: + backstage-cli: bin/backstage-cli + checksum: 32e75a897a7a7b14df6ce43b66fdd5c9fb11b54b88fd3655257055536c77d38bf2d0c5fefbd44348f6250493673396c566eab695007f89d870757956ef659159 + languageName: node + linkType: hard + "@backstage/cli@npm:0.29.5": version: 0.29.5 resolution: "@backstage/cli@npm:0.29.5" @@ -3460,6 +3669,16 @@ __metadata: languageName: node linkType: hard +"@backstage/errors@npm:1.2.4": + version: 1.2.4 + resolution: "@backstage/errors@npm:1.2.4" + dependencies: + "@backstage/types": ^1.1.1 + serialize-error: ^8.0.1 + checksum: ed988b2d3594a2fe989dd45fe197154e522194e30602552224e4a2bf6ed895c671e7f832d5c01b8e24881484698ccf3abaf2930dba5374bccfdaa283f4850fb9 + languageName: node + linkType: hard + "@backstage/errors@npm:^1.2.4, @backstage/errors@npm:^1.2.7": version: 1.2.7 resolution: "@backstage/errors@npm:1.2.7" @@ -5296,6 +5515,15 @@ __metadata: languageName: node linkType: hard +"@backstage/release-manifests@npm:^0.0.11": + version: 0.0.11 + resolution: "@backstage/release-manifests@npm:0.0.11" + dependencies: + cross-fetch: ^4.0.0 + checksum: c03a21524436f1e423a40ac15f685b7f13ce3205e2684ce859571db3b70c78d783b3e1702ba3ffb2ba2d446f7444e8c592c6696b7c618fbf6648e91cb4c4fe07 + languageName: node + linkType: hard + "@backstage/release-manifests@npm:^0.0.12": version: 0.0.12 resolution: "@backstage/release-manifests@npm:0.0.12" @@ -5355,6 +5583,13 @@ __metadata: languageName: node linkType: hard +"@backstage/types@npm:1.1.1": + version: 1.1.1 + resolution: "@backstage/types@npm:1.1.1" + checksum: 54bd9e53570cf2a7a8d9ae30e7181ee6b669b7f543949391a2168f616e1f7b13f0419f324941a87aa15f723d0313eda8f212db2077675421d6f91484f477c4f5 + languageName: node + linkType: hard + "@backstage/types@npm:^1.1.1, @backstage/types@npm:^1.2.1": version: 1.2.1 resolution: "@backstage/types@npm:1.2.1" @@ -6880,7 +7115,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 @@ -6918,6 +7153,13 @@ __metadata: languageName: node linkType: hard +"@fastify/busboy@npm:^2.0.0": + version: 2.1.1 + resolution: "@fastify/busboy@npm:2.1.1" + checksum: 42c32ef75e906c9a4809c1e1930a5ca6d4ddc8d138e1a8c8ba5ea07f997db32210617d23b2e4a85fe376316a41a1a0439fc6ff2dedf5126d96f45a9d80754fb2 + languageName: node + linkType: hard + "@floating-ui/core@npm:^1.6.0": version: 1.6.8 resolution: "@floating-ui/core@npm:1.6.8" @@ -7576,14 +7818,22 @@ __metadata: languageName: node linkType: hard -"@janus-idp/backstage-plugin-audit-log-node@npm:^1.7.1": - version: 1.8.1 - resolution: "@janus-idp/backstage-plugin-audit-log-node@npm:1.8.1" - dependencies: +"@janus-idp/backstage-plugin-audit-log-node@^1.7.1, @janus-idp/backstage-plugin-audit-log-node@workspace:plugins/audit-log-node": + version: 0.0.0-use.local + resolution: "@janus-idp/backstage-plugin-audit-log-node@workspace:plugins/audit-log-node" + dependencies: + "@backstage/backend-plugin-api": 1.0.1 + "@backstage/backend-test-utils": 1.0.2 + "@backstage/cli": 0.28.2 + "@backstage/errors": 1.2.4 + "@backstage/types": 1.1.1 + "@types/lodash": 4.17.5 + express: 4.21.2 + jest-express: 1.12.0 lodash: ^4.17.21 - checksum: 56e854c94663e14c963dbf43564fe1d94f8b55e827aa6b962a5740ad41b1cc100fb729f91245546f305cd9189127426d4c054fa80bbd92bfd5ec191bc73687ee - languageName: node - linkType: hard + prettier: 3.3.3 + languageName: unknown + linkType: soft "@janus-idp/backstage-plugin-rbac-backend@npm:*": version: 5.2.2 @@ -8635,6 +8885,17 @@ __metadata: languageName: node linkType: hard +"@module-federation/bridge-react-webpack-plugin@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/bridge-react-webpack-plugin@npm:0.6.16" + dependencies: + "@module-federation/sdk": 0.6.16 + "@types/semver": 7.5.8 + semver: 7.6.3 + checksum: 9b49f8788bc741279e80cbc7b19980aa0d75e689c5ca08f1a19879d1f921f20e23e54ffc3fdc47010b90786130266d04395f46681d15ffe89f9d57e4e7575882 + languageName: node + linkType: hard + "@module-federation/bridge-react-webpack-plugin@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/bridge-react-webpack-plugin@npm:0.8.9" @@ -8646,6 +8907,20 @@ __metadata: languageName: node linkType: hard +"@module-federation/data-prefetch@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/data-prefetch@npm:0.6.16" + dependencies: + "@module-federation/runtime": 0.6.16 + "@module-federation/sdk": 0.6.16 + fs-extra: 9.1.0 + peerDependencies: + react: ">=16.9.0" + react-dom: ">=16.9.0" + checksum: cac7dc921abb1f3209e2afd7d4f21a21de525babcbd4afed69e61b2261cf7f18b6f1d9db4be005d1b60f968a03e222639e918253591c23f0be925fb84c952326 + languageName: node + linkType: hard + "@module-federation/data-prefetch@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/data-prefetch@npm:0.8.9" @@ -8660,6 +8935,36 @@ __metadata: languageName: node linkType: hard +"@module-federation/dts-plugin@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/dts-plugin@npm:0.6.16" + dependencies: + "@module-federation/error-codes": 0.6.14 + "@module-federation/managers": 0.6.16 + "@module-federation/sdk": 0.6.16 + "@module-federation/third-party-dts-extractor": 0.6.16 + adm-zip: ^0.5.10 + ansi-colors: ^4.1.3 + axios: ^1.7.4 + chalk: 3.0.0 + fs-extra: 9.1.0 + isomorphic-ws: 5.0.0 + koa: 2.15.3 + lodash.clonedeepwith: 4.5.0 + log4js: 6.9.1 + node-schedule: 2.1.1 + rambda: ^9.1.0 + ws: 8.18.0 + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ">=1.0.24" + peerDependenciesMeta: + vue-tsc: + optional: true + checksum: 6d1eae570d0234f5adfb3971c8b4b09054fc6e7bff5e06241a5a7ca699c2b22b306d74d391ccaf01ed7ef71541f87c61829342d6a65bd5234f0fcbb36a21626d + languageName: node + linkType: hard + "@module-federation/dts-plugin@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/dts-plugin@npm:0.8.9" @@ -8690,6 +8995,35 @@ __metadata: languageName: node linkType: hard +"@module-federation/enhanced@npm:^0.6.0": + version: 0.6.16 + resolution: "@module-federation/enhanced@npm:0.6.16" + dependencies: + "@module-federation/bridge-react-webpack-plugin": 0.6.16 + "@module-federation/data-prefetch": 0.6.16 + "@module-federation/dts-plugin": 0.6.16 + "@module-federation/managers": 0.6.16 + "@module-federation/manifest": 0.6.16 + "@module-federation/rspack": 0.6.16 + "@module-federation/runtime-tools": 0.6.16 + "@module-federation/sdk": 0.6.16 + btoa: ^1.2.1 + upath: 2.0.1 + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ">=1.0.24" + webpack: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + webpack: + optional: true + checksum: bb1f6566ed176e414816bfc22352f14b5ac45b1fa1655d8d403bde13145d8d0f9c54767d14b9b4fb2210eb5f406f3dd93826bcac1e2303be6bbaccb7eb78ab23 + languageName: node + linkType: hard + "@module-federation/enhanced@npm:^0.8.0": version: 0.8.9 resolution: "@module-federation/enhanced@npm:0.8.9" @@ -8721,6 +9055,13 @@ __metadata: languageName: node linkType: hard +"@module-federation/error-codes@npm:0.6.14": + version: 0.6.14 + resolution: "@module-federation/error-codes@npm:0.6.14" + checksum: d487eebb8990c0ea712dc61813f54c487c0e3549cf21239db28dfa18b5c97ae79bad5134db90aa67aee74f5af5c01d115c7aa66a66a81b098dd75f40e158fcc6 + languageName: node + linkType: hard + "@module-federation/error-codes@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/error-codes@npm:0.8.9" @@ -8737,6 +9078,17 @@ __metadata: languageName: node linkType: hard +"@module-federation/managers@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/managers@npm:0.6.16" + dependencies: + "@module-federation/sdk": 0.6.16 + find-pkg: 2.0.0 + fs-extra: 9.1.0 + checksum: 6b4e3a585aa2655134152752f2951ec1e913261510bfe714e19040da6d44a40800f7ca514d56f2ad04788d7501b886f3fcfb203900c6a25b7b8228a5459f6d33 + languageName: node + linkType: hard + "@module-federation/managers@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/managers@npm:0.8.9" @@ -8748,6 +9100,19 @@ __metadata: languageName: node linkType: hard +"@module-federation/manifest@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/manifest@npm:0.6.16" + dependencies: + "@module-federation/dts-plugin": 0.6.16 + "@module-federation/managers": 0.6.16 + "@module-federation/sdk": 0.6.16 + chalk: 3.0.0 + find-pkg: 2.0.0 + checksum: fee3254347f927756fcf4d64ede32b93326f976292d7540ebb238fad5ea81c003f030a6020d042239f1f54568ed79e5eafa21e812f763d5961c6827b60be59f7 + languageName: node + linkType: hard + "@module-federation/manifest@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/manifest@npm:0.8.9" @@ -8761,6 +9126,28 @@ __metadata: languageName: node linkType: hard +"@module-federation/rspack@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/rspack@npm:0.6.16" + dependencies: + "@module-federation/bridge-react-webpack-plugin": 0.6.16 + "@module-federation/dts-plugin": 0.6.16 + "@module-federation/managers": 0.6.16 + "@module-federation/manifest": 0.6.16 + "@module-federation/runtime-tools": 0.6.16 + "@module-federation/sdk": 0.6.16 + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ">=1.0.24" + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + checksum: afc98f64d3270e952ff0425ddd71b13b48644306679d3a4466d38a80c855682951a4b5c1b662fa63619ffad8400d6e7029b762aefd99e7169ee431f12c278e78 + languageName: node + linkType: hard + "@module-federation/rspack@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/rspack@npm:0.8.9" @@ -8795,6 +9182,16 @@ __metadata: languageName: node linkType: hard +"@module-federation/runtime-tools@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/runtime-tools@npm:0.6.16" + dependencies: + "@module-federation/runtime": 0.6.16 + "@module-federation/webpack-bundler-runtime": 0.6.16 + checksum: 53aa76f2563e978e9f610e9276e6f3f6e73ecbf19f3cc349d0762955e748c43ec08a74f248cb697eb31d8109869f05f0f8dda1d6d082436ec246393d0011ac95 + languageName: node + linkType: hard + "@module-federation/runtime-tools@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/runtime-tools@npm:0.8.9" @@ -8805,6 +9202,16 @@ __metadata: languageName: node linkType: hard +"@module-federation/runtime@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/runtime@npm:0.6.16" + dependencies: + "@module-federation/error-codes": 0.6.14 + "@module-federation/sdk": 0.6.16 + checksum: d247b4b8ce38f84692da6a3711cdd6d35c4de7885a4639720d4df2436900d66ba2a1b815f64064b95e6aee9fb7082e4d1c6fe1e8ccecd8ddcfaef38379153bbd + languageName: node + linkType: hard + "@module-federation/runtime@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/runtime@npm:0.8.9" @@ -8816,6 +9223,15 @@ __metadata: languageName: node linkType: hard +"@module-federation/sdk@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/sdk@npm:0.6.16" + dependencies: + isomorphic-rslog: 0.0.5 + checksum: 4495af06a83cbf69da6f6c20b0e8b934382b7b5e9a1b56a3385756476e97750beeb0f4b2671dbc64a3c2ab4a5fdb1f99aafd7562f47a4894352fff75d9499ce8 + languageName: node + linkType: hard + "@module-federation/sdk@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/sdk@npm:0.8.9" @@ -8825,6 +9241,17 @@ __metadata: languageName: node linkType: hard +"@module-federation/third-party-dts-extractor@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/third-party-dts-extractor@npm:0.6.16" + dependencies: + find-pkg: 2.0.0 + fs-extra: 9.1.0 + resolve: 1.22.8 + checksum: 2f2317d3703a084a2ff11152a376276a9462954da624a6d69ab265868fb2fedeaeeb1486721f9fff0f3c15d81e3336bf71f90fabe8d4ed4cde4c4d0b5a8ff8be + languageName: node + linkType: hard + "@module-federation/third-party-dts-extractor@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/third-party-dts-extractor@npm:0.8.9" @@ -8836,6 +9263,16 @@ __metadata: languageName: node linkType: hard +"@module-federation/webpack-bundler-runtime@npm:0.6.16": + version: 0.6.16 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.6.16" + dependencies: + "@module-federation/runtime": 0.6.16 + "@module-federation/sdk": 0.6.16 + checksum: e78d5879eb1553c3dc96a93c7c962d9aa576b20f420fac8747fa1e3d61ab7e4ee51372924cedcd6483b829e2b4988a6f2daad4c6ddf2841c744ef69b9ba27680 + languageName: node + linkType: hard + "@module-federation/webpack-bundler-runtime@npm:0.8.9": version: 0.8.9 resolution: "@module-federation/webpack-bundler-runtime@npm:0.8.9" @@ -14878,6 +15315,18 @@ __metadata: languageName: node linkType: hard +"@ts-morph/common@npm:~0.24.0": + version: 0.24.0 + resolution: "@ts-morph/common@npm:0.24.0" + dependencies: + fast-glob: ^3.3.2 + minimatch: ^9.0.4 + mkdirp: ^3.0.1 + path-browserify: ^1.0.1 + checksum: 793bc8a47c93ab55c6c036f94480d3b0e948661aef4bb7dbc29279b1dda2fc4fce809a88e221537867a313541842e12d1ecbd32b4769688abe1303807ec09db6 + languageName: node + linkType: hard + "@ts-morph/common@npm:~0.25.0": version: 0.25.0 resolution: "@ts-morph/common@npm:0.25.0" @@ -15104,6 +15553,17 @@ __metadata: languageName: node linkType: hard +"@types/dockerode@npm:^3.3.29": + version: 3.3.34 + resolution: "@types/dockerode@npm:3.3.34" + dependencies: + "@types/docker-modem": "*" + "@types/node": "*" + "@types/ssh2": "*" + checksum: 0cb35276fc76ee8ae9d6db7054198e23370f753894d06aa56efbf232032009c6f63a3bfce9d71e6272f3240040d9da2d2a56671d24f34e598ff2000df946ecbd + languageName: node + linkType: hard + "@types/doctrine@npm:^0.0.3": version: 0.0.3 resolution: "@types/doctrine@npm:0.0.3" @@ -15354,7 +15814,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 @@ -15377,6 +15837,22 @@ __metadata: languageName: node linkType: hard +"@types/keyv@npm:^4.2.0": + version: 4.2.0 + resolution: "@types/keyv@npm:4.2.0" + dependencies: + keyv: "*" + checksum: 8713da9382b9346d664866a6cab2f91b0fd479f61379af891303a618e9a2abad6f347adc38a0850540e3f2dad278427de24e7555339264fddb04d1d17d3b50e0 + languageName: node + linkType: hard + +"@types/lodash@npm:4.17.5": + version: 4.17.5 + resolution: "@types/lodash@npm:4.17.5" + checksum: 3c9bb15772509f0ecb40428531863dbc3f064f2bf34bbccc2ce2b2923c69fb0868aec7e357b1d97fd0d7f7e435a014ea5c1adef8a64715529887179c97a5a823 + languageName: node + linkType: hard + "@types/lodash@npm:^4.14.167, @types/lodash@npm:^4.14.175": version: 4.17.12 resolution: "@types/lodash@npm:4.17.12" @@ -15628,6 +16104,13 @@ __metadata: languageName: node linkType: hard +"@types/qs@npm:^6.9.6": + version: 6.9.18 + resolution: "@types/qs@npm:6.9.18" + checksum: 152fab96efd819cc82ae67c39f089df415da6deddb48f1680edaaaa4e86a2a597de7b2ff0ad391df66d11a07006a08d52c9405e86b8cb8f3d5ba15881fe56cc7 + languageName: node + linkType: hard + "@types/ramda@npm:~0.30.0": version: 0.30.2 resolution: "@types/ramda@npm:0.30.2" @@ -15744,7 +16227,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:7.5.8, @types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4": +"@types/semver@npm:7.5.8, @types/semver@npm:^7.3.12, @types/semver@npm:^7.3.4, @types/semver@npm:^7.5.0": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 @@ -15799,6 +16282,15 @@ __metadata: languageName: node linkType: hard +"@types/ssh2-streams@npm:*": + version: 0.1.12 + resolution: "@types/ssh2-streams@npm:0.1.12" + dependencies: + "@types/node": "*" + checksum: aa0aa45e40cfca34b4443dafa8d28ff49196c05c71867cbf0a8cdd5127be4d8a3840819543fcad16535653ca8b0e29217671ed6500ff1e7a3ad2442c5d1b40a6 + languageName: node + linkType: hard + "@types/ssh2@npm:*": version: 1.15.1 resolution: "@types/ssh2@npm:1.15.1" @@ -15808,6 +16300,16 @@ __metadata: languageName: node linkType: hard +"@types/ssh2@npm:^0.5.48": + version: 0.5.52 + resolution: "@types/ssh2@npm:0.5.52" + dependencies: + "@types/node": "*" + "@types/ssh2-streams": "*" + checksum: bc1c76ac727ad73ddd59ba849cf0ea3ed2e930439e7a363aff24f04f29b74f9b1976369b869dc9a018223c9fb8ad041c09a0f07aea8cf46a8c920049188cddae + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -15967,6 +16469,31 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:^6.12.0": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" + dependencies: + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + graphemer: ^1.4.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^8.17.0": version: 8.22.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.22.0" @@ -15988,6 +16515,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/parser@npm:^6.7.2": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" + dependencies: + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:^8.16.0": version: 8.22.0 resolution: "@typescript-eslint/parser@npm:8.22.0" @@ -16014,6 +16559,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/scope-manager@npm:7.18.0" @@ -16034,6 +16589,23 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" + dependencies: + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + debug: ^4.3.4 + ts-api-utils: ^1.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:8.22.0": version: 8.22.0 resolution: "@typescript-eslint/type-utils@npm:8.22.0" @@ -16056,6 +16628,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/types@npm:7.18.0" @@ -16088,6 +16667,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + minimatch: 9.0.3 + semver: ^7.5.4 + ts-api-utils: ^1.0.1 + peerDependenciesMeta: + typescript: + optional: true + checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" @@ -16125,6 +16723,23 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:6.21.0, @typescript-eslint/utils@npm:^6.0.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" + dependencies: + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + semver: ^7.5.4 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:8.22.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": version: 8.22.0 resolution: "@typescript-eslint/utils@npm:8.22.0" @@ -16182,6 +16797,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + eslint-visitor-keys: ^3.4.1 + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" @@ -16982,7 +17607,7 @@ __metadata: languageName: node linkType: hard -"archiver@npm:^7.0.0": +"archiver@npm:^7.0.0, archiver@npm:^7.0.1": version: 7.0.1 resolution: "archiver@npm:7.0.1" dependencies: @@ -17718,6 +18343,13 @@ __metadata: languageName: node linkType: hard +"bare-events@npm:^2.0.0": + version: 2.5.4 + resolution: "bare-events@npm:2.5.4" + checksum: 522a5401caaede9d8c857c2fd346c993bf43995e958e8ebfa79d32b1e086032800e0639f3559d7ad85788fae54f6d9605685de507eec54298ea2aa2c8c9cb2c3 + languageName: node + linkType: hard + "bare-events@npm:^2.2.0": version: 2.5.0 resolution: "bare-events@npm:2.5.0" @@ -17725,6 +18357,50 @@ __metadata: languageName: node linkType: hard +"bare-fs@npm:^4.0.1": + version: 4.0.1 + resolution: "bare-fs@npm:4.0.1" + dependencies: + bare-events: ^2.0.0 + bare-path: ^3.0.0 + bare-stream: ^2.0.0 + checksum: 80ae7ed1304182633252ce20f69d53bffd39e1a4f1387b309c2f2cf2a48732e8a5440405eb4a7250a3d8d1d2fb923a50bbb8aa67f85729c8a82e08dd09637a17 + languageName: node + linkType: hard + +"bare-os@npm:^3.0.1": + version: 3.4.0 + resolution: "bare-os@npm:3.4.0" + checksum: a473da6219f901b2101fac176ff271b28b9aee7e2d01b13b96320a56656c2f83a7d8275db89238ff46ed348638d86338761b6682684fbd0c4bb6b09201446047 + languageName: node + linkType: hard + +"bare-path@npm:^3.0.0": + version: 3.0.0 + resolution: "bare-path@npm:3.0.0" + dependencies: + bare-os: ^3.0.1 + checksum: 51d559515f332f62cf9c37c38f2640c1b84b5e8c9de454b70baf029f806058cf94c51d6a0dfec0025cc7760f2069dc3e16c82f0d24f4a9ddb18c829bf9c0206d + languageName: node + linkType: hard + +"bare-stream@npm:^2.0.0": + version: 2.6.5 + resolution: "bare-stream@npm:2.6.5" + dependencies: + streamx: ^2.21.0 + peerDependencies: + bare-buffer: "*" + bare-events: "*" + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + checksum: 6a3d4baf8ded0bdc465b7b0b65dfbb8e40f7520ee8899adcae5fd37949d5c520412164116659750ad841215b03ce761fe252a626cd4fe3ec9df0440c6fd07a96 + languageName: node + linkType: hard + "base64-arraybuffer@npm:^0.1.5": version: 0.1.5 resolution: "base64-arraybuffer@npm:0.1.5" @@ -18826,7 +19502,7 @@ __metadata: languageName: node linkType: hard -"code-block-writer@npm:^13.0.3": +"code-block-writer@npm:^13.0.1, code-block-writer@npm:^13.0.3": version: 13.0.3 resolution: "code-block-writer@npm:13.0.3" checksum: 8e234f0ec2db9625d5efb9f05bdae79da6559bb4d9df94a6aa79a89a7b5ae25093b70d309fc5122840c9c07995cb14b4dd3f98a30f8878e3a3372e177df79454 @@ -20226,6 +20902,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.5": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 + languageName: node + linkType: hard + "decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3": version: 10.4.3 resolution: "decimal.js@npm:10.4.3" @@ -20655,6 +21343,27 @@ __metadata: languageName: node linkType: hard +"docker-compose@npm:^0.24.8": + version: 0.24.8 + resolution: "docker-compose@npm:0.24.8" + dependencies: + yaml: ^2.2.2 + checksum: 48f3564c46490f1f51899a144deb546b61450a76bffddb378379ac7702aa34b055e0237e0dc77507df94d7ad6f1f7daeeac27730230bce9aafe2e35efeda6b45 + languageName: node + linkType: hard + +"docker-modem@npm:^3.0.0": + version: 3.0.8 + resolution: "docker-modem@npm:3.0.8" + dependencies: + debug: ^4.1.1 + readable-stream: ^3.5.0 + split-ca: ^1.0.1 + ssh2: ^1.11.0 + checksum: e3675c9b1ad800be8fb1cb9c5621fbef20a75bfedcd6e01b69808eadd7f0165681e4e30d1700897b788a67dbf4769964fcccd19c3d66f6d2499bb7aede6b34df + languageName: node + linkType: hard + "docker-modem@npm:^5.0.3": version: 5.0.3 resolution: "docker-modem@npm:5.0.3" @@ -20667,6 +21376,17 @@ __metadata: languageName: node linkType: hard +"dockerode@npm:^3.3.5": + version: 3.3.5 + resolution: "dockerode@npm:3.3.5" + dependencies: + "@balena/dockerignore": ^1.0.2 + docker-modem: ^3.0.0 + tar-fs: ~2.0.1 + checksum: 7f6650422b07fa7ea9d5801f04b1a432634446b5fe37b995b8302b953b64e93abf1bb4596c2fb574ba47aafee685ef2ab959cc86c9654add5a26d09541bbbcc6 + languageName: node + linkType: hard + "dockerode@npm:^4.0.0": version: 4.0.2 resolution: "dockerode@npm:4.0.2" @@ -21946,6 +22666,20 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-deprecation@npm:^2.0.0": + version: 2.0.0 + resolution: "eslint-plugin-deprecation@npm:2.0.0" + dependencies: + "@typescript-eslint/utils": ^6.0.0 + tslib: ^2.3.1 + tsutils: ^3.21.0 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: ^4.2.4 || ^5.0.0 + checksum: d79611e902ac419a21e51eab582fcdbcf8170aff820c5e5197e7d242e7ca6bda59c0077d88404970c25993017398dd65c96df7d31a833e332d45dd330935324b + languageName: node + linkType: hard + "eslint-plugin-deprecation@npm:^3.0.0": version: 3.0.0 resolution: "eslint-plugin-deprecation@npm:3.0.0" @@ -21960,7 +22694,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.31.0": +"eslint-plugin-import@npm:^2.25.4, eslint-plugin-import@npm:^2.31.0": version: 2.31.0 resolution: "eslint-plugin-import@npm:2.31.0" dependencies: @@ -22007,7 +22741,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:^28.9.0": +"eslint-plugin-jest@npm:^28.0.0, eslint-plugin-jest@npm:^28.9.0": version: 28.11.0 resolution: "eslint-plugin-jest@npm:28.11.0" dependencies: @@ -22025,7 +22759,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsx-a11y@npm:^6.10.2": +"eslint-plugin-jsx-a11y@npm:^6.10.2, eslint-plugin-jsx-a11y@npm:^6.5.1": version: 6.10.2 resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" dependencies: @@ -22050,6 +22784,15 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react-hooks@npm:^4.3.0": + version: 4.6.2 + resolution: "eslint-plugin-react-hooks@npm:4.6.2" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + checksum: 395c433610f59577cfcf3f2e42bcb130436c8a0b3777ac64f441d88c5275f4fcfc89094cedab270f2822daf29af1079151a7a6579a8e9ea8cee66540ba0384c4 + languageName: node + linkType: hard + "eslint-plugin-react-hooks@npm:^5.0.0": version: 5.1.0 resolution: "eslint-plugin-react-hooks@npm:5.1.0" @@ -22059,7 +22802,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react@npm:^7.37.2": +"eslint-plugin-react@npm:^7.28.0, eslint-plugin-react@npm:^7.37.2": version: 7.37.4 resolution: "eslint-plugin-react@npm:7.37.4" dependencies: @@ -22101,6 +22844,21 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-unused-imports@npm:^3.0.0": + version: 3.2.0 + resolution: "eslint-plugin-unused-imports@npm:3.2.0" + dependencies: + eslint-rule-composer: ^0.3.0 + peerDependencies: + "@typescript-eslint/eslint-plugin": 6 - 7 + eslint: 8 + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + checksum: e85ae4f3af489294ef5e0969ab904fa87f9fa7c959ca0804f30845438db4aeb0428ddad7ab06a70608e93121626799977241b442fdf126a4d0667be57390c3d6 + languageName: node + linkType: hard + "eslint-plugin-unused-imports@npm:^4.1.4": version: 4.1.4 resolution: "eslint-plugin-unused-imports@npm:4.1.4" @@ -22114,6 +22872,13 @@ __metadata: languageName: node linkType: hard +"eslint-rule-composer@npm:^0.3.0": + version: 0.3.0 + resolution: "eslint-rule-composer@npm:0.3.0" + checksum: c2f57cded8d1c8f82483e0ce28861214347e24fd79fd4144667974cd334d718f4ba05080aaef2399e3bbe36f7d6632865110227e6b176ed6daa2d676df9281b1 + languageName: node + linkType: hard + "eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" @@ -22164,7 +22929,7 @@ __metadata: languageName: node linkType: hard -"eslint-webpack-plugin@npm:^4.2.0": +"eslint-webpack-plugin@npm:^4.0.0, eslint-webpack-plugin@npm:^4.2.0": version: 4.2.0 resolution: "eslint-webpack-plugin@npm:4.2.0" dependencies: @@ -22525,7 +23290,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.2, express@npm:^4.19.2": +"express@npm:4.21.2, express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.2, express@npm:^4.19.2": version: 4.21.2 resolution: "express@npm:4.21.2" dependencies: @@ -23404,6 +24169,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.0.0": + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: f983c706e0c22b0c0747a8e9c76aed6f391ba2d76734cf2757cd84da13417b402ed68fe25bace65228856c61d36d3b41da198f1ffbf33d0b34283a2f7a62c6e9 + languageName: node + linkType: hard + "fs-extra@npm:^11.1.0, fs-extra@npm:^11.2.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -24868,7 +25644,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.4, ignore@npm:^5.2.0, ignore@npm:^5.3.1": +"ignore@npm:^5.1.4, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be @@ -25792,6 +26568,13 @@ __metadata: languageName: node linkType: hard +"isomorphic-rslog@npm:0.0.5": + version: 0.0.5 + resolution: "isomorphic-rslog@npm:0.0.5" + checksum: ba3d8a5ca4691ae4e6ef8a50c404b94658618c87bd2ac7618946f8ea067489ee4a16a152b74afe24bcbdfe975e3b3a63e3c5149bf2a929aa781bdd7eb3f1370f + languageName: node + linkType: hard + "isomorphic-rslog@npm:0.0.7": version: 0.0.7 resolution: "isomorphic-rslog@npm:0.0.7" @@ -26135,6 +26918,15 @@ __metadata: languageName: node linkType: hard +"jest-express@npm:1.12.0": + version: 1.12.0 + resolution: "jest-express@npm:1.12.0" + dependencies: + jest-node-http: 1.0.0 + checksum: 55de11d258f06778d8928c9b2ecf838646837c6e6df97c55d179b6b678e3c76beba314bdaf42b174b203b0163c7fe8b9b652160dd007a6c0145c84a803d9f94f + languageName: node + linkType: hard + "jest-get-type@npm:^29.6.3": version: 29.6.3 resolution: "jest-get-type@npm:29.6.3" @@ -26225,6 +27017,13 @@ __metadata: languageName: node linkType: hard +"jest-node-http@npm:1.0.0": + version: 1.0.0 + resolution: "jest-node-http@npm:1.0.0" + checksum: f8e12aa5717c1c7a5202878a20fa98fd26ff4db60ff9ea74e0cd3d4d2767f5e44b200c30ba2a26ea95b526f25ecb88ade102fc128338789b5c5ca59546cd759c + languageName: node + linkType: hard + "jest-pnp-resolver@npm:^1.2.2": version: 1.2.3 resolution: "jest-pnp-resolver@npm:1.2.3" @@ -27124,6 +27923,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:*, keyv@npm:^5.2.1, keyv@npm:^5.2.2": + version: 5.2.3 + resolution: "keyv@npm:5.2.3" + dependencies: + "@keyv/serialize": ^1.0.2 + checksum: b317a71550431ba6238bc8c71ce9ab263560df2227ca7933f7a3f18f0fa1a931312b02951cbcce9d316689709f67c5e4a4095e8e6b9aa13d19ce82c5dd7293e2 + languageName: node + linkType: hard + "keyv@npm:^4.5.2, keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -27133,15 +27941,6 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^5.2.1, keyv@npm:^5.2.2": - version: 5.2.3 - resolution: "keyv@npm:5.2.3" - dependencies: - "@keyv/serialize": ^1.0.2 - checksum: b317a71550431ba6238bc8c71ce9ab263560df2227ca7933f7a3f18f0fa1a931312b02951cbcce9d316689709f67c5e4a4095e8e6b9aa13d19ce82c5dd7293e2 - languageName: node - linkType: hard - "kind-of@npm:^6.0.2": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -28917,6 +29716,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + "minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": version: 5.1.6 resolution: "minimatch@npm:5.1.6" @@ -29079,7 +29887,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -29282,6 +30090,40 @@ __metadata: languageName: node linkType: hard +"msw@npm:^1.0.0": + version: 1.3.5 + resolution: "msw@npm:1.3.5" + dependencies: + "@mswjs/cookies": ^0.2.2 + "@mswjs/interceptors": ^0.17.10 + "@open-draft/until": ^1.0.3 + "@types/cookie": ^0.4.1 + "@types/js-levenshtein": ^1.1.1 + chalk: ^4.1.1 + chokidar: ^3.4.2 + cookie: ^0.4.2 + graphql: ^16.8.1 + headers-polyfill: 3.2.5 + inquirer: ^8.2.0 + is-node-process: ^1.2.0 + js-levenshtein: ^1.1.6 + node-fetch: ^2.6.7 + outvariant: ^1.4.0 + path-to-regexp: ^6.3.0 + strict-event-emitter: ^0.4.3 + type-fest: ^2.19.0 + yargs: ^17.3.1 + peerDependencies: + typescript: ">= 4.4.x" + peerDependenciesMeta: + typescript: + optional: true + bin: + msw: cli/index.js + checksum: 5e1d96d63c0ce07db94373b2315739abecb76dac32dcc6ce116c902ced3e61ef2b1c7ff87eed3627c93fe0588002717edab9c745ebdee29437ed0da4b3beb561 + languageName: node + linkType: hard + "multer@npm:^1.4.5-lts.1": version: 1.4.5-lts.1 resolution: "multer@npm:1.4.5-lts.1" @@ -30879,7 +31721,7 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:^6.2.0": +"path-to-regexp@npm:^6.2.0, path-to-regexp@npm:^6.3.0": version: 6.3.0 resolution: "path-to-regexp@npm:6.3.0" checksum: eca78602e6434a1b6799d511d375ec044e8d7e28f5a48aa5c28d57d8152fb52f3fc62fb1cfc5dfa2198e1f041c2a82ed14043d75740a2fe60e91b5089a153250 @@ -31924,6 +32766,26 @@ __metadata: languageName: node linkType: hard +"proper-lockfile@npm:^4.1.2": + version: 4.1.2 + resolution: "proper-lockfile@npm:4.1.2" + dependencies: + graceful-fs: ^4.2.4 + retry: ^0.12.0 + signal-exit: ^3.0.2 + checksum: 00078ee6a61c216a56a6140c7d2a98c6c733b3678503002dc073ab8beca5d50ca271de4c85fca13b9b8ee2ff546c36674d1850509b84a04a5d0363bcb8638939 + languageName: node + linkType: hard + +"properties-reader@npm:^2.3.0": + version: 2.3.0 + resolution: "properties-reader@npm:2.3.0" + dependencies: + mkdirp: ^1.0.4 + checksum: cbf59e862dc507f8ce1f8d7641ed9737119f16a1d4dad8e79f17b303aaca1c6af7d36ddfef0f649cab4d200ba4334ac159af0b238f6978a085f5b1b5126b6cc3 + languageName: node + linkType: hard + "property-expr@npm:^2.0.4, property-expr@npm:^2.0.5": version: 2.0.6 resolution: "property-expr@npm:2.0.6" @@ -34026,6 +34888,13 @@ __metadata: languageName: node linkType: hard +"run-script-webpack-plugin@npm:^0.2.0": + version: 0.2.1 + resolution: "run-script-webpack-plugin@npm:0.2.1" + checksum: 952a26a150c11d0ad7e9abf6bb53b3caf7d60f028c84d877d97378c241e7786d7cbd8be4b5510d02de6daf46c10401b1a06b0d8a29b53ddc3e53a21d9c9345b6 + languageName: node + linkType: hard + "rxjs@npm:^7.5.5": version: 7.8.1 resolution: "rxjs@npm:7.8.1" @@ -34928,7 +35797,17 @@ __metadata: languageName: node linkType: hard -"ssh2@npm:^1.15.0": +"ssh-remote-port-forward@npm:^1.0.4": + version: 1.0.4 + resolution: "ssh-remote-port-forward@npm:1.0.4" + dependencies: + "@types/ssh2": ^0.5.48 + ssh2: ^1.4.0 + checksum: c6c04c5ddfde7cb06e9a8655a152bd28fe6771c6fe62ff0bc08be229491546c410f30b153c968b8d6817a57d38678a270c228f30143ec0fe1be546efc4f6b65a + languageName: node + linkType: hard + +"ssh2@npm:^1.11.0, ssh2@npm:^1.15.0, ssh2@npm:^1.4.0": version: 1.16.0 resolution: "ssh2@npm:1.16.0" dependencies: @@ -35248,6 +36127,20 @@ __metadata: languageName: node linkType: hard +"streamx@npm:^2.21.0": + version: 2.22.0 + resolution: "streamx@npm:2.22.0" + dependencies: + bare-events: ^2.2.0 + fast-fifo: ^1.3.2 + text-decoder: ^1.1.0 + dependenciesMeta: + bare-events: + optional: true + checksum: 9b2772a084281129d402f298bddf8d5f3c09b6b3d9b5c93df942e886b0b963c742a89736415cc53ffb8fc1f6f5b0b3ea171ed0ba86f1b31cde6ed35db5e07f6d + languageName: node + linkType: hard + "strict-event-emitter@npm:^0.2.4": version: 0.2.8 resolution: "strict-event-emitter@npm:0.2.8" @@ -35829,6 +36722,23 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^3.0.6": + version: 3.0.8 + resolution: "tar-fs@npm:3.0.8" + dependencies: + bare-fs: ^4.0.1 + bare-path: ^3.0.0 + pump: ^3.0.0 + tar-stream: ^3.1.5 + dependenciesMeta: + bare-fs: + optional: true + bare-path: + optional: true + checksum: 5bebadd68e7a10cc3aa9c30b579c295e158cef7b1f42a73ee1bb1992925027aa8ef6cbcdb0d03e202e7f3850799391de30adf2585f7f240b606faa65df1a6b68 + languageName: node + linkType: hard + "tar-fs@npm:~2.0.1": version: 2.0.1 resolution: "tar-fs@npm:2.0.1" @@ -35854,7 +36764,7 @@ __metadata: languageName: node linkType: hard -"tar-stream@npm:^3.0.0": +"tar-stream@npm:^3.0.0, tar-stream@npm:^3.1.5": version: 3.1.7 resolution: "tar-stream@npm:3.1.7" dependencies: @@ -36014,6 +36924,29 @@ __metadata: languageName: node linkType: hard +"testcontainers@npm:^10.0.0": + version: 10.17.2 + resolution: "testcontainers@npm:10.17.2" + dependencies: + "@balena/dockerignore": ^1.0.2 + "@types/dockerode": ^3.3.29 + archiver: ^7.0.1 + async-lock: ^1.4.1 + byline: ^5.0.0 + debug: ^4.3.5 + docker-compose: ^0.24.8 + dockerode: ^3.3.5 + get-port: ^5.1.1 + proper-lockfile: ^4.1.2 + properties-reader: ^2.3.0 + ssh-remote-port-forward: ^1.0.4 + tar-fs: ^3.0.6 + tmp: ^0.2.3 + undici: ^5.28.5 + checksum: c8b2482794b359d6fa0309166c0ac7080a93828894e2597660abf4f819d1592687136352449d951ce1a209e583b08ed4c0eea499963c0c76d29a97de5a2922d4 + languageName: node + linkType: hard + "text-decoder@npm:^1.1.0": version: 1.2.1 resolution: "text-decoder@npm:1.2.1" @@ -36035,6 +36968,13 @@ __metadata: languageName: node linkType: hard +"textextensions@npm:^5.16.0": + version: 5.16.0 + resolution: "textextensions@npm:5.16.0" + checksum: d2abd5c962760046aa85d9ca542bd8bdb451370fc0a5e5f807aa80dd2f50175ec10d5ce9d28ae96968aaf6a1b1bea254cf4715f24852d0dcf29c6a60af7f793c + languageName: node + linkType: hard + "thenify-all@npm:^1.0.0": version: 1.6.0 resolution: "thenify-all@npm:1.6.0" @@ -36192,7 +37132,7 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.2.0": +"tmp@npm:^0.2.0, tmp@npm:^0.2.3": version: 0.2.3 resolution: "tmp@npm:0.2.3" checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 @@ -36416,6 +37356,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^1.0.1": + version: 1.4.3 + resolution: "ts-api-utils@npm:1.4.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: ea00dee382d19066b2a3d8929f1089888b05fec797e32e7a7004938eda1dccf2e77274ee2afcd4166f53fab9b8d7ee90ebb225a3183f9ba8817d636f688a148d + languageName: node + linkType: hard + "ts-api-utils@npm:^1.3.0": version: 1.3.0 resolution: "ts-api-utils@npm:1.3.0" @@ -36469,6 +37418,16 @@ __metadata: languageName: node linkType: hard +"ts-morph@npm:^23.0.0": + version: 23.0.0 + resolution: "ts-morph@npm:23.0.0" + dependencies: + "@ts-morph/common": ~0.24.0 + code-block-writer: ^13.0.1 + checksum: 3282eb0f8bd4577770874736c3259b97501da9a86137160b5d68f106b7848ea7b1fbccf9e198a3d930ec40c993e9951d4bfae31e2562dac8f3de0d7bb0e23615 + languageName: node + linkType: hard + "ts-morph@npm:^24.0.0": version: 24.0.0 resolution: "ts-morph@npm:24.0.0" @@ -37171,6 +38130,15 @@ __metadata: languageName: node linkType: hard +"undici@npm:^5.28.5": + version: 5.28.5 + resolution: "undici@npm:5.28.5" + dependencies: + "@fastify/busboy": ^2.0.0 + checksum: a402d699a602a8feee1c0f78267467c8ffcbd7682267fec7a1307fd11554a32976a2307bf1cc8bf6ef7a667654336592fbd66d675df20ce28357536fb55a3a7d + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.1 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" @@ -38071,6 +39039,13 @@ __metadata: languageName: node linkType: hard +"webpack-node-externals@npm:^3.0.0": + version: 3.0.0 + resolution: "webpack-node-externals@npm:3.0.0" + checksum: 355080c35c821115b97dda8c93d9d0565a90a6012a532324eb0d6a64f8f0d609431fd29504fc7ce414755841ac14f601f3eef99472c2c5dc00233b504ebe73f2 + languageName: node + linkType: hard + "webpack-sources@npm:^1.4.3": version: 1.4.3 resolution: "webpack-sources@npm:1.4.3" @@ -38678,6 +39653,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.2.2": + version: 2.7.0 + resolution: "yaml@npm:2.7.0" + bin: + yaml: bin.mjs + checksum: 6e8b2f9b9d1b18b10274d58eb3a47ec223d9a93245a890dcb34d62865f7e744747190a9b9177d5f0ef4ea2e44ad2c0214993deb42e0800766203ac46f00a12dd + languageName: node + linkType: hard + "yaml@npm:~2.4.2": version: 2.4.5 resolution: "yaml@npm:2.4.5" From 29ccf14ca25ce93e54d3f470e5afe7671c7ed6c5 Mon Sep 17 00:00:00 2001 From: Kashish Mittal Date: Thu, 6 Feb 2025 09:08:01 -0500 Subject: [PATCH 3/3] add changeset Signed-off-by: Kashish Mittal --- .changeset/hip-games-dance.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changeset/hip-games-dance.md diff --git a/.changeset/hip-games-dance.md b/.changeset/hip-games-dance.md new file mode 100644 index 0000000000..a845151cc8 --- /dev/null +++ b/.changeset/hip-games-dance.md @@ -0,0 +1,2 @@ +--- +---