diff --git a/docs/utilities/parser.md b/docs/utilities/parser.md index 8b6e750cb2..e4dcd5dfdd 100644 --- a/docs/utilities/parser.md +++ b/docs/utilities/parser.md @@ -85,6 +85,7 @@ Parser comes with the following built-in schemas: | **SesSchema** | Lambda Event Source payload for Amazon Simple Email Service | | **SnsSchema** | Lambda Event Source payload for Amazon Simple Notification Service | | **SqsSchema** | Lambda Event Source payload for Amazon SQS | +| **TransferFamilySchema** | Lambda Event Source payload for AWS Transfer Family events | | **VpcLatticeSchema** | Lambda Event Source payload for Amazon VPC Lattice | | **VpcLatticeV2Schema** | Lambda Event Source payload for Amazon VPC Lattice v2 payload | diff --git a/packages/parser/package.json b/packages/parser/package.json index e822c086b4..a77b11e797 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -112,6 +112,10 @@ "require": "./lib/cjs/schemas/sqs.js", "import": "./lib/esm/schemas/sqs.js" }, + "./schemas/transfer-family": { + "require": "./lib/cjs/schemas/transfer-family.js", + "import": "./lib/esm/schemas/transfer-family.js" + }, "./schemas/vpc-lattice": { "require": "./lib/cjs/schemas/vpc-lattice.js", "import": "./lib/esm/schemas/vpc-lattice.js" @@ -323,6 +327,10 @@ "./lib/cjs/envelopes/sqs.d.ts", "./lib/esm/envelopes/sqs.d.ts" ], + "schemas/transfer-family": [ + "./lib/cjs/schemas/transfer-family.d.ts", + "./lib/esm/schemas/transfer-family.d.ts" + ], "envelopes/vpc-lattice": [ "./lib/cjs/envelopes/vpc-lattice.d.ts", "./lib/esm/envelopes/vpc-lattice.d.ts" diff --git a/packages/parser/src/schemas/index.ts b/packages/parser/src/schemas/index.ts index 266a1251fb..18f3a35424 100644 --- a/packages/parser/src/schemas/index.ts +++ b/packages/parser/src/schemas/index.ts @@ -61,5 +61,6 @@ export { SnsNotificationSchema, } from './sns.js'; export { SqsSchema, SqsRecordSchema } from './sqs.js'; +export { TransferFamilySchema } from './transfer-family.js'; export { VpcLatticeSchema } from './vpc-lattice.js'; export { VpcLatticeV2Schema } from './vpc-latticev2.js'; diff --git a/packages/parser/src/schemas/transfer-family.ts b/packages/parser/src/schemas/transfer-family.ts new file mode 100644 index 0000000000..145a45d43a --- /dev/null +++ b/packages/parser/src/schemas/transfer-family.ts @@ -0,0 +1,29 @@ +import { z } from 'zod'; + +/** + * + * Zod schema for AWS Transfer Family events. + * + * @example + * ```json + * { + * "username": "testUser", + * "password": "testPass", + * "protocol": "SFTP", + * "serverId": "s-abcd123456", + * "sourceIp": "192.168.0.100" + * } + * ``` + * + * TransferFamilySchema validates events coming from AWS Transfer Family. + * + */ +const TransferFamilySchema = z.object({ + username: z.string(), + password: z.string(), + protocol: z.string(), + serverId: z.string(), + sourceIp: z.string().ip(), +}); + +export { TransferFamilySchema }; diff --git a/packages/parser/src/types/index.ts b/packages/parser/src/types/index.ts index e4f331e88b..924698b278 100644 --- a/packages/parser/src/types/index.ts +++ b/packages/parser/src/types/index.ts @@ -38,6 +38,7 @@ export type { SnsEvent, SnsSqsNotification, SqsEvent, + TransferFamilyEvent, VpcLatticeEvent, VpcLatticeEventV2, } from './schema.js'; diff --git a/packages/parser/src/types/schema.ts b/packages/parser/src/types/schema.ts index 5f17f4b6bd..37395bc994 100644 --- a/packages/parser/src/types/schema.ts +++ b/packages/parser/src/types/schema.ts @@ -37,6 +37,7 @@ import type { SnsSqsNotificationSchema, SqsRecordSchema, SqsSchema, + TransferFamilySchema, VpcLatticeSchema, VpcLatticeV2Schema, } from '../schemas/index.js'; @@ -129,6 +130,8 @@ type SqsEvent = z.infer<typeof SqsSchema>; type SqsRecord = z.infer<typeof SqsRecordSchema>; +type TransferFamilyEvent = z.infer<typeof TransferFamilySchema>; + type VpcLatticeEvent = z.infer<typeof VpcLatticeSchema>; type VpcLatticeEventV2 = z.infer<typeof VpcLatticeV2Schema>; @@ -171,6 +174,7 @@ export type { SnsRecord, SqsEvent, SqsRecord, + TransferFamilyEvent, VpcLatticeEvent, VpcLatticeEventV2, }; diff --git a/packages/parser/tests/events/transfer-family/base.json b/packages/parser/tests/events/transfer-family/base.json new file mode 100644 index 0000000000..e0bf0bd4ae --- /dev/null +++ b/packages/parser/tests/events/transfer-family/base.json @@ -0,0 +1,8 @@ +{ + "username": "value", + "password": "value", + "protocol": "SFTP", + "serverId": "s-abcd123456", + "sourceIp": "192.168.0.100" + } + \ No newline at end of file diff --git a/packages/parser/tests/unit/schema/transfer-family.test.ts b/packages/parser/tests/unit/schema/transfer-family.test.ts new file mode 100644 index 0000000000..f6041433cc --- /dev/null +++ b/packages/parser/tests/unit/schema/transfer-family.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, it } from 'vitest'; +import { TransferFamilySchema } from '../../../src/schemas/transfer-family'; +import type { TransferFamilyEvent } from '../../../src/types/schema.js'; +import { getTestEvent } from '../helpers/utils'; + +describe('Schema: TransferFamily', () => { + const baseEvent = getTestEvent<TransferFamilyEvent>({ + eventsPath: 'transfer-family', + filename: 'base', + }); + + it('parses a valid TransferFamily event', () => { + // Prepare + const event = structuredClone(baseEvent); + + // Act + const result = TransferFamilySchema.parse(event); + + // Assess + expect(result).toStrictEqual(event); + }); + + it('throws if the event is not a valid TransferFamily event', () => { + // Prepare + const invalidEvent = { + username: 'testUser', + protocol: 'SFTP', + serverId: 's-abcd123456', + sourceIp: 'invalid-ip', + }; + + // Act & Assess + expect(() => TransferFamilySchema.parse(invalidEvent)).toThrow(); + }); +});