function convertFile(source, target, options, context) {
    options = options || {}
    options.fileName = source

    if (!options.force && !fsUtil.isStale(source, target)) {
        context.verbose(`target file ${chalk.cyan(target)} is up to date, skipping`)
        return
    }

    const html = fs.readFileSync(source).toString()
    if (path.extname(source) === '.rts') {
        const rtStyle = require('./rtStyle')
        const out = rtStyle.convert(html)
        if (!options.dryRun) {
            fs.writeFileSync(target, out)
        }
        return
    }
    const modules = options.modules || 'none'
    const shouldAddName = modules === 'none' && !options.name
    if (shouldAddName) {
        options.name = reactTemplates.normalizeName(path.basename(source, path.extname(source))) + 'RT'
    }
    options.readFileSync = fsUtil.createRelativeReadFileSync(source)
    const js = modules === 'jsrt' ? convertJSRTToJS(html, context, options) : convertRT(html, context, options)
    if (!options.dryRun) {
        fs.writeFileSync(target, js)
    }
    if (shouldAddName) {
        delete options.name
    }
}
@param {string} source
@param {string} target
@param {Options} options
@param {CONTEXT} context