This document describes how to add a new file type Preview Plugin to FileVista.
Update:
src/components/file-preview/utils.tsSync the following:
ALL_FILE_TYPES
FileType
detectFileType()
getFileTypeLabel()
getFileTypeColor()Add extension or MIME check in detectFileType().
Principles:
1. Prefer extension-based detection
2. Use MIME only as a secondary signal
3. Never let legacy binary formats match modern formatsIncorrect examples:
.doc should NOT match docx
.ppt should NOT match pptx
.xls should NOT match xlsxCreate:
src/components/file-preview/plugins/<type>-plugin.tsExample:
import type { PreviewPlugin } from "../core/plugin";
export const examplePlugin: PreviewPlugin = {
id: "builtin.example",
name: "Example Preview",
priority: 100,
match: (file) => file.fileType === "example",
load: () => import("../preview-adapters/ExamplePreviewAdapter"),
};Create:
src/components/file-preview/preview-adapters/ExamplePreviewAdapter.tsxAdapter rules:
1. Only bridge FileInfo to existing Preview component props
2. Do not re-parse files inside the adapter
3. Do not import heavy parsing libraries directly
4. Return UnsupportedPluginPreview when input is missing
5. Do not modify file.content / file.source / file.urlAdapter must default-export a React component:
export default function ExamplePreviewAdapter({ file }: { file: FileInfo }) {
// ...
}The return type of PreviewPlugin.load() requires a default export:
Promise<{ default: ComponentType<{ file: FileInfo }> }>Update:
src/components/file-preview/plugins/builtin-plugins.tsAdd to:
builtinPreviewPluginsUpdate:
src/components/file-preview/support-status.tsAdd:
example: {
fileType: "example",
status: "plugin-supported",
legacyRenderer: "unsupported",
pluginRenderer: "supported",
pluginId: "builtin.example",
}Run:
bun run test:runIf failing, check:
plugin id
plugin match
builtin registration
support-status pluginIdSync updates to:
README.md
docs/user-facing-preview-support.md
docs/preview-plugin-validation-matrix.mdbun run check
bun run build:pages