mirror of
https://github.com/andwati/dokploy.git
synced 2026-10-19 11:42:55 +00:00
strip path functionality to compose - Add internalPath field to route requests to different paths internally - Add stripPath option to remove external path prefix before forwarding - Improves validation for stripPath (requires non-root path) and internalPath (must start with /)
105 lines
3.0 KiB
TypeScript
105 lines
3.0 KiB
TypeScript
import { z } from "zod";
|
|
|
|
export const domain = z
|
|
.object({
|
|
host: z.string().min(1, { message: "Add a hostname" }),
|
|
path: z.string().min(1).optional(),
|
|
internalPath: z.string().optional(),
|
|
stripPath: z.boolean().optional(),
|
|
port: z
|
|
.number()
|
|
.min(1, { message: "Port must be at least 1" })
|
|
.max(65535, { message: "Port must be 65535 or below" })
|
|
.optional(),
|
|
https: z.boolean().optional(),
|
|
certificateType: z.enum(["letsencrypt", "none", "custom"]).optional(),
|
|
customCertResolver: z.string(),
|
|
})
|
|
.superRefine((input, ctx) => {
|
|
if (input.https && !input.certificateType) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["certificateType"],
|
|
message: "Required",
|
|
});
|
|
}
|
|
|
|
if (input.certificateType === "custom" && !input.customCertResolver) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["customCertResolver"],
|
|
message: "Required when certificate type is custom",
|
|
});
|
|
}
|
|
|
|
// Validate stripPath requires a valid path
|
|
if (input.stripPath && (!input.path || input.path === "/")) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["stripPath"],
|
|
message: "Strip path can only be enabled when a path other than '/' is specified",
|
|
});
|
|
}
|
|
|
|
// Validate internalPath starts with /
|
|
if (input.internalPath && input.internalPath !== "/" && !input.internalPath.startsWith("/")) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["internalPath"],
|
|
message: "Internal path must start with '/'",
|
|
});
|
|
}
|
|
});
|
|
|
|
export const domainCompose = z
|
|
.object({
|
|
host: z.string().min(1, { message: "Host is required" }),
|
|
path: z.string().min(1).optional(),
|
|
internalPath: z.string().optional(),
|
|
stripPath: z.boolean().optional(),
|
|
port: z
|
|
.number()
|
|
.min(1, { message: "Port must be at least 1" })
|
|
.max(65535, { message: "Port must be 65535 or below" })
|
|
.optional(),
|
|
https: z.boolean().optional(),
|
|
certificateType: z.enum(["letsencrypt", "none", "custom"]).optional(),
|
|
customCertResolver: z.string(),
|
|
serviceName: z.string().min(1, { message: "Service name is required" }),
|
|
})
|
|
.superRefine((input, ctx) => {
|
|
if (input.https && !input.certificateType) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["certificateType"],
|
|
message: "Required",
|
|
});
|
|
}
|
|
|
|
if (input.certificateType === "custom" && !input.customCertResolver) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["customCertResolver"],
|
|
message: "Required when certificate type is custom",
|
|
});
|
|
}
|
|
|
|
// Validate stripPath requires a valid path
|
|
if (input.stripPath && (!input.path || input.path === "/")) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["stripPath"],
|
|
message: "Strip path can only be enabled when a path other than '/' is specified",
|
|
});
|
|
}
|
|
|
|
// Validate internalPath starts with /
|
|
if (input.internalPath && input.internalPath !== "/" && !input.internalPath.startsWith("/")) {
|
|
ctx.addIssue({
|
|
code: z.ZodIssueCode.custom,
|
|
path: ["internalPath"],
|
|
message: "Internal path must start with '/'",
|
|
});
|
|
}
|
|
});
|