Skip to content

Commit 7a4fe6f

Browse files
committed
Fix #227 #237 #488 : Provide extensions - initial work
1 parent af65fd6 commit 7a4fe6f

File tree

4 files changed

+108
-1
lines changed

4 files changed

+108
-1
lines changed

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,18 @@
151151
"./enums" : {
152152
"require": "./src/ua-parser-enum.js",
153153
"import": "./src/ua-parser-enum.mjs"
154+
},
155+
"./extensions" : {
156+
"require": "./src/ua-parser-extension.js",
157+
"import": "./src/ua-parser-extension.mjs"
154158
}
155159
},
156160
"files": [
157161
"dist",
158162
"src"
159163
],
160164
"scripts": {
161-
"build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments '/^ UA/' && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments '/^ UA/' --compress --mangle && node -e \"const fs=require('fs');fs.writeFileSync('src/ua-parser.mjs','// Generated ESM version of UAParser.js\\n// Source file: /src/ua-parser.js\\n\\nconst window = undefined;\\n\\n'+fs.readFileSync('src/ua-parser.js','utf-8').replace(/\\(func[\\s\\S]+strict\\';/ig,'').replace(/\\/[\\/\\s]+export[\\s\\S]+/ig,'export {UAParser};'),'utf-8');fs.writeFileSync('src/ua-parser-enum.mjs','// Generated ESM version of UAParser.js enums\\n// Source file: /src/ua-parser-enum.js\\n\\n'+fs.readFileSync('src/ua-parser-enum.js','utf-8').replace(/module\\.exports =/ig,'export'),'utf-8')\"",
165+
"build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments '/^ UA/' && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments '/^ UA/' --compress --mangle && uglifyjs src/ua-parser-enum.js -o dist/ua-parser-enum.min.js --comments '/^ Enum/' && node -e \"const fs=require('fs');fs.writeFileSync('src/ua-parser.mjs','// Generated ESM version of UAParser.js\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/ua-parser.js\\n\\nconst window = undefined;\\n\\n'+fs.readFileSync('src/ua-parser.js','utf-8').replace(/\\(func[\\s\\S]+strict\\';/ig,'').replace(/\\/[\\/\\s]+export[\\s\\S]+/ig,'export {UAParser};'),'utf-8');fs.writeFileSync('src/ua-parser-enum.mjs','// Generated ESM version of UAParser.js enums\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/ua-parser-enum.js\\n\\n'+fs.readFileSync('src/ua-parser-enum.js','utf-8').replace(/module\\.exports =/ig,'export'),'utf-8');fs.writeFileSync('src/ua-parser-extension.mjs','// Generated ESM version of UAParser.js extensions\\n// DO NOT EDIT THIS FILE!\\n// Source: /src/ua-parser-extension.js\\n\\n'+fs.readFileSync('src/ua-parser-extension.js','utf-8').replace(/module\\.exports =/ig,'export'),'utf-8')\"",
162166
"test": "jshint src/ua-parser.js && mocha -R nyan test",
163167
"test-ci": "jshint src/ua-parser.js && mocha -R spec test",
164168
"verup": "node ./node_modules/verup",

src/ua-parser-extension.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
///////////////////////////////////////////////
2+
/* Extensions for UAParser.js v2.0
3+
https://github.com/faisalman/ua-parser-js
4+
Author: Faisal Salman <f@faisalman.com>
5+
MIT License */
6+
//////////////////////////////////////////////
7+
8+
const UAParser = require("./ua-parser")
9+
10+
const Bots = Object.freeze({
11+
browser : [
12+
[/((?:google|bing|msn|facebook)bot(?:\-[imagevdo]{5})?|bingpreview)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']]
13+
]
14+
});
15+
16+
const Emails = Object.freeze({
17+
browser : [
18+
[/(microsoft outlook|thunderbird)[\s\/]([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'email']]
19+
]
20+
});
21+
22+
const Tools = Object.freeze({
23+
browser : [
24+
[/(wget|curl|lynx)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'tool']]
25+
]
26+
});
27+
28+
module.exports = {
29+
Bots,
30+
Emails,
31+
Tools
32+
}

src/ua-parser-extension.mjs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Generated ESM version of UAParser.js extensions
2+
// DO NOT EDIT THIS FILE!
3+
// Source: /src/ua-parser-extension.js
4+
5+
///////////////////////////////////////////////
6+
/* Extensions for UAParser.js v2.0
7+
https://github.com/faisalman/ua-parser-js
8+
Author: Faisal Salman <f@faisalman.com>
9+
MIT License */
10+
//////////////////////////////////////////////
11+
12+
const UAParser = require("./ua-parser")
13+
14+
const Bots = Object.freeze({
15+
browser : [
16+
[/((?:google|bing|msn|facebook)bot(?:\-[imagevdo]{5})?|bingpreview)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'bot']]
17+
]
18+
});
19+
20+
const Emails = Object.freeze({
21+
browser : [
22+
[/(microsoft outlook|thunderbird)[\s\/]([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'email']]
23+
]
24+
});
25+
26+
const Tools = Object.freeze({
27+
browser : [
28+
[/(wget|curl|lynx)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION, ['type', 'tool']]
29+
]
30+
});
31+
32+
export {
33+
Bots,
34+
Emails,
35+
Tools
36+
}

test/test-extension.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const assert = require('assert');
2+
const safeRegex = require('safe-regex');
3+
const UAParser = require('ua-parser-js');
4+
const { Bots, Emails, Tools } = require('ua-parser-js/extensions');
5+
6+
describe('Bots', () => {
7+
it('Can detect bots', () => {
8+
const googleBot = 'Googlebot-Video/1.0';
9+
const msnBot = 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)';
10+
const bingPreview = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b';
11+
const opera = 'Opera/8.5 (Macintosh; PPC Mac OS X; U; en)';
12+
const wget = 'Wget/1.21.1';
13+
const facebookBot = 'Mozilla/5.0 (compatible; FacebookBot/1.0; +https://developers.facebook.com/docs/sharing/webmasters/facebookbot/)';
14+
const outlook = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Microsoft Outlook 16.0.9126; Microsoft Outlook 16.0.9126; ms-office; MSOffice 16)';
15+
const thunderbird = 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0';
16+
17+
const botParser = new UAParser(Bots);
18+
assert.deepEqual(botParser.setUA(googleBot).getBrowser(), {name: "Googlebot-Video", version: "1.0", major: "1", type: "bot"});
19+
assert.deepEqual(botParser.setUA(msnBot).getBrowser(), {name: "msnbot-media", version: "1.1", major: "1", type: "bot"});
20+
assert.deepEqual(botParser.setUA(bingPreview).getBrowser(), {name: "BingPreview", version: "1.0b", major: "1", type: "bot"});
21+
assert.deepEqual(botParser.setUA(opera).getBrowser(), {name: "Opera", version: "8.5", major: "8"});
22+
23+
// try merging Bots & Tools
24+
const botsAndTools = { browser : [...Bots.browser, ...Tools.browser]};
25+
const botolParser = new UAParser(botsAndTools);
26+
assert.deepEqual(botolParser.setUA(wget).getBrowser(), {name: "Wget", version: "1.21.1", major: "1", type:"tool"});
27+
assert.deepEqual(botolParser.setUA(facebookBot).getBrowser(), {name: "FacebookBot", version: "1.0", major: "1", type:"bot"});
28+
29+
const emailParser = new UAParser(Emails);
30+
assert.deepEqual(emailParser.setUA(outlook).getBrowser(), {name: "Microsoft Outlook", version: "16.0.9126", major: "16", type: "email"});
31+
assert.deepEqual(emailParser.setUA(thunderbird).getBrowser(), {name: "Thunderbird", version: "78.13.0", major: "78", type: "email"});
32+
});
33+
});
34+
35+
// TODO : check for safe-regex

0 commit comments

Comments
 (0)