From b42707c62024f2c231b2ffae9e81fd27679a7c7f Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 12 Aug 2021 16:14:04 +0200 Subject: [PATCH] Require Node.js 12.20 and move to ESM --- .github/workflows/main.yml | 8 +- index.d.ts | 193 ++++++++++++++++++------------------- index.js | 71 +++++++------- index.test-d.ts | 24 +++-- package.json | 12 ++- readme.md | 40 +++++--- test.js | 62 ++++++------ 7 files changed, 210 insertions(+), 200 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 442274a..18c7395 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,14 +10,10 @@ jobs: fail-fast: false matrix: node-version: - - 14 - - 12 - - 10 - - 8 - - 6 + - 16 steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - run: npm install diff --git a/index.d.ts b/index.d.ts index 0b47014..a15f616 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,100 +1,93 @@ -declare const macosVersion: { - /** - @returns The macOS version or `undefined` if the platform is not macOS. - - @example - ``` - import macosVersion = require('macos-version'); - - macosVersion(); - //=> '10.12.3' - ``` - */ - (): string | undefined; - - /** - @returns Whether the specified [semver range](https://github.com/npm/node-semver#ranges) matches the macOS version. - - @example - ``` - import macosVersion = require('macos-version'); - - macosVersion.is('>10.10'); - //=> true - ``` - */ - is(semverRange: string): boolean; - - /** - @returns Whether the macOS version is greater than or equal to the specified version. - - @example - ``` - import macosVersion = require('macos-version'); - - macosVersion.isGreaterThanOrEqualTo('10.10'); - //=> true - ``` - */ - isGreaterThanOrEqualTo(version: string): boolean; - - /** - Throws an error if the specified [semver range](https://github.com/npm/node-semver#ranges) does not match the macOS version. - - @example - ``` - import macosVersion = require('macos-version'); - - macosVersion.assert('>=10.12.5'); - //=> [Error: Requires macOS >=10.12.5] - ``` - */ - assert(semverRange: string): void; - - /** - Throws an error if the macOS version is not greater than or equal to the specified version. - - _Prefer this over `.assert()` whenever possible as it outputs a more user-friendly error message._ - - @example - ``` - import macosVersion = require('macos-version'); - - macosVersion.assertGreaterThanOrEqualTo('10.12.5'); - //=> [Error: Requires macOS 10.12.5 or later] - ``` - */ - assertGreaterThanOrEqualTo(version: string): void; - - /** - Throws an error if platform is not macOS. - - @example - ``` - import macosVersion = require('macos-version'); - - macosVersion.assertMacOS(); - //=> [Error: Requires macOS] - ``` - */ - assertMacOS(): void; - - /** - Whether the platform is macOS. - - @example - ``` - import macosVersion = require('macos-version'); - - if (macosVersion.isMacOS) { - console.log('macOS'); - } - ``` - */ - readonly isMacOS: boolean; - - // TODO: remove this in the next major version - default: typeof macosVersion; -}; - -export = macosVersion; +/** +@returns The macOS version or `undefined` if the platform is not macOS. + +@example +``` +import {macOSVersion} from 'macos-version'; + +macOSVersion(); +//=> '10.12.3' +``` +*/ +export function macOSVersion(): string | undefined; + +/** +@returns Whether the specified [semver range](https://github.com/npm/node-semver#ranges) matches the macOS version. + +@example +``` +import {isMacOSVersion} from 'macos-version'; + +isMacOSVersion('>10.10'); +//=> true +``` +*/ +export function isMacOSVersion(semverRange: string): boolean; + +/** +@returns Whether the macOS version is greater than or equal to the specified version. + +@example +``` +import {isMacOSVersionGreaterThanOrEqualTo} from 'macos-version'; + +isMacOSVersionGreaterThanOrEqualTo('10.10'); +//=> true +``` +*/ +export function isMacOSVersionGreaterThanOrEqualTo(version: string): boolean; + +/** +Throws an error if the specified [semver range](https://github.com/npm/node-semver#ranges) does not match the macOS version. + +@example +``` +import {assertMacOSVersion} from 'macos-version'; + +assertMacOSVersion('>=10.12.5'); +//=> [Error: Requires macOS >=10.12.5] +``` +*/ +export function assertMacOSVersion(semverRange: string): void; + +/** +Throws an error if the macOS version is not greater than or equal to the specified version. + +_Prefer this over `.assert()` whenever possible as it outputs a more user-friendly error message._ + +@example +``` +import {assertMacOSVersionGreaterThanOrEqualTo} from 'macos-version'; + +assertMacOSVersionGreaterThanOrEqualTo('10.12.5'); +//=> [Error: Requires macOS 10.12.5 or later] +``` +*/ +export function assertMacOSVersionGreaterThanOrEqualTo(version: string): void; + +/** +Throws an error if platform is not macOS. + +@example +``` +import {assertMacOS} from 'macos-version'; + +assertMacOS(); +//=> [Error: Requires macOS] +``` +*/ +export function assertMacOS(): void; + +/** +Whether the platform is macOS. + +@example +``` +import {isMacOS} from 'macos-version'; + +if (isMacOS) { + console.log('macOS'); +} +``` +*/ +export const isMacOS: boolean; diff --git a/index.js b/index.js index 819d311..79c84f0 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,9 @@ -'use strict'; -const fs = require('fs'); -const semver = require('semver'); +import process from 'node:process'; +import fs from 'node:fs'; +import semver from 'semver'; + +export const isMacOS = process.platform === 'darwin'; -const isMacOS = process.platform === 'darwin'; let version; const clean = version => { @@ -20,7 +21,7 @@ const clean = version => { }; const parseVersion = plist => { - const matches = /ProductVersion<\/key>[\s]*([\d.]+)<\/string>/.exec(plist); + const matches = /ProductVersion<\/key>\s*([\d.]+)<\/string>/.exec(plist); if (!matches) { return; } @@ -28,7 +29,7 @@ const parseVersion = plist => { return matches[1].replace('10.16', '11'); }; -const getVersion = () => { +export function macOSVersion() { if (!isMacOS) { return; } @@ -41,60 +42,54 @@ const getVersion = () => { return; } - version = matches; - } - - if (version) { - return clean(version); + version = clean(matches); } -}; - -module.exports = getVersion; -// TODO: remove this in the next major version -module.exports.default = getVersion; -getVersion._parseVersion = parseVersion; + return version; +} -getVersion.isMacOS = isMacOS; +if (process.env.NODE_ENV === 'test') { + macOSVersion._parseVersion = parseVersion; +} -getVersion.is = input => { +export function isMacOSVersion(semverRange) { if (!isMacOS) { return false; } - input = input.replace('10.16', '11'); + semverRange = semverRange.replace('10.16', '11'); - return semver.satisfies(getVersion(), clean(input)); -}; + return semver.satisfies(macOSVersion(), clean(semverRange)); +} -getVersion.isGreaterThanOrEqualTo = input => { +export function isMacOSVersionGreaterThanOrEqualTo(version) { if (!isMacOS) { return false; } - input = input.replace('10.16', '11'); + version = version.replace('10.16', '11'); - return semver.gte(getVersion(), clean(input)); -}; + return semver.gte(macOSVersion(), clean(version)); +} -getVersion.assert = input => { - input = input.replace('10.16', '11'); +export function assertMacOSVersion(semverRange) { + semverRange = semverRange.replace('10.16', '11'); - if (!getVersion.is(input)) { - throw new Error(`Requires macOS ${input}`); + if (!isMacOSVersion(semverRange)) { + throw new Error(`Requires macOS ${semverRange}`); } -}; +} -getVersion.assertGreaterThanOrEqualTo = input => { - input = input.replace('10.16', '11'); +export function assertMacOSVersionGreaterThanOrEqualTo(version) { + version = version.replace('10.16', '11'); - if (!getVersion.isGreaterThanOrEqualTo(input)) { - throw new Error(`Requires macOS ${input} or later`); + if (!isMacOSVersionGreaterThanOrEqualTo(version)) { + throw new Error(`Requires macOS ${version} or later`); } -}; +} -getVersion.assertMacOS = () => { +export function assertMacOS() { if (!isMacOS) { throw new Error('Requires macOS'); } -}; +} diff --git a/index.test-d.ts b/index.test-d.ts index ad8180f..373c4e9 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,10 +1,18 @@ import {expectType} from 'tsd'; -import macosVersion = require('.'); +import { + macOSVersion, + isMacOSVersion, + isMacOSVersionGreaterThanOrEqualTo, + assertMacOSVersion, + assertMacOSVersionGreaterThanOrEqualTo, + assertMacOS, + isMacOS, +} from './index.js'; -expectType(macosVersion()); -expectType(macosVersion.is('>10.10')); -expectType(macosVersion.isGreaterThanOrEqualTo('10.12.5')); -expectType(macosVersion.assert('>10.10')); -expectType(macosVersion.assertGreaterThanOrEqualTo('10.10')); -expectType(macosVersion.assertMacOS()); -expectType(macosVersion.isMacOS); +expectType(macOSVersion()); +expectType(isMacOSVersion('>10.10')); +expectType(isMacOSVersionGreaterThanOrEqualTo('10.12.5')); +expectType(assertMacOSVersion('>10.10')); +expectType(assertMacOSVersionGreaterThanOrEqualTo('10.10')); +expectType(assertMacOS()); +expectType(isMacOS); diff --git a/package.json b/package.json index a05473a..23e952d 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,10 @@ "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com" }, + "type": "module", + "exports": "./index.js", "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "scripts": { "test": "xo && ava && tsd" @@ -35,11 +37,11 @@ "condition" ], "dependencies": { - "semver": "^5.6.0" + "semver": "^7.3.5" }, "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.1", - "xo": "^0.24.0" + "ava": "^3.15.0", + "tsd": "^0.17.0", + "xo": "^0.44.0" } } diff --git a/readme.md b/readme.md index d70ea81..2497818 100644 --- a/readme.md +++ b/readme.md @@ -11,60 +11,68 @@ $ npm install macos-version ## Usage ```js -const macosVersion = require('macos-version'); - -macosVersion(); +import { + macOSVersion, + isMacOSVersion, + isMacOSVersionGreaterThanOrEqualTo, + assertMacOSVersion, + assertMacOSVersionGreaterThanOrEqualTo, + assertMacOS, + isMacOS, +} from 'macos-version'; + +macOSVersion(); //=> '10.12.3' -macosVersion.is('>10.10'); +isMacOSVersion('>10.10'); //=> true -macosVersion.isGreaterThanOrEqualTo('10.10'); +isMacOSVersionGreaterThanOrEqualTo('10.10'); //=> true -macosVersion.assert('>=10.12.5'); +assertMacOSVersion('>=10.12.5'); //=> [Error: Requires macOS >=10.12.5] -macosVersion.assertGreaterThanOrEqualTo('10.12.5'); +assertMacOSVersionGreaterThanOrEqualTo('10.12.5'); //=> [Error: Requires macOS 10.12.5 or later] -macosVersion.assertMacOS(); +assertMacOS(); //=> [Error: Requires macOS] -if (macosVersion.isMacOS) { +if (isMacOS) { console.log('macOS'); } ``` ## API -### macosVersion() +### macOSVersion() Returns the macOS version or `undefined` if the platform is not macOS. -### macosVersion.is(semverRange) +### isMacOSVersion(semverRange) Returns a `boolean` of whether the specified [semver range](https://github.com/npm/node-semver#ranges) matches the macOS version. -### macosVersion.isGreaterThanOrEqualTo(version) +### isMacOSVersionGreaterThanOrEqualTo(version) Returns a `boolean` of whether the macOS version is greater than or equal to the specified version. -### macosVersion.assert(semverRange) +### assertMacOSVersion(semverRange) Throws an error if the specified [semver range](https://github.com/npm/node-semver#ranges) does not match the macOS version. -### macosVersion.assertGreaterThanOrEqualTo(version) +### assertMacOSVersionGreaterThanOrEqualTo(version) Throws an error if the macOS version is not greater than or equal to the specified version. *Prefer this over `.assert()` whenever possible as it outputs a more user-friendly error message.* -### macosVersion.assertMacOS() +### assertMacOS() Throws an error if the platform is not macOS. -### macosVersion.isMacOS +### isMacOS Type: `boolean` diff --git a/test.js b/test.js index 58dc28c..c319535 100644 --- a/test.js +++ b/test.js @@ -1,9 +1,17 @@ import test from 'ava'; import semver from 'semver'; -import macosVersion from '.'; +import { + macOSVersion, + isMacOSVersion, + isMacOSVersionGreaterThanOrEqualTo, + assertMacOSVersion, + assertMacOSVersionGreaterThanOrEqualTo, + assertMacOS, + isMacOS, +} from './index.js'; test('main', t => { - const version = macosVersion(); + const version = macOSVersion(); console.log('Version:', version); t.is(semver.valid(version), version); }); @@ -27,62 +35,62 @@ test('main with iOS support', t => { 12.0 `; - const version = macosVersion._parseVersion(plist); + const version = macOSVersion._parseVersion(plist); t.is(semver.valid(version), version); t.is(version, '10.14.2'); }); -test('.is()', t => { - t.true(macosVersion.is('>=10.10')); - t.true(macosVersion.is('>=10.10.2')); - t.true(macosVersion.is('<20')); - t.true(macosVersion.is(macosVersion())); - t.false(macosVersion.is('<10')); +test('isMacOSVersion()', t => { + t.true(isMacOSVersion('>=10.10')); + t.true(isMacOSVersion('>=10.10.2')); + t.true(isMacOSVersion('<20')); + t.true(isMacOSVersion(macOSVersion())); + t.false(isMacOSVersion('<10')); }); -test('.isGreaterThanOrEqual()', t => { - t.true(macosVersion.isGreaterThanOrEqualTo('10.10')); - t.true(macosVersion.isGreaterThanOrEqualTo('10.10.2')); - t.false(macosVersion.isGreaterThanOrEqualTo('15.10')); +test('isMacOSVersionGreaterThanOrEqualTo', t => { + t.true(isMacOSVersionGreaterThanOrEqualTo('10.10')); + t.true(isMacOSVersionGreaterThanOrEqualTo('10.10.2')); + t.false(isMacOSVersionGreaterThanOrEqualTo('15.10')); }); -test('.assert()', t => { +test('assertMacOSVersion()', t => { t.throws(() => { - macosVersion.assert('<=10.10'); + assertMacOSVersion('<=10.10'); }); t.notThrows(() => { - macosVersion.assert('>=10.10'); + assertMacOSVersion('>=10.10'); }); t.notThrows(() => { - macosVersion.assert('>=10.10.2'); + assertMacOSVersion('>=10.10.2'); }); }); -test('.assertGreaterThanOrEqual()', t => { +test('assertMacOSVersionGreaterThanOrEqualTo()', t => { t.throws(() => { - macosVersion.assertGreaterThanOrEqualTo('15.10'); + assertMacOSVersionGreaterThanOrEqualTo('15.10'); }); t.notThrows(() => { - macosVersion.assertGreaterThanOrEqualTo('10.10'); + assertMacOSVersionGreaterThanOrEqualTo('10.10'); }); t.notThrows(() => { - macosVersion.assertGreaterThanOrEqualTo('10.10.2'); + assertMacOSVersionGreaterThanOrEqualTo('10.10.2'); }); }); -test('.assertMacOS()', t => { - const assert = (macosVersion.isMacOS ? t.notThrows : t.throws); +test('assertMacOS()', t => { + const assert = isMacOS ? t.notThrows : t.throws; assert(() => { - macosVersion.assertMacOS(); + assertMacOS(); }); }); -test('.isMacOS', t => { - const boolAssert = (process.platform === 'darwin' ? t.true : t.false); - boolAssert(macosVersion.isMacOS); +test('isMacOS', t => { + const boolAssert = isMacOS ? t.true : t.false; + boolAssert(isMacOS); });