@hyperwatch/useragent 3.9.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,95 +0,0 @@
1
- const path = require('path');
2
-
3
- const useragent = require('../src/useragent');
4
-
5
- const month = new Date().toISOString().slice(0, 7);
6
-
7
- const filename = path.join(
8
- __dirname,
9
- '../data/sample',
10
- `opencollective-${month}-parsed.json`
11
- );
12
-
13
- let uas;
14
- try {
15
- uas = require(filename);
16
- } catch (err) {
17
- uas = [];
18
- }
19
-
20
- // Transform Hyperwatch to their UAP Core equivalent
21
- const mapping = {
22
- 'Coc Coc Browser': 'Coc Coc',
23
- 'Coc Coc Bot Image': 'Coc Coc Bot',
24
- 'Coc Coc Bot Web': 'Coc Coc Bot',
25
- 'DuckDuckBot-Https': 'DuckDuckBot',
26
- 'Google Search App': 'Google',
27
- 'Mobile Safari UI/WKWebView': 'Safari WebView',
28
- 'Chrome Mobile WebView': 'Chrome WebView',
29
- 'Mobile Safari': 'Safari Mobile',
30
- 'WordPress.com': 'WordPress',
31
- 'python-requests': 'Python Requests',
32
- 'Android WebView': 'Android',
33
- PaleMoon: 'Pale Moon',
34
- };
35
-
36
- // Transform UAP Core to their Hyperwatch equivalent
37
- const uapCoreMapping = {
38
- 'Chrome Mobile WebView': 'Chrome WebView',
39
- 'Chrome Mobile': 'Chrome',
40
- 'Edge Mobile': 'Edge',
41
- 'Firefox Alpha': 'Firefox',
42
- 'Firefox Beta': 'Firefox',
43
- 'Firefox Mobile': 'Firefox',
44
- 'Mail.RU_Bot': 'Mail.RU Bot',
45
- 'Opera Mobile': 'Opera',
46
- 'Samsung Internet': 'SamsungBrowser',
47
- bingbot: 'BingBot',
48
- coccocbot: 'Coc Coc Bot',
49
- GmailImageProxy: 'GoogleImageProxy',
50
- LINE: 'Line',
51
- 'Chrome Mobile iOS': 'Chrome',
52
- 'QQ Browser': 'QQBrowser',
53
- 'UC Browser': 'UCBrowser',
54
- 'Firefox iOS': 'Firefox',
55
- 'QQ Browser Mobile': 'QQBrowser',
56
- 'Sailfish Browser': 'SailfishBrowser',
57
- };
58
-
59
- for (const [ua, json] of Object.entries(uas)) {
60
- if (!json) {
61
- continue;
62
- }
63
- if (!json.family) {
64
- console.log(`No result`, { hyperwatch: null }, ua);
65
- continue;
66
- }
67
-
68
- // Transform Hyperwatch to their UAP Core equivalent
69
- if (json.family && mapping[json.family]) {
70
- json.family = mapping[json.family];
71
- }
72
-
73
- // Parse with UAP core only
74
- const agent = useragent.parse(
75
- ua,
76
- /* enableCore */ false,
77
- /* enableExtra */ false,
78
- /* enableUapCore */ true
79
- );
80
- const result = agent.toJSON();
81
-
82
- // Transform UAP Core result to its Hyperwatch equivalent
83
- if (result.family && uapCoreMapping[result.family]) {
84
- result.family = uapCoreMapping[result.family];
85
- }
86
-
87
- if (!result.family) {
88
- // console.log(`New:`, { hyperwatch: json.family });
89
- continue;
90
- }
91
-
92
- if (result.family !== json.family) {
93
- console.log('Diff', { uap: result.family, hyperwatch: json.family });
94
- }
95
- }
@@ -1,99 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
-
4
- const benchmarkResults = require('../data/benchmark-results.json');
5
- const useragent = require('../src/useragent');
6
- const {
7
- average,
8
- formatPercentage,
9
- formatWithPrecision,
10
- shuffle,
11
- prettyJsonStringify,
12
- } = require('../src/utils');
13
-
14
- function benchmarkSample(filename) {
15
- let uas;
16
- try {
17
- uas = require(path.join(__dirname, '../data/sample', filename));
18
- } catch (err) {
19
- uas = [];
20
- }
21
-
22
- const uasList = Object.keys(uas);
23
- shuffle(uasList);
24
- // Warm everything
25
- for (const ua of uasList) {
26
- useragent.parse(ua, true, true, true);
27
- }
28
-
29
- const benchmarkId = filename.replace('-parsed.json', '');
30
- benchmarkResults[benchmarkId] = benchmarkResults[benchmarkId] || {};
31
-
32
- const total = Object.keys(uas).length;
33
- benchmarkResults[benchmarkId]['total'] = total;
34
-
35
- const hyperwatchBenchmark = {},
36
- uapBenchmark = {},
37
- combinedBenchmark = {};
38
- const hyperwatchMisses = [],
39
- uapMisses = [],
40
- combinedMisses = [];
41
-
42
- for (const ua of uasList) {
43
- const combinedStart = process.hrtime.bigint();
44
- const combinedResult = useragent.parse(ua, true, true, true);
45
- const combinedEnd = process.hrtime.bigint();
46
- if (!combinedResult.family) {
47
- combinedMisses.push(ua);
48
- }
49
- combinedBenchmark[ua] = Number(combinedEnd - combinedStart) / 1000 / 1000;
50
-
51
- const hyperwatchStart = process.hrtime.bigint();
52
- const hyperwatchResult = useragent.parse(ua, true, true, false);
53
- const hyperwatchEnd = process.hrtime.bigint();
54
- if (!hyperwatchResult.family) {
55
- hyperwatchMisses.push(ua);
56
- }
57
- hyperwatchBenchmark[ua] =
58
- Number(hyperwatchEnd - hyperwatchStart) / 1000 / 1000;
59
-
60
- const uapStart = process.hrtime.bigint();
61
- const uapResult = useragent.parse(ua, false, false, true);
62
- const uapEnd = process.hrtime.bigint();
63
- if (!uapResult.family) {
64
- uapMisses.push(ua);
65
- }
66
- uapBenchmark[ua] = Number(uapEnd - uapStart) / 1000 / 1000;
67
- }
68
-
69
- benchmarkResults[benchmarkId]['hyperwatch'] = {
70
- average: formatWithPrecision(average(Object.values(hyperwatchBenchmark))),
71
- miss: hyperwatchMisses.length,
72
- missPercentage: formatPercentage(hyperwatchMisses.length / total),
73
- };
74
-
75
- benchmarkResults[benchmarkId]['uap'] = {
76
- average: formatWithPrecision(average(Object.values(uapBenchmark))),
77
- miss: uapMisses.length,
78
- missPercentage: formatPercentage(uapMisses.length / total),
79
- };
80
-
81
- benchmarkResults[benchmarkId]['combined'] = {
82
- average: formatWithPrecision(average(Object.values(combinedBenchmark))),
83
- miss: combinedMisses.length,
84
- missPercentage: formatPercentage(combinedMisses.length / total),
85
- };
86
-
87
- fs.writeFileSync(
88
- path.join(__dirname, '../data', 'benchmark-results.json'),
89
- prettyJsonStringify(benchmarkResults)
90
- );
91
- }
92
-
93
- fs.readdir(path.join(__dirname, '../data/sample'), (err, filenames) => {
94
- filenames.forEach((filename) => {
95
- if (filename.includes('parsed')) {
96
- benchmarkSample(filename);
97
- }
98
- });
99
- });
@@ -1,37 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
-
4
- const { pick } = require('lodash');
5
-
6
- const useragent = require('../src/useragent');
7
- const { prettyJsonStringify } = require('../src/utils');
8
-
9
- function parse(filename) {
10
- const uas = require(path.join(__dirname, '../data/sample', filename));
11
-
12
- const fields = ['family', 'major', 'minor', 'patch', 'patch_minor'];
13
-
14
- const parsedUas = {};
15
-
16
- for (const ua of uas) {
17
- const agent = useragent.parse(ua);
18
-
19
- parsedUas[ua] = pick(agent.toJSON(), fields);
20
- }
21
-
22
- const parsedFilename = path.join(
23
- __dirname,
24
- '../data/sample',
25
- filename.replace('.json', '-parsed.json')
26
- );
27
-
28
- fs.writeFileSync(parsedFilename, prettyJsonStringify(parsedUas));
29
- }
30
-
31
- fs.readdir(path.join(__dirname, '../data/sample'), (err, filenames) => {
32
- filenames.forEach((filename) => {
33
- if (filename.includes('.json') && !filename.includes('parsed')) {
34
- parse(filename);
35
- }
36
- });
37
- });
package/scripts/update.js DELETED
@@ -1,67 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
-
4
- const fetch = require('node-fetch'); // eslint-disable-line node/no-unpublished-require
5
- const yaml = require('yamlparser'); // eslint-disable-line node/no-unpublished-require
6
-
7
- const { prettyJsonStringify } = require('../src/utils');
8
-
9
- fetch(
10
- 'https://raw.githubusercontent.com/ua-parser/uap-core/master/regexes.yaml'
11
- )
12
- .then((response) => response.text())
13
-
14
- .then((regexesYaml) => {
15
- fs.writeFileSync(
16
- path.resolve(__dirname, '..', 'regexes', 'uap-core.yml'),
17
- regexesYaml
18
- );
19
-
20
- const regexesFirstYaml = fs
21
- .readFileSync(path.resolve(__dirname, '..', 'regexes', 'first.yml'))
22
- .toString();
23
-
24
- const regexesExtraYaml = fs
25
- .readFileSync(path.resolve(__dirname, '..', 'regexes', 'extra.yml'))
26
- .toString();
27
-
28
- const regexes = yaml.eval(regexesYaml);
29
- const regexesExtra = yaml.eval(regexesExtraYaml);
30
- const regexesFirst = yaml.eval(regexesFirstYaml);
31
-
32
- fs.writeFileSync(
33
- path.resolve(__dirname, '..', 'regexes', 'first.json'),
34
- prettyJsonStringify(regexesFirst.user_agent_parsers)
35
- );
36
-
37
- fs.writeFileSync(
38
- path.resolve(__dirname, '..', 'regexes', 'extra.json'),
39
- prettyJsonStringify(regexesExtra.user_agent_parsers)
40
- );
41
-
42
- fs.writeFileSync(
43
- path.resolve(__dirname, '..', 'regexes', 'uap-core-agent.json'),
44
- prettyJsonStringify(regexes.user_agent_parsers)
45
- );
46
-
47
- fs.writeFileSync(
48
- path.resolve(__dirname, '..', 'regexes', 'uap-core-os.json'),
49
- prettyJsonStringify(regexes.os_parsers)
50
- );
51
-
52
- fs.writeFileSync(
53
- path.resolve(__dirname, '..', 'regexes', 'uap-core-device.json'),
54
- prettyJsonStringify(regexes.device_parsers)
55
- );
56
-
57
- const regexesCoreYaml = fs
58
- .readFileSync(path.resolve(__dirname, '..', 'regexes', 'core.yml'))
59
- .toString();
60
-
61
- const regexesCore = yaml.eval(regexesCoreYaml);
62
-
63
- fs.writeFileSync(
64
- path.resolve(__dirname, '..', 'regexes', 'core.json'),
65
- prettyJsonStringify(regexesCore)
66
- );
67
- });
@@ -1,31 +0,0 @@
1
- /* eslint-env mocha */
2
-
3
- const assert = require('assert');
4
-
5
- const { pick } = require('lodash');
6
-
7
- const useragent = require('../../src/useragent');
8
-
9
- const tests = require('./useragent-combined.json');
10
-
11
- const fields = ['family', 'major', 'minor', 'patch', 'patch_minor'];
12
-
13
- describe('useragent combined', () => {
14
- for (const [ua, json] of tests) {
15
- it(`should parse ${ua}`, () => {
16
- const agent = useragent.parse(ua, true, true, true);
17
- assert.deepStrictEqual(pick(agent.toJSON(), fields), json);
18
- });
19
- }
20
-
21
- it('should re-construct from JSON', () => {
22
- for (const [ua] of tests) {
23
- const agentJson = useragent.parse(ua, true, true, true).toJSON();
24
- const agent = useragent.fromJSON(agentJson);
25
- assert.deepStrictEqual(
26
- pick(agent.toJSON(), fields),
27
- pick(agentJson, fields)
28
- );
29
- }
30
- });
31
- });
@@ -1,12 +0,0 @@
1
- [
2
- [
3
- "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0 O/x.d3v0.12",
4
- {
5
- "family": "Firefox",
6
- "major": "54",
7
- "minor": "0",
8
- "patch": null,
9
- "patch_minor": null
10
- }
11
- ]
12
- ]
@@ -1,31 +0,0 @@
1
- /* eslint-env mocha */
2
-
3
- const assert = require('assert');
4
-
5
- const { pick } = require('lodash');
6
-
7
- const useragent = require('../../src/useragent');
8
-
9
- const tests = require('./useragent-core.json');
10
-
11
- const fields = ['family', 'major', 'minor', 'patch', 'patch_minor'];
12
-
13
- describe('useragent core', () => {
14
- for (const [ua, json] of tests) {
15
- it(`should parse ${ua}`, () => {
16
- const agent = useragent.parse(ua, true, false, false);
17
- assert.deepStrictEqual(pick(agent.toJSON(), fields), json);
18
- });
19
- }
20
-
21
- it('should re-construct from JSON', () => {
22
- for (const [ua] of tests) {
23
- const agentJson = useragent.parse(ua, true, false, false).toJSON();
24
- const agent = useragent.fromJSON(agentJson);
25
- assert.deepStrictEqual(
26
- pick(agent.toJSON(), fields),
27
- pick(agentJson, fields)
28
- );
29
- }
30
- });
31
- });