{"release_id":"01a1c502-4ad1-0000-ec62-adc54d3c69aa","chunk_id":"01a1c502-4c12-7d51-8826-43fee9ed851d","file":"Cw1E8Mnz.mjs","mappings":"qTAgBO,MAAMA,EAA+B,CAAC,OAAQ,QAAS,MAAO,OAAO,EAK/DC,EAAwC,CAAC,QAAS,MAAO,OAAO,EAahEC,EAAiD,CAC7D,KAAM,QACN,MAAO,iBACP,IAAK,eACL,MAAO,gBACR,EAiBO,SAASC,EAASC,EAA8B,CACtD,OAAOA,IAAY,OAAS,OAAS,QAAQA,CAAO,EACrD","names":["RATE_SUBJECTS","PAGE_RATE_SUBJECTS","RATE_SUBJECT_PATH","rateFlow","subject"],"sources":["../../../../../../src/lib/rate-subjects.ts"],"sourcesContent":["/** Epic R: the AI rater rates more than dicks. Client-safe.\n *\n *  Each subject has its own page, its own prompt and its own six scores. The\n *  dick is /rate and everything it always was: its ratings carry no subject at\n *  all, so every query, leaderboard and stat written before keeps reading only\n *  dicks. The others ride on the same generation rows with `subject` in their\n *  results JSON and no `score` column value (api/generation/[id]), which keeps\n *  them out of the dick averages, the homepage count and the leaderboards.\n *\n *  US searches a month (Semrush, 2026-11-01): rate my boobs 6.6K, rate my tits\n *  6.6K, ratemyboobs 2.4K, rate my rack 1.6K; rate my ass 1.3K, ratemyass 1.3K;\n *  rate my nudes 720, rate my body 590, rate my nude 390. */\nimport type { BeatKind } from '$lib/types/beat';\n\nexport type RateSubject = 'dick' | 'boobs' | 'ass' | 'nudes';\n\nexport const RATE_SUBJECTS: RateSubject[] = ['dick', 'boobs', 'ass', 'nudes'];\n\n/** The subjects with a page of their own besides /rate. */\nexport type PageRateSubject = Exclude<RateSubject, 'dick'>;\n\nexport const PAGE_RATE_SUBJECTS: PageRateSubject[] = ['boobs', 'ass', 'nudes'];\n\n/** Untrusted input (a form field) to a subject; anything unknown is the dick. */\nexport function parseRateSubject(input: unknown): RateSubject {\n\treturn RATE_SUBJECTS.includes(input as RateSubject) ? (input as RateSubject) : 'dick';\n}\n\n/** A rating's subject, read off its results JSON. A dick rating has none. */\nexport function rateSubjectOf(results: unknown): RateSubject {\n\tif (!results || typeof results !== 'object') return 'dick';\n\treturn parseRateSubject((results as { subject?: unknown }).subject);\n}\n\nexport const RATE_SUBJECT_PATH: Record<RateSubject, string> = {\n\tdick: '/rate',\n\tboobs: '/rate-my-boobs',\n\tass: '/rate-my-ass',\n\tnudes: '/rate-my-nudes'\n};\n\n/** The page subject a top-level slug names (`rate-my-boobs` → boobs). */\nexport function rateSubjectBySlug(slug: string): PageRateSubject | undefined {\n\treturn PAGE_RATE_SUBJECTS.find((s) => RATE_SUBJECT_PATH[s] === `/${slug}`);\n}\n\n/** The beat me category a subject's photo can go into. Nudes have none. */\nexport const RATE_SUBJECT_BEAT_KIND: Record<RateSubject, BeatKind | null> = {\n\tdick: 'cockcompare',\n\tboobs: 'boobs',\n\tass: 'ass',\n\tnudes: null\n};\n\n/** PostHog `flow` of a subject's rate funnel. /rate keeps `rate`, so the\n *  dick funnel and its experiments read exactly as before. */\nexport function rateFlow(subject: RateSubject): string {\n\treturn subject === 'dick' ? 'rate' : `rate_${subject}`;\n}\n"],"version":3}