Skip to content

Commit

Permalink
Updated CompilerProps.get typing (#4397)
Browse files Browse the repository at this point in the history
* Updated CompilerProps.get typing

* Get rid of two any casts in options-handler.ts

* Fixed mistaken types
  • Loading branch information
jeremy-rifkin committed Dec 7, 2022
1 parent f3e6039 commit e1fb487
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 22 deletions.
19 changes: 9 additions & 10 deletions lib/options-handler.ts
Expand Up @@ -68,10 +68,10 @@ type OptionsType = {
libs: Record<any, any>;
remoteLibs: Record<any, any>;
tools: Record<any, any>;
defaultLibs: string;
defaultCompiler: string;
compileOptions: string;
supportsBinary: boolean;
defaultLibs: Record<LanguageKey, string>;
defaultCompiler: Record<LanguageKey, string>;
compileOptions: Record<LanguageKey, string>;
supportsBinary: Record<LanguageKey, boolean>;
supportsExecute: boolean;
supportsLibraryCodeFilter: boolean;
languages: Record<string, any>;
Expand Down Expand Up @@ -110,10 +110,10 @@ type OptionsType = {
export class ClientOptionsHandler {
compilerProps: CompilerProps['get'];
ceProps: PropertyGetter;
supportsBinary: boolean;
supportsExecutePerLanguage: boolean;
supportsBinary: Record<LanguageKey, boolean>;
supportsExecutePerLanguage: Record<LanguageKey, boolean>;
supportsExecute: boolean;
supportsLibraryCodeFilterPerLanguage: boolean;
supportsLibraryCodeFilterPerLanguage: Record<LanguageKey, boolean>;
supportsLibraryCodeFilter: boolean;
remoteLibs: Record<any, any>;
options: OptionsType;
Expand Down Expand Up @@ -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<string>(languages, 'libs'));
const tools = this.parseTools(this.compilerProps<string>(languages, 'tools'));

this.remoteLibs = {};

Expand Down
63 changes: 51 additions & 12 deletions lib/properties.ts
Expand Up @@ -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';
Expand Down Expand Up @@ -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<number>(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<LanguageKey, PropertyValue>
// const g = this.compilerProps<number>(languages, property); // Record<LanguageKey, number>
// const h = this.compilerProps(languages, property, 42); // Record<LanguageKey, number>
// const i = this.compilerProps(languages, property, undefined, (x) => ["foobar"]); // Record<LanguageKey, string[]>
// const j = this.compilerProps(languages, property, 42, (x) => ["foobar"]);//Record<LanguageKey, number | string[]>

// general overloads
get(base: string, property: string, defaultValue?: undefined, fn?: undefined): PropertyValue;
get<T extends PropertyValue>(
base: string,
property: string,
defaultValue: Widen<T>,
fn?: undefined,
): typeof defaultValue;
get<T extends PropertyValue>(base: string, property: string, defaultValue?: PropertyValue, fn?: undefined): T;
// fn overloads
get<R>(
base: string,
property: string,
defaultValue?: undefined,
fn?: (item: PropertyValue, language?: any) => R,
): R;
get<T extends PropertyValue, R>(
base: string,
property: string,
defaultValue: Widen<T>,
fn?: (item: typeof defaultValue, language?: any) => R,
): R;
// container base general overloads
get(
base: string | LanguageDef[] | Record<string, any>,
base: LanguageDef[] | Record<string, any>,
property: string,
defaultValue?: undefined,
fn?: undefined,
): PropertyValue;
): Record<LanguageKey, PropertyValue>;
get<T extends PropertyValue>(
base: string | LanguageDef[] | Record<string, any>,
base: LanguageDef[] | Record<string, any>,
property: string,
defaultValue: Widen<T>,
fn?: undefined,
): typeof defaultValue;
): Record<LanguageKey, typeof defaultValue>;
get<T extends PropertyValue>(
base: string | LanguageDef[] | Record<string, any>,
base: LanguageDef[] | Record<string, any>,
property: string,
defaultValue?: PropertyValue,
fn?: undefined,
): T;

): Record<LanguageKey, T>;
// container base fn overloads
get<R>(
base: string | LanguageDef[] | Record<string, any>,
base: LanguageDef[] | Record<string, any>,
property: string,
defaultValue?: undefined,
fn?: (item: PropertyValue, language?: any) => R,
): R;
): Record<LanguageKey, R>;
get<T extends PropertyValue, R>(
base: string | LanguageDef[] | Record<string, any>,
base: LanguageDef[] | Record<string, any>,
property: string,
defaultValue: Widen<T>,
fn?: (item: PropertyValue, language?: any) => R,
): typeof defaultValue | R;
fn?: (item: typeof defaultValue, language?: any) => R,
): Record<LanguageKey, R>;

get(
langs: string | LanguageDef[] | Record<string, any>,
Expand Down

0 comments on commit e1fb487

Please sign in to comment.