From 8116b4527b69118d55bf3e7a050b1b2163d671cc Mon Sep 17 00:00:00 2001
From: Derrick Farris
Date: Mon, 8 Apr 2024 21:45:19 -0700
Subject: [PATCH 01/52] fix(agent): check for `ping` command, report transmit
errors back on `Agent/$push` (#4328)
* wip(ping): almost fixed ping failing when util missing
* wip(agent): get agent tests passing
* refactor(agent): `exec` -> `execAsync`
* fix(agent): send `OperationOutcome` when `AgentTrasmitResponse.statusCode` >= 400
* fix(agent): fix types, add ping count arg
* fix(ci): install ping util before running tests
* fix(ci): use `sudo` o.o
* ci: check where `iputils-ping` is installed
* ci: test if ping is accessible
* fix(agent): use proper help command on linux
* wip(ci): test if `ping` is found in PATH
* fix(agent): change how checking for ping on linux
* test(agent): add more tests for error cases, test `Agent/$push`
* chore(sonar): erase reject type error
* feat(agent): add `count` parameter for ping UI
* test(agent): add test for no ip entered
* cleanup(agent): remove unnecessary `isPingUtilAvailable`
---
packages/agent/src/app.ts | 80 ++-
packages/agent/src/net-utils.test.ts | 498 ++++++++++++++----
packages/app/src/resource/ToolsPage.test.tsx | 71 ++-
packages/app/src/resource/ToolsPage.tsx | 29 +-
packages/core/src/agent.ts | 1 +
.../src/fhir/operations/agentpush.test.ts | 146 ++++-
.../server/src/fhir/operations/agentpush.ts | 21 +-
packages/server/src/index.test.ts | 4 +-
8 files changed, 714 insertions(+), 136 deletions(-)
diff --git a/packages/agent/src/app.ts b/packages/agent/src/app.ts
index 1cfe398240..f349523f70 100644
--- a/packages/agent/src/app.ts
+++ b/packages/agent/src/app.ts
@@ -1,5 +1,4 @@
import {
- AgentError,
AgentMessage,
AgentTransmitRequest,
AgentTransmitResponse,
@@ -12,16 +11,27 @@ import {
} from '@medplum/core';
import { Endpoint, Reference } from '@medplum/fhirtypes';
import { Hl7Client } from '@medplum/hl7';
-import { exec as _exec } from 'node:child_process';
+import { ExecException, ExecOptions, exec } from 'node:child_process';
import { isIPv4, isIPv6 } from 'node:net';
-import { promisify } from 'node:util';
-import { platform } from 'os';
+import { platform } from 'node:os';
import WebSocket from 'ws';
import { Channel } from './channel';
import { AgentDicomChannel } from './dicom';
import { AgentHl7Channel } from './hl7';
-const exec = promisify(_exec);
+async function execAsync(command: string, options: ExecOptions): Promise<{ stdout: string; stderr: string }> {
+ return new Promise<{ stdout: string; stderr: string }>((resolve, reject) => {
+ exec(command, options, (ex: ExecException | null, stdout: string, stderr: string) => {
+ if (ex) {
+ const err = ex as Error;
+ reject(err);
+ }
+ resolve({ stdout, stderr });
+ });
+ });
+}
+
+export const DEFAULT_PING_TIMEOUT = 3600;
export class App {
static instance: App;
@@ -265,10 +275,16 @@ export class App {
}
}
+ // This covers Windows, Linux, and Mac
+ private getPingCommand(ip: string, count = 1): string {
+ return platform() === 'win32' ? `ping /n ${count} ${ip}` : `ping -c ${count} ${ip}`;
+ }
+
private async tryPingIp(message: AgentTransmitRequest): Promise {
try {
- if (message.body && message.body !== 'PING') {
- const warnMsg = 'Message body present but unused. Body should be empty for a ping request.';
+ if (message.body && !message.body.startsWith('PING')) {
+ const warnMsg =
+ 'Message body present but unused. Body for a ping request should be empty or a message formatted as `PING[ count]`.';
this.log.warn(warnMsg);
}
if (!isIPv4(message.remote)) {
@@ -279,13 +295,27 @@ export class App {
this.log.error(errMsg);
throw new Error(errMsg);
}
- // This covers Windows, Linux, and Mac
- const { stderr, stdout } = await exec(
- platform() === 'win32' ? `ping ${message.remote}` : `ping -c 4 ${message.remote}`
- );
+
+ const pingCountAsStr = message.body.startsWith('PING') ? message.body.split(' ')?.[1] ?? '' : '';
+ let pingCount: number | undefined = undefined;
+
+ if (pingCountAsStr !== '') {
+ pingCount = Number.parseInt(pingCountAsStr, 10);
+ if (Number.isNaN(pingCount)) {
+ throw new Error(
+ `Unable to ping ${message.remote} "${pingCountAsStr}" times. "${pingCountAsStr}" is not a number.`
+ );
+ }
+ }
+
+ const { stdout, stderr } = await execAsync(this.getPingCommand(message.remote, pingCount), {
+ timeout: DEFAULT_PING_TIMEOUT,
+ });
+
if (stderr) {
- throw new Error(`Received on stderr:\n\n${stderr}`);
+ throw new Error(`Received on stderr:\n\n${stderr.trim()}`);
}
+
const result = stdout.trim();
this.log.info(`Ping result for ${message.remote}:\n\n${result}`);
this.addToWebSocketQueue({
@@ -294,14 +324,20 @@ export class App {
contentType: ContentType.PING,
remote: message.remote,
callback: message.callback,
+ statusCode: 200,
body: result,
} satisfies AgentTransmitResponse);
} catch (err) {
this.log.error(`Error during ping attempt to ${message.remote ?? 'NO_IP_GIVEN'}: ${normalizeErrorString(err)}`);
this.addToWebSocketQueue({
- type: 'agent:error',
- body: (err as Error).message,
- } satisfies AgentError);
+ type: 'agent:transmit:response',
+ channel: message.channel,
+ contentType: ContentType.TEXT,
+ remote: message.remote,
+ callback: message.callback,
+ statusCode: 500,
+ body: normalizeErrorString(err),
+ } satisfies AgentTransmitResponse);
}
}
@@ -327,7 +363,7 @@ export class App {
const address = new URL(message.remote);
const client = new Hl7Client({
host: address.hostname,
- port: parseInt(address.port, 10),
+ port: Number.parseInt(address.port, 10),
});
client
@@ -340,11 +376,21 @@ export class App {
remote: message.remote,
callback: message.callback,
contentType: ContentType.HL7_V2,
+ statusCode: 200,
body: response.toString(),
- });
+ } satisfies AgentTransmitResponse);
})
.catch((err) => {
this.log.error(`HL7 error: ${normalizeErrorString(err)}`);
+ this.addToWebSocketQueue({
+ type: 'agent:transmit:response',
+ channel: message.channel,
+ remote: message.remote,
+ callback: message.callback,
+ contentType: ContentType.TEXT,
+ statusCode: 500,
+ body: normalizeErrorString(err),
+ } satisfies AgentTransmitResponse);
})
.finally(() => {
client.close();
diff --git a/packages/agent/src/net-utils.test.ts b/packages/agent/src/net-utils.test.ts
index 5c156e6ef8..8071585c69 100644
--- a/packages/agent/src/net-utils.test.ts
+++ b/packages/agent/src/net-utils.test.ts
@@ -1,7 +1,17 @@
-import { AgentMessage, allOk, ContentType, LogLevel, sleep } from '@medplum/core';
+import {
+ AgentMessage,
+ AgentTransmitRequest,
+ AgentTransmitResponse,
+ allOk,
+ ContentType,
+ generateId,
+ LogLevel,
+ sleep,
+} from '@medplum/core';
import { Agent, Resource } from '@medplum/fhirtypes';
import { MockClient } from '@medplum/mock';
import { Client, Server } from 'mock-socket';
+import child_process, { ChildProcess } from 'node:child_process';
import { App } from './app';
jest.mock('node-windows');
@@ -9,120 +19,418 @@ jest.mock('node-windows');
const medplum = new MockClient();
describe('Agent Net Utils', () => {
- let mockServer: Server;
- let mySocket: Client | undefined = undefined;
- let wsClient: Client;
- let app: App;
- let onMessage: (command: AgentMessage) => void;
+ let originalLog: typeof console.log;
- beforeAll(async () => {
+ beforeAll(() => {
+ originalLog = console.log;
console.log = jest.fn();
+ });
+
+ afterAll(() => {
+ console.log = originalLog;
+ });
+
+ describe('Ping -- Within One App Instance', () => {
+ let mockServer: Server;
+ let wsClient: Client;
+ let app: App;
+ let onMessage: (command: AgentMessage) => void;
+ let timer: ReturnType | undefined;
+
+ beforeAll(async () => {
+ medplum.router.router.add('POST', ':resourceType/:id/$execute', async () => {
+ return [allOk, {} as Resource];
+ });
+
+ mockServer = new Server('wss://example.com/ws/agent');
+
+ mockServer.on('connection', (socket) => {
+ wsClient = socket;
+ socket.on('message', (data) => {
+ const command = JSON.parse((data as Buffer).toString('utf8')) as AgentMessage;
+ if (command.type === 'agent:connect:request') {
+ socket.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:connect:response',
+ })
+ )
+ );
+ } else {
+ onMessage(command);
+ }
+ });
+ });
+
+ const agent = await medplum.createResource({
+ resourceType: 'Agent',
+ } as Agent);
- medplum.router.router.add('POST', ':resourceType/:id/$execute', async () => {
- return [allOk, {} as Resource];
+ // Start the app
+ app = new App(medplum, agent.id as string, LogLevel.INFO);
+ await app.start();
+
+ // Wait for the WebSocket to connect
+ // eslint-disable-next-line no-unmodified-loop-condition
+ while (!wsClient) {
+ await sleep(100);
+ }
});
- mockServer = new Server('wss://example.com/ws/agent');
-
- mockServer.on('connection', (socket) => {
- mySocket = socket;
- socket.on('message', (data) => {
- const command = JSON.parse((data as Buffer).toString('utf8')) as AgentMessage;
- if (command.type === 'agent:connect:request') {
- socket.send(
- Buffer.from(
- JSON.stringify({
- type: 'agent:connect:response',
- })
- )
- );
- } else {
- onMessage(command);
- }
+ afterAll(async () => {
+ app.stop();
+ await new Promise((resolve) => {
+ mockServer.stop(resolve);
});
+ // @ts-expect-error We know by the time it's used again this will be redefined
+ wsClient = undefined;
});
- const agent = await medplum.createResource({
- resourceType: 'Agent',
- } as Agent);
+ afterEach(() => {
+ clearTimeout(timer);
+ });
- // Start the app
- app = new App(medplum, agent.id as string, LogLevel.INFO);
- await app.start();
+ test('Valid ping', async () => {
+ let resolve: (value: AgentMessage) => void;
+ let reject: (error: Error) => void;
- // Wait for the WebSocket to connect
- // eslint-disable-next-line no-unmodified-loop-condition
- while (!mySocket) {
- await sleep(100);
- }
+ const messageReceived = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
- wsClient = mySocket as unknown as Client;
- });
+ onMessage = (command) => resolve(command);
+ expect(wsClient).toBeDefined();
- afterAll(() => {
- app.stop();
- mockServer.stop();
- });
+ const callback = generateId();
+ wsClient.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:request',
+ contentType: ContentType.PING,
+ remote: '127.0.0.1',
+ callback,
+ body: 'PING',
+ } satisfies AgentTransmitRequest)
+ )
+ );
+
+ timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ await expect(messageReceived).resolves.toMatchObject>({
+ type: 'agent:transmit:response',
+ callback,
+ statusCode: 200,
+ body: expect.stringMatching(/ping statistics/),
+ });
+ });
+
+ test('Non-IP remote', async () => {
+ let resolve: (value: AgentMessage) => void;
+ let reject: (error: Error) => void;
- test('Ping -- valid', async () => {
- let resolve: (value: AgentMessage) => void;
- let reject: (error: Error) => void;
+ const messageReceived = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
+
+ onMessage = (command) => resolve(command);
+
+ expect(wsClient).toBeDefined();
+
+ const callback = generateId();
+ wsClient.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:request',
+ contentType: ContentType.PING,
+ remote: 'https://localhost:3001',
+ callback,
+ body: 'PING 1',
+ } satisfies AgentTransmitRequest)
+ )
+ );
+
+ timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ await expect(messageReceived).resolves.toMatchObject>({
+ type: 'agent:transmit:response',
+ contentType: ContentType.TEXT,
+ statusCode: 500,
+ callback,
+ body: expect.stringMatching(/invalid ip/i),
+ });
+ });
+
+ test('Invalid ping body -- Random message', async () => {
+ let resolve: (value: AgentMessage) => void;
+ let reject: (error: Error) => void;
+
+ const messageReceived = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
- const messageReceived = new Promise((_resolve, _reject) => {
- resolve = _resolve;
- reject = _reject;
+ onMessage = (command) => resolve(command);
+
+ expect(wsClient).toBeDefined();
+
+ const callback = generateId();
+ wsClient.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:request',
+ contentType: ContentType.PING,
+ remote: '127.0.0.1',
+ callback,
+ body: 'Hello, Medplum!',
+ } satisfies AgentTransmitRequest)
+ )
+ );
+
+ timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ await expect(messageReceived).resolves.toMatchObject>({
+ type: 'agent:transmit:response',
+ contentType: ContentType.PING,
+ statusCode: 200,
+ callback,
+ body: expect.stringMatching(/ping statistics/i),
+ });
+
+ expect(console.log).toHaveBeenCalledWith(expect.stringMatching(/message body present but unused/i));
});
- onMessage = (command) => resolve(command);
-
- expect(wsClient).toBeDefined();
- wsClient.send(
- Buffer.from(
- JSON.stringify({
- type: 'agent:transmit:request',
- contentType: ContentType.PING,
- remote: '127.0.0.1',
- body: 'PING',
- })
- )
- );
-
- const timer = setTimeout(() => {
- reject(new Error('Timeout'));
- }, 3500);
-
- await expect(messageReceived).resolves.toMatchObject({ type: 'agent:transmit:response', body: expect.any(String) });
- clearTimeout(timer);
+ test('Invalid ping body -- non-numeric first arg', async () => {
+ let resolve: (value: AgentMessage) => void;
+ let reject: (error: Error) => void;
+
+ const messageReceived = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
+
+ onMessage = (command) => resolve(command);
+
+ expect(wsClient).toBeDefined();
+
+ const callback = generateId();
+ wsClient.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:request',
+ contentType: ContentType.PING,
+ remote: '127.0.0.1',
+ callback,
+ body: 'PING JOHN',
+ } satisfies AgentTransmitRequest)
+ )
+ );
+
+ timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ await expect(messageReceived).resolves.toMatchObject>({
+ type: 'agent:transmit:response',
+ contentType: ContentType.TEXT,
+ statusCode: 500,
+ callback,
+ body: expect.stringMatching(/is not a number/i),
+ });
+ });
});
- test('Ping -- non-IP remote', async () => {
- let resolve: (value: AgentMessage) => void;
- let reject: (error: Error) => void;
+ describe('Ping -- Edge Cases', () => {
+ let mockServer: Server;
+ let wsClient: Client;
+ let app: App;
+ let onMessage: (command: AgentMessage) => void;
+ let timer: ReturnType;
+
+ beforeEach(async () => {
+ medplum.router.router.add('POST', ':resourceType/:id/$execute', async () => {
+ return [allOk, {} as Resource];
+ });
+
+ mockServer = new Server('wss://example.com/ws/agent');
+
+ mockServer.on('connection', (socket) => {
+ wsClient = socket;
+ socket.on('message', (data) => {
+ const command = JSON.parse((data as Buffer).toString('utf8')) as AgentMessage;
+ if (command.type === 'agent:connect:request') {
+ socket.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:connect:response',
+ })
+ )
+ );
+ } else {
+ onMessage(command);
+ }
+ });
+ });
+
+ const agent = await medplum.createResource({
+ resourceType: 'Agent',
+ } as Agent);
+
+ // Start the app
+ app = new App(medplum, agent.id as string, LogLevel.INFO);
+ await app.start();
- const messageReceived = new Promise((_resolve, _reject) => {
- resolve = _resolve;
- reject = _reject;
+ // Wait for the WebSocket to connect
+ // eslint-disable-next-line no-unmodified-loop-condition
+ while (!wsClient) {
+ await sleep(100);
+ }
});
- onMessage = (command) => resolve(command);
-
- expect(wsClient).toBeDefined();
- wsClient.send(
- Buffer.from(
- JSON.stringify({
- type: 'agent:transmit:request',
- contentType: ContentType.PING,
- remote: 'https://localhost:3001',
- body: 'PING',
- })
- )
- );
-
- const timer = setTimeout(() => {
- reject(new Error('Timeout'));
- }, 3500);
-
- await expect(messageReceived).resolves.toMatchObject({ type: 'agent:error', body: expect.any(String) });
- clearTimeout(timer);
+ afterEach(async () => {
+ app.stop();
+ await new Promise((resolve) => {
+ mockServer.stop(resolve);
+ });
+ clearTimeout(timer);
+ // @ts-expect-error We know that in each beforeEach this is redefined
+ wsClient = undefined;
+ });
+
+ test('Ping times out', async () => {
+ let resolve: (value: AgentMessage) => void;
+ let reject: (error: Error) => void;
+
+ let messageReceived = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
+
+ onMessage = (command) => resolve(command);
+
+ expect(wsClient).toBeDefined();
+
+ let callback = generateId();
+ wsClient.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:request',
+ contentType: ContentType.PING,
+ remote: '127.0.0.1',
+ callback,
+ body: 'PING 1',
+ } satisfies AgentTransmitRequest)
+ )
+ );
+
+ timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ // We can ping localhost, woohoo
+ await expect(messageReceived).resolves.toMatchObject>({
+ type: 'agent:transmit:response',
+ body: expect.stringMatching(/ping statistics/i),
+ contentType: ContentType.PING,
+ callback,
+ statusCode: 200,
+ });
+
+ // Setup for a ping that will timeout
+ messageReceived = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
+
+ clearTimeout(timer);
+ timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ onMessage = (command) => resolve(command);
+
+ // We are gonna make ping fail after a timeout
+ jest.spyOn(child_process, 'exec').mockImplementationOnce((_command, _options, callback): ChildProcess => {
+ setTimeout(() => {
+ callback?.(new Error('Ping command timeout'), '', '');
+ }, 50);
+ return new ChildProcess();
+ });
+
+ callback = generateId();
+ wsClient.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:request',
+ contentType: ContentType.PING,
+ remote: '127.0.0.1',
+ callback,
+ body: 'PING 1',
+ } satisfies AgentTransmitRequest)
+ )
+ );
+
+ // We should get a timeout error
+ await expect(messageReceived).resolves.toMatchObject>({
+ type: 'agent:transmit:response',
+ contentType: ContentType.TEXT,
+ callback,
+ statusCode: 500,
+ body: expect.stringMatching(/Ping command timeout/),
+ });
+ });
+
+ test('No ping command available', async () => {
+ // We are gonna make ping fail after a timeout
+ jest.spyOn(child_process, 'exec').mockImplementationOnce((_command, _options, callback): ChildProcess => {
+ setTimeout(() => {
+ callback?.(new Error('Ping not found'), '', '');
+ }, 50);
+ return new ChildProcess();
+ });
+
+ let resolve: (value: AgentMessage) => void;
+ let reject: (error: Error) => void;
+
+ const messageReceived = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
+
+ onMessage = (command) => resolve(command);
+ expect(wsClient).toBeDefined();
+
+ const callback = generateId();
+ wsClient.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:request',
+ contentType: ContentType.PING,
+ remote: '127.0.0.1',
+ callback,
+ body: 'PING 1',
+ } satisfies AgentTransmitRequest)
+ )
+ );
+
+ timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ await expect(messageReceived).resolves.toMatchObject>({
+ type: 'agent:transmit:response',
+ contentType: ContentType.TEXT,
+ statusCode: 500,
+ callback,
+ body: expect.stringMatching(/Ping not found/),
+ });
+ });
});
});
diff --git a/packages/app/src/resource/ToolsPage.test.tsx b/packages/app/src/resource/ToolsPage.test.tsx
index 6b11f9615d..7dda14d446 100644
--- a/packages/app/src/resource/ToolsPage.test.tsx
+++ b/packages/app/src/resource/ToolsPage.test.tsx
@@ -1,5 +1,5 @@
import { Notifications } from '@mantine/notifications';
-import { allOk, getReferenceString } from '@medplum/core';
+import { ContentType, allOk, getReferenceString } from '@medplum/core';
import { Agent } from '@medplum/fhirtypes';
import { MockClient } from '@medplum/mock';
import { MedplumProvider } from '@medplum/react';
@@ -64,7 +64,7 @@ describe('ToolsPage', () => {
expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
await act(async () => {
- fireEvent.change(screen.getByPlaceholderText('IP Address'), { target: { value: '8.8.8.8' } });
+ fireEvent.change(screen.getByLabelText('IP Address'), { target: { value: '8.8.8.8' } });
fireEvent.click(screen.getByLabelText('Ping'));
});
@@ -80,7 +80,7 @@ describe('ToolsPage', () => {
expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
await act(async () => {
- fireEvent.change(screen.getByPlaceholderText('IP Address'), { target: { value: 'abc123' } });
+ fireEvent.change(screen.getByLabelText('IP Address'), { target: { value: 'abc123' } });
fireEvent.click(screen.getByLabelText('Ping'));
});
@@ -98,7 +98,7 @@ describe('ToolsPage', () => {
expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
await act(async () => {
- fireEvent.change(screen.getByPlaceholderText('IP Address'), { target: { value: '8.8.8.8' } });
+ fireEvent.change(screen.getByLabelText('IP Address'), { target: { value: '8.8.8.8' } });
fireEvent.click(screen.getByLabelText('Ping'));
});
@@ -106,4 +106,67 @@ describe('ToolsPage', () => {
medplum.setAgentAvailable(true);
});
+
+ test('Setting count for ping', async () => {
+ const pushToAgentSpy = jest.spyOn(medplum, 'pushToAgent');
+
+ // load agent page
+ await act(async () => {
+ setup(`/${getReferenceString(agent)}`);
+ });
+
+ const toolsTab = screen.getByRole('tab', { name: 'Tools' });
+
+ // click on Tools tab
+ await act(async () => {
+ fireEvent.click(toolsTab);
+ });
+
+ expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
+
+ await act(async () => {
+ fireEvent.change(screen.getByLabelText('IP Address'), { target: { value: '8.8.8.8' } });
+ });
+
+ await act(async () => {
+ fireEvent.change(screen.getByLabelText('Ping Count'), { target: { value: '2' } });
+ fireEvent.click(screen.getByLabelText('Ping'));
+ });
+
+ await expect(screen.findByText('statistics', { exact: false })).resolves.toBeInTheDocument();
+ expect(pushToAgentSpy).toHaveBeenLastCalledWith(
+ { reference: getReferenceString(agent) },
+ '8.8.8.8',
+ 'PING 2',
+ ContentType.PING,
+ true
+ );
+ pushToAgentSpy.mockRestore();
+ });
+
+ test('No IP entered for ping', async () => {
+ const pushToAgentSpy = jest.spyOn(medplum, 'pushToAgent');
+
+ // load agent page
+ await act(async () => {
+ setup(`/${getReferenceString(agent)}`);
+ });
+
+ const toolsTab = screen.getByRole('tab', { name: 'Tools' });
+
+ // click on Tools tab
+ await act(async () => {
+ fireEvent.click(toolsTab);
+ });
+
+ expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
+
+ await act(async () => {
+ fireEvent.click(screen.getByLabelText('Ping'));
+ });
+
+ await expect(screen.findByText('statistics', { exact: false })).rejects.toThrow();
+ expect(pushToAgentSpy).not.toHaveBeenCalled();
+ pushToAgentSpy.mockRestore();
+ });
});
diff --git a/packages/app/src/resource/ToolsPage.tsx b/packages/app/src/resource/ToolsPage.tsx
index 2a18c396cf..041104be14 100644
--- a/packages/app/src/resource/ToolsPage.tsx
+++ b/packages/app/src/resource/ToolsPage.tsx
@@ -1,4 +1,4 @@
-import { ActionIcon, Button, Divider, Table, TextInput, Title } from '@mantine/core';
+import { ActionIcon, Button, Divider, Group, NumberInput, Table, TextInput, Title } from '@mantine/core';
import { showNotification } from '@mantine/notifications';
import { ContentType, formatDateTime, normalizeErrorString } from '@medplum/core';
import { Agent, Parameters, Reference } from '@medplum/fhirtypes';
@@ -32,12 +32,13 @@ export function ToolsPage(): JSX.Element | null {
const handlePing = useCallback(
(formData: Record) => {
const ip = formData.ip;
+ const pingCount = formData.pingCount || 1;
if (!ip) {
return;
}
setPinging(true);
medplum
- .pushToAgent(reference, ip, 'PING', ContentType.PING, true)
+ .pushToAgent(reference, ip, `PING ${pingCount}`, ContentType.PING, true)
.then((pingResult: string) => setLastPing(pingResult))
.catch((err: unknown) => showError(normalizeErrorString(err)))
.finally(() => setPinging(false));
@@ -91,16 +92,20 @@ export function ToolsPage(): JSX.Element | null {
Send a ping command from the agent to an IP address. Use this tool to troubleshoot local network connectivity.
{!pinging && lastPing && (
<>
diff --git a/packages/core/src/agent.ts b/packages/core/src/agent.ts
index 48e0d3c6ff..656d0d9027 100644
--- a/packages/core/src/agent.ts
+++ b/packages/core/src/agent.ts
@@ -42,6 +42,7 @@ export interface AgentTransmitResponse extends BaseAgentMessage {
channel?: string;
remote: string;
contentType: string;
+ statusCode?: number;
body: string;
}
diff --git a/packages/server/src/fhir/operations/agentpush.test.ts b/packages/server/src/fhir/operations/agentpush.test.ts
index 111c8a9b6a..086520c643 100644
--- a/packages/server/src/fhir/operations/agentpush.test.ts
+++ b/packages/server/src/fhir/operations/agentpush.test.ts
@@ -1,11 +1,20 @@
-import { allOk, ContentType, getReferenceString } from '@medplum/core';
-import { Agent, Device } from '@medplum/fhirtypes';
-import { randomUUID } from 'crypto';
+import {
+ AgentTransmitRequest,
+ AgentTransmitResponse,
+ allOk,
+ ContentType,
+ getReferenceString,
+ sleep,
+} from '@medplum/core';
+import { Agent, Device, OperationOutcome } from '@medplum/fhirtypes';
import express from 'express';
+import { randomUUID } from 'node:crypto';
import request from 'supertest';
import { initApp, shutdownApp } from '../../app';
import { loadTestConfig } from '../../config';
+import { getRedis } from '../../redis';
import { initTestAuth } from '../../test.setup';
+import { AgentPushParameters } from './agentpush';
const app = express();
let accessToken: string;
@@ -248,4 +257,135 @@ describe('Agent Push', () => {
expect(res.status).toBe(400);
expect(res.body.issue[0].details.text).toEqual('Invalid wait timeout');
});
+
+ test('Ping -- Successful', async () => {
+ const redis = getRedis();
+ const publishSpy = jest.spyOn(redis, 'publish');
+
+ let resolve!: (value: request.Response) => void | PromiseLike;
+ let reject!: (err: Error) => void;
+
+ const deferredResponse = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
+
+ request(app)
+ .post(`/fhir/R4/Agent/${agent.id}/$push`)
+ .set('Content-Type', ContentType.JSON)
+ .set('Authorization', 'Bearer ' + accessToken)
+ .send({
+ contentType: ContentType.PING,
+ body: 'PING',
+ destination: '8.8.8.8',
+ waitForResponse: true,
+ } satisfies AgentPushParameters)
+ .then(resolve)
+ .catch(reject);
+
+ let shouldThrow = false;
+ const timer = setTimeout(() => {
+ shouldThrow = true;
+ }, 3500);
+
+ while (!publishSpy.mock.lastCall) {
+ if (shouldThrow) {
+ throw new Error('Timeout');
+ }
+ await sleep(50);
+ }
+ clearTimeout(timer);
+
+ const transmitRequestStr = publishSpy.mock.lastCall?.[1]?.toString() as string;
+ expect(transmitRequestStr).toBeDefined();
+ const transmitRequest = JSON.parse(transmitRequestStr) as AgentTransmitRequest;
+
+ await getRedis().publish(
+ transmitRequest.callback as string,
+ JSON.stringify({
+ ...transmitRequest,
+ type: 'agent:transmit:response',
+ statusCode: 200,
+ contentType: ContentType.TEXT,
+ body: `
+PING 8.8.8.8 (8.8.8.8): 56 data bytes
+64 bytes from 8.8.8.8: icmp_seq=0 ttl=115 time=10.316 ms
+
+--- 8.8.8.8 ping statistics ---
+1 packets transmitted, 1 packets received, 0.0% packet loss
+round-trip min/avg/max/stddev = 10.316/10.316/10.316/nan ms`,
+ } satisfies AgentTransmitResponse)
+ );
+
+ const res = await deferredResponse;
+ expect(res.status).toEqual(200);
+ expect(res.text).toEqual(expect.stringMatching(/ping statistics/i));
+
+ publishSpy.mockRestore();
+ });
+
+ test('Ping -- Error', async () => {
+ const redis = getRedis();
+ const publishSpy = jest.spyOn(redis, 'publish');
+
+ let resolve!: (value: request.Response) => void | PromiseLike;
+ let reject!: (err: Error) => void;
+
+ const deferredResponse = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
+
+ request(app)
+ .post(`/fhir/R4/Agent/${agent.id}/$push`)
+ .set('Content-Type', ContentType.JSON)
+ .set('Authorization', 'Bearer ' + accessToken)
+ .send({
+ contentType: ContentType.PING,
+ body: 'PING',
+ destination: '8.8.8.8',
+ waitForResponse: true,
+ } satisfies AgentPushParameters)
+ .then(resolve)
+ .catch(reject);
+
+ let shouldThrow = false;
+ const timer = setTimeout(() => {
+ shouldThrow = true;
+ }, 3500);
+
+ while (!publishSpy.mock.lastCall) {
+ if (shouldThrow) {
+ throw new Error('Timeout');
+ }
+ await sleep(50);
+ }
+ clearTimeout(timer);
+
+ const transmitRequestStr = publishSpy.mock.lastCall?.[1]?.toString() as string;
+ expect(transmitRequestStr).toBeDefined();
+ const transmitRequest = JSON.parse(transmitRequestStr) as AgentTransmitRequest;
+
+ await getRedis().publish(
+ transmitRequest.callback as string,
+ JSON.stringify({
+ ...transmitRequest,
+ type: 'agent:transmit:response',
+ statusCode: 500,
+ contentType: ContentType.TEXT,
+ body: 'Error: Unable to ping "8.8.8.8"',
+ } satisfies AgentTransmitResponse)
+ );
+
+ const res = await deferredResponse;
+ expect(res.status).toEqual(500);
+
+ const body = res.body as OperationOutcome;
+ expect(body).toBeDefined();
+ expect(body.issue[0].severity).toEqual('error');
+ expect(body.issue[0]?.details?.text).toEqual(expect.stringMatching(/internal server error/i));
+ expect(body.issue[0]?.diagnostics).toEqual(expect.stringMatching(/unable to ping/i));
+
+ publishSpy.mockRestore();
+ });
});
diff --git a/packages/server/src/fhir/operations/agentpush.ts b/packages/server/src/fhir/operations/agentpush.ts
index 9f9c340355..52107a2680 100644
--- a/packages/server/src/fhir/operations/agentpush.ts
+++ b/packages/server/src/fhir/operations/agentpush.ts
@@ -1,4 +1,12 @@
-import { AgentTransmitRequest, allOk, badRequest, BaseAgentRequestMessage, getReferenceString } from '@medplum/core';
+import {
+ AgentTransmitRequest,
+ AgentTransmitResponse,
+ allOk,
+ badRequest,
+ BaseAgentRequestMessage,
+ getReferenceString,
+ serverError,
+} from '@medplum/core';
import { Agent } from '@medplum/fhirtypes';
import { Request, Response } from 'express';
import { randomUUID } from 'node:crypto';
@@ -89,8 +97,15 @@ export const agentPushHandler = asyncWrap(async (req: Request, res: Response) =>
const redisSubscriber = getRedis().duplicate();
await redisSubscriber.subscribe(message.callback);
redisSubscriber.on('message', (_channel: string, message: string) => {
- const response = JSON.parse(message);
- res.status(200).type(response.contentType).send(response.body);
+ const response = JSON.parse(message) as AgentTransmitResponse;
+ if (response.statusCode && response.statusCode >= 400) {
+ sendOutcome(res, serverError(new Error(response.body)));
+ } else {
+ res
+ .status(response.statusCode ?? 200)
+ .type(response.contentType)
+ .send(response.body);
+ }
cleanup();
});
diff --git a/packages/server/src/index.test.ts b/packages/server/src/index.test.ts
index c1e358df2c..44fa1aae27 100644
--- a/packages/server/src/index.test.ts
+++ b/packages/server/src/index.test.ts
@@ -1,4 +1,4 @@
-import http from 'http';
+import http from 'node:http';
import { shutdownApp } from './app';
import { main } from './index';
@@ -19,7 +19,7 @@ jest.mock('express', () => {
});
jest.mock('pg', () => {
- const original = jest.requireActual('express');
+ const original = jest.requireActual('pg');
class MockPoolClient {
async query(sql: string): Promise {
From 6af2fa78c9671c3fc7c12c668b4d9103ad3a40c7 Mon Sep 17 00:00:00 2001
From: ksmith94 <102421938+ksmith94@users.noreply.github.com>
Date: Tue, 9 Apr 2024 12:19:52 -0400
Subject: [PATCH 02/52] Storybook Themes (#4337)
* Added Theme Add-on to storybook
* Removing fonts.
Adding a new theme
* Updating package version
* Add additional themes and move to separate page
* Update example names
* Add custom fonts
* add colors to theme
* Update theme names
---------
Co-authored-by: Rahul Agarwal
---
package-lock.json | 20 +
packages/react/.storybook/main.ts | 1 +
packages/react/.storybook/preview-head.html | 6 +
packages/react/.storybook/preview.tsx | 26 +-
packages/react/.storybook/themes.ts | 481 ++++++++++++++++++++
packages/react/package.json | 1 +
6 files changed, 512 insertions(+), 23 deletions(-)
create mode 100644 packages/react/.storybook/preview-head.html
create mode 100644 packages/react/.storybook/themes.ts
diff --git a/package-lock.json b/package-lock.json
index e93c1e4ae6..ba307e0a32 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50777,6 +50777,25 @@
"url": "https://opencollective.com/storybook"
}
},
+ "node_modules/storybook-addon-mantine": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/storybook-addon-mantine/-/storybook-addon-mantine-4.0.2.tgz",
+ "integrity": "sha512-nOxaIDTuZ0+Fh3vgsn3JRyCW/uCYBe9m0JxIQyXjMCa0ecl8op6wWdewAQ6IoeMSw33l/gZWHL0BLyTuqqX+kg==",
+ "dev": true,
+ "peerDependencies": {
+ "@mantine/core": "^7.0.0",
+ "@mantine/hooks": "^7.0.0",
+ "@storybook/blocks": "^8.0.0",
+ "@storybook/components": "^8.0.0",
+ "@storybook/core-events": "^8.0.0",
+ "@storybook/manager-api": "^8.0.0",
+ "@storybook/preview-api": "^8.0.0",
+ "@storybook/theming": "^8.0.0",
+ "@storybook/types": "^8.0.0",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
"node_modules/stream": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
@@ -55919,6 +55938,7 @@
"sinon": "17.0.1",
"storybook": "8.0.6",
"typescript": "5.4.4",
+ "storybook-addon-mantine": "4.0.2",
"vite-plugin-turbosnap": "^1.0.3"
},
"engines": {
diff --git a/packages/react/.storybook/main.ts b/packages/react/.storybook/main.ts
index 32dc913395..0e88894b41 100644
--- a/packages/react/.storybook/main.ts
+++ b/packages/react/.storybook/main.ts
@@ -16,6 +16,7 @@ const config: StorybookConfig = {
},
},
},
+ 'storybook-addon-mantine',
],
staticDirs: ['../public'],
framework: {
diff --git a/packages/react/.storybook/preview-head.html b/packages/react/.storybook/preview-head.html
new file mode 100644
index 0000000000..314bf801a1
--- /dev/null
+++ b/packages/react/.storybook/preview-head.html
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/react/.storybook/preview.tsx b/packages/react/.storybook/preview.tsx
index 44092fa60e..03bc56098a 100644
--- a/packages/react/.storybook/preview.tsx
+++ b/packages/react/.storybook/preview.tsx
@@ -1,9 +1,9 @@
-import { MantineProvider, MantineThemeOverride } from '@mantine/core';
import '@mantine/core/styles.css';
import { MockClient } from '@medplum/mock';
import { MedplumProvider } from '@medplum/react-hooks';
import { BrowserRouter } from 'react-router-dom';
import { createGlobalTimer } from '../src/stories/MockDateWrapper.utils';
+import { themes } from './themes';
export const parameters = {
layout: 'fullscreen',
@@ -26,32 +26,12 @@ medplum.get('/').then(() => {
clock.restore();
});
-const theme: MantineThemeOverride = {
- headings: {
- sizes: {
- h1: {
- fontSize: '1.125rem',
- fontWeight: '500',
- lineHeight: '2.0',
- },
- },
- },
- fontSizes: {
- xs: '0.6875rem',
- sm: '0.875rem',
- md: '0.875rem',
- lg: '1.0rem',
- xl: '1.125rem',
- },
-};
-
export const decorators = [
+ themes,
(Story) => (
-
-
-
+
),
diff --git a/packages/react/.storybook/themes.ts b/packages/react/.storybook/themes.ts
new file mode 100644
index 0000000000..c6dca1c83a
--- /dev/null
+++ b/packages/react/.storybook/themes.ts
@@ -0,0 +1,481 @@
+import { createTheme } from '@mantine/core';
+import { withMantineThemes } from 'storybook-addon-mantine';
+
+const medplumDefault = createTheme({
+ headings: {
+ sizes: {
+ h1: {
+ fontSize: '1.125rem',
+ fontWeight: '500',
+ lineHeight: '2.0',
+ },
+ },
+ },
+ fontSizes: {
+ xs: '0.6875rem',
+ sm: '0.875rem',
+ md: '0.875rem',
+ lg: '1.0rem',
+ xl: '1.125rem',
+ },
+});
+
+const fooMedical = createTheme({
+ colors: {
+ // Replace or adjust with the exact colors used for your design
+ primary: [
+ '#f7f7f7', // primary[0]
+ '#eef6f4', // primary[1]
+ '#e3eff2', // primary[2]
+ '#d5ebec', // primary[3]
+ '#cfe7e9', // primary[4]
+ '#b0d7db', // primary[5]
+ '#39acbc', // primary[6]
+ '#005450', // primary[7]
+ '#004d49', // primary[8]
+ '#00353a', // primary[9] (adjusted for a darker shade)
+ ],
+ secondary: [
+ '#fff7eb', // secondary[0]
+ '#ffedce', // secondary[1]
+ '#fae3c3', // secondary[2]
+ '#e9d1b9', // secondary[3]
+ '#e8c9a6', // secondary[4]
+ '#f1dfca', // secondary[5]
+ '#ffc776', // secondary[6]
+ '#fa645a', // secondary[7]
+ '#b57931', // secondary[8]
+ '#935923', // secondary[9] (adjusted for a darker shade)
+ ],
+ },
+ primaryColor: 'primary',
+ fontFamily: 'Ginto, helvetica',
+ radius: {
+ xs: '.5rem',
+ sm: '.75rem',
+ md: '1rem',
+ lg: '1.5rem',
+ xl: '2.5rem',
+ },
+ spacing: {
+ xs: '.25rem',
+ sm: '.33rem',
+ md: '.5rem',
+ lg: '.66rem',
+ xl: '1rem',
+ },
+ defaultRadius: 'xl',
+ shadows: {
+ xs: '0px 0px 0px rgba(0, 0, 0, 0)',
+ md: '2px 2px 1.5px rgba(0, 0, 0, .25)',
+ xl: '5px 5px 3px rgba(0, 0, 0, .25)',
+ },
+ headings: {
+ fontFamily: 'GT Super Display, serif',
+ sizes: {
+ h1: { fontSize: '30px', lineHeight: '1.4' },
+ h2: { fontSize: '24px', lineHeight: '1.35' },
+ h3: { fontSize: '20px', lineHeight: '1.3' },
+ h4: { fontSize: '18px', lineHeight: '1.25' },
+ h5: { fontSize: '16px', lineHeight: '1.2' },
+ h6: { fontSize: '14px', lineHeight: '1.15' },
+ },
+ },
+});
+
+const bonFoo = createTheme({
+ components: {
+ Paper: {
+ defaultProps: {
+ p: 'sm',
+ shadow: 'xs',
+ },
+ },
+ Table: {
+ defaultProps: {
+ striped: false,
+ // m: '16px',
+ },
+ },
+ },
+ fontFamily:
+ '-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji',
+ shadows: {
+ xs: 'none',
+ sm: 'none',
+ md: 'none',
+ lg: 'none',
+ xl: 'none',
+ },
+ spacing: {
+ xs: '8px',
+ sm: '10px',
+ md: '12px',
+ lg: '14px',
+ xl: '16px',
+ },
+ colors: {
+ destructive: [
+ '#FFF5F5',
+ '#FFE3E3',
+ '#FFC9C9',
+ '#FFA8A8',
+ '#FF8787',
+ '#FF6B6B',
+ '#FA5252',
+ '#F03E3E',
+ '#E03131',
+ '#C92A2A',
+ ],
+ dark: [
+ '#C1C2C5',
+ '#A6A7AB',
+ '#909296',
+ '#5C5F66',
+ '#373A40',
+ '#2C2E33',
+ '#25262B',
+ '#1A1B1E',
+ '#141517',
+ '#101113',
+ ],
+ primary: [
+ '#E7F5FF',
+ '#D0EBFF',
+ '#A5D8FF',
+ '#74C0FC',
+ '#4DABF7',
+ '#339AF0',
+ '#228BE6',
+ '#1C7ED6',
+ '#1971C2',
+ '#1864AB',
+ ],
+ neutral: [
+ '#F8F9FA',
+ '#F1F3F5',
+ '#E9ECEF',
+ '#DEE2E6',
+ '#CED4DA',
+ '#ADB5BD',
+ '#868E96',
+ '#495057',
+ '#343A40',
+ '#212529',
+ ],
+ },
+});
+
+const plumMedical = createTheme({
+ components: {
+ Divider: {
+ defaultProps: {
+ my: '0',
+ },
+ },
+ },
+ colors: {
+ primary: [
+ '#eef6f4',
+ '#00D7AB',
+ '#00B395',
+ '#00907E',
+ '#008062',
+ '#005450',
+ '#004D49',
+ '#003F3B',
+ '#003231',
+ '#002824',
+ ],
+ destructive: [
+ '#e8d3cf',
+ '#ddb3b0',
+ '#d59091',
+ '#cf6e77',
+ '#ca4956',
+ '#bc2f3d',
+ '#a0222f',
+ '#821722',
+ '#620e16',
+ '#400707',
+ ],
+ },
+ primaryColor: 'primary',
+ primaryShade: 6,
+ shadows: {
+ xs: '0px 0px 0px rgba(0, 0, 0, 0)',
+ sm: '0px 0px 0px rgba(0, 0, 0, 0)',
+ md: '0px 0px 0px rgba(0, 0, 0, 0)',
+ lg: '0px 0px 0px rgba(0, 0, 0, 0)',
+ xl: '0px 0px 0px rgba(0, 0, 0, 0)',
+ },
+ fontFamily: '"Ginto", helvetica, "sans-serif"',
+ headings: { fontFamily: 'GT Super Display, Times New Roman, "serif"' },
+ fontSizes: {
+ xs: '12px',
+ sm: '14px',
+ md: '18px',
+ lg: '22px',
+ xl: '30px',
+ },
+ radius: {
+ xs: '5px',
+ sm: '7px',
+ md: '9px',
+ lg: '11px',
+ xl: '13px',
+ },
+ defaultRadius: 'lg',
+ spacing: {
+ xs: '.5rem',
+ sm: '1rem',
+ md: '1.5rem',
+ lg: '2rem',
+ xl: '2.5rem',
+ },
+});
+
+const materialUi = createTheme({
+ fontFamily: 'Roboto, Helvetica, Arial, "sans-serif"',
+ fontSizes: {
+ xs: '.7rem',
+ sm: '.85rem',
+ md: '1rem',
+ lg: '1.2rem',
+ xl: '1.4rem',
+ },
+ colors: {
+ primary: [
+ '#cce5ff',
+ '#99ccff',
+ '#66b2ff',
+ '#3399ff',
+ '#0073e6',
+ '#0288d1',
+ '#006bd6',
+ '#0061c2',
+ '#004c99',
+ '#0037a5',
+ ],
+ },
+ primaryColor: 'primary',
+ primaryShade: 4,
+ shadows: {
+ xs: '0px 2px 1px -1px rgba(0, 0, 0, 0.2)',
+ sm: '0px 2px 1px -1px rgba(0, 0, 0, 0.2)',
+ md: '0px 1px 1px 0px rgba(0, 0, 0, 0.14)',
+ lg: '0px 1px 1px 0px rgba(0, 0, 0, 0.14)',
+ xl: '0px 1px 3px 0px rgba(0, 0, 0, 0.12)',
+ },
+ radius: {
+ xs: '0px',
+ sm: '2px',
+ md: '4px',
+ lg: '6px',
+ xl: '8px',
+ },
+ spacing: {
+ xs: '4px 8px',
+ sm: '6px 12px',
+ md: '8px 16px',
+ lg: '10px 20px',
+ xl: '12px 24px',
+ },
+});
+
+const sciFi = createTheme({
+ fontFamily: '"Gill Sans", arial, "sans-serif"',
+ colors: {
+ primary: [
+ '#FFFBB7',
+ '#FFF891',
+ '#FFF56A',
+ '#FFF244',
+ '#FFE81F',
+ '#FFD900',
+ '#ffb300',
+ '#f59b00',
+ '#eb8500',
+ '#e07000',
+ ],
+ },
+ primaryColor: 'primary',
+ primaryShade: 6,
+ black: '#412538',
+ radius: {
+ xs: '20px 10px',
+ sm: '30px 15px',
+ md: '40px 20px',
+ lg: '50px 25px',
+ xl: '60px 30px',
+ },
+ shadows: {
+ xs: '2px 1px 1px -1px #939393',
+ md: '3px 2px 1px -1px #939393',
+ xl: '4px 3px 1px -1px #939393',
+ },
+ spacing: {
+ xs: '1px',
+ sm: '3px',
+ md: '5px',
+ lg: '7px',
+ xl: '9px',
+ },
+ lineHeights: {
+ xs: '12px',
+ sm: '16px',
+ md: '20px',
+ lg: '24px',
+ xl: '30px',
+ },
+});
+
+const cursive = createTheme({
+ fontFamily: '"Brush Script MT", serif',
+ colors: {
+ primary: [
+ '#fce8e8',
+ '#f7cfd5',
+ '#f1bcc9',
+ '#e7a6c0',
+ '#d987b0',
+ '#c770a4',
+ '#b65d9c',
+ '#a85d9a',
+ '#845282',
+ '#604965',
+ ],
+ },
+ primaryColor: 'primary',
+ primaryShade: 5,
+ radius: {
+ xs: '0',
+ sm: '0',
+ md: '0',
+ lg: '0',
+ xl: '0',
+ },
+ shadows: {
+ xs: '4px 4px 3px grey',
+ sm: '8px 8px 3px grey',
+ md: '12px 12px 3px grey',
+ lg: '16px 16px 3px grey',
+ xl: '20px 20px 3px grey',
+ },
+});
+
+const caesar = createTheme({
+ fontFamily: '"Caesar Dressing", serif',
+ fontSizes: {
+ xs: '.8rem',
+ sm: '.9rem',
+ md: '1rem',
+ lg: '1.1rem',
+ xl: '1.2rem',
+ },
+ colors: {
+ primary: [
+ '#fd5d6b',
+ '#fb3737',
+ '#f81b1b',
+ '#d70909',
+ '#a00808',
+ '#810e0e',
+ '#601410',
+ '#4b1711',
+ '#34150f',
+ '#25120e',
+ ],
+ },
+ primaryColor: 'primary',
+ primaryShade: 4,
+ shadows: {
+ xs: '3px 3px 2px grey',
+ xl: '5px 5px 2px grey',
+ },
+});
+
+const wordArt = createTheme({
+ fontFamily: '"Bungee Spice", "sans-serif"',
+ defaultRadius: '0px',
+ shadows: {
+ xs: '0px 0px 0px',
+ sm: '0px 0px 0px',
+ md: '0px 0px 0px',
+ lg: '0px 0px 0px',
+ xl: '0px 0px 0px',
+ },
+ colors: {
+ primary: [
+ '#bcfeae',
+ '#90fa85',
+ '#64f55c',
+ '#34ed31',
+ '#1acf17',
+ '#1da21a',
+ '#1c7e1b',
+ '#1d5e20',
+ '#183f1c',
+ '#122b17',
+ ],
+ },
+ primaryColor: 'primary',
+ primaryShade: 4,
+ spacing: {
+ xs: '12px',
+ sm: '16px',
+ md: '20px',
+ lg: '24px',
+ xl: '30px',
+ },
+});
+
+export const themes = withMantineThemes({
+ themes: [
+ {
+ id: 'medplumDefault',
+ name: 'Medplum Default',
+ ...medplumDefault,
+ },
+ {
+ id: 'foomedical',
+ name: 'Foo Medical',
+ ...fooMedical,
+ },
+ {
+ id: 'bonfoo',
+ name: 'Bon Foo',
+ ...bonFoo,
+ },
+ {
+ id: 'plumMedical',
+ name: 'PlumMedical',
+ ...plumMedical,
+ },
+ {
+ id: 'materialUi',
+ name: 'Material UI',
+ ...materialUi,
+ },
+ {
+ id: 'sci-fi',
+ name: 'SciFi',
+ ...sciFi,
+ },
+ {
+ id: 'cursive',
+ name: 'Cursive',
+ ...cursive,
+ },
+ {
+ id: 'caesar',
+ name: 'Caesar',
+ ...caesar,
+ },
+ {
+ id: 'word-art',
+ name: 'Word Art',
+ ...wordArt,
+ },
+ ],
+});
diff --git a/packages/react/package.json b/packages/react/package.json
index 89d71cdab7..ae782633e8 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -105,6 +105,7 @@
"sinon": "17.0.1",
"storybook": "8.0.6",
"typescript": "5.4.4",
+ "storybook-addon-mantine": "4.0.2",
"vite-plugin-turbosnap": "^1.0.3"
},
"peerDependencies": {
From 24bfb5558d5ad1254214bb9a869308dd9d9f0f40 Mon Sep 17 00:00:00 2001
From: Jesse Carter
Date: Tue, 9 Apr 2024 10:41:05 -0600
Subject: [PATCH 03/52] Update index.md (#4347)
Just a small fix for the docs
---
packages/docs/docs/administration/provider-directory/index.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/docs/docs/administration/provider-directory/index.md b/packages/docs/docs/administration/provider-directory/index.md
index ee8da13c8f..5d14afe491 100644
--- a/packages/docs/docs/administration/provider-directory/index.md
+++ b/packages/docs/docs/administration/provider-directory/index.md
@@ -4,7 +4,7 @@ sidebar_position: 7
# Modeling your Provider Directory
-Provider Directories are critical databases housing essential details about healthcare providers, from individual practitioners to entire organizations. Accurate and standardized modeling of these directories, ensures better a better patient experience via improved coordination coordination of care and operational efficiency.
+Provider Directories are critical databases housing essential details about healthcare providers, from individual practitioners to entire organizations. Accurate and standardized modeling of these directories, ensures a better patient experience via improved coordination coordination of care and operational efficiency.
This section provide a series of guides on how to properly model your organization's provider directory. It focuses on a few key challenges:
From 7bd85be0a674d9f2a7f81a75437ca941540de141 Mon Sep 17 00:00:00 2001
From: jmalobicky
Date: Tue, 9 Apr 2024 16:58:50 -0400
Subject: [PATCH 04/52] Add config to set default Project Features (#4330)
* Add config to set default Project Features
* [autofix.ci] apply automated fixes
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
---
packages/docs/docs/self-hosting/config-settings.md | 1 +
packages/server/src/config.ts | 12 ++++++++++++
packages/server/src/fhir/operations/projectinit.ts | 3 +++
3 files changed, 16 insertions(+)
diff --git a/packages/docs/docs/self-hosting/config-settings.md b/packages/docs/docs/self-hosting/config-settings.md
index 85fde2ddce..61993bf989 100644
--- a/packages/docs/docs/self-hosting/config-settings.md
+++ b/packages/docs/docs/self-hosting/config-settings.md
@@ -156,6 +156,7 @@ Optionally override the trusted CA certificates. Default is to trust the well-kn
| `otlpTraceEndpoint` | Optional OTLP trace endpoint for OpenTelemetry. For example, `http://localhost:4318/v1/traces`. See [OpenTelemetry](/docs/self-hosting/opentelemetry) for more details. | | | |
| `accurateCountThreshold` | Optional threshold for accurate count queries. The server will always perform an estimate count first (to protect database performance), and an accurate count if the estimate is below this threshold. | | | `1000000` |
| `defaultBotRuntimeVersion` | Optional default bot runtime version. See [Bot runtime version](/docs/api/fhir/medplum/bot) for more details. | | | `awslambda` |
+| `defaultProjectFeatures` | Optional default project features. See [Project Settings](/docs/access/projects#settings) | | `init` | |
:::tip Local Config
To make changes to the server config after your first deploy, you must the edit parameter values _directly in AWS parameter store_
diff --git a/packages/server/src/config.ts b/packages/server/src/config.ts
index 0bc5f9d5b9..1268844d13 100644
--- a/packages/server/src/config.ts
+++ b/packages/server/src/config.ts
@@ -52,6 +52,17 @@ export interface MedplumServerConfig {
heartbeatEnabled?: boolean;
accurateCountThreshold: number;
defaultBotRuntimeVersion: 'awslambda' | 'vmcontext';
+ defaultProjectFeatures?:
+ | (
+ | 'email'
+ | 'bots'
+ | 'cron'
+ | 'google-auth-required'
+ | 'graphql-introspection'
+ | 'terminology'
+ | 'websocket-subscriptions'
+ )[]
+ | undefined;
/** Temporary feature flag, to be removed */
chainedSearchWithReferenceTables?: boolean;
@@ -334,6 +345,7 @@ function addDefaults(config: MedplumServerConfig): MedplumServerConfig {
config.shutdownTimeoutMilliseconds = config.shutdownTimeoutMilliseconds ?? 30000;
config.accurateCountThreshold = config.accurateCountThreshold ?? 1000000;
config.defaultBotRuntimeVersion = config.defaultBotRuntimeVersion ?? 'awslambda';
+ config.defaultProjectFeatures = config.defaultProjectFeatures ?? [];
return config;
}
diff --git a/packages/server/src/fhir/operations/projectinit.ts b/packages/server/src/fhir/operations/projectinit.ts
index d77b69528d..6656a03757 100644
--- a/packages/server/src/fhir/operations/projectinit.ts
+++ b/packages/server/src/fhir/operations/projectinit.ts
@@ -16,6 +16,7 @@ import { getAuthenticatedContext, getRequestContext } from '../../context';
import { getUserByEmailWithoutProject } from '../../oauth/utils';
import { getSystemRepo } from '../repo';
import { buildOutputParameters, parseInputParameters } from './utils/parameters';
+import { getConfig } from '../../config';
const projectInitOperation: OperationDefinition = {
resourceType: 'OperationDefinition',
@@ -127,6 +128,7 @@ export async function createProject(
}> {
const ctx = getRequestContext();
const systemRepo = getSystemRepo();
+ const config = getConfig();
ctx.logger.info('Project creation request received', { name: projectName });
const project = await systemRepo.createResource({
@@ -134,6 +136,7 @@ export async function createProject(
name: projectName,
owner: admin ? createReference(admin) : undefined,
strictMode: true,
+ features: config.defaultProjectFeatures,
});
ctx.logger.info('Project created', {
From e59b7bb505bc918831188b9b087e079c06ed51a6 Mon Sep 17 00:00:00 2001
From: Derrick Farris
Date: Tue, 9 Apr 2024 16:33:23 -0700
Subject: [PATCH 05/52] tweak(redis): add `getRedisSubscriber` for graceful
shutdown safety (#4336)
* tweak(redis): add `getRedisSubscriber` for graceful shutdown safety
* chore(redis): update JSDoc comments
* test(redis): fix subscriber test hang
* refactor(server): all subscribers cleaned up on `closeRedis()`
---
packages/server/src/agent/websockets.ts | 4 +-
.../server/src/fhir/operations/agentpush.ts | 4 +-
packages/server/src/fhircast/websocket.ts | 4 +-
packages/server/src/redis.test.ts | 78 ++++++++++++++++++-
packages/server/src/redis.ts | 54 ++++++++++++-
.../server/src/subscriptions/websockets.ts | 4 +-
packages/server/src/websockets.ts | 4 +-
.../server/src/workers/subscription.test.ts | 17 ++--
8 files changed, 149 insertions(+), 20 deletions(-)
diff --git a/packages/server/src/agent/websockets.ts b/packages/server/src/agent/websockets.ts
index d6cfba398e..154f578535 100644
--- a/packages/server/src/agent/websockets.ts
+++ b/packages/server/src/agent/websockets.ts
@@ -16,7 +16,7 @@ import { getRepoForLogin } from '../fhir/accesspolicy';
import { executeBot } from '../fhir/operations/execute';
import { heartbeat } from '../heartbeat';
import { getLoginForAccessToken } from '../oauth/utils';
-import { getRedis } from '../redis';
+import { getRedis, getRedisSubscriber } from '../redis';
const STATUS_EX_SECONDS = 24 * 60 * 60; // 24 hours in seconds
@@ -115,7 +115,7 @@ export async function handleAgentConnection(socket: ws.WebSocket, request: Incom
const agent = await repo.readResource('Agent', agentId);
// Connect to Redis
- redisSubscriber = getRedis().duplicate();
+ redisSubscriber = getRedisSubscriber();
await redisSubscriber.subscribe(getReferenceString(agent));
redisSubscriber.on('message', (_channel: string, message: string) => {
// When a message is received, send it to the agent
diff --git a/packages/server/src/fhir/operations/agentpush.ts b/packages/server/src/fhir/operations/agentpush.ts
index 52107a2680..0bee00b899 100644
--- a/packages/server/src/fhir/operations/agentpush.ts
+++ b/packages/server/src/fhir/operations/agentpush.ts
@@ -12,7 +12,7 @@ import { Request, Response } from 'express';
import { randomUUID } from 'node:crypto';
import { asyncWrap } from '../../async';
import { getAuthenticatedContext } from '../../context';
-import { getRedis } from '../../redis';
+import { getRedis, getRedisSubscriber } from '../../redis';
import { sendOutcome } from '../outcomes';
import { getAgentForRequest, getDevice } from './agentutils';
import { parseParameters } from './utils/parameters';
@@ -94,7 +94,7 @@ export const agentPushHandler = asyncWrap(async (req: Request, res: Response) =>
// Otherwise, open a new redis connection in "subscribe" state
message.callback = getReferenceString(agent) + '-' + randomUUID();
- const redisSubscriber = getRedis().duplicate();
+ const redisSubscriber = getRedisSubscriber();
await redisSubscriber.subscribe(message.callback);
redisSubscriber.on('message', (_channel: string, message: string) => {
const response = JSON.parse(message) as AgentTransmitResponse;
diff --git a/packages/server/src/fhircast/websocket.ts b/packages/server/src/fhircast/websocket.ts
index cb4ee23b25..0a0faf9a7b 100644
--- a/packages/server/src/fhircast/websocket.ts
+++ b/packages/server/src/fhircast/websocket.ts
@@ -4,7 +4,7 @@ import { IncomingMessage } from 'http';
import ws from 'ws';
import { DEFAULT_HEARTBEAT_MS, heartbeat } from '../heartbeat';
import { globalLogger } from '../logger';
-import { getRedis } from '../redis';
+import { getRedis, getRedisSubscriber } from '../redis';
/**
* Handles a new WebSocket connection to the FHIRCast hub.
@@ -20,7 +20,7 @@ export async function handleFhircastConnection(socket: ws.WebSocket, request: In
// Once the client enters the subscribed state it is not supposed to issue any other commands,
// except for additional SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE and PUNSUBSCRIBE commands.
const redis = getRedis();
- const redisSubscriber = redis.duplicate();
+ const redisSubscriber = getRedisSubscriber();
// Subscribe to the topic
await redisSubscriber.subscribe(topic);
diff --git a/packages/server/src/redis.test.ts b/packages/server/src/redis.test.ts
index 1dc387c67d..a132ffb2b1 100644
--- a/packages/server/src/redis.test.ts
+++ b/packages/server/src/redis.test.ts
@@ -1,9 +1,15 @@
-import { loadTestConfig } from './config';
-import { closeRedis, getRedis, initRedis } from './redis';
+import { Redis } from 'ioredis';
+import { MedplumServerConfig, loadTestConfig } from './config';
+import { closeRedis, getRedis, getRedisSubscriber, getRedisSubscriberCount, initRedis } from './redis';
describe('Redis', () => {
+ let config: MedplumServerConfig;
+
+ beforeAll(async () => {
+ config = await loadTestConfig();
+ });
+
test('Get redis', async () => {
- const config = await loadTestConfig();
initRedis(config.redis);
expect(getRedis()).toBeDefined();
await closeRedis();
@@ -13,4 +19,70 @@ describe('Redis', () => {
expect(() => getRedis()).toThrow();
await expect(closeRedis()).resolves.toBeUndefined();
});
+
+ describe('getRedisSubscriber', () => {
+ test('Not initialized', async () => {
+ await closeRedis();
+ expect(() => getRedisSubscriber()).toThrow();
+ });
+
+ test('Getting a subscriber', async () => {
+ initRedis(config.redis);
+ const subscriber = getRedisSubscriber();
+ expect(subscriber).toBeInstanceOf(Redis);
+ await closeRedis();
+ });
+
+ test('Hanging subscriber still disconnects on closeRedis', async () => {
+ initRedis(config.redis);
+ const subscriber = getRedisSubscriber();
+
+ let reject: (err: Error) => void;
+ const closePromise = new Promise((resolve, _reject) => {
+ subscriber.on('end', () => {
+ resolve();
+ });
+ reject = _reject;
+ });
+
+ expect(subscriber).toBeDefined();
+ await closeRedis();
+
+ const timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ await expect(closePromise).resolves.toBeUndefined();
+ clearTimeout(timer);
+ });
+
+ test('Disconnecting a subscriber removes it from the list', async () => {
+ initRedis(config.redis);
+ expect(getRedisSubscriberCount()).toEqual(0);
+ const subscriber = getRedisSubscriber();
+ expect(getRedisSubscriberCount()).toEqual(1);
+ subscriber.disconnect();
+
+ let reject: (err: Error) => void;
+ const closePromise = new Promise((resolve, _reject) => {
+ subscriber.on('end', () => {
+ resolve();
+ });
+ reject = _reject;
+ });
+
+ expect(subscriber).toBeDefined();
+ await closeRedis();
+
+ const timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ await expect(closePromise).resolves.toBeUndefined();
+ expect(getRedisSubscriberCount()).toEqual(0);
+ clearTimeout(timer);
+
+ await closeRedis();
+ });
+ });
});
diff --git a/packages/server/src/redis.ts b/packages/server/src/redis.ts
index 0ae0bbedf3..c99db6b296 100644
--- a/packages/server/src/redis.ts
+++ b/packages/server/src/redis.ts
@@ -3,6 +3,7 @@ import Redis from 'ioredis';
import { MedplumRedisConfig } from './config';
let redis: Redis | undefined = undefined;
+let redisSubscribers: Set | undefined = undefined;
export function initRedis(config: MedplumRedisConfig): void {
redis = new Redis(config);
@@ -11,15 +12,66 @@ export function initRedis(config: MedplumRedisConfig): void {
export async function closeRedis(): Promise {
if (redis) {
const tmpRedis = redis;
+ const tmpSubscribers = redisSubscribers;
redis = undefined;
+ redisSubscribers = undefined;
+ if (tmpSubscribers) {
+ for (const subscriber of tmpSubscribers) {
+ subscriber.disconnect();
+ }
+ }
await tmpRedis.quit();
await sleep(100);
}
}
-export function getRedis(): Redis {
+/**
+ * Gets the global `Redis` instance.
+ *
+ * The `duplicate` method is intentionally omitted to prevent accidental calling of `Redis.quit`
+ * which can cause the global instance to fail to shutdown gracefully later on.
+ *
+ * Instead {@link getRedisSubscriber} should be called to obtain a `Redis` instance for use as a subscriber-mode client.
+ *
+ * @returns The global `Redis` instance.
+ */
+export function getRedis(): Redis & { duplicate: never } {
if (!redis) {
throw new Error('Redis not initialized');
}
+ // @ts-expect-error We don't want anyone to call `duplicate on the redis global instance
+ // This is because we want to gracefully `quit` and duplicated Redis instances will
return redis;
}
+
+/**
+ * Gets a `Redis` instance for use in subscriber mode.
+ *
+ * The synchronous `.disconnect()` on this instance should be called instead of `.quit()` when you want to disconnect.
+ *
+ * @returns A `Redis` instance to use as a subscriber client.
+ */
+export function getRedisSubscriber(): Redis & { quit: never } {
+ if (!redis) {
+ throw new Error('Redis not initialized');
+ }
+ if (!redisSubscribers) {
+ redisSubscribers = new Set();
+ }
+
+ const subscriber = redis.duplicate();
+ redisSubscribers.add(subscriber);
+
+ subscriber.on('end', () => {
+ redisSubscribers?.delete(subscriber);
+ });
+
+ return subscriber as Redis & { quit: never };
+}
+
+/**
+ * @returns The amount of active `Redis` subscriber instances.
+ */
+export function getRedisSubscriberCount(): number {
+ return redisSubscribers?.size ?? 0;
+}
diff --git a/packages/server/src/subscriptions/websockets.ts b/packages/server/src/subscriptions/websockets.ts
index 0a07686fd7..910499cb58 100644
--- a/packages/server/src/subscriptions/websockets.ts
+++ b/packages/server/src/subscriptions/websockets.ts
@@ -10,7 +10,7 @@ import { getFullUrl } from '../fhir/response';
import { heartbeat } from '../heartbeat';
import { globalLogger } from '../logger';
import { verifyJwt } from '../oauth/keys';
-import { getRedis } from '../redis';
+import { getRedis, getRedisSubscriber } from '../redis';
interface BaseSubscriptionClientMsg {
type: string;
@@ -44,7 +44,7 @@ export async function handleR4SubscriptionConnection(socket: ws.WebSocket): Prom
// According to Redis documentation: http://redis.io/commands/subscribe
// Once the client enters the subscribed state it is not supposed to issue any other commands,
// except for additional SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE and PUNSUBSCRIBE commands.
- redisSubscriber = redis.duplicate();
+ redisSubscriber = getRedisSubscriber();
redisSubscriber.on('message', (channel: string, message: string) => {
globalLogger.debug('[WS] redis message', { channel, message });
diff --git a/packages/server/src/websockets.ts b/packages/server/src/websockets.ts
index 090fddaa2b..a3f528c495 100644
--- a/packages/server/src/websockets.ts
+++ b/packages/server/src/websockets.ts
@@ -8,7 +8,7 @@ import { getConfig } from './config';
import { RequestContext, requestContextStore } from './context';
import { handleFhircastConnection } from './fhircast/websocket';
import { globalLogger } from './logger';
-import { getRedis } from './redis';
+import { getRedis, getRedisSubscriber } from './redis';
import { handleR4SubscriptionConnection } from './subscriptions/websockets';
const handlerMap = new Map Promise>();
@@ -104,7 +104,7 @@ async function handleEchoConnection(socket: ws.WebSocket): Promise {
// According to Redis documentation: http://redis.io/commands/subscribe
// Once the client enters the subscribed state it is not supposed to issue any other commands,
// except for additional SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE and PUNSUBSCRIBE commands.
- const redisSubscriber = getRedis().duplicate();
+ const redisSubscriber = getRedisSubscriber();
const channel = randomUUID();
await redisSubscriber.subscribe(channel);
diff --git a/packages/server/src/workers/subscription.test.ts b/packages/server/src/workers/subscription.test.ts
index c15139c2d7..cb35074585 100644
--- a/packages/server/src/workers/subscription.test.ts
+++ b/packages/server/src/workers/subscription.test.ts
@@ -26,7 +26,7 @@ import { loadTestConfig } from '../config';
import { getDatabasePool } from '../database';
import { Repository, getSystemRepo } from '../fhir/repo';
import { globalLogger } from '../logger';
-import { getRedis } from '../redis';
+import { getRedisSubscriber } from '../redis';
import { createTestProject, withTestContext } from '../test.setup';
import { AuditEventOutcome } from '../util/auditevent';
import { closeSubscriptionWorker, execSubscriptionJob, getSubscriptionQueue } from './subscription';
@@ -1517,7 +1517,7 @@ describe('Subscription Worker', () => {
expect(subscription.id).toBeDefined();
// Subscribe to the topic
- const subscriber = getRedis().duplicate();
+ const subscriber = getRedisSubscriber();
await subscriber.subscribe(subscription.id as string);
let resolve: () => void;
@@ -1564,6 +1564,7 @@ describe('Subscription Worker', () => {
expect(queue.add).toHaveBeenCalled();
await deferredPromise;
+ // @ts-expect-error Okay to await quit in tests
await subscriber.quit();
}));
@@ -1591,7 +1592,7 @@ describe('Subscription Worker', () => {
expect(subscription.id).toBeDefined();
// Subscribe to the topic
- const subscriber = getRedis().duplicate();
+ const subscriber = getRedisSubscriber();
await subscriber.subscribe(subscription.id as string);
let resolve: () => void;
@@ -1622,6 +1623,7 @@ describe('Subscription Worker', () => {
}, 150);
await deferredPromise;
+ // @ts-expect-error Okay to await quit in tests
await subscriber.quit();
expect(console.log).toHaveBeenLastCalledWith(expect.stringMatching(/WebSocket Subscriptions/));
@@ -1670,7 +1672,7 @@ describe('Subscription Worker', () => {
expect(subscription.id).toBeDefined();
// Subscribe to the topic
- const subscriber = getRedis().duplicate();
+ const subscriber = getRedisSubscriber();
await subscriber.subscribe(subscription.id as string);
let resolve: () => void;
@@ -1698,6 +1700,7 @@ describe('Subscription Worker', () => {
setTimeout(() => resolve(), 300);
await deferredPromise;
+ // @ts-expect-error Okay to await quit in tests
await subscriber.quit();
expect(console.log).toHaveBeenCalledWith(
@@ -1748,7 +1751,7 @@ describe('Subscription Worker', () => {
await superAdminRepo.deleteResource('ProjectMembership', membership.id as string);
// Subscribe to the topic
- const subscriber = getRedis().duplicate();
+ const subscriber = getRedisSubscriber();
await subscriber.subscribe(subscription.id as string);
let resolve: () => void;
@@ -1776,6 +1779,7 @@ describe('Subscription Worker', () => {
setTimeout(() => resolve(), 300);
await deferredPromise;
+ // @ts-expect-error Okay to await quit in tests
await subscriber.quit();
expect(console.log).toHaveBeenCalledWith(
@@ -1826,7 +1830,7 @@ describe('Subscription Worker', () => {
await superAdminRepo.deleteResource('AccessPolicy', accessPolicy.id as string);
// Subscribe to the topic
- const subscriber = getRedis().duplicate();
+ const subscriber = getRedisSubscriber();
await subscriber.subscribe(subscription.id as string);
let resolve: () => void;
@@ -1854,6 +1858,7 @@ describe('Subscription Worker', () => {
setTimeout(() => resolve(), 300);
await deferredPromise;
+ // @ts-expect-error Okay to await quit in test
await subscriber.quit();
expect(console.log).toHaveBeenCalledWith(
From 2bc266923c934c821edb01e349e4fbfd04e0bf75 Mon Sep 17 00:00:00 2001
From: James Wu <88938117+thejwuscript@users.noreply.github.com>
Date: Wed, 10 Apr 2024 12:03:30 +0900
Subject: [PATCH 06/52] Clear auth state on auth failure (#4341)
* Clear all previous auth state on 401
* Update docs on medplumClient
* Prevent calling sessionStorage in Node env
---
packages/core/src/client.ts | 6 ++++--
packages/docs/docs/auth/methods/index.md | 2 ++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/packages/core/src/client.ts b/packages/core/src/client.ts
index 49592e182a..b5305ff7a6 100644
--- a/packages/core/src/client.ts
+++ b/packages/core/src/client.ts
@@ -906,7 +906,9 @@ export class MedplumClient extends EventTarget {
*/
clear(): void {
this.storage.clear();
- sessionStorage.clear();
+ if (typeof window !== 'undefined') {
+ sessionStorage.clear();
+ }
this.clearActiveLogin();
}
@@ -3310,7 +3312,7 @@ export class MedplumClient extends EventTarget {
if (this.refresh()) {
return this.request(method, url, options);
}
- this.clearActiveLogin();
+ this.clear();
if (this.onUnauthenticated) {
this.onUnauthenticated();
}
diff --git a/packages/docs/docs/auth/methods/index.md b/packages/docs/docs/auth/methods/index.md
index b34f45ab3d..b9ce149957 100644
--- a/packages/docs/docs/auth/methods/index.md
+++ b/packages/docs/docs/auth/methods/index.md
@@ -114,6 +114,7 @@ All three implementations types will have tokens or client credentials with syst
- Consider disabling local storage on device for shared workstations or in accordance with institution policy.
- Organizations with mobile devices or laptops should enable a Mobile Device Management (MDM) solution for workstations
- [IP restrictions](/docs/access/ip-access-rules) can be enabled when especially sensitive data, such as personal health information (PHI), is being accessed.
+- Reusing the same `MedplumClient` instance for different users is discouraged. Consider creating new instances of `MedplumClient` instead.
### Server Authentication
@@ -122,6 +123,7 @@ All three implementations types will have tokens or client credentials with syst
- Restrict access to host via VPC or other mechanism - do not allow access from general internet.
- Use a secrets management to store access keys - do not store credentials on disk.
- Ensure host is patched and has security updates applied regularly.
+- Consider creating a new instance of `MedplumClient`, particularly when switching to another user.
### Host authentication
From 48cb0e97db6527329b203a4846b9afdd2cffcd81 Mon Sep 17 00:00:00 2001
From: Cody Ebberson
Date: Tue, 9 Apr 2024 20:43:37 -0700
Subject: [PATCH 07/52] Agent SerialPort connections (#4348)
* Agent SerialPort connections
* Fixed hibp mocks in projectinit.test.ts
---
package-lock.json | 2994 +++++++++++++++--
packages/agent/package.json | 1 +
packages/agent/src/app.ts | 3 +
packages/agent/src/serialport.test.ts | 173 +
packages/agent/src/serialport.ts | 184 +
.../src/fhir/operations/projectinit.test.ts | 24 +-
6 files changed, 3157 insertions(+), 222 deletions(-)
create mode 100644 packages/agent/src/serialport.test.ts
create mode 100644 packages/agent/src/serialport.ts
diff --git a/package-lock.json b/package-lock.json
index ba307e0a32..34f00c0d53 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -812,16 +812,14 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-cloudformation": {
+ "node_modules/@aws-sdk/client-acm/node_modules/@aws-sdk/client-sso": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.549.0.tgz",
- "integrity": "sha512-mEJUP2guSOdku5/+LIiKwAA9WE+nHKEtKPGOyOL0x72lkZCsfM3QSr35Xi6p1Aip3XB/LI+UCuoYpjiaceSpSw==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
- "@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@@ -856,24 +854,21 @@
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
"@smithy/util-utf8": "^2.3.0",
- "@smithy/util-waiter": "^2.2.0",
- "tslib": "^2.6.2",
- "uuid": "^9.0.1"
+ "tslib": "^2.6.2"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-cloudfront": {
+ "node_modules/@aws-sdk/client-acm/node_modules/@aws-sdk/client-sso-oidc": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.549.0.tgz",
- "integrity": "sha512-XoTKP2sttLl7azal3baptnk4r1zSVX5KjRVim9dlLFViCRrSxpWwQNXKyKI53Hk1rsy0CNxJzPYd4/ag11kOCQ==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
- "@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@@ -883,7 +878,6 @@
"@aws-sdk/util-endpoints": "3.540.0",
"@aws-sdk/util-user-agent-browser": "3.535.0",
"@aws-sdk/util-user-agent-node": "3.535.0",
- "@aws-sdk/xml-builder": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
"@smithy/fetch-http-handler": "^2.5.0",
@@ -908,19 +902,130 @@
"@smithy/util-endpoints": "^1.2.0",
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
- "@smithy/util-stream": "^2.2.0",
"@smithy/util-utf8": "^2.3.0",
- "@smithy/util-waiter": "^2.2.0",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
}
},
- "node_modules/@aws-sdk/client-cloudwatch-logs": {
+ "node_modules/@aws-sdk/client-acm/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-acm/node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.549.0.tgz",
- "integrity": "sha512-LAB4MWkx41wF+IImj4nucMmgAkGFD51sR5JkXsUoB5leLo0Oz84ZEFZ8RfqshF6ReoW5lmSRyB8x1663KdRcLA==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-acm/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-acm/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-acm/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-acm/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudformation": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.549.0.tgz",
+ "integrity": "sha512-mEJUP2guSOdku5/+LIiKwAA9WE+nHKEtKPGOyOL0x72lkZCsfM3QSr35Xi6p1Aip3XB/LI+UCuoYpjiaceSpSw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
@@ -938,9 +1043,6 @@
"@aws-sdk/util-user-agent-node": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
- "@smithy/eventstream-serde-browser": "^2.2.0",
- "@smithy/eventstream-serde-config-resolver": "^2.2.0",
- "@smithy/eventstream-serde-node": "^2.2.0",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/hash-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
@@ -964,6 +1066,7 @@
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
"@smithy/util-utf8": "^2.3.0",
+ "@smithy/util-waiter": "^2.2.0",
"tslib": "^2.6.2",
"uuid": "^9.0.1"
},
@@ -971,16 +1074,14 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-ecs": {
+ "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.549.0.tgz",
- "integrity": "sha512-3eiIs8O0fDKyjy6ch7Y7Xgb2GWt8/n+AUR4uQXP0jQWnmou/UAqwYKp5S8tqusxDV8ZG47maBFd/dZ+xOlyq2A==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
- "@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@@ -1015,24 +1116,21 @@
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
"@smithy/util-utf8": "^2.3.0",
- "@smithy/util-waiter": "^2.2.0",
- "tslib": "^2.6.2",
- "uuid": "^9.0.1"
+ "tslib": "^2.6.2"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-lambda": {
+ "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso-oidc": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.549.0.tgz",
- "integrity": "sha512-VdLltPf6fUDBFHPJBtYsWnM+nvdau7KuRlwwGnYzmYap79ifE538JTXE6AGyGcIp3YP44BlFtWgvW26kvDbX9g==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
- "@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@@ -1044,9 +1142,6 @@
"@aws-sdk/util-user-agent-node": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
- "@smithy/eventstream-serde-browser": "^2.2.0",
- "@smithy/eventstream-serde-config-resolver": "^2.2.0",
- "@smithy/eventstream-serde-node": "^2.2.0",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/hash-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
@@ -1069,39 +1164,141 @@
"@smithy/util-endpoints": "^1.2.0",
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
- "@smithy/util-stream": "^2.2.0",
"@smithy/util-utf8": "^2.3.0",
- "@smithy/util-waiter": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-s3": {
- "version": "3.550.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.550.0.tgz",
- "integrity": "sha512-45jjDQI0Q37PIteWhywhlExxYaiUeOsTsbE62b+U/FOjYV8tirC8uBY9eHeHaP4IPVGHeQWvEYrFJHNU+qsQLQ==",
+ "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudfront": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.549.0.tgz",
+ "integrity": "sha512-XoTKP2sttLl7azal3baptnk4r1zSVX5KjRVim9dlLFViCRrSxpWwQNXKyKI53Hk1rsy0CNxJzPYd4/ag11kOCQ==",
"dependencies": {
- "@aws-crypto/sha1-browser": "3.0.0",
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
"@aws-sdk/credential-provider-node": "3.549.0",
- "@aws-sdk/middleware-bucket-endpoint": "3.535.0",
- "@aws-sdk/middleware-expect-continue": "3.535.0",
- "@aws-sdk/middleware-flexible-checksums": "3.535.0",
"@aws-sdk/middleware-host-header": "3.535.0",
- "@aws-sdk/middleware-location-constraint": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
- "@aws-sdk/middleware-sdk-s3": "3.535.0",
- "@aws-sdk/middleware-signing": "3.535.0",
- "@aws-sdk/middleware-ssec": "3.537.0",
"@aws-sdk/middleware-user-agent": "3.540.0",
"@aws-sdk/region-config-resolver": "3.535.0",
- "@aws-sdk/signature-v4-multi-region": "3.535.0",
"@aws-sdk/types": "3.535.0",
"@aws-sdk/util-endpoints": "3.540.0",
"@aws-sdk/util-user-agent-browser": "3.535.0",
@@ -1109,15 +1306,9 @@
"@aws-sdk/xml-builder": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
- "@smithy/eventstream-serde-browser": "^2.2.0",
- "@smithy/eventstream-serde-config-resolver": "^2.2.0",
- "@smithy/eventstream-serde-node": "^2.2.0",
"@smithy/fetch-http-handler": "^2.5.0",
- "@smithy/hash-blob-browser": "^2.2.0",
"@smithy/hash-node": "^2.2.0",
- "@smithy/hash-stream-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
- "@smithy/md5-js": "^2.2.0",
"@smithy/middleware-content-length": "^2.2.0",
"@smithy/middleware-endpoint": "^2.5.0",
"@smithy/middleware-retry": "^2.3.0",
@@ -1135,6 +1326,7 @@
"@smithy/util-defaults-mode-browser": "^2.2.0",
"@smithy/util-defaults-mode-node": "^2.3.0",
"@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
"@smithy/util-stream": "^2.2.0",
"@smithy/util-utf8": "^2.3.0",
@@ -1145,16 +1337,14 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-secrets-manager": {
+ "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/client-sso": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.549.0.tgz",
- "integrity": "sha512-UcfU1vdghAJMWK1T6NnNe0ZhOIfSY6s0OBooXSybDgZvH47g+rYD/4VdtZRWRSjdCcF4PA+hfRa7vhfOyXdW/A==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
- "@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@@ -1189,23 +1379,21 @@
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
"@smithy/util-utf8": "^2.3.0",
- "tslib": "^2.6.2",
- "uuid": "^9.0.1"
+ "tslib": "^2.6.2"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-sesv2": {
+ "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/client-sso-oidc": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.549.0.tgz",
- "integrity": "sha512-o+78gx6E4aKB9dqbUfpCo7SP24zQn8BKmh17hWOXB6ryDqZUHeaoeJh0gtcrE6EXEsEtqGlXIIaTu9kYdYDepA==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.549.0",
"@aws-sdk/core": "3.549.0",
- "@aws-sdk/credential-provider-node": "3.549.0",
"@aws-sdk/middleware-host-header": "3.535.0",
"@aws-sdk/middleware-logger": "3.535.0",
"@aws-sdk/middleware-recursion-detection": "3.535.0",
@@ -1244,12 +1432,125 @@
},
"engines": {
"node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
}
},
- "node_modules/@aws-sdk/client-ssm": {
+ "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.549.0.tgz",
- "integrity": "sha512-h5EvM1e09+ybmaCFXVjibWGyBSJ7yNIgKFq1SoifnZ5O4nf6SNNAhbuea1Gq4JCcjvDfzJ4Wl3EqVHf/Jb9oJg==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudwatch-logs": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.549.0.tgz",
+ "integrity": "sha512-LAB4MWkx41wF+IImj4nucMmgAkGFD51sR5JkXsUoB5leLo0Oz84ZEFZ8RfqshF6ReoW5lmSRyB8x1663KdRcLA==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
@@ -1267,6 +1568,9 @@
"@aws-sdk/util-user-agent-node": "3.535.0",
"@smithy/config-resolver": "^2.2.0",
"@smithy/core": "^1.4.1",
+ "@smithy/eventstream-serde-browser": "^2.2.0",
+ "@smithy/eventstream-serde-config-resolver": "^2.2.0",
+ "@smithy/eventstream-serde-node": "^2.2.0",
"@smithy/fetch-http-handler": "^2.5.0",
"@smithy/hash-node": "^2.2.0",
"@smithy/invalid-dependency": "^2.2.0",
@@ -1290,7 +1594,6 @@
"@smithy/util-middleware": "^2.2.0",
"@smithy/util-retry": "^2.2.0",
"@smithy/util-utf8": "^2.3.0",
- "@smithy/util-waiter": "^2.2.0",
"tslib": "^2.6.2",
"uuid": "^9.0.1"
},
@@ -1298,7 +1601,7 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-sso": {
+ "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
"integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
@@ -1346,7 +1649,7 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/client-sso-oidc": {
+ "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso-oidc": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
"integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
@@ -1398,93 +1701,78 @@
"@aws-sdk/credential-provider-node": "^3.549.0"
}
},
- "node_modules/@aws-sdk/client-sts": {
- "version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.549.0.tgz",
- "integrity": "sha512-63IreJ598Dzvpb+6sy81KfIX5iQxnrWSEtlyeCdC2GO6gmSQVwJzc9kr5pAC83lHmlZcm/Q3KZr3XBhRQqP0og==",
+ "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
"dependencies": {
- "@aws-crypto/sha256-browser": "3.0.0",
- "@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/core": "3.549.0",
- "@aws-sdk/middleware-host-header": "3.535.0",
- "@aws-sdk/middleware-logger": "3.535.0",
- "@aws-sdk/middleware-recursion-detection": "3.535.0",
- "@aws-sdk/middleware-user-agent": "3.540.0",
- "@aws-sdk/region-config-resolver": "3.535.0",
"@aws-sdk/types": "3.535.0",
- "@aws-sdk/util-endpoints": "3.540.0",
- "@aws-sdk/util-user-agent-browser": "3.535.0",
- "@aws-sdk/util-user-agent-node": "3.535.0",
- "@smithy/config-resolver": "^2.2.0",
- "@smithy/core": "^1.4.1",
"@smithy/fetch-http-handler": "^2.5.0",
- "@smithy/hash-node": "^2.2.0",
- "@smithy/invalid-dependency": "^2.2.0",
- "@smithy/middleware-content-length": "^2.2.0",
- "@smithy/middleware-endpoint": "^2.5.0",
- "@smithy/middleware-retry": "^2.3.0",
- "@smithy/middleware-serde": "^2.3.0",
- "@smithy/middleware-stack": "^2.2.0",
- "@smithy/node-config-provider": "^2.3.0",
"@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
"@smithy/protocol-http": "^3.3.0",
"@smithy/smithy-client": "^2.5.0",
"@smithy/types": "^2.12.0",
- "@smithy/url-parser": "^2.2.0",
- "@smithy/util-base64": "^2.3.0",
- "@smithy/util-body-length-browser": "^2.2.0",
- "@smithy/util-body-length-node": "^2.3.0",
- "@smithy/util-defaults-mode-browser": "^2.2.0",
- "@smithy/util-defaults-mode-node": "^2.3.0",
- "@smithy/util-endpoints": "^1.2.0",
- "@smithy/util-middleware": "^2.2.0",
- "@smithy/util-retry": "^2.2.0",
- "@smithy/util-utf8": "^2.3.0",
+ "@smithy/util-stream": "^2.2.0",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=14.0.0"
- },
- "peerDependencies": {
- "@aws-sdk/credential-provider-node": "^3.549.0"
}
},
- "node_modules/@aws-sdk/cloudfront-signer": {
- "version": "3.541.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/cloudfront-signer/-/cloudfront-signer-3.541.0.tgz",
- "integrity": "sha512-WBC11kKMWpuvvBmoKfsdAj0JuS0Atu6whd3dbdMxQmhar+G8iEh2gBoFlExE3Ixzn991bY7w3/NY8yb9TpwA8g==",
+ "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
"dependencies": {
- "@smithy/url-parser": "^2.2.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/core": {
+ "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-node": {
"version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.549.0.tgz",
- "integrity": "sha512-jC61OxJn72r/BbuDRCcluiw05Xw9eVLG0CwxQpF3RocxfxyZqlrGYaGecZ8Wy+7g/3sqGRC/Ar5eUhU1YcLx7w==",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
"dependencies": {
- "@smithy/core": "^1.4.1",
- "@smithy/protocol-http": "^3.3.0",
- "@smithy/signature-v4": "^2.2.0",
- "@smithy/smithy-client": "^2.5.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
"@smithy/types": "^2.12.0",
- "fast-xml-parser": "4.2.5",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/credential-provider-env": {
- "version": "3.535.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.535.0.tgz",
- "integrity": "sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==",
- "dependencies": {
- "@aws-sdk/types": "3.535.0",
+ "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
"@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
"@smithy/types": "^2.12.0",
"tslib": "^2.6.2"
},
@@ -1492,7 +1780,190 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/credential-provider-http": {
+ "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ecs": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.549.0.tgz",
+ "integrity": "sha512-3eiIs8O0fDKyjy6ch7Y7Xgb2GWt8/n+AUR4uQXP0jQWnmou/UAqwYKp5S8tqusxDV8ZG47maBFd/dZ+xOlyq2A==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/credential-provider-node": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "@smithy/util-waiter": "^2.2.0",
+ "tslib": "^2.6.2",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ecs/node_modules/@aws-sdk/client-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ecs/node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ecs/node_modules/@aws-sdk/credential-provider-http": {
"version": "3.535.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
"integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
@@ -1511,7 +1982,7 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/credential-provider-ini": {
+ "node_modules/@aws-sdk/client-ecs/node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
"integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
@@ -1532,7 +2003,272 @@
"node": ">=14.0.0"
}
},
- "node_modules/@aws-sdk/credential-provider-node": {
+ "node_modules/@aws-sdk/client-ecs/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ecs/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ecs/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ecs/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-lambda": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.549.0.tgz",
+ "integrity": "sha512-VdLltPf6fUDBFHPJBtYsWnM+nvdau7KuRlwwGnYzmYap79ifE538JTXE6AGyGcIp3YP44BlFtWgvW26kvDbX9g==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/credential-provider-node": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/eventstream-serde-browser": "^2.2.0",
+ "@smithy/eventstream-serde-config-resolver": "^2.2.0",
+ "@smithy/eventstream-serde-node": "^2.2.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-stream": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "@smithy/util-waiter": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/client-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-node": {
"version": "3.549.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
"integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
@@ -1554,6 +2290,1533 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3": {
+ "version": "3.550.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.550.0.tgz",
+ "integrity": "sha512-45jjDQI0Q37PIteWhywhlExxYaiUeOsTsbE62b+U/FOjYV8tirC8uBY9eHeHaP4IPVGHeQWvEYrFJHNU+qsQLQ==",
+ "dependencies": {
+ "@aws-crypto/sha1-browser": "3.0.0",
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/credential-provider-node": "3.549.0",
+ "@aws-sdk/middleware-bucket-endpoint": "3.535.0",
+ "@aws-sdk/middleware-expect-continue": "3.535.0",
+ "@aws-sdk/middleware-flexible-checksums": "3.535.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-location-constraint": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-sdk-s3": "3.535.0",
+ "@aws-sdk/middleware-signing": "3.535.0",
+ "@aws-sdk/middleware-ssec": "3.537.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/signature-v4-multi-region": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@aws-sdk/xml-builder": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/eventstream-serde-browser": "^2.2.0",
+ "@smithy/eventstream-serde-config-resolver": "^2.2.0",
+ "@smithy/eventstream-serde-node": "^2.2.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-blob-browser": "^2.2.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/hash-stream-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/md5-js": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-stream": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "@smithy/util-waiter": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.549.0.tgz",
+ "integrity": "sha512-UcfU1vdghAJMWK1T6NnNe0ZhOIfSY6s0OBooXSybDgZvH47g+rYD/4VdtZRWRSjdCcF4PA+hfRa7vhfOyXdW/A==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/credential-provider-node": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/client-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.549.0.tgz",
+ "integrity": "sha512-o+78gx6E4aKB9dqbUfpCo7SP24zQn8BKmh17hWOXB6ryDqZUHeaoeJh0gtcrE6EXEsEtqGlXIIaTu9kYdYDepA==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/credential-provider-node": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2/node_modules/@aws-sdk/client-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2/node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sesv2/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.549.0.tgz",
+ "integrity": "sha512-h5EvM1e09+ybmaCFXVjibWGyBSJ7yNIgKFq1SoifnZ5O4nf6SNNAhbuea1Gq4JCcjvDfzJ4Wl3EqVHf/Jb9oJg==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/credential-provider-node": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "@smithy/util-waiter": "^2.2.0",
+ "tslib": "^2.6.2",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.549.0.tgz",
+ "integrity": "sha512-lz+yflOAj5Q263FlCsKpNqttaCb2NPh8jC76gVCqCt7TPxRDBYVaqg0OZYluDaETIDNJi4DwN2Azcck7ilwuPw==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.549.0.tgz",
+ "integrity": "sha512-FbB4A78ILAb8sM4TfBd+3CrQcfZIhe0gtVZNbaxpq5cJZh1K7oZ8vPfKw4do9JWkDUXPLsD9Bwz12f8/JpAb6Q==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz",
+ "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.549.0.tgz",
+ "integrity": "sha512-k6IIrluZjQpzui5Din8fW3bFFhHaJ64XrsfYx0Ks1mb7xan84dJxmYP3tdDDmLzUeJv5h95ag88taHfjY9rakA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.549.0.tgz",
+ "integrity": "sha512-f3YgalsMuywEAVX4AUm9tojqrBdfpAac0+D320ePzas0Ntbp7ItYu9ceKIhgfzXO3No7P3QK0rCrOxL+ABTn8Q==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.535.0",
+ "@aws-sdk/credential-provider-ini": "3.549.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.549.0",
+ "@aws-sdk/credential-provider-web-identity": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
+ "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.549.0",
+ "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
+ "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
+ "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.552.0.tgz",
+ "integrity": "sha512-IAjRj5gcuyoPe/OhciMY/UyW8C1kyXSUJFagxvbeSv8q0mEfaPBVjGgz2xSYRFhhZr3gFlGCS9SiukwOL2/VoA==",
+ "peer": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.552.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.2",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.1",
+ "@smithy/middleware-retry": "^2.3.1",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.1",
+ "@smithy/util-defaults-mode-node": "^2.3.1",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.552.0.tgz",
+ "integrity": "sha512-6JYTgN/n4xTm3Z+JhEZq06pyYsgo7heYDmR+0smmauQS02Eu8lvUc2jPs/0GDAmty7J4tq3gS6TRwvf7181C2w==",
+ "peer": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.552.0",
+ "@aws-sdk/core": "3.552.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.2",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.1",
+ "@smithy/middleware-retry": "^2.3.1",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.1",
+ "@smithy/util-defaults-mode-node": "^2.3.1",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.552.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/client-sts": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.552.0.tgz",
+ "integrity": "sha512-rOZlAj8GyFgUBESyKezes67A8Kj5+KjRhfBHMXrkcM5h9UOIz5q7QdkSQOmzWwRoPDmmAqb6t+y041/76TnPEg==",
+ "peer": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.552.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.2",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.1",
+ "@smithy/middleware-retry": "^2.3.1",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.1",
+ "@smithy/util-defaults-mode-node": "^2.3.1",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.552.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/core": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.552.0.tgz",
+ "integrity": "sha512-T7ovljf6fCvIHG9SOSZqGmbVbqZPXPywLAcU+onk/fYLZJj6kjfzKZzSAUBI0nO1OKpuP/nCHaCp51NLWNqsnw==",
+ "peer": true,
+ "dependencies": {
+ "@smithy/core": "^1.4.2",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/signature-v4": "^2.2.1",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "fast-xml-parser": "4.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/core": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.552.0.tgz",
+ "integrity": "sha512-T7ovljf6fCvIHG9SOSZqGmbVbqZPXPywLAcU+onk/fYLZJj6kjfzKZzSAUBI0nO1OKpuP/nCHaCp51NLWNqsnw==",
+ "peer": true,
+ "dependencies": {
+ "@smithy/core": "^1.4.2",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/signature-v4": "^2.2.1",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "fast-xml-parser": "4.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sts": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.549.0.tgz",
+ "integrity": "sha512-63IreJ598Dzvpb+6sy81KfIX5iQxnrWSEtlyeCdC2GO6gmSQVwJzc9kr5pAC83lHmlZcm/Q3KZr3XBhRQqP0og==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.549.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.1",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.0",
+ "@smithy/middleware-retry": "^2.3.0",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.0",
+ "@smithy/util-defaults-mode-node": "^2.3.0",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.549.0"
+ }
+ },
+ "node_modules/@aws-sdk/cloudfront-signer": {
+ "version": "3.541.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/cloudfront-signer/-/cloudfront-signer-3.541.0.tgz",
+ "integrity": "sha512-WBC11kKMWpuvvBmoKfsdAj0JuS0Atu6whd3dbdMxQmhar+G8iEh2gBoFlExE3Ixzn991bY7w3/NY8yb9TpwA8g==",
+ "dependencies": {
+ "@smithy/url-parser": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/core": {
+ "version": "3.549.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.549.0.tgz",
+ "integrity": "sha512-jC61OxJn72r/BbuDRCcluiw05Xw9eVLG0CwxQpF3RocxfxyZqlrGYaGecZ8Wy+7g/3sqGRC/Ar5eUhU1YcLx7w==",
+ "dependencies": {
+ "@smithy/core": "^1.4.1",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/signature-v4": "^2.2.0",
+ "@smithy/smithy-client": "^2.5.0",
+ "@smithy/types": "^2.12.0",
+ "fast-xml-parser": "4.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.535.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.535.0.tgz",
+ "integrity": "sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.552.0.tgz",
+ "integrity": "sha512-vsmu7Cz1i45pFEqzVb4JcFmAmVnWFNLsGheZc8SCptlqCO5voETrZZILHYIl4cjKkSDk3pblBOf0PhyjqWW6WQ==",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "@smithy/util-stream": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.552.0.tgz",
+ "integrity": "sha512-/Z9y+P4M/eZA/5hGH3Kwm6TOIAiVtsIo7sC/x7hZPXn/IMJQ2QmxzeMozVqMWzx8+2zUA/dmgmWnHoVvH4R/jg==",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/client-sts": "3.552.0",
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.552.0",
+ "@aws-sdk/credential-provider-web-identity": "3.552.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/client-sts": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.552.0.tgz",
+ "integrity": "sha512-rOZlAj8GyFgUBESyKezes67A8Kj5+KjRhfBHMXrkcM5h9UOIz5q7QdkSQOmzWwRoPDmmAqb6t+y041/76TnPEg==",
+ "peer": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.552.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.2",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.1",
+ "@smithy/middleware-retry": "^2.3.1",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.1",
+ "@smithy/util-defaults-mode-node": "^2.3.1",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.552.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/core": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.552.0.tgz",
+ "integrity": "sha512-T7ovljf6fCvIHG9SOSZqGmbVbqZPXPywLAcU+onk/fYLZJj6kjfzKZzSAUBI0nO1OKpuP/nCHaCp51NLWNqsnw==",
+ "peer": true,
+ "dependencies": {
+ "@smithy/core": "^1.4.2",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/signature-v4": "^2.2.1",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "fast-xml-parser": "4.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.552.0.tgz",
+ "integrity": "sha512-GUH5awokiR4FcALeQxOrNZtDKJgzEza6NW9HYxAaHt0LNSHCjG21zMFDPYAXlDjlPP9AIdWmVvYrfJoPJI28AQ==",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.535.0",
+ "@aws-sdk/credential-provider-http": "3.552.0",
+ "@aws-sdk/credential-provider-ini": "3.552.0",
+ "@aws-sdk/credential-provider-process": "3.535.0",
+ "@aws-sdk/credential-provider-sso": "3.552.0",
+ "@aws-sdk/credential-provider-web-identity": "3.552.0",
+ "@aws-sdk/types": "3.535.0",
+ "@smithy/credential-provider-imds": "^2.3.0",
+ "@smithy/property-provider": "^2.2.0",
+ "@smithy/shared-ini-file-loader": "^2.4.0",
+ "@smithy/types": "^2.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@aws-sdk/credential-provider-process": {
"version": "3.535.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.535.0.tgz",
@@ -1570,12 +3833,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
- "version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.549.0.tgz",
- "integrity": "sha512-BGopRKHs7W8zkoH8qmSHrjudj263kXbhVkAUPxVUz0I28+CZNBgJC/RfVCbOpzmysIQEpwSqvOv1y0k+DQzIJQ==",
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.552.0.tgz",
+ "integrity": "sha512-h+xyWG4HMqf4SFzilpK1u50fO2aIBRg3nwuXRy9v5E2qdpJgZS2JXibO1jNHd+JXq4qjs2YG1WK2fGcdxZJ2bQ==",
+ "peer": true,
"dependencies": {
- "@aws-sdk/client-sso": "3.549.0",
- "@aws-sdk/token-providers": "3.549.0",
+ "@aws-sdk/client-sso": "3.552.0",
+ "@aws-sdk/token-providers": "3.552.0",
"@aws-sdk/types": "3.535.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/shared-ini-file-loader": "^2.4.0",
@@ -1587,11 +3851,12 @@
}
},
"node_modules/@aws-sdk/credential-provider-web-identity": {
- "version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.549.0.tgz",
- "integrity": "sha512-QzclVXPxuwSI7515l34sdvliVq5leroO8P7RQFKRgfyQKO45o1psghierwG3PgV6jlMiv78FIAGJBr/n4qZ7YA==",
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.552.0.tgz",
+ "integrity": "sha512-6jXfXaLKDy3S4LHR8ZXIIZw5B80uiYjnPp4bmqmY18LGeoZxmkJ/SfkwypVruezCu+GpA+IubmIbc5TQi6BCAw==",
+ "peer": true,
"dependencies": {
- "@aws-sdk/client-sts": "3.549.0",
+ "@aws-sdk/client-sts": "3.552.0",
"@aws-sdk/types": "3.535.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/types": "^2.12.0",
@@ -1601,6 +3866,76 @@
"node": ">=14.0.0"
}
},
+ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/client-sts": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.552.0.tgz",
+ "integrity": "sha512-rOZlAj8GyFgUBESyKezes67A8Kj5+KjRhfBHMXrkcM5h9UOIz5q7QdkSQOmzWwRoPDmmAqb6t+y041/76TnPEg==",
+ "peer": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/core": "3.552.0",
+ "@aws-sdk/middleware-host-header": "3.535.0",
+ "@aws-sdk/middleware-logger": "3.535.0",
+ "@aws-sdk/middleware-recursion-detection": "3.535.0",
+ "@aws-sdk/middleware-user-agent": "3.540.0",
+ "@aws-sdk/region-config-resolver": "3.535.0",
+ "@aws-sdk/types": "3.535.0",
+ "@aws-sdk/util-endpoints": "3.540.0",
+ "@aws-sdk/util-user-agent-browser": "3.535.0",
+ "@aws-sdk/util-user-agent-node": "3.535.0",
+ "@smithy/config-resolver": "^2.2.0",
+ "@smithy/core": "^1.4.2",
+ "@smithy/fetch-http-handler": "^2.5.0",
+ "@smithy/hash-node": "^2.2.0",
+ "@smithy/invalid-dependency": "^2.2.0",
+ "@smithy/middleware-content-length": "^2.2.0",
+ "@smithy/middleware-endpoint": "^2.5.1",
+ "@smithy/middleware-retry": "^2.3.1",
+ "@smithy/middleware-serde": "^2.3.0",
+ "@smithy/middleware-stack": "^2.2.0",
+ "@smithy/node-config-provider": "^2.3.0",
+ "@smithy/node-http-handler": "^2.5.0",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "@smithy/url-parser": "^2.2.0",
+ "@smithy/util-base64": "^2.3.0",
+ "@smithy/util-body-length-browser": "^2.2.0",
+ "@smithy/util-body-length-node": "^2.3.0",
+ "@smithy/util-defaults-mode-browser": "^2.2.1",
+ "@smithy/util-defaults-mode-node": "^2.3.1",
+ "@smithy/util-endpoints": "^1.2.0",
+ "@smithy/util-middleware": "^2.2.0",
+ "@smithy/util-retry": "^2.2.0",
+ "@smithy/util-utf8": "^2.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-provider-node": "^3.552.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/core": {
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.552.0.tgz",
+ "integrity": "sha512-T7ovljf6fCvIHG9SOSZqGmbVbqZPXPywLAcU+onk/fYLZJj6kjfzKZzSAUBI0nO1OKpuP/nCHaCp51NLWNqsnw==",
+ "peer": true,
+ "dependencies": {
+ "@smithy/core": "^1.4.2",
+ "@smithy/protocol-http": "^3.3.0",
+ "@smithy/signature-v4": "^2.2.1",
+ "@smithy/smithy-client": "^2.5.1",
+ "@smithy/types": "^2.12.0",
+ "fast-xml-parser": "4.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@aws-sdk/lib-storage": {
"version": "3.550.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.550.0.tgz",
@@ -1821,11 +4156,12 @@
}
},
"node_modules/@aws-sdk/token-providers": {
- "version": "3.549.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.549.0.tgz",
- "integrity": "sha512-rJyeXkXknLukRFGuMQOgKnPBa+kLODJtOqEBf929SpQ96f1I6ytdndmWbB5B/OQN5Fu5DOOQUQqJypDQVl5ibQ==",
+ "version": "3.552.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.552.0.tgz",
+ "integrity": "sha512-5dNE2KqtgkT+DQXfkSmzmVSB72LpjSIK86lLD9LeQ1T+b0gfEd74MAl/AGC15kQdKLg5I3LlN5q32f1fkmYR8g==",
+ "peer": true,
"dependencies": {
- "@aws-sdk/client-sso-oidc": "3.549.0",
+ "@aws-sdk/client-sso-oidc": "3.552.0",
"@aws-sdk/types": "3.535.0",
"@smithy/property-provider": "^2.2.0",
"@smithy/shared-ini-file-loader": "^2.4.0",
@@ -4122,9 +6458,9 @@
"peer": true
},
"node_modules/@codemirror/view": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.1.tgz",
- "integrity": "sha512-wLw0t3R9AwOSQThdZ5Onw8QQtem5asE7+bPlnzc57eubPqiuJKIzwjMZ+C42vQett+iva+J8VgFV4RYWDBh5FA==",
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.2.tgz",
+ "integrity": "sha512-j6V48PlFC/O7ERAR5vRW5QKDdchzmyyfojDdt+zPsB0YXoWgcjlC1IWjmlYfx08aQZ3HN5BtALcgGgtSKGMe7A==",
"dev": true,
"peer": true,
"dependencies": {
@@ -8064,14 +10400,14 @@
}
},
"node_modules/@expo/env": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.2.2.tgz",
- "integrity": "sha512-m9nGuaSpzdvMzevQ1H60FWgf4PG5s4J0dfKUzdAGnDu7sMUerY/yUeDaA4+OBo3vBwGVQ+UHcQS9vPSMBNaPcg==",
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.2.3.tgz",
+ "integrity": "sha512-a+uJ/e6MAVxPVVN/HbXU5qxzdqrqDwNQYxCfxtAufgmd5VZj54e5f3TJA3LEEUW3pTSZR8xK0H0EtVN297AZnw==",
"dependencies": {
"chalk": "^4.0.0",
"debug": "^4.3.4",
- "dotenv": "~16.0.3",
- "dotenv-expand": "~10.0.0",
+ "dotenv": "~16.4.5",
+ "dotenv-expand": "~11.0.6",
"getenv": "^1.0.0"
}
},
@@ -8104,12 +10440,18 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/@expo/env/node_modules/dotenv": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
- "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
+ "node_modules/@expo/env/node_modules/dotenv-expand": {
+ "version": "11.0.6",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz",
+ "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==",
+ "dependencies": {
+ "dotenv": "^16.4.4"
+ },
"engines": {
"node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
}
},
"node_modules/@expo/env/node_modules/supports-color": {
@@ -16054,6 +18396,195 @@
"url": "https://ko-fi.com/killymxi"
}
},
+ "node_modules/@serialport/binding-mock": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-10.2.2.tgz",
+ "integrity": "sha512-HAFzGhk9OuFMpuor7aT5G1ChPgn5qSsklTFOTUX72Rl6p0xwcSVsRtG/xaGp6bxpN7fI9D/S8THLBWbBgS6ldw==",
+ "dependencies": {
+ "@serialport/bindings-interface": "^1.2.1",
+ "debug": "^4.3.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@serialport/bindings-cpp": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/@serialport/bindings-cpp/-/bindings-cpp-12.0.1.tgz",
+ "integrity": "sha512-r2XOwY2dDvbW7dKqSPIk2gzsr6M6Qpe9+/Ngs94fNaNlcTRCV02PfaoDmRgcubpNVVcLATlxSxPTIDw12dbKOg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@serialport/bindings-interface": "1.2.2",
+ "@serialport/parser-readline": "11.0.0",
+ "debug": "4.3.4",
+ "node-addon-api": "7.0.0",
+ "node-gyp-build": "4.6.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/bindings-cpp/node_modules/@serialport/parser-delimiter": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-11.0.0.tgz",
+ "integrity": "sha512-aZLJhlRTjSmEwllLG7S4J8s8ctRAS0cbvCpO87smLvl3e4BgzbVgF6Z6zaJd3Aji2uSiYgfedCdNc4L6W+1E2g==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/bindings-cpp/node_modules/@serialport/parser-readline": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-11.0.0.tgz",
+ "integrity": "sha512-rRAivhRkT3YO28WjmmG4FQX6L+KMb5/ikhyylRfzWPw0nSXy97+u07peS9CbHqaNvJkMhH1locp2H36aGMOEIA==",
+ "dependencies": {
+ "@serialport/parser-delimiter": "11.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/bindings-interface": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@serialport/bindings-interface/-/bindings-interface-1.2.2.tgz",
+ "integrity": "sha512-CJaUd5bLvtM9c5dmO9rPBHPXTa9R2UwpkJ0wdh9JCYcbrPWsKz+ErvR0hBLeo7NPeiFdjFO4sonRljiw4d2XiA==",
+ "engines": {
+ "node": "^12.22 || ^14.13 || >=16"
+ }
+ },
+ "node_modules/@serialport/parser-byte-length": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-12.0.0.tgz",
+ "integrity": "sha512-0ei0txFAj+s6FTiCJFBJ1T2hpKkX8Md0Pu6dqMrYoirjPskDLJRgZGLqoy3/lnU1bkvHpnJO+9oJ3PB9v8rNlg==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/parser-cctalk": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-12.0.0.tgz",
+ "integrity": "sha512-0PfLzO9t2X5ufKuBO34DQKLXrCCqS9xz2D0pfuaLNeTkyGUBv426zxoMf3rsMRodDOZNbFblu3Ae84MOQXjnZw==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/parser-delimiter": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-12.0.0.tgz",
+ "integrity": "sha512-gu26tVt5lQoybhorLTPsH2j2LnX3AOP2x/34+DUSTNaUTzu2fBXw+isVjQJpUBFWu6aeQRZw5bJol5X9Gxjblw==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/parser-inter-byte-timeout": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-inter-byte-timeout/-/parser-inter-byte-timeout-12.0.0.tgz",
+ "integrity": "sha512-GnCh8K0NAESfhCuXAt+FfBRz1Cf9CzIgXfp7SdMgXwrtuUnCC/yuRTUFWRvuzhYKoAo1TL0hhUo77SFHUH1T/w==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/parser-packet-length": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-packet-length/-/parser-packet-length-12.0.0.tgz",
+ "integrity": "sha512-p1hiCRqvGHHLCN/8ZiPUY/G0zrxd7gtZs251n+cfNTn+87rwcdUeu9Dps3Aadx30/sOGGFL6brIRGK4l/t7MuQ==",
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/@serialport/parser-readline": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-12.0.0.tgz",
+ "integrity": "sha512-O7cywCWC8PiOMvo/gglEBfAkLjp/SENEML46BXDykfKP5mTPM46XMaX1L0waWU6DXJpBgjaL7+yX6VriVPbN4w==",
+ "dependencies": {
+ "@serialport/parser-delimiter": "12.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/parser-ready": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-12.0.0.tgz",
+ "integrity": "sha512-ygDwj3O4SDpZlbrRUraoXIoIqb8sM7aMKryGjYTIF0JRnKeB1ys8+wIp0RFMdFbO62YriUDextHB5Um5cKFSWg==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/parser-regex": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-12.0.0.tgz",
+ "integrity": "sha512-dCAVh4P/pZrLcPv9NJ2mvPRBg64L5jXuiRxIlyxxdZGH4WubwXVXY/kBTihQmiAMPxbT3yshSX8f2+feqWsxqA==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/parser-slip-encoder": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-slip-encoder/-/parser-slip-encoder-12.0.0.tgz",
+ "integrity": "sha512-0APxDGR9YvJXTRfY+uRGhzOhTpU5akSH183RUcwzN7QXh8/1jwFsFLCu0grmAUfi+fItCkR+Xr1TcNJLR13VNA==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/parser-spacepacket": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/parser-spacepacket/-/parser-spacepacket-12.0.0.tgz",
+ "integrity": "sha512-dozONxhPC/78pntuxpz/NOtVps8qIc/UZzdc/LuPvVsqCoJXiRxOg6ZtCP/W58iibJDKPZPAWPGYeZt9DJxI+Q==",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
+ "node_modules/@serialport/stream": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-12.0.0.tgz",
+ "integrity": "sha512-9On64rhzuqKdOQyiYLYv2lQOh3TZU/D3+IWCR5gk0alPel2nwpp4YwDEGiUBfrQZEdQ6xww0PWkzqth4wqwX3Q==",
+ "dependencies": {
+ "@serialport/bindings-interface": "1.2.2",
+ "debug": "4.3.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
"node_modules/@sideway/address": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
@@ -17740,9 +20271,9 @@
}
},
"node_modules/@storybook/core-server/node_modules/@types/node": {
- "version": "18.19.30",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.30.tgz",
- "integrity": "sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg==",
+ "version": "18.19.31",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz",
+ "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
@@ -18185,9 +20716,9 @@
}
},
"node_modules/@storybook/react/node_modules/@types/node": {
- "version": "18.19.30",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.30.tgz",
- "integrity": "sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg==",
+ "version": "18.19.31",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz",
+ "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
@@ -20129,9 +22660,9 @@
}
},
"node_modules/@types/ssh2/node_modules/@types/node": {
- "version": "18.19.30",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.30.tgz",
- "integrity": "sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg==",
+ "version": "18.19.31",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz",
+ "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
@@ -21573,7 +24104,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
"integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.5",
"is-array-buffer": "^3.0.4"
@@ -21723,7 +24253,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
"integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
- "dev": true,
"dependencies": {
"array-buffer-byte-length": "^1.0.1",
"call-bind": "^1.0.5",
@@ -26601,7 +29130,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
"integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.6",
"es-errors": "^1.3.0",
@@ -26618,7 +29146,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
"integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
@@ -26635,7 +29162,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
"integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.6",
"es-errors": "^1.3.0",
@@ -27564,6 +30090,7 @@
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz",
"integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==",
+ "dev": true,
"engines": {
"node": ">=12"
}
@@ -27836,7 +30363,6 @@
"version": "1.23.3",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
"integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
- "dev": true,
"dependencies": {
"array-buffer-byte-length": "^1.0.1",
"arraybuffer.prototype.slice": "^1.0.3",
@@ -27972,7 +30498,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
"integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
- "dev": true,
"dependencies": {
"es-errors": "^1.3.0"
},
@@ -27984,7 +30509,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
"integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
- "dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4",
"has-tostringtag": "^1.0.2",
@@ -28007,7 +30531,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
"dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
@@ -31068,7 +33591,6 @@
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
"integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
@@ -31313,7 +33835,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
"integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.5",
"es-errors": "^1.3.0",
@@ -31557,7 +34078,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
"integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
"dependencies": {
"define-properties": "^1.1.3"
},
@@ -31794,7 +34314,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
"integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -32965,7 +35484,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
"integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
- "dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"hasown": "^2.0.0",
@@ -33141,7 +35659,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
"integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.2.1"
@@ -33177,7 +35694,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
"integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
"dependencies": {
"has-bigints": "^1.0.1"
},
@@ -33201,7 +35717,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
"integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
@@ -33271,7 +35786,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
"integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
- "dev": true,
"dependencies": {
"is-typed-array": "^1.1.13"
},
@@ -33537,7 +36051,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
"integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
- "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -33569,7 +36082,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
"integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
"dependencies": {
"has-tostringtag": "^1.0.0"
},
@@ -33699,7 +36211,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
"integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7"
},
@@ -33725,7 +36236,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
"integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
"dependencies": {
"has-tostringtag": "^1.0.0"
},
@@ -33740,7 +36250,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
"integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dev": true,
"dependencies": {
"has-symbols": "^1.0.2"
},
@@ -33809,7 +36318,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2"
},
@@ -36263,9 +38771,14 @@
}
},
"node_modules/json-schema-deref-sync/node_modules/traverse": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz",
- "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==",
+ "version": "0.6.9",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz",
+ "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==",
+ "dependencies": {
+ "gopd": "^1.0.1",
+ "typedarray.prototype.slice": "^1.0.3",
+ "which-typed-array": "^1.1.15"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -41893,6 +44406,11 @@
"resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
"integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="
},
+ "node_modules/node-addon-api": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz",
+ "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA=="
+ },
"node_modules/node-cleanup": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz",
@@ -42002,6 +44520,16 @@
"node": "^12.13 || ^14.13 || >=16"
}
},
+ "node_modules/node-gyp-build": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
+ "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
"node_modules/node-gyp-build-optional-packages": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz",
@@ -43542,7 +46070,6 @@
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
"integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
@@ -46139,9 +48666,9 @@
"integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w=="
},
"node_modules/preact": {
- "version": "10.20.1",
- "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz",
- "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==",
+ "version": "10.20.2",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.2.tgz",
+ "integrity": "sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/preact"
@@ -48976,7 +51503,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
"integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"get-intrinsic": "^1.2.4",
@@ -48993,8 +51519,7 @@
"node_modules/safe-array-concat/node_modules/isarray": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
},
"node_modules/safe-buffer": {
"version": "5.1.2",
@@ -49011,7 +51536,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
"integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.6",
"es-errors": "^1.3.0",
@@ -49273,6 +51797,33 @@
"randombytes": "^2.1.0"
}
},
+ "node_modules/serialport": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/serialport/-/serialport-12.0.0.tgz",
+ "integrity": "sha512-AmH3D9hHPFmnF/oq/rvigfiAouAKyK/TjnrkwZRYSFZxNggJxwvbAbfYrLeuvq7ktUdhuHdVdSjj852Z55R+uA==",
+ "dependencies": {
+ "@serialport/binding-mock": "10.2.2",
+ "@serialport/bindings-cpp": "12.0.1",
+ "@serialport/parser-byte-length": "12.0.0",
+ "@serialport/parser-cctalk": "12.0.0",
+ "@serialport/parser-delimiter": "12.0.0",
+ "@serialport/parser-inter-byte-timeout": "12.0.0",
+ "@serialport/parser-packet-length": "12.0.0",
+ "@serialport/parser-readline": "12.0.0",
+ "@serialport/parser-ready": "12.0.0",
+ "@serialport/parser-regex": "12.0.0",
+ "@serialport/parser-slip-encoder": "12.0.0",
+ "@serialport/parser-spacepacket": "12.0.0",
+ "@serialport/stream": "12.0.0",
+ "debug": "4.3.4"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/serialport/donate"
+ }
+ },
"node_modules/serve-handler": {
"version": "6.1.5",
"resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz",
@@ -49947,9 +52498,9 @@
}
},
"node_modules/socks": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz",
- "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==",
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.2.tgz",
+ "integrity": "sha512-5Hvyu6Md91ooZzdrN/bSn/zlulFaRHrk2/6IY6qQNa3oVHTiG+CKxBV5PynKCGf31ar+3/hyPvlHFAYaBEOa3A==",
"dev": true,
"dependencies": {
"ip-address": "^9.0.5",
@@ -51023,7 +53574,6 @@
"version": "1.2.9",
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
"integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"define-properties": "^1.2.1",
@@ -51041,7 +53591,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
"integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"define-properties": "^1.2.1",
@@ -51055,7 +53604,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
"integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"define-properties": "^1.2.1",
@@ -52829,7 +55377,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
"integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
@@ -52843,7 +55390,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
"integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
@@ -52862,7 +55408,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
"integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
- "dev": true,
"dependencies": {
"available-typed-arrays": "^1.0.7",
"call-bind": "^1.0.7",
@@ -52882,7 +55427,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
"integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
@@ -52912,6 +55456,25 @@
"is-typedarray": "^1.0.0"
}
},
+ "node_modules/typedarray.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.0",
+ "es-errors": "^1.3.0",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-offset": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/typescript": {
"version": "5.4.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz",
@@ -52976,7 +55539,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
"integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-bigints": "^1.0.2",
@@ -54786,7 +57348,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
"integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
"dependencies": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
@@ -55482,6 +58043,7 @@
"@medplum/hl7": "3.1.2",
"dcmjs-dimse": "0.1.27",
"node-windows": "1.0.0-beta.8",
+ "serialport": "12.0.0",
"ws": "8.16.0"
},
"devDependencies": {
@@ -55937,8 +58499,8 @@
"rimraf": "5.0.5",
"sinon": "17.0.1",
"storybook": "8.0.6",
- "typescript": "5.4.4",
"storybook-addon-mantine": "4.0.2",
+ "typescript": "5.4.4",
"vite-plugin-turbosnap": "^1.0.3"
},
"engines": {
diff --git a/packages/agent/package.json b/packages/agent/package.json
index 14ce8c8846..5f82b7d38d 100644
--- a/packages/agent/package.json
+++ b/packages/agent/package.json
@@ -27,6 +27,7 @@
"@medplum/hl7": "3.1.2",
"dcmjs-dimse": "0.1.27",
"node-windows": "1.0.0-beta.8",
+ "serialport": "12.0.0",
"ws": "8.16.0"
},
"devDependencies": {
diff --git a/packages/agent/src/app.ts b/packages/agent/src/app.ts
index f349523f70..51e9bcba9b 100644
--- a/packages/agent/src/app.ts
+++ b/packages/agent/src/app.ts
@@ -18,6 +18,7 @@ import WebSocket from 'ws';
import { Channel } from './channel';
import { AgentDicomChannel } from './dicom';
import { AgentHl7Channel } from './hl7';
+import { AgentSerialPortChannel } from './serialport';
async function execAsync(command: string, options: ExecOptions): Promise<{ stdout: string; stderr: string }> {
return new Promise<{ stdout: string; stderr: string }>((resolve, reject) => {
@@ -186,6 +187,8 @@ export class App {
channel = new AgentDicomChannel(this, definition, endpoint);
} else if (endpoint.address.startsWith('mllp')) {
channel = new AgentHl7Channel(this, definition, endpoint);
+ } else if (endpoint.address.startsWith('serial')) {
+ channel = new AgentSerialPortChannel(this, definition, endpoint);
} else {
this.log.error(`Unsupported endpoint type: ${endpoint.address}`);
}
diff --git a/packages/agent/src/serialport.test.ts b/packages/agent/src/serialport.test.ts
new file mode 100644
index 0000000000..d6fed71b2c
--- /dev/null
+++ b/packages/agent/src/serialport.test.ts
@@ -0,0 +1,173 @@
+import { allOk, ContentType, createReference, LogLevel, sleep } from '@medplum/core';
+import { Agent, Bot, Endpoint, Resource } from '@medplum/fhirtypes';
+import { MockClient } from '@medplum/mock';
+import { Client, Server } from 'mock-socket';
+import { SerialPort } from 'serialport';
+import { App } from './app';
+import {
+ ASCII_END_OF_TEXT,
+ ASCII_END_OF_TRANSMISSION,
+ ASCII_ENQUIRY,
+ ASCII_START_OF_HEADING,
+ ASCII_START_OF_TEXT,
+} from './serialport';
+
+jest.mock('node-windows');
+jest.mock('serialport');
+
+describe('Serial port', () => {
+ const medplum = new MockClient();
+ let bot: Bot;
+ let endpoint: Endpoint;
+
+ beforeAll(async () => {
+ console.log = jest.fn();
+ console.warn = jest.fn();
+
+ medplum.router.router.add('POST', ':resourceType/:id/$execute', async () => {
+ return [allOk, {} as Resource];
+ });
+
+ bot = await medplum.createResource({ resourceType: 'Bot' });
+
+ const url = new URL('serial://COM1');
+ url.searchParams.set('baudRate', '9600');
+ url.searchParams.set('dataBits', '8');
+ url.searchParams.set('stopBits', '1');
+ url.searchParams.set('clearOnStartOfHeading', 'true');
+ url.searchParams.set('clearOnStartOfText', 'true');
+ url.searchParams.set('transmitOnEndOfText', 'true');
+ url.searchParams.set('transmitOnEndOfTransmission', 'true');
+ url.searchParams.set('ackOnEnquiry', 'true');
+ url.searchParams.set('ackOnEndOfText', 'true');
+ url.searchParams.set('ackOnEndOfTransmission', 'true');
+ url.searchParams.set('ackOnNewLine', 'true');
+
+ endpoint = await medplum.createResource({
+ resourceType: 'Endpoint',
+ status: 'active',
+ address: url.toString(),
+ connectionType: { code: ContentType.TEXT },
+ payloadType: [{ coding: [{ code: ContentType.TEXT }] }],
+ });
+ });
+
+ test('Send and receive', async () => {
+ const mockServer = new Server('wss://example.com/ws/agent');
+ const state = {
+ socket: undefined as Client | undefined,
+ messages: [] as string[],
+ gotConnectRequest: false,
+ gotTransmitRequest: false,
+ };
+
+ mockServer.on('connection', (socket) => {
+ state.socket = socket;
+
+ socket.on('message', (data) => {
+ const command = JSON.parse((data as Buffer).toString('utf8'));
+ if (command.type === 'agent:connect:request') {
+ state.gotConnectRequest = true;
+ socket.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:connect:response',
+ })
+ )
+ );
+ }
+
+ if (command.type === 'agent:transmit:request') {
+ state.gotTransmitRequest = true;
+ state.messages.push(command.body);
+ socket.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:response',
+ channel: command.channel,
+ remote: command.remote,
+ body: 'OK',
+ })
+ )
+ );
+ }
+ });
+ });
+
+ const agent = await medplum.createResource({
+ resourceType: 'Agent',
+ channel: [
+ {
+ name: 'test',
+ endpoint: createReference(endpoint),
+ targetReference: createReference(bot),
+ },
+ ],
+ } as Agent);
+
+ const app = new App(medplum, agent.id as string, LogLevel.INFO);
+ await app.start();
+
+ // Get the mocked instance of SerialPort
+ expect(SerialPort).toHaveBeenCalledTimes(1);
+ const serialPort = (SerialPort as unknown as jest.Mock).mock.instances[0];
+ expect(serialPort.on).toHaveBeenCalledTimes(3);
+
+ const onOpen = serialPort.on.mock.calls[0];
+ expect(onOpen[0]).toBe('open');
+ expect(onOpen[1]).toBeInstanceOf(Function);
+
+ const onError = serialPort.on.mock.calls[1];
+ expect(onError[0]).toBe('error');
+ expect(onError[1]).toBeInstanceOf(Function);
+
+ const onData = serialPort.on.mock.calls[2];
+ expect(onData[0]).toBe('data');
+ expect(onData[1]).toBeInstanceOf(Function);
+
+ expect(serialPort.open).toHaveBeenCalledTimes(1);
+
+ // Simulate an 'open' event
+ const onOpenCallback = onOpen[1] as () => void;
+ onOpenCallback();
+
+ // Simulate a recoverable 'error' event
+ const onErrorCallback = onError[1] as (err: Error) => void;
+ onErrorCallback(new Error('test error'));
+
+ // Wait for the WebSocket to connect
+ while (!state.socket) {
+ await sleep(100);
+ }
+
+ // At this point, we expect the websocket to be connected
+ expect(state.socket).toBeDefined();
+ expect(state.gotConnectRequest).toBe(true);
+
+ // Clear the messages
+ state.messages.length = 0;
+
+ // Mock sending data to the serial port
+ const onDataCallback = onData[1] as (data: Buffer) => void;
+ onDataCallback(Buffer.from([ASCII_START_OF_HEADING]));
+ onDataCallback(Buffer.from([ASCII_START_OF_TEXT]));
+ onDataCallback(Buffer.from('test\n'));
+ onDataCallback(Buffer.from([ASCII_END_OF_TEXT]));
+ onDataCallback(Buffer.from([ASCII_END_OF_TRANSMISSION]));
+ onDataCallback(Buffer.from([ASCII_ENQUIRY]));
+
+ // Wait for the WebSocket to transmit
+ while (!state.gotTransmitRequest) {
+ await sleep(100);
+ }
+ expect(state.gotTransmitRequest).toBe(true);
+
+ // Wait for the WebSocket to receive a reply
+ while (state.messages.length === 0) {
+ await sleep(100);
+ }
+
+ app.stop();
+ mockServer.stop();
+ });
+});
diff --git a/packages/agent/src/serialport.ts b/packages/agent/src/serialport.ts
new file mode 100644
index 0000000000..1fd9eb2190
--- /dev/null
+++ b/packages/agent/src/serialport.ts
@@ -0,0 +1,184 @@
+import { AgentTransmitResponse, ContentType, normalizeErrorString } from '@medplum/core';
+import { AgentChannel, Endpoint } from '@medplum/fhirtypes';
+import { SerialPort } from 'serialport';
+import { App } from './app';
+import { Channel } from './channel';
+
+export const ASCII_START_OF_HEADING = 0x01;
+export const ASCII_START_OF_TEXT = 0x02;
+export const ASCII_END_OF_TEXT = 0x03;
+export const ASCII_END_OF_TRANSMISSION = 0x04;
+export const ASCII_ENQUIRY = 0x05;
+export const ASCII_ACKNOWLEDGE = 0x06;
+export const ASCII_NEW_LINE = 0x0a;
+
+export class AgentSerialPortChannel implements Channel {
+ readonly port: SerialPort;
+ readonly url: URL;
+ readonly path: string;
+ private buffer = '';
+
+ constructor(
+ readonly app: App,
+ readonly definition: AgentChannel,
+ readonly endpoint: Endpoint
+ ) {
+ this.url = new URL(this.endpoint.address as string);
+ this.path = this.url.hostname + this.url.pathname;
+
+ // Create a new port connection
+ this.port = new SerialPort({
+ path: this.path,
+ baudRate: parseInt(this.url.searchParams.get('baudRate') || '9600', 10),
+ dataBits: parseInt(this.url.searchParams.get('dataBits') || '8', 10) as 5 | 6 | 7 | 8,
+ stopBits: parseFloat(this.url.searchParams.get('stopBits') || '1') as 1 | 1.5 | 2,
+ autoOpen: false,
+ });
+ }
+
+ start(): void {
+ this.app.log.info(`Channel starting on ${this.url}`);
+
+ // Parse options
+ const clearOnStartOfHeading = this.url.searchParams.get('clearOnStartOfHeading') === 'true';
+ const clearOnStartOfText = this.url.searchParams.get('clearOnStartOfText') === 'true';
+ const ackOnEndOfText = this.url.searchParams.get('ackOnEndOfText') === 'true';
+ const ackOnEndOfTransmission = this.url.searchParams.get('ackOnEndOfTransmission') === 'true';
+ const transmitOnEndOfText = this.url.searchParams.get('transmitOnEndOfText') === 'true';
+ const transmitOnEndOfTransmission = this.url.searchParams.get('transmitOnEndOfTransmission') === 'true';
+ const ackOnEnquiry = this.url.searchParams.get('ackOnEnquiry') === 'true';
+ const ackOnNewLine = this.url.searchParams.get('ackOnNewLine') === 'true';
+ const transmitOnNewLine = this.url.searchParams.get('transmitOnNewLine') === 'true';
+
+ // Add event handler for the "open" event
+ // Just log a message
+ this.port.on('open', () => {
+ this.logInfo(`[${this.path}] Serial port open`);
+ this.sendToServer(`[${this.path}] Serial port open`);
+ });
+
+ // Add event handler for the "error" event
+ // Just log a message
+ this.port.on('error', (err) => {
+ this.logError(`[${this.path}] Serial port error: ` + err);
+ this.sendToServer(`[${this.path}] Serial port error: ` + err);
+ });
+
+ // Add event handler for the "data" event
+ // Convert the contents to ASCII
+ // Build up the data buffer
+ // When we receive the "end" code (0x03), then send to the cloud
+ this.port.on('data', (data) => {
+ const str = data.toString('ascii');
+ for (let i = 0; i < str.length; i++) {
+ const code = str.charCodeAt(i);
+ switch (code) {
+ case ASCII_START_OF_HEADING:
+ if (clearOnStartOfHeading) {
+ this.buffer = '';
+ }
+ break;
+
+ case ASCII_START_OF_TEXT:
+ if (clearOnStartOfText) {
+ this.buffer = '';
+ }
+ break;
+
+ case ASCII_END_OF_TEXT:
+ if (transmitOnEndOfText) {
+ this.sendToServer(this.buffer);
+ this.buffer = '';
+ }
+ if (ackOnEndOfText) {
+ this.port.write(String.fromCharCode(ASCII_ACKNOWLEDGE));
+ }
+ break;
+
+ case ASCII_END_OF_TRANSMISSION:
+ if (transmitOnEndOfTransmission) {
+ this.sendToServer(this.buffer);
+ this.buffer = '';
+ }
+ if (ackOnEndOfTransmission) {
+ this.port.write(String.fromCharCode(ASCII_ACKNOWLEDGE));
+ }
+ break;
+
+ case ASCII_ENQUIRY:
+ if (ackOnEnquiry) {
+ this.port.write(String.fromCharCode(ASCII_ACKNOWLEDGE));
+ }
+ break;
+
+ case ASCII_NEW_LINE:
+ if (transmitOnNewLine) {
+ this.sendToServer(this.buffer);
+ this.buffer = '';
+ } else {
+ this.buffer += '\n';
+ }
+ if (ackOnNewLine) {
+ this.port.write(String.fromCharCode(ASCII_ACKNOWLEDGE));
+ }
+ break;
+
+ default:
+ // Otherwise add to the buffer
+ this.buffer += str.charAt(i);
+ break;
+ }
+ }
+ });
+
+ // Open the connection
+ this.port.open((err) => {
+ if (err) {
+ this.logError(`[${this.path}] Error opening serial port: ` + err);
+ }
+ });
+
+ this.sendToServer(`[${this.path}] Running`);
+
+ this.app.log.info('Channel started successfully');
+ }
+
+ stop(): void {
+ this.app.log.info('Channel stopping...');
+ this.port.close((err) => {
+ if (err) {
+ this.logError(`[${this.path}] Error closing serial port: ` + err);
+ }
+ });
+ this.app.log.info('Channel stopped successfully');
+ }
+
+ sendToRemote(msg: AgentTransmitResponse): void {
+ console.warn(`SerialPort sendToRemote not implemented (${msg.body})`);
+ }
+
+ private sendToServer(body: string): void {
+ try {
+ this.app.log.info('Received:');
+ this.app.log.info(body);
+ this.app.addToWebSocketQueue({
+ type: 'agent:transmit:request',
+ accessToken: 'placeholder',
+ channel: this.definition.name as string,
+ remote: this.path,
+ contentType: ContentType.TEXT,
+ body,
+ });
+ } catch (err) {
+ this.app.log.error(`HL7 error: ${normalizeErrorString(err)}`);
+ }
+ }
+
+ private logInfo(message: string): void {
+ this.app.log.info(message);
+ }
+
+ private logError(message: string): void {
+ this.app.log.error(message);
+ }
+}
diff --git a/packages/server/src/fhir/operations/projectinit.test.ts b/packages/server/src/fhir/operations/projectinit.test.ts
index 09a39dfcbd..05618d25be 100644
--- a/packages/server/src/fhir/operations/projectinit.test.ts
+++ b/packages/server/src/fhir/operations/projectinit.test.ts
@@ -1,14 +1,19 @@
-import express from 'express';
-import { loadTestConfig } from '../../config';
-import { initApp, shutdownApp } from '../../app';
-import { initTestAuth, withTestContext } from '../../test.setup';
-import request from 'supertest';
import { ContentType, createReference, isUUID } from '@medplum/core';
+import { Practitioner, Project } from '@medplum/fhirtypes';
import { randomUUID } from 'crypto';
+import express from 'express';
+import { pwnedPassword } from 'hibp';
+import fetch from 'node-fetch';
+import request from 'supertest';
+import { initApp, shutdownApp } from '../../app';
import { createUser } from '../../auth/newuser';
-import { Practitioner, Project } from '@medplum/fhirtypes';
+import { loadTestConfig } from '../../config';
+import { initTestAuth, setupPwnedPasswordMock, setupRecaptchaMock, withTestContext } from '../../test.setup';
import { getSystemRepo } from '../repo';
+jest.mock('hibp');
+jest.mock('node-fetch');
+
const app = express();
describe('Project $init', () => {
@@ -21,6 +26,13 @@ describe('Project $init', () => {
await shutdownApp();
});
+ beforeEach(() => {
+ (fetch as unknown as jest.Mock).mockClear();
+ (pwnedPassword as unknown as jest.Mock).mockClear();
+ setupPwnedPasswordMock(pwnedPassword as unknown as jest.Mock, 0);
+ setupRecaptchaMock(fetch as unknown as jest.Mock, true);
+ });
+
test('Success', async () => {
const superAdminAccessToken = await initTestAuth({ superAdmin: true });
expect(superAdminAccessToken).toBeDefined();
From 53578bf8fde82c601ad0a250b2cc5a2cc4cd7aa2 Mon Sep 17 00:00:00 2001
From: Derrick Farris
Date: Tue, 9 Apr 2024 20:45:28 -0700
Subject: [PATCH 08/52] feat(agent): allow valid hostnames to be pinged (#4350)
* feat(agent): add pinging valid hostnames
* tweak(client): update UI to note hostnames are allowed
---
packages/agent/src/app.ts | 25 ++++---
packages/agent/src/net-utils.test.ts | 43 +++++++++++-
packages/app/src/resource/ToolsPage.test.tsx | 10 +--
packages/app/src/resource/ToolsPage.tsx | 15 ++--
packages/core/src/utils.test.ts | 19 ++++++
packages/core/src/utils.ts | 33 +++++++++
packages/mock/src/client.ts | 21 +++---
.../src/fhir/operations/agentpush.test.ts | 68 ++++++++++++++++++-
.../server/src/fhir/operations/agentpush.ts | 2 +-
.../server/src/fhir/operations/agentutils.ts | 8 ++-
10 files changed, 205 insertions(+), 39 deletions(-)
diff --git a/packages/agent/src/app.ts b/packages/agent/src/app.ts
index 51e9bcba9b..8be4a71f16 100644
--- a/packages/agent/src/app.ts
+++ b/packages/agent/src/app.ts
@@ -7,6 +7,7 @@ import {
LogLevel,
Logger,
MedplumClient,
+ isValidHostname,
normalizeErrorString,
} from '@medplum/core';
import { Endpoint, Reference } from '@medplum/fhirtypes';
@@ -157,7 +158,7 @@ export class App {
case 'push':
case 'agent:transmit:request':
if (command.contentType === ContentType.PING) {
- await this.tryPingIp(command);
+ await this.tryPingHost(command);
} else {
this.pushMessage(command);
}
@@ -279,22 +280,26 @@ export class App {
}
// This covers Windows, Linux, and Mac
- private getPingCommand(ip: string, count = 1): string {
- return platform() === 'win32' ? `ping /n ${count} ${ip}` : `ping -c ${count} ${ip}`;
+ private getPingCommand(host: string, count = 1): string {
+ return platform() === 'win32' ? `ping /n ${count} ${host}` : `ping -c ${count} ${host}`;
}
- private async tryPingIp(message: AgentTransmitRequest): Promise {
+ private async tryPingHost(message: AgentTransmitRequest): Promise {
try {
if (message.body && !message.body.startsWith('PING')) {
const warnMsg =
'Message body present but unused. Body for a ping request should be empty or a message formatted as `PING[ count]`.';
this.log.warn(warnMsg);
}
- if (!isIPv4(message.remote)) {
- let errMsg = `Attempted to ping invalid IP: ${message.remote}`;
- if (isIPv6(message.remote)) {
- errMsg = `Attempted to ping an IPv6 address: ${message.remote}\n\nIPv6 is currently unsupported.`;
- }
+
+ if (isIPv6(message.remote)) {
+ const errMsg = `Attempted to ping an IPv6 address: ${message.remote}\n\nIPv6 is currently unsupported.`;
+ this.log.error(errMsg);
+ throw new Error(errMsg);
+ }
+
+ if (!(isIPv4(message.remote) || isValidHostname(message.remote))) {
+ const errMsg = `Attempted to ping an invalid host.\n\n"${message.remote}" is not a valid IPv4 address or a resolvable hostname.`;
this.log.error(errMsg);
throw new Error(errMsg);
}
@@ -331,7 +336,7 @@ export class App {
body: result,
} satisfies AgentTransmitResponse);
} catch (err) {
- this.log.error(`Error during ping attempt to ${message.remote ?? 'NO_IP_GIVEN'}: ${normalizeErrorString(err)}`);
+ this.log.error(`Error during ping attempt to ${message.remote ?? 'NO_HOST_GIVEN'}: ${normalizeErrorString(err)}`);
this.addToWebSocketQueue({
type: 'agent:transmit:response',
channel: message.channel,
diff --git a/packages/agent/src/net-utils.test.ts b/packages/agent/src/net-utils.test.ts
index 8071585c69..2234f441cb 100644
--- a/packages/agent/src/net-utils.test.ts
+++ b/packages/agent/src/net-utils.test.ts
@@ -90,7 +90,7 @@ describe('Agent Net Utils', () => {
clearTimeout(timer);
});
- test('Valid ping', async () => {
+ test('Valid ping to IP', async () => {
let resolve: (value: AgentMessage) => void;
let reject: (error: Error) => void;
@@ -127,7 +127,44 @@ describe('Agent Net Utils', () => {
});
});
- test('Non-IP remote', async () => {
+ test('Valid ping to domain name', async () => {
+ let resolve: (value: AgentMessage) => void;
+ let reject: (error: Error) => void;
+
+ const messageReceived = new Promise((_resolve, _reject) => {
+ resolve = _resolve;
+ reject = _reject;
+ });
+
+ onMessage = (command) => resolve(command);
+ expect(wsClient).toBeDefined();
+
+ const callback = generateId();
+ wsClient.send(
+ Buffer.from(
+ JSON.stringify({
+ type: 'agent:transmit:request',
+ contentType: ContentType.PING,
+ remote: 'localhost',
+ callback,
+ body: 'PING',
+ } satisfies AgentTransmitRequest)
+ )
+ );
+
+ timer = setTimeout(() => {
+ reject(new Error('Timeout'));
+ }, 3500);
+
+ await expect(messageReceived).resolves.toMatchObject>({
+ type: 'agent:transmit:response',
+ callback,
+ statusCode: 200,
+ body: expect.stringMatching(/ping statistics/),
+ });
+ });
+
+ test('Invalid remote', async () => {
let resolve: (value: AgentMessage) => void;
let reject: (error: Error) => void;
@@ -162,7 +199,7 @@ describe('Agent Net Utils', () => {
contentType: ContentType.TEXT,
statusCode: 500,
callback,
- body: expect.stringMatching(/invalid ip/i),
+ body: expect.stringMatching(/invalid host/i),
});
});
diff --git a/packages/app/src/resource/ToolsPage.test.tsx b/packages/app/src/resource/ToolsPage.test.tsx
index 7dda14d446..78905a5f24 100644
--- a/packages/app/src/resource/ToolsPage.test.tsx
+++ b/packages/app/src/resource/ToolsPage.test.tsx
@@ -64,7 +64,7 @@ describe('ToolsPage', () => {
expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
await act(async () => {
- fireEvent.change(screen.getByLabelText('IP Address'), { target: { value: '8.8.8.8' } });
+ fireEvent.change(screen.getByLabelText('IP Address / Hostname'), { target: { value: '8.8.8.8' } });
fireEvent.click(screen.getByLabelText('Ping'));
});
@@ -80,7 +80,7 @@ describe('ToolsPage', () => {
expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
await act(async () => {
- fireEvent.change(screen.getByLabelText('IP Address'), { target: { value: 'abc123' } });
+ fireEvent.change(screen.getByLabelText('IP Address / Hostname'), { target: { value: 'abc123' } });
fireEvent.click(screen.getByLabelText('Ping'));
});
@@ -98,7 +98,7 @@ describe('ToolsPage', () => {
expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
await act(async () => {
- fireEvent.change(screen.getByLabelText('IP Address'), { target: { value: '8.8.8.8' } });
+ fireEvent.change(screen.getByLabelText('IP Address / Hostname'), { target: { value: '8.8.8.8' } });
fireEvent.click(screen.getByLabelText('Ping'));
});
@@ -125,7 +125,7 @@ describe('ToolsPage', () => {
expect(screen.getAllByText(agent.name)[0]).toBeInTheDocument();
await act(async () => {
- fireEvent.change(screen.getByLabelText('IP Address'), { target: { value: '8.8.8.8' } });
+ fireEvent.change(screen.getByLabelText('IP Address / Hostname'), { target: { value: '8.8.8.8' } });
});
await act(async () => {
@@ -144,7 +144,7 @@ describe('ToolsPage', () => {
pushToAgentSpy.mockRestore();
});
- test('No IP entered for ping', async () => {
+ test('No host entered for ping', async () => {
const pushToAgentSpy = jest.spyOn(medplum, 'pushToAgent');
// load agent page
diff --git a/packages/app/src/resource/ToolsPage.tsx b/packages/app/src/resource/ToolsPage.tsx
index 041104be14..6af857248c 100644
--- a/packages/app/src/resource/ToolsPage.tsx
+++ b/packages/app/src/resource/ToolsPage.tsx
@@ -31,14 +31,14 @@ export function ToolsPage(): JSX.Element | null {
const handlePing = useCallback(
(formData: Record) => {
- const ip = formData.ip;
+ const host = formData.host;
const pingCount = formData.pingCount || 1;
- if (!ip) {
+ if (!host) {
return;
}
setPinging(true);
medplum
- .pushToAgent(reference, ip, `PING ${pingCount}`, ContentType.PING, true)
+ .pushToAgent(reference, host, `PING ${pingCount}`, ContentType.PING, true)
.then((pingResult: string) => setLastPing(pingResult))
.catch((err: unknown) => showError(normalizeErrorString(err)))
.finally(() => setPinging(false));
@@ -89,15 +89,16 @@ export function ToolsPage(): JSX.Element | null {
Ping from Agent
- Send a ping command from the agent to an IP address. Use this tool to troubleshoot local network connectivity.
+ Send a ping command from the agent to a valid IP address or hostname. Use this tool to troubleshoot local
+ network connectivity.