Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: bump engines to Node.js 22 #199

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
with:
node-version: 20.x
node-version: 22.x
cache: 'yarn'
- name: Install
run: yarn install --frozen-lockfile
9 changes: 2 additions & 7 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -17,17 +17,12 @@ jobs:
strategy:
matrix:
node-version:
- '20.10'
- '18.18'
- '16.20'
- '14.21'
- '22.x'
- '22.0.0'
os:
- macos-latest
- ubuntu-latest
- windows-latest
exclude:
- os: macos-latest
node-version: '14.21'
runs-on: "${{ matrix.os }}"
steps:
- name: Checkout
2 changes: 1 addition & 1 deletion .github/workflows/update-abi.yml
Original file line number Diff line number Diff line change
@@ -19,7 +19,7 @@ jobs:
token: ${{ steps.generate-token.outputs.token }}
- uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
with:
node-version: '20.x'
node-version: '22.x'
- name: Get npm cache directory
id: npm-cache
run: |
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
22
46 changes: 23 additions & 23 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
var semver = require('semver')
const semver = require('semver')

function getNextTarget (runtime, targets) {
if (targets == null) targets = allTargets
var latest = targets.filter(function (t) { return t.runtime === runtime }).slice(-1)[0]
var increment = runtime === 'electron' ? 'minor' : 'major'
var next = semver.inc(latest.target, increment)
const latest = targets.filter(function (t) { return t.runtime === runtime }).slice(-1)[0]
const increment = runtime === 'electron' ? 'minor' : 'major'
let next = semver.inc(latest.target, increment)
// Electron releases appear in the registry in their beta form, sometimes there is
// no active beta line. During this time we need to double bump
if (runtime === 'electron' && semver.parse(latest.target).prerelease.length) {
@@ -23,11 +23,11 @@ function getAbi (target, runtime) {
if (target === process.versions.node) return process.versions.modules
}

var abi
var lastTarget
let abi
let lastTarget

for (var i = 0; i < allTargets.length; i++) {
var t = allTargets[i]
for (let i = 0; i < allTargets.length; i++) {
const t = allTargets[i]
if (t.runtime !== runtime) continue
if (semver.lte(t.target, target) && (!lastTarget || semver.gte(t.target, lastTarget))) {
abi = t.abi
@@ -45,15 +45,15 @@ function getTarget (abi, runtime) {

if (runtime === 'node' && !abi) return process.versions.node

var match = allTargets
const match = allTargets
.filter(function (t) {
return t.abi === abi && t.runtime === runtime
})
.map(function (t) {
return t.target
})
if (match.length) {
var betaSeparatorIndex = match[0].indexOf("-")
const betaSeparatorIndex = match[0].indexOf("-")
return betaSeparatorIndex > -1
? match[0].substring(0, betaSeparatorIndex)
: match[0]
@@ -63,31 +63,31 @@ function getTarget (abi, runtime) {
}

function sortByTargetFn (a, b) {
var abiComp = Number(a.abi) - Number(b.abi)
const abiComp = Number(a.abi) - Number(b.abi)
if (abiComp !== 0) return abiComp
if (a.target < b.target) return -1
if (a.target > b.target) return 1
return 0
}

function loadGeneratedTargets () {
var registry = require('./abi_registry.json')
var targets = {
const registry = require('./abi_registry.json')
const targets = {
supported: [],
additional: [],
future: []
}

registry.forEach(function (item) {
var target = {
const target = {
runtime: item.runtime,
target: item.target,
abi: item.abi
}
if (item.lts) {
var startDate = new Date(Date.parse(item.lts[0]))
var endDate = new Date(Date.parse(item.lts[1]))
var currentDate = new Date()
const startDate = new Date(Date.parse(item.lts[0]))
const endDate = new Date(Date.parse(item.lts[1]))
const currentDate = new Date()
target.lts = startDate < currentDate && currentDate < endDate
} else {
target.lts = false
@@ -109,9 +109,9 @@ function loadGeneratedTargets () {
return targets
}

var generatedTargets = loadGeneratedTargets()
const generatedTargets = loadGeneratedTargets()

var supportedTargets = [
const supportedTargets = [
{runtime: 'node', target: '5.0.0', abi: '47', lts: false},
{runtime: 'node', target: '6.0.0', abi: '48', lts: false},
{runtime: 'node', target: '7.0.0', abi: '51', lts: false},
@@ -134,7 +134,7 @@ var supportedTargets = [

supportedTargets.push.apply(supportedTargets, generatedTargets.supported)

var additionalTargets = [
const additionalTargets = [
{runtime: 'node-webkit', target: '0.13.0', abi: '47', lts: false},
{runtime: 'node-webkit', target: '0.15.0', abi: '48', lts: false},
{runtime: 'node-webkit', target: '0.18.3', abi: '51', lts: false},
@@ -144,7 +144,7 @@ var additionalTargets = [

additionalTargets.push.apply(additionalTargets, generatedTargets.additional)

var deprecatedTargets = [
const deprecatedTargets = [
{runtime: 'node', target: '0.2.0', abi: '1', lts: false},
{runtime: 'node', target: '0.9.1', abi: '0x000A', lts: false},
{runtime: 'node', target: '0.9.9', abi: '0x000B', lts: false},
@@ -162,9 +162,9 @@ var deprecatedTargets = [
{runtime: 'electron', target: '0.33.0', abi: '46', lts: false}
]

var futureTargets = generatedTargets.future
const futureTargets = generatedTargets.future

var allTargets = deprecatedTargets
const allTargets = deprecatedTargets
.concat(supportedTargets)
.concat(additionalTargets)
.concat(futureTargets)
10 changes: 4 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
"description": "Get the Node ABI for a given target and runtime, and vice versa.",
"main": "index.js",
"scripts": {
"test": "tape test/index.js",
"test": "node --test test/index.js",
"update-abi-registry": "node --unhandled-rejections=strict scripts/update-abi-registry.js"
},
"files": [
@@ -27,14 +27,12 @@
"url": "https://github.com/electron/node-abi/issues"
},
"homepage": "https://github.com/electron/node-abi#readme",
"devDependencies": {
"tape": "^5.3.1"
},
"devDependencies": {},
"dependencies": {
"semver": "^7.3.5"
"semver": "^7.6.3"
},
"engines": {
"node": ">=10"
"node": ">=22.0.0"
},
"publishConfig": {
"provenance": true
275 changes: 132 additions & 143 deletions test/index.js
Original file line number Diff line number Diff line change
@@ -1,166 +1,155 @@
var test = require('tape')
var semver = require('semver')
var getAbi = require('../index').getAbi
var getTarget = require('../index').getTarget
var getNextTarget = require('../index')._getNextTarget
var allTargets = require('../index').allTargets
const assert = require('node:assert/strict')
const { it } = require('node:test')

test('getNextTarget gets the next unsupported target', function (t) {
var mockTargets = [
const { getAbi, getTarget, _getNextTarget: getNextTarget } = require('../index')

it('getNextTarget gets the next unsupported target', () => {
const mockTargets = [
{runtime: 'node', target: '7.0.0', abi: '51', lts: false},
{runtime: 'node', target: '8.0.0', abi: '57', lts: false},
{runtime: 'electron', target: '0.36.0', abi: '47', lts: false},
{runtime: 'electron', target: '1.1.0', abi: '48', lts: false}
]
t.equal(getNextTarget('node', mockTargets), '9.0.0')
t.equal(getNextTarget('electron', mockTargets), '1.2.0')
t.end()
assert.strictEqual(getNextTarget('node', mockTargets), '9.0.0')
assert.strictEqual(getNextTarget('electron', mockTargets), '1.2.0')
})

test('getTarget calculates correct Node target', function (t) {
t.equal(getTarget(undefined), process.versions.node)
t.equal(getTarget(null), process.versions.node)
t.equal(getTarget('11'), '0.10.4')
t.equal(getTarget('14'), '0.11.11')
t.equal(getTarget('46'), '4.0.0')
t.equal(getTarget('47'), '5.0.0')
t.equal(getTarget('48'), '6.0.0')
t.equal(getTarget('51'), '7.0.0')
t.equal(getTarget('67'), '11.0.0')
t.equal(getTarget('72'), '12.0.0')
t.equal(getTarget('83'), '14.0.0')
t.equal(getTarget('88'), '15.0.0')
t.end()
it('getTarget calculates correct Node target', () => {
assert.strictEqual(getTarget(undefined), process.versions.node)
assert.strictEqual(getTarget(null), process.versions.node)
assert.strictEqual(getTarget('11'), '0.10.4')
assert.strictEqual(getTarget('14'), '0.11.11')
assert.strictEqual(getTarget('46'), '4.0.0')
assert.strictEqual(getTarget('47'), '5.0.0')
assert.strictEqual(getTarget('48'), '6.0.0')
assert.strictEqual(getTarget('51'), '7.0.0')
assert.strictEqual(getTarget('67'), '11.0.0')
assert.strictEqual(getTarget('72'), '12.0.0')
assert.strictEqual(getTarget('83'), '14.0.0')
assert.strictEqual(getTarget('88'), '15.0.0')
})

test('getTarget calculates correct Electron target', function (t) {
t.throws(getTarget.bind(null, '14', 'electron'))
t.equal(getTarget('47', 'electron'), '0.36.0')
t.equal(getTarget('48', 'electron'), '1.1.0')
t.equal(getTarget('49', 'electron'), '1.3.0')
t.equal(getTarget('50', 'electron'), '1.4.0')
t.equal(getTarget('76', 'electron'), '8.0.0')
t.equal(getTarget('82', 'electron'), '10.0.0')
t.equal(getTarget('89', 'electron'), '13.0.0')
t.end()
it('getTarget calculates correct Electron target', () => {
assert.throws(getTarget.bind(null, '14', 'electron'))
assert.strictEqual(getTarget('47', 'electron'), '0.36.0')
assert.strictEqual(getTarget('48', 'electron'), '1.1.0')
assert.strictEqual(getTarget('49', 'electron'), '1.3.0')
assert.strictEqual(getTarget('50', 'electron'), '1.4.0')
assert.strictEqual(getTarget('76', 'electron'), '8.0.0')
assert.strictEqual(getTarget('82', 'electron'), '10.0.0')
assert.strictEqual(getTarget('89', 'electron'), '13.0.0')
})

test('getTarget calculates correct Node-Webkit target', function (t) {
t.throws(getTarget.bind(null, '14', 'ode-webkit'))
t.equal(getTarget('47', 'node-webkit'), '0.13.0')
t.equal(getTarget('48', 'node-webkit'), '0.15.0')
t.equal(getTarget('51', 'node-webkit'), '0.18.3')
t.equal(getTarget('57', 'node-webkit'), '0.23.0')
t.equal(getTarget('59', 'node-webkit'), '0.26.5')
t.end()
it('getTarget calculates correct Node-Webkit target', () => {
assert.throws(getTarget.bind(null, '14', 'ode-webkit'))
assert.strictEqual(getTarget('47', 'node-webkit'), '0.13.0')
assert.strictEqual(getTarget('48', 'node-webkit'), '0.15.0')
assert.strictEqual(getTarget('51', 'node-webkit'), '0.18.3')
assert.strictEqual(getTarget('57', 'node-webkit'), '0.23.0')
assert.strictEqual(getTarget('59', 'node-webkit'), '0.26.5')
})

test('getAbi calculates correct Node ABI', function (t) {
t.equal(getAbi(undefined), process.versions.modules)
t.equal(getAbi(null), process.versions.modules)
t.throws(function () { getAbi('a.b.c') })
t.throws(function () { getAbi(getNextTarget('node')) })
t.equal(getAbi('15.0.0'), '88')
t.equal(getAbi('14.0.0'), '83')
t.equal(getAbi('13.0.0'), '79')
t.equal(getAbi('12.0.0'), '72')
t.equal(getAbi('11.0.0'), '67')
t.equal(getAbi('7.2.0'), '51')
t.equal(getAbi('7.0.0'), '51')
t.equal(getAbi('6.9.9'), '48')
t.equal(getAbi('6.0.0'), '48')
t.equal(getAbi('5.9.9'), '47')
t.equal(getAbi('5.0.0'), '47')
t.equal(getAbi('4.9.9'), '46')
t.equal(getAbi('4.0.0'), '46')
t.equal(getAbi('0.12.17'), '14')
t.equal(getAbi('0.12.0'), '14')
t.equal(getAbi('0.11.16'), '14')
t.equal(getAbi('0.11.11'), '14')
t.equal(getAbi('0.11.10'), '13')
t.equal(getAbi('0.11.8'), '13')
t.equal(getAbi('0.11.7'), '0x000C')
t.equal(getAbi('0.11.0'), '0x000C')
t.equal(getAbi('0.10.48'), '11')
t.equal(getAbi('0.10.30'), '11')
t.equal(getAbi('0.10.4'), '11')
t.equal(getAbi('0.10.3'), '0x000B')
t.equal(getAbi('0.10.1'), '0x000B')
t.equal(getAbi('0.10.0'), '0x000B')
t.equal(getAbi('0.9.12'), '0x000B')
t.equal(getAbi('0.9.9'), '0x000B')
t.equal(getAbi('0.9.8'), '0x000A')
t.equal(getAbi('0.9.1'), '0x000A')
t.equal(getAbi('0.9.0'), '1')
t.equal(getAbi('0.8.0'), '1')
t.equal(getAbi('0.2.0'), '1')
t.end()
it('getAbi calculates correct Node ABI', () => {
assert.strictEqual(getAbi(undefined), process.versions.modules)
assert.strictEqual(getAbi(null), process.versions.modules)
assert.throws(function () { getAbi('a.b.c') })
assert.throws(function () { getAbi(getNextTarget('node')) })
assert.strictEqual(getAbi('15.0.0'), '88')
assert.strictEqual(getAbi('14.0.0'), '83')
assert.strictEqual(getAbi('13.0.0'), '79')
assert.strictEqual(getAbi('12.0.0'), '72')
assert.strictEqual(getAbi('11.0.0'), '67')
assert.strictEqual(getAbi('7.2.0'), '51')
assert.strictEqual(getAbi('7.0.0'), '51')
assert.strictEqual(getAbi('6.9.9'), '48')
assert.strictEqual(getAbi('6.0.0'), '48')
assert.strictEqual(getAbi('5.9.9'), '47')
assert.strictEqual(getAbi('5.0.0'), '47')
assert.strictEqual(getAbi('4.9.9'), '46')
assert.strictEqual(getAbi('4.0.0'), '46')
assert.strictEqual(getAbi('0.12.17'), '14')
assert.strictEqual(getAbi('0.12.0'), '14')
assert.strictEqual(getAbi('0.11.16'), '14')
assert.strictEqual(getAbi('0.11.11'), '14')
assert.strictEqual(getAbi('0.11.10'), '13')
assert.strictEqual(getAbi('0.11.8'), '13')
assert.strictEqual(getAbi('0.11.7'), '0x000C')
assert.strictEqual(getAbi('0.11.0'), '0x000C')
assert.strictEqual(getAbi('0.10.48'), '11')
assert.strictEqual(getAbi('0.10.30'), '11')
assert.strictEqual(getAbi('0.10.4'), '11')
assert.strictEqual(getAbi('0.10.3'), '0x000B')
assert.strictEqual(getAbi('0.10.1'), '0x000B')
assert.strictEqual(getAbi('0.10.0'), '0x000B')
assert.strictEqual(getAbi('0.9.12'), '0x000B')
assert.strictEqual(getAbi('0.9.9'), '0x000B')
assert.strictEqual(getAbi('0.9.8'), '0x000A')
assert.strictEqual(getAbi('0.9.1'), '0x000A')
assert.strictEqual(getAbi('0.9.0'), '1')
assert.strictEqual(getAbi('0.8.0'), '1')
assert.strictEqual(getAbi('0.2.0'), '1')
})

test('getAbi calculates correct Electron ABI', function (t) {
t.throws(function () { getAbi(undefined, 'electron') })
t.throws(function () { getAbi(getNextTarget('electron'), 'electron') })
t.equal(getAbi('15.0.0-beta.1', 'electron'), '89')
t.equal(getAbi('14.1.1', 'electron'), '97')
t.equal(getAbi('14.0.0', 'electron'), '89')
t.equal(getAbi('13.0.0', 'electron'), '89')
t.equal(getAbi('12.0.0', 'electron'), '87')
t.equal(getAbi('11.0.0', 'electron'), '85')
t.equal(getAbi('10.0.0', 'electron'), '82')
t.equal(getAbi('9.0.0', 'electron'), '80')
t.equal(getAbi('8.0.0', 'electron'), '76')
t.equal(getAbi('7.0.0', 'electron'), '75')
t.equal(getAbi('6.0.0', 'electron'), '73')
t.equal(getAbi('5.0.0', 'electron'), '70')
t.equal(getAbi('4.1.4', 'electron'), '69')
t.equal(getAbi('4.0.4', 'electron'), '69')
t.equal(getAbi('4.0.3', 'electron'), '64')
t.equal(getAbi('3.1.8', 'electron'), '64')
t.equal(getAbi('2.0.18', 'electron'), '57')
t.equal(getAbi('1.4.0', 'electron'), '50')
t.equal(getAbi('1.3.0', 'electron'), '49')
t.equal(getAbi('1.2.0', 'electron'), '48')
t.equal(getAbi('1.1.0', 'electron'), '48')
t.equal(getAbi('1.0.0', 'electron'), '47')
t.equal(getAbi('0.37.0', 'electron'), '47')
t.equal(getAbi('0.36.0', 'electron'), '47')
t.equal(getAbi('0.35.0', 'electron'), '46')
t.equal(getAbi('0.34.0', 'electron'), '46')
t.equal(getAbi('0.33.0', 'electron'), '46')
t.equal(getAbi('0.32.0', 'electron'), '45')
t.equal(getAbi('0.31.0', 'electron'), '45')
t.equal(getAbi('0.30.0', 'electron'), '44')
t.end()
it('getAbi calculates correct Electron ABI', function (t) {
assert.throws(function () { getAbi(undefined, 'electron') })
assert.throws(function () { getAbi(getNextTarget('electron'), 'electron') })
assert.strictEqual(getAbi('15.0.0-beta.1', 'electron'), '89')
assert.strictEqual(getAbi('14.1.1', 'electron'), '97')
assert.strictEqual(getAbi('14.0.0', 'electron'), '89')
assert.strictEqual(getAbi('13.0.0', 'electron'), '89')
assert.strictEqual(getAbi('12.0.0', 'electron'), '87')
assert.strictEqual(getAbi('11.0.0', 'electron'), '85')
assert.strictEqual(getAbi('10.0.0', 'electron'), '82')
assert.strictEqual(getAbi('9.0.0', 'electron'), '80')
assert.strictEqual(getAbi('8.0.0', 'electron'), '76')
assert.strictEqual(getAbi('7.0.0', 'electron'), '75')
assert.strictEqual(getAbi('6.0.0', 'electron'), '73')
assert.strictEqual(getAbi('5.0.0', 'electron'), '70')
assert.strictEqual(getAbi('4.1.4', 'electron'), '69')
assert.strictEqual(getAbi('4.0.4', 'electron'), '69')
assert.strictEqual(getAbi('4.0.3', 'electron'), '64')
assert.strictEqual(getAbi('3.1.8', 'electron'), '64')
assert.strictEqual(getAbi('2.0.18', 'electron'), '57')
assert.strictEqual(getAbi('1.4.0', 'electron'), '50')
assert.strictEqual(getAbi('1.3.0', 'electron'), '49')
assert.strictEqual(getAbi('1.2.0', 'electron'), '48')
assert.strictEqual(getAbi('1.1.0', 'electron'), '48')
assert.strictEqual(getAbi('1.0.0', 'electron'), '47')
assert.strictEqual(getAbi('0.37.0', 'electron'), '47')
assert.strictEqual(getAbi('0.36.0', 'electron'), '47')
assert.strictEqual(getAbi('0.35.0', 'electron'), '46')
assert.strictEqual(getAbi('0.34.0', 'electron'), '46')
assert.strictEqual(getAbi('0.33.0', 'electron'), '46')
assert.strictEqual(getAbi('0.32.0', 'electron'), '45')
assert.strictEqual(getAbi('0.31.0', 'electron'), '45')
assert.strictEqual(getAbi('0.30.0', 'electron'), '44')
})

test('getAbi calculates correct Node-Webkit ABI', function (t) {
t.throws(function () { getAbi(undefined, 'node-webkit') })
t.throws(function () { getAbi(getNextTarget('node-webkit'), 'node-webkit') })
t.equal(getAbi('0.13.0', 'node-webkit'), '47')
t.equal(getAbi('0.14.0', 'node-webkit'), '47')
t.equal(getAbi('0.15.0', 'node-webkit'), '48')
t.equal(getAbi('0.16.0', 'node-webkit'), '48')
t.equal(getAbi('0.17.0', 'node-webkit'), '48')
t.equal(getAbi('0.18.2', 'node-webkit'), '48')
t.equal(getAbi('0.18.3', 'node-webkit'), '51')
t.equal(getAbi('0.19.0', 'node-webkit'), '51')
t.equal(getAbi('0.20.0', 'node-webkit'), '51')
t.equal(getAbi('0.21.0', 'node-webkit'), '51')
t.equal(getAbi('0.22.0', 'node-webkit'), '51')
t.equal(getAbi('0.23.0', 'node-webkit'), '57')
t.equal(getAbi('0.24.0', 'node-webkit'), '57')
t.equal(getAbi('0.25.0', 'node-webkit'), '57')
t.equal(getAbi('0.26.4', 'node-webkit'), '57')
t.equal(getAbi('0.26.5', 'node-webkit'), '59')
t.end()
it('getAbi calculates correct Node-Webkit ABI', () => {
assert.throws(function () { getAbi(undefined, 'node-webkit') })
assert.throws(function () { getAbi(getNextTarget('node-webkit'), 'node-webkit') })
assert.strictEqual(getAbi('0.13.0', 'node-webkit'), '47')
assert.strictEqual(getAbi('0.14.0', 'node-webkit'), '47')
assert.strictEqual(getAbi('0.15.0', 'node-webkit'), '48')
assert.strictEqual(getAbi('0.16.0', 'node-webkit'), '48')
assert.strictEqual(getAbi('0.17.0', 'node-webkit'), '48')
assert.strictEqual(getAbi('0.18.2', 'node-webkit'), '48')
assert.strictEqual(getAbi('0.18.3', 'node-webkit'), '51')
assert.strictEqual(getAbi('0.19.0', 'node-webkit'), '51')
assert.strictEqual(getAbi('0.20.0', 'node-webkit'), '51')
assert.strictEqual(getAbi('0.21.0', 'node-webkit'), '51')
assert.strictEqual(getAbi('0.22.0', 'node-webkit'), '51')
assert.strictEqual(getAbi('0.23.0', 'node-webkit'), '57')
assert.strictEqual(getAbi('0.24.0', 'node-webkit'), '57')
assert.strictEqual(getAbi('0.25.0', 'node-webkit'), '57')
assert.strictEqual(getAbi('0.26.4', 'node-webkit'), '57')
assert.strictEqual(getAbi('0.26.5', 'node-webkit'), '59')
})

test('getAbi supports leading v', function (t) {
t.equal(getAbi('v7.2.0'), '51')
t.end()
it('getAbi supports leading v', () => {
assert.strictEqual(getAbi('v7.2.0'), '51')
})

test('getAbi returns abi if passed as target', function (t) {
t.equal(getAbi('57'), '57')
t.end()
it('getAbi returns abi if passed as target', () => {
assert.strictEqual(getAbi('57'), '57')
})
544 changes: 4 additions & 540 deletions yarn.lock

Large diffs are not rendered by default.