All files / rusted-chromium/download download-fluent-single.ts

100% Statements 33/33
100% Branches 2/2
100% Functions 16/16
100% Lines 33/33

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 1105x 5x       5x         5x         26x             11x         11x           1x   1x       1x   1x       1x   1x       1x 1x       1x 1x       1x   1x       1x 1x       2x 2x       5x   15x       19x       11x     11x 11x       5x     11x       1x       11x      
import { ComparableVersion } from '../commons/ComparableVersion'
import { ALL_FALSE_SINGLE_CONFIG } from '../commons/constants'
import type { DownloadReportEntry, IChromeSingleConfig } from '../interfaces/interfaces'
import type { OS } from '../interfaces/os.interfaces'
import type { Arch } from '../interfaces/store.interfaces'
import { downloadChromium } from './download'
 
// https://stackoverflow.com/questions/56933109/pick-one-key-value-pair-from-type
type PickOne<T> = { [P in keyof T]: Record<P, T[P]> & Partial<Record<Exclude<keyof T, P>, undefined>> }[keyof T]
 
export abstract class FluentDownloadSingle<T> {
 
    protected config: IChromeSingleConfig
    
    constructor(config?: IChromeSingleConfig) {
        this.config = {
            ...ALL_FALSE_SINGLE_CONFIG,
            ...config
        }
    }
 
    protected addToConfig(pConfig: PickOne<IChromeSingleConfig>): T {
        this.config = {
            ...this.config,
            ...pConfig,
        }
 
        return this.self()
    }
 
    protected abstract self(): T
 
    public arch(arch: Arch): T {
        this.config.arch = arch
 
        return this.self()
    }
 
    public autoUnzip(): T {
        this.config.autoUnzip = true
        
        return this.self()
    }
 
    public debug(): T {
        this.config.debug = true
 
        return this.self()
    }
 
    public download(): T {
        this.config.download = true
        return this.self()
    }
 
    public downloadFolder(downloadFolder: string): T {
        this.config.downloadFolder = downloadFolder
        return this.self()
    }
    
    public os(os: OS): T {
        this.config.os = os
 
        return this.self()
    }
 
    public quiet(): T {
        this.config.quiet = true
        return this.self()
    }
    
    public store(): T {
        this.config.store = true
        return this.self()
    }
}
 
export class FluentDownloadSingleIncomplete extends FluentDownloadSingle<FluentDownloadSingleIncomplete> {
    public constructor() {
        super()
    }
 
    protected self(): FluentDownloadSingleIncomplete {
        return this
    }
 
    public single(comparableVersion: ComparableVersion | string): FluentDownloadSingleComplete {
        const single = typeof comparableVersion === 'string'
            ? new ComparableVersion(comparableVersion)
            : comparableVersion
        this.addToConfig({ single })
        return new FluentDownloadSingleComplete(this.config)
    }
}
 
export class FluentDownloadSingleComplete extends FluentDownloadSingle<FluentDownloadSingleComplete> {
 
    public constructor(config: IChromeSingleConfig) {
        super(config)
    }
 
    protected self(): FluentDownloadSingleComplete {
        return this
    }
    
    public start(): Promise<DownloadReportEntry[]> {
        return downloadChromium(this.config)
    }
}