aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/types/tags.ts11
-rw-r--r--packages/shared/utils/tag.ts6
2 files changed, 15 insertions, 2 deletions
diff --git a/packages/shared/types/tags.ts b/packages/shared/types/tags.ts
index c7a0103e..efb26bfa 100644
--- a/packages/shared/types/tags.ts
+++ b/packages/shared/types/tags.ts
@@ -1,7 +1,14 @@
import { z } from "zod";
+import { normalizeTagName } from "../utils/tag";
+
+const zTagNameSchemaWithValidation = z
+ .string()
+ .transform((s) => normalizeTagName(s).trim())
+ .pipe(z.string().min(1));
+
export const zCreateTagRequestSchema = z.object({
- name: z.string().min(1),
+ name: zTagNameSchemaWithValidation,
});
export const zAttachedByEnumSchema = z.enum(["ai", "human"]);
@@ -23,7 +30,7 @@ export type ZGetTagResponse = z.infer<typeof zGetTagResponseSchema>;
export const zUpdateTagRequestSchema = z.object({
tagId: z.string(),
- name: z.string().optional(),
+ name: zTagNameSchemaWithValidation.optional(),
});
export const zTagBasicSchema = z.object({
diff --git a/packages/shared/utils/tag.ts b/packages/shared/utils/tag.ts
new file mode 100644
index 00000000..8e1bd105
--- /dev/null
+++ b/packages/shared/utils/tag.ts
@@ -0,0 +1,6 @@
+/**
+ * Ensures exactly ONE leading #
+ */
+export function normalizeTagName(raw: string): string {
+ return raw.trim().replace(/^#+/, ""); // strip every leading #
+}