Skip to content

Commit 112b4bb

Browse files
am29ddreamorosi
andauthored
chore(parser): fix type inference for result types (#3293)
Co-authored-by: Andrea Amorosi <[email protected]>
1 parent a531b90 commit 112b4bb

18 files changed

+242
-83
lines changed

Diff for: packages/parser/src/envelopes/apigw.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,25 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { APIGatewayProxyEventSchema } from '../schemas/apigw.js';
44
import type { ParsedResult } from '../types/parser.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* API Gateway envelope to extract data within body key
99
*/
1010
export const ApiGatewayEnvelope = {
11+
/**
12+
* This is a discriminator to differentiate whether an envelope returns an array or an object
13+
* @hidden
14+
*/
15+
[envelopeDiscriminator]: 'object' as const,
1116
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
1217
return Envelope.parse(APIGatewayProxyEventSchema.parse(data).body, schema);
1318
},
1419

15-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
20+
safeParse<T extends ZodSchema>(
21+
data: unknown,
22+
schema: T
23+
): ParsedResult<unknown, z.infer<T>> {
1624
const parsedEnvelope = APIGatewayProxyEventSchema.safeParse(data);
1725
if (!parsedEnvelope.success) {
1826
return {

Diff for: packages/parser/src/envelopes/apigwv2.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,28 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { APIGatewayProxyEventV2Schema } from '../schemas/apigwv2.js';
44
import type { ParsedResult } from '../types/index.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* API Gateway V2 envelope to extract data within body key
99
*/
1010
export const ApiGatewayV2Envelope = {
11+
/**
12+
* This is a discriminator to differentiate whether an envelope returns an array or an object
13+
* @hidden
14+
*/
15+
[envelopeDiscriminator]: 'object' as const,
1116
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
1217
return Envelope.parse(
1318
APIGatewayProxyEventV2Schema.parse(data).body,
1419
schema
1520
);
1621
},
1722

18-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
23+
safeParse<T extends ZodSchema>(
24+
data: unknown,
25+
schema: T
26+
): ParsedResult<unknown, z.infer<T>> {
1927
const parsedEnvelope = APIGatewayProxyEventV2Schema.safeParse(data);
2028
if (!parsedEnvelope.success) {
2129
return {

Diff for: packages/parser/src/envelopes/cloudwatch.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { CloudWatchLogsSchema } from '../schemas/index.js';
44
import type { ParsedResult } from '../types/index.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* CloudWatch Envelope to extract a List of log records.
@@ -14,6 +14,11 @@ import { Envelope } from './envelope.js';
1414
* Note: The record will be parsed the same way so if model is str
1515
*/
1616
export const CloudWatchEnvelope = {
17+
/**
18+
* This is a discriminator to differentiate whether an envelope returns an array or an object
19+
* @hidden
20+
*/
21+
[envelopeDiscriminator]: 'array' as const,
1722
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T>[] {
1823
const parsedEnvelope = CloudWatchLogsSchema.parse(data);
1924

@@ -22,7 +27,10 @@ export const CloudWatchEnvelope = {
2227
});
2328
},
2429

25-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
30+
safeParse<T extends ZodSchema>(
31+
data: unknown,
32+
schema: T
33+
): ParsedResult<unknown, z.infer<T>[]> {
2634
const parsedEnvelope = CloudWatchLogsSchema.safeParse(data);
2735

2836
if (!parsedEnvelope.success) {

Diff for: packages/parser/src/envelopes/dynamodb.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ParseError } from '../errors.js';
33
import { DynamoDBStreamSchema } from '../schemas/index.js';
44
import type { DynamoDBStreamEnvelopeResponse } from '../types/envelope.js';
55
import type { ParsedResult, ParsedResultError } from '../types/index.js';
6-
import { Envelope } from './envelope.js';
6+
import { Envelope, envelopeDiscriminator } from './envelope.js';
77

88
/**
99
* DynamoDB Stream Envelope to extract data within NewImage/OldImage
@@ -12,6 +12,11 @@ import { Envelope } from './envelope.js';
1212
* length of the list is the record's amount in the original event.
1313
*/
1414
export const DynamoDBStreamEnvelope = {
15+
/**
16+
* This is a discriminator to differentiate whether an envelope returns an array or an object
17+
* @hidden
18+
*/
19+
[envelopeDiscriminator]: 'array' as const,
1520
parse<T extends ZodSchema>(
1621
data: unknown,
1722
schema: T
@@ -26,7 +31,10 @@ export const DynamoDBStreamEnvelope = {
2631
});
2732
},
2833

29-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
34+
safeParse<T extends ZodSchema>(
35+
data: unknown,
36+
schema: T
37+
): ParsedResult<unknown, DynamoDBStreamEnvelopeResponse<z.infer<T>>[]> {
3038
const parsedEnvelope = DynamoDBStreamSchema.safeParse(data);
3139

3240
if (!parsedEnvelope.success) {

Diff for: packages/parser/src/envelopes/envelope.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import type { ParsedResult } from '../types/parser.js';
44

5-
export const Envelope = {
5+
const Envelope = {
66
/**
77
* Abstract function to parse the content of the envelope using provided schema.
88
* Both inputs are provided as unknown by the user.
@@ -67,3 +67,11 @@ export const Envelope = {
6767
}
6868
},
6969
};
70+
71+
/**
72+
* This is a discriminator to differentiate whether an envelope returns an array or an object
73+
* @hidden
74+
*/
75+
const envelopeDiscriminator = Symbol.for('returnType');
76+
77+
export { Envelope, envelopeDiscriminator };

Diff for: packages/parser/src/envelopes/event-bridge.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { EventBridgeSchema } from '../schemas/index.js';
44
import type { ParsedResult } from '../types/index.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* Envelope for EventBridge schema that extracts and parses data from the `detail` key.
99
*/
1010
export const EventBridgeEnvelope = {
11+
/**
12+
* This is a discriminator to differentiate whether an envelope returns an array or an object
13+
* @hidden
14+
*/
15+
[envelopeDiscriminator]: 'object' as const,
1116
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
1217
return Envelope.parse(EventBridgeSchema.parse(data).detail, schema);
1318
},

Diff for: packages/parser/src/envelopes/kafka.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
KafkaSelfManagedEventSchema,
66
} from '../schemas/kafka.js';
77
import type { KafkaMskEvent, ParsedResult } from '../types/index.js';
8-
import { Envelope } from './envelope.js';
8+
import { Envelope, envelopeDiscriminator } from './envelope.js';
99

1010
/**
1111
* Kafka event envelope to extract data within body key
@@ -17,6 +17,11 @@ import { Envelope } from './envelope.js';
1717
*/
1818

1919
export const KafkaEnvelope = {
20+
/**
21+
* This is a discriminator to differentiate whether an envelope returns an array or an object
22+
* @hidden
23+
*/
24+
[envelopeDiscriminator]: 'array' as const,
2025
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T>[] {
2126
// manually fetch event source to decide between Msk or SelfManaged
2227
const eventSource = (data as KafkaMskEvent).eventSource;
@@ -35,7 +40,10 @@ export const KafkaEnvelope = {
3540
});
3641
},
3742

38-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
43+
safeParse<T extends ZodSchema>(
44+
data: unknown,
45+
schema: T
46+
): ParsedResult<unknown, z.infer<T>[]> {
3947
// manually fetch event source to deside between Msk or SelfManaged
4048
const eventSource = (data as KafkaMskEvent).eventSource;
4149

Diff for: packages/parser/src/envelopes/kinesis-firehose.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { KinesisFirehoseSchema } from '../schemas/index.js';
44
import type { ParsedResult } from '../types/index.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* Kinesis Firehose Envelope to extract array of Records
@@ -17,6 +17,11 @@ import { Envelope } from './envelope.js';
1717
* https://docs.aws.amazon.com/lambda/latest/dg/services-kinesisfirehose.html
1818
*/
1919
export const KinesisFirehoseEnvelope = {
20+
/**
21+
* This is a discriminator to differentiate whether an envelope returns an array or an object
22+
* @hidden
23+
*/
24+
[envelopeDiscriminator]: 'array' as const,
2025
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T>[] {
2126
const parsedEnvelope = KinesisFirehoseSchema.parse(data);
2227

@@ -25,7 +30,10 @@ export const KinesisFirehoseEnvelope = {
2530
});
2631
},
2732

28-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
33+
safeParse<T extends ZodSchema>(
34+
data: unknown,
35+
schema: T
36+
): ParsedResult<unknown, z.infer<T>[]> {
2937
const parsedEnvelope = KinesisFirehoseSchema.safeParse(data);
3038

3139
if (!parsedEnvelope.success) {

Diff for: packages/parser/src/envelopes/kinesis.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { KinesisDataStreamSchema } from '../schemas/kinesis.js';
44
import type { ParsedResult } from '../types/index.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* Kinesis Data Stream Envelope to extract array of Records
@@ -15,6 +15,11 @@ import { Envelope } from './envelope.js';
1515
* all items in the list will be parsed as str and not as JSON (and vice versa)
1616
*/
1717
export const KinesisEnvelope = {
18+
/**
19+
* This is a discriminator to differentiate whether an envelope returns an array or an object
20+
* @hidden
21+
*/
22+
[envelopeDiscriminator]: 'array' as const,
1823
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T>[] {
1924
const parsedEnvelope = KinesisDataStreamSchema.parse(data);
2025

@@ -23,7 +28,10 @@ export const KinesisEnvelope = {
2328
});
2429
},
2530

26-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
31+
safeParse<T extends ZodSchema>(
32+
data: unknown,
33+
schema: T
34+
): ParsedResult<unknown, z.infer<T>[]> {
2735
const parsedEnvelope = KinesisDataStreamSchema.safeParse(data);
2836
if (!parsedEnvelope.success) {
2937
return {

Diff for: packages/parser/src/envelopes/lambda.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { LambdaFunctionUrlSchema } from '../schemas/index.js';
44
import type { ParsedResult } from '../types/index.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* Lambda function URL envelope to extract data within body key
99
*/
1010
export const LambdaFunctionUrlEnvelope = {
11+
/**
12+
* This is a discriminator to differentiate whether an envelope returns an array or an object
13+
* @hidden
14+
*/
15+
[envelopeDiscriminator]: 'object' as const,
1116
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
1217
const parsedEnvelope = LambdaFunctionUrlSchema.parse(data);
1318

Diff for: packages/parser/src/envelopes/sns.ts

+20-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ParseError } from '../errors.js';
33
import { SnsSchema, SnsSqsNotificationSchema } from '../schemas/sns.js';
44
import { SqsSchema } from '../schemas/sqs.js';
55
import type { ParsedResult } from '../types/index.js';
6-
import { Envelope } from './envelope.js';
6+
import { Envelope, envelopeDiscriminator } from './envelope.js';
77

88
/**
99
* SNS Envelope to extract array of Records
@@ -15,6 +15,11 @@ import { Envelope } from './envelope.js';
1515
* all items in the list will be parsed as str and npt as JSON (and vice versa)
1616
*/
1717
export const SnsEnvelope = {
18+
/**
19+
* This is a discriminator to differentiate whether an envelope returns an array or an object
20+
* @hidden
21+
*/
22+
[envelopeDiscriminator]: 'array' as const,
1823
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T>[] {
1924
const parsedEnvelope = SnsSchema.parse(data);
2025

@@ -23,7 +28,10 @@ export const SnsEnvelope = {
2328
});
2429
},
2530

26-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
31+
safeParse<T extends ZodSchema>(
32+
data: unknown,
33+
schema: T
34+
): ParsedResult<unknown, z.infer<T>[]> {
2735
const parsedEnvelope = SnsSchema.safeParse(data);
2836

2937
if (!parsedEnvelope.success) {
@@ -70,7 +78,12 @@ export const SnsEnvelope = {
7078
*
7179
*/
7280
export const SnsSqsEnvelope = {
73-
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
81+
/**
82+
* This is a discriminator to differentiate whether an envelope returns an array or an object
83+
* @hidden
84+
*/
85+
[envelopeDiscriminator]: 'array' as const,
86+
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T>[] {
7487
const parsedEnvelope = SqsSchema.parse(data);
7588

7689
return parsedEnvelope.Records.map((record) => {
@@ -82,7 +95,10 @@ export const SnsSqsEnvelope = {
8295
});
8396
},
8497

85-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
98+
safeParse<T extends ZodSchema>(
99+
data: unknown,
100+
schema: T
101+
): ParsedResult<unknown, z.infer<T>[]> {
86102
const parsedEnvelope = SqsSchema.safeParse(data);
87103
if (!parsedEnvelope.success) {
88104
return {

Diff for: packages/parser/src/envelopes/sqs.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { SqsSchema } from '../schemas/sqs.js';
44
import type { ParsedResult } from '../types/index.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* SQS Envelope to extract array of Records
@@ -14,6 +14,11 @@ import { Envelope } from './envelope.js';
1414
* all items in the list will be parsed as str and npt as JSON (and vice versa)
1515
*/
1616
export const SqsEnvelope = {
17+
/**
18+
* This is a discriminator to differentiate whether an envelope returns an array or an object
19+
* @hidden
20+
*/
21+
[envelopeDiscriminator]: 'array' as const,
1722
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T>[] {
1823
const parsedEnvelope = SqsSchema.parse(data);
1924

@@ -22,7 +27,10 @@ export const SqsEnvelope = {
2227
});
2328
},
2429

25-
safeParse<T extends ZodSchema>(data: unknown, schema: T): ParsedResult {
30+
safeParse<T extends ZodSchema>(
31+
data: unknown,
32+
schema: T
33+
): ParsedResult<unknown, z.infer<T>[]> {
2634
const parsedEnvelope = SqsSchema.safeParse(data);
2735
if (!parsedEnvelope.success) {
2836
return {

Diff for: packages/parser/src/envelopes/vpc-lattice.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@ import type { ZodSchema, z } from 'zod';
22
import { ParseError } from '../errors.js';
33
import { VpcLatticeSchema } from '../schemas/index.js';
44
import type { ParsedResult } from '../types/index.js';
5-
import { Envelope } from './envelope.js';
5+
import { Envelope, envelopeDiscriminator } from './envelope.js';
66

77
/**
88
* Amazon VPC Lattice envelope to extract data within body key
99
*/
1010

1111
export const VpcLatticeEnvelope = {
12+
/**
13+
* This is a discriminator to differentiate whether an envelope returns an array or an object
14+
* @hidden
15+
*/
16+
[envelopeDiscriminator]: 'object' as const,
1217
parse<T extends ZodSchema>(data: unknown, schema: T): z.infer<T> {
1318
const parsedEnvelope = VpcLatticeSchema.parse(data);
1419

0 commit comments

Comments
 (0)