1import { createPuzzleFromDailySeed } from "@/lib/shikaku/generator.ts";2import { dateToSlug } from "@/lib/date/daily.ts";3import type { ShikakuPuzzle } from "@/lib/shikaku/types.ts";45export const DAILY_STREAK_START_DATE = "2026-04-16";67export function getPuzzleByDateIndex(8 date: string,9 streakIndex: number,10): ShikakuPuzzle | null {11 if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) {12 return null;13 }1415 if (!Number.isInteger(streakIndex) || streakIndex < 0) {16 return null;17 }1819 return createPuzzleFromDailySeed(date, streakIndex);20}2122export function getPuzzleByDate(date: string): ShikakuPuzzle | null {23 return getPuzzleByDateIndex(date, 0);24}2526export function listAvailablePuzzleDates(27 today = dateToSlug(new Date()),28): string[] {29 const dates: string[] = [];30 const cursor = parseLocalDateSlug(DAILY_STREAK_START_DATE);31 const end = parseLocalDateSlug(today);3233 while (cursor <= end) {34 dates.push(dateToSlug(cursor));35 cursor.setDate(cursor.getDate() + 1);36 }3738 return dates;39}4041function parseLocalDateSlug(date: string): Date {42 const [year, month, day] = date.split("-").map(Number);43 return new Date(year, month - 1, day);44}