Skip to content

Commit dbc21c3

Browse files
authored
✨ Add Date (#37)
1 parent 39e5c07 commit dbc21c3

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

.env

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,7 @@ EXAMPLE_NO_URL=
2626
EXAMPLE_UUID=eb4cd2db-7250-40b2-948f-436b628ee8e2
2727
EXAMPLE_INVALID_UUID=EXAMPLE_INVALID_UUID
2828
EXAMPLE_NO_UUID=
29+
30+
EXAMPLE_DATE=2025-05-28T00:50:58.816Z
31+
EXAMPLE_INVALID_DATE=EXAMPLE_INVALID_DATE
32+
EXAMPLE_NO_DATE=

src/env.test.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { beforeAll, describe, test } from "vitest"
22
import {
33
envBool,
4+
envDate,
45
envFloat,
56
envInt,
67
envString,
78
envStrings,
89
envUrl,
910
envUuid,
1011
maybeEnvBool,
12+
maybeEnvDate,
1113
maybeEnvFloat,
1214
maybeEnvInt,
1315
maybeEnvString,
@@ -200,6 +202,34 @@ describe("envUuid", () => {
200202
})
201203
})
202204

205+
describe("envDate", () => {
206+
const date = new Date("2025-05-28T00:50:58.816Z")
207+
208+
test("valid", ({ expect }) => {
209+
const actual = envDate("EXAMPLE_DATE")
210+
expect(actual).toBeInstanceOf(Date)
211+
expect(actual.toISOString()).toBe(date.toISOString())
212+
})
213+
214+
test("fallback", ({ expect }) => {
215+
const actual = envDate("EXAMPLE_NO_DATE", date)
216+
expect(actual).toBeInstanceOf(Date)
217+
expect(actual.toISOString()).toBe(date.toISOString())
218+
})
219+
220+
test("invalid", ({ expect }) => {
221+
expect(() => envDate("EXAMPLE_INVALID_DATE")).toThrow(
222+
"$EXAMPLE_INVALID_DATE is not a valid Date: EXAMPLE_INVALID_DATE",
223+
)
224+
})
225+
226+
test("empty", ({ expect }) => {
227+
expect(() => envDate("EXAMPLE_NO_DATE")).toThrow(
228+
"$EXAMPLE_NO_DATE is missing",
229+
)
230+
})
231+
})
232+
203233
describe("maybeEnvBool", () => {
204234
test("valid", ({ expect }) => {
205235
const actual = maybeEnvBool("EXAMPLE_BOOL")
@@ -326,3 +356,24 @@ describe("maybeEnvUuid", () => {
326356
)
327357
})
328358
})
359+
360+
describe("maybeEnvDate", () => {
361+
const date = new Date("2025-05-28T00:50:58.816Z")
362+
363+
test("valid", ({ expect }) => {
364+
const actual = maybeEnvDate("EXAMPLE_DATE")
365+
expect(actual).toBeInstanceOf(Date)
366+
expect(actual?.toISOString()).toBe(date.toISOString())
367+
})
368+
369+
test("empty", ({ expect }) => {
370+
const actual = maybeEnvDate("EXAMPLE_NO_DATE")
371+
expect(actual).toBe(undefined)
372+
})
373+
374+
test("invalid", ({ expect }) => {
375+
expect(() => maybeEnvDate("EXAMPLE_INVALID_DATE")).toThrow(
376+
"$EXAMPLE_INVALID_DATE is not a valid Date: EXAMPLE_INVALID_DATE",
377+
)
378+
})
379+
})

src/env.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,24 @@ export function envUuid(key: string, fallback?: UUID): UUID {
111111
return str
112112
}
113113

114+
/**
115+
* Obtains an environment variable as a Date.
116+
*
117+
* @example
118+
*
119+
* export const START_DATE = envDate("START_DATE")
120+
*/
121+
export function envDate(key: string, fallback?: Date): Date {
122+
const str = process.env[key]?.trim() || fallback?.toISOString().trim()
123+
if (str === undefined) throw new Error(`$${key} is missing`)
124+
125+
const date = new Date(str)
126+
if (isNaN(date.getTime()))
127+
throw new Error(`$${key} is not a valid Date: ${str}`)
128+
129+
return date
130+
}
131+
114132
/**
115133
* Obtains an optional environment variable as a boolean.
116134
*
@@ -218,3 +236,21 @@ export function maybeEnvUuid(key: string): UUID | undefined {
218236
if (!isUuid(str)) throw new Error(`$${key} is not a UUID: ${str}`)
219237
return str
220238
}
239+
240+
/**
241+
* Obtains an optional environment variable as a Date.
242+
*
243+
* @example
244+
*
245+
* export const END_DATE = maybeEnvDate("END_DATE")
246+
*/
247+
export function maybeEnvDate(key: string): Date | undefined {
248+
const str = process.env[key]?.trim()
249+
if (!str) return undefined
250+
251+
const date = new Date(str)
252+
if (isNaN(date.getTime()))
253+
throw new Error(`$${key} is not a valid Date: ${str}`)
254+
255+
return date
256+
}

0 commit comments

Comments
 (0)