mirror of
https://github.com/simstudioai/sim.git
synced 2026-09-22 13:30:01 +08:00
* fix(react-doctor): remove unused export types, useEffect clearTimeout missing, a11y fixes * fix(react-doctor): strip unused export types from contracts, copilot, stores, and components Remove export keyword from type/interface declarations confirmed to have zero importers across lib/api/contracts/tools/aws/, lib/api/contracts/*.ts, lib/copilot/generated/, stores/workflows/workflow/types.ts, ee/access-control, ee/data-retention, lib/logs/types.ts, and app/workspace component files. TypeScript and API validation both pass clean. Reduces unused-types count from 394 → 181 and fully eliminates the ✗ critical dead-code categories (exports, types, files now show as ⚠ warnings not ✗ errors). * docs improvements * fix(react-doctor): delete 50 unused files (dead barrels, unreachable components, stale utilities) Remove confirmed-unused barrel index.ts files across stores/, connectors/, executor/, lib/, and app/workspace/ that had zero importers. Also delete unreachable components (chat-history-skeleton, trace-spans, logs-list, template-profile, enterprise landing sections), stale utilities (buffered-stream, blob-to-data-url, queued-workflow-execution, compute-edit-sequence), and obsolete generated/contract files. TypeScript passes clean. * remove dead code * cleanup * more * fix(blog): restore DiffControlsDemo for v0-5 blog post * fix: restore ContactButton for enterprise blog post, export WIKIPEDIA_PAGE_CONTENT_OUTPUT_PROPERTIES * fix(react-doc): restore stripped exports and remove server-only dependency * chore(deps): update lockfile after removing server-only * added back some exports * docs * more * fix type issues * tc * fix docs search route Co-authored-by: Cursor <cursoragent@cursor.com> * fix(tag-dropdown): add missing isEqual import from es-toolkit --------- Co-authored-by: Cursor <cursoragent@cursor.com>
102 lines
3.0 KiB
TypeScript
102 lines
3.0 KiB
TypeScript
import { createElement, Fragment } from 'react'
|
|
import { loader, multiple } from 'fumadocs-core/source'
|
|
import type { DocData, DocMethods } from 'fumadocs-mdx/runtime/types'
|
|
import { openapiSource } from 'fumadocs-openapi/server'
|
|
import { docs } from '@/.source/server'
|
|
import { i18n } from './i18n'
|
|
import { openapi } from './openapi'
|
|
|
|
const METHOD_COLORS: Record<string, string> = {
|
|
GET: 'text-green-600 dark:text-green-400',
|
|
HEAD: 'text-green-600 dark:text-green-400',
|
|
OPTIONS: 'text-green-600 dark:text-green-400',
|
|
POST: 'text-blue-600 dark:text-blue-400',
|
|
PUT: 'text-yellow-600 dark:text-yellow-400',
|
|
PATCH: 'text-orange-600 dark:text-orange-400',
|
|
DELETE: 'text-red-600 dark:text-red-400',
|
|
}
|
|
|
|
/**
|
|
* Custom openapi plugin that places method badges BEFORE the page name
|
|
* in the sidebar (like Mintlify/Gumloop) instead of after.
|
|
*/
|
|
function openapiPluginBadgeLeft() {
|
|
return {
|
|
name: 'fumadocs:openapi-badge-left',
|
|
enforce: 'pre' as const,
|
|
transformPageTree: {
|
|
file(
|
|
this: {
|
|
storage: {
|
|
read: (path: string) => { format: string; data: Record<string, unknown> } | undefined
|
|
}
|
|
},
|
|
node: { name: React.ReactNode },
|
|
filePath: string | undefined
|
|
) {
|
|
if (!filePath) return node
|
|
const file = this.storage.read(filePath)
|
|
if (!file || file.format !== 'page') return node
|
|
const openApiData = file.data._openapi as { method?: string; webhook?: boolean } | undefined
|
|
if (!openApiData || typeof openApiData !== 'object') return node
|
|
if (openApiData.webhook) {
|
|
node.name = createElement(
|
|
Fragment,
|
|
null,
|
|
node.name,
|
|
' ',
|
|
createElement(
|
|
'span',
|
|
{
|
|
className:
|
|
'ms-auto border border-current px-1 rounded-lg text-xs text-nowrap font-mono',
|
|
},
|
|
'Webhook'
|
|
)
|
|
)
|
|
} else if (openApiData.method) {
|
|
const method = openApiData.method.toUpperCase()
|
|
const colorClass = METHOD_COLORS[method] ?? METHOD_COLORS.GET
|
|
node.name = createElement(
|
|
Fragment,
|
|
null,
|
|
createElement(
|
|
'span',
|
|
{
|
|
className: `font-mono font-medium me-1.5 text-[10px] text-nowrap ${colorClass}`,
|
|
'data-method': method.toLowerCase(),
|
|
},
|
|
method
|
|
),
|
|
node.name
|
|
)
|
|
}
|
|
return node
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
export const source = loader(
|
|
multiple({
|
|
docs: docs.toFumadocsSource(),
|
|
openapi: await openapiSource(openapi, {
|
|
baseDir: 'en/api-reference/(generated)',
|
|
groupBy: 'tag',
|
|
}),
|
|
}),
|
|
{
|
|
baseUrl: '/',
|
|
i18n,
|
|
plugins: [openapiPluginBadgeLeft() as never],
|
|
}
|
|
)
|
|
|
|
/** Full page data type including MDX content and metadata */
|
|
export type PageData = DocData &
|
|
DocMethods & {
|
|
title: string
|
|
description?: string
|
|
full?: boolean
|
|
}
|