83 lines
2.1 KiB
TypeScript
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 }),
|
|
});
|