Skip to content

Commit 4005fe8

Browse files
authored
chore(parser): adds exports for Record schemas (#2846)
1 parent e709c9c commit 4005fe8

File tree

13 files changed

+197
-27
lines changed

13 files changed

+197
-27
lines changed

packages/parser/package.json

+2-7
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,7 @@
6262
},
6363
"typesVersions": {
6464
"*": {
65-
"types": [
66-
"./lib/cjs/types/index.d.ts",
67-
"./lib/esm/types/index.d.ts"
68-
],
65+
"types": ["./lib/cjs/types/index.d.ts", "./lib/esm/types/index.d.ts"],
6966
"middleware": [
7067
"./lib/cjs/middleware/parser.d.ts",
7168
"./lib/esm/middleware/parser.d.ts"
@@ -90,9 +87,7 @@
9087
},
9188
"main": "./lib/cjs/index.js",
9289
"types": "./lib/cjs/index.d.ts",
93-
"files": [
94-
"lib"
95-
],
90+
"files": ["lib"],
9691
"repository": {
9792
"type": "git",
9893
"url": "git+https://github.com/aws-powertools/powertools-lambda-typescript.git"

packages/parser/src/schemas/index.ts

+16-5
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,17 @@ export {
2020
} from './cloudwatch.js';
2121
export { DynamoDBStreamSchema } from './dynamodb.js';
2222
export { EventBridgeSchema } from './eventbridge.js';
23-
export { KafkaMskEventSchema, KafkaSelfManagedEventSchema } from './kafka.js';
24-
export { KinesisDataStreamSchema } from './kinesis.js';
23+
export {
24+
KafkaMskEventSchema,
25+
KafkaSelfManagedEventSchema,
26+
KafkaRecordSchema,
27+
} from './kafka.js';
28+
export { KinesisDataStreamSchema, KinesisDataStreamRecord } from './kinesis.js';
2529
export {
2630
KinesisFirehoseSchema,
2731
KinesisFirehoseSqsSchema,
32+
KinesisFirehoseRecordSchema,
33+
KinesisFirehoseSqsRecordSchema,
2834
} from './kinesis-firehose.js';
2935
export { LambdaFunctionUrlSchema } from './lambda.js';
3036
export {
@@ -33,8 +39,13 @@ export {
3339
S3ObjectLambdaEventSchema,
3440
S3Schema,
3541
} from './s3.js';
36-
export { SesSchema } from './ses.js';
37-
export { SnsSchema } from './sns.js';
38-
export { SqsSchema } from './sqs.js';
42+
export { SesSchema, SesRecordSchema } from './ses.js';
43+
export {
44+
SnsSchema,
45+
SnsRecordSchema,
46+
SnsSqsNotificationSchema,
47+
SnsNotificationSchema,
48+
} from './sns.js';
49+
export { SqsSchema, SqsRecordSchema } from './sqs.js';
3950
export { VpcLatticeSchema } from './vpc-lattice.js';
4051
export { VpcLatticeV2Schema } from './vpc-latticev2.js';

packages/parser/src/schemas/kafka.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { z } from 'zod';
22

3+
/**
4+
* Zod schema for a Kafka record from an Kafka event.
5+
*/
36
const KafkaRecordSchema = z.object({
47
topic: z.string(),
58
partition: z.number(),

packages/parser/src/schemas/kinesis-firehose.ts

+16-5
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,19 @@ const KinesisFireHoseBaseSchema = z.object({
2222
sourceKinesisStreamArn: z.string().optional(),
2323
});
2424

25-
const KinesisFirehoseRecord = KinesisFireHoseRecordBase.extend({
25+
/**
26+
* Zod schema for a Kinesis Firehose record from an Kinesis Firehose event.
27+
*/
28+
const KinesisFirehoseRecordSchema = KinesisFireHoseRecordBase.extend({
2629
data: z
2730
.string()
2831
.transform((data) => Buffer.from(data, 'base64').toString('utf8')),
2932
});
3033

31-
const KinesisFirehoseSqsRecord = KinesisFireHoseRecordBase.extend({
34+
/**
35+
* Zod schema for a SQS record from an Kinesis Firehose event.
36+
*/
37+
const KinesisFirehoseSqsRecordSchema = KinesisFireHoseRecordBase.extend({
3238
data: z.string().transform((data) => {
3339
try {
3440
return SqsRecordSchema.parse(
@@ -83,7 +89,7 @@ const KinesisFirehoseSqsRecord = KinesisFireHoseRecordBase.extend({
8389
* @see {@link https://docs.aws.amazon.com/lambda/latest/dg/services-kinesisfirehose.html}
8490
*/
8591
const KinesisFirehoseSchema = KinesisFireHoseBaseSchema.extend({
86-
records: z.array(KinesisFirehoseRecord),
92+
records: z.array(KinesisFirehoseRecordSchema),
8793
});
8894

8995
/**
@@ -108,7 +114,12 @@ const KinesisFirehoseSchema = KinesisFireHoseBaseSchema.extend({
108114
* @see {@link types.KinesisFireHoseSqsEvent | KinesisFireHoseSqsEvent}
109115
*/
110116
const KinesisFirehoseSqsSchema = KinesisFireHoseBaseSchema.extend({
111-
records: z.array(KinesisFirehoseSqsRecord),
117+
records: z.array(KinesisFirehoseSqsRecordSchema),
112118
});
113119

114-
export { KinesisFirehoseSchema, KinesisFirehoseSqsSchema };
120+
export {
121+
KinesisFirehoseSchema,
122+
KinesisFirehoseSqsSchema,
123+
KinesisFirehoseRecordSchema,
124+
KinesisFirehoseSqsRecordSchema,
125+
};

packages/parser/src/schemas/ses.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ const SesMessage = z.object({
5252
receipt: SesReceipt,
5353
});
5454

55+
/**
56+
* Zod schema for a SES record from an SES event.
57+
*/
5558
const SesRecordSchema = z.object({
5659
eventSource: z.literal('aws:ses'),
5760
eventVersion: z.string(),
@@ -173,4 +176,4 @@ const SesSchema = z.object({
173176
Records: z.array(SesRecordSchema),
174177
});
175178

176-
export { SesSchema };
179+
export { SesSchema, SesRecordSchema };

packages/parser/src/schemas/sns.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ const SnsMsgAttribute = z.object({
55
Value: z.string(),
66
});
77

8+
/**
9+
* Zod schema for a SNS event notification record.
10+
*/
811
const SnsNotificationSchema = z.object({
912
Subject: z.string().optional(),
1013
TopicArn: z.string(),
@@ -58,6 +61,9 @@ const SnsSqsNotificationSchema = SnsNotificationSchema.extend({
5861
SigningCertUrl: true,
5962
});
6063

64+
/**
65+
* Zod schema for a SNS record inside of an SNS event.
66+
*/
6167
const SnsRecordSchema = z.object({
6268
EventSource: z.literal('aws:sns'),
6369
EventVersion: z.string(),
@@ -110,4 +116,9 @@ const SnsSchema = z.object({
110116
Records: z.array(SnsRecordSchema),
111117
});
112118

113-
export { SnsSchema, SnsSqsNotificationSchema };
119+
export {
120+
SnsSchema,
121+
SnsSqsNotificationSchema,
122+
SnsRecordSchema,
123+
SnsNotificationSchema,
124+
};

packages/parser/src/schemas/sqs.ts

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ const SqsAttributesSchema = z.object({
2323
DeadLetterQueueSourceArn: z.string().optional(),
2424
});
2525

26+
/**
27+
* Zod schema for a SQS record inside an SQS event.
28+
*/
2629
const SqsRecordSchema = z.object({
2730
messageId: z.string(),
2831
receiptHandle: z.string(),

packages/parser/src/types/schema.ts

+32
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,25 @@ import type {
1111
DynamoDBStreamSchema,
1212
EventBridgeSchema,
1313
KafkaMskEventSchema,
14+
KafkaRecordSchema,
1415
KafkaSelfManagedEventSchema,
1516
KinesisDataStreamSchema,
17+
KinesisFirehoseRecordSchema,
1618
KinesisFirehoseSchema,
19+
KinesisFirehoseSqsRecordSchema,
1720
KinesisFirehoseSqsSchema,
1821
LambdaFunctionUrlSchema,
1922
S3EventNotificationEventBridgeSchema,
2023
S3ObjectLambdaEventSchema,
2124
S3Schema,
2225
S3SqsEventNotificationSchema,
26+
SesRecordSchema,
2327
SesSchema,
28+
SnsNotificationSchema,
29+
SnsRecordSchema,
2430
SnsSchema,
31+
SnsSqsNotificationSchema,
32+
SqsRecordSchema,
2533
SqsSchema,
2634
VpcLatticeSchema,
2735
VpcLatticeV2Schema,
@@ -55,14 +63,20 @@ type EventBridgeEvent = z.infer<typeof EventBridgeSchema>;
5563

5664
type KafkaSelfManagedEvent = z.infer<typeof KafkaSelfManagedEventSchema>;
5765

66+
type KafkaRecord = z.infer<typeof KafkaRecordSchema>;
67+
5868
type KafkaMskEvent = z.infer<typeof KafkaMskEventSchema>;
5969

6070
type KinesisDataStreamEvent = z.infer<typeof KinesisDataStreamSchema>;
6171

6272
type KinesisFireHoseEvent = z.infer<typeof KinesisFirehoseSchema>;
6373

74+
type KinesisFirehoseRecord = z.infer<typeof KinesisFirehoseRecordSchema>;
75+
6476
type KinesisFireHoseSqsEvent = z.infer<typeof KinesisFirehoseSqsSchema>;
6577

78+
type KinesisFirehoseSqsRecord = z.infer<typeof KinesisFirehoseSqsRecordSchema>;
79+
6680
type LambdaFunctionUrlEvent = z.infer<typeof LambdaFunctionUrlSchema>;
6781

6882
type S3Event = z.infer<typeof S3Schema>;
@@ -77,10 +91,20 @@ type S3ObjectLambdaEvent = z.infer<typeof S3ObjectLambdaEventSchema>;
7791

7892
type SesEvent = z.infer<typeof SesSchema>;
7993

94+
type SesRecord = z.infer<typeof SesRecordSchema>;
95+
8096
type SnsEvent = z.infer<typeof SnsSchema>;
8197

98+
type SnsSqsNotification = z.infer<typeof SnsSqsNotificationSchema>;
99+
100+
type SnsNotification = z.infer<typeof SnsNotificationSchema>;
101+
102+
type SnsRecord = z.infer<typeof SnsRecordSchema>;
103+
82104
type SqsEvent = z.infer<typeof SqsSchema>;
83105

106+
type SqsRecord = z.infer<typeof SqsRecordSchema>;
107+
84108
type VpcLatticeEvent = z.infer<typeof VpcLatticeSchema>;
85109

86110
type VpcLatticeEventV2 = z.infer<typeof VpcLatticeV2Schema>;
@@ -98,17 +122,25 @@ export type {
98122
EventBridgeEvent,
99123
KafkaSelfManagedEvent,
100124
KafkaMskEvent,
125+
KafkaRecord,
101126
KinesisDataStreamEvent,
102127
KinesisFireHoseEvent,
128+
KinesisFirehoseRecord,
103129
KinesisFireHoseSqsEvent,
130+
KinesisFirehoseSqsRecord,
104131
LambdaFunctionUrlEvent,
105132
S3Event,
106133
S3EventNotificationEventBridge,
107134
S3SqsEventNotification,
108135
S3ObjectLambdaEvent,
109136
SesEvent,
137+
SesRecord,
110138
SnsEvent,
139+
SnsSqsNotification,
140+
SnsNotification,
141+
SnsRecord,
111142
SqsEvent,
143+
SqsRecord,
112144
VpcLatticeEvent,
113145
VpcLatticeEventV2,
114146
};

packages/parser/tests/unit/schema/kafka.test.ts

+11
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66

77
import {
88
KafkaMskEventSchema,
9+
KafkaRecordSchema,
910
KafkaSelfManagedEventSchema,
1011
} from '../../../src/schemas/';
12+
import type { KafkaSelfManagedEvent } from '../../../src/types';
13+
import type { KafkaRecord } from '../../../src/types/schema';
1114
import { TestEvents } from './utils.js';
1215

1316
describe('Kafka ', () => {
@@ -60,4 +63,12 @@ describe('Kafka ', () => {
6063

6164
expect(parsed.bootstrapServers).toBeUndefined();
6265
});
66+
it('should parse kafka record from kafka event', () => {
67+
const kafkaEventMsk: KafkaSelfManagedEvent =
68+
TestEvents.kafkaEventSelfManaged as KafkaSelfManagedEvent;
69+
const parsedRecord: KafkaRecord = KafkaRecordSchema.parse(
70+
kafkaEventMsk.records['mytopic-0'][0]
71+
);
72+
expect(parsedRecord.topic).toEqual('mytopic');
73+
});
6374
});

packages/parser/tests/unit/schema/kinesis.test.ts

+41
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,22 @@
55
*/
66

77
import {
8+
KinesisDataStreamRecord,
89
KinesisDataStreamSchema,
10+
KinesisFirehoseRecordSchema,
911
KinesisFirehoseSchema,
12+
KinesisFirehoseSqsRecordSchema,
1013
KinesisFirehoseSqsSchema,
1114
} from '../../../src/schemas/';
15+
import type {
16+
KinesisDataStreamEvent,
17+
KinesisFireHoseEvent,
18+
KinesisFireHoseSqsEvent,
19+
} from '../../../src/types';
20+
import type {
21+
KinesisFirehoseRecord,
22+
KinesisFirehoseSqsRecord,
23+
} from '../../../src/types/schema';
1224
import { TestEvents } from './utils.js';
1325

1426
describe('Kinesis ', () => {
@@ -69,4 +81,33 @@ describe('Kinesis ', () => {
6981
const parsed = KinesisFirehoseSqsSchema.parse(kinesisFirehoseSQSEvent);
7082
expect(parsed.records[0].data).toEqual('not a valid json');
7183
});
84+
it('should parse a kinesis record from a kinesis event', () => {
85+
const kinesisStreamEvent: KinesisDataStreamEvent =
86+
TestEvents.kinesisStreamEvent as KinesisDataStreamEvent;
87+
const parsedRecord = KinesisDataStreamRecord.parse(
88+
kinesisStreamEvent.Records[0]
89+
);
90+
91+
expect(parsedRecord.eventName).toEqual('aws:kinesis:record');
92+
});
93+
94+
it('should parse a kinesis firehose record from a kinesis firehose event', () => {
95+
const kinesisFirehoseEvent: KinesisFireHoseEvent =
96+
TestEvents.kinesisFirehoseKinesisEvent as KinesisFireHoseEvent;
97+
const parsedRecord: KinesisFirehoseRecord =
98+
KinesisFirehoseRecordSchema.parse(kinesisFirehoseEvent.records[0]);
99+
100+
expect(parsedRecord.data).toEqual('Hello World');
101+
});
102+
103+
it('should parse a sqs record from a kinesis firehose event', () => {
104+
const kinesisFireHoseSqsEvent: KinesisFireHoseSqsEvent =
105+
TestEvents.kinesisFirehoseSQSEvent as KinesisFireHoseSqsEvent;
106+
const parsed: KinesisFirehoseSqsRecord =
107+
KinesisFirehoseSqsRecordSchema.parse(kinesisFireHoseSqsEvent.records[0]);
108+
109+
expect(parsed.recordId).toEqual(
110+
'49640912821178817833517986466168945147170627572855734274000000'
111+
);
112+
});
72113
});

packages/parser/tests/unit/schema/ses.test.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,21 @@
44
* @group unit/parser/schema/
55
*/
66

7-
import { SesSchema } from '../../../src/schemas/';
7+
import { SesRecordSchema, SesSchema } from '../../../src/schemas/';
8+
import type { SesEvent } from '../../../src/types';
9+
import type { SesRecord } from '../../../src/types/schema';
810
import { TestEvents } from './utils.js';
911

10-
describe('Schema:', () => {
11-
it('SES should parse ses event', () => {
12+
describe('SES', () => {
13+
it('should parse ses event', () => {
1214
const sesEvent = TestEvents.sesEvent;
1315
expect(SesSchema.parse(sesEvent)).toEqual(sesEvent);
1416
});
17+
18+
it('should parse record from ses event', () => {
19+
const sesEvent: SesEvent = TestEvents.sesEvent as SesEvent;
20+
const parsed: SesRecord = SesRecordSchema.parse(sesEvent.Records[0]);
21+
22+
expect(parsed.ses.mail.source).toEqual('[email protected]');
23+
});
1524
});

0 commit comments

Comments
 (0)