import {
ConversionOptions,
HtmlRequest,
MarginOptions,
MarkdownRequest,
OfficeRequest,
PaperOptions,
RequestFields,
} from './_types'
import { fields } from './internal/fields'
import { marginSizes, paperSize } from './to-helpers'
/**
* Adjust Request fields, for html, markdown or office requests
* @return new Request (Html|Markdown|Office), doesn't modify original Request
*/
export const to: {
(...opts: ConversionOptions[]): (request: HtmlRequest) => HtmlRequest
(...opts: ConversionOptions[]): (request: OfficeRequest) => OfficeRequest
(...opts: ConversionOptions[]): (request: MarkdownRequest) => MarkdownRequest
} = (...opts: ConversionOptions[]): any => {
const options: RequestFields = {}
// page size and margins options
let paper: PaperOptions | undefined
let margins: MarginOptions | undefined
// check every given option
for (let i = opts.length; i--; ) {
const op = opts[i]
// this is fields modifier helper
if (typeof op === 'function') {
op(options)
continue
}
// this is definitely page size or margins
if (Array.isArray(op)) {
if (op.length === 2) paper = op as [number, number]
if (op.length === 4) margins = op as [number, number, number, number]
continue
}
// check if options is page size object
if ('width' in op || 'height' in op) {
paper = op
continue
}
// check if options is margins object
if ('top' in op || 'right' in op || 'bottom' in op || 'left' in op) {
margins = op
continue
}
// check page field
if ('paper' in op && op.paper) {
paper = op.paper
op.paper = undefined // eliminate page from option
}
// check margins field
if ('margins' in op && op.margins) {
margins = op.margins
op.margins = undefined // eliminate margins from option
}
// extends result options with given option
Object.assign(options, op)
}
// update page size and margins, if we have some
paper && paperSize(paper)(options)
margins && marginSizes(margins)(options)
return fields(options)
}