Skip to content

Commit

Permalink
update schema
Browse files Browse the repository at this point in the history
  • Loading branch information
deiucanta committed Dec 3, 2024
1 parent daed343 commit 9ea8284
Showing 1 changed file with 157 additions and 14 deletions.
171 changes: 157 additions & 14 deletions utils/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { z } from "zod";

export const randomPassword = () => randomBytes(10).toString("hex");

export const emptyToUndefined = (value: any) => {
const emptyToUndefined = (value: any) => {
if (typeof value !== "string") return value;
return value.trim() === "" ? undefined : value;
};
Expand All @@ -15,7 +15,15 @@ export const projectNameRule = z
"Invalid name. Use lowercase letters (a-z), digits (0-9), dash (-), underscore (_)."
);

export const backupPrefixRule = z
export const databaseNameRule = z
.string()
.regex(/^[a-zA-Z][a-zA-Z0-9_]{0,62}$/, "Invalid name.");

export const databaseUserRule = z
.string()
.regex(/^[a-zA-Z][a-zA-Z0-9_]{0,62}$/, "Invalid name.");

const backupPrefixRule = z
.string()
.regex(
/^[\w-/]*$/,
Expand All @@ -28,21 +36,21 @@ export const serviceNameRule = z
/^[a-z0-9-_]+$/,
"Invalid name. Use lowercase letters (a-z), digits (0-9), dash (-), underscore (_)."
);
export const processNameRule = z
const processNameRule = z
.string()
.regex(
/^[a-z0-9-_]+$/,
"Invalid name. Use lowercase letters (a-z), digits (0-9), dash (-), underscore (_)."
);
export const volumeNameRule = z
const volumeNameRule = z
.string()
.regex(
/^[a-z0-9-_]+$/,
"Invalid name. Use lowercase letters (a-z), digits (0-9), dash (-), underscore (_)."
);
export const domainRule = z.string().regex(/^[^\s*]+$/);
export const portRule = z.number().min(0).max(65535);
export const passwordRule = z.preprocess(
const passwordRule = z.preprocess(
emptyToUndefined,
z.string().default(randomPassword)
);
Expand Down Expand Up @@ -102,7 +110,7 @@ export const appRedirectsSchema = z
)
.optional();

export const appSourceSchema = z
const appSourceSchema = z
.union([
z.object({
type: z.literal("image"),
Expand All @@ -118,10 +126,16 @@ export const appSourceSchema = z
path: z.string().regex(/^\//),
autoDeploy: z.boolean(),
}),
z.object({
type: z.literal("git"),
repo: z.string().min(1),
ref: z.string().min(1),
path: z.string().regex(/^\//),
}),
])
.optional();

export const composeSourceSchema = z
const composeSourceSchema = z
.union([
z.object({
type: z.literal("inline"),
Expand All @@ -148,7 +162,7 @@ export const composeRedirectsSchema = z
)
.optional();

export const composeBasicAuthSchema = z
const composeBasicAuthSchema = z
.array(
z.object({
username: z.string(),
Expand Down Expand Up @@ -192,8 +206,8 @@ export const resourcesSchema = z
export const backupSchema = z
.object({
enabled: z.boolean(),
schedule: z.string(),
destinationId: z.string(),
schedule: z.string().min(1),
destinationId: z.string().min(1),
prefix: backupPrefixRule,
databaseName: z.string().optional(),
})
Expand Down Expand Up @@ -282,7 +296,7 @@ export const boxGitSchema = z
})
.optional();

export const nginxDefaultSite = `
const nginxDefaultSite = `
server {
listen 80 default_server;
listen [::]:80 default_server;
Expand Down Expand Up @@ -328,6 +342,7 @@ export const boxPhpSchema = z
phpIni: z.string().default(""),
enabled: z.boolean().default(true),
ioncube: z.boolean().default(false),
sqlsrv: z.boolean().default(false),
})
.optional();

Expand Down Expand Up @@ -381,6 +396,7 @@ export const boxModulesSchema = z
scripts: z.boolean().default(false),
ports: z.boolean().default(false),
resources: z.boolean().default(false),
env: z.boolean().default(false),
})
.default({});

Expand Down Expand Up @@ -443,6 +459,12 @@ export const boxPortsSchema = z
)
.default([]);

export const boxEnvSchema = z
.object({
content: z.string().default(""),
})
.optional();

export const boxSchema = z.object({
projectName: projectNameRule,
serviceName: serviceNameRule,
Expand Down Expand Up @@ -475,6 +497,107 @@ export const boxSchema = z.object({
nginx: boxNginxSchema,
python: boxPythonSchema,
ruby: boxRubySchema,
env: boxEnvSchema,
});

export const wordpressGitSchema = z
.object({
name: z.string().optional(),
email: z.string().optional(),
url: z.string().optional(),
branch: z.string().optional(),
})
.optional();

export const wordpressRedirectsSchema = z
.array(
z.object({
regex: z.string(),
replacement: z.string(),
permanent: z.boolean(),
enabled: z.boolean(),
})
)
.default([]);

export const wordpressBasicAuthSchema = z
.array(
z.object({
username: z.string(),
password: z.string(),
})
)
.default([]);

export const wordpressEnvSchema = z
.object({
content: z.string().default(""),
})
.optional();

export const wordpressScriptsSchema = z
.array(
z.object({
name: z.string(),
content: z.string(),
webhookToken: z.string(),
schedule: z.string().optional(),
enabled: z.boolean(),
})
)
.default([]);

export const wordpressIdeSchema = z
.object({
enabled: z.boolean().default(true),
defaultFolder: z.string().default("/code"),
token: z.string().default(() => randomBytes(10).toString("hex")),
})
.optional();

export const wordpressPhpSchema = z
.object({
version: z.string().default("8.3"),
maxUploadSize: z.string().default("128M"),
maxExecutionTime: z.string().default("30"),
opcache: z.boolean().default(true),
phpIni: z.string().default(""),
ioncube: z.boolean().default(false),
sqlsrv: z.boolean().default(false),
})
.optional();

export const wordpressNginxSchema = z
.object({
rootDocument: z.string().default("/code"),
config: z.string().default(nginxDefaultSite),
})
.optional();

export const wordpressDomainSchema = z.object({
host: z.string(),
https: z.boolean(),
port: z.number(),
path: z.string(),
middlewares: z.array(z.string()).optional(),
certificateResolver: z.string().optional(),
});

export const wordpressSchema = z.object({
projectName: projectNameRule,
serviceName: serviceNameRule,
codeInitialized: z.boolean().default(false),
initialVersion: z.string().default("latest"),
git: wordpressGitSchema,
domain: wordpressDomainSchema,
redirects: wordpressRedirectsSchema,
basicAuth: wordpressBasicAuthSchema,
scripts: wordpressScriptsSchema,
resources: resourcesSchema,
ide: wordpressIdeSchema,
php: wordpressPhpSchema,
nginx: wordpressNginxSchema,
env: wordpressEnvSchema,
});

export const appSchema = z.object({
Expand Down Expand Up @@ -507,7 +630,8 @@ export const composeSchema = z.object({
export const mongoSchema = z.object({
projectName: projectNameRule,
serviceName: serviceNameRule,
image: z.preprocess(emptyToUndefined, z.string().default("mongo:6")),
user: databaseUserRule.optional(),
image: z.preprocess(emptyToUndefined, z.string().default("mongo:8")),
password: passwordRule,
resources: resourcesSchema,
env: z.string().optional(),
Expand All @@ -517,7 +641,9 @@ export const mongoSchema = z.object({
export const mysqlSchema = z.object({
projectName: projectNameRule,
serviceName: serviceNameRule,
image: z.preprocess(emptyToUndefined, z.string().default("mysql:8")),
databaseName: databaseNameRule.optional(),
user: databaseUserRule.optional(),
image: z.preprocess(emptyToUndefined, z.string().default("mysql:9")),
password: passwordRule,
rootPassword: passwordRule,
resources: resourcesSchema,
Expand All @@ -528,6 +654,8 @@ export const mysqlSchema = z.object({
export const mariadbSchema = z.object({
projectName: projectNameRule,
serviceName: serviceNameRule,
databaseName: databaseNameRule.optional(),
user: databaseUserRule.optional(),
image: z.preprocess(emptyToUndefined, z.string().default("mariadb:11")),
password: passwordRule,
rootPassword: passwordRule,
Expand All @@ -539,7 +667,9 @@ export const mariadbSchema = z.object({
export const postgresSchema = z.object({
projectName: projectNameRule,
serviceName: serviceNameRule,
image: z.preprocess(emptyToUndefined, z.string().default("postgres:16")),
databaseName: databaseNameRule.optional(),
user: databaseUserRule.optional(),
image: z.preprocess(emptyToUndefined, z.string().default("postgres:17")),
password: passwordRule,
resources: resourcesSchema,
env: z.string().optional(),
Expand Down Expand Up @@ -590,3 +720,16 @@ export const templateSchema = z.object({
])
),
});

export const cloudflareTunnelRuleSchema = z.object({
id: z.string(),
projectName: projectNameRule,
serviceName: serviceNameRule,
subdomain: z.string(),
domain: z.string(),
path: z.string(),
internalProtocol: z.enum(["http", "https"]),
internalPort: z.number(),
zoneId: z.string(),
dnsRecordId: z.string(),
});

0 comments on commit 9ea8284

Please sign in to comment.