Files
wehub-resource-sync c48612c494
CI / E2E Tests (push) Has been cancelled
CI / Lint, Typecheck & Unit Tests (push) Has been cancelled
Docs Build / Build docs site (push) Has been cancelled
Publish @openmaic packages / Build, validate & publish (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:03:23 +08:00

58 lines
2.2 KiB
TypeScript

import { pdfDocumentExtractorProviders } from './pdf';
import { textDocumentExtractorProvider } from './text';
import type { DocumentExtractorProvider, DocumentExtractorProviderId } from '../types';
const documentExtractorProviders = [
textDocumentExtractorProvider,
...pdfDocumentExtractorProviders,
];
const DOCUMENT_EXTRACTOR_PROVIDERS: Record<DocumentExtractorProviderId, DocumentExtractorProvider> =
Object.fromEntries(documentExtractorProviders.map((provider) => [provider.id, provider]));
export function getDocumentExtractorProviders(): DocumentExtractorProvider[] {
return Object.values(DOCUMENT_EXTRACTOR_PROVIDERS);
}
export function getDocumentExtractorProvider(
providerId: DocumentExtractorProviderId,
): DocumentExtractorProvider | undefined {
return DOCUMENT_EXTRACTOR_PROVIDERS[providerId];
}
export function selectDocumentExtractorProvider(options: {
mimeType: string;
preferredProviderId?: DocumentExtractorProviderId;
requiredCapabilities?: Partial<DocumentExtractorProvider['capabilities']>;
}): DocumentExtractorProvider {
const normalizedMimeType = options.mimeType.toLowerCase();
const supportsRequest = (provider: DocumentExtractorProvider) =>
provider.supportedMimeTypes.includes(normalizedMimeType) &&
Object.entries(options.requiredCapabilities ?? {}).every(
([capability, required]) =>
!required ||
provider.capabilities[capability as keyof DocumentExtractorProvider['capabilities']],
);
if (options.preferredProviderId) {
const preferred = getDocumentExtractorProvider(options.preferredProviderId);
if (!preferred) {
throw new Error(`Unknown document extractor provider: ${options.preferredProviderId}`);
}
if (!supportsRequest(preferred)) {
throw new Error(
`Document extractor "${preferred.id}" does not support MIME type "${options.mimeType}" with the requested capabilities`,
);
}
return preferred;
}
const provider = getDocumentExtractorProviders().find(supportsRequest);
if (!provider) {
throw new Error(
`No document extractor supports MIME type "${options.mimeType}" with the requested capabilities`,
);
}
return provider;
}