• Stars
    star
    247
  • Rank 164,117 (Top 4 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 5 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A utility to compile browserslist query to a RegExp to test browser useragent.

browserslist-useragent-regexp

NPM version Node version Dependencies status Build status Coverage status Documentation badge

A utility to compile browserslist query to a regex to test browser useragent. Simplest example: you can detect supported browsers on client-side.

  1. Create .browserslistrc config, for example like this:
last 2 versions
not dead
  1. Add script to package.json:
{
  "scripts": {
    "supportedBrowsers": "echo \"export default $(browserslist-useragent-regexp --allowHigherVersions);\" > supportedBrowsers.js"
  }
}
for Windows users
{
  "scripts": {
    "supportedBrowsers": "(echo export default && browserslist-useragent-regexp --allowHigherVersions) > supportedBrowsers.js"
  }
}
  1. Run this script, to compile regex:
pnpm supportedBrowsers
# or
npm run supportedBrowsers
# or
yarn supportedBrowsers

supportedBrowsers.js:

export default /Edge?\/(10[5-9]|1[1-9]\d|[2-9]\d\d|\d{4,})(\.\d+|)(\.\d+|)|Firefox\/(10[4-9]|1[1-9]\d|[2-9]\d\d|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(10[5-9]|1[1-9]\d|[2-9]\d\d|\d{4,})\.\d+(\.\d+|)|Maci.* Version\/(15\.([6-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]([6-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Opera Mini|Android:?[ /\-](10[6-9]|1[1-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/(6[4-9]|[7-9]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(10[5-9]|1[1-9]\d|[2-9]\d\d|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(10[6-9]|1[1-9]\d|[2-9]\d\d|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(13\.([4-9]|\d{2,})|(1[4-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(1[7-9]|[2-9]\d|\d{3,})\.\d+|Android.+MQQBrowser\/(13(\.([1-9]|\d{2,})|)|(1[4-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(2\.([5-9]|\d{2,})|([3-9]|\d{2,})\.\d+)(\.\d+|)/;
  1. Import regex from created file:
import supportedBrowsers from './supportedBrowsers.js';

if (supportedBrowsers.test(navigator.userAgent)) {
  alert('Your browser is supported.');
}

Install

pnpm add -D browserslist-useragent-regexp
# or
npm i -D browserslist-useragent-regexp
# or
yarn add -D browserslist-useragent-regexp

Why?

As was written in article "Smart Bundling: Shipping legacy code to only legacy browsers": you can determinate, which bundle you should give to browser from server with browserslist-useragent. But in this case you must have your own server with special logic. Now, with browserslist-useragent-regexp, you can move that to client-side.

Development was inspired by this proposal from Mathias Bynens.

How to make differential resource loading and other optimizations with browserslist-useragent-regexp you can read in article "Speed up with Browserslist".

Demo (sources, build script).

Also, testing useragents using generated regex is faster than using the matchesUA method from browserslist-useragent.

CLI

pnpm browserslist-useragent-regexp [query] [...options]
# or
npx browserslist-useragent-regexp [query] [...options]
# or
yarn exec -- browserslist-useragent-regexp [query] [...options]

Also, short alias is available:

pnpm bluare [query] [...options]
Option Description Default
query Manually provide a browserslist query. Specifying this overrides the browserslist configuration specified in your project.
‑‑help, -h Print this message.
‑‑verbose, -v Print additional info about regexes.
‑‑ignorePatch Ignore differences in patch browser numbers. true
‑‑ignoreMinor Ignore differences in minor browser versions. false
‑‑allowHigherVersions For all the browsers in the browserslist query, return a match if the useragent version is equal to or higher than the one specified in browserslist. false
‑‑allowZeroSubversions Ignore match of patch or patch and minor, if they are 0. false

JS API basics

Module exposes two main methods:

getUserAgentRegexes(options)

Compile browserslist query to regexes for each browser.

getUserAgentRegex(options)

Compile browserslist query to one regex.

Description of all methods you can find in Documentation.

Options

Option Type Default Description
browsers string | string[] — Manually provide a browserslist query (or an array of queries). Specifying this overrides the browserslist configuration specified in your project.
env string — When multiple browserslist environments are specified, pick the config belonging to this environment.
ignorePatch boolean true Ignore differences in patch browser numbers.
ignoreMinor boolean false Ignore differences in minor browser versions.
allowHigherVersions boolean false For all the browsers in the browserslist query, return a match if the useragent version is equal to or higher than the one specified in browserslist.
allowZeroSubversions boolean false Ignore match of patch or patch and minor, if they are 0.

Regex info object

Property Type Description
family string Browser family.
requestVersions [number, number, number][] Versions provided by browserslist.
regex RegExp Regex to match useragent with family and versions.
sourceRegex RegExp Original useragent regex, without versions.
version [number, number, number] | null Useragent version of regex.
minVersion [number, number, number] | null Useragent min version of regex.
maxVersion [number, number, number] | null Useragent max version of regex.

Other