/** * @typedef {import('vfile').Compatible} Compatible * @typedef {import('../compile.js').CompileOptions} CompileOptions * @typedef {import('../core.js').ProcessorOptions} ProcessorOptions */ import {VFile} from 'vfile' import {md} from './extnames.js' /** * Create a file and options from a given `vfileCompatible` and options that * might contain `format: 'detect'`. * * @param {Readonly} vfileCompatible * File. * @param {Readonly | null | undefined} [options] * Configuration (optional). * @returns {{file: VFile, options: ProcessorOptions}} * File and options. */ export function resolveFileAndOptions(vfileCompatible, options) { const file = looksLikeAVFile(vfileCompatible) ? vfileCompatible : new VFile(vfileCompatible) const {format, ...rest} = options || {} return { file, options: { format: format === 'md' || format === 'mdx' ? format : file.extname && (rest.mdExtensions || md).includes(file.extname) ? 'md' : 'mdx', ...rest } } } /** * @param {Readonly | null | undefined} [value] * Thing. * @returns {value is VFile} * Check. */ function looksLikeAVFile(value) { return Boolean( value && typeof value === 'object' && 'message' in value && 'messages' in value ) }