diff --git a/infrastructure/terraform/components/api/README.md b/infrastructure/terraform/components/api/README.md
index 150af054..e50afd21 100644
--- a/infrastructure/terraform/components/api/README.md
+++ b/infrastructure/terraform/components/api/README.md
@@ -47,6 +47,7 @@ No requirements.
| [letter\_status\_updates\_queue](#module\_letter\_status\_updates\_queue) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.24/terraform-sqs.zip | n/a |
| [letter\_updates\_transformer](#module\_letter\_updates\_transformer) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip | n/a |
| [logging\_bucket](#module\_logging\_bucket) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-s3bucket.zip | n/a |
+| [mi\_updates\_transformer](#module\_mi\_updates\_transformer) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip | n/a |
| [patch\_letter](#module\_patch\_letter) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip | n/a |
| [post\_letters](#module\_post\_letters) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.24/terraform-lambda.zip | n/a |
| [post\_mi](#module\_post\_mi) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip | n/a |
diff --git a/infrastructure/terraform/components/api/event_source_mapping_mi_updates.tf b/infrastructure/terraform/components/api/event_source_mapping_mi_updates.tf
new file mode 100644
index 00000000..73e7d394
--- /dev/null
+++ b/infrastructure/terraform/components/api/event_source_mapping_mi_updates.tf
@@ -0,0 +1,11 @@
+resource "aws_lambda_event_source_mapping" "mi_updates_transformer_kinesis" {
+ event_source_arn = aws_kinesis_stream.mi_change_stream.arn
+ function_name = module.mi_updates_transformer.function_arn
+ starting_position = "LATEST"
+ batch_size = 10
+ maximum_batching_window_in_seconds = 1
+
+ depends_on = [
+ module.mi_updates_transformer # ensures updates transformer exists
+ ]
+}
diff --git a/infrastructure/terraform/components/api/kinesis_mi_change_stream.tf b/infrastructure/terraform/components/api/kinesis_mi_change_stream.tf
new file mode 100644
index 00000000..0bb644be
--- /dev/null
+++ b/infrastructure/terraform/components/api/kinesis_mi_change_stream.tf
@@ -0,0 +1,11 @@
+resource "aws_kinesis_stream" "mi_change_stream" {
+ name = "${local.csi}-mi-change-stream"
+ shard_count = 1
+ retention_period = 24
+}
+
+resource "aws_dynamodb_kinesis_streaming_destination" "mi_streaming_destination" {
+ stream_arn = aws_kinesis_stream.mi_change_stream.arn
+ table_name = aws_dynamodb_table.mi.name
+ approximate_creation_date_time_precision = "MILLISECOND"
+}
diff --git a/infrastructure/terraform/components/api/module_lambda_mi_updates_transformer.tf b/infrastructure/terraform/components/api/module_lambda_mi_updates_transformer.tf
new file mode 100644
index 00000000..48f0acbe
--- /dev/null
+++ b/infrastructure/terraform/components/api/module_lambda_mi_updates_transformer.tf
@@ -0,0 +1,74 @@
+module "mi_updates_transformer" {
+ source = "https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip"
+
+ function_name = "mi-updates-transformer"
+ description = "MI Update Filter/Producer"
+
+ aws_account_id = var.aws_account_id
+ component = var.component
+ environment = var.environment
+ project = var.project
+ region = var.region
+ group = var.group
+
+ log_retention_in_days = var.log_retention_in_days
+ kms_key_arn = module.kms.key_arn
+
+ iam_policy_document = {
+ body = data.aws_iam_policy_document.mi_updates_transformer_lambda.json
+ }
+
+ function_s3_bucket = local.acct.s3_buckets["lambda_function_artefacts"]["id"]
+ function_code_base_path = local.aws_lambda_functions_dir_path
+ function_code_dir = "mi-updates-transformer/dist"
+ function_include_common = true
+ handler_function_name = "handler"
+ runtime = "nodejs22.x"
+ memory = 128
+ timeout = 29
+ log_level = var.log_level
+
+ force_lambda_code_deploy = var.force_lambda_code_deploy
+ enable_lambda_insights = false
+
+ send_to_firehose = true
+ log_destination_arn = local.destination_arn
+ log_subscription_role_arn = local.acct.log_subscription_role_arn
+
+ lambda_env_vars = merge(local.common_lambda_env_vars, {
+ EVENTPUB_SNS_TOPIC_ARN = "${module.eventpub.sns_topic.arn}"
+ })
+}
+
+data "aws_iam_policy_document" "mi_updates_transformer_lambda" {
+ statement {
+ sid = "AllowSNSPublish"
+ effect = "Allow"
+
+ actions = [
+ "sns:Publish"
+ ]
+
+ resources = [
+ module.eventpub.sns_topic.arn
+ ]
+ }
+
+ statement {
+ sid = "AllowKinesisGet"
+ effect = "Allow"
+
+ actions = [
+ "kinesis:GetRecords",
+ "kinesis:GetShardIterator",
+ "kinesis:DescribeStream",
+ "kinesis:DescribeStreamSummary",
+ "kinesis:ListShards",
+ "kinesis:ListStreams",
+ ]
+
+ resources = [
+ aws_kinesis_stream.mi_change_stream.arn
+ ]
+ }
+}
diff --git a/lambdas/mi-updates-transformer/jest.config.ts b/lambdas/mi-updates-transformer/jest.config.ts
new file mode 100644
index 00000000..f88e7277
--- /dev/null
+++ b/lambdas/mi-updates-transformer/jest.config.ts
@@ -0,0 +1,60 @@
+import type { Config } from "jest";
+
+export const baseJestConfig: Config = {
+ preset: "ts-jest",
+
+ // Automatically clear mock calls, instances, contexts and results before every test
+ clearMocks: true,
+
+ // Indicates whether the coverage information should be collected while executing the test
+ collectCoverage: true,
+
+ // The directory where Jest should output its coverage files
+ coverageDirectory: "./.reports/unit/coverage",
+
+ // Indicates which provider should be used to instrument code for coverage
+ coverageProvider: "babel",
+
+ coverageThreshold: {
+ global: {
+ branches: 100,
+ functions: 100,
+ lines: 100,
+ statements: -10,
+ },
+ },
+
+ coveragePathIgnorePatterns: ["/__tests__/"],
+ transform: { "^.+\\.ts$": "ts-jest" },
+ testPathIgnorePatterns: [".build"],
+ testMatch: ["**/?(*.)+(spec|test).[jt]s?(x)"],
+
+ // Use this configuration option to add custom reporters to Jest
+ reporters: [
+ "default",
+ [
+ "jest-html-reporter",
+ {
+ pageTitle: "Test Report",
+ outputPath: "./.reports/unit/test-report.html",
+ includeFailureMsg: true,
+ },
+ ],
+ ],
+
+ // The test environment that will be used for testing
+ testEnvironment: "jsdom",
+};
+
+const utilsJestConfig = {
+ ...baseJestConfig,
+
+ testEnvironment: "node",
+
+ coveragePathIgnorePatterns: [
+ ...(baseJestConfig.coveragePathIgnorePatterns ?? []),
+ "zod-validators.ts",
+ ],
+};
+
+export default utilsJestConfig;
diff --git a/lambdas/mi-updates-transformer/package.json b/lambdas/mi-updates-transformer/package.json
new file mode 100644
index 00000000..c0ff2fc5
--- /dev/null
+++ b/lambdas/mi-updates-transformer/package.json
@@ -0,0 +1,30 @@
+{
+ "dependencies": {
+ "@aws-sdk/client-sns": "^3.940.0",
+ "@aws-sdk/util-dynamodb": "^3.943.0",
+ "@internal/datastore": "^0.1.0",
+ "@nhsdigital/nhs-notify-event-schemas-supplier-api": "*",
+ "aws-lambda": "^1.0.7",
+ "esbuild": "^0.24.0",
+ "pino": "^10.1.0",
+ "zod": "^4.1.13"
+ },
+ "devDependencies": {
+ "@tsconfig/node22": "^22.0.2",
+ "@types/aws-lambda": "^8.10.148",
+ "@types/jest": "^30.0.0",
+ "jest": "^30.2.0",
+ "jest-mock-extended": "^4.0.0",
+ "typescript": "^5.8.3"
+ },
+ "name": "nhs-notify-supplier-api-mi-updates-transformer",
+ "private": true,
+ "scripts": {
+ "lambda-build": "rm -rf dist && npx esbuild --bundle --minify --sourcemap --target=es2020 --platform=node --loader:.node=file --entry-names=[name] --outdir=dist src/index.ts",
+ "lint": "eslint .",
+ "lint:fix": "eslint . --fix",
+ "test:unit": "jest",
+ "typecheck": "tsc --noEmit"
+ },
+ "version": "0.0.1"
+}
diff --git a/lambdas/mi-updates-transformer/src/__tests__/mi-updates-transformer.test.ts b/lambdas/mi-updates-transformer/src/__tests__/mi-updates-transformer.test.ts
new file mode 100644
index 00000000..ceebfc2a
--- /dev/null
+++ b/lambdas/mi-updates-transformer/src/__tests__/mi-updates-transformer.test.ts
@@ -0,0 +1,189 @@
+import { SNSClient } from "@aws-sdk/client-sns";
+import * as pino from "pino";
+import {
+ AttributeValue,
+ Context,
+ DynamoDBRecord,
+ KinesisStreamEvent,
+ KinesisStreamRecordPayload,
+} from "aws-lambda";
+import { mockDeep } from "jest-mock-extended";
+import { MI } from "@internal/datastore";
+import { createHandler } from "../mi-updates-transformer";
+import { Deps } from "../deps";
+import { EnvVars } from "../env";
+import { mapMIToCloudEvent } from "../mappers/mi-mapper";
+
+// Make crypto return consistent values, since we're calling it in both prod and test code and comparing the values
+const realCrypto = jest.requireActual("crypto");
+const randomBytes: Record = {
+ "8": realCrypto.randomBytes(8),
+ "16": realCrypto.randomBytes(16),
+};
+jest.mock("crypto", () => ({
+ randomUUID: () => "4616b2d9-b7a5-45aa-8523-fa7419626b69",
+ randomBytes: (size: number) => randomBytes[String(size)],
+}));
+
+function generateKinesisEvent(miEvents: object[]): KinesisStreamEvent {
+ const records = miEvents
+ .map((mi) => Buffer.from(JSON.stringify(mi), "utf8").toString("base64"))
+ .map(
+ (data) =>
+ ({ kinesis: { data } }) as unknown as KinesisStreamRecordPayload,
+ );
+ return { Records: records } as unknown as KinesisStreamEvent;
+}
+function generateMIEvents(numMIEvents: number): MI[] {
+ return [...Array.from({ length: numMIEvents }).keys()].map((i) => ({
+ id: String(i + 1),
+ lineItem: `lineItem${i + 1}`,
+ timestamp: new Date().toISOString(),
+ quantity: 100 + i,
+ supplierId: `supplier${i + 1}`,
+ createdAt: new Date().toISOString(),
+ updatedAt: new Date().toISOString(),
+ ttl: Math.floor(Date.now() / 1000) + 3600,
+ specificationId: "spec1",
+ groupId: "group1",
+ stockRemaining: 500 - i,
+ }));
+}
+
+function toAttr(value: unknown): AttributeValue {
+ if (value === null || value === undefined) return { NULL: true };
+ if (typeof value === "string") return { S: value };
+ if (typeof value === "number") return { N: String(value) };
+ if (typeof value === "boolean") return { BOOL: value };
+ // fallback: stringify anything else
+ return { S: JSON.stringify(value) };
+}
+
+function generateInsertRecord(newMI: MI): DynamoDBRecord {
+ const newImage = Object.fromEntries(
+ Object.entries(newMI).map(([key, value]) => [key, toAttr(value)]),
+ );
+ return {
+ eventName: "INSERT",
+ dynamodb: { NewImage: newImage },
+ };
+}
+
+describe("mi-updates-transformer Lambda", () => {
+ const mockedDeps: jest.Mocked = {
+ snsClient: { send: jest.fn() } as unknown as SNSClient,
+ logger: { info: jest.fn(), error: jest.fn() } as unknown as pino.Logger,
+ env: {
+ EVENTPUB_SNS_TOPIC_ARN: "arn:aws:sns:region:account:topic",
+ } as unknown as EnvVars,
+ } as Deps;
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ });
+
+ it("processes Kinesis events and publishes them to SNS", async () => {
+ const handler = createHandler(mockedDeps);
+ const miEvents = generateMIEvents(1);
+ const expectedEntries = [
+ expect.objectContaining({
+ Message: JSON.stringify(mapMIToCloudEvent(miEvents[0], mockedDeps)),
+ }),
+ ];
+
+ const insertMI = generateInsertRecord(miEvents[0]);
+ const testData = generateKinesisEvent([insertMI]);
+ await handler(testData, mockDeep(), jest.fn());
+
+ expect(mockedDeps.snsClient.send).toHaveBeenCalledWith(
+ expect.objectContaining({
+ input: expect.objectContaining({
+ TopicArn: "arn:aws:sns:region:account:topic",
+ PublishBatchRequestEntries: expectedEntries,
+ }),
+ }),
+ );
+ });
+
+ it("batches mutiple records into a single call to SNS", async () => {
+ const handler = createHandler(mockedDeps);
+ const miEvents = generateMIEvents(10);
+ const expectedEntries = miEvents.map((miEvent) =>
+ expect.objectContaining({
+ Message: JSON.stringify(mapMIToCloudEvent(miEvent, mockedDeps)),
+ }),
+ );
+
+ const insertMIs = miEvents.map((miEvent) => generateInsertRecord(miEvent));
+ const testData = generateKinesisEvent(insertMIs);
+ await handler(testData, mockDeep(), jest.fn());
+
+ expect(mockedDeps.snsClient.send).toHaveBeenCalledWith(
+ expect.objectContaining({
+ input: expect.objectContaining({
+ TopicArn: "arn:aws:sns:region:account:topic",
+ PublishBatchRequestEntries: expectedEntries,
+ }),
+ }),
+ );
+ });
+
+ it("splits more than 10 records into multiple SNS calls", async () => {
+ const handler = createHandler(mockedDeps);
+ const miEvents = generateMIEvents(21);
+ const expectedEntries = [
+ miEvents.slice(0, 10).map((miEvent) =>
+ expect.objectContaining({
+ Message: JSON.stringify(mapMIToCloudEvent(miEvent, mockedDeps)),
+ }),
+ ),
+ miEvents.slice(10, 20).map((miEvent) =>
+ expect.objectContaining({
+ Message: JSON.stringify(mapMIToCloudEvent(miEvent, mockedDeps)),
+ }),
+ ),
+ miEvents.slice(20).map((miEvent) =>
+ expect.objectContaining({
+ Message: JSON.stringify(mapMIToCloudEvent(miEvent, mockedDeps)),
+ }),
+ ),
+ ];
+
+ const insertMIs = miEvents.map((miEvent) => generateInsertRecord(miEvent));
+ const testData = generateKinesisEvent(insertMIs);
+ await handler(testData, mockDeep(), jest.fn());
+
+ expect(mockedDeps.snsClient.send).toHaveBeenNthCalledWith(
+ 1,
+ expect.objectContaining({
+ input: expect.objectContaining({
+ TopicArn: "arn:aws:sns:region:account:topic",
+ PublishBatchRequestEntries: expectedEntries[0],
+ }),
+ }),
+ );
+ expect(mockedDeps.snsClient.send).toHaveBeenNthCalledWith(
+ 2,
+ expect.objectContaining({
+ input: expect.objectContaining({
+ TopicArn: "arn:aws:sns:region:account:topic",
+ PublishBatchRequestEntries: expectedEntries[1],
+ }),
+ }),
+ );
+
+ expect(mockedDeps.snsClient.send).toHaveBeenNthCalledWith(
+ 3,
+ expect.objectContaining({
+ input: expect.objectContaining({
+ TopicArn: "arn:aws:sns:region:account:topic",
+ PublishBatchRequestEntries: expectedEntries[2],
+ }),
+ }),
+ );
+ });
+});
diff --git a/lambdas/mi-updates-transformer/src/deps.ts b/lambdas/mi-updates-transformer/src/deps.ts
new file mode 100644
index 00000000..9332410e
--- /dev/null
+++ b/lambdas/mi-updates-transformer/src/deps.ts
@@ -0,0 +1,23 @@
+import pino from "pino";
+import { SNSClient } from "@aws-sdk/client-sns";
+import { EnvVars, envVars } from "./env";
+
+export type Deps = {
+ snsClient: SNSClient;
+ logger: pino.Logger;
+ env: EnvVars;
+};
+
+function createSNSClient(): SNSClient {
+ return new SNSClient({});
+}
+
+export function createDependenciesContainer(): Deps {
+ const log = pino();
+
+ return {
+ snsClient: createSNSClient(),
+ logger: log,
+ env: envVars,
+ };
+}
diff --git a/lambdas/mi-updates-transformer/src/env.ts b/lambdas/mi-updates-transformer/src/env.ts
new file mode 100644
index 00000000..f93bbf39
--- /dev/null
+++ b/lambdas/mi-updates-transformer/src/env.ts
@@ -0,0 +1,9 @@
+import { z } from "zod";
+
+const EnvVarsSchema = z.object({
+ EVENTPUB_SNS_TOPIC_ARN: z.string(),
+});
+
+export type EnvVars = z.infer;
+
+export const envVars = EnvVarsSchema.parse(process.env);
diff --git a/lambdas/mi-updates-transformer/src/index.ts b/lambdas/mi-updates-transformer/src/index.ts
new file mode 100644
index 00000000..6544d924
--- /dev/null
+++ b/lambdas/mi-updates-transformer/src/index.ts
@@ -0,0 +1,7 @@
+import { createHandler } from "./mi-updates-transformer";
+import { createDependenciesContainer } from "./deps";
+
+const container = createDependenciesContainer();
+
+// eslint-disable-next-line import-x/prefer-default-export
+export const handler = createHandler(container);
diff --git a/lambdas/mi-updates-transformer/src/mappers/__tests__/mi-mapper.test.ts b/lambdas/mi-updates-transformer/src/mappers/__tests__/mi-mapper.test.ts
new file mode 100644
index 00000000..b3a4a8a2
--- /dev/null
+++ b/lambdas/mi-updates-transformer/src/mappers/__tests__/mi-mapper.test.ts
@@ -0,0 +1,61 @@
+import { SNSClient } from "@aws-sdk/client-sns";
+import * as pino from "pino";
+import { $MISubmittedEvent } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src";
+import { MI } from "@internal/datastore";
+import { mapMIToCloudEvent } from "../mi-mapper";
+import { EnvVars } from "../../env";
+import { Deps } from "../../deps";
+
+describe("mi-mapper", () => {
+ const mockedDeps: jest.Mocked = {
+ snsClient: { send: jest.fn() } as unknown as SNSClient,
+ logger: { info: jest.fn(), error: jest.fn() } as unknown as pino.Logger,
+ env: {
+ EVENTPUB_SNS_TOPIC_ARN: "arn:aws:sns:region:account:topic",
+ } as unknown as EnvVars,
+ } as Deps;
+
+ it("maps an MI to an MI event", async () => {
+ const mi: MI = {
+ id: "id1",
+ lineItem: "lineItem1",
+ timestamp: "2025-11-24T15:55:18Z",
+ quantity: 100,
+ supplierId: "supplier1",
+ createdAt: "2025-11-24T15:55:18Z",
+ updatedAt: "2025-11-24T15:55:18Z",
+ ttl: 1_735_687_518,
+ specificationId: "spec1",
+ groupId: "group1",
+ stockRemaining: 500,
+ };
+ jest.useFakeTimers().setSystemTime(new Date("2025-11-24T15:55:18Z"));
+ const event = mapMIToCloudEvent(mi, mockedDeps);
+
+ // Check it conforms to the MI event schema - parse will throw an error if not
+ $MISubmittedEvent.parse(event);
+ expect(event.type).toBe("uk.nhs.notify.supplier-api.mi.SUBMITTED.v1");
+ expect(event.plane).toBe("data");
+ expect(event.dataschema).toBe(
+ "https://notify.nhs.uk/cloudevents/schemas/supplier-api/mi.SUBMITTED.1.1.5.schema.json",
+ );
+ expect(event.dataschemaversion).toBe("1.1.5");
+ expect(event.subject).toBe("mi/id1");
+ expect(event.time).toBe("2025-11-24T15:55:18.000Z");
+ expect(event.recordedtime).toBe("2025-11-24T15:55:18.000Z");
+ expect(event.data).toEqual({
+ id: "id1",
+ lineItem: "lineItem1",
+ timestamp: "2025-11-24T15:55:18Z",
+ quantity: 100,
+ specificationId: "spec1",
+ groupId: "group1",
+ stockRemaining: 500,
+ supplierId: "supplier1",
+ createdAt: "2025-11-24T15:55:18Z",
+ updatedAt: "2025-11-24T15:55:18Z",
+ });
+
+ jest.useRealTimers();
+ });
+});
diff --git a/lambdas/mi-updates-transformer/src/mappers/mi-mapper.ts b/lambdas/mi-updates-transformer/src/mappers/mi-mapper.ts
new file mode 100644
index 00000000..26153c24
--- /dev/null
+++ b/lambdas/mi-updates-transformer/src/mappers/mi-mapper.ts
@@ -0,0 +1,42 @@
+import { MI } from "@internal/datastore";
+import { MISubmittedEvent } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src";
+import { randomBytes, randomUUID } from "node:crypto";
+import { Deps } from "../deps";
+
+export function mapMIToCloudEvent(mi: MI, deps: Deps): MISubmittedEvent {
+ const now = new Date().toISOString();
+ const eventId = randomUUID();
+ const dataschemaversion = "1.1.5";
+
+ deps.logger.info({ description: "Mapping MI to CloudEvent", mi, eventId });
+
+ return {
+ specversion: "1.0",
+ id: eventId,
+ type: `uk.nhs.notify.supplier-api.mi.SUBMITTED.v1`,
+ plane: "data",
+ dataschema: `https://notify.nhs.uk/cloudevents/schemas/supplier-api/mi.SUBMITTED.${dataschemaversion}.schema.json`,
+ dataschemaversion,
+ source: "/data-plane/supplier-api/mi",
+ subject: `mi/${mi.id}`,
+
+ data: {
+ id: mi.id,
+ lineItem: mi.lineItem,
+ timestamp: mi.timestamp,
+ quantity: mi.quantity,
+ supplierId: mi.supplierId,
+ createdAt: mi.createdAt,
+ updatedAt: mi.updatedAt,
+ specificationId: mi.specificationId,
+ groupId: mi.groupId,
+ stockRemaining: mi.stockRemaining,
+ },
+ time: now,
+ datacontenttype: "application/json",
+ traceparent: `00-${randomBytes(16).toString("hex")}-${randomBytes(8).toString("hex")}-01`,
+ recordedtime: now,
+ severitynumber: 2,
+ severitytext: "INFO",
+ };
+}
diff --git a/lambdas/mi-updates-transformer/src/mi-updates-transformer.ts b/lambdas/mi-updates-transformer/src/mi-updates-transformer.ts
new file mode 100644
index 00000000..7891398e
--- /dev/null
+++ b/lambdas/mi-updates-transformer/src/mi-updates-transformer.ts
@@ -0,0 +1,72 @@
+import {
+ DynamoDBRecord,
+ Handler,
+ KinesisStreamEvent,
+ KinesisStreamRecord,
+} from "aws-lambda";
+import { unmarshall } from "@aws-sdk/util-dynamodb";
+import { MI, MISchema } from "@internal/datastore";
+import {
+ PublishBatchCommand,
+ PublishBatchRequestEntry,
+} from "@aws-sdk/client-sns";
+import { MISubmittedEvent } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src";
+import { mapMIToCloudEvent } from "./mappers/mi-mapper";
+import { Deps } from "./deps";
+// SNS PublishBatchCommand supports up to 10 messages per batch
+const BATCH_SIZE = 10;
+
+function* generateBatches(events: MISubmittedEvent[]) {
+ for (let i = 0; i < events.length; i += BATCH_SIZE) {
+ yield events.slice(i, i + BATCH_SIZE);
+ }
+}
+
+function buildMessage(
+ event: MISubmittedEvent,
+ deps: Deps,
+): PublishBatchRequestEntry {
+ const message = {
+ Id: event.id,
+ Message: JSON.stringify(event),
+ };
+ deps.logger.info({ description: "Built message", message });
+ return message;
+}
+
+function extractPayload(
+ record: KinesisStreamRecord,
+ deps: Deps,
+): DynamoDBRecord {
+ const payload = Buffer.from(record.kinesis.data, "base64").toString("utf8");
+ deps.logger.info({ description: "Extracted payload", payload });
+ return JSON.parse(payload);
+}
+
+function extractMIData(record: DynamoDBRecord): MI {
+ const newImage = record.dynamodb?.NewImage!;
+ return MISchema.parse(unmarshall(newImage as any));
+}
+
+export function createHandler(deps: Deps): Handler {
+ return async (streamEvent: KinesisStreamEvent) => {
+ deps.logger.info({ description: "Received event", streamEvent });
+
+ const cloudEvents: MISubmittedEvent[] = streamEvent.Records.map((record) =>
+ extractPayload(record, deps),
+ )
+ .map((element) => extractMIData(element))
+ .map((payload) => mapMIToCloudEvent(payload, deps));
+
+ for (const batch of generateBatches(cloudEvents)) {
+ await deps.snsClient.send(
+ new PublishBatchCommand({
+ TopicArn: deps.env.EVENTPUB_SNS_TOPIC_ARN,
+ PublishBatchRequestEntries: batch.map((element) =>
+ buildMessage(element, deps),
+ ),
+ }),
+ );
+ }
+ };
+}
diff --git a/lambdas/mi-updates-transformer/tsconfig.json b/lambdas/mi-updates-transformer/tsconfig.json
new file mode 100644
index 00000000..ea37d696
--- /dev/null
+++ b/lambdas/mi-updates-transformer/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "@tsconfig/node22/tsconfig.json",
+ "include": [
+ "src/**/*",
+ "jest.config.ts"
+ ]
+}
diff --git a/package-lock.json b/package-lock.json
index 4d51a035..1e4f7a22 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3014,6 +3014,1513 @@
"url": "https://github.com/sponsors/colinhacks"
}
},
+ "lambdas/mi-stream-forwarder": {
+ "version": "0.1.0",
+ "extraneous": true,
+ "dependencies": {
+ "@aws-sdk/client-kinesis": "^3.0.0",
+ "@aws-sdk/util-dynamodb": "^3.940.0",
+ "@internal/datastore": "^0.1.0",
+ "aws-lambda": "^1.0.7",
+ "jest-mock-extended": "^4.0.0",
+ "pino": "^10.1.0",
+ "zod": "^4.1.13"
+ },
+ "devDependencies": {
+ "@types/aws-lambda": "^8.10.119",
+ "typescript": "^5.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer": {
+ "name": "nhs-notify-supplier-api-mi-updates-transformer",
+ "version": "0.0.1",
+ "dependencies": {
+ "@aws-sdk/client-sns": "^3.940.0",
+ "@aws-sdk/util-dynamodb": "^3.943.0",
+ "@internal/datastore": "^0.1.0",
+ "@nhsdigital/nhs-notify-event-schemas-supplier-api": "*",
+ "aws-lambda": "^1.0.7",
+ "esbuild": "^0.24.0",
+ "pino": "^10.1.0",
+ "zod": "^4.1.13"
+ },
+ "devDependencies": {
+ "@tsconfig/node22": "^22.0.2",
+ "@types/aws-lambda": "^8.10.148",
+ "@types/jest": "^30.0.0",
+ "jest": "^30.2.0",
+ "jest-mock-extended": "^4.0.0",
+ "typescript": "^5.8.3"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.943.0.tgz",
+ "integrity": "sha512-1VvbsDSBrrvQ2UwdDab+YNpygyoDRSlOQ452KlEPh3jo155bMkiiY1siXaaXj0EMVwhPsLyKvbM4eBSl0Bi0yA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/credential-provider-node": "3.943.0",
+ "@aws-sdk/dynamodb-codec": "3.943.0",
+ "@aws-sdk/middleware-endpoint-discovery": "3.936.0",
+ "@aws-sdk/middleware-host-header": "3.936.0",
+ "@aws-sdk/middleware-logger": "3.936.0",
+ "@aws-sdk/middleware-recursion-detection": "3.936.0",
+ "@aws-sdk/middleware-user-agent": "3.943.0",
+ "@aws-sdk/region-config-resolver": "3.936.0",
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/util-endpoints": "3.936.0",
+ "@aws-sdk/util-user-agent-browser": "3.936.0",
+ "@aws-sdk/util-user-agent-node": "3.943.0",
+ "@smithy/config-resolver": "^4.4.3",
+ "@smithy/core": "^3.18.5",
+ "@smithy/fetch-http-handler": "^5.3.6",
+ "@smithy/hash-node": "^4.2.5",
+ "@smithy/invalid-dependency": "^4.2.5",
+ "@smithy/middleware-content-length": "^4.2.5",
+ "@smithy/middleware-endpoint": "^4.3.12",
+ "@smithy/middleware-retry": "^4.4.12",
+ "@smithy/middleware-serde": "^4.2.6",
+ "@smithy/middleware-stack": "^4.2.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/node-http-handler": "^4.4.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/url-parser": "^4.2.5",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-body-length-browser": "^4.2.0",
+ "@smithy/util-body-length-node": "^4.2.1",
+ "@smithy/util-defaults-mode-browser": "^4.3.11",
+ "@smithy/util-defaults-mode-node": "^4.2.14",
+ "@smithy/util-endpoints": "^3.2.5",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-retry": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "@smithy/util-waiter": "^4.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/client-sso": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.943.0.tgz",
+ "integrity": "sha512-kOTO2B8Ks2qX73CyKY8PAajtf5n39aMe2spoiOF5EkgSzGV7hZ/HONRDyADlyxwfsX39Q2F2SpPUaXzon32IGw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/middleware-host-header": "3.936.0",
+ "@aws-sdk/middleware-logger": "3.936.0",
+ "@aws-sdk/middleware-recursion-detection": "3.936.0",
+ "@aws-sdk/middleware-user-agent": "3.943.0",
+ "@aws-sdk/region-config-resolver": "3.936.0",
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/util-endpoints": "3.936.0",
+ "@aws-sdk/util-user-agent-browser": "3.936.0",
+ "@aws-sdk/util-user-agent-node": "3.943.0",
+ "@smithy/config-resolver": "^4.4.3",
+ "@smithy/core": "^3.18.5",
+ "@smithy/fetch-http-handler": "^5.3.6",
+ "@smithy/hash-node": "^4.2.5",
+ "@smithy/invalid-dependency": "^4.2.5",
+ "@smithy/middleware-content-length": "^4.2.5",
+ "@smithy/middleware-endpoint": "^4.3.12",
+ "@smithy/middleware-retry": "^4.4.12",
+ "@smithy/middleware-serde": "^4.2.6",
+ "@smithy/middleware-stack": "^4.2.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/node-http-handler": "^4.4.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/url-parser": "^4.2.5",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-body-length-browser": "^4.2.0",
+ "@smithy/util-body-length-node": "^4.2.1",
+ "@smithy/util-defaults-mode-browser": "^4.3.11",
+ "@smithy/util-defaults-mode-node": "^4.2.14",
+ "@smithy/util-endpoints": "^3.2.5",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-retry": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/core": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.943.0.tgz",
+ "integrity": "sha512-8CBy2hI9ABF7RBVQuY1bgf/ue+WPmM/hl0adrXFlhnhkaQP0tFY5zhiy1Y+n7V+5f3/ORoHBmCCQmcHDDYJqJQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/xml-builder": "3.930.0",
+ "@smithy/core": "^3.18.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/signature-v4": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.943.0.tgz",
+ "integrity": "sha512-WnS5w9fK9CTuoZRVSIHLOMcI63oODg9qd1vXMYb7QGLGlfwUm4aG3hdu7i9XvYrpkQfE3dzwWLtXF4ZBuL1Tew==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.943.0.tgz",
+ "integrity": "sha512-SA8bUcYDEACdhnhLpZNnWusBpdmj4Vl67Vxp3Zke7SvoWSYbuxa+tiDiC+c92Z4Yq6xNOuLPW912ZPb9/NsSkA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/fetch-http-handler": "^5.3.6",
+ "@smithy/node-http-handler": "^4.4.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/util-stream": "^4.5.6",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.943.0.tgz",
+ "integrity": "sha512-BcLDb8l4oVW+NkuqXMlO7TnM6lBOWW318ylf4FRED/ply5eaGxkQYqdGvHSqGSN5Rb3vr5Ek0xpzSjeYD7C8Kw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/credential-provider-env": "3.943.0",
+ "@aws-sdk/credential-provider-http": "3.943.0",
+ "@aws-sdk/credential-provider-login": "3.943.0",
+ "@aws-sdk/credential-provider-process": "3.943.0",
+ "@aws-sdk/credential-provider-sso": "3.943.0",
+ "@aws-sdk/credential-provider-web-identity": "3.943.0",
+ "@aws-sdk/nested-clients": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/credential-provider-imds": "^4.2.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-login": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.943.0.tgz",
+ "integrity": "sha512-9iCOVkiRW+evxiJE94RqosCwRrzptAVPhRhGWv4osfYDhjNAvUMyrnZl3T1bjqCoKNcETRKEZIU3dqYHnUkcwQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/nested-clients": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.943.0.tgz",
+ "integrity": "sha512-14eddaH/gjCWoLSAELVrFOQNyswUYwWphIt+PdsJ/FqVfP4ay2HsiZVEIYbQtmrKHaoLJhiZKwBQRjcqJDZG0w==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.943.0",
+ "@aws-sdk/credential-provider-http": "3.943.0",
+ "@aws-sdk/credential-provider-ini": "3.943.0",
+ "@aws-sdk/credential-provider-process": "3.943.0",
+ "@aws-sdk/credential-provider-sso": "3.943.0",
+ "@aws-sdk/credential-provider-web-identity": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/credential-provider-imds": "^4.2.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.943.0.tgz",
+ "integrity": "sha512-GIY/vUkthL33AdjOJ8r9vOosKf/3X+X7LIiACzGxvZZrtoOiRq0LADppdiKIB48vTL63VvW+eRIOFAxE6UDekw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.943.0.tgz",
+ "integrity": "sha512-1c5G11syUrru3D9OO6Uk+ul5e2lX1adb+7zQNyluNaLPXP6Dina6Sy6DFGRLu7tM8+M7luYmbS3w63rpYpaL+A==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.943.0",
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/token-providers": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.943.0.tgz",
+ "integrity": "sha512-VtyGKHxICSb4kKGuaqotxso8JVM8RjCS3UYdIMOxUt9TaFE/CZIfZKtjTr+IJ7M0P7t36wuSUb/jRLyNmGzUUA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/nested-clients": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.943.0.tgz",
+ "integrity": "sha512-956n4kVEwFNXndXfhSAN5wO+KRgqiWEEY+ECwLvxmmO8uQ0NWOa8l6l65nTtyuiWzMX81c9BvlyNR5EgUeeUvA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/util-endpoints": "3.936.0",
+ "@smithy/core": "^3.18.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/nested-clients": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.943.0.tgz",
+ "integrity": "sha512-anFtB0p2FPuyUnbOULwGmKYqYKSq1M73c9uZ08jR/NCq6Trjq9cuF5TFTeHwjJyPRb4wMf2Qk859oiVfFqnQiw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/middleware-host-header": "3.936.0",
+ "@aws-sdk/middleware-logger": "3.936.0",
+ "@aws-sdk/middleware-recursion-detection": "3.936.0",
+ "@aws-sdk/middleware-user-agent": "3.943.0",
+ "@aws-sdk/region-config-resolver": "3.936.0",
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/util-endpoints": "3.936.0",
+ "@aws-sdk/util-user-agent-browser": "3.936.0",
+ "@aws-sdk/util-user-agent-node": "3.943.0",
+ "@smithy/config-resolver": "^4.4.3",
+ "@smithy/core": "^3.18.5",
+ "@smithy/fetch-http-handler": "^5.3.6",
+ "@smithy/hash-node": "^4.2.5",
+ "@smithy/invalid-dependency": "^4.2.5",
+ "@smithy/middleware-content-length": "^4.2.5",
+ "@smithy/middleware-endpoint": "^4.3.12",
+ "@smithy/middleware-retry": "^4.4.12",
+ "@smithy/middleware-serde": "^4.2.6",
+ "@smithy/middleware-stack": "^4.2.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/node-http-handler": "^4.4.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/url-parser": "^4.2.5",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-body-length-browser": "^4.2.0",
+ "@smithy/util-body-length-node": "^4.2.1",
+ "@smithy/util-defaults-mode-browser": "^4.3.11",
+ "@smithy/util-defaults-mode-node": "^4.2.14",
+ "@smithy/util-endpoints": "^3.2.5",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-retry": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/token-providers": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.943.0.tgz",
+ "integrity": "sha512-cRKyIzwfkS+XztXIFPoWORuaxlIswP+a83BJzelX4S1gUZ7FcXB4+lj9Jxjn8SbQhR4TPU3Owbpu+S7pd6IRbQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@aws-sdk/nested-clients": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.943.0.tgz",
+ "integrity": "sha512-gn+ILprVRrgAgTIBk2TDsJLRClzIOdStQFeFTcN0qpL8Z4GBCqMFhw7O7X+MM55Stt5s4jAauQ/VvoqmCADnQg==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/middleware-user-agent": "3.943.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-sns": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.940.0.tgz",
+ "integrity": "sha512-TtLmzU8ylChGESzPA21vzsJiN7KTW2uLoAhYb5JAkxK+AsZSqwfqK8ycLsbguOp7xLuM4cqMILoUvF5me5LXdw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/credential-provider-node": "3.940.0",
+ "@aws-sdk/middleware-host-header": "3.936.0",
+ "@aws-sdk/middleware-logger": "3.936.0",
+ "@aws-sdk/middleware-recursion-detection": "3.936.0",
+ "@aws-sdk/middleware-user-agent": "3.940.0",
+ "@aws-sdk/region-config-resolver": "3.936.0",
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/util-endpoints": "3.936.0",
+ "@aws-sdk/util-user-agent-browser": "3.936.0",
+ "@aws-sdk/util-user-agent-node": "3.940.0",
+ "@smithy/config-resolver": "^4.4.3",
+ "@smithy/core": "^3.18.5",
+ "@smithy/fetch-http-handler": "^5.3.6",
+ "@smithy/hash-node": "^4.2.5",
+ "@smithy/invalid-dependency": "^4.2.5",
+ "@smithy/middleware-content-length": "^4.2.5",
+ "@smithy/middleware-endpoint": "^4.3.12",
+ "@smithy/middleware-retry": "^4.4.12",
+ "@smithy/middleware-serde": "^4.2.6",
+ "@smithy/middleware-stack": "^4.2.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/node-http-handler": "^4.4.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/url-parser": "^4.2.5",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-body-length-browser": "^4.2.0",
+ "@smithy/util-body-length-node": "^4.2.1",
+ "@smithy/util-defaults-mode-browser": "^4.3.11",
+ "@smithy/util-defaults-mode-node": "^4.2.14",
+ "@smithy/util-endpoints": "^3.2.5",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-retry": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/client-sso": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.940.0.tgz",
+ "integrity": "sha512-SdqJGWVhmIURvCSgkDditHRO+ozubwZk9aCX9MK8qxyOndhobCndW1ozl3hX9psvMAo9Q4bppjuqy/GHWpjB+A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/middleware-host-header": "3.936.0",
+ "@aws-sdk/middleware-logger": "3.936.0",
+ "@aws-sdk/middleware-recursion-detection": "3.936.0",
+ "@aws-sdk/middleware-user-agent": "3.940.0",
+ "@aws-sdk/region-config-resolver": "3.936.0",
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/util-endpoints": "3.936.0",
+ "@aws-sdk/util-user-agent-browser": "3.936.0",
+ "@aws-sdk/util-user-agent-node": "3.940.0",
+ "@smithy/config-resolver": "^4.4.3",
+ "@smithy/core": "^3.18.5",
+ "@smithy/fetch-http-handler": "^5.3.6",
+ "@smithy/hash-node": "^4.2.5",
+ "@smithy/invalid-dependency": "^4.2.5",
+ "@smithy/middleware-content-length": "^4.2.5",
+ "@smithy/middleware-endpoint": "^4.3.12",
+ "@smithy/middleware-retry": "^4.4.12",
+ "@smithy/middleware-serde": "^4.2.6",
+ "@smithy/middleware-stack": "^4.2.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/node-http-handler": "^4.4.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/url-parser": "^4.2.5",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-body-length-browser": "^4.2.0",
+ "@smithy/util-body-length-node": "^4.2.1",
+ "@smithy/util-defaults-mode-browser": "^4.3.11",
+ "@smithy/util-defaults-mode-node": "^4.2.14",
+ "@smithy/util-endpoints": "^3.2.5",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-retry": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/core": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz",
+ "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/xml-builder": "3.930.0",
+ "@smithy/core": "^3.18.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/signature-v4": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.940.0.tgz",
+ "integrity": "sha512-/G3l5/wbZYP2XEQiOoIkRJmlv15f1P3MSd1a0gz27lHEMrOJOGq66rF1Ca4OJLzapWt3Fy9BPrZAepoAX11kMw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/credential-provider-http": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.940.0.tgz",
+ "integrity": "sha512-dOrc03DHElNBD6N9Okt4U0zhrG4Wix5QUBSZPr5VN8SvmjD9dkrrxOkkJaMCl/bzrW7kbQEp7LuBdbxArMmOZQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/fetch-http-handler": "^5.3.6",
+ "@smithy/node-http-handler": "^4.4.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/util-stream": "^4.5.6",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.940.0.tgz",
+ "integrity": "sha512-gn7PJQEzb/cnInNFTOaDoCN/hOKqMejNmLof1W5VW95Qk0TPO52lH8R4RmJPnRrwFMswOWswTOpR1roKNLIrcw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/credential-provider-env": "3.940.0",
+ "@aws-sdk/credential-provider-http": "3.940.0",
+ "@aws-sdk/credential-provider-login": "3.940.0",
+ "@aws-sdk/credential-provider-process": "3.940.0",
+ "@aws-sdk/credential-provider-sso": "3.940.0",
+ "@aws-sdk/credential-provider-web-identity": "3.940.0",
+ "@aws-sdk/nested-clients": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/credential-provider-imds": "^4.2.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/credential-provider-login": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.940.0.tgz",
+ "integrity": "sha512-fOKC3VZkwa9T2l2VFKWRtfHQPQuISqqNl35ZhcXjWKVwRwl/o7THPMkqI4XwgT2noGa7LLYVbWMwnsgSsBqglg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/nested-clients": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz",
+ "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.940.0",
+ "@aws-sdk/credential-provider-http": "3.940.0",
+ "@aws-sdk/credential-provider-ini": "3.940.0",
+ "@aws-sdk/credential-provider-process": "3.940.0",
+ "@aws-sdk/credential-provider-sso": "3.940.0",
+ "@aws-sdk/credential-provider-web-identity": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/credential-provider-imds": "^4.2.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.940.0.tgz",
+ "integrity": "sha512-pILBzt5/TYCqRsJb7vZlxmRIe0/T+FZPeml417EK75060ajDGnVJjHcuVdLVIeKoTKm9gmJc9l45gon6PbHyUQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.940.0.tgz",
+ "integrity": "sha512-q6JMHIkBlDCOMnA3RAzf8cGfup+8ukhhb50fNpghMs1SNBGhanmaMbZSgLigBRsPQW7fOk2l8jnzdVLS+BB9Uw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.940.0",
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/token-providers": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.940.0.tgz",
+ "integrity": "sha512-9QLTIkDJHHaYL0nyymO41H8g3ui1yz6Y3GmAN1gYQa6plXisuFBnGAbmKVj7zNvjWaOKdF0dV3dd3AFKEDoJ/w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/nested-clients": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/dynamodb-codec": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.943.0.tgz",
+ "integrity": "sha512-dGUjOPWt+35r0vTcb19bFluumf3XprdjzkA1Qa+va1mEiBuGi9lHZJSI9E2JX2wt/qUtlPeW1kjlEaHZk0nYcA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/core": "3.943.0",
+ "@smithy/core": "^3.18.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/util-base64": "^4.3.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-dynamodb": "^3.943.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/dynamodb-codec/node_modules/@aws-sdk/core": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.943.0.tgz",
+ "integrity": "sha512-8CBy2hI9ABF7RBVQuY1bgf/ue+WPmM/hl0adrXFlhnhkaQP0tFY5zhiy1Y+n7V+5f3/ORoHBmCCQmcHDDYJqJQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/xml-builder": "3.930.0",
+ "@smithy/core": "^3.18.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/signature-v4": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/middleware-endpoint-discovery": {
+ "version": "3.936.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.936.0.tgz",
+ "integrity": "sha512-wNJZ8PDw0eQK2x4z1q8JqiDvw9l9xd36EoklVT2CIBt8FnqGdrMGjAx93RRbH3G6Fmvwoe+D3VJXbWHBlhD0Bw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@aws-sdk/endpoint-cache": "3.893.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.936.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz",
+ "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.936.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz",
+ "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.936.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz",
+ "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@aws/lambda-invoke-store": "^0.2.0",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz",
+ "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/util-endpoints": "3.936.0",
+ "@smithy/core": "^3.18.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/nested-clients": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.940.0.tgz",
+ "integrity": "sha512-x0mdv6DkjXqXEcQj3URbCltEzW6hoy/1uIL+i8gExP6YKrnhiZ7SzuB4gPls2UOpK5UqLiqXjhRLfBb1C9i4Dw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "5.2.0",
+ "@aws-crypto/sha256-js": "5.2.0",
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/middleware-host-header": "3.936.0",
+ "@aws-sdk/middleware-logger": "3.936.0",
+ "@aws-sdk/middleware-recursion-detection": "3.936.0",
+ "@aws-sdk/middleware-user-agent": "3.940.0",
+ "@aws-sdk/region-config-resolver": "3.936.0",
+ "@aws-sdk/types": "3.936.0",
+ "@aws-sdk/util-endpoints": "3.936.0",
+ "@aws-sdk/util-user-agent-browser": "3.936.0",
+ "@aws-sdk/util-user-agent-node": "3.940.0",
+ "@smithy/config-resolver": "^4.4.3",
+ "@smithy/core": "^3.18.5",
+ "@smithy/fetch-http-handler": "^5.3.6",
+ "@smithy/hash-node": "^4.2.5",
+ "@smithy/invalid-dependency": "^4.2.5",
+ "@smithy/middleware-content-length": "^4.2.5",
+ "@smithy/middleware-endpoint": "^4.3.12",
+ "@smithy/middleware-retry": "^4.4.12",
+ "@smithy/middleware-serde": "^4.2.6",
+ "@smithy/middleware-stack": "^4.2.5",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/node-http-handler": "^4.4.5",
+ "@smithy/protocol-http": "^5.3.5",
+ "@smithy/smithy-client": "^4.9.8",
+ "@smithy/types": "^4.9.0",
+ "@smithy/url-parser": "^4.2.5",
+ "@smithy/util-base64": "^4.3.0",
+ "@smithy/util-body-length-browser": "^4.2.0",
+ "@smithy/util-body-length-node": "^4.2.1",
+ "@smithy/util-defaults-mode-browser": "^4.3.11",
+ "@smithy/util-defaults-mode-node": "^4.2.14",
+ "@smithy/util-endpoints": "^3.2.5",
+ "@smithy/util-middleware": "^4.2.5",
+ "@smithy/util-retry": "^4.2.5",
+ "@smithy/util-utf8": "^4.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/region-config-resolver": {
+ "version": "3.936.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz",
+ "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/config-resolver": "^4.4.3",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/token-providers": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.940.0.tgz",
+ "integrity": "sha512-k5qbRe/ZFjW9oWEdzLIa2twRVIEx7p/9rutofyrRysrtEnYh3HAWCngAnwbgKMoiwa806UzcTRx0TjyEpnKcCg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/core": "3.940.0",
+ "@aws-sdk/nested-clients": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/property-provider": "^4.2.5",
+ "@smithy/shared-ini-file-loader": "^4.4.0",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/types": {
+ "version": "3.936.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz",
+ "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/util-dynamodb": {
+ "version": "3.943.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.943.0.tgz",
+ "integrity": "sha512-F2qVauKYoTleiv/Kv423P7zin93sSuwRkIKUKh+dR4oP7P9EP43/I3NHHeA3AlifIFGZG9jzuHi4MvhF4yC2yg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/client-dynamodb": "^3.943.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/util-endpoints": {
+ "version": "3.936.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz",
+ "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/types": "^4.9.0",
+ "@smithy/url-parser": "^4.2.5",
+ "@smithy/util-endpoints": "^3.2.5",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.936.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz",
+ "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/types": "^4.9.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.6.2"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.940.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz",
+ "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/middleware-user-agent": "3.940.0",
+ "@aws-sdk/types": "3.936.0",
+ "@smithy/node-config-provider": "^4.3.5",
+ "@smithy/types": "^4.9.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@aws/lambda-invoke-store": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.1.tgz",
+ "integrity": "sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
+ "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/android-arm": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
+ "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/android-arm64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
+ "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/android-x64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
+ "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
+ "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/darwin-x64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
+ "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
+ "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
+ "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-arm": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
+ "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-arm64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
+ "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-ia32": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
+ "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-loong64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
+ "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
+ "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
+ "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
+ "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-s390x": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
+ "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/linux-x64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
+ "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
+ "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
+ "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
+ "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
+ "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/sunos-x64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
+ "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/win32-arm64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
+ "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/win32-ia32": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
+ "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/@esbuild/win32-x64": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
+ "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/esbuild": {
+ "version": "0.24.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
+ "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.24.2",
+ "@esbuild/android-arm": "0.24.2",
+ "@esbuild/android-arm64": "0.24.2",
+ "@esbuild/android-x64": "0.24.2",
+ "@esbuild/darwin-arm64": "0.24.2",
+ "@esbuild/darwin-x64": "0.24.2",
+ "@esbuild/freebsd-arm64": "0.24.2",
+ "@esbuild/freebsd-x64": "0.24.2",
+ "@esbuild/linux-arm": "0.24.2",
+ "@esbuild/linux-arm64": "0.24.2",
+ "@esbuild/linux-ia32": "0.24.2",
+ "@esbuild/linux-loong64": "0.24.2",
+ "@esbuild/linux-mips64el": "0.24.2",
+ "@esbuild/linux-ppc64": "0.24.2",
+ "@esbuild/linux-riscv64": "0.24.2",
+ "@esbuild/linux-s390x": "0.24.2",
+ "@esbuild/linux-x64": "0.24.2",
+ "@esbuild/netbsd-arm64": "0.24.2",
+ "@esbuild/netbsd-x64": "0.24.2",
+ "@esbuild/openbsd-arm64": "0.24.2",
+ "@esbuild/openbsd-x64": "0.24.2",
+ "@esbuild/sunos-x64": "0.24.2",
+ "@esbuild/win32-arm64": "0.24.2",
+ "@esbuild/win32-ia32": "0.24.2",
+ "@esbuild/win32-x64": "0.24.2"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/pino": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-10.1.0.tgz",
+ "integrity": "sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==",
+ "license": "MIT",
+ "dependencies": {
+ "@pinojs/redact": "^0.4.0",
+ "atomic-sleep": "^1.0.0",
+ "on-exit-leak-free": "^2.1.0",
+ "pino-abstract-transport": "^2.0.0",
+ "pino-std-serializers": "^7.0.0",
+ "process-warning": "^5.0.0",
+ "quick-format-unescaped": "^4.0.3",
+ "real-require": "^0.2.0",
+ "safe-stable-stringify": "^2.3.1",
+ "sonic-boom": "^4.0.1",
+ "thread-stream": "^3.0.0"
+ },
+ "bin": {
+ "pino": "bin.js"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "lambdas/mi-updates-transformer/node_modules/zod": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz",
+ "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
"lambdas/upsert-letter": {
"name": "nhs-notify-supplier-api-upsert-letter",
"version": "0.0.1",
@@ -18328,6 +19835,18 @@
"node": "6.* || 8.* || >= 10.*"
}
},
+ "node_modules/get-east-asian-width": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz",
+ "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -22760,6 +24279,10 @@
"resolved": "lambdas/letter-updates-transformer",
"link": true
},
+ "node_modules/nhs-notify-supplier-api-mi-updates-transformer": {
+ "resolved": "lambdas/mi-updates-transformer",
+ "link": true
+ },
"node_modules/nhs-notify-supplier-api-suppliers-data-utility": {
"resolved": "scripts/utilities/supplier-data",
"link": true