From 6030eb9e5d2b5afe1e766af9c0b81bc3ba02101f Mon Sep 17 00:00:00 2001 From: Denis Demchenko Date: Mon, 2 Jul 2018 22:24:02 +0300 Subject: [PATCH] Add semverCheck and related methods --- src/parser.js | 45 ++++++++++++++++++++++++++++++++++----------- test/unit/parser.js | 16 ++++++++++++++-- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/parser.js b/src/parser.js index a489fe8..c43ddbe 100644 --- a/src/parser.js +++ b/src/parser.js @@ -91,15 +91,15 @@ class Parser { /** * Get browser's name - * @return {String} Browser's name + * @return {String} Browser's name or an empty string * * @public */ getBrowserName(toLowerCase) { if (toLowerCase) { - return String(this.getBrowser().name).toLowerCase(); + return String(this.getBrowser().name).toLowerCase() || ''; } - return this.getBrowser().name; + return this.getBrowser().name || ''; } @@ -167,10 +167,10 @@ class Parser { const { name } = this.getOS(); if (toLowerCase) { - return String(name).toLowerCase(); + return String(name).toLowerCase() || ''; } - return name; + return name || ''; } /** @@ -193,6 +193,21 @@ class Parser { return this.parsePlatform(); } + /** + * Get platform name + * @param {Boolean} toLowerCase + * @return {*} + */ + getPlatformName(toLowerCase) { + const { name } = this.getPlatform(); + + if (toLowerCase) { + return String(name).toLowerCase() || ''; + } + + return name || ''; + } + /** * Get parsed platform * @return {{}} @@ -288,30 +303,38 @@ class Parser { * // or with platforms * if (browser.check({desktop: { chrome: '>118.01.1322' } })) */ - check(checkTree) { + semverCheck(checkTree) { const thisVersion = this.getBrowser().version; if (!semver.valid(semver.coerce(thisVersion))) { throw new Error(`Version of current browser doesn't seem applicable: ${thisVersion}`); } const keysToProcess = Object.keys(checkTree); - keysToProcess.some((browserAttribute) => { + return keysToProcess.some((browserAttribute) => { const objectOrVersion = checkTree[browserAttribute]; if (typeof objectOrVersion === 'object') { return (this.isOs(browserAttribute) || this.isPlatform(browserAttribute)) - && this.check(objectOrVersion); + && this.semverCheck(objectOrVersion); } - return this.isBrowser(browserAttribute) && this.matches(objectOrVersion); + return this.isBrowser(browserAttribute) && this.satisfies(objectOrVersion); }); } isBrowser(browserName) { - return this.getBrowser().name === browserName; + return this.getBrowserName(true) === String(browserName).toLowerCase(); } satisfies(version) { - return semver.satisfies(this.getBrowser().version, version); + return semver.satisfies(semver.coerce(this.getBrowser().version), version); + } + + isOs(osName) { + return this.getOSName(true) === String(osName).toLowerCase(); + } + + isPlatform(platformName) { + return this.getPlatformName(true) === String(platformName).toLowerCase(); } } diff --git a/test/unit/parser.js b/test/unit/parser.js index 3634980..a5dbe11 100644 --- a/test/unit/parser.js +++ b/test/unit/parser.js @@ -17,7 +17,7 @@ test('Parser.test', (t) => { t.truthy(parser.test(/Chrome/i)); }); -test('Parser._parseBrowser is being called when the Parser.getBrowser() is called', (t) => { +test('Parser.parseBrowser is being called when the Parser.getBrowser() is called', (t) => { const spy = sinon.spy(parser, 'parseBrowser'); const b = parser.getBrowser(); t.truthy(spy.called); @@ -34,7 +34,7 @@ test('Parser.getBrowserVersion returns a correct result', (t) => { t.is(parser.getBrowserVersion(), '43.0.2442.1165'); }); -test('Parser._parseOS is being called when getOS() called', (t) => { +test('Parser.parseOS is being called when getOS() called', (t) => { const spy = sinon.spy(parser, 'parseOS'); parser.getOS(); t.truthy(spy.called); @@ -56,3 +56,15 @@ test('Parser.getOSVersion returns a correct result', (t) => { test('Skip parsing shouldn\'t parse', (t) => { t.deepEqual((new Parser(UA, true)).getResult(), {}); }); + +test('Parser.check should make simple check', (t) => { + t.is(parser.semverCheck({ opera: '>42' }), true); +}); + +test('Parser.check should make simple check', (t) => { + t.is(parser.semverCheck({ + macos: { + opera: '>42', + }, + }), true); +});