feat(validation): centralize app name validation logic

- Introduced `APP_NAME_REGEX` and `APP_NAME_MESSAGE` constants in `schema.ts` for consistent app name validation across `add-application.tsx`, `add-compose.tsx`, and `add-database.tsx`.
- Updated regex and error message in the respective schemas to utilize the new constants, improving maintainability and readability.
This commit is contained in:
Mauricio Siu
2026-04-03 22:40:49 -06:00
parent e211feb801
commit dd28a8e703
4 changed files with 13 additions and 9 deletions

View File

@@ -43,6 +43,7 @@ import {
} from "@/components/ui/tooltip";
import { slugify } from "@/lib/slug";
import { api } from "@/utils/api";
import { APP_NAME_MESSAGE, APP_NAME_REGEX } from "@/utils/schema";
const AddTemplateSchema = z.object({
name: z.string().min(1, {
@@ -53,9 +54,8 @@ const AddTemplateSchema = z.object({
.min(1, {
message: "App name is required",
})
.regex(/^[a-z](?!.*--)([a-z0-9-]*[a-z])?$/, {
message:
"App name supports lowercase letters, numbers, '-' and can only start and end letters, and does not support continuous '-'",
.regex(APP_NAME_REGEX, {
message: APP_NAME_MESSAGE,
}),
description: z.string().optional(),
serverId: z.string().optional(),

View File

@@ -43,6 +43,7 @@ import {
} from "@/components/ui/tooltip";
import { slugify } from "@/lib/slug";
import { api } from "@/utils/api";
import { APP_NAME_MESSAGE, APP_NAME_REGEX } from "@/utils/schema";
const AddComposeSchema = z.object({
composeType: z.enum(["docker-compose", "stack"]).optional(),
@@ -54,9 +55,8 @@ const AddComposeSchema = z.object({
.min(1, {
message: "App name is required",
})
.regex(/^[a-z](?!.*--)([a-z0-9-]*[a-z0-9])?$/, {
message:
"App name supports lowercase letters, numbers, '-' and must start with a letter, end with a letter or number, and cannot contain consecutive '-'",
.regex(APP_NAME_REGEX, {
message: APP_NAME_MESSAGE,
}),
description: z.string().optional(),
serverId: z.string().optional(),

View File

@@ -52,6 +52,7 @@ import {
} from "@/components/ui/tooltip";
import { slugify } from "@/lib/slug";
import { api } from "@/utils/api";
import { APP_NAME_MESSAGE, APP_NAME_REGEX } from "@/utils/schema";
type DbType = z.infer<typeof mySchema>["type"];
@@ -82,9 +83,8 @@ const baseDatabaseSchema = z.object({
.min(1, {
message: "App name is required",
})
.regex(/^[a-z](?!.*--)([a-z0-9-]*[a-z])?$/, {
message:
"App name supports lowercase letters, numbers, '-' and can only start and end letters, and does not support continuous '-'",
.regex(APP_NAME_REGEX, {
message: APP_NAME_MESSAGE,
}),
databasePassword: z
.string()

View File

@@ -10,6 +10,10 @@ if (typeof window === "undefined") {
})();
}
export const APP_NAME_REGEX = /^[a-z](?!.*--)([a-z0-9-]*[a-z0-9])?$/;
export const APP_NAME_MESSAGE =
"App name supports lowercase letters, numbers, '-' and must start with a letter, end with a letter or number, and cannot contain consecutive '-'";
export const uploadFileSchema = zfd.formData({
applicationId: z.string().optional(),
zip: zfd.file(),