diff --git a/lib/options-handler.ts b/lib/options-handler.ts index 0210b380b1f..02f34f1863b 100755 --- a/lib/options-handler.ts +++ b/lib/options-handler.ts @@ -68,10 +68,10 @@ type OptionsType = { libs: Record; remoteLibs: Record; tools: Record; - defaultLibs: string; - defaultCompiler: string; - compileOptions: string; - supportsBinary: boolean; + defaultLibs: Record; + defaultCompiler: Record; + compileOptions: Record; + supportsBinary: Record; supportsExecute: boolean; supportsLibraryCodeFilter: boolean; languages: Record; @@ -110,10 +110,10 @@ type OptionsType = { export class ClientOptionsHandler { compilerProps: CompilerProps['get']; ceProps: PropertyGetter; - supportsBinary: boolean; - supportsExecutePerLanguage: boolean; + supportsBinary: Record; + supportsExecutePerLanguage: Record; supportsExecute: boolean; - supportsLibraryCodeFilterPerLanguage: boolean; + supportsLibraryCodeFilterPerLanguage: Record; supportsLibraryCodeFilter: boolean; remoteLibs: Record; options: OptionsType; @@ -150,9 +150,8 @@ export class ClientOptionsHandler { this.supportsLibraryCodeFilterPerLanguage = this.compilerProps(languages, 'supportsLibraryCodeFilter', false); this.supportsLibraryCodeFilter = Object.values(this.supportsLibraryCodeFilterPerLanguage).some(value => value); - // TODO: Shouldn't have to cast here - const libs = this.parseLibraries(this.compilerProps(languages, 'libs') as any); - const tools = this.parseTools(this.compilerProps(languages, 'tools') as any); + const libs = this.parseLibraries(this.compilerProps(languages, 'libs')); + const tools = this.parseTools(this.compilerProps(languages, 'tools')); this.remoteLibs = {}; diff --git a/lib/properties.ts b/lib/properties.ts index 6dbb8c29900..878d979e029 100644 --- a/lib/properties.ts +++ b/lib/properties.ts @@ -27,6 +27,8 @@ import path from 'path'; import _ from 'underscore'; +import {LanguageKey} from '../types/languages.interfaces'; + import {logger} from './logger'; import {PropertyGetter, PropertyValue, Widen} from './properties.interfaces'; import {toProperty} from './utils'; @@ -175,37 +177,74 @@ export class CompilerProps { * @param {?function} fn - Transformation to give to each value found * @returns {*} Transformed value(s) found or fn(defaultValue) */ + + // A lot of overloads for a lot of different variants: + // const a = this.compilerProps(lang, property); // PropertyValue + // const b = this.compilerProps(lang, property); // number + // const c = this.compilerProps(lang, property, 42); // number + // const d = this.compilerProps(lang, property, undefined, (x) => ["foobar"]); // string[] + // const e = this.compilerProps(lang, property, 42, (x) => ["foobar"]); // number | string[] + // if more than one language: + // const f = this.compilerProps(languages, property); // Record + // const g = this.compilerProps(languages, property); // Record + // const h = this.compilerProps(languages, property, 42); // Record + // const i = this.compilerProps(languages, property, undefined, (x) => ["foobar"]); // Record + // const j = this.compilerProps(languages, property, 42, (x) => ["foobar"]);//Record + + // general overloads + get(base: string, property: string, defaultValue?: undefined, fn?: undefined): PropertyValue; + get( + base: string, + property: string, + defaultValue: Widen, + fn?: undefined, + ): typeof defaultValue; + get(base: string, property: string, defaultValue?: PropertyValue, fn?: undefined): T; + // fn overloads + get( + base: string, + property: string, + defaultValue?: undefined, + fn?: (item: PropertyValue, language?: any) => R, + ): R; + get( + base: string, + property: string, + defaultValue: Widen, + fn?: (item: typeof defaultValue, language?: any) => R, + ): R; + // container base general overloads get( - base: string | LanguageDef[] | Record, + base: LanguageDef[] | Record, property: string, defaultValue?: undefined, fn?: undefined, - ): PropertyValue; + ): Record; get( - base: string | LanguageDef[] | Record, + base: LanguageDef[] | Record, property: string, defaultValue: Widen, fn?: undefined, - ): typeof defaultValue; + ): Record; get( - base: string | LanguageDef[] | Record, + base: LanguageDef[] | Record, property: string, defaultValue?: PropertyValue, fn?: undefined, - ): T; - + ): Record; + // container base fn overloads get( - base: string | LanguageDef[] | Record, + base: LanguageDef[] | Record, property: string, defaultValue?: undefined, fn?: (item: PropertyValue, language?: any) => R, - ): R; + ): Record; get( - base: string | LanguageDef[] | Record, + base: LanguageDef[] | Record, property: string, defaultValue: Widen, - fn?: (item: PropertyValue, language?: any) => R, - ): typeof defaultValue | R; + fn?: (item: typeof defaultValue, language?: any) => R, + ): Record; get( langs: string | LanguageDef[] | Record,