From 7722c8191bd7a2a7c68feea918c3d9de72fcb0ce Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Thu, 23 May 2019 11:13:25 -0700 Subject: [PATCH] Various cleanup and fix edge cases --- src/test/validation.test.ts | 30 +++++++++++++++------------- src/validation.ts | 39 +++++++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/test/validation.test.ts b/src/test/validation.test.ts index 667327d..fa4508b 100644 --- a/src/test/validation.test.ts +++ b/src/test/validation.test.ts @@ -103,22 +103,26 @@ describe('validateEngineCompatibility', () => { describe('validateVSCodeTypesCompatibility', () => { it('should validate', () => { - validateVSCodeTypesCompatibility('*', '1.30.0') - validateVSCodeTypesCompatibility('*', '^1.30.0') - validateVSCodeTypesCompatibility('*', '~1.30.0') + validateVSCodeTypesCompatibility('*', '1.30.0'); + validateVSCodeTypesCompatibility('*', '^1.30.0'); + validateVSCodeTypesCompatibility('*', '~1.30.0'); - validateVSCodeTypesCompatibility('1.30.0', '1.30.0') - validateVSCodeTypesCompatibility('1.30.0', '1.20.0') + validateVSCodeTypesCompatibility('1.30.0', '1.30.0'); + validateVSCodeTypesCompatibility('1.30.0', '1.20.0'); - assert.throws(() => validateVSCodeTypesCompatibility('1.x.x', '1.30.0')) - assert.throws(() => validateVSCodeTypesCompatibility('1.x.0', '1.30.0')) + assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '1.40.0')); + assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '^1.40.0')); + assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '~1.40.0')); - assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '1.40.0')) - assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '^1.40.0')) - assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '~1.40.0')) + assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '1.40.0')); + assert.throws(() => validateVSCodeTypesCompatibility('^1.30.0', '1.40.0')); + assert.throws(() => validateVSCodeTypesCompatibility('~1.30.0', '1.40.0')); - assert.throws(() => validateVSCodeTypesCompatibility('1.30.0', '1.40.0')) - assert.throws(() => validateVSCodeTypesCompatibility('^1.30.0', '1.40.0')) - assert.throws(() => validateVSCodeTypesCompatibility('~1.30.0', '1.40.0')) + assert.throws(() => validateVSCodeTypesCompatibility('1.x.x', '1.30.0')); + assert.throws(() => validateVSCodeTypesCompatibility('1.x.0', '1.30.0')); + + assert.throws(() => validateVSCodeTypesCompatibility('1.5.0', '1.30.0')); + assert.throws(() => validateVSCodeTypesCompatibility('1.5', '1.30.0')); + assert.throws(() => validateVSCodeTypesCompatibility('1.5', '1.30')); }); }); \ No newline at end of file diff --git a/src/validation.ts b/src/validation.ts index ae34b92..675fee2 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -48,29 +48,52 @@ export function validateEngineCompatibility(version: string): void { */ export function validateVSCodeTypesCompatibility(engineVersion: string, typeVersion: string): void { if (engineVersion === '*') { - return + return; } if (!typeVersion) { throw new Error(`Missing @types/vscode version`); } - + let plainEngineVersion: string, plainTypeVersion: string; try { const engineSemver = parseSemver(`vscode@${engineVersion}`); const typeSemver = parseSemver(`@types/vscode@${typeVersion}`); - + plainEngineVersion = engineSemver.version; plainTypeVersion = typeSemver.version; } catch (err) { throw new Error('Failed to parse semver of engines.vscode and @types/vscode'); } - + // For all `x`, use smallest version for comparison - plainEngineVersion = plainEngineVersion.replace(/x/g, '0') - - if(plainTypeVersion > plainEngineVersion) { - throw new Error(`@types/vscode ${typeVersion} greater than engines.vscode ${engineVersion}. Consider upgrade engines.vscode or use an older @types/vscode version`) + plainEngineVersion = plainEngineVersion.replace(/x/g, '0'); + + const [typeMajor, typeMinor, typePatch] = plainTypeVersion.split('.').map(x => { + try { + return parseInt(x); + } catch (err) { + return 0; + } + }); + const [engineMajor, engineMinor, enginePatch] = plainEngineVersion.split('.').map(x => { + try { + return parseInt(x); + } catch (err) { + return 0; + } + }); + + const error = new Error(`@types/vscode ${typeVersion} greater than engines.vscode ${engineVersion}. Consider upgrade engines.vscode or use an older @types/vscode version`); + + if (typeof typeMajor === 'number' && typeof engineMajor === 'number' && typeMajor > engineMajor) { + throw error; + } + if (typeof typeMinor === 'number' && typeof engineMinor === 'number' && typeMinor > engineMinor) { + throw error; + } + if (typeof typePatch === 'number' && typeof enginePatch === 'number' && typePatch > enginePatch) { + throw error; } } \ No newline at end of file