mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-11-15 22:52:16 +03:00
Compare commits
275 Commits
0.7.26
...
2.0.0-beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37c61736c3 | ||
|
|
ac282df13e | ||
|
|
5a0d9cc3d0 | ||
|
|
f6fbf170e3 | ||
|
|
a9247154e0 | ||
|
|
f57f8fa1a7 | ||
|
|
8fea17f296 | ||
|
|
a4b4e8a2c2 | ||
|
|
954ce35755 | ||
|
|
ea4f145e64 | ||
|
|
91d2d2c0e8 | ||
|
|
b5546ee39f | ||
|
|
b3f4321bb6 | ||
|
|
aa76da90d9 | ||
|
|
817c5835ef | ||
|
|
6ea6936632 | ||
|
|
9b182526fa | ||
|
|
f17d2d7664 | ||
|
|
9652169da0 | ||
|
|
bf1d7267f6 | ||
|
|
5226361348 | ||
|
|
385e0aaee5 | ||
|
|
a661ab61d5 | ||
|
|
647e115a1e | ||
|
|
05a98aceda | ||
|
|
807dcdbded | ||
|
|
1522691426 | ||
|
|
f538018f8e | ||
|
|
3f105fe93b | ||
|
|
129657673b | ||
|
|
3dd4b60ee9 | ||
|
|
73a936001a | ||
|
|
2046b77ede | ||
|
|
d168b75a3a | ||
|
|
6e26e38247 | ||
|
|
3cb567c154 | ||
|
|
f76d8983ca | ||
|
|
22eae9f70c | ||
|
|
f2e4b242ce | ||
|
|
153831d2ed | ||
|
|
072a82b87b | ||
|
|
15d17e97a1 | ||
|
|
df9144b493 | ||
|
|
a519d2b879 | ||
|
|
102dc51683 | ||
|
|
1a806453f9 | ||
|
|
3d5c70457e | ||
|
|
a74ebeb82e | ||
|
|
4c77c5ef21 | ||
|
|
9102871dea | ||
|
|
1653d376ca | ||
|
|
29fb85658a | ||
|
|
c3be7326b8 | ||
|
|
5a26ac146e | ||
|
|
35c2b91534 | ||
|
|
feefb81cd0 | ||
|
|
0ac5028137 | ||
|
|
1b17315935 | ||
|
|
f92bb9ef65 | ||
|
|
f659659500 | ||
|
|
6c58ac39cd | ||
|
|
432a2ee72d | ||
|
|
c2f17004b8 | ||
|
|
f5af76a2b3 | ||
|
|
99baf60d50 | ||
|
|
46f38adb83 | ||
|
|
ff26813708 | ||
|
|
e62cded083 | ||
|
|
2fb0c72898 | ||
|
|
801c2409b3 | ||
|
|
a8951ec282 | ||
|
|
07c9e36ebe | ||
|
|
407b23262c | ||
|
|
16b416d9ea | ||
|
|
05747dba37 | ||
|
|
625ece73e2 | ||
|
|
e01663b48f | ||
|
|
59d8d836c2 | ||
|
|
b385a73340 | ||
|
|
4711805a1c | ||
|
|
5d2acd8fe7 | ||
|
|
359cbecd32 | ||
|
|
1e80cf3533 | ||
|
|
b09878934f | ||
|
|
30de983043 | ||
|
|
894512c72f | ||
|
|
4af26c7a5e | ||
|
|
a6c85d0148 | ||
|
|
7a4fe6f454 | ||
|
|
af65fd6960 | ||
|
|
ba28d33d51 | ||
|
|
82567c28ab | ||
|
|
e70d09a1f8 | ||
|
|
3af8e1e272 | ||
|
|
172f57ffea | ||
|
|
33f02099d1 | ||
|
|
33df5dc698 | ||
|
|
49d6422ebd | ||
|
|
a1d816ae21 | ||
|
|
0097b211db | ||
|
|
6b3fc3e0f1 | ||
|
|
08436ce4f5 | ||
|
|
df1a1c7bb4 | ||
|
|
31f94f3a51 | ||
|
|
6821276669 | ||
|
|
41f8d76968 | ||
|
|
c78346d3b4 | ||
|
|
f8dde65d54 | ||
|
|
60d3a2fbbc | ||
|
|
aff5a209f8 | ||
|
|
5672a2e15c | ||
|
|
3c3c03ceeb | ||
|
|
d99ff741f4 | ||
|
|
9ee128ae2b | ||
|
|
c6b4c867d5 | ||
|
|
f1449a8202 | ||
|
|
18730452f2 | ||
|
|
5ea9f0ec16 | ||
|
|
03b0a5afa6 | ||
|
|
d03c74d6b7 | ||
|
|
f18516c9c8 | ||
|
|
746ac28f94 | ||
|
|
96fb3a5ed5 | ||
|
|
6c34c3d4fa | ||
|
|
f8e5a1fb4f | ||
|
|
c9d1ab9561 | ||
|
|
f815ca6e9c | ||
|
|
0cbeb7a829 | ||
|
|
bf4fb916ca | ||
|
|
68447d883a | ||
|
|
0b0c7ff617 | ||
|
|
5b2e80bdfd | ||
|
|
ba0f25c19d | ||
|
|
4d3048aaaa | ||
|
|
97e4a89685 | ||
|
|
1a521b867f | ||
|
|
5d4ca2b4c2 | ||
|
|
cf093222e5 | ||
|
|
f2d0db001d | ||
|
|
a6140a17dd | ||
|
|
2033eb4aba | ||
|
|
a886604935 | ||
|
|
b814bcd791 | ||
|
|
df7551c9b6 | ||
|
|
94f2d604d1 | ||
|
|
e5942dc505 | ||
|
|
4ef9841592 | ||
|
|
528e7aea1c | ||
|
|
5e33df3b6b | ||
|
|
a8a4e71345 | ||
|
|
1f6a7e2860 | ||
|
|
db5567d614 | ||
|
|
2f7017b4d5 | ||
|
|
8ffdf232f4 | ||
|
|
98096f1454 | ||
|
|
5fd47ee00d | ||
|
|
6fde0d92d6 | ||
|
|
7f71024161 | ||
|
|
c239ac5167 | ||
|
|
8d3c2d327c | ||
|
|
d11fc47dc9 | ||
|
|
b490110109 | ||
|
|
cb5da5ea4b | ||
|
|
b2d685dd9c | ||
|
|
8d21e34201 | ||
|
|
48d930f0f1 | ||
|
|
55b5b40c7d | ||
|
|
d141915d45 | ||
|
|
8483ac09b3 | ||
|
|
896bdd04e4 | ||
|
|
25fff62540 | ||
|
|
ea04d018bb | ||
|
|
29b613deee | ||
|
|
238391a977 | ||
|
|
384f780a70 | ||
|
|
75e58525fe | ||
|
|
ebb32d1ad9 | ||
|
|
dea39e1693 | ||
|
|
ca417e25a9 | ||
|
|
f54d3fadac | ||
|
|
21fe76742f | ||
|
|
30ac448a0c | ||
|
|
1e82d7d265 | ||
|
|
a5cdc2975b | ||
|
|
180846b80a | ||
|
|
061a7a6145 | ||
|
|
ebebf0acb3 | ||
|
|
15ae12b71d | ||
|
|
4f77fbb441 | ||
|
|
cd25bc1866 | ||
|
|
534ba7dd7c | ||
|
|
0b423078c8 | ||
|
|
779b5dc1e5 | ||
|
|
18a4e5ade2 | ||
|
|
534d577355 | ||
|
|
fe963b58e5 | ||
|
|
6e39c8a553 | ||
|
|
3d4ec6ef3b | ||
|
|
f02a431000 | ||
|
|
b6bddd8c09 | ||
|
|
a29213960c | ||
|
|
f761a89ab2 | ||
|
|
7ddb2575bd | ||
|
|
23ad60ea68 | ||
|
|
97f3368ef0 | ||
|
|
b86860e850 | ||
|
|
157af1e2f2 | ||
|
|
b4cfe1b624 | ||
|
|
95fea1cb26 | ||
|
|
30648cef1d | ||
|
|
10c978eca5 | ||
|
|
fbd2c6853c | ||
|
|
29d5e43342 | ||
|
|
051aa5d284 | ||
|
|
139fbc321a | ||
|
|
191fed9127 | ||
|
|
8fe448fddf | ||
|
|
343d584f8f | ||
|
|
ef54fd35d6 | ||
|
|
79535f5d61 | ||
|
|
ee743946e8 | ||
|
|
f57bd9523d | ||
|
|
ffc03acd64 | ||
|
|
62cc99d7cf | ||
|
|
b542df155a | ||
|
|
15aa73de40 | ||
|
|
336ce2b950 | ||
|
|
20a428c351 | ||
|
|
47c310e203 | ||
|
|
825edbbf91 | ||
|
|
299283c436 | ||
|
|
39e8d4af03 | ||
|
|
03c915277a | ||
|
|
1e7b6d2e8b | ||
|
|
e5e13adc81 | ||
|
|
837042a3e8 | ||
|
|
7b3aa9fc15 | ||
|
|
8e55e00177 | ||
|
|
ca644313d6 | ||
|
|
ca83d4c9c3 | ||
|
|
9bed2b1437 | ||
|
|
3792900410 | ||
|
|
c05e4e837f | ||
|
|
c53a2a1f72 | ||
|
|
559ecaacb6 | ||
|
|
f715023f47 | ||
|
|
36b2275add | ||
|
|
75620c7b6c | ||
|
|
1d3c98a10c | ||
|
|
c39590b673 | ||
|
|
9200e53787 | ||
|
|
6c671dd246 | ||
|
|
535f11bd24 | ||
|
|
642c0399e8 | ||
|
|
3edacddb24 | ||
|
|
acc0b91ff5 | ||
|
|
f726dcd1ae | ||
|
|
383ca587ef | ||
|
|
7c8aa435b2 | ||
|
|
09aa9105dc | ||
|
|
557cc2198d | ||
|
|
f95aced43b | ||
|
|
24950f97ae | ||
|
|
cb30756f48 | ||
|
|
0868e372e0 | ||
|
|
9d431cfddd | ||
|
|
c937400e8e | ||
|
|
8bea5c552a | ||
|
|
3843578de9 | ||
|
|
be9a066029 | ||
|
|
6f2ba7fcd5 | ||
|
|
d72de26ef9 | ||
|
|
80fae81eee | ||
|
|
91fa6dd5cc | ||
|
|
7fbb93c99a |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -1,6 +1,6 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
github: faisalman
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: ua-parser-js
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
|
||||
43
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
43
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Library version**
|
||||
Which version of the library that you use, eg: v0.7.35 or v2.0.0-alpha.3
|
||||
|
||||
For the issue related with detection result, you can use the demo section in https://uaparser.js.org to confirm
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Smartphone (please complete the following information):**
|
||||
- Device: [e.g. iPhone6]
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Browser [e.g. stock browser, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
1
.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
vendored
Normal file
1
.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
vendored
Normal file
@@ -0,0 +1 @@
|
||||
- [ ] I have read and accept the [Contributor License Agreement (CLA)](https://gist.github.com/faisalman/2ed16621ebb544157eba85a7f7381417) Document and I hereby sign the CLA
|
||||
78
.github/workflows/analysis-codeql.yml
vendored
Normal file
78
.github/workflows/analysis-codeql.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: CodeQL Analysis
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master"]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ "master" ]
|
||||
schedule:
|
||||
- cron: '15 6 * * 0'
|
||||
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'javascript' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Use only 'java' to analyze code written in Java, Kotlin or both
|
||||
# Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
|
||||
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
|
||||
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||
# queries: security-extended,security-and-quality
|
||||
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
# - name: Autobuild
|
||||
# uses: github/codeql-action/autobuild@v2
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||
|
||||
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||||
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||||
|
||||
# - run: |
|
||||
# echo "Run, Build Application using script"
|
||||
# ./location_of_script_within_repo/buildscript.sh
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v2
|
||||
with:
|
||||
category: "/language:${{matrix.language}}"
|
||||
20
.github/workflows/analysis-dependency.yml
vendored
Normal file
20
.github/workflows/analysis-dependency.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
# Dependency Review Action
|
||||
#
|
||||
# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
|
||||
#
|
||||
# Source repository: https://github.com/actions/dependency-review-action
|
||||
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
|
||||
name: Dependency Analysis
|
||||
on: [pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
dependency-review:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v3
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v2
|
||||
72
.github/workflows/analysis-scorecard.yml
vendored
Normal file
72
.github/workflows/analysis-scorecard.yml
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
# This workflow uses actions that are not certified by GitHub. They are provided
|
||||
# by a third-party and are governed by separate terms of service, privacy
|
||||
# policy, and support documentation.
|
||||
|
||||
name: OpenSSF's Scorecard Analysis
|
||||
on:
|
||||
# For Branch-Protection check. Only the default branch is supported. See
|
||||
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
|
||||
branch_protection_rule:
|
||||
# To guarantee Maintained check is occasionally updated. See
|
||||
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
|
||||
schedule:
|
||||
- cron: '45 2 * * 4'
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
|
||||
# Declare default permissions as read only.
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
analysis:
|
||||
name: Scorecard analysis
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
# Needed to upload the results to code-scanning dashboard.
|
||||
security-events: write
|
||||
# Needed to publish results and get a badge (see publish_results below).
|
||||
id-token: write
|
||||
# Uncomment the permissions below if installing in a private repository.
|
||||
# contents: read
|
||||
# actions: read
|
||||
|
||||
steps:
|
||||
- name: "Checkout code"
|
||||
uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: "Run analysis"
|
||||
uses: ossf/scorecard-action@e38b1902ae4f44df626f11ba0734b14fb91f8f86 # v2.1.2
|
||||
with:
|
||||
results_file: results.sarif
|
||||
results_format: sarif
|
||||
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
|
||||
# - you want to enable the Branch-Protection check on a *public* repository, or
|
||||
# - you are installing Scorecard on a *private* repository
|
||||
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
|
||||
repo_token: ${{ secrets.SCORECARD_TOKEN }}
|
||||
|
||||
# Public repositories:
|
||||
# - Publish results to OpenSSF REST API for easy access by consumers
|
||||
# - Allows the repository to include the Scorecard badge.
|
||||
# - See https://github.com/ossf/scorecard-action#publishing-results.
|
||||
# For private repositories:
|
||||
# - `publish_results` will always be set to `false`, regardless
|
||||
# of the value entered here.
|
||||
publish_results: true
|
||||
|
||||
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
|
||||
# format to the repository Actions tab.
|
||||
- name: "Upload artifact"
|
||||
uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
|
||||
with:
|
||||
name: SARIF file
|
||||
path: results.sarif
|
||||
retention-days: 5
|
||||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
22
.github/workflows/publish-github-packages.yml
vendored
Normal file
22
.github/workflows/publish-github-packages.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
name: Publish to GitHub Package
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '18.x'
|
||||
registry-url: https://npm.pkg.github.com/
|
||||
- run: npm ci
|
||||
- run: npm publish
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
23
.github/workflows/publish-npm-packages.yml
vendored
Normal file
23
.github/workflows/publish-npm-packages.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
name: Publish to NPM
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '18.x'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- run: npm install -g npm
|
||||
- run: npm ci
|
||||
- run: npm publish --provenance --access public
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
17
.github/workflows/run-test.yml
vendored
17
.github/workflows/run-test.yml
vendored
@@ -1,17 +0,0 @@
|
||||
name: ua-parser-js-run-test
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
run-test:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [amd64, ppc64le]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
- name: Run the test
|
||||
run: |
|
||||
npm install
|
||||
npm run test-ci
|
||||
23
.github/workflows/test-ci.yml
vendored
Normal file
23
.github/workflows/test-ci.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
name: UAParser.js CI-Test
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
run-test:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [amd64, ppc64le]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
- name: Run the test
|
||||
run: |
|
||||
npm ci
|
||||
npx playwright install
|
||||
npm test
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,5 +1,7 @@
|
||||
node_modules/
|
||||
npm-debug.log
|
||||
playwright-report/
|
||||
test-results/
|
||||
|
||||
### vim ###
|
||||
.*.s[a-w][a-z]
|
||||
|
||||
18
.travis.yml
18
.travis.yml
@@ -1,18 +0,0 @@
|
||||
arch:
|
||||
- amd64
|
||||
- ppc64le
|
||||
language: node_js
|
||||
node_js:
|
||||
- stable
|
||||
- lts/*
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- node_modules
|
||||
|
||||
sudo: false
|
||||
|
||||
script: npm run test-ci
|
||||
90
CHANGELOG.md
Normal file
90
CHANGELOG.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# UAParser.js Changelog
|
||||
|
||||
# Version 2.0
|
||||
- What's breaking:
|
||||
- Dual-licensed under AGPLv3 or PRO License
|
||||
- Browser detection on mobile device: `"Chrome" => "Mobile Chrome"`, `"Firefox" => "Mobile Firefox"`
|
||||
- OS detection: `"Mac OS" => "macOS"`, `"Chromium OS" => "Chrome OS"`
|
||||
- What's new:
|
||||
- Some new methods in result object:
|
||||
- Support for client hints: `withClientHints()`
|
||||
- Support for feature detection: `withFeatureCheck()`
|
||||
- Utility for easy comparison: `is()`
|
||||
- Utility to print full-name: `toString()`
|
||||
- Support for ES module `import { UAParser } from 'ua-parser-js'`
|
||||
- Provided Enums submodule `'ua-parser-js/enums'`
|
||||
- Provided Extensions submodule `'ua-parser-js/extensions'`
|
||||
- Provided Helpers submodule `'ua-parser-js/helpers'`
|
||||
|
||||
# Version 0.7 / 1.0
|
||||
|
||||
Version 1.0.x is basically the equivalent of version 0.7.x. See [#536](https://github.com/faisalman/ua-parser-js/issues/536) for the reason behind this confusion.
|
||||
|
||||
## Version 0.7.36 / 1.0.36
|
||||
- Add new browser: Snapchat
|
||||
- Add new devices: Infinix, Tecno
|
||||
- Improve device detection: Amazon Fire TV, Xiaomi POCO
|
||||
- Improve OS detection: iOS
|
||||
|
||||
## Version 0.7.35 / 1.0.35
|
||||
- Fix result from user-supplied user-agent being altered
|
||||
- Add new browser: Heytap, TikTok
|
||||
- Add new engine: LibWeb
|
||||
- Add new OS: SerenityOS
|
||||
- Improve browser detection: Yandex
|
||||
- Improve device detection: iPhone, Amazon Echo
|
||||
- Improve OS detection: iOS
|
||||
|
||||
## Version 0.7.34 / 1.0.34
|
||||
- Fix Sharp Mobile detected as Huawei Tablet
|
||||
- Fix IE8 bug
|
||||
- Add new devices : Kobo e-Reader, Apple Watch, and some new SmartTV devices
|
||||
- Add new OS : watchOS
|
||||
- Improve browser detection : Kakao, Naver, Brave
|
||||
- Improve device detection : Oculus, iPad
|
||||
- Improve OS detection : Chrome OS
|
||||
- Using navigator.userAgentData as fallback for device.type & os.name
|
||||
|
||||
## Version 0.7.33 / 1.0.33
|
||||
|
||||
- Add new browser : Cobalt
|
||||
- Identify Macintosh as an Apple device
|
||||
- Fix ReDoS vulnerability
|
||||
|
||||
## Version 0.7.32 / 1.0.32
|
||||
|
||||
- Add new browser : DuckDuckGo, Huawei Browser, LinkedIn
|
||||
- Add new OS : HarmonyOS
|
||||
- Add some Huawei models
|
||||
- Add Sharp Aquos TV
|
||||
- Improve detection Xiaomi Mi CC9
|
||||
- Fix Sony Xperia 1 III misidentified as Acer tablet
|
||||
- Fix Detect Sony BRAVIA as SmartTV
|
||||
- Fix Detect Xiaomi Mi TV as SmartTV
|
||||
- Fix Detect Galaxy Tab S8 as tablet
|
||||
- Fix WeGame mistakenly identified as WeChat
|
||||
- Fix included commas in Safari / Mobile Safari version
|
||||
- Increase UA_MAX_LENGTH to 350
|
||||
|
||||
## Version 0.7.31 / 1.0.2
|
||||
|
||||
- Fix OPPO Reno A5 incorrect detection
|
||||
- Fix TypeError Bug
|
||||
- Use AST to extract regexes and verify them with safe-regex
|
||||
|
||||
## Version 0.7.30 / 1.0.1
|
||||
|
||||
- Add new browser : Obigo, UP.Browser, Klar
|
||||
- Add new device : Oculus, Roku
|
||||
- Add new OS: Maemo, HP-UX, Android-x86, Deepin, elementary OS, GhostBSD, Linspire, Manjaro, Sabayon
|
||||
- Improve detection for Sony Xperia 1ii, LG Android TV, and some more devices
|
||||
- Improve detection for ARM64 CPU
|
||||
- Improve detection for Windows Mobile, Netscape, Mac on PowerPC
|
||||
- Categorize PDA as mobile
|
||||
- Fix Sharp devices misjudged as Huawei
|
||||
- Fix trailing comma for ES3 compatibility
|
||||
- Some code refactor
|
||||
|
||||
# Version 0.8
|
||||
|
||||
Version 0.8 was created by accident. This version is now deprecated and no longer maintained, please update to version 0.7 / 1.0.
|
||||
29
CODE_OF_CONDUCT.md
Normal file
29
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# UAParser.js Code of Conduct
|
||||
|
||||
## Introduction
|
||||
|
||||
Welcome to the UAParser.js community! We're here to collaborate on developing an awesome project. Here are some general guidelines to make our community a great place:
|
||||
|
||||
### 1. Be Kind, Honest, and Respectful
|
||||
|
||||
Always treat others with kindness and respect. We value different opinions and encourage positive communication.
|
||||
|
||||
### 2. Keep Conversations Civil and On-Topic
|
||||
|
||||
Please keep discussions related to the project. If you want to talk about something else, find the right place for it.
|
||||
|
||||
### 3. Mutual Assistance, Appreciation, and Acknowledgement
|
||||
|
||||
Feel free to ask for help, show gratitude for contributions, and make sure to give credit where it's due.
|
||||
|
||||
### 4. Resolving Disagreements
|
||||
|
||||
In the event of a disagreement, we encourage open and respectful dialogue. It's important to remember that it's okay to have differing opinions, and if a common ground can't be reached, we suggest using the 'agree to disagree' approach.
|
||||
|
||||
## Reporting Issues
|
||||
|
||||
If you see any behavior that goes against this code of conduct, report it to [f@faisalman.com](mailto:f@faisalman.com).
|
||||
|
||||
## Conclusion
|
||||
|
||||
Together, we can make this project awesome!
|
||||
7
CONTRIBUTING.md
Normal file
7
CONTRIBUTING.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# UAParser.js: How to Contribute
|
||||
|
||||
* Fork and clone this repository
|
||||
* Make some changes as required
|
||||
* Write unit test to showcase its functionality under `/test`
|
||||
* Run the test suites to make sure it's not breaking anything `$ npm run build+test`
|
||||
* Submit a pull request under `develop` branch & check the CLA in the submission form
|
||||
73
LICENSE.md
Normal file
73
LICENSE.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# UAPARSER.JS PRO PERSONAL LICENSE
|
||||
|
||||
Version 1, October 2023
|
||||
|
||||
Copyright (C) 2023 Faisal Salman <f+ua-parser-js@faisalman.com>
|
||||
|
||||
---
|
||||
|
||||
## Definitions
|
||||
|
||||
"We" are the team behind UAParser.js.
|
||||
|
||||
"You" are the individual who is responsible for purchasing this license.
|
||||
|
||||
"The Code" is UAParser.js.
|
||||
|
||||
"Project" is what you built with The Code.
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
We retains all title, intellectual property, and ownership rights to The Code.
|
||||
|
||||
The Code is licensed, not sold, to You for use solely subject to the terms and conditions detailed here.
|
||||
|
||||
We grant you (and only you) a personal, limited, non-exclusive, non-transferable, non-sublicensable, royalty-free right to use, copy, and modify The Code.
|
||||
|
||||
This license is only valid for You as 1 (one) individual and can not be transferred to other individual or organization.
|
||||
|
||||
---
|
||||
|
||||
## Rights
|
||||
|
||||
You may use and modify The Code to create as many personal, hobby, educational, and other non-profit use as you want for yourself.
|
||||
|
||||
You may create any number of copies of The Code for yourself.
|
||||
|
||||
You have the right to get lifetime updates and a 1 (one) year support, starting from the time you make the purchase.
|
||||
|
||||
---
|
||||
|
||||
## Restriction
|
||||
|
||||
You may not use and modify The Code in such a way that may be used directly for commercial purpose.
|
||||
|
||||
You may not redistribute The Code, as-is or modified, except as a part of a Project that you made for yourself.
|
||||
|
||||
You may not deliver a Project that contains The Code as an open-source Project that might be used for commercial purpose to the general public, except with our written consent.
|
||||
|
||||
You may not use The Code for unlawful, inappropriate, illegal, or offensive purposes.
|
||||
|
||||
---
|
||||
|
||||
## Limitations
|
||||
|
||||
The Code is provided 'as is' without warranty of any kind, expressed, or implied.
|
||||
|
||||
We shall not be liable for any damages, including but not limited to, direct, indirect, special, incidental, or consequential damages or losses that occur by the use of The Code.
|
||||
|
||||
We reserve the rights to discontinue the lifetime updates for The Code at any time, with or without notice.
|
||||
|
||||
We offer support only for question within the scope of The Code functionality or related at our sole discretion.
|
||||
|
||||
---
|
||||
|
||||
## Terminations
|
||||
|
||||
This license works indefinitely but can be revoked at any time if there is a violation to any of the terms.
|
||||
|
||||
---
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
23
README.md
Normal file
23
README.md
Normal file
@@ -0,0 +1,23 @@
|
||||
<p align="center">
|
||||
<a href="https://uaparser.js.org"><img src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/uap-header.png"></a>
|
||||
</p>
|
||||
|
||||
# UAParser.js
|
||||
|
||||
Thank you for purchasing UAParser.js PRO Personal License, if you haven't please oreder here: https://store.faisalman.com
|
||||
|
||||
# Download
|
||||
|
||||
```sh
|
||||
npm install @ua-parser-js/pro-personal
|
||||
```
|
||||
|
||||
# Documentation
|
||||
|
||||
https://docs.uaparser.js.org/v2
|
||||
|
||||
# License
|
||||
|
||||
UAParser.js PRO Personal
|
||||
|
||||
Copyright (c) 2012-2023 Faisal Salman <<f@faisalman.com>>
|
||||
7
SECURITY.md
Normal file
7
SECURITY.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Security Policy
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
To report a security issue, please email `f@faisalman.com` with a description of the issue, reproducible steps to get the issue, affected versions, and, if known, mitigations for the issue.
|
||||
|
||||
If the issue is confirmed as a vulnerability, we will open a new security advisory draft in our GitHub's Security Advisory page [https://github.com/faisalman/ua-parser-js/security/advisories](https://github.com/faisalman/ua-parser-js/security/advisories) and acknowledge your contributions as part of it. This project follows a 90 days disclosure timeline.
|
||||
17
bower.json
17
bower.json
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"name": "ua-parser-js",
|
||||
"version": "0.7.26",
|
||||
"authors": [
|
||||
"Faisal Salman <f@faisalman.com>"
|
||||
],
|
||||
"private": false,
|
||||
"main": "src/ua-parser.js",
|
||||
"ignore": [
|
||||
"build",
|
||||
"node_modules",
|
||||
"bower_components",
|
||||
"test",
|
||||
"tests"
|
||||
],
|
||||
"dependencies": {}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
# UAParser.js Changelog
|
||||
|
||||
## Version 0.8.0
|
||||
13
dist/ua-parser.min.js
vendored
13
dist/ua-parser.min.js
vendored
File diff suppressed because one or more lines are too long
13
dist/ua-parser.pack.js
vendored
13
dist/ua-parser.pack.js
vendored
File diff suppressed because one or more lines are too long
21
license.md
21
license.md
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2012-2021 Faisal Salman <<f@faisalman.com>>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
5032
package-lock.json
generated
Normal file
5032
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: 'faisalman:ua-parser-js',
|
||||
version: '0.7.26',
|
||||
version: '2.0.0-beta.1',
|
||||
summary: 'Lightweight JavaScript-based user-agent string parser',
|
||||
git: 'https://github.com/faisalman/ua-parser-js.git',
|
||||
documentation: 'readme.md'
|
||||
|
||||
164
package.json
164
package.json
@@ -1,11 +1,12 @@
|
||||
{
|
||||
"title": "UAParser.js",
|
||||
"name": "ua-parser-js",
|
||||
"version": "0.7.26",
|
||||
"title": "UAParser.js PRO Personal",
|
||||
"name": "@ua-parser-js/pro-personal",
|
||||
"version": "2.0.0-beta.1",
|
||||
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
||||
"description": "Lightweight JavaScript-based user-agent string parser",
|
||||
"description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment",
|
||||
"keywords": [
|
||||
"user-agent",
|
||||
"client-hints",
|
||||
"parser",
|
||||
"browser",
|
||||
"engine",
|
||||
@@ -13,133 +14,222 @@
|
||||
"device",
|
||||
"cpu",
|
||||
"jquery-plugin",
|
||||
"ecosystem:jquery"
|
||||
"ecosystem:jquery",
|
||||
"ua-parser-js",
|
||||
"browser-detection",
|
||||
"device-detection",
|
||||
"os-detection"
|
||||
],
|
||||
"homepage": "https://github.com/faisalman/ua-parser-js",
|
||||
"contributors": [
|
||||
"Aamir Poonawalla <aamir@urx.com>",
|
||||
"Admas <mollases@users.noreply.github.com>",
|
||||
"algenon <m@antonz.ru>",
|
||||
"Alvin Portillo <portilloalvin@gmail.com>",
|
||||
"Alvin Portillo <alvin@8thwall.com>",
|
||||
"Amumu <yoyo837@hotmail.com>",
|
||||
"Andrea Vaghi <andrea.vaghi@jobrapido.com>",
|
||||
"Anton Zhiyanov <m@antonz.ru>",
|
||||
"Arturo Mejia <amejia@blim.com>",
|
||||
"Arun Rama Reddy <arunramareddy@gmail.com>",
|
||||
"Austin Pray <austin@austinpray.com>",
|
||||
"Bendeguz <symunona@gmail.com>",
|
||||
"Benjamin Bertrand <bertrand.design@gmail.com>",
|
||||
"Benjamin Urban <benjamin.urban@sueddeutsche.de>",
|
||||
"boneyao <admin@boneyao.com>",
|
||||
"Carl C Von Lewin <carlchristianlewin@gmail.com>",
|
||||
"CESAR RAMOS <c@imagenproactiva.com>",
|
||||
"Chad Killingsworth <ckillingsworth@jackhenry.com>",
|
||||
"chenhui9279 <chenhui9279@autohome.com.cn>",
|
||||
"chenyuan-new <53860479+chenyuan-new@users.noreply.github.com>",
|
||||
"Christopher De Cairos <chris.decairos@gmail.com>",
|
||||
"Cyrille David <cyrille@qonto.eu>",
|
||||
"Dante <duanjl.china@gmail.com>",
|
||||
"Dario Vladovic <d.vladimyr@gmail.com>",
|
||||
"David Annez <david.annez@gmail.com>",
|
||||
"Davit Barbakadze <jayarjo@gmail.com>",
|
||||
"ddivernois <david-emmanuel.divernois@amadeus.com>",
|
||||
"Deliaz <D3liaz@gmail.com>",
|
||||
"Demis Palma <demis.palma@gmail.com>",
|
||||
"dhoko <aurelien@protonmail.com>",
|
||||
"dianhe <dianhe@webank.com>",
|
||||
"dineshks1 <dineshks1@d.kumar44@outlook.com>",
|
||||
"Dmitry Tyschenko <dtyschenko@gmail.com>",
|
||||
"Douglas Li <doug@knotch.it>",
|
||||
"Dumitru Uzun <contact@duzun.me>",
|
||||
"Dustin <duburns@fanatics.com>",
|
||||
"Elchin Valiyev <elchin.valiyev@autodesk.com>",
|
||||
"Emil Hesslow <hesslow@gmail.com>",
|
||||
"Eric Redon <eric.redon@coox.org>",
|
||||
"Eric Schrenker <eric.schrenker@gmail.com>",
|
||||
"Erik Hesselink <hesselink@gmail.com>",
|
||||
"Fabian Becker <halfdan@xnorfz.de>",
|
||||
"Faisal Salman <fyzlman@gmail.com>",
|
||||
"Faisal Salman <f@faisalman.com>",
|
||||
"Frédéric Camblor <fcamblor@gmail.com>",
|
||||
"Frederik Ring <frederik.ring@gmail.com>",
|
||||
"Garrit Franke <garrit@slashdev.space>",
|
||||
"Gerald Host <me@jacobford.co.uk>",
|
||||
"Germán M. Bravo <german.mb@gmail.com>",
|
||||
"Grigory Dmitrenko <grigory@snsk.ru>",
|
||||
"gulpin <gulping.gulpin@gmail.com>",
|
||||
"Hans Ott <hansott@hotmail.be>",
|
||||
"Hendrik Helwich <h.helwich@iplabs.de>",
|
||||
"Hermann Ebert <ebbmo@HE.local>",
|
||||
"hr6r <hedian@gmail.com>",
|
||||
"Igor Topal <i.topal@smartweb.com.ua>",
|
||||
"Ildar Kamalov <i.kamalov@adguard.com>",
|
||||
"insanehong <insane.hong@navercorp.com>",
|
||||
"jackpoll <jackpoll123456@gmail.com>",
|
||||
"Jacky Choo <jackychoo@adly-macbook.local>",
|
||||
"Jake Mc <startswithaj@users.noreply.github.com>",
|
||||
"JBYoshi <12983479+JBYoshi@users.noreply.github.com>",
|
||||
"Joey Parrish <joeyparrish@google.com>",
|
||||
"John Tantalo <john.tantalo@gmail.com>",
|
||||
"John Yanarella <jmy@codecatalyst.com>",
|
||||
"Jon Buckley <jon@jbuckley.ca>",
|
||||
"Josh Goldberg <joshuakgoldberg@outlook.com>",
|
||||
"Junki-Ishida <junki_ishida@dwango.co.jp>",
|
||||
"Kendall Buchanan <kendall@kendagriff.com>",
|
||||
"KnifeLemon <role___play@naver.com>",
|
||||
"kNoAPP <alldoneb@gmail.com>",
|
||||
"Lee Treveil <leetreveil@gmail.com>",
|
||||
"leonardo <leofiore@libero.it>",
|
||||
"Levente Balogh <balogh.levente.hu@gmail.com>",
|
||||
"Liam Quinn <lquinn@blackberry.com>",
|
||||
"Lithin <lithin@webklipper.com>",
|
||||
"liujunlve <liujunlve@henhaoji.com>",
|
||||
"ll-syber <670159357@qq.com>",
|
||||
"Loris Guignard <loris.guignard@gmail.com>",
|
||||
"Lukas Drgon <lukas.drgon@gmail.com>",
|
||||
"Lukas Eipert <leipert@users.noreply.github.com>",
|
||||
"Malash <i@malash.me>",
|
||||
"Martynas <martynas@firmfirm.co>",
|
||||
"Masahiko Sato <masasato@yahoo-corp.jp>",
|
||||
"Matt Brophy <matt@brophy.org>",
|
||||
"Max Maurer <maxemanuel.maurer@gmail.com>",
|
||||
"Matthew Origer <karatecowboy@gmail.com>",
|
||||
"Maximilian Haupt <mail@maximilianhaupt.com>",
|
||||
"Max Maurer <maxemanuel.maurer@gmail.com>",
|
||||
"Max Nordlund <max.nordlund@gmail.com>",
|
||||
"Michael Hess <mhess@connectify.me>",
|
||||
"MimyyK <michele.marais@hakisa.com>",
|
||||
"Mok <mok@moekm.com>",
|
||||
"nabetama <mao.nabeta@gmail.com>",
|
||||
"naoh <naoh.cs03g@nctu.edu.tw>",
|
||||
"Nicholas Ionata <nionata@ufl.edu>",
|
||||
"Nikhil Motiani <nikhil.motiani@outlook.com>",
|
||||
"Nik Rolls <nik@rolls.cc>",
|
||||
"Nikhil Motiani <nikhil.m@247-inc.com>",
|
||||
"nionata <n.ionata129@gmail.com>",
|
||||
"niris <nirisix@gmail.com>",
|
||||
"Nobuo Okada <nookada@yahoo-corp.jp>",
|
||||
"o.drapeza <o.drapeza@tinkoff.ru>",
|
||||
"Oscar Becerra <oscarbecerra@google.com>",
|
||||
"otakuSiD <otakusid@gmail.com>",
|
||||
"Paris Morgan <paris@8thwall.com>",
|
||||
"patrick-nurt <github@pereira.dk>",
|
||||
"Pavel Studeny <studeny@avast.com>",
|
||||
"Peter Dave Hello <PeterDaveHello@users.noreply.github.com>",
|
||||
"philippsimon <github@philippsimon.de>",
|
||||
"Pieter Hendrickx <pieter.hendrickx@belfius.be>",
|
||||
"Piper Chester <piperchester@gmail.com>",
|
||||
"Queen Vinyl Darkscratch <vinyldarkscratch@gmail.com>",
|
||||
"Raine Makelainen <raine.makelainen@jolla.com>",
|
||||
"Raman Savaryn <homeneartheocean@gmail.com>",
|
||||
"Riley Shaw <rileyjshaw@users.noreply.github.com>",
|
||||
"Robert Tod <robert@qubit.com>",
|
||||
"roman.savarin <roman.savarin@skywindgroup.com>",
|
||||
"Ron Korland <ron@testim.io>",
|
||||
"Ross Noble <rosshnoble@gmail.com>",
|
||||
"ruicong <466403866@qq.com>",
|
||||
"Runar Heggset <rukki093@gmail.com>",
|
||||
"Ryohei Shima <shima01dev@gmail.com>",
|
||||
"Sandro Sonntag <sandro.sonntag@adorsys.de>",
|
||||
"sgautrea <shanegautreau@gmail.com>",
|
||||
"shaharmor <shahar@peer5.com>",
|
||||
"Shane Gautreau <sgautrea@opentext.com>",
|
||||
"Shane Thacker <shane@steadymade.com>",
|
||||
"shchotse <topal@mail.ua>",
|
||||
"Shreedhar <shreedhar@uber.com>",
|
||||
"Simon Eisenmann <simon@longsleep.org>",
|
||||
"Simon Lang <me@simonlang.org>",
|
||||
"Stiekel <histkc@gmail.com>",
|
||||
"sunny-mwx <30586210+sunny-mwx@users.noreply.github.com>",
|
||||
"sUP <dani3l@gmail.com>",
|
||||
"Sylvain Gizard <sylvain.gizard@gmail.com>",
|
||||
"szchenghuang <szchenghuang@gmail.com>",
|
||||
"Tanguy Krotoff <tkrotoff@gmail.com>",
|
||||
"Tony Tomarchio <tony@tomarchio.cc>",
|
||||
"Ulrich Schmidt <u.schmidt@velian.de>",
|
||||
"Vadim Kurachevsky <vadim@hmvs.org>",
|
||||
"Varun Sharma <varunsh@stepsecurity.io>",
|
||||
"XhmikosR <xhmikosr@gmail.com>",
|
||||
"Yılmaz <yilmazdemir36@gmail.com>",
|
||||
"yuanyang <work_yuanyang@163.com>",
|
||||
"Yun Young-jin <yupmin@yupmin-office-macmini.local>",
|
||||
"Insanehong <insae.hong@navercorp.com>"
|
||||
"Zach Bjornson <zbbjornson@gmail.com>",
|
||||
"Ziding Zhang <zidingz@gmail.com>"
|
||||
],
|
||||
"main": "src/ua-parser.js",
|
||||
"scripts": {
|
||||
"build": "uglifyjs src/ua-parser.js -o dist/ua-parser.min.js --comments && uglifyjs src/ua-parser.js -o dist/ua-parser.pack.js --comments --compress --mangle",
|
||||
"test": "jshint src/ua-parser.js && mocha -R nyan test/test.js",
|
||||
"test-ci": "jshint src/ua-parser.js && mocha -R spec test/test.js",
|
||||
"verup": "node ./node_modules/verup",
|
||||
"version": "node ./node_modules/verup 0"
|
||||
"type": "commonjs",
|
||||
"types": "src/main/ua-parser.d.ts",
|
||||
"main": "src/main/ua-parser.js",
|
||||
"module": "src/main/ua-parser.mjs",
|
||||
"browser": "dist/ua-parser.pack.js",
|
||||
"exports": {
|
||||
".": {
|
||||
"require": "./src/main/ua-parser.js",
|
||||
"import": "./src/main/ua-parser.mjs"
|
||||
},
|
||||
"./enums": {
|
||||
"require": "./src/enums/ua-parser-enums.js",
|
||||
"import": "./src/enums/ua-parser-enums.mjs"
|
||||
},
|
||||
"./extensions": {
|
||||
"require": "./src/extensions/ua-parser-extensions.js",
|
||||
"import": "./src/extensions/ua-parser-extensions.mjs"
|
||||
}
|
||||
},
|
||||
"verup": {
|
||||
"files": [
|
||||
"bower.json",
|
||||
"package.js",
|
||||
"src/ua-parser.js"
|
||||
],
|
||||
"regs": [
|
||||
"^((?:\\$|(\\s*\\*\\s*@)|(\\s*(?:var|,)?\\s+))(?:LIBVERSION|version)[\\s\\:='\"]+)([0-9]+(?:\\.[0-9]+){2,2})",
|
||||
"^(\\s?\\*.*v)([0-9]+(?:\\.[0-9]+){2,2})"
|
||||
]
|
||||
"files": [
|
||||
"dist",
|
||||
"src"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "./script/build-dist.sh && ./script/build-module.js",
|
||||
"build+test": "npm run build && npm run test",
|
||||
"fuzz": "jazzer ./test/jazzer-fuzz-test.js --sync",
|
||||
"test": "./script/test-all.sh",
|
||||
"test:dts": "tsd --typings src/main/ua-parser.d.ts --files test/dts-test.ts",
|
||||
"test:eslint": "eslint src && eslint script",
|
||||
"test:jshint": "jshint src/main",
|
||||
"test:lockfile-lint": "npx lockfile-lint -p package-lock.json",
|
||||
"test:mocha": "mocha -R list test/mocha*js",
|
||||
"test:playwright": "playwright test"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jshint": "~2.12.0",
|
||||
"@babel/parser": "7.15.8",
|
||||
"@babel/traverse": "7.15.4",
|
||||
"@jazzer.js/core": "^1.4.0",
|
||||
"@playwright/test": "~1.32.2",
|
||||
"jshint": "~2.13.6",
|
||||
"mocha": "~8.2.0",
|
||||
"requirejs": "^2.3.2",
|
||||
"requirejs": "2.3.2",
|
||||
"safe-regex": "^2.1.1",
|
||||
"uglify-js": "~3.12.0",
|
||||
"verup": "^1.3.x"
|
||||
"tsd": "^0.29.0",
|
||||
"uglify-js": "~3.12.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/faisalman/ua-parser-js.git"
|
||||
},
|
||||
"license": "MIT",
|
||||
"license": "UAParser.js-PRO-Personal",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
"directories": {
|
||||
"dist": "dist",
|
||||
"script": "script",
|
||||
"src": "src",
|
||||
"test": "test"
|
||||
},
|
||||
"bugs": "https://github.com/faisalman/ua-parser-js/issues",
|
||||
"demo": "https://faisalman.github.io/ua-parser-js",
|
||||
"download": "https://raw.github.com/faisalman/ua-parser-js/master/dist/ua-parser.min.js",
|
||||
"demo": "https://uaparser.js.org",
|
||||
"download": "https://raw.github.com/faisalman/ua-parser-js/master/dist/ua-parser.pack.js",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -148,6 +238,10 @@
|
||||
{
|
||||
"type": "paypal",
|
||||
"url": "https://paypal.me/faisalman"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/faisalman"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
308
readme.md
308
readme.md
@@ -1,308 +0,0 @@
|
||||
<p align="center">
|
||||
<img src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/logo.png" width="256" height="256">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://travis-ci.org/faisalman/ua-parser-js"><img src="https://travis-ci.org/faisalman/ua-parser-js.svg?branch=master"></a>
|
||||
<a href="https://www.npmjs.com/package/ua-parser-js"><img src="https://img.shields.io/npm/v/ua-parser-js.svg"></a>
|
||||
<a href="https://www.npmjs.com/package/ua-parser-js"><img src="https://img.shields.io/npm/dw/ua-parser-js.svg"></a>
|
||||
<a href="https://www.jsdelivr.com/package/npm/ua-parser-js"><img src="https://data.jsdelivr.com/v1/package/npm/ua-parser-js/badge"></a>
|
||||
<a href="https://cdnjs.com/libraries/UAParser.js"><img src="https://img.shields.io/cdnjs/v/UAParser.js.svg"></a>
|
||||
</p>
|
||||
|
||||
# UAParser.js
|
||||
|
||||
JavaScript library to detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data with relatively small footprint (~17KB minified, ~6KB gzipped) that can be used either in browser (client-side) or node.js (server-side).
|
||||
|
||||
* Author : Faisal Salman <<f@faisalman.com>>
|
||||
* Demo : http://faisalman.github.io/ua-parser-js
|
||||
* Source : https://github.com/faisalman/ua-parser-js
|
||||
|
||||
# Documentation
|
||||
|
||||
## Constructor
|
||||
|
||||
* `new UAParser([uastring][,extensions])`
|
||||
* returns new instance
|
||||
|
||||
* `UAParser([uastring][,extensions])`
|
||||
* returns result object `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
||||
|
||||
## Methods
|
||||
|
||||
* `getBrowser()`
|
||||
* returns `{ name: '', version: '' }`
|
||||
|
||||
```sh
|
||||
# Possible 'browser.name':
|
||||
2345Explorer, 360 Browser, Amaya, Android Browser, Arora, Avant, Avast, AVG,
|
||||
BIDUBrowser, Baidu, Basilisk, Blazer, Bolt, Brave, Bowser, Camino, Chimera,
|
||||
Chrome Headless, Chrome WebView, Chrome, Chromium, Comodo Dragon, Dillo,
|
||||
Dolphin, Doris, Edge, Electron, Epiphany, Facebook, Falkon, Fennec, Firebird,
|
||||
Firefox, Flock, GSA, GoBrowser, ICE Browser, IE, IEMobile, IceApe, IceCat,
|
||||
IceDragon, Iceape, Iceweasel, Instagram, Iridium, Iron, Jasmine, K-Meleon,
|
||||
Kindle, Konqueror, LBBROWSER, Line, Links, Lunascape, Lynx, MIUI Browser,
|
||||
Maemo Browser, Maemo, Maxthon, MetaSr Midori, Minimo, Mobile Safari, Mosaic,
|
||||
Mozilla, NetFront, NetSurf, Netfront, Netscape, NokiaBrowser, Oculus Browser,
|
||||
OmniWeb, Opera Coast, Opera Mini, Opera Mobi, Opera Tablet, Opera, PaleMoon,
|
||||
PhantomJS, Phoenix, Polaris, Puffin, QQ, QQBrowser, QQBrowserLite, Quark,
|
||||
QupZilla, RockMelt, Safari, Sailfish Browser, Samsung Browser, SeaMonkey, Silk,
|
||||
Skyfire, Sleipnir, Slim, SlimBrowser, Swiftfox, Tizen Browser, UCBrowser,
|
||||
Vivaldi, Waterfox, WeChat, Weibo, Yandex, baidu, iCab, w3m, Whale Browser...
|
||||
|
||||
# 'browser.version' determined dynamically
|
||||
```
|
||||
|
||||
* `getDevice()`
|
||||
* returns `{ model: '', type: '', vendor: '' }`
|
||||
|
||||
```sh
|
||||
# Possible 'device.type':
|
||||
console, mobile, tablet, smarttv, wearable, embedded
|
||||
|
||||
# Possible 'device.vendor':
|
||||
Acer, Alcatel, Amazon, Apple, Archos, ASUS, AT&T, BenQ, BlackBerry, Dell,
|
||||
Essential, GeeksPhone, Google, HP, HTC, Huawei, Jolla, Lenovo, LG, Meizu,
|
||||
Microsoft, Motorola, Nexian, Nintendo, Nokia, Nvidia, OnePlus, OPPO, Ouya,
|
||||
Palm, Panasonic, Pebble, Polytron, Realme, RIM, Samsung, Sharp, Siemens,
|
||||
Sony[Ericsson], Sprint, Vivo, Vodafone, Xbox, Xiaomi, Zebra, ZTE, ...
|
||||
|
||||
# 'device.model' determined dynamically
|
||||
```
|
||||
|
||||
* `getEngine()`
|
||||
* returns `{ name: '', version: '' }`
|
||||
|
||||
```sh
|
||||
# Possible 'engine.name'
|
||||
Amaya, Blink, EdgeHTML, Gecko, Goanna, iCab, KHTML, Links, Lynx, NetFront,
|
||||
NetSurf, Presto, Tasman, Trident, w3m, WebKit
|
||||
|
||||
# 'engine.version' determined dynamically
|
||||
```
|
||||
|
||||
* `getOS()`
|
||||
* returns `{ name: '', version: '' }`
|
||||
|
||||
```sh
|
||||
# Possible 'os.name'
|
||||
AIX, Amiga OS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, Chromium OS,
|
||||
Contiki, Fedora, Firefox OS, FreeBSD, Debian, DragonFly, Fuchsia, Gentoo, GNU,
|
||||
Haiku, Hurd, iOS, Joli, KaiOS, Linpus, Linux, Mac OS, Mageia, Mandriva, MeeGo,
|
||||
Minix, Mint, Morph OS, NetBSD, Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PC-BSD,
|
||||
PCLinuxOS, Plan9, PlayStation, QNX, Raspbian, RedHat, RIM Tablet OS, RISC OS,
|
||||
Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen, Ubuntu, Unix,
|
||||
VectorLinux, WebOS, Windows [Phone/Mobile], Zenwalk, ...
|
||||
|
||||
# 'os.version' determined dynamically
|
||||
```
|
||||
|
||||
* `getCPU()`
|
||||
* returns `{ architecture: '' }`
|
||||
|
||||
```sh
|
||||
# Possible 'cpu.architecture'
|
||||
68k, amd64, arm[64/hf], avr, ia[32/64], irix[64], mips[64], pa-risc, ppc, sparc[64]
|
||||
```
|
||||
|
||||
* `getResult()`
|
||||
* returns `{ ua: '', browser: {}, cpu: {}, device: {}, engine: {}, os: {} }`
|
||||
|
||||
* `getUA()`
|
||||
* returns UA string of current instance
|
||||
|
||||
* `setUA(uastring)`
|
||||
* set UA string to be parsed
|
||||
* returns current instance
|
||||
|
||||
# Usage
|
||||
|
||||
## Using HTML
|
||||
|
||||
```html
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<script src="ua-parser.min.js"></script>
|
||||
<script>
|
||||
|
||||
var parser = new UAParser();
|
||||
console.log(parser.getResult());
|
||||
/*
|
||||
/// This will print an object structured like this:
|
||||
{
|
||||
ua: "",
|
||||
browser: {
|
||||
name: "",
|
||||
version: "",
|
||||
major: "" //@deprecated
|
||||
},
|
||||
engine: {
|
||||
name: "",
|
||||
version: ""
|
||||
},
|
||||
os: {
|
||||
name: "",
|
||||
version: ""
|
||||
},
|
||||
device: {
|
||||
model: "",
|
||||
type: "",
|
||||
vendor: ""
|
||||
},
|
||||
cpu: {
|
||||
architecture: ""
|
||||
}
|
||||
}
|
||||
*/
|
||||
// Default result depends on current window.navigator.userAgent value
|
||||
|
||||
// Now let's try a custom user-agent string as an example
|
||||
var uastring1 = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2";
|
||||
parser.setUA(uastring1);
|
||||
var result = parser.getResult();
|
||||
// You can also use UAParser constructor directly without having to create an instance:
|
||||
// var result = UAParser(uastring1);
|
||||
|
||||
console.log(result.browser); // {name: "Chromium", version: "15.0.874.106"}
|
||||
console.log(result.device); // {model: undefined, type: undefined, vendor: undefined}
|
||||
console.log(result.os); // {name: "Ubuntu", version: "11.10"}
|
||||
console.log(result.os.version); // "11.10"
|
||||
console.log(result.engine.name); // "WebKit"
|
||||
console.log(result.cpu.architecture); // "amd64"
|
||||
|
||||
// Do some other tests
|
||||
var uastring2 = "Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko)";
|
||||
console.log(parser.setUA(uastring2).getBrowser().name); // "Konqueror"
|
||||
console.log(parser.getOS()); // {name: "OpenBSD", version: undefined}
|
||||
console.log(parser.getEngine()); // {name: "KHTML", version: "4.1.4"}
|
||||
|
||||
var uastring3 = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.7 Safari/534.11';
|
||||
console.log(parser.setUA(uastring3).getDevice().model); // "PlayBook"
|
||||
console.log(parser.getOS()) // {name: "RIM Tablet OS", version: "1.0.0"}
|
||||
console.log(parser.getBrowser().name); // "Safari"
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
## Using node.js
|
||||
|
||||
```sh
|
||||
$ npm install ua-parser-js
|
||||
```
|
||||
|
||||
```js
|
||||
var http = require('http');
|
||||
var parser = require('ua-parser-js');
|
||||
|
||||
http.createServer(function (req, res) {
|
||||
// get user-agent header
|
||||
var ua = parser(req.headers['user-agent']);
|
||||
// write the result as response
|
||||
res.end(JSON.stringify(ua, null, ' '));
|
||||
})
|
||||
.listen(1337, '127.0.0.1');
|
||||
|
||||
console.log('Server running at http://127.0.0.1:1337/');
|
||||
```
|
||||
|
||||
## Using TypeScript
|
||||
|
||||
```sh
|
||||
$ npm install --save @types/ua-parser-js
|
||||
# Download TS type definition from DefinitelyTyped repository:
|
||||
# https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/ua-parser-js
|
||||
```
|
||||
|
||||
## Using jQuery/Zepto ($.ua)
|
||||
|
||||
Although written in vanilla js, this library will automatically detect if jQuery/Zepto is present and create `$.ua` object (with values based on its User-Agent) along with `window.UAParser` constructor. To get/set user-agent you can use: `$.ua.get()` / `$.ua.set(uastring)`.
|
||||
|
||||
```js
|
||||
// Say we are in a browser with default user-agent: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0':
|
||||
|
||||
// Get the details
|
||||
console.log($.ua.device); // {vendor: "HTC", model: "Evo Shift 4G", type: "mobile"}
|
||||
console.log($.ua.os); // {name: "Android", version: "2.3.4"}
|
||||
console.log($.ua.os.name); // "Android"
|
||||
console.log($.ua.get()); // "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Sprint APA7373KT Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0"
|
||||
|
||||
// Now lets try to reset to another custom user-agent
|
||||
$.ua.set('Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build/HWI69) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13');
|
||||
|
||||
// Test again
|
||||
console.log($.ua.browser.name); // "Safari"
|
||||
console.log($.ua.engine.name); // "Webkit"
|
||||
console.log($.ua.device); // {vendor: "Motorola", model: "Xoom", type: "tablet"}
|
||||
console.log(parseInt($.ua.browser.version.split('.')[0], 10)); // 4
|
||||
|
||||
// Add class to <body> tag
|
||||
// <body class="ua-browser-safari ua-devicetype-tablet">
|
||||
$('body').addClass('ua-browser-' + $.ua.browser.name + ' ua-devicetype-' + $.ua.device.type);
|
||||
```
|
||||
|
||||
## Using Extension
|
||||
|
||||
* `UAParser([uastring,] extensions)`
|
||||
|
||||
```js
|
||||
// Example:
|
||||
var myOwnListOfBrowsers = [
|
||||
[/(mybrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION]
|
||||
];
|
||||
var myParser = new UAParser({ browser: myOwnListOfBrowsers });
|
||||
var myUA = 'Mozilla/5.0 MyBrowser/1.3';
|
||||
console.log(myParser.setUA(myUA).getBrowser()); // {name: "MyBrowser", version: "1.3"}
|
||||
```
|
||||
|
||||
# Development
|
||||
|
||||
## Sponsors
|
||||
|
||||
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/tiers/backers.svg?avatarHeight=64" height="80"/></a> <a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/tiers/sponsors.svg?avatarHeight=64" height="80"/></a>
|
||||
|
||||
<a href="https://www.paypal.me/faisalman/"><img src="https://cdn.rawgit.com/twolfson/paypal-github-button/1.0.0/dist/button.svg" height="40"></a>
|
||||
|
||||
## Contributors
|
||||
|
||||
<a href="https://github.com/faisalman/ua-parser-js/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=faisalman/ua-parser-js" />
|
||||
</a>
|
||||
|
||||
Made with [contributors-img](https://contrib.rocks).
|
||||
|
||||
## How To Contribute
|
||||
|
||||
* Fork and clone this repository
|
||||
* Make some changes as required
|
||||
* Write unit test to showcase its functionality
|
||||
* Run the test suites to make sure it's not breaking anything `$ npm test`
|
||||
* Submit a pull request under `develop` branch
|
||||
|
||||
# License
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2012-2021 Faisal Salman <<f@faisalman.com>>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
13
script/build-dist.sh
Executable file
13
script/build-dist.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
SRC_PATH="src/main/ua-parser.js"
|
||||
MIN_PATH="dist/ua-parser.min.js"
|
||||
PACK_PATH="dist/ua-parser.pack.js"
|
||||
|
||||
# minified
|
||||
echo "Generate ${MIN_PATH}"
|
||||
uglifyjs $SRC_PATH -o $MIN_PATH --comments "/^ UA/"
|
||||
|
||||
# packed
|
||||
echo "Generate ${PACK_PATH}"
|
||||
uglifyjs $SRC_PATH -o $PACK_PATH --comments "/^ UA/" --compress --mangle
|
||||
52
script/build-module.js
Executable file
52
script/build-module.js
Executable file
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env node
|
||||
/* jshint esversion: 6 */
|
||||
const fs = require('fs');
|
||||
|
||||
const generateMJS = (module) => {
|
||||
let { src, dest, title, replacements } = module;
|
||||
let text = fs.readFileSync(src, 'utf-8');
|
||||
|
||||
replacements.push(
|
||||
[/const (.+?)\s*=\s*require\((.+)\)/ig, 'import $1 from $2'],
|
||||
[/module\.exports =/ig, 'export']
|
||||
);
|
||||
replacements.forEach(rep => {
|
||||
text = text.replace(rep[0], rep[1]);
|
||||
});
|
||||
|
||||
console.log(`Generate ${dest}`);
|
||||
|
||||
fs.writeFileSync(dest,
|
||||
`// Generated ESM version of ${title}
|
||||
// DO NOT EDIT THIS FILE!
|
||||
// Source: /${src}
|
||||
|
||||
${text}`, 'utf-8');
|
||||
|
||||
};
|
||||
|
||||
const modules = [
|
||||
{
|
||||
src : 'src/main/ua-parser.js',
|
||||
dest : 'src/main/ua-parser.mjs',
|
||||
title : 'ua-parser-js',
|
||||
replacements : [
|
||||
[/\(func[\s\S]+strict\';/ig, ''],
|
||||
[/esversion\: 3/ig, 'esversion: 6'],
|
||||
[/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};']
|
||||
]
|
||||
},{
|
||||
src : 'src/enums/ua-parser-enums.js',
|
||||
dest :'src/enums/ua-parser-enums.mjs',
|
||||
title : 'ua-parser-js/enums',
|
||||
replacements : []
|
||||
},
|
||||
{
|
||||
src : 'src/extensions/ua-parser-extensions.js',
|
||||
dest : 'src/extensions/ua-parser-extensions.mjs',
|
||||
title : 'ua-parser-js/extensions',
|
||||
replacements : []
|
||||
}
|
||||
];
|
||||
|
||||
modules.forEach(module => generateMJS(module));
|
||||
32
script/test-all.sh
Executable file
32
script/test-all.sh
Executable file
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
echo '
|
||||
- run build
|
||||
'
|
||||
npm run build || exit 1
|
||||
|
||||
echo '
|
||||
- lint js code
|
||||
'
|
||||
npm run test:jshint || exit 1
|
||||
#npm run test:eslint || exit 1
|
||||
|
||||
echo '
|
||||
- test using mocha
|
||||
'
|
||||
npm run test:mocha || exit 1
|
||||
|
||||
echo '
|
||||
- test using playwright
|
||||
'
|
||||
npm run test:playwright || exit 1
|
||||
|
||||
echo '
|
||||
- lint lockfile
|
||||
'
|
||||
npm run test:lockfile-lint || exit 1
|
||||
|
||||
echo '
|
||||
- lint d.ts files
|
||||
'
|
||||
npm run test:dts || exit 1
|
||||
236
src/enums/ua-parser-enums.js
Normal file
236
src/enums/ua-parser-enums.js
Normal file
@@ -0,0 +1,236 @@
|
||||
///////////////////////////////////////////////
|
||||
/* Enums for UAParser.js v2.0.0-beta.1
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
UAParser.js PRO Personal License */
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const Browser = Object.freeze({
|
||||
ANDROID: 'Android Browser',
|
||||
BRAVE: 'Brave',
|
||||
CHROME: 'Chrome',
|
||||
CHROMIUM: 'Chromium',
|
||||
DOLPHIN: 'Dolphin',
|
||||
DUCKDUCKGO: 'DuckDuckGo',
|
||||
EDGE: 'Edge',
|
||||
FIREFOX: 'Firefox',
|
||||
FOCUS: 'Focus',
|
||||
IE: 'IE',
|
||||
KONQUEROR: 'Konqueror',
|
||||
MOBILE_CHROME: 'Mobile Chrome',
|
||||
MOBILE_FIREFOX: 'Mobile Firefox',
|
||||
MOBILE_SAFARI: 'Mobile Safari',
|
||||
OPERA: 'Opera',
|
||||
PALEMOON: 'PaleMoon',
|
||||
PUFFIN: 'Puffin',
|
||||
QQ: 'QQ Browser',
|
||||
SAFARI: 'Safari',
|
||||
SAMSUNG: 'Samsung Internet',
|
||||
UC: 'UC Browser',
|
||||
VIVALDI: 'Vivaldi',
|
||||
YANDEX: 'Yandex'
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
|
||||
const CPU = Object.freeze({
|
||||
ARM : 'arm',
|
||||
ARM64: 'arm64',
|
||||
ARMHF: 'armhf',
|
||||
AVR: 'avr',
|
||||
IA64: 'ia64',
|
||||
IRIX: 'irix',
|
||||
IRIX64: 'irix64',
|
||||
MIPS: 'mips',
|
||||
MIPS64: 'mips64',
|
||||
MOTO_68K: '68k',
|
||||
PPC: 'ppc',
|
||||
SPARC: 'sparc',
|
||||
SPARC64: 'sparc64',
|
||||
X86: 'ia32',
|
||||
X86_64: 'amd64'
|
||||
});
|
||||
|
||||
const Device = Object.freeze({
|
||||
CONSOLE: 'console',
|
||||
DEKSTOP: 'desktop',
|
||||
EMBEDDED: 'embedded',
|
||||
MOBILE: 'mobile',
|
||||
SMARTTV: 'smarttv',
|
||||
TABLET: 'tablet',
|
||||
WEARABLE: 'wearable'
|
||||
});
|
||||
|
||||
const Vendor = Object.freeze({
|
||||
ACER: 'Acer',
|
||||
ALCATEL: 'Alcatel',
|
||||
APPLE: 'Apple',
|
||||
AMAZON: 'Amazon',
|
||||
ARCHOS: 'Archos',
|
||||
ASUS: 'ASUS',
|
||||
ATT: 'AT&T',
|
||||
BENQ: 'BenQ',
|
||||
BLACKBERRY: 'BlackBerry',
|
||||
DELL: 'Dell',
|
||||
ESSENTIAL: 'Essential',
|
||||
FACEBOOK: 'Facebook',
|
||||
FAIRPHONE: 'Fairphone',
|
||||
GEEKSPHONE: 'GeeksPhone',
|
||||
GENERIC: 'Generic',
|
||||
GOOGLE: 'Google',
|
||||
HP: 'HP',
|
||||
HTC: 'HTC',
|
||||
HUAWEI: 'Huawei',
|
||||
INFINIX: 'Infinix',
|
||||
JOLLA: 'Jolla',
|
||||
KOBO: 'Kobo',
|
||||
LENOVO: 'Lenovo',
|
||||
LG: 'LG',
|
||||
MEIZU: 'Meizu',
|
||||
MICROSOFT: 'Microsoft',
|
||||
MOTOROLA: 'Motorola',
|
||||
NEXIAN: 'Nexian',
|
||||
NINTENDO: 'Nintendo',
|
||||
NOKIA: 'Nokia',
|
||||
NVIDIA: 'Nvidia',
|
||||
ONEPLUS: 'OnePlus',
|
||||
OPPO: 'OPPO',
|
||||
OUYA: 'Ouya',
|
||||
PALM: 'Palm',
|
||||
PANASONIC: 'Panasonic',
|
||||
PEBBLE: 'Pebble',
|
||||
POLYTRON: 'Polytron',
|
||||
REALME: 'Realme',
|
||||
RIM: 'RIM',
|
||||
ROKU: 'Roku',
|
||||
SAMSUNG: 'Samsung',
|
||||
SHARP: 'Sharp',
|
||||
SIEMENS: 'Siemens',
|
||||
SONY: 'Sony',
|
||||
SPRINT: 'Sprint',
|
||||
TECNO: 'Tecno',
|
||||
TESLA: 'Tesla',
|
||||
ULEFONE: 'Ulefone',
|
||||
VIVO: 'Vivo',
|
||||
VODAFONE: 'Vodafone',
|
||||
XBOX: 'Xbox',
|
||||
XIAOMI: 'Xiaomi',
|
||||
ZEBRA: 'Zebra',
|
||||
ZTE: 'ZTE',
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
|
||||
const Engine = Object.freeze({
|
||||
AMAYA: 'Amaya',
|
||||
BLINK: 'Blink',
|
||||
EDGEHTML: 'EdgeHTML',
|
||||
FLOW: 'Flow',
|
||||
GECKO: 'Gecko',
|
||||
GOANNA: 'Goanna',
|
||||
ICAB: 'iCab',
|
||||
KHTML: 'KHTML',
|
||||
LIBWEB: 'LibWeb',
|
||||
LINKS: 'Links',
|
||||
LYNX: 'Lynx',
|
||||
NETFRONT: 'NetFront',
|
||||
NETSURF: 'NetSurf',
|
||||
PRESTO: 'Presto',
|
||||
TASMAN: 'Tasman',
|
||||
TRIDENT: 'Trident',
|
||||
W3M: 'w3m',
|
||||
WEBKIT: 'WebKit'
|
||||
});
|
||||
|
||||
const OS = Object.freeze({
|
||||
AIX: 'AIX',
|
||||
AMIGA_OS: 'Amiga OS',
|
||||
ANDROID: 'Android',
|
||||
ANDROID_X86: 'Android-x86',
|
||||
ARCH: 'Arch',
|
||||
BADA: 'Bada',
|
||||
BEOS: 'BeOS',
|
||||
BLACKBERRY: 'BlackBerry',
|
||||
CENTOS: 'CentOS',
|
||||
CHROME_OS: 'Chrome OS',
|
||||
CONTIKI: 'Contiki',
|
||||
FEDORA: 'Fedora',
|
||||
FIREFOX_OS: 'Firefox OS',
|
||||
FREEBSD: 'FreeBSD',
|
||||
DEBIAN: 'Debian',
|
||||
DEEPIN: 'Deepin',
|
||||
DRAGONFLY: 'DragonFly',
|
||||
ELEMENTARY_OS: 'elementary OS',
|
||||
FUCHSIA: 'Fuchsia',
|
||||
GENTOO: 'Gentoo',
|
||||
GHOSTBSD: 'GhostBSD',
|
||||
GNU: 'GNU',
|
||||
HAIKU: 'Haiku',
|
||||
HARMONYOS: 'HarmonyOS',
|
||||
HP_UX: 'HP-UX',
|
||||
HURD: 'Hurd',
|
||||
IOS: 'iOS',
|
||||
JOLI: 'Joli',
|
||||
KAIOS: 'KaiOS',
|
||||
LINPUS: 'Linpus',
|
||||
LINSPIRE: 'Linspire',
|
||||
LINUX: 'Linux',
|
||||
MACOS: 'macOS',
|
||||
MAEMO: 'Maemo',
|
||||
MAGEIA: 'Mageia',
|
||||
MANDRIVA: 'Mandriva',
|
||||
MANJARO: 'Manjaro',
|
||||
MEEGO: 'MeeGo',
|
||||
MINIX: 'Minix',
|
||||
MINT: 'Mint',
|
||||
MORPH_OS: 'Morph OS',
|
||||
NETBSD: 'NetBSD',
|
||||
NETRANGE: 'NetRange',
|
||||
NETTV: 'NetTV',
|
||||
NINTENDO: 'Nintendo',
|
||||
OPENBSD: 'OpenBSD',
|
||||
OPENVMS: 'OpenVMS',
|
||||
OS2: 'OS/2',
|
||||
PALM: 'Palm',
|
||||
PC_BSD: 'PC-BSD',
|
||||
PCLINUXOS: 'PCLinuxOS',
|
||||
PLAN9: 'Plan9',
|
||||
PLAYSTATION: 'PlayStation',
|
||||
QNX: 'QNX',
|
||||
RASPBIAN: 'Raspbian',
|
||||
REDHAT: 'RedHat',
|
||||
RIM_TABLET_OS: 'RIM Tablet OS',
|
||||
RISC_OS: 'RISC OS',
|
||||
SABAYON: 'Sabayon',
|
||||
SAILFISH: 'Sailfish',
|
||||
SERENITYOS: 'SerenityOS',
|
||||
SERIES40: 'Series40',
|
||||
SLACKWARE: 'Slackware',
|
||||
SOLARIS: 'Solaris',
|
||||
SUSE: 'SUSE',
|
||||
SYMBIAN: 'Symbian',
|
||||
TIZEN: 'Tizen',
|
||||
UBUNTU: 'Ubuntu',
|
||||
UNIX: 'Unix',
|
||||
VECTORLINUX: 'VectorLinux',
|
||||
VIERA: 'Viera',
|
||||
WATCHOS: 'watchOS',
|
||||
WEBOS: 'WebOS',
|
||||
WINDOWS: 'Windows',
|
||||
WINDOWS_MOBILE: 'Windows Mobile',
|
||||
WINDOWS_PHONE: 'Windows Phone',
|
||||
ZENWALK: 'Zenwalk'
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
Browser,
|
||||
CPU,
|
||||
Device,
|
||||
Vendor,
|
||||
Engine,
|
||||
OS
|
||||
};
|
||||
240
src/enums/ua-parser-enums.mjs
Normal file
240
src/enums/ua-parser-enums.mjs
Normal file
@@ -0,0 +1,240 @@
|
||||
// Generated ESM version of ua-parser-js/enums
|
||||
// DO NOT EDIT THIS FILE!
|
||||
// Source: /src/enums/ua-parser-enums.js
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/* Enums for UAParser.js v2.0.0-beta.1
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
UAParser.js PRO Personal License */
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const Browser = Object.freeze({
|
||||
ANDROID: 'Android Browser',
|
||||
BRAVE: 'Brave',
|
||||
CHROME: 'Chrome',
|
||||
CHROMIUM: 'Chromium',
|
||||
DOLPHIN: 'Dolphin',
|
||||
DUCKDUCKGO: 'DuckDuckGo',
|
||||
EDGE: 'Edge',
|
||||
FIREFOX: 'Firefox',
|
||||
FOCUS: 'Focus',
|
||||
IE: 'IE',
|
||||
KONQUEROR: 'Konqueror',
|
||||
MOBILE_CHROME: 'Mobile Chrome',
|
||||
MOBILE_FIREFOX: 'Mobile Firefox',
|
||||
MOBILE_SAFARI: 'Mobile Safari',
|
||||
OPERA: 'Opera',
|
||||
PALEMOON: 'PaleMoon',
|
||||
PUFFIN: 'Puffin',
|
||||
QQ: 'QQ Browser',
|
||||
SAFARI: 'Safari',
|
||||
SAMSUNG: 'Samsung Internet',
|
||||
UC: 'UC Browser',
|
||||
VIVALDI: 'Vivaldi',
|
||||
YANDEX: 'Yandex'
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
|
||||
const CPU = Object.freeze({
|
||||
ARM : 'arm',
|
||||
ARM64: 'arm64',
|
||||
ARMHF: 'armhf',
|
||||
AVR: 'avr',
|
||||
IA64: 'ia64',
|
||||
IRIX: 'irix',
|
||||
IRIX64: 'irix64',
|
||||
MIPS: 'mips',
|
||||
MIPS64: 'mips64',
|
||||
MOTO_68K: '68k',
|
||||
PPC: 'ppc',
|
||||
SPARC: 'sparc',
|
||||
SPARC64: 'sparc64',
|
||||
X86: 'ia32',
|
||||
X86_64: 'amd64'
|
||||
});
|
||||
|
||||
const Device = Object.freeze({
|
||||
CONSOLE: 'console',
|
||||
DEKSTOP: 'desktop',
|
||||
EMBEDDED: 'embedded',
|
||||
MOBILE: 'mobile',
|
||||
SMARTTV: 'smarttv',
|
||||
TABLET: 'tablet',
|
||||
WEARABLE: 'wearable'
|
||||
});
|
||||
|
||||
const Vendor = Object.freeze({
|
||||
ACER: 'Acer',
|
||||
ALCATEL: 'Alcatel',
|
||||
APPLE: 'Apple',
|
||||
AMAZON: 'Amazon',
|
||||
ARCHOS: 'Archos',
|
||||
ASUS: 'ASUS',
|
||||
ATT: 'AT&T',
|
||||
BENQ: 'BenQ',
|
||||
BLACKBERRY: 'BlackBerry',
|
||||
DELL: 'Dell',
|
||||
ESSENTIAL: 'Essential',
|
||||
FACEBOOK: 'Facebook',
|
||||
FAIRPHONE: 'Fairphone',
|
||||
GEEKSPHONE: 'GeeksPhone',
|
||||
GENERIC: 'Generic',
|
||||
GOOGLE: 'Google',
|
||||
HP: 'HP',
|
||||
HTC: 'HTC',
|
||||
HUAWEI: 'Huawei',
|
||||
INFINIX: 'Infinix',
|
||||
JOLLA: 'Jolla',
|
||||
KOBO: 'Kobo',
|
||||
LENOVO: 'Lenovo',
|
||||
LG: 'LG',
|
||||
MEIZU: 'Meizu',
|
||||
MICROSOFT: 'Microsoft',
|
||||
MOTOROLA: 'Motorola',
|
||||
NEXIAN: 'Nexian',
|
||||
NINTENDO: 'Nintendo',
|
||||
NOKIA: 'Nokia',
|
||||
NVIDIA: 'Nvidia',
|
||||
ONEPLUS: 'OnePlus',
|
||||
OPPO: 'OPPO',
|
||||
OUYA: 'Ouya',
|
||||
PALM: 'Palm',
|
||||
PANASONIC: 'Panasonic',
|
||||
PEBBLE: 'Pebble',
|
||||
POLYTRON: 'Polytron',
|
||||
REALME: 'Realme',
|
||||
RIM: 'RIM',
|
||||
ROKU: 'Roku',
|
||||
SAMSUNG: 'Samsung',
|
||||
SHARP: 'Sharp',
|
||||
SIEMENS: 'Siemens',
|
||||
SONY: 'Sony',
|
||||
SPRINT: 'Sprint',
|
||||
TECNO: 'Tecno',
|
||||
TESLA: 'Tesla',
|
||||
ULEFONE: 'Ulefone',
|
||||
VIVO: 'Vivo',
|
||||
VODAFONE: 'Vodafone',
|
||||
XBOX: 'Xbox',
|
||||
XIAOMI: 'Xiaomi',
|
||||
ZEBRA: 'Zebra',
|
||||
ZTE: 'ZTE',
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
|
||||
const Engine = Object.freeze({
|
||||
AMAYA: 'Amaya',
|
||||
BLINK: 'Blink',
|
||||
EDGEHTML: 'EdgeHTML',
|
||||
FLOW: 'Flow',
|
||||
GECKO: 'Gecko',
|
||||
GOANNA: 'Goanna',
|
||||
ICAB: 'iCab',
|
||||
KHTML: 'KHTML',
|
||||
LIBWEB: 'LibWeb',
|
||||
LINKS: 'Links',
|
||||
LYNX: 'Lynx',
|
||||
NETFRONT: 'NetFront',
|
||||
NETSURF: 'NetSurf',
|
||||
PRESTO: 'Presto',
|
||||
TASMAN: 'Tasman',
|
||||
TRIDENT: 'Trident',
|
||||
W3M: 'w3m',
|
||||
WEBKIT: 'WebKit'
|
||||
});
|
||||
|
||||
const OS = Object.freeze({
|
||||
AIX: 'AIX',
|
||||
AMIGA_OS: 'Amiga OS',
|
||||
ANDROID: 'Android',
|
||||
ANDROID_X86: 'Android-x86',
|
||||
ARCH: 'Arch',
|
||||
BADA: 'Bada',
|
||||
BEOS: 'BeOS',
|
||||
BLACKBERRY: 'BlackBerry',
|
||||
CENTOS: 'CentOS',
|
||||
CHROME_OS: 'Chrome OS',
|
||||
CONTIKI: 'Contiki',
|
||||
FEDORA: 'Fedora',
|
||||
FIREFOX_OS: 'Firefox OS',
|
||||
FREEBSD: 'FreeBSD',
|
||||
DEBIAN: 'Debian',
|
||||
DEEPIN: 'Deepin',
|
||||
DRAGONFLY: 'DragonFly',
|
||||
ELEMENTARY_OS: 'elementary OS',
|
||||
FUCHSIA: 'Fuchsia',
|
||||
GENTOO: 'Gentoo',
|
||||
GHOSTBSD: 'GhostBSD',
|
||||
GNU: 'GNU',
|
||||
HAIKU: 'Haiku',
|
||||
HARMONYOS: 'HarmonyOS',
|
||||
HP_UX: 'HP-UX',
|
||||
HURD: 'Hurd',
|
||||
IOS: 'iOS',
|
||||
JOLI: 'Joli',
|
||||
KAIOS: 'KaiOS',
|
||||
LINPUS: 'Linpus',
|
||||
LINSPIRE: 'Linspire',
|
||||
LINUX: 'Linux',
|
||||
MACOS: 'macOS',
|
||||
MAEMO: 'Maemo',
|
||||
MAGEIA: 'Mageia',
|
||||
MANDRIVA: 'Mandriva',
|
||||
MANJARO: 'Manjaro',
|
||||
MEEGO: 'MeeGo',
|
||||
MINIX: 'Minix',
|
||||
MINT: 'Mint',
|
||||
MORPH_OS: 'Morph OS',
|
||||
NETBSD: 'NetBSD',
|
||||
NETRANGE: 'NetRange',
|
||||
NETTV: 'NetTV',
|
||||
NINTENDO: 'Nintendo',
|
||||
OPENBSD: 'OpenBSD',
|
||||
OPENVMS: 'OpenVMS',
|
||||
OS2: 'OS/2',
|
||||
PALM: 'Palm',
|
||||
PC_BSD: 'PC-BSD',
|
||||
PCLINUXOS: 'PCLinuxOS',
|
||||
PLAN9: 'Plan9',
|
||||
PLAYSTATION: 'PlayStation',
|
||||
QNX: 'QNX',
|
||||
RASPBIAN: 'Raspbian',
|
||||
REDHAT: 'RedHat',
|
||||
RIM_TABLET_OS: 'RIM Tablet OS',
|
||||
RISC_OS: 'RISC OS',
|
||||
SABAYON: 'Sabayon',
|
||||
SAILFISH: 'Sailfish',
|
||||
SERENITYOS: 'SerenityOS',
|
||||
SERIES40: 'Series40',
|
||||
SLACKWARE: 'Slackware',
|
||||
SOLARIS: 'Solaris',
|
||||
SUSE: 'SUSE',
|
||||
SYMBIAN: 'Symbian',
|
||||
TIZEN: 'Tizen',
|
||||
UBUNTU: 'Ubuntu',
|
||||
UNIX: 'Unix',
|
||||
VECTORLINUX: 'VectorLinux',
|
||||
VIERA: 'Viera',
|
||||
WATCHOS: 'watchOS',
|
||||
WEBOS: 'WebOS',
|
||||
WINDOWS: 'Windows',
|
||||
WINDOWS_MOBILE: 'Windows Mobile',
|
||||
WINDOWS_PHONE: 'Windows Phone',
|
||||
ZENWALK: 'Zenwalk'
|
||||
|
||||
// TODO : test!
|
||||
});
|
||||
|
||||
export {
|
||||
Browser,
|
||||
CPU,
|
||||
Device,
|
||||
Vendor,
|
||||
Engine,
|
||||
OS
|
||||
};
|
||||
248
src/extensions/ua-parser-extensions.js
Normal file
248
src/extensions/ua-parser-extensions.js
Normal file
@@ -0,0 +1,248 @@
|
||||
///////////////////////////////////////////////
|
||||
/* Extensions for UAParser.js v2.0.0-beta.1
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
UAParser.js PRO Personal License */
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const MODEL = 'model';
|
||||
const NAME = 'name';
|
||||
const TYPE = 'type';
|
||||
const VENDOR = 'vendor';
|
||||
const VERSION = 'version';
|
||||
const MOBILE = 'mobile';
|
||||
const TABLET = 'tablet';
|
||||
|
||||
const Apps = Object.freeze({
|
||||
browser : [
|
||||
[/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, 'app']]
|
||||
]
|
||||
});
|
||||
|
||||
const Bots = Object.freeze({
|
||||
browser : [
|
||||
// Googlebot / BingBot / MSNBot / FacebookBot
|
||||
[/((?:google|bing|msn|facebook)bot(?:[\-imagevdo]{0,6})|bingpreview)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']],
|
||||
|
||||
// GPTBot - https://platform.openai.com/docs/gptbot
|
||||
[/(gptbot)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']],
|
||||
|
||||
// Slackbot - https://api.slack.com/robots
|
||||
[/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']]
|
||||
]
|
||||
});
|
||||
|
||||
const CLIs = Object.freeze({
|
||||
browser : [
|
||||
// wget / curl / lynx
|
||||
[/(wget|curl|lynx)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'cli']]
|
||||
]
|
||||
});
|
||||
|
||||
const ExtraDevices = Object.freeze({
|
||||
device : [[
|
||||
/(nook)[\w ]+build\/(\w+)/i, // Nook
|
||||
/(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak
|
||||
/(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets
|
||||
/(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets
|
||||
/(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets
|
||||
/(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/(u304aa)/i // AT&T
|
||||
], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
|
||||
|
||||
/\bsie-(\w*)/i // Siemens
|
||||
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
|
||||
|
||||
/\b(rct\w+) b/i // RCA Tablets
|
||||
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
|
||||
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
|
||||
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
|
||||
], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(tm\d{3}\w+) b/i
|
||||
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(k88) b/i // ZTE K Series Tablet
|
||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(nx\d{3}j) b/i // ZTE Nubia
|
||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
|
||||
|
||||
/\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
|
||||
|
||||
/\b(zur\d{3}) b/i // Swiss ZUR Tablet
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
||||
|
||||
/\b((zeki)?tb.*\b) b/i // Zeki Tablets
|
||||
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
||||
|
||||
/\b([yr]\d{2}) b/i,
|
||||
/\b(?:dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
|
||||
], [MODEL, [VENDOR, 'Dragon Touch'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(ns-?\w{0,9}) b/i // Insignia Tablets
|
||||
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
|
||||
|
||||
/\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
|
||||
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
|
||||
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
|
||||
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/\b(ph-1) /i // Essential PH-1
|
||||
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [
|
||||
|
||||
/\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
|
||||
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
|
||||
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
|
||||
|
||||
/\btu_(1491) b/i // Rotor Tablets
|
||||
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]]
|
||||
]
|
||||
});
|
||||
|
||||
const Emails = Object.freeze({
|
||||
browser : [
|
||||
// Microsoft Outlook / Thunderbird
|
||||
[/(microsoft outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, 'email']]
|
||||
]
|
||||
});
|
||||
|
||||
const MediaPlayers = Object.freeze({
|
||||
browser : [[
|
||||
|
||||
/(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
|
||||
/(coremedia) v([\w\._]+)/i
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
|
||||
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
|
||||
// NSPlayer/PSP-InternetRadioPlayer/Videos
|
||||
/(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
|
||||
/(lg player|nexplayer)\s([\d\.]+)/i,
|
||||
/player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
|
||||
], [NAME, VERSION], [
|
||||
/(nexplayer)\s([\w\.-]+)/i // Nexplayer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(flrp)\/([\w\.-]+)/i // Flip Player
|
||||
], [[NAME, 'Flip Player'], VERSION], [
|
||||
|
||||
/(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
|
||||
// FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
|
||||
], [NAME], [
|
||||
|
||||
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
|
||||
// Gstreamer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
|
||||
/(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
|
||||
// Java/urllib/requests/wget/cURL
|
||||
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(htc_one_s)\/([\d\.]+)/i, // HTC One S
|
||||
], [[NAME, /_/g, ' '], VERSION], [
|
||||
|
||||
/(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
|
||||
// MPlayer SVN
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
|
||||
/(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(mplayer)/i, // MPlayer (no other info)
|
||||
/(yourmuze)/i, // YourMuze
|
||||
/(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
|
||||
], [NAME], [
|
||||
|
||||
/(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(nokia\d+)\/([\w\.-]+)/i // Nokia
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(winamp)3 version ([\w\.-]+)/i, // Winamp
|
||||
/(winamp)\s([\w\.-]+)/i,
|
||||
/(winamp)mpeg\/([\w\.-]+)/i
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
||||
// inlight radio
|
||||
], [NAME], [
|
||||
|
||||
/(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
|
||||
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
||||
// SoundTap/Totem/Stagefright/Streamium
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(smp)([\d\.]+)/i // SMP
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
|
||||
/(vlc)\/([\w\.-]+)/i,
|
||||
/(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
|
||||
/(foobar2000)\/([\d\.]+)/i, // Foobar2000
|
||||
/(itunes)\/([\d\.]+)/i // iTunes
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
|
||||
/(windows-media-player)\/([\w\.-]+)/i
|
||||
], [[NAME, /-/g, ' '], VERSION], [
|
||||
|
||||
/windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
|
||||
// Windows Media Server
|
||||
], [VERSION, [NAME, 'Windows']], [
|
||||
|
||||
/(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(rad.io)\s([\d\.]+)/i, // Rad.io
|
||||
/(radio.(?:de|at|fr))\s([\d\.]+)/i
|
||||
], [[NAME, 'rad.io'], VERSION]
|
||||
]
|
||||
});
|
||||
|
||||
const Modules = Object.freeze({
|
||||
browser : [
|
||||
// Axios/jsdom/Scrapy
|
||||
[/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'module']]
|
||||
]
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
Apps,
|
||||
Bots,
|
||||
CLIs,
|
||||
ExtraDevices,
|
||||
Emails,
|
||||
MediaPlayers,
|
||||
Modules
|
||||
};
|
||||
252
src/extensions/ua-parser-extensions.mjs
Normal file
252
src/extensions/ua-parser-extensions.mjs
Normal file
@@ -0,0 +1,252 @@
|
||||
// Generated ESM version of ua-parser-js/extensions
|
||||
// DO NOT EDIT THIS FILE!
|
||||
// Source: /src/extensions/ua-parser-extensions.js
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/* Extensions for UAParser.js v2.0.0-beta.1
|
||||
https://github.com/faisalman/ua-parser-js
|
||||
Author: Faisal Salman <f@faisalman.com>
|
||||
UAParser.js PRO Personal License */
|
||||
//////////////////////////////////////////////
|
||||
|
||||
/*jshint esversion: 6 */
|
||||
|
||||
const MODEL = 'model';
|
||||
const NAME = 'name';
|
||||
const TYPE = 'type';
|
||||
const VENDOR = 'vendor';
|
||||
const VERSION = 'version';
|
||||
const MOBILE = 'mobile';
|
||||
const TABLET = 'tablet';
|
||||
|
||||
const Apps = Object.freeze({
|
||||
browser : [
|
||||
[/chatlyio\/([\d\.]+)/i], [VERSION, 'Slack', [TYPE, 'app']]
|
||||
]
|
||||
});
|
||||
|
||||
const Bots = Object.freeze({
|
||||
browser : [
|
||||
// Googlebot / BingBot / MSNBot / FacebookBot
|
||||
[/((?:google|bing|msn|facebook)bot(?:[\-imagevdo]{0,6})|bingpreview)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']],
|
||||
|
||||
// GPTBot - https://platform.openai.com/docs/gptbot
|
||||
[/(gptbot)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']],
|
||||
|
||||
// Slackbot - https://api.slack.com/robots
|
||||
[/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i], [NAME, VERSION, [TYPE, 'bot']]
|
||||
]
|
||||
});
|
||||
|
||||
const CLIs = Object.freeze({
|
||||
browser : [
|
||||
// wget / curl / lynx
|
||||
[/(wget|curl|lynx)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'cli']]
|
||||
]
|
||||
});
|
||||
|
||||
const ExtraDevices = Object.freeze({
|
||||
device : [[
|
||||
/(nook)[\w ]+build\/(\w+)/i, // Nook
|
||||
/(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak
|
||||
/(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets
|
||||
/(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets
|
||||
/(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets
|
||||
/(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/(u304aa)/i // AT&T
|
||||
], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
|
||||
|
||||
/\bsie-(\w*)/i // Siemens
|
||||
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
|
||||
|
||||
/\b(rct\w+) b/i // RCA Tablets
|
||||
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
|
||||
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
|
||||
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
|
||||
], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(tm\d{3}\w+) b/i
|
||||
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(k88) b/i // ZTE K Series Tablet
|
||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(nx\d{3}j) b/i // ZTE Nubia
|
||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
|
||||
|
||||
/\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
|
||||
|
||||
/\b(zur\d{3}) b/i // Swiss ZUR Tablet
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
||||
|
||||
/\b((zeki)?tb.*\b) b/i // Zeki Tablets
|
||||
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
||||
|
||||
/\b([yr]\d{2}) b/i,
|
||||
/\b(?:dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
|
||||
], [MODEL, [VENDOR, 'Dragon Touch'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(ns-?\w{0,9}) b/i // Insignia Tablets
|
||||
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
|
||||
|
||||
/\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
|
||||
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
|
||||
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
|
||||
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/\b(ph-1) /i // Essential PH-1
|
||||
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [
|
||||
|
||||
/\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
|
||||
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
|
||||
|
||||
/\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
|
||||
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
|
||||
|
||||
/\btu_(1491) b/i // Rotor Tablets
|
||||
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]]
|
||||
]
|
||||
});
|
||||
|
||||
const Emails = Object.freeze({
|
||||
browser : [
|
||||
// Microsoft Outlook / Thunderbird
|
||||
[/(microsoft outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, 'email']]
|
||||
]
|
||||
});
|
||||
|
||||
const MediaPlayers = Object.freeze({
|
||||
browser : [[
|
||||
|
||||
/(apple(?:coremedia|))\/([\w\._]+)/i, // Generic Apple CoreMedia
|
||||
/(coremedia) v([\w\._]+)/i
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(aqualung|lyssna|bsplayer)\/([\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(ares|ossproxy)\s([\w\.-]+)/i // Ares/OSSProxy
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/([\w\.-]+)/i,
|
||||
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
|
||||
// NSPlayer/PSP-InternetRadioPlayer/Videos
|
||||
/(clementine|music player daemon)\s([\w\.-]+)/i, // Clementine/MPD
|
||||
/(lg player|nexplayer)\s([\d\.]+)/i,
|
||||
/player\/(nexplayer|lg player)\s([\w\.-]+)/i // NexPlayer/LG Player
|
||||
], [NAME, VERSION], [
|
||||
/(nexplayer)\s([\w\.-]+)/i // Nexplayer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(flrp)\/([\w\.-]+)/i // Flip Player
|
||||
], [[NAME, 'Flip Player'], VERSION], [
|
||||
|
||||
/(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
|
||||
// FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
|
||||
], [NAME], [
|
||||
|
||||
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i
|
||||
// Gstreamer
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
|
||||
/(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
|
||||
// Java/urllib/requests/wget/cURL
|
||||
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(htc_one_s)\/([\d\.]+)/i, // HTC One S
|
||||
], [[NAME, /_/g, ' '], VERSION], [
|
||||
|
||||
/(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+))/i,
|
||||
// MPlayer SVN
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(mplayer)(?:\s|\/)([\w\.-]+)/i, // MPlayer
|
||||
/(mplayer) unknown-([\w\.\-]+)/i // MPlayer UNKNOWN
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(mplayer)/i, // MPlayer (no other info)
|
||||
/(yourmuze)/i, // YourMuze
|
||||
/(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
|
||||
], [NAME], [
|
||||
|
||||
/(nero (?:home|scout))\/([\w\.-]+)/i // Nero Home/Nero Scout
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(nokia\d+)\/([\w\.-]+)/i // Nokia
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/\s(songbird)\/([\w\.-]+)/i // Songbird/Philips-Songbird
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(winamp)3 version ([\w\.-]+)/i, // Winamp
|
||||
/(winamp)\s([\w\.-]+)/i,
|
||||
/(winamp)mpeg\/([\w\.-]+)/i
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
||||
// inlight radio
|
||||
], [NAME], [
|
||||
|
||||
/(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/([\w\.-]+)/i
|
||||
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
||||
// SoundTap/Totem/Stagefright/Streamium
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(smp)([\d\.]+)/i // SMP
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(vlc) media player - version ([\w\.]+)/i, // VLC Videolan
|
||||
/(vlc)\/([\w\.-]+)/i,
|
||||
/(xbmc|gvfs|xine|xmms|irapp)\/([\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
|
||||
/(foobar2000)\/([\d\.]+)/i, // Foobar2000
|
||||
/(itunes)\/([\d\.]+)/i // iTunes
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(wmplayer)\/([\w\.-]+)/i, // Windows Media Player
|
||||
/(windows-media-player)\/([\w\.-]+)/i
|
||||
], [[NAME, /-/g, ' '], VERSION], [
|
||||
|
||||
/windows\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i,
|
||||
// Windows Media Server
|
||||
], [VERSION, [NAME, 'Windows']], [
|
||||
|
||||
/(com\.riseupradioalarm)\/([\d\.]*)/i // RiseUP Radio Alarm
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(rad.io)\s([\d\.]+)/i, // Rad.io
|
||||
/(radio.(?:de|at|fr))\s([\d\.]+)/i
|
||||
], [[NAME, 'rad.io'], VERSION]
|
||||
]
|
||||
});
|
||||
|
||||
const Modules = Object.freeze({
|
||||
browser : [
|
||||
// Axios/jsdom/Scrapy
|
||||
[/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, 'module']]
|
||||
]
|
||||
});
|
||||
|
||||
export {
|
||||
Apps,
|
||||
Bots,
|
||||
CLIs,
|
||||
ExtraDevices,
|
||||
Emails,
|
||||
MediaPlayers,
|
||||
Modules
|
||||
};
|
||||
104
src/main/ua-parser.d.ts
vendored
Normal file
104
src/main/ua-parser.d.ts
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
// Type definitions for UAParser.js v2.0.0-beta.1
|
||||
// Project: https://github.com/faisalman/ua-parser-js
|
||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||
|
||||
declare namespace UAParser {
|
||||
|
||||
interface IData<T> {
|
||||
is(val: string): boolean;
|
||||
toString(): string;
|
||||
withClientHints(): PromiseLike<T> | T;
|
||||
withFeatureCheck(): T;
|
||||
}
|
||||
|
||||
interface IBrowser extends IData<IBrowser> {
|
||||
name?: string;
|
||||
version?: string;
|
||||
major?: string;
|
||||
}
|
||||
|
||||
interface ICPU extends IData<ICPU> {
|
||||
architecture?: 'ia32' | 'ia64' | 'amd64' | 'arm' | 'arm64' | 'armhf' | 'avr' | 'irix' | 'irix64' | 'mips' | 'mips64' | '68k' | 'ppc' | 'sparc' | 'sparc64';
|
||||
}
|
||||
|
||||
interface IDevice extends IData<IDevice> {
|
||||
type?: 'mobile' | 'tablet' | 'console' | 'smarttv' | 'wearable';
|
||||
vendor?: string;
|
||||
model?: string;
|
||||
}
|
||||
|
||||
interface IEngine extends IData<IEngine> {
|
||||
name?: 'Amaya' | 'Blink' | 'EdgeHTML' | 'Flow' | 'Gecko' | 'Goanna' | 'iCab' | 'KHTML' | 'LibWeb' | 'Links' | 'Lynx' | 'NetFront' | 'NetSurf' | 'Presto' | 'Tasman' | 'Trident' | 'w3m' | 'WebKit';
|
||||
version?: string;
|
||||
}
|
||||
|
||||
interface IOS extends IData<IOS> {
|
||||
name?: string;
|
||||
version?: string;
|
||||
}
|
||||
|
||||
interface IResult extends IData<IResult> {
|
||||
ua: string;
|
||||
browser: IBrowser;
|
||||
cpu: ICPU;
|
||||
device: IDevice;
|
||||
engine: IEngine;
|
||||
os: IOS;
|
||||
}
|
||||
|
||||
type RegexMap = ((RegExp | string | (string | RegExp | Function)[])[])[];
|
||||
|
||||
export function UAParser(uastring?: string, extensions?: Record<string, RegexMap>, headers?: Record<string, string>): IResult;
|
||||
export function UAParser(uastring?: string, headers?: Record<string, string>): IResult;
|
||||
export function UAParser(extensions?: Record<string, RegexMap>, headers?: Record<string, string>): IResult;
|
||||
export function UAParser(headers?: Record<string, string>): IResult;
|
||||
|
||||
export class UAParser {
|
||||
|
||||
static readonly BROWSER: {
|
||||
NAME: 'name';
|
||||
VERSION: 'version';
|
||||
MAJOR: 'major';
|
||||
};
|
||||
static readonly CPU: {
|
||||
ARCHITECTURE: 'architecture';
|
||||
};
|
||||
static readonly DEVICE: {
|
||||
TYPE: 'type';
|
||||
VENDOR: 'vendor';
|
||||
MODEL: 'model';
|
||||
CONSOLE: 'console';
|
||||
MOBILE: 'mobile';
|
||||
SMARTTV: 'smarttv';
|
||||
TABLET: 'tablet';
|
||||
WEARABLE: 'wearable';
|
||||
EMBEDDED: 'embedded';
|
||||
};
|
||||
static readonly ENGINE: {
|
||||
NAME: 'name';
|
||||
VERSION: 'version';
|
||||
};
|
||||
static readonly OS: {
|
||||
NAME: 'name';
|
||||
VERSION: 'version';
|
||||
};
|
||||
static readonly VERSION: string;
|
||||
|
||||
constructor(uastring?: string, extensions?: Record<string, RegexMap>, headers?: Record<string, string>);
|
||||
constructor(uastring?: string, headers?: Record<string, string>);
|
||||
constructor(extensions?: Record<string, RegexMap>, headers?: Record<string, string>);
|
||||
constructor(headers?: Record<string, string>);
|
||||
|
||||
getUA(): string;
|
||||
getBrowser(): IBrowser;
|
||||
getCPU(): ICPU;
|
||||
getDevice(): IDevice;
|
||||
getEngine(): IEngine;
|
||||
getOS(): IOS;
|
||||
getResult(): IResult;
|
||||
setUA(uastring: string): UAParser;
|
||||
}
|
||||
}
|
||||
|
||||
export as namespace UAParser;
|
||||
export = UAParser;
|
||||
1243
src/main/ua-parser.js
Executable file
1243
src/main/ua-parser.js
Executable file
File diff suppressed because it is too large
Load Diff
1201
src/main/ua-parser.mjs
Normal file
1201
src/main/ua-parser.mjs
Normal file
File diff suppressed because it is too large
Load Diff
897
src/ua-parser.js
897
src/ua-parser.js
@@ -1,897 +0,0 @@
|
||||
/*!@license
|
||||
* UAParser.js v0.7.26
|
||||
* Lightweight JavaScript-based User-Agent string parser
|
||||
* https://github.com/faisalman/ua-parser-js
|
||||
*
|
||||
* Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
|
||||
* Licensed under MIT License
|
||||
*/
|
||||
|
||||
(function (window, undefined) {
|
||||
|
||||
'use strict';
|
||||
|
||||
//////////////
|
||||
// Constants
|
||||
/////////////
|
||||
|
||||
|
||||
var LIBVERSION = '0.7.26',
|
||||
EMPTY = '',
|
||||
UNKNOWN = '?',
|
||||
FUNC_TYPE = 'function',
|
||||
UNDEF_TYPE = 'undefined',
|
||||
OBJ_TYPE = 'object',
|
||||
STR_TYPE = 'string',
|
||||
MAJOR = 'major', // deprecated
|
||||
MODEL = 'model',
|
||||
NAME = 'name',
|
||||
TYPE = 'type',
|
||||
VENDOR = 'vendor',
|
||||
VERSION = 'version',
|
||||
ARCHITECTURE= 'architecture',
|
||||
CONSOLE = 'console',
|
||||
MOBILE = 'mobile',
|
||||
TABLET = 'tablet',
|
||||
SMARTTV = 'smarttv',
|
||||
WEARABLE = 'wearable',
|
||||
EMBEDDED = 'embedded',
|
||||
UA_MAX_LENGTH = 255;
|
||||
|
||||
|
||||
///////////
|
||||
// Helper
|
||||
//////////
|
||||
|
||||
|
||||
var util = {
|
||||
extend : function (regexes, extensions) {
|
||||
var mergedRegexes = {};
|
||||
for (var i in regexes) {
|
||||
if (extensions[i] && extensions[i].length % 2 === 0) {
|
||||
mergedRegexes[i] = extensions[i].concat(regexes[i]);
|
||||
} else {
|
||||
mergedRegexes[i] = regexes[i];
|
||||
}
|
||||
}
|
||||
return mergedRegexes;
|
||||
},
|
||||
has : function (str1, str2) {
|
||||
return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;
|
||||
},
|
||||
lowerize : function (str) {
|
||||
return str.toLowerCase();
|
||||
},
|
||||
major : function (version) {
|
||||
return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
|
||||
},
|
||||
trim : function (str, len) {
|
||||
str = str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
|
||||
return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
///////////////
|
||||
// Map helper
|
||||
//////////////
|
||||
|
||||
|
||||
var mapper = {
|
||||
|
||||
rgx : function (ua, arrays) {
|
||||
|
||||
var i = 0, j, k, p, q, matches, match;
|
||||
|
||||
// loop through all regexes maps
|
||||
while (i < arrays.length && !matches) {
|
||||
|
||||
var regex = arrays[i], // even sequence (0,2,4,..)
|
||||
props = arrays[i + 1]; // odd sequence (1,3,5,..)
|
||||
j = k = 0;
|
||||
|
||||
// try matching uastring with regexes
|
||||
while (j < regex.length && !matches) {
|
||||
|
||||
matches = regex[j++].exec(ua);
|
||||
|
||||
if (!!matches) {
|
||||
for (p = 0; p < props.length; p++) {
|
||||
match = matches[++k];
|
||||
q = props[p];
|
||||
// check if given property is actually array
|
||||
if (typeof q === OBJ_TYPE && q.length > 0) {
|
||||
if (q.length == 2) {
|
||||
if (typeof q[1] == FUNC_TYPE) {
|
||||
// assign modified match
|
||||
this[q[0]] = q[1].call(this, match);
|
||||
} else {
|
||||
// assign given value, ignore regex match
|
||||
this[q[0]] = q[1];
|
||||
}
|
||||
} else if (q.length == 3) {
|
||||
// check whether function or regex
|
||||
if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
|
||||
// call function (usually string mapper)
|
||||
this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
|
||||
} else {
|
||||
// sanitize match using given regex
|
||||
this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
|
||||
}
|
||||
} else if (q.length == 4) {
|
||||
this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
|
||||
}
|
||||
} else {
|
||||
this[q] = match ? match : undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
i += 2;
|
||||
}
|
||||
},
|
||||
|
||||
str : function (str, map) {
|
||||
|
||||
for (var i in map) {
|
||||
// check if array
|
||||
if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
|
||||
for (var j = 0; j < map[i].length; j++) {
|
||||
if (util.has(map[i][j], str)) {
|
||||
return (i === UNKNOWN) ? undefined : i;
|
||||
}
|
||||
}
|
||||
} else if (util.has(map[i], str)) {
|
||||
return (i === UNKNOWN) ? undefined : i;
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
///////////////
|
||||
// String map
|
||||
//////////////
|
||||
|
||||
|
||||
var maps = {
|
||||
|
||||
browser : {
|
||||
// Safari < 3.0
|
||||
oldSafari : {
|
||||
version : {
|
||||
'1.0' : '/8',
|
||||
'1.2' : '/1',
|
||||
'1.3' : '/3',
|
||||
'2.0' : '/412',
|
||||
'2.0.2' : '/416',
|
||||
'2.0.3' : '/417',
|
||||
'2.0.4' : '/419',
|
||||
'?' : '/'
|
||||
}
|
||||
},
|
||||
oldEdge : {
|
||||
version : {
|
||||
'0.1' : '12.',
|
||||
'21' : '13.',
|
||||
'31' : '14.',
|
||||
'39' : '15.',
|
||||
'41' : '16.',
|
||||
'42' : '17.',
|
||||
'44' : '18.'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
os : {
|
||||
windows : {
|
||||
version : {
|
||||
'ME' : '4.90',
|
||||
'NT 3.11' : 'NT3.51',
|
||||
'NT 4.0' : 'NT4.0',
|
||||
'2000' : 'NT 5.0',
|
||||
'XP' : ['NT 5.1', 'NT 5.2'],
|
||||
'Vista' : 'NT 6.0',
|
||||
'7' : 'NT 6.1',
|
||||
'8' : 'NT 6.2',
|
||||
'8.1' : 'NT 6.3',
|
||||
'10' : ['NT 6.4', 'NT 10.0'],
|
||||
'RT' : 'ARM'
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//////////////
|
||||
// Regex map
|
||||
/////////////
|
||||
|
||||
|
||||
var regexes = {
|
||||
|
||||
browser : [[
|
||||
|
||||
/\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
||||
], [VERSION, [NAME, 'Chrome']], [
|
||||
/(?:edgios|edga|edg)\/([\w\.]+)/i // Microsoft Edge
|
||||
], [VERSION, [NAME, 'Edge']], [
|
||||
/edge\/([\w\.]+)/i // Old Edge (Trident)
|
||||
], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [
|
||||
|
||||
// Presto based
|
||||
/(opera\smini)\/([\w\.-]+)/i, // Opera Mini
|
||||
/(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
|
||||
/(opera).+version\/([\w\.]+)/i, // Opera > 9.80
|
||||
/(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
|
||||
], [NAME, VERSION], [
|
||||
/opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
|
||||
], [VERSION, [NAME, 'Opera Mini']], [
|
||||
/\sopr\/([\w\.]+)/i // Opera Webkit
|
||||
], [VERSION, [NAME, 'Opera']], [
|
||||
|
||||
// Mixed
|
||||
/(kindle)\/([\w\.]+)/i, // Kindle
|
||||
/(lunascape|maxthon|netfront|jasmine|blazer|instagram)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Instagram
|
||||
// Trident based
|
||||
/(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
|
||||
/(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
|
||||
/(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
|
||||
|
||||
// Webkit/KHTML based
|
||||
/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,
|
||||
// Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
|
||||
/(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
|
||||
/(weibo)__([\d\.]+)/i // Weibo
|
||||
], [NAME, VERSION], [
|
||||
/(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
|
||||
], [VERSION, [NAME, 'UCBrowser']], [
|
||||
/(?:windowswechat)?\sqbcore\/([\w\.]+)\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
|
||||
], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
|
||||
/micromessenger\/([\w\.]+)/i // WeChat
|
||||
], [VERSION, [NAME, 'WeChat']], [
|
||||
/konqueror\/([\w\.]+)/i // Konqueror
|
||||
], [VERSION, [NAME, 'Konqueror']], [
|
||||
/trident.+rv[:\s]([\w\.]{1,9})\b.+like\sgecko/i // IE11
|
||||
], [VERSION, [NAME, 'IE']], [
|
||||
/yabrowser\/([\w\.]+)/i // Yandex
|
||||
], [VERSION, [NAME, 'Yandex']], [
|
||||
/(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
|
||||
], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [
|
||||
/focus\/([\w\.]+)/i // Firefox Focus
|
||||
], [VERSION, [NAME, 'Firefox Focus']], [
|
||||
/opt\/([\w\.]+)/i // Opera Touch
|
||||
], [VERSION, [NAME, 'Opera Touch']], [
|
||||
/coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser
|
||||
], [VERSION, [NAME, 'Coc Coc']], [
|
||||
/dolfin\/([\w\.]+)/i // Dolphin
|
||||
], [VERSION, [NAME, 'Dolphin']], [
|
||||
/coast\/([\w\.]+)/i // Opera Coast
|
||||
], [VERSION, [NAME, 'Opera Coast']],
|
||||
[/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
|
||||
], [VERSION, [NAME, 'MIUI Browser']], [
|
||||
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
||||
], [VERSION, [NAME, 'Firefox']], [
|
||||
/(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
|
||||
], [[NAME, '360 Browser']], [
|
||||
/(oculus|samsung|sailfish)browser\/([\w\.]+)/i
|
||||
], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser
|
||||
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
|
||||
], [[NAME, /_/g, ' '], VERSION], [
|
||||
/m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
|
||||
], [NAME, VERSION], [
|
||||
/(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser
|
||||
/(LBBROWSER)/i // LieBao Browser
|
||||
], [NAME], [
|
||||
|
||||
// WebView
|
||||
/;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
|
||||
], [VERSION, [NAME, 'Facebook']], [
|
||||
/FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
|
||||
], [[NAME, 'Facebook']], [
|
||||
/\s(electron)\/([\w\.]+)\ssafari/i, // Electron-based App
|
||||
/safari\s(line)\/([\w\.]+)/i, // Line App for iOS
|
||||
/\b(line)\/([\w\.]+)\/iab/i // Line App for Android
|
||||
], [NAME, VERSION], [
|
||||
/\bgsa\/([\w\.]+)\s.*safari\//i // Google Search Appliance on iOS
|
||||
], [VERSION, [NAME, 'GSA']], [
|
||||
|
||||
/headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
|
||||
], [VERSION, [NAME, 'Chrome Headless']], [
|
||||
|
||||
/\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
|
||||
], [[NAME, 'Chrome WebView'], VERSION], [
|
||||
|
||||
/droid.+\sversion\/([\w\.]+)\b.+(?:mobile\ssafari|safari)/i // Android Browser
|
||||
], [VERSION, [NAME, 'Android Browser']], [
|
||||
|
||||
/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
|
||||
], [VERSION, [NAME, 'Mobile Safari']], [
|
||||
/version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
|
||||
], [VERSION, NAME], [
|
||||
/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
|
||||
], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [
|
||||
|
||||
/(webkit|khtml)\/([\w\.]+)/i
|
||||
], [NAME, VERSION], [
|
||||
|
||||
// Gecko based
|
||||
/(navigator|netscape)\/([\w\.-]+)/i // Netscape
|
||||
], [[NAME, 'Netscape'], VERSION], [
|
||||
/(swiftfox)/i, // Swiftfox
|
||||
/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
|
||||
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
|
||||
/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
|
||||
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
|
||||
/(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
|
||||
/(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
|
||||
|
||||
// Other
|
||||
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
|
||||
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
|
||||
/(links)\s\(([\w\.]+)/i, // Links
|
||||
/(gobrowser)\/?([\w\.]*)/i, // GoBrowser
|
||||
/(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
|
||||
/(mosaic)[\/\s]([\w\.]+)/i // Mosaic
|
||||
], [NAME, VERSION]
|
||||
],
|
||||
|
||||
cpu : [[
|
||||
|
||||
/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64 (x64)
|
||||
], [[ARCHITECTURE, 'amd64']], [
|
||||
|
||||
/(ia32(?=;))/i // IA32 (quicktime)
|
||||
], [[ARCHITECTURE, util.lowerize]], [
|
||||
|
||||
/((?:i[346]|x)86)[;\)]/i // IA32 (x86)
|
||||
], [[ARCHITECTURE, 'ia32']], [
|
||||
|
||||
/\b(aarch64|armv?8e?l?)\b/i // ARM64
|
||||
], [[ARCHITECTURE, 'arm64']], [
|
||||
|
||||
/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
|
||||
], [[ARCHITECTURE, 'armhf']], [
|
||||
|
||||
// PocketPC mistakenly identified as PowerPC
|
||||
/windows\s(ce|mobile);\sppc;/i
|
||||
], [[ARCHITECTURE, 'arm']], [
|
||||
|
||||
/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i // PowerPC
|
||||
], [[ARCHITECTURE, /ower/, '', util.lowerize]], [
|
||||
|
||||
/(sun4\w)[;\)]/i // SPARC
|
||||
], [[ARCHITECTURE, 'sparc']], [
|
||||
|
||||
/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
|
||||
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
|
||||
], [[ARCHITECTURE, util.lowerize]]
|
||||
],
|
||||
|
||||
device : [[
|
||||
|
||||
//////////////////////
|
||||
// MOBILES & TABLETS
|
||||
/////////////////////
|
||||
|
||||
// Samsung
|
||||
/\b(sch-i[89]0\d|shw-m380s|sm-p(?:605|610|587)|sm-t\w+|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus\s10)/i,
|
||||
], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [
|
||||
/(s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+)/i,
|
||||
/\ssamsung[\s-]([\w-]+)/i,
|
||||
/sec-(sgh\w+)/i
|
||||
], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
|
||||
|
||||
// Apple
|
||||
/\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
|
||||
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
|
||||
/\((ipad);[\w\s\),;-]+(apple)/i // iPad
|
||||
], [MODEL, VENDOR, [TYPE, TABLET]], [
|
||||
/applecoremedia\/[\w\.]+\s\((ipad)/i
|
||||
], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
|
||||
|
||||
// Huawei
|
||||
/d\/huawei([\w\s-]+)[;\)]/i,
|
||||
/\b(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?|ele-l\d\d)/i,
|
||||
/\b(\w{2,4}-[atu][ln][01259][019])[;\)\s]/i
|
||||
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
|
||||
/\b(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
|
||||
], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
|
||||
|
||||
// Xiaomi
|
||||
/\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO
|
||||
/\b;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
||||
/\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
|
||||
/\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi
|
||||
/\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi
|
||||
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
|
||||
/\b(mi[\s\-_]?(?:pad)(?:[\w\s_]+))(?:\sbuild|\))/i // Mi Pad tablets
|
||||
],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
|
||||
|
||||
// OPPO
|
||||
/;\s(\w+)\sbuild.+\soppo/i,
|
||||
/\s(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i
|
||||
], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
|
||||
|
||||
// Vivo
|
||||
/\svivo\s(\w+)(?:\sbuild|\))/i,
|
||||
/\s(v[12]\d{3}\w?[at])(?:\sbuild|;)/i
|
||||
], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
|
||||
|
||||
// Realme
|
||||
/\s(rmx[12]\d{3})(?:\sbuild|;)/i
|
||||
], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
|
||||
|
||||
// Motorola
|
||||
/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i,
|
||||
/\smot[\s-](\w*)/i,
|
||||
/(moto[\s\w\(\)]+(?=\sbuild|\)))/i,
|
||||
/(xt\d{3,4})\sbuild\//i,
|
||||
/(nexus\s6)/i
|
||||
], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
|
||||
/\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
|
||||
], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
|
||||
|
||||
// LG
|
||||
/((?=lg)?[vl]k\-?\d{3})\s+build|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i
|
||||
], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
|
||||
/(nexus\s[45])/i,
|
||||
/lg[e;\s\/-]+((?!browser|netcast)\w+)/i,
|
||||
/\blg(\-?[\d\w]+)\s+build/i
|
||||
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
|
||||
|
||||
// Lenovo
|
||||
/(ideatab[\w\-\s]+)/i,
|
||||
/lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|[\w-]+)/i // Lenovo tablets
|
||||
], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
|
||||
|
||||
// Nokia
|
||||
/(?:maemo|nokia).*(n900|lumia\s\d+)/i,
|
||||
/nokia[\s_-]?([\w\.-]*)/i
|
||||
], [MODEL, [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
|
||||
|
||||
// Google
|
||||
/droid.+;\s(pixel\sc)[\s)]/i // Google Pixel C
|
||||
], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
|
||||
/droid.+;\s(pixel[\s\daxl]{0,6})(?:\sbuild|\))/i // Google Pixel
|
||||
], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
|
||||
|
||||
// Sony
|
||||
/droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
|
||||
], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
|
||||
/sony\stablet\s[ps]\sbuild\//i,
|
||||
/(?:sony)?sgp\w+(?:\sbuild\/|\))/i
|
||||
], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
|
||||
|
||||
// OnePlus
|
||||
/\s(kb2005|in20[12]5|be20[12][59])\b/i,
|
||||
/\ba000(1)\s+build/i, // OnePlus
|
||||
/\boneplus\s(a\d{4})[\s)]/i
|
||||
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
||||
|
||||
// Amazon
|
||||
/(alexa)webm/i,
|
||||
/(kf[a-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
|
||||
], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
|
||||
/(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
|
||||
], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
|
||||
|
||||
// BlackBerry
|
||||
/\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook
|
||||
], [MODEL, VENDOR, [TYPE, TABLET]], [
|
||||
/\(bb10;\s(\w+)/i // BlackBerry 10
|
||||
], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
|
||||
|
||||
// Asus
|
||||
/\b(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00c)/i
|
||||
], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [
|
||||
/\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i
|
||||
], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [
|
||||
|
||||
// HTC
|
||||
/(nexus\s9)/i // HTC Nexus 9
|
||||
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
||||
/(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
|
||||
|
||||
// ZTE
|
||||
/(zte)-(\w*)/i,
|
||||
/(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
||||
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
||||
|
||||
// Acer
|
||||
/droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i
|
||||
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
||||
|
||||
// Meizu
|
||||
/droid.+;\s(m[1-5]\snote)\sbuild/i,
|
||||
/\bmz-([\w-]{2,})/i
|
||||
], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
|
||||
|
||||
// MIXED
|
||||
/(blackberry)[\s-]?(\w+)/i, // BlackBerry
|
||||
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
|
||||
// BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
|
||||
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
|
||||
/(asus)-?(\w+)/i, // Asus
|
||||
/(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia
|
||||
/(lenovo)[_\s-]?([\w-]+)/i, // Lenovo
|
||||
/linux;.+(jolla);/i, // Jolla
|
||||
/droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
|
||||
/(archos)\s(gamepad2?)/i, // Archos
|
||||
/(hp).+(touchpad)/i, // HP TouchPad
|
||||
/(hp).+(tablet)/i, // HP Tablet
|
||||
/(kindle)\/([\w\.]+)/i, // Kindle
|
||||
/\s(nook)[\w\s]+build\/(\w+)/i, // Nook
|
||||
/(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak
|
||||
/[;\/]\s?(le[\s\-]+pan)[\s\-]+(\w{1,9})\sbuild/i, // Le Pan Tablets
|
||||
/[;\/]\s?(trinity)[\-\s]*(t\d{3})\sbuild/i, // Trinity Tablets
|
||||
/\b(gigaset)[\s\-]+(q\w{1,9})\sbuild/i, // Gigaset Tablets
|
||||
/\b(vodafone)\s([\w\s]+)(?:\)|\sbuild)/i // Vodafone
|
||||
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
||||
|
||||
/\s(surface\sduo)\s/i // Surface Duo
|
||||
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [
|
||||
/\s(u304aa)\sbuild/i // AT&T
|
||||
], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
|
||||
/sie-(\w*)/i // Siemens
|
||||
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
|
||||
/[;\/]\s?(rct\w+)\sbuild/i // RCA Tablets
|
||||
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
|
||||
/[;\/\s](venue[\d\s]{2,7})\sbuild/i // Dell Venue Tablets
|
||||
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
|
||||
/[;\/]\s?(q(?:mv|ta)\w+)\sbuild/i // Verizon Tablet
|
||||
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
|
||||
/[;\/]\s(?:barnes[&\s]+noble\s|bn[rt])([\w\s\+]*)\sbuild/i // Barnes & Noble Tablet
|
||||
], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
|
||||
/[;\/]\s(tm\d{3}\w+)\sbuild/i
|
||||
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
|
||||
/;\s(k88)\sbuild/i // ZTE K Series Tablet
|
||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
|
||||
/;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
|
||||
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
|
||||
/[;\/]\s?(gen\d{3})\sbuild.*49h/i // Swiss GEN Mobile
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
|
||||
/[;\/]\s?(zur\d{3})\sbuild/i // Swiss ZUR Tablet
|
||||
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
||||
/[;\/]\s?((zeki)?tb.*\b)\sbuild/i // Zeki Tablets
|
||||
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
||||
/[;\/]\s([yr]\d{2})\sbuild/i,
|
||||
/[;\/]\s(dragon[\-\s]+touch\s|dt)(\w{5})\sbuild/i // Dragon Touch Tablet
|
||||
], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
|
||||
/[;\/]\s?(ns-?\w{0,9})\sbuild/i // Insignia Tablets
|
||||
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
|
||||
/[;\/]\s?((nxa|Next)-?\w{0,9})\sbuild/i // NextBook Tablets
|
||||
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
|
||||
/[;\/]\s?(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05]))\sbuild/i
|
||||
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
|
||||
/[;\/]\s?(lvtel\-)?(v1[12])\sbuild/i // LvTel Phones
|
||||
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
|
||||
/;\s(ph-1)\s/i
|
||||
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
|
||||
/[;\/]\s?(v(100md|700na|7011|917g).*\b)\sbuild/i // Envizen Tablets
|
||||
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
|
||||
/[;\/]\s?(trio[\s\w\-\.]+)\sbuild/i // MachSpeed Tablets
|
||||
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
|
||||
/[;\/]\s?tu_(1491)\sbuild/i // Rotor Tablets
|
||||
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
|
||||
/(shield[\w\s]+)\sbuild/i // Nvidia Shield Tablets
|
||||
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
|
||||
/(sprint)\s(\w+)/i // Sprint Phones
|
||||
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
||||
/(kin\.[onetw]{3})/i // Microsoft Kin
|
||||
], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
|
||||
/droid\s[\d\.]+;\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
|
||||
], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [
|
||||
/droid\s[\d\.]+;\s(ec30|ps20|tc[2-8]\d[kx])\)/i
|
||||
], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [
|
||||
|
||||
///////////////////
|
||||
// CONSOLES
|
||||
///////////////////
|
||||
|
||||
/\s(ouya)\s/i, // Ouya
|
||||
/(nintendo)\s([wids3utch]+)/i // Nintendo
|
||||
], [VENDOR, MODEL, [TYPE, CONSOLE]], [
|
||||
/droid.+;\s(shield)\sbuild/i // Nvidia
|
||||
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
|
||||
/(playstation\s[345portablevi]+)/i // Playstation
|
||||
], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
|
||||
/[\s\(;](xbox(?:\sone)?(?!;\sxbox))[\s\);]/i // Microsoft Xbox
|
||||
], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
|
||||
|
||||
///////////////////
|
||||
// SMARTTVS
|
||||
///////////////////
|
||||
|
||||
/smart-tv.+(samsung)/i // Samsung
|
||||
], [VENDOR, [TYPE, SMARTTV], MODEL], [
|
||||
/hbbtv.+maple;(\d+)/i
|
||||
], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
|
||||
/linux;\snetcast.+smarttv/i, // LG SmartTV
|
||||
/lg\snetcast\.tv-201\d/i
|
||||
], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [
|
||||
/(apple)\s?tv/i // Apple TV
|
||||
], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [
|
||||
/crkey/i // Google Chromecast
|
||||
], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
|
||||
/droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
|
||||
], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
|
||||
/\(dtv[\);].+(aquos)/i // Sharp
|
||||
], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
|
||||
/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
|
||||
], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
|
||||
/[\s\/\(](android\s|smart[-\s]?|opera\s)tv[;\)\s]/i // SmartTV from Unidentified Vendors
|
||||
], [[TYPE, SMARTTV]], [
|
||||
|
||||
///////////////////
|
||||
// WEARABLES
|
||||
///////////////////
|
||||
|
||||
/((pebble))app\/[\d\.]+\s/i // Pebble
|
||||
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
||||
/droid.+;\s(glass)\s\d/i // Google Glass
|
||||
], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
|
||||
/droid\s[\d\.]+;\s(wt63?0{2,3})\)/i
|
||||
], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [
|
||||
|
||||
////////////////////
|
||||
// MIXED (GENERIC)
|
||||
///////////////////
|
||||
|
||||
/droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors
|
||||
], [MODEL, [TYPE, MOBILE]], [
|
||||
/droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
|
||||
], [MODEL, [TYPE, TABLET]], [
|
||||
/\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
|
||||
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
|
||||
], [[TYPE, util.lowerize]], [
|
||||
/(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
|
||||
], [MODEL, [VENDOR, 'Generic']], [
|
||||
/(phone)/i
|
||||
], [[TYPE, MOBILE]]
|
||||
],
|
||||
|
||||
engine : [[
|
||||
|
||||
/windows.+\sedge\/([\w\.]+)/i // EdgeHTML
|
||||
], [VERSION, [NAME, 'EdgeHTML']], [
|
||||
|
||||
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
|
||||
], [VERSION, [NAME, 'Blink']], [
|
||||
|
||||
/(presto)\/([\w\.]+)/i, // Presto
|
||||
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
|
||||
// WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
|
||||
/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
|
||||
/(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
|
||||
], [VERSION, NAME]
|
||||
],
|
||||
|
||||
os : [[
|
||||
|
||||
// Windows
|
||||
/microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
|
||||
], [NAME, VERSION], [
|
||||
/(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
|
||||
/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
|
||||
/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i
|
||||
], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
|
||||
/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
|
||||
], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
|
||||
|
||||
// iOS/macOS
|
||||
/ip[honead]{2,4}\b(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS
|
||||
/cfnetwork\/.+darwin/i
|
||||
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
|
||||
/(mac\sos\sx)\s?([\w\s\.]*)/i,
|
||||
/(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS
|
||||
], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
|
||||
|
||||
// Mobile OSes
|
||||
/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i,
|
||||
// Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
|
||||
/(blackberry)\w*\/([\w\.]*)/i, // Blackberry
|
||||
/(tizen|kaios)[\/\s]([\w\.]+)/i // Tizen/KaiOS
|
||||
], [NAME, VERSION], [
|
||||
/\(bb(10);/i // BlackBerry 10
|
||||
], [VERSION, [NAME, 'BlackBerry']], [
|
||||
/(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian
|
||||
], [VERSION, [NAME, 'Symbian']], [
|
||||
/\((series40);/i // Series 40
|
||||
], [NAME], [
|
||||
/mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
|
||||
], [[NAME, 'Firefox OS']], [
|
||||
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
|
||||
], [VERSION, [NAME, 'webOS']], [
|
||||
|
||||
// Google Chromecast
|
||||
/crkey\/([\d\.]+)/i // Google Chromecast
|
||||
], [VERSION, [NAME, 'Chromecast']], [
|
||||
|
||||
// Console
|
||||
/(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation
|
||||
/(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
|
||||
|
||||
// GNU/Linux based
|
||||
/(mint)[\/\s\(\)]?(\w*)/i, // Mint
|
||||
/(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
|
||||
/(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\sgnu\/linux)?(?:\slinux)?[\/\s-]?(?!chrom|package)([\w\.-]*)/i,
|
||||
// Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
|
||||
// Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
|
||||
/(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
|
||||
/(gnu)\s?([\w\.]*)/i // GNU
|
||||
], [NAME, VERSION], [
|
||||
|
||||
/(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
|
||||
], [[NAME, 'Chromium OS'], VERSION],[
|
||||
|
||||
// Solaris
|
||||
/(sunos)\s?([\w\.\d]*)/i // Solaris
|
||||
], [[NAME, 'Solaris'], VERSION], [
|
||||
|
||||
// BSD based
|
||||
/\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
|
||||
], [NAME, VERSION],[
|
||||
|
||||
/(haiku)\s(\w+)/i // Haiku
|
||||
], [NAME, VERSION],[
|
||||
|
||||
// Other
|
||||
/((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
|
||||
/(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
|
||||
/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,
|
||||
// Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
|
||||
/(unix)\s?([\w\.]*)/i // UNIX
|
||||
], [NAME, VERSION]
|
||||
]
|
||||
};
|
||||
|
||||
|
||||
/////////////////
|
||||
// Constructor
|
||||
////////////////
|
||||
var UAParser = function (ua, extensions) {
|
||||
|
||||
if (typeof ua === 'object') {
|
||||
extensions = ua;
|
||||
ua = undefined;
|
||||
}
|
||||
|
||||
if (!(this instanceof UAParser)) {
|
||||
return new UAParser(ua, extensions).getResult();
|
||||
}
|
||||
|
||||
var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
|
||||
var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
|
||||
|
||||
this.getBrowser = function () {
|
||||
var _browser = { name: undefined, version: undefined };
|
||||
mapper.rgx.call(_browser, _ua, _rgxmap.browser);
|
||||
_browser.major = util.major(_browser.version); // deprecated
|
||||
return _browser;
|
||||
};
|
||||
this.getCPU = function () {
|
||||
var _cpu = { architecture: undefined };
|
||||
mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);
|
||||
return _cpu;
|
||||
};
|
||||
this.getDevice = function () {
|
||||
var _device = { vendor: undefined, model: undefined, type: undefined };
|
||||
mapper.rgx.call(_device, _ua, _rgxmap.device);
|
||||
return _device;
|
||||
};
|
||||
this.getEngine = function () {
|
||||
var _engine = { name: undefined, version: undefined };
|
||||
mapper.rgx.call(_engine, _ua, _rgxmap.engine);
|
||||
return _engine;
|
||||
};
|
||||
this.getOS = function () {
|
||||
var _os = { name: undefined, version: undefined };
|
||||
mapper.rgx.call(_os, _ua, _rgxmap.os);
|
||||
return _os;
|
||||
};
|
||||
this.getResult = function () {
|
||||
return {
|
||||
ua : this.getUA(),
|
||||
browser : this.getBrowser(),
|
||||
engine : this.getEngine(),
|
||||
os : this.getOS(),
|
||||
device : this.getDevice(),
|
||||
cpu : this.getCPU()
|
||||
};
|
||||
};
|
||||
this.getUA = function () {
|
||||
return _ua;
|
||||
};
|
||||
this.setUA = function (ua) {
|
||||
_ua = ua.length > UA_MAX_LENGTH ? util.trim(ua, UA_MAX_LENGTH) : ua;
|
||||
return this;
|
||||
};
|
||||
this.setUA(_ua);
|
||||
return this;
|
||||
};
|
||||
|
||||
UAParser.VERSION = LIBVERSION;
|
||||
UAParser.BROWSER = {
|
||||
NAME : NAME,
|
||||
MAJOR : MAJOR, // deprecated
|
||||
VERSION : VERSION
|
||||
};
|
||||
UAParser.CPU = {
|
||||
ARCHITECTURE : ARCHITECTURE
|
||||
};
|
||||
UAParser.DEVICE = {
|
||||
MODEL : MODEL,
|
||||
VENDOR : VENDOR,
|
||||
TYPE : TYPE,
|
||||
CONSOLE : CONSOLE,
|
||||
MOBILE : MOBILE,
|
||||
SMARTTV : SMARTTV,
|
||||
TABLET : TABLET,
|
||||
WEARABLE: WEARABLE,
|
||||
EMBEDDED: EMBEDDED
|
||||
};
|
||||
UAParser.ENGINE = {
|
||||
NAME : NAME,
|
||||
VERSION : VERSION
|
||||
};
|
||||
UAParser.OS = {
|
||||
NAME : NAME,
|
||||
VERSION : VERSION
|
||||
};
|
||||
|
||||
///////////
|
||||
// Export
|
||||
//////////
|
||||
|
||||
|
||||
// check js environment
|
||||
if (typeof(exports) !== UNDEF_TYPE) {
|
||||
// nodejs env
|
||||
if (typeof module !== UNDEF_TYPE && module.exports) {
|
||||
exports = module.exports = UAParser;
|
||||
}
|
||||
exports.UAParser = UAParser;
|
||||
} else {
|
||||
// requirejs env (optional)
|
||||
if (typeof(define) === 'function' && define.amd) {
|
||||
define(function () {
|
||||
return UAParser;
|
||||
});
|
||||
} else if (typeof window !== 'undefined') {
|
||||
// browser env
|
||||
window.UAParser = UAParser;
|
||||
}
|
||||
}
|
||||
|
||||
// jQuery/Zepto specific (optional)
|
||||
// Note:
|
||||
// In AMD env the global scope should be kept clean, but jQuery is an exception.
|
||||
// jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
|
||||
// and we should catch that.
|
||||
var $ = typeof window !== 'undefined' && (window.jQuery || window.Zepto);
|
||||
if ($ && !$.ua) {
|
||||
var parser = new UAParser();
|
||||
$.ua = parser.getResult();
|
||||
$.ua.get = function () {
|
||||
return parser.getUA();
|
||||
};
|
||||
$.ua.set = function (uastring) {
|
||||
parser.setUA(uastring);
|
||||
var result = parser.getResult();
|
||||
for (var prop in result) {
|
||||
$.ua[prop] = result[prop];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
})(typeof window === 'object' ? window : this);
|
||||
File diff suppressed because it is too large
Load Diff
42
test/dts-test.ts
Normal file
42
test/dts-test.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { expectType } from 'tsd';
|
||||
import { UAParser, IResult, IBrowser, ICPU, IEngine, IDevice, IOS } from "../src/main/ua-parser";
|
||||
|
||||
const uastring = 'Mozilla/5.0 (X11; MyCustomOS; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0';
|
||||
const extensions = {
|
||||
os : [
|
||||
[/(mycustomos)/], [UAParser.OS.NAME, [UAParser.OS.VERSION, '10']]
|
||||
]
|
||||
};
|
||||
const headers = {
|
||||
'sec-ch-ua-mobile' : '?1'
|
||||
};
|
||||
|
||||
expectType<IResult>(UAParser());
|
||||
expectType<IResult>(UAParser(uastring));
|
||||
expectType<IResult>(UAParser(uastring, extensions));
|
||||
expectType<IResult>(UAParser(uastring, headers));
|
||||
expectType<IResult>(UAParser(extensions, headers));
|
||||
expectType<IResult>(UAParser(extensions));
|
||||
expectType<IResult>(UAParser(headers));
|
||||
expectType<UAParser>(new UAParser());
|
||||
|
||||
const parser = new UAParser(uastring);
|
||||
const browser = parser.getBrowser();
|
||||
|
||||
expectType<IBrowser>(browser);
|
||||
expectType<string | undefined>(browser.name);
|
||||
expectType<string | undefined>(browser.version);
|
||||
expectType<string | undefined>(browser.major);
|
||||
expectType<boolean>(browser.is(''));
|
||||
expectType<string>(browser.toString());
|
||||
expectType<IBrowser | PromiseLike<IBrowser>>(browser.withClientHints());
|
||||
expectType<IBrowser>((<IBrowser>browser.withClientHints()).withFeatureCheck());
|
||||
expectType<boolean>((<IBrowser>browser.withClientHints()).withFeatureCheck().is(''));
|
||||
|
||||
expectType<ICPU>(parser.getCPU());
|
||||
expectType<IDevice>(parser.getDevice());
|
||||
expectType<IEngine>(parser.getEngine());
|
||||
expectType<IOS>(parser.getOS());
|
||||
expectType<IResult>(parser.getResult());
|
||||
expectType<string>(parser.getUA());
|
||||
expectType<UAParser>(parser.setUA(uastring));
|
||||
20
test/jazzer-fuzz-test.js
Normal file
20
test/jazzer-fuzz-test.js
Normal file
@@ -0,0 +1,20 @@
|
||||
const { FuzzedDataProvider } = require('@jazzer.js/core');
|
||||
const UAParser = require('ua-parser-js');
|
||||
const UA_MAX_LENGTH = 350;
|
||||
|
||||
module.exports.fuzz = function (buffer) {
|
||||
const data = new FuzzedDataProvider(buffer);
|
||||
const userAgent = data.consumeString(UA_MAX_LENGTH, 'utf-8', true);
|
||||
const start = process.hrtime();
|
||||
|
||||
UAParser(userAgent);
|
||||
|
||||
const elapsed = process.hrtime(start);
|
||||
const milisec = (elapsed[0]*1e3+elapsed[1]*1e-6).toFixed(3);
|
||||
if (milisec > 1000) {
|
||||
throw new Error(
|
||||
`Potential ReDoS\n` +
|
||||
`Time taken: ${milisec} ms.\n` +
|
||||
`User agent: ${userAgent}`);
|
||||
}
|
||||
};
|
||||
27
test/mocha-test-es6.mjs
Normal file
27
test/mocha-test-es6.mjs
Normal file
@@ -0,0 +1,27 @@
|
||||
import { UAParser } from 'ua-parser-js';
|
||||
import { CPU, Device, Engine } from 'ua-parser-js/enums';
|
||||
import * as assert from 'assert';
|
||||
|
||||
describe('Returns', () => {
|
||||
it('getResult() should returns object', () => {
|
||||
assert.deepEqual(new UAParser('').getResult(),
|
||||
{
|
||||
ua : '',
|
||||
//ua_ch : { architecture: undefined, bitness: undefined, brands: undefined, fullVersionList: undefined, mobile: false, model: undefined, platform: undefined, platformVersion: undefined },
|
||||
browser: { name: undefined, version: undefined, major: undefined },
|
||||
cpu: { architecture: undefined },
|
||||
device: { vendor: undefined, model: undefined, type: undefined },
|
||||
engine: { name: undefined, version: undefined},
|
||||
os: { name: undefined, version: undefined }
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('Enums', () => {
|
||||
it('Can use enum', () => {
|
||||
const { cpu, device, engine } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900');
|
||||
assert.strictEqual(cpu.is(CPU.ARM), true);
|
||||
assert.strictEqual(device.is(Device.MOBILE), true);
|
||||
assert.strictEqual(engine.is(Engine.GECKO), true);
|
||||
});
|
||||
});
|
||||
79
test/mocha-test-extension.js
Normal file
79
test/mocha-test-extension.js
Normal file
@@ -0,0 +1,79 @@
|
||||
const fs = require('fs');
|
||||
const assert = require('assert');
|
||||
const parseJS = require('@babel/parser').parse;
|
||||
const traverse = require('@babel/traverse').default;
|
||||
const safe = require('safe-regex');
|
||||
const UAParser = require('ua-parser-js');
|
||||
const { Bots, CLIs, Emails, Modules } = require('ua-parser-js/extensions');
|
||||
|
||||
describe('Bots', () => {
|
||||
it('Can detect bots', () => {
|
||||
const googleBot = 'Googlebot-Video/1.0';
|
||||
const gptBot = 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)';
|
||||
const msnBot = 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)';
|
||||
const bingPreview = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b';
|
||||
const opera = 'Opera/8.5 (Macintosh; PPC Mac OS X; U; en)';
|
||||
const wget = 'Wget/1.21.1';
|
||||
const facebookBot = 'Mozilla/5.0 (compatible; FacebookBot/1.0; +https://developers.facebook.com/docs/sharing/webmasters/facebookbot/)';
|
||||
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)';
|
||||
const thunderbird = 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0';
|
||||
const axios = 'axios/1.3.5';
|
||||
const jsdom = 'Mozilla/5.0 (darwin) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/20.0.3';
|
||||
const scrapy = 'Scrapy/1.5.0 (+https://scrapy.org)';
|
||||
|
||||
const botParser = new UAParser(Bots);
|
||||
assert.deepEqual(botParser.setUA(googleBot).getBrowser(), {name: "Googlebot-Video", version: "1.0", major: "1", type: "bot"});
|
||||
assert.deepEqual(botParser.setUA(gptBot).getBrowser(), {name: "GPTBot", version: "1.0", major: "1", type: "bot"});
|
||||
assert.deepEqual(botParser.setUA(msnBot).getBrowser(), {name: "msnbot-media", version: "1.1", major: "1", type: "bot"});
|
||||
assert.deepEqual(botParser.setUA(bingPreview).getBrowser(), {name: "BingPreview", version: "1.0b", major: "1", type: "bot"});
|
||||
assert.deepEqual(botParser.setUA(opera).getBrowser(), {name: "Opera", version: "8.5", major: "8"});
|
||||
|
||||
// try merging Bots & CLIs
|
||||
const botsAndCLIs = { browser : [...Bots.browser, ...CLIs.browser]};
|
||||
const botsAndCLIsParser = new UAParser(botsAndCLIs);
|
||||
assert.deepEqual(botsAndCLIsParser.setUA(wget).getBrowser(), {name: "Wget", version: "1.21.1", major: "1", type:"cli"});
|
||||
assert.deepEqual(botsAndCLIsParser.setUA(facebookBot).getBrowser(), {name: "FacebookBot", version: "1.0", major: "1", type:"bot"});
|
||||
|
||||
const emailParser = new UAParser(Emails);
|
||||
assert.deepEqual(emailParser.setUA(outlook).getBrowser(), {name: "Microsoft Outlook", version: "16.0.9126", major: "16", type: "email"});
|
||||
assert.deepEqual(emailParser.setUA(thunderbird).getBrowser(), {name: "Thunderbird", version: "78.13.0", major: "78", type: "email"});
|
||||
|
||||
const moduleParser = new UAParser(Modules);
|
||||
assert.deepEqual(moduleParser.setUA(axios).getBrowser(), {name: "axios", version: "1.3.5", major: "1", type: "module"});
|
||||
assert.deepEqual(moduleParser.setUA(jsdom).getBrowser(), {name: "jsdom", version: "20.0.3", major: "20", type: "module"});
|
||||
assert.deepEqual(moduleParser.setUA(scrapy).getBrowser(), {name: "Scrapy", version: "1.5.0", major: "1", type: "module"});
|
||||
});
|
||||
});
|
||||
|
||||
// TODO : move test spec to JSON file
|
||||
|
||||
describe('Testing regexes', () => {
|
||||
|
||||
let regexes;
|
||||
|
||||
before('Read main js file', () => {
|
||||
let code = fs.readFileSync('src/extensions/ua-parser-extensions.js', 'utf8').toString();
|
||||
let ast = parseJS(code, { sourceType: 'script' });
|
||||
regexes = [];
|
||||
traverse(ast, {
|
||||
RegExpLiteral: (path) => {
|
||||
regexes.push(path.node.pattern);
|
||||
}
|
||||
});
|
||||
if (regexes.length === 0) {
|
||||
throw new Error('Regexes cannot be empty!');
|
||||
}
|
||||
});
|
||||
|
||||
describe('Begin testing', () => {
|
||||
it('all regexes in extension file', () => {
|
||||
regexes.forEach(regex => {
|
||||
describe('Test against `safe-regex` : ' + regex, () => {
|
||||
it('should be safe from potentially vulnerable regex', () => {
|
||||
assert.strictEqual(safe(regex), true);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
493
test/mocha-test.js
Normal file
493
test/mocha-test.js
Normal file
File diff suppressed because one or more lines are too long
79
test/playwright-test-main.spec.mjs
Normal file
79
test/playwright-test-main.spec.mjs
Normal file
@@ -0,0 +1,79 @@
|
||||
// @ts-check
|
||||
import { test, expect } from '@playwright/test';
|
||||
import path from 'path';
|
||||
import url from 'url';
|
||||
|
||||
const localHtml = `file://${path.resolve(path.dirname(url.fileURLToPath(import.meta.url)), '../')}/dist/ua-parser.html`;
|
||||
|
||||
test.describe('test input', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto(localHtml);
|
||||
});
|
||||
|
||||
test('accept empty string', async ({ page }) => {
|
||||
// @ts-ignore
|
||||
const uap = await page.evaluate(async () => await UAParser(''));
|
||||
expect(uap).toHaveProperty('ua', '');
|
||||
});
|
||||
});
|
||||
|
||||
test('read client hints data', async ({ page }) => {
|
||||
await page.addInitScript(() => {
|
||||
Object.defineProperty(navigator, 'userAgentData', {
|
||||
value: {
|
||||
brands: [],
|
||||
platform: '',
|
||||
mobile: false,
|
||||
getHighEntropyValues: () => {
|
||||
return Promise.resolve({
|
||||
brands: [
|
||||
{
|
||||
brand: 'Chromium',
|
||||
version: '110'
|
||||
},
|
||||
{
|
||||
brand: 'Not(A:Brand',
|
||||
version: '110'
|
||||
},
|
||||
{
|
||||
brand: 'New Browser',
|
||||
version: '110'
|
||||
}
|
||||
],
|
||||
platform: 'New OS',
|
||||
formFactor: 'New Form Factor'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
await page.goto(localHtml);
|
||||
|
||||
// @ts-ignore
|
||||
const uap = await page.evaluate(async () => await UAParser().withClientHints());
|
||||
|
||||
expect(uap).toHaveProperty('browser.name', 'New Browser');
|
||||
expect(uap).toHaveProperty('os.name', 'New OS');
|
||||
expect(uap).toHaveProperty('device.type', undefined);
|
||||
});
|
||||
|
||||
test('detect Brave', async ({ page }) => {
|
||||
await page.addInitScript(() => {
|
||||
Object.defineProperty(navigator, 'brave', {
|
||||
value: {
|
||||
isBrave: () => true
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
await page.goto(localHtml);
|
||||
|
||||
// @ts-ignore
|
||||
let uap = await page.evaluate(() => UAParser());
|
||||
expect(uap).toHaveProperty('browser.name', 'Chrome Headless');
|
||||
|
||||
// @ts-ignore
|
||||
uap = await page.evaluate(() => UAParser().withFeatureCheck());
|
||||
expect(uap).toHaveProperty('browser.name', 'Brave');
|
||||
});
|
||||
@@ -159,6 +159,16 @@
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Camino on Mac",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Camino/2.2.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Camino",
|
||||
"version" : "2.2.1",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chimera",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; pl-PL; rv:1.0.1) Gecko/20021111 Chimera/0.6",
|
||||
@@ -179,6 +189,56 @@
|
||||
"major" : "20"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chrome",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4758.102 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chrome",
|
||||
"version" : "100.0.4758.102",
|
||||
"major" : "100"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chrome 112.0 on Win10",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chrome",
|
||||
"version" : "112.0.0.0",
|
||||
"major" : "112"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chrome 112.0 on macOS",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chrome",
|
||||
"version" : "112.0.0.0",
|
||||
"major" : "112"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chrome 111.0 on Linux",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chrome",
|
||||
"version" : "111.0.0.0",
|
||||
"major" : "111"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chrome 111.0 on ChromeOS",
|
||||
"ua" : "Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chrome",
|
||||
"version" : "111.0.0.0",
|
||||
"major" : "111"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chrome Headless",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36",
|
||||
@@ -214,7 +274,7 @@
|
||||
"ua" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chrome",
|
||||
"name" : "Mobile Chrome",
|
||||
"version" : "19.0.1084.60",
|
||||
"major" : "19"
|
||||
}
|
||||
@@ -234,7 +294,7 @@
|
||||
"ua" : "Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chrome",
|
||||
"name" : "Mobile Chrome",
|
||||
"version" : "16.0.912.75",
|
||||
"major" : "16"
|
||||
}
|
||||
@@ -279,6 +339,16 @@
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "DuckDuckGo",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 8.1.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile DuckDuckGo/5 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "DuckDuckGo",
|
||||
"version" : "5",
|
||||
"major" : "5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Epiphany",
|
||||
"ua" : "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7) Gecko/20040628 Epiphany/1.2.6",
|
||||
@@ -289,6 +359,16 @@
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Flow",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) EkiohFlow/5.7.4.30559 Flow/5.7.4 (like Gecko Firefox/53.0 rv:53.0)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Flow",
|
||||
"version" : "5.7.4",
|
||||
"major" : "5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Waterfox",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.2.2 Waterfox/55.2.2",
|
||||
@@ -389,6 +469,26 @@
|
||||
"major" : "15"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:100.0) Gecko/20100101 Firefox/100.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Firefox",
|
||||
"version" : "100.0",
|
||||
"major" : "100"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox Reality",
|
||||
"ua" : "Mozilla/5.0 (Android 7.1.2; Mobile VR; rv:65.0) Gecko/65.0 Firefox/65.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Firefox Reality",
|
||||
"version" : "65.0",
|
||||
"major" : "65"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox-based browser",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0 AppName/1.0",
|
||||
@@ -409,6 +509,16 @@
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox for Maemo (Nokia N900)",
|
||||
"ua" : "Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 Fennec/10.0.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Fennec",
|
||||
"version" : "10.0.1",
|
||||
"major" : "10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Firefox Focus",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Focus/6.1.1 Chrome/68.0.3440.91 Mobile Safari/537.36",
|
||||
@@ -438,6 +548,56 @@
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HeyTap",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.61 Safari/537.36 HeyTapBrowser/40.8.10.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "HeyTap",
|
||||
"version" : "40.8.10.1",
|
||||
"major" : "40"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HuaweiBrowser",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; LYA-AL00;HMSCore/4.0.0 GMS/10.4 ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.102 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Huawei Browser",
|
||||
"version" : "10.0.3.102",
|
||||
"major" : "10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HuaweiBrowser",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; LYA-AL00;HMSCore/4.0.0 ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.102 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Huawei Browser",
|
||||
"version" : "10.0.3.102",
|
||||
"major" : "10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HuaweiBrowser",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; LYA-AL00;GMS/10.4 ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.102 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Huawei Browser",
|
||||
"version" : "10.0.3.102",
|
||||
"major" : "10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HuaweiBrowser",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; LYA-AL00 ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.102 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Huawei Browser",
|
||||
"version" : "10.0.3.102",
|
||||
"major" : "10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "IceApe",
|
||||
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.19) Gecko/20110817 Iceape/2.0.14",
|
||||
@@ -648,6 +808,16 @@
|
||||
"major" : "4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mobile Safari",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Safari/604.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mobile Safari",
|
||||
"version" : "undefined",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mosaic",
|
||||
"ua" : "NCSA_Mosaic/2.6 (X11; SunOS 4.1.3 sun4m)",
|
||||
@@ -708,6 +878,16 @@
|
||||
"major" : "8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Netscape 6",
|
||||
"ua" : "Mozilla/5.0 (Windows; U; Win95; de-DE; rv:0.9.2) Gecko/20010726 Netscape6/6.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Netscape",
|
||||
"version" : "6.1",
|
||||
"major" : "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Nokia Browser",
|
||||
"ua" : "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/025.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba",
|
||||
@@ -718,6 +898,26 @@
|
||||
"major" : "7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Obigo",
|
||||
"ua" : "LG-GS290/V100 Obigo/WAP2.0 Profile/MIDP-2.1 Configuration/CLDC-1.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Obigo",
|
||||
"version" : "WAP2.0",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Obigo",
|
||||
"ua" : "LG/KU990i/v10a Browser/Obigo-Q05A/3.6 MMS/LG-MMS-V1.0/1.2 Java/ASVM/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Obigo",
|
||||
"version" : "Q05A",
|
||||
"major" : "05"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Oculus Browser",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 7.0; SM-G920I Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/3.4.9 SamsungBrowser/4.0 Chrome/57.0.2987.146 Mobile VR Safari/537.36",
|
||||
@@ -728,6 +928,16 @@
|
||||
"major" : "3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Oculus Browser",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 10; Quest 2) AppleWebKit/537.36 (KHTML, like Gecko) OculusBrowser/15.0.0.0.22.280317669 SamsungBrowser/4.0 Chrome/89.0.4389.90 VR Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Oculus Browser",
|
||||
"version" : "15.0.0.0.22.280317669",
|
||||
"major" : "15"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "OmniWeb",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.48",
|
||||
@@ -914,8 +1124,8 @@
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Safari",
|
||||
"version" : "2.0.4",
|
||||
"major" : "2"
|
||||
"version" : "1",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -938,6 +1148,16 @@
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "SeaMonkey on Mac",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "SeaMonkey",
|
||||
"version" : "2.7.1",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Silk Browser",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-84)",
|
||||
@@ -978,6 +1198,26 @@
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Tesla",
|
||||
"ua" : "Mozilla/5.0 (X11; GNU/Linux) AppleWebKit/601.1 (KHTML, like Gecko) Tesla QtCarBrowser Safari/601.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Tesla",
|
||||
"version" : "undefined",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Tesla",
|
||||
"ua" : "Mozilla/5.0 (X11; GNU/Linux) AppleWebKit/537.36 (KHTML, like Gecko) Chromium/79.0.3945.130 Chrome/79.0.3945.130 Safari/537.36 Tesla/2020.16.2.1-e99c70fff409",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Tesla",
|
||||
"version" : "2020.16.2.1-e99c70fff409",
|
||||
"major" : "2020"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Tizen Browser",
|
||||
"ua" : "Mozilla/5.0 (Linux; U; Tizen/1.0 like Android; en-us; AppleWebKit/534.46 (KHTML, like Gecko) Tizen Browser/1.0 Mobile",
|
||||
@@ -1048,6 +1288,16 @@
|
||||
"major" : "7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "UPBrowser",
|
||||
"ua" : "BenQ-CF61/1.00/WAP2.0/MIDP2.0/CLDC1.0 UP.Browser/6.3.0.4.c.1.102 (GUI) MMP/2.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "UP.Browser",
|
||||
"version" : "6.3.0.4.c.1.102",
|
||||
"major" : "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "WeChat on iOS",
|
||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H321 MicroMessenger/6.3.6 NetType/WIFI Language/zh_CN",
|
||||
@@ -1069,7 +1319,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "WeChat on Android",
|
||||
"desc": "WeiBo on Android",
|
||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16A366 Weibo (iPhone8,2__weibo__8.9.3__iphone__os12.0)",
|
||||
"expect":
|
||||
{
|
||||
@@ -1088,6 +1338,26 @@
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Vivaldi on Mac",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.88 Safari/537.36 Vivaldi/2.4.1488.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Vivaldi",
|
||||
"version" : "2.4.1488.36",
|
||||
"major" : "2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Viera",
|
||||
"ua" : "HbbTV/1.2.1 (;Panasonic;VIERA 2015;3.014;a001-003 4000-0000;)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "VIERA",
|
||||
"version" : "undefined",
|
||||
"major" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Yandex",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.0.1084.5402 Chrome/19.0.1084.5402 Safari/536.5",
|
||||
@@ -1098,6 +1368,66 @@
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Yandex",
|
||||
"ua" : "Mozilla/5.0 (Linux; arm_64; Android 11; M2101K7AG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.125 YaApp_Android/22.70 YaSearchBrowser/22.70 BroPP/1.0 SA/3 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Yandex",
|
||||
"version" : "22.70",
|
||||
"major" : "22"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Yandex",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 YaBrowser/23.3.0.2246 Yowser/2.5 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Yandex",
|
||||
"version" : "23.3.0.2246",
|
||||
"major" : "23"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Yandex on Android",
|
||||
"ua" : "Mozilla/5.0 (Linux; arm_64; Android 13; SM-G965F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.76 YaBrowser/21.3.4.59 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Yandex",
|
||||
"version" : "21.3.4.59",
|
||||
"major" : "21"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Yandex on iPhone",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 YaBrowser/23.3.3.330 Mobile/15E148 Safari/604.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Yandex",
|
||||
"version" : "23.3.3.330",
|
||||
"major" : "23"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Yandex on iPad",
|
||||
"ua" : "Mozilla/5.0 (iPad; CPU OS 16_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 YaBrowser/23.3.3.330 Mobile/15E148 Safari/605.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Yandex",
|
||||
"version" : "23.3.3.330",
|
||||
"major" : "23"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Yandex on iPod",
|
||||
"ua" : "Mozilla/5.0 (iPod touch; CPU iPhone 16_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 YaBrowser/23.3.3.330 Mobile/15E148 Safari/605.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Yandex",
|
||||
"version" : "23.3.3.330",
|
||||
"major" : "23"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Puffin",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; Lenovo P2a42 Build/MMB29M; en-us) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Puffin/6.0.8.15804AP",
|
||||
@@ -1108,14 +1438,24 @@
|
||||
"major" : "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Puffin",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 7.1.1; ZTE BLADE A0620 Build/NMF26F; ru-ru) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 Mobile Safari/537.36 Puffin/9.2.0.50586AP",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Puffin",
|
||||
"version" : "9.2.0.50586AP",
|
||||
"major" : "9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Microsoft Edge 0.1",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Edge",
|
||||
"version" : "0.1",
|
||||
"major" : "0"
|
||||
"version" : "12.0",
|
||||
"major" : "12"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -1124,8 +1464,8 @@
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Edge",
|
||||
"version" : "42",
|
||||
"major" : "42"
|
||||
"version" : "17.17134",
|
||||
"major" : "17"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -1134,8 +1474,18 @@
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Edge",
|
||||
"version" : "44",
|
||||
"major" : "44"
|
||||
"version" : "18.17763",
|
||||
"major" : "18"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Microsoft Edge 100",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.1108.55 Safari/537.36 Edg/100.0.1108.55",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Edge",
|
||||
"version" : "100.0.1108.55",
|
||||
"major" : "100"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -1183,11 +1533,31 @@
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) FxiOS/1.1 Mobile/13B143 Safari/601.1.46",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Firefox",
|
||||
"name" : "Mobile Firefox",
|
||||
"version" : "1.1",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox on iOS",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 16_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/112.0 Mobile/15E148 Safari/605.1.15",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mobile Firefox",
|
||||
"version" : "112.0",
|
||||
"major" : "112"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox iOS using iPad",
|
||||
"ua" : "Mozilla/5.0 (iPad; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mobile Firefox",
|
||||
"version" : "1.0",
|
||||
"major" : "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "QQ on iOS",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A456 QQ/6.5.3.410 V1_IPH_SQ_6.5.3_1_APP_A Pixel/1080 Core/UIWebView NetType/WIFI Mem/26",
|
||||
@@ -1248,6 +1618,16 @@
|
||||
"major" : "4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Supposed not to be detected as WeChat",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.124 Safari/537.36 qblink wegame.exe WeGame/5.1.1.11100 QBCore/3.70.107.400 QQBrowser/9.0.2524.400",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "QQBrowser",
|
||||
"version" : "9.0.2524.400",
|
||||
"major" : "9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "GSA on iOS",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) GSA/30.1.161623614 Mobile/14F89 Safari/602.1",
|
||||
@@ -1333,5 +1713,191 @@
|
||||
"version" : "4.2.7",
|
||||
"major" : "4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "IE11 on Windows 7 (ua length >255)",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64; APCPMS=^N201205020840572565478A37A6F9C41BD33F_9975^; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MARKANYEPS#25118; Zoom 3.6.0; rv:11.0) like Gecko",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "IE",
|
||||
"version" : "11.0",
|
||||
"major" : "11"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "LinkedIn",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [LinkedInApp]",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "LinkedIn"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Safari including comma in minor version number",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6,2 Safari/605.1.15",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Safari",
|
||||
"version" : "15.6,2",
|
||||
"major" : "15"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mobile Safari including comma in minor version number",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 15_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6,2 Mobile/15E148 Safari/604.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mobile Safari",
|
||||
"version" : "15.6,2",
|
||||
"major" : "15"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Cobalt 23 Master",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) Cobalt/23.master.0.0-devel (unlike Gecko) v8/8.8.278.8-jit gles Starboard/15",
|
||||
"expect" : {
|
||||
"name" : "Cobalt",
|
||||
"version": "23.0.0",
|
||||
"major" : "23"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Cobalt 23 LTS",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) Cobalt/23.lts.1.0-qa (unlike Gecko) v8/8.8.278.8-jit gles Starboard/15",
|
||||
"expect" : {
|
||||
"name" : "Cobalt",
|
||||
"version": "23.1.0",
|
||||
"major" : "23"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Cobalt 11",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) Cobalt/11.0-qa (unlike Gecko) Starboard/6",
|
||||
"expect" : {
|
||||
"name" : "Cobalt",
|
||||
"version": "11.0",
|
||||
"major" : "11"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Cobalt 9",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) Cobalt/9.0-qa (unlike Gecko) Starboard/4",
|
||||
"expect" : {
|
||||
"name" : "Cobalt",
|
||||
"version": "9.0",
|
||||
"major" : "9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "KakaoTalk App Android",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 12; SM-G988N Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.79 Mobile Safari/537.36;KAKAOTALK 2409760",
|
||||
"expect" : {
|
||||
"name" : "KAKAOTALK",
|
||||
"version": "2409760",
|
||||
"major" : "2409760"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "KakaoStory App Android",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 12; SM-G988N Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.79 Mobile Safari/537.36 KAKAOSTORY/6.8.3_21046",
|
||||
"expect" : {
|
||||
"name" : "KAKAOSTORY",
|
||||
"version": "6.8.3_21046",
|
||||
"major" : "6"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "KakaoTalk App iOS",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU; iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 BizWebView KAKAOTALK 9.7.6",
|
||||
"expect" : {
|
||||
"name" : "KAKAOTALK",
|
||||
"version": "9.7.6",
|
||||
"major" : "9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Naver App Android",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 12; SM-G988N Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.232 Whale/1.0.0.0 Crosswalk/26.90.3.21 Mobile Safari/537.36 NAVER(inapp; search; 1010; 11.11.2)",
|
||||
"expect" : {
|
||||
"name" : "NAVER",
|
||||
"version": "11.11.2",
|
||||
"major" : "11"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Naver App iOS",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/605.1 NAVER(inapp; search; 720; 10.25.0; 11PRO)",
|
||||
"expect" : {
|
||||
"name" : "NAVER",
|
||||
"version": "10.25.0",
|
||||
"major" : "10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "TikTok",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 11; 21061119AG Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36 trill_2022109040 JsSdk/1.0 NetType/MOBILE Channel/googleplay AppName/musical_ly app_version/21.9.4 ByteLocale/ru-RU ByteFullLocale/ru-RU Region/KG BytedanceWebview/d8a21c6",
|
||||
"expect" : {
|
||||
"name" : "TikTok",
|
||||
"version": "21.9.4",
|
||||
"major" : "21"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "TikTok",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 14_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 musical_ly_21.1.0 JsSdk/2.0 NetType/4G Channel/App Store ByteLocale/ru Region/RU ByteFullLocale/ru-RU isDarkMode/1 WKWebView/1 BytedanceWebview/d8a21c6",
|
||||
"expect" : {
|
||||
"name" : "TikTok",
|
||||
"version": "21.1.0",
|
||||
"major" : "21"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "TikTok",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 10; STK-LX1 Build/HONORSTK-LX1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/110.0.5481.153 Mobile Safari/537.36 musical_ly_2022803040 JsSdk/1.0 NetType/WIFI Channel/huaweiadsglobal_int AppName/musical_ly app_version/28.3.4 ByteLocale/en ByteFullLocale/en Region/IQ Spark/1.2.7-alpha.8 AppVersion/28.3.4 PIA/1.5.11 BytedanceWebview/d8a21c6",
|
||||
"expect" : {
|
||||
"name" : "TikTok",
|
||||
"version": "28.3.4",
|
||||
"major" : "28"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chrome Mobile",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5X Build/N2G47W) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mobile Chrome",
|
||||
"version" : "58.0.3029.83",
|
||||
"major" : "58"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox Mobile",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5X Build/N2G47W) AppleWebKit/537.36 (KHTML, like Gecko) FxiOS/7.5b3349 Mobile/14F89 Safari/603.2.4",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mobile Firefox",
|
||||
"version" : "7.5b3349",
|
||||
"major" : "7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox Mobile",
|
||||
"ua" : "Mozilla/5.0 (Android 5.0; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mobile Firefox",
|
||||
"version" : "41.0",
|
||||
"major" : "41"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Snapchat",
|
||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Snapchat/12.33.0.36 (like Safari/8614.1.25.0.31, panda)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Snapchat",
|
||||
"version" : "12.33.0.36",
|
||||
"major" : "12"
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
@@ -23,6 +23,46 @@
|
||||
"architecture" : "amd64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Vivaldi on Windows",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Vivaldi/6.0.2979.18",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "amd64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Vivaldi on Windows",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Vivaldi/6.0.2979.18",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "amd64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Vivaldi on Linux",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Vivaldi/6.0.2979.18",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "amd64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Vivaldi on Linux",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Vivaldi/6.0.2979.18",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "ia32"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Xiaomi POCO M2 Pro",
|
||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 11; POCO M2 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 YaBrowser/22.11.7.42.00 SA/3 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "arm64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "win64",
|
||||
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; .NET4.0E; .NET4.0C)",
|
||||
@@ -79,6 +119,14 @@
|
||||
"architecture" : "arm"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Nokia N900 Linux mobile",
|
||||
"ua" : "Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0) Gecko/20100101 Firefox/10.0 Fennec/10.0",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "arm"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "ARMEABI",
|
||||
"ua" : "[FBAN/FB4A;FBAV/237.0.0.44.120;FBBV/170693408;FBDM/{density=1.75,width=720,height=1280};FBLC/en_US;FBRV/172067074;FBCR/ ;FBMF/samsung;FBBD/samsung;FBPN/com.facebook.katana;FBDV/SM-S367VL;FBSV/9;FBBK/1;FBOP/19;FBCA/armeabi-v7a:armeabi;]",
|
||||
@@ -103,6 +151,30 @@
|
||||
"architecture" : "arm64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "ARM64",
|
||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; ARM64; RM-1096) AppleWebKit/537.36 (KHTML like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "arm64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "ARM64",
|
||||
"ua" : "Mozilla/5.0 (Linux; arm_64; Android 9; HRY-LX1T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 YaBrowser/19.12.1.121.00 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "arm64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Google Search App",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 6.0; M5s Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.147 Mobile Safari/537.36 GSA/12.40.17.23.arm64",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "arm64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Pocket PC",
|
||||
"ua" : "Opera/9.7 (Windows Mobile; PPC; Opera Mobi/35166; U; en) Presto/2.2.1",
|
||||
@@ -135,6 +207,14 @@
|
||||
"architecture" : "ppc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mac OS X on PowerPC using Firefox",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; PPC Mac OS X x.y; rv:10.0) Gecko/20100101 Firefox/10.0",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "ppc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "UltraSPARC",
|
||||
"ua" : "Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.9b5) Gecko/2008032620 Firefox/3.0b5",
|
||||
@@ -174,5 +254,13 @@
|
||||
{
|
||||
"architecture" : "irix64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "68k",
|
||||
"ua" : "'Mozilla/1.1 (Macintosh; U; 68K)'",
|
||||
"expect" :
|
||||
{
|
||||
"architecture" : "68k"
|
||||
}
|
||||
}
|
||||
]
|
||||
3553
test/specs/device-all.json
Normal file
3553
test/specs/device-all.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -17,6 +17,15 @@
|
||||
"version" : "12.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Flow",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) EkiohFlow/5.7.4.30559 Flow/5.7.4 (like Gecko Firefox/53.0 rv:53.0)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Flow",
|
||||
"version" : "5.7.4.30559"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Gecko",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre",
|
||||
@@ -44,6 +53,15 @@
|
||||
"version" : "4.5.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "LibWeb",
|
||||
"ua" : "Mozilla/4.0 (SerenityOS; x86) LibWeb+LibJS (Not KHTML, nor Gecko) LibWeb",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "LibWeb",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "NetFront",
|
||||
"ua" : "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
|
||||
@@ -97,5 +115,50 @@
|
||||
"name" : "WebKit",
|
||||
"version" : "537.36"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 5.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 WebAppManager",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Blink",
|
||||
"version" : "68.0.3440.106"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 4.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.34 Safari/537.36 WebAppManager",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Blink",
|
||||
"version" : "53.0.2785.34"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 3.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.2.1 Chrome/38.0.2125.122 Safari/537.36 WebAppManager",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Blink",
|
||||
"version" : "38.0.2125.122"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 2.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/538.2 (KHTML, like Gecko) Large Screen WebAppManager Safari/538.2",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "WebKit",
|
||||
"version" : "538.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 1.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "WebKit",
|
||||
"version" : "537.41"
|
||||
}
|
||||
}
|
||||
]
|
||||
342
test/specs/extension-device.json
Normal file
342
test/specs/extension-device.json
Normal file
@@ -0,0 +1,342 @@
|
||||
[{
|
||||
"desc": "Essential PH-1",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; PH-1 Build/PPR1.180905.036) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.86 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Essential",
|
||||
"model": "PH-1",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Gigaset Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; Gigaset QV830 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Gigaset",
|
||||
"model": "QV830",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "RCA Voyager III Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; RCT6973W43 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "RCA",
|
||||
"model": "RCT6973W43",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "RCA Voyager II Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0; RCT6773W22B Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "RCA",
|
||||
"model": "RCT6773W22B",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Verizon Quanta Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; QMV7B Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Verizon",
|
||||
"model": "QMV7B",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Verizon Ellipsis 8 Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; QTAQZ3 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Verizon",
|
||||
"model": "QTAQZ3",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Verizon Ellipsis 8HD Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; QTASUN1 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Verizon",
|
||||
"model": "QTASUN1",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Dell Venue 8 Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; Venue 8 3830 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Dell",
|
||||
"model": "Venue 8 3830",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Dell Venue 7 Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; Venue 7 3730 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Dell",
|
||||
"model": "Venue 7 3730",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Barnes & Noble Nook HD+ Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; Barnes & Noble Nook HD+ Build/JZO54K; CyanogenMod-10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Barnes & Noble",
|
||||
"model": "Nook HD+",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Barnes & Noble V400 Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.0.4; BNTV400 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Barnes & Noble",
|
||||
"model": "V400",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "NuVision TM101A540N Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1; TM101A540N Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/50.0.2661.86 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "NuVision",
|
||||
"model": "TM101A540N",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ZTE-Z431",
|
||||
"ua": "ZTE-Z431/1.4.0 NetFront/4.2 QTV5.1 Profile/MIDP-2.1 Configuration/CLDC-1.1",
|
||||
"expect": {
|
||||
"vendor": "ZTE",
|
||||
"model": "Z431",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ZTE",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; ZTE-Z740G Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "ZTE",
|
||||
"model": "Z740G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ZTE K Series Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0.1; K88 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ZTE",
|
||||
"model": "K88",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ZTE Nubia Red Magic 3",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; NX629J Build/PKQ1.190321.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/45016 Mobile Safari/537.36 MMWEBID/4064 MicroMessenger/7.0.10.1580(0x27000A34) Process/tools NetType/WIFI Language/zh_CN ABI/arm64",
|
||||
"expect": {
|
||||
"vendor": "ZTE",
|
||||
"model": "NX629J",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ZTE Blade A5",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 9; ZTE Blade A5 2019) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ZTE",
|
||||
"model": "Blade A5 2019",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ZTE BLADE V0730",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 6.0; ZTE BLADE V0730) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.116 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ZTE",
|
||||
"model": "BLADE V0730",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "ZTE B2017G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.1; ZTE B2017G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.93 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "ZTE",
|
||||
"model": "B2017G",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Swizz GEN610",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; GEN610 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Swiss",
|
||||
"model": "GEN610",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Swizz ZUR700",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; ZUR700 Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Swiss",
|
||||
"model": "ZUR700",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Zeki TB782b Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.0.4; en-US; TB782B Build/IMM76D) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.0.2.299 U3/0.8.0 Mobile Safari/534.31",
|
||||
"expect": {
|
||||
"vendor": "Zeki",
|
||||
"model": "TB782B",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Dragon Touch Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.0.4; DT9138B Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Dragon Touch",
|
||||
"model": "9138B",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Insignia Tablet",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; NS-P08A7100 Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Insignia",
|
||||
"model": "NS-P08A7100",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Voice Xtreme V75",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2.1; en-us; V75 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Voice",
|
||||
"model": "V75",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "LvTel V11",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; V11 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "LvTel",
|
||||
"model": "V11",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Envizen Tablet V100MD",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; V100MD Build/V100MD.20130816) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "Envizen",
|
||||
"model": "V100MD",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Rotor Tablet",
|
||||
"ua": "mozilla/5.0 (linux; android 5.0.1; tu_1491 build/lrx22c) applewebkit/537.36 (khtml, like gecko) chrome/43.0.2357.93 safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Rotor",
|
||||
"model": "1491",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "MachSpeed Tablets",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; Trio 7.85 vQ Build/Trio_7.85_vQ) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "MachSpeed",
|
||||
"model": "Trio 7.85 vQ",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Trinity Tablets",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0.1; Trinity T101 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.83 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Trinity",
|
||||
"model": "T101",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "NextBook Next7",
|
||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Next7P12 Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||
"expect": {
|
||||
"vendor": "NextBook",
|
||||
"model": "Next7P12",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "NextBook Tablets",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0; NXA8QC116 Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "NextBook",
|
||||
"model": "NXA8QC116",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Le Pan Tablets",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; Le Pan TC802A Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Le Pan",
|
||||
"model": "TC802A",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Le Pan Tablets",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; Le Pan TC802A Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Le Pan",
|
||||
"model": "TC802A",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "AT&T Radiant Core U304AA",
|
||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 9; U304AA Build/P00610)",
|
||||
"expect": {
|
||||
"vendor": "AT&T",
|
||||
"model": "U304AA",
|
||||
"type": "mobile"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vodafone Smart Tab 4G",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.4; Vodafone Smart Tab 4G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Vodafone",
|
||||
"model": "Smart Tab 4G",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "Vodafone Smart ultra 6",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 5.0.2; Vodafone Smart ultra 6 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36",
|
||||
"expect": {
|
||||
"vendor": "Vodafone",
|
||||
"model": "Smart ultra 6",
|
||||
"type": "tablet"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "4ife 4K Smart TV Box",
|
||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.2; 4ife 4K Smart TV Box Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36 Vinebre",
|
||||
"expect": {
|
||||
"vendor": "undefined",
|
||||
"model": "undefined",
|
||||
"type": "smarttv"
|
||||
}
|
||||
}]
|
||||
@@ -107,6 +107,15 @@
|
||||
"version" : "6.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Windows Mobile",
|
||||
"ua" : "Opera/9.80 (Windows Mobile; WCE; Opera Mobi/WMD-50433; U; en) Presto/2.4.13 Version/10.00",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Windows Mobile",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Windows Phone",
|
||||
"ua" : "Opera/9.80 (Windows Phone; Opera Mini/7.6.8/35.7518; U; ru) Presto/2.8.119 Version/11.10",
|
||||
@@ -134,6 +143,24 @@
|
||||
"version" : "8.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Windows NT on x86 or aarch64 CPU using Firefox",
|
||||
"ua" : "Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Windows",
|
||||
"version" : "NT x"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Windows NT on x64 CPU using Firefox",
|
||||
"ua" : "Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Windows",
|
||||
"version" : "NT x"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "BlackBerry",
|
||||
"ua" : "BlackBerry9300/5.0.0.912 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/378",
|
||||
@@ -170,6 +197,15 @@
|
||||
"version" : "2.3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Tizen 6.0",
|
||||
"ua" : "HbbTV/1.5.1 (+DRM;Samsung;SmartTV2021:UAU7000;T-KSU2EDEUC-1506.0;KantSU2e;urn:samsungtv:familyname:21_KANTSU2E_UHD_BASIC:2021;) Tizen/6.0 (+TVPLUS+SmartHubLink) Chrome/76 LaTivu_1.0.1_2021 RVID/17",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Tizen",
|
||||
"version" : "6.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Android",
|
||||
"ua" : "Mozilla/5.0 (Linux; U; Android 2.2.2; en-us; VM670 Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko)",
|
||||
@@ -179,6 +215,15 @@
|
||||
"version" : "2.2.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HarmonyOS",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 10; HarmonyOS; YAL-AL10; HMSCore 6.3.0.327; GMSCore 21.48.15) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.105 HuaweiBrowser/12.0.3.310 Mobile Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "HarmonyOS",
|
||||
"version" : "10"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Sailfish",
|
||||
"ua" : "Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.0",
|
||||
@@ -206,6 +251,51 @@
|
||||
"version" : "1.4.5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 5.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 WebAppManager",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "webOS",
|
||||
"version" : "TV"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 4.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.34 Safari/537.36 WebAppManager",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "webOS",
|
||||
"version" : "TV"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 3.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.2.1 Chrome/38.0.2125.122 Safari/537.36 WebAppManager",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "webOS",
|
||||
"version" : "TV"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 2.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/538.2 (KHTML, like Gecko) Large Screen WebAppManager Safari/538.2",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "webOS",
|
||||
"version" : "TV"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "WebOS TV 1.x",
|
||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "webOS",
|
||||
"version" : "TV"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "QNX",
|
||||
"ua" : "Mozilla/5.0 (Photon; U; QNX x86pc; en-US; rv:1.8.1.20) Gecko/20090127 BonEcho/2.0.0.20",
|
||||
@@ -233,6 +323,15 @@
|
||||
"version" : "2.1.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Nokia N900 Linux mobile, on the Fennec browser",
|
||||
"ua" : "Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0) Gecko/20100101 Firefox/10.0 Fennec/10.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Maemo",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MeeGo",
|
||||
"ua" : "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",
|
||||
@@ -275,7 +374,25 @@
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Firefox OS",
|
||||
"version" : "undefined"
|
||||
"version" : "14.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox OS on Tablet",
|
||||
"ua" : "Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Firefox OS",
|
||||
"version" : "26.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Firefox OS on TV",
|
||||
"ua" : "Mozilla/5.0 (TV; rv:44.0) Gecko/44.0 Firefox/44.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Firefox OS",
|
||||
"version" : "44.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -505,11 +622,11 @@
|
||||
},
|
||||
{
|
||||
"desc" : "Slackware",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Slackware",
|
||||
"version" : "13.37"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -548,12 +665,21 @@
|
||||
"version" : "1.9.2.22-0.1mdv2010.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chrome OS",
|
||||
"ua" : "Mozilla/5.0 (X11; CrOS x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.0.0 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chrome OS",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Chromium OS",
|
||||
"ua" : "Mozilla/5.0 (X11; CrOS x86_64 10575.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Chromium OS",
|
||||
"name" : "Chrome OS",
|
||||
"version" : "10575.58.0"
|
||||
}
|
||||
},
|
||||
@@ -568,11 +694,11 @@
|
||||
},
|
||||
{
|
||||
"desc" : "Solaris",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.7) Gecko/20070606",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Solaris",
|
||||
"version" : "sun4u"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -604,11 +730,11 @@
|
||||
},
|
||||
{
|
||||
"desc" : "DragonFly",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; U; DragonFly i386; de; rv:1.9.1) Gecko/20090720 Firefox/3.5.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "DragonFly",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -638,12 +764,84 @@
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iOS with FaceBook Mobile App",
|
||||
"ua": "[FBAN/FBIOS;FBAV/283.0.0.44.117;FBBV/238386386;FBDV/iPhone12,1;FBMD/iPhone;FBSN/iOS;FBSV/13.6.1;FBSS/2;FBID/phone;FBLC/en_US;FBOP/5;FBRV/240127608]",
|
||||
"expect":
|
||||
{
|
||||
"name" : "iOS",
|
||||
"version" : "13.6.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc": "iOS with Slack App",
|
||||
"ua": "com.tinyspeck.chatlyio/23.04.10 (iPhone; iOS 16.4.1; Scale/3.00)",
|
||||
"expect":
|
||||
{
|
||||
"name" : "iOS",
|
||||
"version" : "16.4.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "watchOS",
|
||||
"ua" : "server-bag [Watch OS,8.4,19S546,Watch3,4]",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "watchOS",
|
||||
"version" : "8.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "watchOS",
|
||||
"ua" : "atc/1.0 watchOS/7.4.1 model/Watch3,3 hwp/t8004 build/18T201 (6; dt:155)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "watchOS",
|
||||
"version" : "7.4.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "watchOS",
|
||||
"ua" : "Watch4,3/5.3.8 (16U680)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "watchOS",
|
||||
"version" : "5.3.8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mac OS on PowerPC",
|
||||
"ua" : "Mozilla/4.0 (compatible; MSIE 5.0b1; Mac_PowerPC)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "macOS",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mac OS X on x86, x86_64, or aarch64 using Firefox",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:10.0) Gecko/20100101 Firefox/10.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "macOS",
|
||||
"version" : "x.y"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mac OS X on PowerPC using Firefox",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; PPC Mac OS X x.y; rv:10.0) Gecko/20100101 Firefox/10.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "macOS",
|
||||
"version" : "x.y"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Mac OS",
|
||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Mac OS",
|
||||
"name" : "macOS",
|
||||
"version" : "10.6.8"
|
||||
}
|
||||
},
|
||||
@@ -721,155 +919,308 @@
|
||||
},
|
||||
{
|
||||
"desc" : "AIX",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; U; AIX 000138384C00; en-US; rv:1.0.1) Gecko/20030213 Netscape/7.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "AIX",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Plan9",
|
||||
"ua" : "",
|
||||
"ua" : "NCSA_Mosaic/5.0 (X11;Plan 9 4.0)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Plan 9",
|
||||
"version" : "4.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Minix",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; Original ; Minix 3.3 ; rv:3.0)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Minix",
|
||||
"version" : "3.3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "BeOS",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (BeOS; U; BeOS BePC; en-US; rv:1.8.1.8pre) Gecko/20070926 SeaMonkey/1.1.5pre",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "BeOS",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "OS/2",
|
||||
"ua" : "",
|
||||
"ua" : "Links (2.1pre14; OS/2 1 i386; 80x33)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "OS/2",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "AmigaOS",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/4.0 (compatible; AWEB 3.4 SE; AmigaOS)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "AmigaOS",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "MorphOS",
|
||||
"ua" : "",
|
||||
"ua" : "AmigaVoyager/3.4.4 (MorphOS/PPC native)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "MorphOS",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "UNIX",
|
||||
"ua" : "",
|
||||
"ua" : "Surf/0.4.1 (X11; U; Unix; en-US) AppleWebKit/531.2+ Compatible (Safari)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Unix",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Joli",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; Jolicloud Linux i686) AppleWebKit/537.6 (KHTML, like Gecko) Joli OS/1.2 Chromium/23.0.1240.0 Chrome/23.0.1240.0 Safari/537.6",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Joli",
|
||||
"version" : "1.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "CentOS",
|
||||
"ua" : "",
|
||||
"ua" : "Konqueror/15.13 (CentOS Linux 7.4; cs-CZ;)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "CentOS",
|
||||
"version" : "7.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "PCLinuxOS",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101209 PCLinuxOS/1.9.2.13-1pclos2010 (2010) Firefox/3.6.13",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "PCLinuxOS",
|
||||
"version" : "1.9.2.13-1pclos2010"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "RedHat",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.4 (like Gecko) Red Hat Enterprise Linux/4.3.4-11.el6_1.4",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Red Hat",
|
||||
"version" : "4.3.4-11.el6_1.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "RedHat",
|
||||
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.13pre) Gecko/20070717 Red Hat/1.0.9-4.el4 SeaMonkey/1.0.9",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Red Hat",
|
||||
"version" : "1.0.9-4.el4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "RedHat",
|
||||
"ua" : "iTunes/4.7.1 (Linux; N; Red Hat; x86_64-linux; EN; utf8) SqueezeCenter, Squeezebox Server, Logitech Media Server/7.9.1/1522157629",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Red Hat",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "RedHat",
|
||||
"ua" : "curl/7.20.0 (x86_64-redhat-linux-gnu) libcurl/7.20.0 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "redhat",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "RISC OS",
|
||||
"ua" : "Mozilla/1.10 [en] (Compatible; RISC OS 3.70; Oregano 1.10)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "RISC OS",
|
||||
"version" : "3.70"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Zenwalk",
|
||||
"ua" : "",
|
||||
"ua" : "Flock/2.16 (Zenwalk 7.3; es_PR;)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Zenwalk",
|
||||
"version" : "7.3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Hurd",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; Hurd 0.9 i386; en-US) libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/3.7.0 Safari/696.96",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Hurd",
|
||||
"version" : "0.9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Linux",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Linux",
|
||||
"version" : "x86_64"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "GNU",
|
||||
"ua" : "",
|
||||
"desc" : "Deepin",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64; Deepin 15.5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36 NFSBrowser/5.0.0.1886",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Deepin",
|
||||
"version" : "15.5"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Palm OS",
|
||||
"ua" : "",
|
||||
"ua" : "Mozilla/4.76 [en] (PalmOS; U; WebPro3.0; Palm-Arz1)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "",
|
||||
"version" : ""
|
||||
"name" : "Palm",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Panasonic Viera",
|
||||
"ua" : "HbbTV/1.2.1 (;Panasonic;VIERA 2015;3.014;a001-003 4000-0000;)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "VIERA",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Netrange Smart TV",
|
||||
"ua" : "Mozilla/5.0 (Linux; U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 OPR/46.0.2207.0 LOEWE-SL410/5.2.0.0 HbbTV/1.4.1 (; LOEWE; SL410; LOH/5.2.0.0;;) FVC/3.0 (LOEWE; SL410;) CE-HTML/1.0 Config (L:deu,CC:DEU) NETRANGEMMH",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "NETRANGE",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "NetTV 3.2.1",
|
||||
"ua" : "Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "NETTV",
|
||||
"version" : "3.2.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "HP-UX",
|
||||
"ua" : "Mozilla/5.0 (X11; U; HP-UX 9000/785; es-ES; rv:1.0.1) Gecko/20020827 Netscape/7.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "HP-UX",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Contiki",
|
||||
"ua" : "Contiki/1.0 (Commodore 64; http://dunkels.com/adam/contiki/)",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Contiki",
|
||||
"version" : "1.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Linpus",
|
||||
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5pre) Gecko/2008032619 Linpus/3.0-0.49",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Linpus",
|
||||
"version" : "3.0-0.49"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Manjaro",
|
||||
"ua" : "Mozilla/5.0 (X11; Manjaro 19.0.2; Arch; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Manjaro",
|
||||
"version" : "19.0.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "elementary OS",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/604.1 (KHTML, like Gecko) Version/11.0 Safari/604.1 elementary OS/0.4 (Loki) Epiphany/3.18.11",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "elementary OS",
|
||||
"version" : "0.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "GhostBSD",
|
||||
"ua" : "Mozilla/5.0 (X11; GhostBSD/10.3; x86_64; rv:50.0.1) Gecko/20100101 Firefox/50.0.1",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "GhostBSD",
|
||||
"version" : "10.3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Android-x86",
|
||||
"ua" : "Mozilla/5.0 (Linux; Android 7.1.2; Generic Android-x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/61.2.3076.56749",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Android-x86",
|
||||
"version" : "7.1.2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Sabayon",
|
||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Sabayon Chrome/19.0.1084.46 Safari/536.5",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Sabayon",
|
||||
"version" : "undefined"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "Linspire",
|
||||
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060803 Firefox/1.5.0.4 Linspire/1.5.0.4",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "Linspire",
|
||||
"version" : "1.5.0.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"desc" : "SerenityOS",
|
||||
"ua" : "Mozilla/4.0 (SerenityOS; x86) LibWeb+LibJS (Not KHTML, nor Gecko) LibWeb",
|
||||
"expect" :
|
||||
{
|
||||
"name" : "SerenityOS",
|
||||
"version" : "undefined"
|
||||
}
|
||||
}
|
||||
]
|
||||
151
test/test.js
151
test/test.js
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user