vite-plugin-validate-env icon indicating copy to clipboard operation
vite-plugin-validate-env copied to clipboard

Support discriminatedUnions

Open HaNdTriX opened this issue 6 months ago • 0 comments

First of all: Thank you for this awesome package!


Currently vite-plugin-validate-env only takes a JSON Object as schema instead of an schema Object Type. This makes it hard to define discriminatedUnions since schemas can not be concatenated.

// env.ts
import { defineConfig } from '@julr/vite-plugin-validate-env'
import { z } from 'zod'

export default defineConfig({
  validator: "standard",
-  schema: {
-    VITE_MY_VAR: z.enum(['foo', 'bar']),
-  },
+  schema: z.object({
+    VITE_MY_VAR: z.enum(['foo', 'bar']),
+  }),
})

This tiny change could open the door for more complex dependent env validations:

Example

// env.ts
import { defineConfig } from '@julr/vite-plugin-validate-env'
import { z } from 'zod'

export default defineConfig({
  validator: 'standard',
  schema: z
    .object({
      VITE_MY_VAR: z.enum(['foo', 'bar'])
    })
    .and(
      z.discriminatedUnion('VITE_MY_VAR', [
        z.object({
          VITE_MY_VAR: z.literal('foo'),
          VITE_FOO_VAR: z.literal('foooooo')
        }),
        z.object({
          VITE_MY_VAR: z.literal('bar'),
          VITE_BAR_VAR: z.literal('baaaar')
        })
      ])
    )
})

HaNdTriX avatar Jul 31 '25 15:07 HaNdTriX