Memoize TS API version checks

This commit is contained in:
Matt Bierner
2018-01-17 13:44:38 -08:00
parent a236cf03f1
commit 1c07451dd1
3 changed files with 51 additions and 1 deletions

View File

@@ -7,6 +7,9 @@ import * as semver from 'semver';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
import { memoize } from './memoize';
export default class API {
public static readonly defaultVersion = new API('1.0.0', '1.0.0');
@@ -29,50 +32,62 @@ export default class API {
private readonly version: string
) { }
@memoize
public has203Features(): boolean {
return semver.gte(this.version, '2.0.3');
}
@memoize
public has206Features(): boolean {
return semver.gte(this.version, '2.0.6');
}
@memoize
public has208Features(): boolean {
return semver.gte(this.version, '2.0.8');
}
@memoize
public has213Features(): boolean {
return semver.gte(this.version, '2.1.3');
}
@memoize
public has220Features(): boolean {
return semver.gte(this.version, '2.2.0');
}
@memoize
public has222Features(): boolean {
return semver.gte(this.version, '2.2.2');
}
@memoize
public has230Features(): boolean {
return semver.gte(this.version, '2.3.0');
}
@memoize
public has234Features(): boolean {
return semver.gte(this.version, '2.3.4');
}
@memoize
public has240Features(): boolean {
return semver.gte(this.version, '2.4.0');
}
@memoize
public has250Features(): boolean {
return semver.gte(this.version, '2.5.0');
}
@memoize
public has260Features(): boolean {
return semver.gte(this.version, '2.6.0');
}
@memoize
public has262Features(): boolean {
return semver.gte(this.version, '2.6.2');
}

View File

@@ -0,0 +1,34 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
export function memoize(_target: any, key: string, descriptor: any) {
let fnKey: string | undefined = undefined;
let fn: Function | undefined = undefined;
if (typeof descriptor.value === 'function') {
fnKey = 'value';
fn = descriptor.value;
} else if (typeof descriptor.get === 'function') {
fnKey = 'get';
fn = descriptor.get;
} else {
throw new Error('not supported');
}
const memoizeKey = `$memoize$${key}`;
descriptor[fnKey] = function (...args: any[]) {
if (!this.hasOwnProperty(memoizeKey)) {
Object.defineProperty(this, memoizeKey, {
configurable: false,
enumerable: false,
writable: false,
value: fn!.apply(this, args)
});
}
return this[memoizeKey];
};
}

View File

@@ -12,7 +12,8 @@
"noUnusedLocals": true,
"noUnusedParameters": true,
"strict": true,
"alwaysStrict": true
"alwaysStrict": true,
"experimentalDecorators": true
},
"include": [
"src/**/*"