From b4e66f78bf6515b045c42002f04c4e9d47edce2c Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Fri, 6 Sep 2024 09:27:31 -0400 Subject: [PATCH 1/2] Prevent Zod errors from crashing build --- .changeset/famous-glasses-clean.md | 7 +++++++ packages/starlight/utils/error-map.ts | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/famous-glasses-clean.md diff --git a/.changeset/famous-glasses-clean.md b/.changeset/famous-glasses-clean.md new file mode 100644 index 00000000000..b5749f54a24 --- /dev/null +++ b/.changeset/famous-glasses-clean.md @@ -0,0 +1,7 @@ +--- +'@astrojs/starlight': patch +--- + +Safely handle Zod errors + +Prevents bugs where errors without the `.received` props would through and cause builds to fail unnecessarily. diff --git a/packages/starlight/utils/error-map.ts b/packages/starlight/utils/error-map.ts index 667a91af365..b00ed45b3fd 100644 --- a/packages/starlight/utils/error-map.ts +++ b/packages/starlight/utils/error-map.ts @@ -143,7 +143,7 @@ const errorMap: z.ZodErrorMap = (baseError, ctx) => { }; const getTypeOrLiteralMsg = (error: TypeOrLiteralErrByPathEntry): string => { - if (error.received === 'undefined') return 'Required'; + if (typeof error.received === 'undefined') return 'Required'; const expectedDeduped = new Set(error.expected); switch (error.code) { case 'invalid_type': From 1da8a34ac0fd5d4fe057a3a901da375d652aaf0a Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Fri, 6 Sep 2024 09:34:14 -0400 Subject: [PATCH 2/2] Handle either case --- packages/starlight/utils/error-map.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/starlight/utils/error-map.ts b/packages/starlight/utils/error-map.ts index b00ed45b3fd..9c7475a096e 100644 --- a/packages/starlight/utils/error-map.ts +++ b/packages/starlight/utils/error-map.ts @@ -143,7 +143,8 @@ const errorMap: z.ZodErrorMap = (baseError, ctx) => { }; const getTypeOrLiteralMsg = (error: TypeOrLiteralErrByPathEntry): string => { - if (typeof error.received === 'undefined') return 'Required'; + // received could be `undefined` or the string `'undefined'` + if (typeof error.received === 'undefined' || error.received === 'undefined') return 'Required'; const expectedDeduped = new Set(error.expected); switch (error.code) { case 'invalid_type':