Files
2025-05-05 18:32:08 +08:00

83 lines
2.1 KiB
TypeScript

import * as z from "zod";
import {
DEFAULT_BGCOLOR,
DEFAULT_FGCOLOR,
DEFAULT_MARGIN,
QR_LEVELS,
} from "@/lib/qr/constants";
import { getUrlFromString, isValidUrl } from "../utils";
export const parseUrlSchema = z
.string()
.transform((v) => getUrlFromString(v))
.refine((v) => isValidUrl(v), { message: "Invalid URL" });
// A boolean query schema that coerces the value to a boolean
export const booleanQuerySchema = z
.enum(["true", "false"])
.transform((value) => value == "true");
// .openapi({
// type: "boolean",
// });
export const getQRCodeQuerySchema = z.object({
key: z.string(),
url: parseUrlSchema.describe("The URL to generate a QR code for."),
logo: z
.string()
.optional()
.describe(
"The logo to include in the QR code. Can only be used with a paid plan on Dub.",
),
size: z.coerce
.number()
.optional()
.default(600)
.describe(
"The size of the QR code in pixels. Defaults to `600` if not provided.",
),
level: z
.enum(QR_LEVELS)
.optional()
.default("L")
.describe(
"The level of error correction to use for the QR code. Defaults to `L` if not provided.",
),
fgColor: z
.string()
.optional()
.default(DEFAULT_FGCOLOR)
.describe(
"The foreground color of the QR code in hex format. Defaults to `#000000` if not provided.",
),
bgColor: z
.string()
.optional()
.default(DEFAULT_BGCOLOR)
.describe(
"The background color of the QR code in hex format. Defaults to `#ffffff` if not provided.",
),
hideLogo: booleanQuerySchema
.optional()
.default("false")
.describe(
"Whether to hide the logo in the QR code. Can only be used with a paid plan on Dub.",
),
margin: z.coerce
.number()
.optional()
.default(DEFAULT_MARGIN)
.describe(
`The size of the margin around the QR code. Defaults to ${DEFAULT_MARGIN} if not provided.`,
),
includeMargin: booleanQuerySchema
.optional()
.default("true")
.describe(
"DEPRECATED: Margin is included by default. Use the `margin` prop to customize the margin size.",
),
// .openapi({ deprecated: true }),
});