Copy
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "ConfigurationFile",
"type": "object",
"properties": {
"app": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"environment": {
"type": "string"
}
},
"required": [
"name",
"version",
"environment"
],
"additionalProperties": false
},
"server": {
"type": "object",
"properties": {
"host": {
"type": "string"
},
"port": {
"type": "integer"
},
"gracefulShutdownSeconds": {
"type": "integer"
}
},
"required": [
"host",
"port",
"gracefulShutdownSeconds"
],
"additionalProperties": false
},
"database": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"poolMin": {
"type": "integer"
},
"poolMax": {
"type": "integer"
},
"sslMode": {
"type": "string"
}
},
"required": [
"url",
"poolMin",
"poolMax",
"sslMode"
],
"additionalProperties": false
},
"cache": {
"type": "object",
"properties": {
"driver": {
"type": "string"
},
"host": {
"type": "string"
},
"port": {
"type": "integer"
},
"ttlSeconds": {
"type": "integer"
}
},
"required": [
"driver",
"host",
"port",
"ttlSeconds"
],
"additionalProperties": false
},
"rateLimits": {
"type": "object",
"properties": {
"perIpPerMinute": {
"type": "integer"
},
"perUserPerMinute": {
"type": "integer"
},
"burst": {
"type": "integer"
}
},
"required": [
"perIpPerMinute",
"perUserPerMinute",
"burst"
],
"additionalProperties": false
},
"featureFlags": {
"type": "object",
"properties": {
"newOnboarding": {
"type": "boolean"
},
"betaSearch": {
"type": "boolean"
},
"darkMode": {
"type": "string"
}
},
"required": [
"newOnboarding",
"betaSearch",
"darkMode"
],
"additionalProperties": false
},
"logging": {
"type": "object",
"properties": {
"level": {
"type": "string"
},
"format": {
"type": "string"
},
"sampleRate": {
"type": "number"
}
},
"required": [
"level",
"format",
"sampleRate"
],
"additionalProperties": false
},
"integrations": {
"type": "object",
"properties": {
"search": {
"type": "object",
"properties": {
"provider": {
"type": "string"
},
"host": {
"type": "string"
}
},
"required": [
"provider",
"host"
],
"additionalProperties": false
},
"mailer": {
"type": "object",
"properties": {
"provider": {
"type": "string"
}
},
"required": [
"provider"
],
"additionalProperties": false
}
},
"required": [
"search",
"mailer"
],
"additionalProperties": false
}
},
"required": [
"app",
"server",
"database",
"cache",
"rateLimits",
"featureFlags",
"logging",
"integrations"
],
"additionalProperties": false
}
Copy
import { z } from 'zod';
export const ConfigurationFileSchema = z.object({
app: z.object({
name: z.string(),
version: z.string(),
environment: z.string()
}),
server: z.object({
host: z.string(),
port: z.number(),
gracefulShutdownSeconds: z.number()
}),
database: z.object({
url: z.string(),
poolMin: z.number(),
poolMax: z.number(),
sslMode: z.string()
}),
cache: z.object({
driver: z.string(),
host: z.string(),
port: z.number(),
ttlSeconds: z.number()
}),
rateLimits: z.object({
perIpPerMinute: z.number(),
perUserPerMinute: z.number(),
burst: z.number()
}),
featureFlags: z.object({
newOnboarding: z.boolean(),
betaSearch: z.boolean(),
darkMode: z.string()
}),
logging: z.object({
level: z.string(),
format: z.string(),
sampleRate: z.number()
}),
integrations: z.object({
search: z.object({
provider: z.string(),
host: z.string()
}),
mailer: z.object({
provider: z.string()
})
})
});
export type ConfigurationFile = z.infer<typeof ConfigurationFileSchema>;