Skip to content

Commit 6455c29

Browse files
author
hywax
committed
refactor: validators are moved to a separate files
1 parent b45aa3b commit 6455c29

4 files changed

Lines changed: 50 additions & 48 deletions

File tree

server/utils/config.ts

Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import crypto from 'node:crypto'
22
import yaml from 'yaml'
33
import defu from 'defu'
4-
import { ZodError, z } from 'zod'
4+
import { ZodError } from 'zod'
55
import type { CompleteConfig, Service, Tag } from '~/types'
6+
import { configSchema } from '~/server/validations'
67

78
type DraftService = Omit<Service, 'id'>
89

@@ -39,52 +40,6 @@ export function getDefaultConfig(): CompleteConfig {
3940
}
4041
}
4142

42-
export function validateConfigSchema(config: any) {
43-
const status = z.object({
44-
enabled: z.boolean().optional(),
45-
interval: z.number().optional(),
46-
})
47-
48-
const icon = z.object({
49-
url: z.string().optional(),
50-
name: z.string().optional(),
51-
wrap: z.boolean().optional(),
52-
background: z.string().optional(),
53-
color: z.string().optional(),
54-
})
55-
56-
const tag = z.object({
57-
name: z.string(),
58-
color: z.string(),
59-
})
60-
61-
const service = z.object({
62-
title: z.string().nullish().optional(),
63-
description: z.string().nullish().optional(),
64-
link: z.string().nullish().optional(),
65-
target: z.string().optional(),
66-
icon: icon.optional(),
67-
status: status.optional(),
68-
type: z.string().optional(),
69-
options: z.record(z.any()).optional(),
70-
secrets: z.record(z.any()).optional(),
71-
})
72-
73-
const schema = z.object({
74-
title: z.string().optional(),
75-
lang: z.string().optional(),
76-
theme: z.string().optional(),
77-
checkUpdates: z.boolean().optional(),
78-
tags: z.array(tag).optional(),
79-
services: z.union([
80-
z.array(service),
81-
z.record(z.array(service)),
82-
]),
83-
})
84-
85-
return schema.parse(config)
86-
}
87-
8843
function createTagMap(tags: Tag[]): TagMap {
8944
return tags.reduce((acc, tag) => {
9045
acc.set(tag.name, tag)
@@ -108,7 +63,7 @@ export async function loadLocalConfig(): Promise<CompleteConfig> {
10863
const services: CompleteConfig['services'] = []
10964
const tags: TagMap = createTagMap(config.tags || [])
11065

111-
validateConfigSchema(config)
66+
configSchema.parse(config)
11267

11368
if (Array.isArray(config.services)) {
11469
services.push({

server/validations/config.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { z } from 'zod'
2+
import { serviceSchema, tagSchema } from './service'
3+
4+
export const configSchema = z.object({
5+
title: z.string().optional(),
6+
lang: z.string().optional(),
7+
theme: z.string().optional(),
8+
checkUpdates: z.boolean().optional(),
9+
tags: z.array(tagSchema).optional(),
10+
services: z.union([
11+
z.array(serviceSchema),
12+
z.record(z.array(serviceSchema)),
13+
]),
14+
})

server/validations/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './config'
2+
export * from './service'

server/validations/service.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { z } from 'zod'
2+
3+
export const statusSchema = z.object({
4+
enabled: z.boolean().optional(),
5+
interval: z.number().optional(),
6+
})
7+
8+
export const iconSchema = z.object({
9+
url: z.string().optional(),
10+
name: z.string().optional(),
11+
wrap: z.boolean().optional(),
12+
background: z.string().optional(),
13+
color: z.string().optional(),
14+
})
15+
16+
export const tagSchema = z.object({
17+
name: z.string(),
18+
color: z.string(),
19+
})
20+
21+
export const serviceSchema = z.object({
22+
title: z.string().nullish().optional(),
23+
description: z.string().nullish().optional(),
24+
link: z.string().nullish().optional(),
25+
target: z.string().optional(),
26+
icon: iconSchema.optional(),
27+
status: statusSchema.optional(),
28+
type: z.string().optional(),
29+
options: z.record(z.any()).optional(),
30+
secrets: z.record(z.any()).optional(),
31+
})

0 commit comments

Comments
 (0)