SYMBOL INDEX (302 symbols across 64 files) FILE: src/app.d.ts type Error (line 6) | interface Error { type Locals (line 10) | interface Locals { type PageData (line 18) | interface PageData { type Platform (line 26) | interface Platform {} type ProcessEnv (line 30) | interface ProcessEnv { FILE: src/env.d.ts type ImportMetaEnv (line 3) | interface ImportMetaEnv { type ImportMeta (line 20) | interface ImportMeta { FILE: src/hooks.server.ts constant ADMIN_RATE_LIMIT (line 9) | const ADMIN_RATE_LIMIT = 100; constant ADMIN_RATE_WINDOW (line 10) | const ADMIN_RATE_WINDOW = 5 * 60 * 1000; constant CSRF_MAX_AGE (line 12) | const CSRF_MAX_AGE = 60 * 60 * 24 * 7; function checkAdminRateLimit (line 14) | function checkAdminRateLimit(ip: string): boolean { function setSecurityHeaders (line 46) | function setSecurityHeaders(response: Response, nonce: string): void { FILE: src/lib/constants/security.ts constant CSRF_COOKIE_NAME (line 1) | const CSRF_COOKIE_NAME = "csrf"; constant CSRF_HEADER_NAME (line 2) | const CSRF_HEADER_NAME = "x-csrf-token"; FILE: src/lib/extensions/mention.ts type HTMLAttrs (line 4) | type HTMLAttrs = Record { function getSession (line 23) | async function getSession(cookies: Cookies): Promise { function createSessionCookie (line 35) | function createSessionCookie(token: string, secure: boolean = true): str... function clearSessionCookie (line 40) | function clearSessionCookie(): string { function createCsrfToken (line 44) | function createCsrfToken(): string { function createCsrfCookie (line 48) | function createCsrfCookie(token: string, secure: boolean = true): string { function clearCsrfCookie (line 53) | function clearCsrfCookie(): string { FILE: src/lib/server/services/auth.ts type UserData (line 11) | interface UserData { function toUserSession (line 18) | function toUserSession(data: UserData): UserSession { class AuthService (line 27) | class AuthService implements AuthServiceInterface { method constructor (line 30) | private constructor() {} method getInstance (line 32) | static getInstance(): AuthService { method hashPassword (line 39) | async hashPassword(password: string): Promise { method comparePasswords (line 44) | async comparePasswords(password: string, hash: string): Promise { method verifyToken (line 58) | async verifyToken(token: string): Promise { method createUser (line 67) | async createUser( method validateUser (line 92) | async validateUser( method findUserByIdentifier (line 121) | async findUserByIdentifier(identifier: string): Promise { method validateResetToken (line 170) | async validateResetToken(token: string): Promise { method clearResetToken (line 193) | async clearResetToken(userId: number): Promise { FILE: src/lib/server/services/captcha.ts type CaptchaEntry (line 3) | interface CaptchaEntry { constant CAPTCHA_EXPIRY (line 8) | const CAPTCHA_EXPIRY = 5 * 60 * 1000; class CaptchaService (line 21) | class CaptchaService { method generateCaptcha (line 25) | static generateCaptcha(): { id: string; text: string } { method validateCaptcha (line 41) | static validateCaptcha( method invalidateCaptcha (line 67) | static invalidateCaptcha(id: string): void { FILE: src/lib/server/services/comments.ts type MediaType (line 3) | type MediaType = "movie" | "tv"; type CreateCommentInput (line 5) | interface CreateCommentInput { type CommentUser (line 13) | interface CommentUser { type CommentCounts (line 17) | interface CommentCounts { type BaseComment (line 22) | interface BaseComment { type CommentWithDetails (line 36) | interface CommentWithDetails extends BaseComment { class CommentService (line 42) | class CommentService { method constructor (line 45) | private constructor() {} method getInstance (line 47) | static getInstance(): CommentService { method createComment (line 54) | async createComment(input: CreateCommentInput): Promise { method getComments (line 66) | async getComments( method getFlaggedComments (line 136) | async getFlaggedComments( method getReplies (line 179) | async getReplies( method likeComment (line 243) | async likeComment(userId: number, commentId: number): Promise { method unlikeComment (line 252) | async unlikeComment(userId: number, commentId: number): Promise { method updateComment (line 263) | async updateComment( method deleteComment (line 279) | async deleteComment(commentId: number, userId: number): Promise { method flagComment (line 302) | async flagComment(commentId: number, reason?: string): Promise { FILE: src/lib/server/services/db-error.ts type DbErrorResponse (line 8) | interface DbErrorResponse { function isDatabaseConnectionError (line 13) | function isDatabaseConnectionError(error: unknown): boolean { function handleDatabaseError (line 29) | function handleDatabaseError(error: unknown, operation: string) { FILE: src/lib/server/services/rate-limit.ts type RateLimit (line 1) | interface RateLimit { class RateLimitService (line 6) | class RateLimitService { method checkLoginLimit (line 21) | static checkLoginLimit(ip: string): { method checkRegisterLimit (line 32) | static checkRegisterLimit(ip: string): { method checkCommentLimit (line 43) | static checkCommentLimit(userId: number): { method checkPasswordResetLimit (line 54) | static checkPasswordResetLimit(identifier: string): { method checkLikeLimit (line 65) | static checkLikeLimit(userId: number): { method checkLimit (line 76) | private static checkLimit( method cleanup (line 109) | static cleanup() { class InstanceRateLimitService (line 129) | class InstanceRateLimitService { method constructor (line 134) | constructor(windowMs: number = 60 * 1000, maxRequests: number = 100) { method checkRateLimit (line 139) | checkRateLimit(ip: string): boolean { FILE: src/lib/server/services/watchlist.ts type PrismaError (line 3) | interface PrismaError extends Error { class WatchlistService (line 7) | class WatchlistService { method constructor (line 10) | private constructor() {} method getInstance (line 12) | static getInstance(): WatchlistService { method addToWatchlist (line 19) | async addToWatchlist( method removeFromWatchlist (line 47) | async removeFromWatchlist( method getWatchlist (line 61) | async getWatchlist(userId: number) { method isInWatchlist (line 72) | async isInWatchlist( method getWatchlistCount (line 87) | async getWatchlistCount(userId: number) { FILE: src/lib/services/api-client.ts class ApiError (line 1) | class ApiError extends Error { method constructor (line 2) | constructor( class ApiClient (line 11) | class ApiClient { method constructor (line 12) | constructor( method handleResponse (line 17) | private async handleResponse(response: Response): Promise { method get (line 29) | async get( FILE: src/lib/services/auth.ts class AuthService (line 4) | class AuthService { method constructor (line 7) | private constructor() {} method getInstance (line 9) | static getInstance(): AuthService { method login (line 16) | async login(usernameOrEmail: string, password: string): Promise { method getCurrentUser (line 67) | async getCurrentUser(): Promise { method requestPasswordReset (line 81) | async requestPasswordReset(identifier: string): Promise { method resetPassword (line 96) | async resetPassword(token: string, newPassword: string): Promise { FILE: src/lib/services/captcha.ts class CaptchaService (line 1) | class CaptchaService { method generateChallenge (line 6) | static generateChallenge(): { question: string; answer: number } { method validateAnswer (line 33) | static validateAnswer( FILE: src/lib/services/comments.ts type MediaType (line 3) | type MediaType = "movie" | "tv"; type CommentUser (line 5) | interface CommentUser { type CommentCounts (line 9) | interface CommentCounts { type BaseComment (line 14) | interface BaseComment { type CommentWithDetails (line 28) | interface CommentWithDetails extends BaseComment { class CommentService (line 34) | class CommentService { method createComment (line 35) | async createComment( method getComments (line 62) | async getComments( method getFlaggedComments (line 90) | async getFlaggedComments( method getReplies (line 109) | async getReplies( method likeComment (line 129) | async likeComment(commentId: number): Promise { method updateComment (line 144) | async updateComment( method deleteComment (line 164) | async deleteComment(commentId: number): Promise { method flagComment (line 175) | async flagComment(commentId: number, reason?: string): Promise { method unflagComment (line 190) | async unflagComment(commentId: number): Promise { FILE: src/lib/services/image.ts type ImageOptions (line 9) | interface ImageOptions { type CacheEntry (line 16) | interface CacheEntry { constant CACHE_DIR (line 28) | const CACHE_DIR = "static/image-cache"; constant DEFAULT_QUALITY (line 29) | const DEFAULT_QUALITY = 80; constant DEFAULT_FORMAT (line 30) | const DEFAULT_FORMAT = "webp"; constant CACHE_CLEANUP_DAYS (line 31) | const CACHE_CLEANUP_DAYS = 7; class ImageService (line 33) | class ImageService { method constructor (line 36) | private constructor() { method getInstance (line 41) | static getInstance(): ImageService { method ensureCacheDir (line 48) | private async ensureCacheDir() { method generateCacheKey (line 56) | private generateCacheKey(url: string, options: ImageOptions): string { method getCachePath (line 62) | private getCachePath(key: string, format: string): string { method scheduleCleanup (line 66) | private scheduleCleanup() { method cleanupCache (line 71) | async cleanupCache(): Promise { method optimizeImage (line 100) | async optimizeImage( method generateResponsiveSet (line 192) | async generateResponsiveSet( method generateSrcSet (line 203) | async generateSrcSet( method isValidUrl (line 214) | isValidUrl(url: string): boolean { FILE: src/lib/services/providers.ts type Provider (line 5) | interface Provider { function getProvider (line 87) | function getProvider(id: string): Provider | undefined { function getDefaultProvider (line 91) | function getDefaultProvider(): Provider { FILE: src/lib/services/rate-limit.ts type RateLimit (line 1) | interface RateLimit { class RateLimitService (line 6) | class RateLimitService { method checkCommentLimit (line 13) | static checkCommentLimit(userId: number): { method checkPasswordResetLimit (line 24) | static checkPasswordResetLimit(identifier: string): { method checkLimit (line 35) | private static checkLimit( method cleanup (line 68) | static cleanup() { method startCleanup (line 79) | static startCleanup() { FILE: src/lib/services/release-type.ts type ReleaseInfo (line 1) | interface ReleaseInfo { function getReleaseType (line 8) | async function getReleaseType( FILE: src/lib/services/tmdb.ts constant TMDB_BASE_URL (line 4) | const TMDB_BASE_URL = 'https://api.themoviedb.org/3'; constant MAX_RETRIES (line 5) | const MAX_RETRIES = 2; type QueryParams (line 6) | type QueryParams = Record(endpoint: string, params: QueryParams = {}, ret... method getMovieDetails (line 106) | async getMovieDetails(id: number): Promise { method getTVShowDetails (line 112) | async getTVShowDetails(id: number): Promise { method getMovieGenres (line 118) | async getMovieGenres(): Promise { method getTVGenres (line 123) | async getTVGenres(): Promise { method searchMovies (line 128) | async searchMovies(query: string, page = 1): Promise> { method getPopularTVShows (line 187) | async getPopularTVShows(page = 1): Promise> { method getTopRatedMovies (line 191) | async getTopRatedMovies(page = 1): Promise> { method getTopRatedTVShows (line 195) | async getTopRatedTVShows(page = 1): Promise> { method getUpcomingMovies (line 199) | async getUpcomingMovies(page = 1): Promise> { method getOnTheAirTVShows (line 203) | async getOnTheAirTVShows(page = 1): Promise> { method getImageUrl (line 207) | getImageUrl(path: string | null, size: 'original' | 'w500' | 'w780' = ... FILE: src/lib/services/watchlist.ts type WatchlistItem (line 3) | interface WatchlistItem { class WatchlistService (line 14) | class WatchlistService { method addToWatchlist (line 15) | async addToWatchlist( method removeFromWatchlist (line 44) | async removeFromWatchlist( method getWatchlist (line 62) | async getWatchlist(): Promise { method isInWatchlist (line 73) | async isInWatchlist( FILE: src/lib/shared/comment-validation.ts function containsUrl (line 1) | function containsUrl(text: string): boolean { function validateComment (line 11) | function validateComment(content: string): { isValid: boolean; error?: s... FILE: src/lib/stores/auth.ts type User (line 4) | interface User { type AuthState (line 11) | interface AuthState { function createAuthStore (line 18) | function createAuthStore() { FILE: src/lib/stores/comments.ts type CommentStore (line 5) | interface CommentStore { function createCommentsStore (line 12) | function createCommentsStore() { FILE: src/lib/stores/filters.ts function isSortBy (line 19) | function isSortBy(value: string): value is SortBy { function isSortOrder (line 23) | function isSortOrder(value: string): value is SortOrder { function isWatchStatus (line 27) | function isWatchStatus(value: string): value is WatchStatus { function createFilterStore (line 31) | function createFilterStore() { FILE: src/lib/stores/provider-urls.ts type ProviderUrls (line 3) | interface ProviderUrls { function loadProviderUrls (line 12) | async function loadProviderUrls() { FILE: src/lib/stores/toast.ts type Toast (line 3) | interface Toast { function createToastStore (line 10) | function createToastStore() { FILE: src/lib/stores/watchlist.ts type WatchlistItem (line 6) | interface WatchlistItem { type WatchlistStore (line 16) | interface WatchlistStore { function createWatchlistStore (line 23) | function createWatchlistStore() { FILE: src/lib/types/auth.ts type UserSession (line 1) | interface UserSession { type TokenPayload (line 8) | interface TokenPayload { type AuthServiceInterface (line 12) | interface AuthServiceInterface { function verifyToken (line 34) | async function verifyToken(token: string): Promise { FILE: src/lib/types/comments.ts type Comment (line 1) | interface Comment { type CommentResponse (line 24) | interface CommentResponse { FILE: src/lib/types/filters.ts type SortOrder (line 1) | type SortOrder = "asc" | "desc"; type SortBy (line 2) | type SortBy = "popularity" | "rating" | "release_date" | "title"; type MediaType (line 3) | type MediaType = "movie" | "tv"; type WatchStatus (line 4) | type WatchStatus = "all" | "watching" | "completed" | "planned"; type Genre (line 6) | interface Genre { type FilterOptions (line 11) | interface FilterOptions { type FilterState (line 23) | interface FilterState extends FilterOptions { function createQueryString (line 74) | function createQueryString(filters: FilterOptions): string { function parseQueryString (line 116) | function parseQueryString(queryString: string): FilterOptions { FILE: src/lib/types/provider.ts type MediaProvider (line 1) | interface MediaProvider { type ProviderOptions (line 20) | interface ProviderOptions { type StreamingQuality (line 29) | interface StreamingQuality { type ProviderResponse (line 38) | interface ProviderResponse { FILE: src/lib/types/tmdb.ts type TMDBReleaseDatesResponse (line 1) | interface TMDBReleaseDatesResponse { type TMDBReleaseDateResult (line 6) | interface TMDBReleaseDateResult { type TMDBReleaseDate (line 11) | interface TMDBReleaseDate { type TMDBMediaResponse (line 19) | interface TMDBMediaResponse { type TMDBResponse (line 35) | interface TMDBResponse { type TMDBVideoResponse (line 42) | interface TMDBVideoResponse { type TMDBVideo (line 47) | interface TMDBVideo { type TMDBMovie (line 56) | interface TMDBMovie extends TMDBMediaResponse { type TMDBTVShow (line 62) | interface TMDBTVShow extends TMDBMediaResponse { type TMDBGenre (line 68) | interface TMDBGenre { type TMDBWatchProvider (line 73) | interface TMDBWatchProvider { type TMDBWatchProviderRegion (line 80) | interface TMDBWatchProviderRegion { type TMDBWatchProvidersResponse (line 87) | interface TMDBWatchProvidersResponse { FILE: src/lib/utils/csrf.ts function getCookie (line 3) | function getCookie(name: string): string | null { function getCsrfToken (line 11) | function getCsrfToken(): string | null { function withCsrfHeaders (line 15) | function withCsrfHeaders(init: RequestInit = {}): RequestInit { function csrfFetch (line 28) | async function csrfFetch( FILE: src/routes/api/auth/login/+server.ts function POST (line 9) | async function POST({ request, getClientAddress }: RequestEvent) { FILE: src/routes/api/auth/logout/+server.ts function POST (line 5) | async function POST(_event: RequestEvent) { FILE: src/routes/api/auth/me/+server.ts function GET (line 6) | async function GET({ cookies }: RequestEvent) { FILE: src/routes/api/auth/register/+server.ts constant PASSWORD_MIN_LENGTH (line 10) | const PASSWORD_MIN_LENGTH = 8; constant PASSWORD_REGEX (line 11) | const PASSWORD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/; function POST (line 13) | async function POST({ request, getClientAddress }: RequestEvent) { FILE: src/routes/api/auth/reset-password/request/+server.ts function POST (line 6) | async function POST({ request }: RequestEvent) { FILE: src/routes/api/auth/reset-password/reset/+server.ts constant PASSWORD_MIN_LENGTH (line 6) | const PASSWORD_MIN_LENGTH = 8; constant PASSWORD_REGEX (line 7) | const PASSWORD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/; function POST (line 9) | async function POST({ request }: RequestEvent) { FILE: src/routes/api/captcha/+server.ts function GET (line 12) | async function GET({ getClientAddress }: RequestEvent) { function POST (line 22) | async function POST({ request }: RequestEvent) { FILE: src/routes/api/comments/+server.ts function validateNumericInput (line 20) | function validateNumericInput(value: string | null, min: number, max: nu... function checkQueryComplexity (line 27) | function checkQueryComplexity(params: URLSearchParams): boolean { function GET (line 37) | async function GET({ url, cookies, getClientAddress }: RequestEvent) { function POST (line 92) | async function POST({ request, cookies, getClientAddress }: RequestEvent) { function DELETE (line 131) | async function DELETE({ url, cookies, getClientAddress }: RequestEvent) { function checkRateLimit (line 155) | function checkRateLimit(ip: string): boolean { FILE: src/routes/api/comments/[id]/+server.ts function DELETE (line 6) | async function DELETE(event: RequestEvent) { FILE: src/routes/api/comments/[id]/flag/+server.ts function POST (line 12) | async function POST({ params, request, cookies }: RequestEvent) { function DELETE (line 68) | async function DELETE({ params, cookies }: RequestEvent) { FILE: src/routes/api/comments/[id]/unflag/+server.ts function POST (line 6) | async function POST(event: RequestEvent) { FILE: src/routes/api/comments/flagged/+server.ts function GET (line 8) | async function GET(event: RequestEvent) { FILE: src/routes/api/comments/like/+server.ts function POST (line 13) | async function POST({ request, cookies }: RequestEvent) { function GET (line 96) | async function GET({ url, cookies }: RequestEvent) { FILE: src/routes/api/image/[...path]/+server.ts constant ALLOWED_SIZES (line 6) | const ALLOWED_SIZES = new Set([ constant PATH_PATTERN (line 12) | const PATH_PATTERN = /^[a-zA-Z0-9_\-./]+$/; function GET (line 14) | async function GET({ params, fetch }: RequestEvent) { FILE: src/routes/api/movies/+server.ts function GET (line 6) | async function GET({ fetch, url }: RequestEvent) { FILE: src/routes/api/movies/trending/+server.ts function GET (line 5) | async function GET({ fetch }: RequestEvent) { FILE: src/routes/api/providers/+server.ts function validateProviderUrl (line 5) | function validateProviderUrl(url: string | undefined): string | null { function GET (line 20) | async function GET() { FILE: src/routes/api/release-info/[type]/[id]/+server.ts type ReleaseDate (line 5) | interface ReleaseDate { type ReleaseDateResult (line 13) | interface ReleaseDateResult { type WatchProviderRegion (line 18) | interface WatchProviderRegion { function GET (line 24) | async function GET({ params, fetch }: RequestEvent) { FILE: src/routes/api/tv/+server.ts function GET (line 6) | async function GET({ fetch, url }: RequestEvent) { FILE: src/routes/api/tv/[id]/season/[season]/+server.ts type Episode (line 5) | interface Episode { type SeasonResponse (line 17) | interface SeasonResponse { function GET (line 21) | async function GET({ params, fetch }: RequestEvent) { FILE: src/routes/api/tv/[id]/seasons/+server.ts function GET (line 5) | async function GET({ params, fetch }: RequestEvent) { FILE: src/routes/api/tv/trending/+server.ts function GET (line 5) | async function GET({ fetch }: RequestEvent) { FILE: src/routes/api/users/search/+server.ts function escapeLikePattern (line 5) | function escapeLikePattern(pattern: string): string { function GET (line 9) | async function GET({ url, locals }: RequestEvent) { FILE: src/routes/api/watchlist/+server.ts function GET (line 22) | async function GET({ locals }: RequestEvent) { function POST (line 36) | async function POST({ request, locals }: RequestEvent) { function DELETE (line 69) | async function DELETE({ request, locals }: RequestEvent) { FILE: src/routes/api/watchlist/check/+server.ts function GET (line 6) | async function GET({ url, locals }: RequestEvent) { FILE: src/routes/media/[id]/+page.server.ts type PageData (line 6) | interface PageData { FILE: src/routes/movies/+page.server.ts function fetchFilteredMovies (line 41) | async function fetchFilteredMovies(filters: FilterOptions) { FILE: src/routes/tv/+page.server.ts function fetchFilteredShows (line 41) | async function fetchFilteredShows(filters: FilterOptions) {