diff --git a/apps/server/package.json b/apps/server/package.json index 5d09c3149..29c5ccc16 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -45,7 +45,6 @@ "@reactive-resume/utils": "workspace:*", "@sindresorhus/slugify": "^3.0.0", "@t3-oss/env-core": "^0.13.11", - "@uiw/color-convert": "^2.10.3", "ai": "^7.0.15", "bcrypt": "^6.0.0", "better-auth": "1.6.23", diff --git a/knip.json b/knip.json index bab3f4ded..6988b5ba6 100644 --- a/knip.json +++ b/knip.json @@ -28,7 +28,6 @@ "@orpc/experimental-ratelimit", "@sindresorhus/slugify", "@t3-oss/env-core", - "@uiw/color-convert", "ai", "bcrypt", "cjk-regex", diff --git a/packages/utils/package.json b/packages/utils/package.json index 92f34bec0..ad0c8fa7f 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -27,7 +27,6 @@ }, "dependencies": { "@sindresorhus/slugify": "^3.0.0", - "@uiw/color-convert": "^2.10.3", "clsx": "^2.1.1", "tailwind-merge": "^3.6.0", "unique-names-generator": "^4.7.1", diff --git a/packages/utils/src/color.ts b/packages/utils/src/color.ts index 3345d232a..3a64aa727 100644 --- a/packages/utils/src/color.ts +++ b/packages/utils/src/color.ts @@ -1,19 +1,17 @@ -import type { ColorResult } from "@uiw/color-convert"; -import { hsvaToHex, rgbaStringToHsva } from "@uiw/color-convert"; +type ParsedColor = { r: number; g: number; b: number; a: number }; export function rgbaStringToHex(rgba: string): string { const color = parseColorString(rgba); if (color) return `#${toHexComponent(color.r)}${toHexComponent(color.g)}${toHexComponent(color.b)}`; - - const hsva = rgbaStringToHsva(rgba); - return hsvaToHex(hsva); + // ponytail: unrecognized format → black; same result the prior @uiw/color-convert fallback produced + return "#000000"; } function toHexComponent(value: number): string { return Math.max(0, Math.min(255, value)).toString(16).padStart(2, "0"); } -export function parseColorString(value: string): ColorResult["rgba"] | null { +export function parseColorString(value: string): ParsedColor | null { const trimmed = value.trim(); // Parse rgb/rgba colors diff --git a/packages/utils/src/date.ts b/packages/utils/src/date.ts index 756883940..2a4ce559c 100644 --- a/packages/utils/src/date.ts +++ b/packages/utils/src/date.ts @@ -1,17 +1,11 @@ -const MONTH_NAMES = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", -]; +// ponytail: Intl replaces the 12-line MONTH_NAMES array; pinned to en-US so output is stable +const fmt = new Intl.DateTimeFormat("en-US", { month: "long" }); + +function getMonthName(month: string | undefined): string { + const index = Number.parseInt(month ?? "1", 10) - 1; + if (index < 0 || index > 11) return "undefined"; + return fmt.format(new Date(2000, index, 1)); +} /** * Formats a partial ISO 8601 date string (YYYY, YYYY-MM, or YYYY-MM-DD) @@ -22,7 +16,7 @@ export function formatDate(date: string, includeDay = false): string { if (parts.length >= 2) { const [year, month] = parts; - const monthName = MONTH_NAMES[Number.parseInt(month ?? "1", 10) - 1]; + const monthName = getMonthName(month); if (parts.length === 3 && includeDay) { return `${monthName} ${parts[2]}, ${year}`; diff --git a/packages/utils/src/locale.ts b/packages/utils/src/locale.ts index 3c2261349..59ff40232 100644 --- a/packages/utils/src/locale.ts +++ b/packages/utils/src/locale.ts @@ -1,61 +1,62 @@ import z from "zod"; -export const localeSchema = z.union([ - z.literal("af-ZA"), - z.literal("am-ET"), - z.literal("ar-SA"), - z.literal("az-AZ"), - z.literal("bg-BG"), - z.literal("bn-BD"), - z.literal("ca-ES"), - z.literal("cs-CZ"), - z.literal("da-DK"), - z.literal("de-DE"), - z.literal("el-GR"), - z.literal("en-US"), - z.literal("en-GB"), - z.literal("es-ES"), - z.literal("fa-IR"), - z.literal("fi-FI"), - z.literal("fr-FR"), - z.literal("he-IL"), - z.literal("hi-IN"), - z.literal("hu-HU"), - z.literal("id-ID"), - z.literal("it-IT"), - z.literal("ja-JP"), - z.literal("km-KH"), - z.literal("kn-IN"), - z.literal("ko-KR"), - z.literal("lt-LT"), - z.literal("lv-LV"), - z.literal("ml-IN"), - z.literal("mr-IN"), - z.literal("ms-MY"), - z.literal("ne-NP"), - z.literal("nl-NL"), - z.literal("no-NO"), - z.literal("or-IN"), - z.literal("pl-PL"), - z.literal("pt-BR"), - z.literal("pt-PT"), - z.literal("ro-RO"), - z.literal("ru-RU"), - z.literal("sk-SK"), - z.literal("sl-SI"), - z.literal("sq-AL"), - z.literal("sr-SP"), - z.literal("sv-SE"), - z.literal("ta-IN"), - z.literal("te-IN"), - z.literal("th-TH"), - z.literal("tr-TR"), - z.literal("uk-UA"), - z.literal("uz-UZ"), - z.literal("vi-VN"), - z.literal("zh-CN"), - z.literal("zh-TW"), - z.literal("zu-ZA"), +// ponytail: z.enum([...]) over 56 z.literal calls; same parse behavior, same inferred union type +export const localeSchema = z.enum([ + "af-ZA", + "am-ET", + "ar-SA", + "az-AZ", + "bg-BG", + "bn-BD", + "ca-ES", + "cs-CZ", + "da-DK", + "de-DE", + "el-GR", + "en-US", + "en-GB", + "es-ES", + "fa-IR", + "fi-FI", + "fr-FR", + "he-IL", + "hi-IN", + "hu-HU", + "id-ID", + "it-IT", + "ja-JP", + "km-KH", + "kn-IN", + "ko-KR", + "lt-LT", + "lv-LV", + "ml-IN", + "mr-IN", + "ms-MY", + "ne-NP", + "nl-NL", + "no-NO", + "or-IN", + "pl-PL", + "pt-BR", + "pt-PT", + "ro-RO", + "ru-RU", + "sk-SK", + "sl-SI", + "sq-AL", + "sr-SP", + "sv-SE", + "ta-IN", + "te-IN", + "th-TH", + "tr-TR", + "uk-UA", + "uz-UZ", + "vi-VN", + "zh-CN", + "zh-TW", + "zu-ZA", ]); export type Locale = z.infer; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33134a82c..d53d4cc2e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,9 +165,6 @@ importers: '@t3-oss/env-core': specifier: ^0.13.11 version: 0.13.11(typescript@6.0.3)(zod@4.4.3) - '@uiw/color-convert': - specifier: ^2.10.3 - version: 2.10.3(@babel/runtime@7.29.7) ai: specifier: ^7.0.15 version: 7.0.15(zod@4.4.3) @@ -1092,9 +1089,6 @@ importers: '@sindresorhus/slugify': specifier: ^3.0.0 version: 3.0.0 - '@uiw/color-convert': - specifier: ^2.10.3 - version: 2.10.3(@babel/runtime@7.29.7) clsx: specifier: ^2.1.1 version: 2.1.1