SYMBOL INDEX (1951 symbols across 494 files) FILE: app/(auth)/forgot-password/layout.tsx function ForgotPasswordLayout (line 9) | function ForgotPasswordLayout({ FILE: app/(auth)/forgot-password/page.tsx type ForgotPasswordFormValues (line 38) | type ForgotPasswordFormValues = z.infer; function ForgotPasswordPage (line 123) | function ForgotPasswordPage() { FILE: app/(auth)/layout.tsx function AuthLayout (line 7) | function AuthLayout({ FILE: app/(auth)/login/layout.tsx function RegisterLayout (line 9) | function RegisterLayout({ FILE: app/(auth)/login/page.tsx type EmailForm (line 53) | type EmailForm = z.infer type PasswordForm (line 54) | type PasswordForm = z.infer type UserPreview (line 56) | interface UserPreview { type OAuthProvider (line 62) | interface OAuthProvider { type PasswordBreachData (line 69) | interface PasswordBreachData { function LoginPage (line 136) | function LoginPage() { FILE: app/(auth)/oauth-callback/layout.tsx function OAuthCallbackLayout (line 4) | async function OAuthCallbackLayout({ FILE: app/(auth)/oauth-callback/page.tsx function OAuthCallback (line 7) | function OAuthCallback() { FILE: app/(auth)/register/[token]/layout.tsx function RegisterLayout (line 9) | function RegisterLayout({ FILE: app/(auth)/register/[token]/page.tsx type RegisterForm (line 28) | type RegisterForm = z.infer type InvitationInfo (line 30) | interface InvitationInfo { function RegisterPage (line 98) | function RegisterPage({params}: { params: Promise<{ token: string }> }) { FILE: app/(auth)/reset-password/[token]/layout.tsx function ResetPasswordLayout (line 9) | function ResetPasswordLayout({ FILE: app/(auth)/reset-password/[token]/page.tsx function ResetPasswordPage (line 5) | async function ResetPasswordPage({ FILE: app/(auth)/reset-password/[token]/reset-password-form.tsx type ResetPasswordForm (line 36) | type ResetPasswordForm = z.infer; function ResetPasswordForm (line 100) | function ResetPasswordForm({ token }: { token: string }) { FILE: app/(auth)/setup/layout.tsx function SetupLayout (line 9) | function SetupLayout({ FILE: app/(auth)/setup/page.tsx function StepIndicator (line 17) | function StepIndicator() { function SetupContent (line 40) | function SetupContent() { function SetupPage (line 89) | function SetupPage() { FILE: app/(auth)/two-factor/layout.tsx function TwoFactorLayout (line 9) | function TwoFactorLayout({ FILE: app/(auth)/two-factor/page.tsx type PasswordForm (line 25) | type PasswordForm = z.infer function TwoFactorPage (line 27) | function TwoFactorPage() { FILE: app/(email)/unsubscribed/page.tsx function UnsubscribedContent (line 7) | function UnsubscribedContent(): JSX.Element { function UnsubscribedPage (line 49) | function UnsubscribedPage(): JSX.Element { FILE: app/.well-known/acme-challenge/[token]/route.ts function GET (line 7) | async function GET( FILE: app/.well-known/acme-challenge/route.ts function GET (line 7) | async function GET(request: NextRequest) { FILE: app/api-docs/route.ts constant GET (line 10) | const GET = ApiReference(config) FILE: app/api/acme/cancel/[certId]/route.ts function POST (line 6) | async function POST( FILE: app/api/acme/issue/route.ts type IssueRequest (line 11) | interface IssueRequest { function POST (line 16) | async function POST(request: NextRequest) { FILE: app/api/acme/renew/[certId]/route.ts function POST (line 7) | async function POST( FILE: app/api/acme/revoke/[certId]/route.ts function POST (line 8) | async function POST( FILE: app/api/acme/status/[certId]/route.ts function GET (line 7) | async function GET( FILE: app/api/acme/verify-dns/route.ts type VerifyDnsRequest (line 8) | interface VerifyDnsRequest { function POST (line 12) | async function POST(request: NextRequest) { FILE: app/api/admin/ai-settings/route.ts type AISettingsResponse (line 8) | interface AISettingsResponse { type AISettingsUpdateRequest (line 14) | interface AISettingsUpdateRequest { type SystemConfigUpdate (line 20) | interface SystemConfigUpdate { function GET (line 42) | async function GET() { function POST (line 116) | async function POST(request: Request) { FILE: app/api/admin/ai-settings/test-key/route.ts type APIKeyRequest (line 6) | interface APIKeyRequest { type APIKeyResponse (line 10) | interface APIKeyResponse { function POST (line 37) | async function POST(request: Request) { FILE: app/api/admin/analytics/route.ts function GET (line 89) | async function GET(request: Request) { FILE: app/api/admin/api-keys/[keyId]/route.ts function GET (line 51) | async function GET( function PATCH (line 165) | async function PATCH( function DELETE (line 305) | async function DELETE( FILE: app/api/admin/api-keys/route.ts function GET (line 49) | async function GET() { function POST (line 154) | async function POST(request: Request) { FILE: app/api/admin/audit-logs/actions/route.ts function GET (line 26) | async function GET() { FILE: app/api/admin/audit-logs/route.ts type PreservedUserData (line 6) | interface PreservedUserData { type AuditLogDetails (line 15) | interface AuditLogDetails { type DatabaseAuditLog (line 49) | interface DatabaseAuditLog { type ProcessedUserInfo (line 66) | interface ProcessedUserInfo { type ProcessedAuditLog (line 72) | interface ProcessedAuditLog extends Omit function POST (line 72) | async function POST(request: NextRequest) { function GET (line 388) | async function GET(request: Request) { FILE: app/api/auth/login/second-factor/route.ts function POST (line 18) | async function POST(request: Request) { FILE: app/api/auth/logout/route.ts function POST (line 17) | async function POST() { FILE: app/api/auth/me/route.ts function GET (line 23) | async function GET() { FILE: app/api/auth/oauth/authorize/[providerName]/route.ts function GET (line 18) | async function GET( FILE: app/api/auth/oauth/callback/[providerName]/route.ts function GET (line 20) | async function GET( FILE: app/api/auth/oauth/providers/route.ts function GET (line 26) | async function GET() { FILE: app/api/auth/passkeys/[id]/route.ts function DELETE (line 5) | async function DELETE( FILE: app/api/auth/passkeys/authenticate/options/route.ts function POST (line 5) | async function POST(request: Request) { FILE: app/api/auth/passkeys/authenticate/verify/route.ts function POST (line 9) | async function POST(request: Request) { FILE: app/api/auth/passkeys/register/options/route.ts function POST (line 6) | async function POST() { FILE: app/api/auth/passkeys/register/verify/route.ts function POST (line 7) | async function POST(request: Request) { FILE: app/api/auth/passkeys/route.ts function GET (line 5) | async function GET() { FILE: app/api/auth/preview/route.ts function POST (line 15) | async function POST(request: Request) { FILE: app/api/auth/refresh/route.ts function POST (line 32) | async function POST(request: Request) { FILE: app/api/auth/register/route.ts function POST (line 29) | async function POST(request: NextRequest) { FILE: app/api/auth/reset-password/[token]/route.ts function GET (line 47) | async function GET( function POST (line 119) | async function POST( FILE: app/api/auth/reset-password/request/route.ts function POST (line 18) | async function POST() { FILE: app/api/auth/saml/authorize/[providerName]/route.ts function GET (line 8) | async function GET( FILE: app/api/auth/saml/callback/[providerName]/route.ts function POST (line 9) | async function POST( FILE: app/api/auth/saml/metadata/[providerName]/route.ts function GET (line 8) | async function GET( FILE: app/api/auth/saml/providers/route.ts function GET (line 8) | async function GET() { FILE: app/api/auth/security-settings/route.ts function GET (line 10) | async function GET() { function PATCH (line 34) | async function PATCH(request: Request) { FILE: app/api/auth/settings/route.ts function GET (line 23) | async function GET() { function PATCH (line 72) | async function PATCH(request: Request) { FILE: app/api/auth/validate/route.ts function GET (line 35) | async function GET(request: NextRequest) { FILE: app/api/avatar/[hash]/route.ts function GET (line 7) | async function GET( FILE: app/api/changelog/[projectId]/entries/all/route.ts constant ITEMS_PER_PAGE (line 4) | const ITEMS_PER_PAGE = 10 type SortOrder (line 7) | type SortOrder = 'asc' | 'desc' type BaseWhereClause (line 10) | interface BaseWhereClause { type SearchCondition (line 21) | interface SearchCondition { type CursorCondition (line 26) | interface CursorCondition { function GET (line 42) | async function GET( FILE: app/api/changelog/[projectId]/entries/route.ts constant ITEMS_PER_PAGE (line 4) | const ITEMS_PER_PAGE = 10 type SortOrder (line 7) | type SortOrder = 'asc' | 'desc' type BaseWhereClause (line 10) | interface BaseWhereClause { type SearchCondition (line 21) | interface SearchCondition { type CursorCondition (line 26) | interface CursorCondition { function GET (line 83) | async function GET( FILE: app/api/changelog/entries/[entryId]/route.ts function getProjectIdFromEntry (line 15) | async function getProjectIdFromEntry(entryId: string) { function GET (line 63) | async function GET( function PUT (line 238) | async function PUT( function DELETE (line 345) | async function DELETE( FILE: app/api/changelog/requests/[requestId]/route.ts function PATCH (line 48) | async function PATCH( FILE: app/api/changelog/requests/route.ts function GET (line 70) | async function GET(request: Request) { function POST (line 177) | async function POST(request: Request) { FILE: app/api/changelog/subscribe/route.ts type SubscribeRequest (line 6) | interface SubscribeRequest { type SubscribeResponse (line 14) | interface SubscribeResponse { type ErrorResponse (line 19) | interface ErrorResponse { function POST (line 28) | async function POST(request: Request): Promise; type CatchUpEntry (line 32) | interface CatchUpEntry { function POST (line 93) | async function POST( function createPrompt (line 236) | function createPrompt(projectName: string, entries: CatchUpEntry[], from... FILE: app/api/projects/[projectId]/catch-up/route.ts function GET (line 85) | async function GET( FILE: app/api/projects/[projectId]/changelog/[entryId]/route.ts function GET (line 56) | async function GET( function PUT (line 277) | async function PUT( function PATCH (line 547) | async function PATCH( function DELETE (line 1013) | async function DELETE( FILE: app/api/projects/[projectId]/changelog/[entryId]/schedule/approval/route.ts type ScheduleApprovalBody (line 16) | interface ScheduleApprovalBody { function POST (line 68) | async function POST( FILE: app/api/projects/[projectId]/changelog/[entryId]/schedule/route.ts type ScheduleRequestBody (line 14) | interface ScheduleRequestBody { function POST (line 77) | async function POST( function GET (line 349) | async function GET( FILE: app/api/projects/[projectId]/changelog/route.ts function GET (line 58) | async function GET( function POST (line 304) | async function POST( FILE: app/api/projects/[projectId]/changelog/tags/[tagId]/route.ts function GET (line 30) | async function GET( function PATCH (line 112) | async function PATCH( function DELETE (line 241) | async function DELETE( FILE: app/api/projects/[projectId]/changelog/tags/route.ts constant DEFAULT_PAGE_SIZE (line 8) | const DEFAULT_PAGE_SIZE = 20; constant MAX_PAGE_SIZE (line 9) | const MAX_PAGE_SIZE = 100; function GET (line 58) | async function GET( function POST (line 217) | async function POST( function PATCH (line 382) | async function PATCH( function DELETE (line 548) | async function DELETE( FILE: app/api/projects/[projectId]/cli/link/route.ts function POST (line 60) | async function POST( FILE: app/api/projects/[projectId]/cli/sync/route.ts type SyncMetadata (line 18) | interface SyncMetadata { function POST (line 118) | async function POST( function processSyncRequest (line 226) | async function processSyncRequest( FILE: app/api/projects/[projectId]/cli/sync/status/route.ts function GET (line 57) | async function GET( FILE: app/api/projects/[projectId]/cli/unlink/route.ts function POST (line 54) | async function POST( FILE: app/api/projects/[projectId]/integrations/email/route.ts function GET (line 24) | async function GET( function POST (line 79) | async function POST( FILE: app/api/projects/[projectId]/integrations/email/send/route.ts function POST (line 31) | async function POST( FILE: app/api/projects/[projectId]/integrations/email/test/route.ts function POST (line 24) | async function POST( FILE: app/api/projects/[projectId]/integrations/github/generate/route.ts function POST (line 47) | async function POST( FILE: app/api/projects/[projectId]/integrations/github/route.ts function GET (line 27) | async function GET( function POST (line 68) | async function POST( function DELETE (line 209) | async function DELETE( FILE: app/api/projects/[projectId]/integrations/github/tags/route.ts function GET (line 13) | async function GET( FILE: app/api/projects/[projectId]/integrations/github/test/route.ts function POST (line 15) | async function POST( FILE: app/api/projects/[projectId]/integrations/slack/channels/route.ts function GET (line 10) | async function GET( FILE: app/api/projects/[projectId]/integrations/slack/route.ts function GET (line 9) | async function GET( function PUT (line 60) | async function PUT( function DELETE (line 120) | async function DELETE( FILE: app/api/projects/[projectId]/route.ts function GET (line 46) | async function GET( function PATCH (line 116) | async function PATCH( function DELETE (line 157) | async function DELETE( FILE: app/api/projects/[projectId]/settings/route.ts function GET (line 39) | async function GET( function PATCH (line 176) | async function PATCH( FILE: app/api/projects/[projectId]/versions/route.ts function GET (line 21) | async function GET(request: Request, context: { params: Promise<{ projec... FILE: app/api/projects/import/canny/fetch/route.ts function POST (line 6) | async function POST(request: NextRequest) { FILE: app/api/projects/import/canny/validate/route.ts function POST (line 4) | async function POST(request: NextRequest) { FILE: app/api/projects/import/parse/route.ts function POST (line 6) | async function POST(request: NextRequest) { FILE: app/api/projects/import/process/route.ts type AuthenticatedUser (line 12) | interface AuthenticatedUser { function POST (line 19) | async function POST(request: NextRequest) { function GET (line 168) | async function GET(request: NextRequest) { FILE: app/api/projects/route.ts function GET (line 37) | async function GET() { function POST (line 113) | async function POST(request: Request) { FILE: app/api/requests/route.ts function GET (line 51) | async function GET() { FILE: app/api/search/route.ts constant ENABLE_TAGS (line 9) | const ENABLE_TAGS = false; function getUserFromRequest (line 29) | async function getUserFromRequest(request: NextRequest) { function POST (line 69) | async function POST(request: NextRequest) { function GET (line 156) | async function GET(request: NextRequest) { FILE: app/api/setup/admin/route.ts function POST (line 61) | async function POST(request: Request) { function GET (line 139) | async function GET() { FILE: app/api/setup/invitations/route.ts function POST (line 64) | async function POST(request: Request) { function GET (line 186) | async function GET() { FILE: app/api/setup/oauth/auto/route.ts function POST (line 73) | async function POST(request: Request) { function GET (line 227) | async function GET() { FILE: app/api/setup/oauth/debug/route.ts function GET (line 14) | async function GET() { function POST (line 62) | async function POST(request: Request) { FILE: app/api/setup/oauth/route.ts function POST (line 21) | async function POST(request: Request) { FILE: app/api/setup/route.ts function GET (line 11) | async function GET() { FILE: app/api/setup/settings/route.ts function POST (line 137) | async function POST(request: Request) { function GET (line 226) | async function GET() { FILE: app/api/setup/status/route.ts function GET (line 26) | async function GET() { FILE: app/api/setup/types.ts type SetupProgress (line 13) | type SetupProgress = z.infer; FILE: app/api/subscribers/[subscriberId]/route.ts function PATCH (line 19) | async function PATCH( function DELETE (line 118) | async function DELETE( FILE: app/api/subscribers/generate-mock/route.ts function POST (line 12) | async function POST(request: Request) { FILE: app/api/subscribers/route.ts function POST (line 11) | async function POST(request: Request) { function GET (line 116) | async function GET(request: Request) { FILE: app/api/system/agent-version/route.ts function GET (line 9) | async function GET() { FILE: app/api/system/easypanel/status/route.ts type EasypanelStatusResponse (line 5) | interface EasypanelStatusResponse { function GET (line 42) | async function GET(request: NextRequest) { FILE: app/api/system/perform-update/route.ts type PerformUpdateRequest (line 8) | interface PerformUpdateRequest { function POST (line 49) | async function POST(request: NextRequest) { FILE: app/api/system/update-status/route.ts function GET (line 30) | async function GET(request: NextRequest) { FILE: app/api/system/version/route.ts function GET (line 4) | async function GET(): Promise { FILE: app/api/telemetry/config/route.ts function GET (line 5) | async function GET() { function POST (line 18) | async function POST(request: NextRequest) { FILE: app/api/telemetry/debug/route.ts function GET (line 5) | async function GET() { function POST (line 39) | async function POST(request: NextRequest) { FILE: app/changelog/[projectId]/[entryId]/page.tsx type ChangelogEntry (line 15) | interface ChangelogEntry { type EntryResponse (line 32) | interface EntryResponse { type EntryPageProps (line 41) | type EntryPageProps = { function EntryPage (line 45) | function EntryPage({params}: EntryPageProps) { FILE: app/changelog/[projectId]/changelog-view.tsx type ChangelogEntry (line 12) | interface ChangelogEntry { type ChangelogData (line 21) | interface ChangelogData { type ChangelogViewProps (line 29) | interface ChangelogViewProps { function useEntryViewTracking (line 34) | function useEntryViewTracking(entryId: string, projectId: string) { function ChangelogEntry (line 80) | function ChangelogEntry({ entry, projectId, timezone }: { entry: Changel... function ChangelogView (line 150) | function ChangelogView({ data }: ChangelogViewProps) { FILE: app/changelog/[projectId]/layout.tsx type ChangelogLayoutProps (line 7) | interface ChangelogLayoutProps { function generateMetadata (line 12) | async function generateMetadata( function ChangelogLayout (line 27) | async function ChangelogLayout({ children, params }: ChangelogLayoutProp... FILE: app/changelog/[projectId]/loading.tsx function Loading (line 5) | function Loading() { FILE: app/changelog/[projectId]/not-found.tsx function NotFound (line 5) | function NotFound() { FILE: app/changelog/[projectId]/page.tsx type ChangelogResponse (line 20) | interface ChangelogResponse { type ChangelogPageProps (line 35) | type ChangelogPageProps = { function getInitialData (line 39) | async function getInitialData(projectId: string): Promise(value: T, delay: number = 500): T { function AuditLogsPage (line 231) | function AuditLogsPage() { FILE: app/dashboard/admin/domains/page.tsx type DomainStats (line 55) | interface DomainStats { function AdminDomainsPage (line 63) | function AdminDomainsPage() { FILE: app/dashboard/admin/layout.tsx function AdminLayout (line 108) | function AdminLayout({ children }: { children: React.ReactNode }) { FILE: app/dashboard/admin/oauth/page.tsx type ProviderFormValues (line 113) | type ProviderFormValues = z.infer; constant PROVIDER_PRESETS (line 116) | const PROVIDER_PRESETS = { type OAuthProvider (line 169) | interface OAuthProvider { type ProviderApiData (line 186) | interface ProviderApiData { type SAMLProvider (line 315) | interface SAMLProvider { type SAMLProviderFormValues (line 347) | type SAMLProviderFormValues = z.infer; function OAuthProvidersPage (line 349) | function OAuthProvidersPage() { type ProvidersListProps (line 2505) | interface ProvidersListProps { type SAMLProvidersListProps (line 2713) | interface SAMLProvidersListProps { FILE: app/dashboard/admin/page.tsx type AdminDashboardData (line 24) | interface AdminDashboardData { function AdminOverviewPage (line 44) | function AdminOverviewPage() { FILE: app/dashboard/admin/requests/page.tsx function AdminRequestsPage (line 3) | function AdminRequestsPage() { FILE: app/dashboard/admin/system/email/page.tsx type SystemEmailConfig (line 67) | type SystemEmailConfig = z.infer; function SystemEmailConfigPage (line 69) | function SystemEmailConfigPage() { FILE: app/dashboard/admin/system/page.tsx function buildConfigSchema (line 77) | function buildConfigSchema(sponsored: boolean) { type SystemConfig (line 93) | type SystemConfig = { function SystemConfigPage (line 111) | function SystemConfigPage() { FILE: app/dashboard/admin/system/slack/page.tsx type SlackOAuthConfig (line 57) | type SlackOAuthConfig = z.infer; function SystemSlackConfigPage (line 59) | function SystemSlackConfigPage() { FILE: app/dashboard/admin/system/templates/page.tsx type DateTemplate (line 31) | interface DateTemplate { type SystemConfig (line 36) | interface SystemConfig { constant TEMPLATE_VARIABLES (line 43) | const TEMPLATE_VARIABLES = [ constant DEFAULT_TEMPLATES (line 64) | const DEFAULT_TEMPLATES: DateTemplate[] = [ function resolvePreview (line 70) | function resolvePreview(format: string, timezone: string): string { function VersionTemplatesPage (line 111) | function VersionTemplatesPage() { FILE: app/dashboard/admin/users/page.tsx type UserData (line 66) | interface UserData { type InvitationLink (line 75) | interface InvitationLink { function UsersPage (line 85) | function UsersPage() { FILE: app/dashboard/bookmarks/page.tsx type Project (line 41) | interface Project { type EnhancedBookmark (line 47) | interface EnhancedBookmark extends BookmarkedItem { type SortOption (line 57) | type SortOption = 'recent' | 'alphabetical' | 'project' function BookmarksPage (line 59) | function BookmarksPage() { type BookmarkRowProps (line 442) | interface BookmarkRowProps { function BookmarkRow (line 447) | function BookmarkRow({bookmark, onRemove}: BookmarkRowProps) { FILE: app/dashboard/layout.tsx constant NAV_SECTIONS (line 37) | const NAV_SECTIONS: NavSection[] = [ function LoadingScreen (line 152) | function LoadingScreen() { function DashboardLayout (line 164) | function DashboardLayout({ FILE: app/dashboard/page.tsx type StatsCardProps (line 170) | interface StatsCardProps { type QuickActionProps (line 199) | interface QuickActionProps { function DashboardPage (line 233) | function DashboardPage() { FILE: app/dashboard/projects/[projectId]/analytics/page.tsx function ProjectAnalyticsPage (line 54) | function ProjectAnalyticsPage() { FILE: app/dashboard/projects/[projectId]/api-keys/page.tsx type ApiKey (line 68) | interface ApiKey { type RenameDialogProps (line 87) | interface RenameDialogProps { function RenameDialog (line 94) | function RenameDialog({ function NewKeyAlert (line 161) | function NewKeyAlert({ keyData, onClose, onCopy }: { keyData: { key: str... function ProjectApiKeysPage (line 208) | function ProjectApiKeysPage() { FILE: app/dashboard/projects/[projectId]/catch-up/page.tsx type CatchUpPageProps (line 18) | interface CatchUpPageProps { type ProjectSummaryResponse (line 22) | interface ProjectSummaryResponse { function CatchUpPage (line 41) | function CatchUpPage({params}: CatchUpPageProps) { FILE: app/dashboard/projects/[projectId]/changelog/[entryId]/page.tsx type ChangelogPageProps (line 6) | interface ChangelogPageProps { function ChangelogEntryPage (line 13) | function ChangelogEntryPage({ params }: ChangelogPageProps) { FILE: app/dashboard/projects/[projectId]/changelog/new/page.tsx type NewChangelogPageProps (line 8) | interface NewChangelogPageProps { function NewChangelogEntryPage (line 14) | function NewChangelogEntryPage({ params }: NewChangelogPageProps) { FILE: app/dashboard/projects/[projectId]/changelog/page.tsx type ChangelogPageProps (line 18) | interface ChangelogPageProps { type ViewMode (line 22) | type ViewMode = 'grid' | 'list' type SortOrder (line 23) | type SortOrder = 'newest' | 'oldest' | 'version' function ChangelogPage (line 25) | function ChangelogPage({params}: ChangelogPageProps) { FILE: app/dashboard/projects/[projectId]/domains/[domain]/client.tsx type DomainSettingsClientProps (line 32) | interface DomainSettingsClientProps { function DomainSettingsClient (line 37) | function DomainSettingsClient({ projectId, domain: domainName }: DomainS... FILE: app/dashboard/projects/[projectId]/domains/[domain]/page.tsx type DomainSettingsPageProps (line 9) | interface DomainSettingsPageProps { function DomainSettingsPage (line 16) | async function DomainSettingsPage({ params }: DomainSettingsPageProps) { FILE: app/dashboard/projects/[projectId]/domains/components/DomainCard.tsx type DomainCardProps (line 31) | interface DomainCardProps { function DomainCard (line 41) | function DomainCard({ FILE: app/dashboard/projects/[projectId]/domains/components/InlineSSLSetup.tsx type InlineSSLSetupProps (line 22) | interface InlineSSLSetupProps { type SSLStep (line 29) | type SSLStep = 'choose' | 'http01-progress' | 'dns01-instructions' | 'dn... function InlineSSLSetup (line 31) | function InlineSSLSetup({ FILE: app/dashboard/projects/[projectId]/domains/components/SSLCertificateCard.tsx type SSLCertificateCardProps (line 33) | interface SSLCertificateCardProps { function SSLCertificateCard (line 40) | function SSLCertificateCard({ domain, onUpdate, onError, onSuccess }: SS... FILE: app/dashboard/projects/[projectId]/domains/components/SSLCertificateWizard.tsx type SSLCertificateWizardProps (line 30) | interface SSLCertificateWizardProps { type Step (line 40) | type Step = 'select-method' | 'http01-progress' | 'dns01-instructions' |... function SSLCertificateWizard (line 42) | function SSLCertificateWizard({ FILE: app/dashboard/projects/[projectId]/domains/components/SSLManagement.tsx type SSLManagementProps (line 34) | interface SSLManagementProps { type SSLMode (line 41) | type SSLMode = 'LETS_ENCRYPT' | 'EXTERNAL' | 'NONE' type SetupStep (line 42) | type SetupStep = 'choose-mode' | 'choose-method' | 'http01-progress' | '... function SSLManagement (line 44) | function SSLManagement({ FILE: app/dashboard/projects/[projectId]/domains/components/ssl/ExternalSSLManagement.tsx type BrowserRule (line 32) | interface BrowserRule { type ThrottleConfig (line 39) | interface ThrottleConfig { type ExternalSSLManagementProps (line 45) | interface ExternalSSLManagementProps { function ExternalSSLManagement (line 55) | function ExternalSSLManagement({ FILE: app/dashboard/projects/[projectId]/domains/components/ssl/SSLCertificateActions.tsx type SSLCertificateActionsProps (line 10) | interface SSLCertificateActionsProps { function SSLCertificateActions (line 20) | function SSLCertificateActions({ FILE: app/dashboard/projects/[projectId]/domains/components/ssl/SSLCertificateStatus.tsx type SSLCertificateStatusProps (line 10) | interface SSLCertificateStatusProps { function SSLCertificateStatus (line 17) | function SSLCertificateStatus({ FILE: app/dashboard/projects/[projectId]/domains/components/ssl/SSLDNSInstructions.tsx type SSLDNSInstructionsProps (line 9) | interface SSLDNSInstructionsProps { function SSLDNSInstructions (line 19) | function SSLDNSInstructions({ FILE: app/dashboard/projects/[projectId]/domains/components/ssl/SSLModeSelector.tsx type SSLModeSelectorProps (line 6) | interface SSLModeSelectorProps { function SSLModeSelector (line 10) | function SSLModeSelector({ onSelectMode }: SSLModeSelectorProps) { FILE: app/dashboard/projects/[projectId]/domains/components/ssl/SSLVerificationMethod.tsx type SSLVerificationMethodProps (line 7) | interface SSLVerificationMethodProps { function SSLVerificationMethod (line 13) | function SSLVerificationMethod({ FILE: app/dashboard/projects/[projectId]/domains/components/ssl/SSLVerificationProgress.tsx type SSLVerificationProgressProps (line 7) | interface SSLVerificationProgressProps { function SSLVerificationProgress (line 12) | function SSLVerificationProgress({ type, onCancel }: SSLVerificationProg... FILE: app/dashboard/projects/[projectId]/domains/components/ssl/index.tsx type SSLManagementProps (line 20) | interface SSLManagementProps { type FlowStep (line 27) | type FlowStep = 'mode-select' | 'method-select' | 'dns-instructions' | '... function SSLManagement (line 29) | function SSLManagement({ domain, onUpdate, onError, onSuccess }: SSLMana... FILE: app/dashboard/projects/[projectId]/domains/page.tsx type ProjectDomainSettingsProps (line 27) | interface ProjectDomainSettingsProps { function ProjectDomainSettings (line 68) | function ProjectDomainSettings({ params }: ProjectDomainSettingsProps) { FILE: app/dashboard/projects/[projectId]/import/page.tsx type Project (line 35) | interface Project { type ImportPageProps (line 53) | interface ImportPageProps { function ImportPage (line 63) | function ImportPage({params}: ImportPageProps) { FILE: app/dashboard/projects/[projectId]/integrations/email/page.tsx type EmailConfig (line 66) | interface EmailConfig { type ChangelogEntry (line 82) | interface ChangelogEntry { type Project (line 93) | interface Project { type FormValues (line 127) | type FormValues = z.infer; type TestEmailFormValues (line 134) | type TestEmailFormValues = z.infer; type SendEmailFormValues (line 146) | type SendEmailFormValues = z.infer; function EmailIntegrationPage (line 148) | function EmailIntegrationPage() { FILE: app/dashboard/projects/[projectId]/integrations/email/subscribers/page.tsx type SubscriberFormValues (line 91) | type SubscriberFormValues = z.infer; type UpdateSubscriberFormValues (line 99) | type UpdateSubscriberFormValues = z.infer; type Subscriber (line 101) | type Subscriber = { function SubscribersPage (line 110) | function SubscribersPage() { FILE: app/dashboard/projects/[projectId]/integrations/github/page.tsx type Project (line 41) | interface Project { type GitHubIntegration (line 48) | interface GitHubIntegration { type RepositoryStats (line 62) | interface RepositoryStats { function GitHubIntegrationPage (line 75) | function GitHubIntegrationPage() { FILE: app/dashboard/projects/[projectId]/integrations/slack/page.tsx type SlackIntegration (line 62) | interface SlackIntegration { type Project (line 81) | interface Project { type FormValues (line 94) | type FormValues = z.infer; function SlackIntegrationPage (line 96) | function SlackIntegrationPage() { FILE: app/dashboard/projects/[projectId]/integrations/widget/[widgetId]/page.tsx type WidgetEditPageProps (line 5) | interface WidgetEditPageProps { function WidgetEditPage (line 9) | async function WidgetEditPage({params}: WidgetEditPageProps) { FILE: app/dashboard/projects/[projectId]/integrations/widget/[widgetId]/widget-editor.tsx type WidgetEditorProps (line 97) | interface WidgetEditorProps { function WidgetEditor (line 102) | function WidgetEditor({widget: initialWidget, projectId}: WidgetEditorPr... FILE: app/dashboard/projects/[projectId]/integrations/widget/page.tsx type WidgetPageProps (line 4) | interface WidgetPageProps { function WidgetPage (line 8) | async function WidgetPage({params}: WidgetPageProps) { FILE: app/dashboard/projects/[projectId]/integrations/widget/widget-config.tsx constant MIN_ENTRIES (line 99) | const MIN_ENTRIES = 1; constant MAX_ENTRIES (line 100) | const MAX_ENTRIES = 10; constant DEFAULT_ENTRIES (line 101) | const DEFAULT_ENTRIES = 3; type WidgetConfig (line 104) | interface WidgetConfig { type CodeExample (line 114) | interface CodeExample { constant CODE_EXAMPLES (line 120) | const CODE_EXAMPLES: CodeExample[] = [ type CodeInstallationProps (line 349) | interface CodeInstallationProps { function CodeInstallation (line 355) | function CodeInstallation({ config, projectId, codeExamples }: CodeInsta... function WidgetConfigContent (line 459) | function WidgetConfigContent({projectId}: { projectId: string }) { FILE: app/dashboard/projects/[projectId]/integrations/widget/widget-list.tsx type WidgetListProps (line 29) | interface WidgetListProps { function WidgetList (line 35) | function WidgetList({ projectId, initialWidgets, project }: WidgetListPr... FILE: app/dashboard/projects/[projectId]/layout.tsx function ProjectLayout (line 9) | function ProjectLayout({ FILE: app/dashboard/projects/[projectId]/page.tsx type Project (line 45) | interface Project { type User (line 67) | interface User { type ProjectPageProps (line 72) | interface ProjectPageProps { type QuickStatsCardProps (line 90) | interface QuickStatsCardProps { function QuickStatsCard (line 102) | function QuickStatsCard({ type ActionCardProps (line 142) | interface ActionCardProps { function ActionCard (line 154) | function ActionCard({ type RecentEntryCardProps (line 229) | interface RecentEntryCardProps { function RecentEntryCard (line 241) | function RecentEntryCard({entry, projectId}: RecentEntryCardProps) { function ProjectPage (line 295) | function ProjectPage({params}: ProjectPageProps) { FILE: app/dashboard/projects/[projectId]/settings/page.tsx type ProjectSettingsPageProps (line 48) | interface ProjectSettingsPageProps { type ProjectSettings (line 52) | interface ProjectSettings { function ProjectSettingsPage (line 62) | function ProjectSettingsPage({params}: ProjectSettingsPageProps) { FILE: app/dashboard/projects/new/page.tsx function NewProjectPage (line 21) | function NewProjectPage() { FILE: app/dashboard/projects/page.tsx type PageProps (line 8) | interface PageProps { function SettingsPageWrapper (line 12) | function SettingsPageWrapper({ }: PageProps) { FILE: app/dashboard/providers.tsx function Providers (line 6) | function Providers({ children }: { children: React.ReactNode }) { FILE: app/dashboard/requests/page.tsx type RequestData (line 35) | interface RequestData { function RequestsPage (line 60) | function RequestsPage() { FILE: app/dashboard/settings/page.tsx type FormState (line 36) | interface FormState { type TimezoneConfig (line 42) | interface TimezoneConfig { type OAuthProvider (line 48) | interface OAuthProvider { type OAuthConnection (line 55) | interface OAuthConnection { type SAMLProvider (line 65) | interface SAMLProvider { type SAMLConnection (line 72) | interface SAMLConnection { type SsoData (line 81) | interface SsoData { function SettingsPage (line 88) | function SettingsPage() { function ThemeButton (line 600) | function ThemeButton({ FILE: app/layout.tsx function RootLayout (line 18) | function RootLayout({ FILE: app/page.tsx type ChangelogType (line 37) | type ChangelogType = "feature" | "bugfix" | "improvement" | "breaking" |... type ChangelogEntry (line 39) | type ChangelogEntry = { constant CHANGE_TYPES (line 49) | const CHANGE_TYPES = [ constant CHANGELOG_ENTRIES (line 61) | const CHANGELOG_ENTRIES: ChangelogEntry[] = [ constant DAILY_CHALLENGE_ENTRIES (line 116) | const DAILY_CHALLENGE_ENTRIES: ChangelogEntry[] = [ function Home (line 125) | function Home() { function getTypeDescription (line 1221) | function getTypeDescription(type: string): string { FILE: app/startup.ts type EnvironmentValidationError (line 13) | interface EnvironmentValidationError extends Error { function createEnvironmentError (line 18) | function createEnvironmentError(missingVars: string[]): EnvironmentValid... function checkRequirements (line 27) | function checkRequirements(): void { function cleanup (line 50) | async function cleanup(): Promise { function launchGuide (line 63) | function launchGuide(missing: string[]): void { function startBackgroundServices (line 87) | async function startBackgroundServices(): Promise { FILE: components/CommandPalette.tsx type SearchResult (line 18) | interface SearchResult { type CommandPaletteProps (line 35) | interface CommandPaletteProps { constant ENABLE_TAGS (line 40) | const ENABLE_TAGS = false; function ChangelogCommandPalette (line 42) | function ChangelogCommandPalette({isOpen, onClose}: CommandPaletteProps) { FILE: components/DinoGame.tsx type DinoGameProps (line 10) | interface DinoGameProps { type Dino (line 15) | interface Dino { type Obstacle (line 27) | interface Obstacle { type Cloud (line 35) | interface Cloud { type GameState (line 43) | interface GameState { FILE: components/MarkdownEditor.tsx type DOMPurifyInterface (line 48) | interface DOMPurifyInterface { type MarkdownFeatures (line 68) | interface MarkdownFeatures { type RenderMarkdownProps (line 87) | interface RenderMarkdownProps { constant ALLOWED_TAGS (line 112) | const ALLOWED_TAGS = [ constant ALLOWED_ATTR (line 119) | const ALLOWED_ATTR = [ type SelectionAction (line 516) | interface SelectionAction { type MarkdownAction (line 524) | interface MarkdownAction { type HeadingAction (line 533) | interface HeadingAction extends SelectionAction { type EditorProps (line 537) | interface EditorProps { constant HEADING_ACTIONS (line 550) | const HEADING_ACTIONS: HeadingAction[] = [ constant SELECTION_ACTIONS (line 593) | const SELECTION_ACTIONS: SelectionAction[] = [ constant DEFAULT_ACTIONS (line 642) | const DEFAULT_ACTIONS: MarkdownAction[] = [ FILE: components/UpdateStatus.tsx type UpdateStatusProps (line 13) | interface UpdateStatusProps { type UpdateState (line 22) | type UpdateState = 'idle' | 'checking' | 'available' | 'no-update' | 'up... FILE: components/admin/api/PermissionsModal.tsx type PermissionsModalProps (line 20) | interface PermissionsModalProps { function PermissionsModal (line 27) | function PermissionsModal({ FILE: components/admin/api/Rename.tsx type RenameDialogProps (line 14) | interface RenameDialogProps { function RenameDialog (line 21) | function RenameDialog({ FILE: components/admin/audit-logs/VirtualizedList.tsx type AuditLog (line 12) | interface AuditLog { type VirtualizedListProps (line 29) | interface VirtualizedListProps { FILE: components/admin/requests/Management.tsx type RequestType (line 58) | type RequestType = 'DELETE_PROJECT' | 'DELETE_TAG' | 'DELETE_ENTRY' | 'A... constant REQUEST_TYPES (line 60) | const REQUEST_TYPES: Record; type ScheduleEntryDialogProps (line 49) | interface ScheduleEntryDialogProps { FILE: components/dashboard/WhatsNewModal.tsx type WhatsNewItem (line 20) | interface WhatsNewItem { type WhatsNewContent (line 26) | interface WhatsNewContent { type WhatsNewModalProps (line 34) | interface WhatsNewModalProps { FILE: components/github/GitHubGenerateDialog.tsx type GitHubTag (line 66) | interface GitHubTag { type GitHubRelease (line 71) | interface GitHubRelease { type AISettings (line 76) | interface AISettings { type GenerationOptions (line 82) | interface GenerationOptions { type GeneratedChangelog (line 94) | interface GeneratedChangelog { type GenerateResult (line 109) | interface GenerateResult { type Props (line 130) | interface Props { constant DEFAULT_OPTIONS (line 136) | const DEFAULT_OPTIONS: GenerationOptions = { function GitHubGenerateDialog (line 148) | function GitHubGenerateDialog({ FILE: components/github/GitHubIntegrationSettings.tsx type GitHubIntegration (line 36) | interface GitHubIntegration { type RepositoryInfo (line 51) | interface RepositoryInfo { type TestResult (line 62) | interface TestResult { constant DEFAULT_SETTINGS (line 74) | const DEFAULT_SETTINGS: GitHubIntegration = { function GitHubIntegrationSettings (line 89) | function GitHubIntegrationSettings({ projectId, projectName }: { project... FILE: components/loading-spinner.tsx function LoadingSpinner (line 5) | function LoadingSpinner() { FILE: components/markdown-editor/MarkdownEditor.tsx type MarkdownEditorProps (line 38) | interface MarkdownEditorProps { FILE: components/markdown-editor/MarkdownEditorArea.tsx type MarkdownEditorAreaProps (line 8) | interface MarkdownEditorAreaProps { FILE: components/markdown-editor/MarkdownPreview.tsx type MarkdownPreviewProps (line 8) | interface MarkdownPreviewProps { FILE: components/markdown-editor/MarkdownToolbar.tsx type ToolbarAction (line 46) | interface ToolbarAction { type ToolbarGroup (line 55) | interface ToolbarGroup { type ToolbarDropdown (line 60) | interface ToolbarDropdown { type MarkdownToolbarProps (line 66) | interface MarkdownToolbarProps { FILE: components/markdown-editor/RenderMarkdown.tsx type RenderMarkdownProps (line 7) | interface RenderMarkdownProps { FILE: components/markdown-editor/StatusBar.tsx type StatusBarProps (line 13) | interface StatusBarProps { function formatSaveTime (line 66) | function formatSaveTime(date: Date, timezone = 'UTC'): string { function StatusBar (line 107) | function StatusBar({ FILE: components/markdown-editor/ai/AIAssistantPanel.tsx type AIAssistantPanelProps (line 43) | interface AIAssistantPanelProps { function AIAssistantPanel (line 138) | function AIAssistantPanel({ FILE: components/markdown-editor/hooks/useCUMModals.ts type CUMModalState (line 6) | interface CUMModalState { type UseCUMModalsReturn (line 13) | interface UseCUMModalsReturn { function useCUMModals (line 20) | function useCUMModals(): UseCUMModalsReturn { FILE: components/markdown-editor/modals/CUMEmbedModal.tsx type EmbedProvider (line 38) | type EmbedProvider = typeof embedProviders[number]['value']; type EmbedOptions (line 40) | interface EmbedOptions { type CUMEmbedConfig (line 55) | interface CUMEmbedConfig { FILE: components/markdown-editor/types/cum-extensions.ts type CUMButtonConfig (line 1) | interface CUMButtonConfig { type CUMAlertConfig (line 11) | interface CUMAlertConfig { type CUMEmbedConfig (line 19) | interface CUMEmbedConfig { type CUMTableConfig (line 31) | interface CUMTableConfig { type CUMModalProps (line 39) | interface CUMModalProps { type CUMExtensionType (line 45) | type CUMExtensionType = 'button' | 'alert' | 'embed' | 'table'; FILE: components/markdown-editor/utils/formatting.ts type TextFormatOptions (line 8) | interface TextFormatOptions { constant FORMAT_OPTIONS (line 20) | const FORMAT_OPTIONS = { function formatText (line 49) | function formatText( function isEmptyLine (line 125) | function isEmptyLine(line: string): boolean { function lineStartsWith (line 132) | function lineStartsWith(line: string, prefix: string): boolean { function getIndentationLevel (line 139) | function getIndentationLevel(line: string): number { function addIndentation (line 147) | function addIndentation(line: string, spaces: number): string { function removeIndentation (line 154) | function removeIndentation(line: string, spaces: number): string { function toggleFormatting (line 163) | function toggleFormatting( function getTextMetrics (line 195) | function getTextMetrics(text: string): { words: number; chars: number; l... function positionToLineColumn (line 206) | function positionToLineColumn(text: string, position: number): { line: n... function getCurrentParagraph (line 217) | function getCurrentParagraph(text: string, position: number): { text: st... FILE: components/markdown-editor/utils/keyboard-shortcuts.ts type KeyboardShortcut (line 8) | interface KeyboardShortcut { type KeyboardShortcutsConfig (line 22) | interface KeyboardShortcutsConfig { constant DEFAULT_KEYBOARD_SHORTCUTS (line 31) | const DEFAULT_KEYBOARD_SHORTCUTS: KeyboardShortcut[] = [ function matchesShortcut (line 113) | function matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcu... function formatShortcut (line 132) | function formatShortcut(shortcut: KeyboardShortcut): string { function createShortcutHandler (line 162) | function createShortcutHandler(config: KeyboardShortcutsConfig) { function bindShortcutsToElement (line 201) | function bindShortcutsToElement( function bindGlobalShortcuts (line 236) | function bindGlobalShortcuts( function getShortcutMap (line 251) | function getShortcutMap(shortcuts: KeyboardShortcut[]): Record; function AdminStep (line 44) | function AdminStep({onNext, onBack}: AdminStepProps) { FILE: components/setup/steps/completion-step.tsx type CompletionStepProps (line 12) | type CompletionStepProps = Record; function CompletionStep (line 14) | function CompletionStep({}: CompletionStepProps) { FILE: components/setup/steps/oauth-step.tsx type OAuthStepProps (line 34) | interface OAuthStepProps { type AutoSetupStatus (line 39) | interface AutoSetupStatus { type AutoSetupResult (line 50) | interface AutoSetupResult { function OAuthStep (line 62) | function OAuthStep({onNext, onBack}: OAuthStepProps) { FILE: components/setup/steps/settings-step.tsx type SettingsStepProps (line 19) | interface SettingsStepProps { type SettingsFormValues (line 33) | type SettingsFormValues = z.infer; function SettingsStep (line 35) | function SettingsStep({ onNext, onBack }: SettingsStepProps) { FILE: components/setup/steps/team-step.tsx type TeamInviteStepProps (line 16) | interface TeamInviteStepProps { type Invitation (line 22) | interface Invitation { type TeamInviteState (line 32) | interface TeamInviteState { function TeamStep (line 41) | function TeamStep({onNext, onSkip}: TeamInviteStepProps) { FILE: components/setup/steps/welcome-step.tsx type WelcomeStepProps (line 7) | interface WelcomeStepProps { function WelcomeStep (line 11) | function WelcomeStep({ onNext }: WelcomeStepProps) { FILE: components/sso/ProviderLogo.tsx type ProviderLogoProps (line 3) | interface ProviderLogoProps { FILE: components/subscription-form.tsx type SubscriptionFormValues (line 22) | type SubscriptionFormValues = z.infer; type Update (line 24) | interface Update { type SubscriptionFormProps (line 29) | interface SubscriptionFormProps { type Step (line 35) | type Step = 'email' | 'name' | 'preferences' | 'success'; function SubscriptionForm (line 37) | function SubscriptionForm({ FILE: components/telemetry/PromptModal.tsx type TelemetryPromptModalProps (line 11) | interface TelemetryPromptModalProps { type ModalStep (line 17) | type ModalStep = 'initial' | 'confirmation' | 'final-plea'; FILE: components/theme-provider.tsx function ThemeSync (line 9) | function ThemeSync() { function ThemeProvider (line 68) | function ThemeProvider({ function useThemeWithLoading (line 88) | function useThemeWithLoading() { FILE: components/ui/alert.tsx type AlertProps (line 115) | interface AlertProps FILE: components/ui/badge.tsx function getContrastColor (line 95) | function getContrastColor(hexColor: string): string { type BadgeProps (line 103) | interface BadgeProps function Badge (line 111) | function Badge({ FILE: components/ui/breadcrumb.tsx function Breadcrumb (line 7) | function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { function BreadcrumbList (line 11) | function BreadcrumbList({ className, ...props }: React.ComponentProps<"o... function BreadcrumbItem (line 24) | function BreadcrumbItem({ className, ...props }: React.ComponentProps<"l... function BreadcrumbLink (line 34) | function BreadcrumbLink({ function BreadcrumbPage (line 52) | function BreadcrumbPage({ className, ...props }: React.ComponentProps<"s... function BreadcrumbSeparator (line 65) | function BreadcrumbSeparator({ function BreadcrumbEllipsis (line 83) | function BreadcrumbEllipsis({ FILE: components/ui/breadcrumbs.tsx function fetchProjectName (line 11) | async function fetchProjectName(projectId: string) { function humanizeSegment (line 24) | function humanizeSegment(segment: string) { function Breadcrumbs (line 32) | function Breadcrumbs() { FILE: components/ui/button.tsx type ButtonProps (line 88) | interface ButtonProps FILE: components/ui/calendar.tsx type CalendarProps (line 16) | type CalendarProps = DayPickerProps & { type NavView (line 53) | type NavView = "days" | "years" function Calendar (line 61) | function Calendar({ function Nav (line 243) | function Nav({ function CaptionLabel (line 381) | function CaptionLabel({ function MonthGrid (line 409) | function MonthGrid({ function YearGrid (line 445) | function YearGrid({ FILE: components/ui/card.tsx type CardProps (line 62) | interface CardProps FILE: components/ui/confetti.tsx function Confetti (line 6) | function Confetti() { FILE: components/ui/dialog.tsx type DialogContentProps (line 33) | interface DialogContentProps extends React.ComponentPropsWithoutRef { FILE: components/ui/toast.tsx type ToastProps (line 253) | type ToastProps = React.ComponentPropsWithoutRef type ToastActionElement (line 254) | type ToastActionElement = React.ReactElement FILE: components/ui/toaster.tsx function Toaster (line 13) | function Toaster() { FILE: context/auth.tsx type AuthContextType (line 7) | interface AuthContextType { constant REFRESH_INTERVAL (line 17) | const REFRESH_INTERVAL = 15 * 60 * 1000 // 15 minutes constant TEST_REFRESH_INTERVAL (line 18) | const TEST_REFRESH_INTERVAL = 15 * 1000 // 15 seconds constant REFRESH_THRESHOLD (line 19) | const REFRESH_THRESHOLD = 0.8 // Refresh at 80% of token lifetime function AuthProvider (line 21) | function AuthProvider({ function useAuth (line 188) | function useAuth() { FILE: emails/approval-notification.tsx type ApprovalNotificationEmailProps (line 14) | interface ApprovalNotificationEmailProps { FILE: emails/changelog.tsx function sanitizeHtml (line 21) | function sanitizeHtml(html: string): string { type Entry (line 36) | interface Entry { type ChangelogEmailProps (line 45) | interface ChangelogEmailProps { FILE: emails/password-reset.tsx type PasswordResetEmailProps (line 17) | interface PasswordResetEmailProps { FILE: emails/rejection-notification.tsx type RejectionNotificationEmailProps (line 14) | interface RejectionNotificationEmailProps { FILE: emails/schedule-published.tsx type SchedulePublishedEmailProps (line 18) | interface SchedulePublishedEmailProps { FILE: hooks/use-local-storage.ts type SetValue (line 5) | type SetValue = (value: T | ((prevValue: T) => T)) => void function useLocalStorage (line 13) | function useLocalStorage( FILE: hooks/use-media-query.ts function useMediaQuery (line 17) | function useMediaQuery(query: string): boolean { function useBreakpoint (line 78) | function useBreakpoint(breakpoint: keyof typeof breakpoints): boolean { FILE: hooks/use-timezone.ts type TimezoneResponse (line 3) | interface TimezoneResponse { function useTimezone (line 15) | function useTimezone(): string { FILE: hooks/use-toast.ts constant TOAST_LIMIT (line 11) | const TOAST_LIMIT = 1 constant TOAST_REMOVE_DELAY (line 12) | const TOAST_REMOVE_DELAY = 1000000 type ToasterToast (line 14) | type ToasterToast = ToastProps & { function genId (line 30) | function genId() { type ActionType (line 35) | type ActionType = typeof actionTypes type Action (line 37) | type Action = type State (line 55) | interface State { function dispatch (line 136) | function dispatch(action: Action) { type Toast (line 143) | type Toast = Omit function toast (line 145) | function toast({ ...props }: Toast) { function useToast (line 174) | function useToast() { FILE: hooks/useAIAssistant.ts type AIAssistantState (line 12) | interface AIAssistantState { type UseAIAssistantOptions (line 23) | interface UseAIAssistantOptions { function useAIAssistant (line 33) | function useAIAssistant({ FILE: hooks/useBookmarks.ts type UseBookmarksOptions (line 6) | interface UseBookmarksOptions { type UseBookmarksReturn (line 11) | interface UseBookmarksReturn { function useBookmarks (line 29) | function useBookmarks(options: UseBookmarksOptions = {}): UseBookmarksRe... function useGlobalBookmarks (line 169) | function useGlobalBookmarks(): UseBookmarksReturn { function useIsBookmarked (line 174) | function useIsBookmarked(entryId: string, projectId: string): boolean { FILE: hooks/useChunkedData.ts type ChunkedDataParams (line 5) | interface ChunkedDataParams { FILE: hooks/useCommandPalette.ts function useCommandPalette (line 6) | function useCommandPalette() { FILE: hooks/useEditorHistory.ts type EditorHistoryOptions (line 6) | interface EditorHistoryOptions { function useEditorHistory (line 15) | function useEditorHistory({ FILE: hooks/useMarkdownState.ts type MarkdownState (line 5) | interface MarkdownState { type MarkdownActions (line 12) | interface MarkdownActions { type UseMarkdownStateOptions (line 21) | interface UseMarkdownStateOptions { function useMarkdownState (line 27) | function useMarkdownState(options: UseMarkdownStateOptions = {}) { FILE: hooks/useSlashCommands.ts type CommandGroup (line 5) | interface CommandGroup { type Command (line 11) | interface Command { type SlashCommandState (line 21) | interface SlashCommandState { type UseSlashCommandsProps (line 29) | interface UseSlashCommandsProps { function useSlashCommands (line 42) | function useSlashCommands({ FILE: hooks/useTelemetry.ts type TelemetryConfig (line 4) | interface TelemetryConfig { FILE: hooks/useWhatsNew.ts constant VERSION_STORAGE_KEY (line 8) | const VERSION_STORAGE_KEY = 'changerawr-last-version' constant WHATS_NEW_ENDPOINT (line 9) | const WHATS_NEW_ENDPOINT = 'https://dl.supers0ft.us/changerawr/whatsnew/' function useWhatsNew (line 11) | function useWhatsNew() { FILE: instrumentation.ts function register (line 1) | async function register() { FILE: lib/api/middleware.ts type ApiError (line 7) | interface ApiError { function enforceRoutePermissions (line 17) | async function enforceRoutePermissions( function withPermissions (line 114) | function withPermissions>( function createErrorResponse (line 141) | function createErrorResponse(message: string, status: number): NextRespo... function requirePermission (line 152) | async function requirePermission( function requireProjectAccess (line 183) | async function requireProjectAccess( FILE: lib/api/permissions.ts constant API_PERMISSIONS (line 8) | const API_PERMISSIONS = { type ApiPermission (line 42) | type ApiPermission = typeof API_PERMISSIONS[keyof typeof API_PERMISSIONS]; constant PERMISSION_GROUPS (line 48) | const PERMISSION_GROUPS = { function hasPermission (line 81) | function hasPermission( function hasAllPermissions (line 95) | function hasAllPermissions( function hasAnyPermission (line 109) | function hasAnyPermission( FILE: lib/api/route-permissions.ts type RoutePermissionConfig (line 8) | interface RoutePermissionConfig { constant ROUTE_PERMISSIONS (line 26) | const ROUTE_PERMISSIONS: Record = { function matchRoute (line 381) | function matchRoute(path: string): RoutePermissionConfig | null { function patternToRegex (line 413) | function patternToRegex(pattern: string): RegExp { function extractProjectId (line 423) | function extractProjectId(path: string): string | null { function methodAllowed (line 431) | function methodAllowed(config: RoutePermissionConfig, method: string): b... FILE: lib/app-info.ts function getVersionString (line 28) | function getVersionString(): string { function getCopyrightYears (line 35) | function getCopyrightYears(): string { FILE: lib/auth/api-key.ts type AuthContext (line 6) | interface AuthContext { type AuthRequest (line 15) | interface AuthRequest { function getTokenFromRequest (line 28) | function getTokenFromRequest(request: AuthRequest): {type: 'jwt' | 'apik... function authenticateWithJWT (line 54) | async function authenticateWithJWT(token: string): Promise( method testConnection (line 159) | async testConnection(): Promise<{ success: boolean; error?: string }> { method listClients (line 199) | async listClients(): Promise { method createClient (line 220) | async createClient(clientData: CreateClientRequest): Promise { method updateClient (line 281) | async updateClient(clientId: string, updates: UpdateClientRequest): Pr... method deleteClient (line 306) | async deleteClient(clientId: string): Promise { method regenerateSecret (line 318) | async regenerateSecret(clientId: string): Promise<{ newSecret: string ... function createEasypanelApiClient (line 344) | function createEasypanelApiClient(): EasypanelApiClient | null { function isAutoOAuthAvailable (line 358) | function isAutoOAuthAvailable(): boolean { FILE: lib/auth/providers/pocketid.ts type PocketIDProviderConfig (line 3) | interface PocketIDProviderConfig { function setupPocketIDProvider (line 9) | async function setupPocketIDProvider(config: PocketIDProviderConfig) { FILE: lib/auth/saml.ts function getAppUrl (line 9) | function getAppUrl(): string { function buildSAMLInstance (line 13) | function buildSAMLInstance(provider: { function getSAMLProviders (line 41) | async function getSAMLProviders(includeDisabled = false) { function getSAMLLoginUrl (line 48) | async function getSAMLLoginUrl(providerName: string, relayState?: string... function validateSAMLResponse (line 65) | async function validateSAMLResponse( function handleSAMLCallback (line 119) | async function handleSAMLCallback(providerName: string, samlResponse: st... function getSAMLMetadata (line 236) | async function getSAMLMetadata(providerName: string): Promise { FILE: lib/auth/tokens.ts constant ACCESS_SECRET (line 6) | const ACCESS_SECRET = new TextEncoder().encode( function generateTokens (line 10) | async function generateTokens(userId: string) { function generateCLITokens (line 49) | async function generateCLITokens(userId: string) { function verifyAccessToken (line 88) | async function verifyAccessToken(token: string) { type TokenResponse (line 97) | interface TokenResponse { function refreshAccessToken (line 103) | async function refreshAccessToken(currentRefreshToken: string): Promise<... function refreshCLIAccessToken (line 165) | async function refreshCLIAccessToken(currentRefreshToken: string): Promi... FILE: lib/auth/webauthn.ts function generateRegistrationOptionsForUser (line 22) | async function generateRegistrationOptionsForUser( function verifyRegistration (line 47) | async function verifyRegistration( function generateAuthenticationOptionsForUser (line 59) | async function generateAuthenticationOptionsForUser( function verifyAuthentication (line 73) | async function verifyAuthentication( FILE: lib/constants/timezones.ts constant TIMEZONES (line 1) | const TIMEZONES = [ type TimezoneValue (line 66) | type TimezoneValue = typeof TIMEZONES[number]['value'] type TimezoneRegion (line 67) | type TimezoneRegion = typeof TIMEZONES[number]['region'] constant TIMEZONE_REGIONS (line 69) | const TIMEZONE_REGIONS = [...new Set(TIMEZONES.map(tz => tz.region))] as... function getTimezoneLabel (line 71) | function getTimezoneLabel(value: string): string { function getTimezonesByRegion (line 76) | function getTimezonesByRegion() { FILE: lib/custom-domains/constants.ts constant DOMAIN_CONSTANTS (line 1) | const DOMAIN_CONSTANTS = { constant BLOCKED_DOMAINS (line 8) | const BLOCKED_DOMAINS = [ constant DOMAIN_ERRORS (line 17) | const DOMAIN_ERRORS = { FILE: lib/custom-domains/dns.ts function verifyDNSRecords (line 5) | async function verifyDNSRecords( function verifyCNAME (line 44) | async function verifyCNAME( function verifyTXTRecord (line 69) | async function verifyTXTRecord( function verifyDomainViaHTTP (line 105) | async function verifyDomainViaHTTP( function checkDomainResolution (line 150) | async function checkDomainResolution(domain: string): Promise { FILE: lib/custom-domains/service.ts function createCustomDomain (line 7) | async function createCustomDomain( function getDomainByDomain (line 67) | async function getDomainByDomain(domain: string): Promise { function getAllDomains (line 120) | async function getAllDomains(): Promise { function updateDomainVerification (line 137) | async function updateDomainVerification( function deleteDomain (line 165) | async function deleteDomain(domain: string): Promise { function canUserManageDomain (line 179) | async function canUserManageDomain( FILE: lib/custom-domains/ssl/acme-account.ts function getAcmeClient (line 23) | async function getAcmeClient(): Promise { FILE: lib/custom-domains/ssl/auto-renewal.ts constant RENEWAL_THRESHOLD_DAYS (line 7) | const RENEWAL_THRESHOLD_DAYS = parseInt(process.env.SSL_RENEWAL_THRESHOL... constant MAX_BATCH_SIZE (line 10) | const MAX_BATCH_SIZE = parseInt(process.env.SSL_RENEWAL_BATCH_SIZE || '1... function runAutoRenewal (line 14) | async function runAutoRenewal(): Promise<{ function checkCertificateHealth (line 110) | async function checkCertificateHealth(): Promise<{ FILE: lib/custom-domains/ssl/encryption.ts constant ALGORITHM (line 3) | const ALGORITHM = 'aes-256-gcm' as const constant IV_LENGTH (line 4) | const IV_LENGTH = 12 // NIST-recommended for GCM constant SEPARATOR (line 5) | const SEPARATOR = ':' function getKey (line 7) | function getKey(): Buffer { function encrypt (line 18) | function encrypt(plaintext: string): string { function decrypt (line 36) | function decrypt(data: string): string { FILE: lib/custom-domains/ssl/service.ts function getOrderByUrl (line 9) | function getOrderByUrl(client: acme.Client, orderUrl: string): Promise { type CertBundle (line 634) | interface CertBundle { function getActiveCertBundle (line 641) | async function getActiveCertBundle( function renewCertificate (line 673) | async function renewCertificate(cert: DomainCertificate & { function markFailed (line 697) | async function markFailed(certId: string, error: unknown): Promise { FILE: lib/custom-domains/ssl/setup-renewal-job.ts function setupDailySslRenewal (line 13) | async function setupDailySslRenewal(): Promise { function scheduleNextSslRenewal (line 61) | async function scheduleNextSslRenewal(): Promise { FILE: lib/custom-domains/ssl/ssrf-guard.ts constant BLOCKED_PREFIXES (line 3) | const BLOCKED_PREFIXES = [ function is172Private (line 15) | function is172Private(ip: string): boolean { function isPrivateIp (line 22) | function isPrivateIp(ip: string): boolean { function assertNotInternal (line 30) | async function assertNotInternal(hostname: string): Promise { FILE: lib/custom-domains/ssl/webhook.ts type AgentEvent (line 3) | type AgentEvent = function sign (line 11) | function sign(body: string, secret: string): string { function notifyAgent (line 19) | async function notifyAgent(event: AgentEvent): Promise { FILE: lib/custom-domains/utils.ts function getAppDomain (line 5) | function getAppDomain(): string { function isDevelopment (line 29) | function isDevelopment(): boolean { function getAppUrl (line 37) | function getAppUrl(): string { FILE: lib/custom-domains/validation.ts type ValidationResult (line 4) | interface ValidationResult { function validateDomain (line 9) | function validateDomain(domain: string): ValidationResult { function validateProjectId (line 43) | function validateProjectId(projectId: string): boolean { function generateVerificationToken (line 49) | function generateVerificationToken(): string { FILE: lib/middleware/analytics.ts type AnalyticsTrackingOptions (line 4) | interface AnalyticsTrackingOptions { function trackChangelogView (line 15) | async function trackChangelogView( function trackChangelogViewsBatch (line 66) | async function trackChangelogViewsBatch( FILE: lib/services/analytics/geolocation.ts type GeolocationResult (line 3) | interface GeolocationResult { function getGeolocationFromIP (line 13) | async function getGeolocationFromIP( function extractIPFromRequest (line 68) | function extractIPFromRequest(request: Request): string { function getCountryFromCloudflare (line 95) | function getCountryFromCloudflare(request: Request): string | undefined { FILE: lib/services/auth/password-breach.ts type PasswordBreachResult (line 3) | interface PasswordBreachResult { function checkPasswordBreach (line 14) | async function checkPasswordBreach(password: string): Promise { method isBookmarked (line 71) | static isBookmarked(entryId: string, projectId: string): boolean { method addBookmark (line 79) | static addBookmark(entryId: string, title: string, projectId: string):... method removeBookmark (line 113) | static removeBookmark(entryId: string, projectId: string): boolean { method toggleBookmark (line 140) | static toggleBookmark(entryId: string, title: string, projectId: strin... method updateBookmarkTitle (line 153) | static updateBookmarkTitle(entryId: string, newTitle: string, projectI... method clearProjectBookmarks (line 181) | static clearProjectBookmarks(projectId: string): boolean { method getProjectBookmarkCount (line 195) | static getProjectBookmarkCount(projectId: string): number { method getRecentBookmarks (line 202) | static getRecentBookmarks(limit: number = 10): BookmarkedItem[] { method searchBookmarks (line 218) | static searchBookmarks(query: string, projectId?: string): BookmarkedI... method exportBookmarks (line 241) | static exportBookmarks(): string { method importBookmarks (line 252) | static importBookmarks(jsonData: string): boolean { method updateGlobalBookmarks (line 279) | private static updateGlobalBookmarks(): void { method migrateOldBookmarks (line 308) | private static migrateOldBookmarks(): Record { FILE: lib/services/changelog/rss.ts type RSSFeedOptions (line 3) | interface RSSFeedOptions { function generateRSSFeed (line 12) | function generateRSSFeed(entries: ChangelogEntry[], options: RSSFeedOpti... FILE: lib/services/core/markdown/extensions/index.ts function getExtension (line 23) | function getExtension(name: string): Extension | undefined { function getExtensionNames (line 30) | function getExtensionNames(): string[] { FILE: lib/services/core/markdown/useCustomExtensions.ts function getMarkdownEngine (line 20) | function getMarkdownEngine(): ChangerawrMarkdown { function renderMarkdown (line 43) | function renderMarkdown(markdown: string): string { function renderMarkdownWithMetrics (line 52) | function renderMarkdownWithMetrics(markdown: string): { html: string; me... function renderMarkdownStreamed (line 61) | async function renderMarkdownStreamed( function getCacheStats (line 78) | function getCacheStats() { function clearCaches (line 86) | function clearCaches() { function parseMarkdown (line 94) | function parseMarkdown(markdown: string) { function createEngineWithExtensions (line 102) | function createEngineWithExtensions(config?: EngineConfig): ChangerawrMa... function resetEngineInstance (line 119) | function resetEngineInstance(): void { FILE: lib/services/core/system-user/service.ts constant SYSTEM_USER_ID (line 7) | const SYSTEM_USER_ID = 'system'; constant SYSTEM_USER (line 12) | const SYSTEM_USER = { function ensureSystemUser (line 26) | async function ensureSystemUser(): Promise { function isSystemUser (line 58) | function isSystemUser(userId: string): boolean { FILE: lib/services/easypanel/index.ts class EasypanelService (line 6) | class EasypanelService { method constructor (line 9) | constructor(config: EasypanelConfig) { method isConfigured (line 16) | static isConfigured(): boolean { method fromEnv (line 28) | static fromEnv(): EasypanelService | null { method makeRequest (line 44) | private async makeRequest( method updateImage (line 76) | async updateImage(newImage: string): Promise { method deployService (line 98) | async deployService(): Promise { method performUpdate (line 114) | async performUpdate(version: string, customImage?: string): Promise { method getServiceInfo (line 153) | async getServiceInfo(): Promise { method getConfig (line 165) | getConfig(): { projectId: string; serviceId: string; panelUrl: string;... method generateRecommendedImage (line 177) | static generateRecommendedImage(version: string): string { FILE: lib/services/email/notification.ts type SendEmailParams (line 11) | interface SendEmailParams { type EmailResult (line 21) | interface EmailResult { type NotificationRequestInfo (line 27) | interface NotificationRequestInfo { type SendNotificationParams (line 34) | interface SendNotificationParams { type SubscriberWithSubscriptions (line 41) | interface SubscriberWithSubscriptions { type ManageSubscriptionParams (line 51) | interface ManageSubscriptionParams { type SubscriptionResult (line 58) | interface SubscriptionResult { function sendChangelogEmail (line 66) | async function sendChangelogEmail(params: SendEmailParams): Promise { function createGitHubChangelogGenerator (line 656) | function createGitHubChangelogGenerator(client: GitHubClient): GitHubCha... FILE: lib/services/github/client.ts type GitHubConfig (line 3) | interface GitHubConfig { type GitHubCommitAuthor (line 9) | interface GitHubCommitAuthor { type GitHubCommitData (line 15) | interface GitHubCommitData { type GitHubCommitStats (line 21) | interface GitHubCommitStats { type GitHubFile (line 27) | interface GitHubFile { type GitHubCommitResponse (line 40) | interface GitHubCommitResponse { type GitHubCommit (line 51) | interface GitHubCommit { type GitHubTag (line 63) | interface GitHubTag { type GitHubReleaseAuthor (line 73) | interface GitHubReleaseAuthor { type GitHubRelease (line 78) | interface GitHubRelease { type GitHubRepository (line 90) | interface GitHubRepository { type GitHubComparisonResponse (line 106) | interface GitHubComparisonResponse { type GitHubUser (line 111) | interface GitHubUser { type GitHubErrorResponse (line 117) | interface GitHubErrorResponse { class GitHubError (line 127) | class GitHubError extends Error { method constructor (line 131) | constructor(message: string, statusCode: number, response?: GitHubErro... class GitHubClient (line 139) | class GitHubClient { method constructor (line 143) | constructor(config: GitHubConfig) { method makeRequest (line 147) | private async makeRequest(endpoint: string, options: RequestInit = ... method parseRepositoryUrl (line 192) | private parseRepositoryUrl(repositoryUrl: string): { owner: string; re... method normalizeCommit (line 213) | private normalizeCommit(commit: GitHubCommitResponse): GitHubCommit { method testConnection (line 233) | async testConnection(repositoryUrl: string): Promise { method getCommits (line 256) | async getCommits( method getCommitsWithFiles (line 288) | async getCommitsWithFiles( method getCommitsBetween (line 325) | async getCommitsBetween( method getCommitsBetweenWithFiles (line 343) | async getCommitsBetweenWithFiles( method getTags (line 374) | async getTags( method getReleases (line 392) | async getReleases( method getLatestRelease (line 410) | async getLatestRelease(repositoryUrl: string): Promise { method getCommit (line 418) | async getCommit(repositoryUrl: string, sha: string): Promise { method getUser (line 435) | async getUser(): Promise { method getFileContent (line 442) | async getFileContent( method delay (line 476) | private delay(ms: number): Promise { function createGitHubClient (line 484) | function createGitHubClient(config: GitHubConfig): GitHubClient { type ConventionalCommit (line 491) | interface ConventionalCommit { function parseConventionalCommit (line 501) | function parseConventionalCommit(message: string | undefined): Conventio... function groupCommitsByType (line 599) | function groupCommitsByType(commits: GitHubCommit[]): Record { FILE: lib/services/jobs/executors/ssl-renewal.executor.ts class SslRenewalExecutor (line 12) | class SslRenewalExecutor implements ScheduledJobExecutor { method execute (line 13) | async execute(entityId: string): Promise { FILE: lib/services/jobs/executors/telemetry-send.executor.ts class TelemetrySendExecutor (line 3) | class TelemetrySendExecutor implements ScheduledJobExecutor { method execute (line 4) | async execute(entityId: string): Promise { FILE: lib/services/jobs/job-runner.service.ts class JobRunnerService (line 4) | class JobRunnerService { method start (line 12) | static start(intervalMs: number = 60000): void { method stop (line 33) | static stop(): void { method runJobs (line 51) | private static async runJobs(): Promise { method chunkArray (line 104) | private static chunkArray(array: T[], size: number): T[][] { method cleanup (line 115) | static async cleanup(olderThanDays: number = 30): Promise { method getStatus (line 144) | static getStatus(): { isRunning: boolean; intervalId: NodeJS.Timeout |... FILE: lib/services/jobs/scheduled-job.service.ts type CreateScheduledJobParams (line 8) | interface CreateScheduledJobParams { type ScheduledJobExecutor (line 15) | interface ScheduledJobExecutor { class ScheduledJobService (line 19) | class ScheduledJobService { method registerExecutor (line 25) | static registerExecutor(type: ScheduledJobType, executor: ScheduledJob... method createJob (line 32) | static async createJob(params: CreateScheduledJobParams): Promise { method getDueJobs (line 86) | static async getDueJobs(): Promise { method getJobsForEntity (line 174) | static async getJobsForEntity(entityId: string, type?: ScheduledJobTyp... method cleanupOldJobs (line 202) | static async cleanupOldJobs(olderThanDays: number = 30): Promise): { FILE: lib/services/request/changelog-request.ts type ProcessRequestOptions (line 6) | interface ProcessRequestOptions { type PrismaTransaction (line 16) | type PrismaTransaction = Omit { class DeleteTagProcessor (line 119) | class DeleteTagProcessor implements RequestProcessor { method processRequest (line 120) | async processRequest({tx, request}: RequestContext): Promise { method disconnectAndDeleteTag (line 159) | private async disconnectAndDeleteTag(tx: PrismaTransaction, tagId: str... class DeleteEntryProcessor (line 185) | class DeleteEntryProcessor implements RequestProcessor { method processRequest (line 186) | async processRequest({tx, request}: RequestContext): Promise { class AllowPublishProcessor (line 197) | class AllowPublishProcessor implements RequestProcessor { method processRequest (line 198) | async processRequest({tx, request}: RequestContext): Promise { class AllowScheduleProcessor (line 218) | class AllowScheduleProcessor implements RequestProcessor { method processRequest (line 219) | async processRequest({tx, request}: RequestContext): Promise { class RequestProcessorRegistry (line 267) | class RequestProcessorRegistry { method getProcessor (line 276) | static getProcessor(type: string): RequestProcessor { method registerProcessor (line 284) | static registerProcessor(type: string, processor: RequestProcessor): v... class ChangelogRequestService (line 290) | class ChangelogRequestService { method processRequest (line 291) | async processRequest(options: ProcessRequestOptions) { method normalizeSafeOptions (line 358) | private normalizeSafeOptions(options: ProcessRequestOptions) { method findRequest (line 368) | private async findRequest(tx: PrismaTransaction, requestId: string): P... method updateRequestStatus (line 403) | private async updateRequestStatus( method processApprovedRequest (line 436) | private async processApprovedRequest(tx: PrismaTransaction, request: D... method createAuditLog (line 446) | private async createAuditLog( FILE: lib/services/search/service.ts type SearchUser (line 4) | interface SearchUser { type SearchFilters (line 11) | interface SearchFilters { type ChangelogEntryResult (line 22) | interface ChangelogEntryResult { type TagResult (line 40) | interface TagResult { type SearchResult (line 49) | type SearchResult = ChangelogEntryResult | TagResult; type SearchResponse (line 51) | interface SearchResponse { type CustomChangelogWhereInput (line 58) | interface CustomChangelogWhereInput { type CustomChangelogEntryWhereInput (line 70) | interface CustomChangelogEntryWhereInput extends Omit { class SponsorService (line 73) | class SponsorService { method verifyLicense (line 75) | static async verifyLicense(licenseKey: string, instanceId: string): Pr... method activateLicense (line 96) | static async activateLicense(licenseKey: string, instanceId: string, i... method requestChallenge (line 118) | static async requestChallenge(licenseKey: string, instanceId: string):... method confirmChallenge (line 138) | static async confirmChallenge(challengeId: string, responseCode: strin... method deactivateLicense (line 160) | static async deactivateLicense(licenseKey: string, instanceId: string)... method getLicenseStatus (line 171) | static async getLicenseStatus(): Promise<{ active: boolean, features: ... method getEffectiveMaxEntries (line 215) | static getEffectiveMaxEntries(configMax: number, isLicensed: boolean):... method storeLicenseActivation (line 219) | static async storeLicenseActivation( method clearLicenseState (line 234) | static async clearLicenseState(): Promise { method getStoredLicenseKey (line 246) | static async getStoredLicenseKey(): Promise { method getInstanceId (line 256) | static async getInstanceId(): Promise { method checkEntryAllowed (line 261) | static async checkEntryAllowed(projectId: string): Promise { method needsReverification (line 292) | static async needsReverification(): Promise { method _bgr (line 300) | static async _bgr(): Promise { method _rs (line 311) | private static async _rs(): Promise { FILE: lib/services/telemetry/service.ts class TelemetryService (line 6) | class TelemetryService { method shouldLog (line 17) | private static shouldLog(): boolean { method log (line 24) | private static log(...args: unknown[]): void { method logError (line 33) | private static logError(...args: unknown[]): void { method logWarn (line 40) | private static logWarn(...args: unknown[]): void { method getTelemetryConfig (line 47) | static async getTelemetryConfig(): Promise { method reactivateInstance (line 75) | static async reactivateInstance(instanceId: string): Promise { method updateTelemetryConfig (line 98) | static async updateTelemetryConfig(config: TelemetryConfig): Promise { method sendTelemetry (line 226) | static async sendTelemetry(data: TelemetryData): Promise { method deactivateInstance (line 328) | static async deactivateInstance(instanceId: string): Promise { method getTelemetryStats (line 363) | static async getTelemetryStats(): Promise { method scheduleTelemetryJob (line 391) | private static async scheduleTelemetryJob(): Promise { method cancelTelemetryJobs (line 414) | private static async cancelTelemetryJobs(): Promise { method initialize (line 440) | static async initialize(): Promise { method shutdown (line 466) | static async shutdown(): Promise { method testConnection (line 485) | static async testConnection(): Promise { method mapTelemetryState (line 534) | private static mapTelemetryState(state: TelemetryState): TelemetryConf... method mapToDbTelemetryState (line 550) | private static mapToDbTelemetryState(state: TelemetryConfig['allowTele... FILE: lib/types/analytics.ts type AnalyticsView (line 3) | interface AnalyticsView { type AnalyticsTimeRange (line 15) | interface AnalyticsTimeRange { type AnalyticsPeriod (line 20) | type AnalyticsPeriod = '7d' | '30d' | '90d' | '1y'; type DailyAnalytics (line 22) | interface DailyAnalytics { type CountryAnalytics (line 28) | interface CountryAnalytics { type EntryAnalytics (line 34) | interface EntryAnalytics { type ReferrerAnalytics (line 42) | interface ReferrerAnalytics { type ProjectAnalyticsData (line 48) | interface ProjectAnalyticsData { type ProjectAnalyticsSummary (line 60) | interface ProjectAnalyticsSummary { type SystemAnalyticsData (line 68) | interface SystemAnalyticsData extends ProjectAnalyticsData { type AnalyticsMetric (line 72) | interface AnalyticsMetric { type AnalyticsChartData (line 79) | interface AnalyticsChartData { type AnalyticsExportData (line 90) | interface AnalyticsExportData { type AnalyticsApiResponse (line 110) | interface AnalyticsApiResponse { type AnalyticsApiError (line 116) | interface AnalyticsApiError { type AnalyticsQueryParams (line 123) | interface AnalyticsQueryParams { type TrackingEventData (line 129) | interface TrackingEventData { FILE: lib/types/auth.ts type Role (line 3) | enum Role { type User (line 9) | interface User { type LoginCredentials (line 20) | interface LoginCredentials { type AuthTokens (line 25) | interface AuthTokens { type LoginResponse (line 30) | interface LoginResponse { type RefreshTokenResponse (line 42) | interface RefreshTokenResponse { FILE: lib/types/changelog.ts type RequestType (line 1) | type RequestType = 'DELETE_PROJECT' | 'DELETE_TAG' type RequestStatus (line 2) | type RequestStatus = 'PENDING' | 'APPROVED' | 'REJECTED' type ChangelogEntry (line 4) | interface ChangelogEntry { type ChangelogTag (line 16) | interface ChangelogTag { type Changelog (line 22) | interface Changelog { type ChangelogRequest (line 30) | interface ChangelogRequest { type Project (line 62) | interface Project { type RequestDataType (line 79) | interface RequestDataType { type TagColorOption (line 116) | type TagColorOption = { constant TAG_COLOR_OPTIONS (line 123) | const TAG_COLOR_OPTIONS: TagColorOption[] = [ constant DEFAULT_TAG_COLOR (line 138) | const DEFAULT_TAG_COLOR = '#6b7280'; function getTagColorInfo (line 141) | function getTagColorInfo(color: string | null | undefined): TagColorOpti... FILE: lib/types/cli/project-api.ts type ProjectLinkRequest (line 3) | interface ProjectLinkRequest { type ProjectLinkResponse (line 9) | interface ProjectLinkResponse { type ProjectUnlinkRequest (line 16) | interface ProjectUnlinkRequest { type ProjectUnlinkResponse (line 21) | interface ProjectUnlinkResponse { type CommitData (line 27) | interface CommitData { type SyncRequest (line 41) | interface SyncRequest { type SyncResponse (line 53) | interface SyncResponse { type SyncStatusResponse (line 64) | interface SyncStatusResponse { type ConventionalCommitType (line 87) | type ConventionalCommitType = type ProjectSyncMetadata (line 100) | interface ProjectSyncMetadata { type SyncedCommit (line 112) | interface SyncedCommit { type ProjectApiError (line 131) | interface ProjectApiError { type ProjectApiSuccess (line 140) | interface ProjectApiSuccess { FILE: lib/types/custom-domains.ts type CustomDomain (line 1) | interface CustomDomain { type DomainCertificate (line 18) | interface DomainCertificate { type DomainBrowserRule (line 39) | interface DomainBrowserRule { type DomainThrottleConfig (line 49) | interface DomainThrottleConfig { type DNSVerificationResult (line 59) | interface DNSVerificationResult { type DNSInstructions (line 67) | interface DNSInstructions { type AddDomainRequest (line 80) | interface AddDomainRequest { type AddDomainResponse (line 86) | interface AddDomainResponse { type VerifyDomainRequest (line 98) | interface VerifyDomainRequest { type VerifyDomainResponse (line 102) | interface VerifyDomainResponse { type ListDomainsResponse (line 110) | interface ListDomainsResponse { type DeleteDomainResponse (line 116) | interface DeleteDomainResponse { FILE: lib/types/dashboard.ts type ProjectPreview (line 1) | interface ProjectPreview { type Activity (line 8) | interface Activity { type DashboardStats (line 16) | interface DashboardStats { FILE: lib/types/easypanel.ts type EasypanelConfig (line 1) | interface EasypanelConfig { type EasypanelUpdateImagePayload (line 8) | interface EasypanelUpdateImagePayload { type EasypanelDeployPayload (line 18) | interface EasypanelDeployPayload { type EasypanelApiResponse (line 26) | interface EasypanelApiResponse { type UpdateStatus (line 36) | interface UpdateStatus { FILE: lib/types/oauth.ts type OAuthProvider (line 1) | interface OAuthProvider { type OAuthProviderUpdateData (line 15) | type OAuthProviderUpdateData = { type OAuthUserInfo (line 31) | interface OAuthUserInfo { type OAuthCallbackParams (line 39) | interface OAuthCallbackParams { type OAuthConfig (line 45) | interface OAuthConfig { FILE: lib/types/projects/catch-up/types.ts type CatchUpSummary (line 1) | interface CatchUpSummary { type CatchUpTag (line 7) | interface CatchUpTag { type CatchUpEntry (line 13) | interface CatchUpEntry { type CatchUpResponse (line 22) | interface CatchUpResponse { type SinceOption (line 31) | interface SinceOption { type CatchUpFilters (line 38) | interface CatchUpFilters { type AICapabilities (line 44) | interface AICapabilities { type UserAIStatus (line 54) | interface UserAIStatus { FILE: lib/types/projects/importing.ts type ParsedChangelogEntry (line 3) | interface ParsedChangelogEntry { type ChangelogSection (line 12) | interface ChangelogSection { type ParsedChangelog (line 20) | interface ParsedChangelog { type ImportPreview (line 33) | interface ImportPreview { type ImportOptions (line 48) | interface ImportOptions { type ImportResult (line 58) | interface ImportResult { type ImportStats (line 76) | interface ImportStats { type ImportFormat (line 86) | type ImportFormat = type FormatDetectionResult (line 92) | interface FormatDetectionResult { type ValidationError (line 106) | interface ValidationError { type ValidatedEntry (line 114) | interface ValidatedEntry extends ParsedChangelogEntry { FILE: lib/types/projects/importing/canny.ts type CannyUser (line 1) | interface CannyUser { type CannyBoard (line 11) | interface CannyBoard { type CannyCategory (line 19) | interface CannyCategory { type CannyTag (line 27) | interface CannyTag { type CannyPost (line 34) | interface CannyPost { type CannyLabel (line 73) | interface CannyLabel { type CannyEntry (line 81) | interface CannyEntry { type CannyApiResponse (line 100) | interface CannyApiResponse { type CannyImportOptions (line 105) | interface CannyImportOptions { FILE: lib/types/saml.ts type SAMLProvider (line 1) | interface SAMLProvider { type SAMLConnection (line 17) | interface SAMLConnection { type SAMLUserInfo (line 28) | interface SAMLUserInfo { type SAMLCallbackParams (line 36) | interface SAMLCallbackParams { type SAMLProviderUpdateData (line 41) | type SAMLProviderUpdateData = { FILE: lib/types/settings.ts type ProjectSettings (line 5) | interface ProjectSettings { type ProjectSettingsFormData (line 15) | type ProjectSettingsFormData = Omit type ProjectSettingsUpdateRequest (line 17) | interface ProjectSettingsUpdateRequest extends Partial = { function generatePrompt (line 37) | function generatePrompt(request: AIEditorRequest): string { function getMessagesForRequest (line 126) | function getMessagesForRequest(request: AIEditorRequest): AIMessage[] { function getCompletionTypeLabel (line 142) | function getCompletionTypeLabel(type: AICompletionType): string { function getCompletionTypeDescription (line 166) | function getCompletionTypeDescription(type: AICompletionType): string { FILE: lib/utils/ai/secton.ts type SectonConfig (line 11) | interface SectonConfig { constant DEFAULT_CONFIG (line 20) | const DEFAULT_CONFIG: Partial = { class SectonClient (line 28) | class SectonClient { method constructor (line 31) | constructor(config: SectonConfig) { method getModels (line 48) | async getModels(): Promise { method createCompletion (line 95) | async createCompletion(request: Partial): Promise... method validateApiKey (line 270) | async validateApiKey(): Promise { function createSectonClient (line 287) | function createSectonClient(config: SectonConfig): SectonClient { FILE: lib/utils/ai/types.ts type AICompletionType (line 6) | enum AICompletionType { type AIEditorRequest (line 17) | interface AIEditorRequest { type AIEditorResult (line 33) | interface AIEditorResult { type AIMessage (line 48) | interface AIMessage { type CompletionRequest (line 54) | interface CompletionRequest { type CompletionResponse (line 62) | interface CompletionResponse { type AIModel (line 74) | interface AIModel { class AIError (line 83) | class AIError extends Error { method constructor (line 87) | constructor(message: string, statusCode: number, details?: unknown) { FILE: lib/utils/analytics.ts type AnalyticsTimeRange (line 4) | interface AnalyticsTimeRange { type ProjectAnalytics (line 9) | interface ProjectAnalytics { type SystemAnalytics (line 23) | interface SystemAnalytics extends ProjectAnalytics { function getTimeRange (line 35) | function getTimeRange(period: '7d' | '30d' | '90d' | '1y'): AnalyticsTim... function getProjectAnalytics (line 60) | async function getProjectAnalytics( function getSystemAnalytics (line 203) | async function getSystemAnalytics(timeRange: AnalyticsTimeRange): Promis... FILE: lib/utils/api.ts function fetchWithAuth (line 1) | async function fetchWithAuth( FILE: lib/utils/auditLog.ts type AuditLogDetails (line 5) | interface AuditLogDetails { function createAuditLog (line 16) | async function createAuditLog( FILE: lib/utils/changelog.ts type ChangelogEntryInput (line 19) | type ChangelogEntryInput = z.infer function validateAuthAndGetUser (line 22) | async function validateAuthAndGetUser() { function sendError (line 57) | function sendError(message: string, status: number = 400) { function sendSuccess (line 67) | function sendSuccess(data: unknown, status: number = 200) { constant EXCERPT_LENGTH (line 78) | const EXCERPT_LENGTH = 300; function generateExcerpt (line 80) | function generateExcerpt(content: string): string { FILE: lib/utils/cookies.ts function shouldUseSecureCookies (line 9) | function shouldUseSecureCookies(request: Request): boolean { FILE: lib/utils/docker.ts type DockerImageConfig (line 1) | interface DockerImageConfig { constant DEFAULT_DOCKER_CONFIG (line 8) | const DEFAULT_DOCKER_CONFIG: DockerImageConfig = { constant DEBUG_MODE (line 17) | const DEBUG_MODE = false; constant DEBUG_IMAGE (line 18) | const DEBUG_IMAGE = 'traefik/whoami'; function generateDockerImage (line 23) | function generateDockerImage( function isDebugMode (line 42) | function isDebugMode(): boolean { function getDebugImage (line 49) | function getDebugImage(): string { function generateDockerImageWithDebugInfo (line 56) | function generateDockerImageWithDebugInfo( function parseDockerImage (line 83) | function parseDockerImage(imageString: string): { function validateDockerImage (line 132) | function validateDockerImage(imageString: string): { function getImageVariants (line 172) | function getImageVariants( function logDockerDebugInfo (line 197) | function logDockerDebugInfo(version: string): void { FILE: lib/utils/encryption.ts constant ENCRYPTION_KEY_HEX (line 4) | const ENCRYPTION_KEY_HEX = process.env.GITHUB_ENCRYPTION_KEY || 'default... constant ALGORITHM (line 5) | const ALGORITHM = 'aes-256-cbc'; constant IV_LENGTH (line 6) | const IV_LENGTH = 16; function getKeyBuffer (line 9) | function getKeyBuffer(): Buffer { function encryptToken (line 34) | function encryptToken(token: string): string { function decryptToken (line 52) | function decryptToken(encryptedToken: string): string { FILE: lib/utils/format-date.ts type DateInput (line 17) | type DateInput = string | Date | number function toDate (line 19) | function toDate(input: DateInput): Date { function formatDateLong (line 26) | function formatDateLong(input: DateInput, timeZone = 'UTC'): string { function formatDateMedium (line 36) | function formatDateMedium(input: DateInput, timeZone = 'UTC'): string { function formatDateShort (line 46) | function formatDateShort(input: DateInput, timeZone = 'UTC'): string { function formatDateTime (line 56) | function formatDateTime(input: DateInput, timeZone = 'UTC'): string { function formatDateTimeMedium (line 68) | function formatDateTimeMedium(input: DateInput, timeZone = 'UTC'): string { function formatTime (line 80) | function formatTime(input: DateInput, timeZone = 'UTC'): string { function formatDateTimeWithZone (line 89) | function formatDateTimeWithZone(input: DateInput, timeZone = 'UTC'): str... FILE: lib/utils/gravatar.ts function getGravatarUrl (line 3) | function getGravatarUrl(email: string, size: number = 80): string { FILE: lib/utils/rate-limit.ts type RateLimitEntry (line 6) | interface RateLimitEntry { type RateLimitResult (line 21) | interface RateLimitResult { function checkRateLimit (line 34) | function checkRateLimit( function getClientIp (line 62) | function getClientIp(request: Request): string { FILE: lib/utils/text.ts function truncateText (line 15) | function truncateText(text: string, maxLength: number = 60): string { function truncateMarkdown (line 32) | function truncateMarkdown(content: string, charLimit: number = 400): str... FILE: prisma/migrations/20250215042251_init_authentication/migration.sql type "User" (line 5) | CREATE TABLE "User" ( type "RefreshToken" (line 18) | CREATE TABLE "RefreshToken" ( type "Settings" (line 30) | CREATE TABLE "Settings" ( type "User" (line 41) | CREATE UNIQUE INDEX "User_email_key" ON "User"("email") type "RefreshToken" (line 44) | CREATE UNIQUE INDEX "RefreshToken_token_key" ON "RefreshToken"("token") type "RefreshToken" (line 47) | CREATE INDEX "RefreshToken_userId_idx" ON "RefreshToken"("userId") type "Settings" (line 50) | CREATE UNIQUE INDEX "Settings_userId_key" ON "Settings"("userId") type "Settings" (line 53) | CREATE INDEX "Settings_userId_idx" ON "Settings"("userId") FILE: prisma/migrations/20250215051621_add_invitation_links/migration.sql type "InvitationLink" (line 2) | CREATE TABLE "InvitationLink" ( type "InvitationLink" (line 16) | CREATE UNIQUE INDEX "InvitationLink_token_key" ON "InvitationLink"("token") type "InvitationLink" (line 19) | CREATE INDEX "InvitationLink_token_idx" ON "InvitationLink"("token") type "InvitationLink" (line 22) | CREATE INDEX "InvitationLink_email_idx" ON "InvitationLink"("email") FILE: prisma/migrations/20250215075317_add_changelog_models/migration.sql type "Project" (line 8) | CREATE TABLE "Project" ( type "Changelog" (line 18) | CREATE TABLE "Changelog" ( type "ChangelogEntry" (line 28) | CREATE TABLE "ChangelogEntry" ( type "ChangelogTag" (line 42) | CREATE TABLE "ChangelogTag" ( type "ChangelogRequest" (line 52) | CREATE TABLE "ChangelogRequest" ( type "_ChangelogEntryToChangelogTag" (line 68) | CREATE TABLE "_ChangelogEntryToChangelogTag" ( type "Changelog" (line 76) | CREATE UNIQUE INDEX "Changelog_projectId_key" ON "Changelog"("projectId") type "ChangelogEntry" (line 79) | CREATE INDEX "ChangelogEntry_changelogId_idx" ON "ChangelogEntry"("chang... type "ChangelogTag" (line 82) | CREATE UNIQUE INDEX "ChangelogTag_name_key" ON "ChangelogTag"("name") type "ChangelogRequest" (line 85) | CREATE INDEX "ChangelogRequest_staffId_idx" ON "ChangelogRequest"("staff... type "ChangelogRequest" (line 88) | CREATE INDEX "ChangelogRequest_adminId_idx" ON "ChangelogRequest"("admin... type "ChangelogRequest" (line 91) | CREATE INDEX "ChangelogRequest_changelogEntryId_idx" ON "ChangelogReques... type "ChangelogRequest" (line 94) | CREATE INDEX "ChangelogRequest_changelogTagId_idx" ON "ChangelogRequest"... type "_ChangelogEntryToChangelogTag" (line 97) | CREATE INDEX "_ChangelogEntryToChangelogTag_B_index" ON "_ChangelogEntry... FILE: prisma/migrations/20250215232640_add_api_keys/migration.sql type "ApiKey" (line 2) | CREATE TABLE "ApiKey" ( type "ApiKey" (line 17) | CREATE UNIQUE INDEX "ApiKey_key_key" ON "ApiKey"("key") type "ApiKey" (line 20) | CREATE INDEX "ApiKey_userId_idx" ON "ApiKey"("userId") type "ApiKey" (line 23) | CREATE INDEX "ApiKey_key_idx" ON "ApiKey"("key") FILE: prisma/migrations/20250216005356_add_audit_logs/migration.sql type "AuditLog" (line 2) | CREATE TABLE "AuditLog" ( type "AuditLog" (line 14) | CREATE INDEX "AuditLog_userId_idx" ON "AuditLog"("userId") type "AuditLog" (line 17) | CREATE INDEX "AuditLog_targetUserId_idx" ON "AuditLog"("targetUserId") type "AuditLog" (line 20) | CREATE INDEX "AuditLog_action_idx" ON "AuditLog"("action") type "AuditLog" (line 23) | CREATE INDEX "AuditLog_createdAt_idx" ON "AuditLog"("createdAt") FILE: prisma/migrations/20250216050812_add_system_configuration/migration.sql type "SystemConfig" (line 2) | CREATE TABLE "SystemConfig" ( FILE: prisma/migrations/20250216053424_update_changelog_requests_schema/migration.sql type "ChangelogRequest" (line 26) | CREATE INDEX "ChangelogRequest_projectId_idx" ON "ChangelogRequest"("pro... type "ChangelogRequest" (line 29) | CREATE INDEX "ChangelogRequest_status_idx" ON "ChangelogRequest"("status") FILE: prisma/migrations/20250305225249_add_oauth/migration.sql type "OAuthProvider" (line 2) | CREATE TABLE "OAuthProvider" ( type "OAuthConnection" (line 21) | CREATE TABLE "OAuthConnection" ( type "OAuthConnection" (line 36) | CREATE INDEX "OAuthConnection_userId_idx" ON "OAuthConnection"("userId") type "OAuthConnection" (line 39) | CREATE INDEX "OAuthConnection_providerId_idx" ON "OAuthConnection"("prov... type "OAuthConnection" (line 42) | CREATE UNIQUE INDEX "OAuthConnection_providerId_providerUserId_key" ON "... type "OAuthConnection" (line 45) | CREATE UNIQUE INDEX "OAuthConnection_providerId_userId_key" ON "OAuthCon... FILE: prisma/migrations/20250418044737_add_email_integration/migration.sql type "EmailConfig" (line 2) | CREATE TABLE "EmailConfig" ( type "EmailConfig" (line 24) | CREATE UNIQUE INDEX "EmailConfig_projectId_key" ON "EmailConfig"("projec... FILE: prisma/migrations/20250418045834_add_email_logs/migration.sql type "EmailLog" (line 2) | CREATE TABLE "EmailLog" ( FILE: prisma/migrations/20250418163601_add_email_subscription/migration.sql type "EmailSubscriber" (line 5) | CREATE TABLE "EmailSubscriber" ( type "ProjectSubscription" (line 19) | CREATE TABLE "ProjectSubscription" ( type "EmailSubscriber" (line 31) | CREATE UNIQUE INDEX "EmailSubscriber_unsubscribeToken_key" ON "EmailSubs... type "EmailSubscriber" (line 34) | CREATE INDEX "EmailSubscriber_email_idx" ON "EmailSubscriber"("email") type "EmailSubscriber" (line 37) | CREATE INDEX "EmailSubscriber_unsubscribeToken_idx" ON "EmailSubscriber"... type "EmailSubscriber" (line 40) | CREATE UNIQUE INDEX "EmailSubscriber_email_key" ON "EmailSubscriber"("em... type "ProjectSubscription" (line 43) | CREATE INDEX "ProjectSubscription_projectId_idx" ON "ProjectSubscription... type "ProjectSubscription" (line 46) | CREATE INDEX "ProjectSubscription_subscriberId_idx" ON "ProjectSubscript... type "ProjectSubscription" (line 49) | CREATE UNIQUE INDEX "ProjectSubscription_projectId_subscriberId_key" ON ... FILE: prisma/migrations/20250419000001_add_password_reset/migration.sql type "PasswordReset" (line 2) | CREATE TABLE "PasswordReset" ( type "PasswordReset" (line 15) | CREATE UNIQUE INDEX "PasswordReset_token_key" ON "PasswordReset"("token") type "PasswordReset" (line 18) | CREATE INDEX "PasswordReset_token_idx" ON "PasswordReset"("token") type "PasswordReset" (line 21) | CREATE INDEX "PasswordReset_userId_idx" ON "PasswordReset"("userId") type "PasswordReset" (line 24) | CREATE INDEX "PasswordReset_email_idx" ON "PasswordReset"("email") FILE: prisma/migrations/20250504203021_passkey_support/migration.sql type "Passkey" (line 2) | CREATE TABLE "Passkey" ( type "Passkey" (line 17) | CREATE UNIQUE INDEX "Passkey_credentialId_key" ON "Passkey"("credentialId") type "Passkey" (line 20) | CREATE INDEX "Passkey_userId_idx" ON "Passkey"("userId") type "Passkey" (line 23) | CREATE INDEX "Passkey_credentialId_idx" ON "Passkey"("credentialId") FILE: prisma/migrations/20250504212400_add_two_factor_session/migration.sql type "TwoFactorSession" (line 2) | CREATE TABLE "TwoFactorSession" ( type "TwoFactorSession" (line 13) | CREATE INDEX "TwoFactorSession_userId_idx" ON "TwoFactorSession"("userId") type "TwoFactorSession" (line 16) | CREATE INDEX "TwoFactorSession_expiresAt_idx" ON "TwoFactorSession"("exp... FILE: prisma/migrations/20250512000000_add_github_integration/migration.sql type "GitHubIntegration" (line 2) | CREATE TABLE "GitHubIntegration" ( type "GitHubIntegration" (line 23) | CREATE UNIQUE INDEX "GitHubIntegration_projectId_key" ON "GitHubIntegrat... type "GitHubIntegration" (line 26) | CREATE INDEX "GitHubIntegration_projectId_idx" ON "GitHubIntegration"("p... type "GitHubIntegration" (line 29) | CREATE INDEX "GitHubIntegration_enabled_idx" ON "GitHubIntegration"("ena... FILE: prisma/migrations/20250613040144_changelog_analytics/migration.sql type "PublicChangelogAnalytics" (line 2) | CREATE TABLE "PublicChangelogAnalytics" type "PublicChangelogAnalytics" (line 18) | CREATE INDEX "PublicChangelogAnalytics_projectId_idx" ON "PublicChangelo... type "PublicChangelogAnalytics" (line 21) | CREATE INDEX "PublicChangelogAnalytics_changelogEntryId_idx" ON "PublicC... type "PublicChangelogAnalytics" (line 24) | CREATE INDEX "PublicChangelogAnalytics_viewedAt_idx" ON "PublicChangelog... type "PublicChangelogAnalytics" (line 27) | CREATE INDEX "PublicChangelogAnalytics_country_idx" ON "PublicChangelogA... type "PublicChangelogAnalytics" (line 30) | CREATE INDEX "PublicChangelogAnalytics_sessionHash_idx" ON "PublicChange... FILE: prisma/migrations/20250624024525_add_custom_domains/migration.sql type "custom_domains" (line 5) | CREATE TABLE "custom_domains" ( type "custom_domains" (line 19) | CREATE UNIQUE INDEX "custom_domains_domain_key" ON "custom_domains"("dom... type "custom_domains" (line 22) | CREATE UNIQUE INDEX "custom_domains_verificationToken_key" ON "custom_do... type "custom_domains" (line 25) | CREATE INDEX "custom_domains_domain_idx" ON "custom_domains"("domain") type "custom_domains" (line 28) | CREATE INDEX "custom_domains_projectId_idx" ON "custom_domains"("project... type "custom_domains" (line 31) | CREATE INDEX "custom_domains_userId_idx" ON "custom_domains"("userId") type "custom_domains" (line 34) | CREATE INDEX "custom_domains_verified_idx" ON "custom_domains"("verified") FILE: prisma/migrations/20250625030954_add_custom_domains_to_email_notifications/migration.sql type idx_project_subscriptions_custom_domain (line 5) | CREATE INDEX idx_project_subscriptions_custom_domain ON "ProjectSubscrip... FILE: prisma/migrations/20250625120000_add_changelog_scheduling/migration.sql type "ChangelogEntry" (line 5) | CREATE INDEX "ChangelogEntry_scheduledAt_idx" ON "ChangelogEntry"("sched... type "ChangelogEntry" (line 6) | CREATE INDEX "ChangelogEntry_scheduled_published_idx" ON "ChangelogEntry... type "ScheduledJob" (line 15) | CREATE TABLE "ScheduledJob" ( type "ScheduledJob" (line 32) | CREATE INDEX "ScheduledJob_type_idx" ON "ScheduledJob"("type") type "ScheduledJob" (line 33) | CREATE INDEX "ScheduledJob_entityId_idx" ON "ScheduledJob"("entityId") type "ScheduledJob" (line 34) | CREATE INDEX "ScheduledJob_scheduledAt_idx" ON "ScheduledJob"("scheduled... type "ScheduledJob" (line 35) | CREATE INDEX "ScheduledJob_status_idx" ON "ScheduledJob"("status") type "ScheduledJob" (line 36) | CREATE INDEX "ScheduledJob_scheduled_pending_idx" ON "ScheduledJob"("sch... FILE: prisma/migrations/20250627020135_add_color_field_to_changelog_tag/migration.sql type "ProjectSubscription" (line 21) | CREATE INDEX "ProjectSubscription_customDomain_idx" ON "ProjectSubscript... FILE: prisma/migrations/20250628171029_add_telemetry/migration.sql type "SystemConfig" (line 19) | CREATE UNIQUE INDEX "SystemConfig_telemetryInstanceId_key" ON "SystemCon... FILE: prisma/migrations/20250702092443_add_cli_auth_codes/migration.sql type "CliAuthCode" (line 2) | CREATE TABLE "CliAuthCode" ( type "CliAuthCode" (line 15) | CREATE UNIQUE INDEX "CliAuthCode_code_key" ON "CliAuthCode"("code") type "CliAuthCode" (line 16) | CREATE INDEX "CliAuthCode_code_idx" ON "CliAuthCode"("code") type "CliAuthCode" (line 17) | CREATE INDEX "CliAuthCode_userId_idx" ON "CliAuthCode"("userId") type "CliAuthCode" (line 18) | CREATE INDEX "CliAuthCode_expiresAt_idx" ON "CliAuthCode"("expiresAt") FILE: prisma/migrations/20250702121802_add_synced_cli_migrations_and_metadata/migration.sql type "ProjectSyncMetadata" (line 2) | CREATE TABLE "ProjectSyncMetadata" ( type "SyncedCommit" (line 17) | CREATE TABLE "SyncedCommit" ( type "ProjectSyncMetadata" (line 38) | CREATE UNIQUE INDEX "ProjectSyncMetadata_projectId_key" ON "ProjectSyncM... type "ProjectSyncMetadata" (line 41) | CREATE INDEX "ProjectSyncMetadata_projectId_idx" ON "ProjectSyncMetadata... type "ProjectSyncMetadata" (line 44) | CREATE INDEX "ProjectSyncMetadata_lastSyncedAt_idx" ON "ProjectSyncMetad... type "SyncedCommit" (line 47) | CREATE INDEX "SyncedCommit_projectId_idx" ON "SyncedCommit"("projectId") type "SyncedCommit" (line 50) | CREATE INDEX "SyncedCommit_commitHash_idx" ON "SyncedCommit"("commitHash") type "SyncedCommit" (line 53) | CREATE INDEX "SyncedCommit_syncedAt_idx" ON "SyncedCommit"("syncedAt") type "SyncedCommit" (line 56) | CREATE INDEX "SyncedCommit_conventionalType_idx" ON "SyncedCommit"("conv... type "SyncedCommit" (line 59) | CREATE INDEX "SyncedCommit_branch_idx" ON "SyncedCommit"("branch") type "SyncedCommit" (line 62) | CREATE UNIQUE INDEX "SyncedCommit_projectId_commitHash_key" ON "SyncedCo... FILE: prisma/migrations/20250703092000_fix_missing_changelogentryid_column/migration.sql type "ScheduledJob" (line 8) | CREATE INDEX IF NOT EXISTS "ScheduledJob_changelogEntryId_idx" ON "Sched... FILE: prisma/migrations/20251111210147_add_api_key_and_widgets/migration.sql type "Widget" (line 15) | CREATE TABLE "Widget" ( type "Widget" (line 30) | CREATE INDEX "Widget_projectId_idx" ON "Widget"("projectId") type "Widget" (line 33) | CREATE INDEX "Widget_projectId_isActive_idx" ON "Widget"("projectId", "i... type "ApiKey" (line 36) | CREATE INDEX "ApiKey_projectId_idx" ON "ApiKey"("projectId") FILE: prisma/migrations/20251127011835_add_slack_integration/migration.sql type "SlackIntegration" (line 2) | CREATE TABLE "SlackIntegration" ( type "SlackIntegration" (line 26) | CREATE UNIQUE INDEX "SlackIntegration_projectId_key" ON "SlackIntegratio... type "SlackIntegration" (line 29) | CREATE INDEX "SlackIntegration_projectId_idx" ON "SlackIntegration"("pro... type "SlackIntegration" (line 32) | CREATE INDEX "SlackIntegration_teamId_idx" ON "SlackIntegration"("teamId") FILE: prisma/seed.ts function generateVersionSequence (line 8) | function generateVersionSequence(count: number): string[] { function generateSequentialDates (line 40) | function generateSequentialDates(count: number, startDate = new Date('20... function generateMarkdownContent (line 53) | function generateMarkdownContent(): string { function main (line 112) | async function main() { FILE: proxy.ts type IpConfig (line 9) | interface IpConfig { enabled: boolean; whitelist: string[] } constant IP_CACHE_TTL_MS (line 12) | const IP_CACHE_TTL_MS = 30_000 function getIpConfig (line 14) | async function getIpConfig(baseUrl: string): Promise { function getClientIp (line 32) | function getClientIp(req: NextRequest): string { function ipMatchesCidr (line 38) | function ipMatchesCidr(ip: string, cidr: string): boolean { constant IP_WHITELIST_PUBLIC_PREFIXES (line 51) | const IP_WHITELIST_PUBLIC_PREFIXES = [ function isIpProtectedPath (line 58) | function isIpProtectedPath(pathname: string): boolean { constant ALWAYS_PUBLIC_PATHS (line 65) | const ALWAYS_PUBLIC_PATHS = [ constant FUCK_OFF_THRESHOLD (line 78) | const FUCK_OFF_THRESHOLD = 5 // I love this variable, sorry professional... constant DEFAULT_ALLOWED_EXTERNAL_DOMAINS (line 81) | const DEFAULT_ALLOWED_EXTERNAL_DOMAINS = [ function getAllowedExternalDomains (line 92) | function getAllowedExternalDomains(): string[] { type DomainSecurityConfig (line 99) | interface DomainSecurityConfig { constant CACHE_TTL_MS (line 105) | const CACHE_TTL_MS = 60_000 // 60 seconds function getDomainSecurityConfig (line 107) | async function getDomainSecurityConfig(hostname: string): Promise { function proxy (line 226) | async function proxy(request: NextRequest) { FILE: scripts/api/generateSwagger.js function adopt (line 14) | function adopt(value) { return value instanceof P ? value : new P(functi... function fulfilled (line 16) | function fulfilled(value) { try { step(generator.next(value)); } catch (... function rejected (line 17) | function rejected(value) { try { step(generator["throw"](value)); } catc... function step (line 18) | function step(result) { result.done ? resolve(result.value) : adopt(resu... function verb (line 25) | function verb(n) { return function (v) { return step([n, v]); }; } function step (line 26) | function step(op) { function generateSwagger (line 56) | function generateSwagger() { FILE: scripts/api/generateSwagger.ts type CommentTag (line 12) | interface CommentTag { type CommentBlock (line 23) | interface CommentBlock { type OpenAPIDocumentWithExtensions (line 31) | interface OpenAPIDocumentWithExtensions extends OpenAPIV3.Document { type HttpMethod (line 35) | type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch'; type SwaggerRoute (line 37) | interface SwaggerRoute { type RouteReport (line 45) | interface RouteReport { function pathToSectionTitle (line 58) | function pathToSectionTitle(path: string): string { function parseSchema (line 68) | function parseSchema(schema: Record): OpenAPIV3.SchemaO... function tryParseJSON (line 132) | function tryParseJSON(str: string, defaultValue: unknown = undefined): u... function extractFullDescription (line 141) | function extractFullDescription(tag: CommentTag): string { function processRouteOperation (line 150) | function processRouteOperation(route: SwaggerRoute, routeDocs: CommentBl... function processRouteFiles (line 285) | async function processRouteFiles( function generateSwaggerDocs (line 359) | async function generateSwaggerDocs() { FILE: scripts/ftb/server.js constant PORT (line 6) | const PORT = process.env.PORT || 3000; FILE: scripts/maintenance/server.js constant PORT (line 5) | const PORT = process.env.PORT || 3000; constant MAINTENANCE_HTML_PATH (line 6) | const MAINTENANCE_HTML_PATH = path.join(__dirname, '../maintenance', 'in... FILE: scripts/utils/scan.ts type PageInfo (line 7) | interface PageInfo { type ScreenshotConfig (line 16) | interface ScreenshotConfig { type RouteTreeNode (line 43) | interface RouteTreeNode { class NextJSPageScanner (line 51) | class NextJSPageScanner { method constructor (line 55) | constructor(appDir: string = './app', screenshotConfig?: ScreenshotCon... method scanPages (line 68) | public async scanPages(): Promise { method ensureDirectoryExists (line 79) | private ensureDirectoryExists(dirPath: string): void { method takeScreenshots (line 85) | private async takeScreenshots(pages: PageInfo[]): Promise { method filterScreenshotablePages (line 122) | private filterScreenshotablePages(pages: PageInfo[]): PageInfo[] { method extractRequiredParams (line 139) | private extractRequiredParams(segments: string[]): string[] { method hasRequiredParams (line 145) | private hasRequiredParams(requiredParams: string[]): boolean { method buildRouteUrl (line 153) | private buildRouteUrl(pageInfo: PageInfo): string { method performLogin (line 172) | private async performLogin(page: Page): Promise { method screenshotPage (line 196) | private async screenshotPage(page: Page, pageInfo: PageInfo): Promise<... method generateScreenshotFilename (line 231) | private generateScreenshotFilename(routePath: string): string { method scanDirectory (line 242) | private scanDirectory(dirPath: string, relativePath: string, pages: Pa... method shouldSkipDirectory (line 263) | private shouldSkipDirectory(dirName: string): boolean { method analyzeFile (line 277) | private analyzeFile(fullPath: string, relativePath: string): PageInfo ... method checkIfDynamic (line 335) | private checkIfDynamic(segments: string[]): boolean { method buildRouteTree (line 342) | private buildRouteTree(pages: PageInfo[]): RouteTreeNode[] { method generateTreeView (line 389) | public generateTreeView(nodes: RouteTreeNode[], prefix: string = ''): ... function main (line 437) | async function main(): Promise { FILE: scripts/widget/build.ts function copyDirectory (line 13) | function copyDirectory(src: string, dest: string) { function buildWidget (line 36) | async function buildWidget() { FILE: widgets/changelog/index.js class ChangelogWidget (line 1) | class ChangelogWidget { method constructor (line 2) | constructor(container, options) { method getScriptOptions (line 22) | getScriptOptions() { method updatePosition (line 39) | updatePosition() { method addStyles (line 70) | addStyles() { method init (line 312) | async init() { method setupKeyboardNavigation (line 342) | setupKeyboardNavigation() { method setupTriggerButton (line 366) | setupTriggerButton() { method render (line 391) | render() { method renderLoading (line 433) | renderLoading() { method loadEntries (line 442) | async loadEntries() { method renderEntries (line 463) | renderEntries(entries) { method renderError (line 504) | renderError() { method open (line 520) | open() { method close (line 538) | close() { method toggle (line 561) | toggle() { FILE: widgets/variants/announcement.js class ChangelogAnnouncementWidget (line 6) | class ChangelogAnnouncementWidget { method constructor (line 7) | constructor(container, options) { method loadStyles (line 27) | async loadStyles() { method checkDismissed (line 60) | checkDismissed() { method markDismissed (line 71) | markDismissed() { method init (line 79) | async init() { method loadLatestEntry (line 114) | async loadLatestEntry() { method render (line 140) | render() { method dismiss (line 214) | dismiss() { method hide (line 222) | hide() { method show (line 233) | show() { FILE: widgets/variants/classic.js class ChangelogWidget (line 6) | class ChangelogWidget { method constructor (line 7) | constructor(container, options) { method loadStyles (line 26) | async loadStyles() { method updatePosition (line 58) | updatePosition() { method init (line 71) | async init() { method setupKeyboardNavigation (line 108) | setupKeyboardNavigation() { method setupTriggerButton (line 136) | setupTriggerButton() { method loadEntries (line 148) | async loadEntries() { method render (line 173) | render() { method createHeader (line 186) | createHeader() { method createFooter (line 206) | createFooter() { method renderLoading (line 225) | renderLoading() { method renderError (line 232) | renderError() { method renderEntries (line 244) | renderEntries(entries) { method open (line 313) | open() { method close (line 334) | close() { method toggle (line 351) | toggle() { FILE: widgets/variants/floating.js class ChangelogFloatingWidget (line 6) | class ChangelogFloatingWidget { method constructor (line 7) | constructor(container, options) { method loadStyles (line 29) | async loadStyles() { method init (line 63) | async init() { method render (line 82) | render() { method attachEventListeners (line 227) | attachEventListeners() { method loadEntries (line 254) | async loadEntries() { method updateBadge (line 286) | updateBadge() { method renderEntries (line 297) | renderEntries() { method open (line 432) | open() { method close (line 457) | close() { method toggle (line 475) | toggle() { FILE: widgets/variants/modal.js class ChangelogModalWidget (line 6) | class ChangelogModalWidget { method constructor (line 7) | constructor(container, options) { method loadStyles (line 25) | async loadStyles() { method init (line 58) | async init() { method setupKeyboardNavigation (line 90) | setupKeyboardNavigation() { method setupTriggerButton (line 118) | setupTriggerButton() { method loadEntries (line 130) | async loadEntries() { method render (line 155) | render() { method createHeader (line 180) | createHeader() { method createFooter (line 200) | createFooter() { method renderLoading (line 219) | renderLoading() { method renderError (line 226) | renderError() { method renderEntries (line 238) | renderEntries(entries) { method open (line 318) | open() { method close (line 344) | close() { method toggle (line 364) | toggle() {