Skip to content

Commit c8c8b68

Browse files
committed
refactored from class to function envelopes
1 parent a98ea44 commit c8c8b68

29 files changed

+218
-331
lines changed

packages/parser/src/envelopes/Envelope.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.

packages/parser/src/envelopes/Envelopes.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
1-
import { Envelope } from './Envelope.js';
1+
import { parse } from './envelope.js';
22
import { z, ZodSchema } from 'zod';
33
import { APIGatewayProxyEventSchema } from '../schemas/apigw.js';
4-
import { type ApiGatewayProxyEvent } from '../types/schema.js';
54

65
/**
7-
* API Gateway envelope to extract data within body key"
6+
* API Gateway envelope to extract data within body key
87
*/
9-
export class ApiGatewayEnvelope extends Envelope {
10-
public constructor() {
11-
super();
8+
export const apiGatewayEnvelope = <T extends ZodSchema>(
9+
data: unknown,
10+
schema: T
11+
): z.infer<T> => {
12+
const parsedEnvelope = APIGatewayProxyEventSchema.parse(data);
13+
if (!parsedEnvelope.body) {
14+
throw new Error('Body field of API Gateway event is undefined');
1215
}
1316

14-
public parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
15-
const parsedEnvelope: ApiGatewayProxyEvent =
16-
APIGatewayProxyEventSchema.parse(data);
17-
if (parsedEnvelope.body) {
18-
return this._parse(parsedEnvelope.body, schema);
19-
} else {
20-
throw new Error('Body field of API Gateway event is undefined');
21-
}
22-
}
23-
}
17+
return parse(parsedEnvelope.body, schema);
18+
};
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
1-
import { Envelope } from './Envelope.js';
1+
import { parse } from './envelope.js';
22
import { z, ZodSchema } from 'zod';
33
import { APIGatewayProxyEventV2Schema } from '../schemas/apigwv2.js';
44

55
/**
66
* API Gateway V2 envelope to extract data within body key
77
*/
8-
export class ApiGatwayV2Envelope extends Envelope {
9-
public constructor() {
10-
super();
8+
export const apiGatewayV2Envelope = <T extends ZodSchema>(
9+
data: unknown,
10+
schema: T
11+
): z.infer<T> => {
12+
const parsedEnvelope = APIGatewayProxyEventV2Schema.parse(data);
13+
if (!parsedEnvelope.body) {
14+
throw new Error('Body field of API Gateway event is undefined');
1115
}
1216

13-
public parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
14-
const parsedEnvelope = APIGatewayProxyEventV2Schema.parse(data);
15-
if (parsedEnvelope.body) {
16-
return this._parse(parsedEnvelope.body, schema);
17-
} else {
18-
throw new Error('Body field of API Gateway V2 event is undefined');
19-
}
20-
}
21-
}
17+
return parse(parsedEnvelope.body, schema);
18+
};
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Envelope } from './Envelope.js';
1+
import { parse } from './envelope.js';
22
import { z, ZodSchema } from 'zod';
33
import { CloudWatchLogsSchema } from '../schemas/cloudwatch.js';
44

@@ -11,16 +11,13 @@ import { CloudWatchLogsSchema } from '../schemas/cloudwatch.js';
1111
*
1212
* Note: The record will be parsed the same way so if model is str
1313
*/
14-
export class CloudWatchEnvelope extends Envelope {
15-
public constructor() {
16-
super();
17-
}
14+
export const cloudWatchEnvelope = <T extends ZodSchema>(
15+
data: unknown,
16+
schema: T
17+
): z.infer<T> => {
18+
const parsedEnvelope = CloudWatchLogsSchema.parse(data);
1819

19-
public parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T>[] {
20-
const parsedEnvelope = CloudWatchLogsSchema.parse(data);
21-
22-
return parsedEnvelope.awslogs.data.logEvents.map((record) => {
23-
return this._parse(record.message, schema);
24-
});
25-
}
26-
}
20+
return parsedEnvelope.awslogs.data.logEvents.map((record) => {
21+
return parse(record.message, schema);
22+
});
23+
};
Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Envelope } from './Envelope.js';
1+
import { parse } from './envelope.js';
22
import { z, ZodSchema } from 'zod';
33
import { DynamoDBStreamSchema } from '../schemas/dynamodb.js';
44

@@ -13,22 +13,16 @@ type DynamoDBStreamEnvelopeResponse<T extends ZodSchema> = {
1313
* Note: Values are the parsed models. Images' values can also be None, and
1414
* length of the list is the record's amount in the original event.
1515
*/
16-
export class DynamoDBStreamEnvelope extends Envelope {
17-
public constructor() {
18-
super();
19-
}
16+
export const dynamoDDStreamEnvelope = <T extends ZodSchema>(
17+
data: unknown,
18+
schema: T
19+
): DynamoDBStreamEnvelopeResponse<T>[] => {
20+
const parsedEnvelope = DynamoDBStreamSchema.parse(data);
2021

21-
public parse<T extends ZodSchema>(
22-
data: unknown,
23-
schema: T
24-
): DynamoDBStreamEnvelopeResponse<T>[] {
25-
const parsedEnvelope = DynamoDBStreamSchema.parse(data);
26-
27-
return parsedEnvelope.Records.map((record) => {
28-
return {
29-
NewImage: this._parse(record.dynamodb.NewImage, schema),
30-
OldImage: this._parse(record.dynamodb.OldImage, schema),
31-
};
32-
});
33-
}
34-
}
22+
return parsedEnvelope.Records.map((record) => {
23+
return {
24+
NewImage: parse(record.dynamodb.NewImage, schema),
25+
OldImage: parse(record.dynamodb.OldImage, schema),
26+
};
27+
});
28+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { z, ZodSchema } from 'zod';
2+
3+
/**
4+
* Abstract function to parse the content of the envelope using provided schema.
5+
* Both inputs are provided as unknown by the user.
6+
* We expect the data to be either string that can be parsed to json or object.
7+
* @internal
8+
* @param data data to parse
9+
* @param schema schema
10+
*/
11+
export const parse = <T extends ZodSchema>(
12+
data: unknown,
13+
schema: T
14+
): z.infer<T>[] => {
15+
if (typeof data === 'string') {
16+
return schema.parse(JSON.parse(data));
17+
} else if (typeof data === 'object') {
18+
return schema.parse(data);
19+
} else
20+
throw new Error(
21+
`Invalid data type for envelope. Expected string or object, got ${typeof data}`
22+
);
23+
};
Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
1-
import { Envelope } from './Envelope.js';
1+
import { parse } from './envelope.js';
22
import { z, ZodSchema } from 'zod';
33
import { EventBridgeSchema } from '../schemas/eventbridge.js';
44

55
/**
66
* Envelope for EventBridge schema that extracts and parses data from the `detail` key.
77
*/
8-
export class EventBridgeEnvelope extends Envelope {
9-
public constructor() {
10-
super();
11-
}
12-
13-
public parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
14-
const parsedEnvelope = EventBridgeSchema.parse(data);
15-
16-
return this._parse(parsedEnvelope.detail, schema);
17-
}
18-
}
8+
export const eventBridgeEnvelope = <T extends ZodSchema>(
9+
data: unknown,
10+
schema: T
11+
): z.infer<T> => {
12+
return parse(EventBridgeSchema.parse(data).detail, schema);
13+
};
Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { z, ZodSchema } from 'zod';
2-
import { Envelope } from './Envelope.js';
2+
import { parse } from './envelope.js';
33
import {
44
KafkaMskEventSchema,
55
KafkaSelfManagedEventSchema,
@@ -14,29 +14,26 @@ import { type KafkaRecord } from '../types/schema.js';
1414
* Note: Records will be parsed the same way so if model is str,
1515
* all items in the list will be parsed as str and not as JSON (and vice versa)
1616
*/
17-
export class KafkaEnvelope extends Envelope {
18-
public constructor() {
19-
super();
20-
}
17+
export const kafkaEnvelope = <T extends ZodSchema>(
18+
data: unknown,
19+
schema: T
20+
): z.infer<T> => {
21+
// manually fetch event source to deside between Msk or SelfManaged
2122

22-
public parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
23-
// manually fetch event source to deside between Msk or SelfManaged
23+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
24+
// @ts-ignore
25+
const eventSource = data['eventSource'];
2426

25-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
26-
// @ts-ignore
27-
const eventSource = data['eventSource'];
27+
const parsedEnvelope:
28+
| z.infer<typeof KafkaMskEventSchema>
29+
| z.infer<typeof KafkaSelfManagedEventSchema> =
30+
eventSource === 'aws:kafka'
31+
? KafkaMskEventSchema.parse(data)
32+
: KafkaSelfManagedEventSchema.parse(data);
2833

29-
const parsedEnvelope:
30-
| z.infer<typeof KafkaMskEventSchema>
31-
| z.infer<typeof KafkaSelfManagedEventSchema> =
32-
eventSource === 'aws:kafka'
33-
? KafkaMskEventSchema.parse(data)
34-
: KafkaSelfManagedEventSchema.parse(data);
35-
36-
return Object.values(parsedEnvelope.records).map((topicRecord) => {
37-
return topicRecord.map((record: KafkaRecord) => {
38-
return this._parse(record.value, schema);
39-
});
34+
return Object.values(parsedEnvelope.records).map((topicRecord) => {
35+
return topicRecord.map((record: KafkaRecord) => {
36+
return parse(record.value, schema);
4037
});
41-
}
42-
}
38+
});
39+
};
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Envelope } from './Envelope.js';
1+
import { parse } from './envelope.js';
22
import { z, ZodSchema } from 'zod';
33
import { KinesisFirehoseSchema } from '../schemas/kinesis-firehose.js';
44

@@ -14,16 +14,13 @@ import { KinesisFirehoseSchema } from '../schemas/kinesis-firehose.js';
1414
*
1515
* https://docs.aws.amazon.com/lambda/latest/dg/services-kinesisfirehose.html
1616
*/
17-
export class KinesisFirehoseEnvelope extends Envelope {
18-
public constructor() {
19-
super();
20-
}
17+
export const kinesisFirehoseEnvelope = <T extends ZodSchema>(
18+
data: unknown,
19+
schema: T
20+
): z.infer<T> => {
21+
const parsedEnvelope = KinesisFirehoseSchema.parse(data);
2122

22-
public parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
23-
const parsedEnvelope = KinesisFirehoseSchema.parse(data);
24-
25-
return parsedEnvelope.records.map((record) => {
26-
return this._parse(record.data, schema);
27-
});
28-
}
29-
}
23+
return parsedEnvelope.records.map((record) => {
24+
return parse(record.data, schema);
25+
});
26+
};
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Envelope } from './Envelope.js';
1+
import { parse } from './envelope.js';
22
import { z, ZodSchema } from 'zod';
33
import { KinesisDataStreamSchema } from '../schemas/kinesis.js';
44

@@ -12,16 +12,13 @@ import { KinesisDataStreamSchema } from '../schemas/kinesis.js';
1212
* Note: Records will be parsed the same way so if model is str,
1313
* all items in the list will be parsed as str and not as JSON (and vice versa)
1414
*/
15-
export class KinesisEnvelope extends Envelope {
16-
public constructor() {
17-
super();
18-
}
15+
export const kinesisEnvelope = <T extends ZodSchema>(
16+
data: unknown,
17+
schema: T
18+
): z.infer<T> => {
19+
const parsedEnvelope = KinesisDataStreamSchema.parse(data);
1920

20-
public parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
21-
const parsedEnvelope = KinesisDataStreamSchema.parse(data);
22-
23-
return parsedEnvelope.Records.map((record) => {
24-
return this._parse(record.kinesis.data, schema);
25-
});
26-
}
27-
}
21+
return parsedEnvelope.Records.map((record) => {
22+
return parse(record.kinesis.data, schema);
23+
});
24+
};

0 commit comments

Comments
 (0)