From ac9b97902acdfe44b811766981f4122346cec5f0 Mon Sep 17 00:00:00 2001 From: Jonas Badalic Date: Thu, 20 Aug 2026 13:43:50 -0700 Subject: [PATCH 1/2] Remove unused public component props that nothing provided. Co-authored-by: Cursor --- src/components/ApplicationStarter.tsx | 307 +++++++----------- src/components/BlogCard.tsx | 39 +-- src/components/Doc.tsx | 5 +- src/components/Dropdown.tsx | 45 +-- src/components/FilterComponents.tsx | 36 +- src/components/LibraryWordmark.tsx | 11 +- src/components/NewsletterSignup.tsx | 20 +- src/components/PartnersSponsorsSection.tsx | 4 +- src/components/RecentPostsWidget.tsx | 12 +- src/components/ShowcaseSection.tsx | 36 +- src/components/StackBlitzEmbed.tsx | 11 +- src/components/TableComponents.tsx | 29 +- src/components/admin/AdminEmptyState.tsx | 14 - src/components/ds/ui/index.tsx | 8 +- src/components/game/scene/BeachChair.tsx | 3 +- .../landing/LandingCopyPromptButton.tsx | 4 +- .../npm-stats/PopularComparisons.tsx | 24 +- src/components/npm-stats/Resizable.tsx | 94 +++--- src/components/shop/ProductCard.tsx | 3 - src/components/shop/ProductDrawer.tsx | 11 - src/components/shop/ui/Button.tsx | 17 +- src/components/shop/ui/Chip.tsx | 21 +- src/components/shop/ui/Qty.tsx | 11 +- src/routes/-shop-browse.tsx | 4 - src/ui/Badge.tsx | 5 +- src/ui/FormInput.tsx | 16 +- src/ui/LogoQueryGG.tsx | 236 +------------- src/ui/Tooltip.tsx | 4 +- 28 files changed, 243 insertions(+), 787 deletions(-) diff --git a/src/components/ApplicationStarter.tsx b/src/components/ApplicationStarter.tsx index c4ec2c9b7..01fa2dca5 100644 --- a/src/components/ApplicationStarter.tsx +++ b/src/components/ApplicationStarter.tsx @@ -47,21 +47,12 @@ export interface ApplicationStarterProps { builderIntegration?: ApplicationStarterBuilderIntegration className?: string context: ApplicationStarterContext - footerContent?: React.ReactNode enableHotkeys?: boolean - forceRouterOnly?: boolean - formId?: string headerAction?: React.ReactNode - mode?: 'compact' | 'full' onDirtyStateChange?: (dirty: boolean) => void onResolvedResult?: (result: ApplicationStarterResult | null) => void - primaryActionLabel?: string revealOptionsImmediately?: boolean - secondaryActionLabel?: string - showCliExportActions?: boolean showPromptPreview?: boolean - suggestionContext?: ApplicationStarterContext - submitButton?: React.ReactNode title?: React.ReactNode tone?: StarterTone } @@ -143,21 +134,12 @@ export function ApplicationStarter({ builderIntegration, className, context, - footerContent, enableHotkeys = false, - forceRouterOnly = false, - formId, headerAction, - mode = 'full', onDirtyStateChange, onResolvedResult, - primaryActionLabel = 'Copy Prompt', revealOptionsImmediately = false, - secondaryActionLabel = 'Build with Netlify', - showCliExportActions = true, showPromptPreview = true, - suggestionContext, - submitButton, title = 'What would you like to build?', tone = 'cyan', }: ApplicationStarterProps) { @@ -204,16 +186,15 @@ export function ApplicationStarter({ } = useApplicationBuilder({ builderIntegration, context, - forceRouterOnly, - mode, + forceRouterOnly: false, + mode: 'full', onDirtyStateChange, onResolvedResult, revealOptionsImmediately, - suggestionContext, }) const palette = toneClasses[tone] - const compact = mode === 'compact' + const compact = false const isHomeStarter = context === 'home' const [pendingHostingDeployPartner, setPendingHostingDeployPartner] = React.useState(null) @@ -382,13 +363,6 @@ export function ApplicationStarter({ : undefined, [result?.prompt, selectedPromptDeployProvider], ) - const netlifyStartHref = React.useMemo( - () => - resultPrompt - ? buildStarterPromptDeployUrl('netlify', resultPrompt) - : undefined, - [resultPrompt], - ) const codexStartHref = React.useMemo( () => (resultPrompt ? buildCodexStartUrl(resultPrompt) : undefined), [resultPrompt], @@ -462,7 +436,7 @@ export function ApplicationStarter({ ? loadingPhrase : isPromptCopied ? 'Copied' - : primaryActionLabel} + : 'Copy Prompt'} ) const renderCopyCliCommandButton = () => ( @@ -765,7 +739,6 @@ export function ApplicationStarter({ ) : null}
{ event.preventDefault() @@ -1311,10 +1284,6 @@ export function ApplicationStarter({ - - {footerContent ? ( -
{footerContent}
- ) : null} ) : null} @@ -1341,45 +1310,6 @@ export function ApplicationStarter({ isHomeStarter && 'items-end', )} > - {!showCliExportActions ? ( -
- {!selectedHostingDeployPartner - ? renderActionAnchor({ - action: 'netlify', - className: - 'border-[#00AD9F] bg-[#00AD9F] text-white hover:bg-[#009a8e]', - href: netlifyStartHref, - icon: , - label: secondaryActionLabel, - onTrack: () => { - trackActivation({ - action: 'netlify_start', - surface: 'result_panel', - provider: 'netlify', - }) - }, - size: 'sm', - }) - : null} - - {renderActionAnchor({ - action: 'codex', - className: - 'border-gray-900 bg-gray-900 text-white hover:bg-gray-800 dark:border-gray-100 dark:bg-gray-100 dark:text-gray-950 dark:hover:bg-gray-200', - href: codexStartHref, - icon: , - label: 'Open in Codex', - onTrack: () => { - trackActivation({ - action: 'open_codex', - surface: 'result_panel', - }) - }, - size: 'sm', - })} -
- ) : null} -
{renderSelectedHostingDeployButton()} - {showCliExportActions - ? renderCopyCliCommandButton() - : null} + {renderCopyCliCommandButton()} {renderCopyPromptButton()}
- {showCliExportActions ? ( -
- {renderActionAnchor({ - action: 'codex', - className: - 'text-text-secondary hover:text-text-primary', - href: codexStartHref, - icon: ( - - ), - iconOnly: true, - label: 'Open in Codex', - onTrack: () => { - trackActivation({ - action: 'open_codex', - surface: 'result_panel', - }) - }, - size: 'xs', - })} - - {renderActionAnchor({ - action: 'claude', - className: - 'text-text-secondary hover:text-text-primary', - href: claudeStartHref, - icon: , - iconOnly: true, - label: 'Open in Claude', - onTrack: () => { - trackActivation({ - action: 'open_claude', - surface: 'result_panel', - }) - }, - size: 'xs', - })} - - {renderActionAnchor({ - action: 'cursor', - className: - 'text-text-secondary hover:text-text-primary', - href: cursorStartHref, - icon: , - iconOnly: true, - label: 'Open in Cursor', - onTrack: () => { - trackActivation({ - action: 'open_cursor', - surface: 'result_panel', - }) - }, - size: 'xs', - })} - - + {renderActionAnchor({ + action: 'codex', + className: + 'text-text-secondary hover:text-text-primary', + href: codexStartHref, + icon: ( + + ), + iconOnly: true, + label: 'Open in Codex', + onTrack: () => { + trackActivation({ + action: 'open_codex', + surface: 'result_panel', + }) + }, + size: 'xs', + })} + + {renderActionAnchor({ + action: 'claude', + className: + 'text-text-secondary hover:text-text-primary', + href: claudeStartHref, + icon: , + iconOnly: true, + label: 'Open in Claude', + onTrack: () => { + trackActivation({ + action: 'open_claude', + surface: 'result_panel', + }) + }, + size: 'xs', + })} + + {renderActionAnchor({ + action: 'cursor', + className: + 'text-text-secondary hover:text-text-primary', + href: cursorStartHref, + icon: , + iconOnly: true, + label: 'Open in Cursor', + onTrack: () => { + trackActivation({ + action: 'open_cursor', + surface: 'result_panel', + }) + }, + size: 'xs', + })} + + + - - - {renderActionAnchor({ - action: 'download', - className: - 'text-text-secondary hover:text-text-primary', - href: downloadHref, - icon: ( - + ) : ( + - ), - iconOnly: true, - label: 'Download ZIP', - onTrack: () => { - trackActivation({ - action: 'download', - surface: 'result_panel', - }) - }, - size: 'xs', - variant: 'secondary', - })} -
- ) : null} + )} + + + + {renderActionAnchor({ + action: 'download', + className: + 'text-text-secondary hover:text-text-primary', + href: downloadHref, + icon: ( + + ), + iconOnly: true, + label: 'Download ZIP', + onTrack: () => { + trackActivation({ + action: 'download', + surface: 'result_panel', + }) + }, + size: 'xs', + variant: 'secondary', + })} + ) : null} @@ -1536,8 +1459,6 @@ export function ApplicationStarter({ )} - - {compact ? submitButton : null} diff --git a/src/components/BlogCard.tsx b/src/components/BlogCard.tsx index 688ca4302..55b311703 100644 --- a/src/components/BlogCard.tsx +++ b/src/components/BlogCard.tsx @@ -16,16 +16,9 @@ export type { BlogCardPost } from '~/utils/blog-format' type BlogCardProps = { post: BlogCardPost showLibraryBadges?: boolean - /** Hero treatment: side-by-side on wider screens with larger type. Used for - * the single latest post at the top of the blog index. */ - featured?: boolean } -export function BlogCard({ - post, - showLibraryBadges = true, - featured = false, -}: BlogCardProps) { +export function BlogCard({ post, showLibraryBadges = true }: BlogCardProps) { const { slug, title, @@ -40,12 +33,9 @@ export function BlogCard({ const blogLibraries = showLibraryBadges ? getBlogLibraries(library) : [] const cardClassName = twMerge( 'relative flex flex-col justify-between overflow-hidden transition-all hover:shadow-sm hover:border-blue-500', - // Featured: image and copy sit side-by-side once there's room. - featured && 'md:flex-row md:justify-start', ) const mediaClassName = twMerge( 'aspect-video w-full overflow-hidden bg-background-subtle', - featured && 'md:aspect-auto md:w-1/2', ) const content = ( @@ -69,10 +59,10 @@ export function BlogCard({ fit: 'cover', format: 'auto', quality: 80, - width: featured ? 1200 : 800, + width: 800, })} alt="" - loading={featured ? 'eager' : 'lazy'} + loading="lazy" decoding="async" className="w-full h-full object-cover" /> @@ -84,21 +74,9 @@ export function BlogCard({ className={mediaClassName} /> )} -
+
-

- {title} -

+

{title}

by {formatAuthors(authors)} {published ? ( @@ -109,12 +87,7 @@ export function BlogCard({ ) : null}
{excerpt ? ( -

+

{excerpt}

) : null} diff --git a/src/components/Doc.tsx b/src/components/Doc.tsx index a58a2df54..2d21c9d02 100644 --- a/src/components/Doc.tsx +++ b/src/components/Doc.tsx @@ -35,8 +35,6 @@ type DocProps = { pagePath?: string // Breadcrumb props (optional) config?: ConfigSchema - // Footer content rendered after markdown - footer?: React.ReactNode // Optional framework to use (overrides URL and local storage) framework?: string } @@ -55,7 +53,6 @@ export function Doc({ libraryVersion, pagePath, config, - footer, framework: frameworkProp, }: DocProps) { const { groups: startHostingPartnerGroups } = useStartHostingPartners() @@ -194,7 +191,7 @@ export function Doc({ ) : null } /> - {footer ?? } +
diff --git a/src/components/Dropdown.tsx b/src/components/Dropdown.tsx index 2754c6a1e..f62d9e823 100644 --- a/src/components/Dropdown.tsx +++ b/src/components/Dropdown.tsx @@ -20,10 +20,8 @@ type DropdownContentProps = { className?: string align?: 'start' | 'center' | 'end' sideOffset?: number - portal?: boolean onFocus?: React.FocusEventHandler onPointerEnter?: React.PointerEventHandler - onPointerLeave?: React.PointerEventHandler } type DropdownItemProps = { @@ -67,35 +65,28 @@ export function DropdownContent({ className, align = 'end', sideOffset = 6, - portal = true, onFocus, onPointerEnter, - onPointerLeave, }: DropdownContentProps) { - const content = ( - - {children} - + return ( + + + {children} + + ) - - if (!portal) { - return content - } - - return {content} } export function DropdownItem({ diff --git a/src/components/FilterComponents.tsx b/src/components/FilterComponents.tsx index 936ca3442..eeca8b067 100644 --- a/src/components/FilterComponents.tsx +++ b/src/components/FilterComponents.tsx @@ -154,27 +154,16 @@ export function TopBarFilter({ interface FilterChipProps { label: string onRemove: () => void - onClick?: () => void className?: string } -export function FilterChip({ - label, - onRemove, - onClick, - className, -}: FilterChipProps) { +export function FilterChip({ label, onRemove, className }: FilterChipProps) { return ( e.key === 'Enter' && onClick() : undefined} - role={onClick ? 'button' : undefined} - tabIndex={onClick ? 0 : undefined} > {label} - {showNote ? ( -

- We'll use your TanStack login email. -

- ) : null} +

+ We'll use your TanStack login email. +

) } diff --git a/src/components/PartnersSponsorsSection.tsx b/src/components/PartnersSponsorsSection.tsx index 34dbae7ce..bad805537 100644 --- a/src/components/PartnersSponsorsSection.tsx +++ b/src/components/PartnersSponsorsSection.tsx @@ -12,7 +12,6 @@ type PartnersSponsorsContentProps = { } type PartnersSponsorsSectionProps = { - analyticsPlacement?: PartnerPlacement className?: string } @@ -106,7 +105,6 @@ function PartnersSponsorsSkeleton() { } export function PartnersSponsorsSection({ - analyticsPlacement = 'library_grid', className = '', }: PartnersSponsorsSectionProps) { return ( @@ -115,7 +113,7 @@ export function PartnersSponsorsSection({ when={visible({ rootMargin: '25%' })} fallback={} > - + ) diff --git a/src/components/RecentPostsWidget.tsx b/src/components/RecentPostsWidget.tsx index 9380fb323..66fbf9583 100644 --- a/src/components/RecentPostsWidget.tsx +++ b/src/components/RecentPostsWidget.tsx @@ -4,8 +4,7 @@ import { fetchRecentPosts, type RecentPost } from '~/utils/blog.functions' import { formatPublishedDate } from '~/utils/blog-format' type RecentPostsWidgetProps = { - posts?: ReadonlyArray - /** Set to false to skip the client fetch when the widget is rendered but not visible (e.g. hidden below a CSS breakpoint). Ignored when `posts` is provided. */ + /** Set to false to skip the client fetch when the widget is rendered but not visible (e.g. hidden below a CSS breakpoint). */ enabled?: boolean } @@ -88,18 +87,15 @@ function RecentPostsSkeleton() { ) } -export function RecentPostsWidget({ - posts, - enabled = true, -}: RecentPostsWidgetProps) { +export function RecentPostsWidget({ enabled = true }: RecentPostsWidgetProps) { const recentPostsQuery = useQuery({ queryKey: ['recentPosts'], queryFn: () => fetchRecentPosts(), - enabled: posts === undefined && enabled, + enabled, staleTime: 1000 * 60 * 5, }) - const visiblePosts = posts ?? recentPostsQuery.data + const visiblePosts = recentPostsQuery.data if (!visiblePosts) { return diff --git a/src/components/ShowcaseSection.tsx b/src/components/ShowcaseSection.tsx index 6c7d6b9f4..2257491e5 100644 --- a/src/components/ShowcaseSection.tsx +++ b/src/components/ShowcaseSection.tsx @@ -19,8 +19,6 @@ interface ShowcaseSectionProps { subtitle?: string libraryId?: LibraryId limit?: number - showViewAll?: boolean - minItems?: number } export function SubmitShowcasePlaceholder({ @@ -61,8 +59,6 @@ export function ShowcaseSection({ subtitle = 'See what the community is building', libraryId, limit = 6, - showViewAll = true, - minItems = 3, }: ShowcaseSectionProps) { const queryClient = useQueryClient() const currentUser = useCurrentUser() @@ -78,7 +74,7 @@ export function ShowcaseSection({ () => data?.showcases || [], [data?.showcases], ) - const placeholdersNeeded = Math.max(0, minItems - showcases.length) + const placeholdersNeeded = Math.max(0, 3 - showcases.length) const showcaseIds = React.useMemo( () => showcases.map((s) => s.showcase.id), @@ -206,7 +202,7 @@ export function ShowcaseSection({ {isLoading ? (
- {Array.from({ length: Math.max(limit, minItems) }).map((_, i) => ( + {Array.from({ length: Math.max(limit, 3) }).map((_, i) => ( ))}
@@ -234,21 +230,19 @@ export function ShowcaseSection({
)} - {showViewAll && ( -
- - - -
- )} +
+ + + +
) } diff --git a/src/components/StackBlitzEmbed.tsx b/src/components/StackBlitzEmbed.tsx index 11e54fdbc..6d412ddc4 100644 --- a/src/components/StackBlitzEmbed.tsx +++ b/src/components/StackBlitzEmbed.tsx @@ -6,9 +6,6 @@ type StackBlitzEmbedProps = { repo: string branch: string examplePath: string - file?: string - preset?: 'node' - height?: string | number title?: string } @@ -16,16 +13,12 @@ export function StackBlitzEmbed({ repo, branch, examplePath, - file, - preset = 'node', - height = '80vh', title, }: StackBlitzEmbedProps) { const isDark = useIsDark() const themeParam = isDark ? 'dark' : 'light' - const fileParam = file ? `&file=${encodeURIComponent(file)}` : '' - const src = `https://stackblitz.com/github/${repo}/tree/${branch}/${examplePath}?embed=1&theme=${themeParam}&preset=${preset}${fileParam}` + const src = `https://stackblitz.com/github/${repo}/tree/${branch}/${examplePath}?embed=1&theme=${themeParam}&preset=node` return ( //oxlint-disable-next-line jsx-a11y/iframe-has-title @@ -37,7 +30,7 @@ export function StackBlitzEmbed({ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts" className="shadow-lg" loading="lazy" - style={{ width: '100%', height, border: '0' }} + style={{ width: '100%', height: '80vh', border: '0' }} /> ) } diff --git a/src/components/TableComponents.tsx b/src/components/TableComponents.tsx index 239cfa97e..0926665be 100644 --- a/src/components/TableComponents.tsx +++ b/src/components/TableComponents.tsx @@ -59,16 +59,12 @@ interface TableHeaderCellProps { children?: React.ReactNode className?: string align?: 'left' | 'right' | 'center' - width?: string - compact?: boolean } export function TableHeaderCell({ children, className = '', align = 'left', - width, - compact = true, }: TableHeaderCellProps) { const alignClass = align === 'right' @@ -76,12 +72,9 @@ export function TableHeaderCell({ : align === 'center' ? 'text-center' : 'text-left' - const paddingClass = compact ? 'px-2 py-1.5' : 'px-4 py-2' - const textSizeClass = compact ? 'text-[10px]' : 'text-xs' return ( {children} @@ -93,8 +86,6 @@ interface SortableTableHeaderCellProps { children?: React.ReactNode className?: string align?: 'left' | 'right' | 'center' - width?: string - compact?: boolean sortable?: boolean sortDirection?: 'asc' | 'desc' | false onSort?: () => void @@ -104,8 +95,6 @@ export function SortableTableHeaderCell({ children, className = '', align = 'left', - width, - compact = true, sortable = false, sortDirection = false, onSort, @@ -116,22 +105,15 @@ export function SortableTableHeaderCell({ : align === 'center' ? 'text-center' : 'text-left' - const paddingClass = compact ? 'px-2 py-1.5' : 'px-4 py-2' - const textSizeClass = compact ? 'text-[10px]' : 'text-xs' - const baseClass = `${paddingClass} ${alignClass} ${textSizeClass} font-semibold text-gray-600 dark:text-gray-400 uppercase whitespace-nowrap ${className}` + const baseClass = `px-2 py-1.5 ${alignClass} text-[10px] font-semibold text-gray-600 dark:text-gray-400 uppercase whitespace-nowrap ${className}` if (!sortable) { - return ( - - {children} - - ) + return {children} } return ( ) => void } @@ -197,7 +178,6 @@ export function TableCell({ className = '', align = 'left', colSpan, - compact = true, onClick, }: TableCellProps) { const alignClass = @@ -206,10 +186,9 @@ export function TableCell({ : align === 'center' ? 'text-center' : 'text-left' - const paddingClass = compact ? 'px-2 py-2' : 'px-4 py-3' return ( diff --git a/src/components/admin/AdminEmptyState.tsx b/src/components/admin/AdminEmptyState.tsx index 6fa2cc84a..04cdb4319 100644 --- a/src/components/admin/AdminEmptyState.tsx +++ b/src/components/admin/AdminEmptyState.tsx @@ -1,22 +1,15 @@ import * as React from 'react' -import { Link } from '@tanstack/react-router' -import { Button } from '~/ui' type AdminEmptyStateProps = { icon: React.ReactNode title: string description?: string - action?: { - label: string - to: string - } } export function AdminEmptyState({ icon, title, description, - action, }: AdminEmptyStateProps) { return (
@@ -31,13 +24,6 @@ export function AdminEmptyState({ {description}

)} - {action && ( -
- - - -
- )}
) } diff --git a/src/components/ds/ui/index.tsx b/src/components/ds/ui/index.tsx index c014cc8a7..42c196d85 100644 --- a/src/components/ds/ui/index.tsx +++ b/src/components/ds/ui/index.tsx @@ -418,18 +418,16 @@ export const FormInput = React.forwardRef( }, ) -type FormSelectProps = React.SelectHTMLAttributes & { - focusRing?: 'blue' | 'orange' | 'purple' -} +type FormSelectProps = React.SelectHTMLAttributes export const FormSelect = React.forwardRef( - function FormSelect({ className, focusRing = 'blue', ...props }, ref) { + function FormSelect({ className, ...props }, ref) { return ( , 'size'> & { - /** Size variant. 'small' uses compact viewBox. Defaults to 'default'. */ - size?: 'default' | 'small' -} - -export function LogoQueryGG({ size = 'default', ...props }: LogoQueryGGProps) { - if (size === 'small') { - return ( -
- - Query.gg - The Official React Query Course - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ) - } +type LogoQueryGGProps = Omit, 'size'> +export function LogoQueryGG(props: LogoQueryGGProps) { // Default (large) size - keeping original SVG content return (
diff --git a/src/ui/Tooltip.tsx b/src/ui/Tooltip.tsx index 6cb52ded7..c397a6a46 100644 --- a/src/ui/Tooltip.tsx +++ b/src/ui/Tooltip.tsx @@ -6,7 +6,6 @@ interface TooltipProps { children: React.ReactNode content: React.ReactNode side?: 'top' | 'right' | 'bottom' | 'left' - align?: 'start' | 'center' | 'end' delayDuration?: number className?: string } @@ -15,7 +14,6 @@ export function Tooltip({ children, content, side = 'top', - align = 'center', delayDuration = 200, className, }: TooltipProps) { @@ -30,7 +28,7 @@ export function Tooltip({ Date: Thu, 20 Aug 2026 14:17:55 -0700 Subject: [PATCH 2/2] Remove unused optional arguments and fields that nothing provided. Co-authored-by: Cursor --- src/auth/oauth.server.ts | 12 +--- src/builder/api/create-worker.ts | 5 +- src/builder/api/feature-artifacts.ts | 3 - src/components/ApplicationStarter.tsx | 8 +-- src/components/AvatarCropModal.tsx | 7 +-- src/components/FilterComponents.tsx | 3 +- src/components/MaintainerCard.tsx | 6 -- src/components/Navbar.tsx | 11 ++-- src/components/OpenSourceStats.tsx | 62 ++++--------------- src/components/RightRail.tsx | 8 +-- src/components/SearchModal.tsx | 15 +---- src/components/ToastProvider.tsx | 3 +- src/components/application-builder/parts.tsx | 25 +------- .../useApplicationBuilder.tsx | 4 +- .../charts/ChartsCatalogResult.client.tsx | 11 ---- src/components/ds/DsKit.tsx | 20 +----- src/components/ds/ui/PageHeader.tsx | 21 +------ src/components/ds/ui/index.tsx | 23 +------ .../examples/ExampleWorkbench.client.tsx | 4 -- .../notebook/NotebookAgentActivity.tsx | 23 ++----- src/components/npm-stats/binning.ts | 3 +- src/components/npm-stats/npmQueryOptions.ts | 3 +- src/hooks/useAdminGuard.ts | 8 +-- src/hooks/useClickOutside.ts | 13 +--- src/hooks/useDeleteWithConfirmation.ts | 11 +--- src/libraries/maintainers.ts | 27 ++------ src/libraries/types.ts | 1 - src/queries/intent.ts | 1 - src/queries/roles.ts | 12 +--- src/routes/admin/index.tsx | 48 +++----------- src/routes/admin/users.tsx | 2 +- src/routes/maintainers.tsx | 13 +--- src/server/runtime/host.server.ts | 7 +-- src/server/shopify/fetch.ts | 6 -- src/server/sponsors.ts | 11 ---- src/utils/adminErrors.ts | 10 +-- src/utils/analytics.ts | 12 ++-- src/utils/application-starter.ts | 6 +- src/utils/audit.server.ts | 7 +-- src/utils/chart.ts | 3 +- src/utils/discord.server.ts | 3 - src/utils/documents.server.ts | 4 +- src/utils/email.server.ts | 1 - src/utils/github-repo.server.ts | 12 +--- src/utils/intent-sync.server.ts | 3 +- src/utils/intent-workflows.server.ts | 6 +- src/utils/notebook-ai-activity.ts | 8 +-- src/utils/notebook-ai-stream.client.ts | 3 - src/utils/notebook-environment.ts | 3 +- src/utils/partners.tsx | 5 +- src/utils/prod-diagnostics.server.ts | 11 +--- src/utils/repository-example.ts | 3 - src/utils/showcase.server.ts | 7 +-- src/utils/sponsors.functions.ts | 11 ---- src/utils/stats.types.ts | 3 - src/utils/url-boundary.ts | 10 +-- src/utils/workflow-runtime.server.ts | 18 ++---- 57 files changed, 109 insertions(+), 480 deletions(-) diff --git a/src/auth/oauth.server.ts b/src/auth/oauth.server.ts index f980169b2..418eb886c 100644 --- a/src/auth/oauth.server.ts +++ b/src/auth/oauth.server.ts @@ -269,23 +269,13 @@ export async function exchangeGitHubCode( code: string, clientId: string, clientSecret: string, - redirectUri?: string, ): Promise { - const body: { - client_id: string - client_secret: string - code: string - redirect_uri?: string - } = { + const body = { client_id: clientId, client_secret: clientSecret, code, } - if (redirectUri) { - body.redirect_uri = redirectUri - } - const tokenResponse = await fetch( 'https://github.com/login/oauth/access_token', { diff --git a/src/builder/api/create-worker.ts b/src/builder/api/create-worker.ts index 8bdd95275..c53017fe0 100644 --- a/src/builder/api/create-worker.ts +++ b/src/builder/api/create-worker.ts @@ -123,9 +123,7 @@ type GeneratedAddOnMetadata = Omit< | 'partner' | 'packageAdditions' > & - GeneratedAddOnFields & { - packageAdditions?: GeneratedAddOnPackageAdditions - } + GeneratedAddOnFields type GeneratedWorkerAddOnManifestModule = GeneratedWorkerManifestModule & { addOn: GeneratedAddOnManifest @@ -365,7 +363,6 @@ function getAddOnMetadata( envVars: getAddOnEnvVars(addOn.envVars), options: getAddOnOptions(addOn.options), partner: getAddOnPartner(addOn.partner), - packageAdditions: getPackageAdditions(addOn.packageAdditions), } } diff --git a/src/builder/api/feature-artifacts.ts b/src/builder/api/feature-artifacts.ts index 905c22c35..335f020b0 100644 --- a/src/builder/api/feature-artifacts.ts +++ b/src/builder/api/feature-artifacts.ts @@ -1,4 +1,3 @@ -import { type AddOnCompiled } from './compile' import { compileWithAttributionHandler, type ProjectDefinition } from './compile' import { type FrameworkId } from './config' @@ -8,7 +7,6 @@ export interface FeatureArtifactsRequest { framework?: FrameworkId tailwind?: boolean featureOptions?: Record> - customIntegrations?: Array } export interface FeatureArtifact { @@ -44,7 +42,6 @@ export async function featureArtifactsHandler( tailwind, features: request.features, featureOptions: request.featureOptions ?? {}, - customIntegrations: request.customIntegrations, } const output = await compileWithAttributionHandler(definition) diff --git a/src/components/ApplicationStarter.tsx b/src/components/ApplicationStarter.tsx index 01fa2dca5..e021fdf62 100644 --- a/src/components/ApplicationStarter.tsx +++ b/src/components/ApplicationStarter.tsx @@ -472,9 +472,7 @@ export function ApplicationStarter({ label, iconOnly = false, onTrack, - rel = 'noopener noreferrer', size, - target = '_blank', variant = 'primary', }: { action: StarterTransientAction @@ -484,9 +482,7 @@ export function ApplicationStarter({ label: string iconOnly?: boolean onTrack: () => void - rel?: string size: 'xs' | 'sm' - target?: string variant?: 'primary' | 'secondary' }) => { const disabled = !canUseFinalActions || !href || transientAction === action @@ -499,8 +495,8 @@ export function ApplicationStarter({ color={iconOnly ? 'gray' : undefined} size={iconOnly ? 'icon-sm' : size} href={disabled ? undefined : href} - target={target} - rel={rel} + target="_blank" + rel="noopener noreferrer" aria-disabled={disabled} aria-label={iconOnly ? label : undefined} tabIndex={disabled ? -1 : undefined} diff --git a/src/components/AvatarCropModal.tsx b/src/components/AvatarCropModal.tsx index 47772969c..4b543ca5a 100644 --- a/src/components/AvatarCropModal.tsx +++ b/src/components/AvatarCropModal.tsx @@ -12,11 +12,8 @@ interface AvatarCropModalProps { onCropComplete: (croppedBlob: Blob) => void } -async function getCroppedImg( - imageSrc: string, - pixelCrop: Area, - outputSize: number = 256, -): Promise { +async function getCroppedImg(imageSrc: string, pixelCrop: Area): Promise { + const outputSize = 256 const image = new Image() image.crossOrigin = 'anonymous' diff --git a/src/components/FilterComponents.tsx b/src/components/FilterComponents.tsx index eeca8b067..a164aa7a8 100644 --- a/src/components/FilterComponents.tsx +++ b/src/components/FilterComponents.tsx @@ -396,11 +396,10 @@ export function FilterDropdownSection({ export function getFilterChipLabel( facetName: string, values: string[], - maxDisplay = 2, ): string { if (values.length === 0) return '' if (values.length === 1) return `${facetName}: ${values[0]}` - if (values.length <= maxDisplay) return `${facetName}: ${values.join(', ')}` + if (values.length <= 2) return `${facetName}: ${values.join(', ')}` return `${facetName} (${values.length})` } diff --git a/src/components/MaintainerCard.tsx b/src/components/MaintainerCard.tsx index 9fc5693e6..f7482cfe2 100644 --- a/src/components/MaintainerCard.tsx +++ b/src/components/MaintainerCard.tsx @@ -245,12 +245,6 @@ interface CompactMaintainerCardProps { interface MaintainerRowCardProps { maintainer: Maintainer libraryId?: Library['id'] - stats?: { - totalCommits: number - totalPullRequests: number - totalIssues: number - totalReviews: number - } } export function CompactMaintainerCard({ diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 3f09c3e14..44b559a39 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -556,7 +556,7 @@ export function Navbar({ children }: { children: React.ReactNode }) { } }, [mobileMenuOpen]) - const getLoginButtonFallback = (className?: string) => ( + const getLoginButtonFallback = () => ( Log In ) - const renderAuthControls = (className?: string) => + const renderAuthControls = () => canLoadAuthControls ? ( - - + + ) : ( - getLoginButtonFallback(className) + getLoginButtonFallback() ) const socialLinks = diff --git a/src/components/OpenSourceStats.tsx b/src/components/OpenSourceStats.tsx index 85e3d6835..d766991c2 100644 --- a/src/components/OpenSourceStats.tsx +++ b/src/components/OpenSourceStats.tsx @@ -4,20 +4,9 @@ import { DownloadSimpleIcon, StarIcon, } from '@phosphor-icons/react' -import { type Library } from '~/libraries' -import { - homepageNpmStatsSummaryQuery, - ossStatsQuery, - recentDownloadsQuery, -} from '~/queries/stats' +import { homepageNpmStatsSummaryQuery, ossStatsQuery } from '~/queries/stats' import { useNpmDownloadCounter } from '~/hooks/useNpmDownloadCounter' -import { - StatsSection, - type StatItem, - type StatsLayout, - type StatsPage, -} from '~/components/ds/ui' -import { tanStackTotalNpmStatsLibrary } from '~/utils/tanstack-npm-stats' +import { StatsSection, type StatItem, type StatsPage } from '~/components/ds/ui' /** Compact count with a single-letter magnitude, e.g. 2_340_000_000 → "2.3B". */ function formatCompact(value: number) { @@ -39,40 +28,19 @@ function isValidMetric(value: number | undefined | null): boolean { export default function OssStats({ className, - layout = 'landscape', - library, page = 'home', }: { className?: string - layout?: StatsLayout - library?: Library page?: StatsPage }) { - const { data: stats, isLoading } = useQuery(ossStatsQuery({ library })) + const { data: stats, isLoading } = useQuery(ossStatsQuery()) const { data: homepageNpmSummary, isLoading: isLoadingHomepageNpmSummary } = - useQuery({ - ...homepageNpmStatsSummaryQuery(), - enabled: !library, - }) - const { data: recentDownloads, isLoading: isLoadingRecentDownloads } = - useQuery({ - ...recentDownloadsQuery({ - library: library ?? tanStackTotalNpmStatsLibrary, - }), - enabled: Boolean(library), - }) + useQuery(homepageNpmStatsSummaryQuery()) - const totalNpmStats = stats?.npm - const npmDownloads = library - ? (totalNpmStats?.totalDownloads ?? 0) - : (homepageNpmSummary?.totalDownloads ?? 0) + const npmDownloads = homepageNpmSummary?.totalDownloads ?? 0 const starCount = stats?.github?.starCount ?? 0 - const weeklyDownloads = library - ? (recentDownloads?.weeklyDownloads ?? 0) - : (homepageNpmSummary?.weeklyDownloads ?? 0) - const weeklyRatePerDay = library - ? undefined - : homepageNpmSummary?.weeklyRatePerDay + const weeklyDownloads = homepageNpmSummary?.weeklyDownloads ?? 0 + const weeklyRatePerDay = homepageNpmSummary?.weeklyRatePerDay // Live-ticking weekly counter — writes into the value node after mount. const weeklyRef = useNpmDownloadCounter({ @@ -81,20 +49,14 @@ export default function OssStats({ }) const hasNpmDownloads = - !(library ? isLoading : isLoadingHomepageNpmSummary) && - isValidMetric(npmDownloads) + !isLoadingHomepageNpmSummary && isValidMetric(npmDownloads) const hasStarCount = !isLoading && isValidMetric(starCount) const hasWeeklyDownloads = - !(library ? isLoadingRecentDownloads : isLoadingHomepageNpmSummary) && - isValidMetric(weeklyDownloads) + !isLoadingHomepageNpmSummary && isValidMetric(weeklyDownloads) const loading = isLoading || !stats - const npmLoading = library - ? isLoading || !totalNpmStats - : isLoadingHomepageNpmSummary || !homepageNpmSummary - const weeklyLoading = library - ? isLoadingRecentDownloads || !recentDownloads - : isLoadingHomepageNpmSummary || !homepageNpmSummary + const npmLoading = isLoadingHomepageNpmSummary || !homepageNpmSummary + const weeklyLoading = isLoadingHomepageNpmSummary || !homepageNpmSummary const items: Array = [] @@ -139,7 +101,7 @@ export default function OssStats({ ) diff --git a/src/components/RightRail.tsx b/src/components/RightRail.tsx index 0d80f9e3f..ef153d719 100644 --- a/src/components/RightRail.tsx +++ b/src/components/RightRail.tsx @@ -122,13 +122,9 @@ const railTierLayout: Record< export function PartnersRail({ analyticsPlacement, partners, - title = 'Partners', - titleTo = '/partners', }: { analyticsPlacement: PartnerPlacement partners: Array - title?: string - titleTo?: '/partners' }) { const placementContext = usePartnerPlacementContext({ orderStrategy: 'tier-rotated', @@ -147,9 +143,9 @@ export function PartnersRail({ - {action}
) } @@ -2935,13 +2934,11 @@ function SearchResultsInChat({ surface }: { surface: SearchSurface }) { const Hit = ({ hit, commandValue, - isFocused, refinedLibrary, refinedFramework, }: { hit: AlgoliaHit commandValue?: string - isFocused?: boolean refinedLibrary: string | null refinedFramework: string | null }) => { @@ -2986,12 +2983,6 @@ const Hit = ({ const ref = React.useRef(null!) - React.useEffect(() => { - if (isFocused) { - ref.current?.scrollIntoView({ behavior: 'instant', block: 'nearest' }) - } - }, [isFocused]) - // Get library and framework info for this hit const hitLibrary = hit.library as string | undefined const hitFramework = @@ -3128,13 +3119,13 @@ const Hit = ({ href={hitUrl} className={twMerge( 'block px-4 py-2.5 focus:outline-none border-b border-gray-300 dark:border-gray-700', - isFocused ? 'bg-gray-500/20' : 'hover:bg-gray-500/10', + 'hover:bg-gray-500/10', )} onKeyDown={handleKeyDown} onFocus={() => ref.current?.focus()} onClick={handleClick} role="option" - aria-selected={isFocused} + aria-selected={false} tabIndex={-1} data-search-hit="true" ref={ref} diff --git a/src/components/ToastProvider.tsx b/src/components/ToastProvider.tsx index 927627c28..924df823a 100644 --- a/src/components/ToastProvider.tsx +++ b/src/components/ToastProvider.tsx @@ -3,7 +3,6 @@ import { Toaster, toast } from 'sonner' import { useTheme } from '~/components/ThemeProvider' type ToastOptions = { - durationMs?: number id?: number | string } @@ -31,7 +30,7 @@ export function ToastProvider({ const notify = React.useCallback( (content: React.ReactNode, options?: ToastOptions) => { const id = toast(content, { - duration: options?.durationMs ?? 2500, + duration: 2500, id: options?.id, }) return String(id) diff --git a/src/components/application-builder/parts.tsx b/src/components/application-builder/parts.tsx index b4b1315d1..ba664df1d 100644 --- a/src/components/application-builder/parts.tsx +++ b/src/components/application-builder/parts.tsx @@ -22,7 +22,6 @@ export function StarterChipButton({ className, children, compact = false, - disabled = false, onClick, palette, selected, @@ -31,7 +30,6 @@ export function StarterChipButton({ className?: string children: React.ReactNode compact?: boolean - disabled?: boolean onClick?: () => void palette: StarterPalette selected: boolean @@ -41,7 +39,6 @@ export function StarterChipButton({
{isLoading ? ( @@ -1298,19 +1274,9 @@ function DauChartCard({ ) } -function LoginsChartCard({ - title, - defaultTimeRange = '30-days', - height = 200, -}: { - title: string - defaultTimeRange?: TimeRange - height?: number -}) { - const [timeRange, setTimeRange] = useState(defaultTimeRange) - const [binType, setBinType] = useState( - defaultBinForRange[defaultTimeRange], - ) +function LoginsChartCard({ title }: { title: string }) { + const [timeRange, setTimeRange] = useState('30-days') + const [binType, setBinType] = useState(defaultBinForRange['30-days']) const { data, isLoading } = useQuery({ queryKey: ['admin', 'logins-chart', timeRange], @@ -1337,13 +1303,13 @@ function LoginsChartCard({ Loading... ) : ( - }> + }> diff --git a/src/routes/admin/users.tsx b/src/routes/admin/users.tsx index 65177d8cb..033dbf874 100644 --- a/src/routes/admin/users.tsx +++ b/src/routes/admin/users.tsx @@ -316,7 +316,7 @@ function UsersPage() { const bulkAssignRolesToUsers = useBulkAssignRolesToUsers() const bulkUpdateUserCapabilities = useBulkUpdateUserCapabilities() const allRolesQuery = useQuery({ - ...listRolesQueryOptions({}), + ...listRolesQueryOptions(), placeholderData: keepPreviousData, }) const allRoles = useMemo(() => allRolesQuery.data || [], [allRolesQuery.data]) diff --git a/src/routes/maintainers.tsx b/src/routes/maintainers.tsx index 733472ea5..52d9785a1 100644 --- a/src/routes/maintainers.tsx +++ b/src/routes/maintainers.tsx @@ -319,18 +319,10 @@ function MaintainerGrid({ maintainers, viewMode, title, - stats, }: { maintainers: Maintainer[] viewMode: 'compact' | 'full' | 'row' title?: string - stats?: Array<{ - username: string - totalCommits: number - totalPullRequests: number - totalIssues: number - totalReviews: number - }> }) { return (
@@ -356,10 +348,7 @@ function MaintainerGrid({ {viewMode === 'compact' ? ( ) : viewMode === 'row' ? ( - s.username === maintainer.github)} - /> + ) : ( )} diff --git a/src/server/runtime/host.server.ts b/src/server/runtime/host.server.ts index e47ba5d15..36df4623e 100644 --- a/src/server/runtime/host.server.ts +++ b/src/server/runtime/host.server.ts @@ -134,12 +134,9 @@ export async function getHostRuntimeEnv() { } } -export async function fetchStaticAsset( - input: RequestInfo | URL, - init?: RequestInit, -) { +export async function fetchStaticAsset(input: RequestInfo | URL) { const staticAssets = await getStaticAssetService() - return staticAssets ? staticAssets.fetch(input, init) : fetch(input, init) + return staticAssets ? staticAssets.fetch(input) : fetch(input) } export async function getDatabaseConnectionString() { diff --git a/src/server/shopify/fetch.ts b/src/server/shopify/fetch.ts index 4463d2cb2..a49fd04cb 100644 --- a/src/server/shopify/fetch.ts +++ b/src/server/shopify/fetch.ts @@ -14,11 +14,6 @@ const SHOPIFY_API_VERSION = '2026-01' type ShopifyFetchInput = { query: string variables?: TVariables - /** - * Optional buyer IP, forwarded to Shopify's bot-protection headers. - * Only meaningful with the private token. - */ - buyerIp?: string } type ShopifyResponse = { @@ -59,7 +54,6 @@ export async function shopifyServerFetch< Accept: 'application/json', 'Shopify-Storefront-Private-Token': token, } - if (input.buyerIp) headers['Shopify-Storefront-Buyer-IP'] = input.buyerIp const response = await fetch( `https://${SHOPIFY_STORE_DOMAIN}/api/${SHOPIFY_API_VERSION}/graphql.json`, diff --git a/src/server/sponsors.ts b/src/server/sponsors.ts index f65dffbb9..42ba26c78 100644 --- a/src/server/sponsors.ts +++ b/src/server/sponsors.ts @@ -11,7 +11,6 @@ export type SponsorMeta = { imageUrl?: string linkUrl?: string private?: boolean - amount?: number } export type Sponsor = { @@ -76,16 +75,6 @@ export async function getSponsors() { linkUrl: sponsorMeta.linkUrl ?? matchingSponsor.linkUrl, private: sponsorMeta.private ?? matchingSponsor.private, }) - } else if (sponsorMeta.amount) { - sponsors.push({ - login: sponsorMeta.login, - name: sponsorMeta.name || '', - imageUrl: sponsorMeta.imageUrl || '', - linkUrl: sponsorMeta.linkUrl || '', - private: sponsorMeta.private || false, - createdAt: new Date().toISOString(), - amount: sponsorMeta.amount || 0, - }) } }) diff --git a/src/utils/adminErrors.ts b/src/utils/adminErrors.ts index 03ce2d232..6eca3d604 100644 --- a/src/utils/adminErrors.ts +++ b/src/utils/adminErrors.ts @@ -9,16 +9,10 @@ * handleAdminError(error, 'Failed to delete role') * } */ -export function handleAdminError( - error: unknown, - context: string, - options?: { silent?: boolean }, -): string { +export function handleAdminError(error: unknown, context: string): string { const message = error instanceof Error ? error.message : 'Unknown error' console.error(`${context}:`, error) - if (!options?.silent) { - alert(`${context}: ${message}`) - } + alert(`${context}: ${message}`) return message } diff --git a/src/utils/analytics.ts b/src/utils/analytics.ts index 862fcc067..55d33fefe 100644 --- a/src/utils/analytics.ts +++ b/src/utils/analytics.ts @@ -22,10 +22,8 @@ export type { export { defaultBuilderSessionContext } from './analytics/events' interface ImpressionOptions { - enabled?: boolean event: TName props: AnalyticsEventProps - threshold?: number } function getPageType(pathname: string) { @@ -172,7 +170,7 @@ export function trackPageView(pagePath: string) { export function useTrackedImpression< TName extends AnalyticsEventName, TElement extends Element = Element, ->({ enabled = true, event, props, threshold = 0.5 }: ImpressionOptions) { +>({ event, props }: ImpressionOptions) { const ref = React.useRef(null) const hasTrackedRef = React.useRef(false) const propsRef = React.useRef(props) @@ -182,7 +180,7 @@ export function useTrackedImpression< }, [props]) React.useEffect(() => { - if (!enabled || hasTrackedRef.current) { + if (hasTrackedRef.current) { return } @@ -212,7 +210,7 @@ export function useTrackedImpression< continue } - if (entry.intersectionRatio < threshold) { + if (entry.intersectionRatio < 0.5) { continue } @@ -221,7 +219,7 @@ export function useTrackedImpression< return } }, - { threshold: [threshold] }, + { threshold: [0.5] }, ) observer.observe(element) @@ -229,7 +227,7 @@ export function useTrackedImpression< return () => { observer.disconnect() } - }, [enabled, event, threshold]) + }, [event]) return ref } diff --git a/src/utils/application-starter.ts b/src/utils/application-starter.ts index 3c258f436..b4c58bfc5 100644 --- a/src/utils/application-starter.ts +++ b/src/utils/application-starter.ts @@ -546,13 +546,11 @@ export async function resolveApplicationStarterDeterministically({ export function composeApplicationStarterResult({ input, - prompt, rationale, recipe, resultType, }: { input: string - prompt?: string rationale: Array recipe: ApplicationStarterRecipe resultType: ApplicationStarterResultType @@ -567,9 +565,7 @@ export function composeApplicationStarterResult({ resultType === 'migration' ? 'Your migration prompt is ready' : 'Your prompt is ready', - prompt: sanitizeStarterPrompt( - prompt || buildPrompt({ input, resultType, recipe }), - ), + prompt: sanitizeStarterPrompt(buildPrompt({ input, resultType, recipe })), rationale, recipe, resultType, diff --git a/src/utils/audit.server.ts b/src/utils/audit.server.ts index 2ccd41e49..7ad6de6d0 100644 --- a/src/utils/audit.server.ts +++ b/src/utils/audit.server.ts @@ -35,9 +35,8 @@ export async function recordAuditLog(opts: { targetType: 'user' | 'role' | 'banner' | 'feed_entry' | 'feedback' targetId: string details?: Record - request?: Request }): Promise { - const { actorId, action, targetType, targetId, details, request } = opts + const { actorId, action, targetType, targetId, details } = opts await db.insert(auditLogs).values({ actorId, @@ -45,7 +44,7 @@ export async function recordAuditLog(opts: { targetType, targetId, details: details ?? null, - ipAddress: request ? getClientIp(request) : undefined, - userAgent: request?.headers.get('user-agent') || undefined, + ipAddress: undefined, + userAgent: undefined, }) } diff --git a/src/utils/chart.ts b/src/utils/chart.ts index 1a977a3fd..f2c3bc4e2 100644 --- a/src/utils/chart.ts +++ b/src/utils/chart.ts @@ -84,12 +84,11 @@ export function getCurrentBinStart(binType: BinType): Date { export function binTimeSeriesData( data: Array<{ date: string; count: number }>, binType: BinType, - options?: { includeIncomplete?: boolean }, ): Array<{ date: Date; count: number }> { if (data.length === 0) return [] const binFn = getBinFunction(binType) - const includeIncomplete = options?.includeIncomplete ?? true + const includeIncomplete = true const parsed = data.map((d) => ({ date: new Date(d.date), diff --git a/src/utils/discord.server.ts b/src/utils/discord.server.ts index 37473cd7a..6b52b0f08 100644 --- a/src/utils/discord.server.ts +++ b/src/utils/discord.server.ts @@ -21,10 +21,7 @@ type DiscordEmbed = { } type DiscordWebhookPayload = { - content?: string embeds?: Array - username?: string - avatar_url?: string } export async function sendDiscordNotification( diff --git a/src/utils/documents.server.ts b/src/utils/documents.server.ts index 656995c4d..b9f0e70c7 100644 --- a/src/utils/documents.server.ts +++ b/src/utils/documents.server.ts @@ -955,8 +955,8 @@ function createExcerpt(text: string, maxLength = 200) { return cleanText } -function createRichExcerpt(text: string, maxLength = 200) { - let cleanText = createExcerpt(text, maxLength) +function createRichExcerpt(text: string) { + let cleanText = createExcerpt(text, 200) const imageText = extractFirstImage(text) diff --git a/src/utils/email.server.ts b/src/utils/email.server.ts index 310ea5042..d2df8c627 100644 --- a/src/utils/email.server.ts +++ b/src/utils/email.server.ts @@ -32,7 +32,6 @@ type ModeratorNotification = { capability: Capability subject: string text: string - html?: string // Extended fields for Discord notifications _showcase?: ShowcaseData _feedback?: FeedbackData diff --git a/src/utils/github-repo.server.ts b/src/utils/github-repo.server.ts index 1cd5c0355..32eb35c59 100644 --- a/src/utils/github-repo.server.ts +++ b/src/utils/github-repo.server.ts @@ -9,7 +9,6 @@ export interface CreateRepoOptions { name: string description?: string isPrivate?: boolean - autoInit?: boolean } export interface CreateRepoResult { @@ -76,12 +75,8 @@ function isSafeGitHubPath(path: string) { export function validateGitHubFiles( files: Record, - options: GitHubFileBudgetOptions = {}, ): { valid: true } | { valid: false; error: string } { - const budget = { - ...DEFAULT_GITHUB_FILE_BUDGET, - ...options, - } + const budget = DEFAULT_GITHUB_FILE_BUDGET const entries = Object.entries(files) if (entries.length === 0) { @@ -141,7 +136,7 @@ export async function createRepository( name: options.name, description: options.description, private: options.isPrivate ?? false, - auto_init: options.autoInit ?? false, + auto_init: false, }), }) @@ -312,7 +307,6 @@ export interface PushFilesOptions { repo: string files: Record message?: string - branch?: string } /** @@ -343,8 +337,8 @@ export async function pushFiles( repo, files, message = 'Initial commit from TanStack Builder', - branch = 'main', } = options + const branch = 'main' const fileValidation = validateGitHubFiles(files) if (!fileValidation.valid) { diff --git a/src/utils/intent-sync.server.ts b/src/utils/intent-sync.server.ts index e4319dea0..8fc0e063e 100644 --- a/src/utils/intent-sync.server.ts +++ b/src/utils/intent-sync.server.ts @@ -164,12 +164,11 @@ export async function selectPendingIntentVersions(options: { export function summarizeIntentProcessResults( results: Array, - options?: { deferred?: number }, ): IntentProcessResult { return { processed: results.filter((result) => result.status === 'synced').length, failed: results.filter((result) => result.status === 'failed').length, - deferred: options?.deferred ?? 0, + deferred: 0, results, } } diff --git a/src/utils/intent-workflows.server.ts b/src/utils/intent-workflows.server.ts index 3cb2ee436..ee1973c33 100644 --- a/src/utils/intent-workflows.server.ts +++ b/src/utils/intent-workflows.server.ts @@ -40,16 +40,14 @@ export const INTENT_PROCESS_WORKFLOW_ID = 'intent-process-workflow' export const INTENT_DISCOVER_SCHEDULE_ID = 'intent-discover-every-6h' export const INTENT_PROCESS_SCHEDULE_ID = 'intent-process-every-15m' -function createIntentDiscoverWorkflow( - operations: IntentSyncOperations = defaultIntentSyncOperations, -) { +function createIntentDiscoverWorkflow() { return createWorkflow({ id: INTENT_DISCOVER_WORKFLOW_ID, input: intentDiscoverInputSchema, }).handler((ctx) => ctx.step( 'discover-intent-packages', - () => operations.discoverIntentPackages(), + () => defaultIntentSyncOperations.discoverIntentPackages(), discoverStepOptions, ), ) diff --git a/src/utils/notebook-ai-activity.ts b/src/utils/notebook-ai-activity.ts index af64ebdb9..aefec4725 100644 --- a/src/utils/notebook-ai-activity.ts +++ b/src/utils/notebook-ai-activity.ts @@ -514,13 +514,11 @@ export function getNotebookAiActivityItemLabel(item: NotebookAiActivityItem) { return complete ? `Completed ${label.toLowerCase()}` : label } -export function formatNotebookAiActivityDuration( - activity: NotebookAiActivity, - now = activity.completedAt ?? activity.startedAt, -) { +export function formatNotebookAiActivityDuration(activity: NotebookAiActivity) { const milliseconds = Math.max( 0, - (activity.completedAt ?? cleanTimestamp(now)) - activity.startedAt, + (activity.completedAt ?? cleanTimestamp(activity.startedAt)) - + activity.startedAt, ) const seconds = Math.max(1, Math.round(milliseconds / 1_000)) if (seconds < 60) return `${seconds}s` diff --git a/src/utils/notebook-ai-stream.client.ts b/src/utils/notebook-ai-stream.client.ts index 9bd896cb1..ce50ad483 100644 --- a/src/utils/notebook-ai-stream.client.ts +++ b/src/utils/notebook-ai-stream.client.ts @@ -44,7 +44,6 @@ export async function runNotebookAiStream({ activityId, includeReasoningSummaries = false, onActivityEvent, - onChunk, onText, onLocalValidate, onValidate, @@ -57,7 +56,6 @@ export async function runNotebookAiStream({ activityId: string includeReasoningSummaries?: boolean onActivityEvent?: (event: NotebookAiActivityEvent) => void - onChunk?: (chunk: StreamChunk) => void onText?: (text: string) => void onLocalValidate?: ( state: NotebookAiValidationState, @@ -329,7 +327,6 @@ export async function runNotebookAiStream({ throw new Error('Notebook AI returned an invalid execution result') } - onChunk?.(chunk) observeTextChunk(chunk) observeActivityChunk(chunk) diff --git a/src/utils/notebook-environment.ts b/src/utils/notebook-environment.ts index 667da546b..c0437558d 100644 --- a/src/utils/notebook-environment.ts +++ b/src/utils/notebook-environment.ts @@ -52,13 +52,12 @@ export const notebookImports = { function defineExampleEnvironmentProfile({ createEntrySource, - entryPath = '/__tanstack-example-entry.ts', outputSelector, }: { createEntrySource: (entry: string, outputSource: string) => string - entryPath?: string outputSelector: `#${string}` }) { + const entryPath = '/__tanstack-example-entry.ts' return { entryPath, outputSelector, diff --git a/src/utils/partners.tsx b/src/utils/partners.tsx index 282505433..1a5c734db 100644 --- a/src/utils/partners.tsx +++ b/src/utils/partners.tsx @@ -1511,11 +1511,10 @@ function findApplicationStarterPartnerSuggestion( export function hasApplicationStarterPartnerConflictWithAny( partnerId: string, partnerIds: Array, - partnerSuggestions: Array = applicationStarterPartnerSuggestions, ) { const partner = findApplicationStarterPartnerSuggestion( partnerId, - partnerSuggestions, + applicationStarterPartnerSuggestions, ) if (!partner) { @@ -1529,7 +1528,7 @@ export function hasApplicationStarterPartnerConflictWithAny( const candidate = findApplicationStarterPartnerSuggestion( candidateId, - partnerSuggestions, + applicationStarterPartnerSuggestions, ) return candidate ? hasSharedUniqueConstraint(partner, candidate) : false diff --git a/src/utils/prod-diagnostics.server.ts b/src/utils/prod-diagnostics.server.ts index a3dac98d7..874b6024c 100644 --- a/src/utils/prod-diagnostics.server.ts +++ b/src/utils/prod-diagnostics.server.ts @@ -55,13 +55,8 @@ function getResourceSummary(): Record { return summary } -function getTopHosts( - outboundHosts: HostCounter, - limit = 8, -): Array<[string, number]> { - return [...outboundHosts.entries()] - .sort((a, b) => b[1] - a[1]) - .slice(0, limit) +function getTopHosts(outboundHosts: HostCounter): Array<[string, number]> { + return [...outboundHosts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 8) } function toUrl(input: RequestInfo | URL): URL | null { @@ -276,7 +271,6 @@ export function logRequestEnd( export function logRequestError( context: RequestDiagnostics, error: unknown, - extra?: Record, ): void { if (!isProduction) { return @@ -311,7 +305,6 @@ export function logRequestError( topOutboundHosts: getTopHosts(context.outboundHosts), resourceSummary: getResourceSummary(), ...errorDetails, - ...extra, }) } diff --git a/src/utils/repository-example.ts b/src/utils/repository-example.ts index f3229e26a..43ba4f629 100644 --- a/src/utils/repository-example.ts +++ b/src/utils/repository-example.ts @@ -7,7 +7,6 @@ import { export function createRepositoryExampleDefinition({ binaryFiles, - description, entry, files, id, @@ -16,7 +15,6 @@ export function createRepositoryExampleDefinition({ title, }: { binaryFiles?: Record - description?: string entry: string files: Record id: string @@ -37,7 +35,6 @@ export function createRepositoryExampleDefinition({ return { id, title, - ...(description ? { description } : {}), ...(runtime ? { runtime } : {}), initialFile: workspace.files[normalizedInitialFile] === undefined diff --git a/src/utils/showcase.server.ts b/src/utils/showcase.server.ts index 09f82ed1f..9457f3e4c 100644 --- a/src/utils/showcase.server.ts +++ b/src/utils/showcase.server.ts @@ -444,24 +444,19 @@ export interface GetMyShowcasesOptions { page?: number pageSize?: number } - status?: ShowcaseStatus } /** * Core: Get user's own showcases */ export async function getMyShowcasesCore(options: GetMyShowcasesOptions) { - const { userId, pagination = {}, status } = options + const { userId, pagination = {} } = options const page = pagination.page ?? 1 const pageSize = pagination.pageSize ?? 20 // Build where conditions const conditions = [eq(showcases.userId, userId)] - if (status) { - conditions.push(eq(showcases.status, status)) - } - const whereClause = and(...conditions) // Get total count diff --git a/src/utils/sponsors.functions.ts b/src/utils/sponsors.functions.ts index f7d2be19c..29bd8b2a7 100644 --- a/src/utils/sponsors.functions.ts +++ b/src/utils/sponsors.functions.ts @@ -11,7 +11,6 @@ export type SponsorMeta = { imageUrl?: string linkUrl?: string private?: boolean - amount?: number } export type Sponsor = { @@ -86,16 +85,6 @@ async function getSponsors() { linkUrl: sponsorMeta.linkUrl ?? matchingSponsor.linkUrl, private: sponsorMeta.private ?? matchingSponsor.private, }) - } else if (sponsorMeta.amount) { - sponsors.push({ - login: sponsorMeta.login, - name: sponsorMeta.name || '', - imageUrl: sponsorMeta.imageUrl || '', - linkUrl: sponsorMeta.linkUrl || '', - private: sponsorMeta.private || false, - createdAt: new Date().toISOString(), - amount: sponsorMeta.amount || 0, - }) } }) diff --git a/src/utils/stats.types.ts b/src/utils/stats.types.ts index 76be3eb57..c8e4c1fcc 100644 --- a/src/utils/stats.types.ts +++ b/src/utils/stats.types.ts @@ -25,9 +25,6 @@ export interface NpmPackageStats { export interface NpmStats { totalDownloads: number - packages?: string - // Per-package stats with rate information - packageStats?: Record // Aggregate rate and timestamp for animating the total ratePerDay?: number // Aggregate downloads per day across all packages (growth rate) updatedAt?: number // Most recent update timestamp across all packages (ms since epoch) diff --git a/src/utils/url-boundary.ts b/src/utils/url-boundary.ts index 5ccd24584..c1f6aa5c4 100644 --- a/src/utils/url-boundary.ts +++ b/src/utils/url-boundary.ts @@ -74,14 +74,13 @@ export function normalizePublicHttpUrl(value: string | undefined | null) { export function normalizeSameOriginPath( value: string | undefined | null, baseUrlOrOrigin: string, - maxLength = 2048, ) { if (!value) { return null } const trimmed = value.trim() - if (!trimmed || trimmed.length > maxLength) { + if (!trimmed || trimmed.length > 2048) { return null } @@ -110,10 +109,7 @@ function isStaticAssetPath(pathname: string) { ) } -export function getRoutableInternalLinkTarget( - href: string | undefined | null, - siteOrigin = DEFAULT_SITE_ORIGIN, -) { +export function getRoutableInternalLinkTarget(href: string | undefined | null) { if (!href) { return null } @@ -131,7 +127,7 @@ export function getRoutableInternalLinkTarget( return null } - const baseOrigin = getBaseOrigin(siteOrigin) + const baseOrigin = getBaseOrigin(DEFAULT_SITE_ORIGIN) let url: URL try { diff --git a/src/utils/workflow-runtime.server.ts b/src/utils/workflow-runtime.server.ts index a5482e3ba..6cedd6ff0 100644 --- a/src/utils/workflow-runtime.server.ts +++ b/src/utils/workflow-runtime.server.ts @@ -65,12 +65,9 @@ export interface WorkflowRuntimeReconcileResult { unregisteredSchedules: Array } -export async function getWorkflowRuntimeHealth(options?: { - now?: number - staleRunMs?: number -}): Promise { - const now = options?.now ?? Date.now() - const staleRunMs = options?.staleRunMs ?? DEFAULT_STALE_RUN_MS +export async function getWorkflowRuntimeHealth(): Promise { + const now = Date.now() + const staleRunMs = DEFAULT_STALE_RUN_MS const [ staleRuns, unregisteredSchedules, @@ -96,12 +93,9 @@ export async function getWorkflowRuntimeHealth(options?: { } } -export async function reconcileWorkflowRuntimeStore(options?: { - now?: number - staleRunMs?: number -}): Promise { - const now = options?.now ?? Date.now() - const staleRunMs = options?.staleRunMs ?? DEFAULT_STALE_RUN_MS +export async function reconcileWorkflowRuntimeStore(): Promise { + const now = Date.now() + const staleRunMs = DEFAULT_STALE_RUN_MS const [staleRuns, unregisteredSchedules] = await Promise.all([ listStaleWorkflowRuns({ now, staleRunMs }), listUnregisteredWorkflowSchedules(),