Add Zod schemas for project config and secrets types

This commit is contained in:
CPTProgrammer 2026-07-06 21:22:04 +08:00
parent 5dbca049b6
commit cfce62195d
No known key found for this signature in database
2 changed files with 123 additions and 1 deletions

122
src/types/config.ts Normal file
View File

@ -0,0 +1,122 @@
import { z } from "zod";
// region ModrinthDependency — config 中的 Modrinth 依赖项(比 VersionDependency 简化)
export const ModrinthDependencySchema = z.object({
/** 依赖类型 */
dependency_type: z.enum([
"required",
"optional",
"incompatible",
"embedded",
]),
/** 依赖的项目 ID8 位 base62 */
project_id: z.string().min(1),
});
export type ModrinthDependency = z.infer<typeof ModrinthDependencySchema>;
// endregion
// region ModrinthConfig — config 中 modrinth 字段
export const ModrinthConfigSchema = z.object({
/** Modrinth 项目 ID8 位 base62 */
project_id: z.string().min(1),
/** 版本名称模板,支持 ${version}、${mc_version_range} 等占位符 */
version_name: z.string().min(1),
/** 版本号模板,支持 ${version}、${mc_version} 等占位符 */
version: z.string().min(1),
/** 加载器列表 */
loaders: z.array(z.string().min(1)),
/** 运行环境 */
environment: z.enum([
"unknown",
"client_only",
"server_only",
"dedicated_server_only",
"client_and_server",
"server_only_client_optional",
"client_only_server_optional",
"client_or_server_prefers_both",
"client_or_server",
"singleplayer_only",
]),
/** 依赖列表,无依赖填 [] */
dependencies: z.array(ModrinthDependencySchema),
});
export type ModrinthConfig = z.infer<typeof ModrinthConfigSchema>;
// endregion
// region CurseForgeRelationProject — config 中 CurseForge 关联项目
export const CurseForgeRelationProjectSchema = z.object({
/** 关联项目的 slug */
slug: z.string().min(1),
/** 关联项目的 ID精确匹配可选 */
projectID: z.string().optional(),
/** 关联类型 */
type: z.enum([
"embeddedLibrary",
"incompatible",
"optionalDependency",
"requiredDependency",
"tool",
]),
});
export type CurseForgeRelationProject = z.infer<
typeof CurseForgeRelationProjectSchema
>;
// endregion
// region CurseForgeRelations — config 中 CurseForge 关联项目集合
export const CurseForgeRelationsSchema = z.object({
projects: z.array(CurseForgeRelationProjectSchema),
});
export type CurseForgeRelations = z.infer<typeof CurseForgeRelationsSchema>;
// endregion
// region CurseForgeConfig — config 中 curseforge 字段
export const CurseForgeConfigSchema = z.object({
/** CurseForge 项目 ID数字 */
project_id: z.number().int().positive(),
/** 版本名称模板,支持 ${filename_format} 等占位符 */
version_name: z.string().min(1),
/** 运行环境 */
environment: z.array(z.string().min(1)),
/** 加载器列表 */
loaders: z.array(z.string().min(1)),
/** 关联项目 */
relations: CurseForgeRelationsSchema,
});
export type CurseForgeConfig = z.infer<typeof CurseForgeConfigSchema>;
// endregion
// region Config — configs/{name}.json 完整结构
export const ConfigSchema = z.object({
/** 配置文件显示名称(模组名称) */
name: z.string().min(1),
/** Modrinth 配置 */
modrinth: ModrinthConfigSchema,
/** CurseForge 配置 */
curseforge: CurseForgeConfigSchema,
/** 项目目录绝对路径 */
project_dir: z.string().min(1),
/** 相对 project_dir 的 MC 版本配置目录,默认 ./properties */
minecraft_properties_dir: z.string().min(1),
/** 相对 project_dir 的项目版本配置文件路径,默认 ./gradle.properties */
project_properties_path: z.string().min(1),
/** 版本号在 project_properties_path 文件中的键名,默认 "mod_version" */
mod_version_field: z.string().min(1),
/** 构建产物文件名模板,支持 ${version}、${mc_version} 占位符 */
filename_format: z.string().min(1),
/** 源码 jar 文件名模板,支持 ${version}、${mc_version} 占位符 */
source_filename_format: z.string().min(1),
});
export type Config = z.infer<typeof ConfigSchema>;
// endregion
// region Secrets — secrets.json 结构
export const SecretsSchema = z.object({
/** CurseForge API Token */
curseforge: z.string().min(1),
/** Modrinth Personal Access Token */
modrinth: z.string().min(1),
});
export type Secrets = z.infer<typeof SecretsSchema>;
// endregion

View File

@ -1,3 +1,3 @@
export * from "./config";
export * from "./modrinth"; export * from "./modrinth";
export * from "./curseforge"; export * from "./curseforge";
// export * from "./config"; // TODO