From 153ab7c422c2d06b6c69df48b42a5fd1c7dd0195 Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Fri, 16 Jun 2023 00:41:54 -0400 Subject: [PATCH 1/3] feat: allow all browserslist options via JS API --- src/browsers/browserslist.ts | 8 ++---- src/browsers/types.ts | 8 +++--- src/useragentRegex/useragentRegex.ts | 37 ++++++++++++++-------------- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/browsers/browserslist.ts b/src/browsers/browserslist.ts index 4c3b5659..5963da79 100644 --- a/src/browsers/browserslist.ts +++ b/src/browsers/browserslist.ts @@ -44,13 +44,9 @@ export function parseBrowsersList(browsersList: string[]) { export function getBrowsersList(options: BrowserslistRequest = {}) { const { browsers, - env, - path + ...browserslistOptions } = options - const browsersList = browserslist(browsers, { - env, - path - }) + const browsersList = browserslist(browsers, browserslistOptions) const parsedBrowsers = parseBrowsersList(browsersList) return parsedBrowsers diff --git a/src/browsers/types.ts b/src/browsers/types.ts index 2a6b770a..81d3e99b 100644 --- a/src/browsers/types.ts +++ b/src/browsers/types.ts @@ -1,3 +1,5 @@ +import type browserslist from 'browserslist' +import type { Options } from 'browserslist' import type { Semver, RangedSemver @@ -8,10 +10,8 @@ export interface Browser { version: Semver } -export interface BrowserslistRequest { - browsers?: string | string[] - env?: string - path?: string +export interface BrowserslistRequest extends Options { + browsers?: Parameters[0] } export type BrowsersVersions = Map diff --git a/src/useragentRegex/useragentRegex.ts b/src/useragentRegex/useragentRegex.ts index 3109e70e..3a0c8f58 100644 --- a/src/useragentRegex/useragentRegex.ts +++ b/src/useragentRegex/useragentRegex.ts @@ -1,7 +1,9 @@ +import type { SemverCompareOptions } from '../semver/index.js' import { getRegexesForBrowsers } from '../useragent/index.js' import { getBrowsersList, - mergeBrowserVersions + mergeBrowserVersions, + type BrowserslistRequest } from '../browsers/index.js' import { applyVersionsToRegexes } from '../versions/index.js' import type { UserAgentRegexOptions } from './types.js' @@ -15,7 +17,7 @@ export const defaultOptions = { ignorePatch: true, allowZeroSubversions: false, allowHigherVersions: false -} +} as const satisfies Required /** * Get source regexes objects from browserslist query. @@ -23,24 +25,23 @@ export const defaultOptions = { * @returns Source regexes objects. */ export function getPreUserAgentRegexes(options: UserAgentRegexOptions = {}) { - const { - browsers, - env, - path, - ...otherOptions - } = options - const finalOptions = { - ...defaultOptions, - ...otherOptions + const regexpOptions: SemverCompareOptions = { + ...defaultOptions + } + const browserslistOptions: BrowserslistRequest = {} + + for (const optName of Object.keys(options) as (keyof UserAgentRegexOptions)[]) { + if (optName in defaultOptions) { + regexpOptions[optName] = options[optName] + } else { + browserslistOptions[optName] = options[optName] + } } - const browsersList = getBrowsersList({ - browsers, - env, - path - }) + + const browsersList = getBrowsersList(browserslistOptions) const mergedBrowsers = mergeBrowserVersions(browsersList) - const sourceRegexes = getRegexesForBrowsers(mergedBrowsers, finalOptions) - const versionedRegexes = applyVersionsToRegexes(sourceRegexes, finalOptions) + const sourceRegexes = getRegexesForBrowsers(mergedBrowsers, regexpOptions) + const versionedRegexes = applyVersionsToRegexes(sourceRegexes, regexpOptions) return versionedRegexes } From cada4957b95b0e7327cc4e0195ec244a1dbd3bf6 Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Fri, 16 Jun 2023 12:14:38 -0400 Subject: [PATCH 2/3] chore: update API documentation --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e07008b4..da9bd7d2 100644 --- a/README.md +++ b/README.md @@ -150,12 +150,13 @@ Compile browserslist query to one regex. | 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](https://github.com/ai/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. | +Any of the [`browserslist` API options](https://github.com/browserslist/browserslist#js-api) may also be provided. + #### Regex info object | Property | Type | Description | From ef9d544513cbecdbd8b63cdbe5764eec6ea566f4 Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Fri, 16 Jun 2023 12:23:37 -0400 Subject: [PATCH 3/3] refactor: do not separate regex and browserslist options --- src/useragentRegex/useragentRegex.ts | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/useragentRegex/useragentRegex.ts b/src/useragentRegex/useragentRegex.ts index 3a0c8f58..ad1fab47 100644 --- a/src/useragentRegex/useragentRegex.ts +++ b/src/useragentRegex/useragentRegex.ts @@ -2,8 +2,7 @@ import type { SemverCompareOptions } from '../semver/index.js' import { getRegexesForBrowsers } from '../useragent/index.js' import { getBrowsersList, - mergeBrowserVersions, - type BrowserslistRequest + mergeBrowserVersions } from '../browsers/index.js' import { applyVersionsToRegexes } from '../versions/index.js' import type { UserAgentRegexOptions } from './types.js' @@ -25,23 +24,14 @@ export const defaultOptions = { * @returns Source regexes objects. */ export function getPreUserAgentRegexes(options: UserAgentRegexOptions = {}) { - const regexpOptions: SemverCompareOptions = { - ...defaultOptions + const finalOptions = { + ...defaultOptions, + ...options } - const browserslistOptions: BrowserslistRequest = {} - - for (const optName of Object.keys(options) as (keyof UserAgentRegexOptions)[]) { - if (optName in defaultOptions) { - regexpOptions[optName] = options[optName] - } else { - browserslistOptions[optName] = options[optName] - } - } - - const browsersList = getBrowsersList(browserslistOptions) + const browsersList = getBrowsersList(finalOptions) const mergedBrowsers = mergeBrowserVersions(browsersList) - const sourceRegexes = getRegexesForBrowsers(mergedBrowsers, regexpOptions) - const versionedRegexes = applyVersionsToRegexes(sourceRegexes, regexpOptions) + const sourceRegexes = getRegexesForBrowsers(mergedBrowsers, finalOptions) + const versionedRegexes = applyVersionsToRegexes(sourceRegexes, finalOptions) return versionedRegexes }