Skip to content

Commit

Permalink
Merge 5b4112b into bcc73fb
Browse files Browse the repository at this point in the history
  • Loading branch information
antongolub committed Aug 22, 2020
2 parents bcc73fb + 5b4112b commit 3569a86
Show file tree
Hide file tree
Showing 15 changed files with 205 additions and 40 deletions.
23 changes: 11 additions & 12 deletions lib/lockfileV1/entry.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
'use strict'

const url = require('url')
const { findPackageInYarnLock, findEntryInPackageLock } = require('../../util/traverse')
const { formatNpmIntegrity, formatYarnIntegrity, parseIntegrity, sha1ToHexChecksum, hexChecksumToSha1 } = require('./integrity')
const { npmRequires } = require('./dependencies')
const url = require('url')

const parse = (input) => new url.URL(input)
const GITHUB_REGEX = /^\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/
Expand All @@ -19,12 +20,11 @@ function yarnToNpmResolved (version, yarnResolved, request, integrityField) {
const version = resolvedParts.pathname.replace(GITHUB_REGEX, 'github:$1#$2')
return { version }
}
const resolved = yarnResolved.replace(/#.*$/, '')
const hexChecksum = yarnResolved.replace(/^.*#/, '')
const intergityFromUrlHash = Buffer.from(hexChecksum, 'hex').toString('base64')
const integrity = (intergityFromUrlHash ? 'sha1-' + intergityFromUrlHash : integrityField) || undefined

const isTarball = /^https?:\/\//.test(request)
const resolved = yarnResolved.replace(/#.*$/, '')
const hexChecksum = yarnResolved.replace(/^.*#/, '')
const integrity = formatNpmIntegrity(hexChecksumToSha1(hexChecksum), integrityField)

if (isTarball) {
return {
Expand All @@ -49,10 +49,8 @@ function npmToYarnResolved (resolved, integrity) {
let result = resolved

if (integrity) {
const hexChecksum = /^sha1-/.test(integrity)
? Buffer.from(integrity.replace(/^sha1-/, ''), 'base64').toString('hex')
: Buffer.from(integrity.replace(/^sha512-/, ''), 'base64').toString('hex')
// see caveats in README
const hexChecksum = sha1ToHexChecksum(integrity)
// see caveats in README
result = `${result}#${hexChecksum}`
}

Expand Down Expand Up @@ -88,8 +86,8 @@ module.exports = {
resolved,
integrity
} = entryInNpmFile

const yarnStyleResolved = npmToYarnResolved(resolved || version, integrity)
const integrityChunks = parseIntegrity(integrity)
const yarnStyleResolved = npmToYarnResolved(resolved || version, integrityChunks.sha1)
const existingPackage = tree[name] || {}
const existingPackageVersion = tree[name] && tree[name][version]
? tree[name][version]
Expand All @@ -98,10 +96,11 @@ module.exports = {
const hasDeps = dependencies && Object.keys(dependencies).length > 0
const hasOptionalDeps = optionalDependencies &&
Object.keys(optionalDependencies).length > 0

return Object.assign({}, existingPackage, {
[version]: Object.assign({}, existingPackageVersion, {
resolved: yarnStyleResolved,
integrity
integrity: formatYarnIntegrity(integrityChunks.sha512 || integrityChunks.sha1)
},
hasDeps ? { dependencies } : {},
hasOptionalDeps ? { optionalDependencies } : {}
Expand Down
2 changes: 1 addition & 1 deletion lib/lockfileV1/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ module.exports = {
lockfileVersion: 1,
requires: true,
dependencies
})
}, null, 2)
},
convertNpmV1ToYarn (packageLockFileString, packageDir) {
const packageLock = JSON.parse(packageLockFileString)
Expand Down
52 changes: 52 additions & 0 deletions lib/lockfileV1/integrity.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
'use strict'

module.exports = {
sha1ToHexChecksum (sha1) {
return sha1
? Buffer.from(sha1, 'base64').toString('hex')
: undefined
},
hexChecksumToSha1 (hexChecksum) {
const decoded = Buffer.from(hexChecksum, 'hex').toString('base64')

return decoded.length === 28
? 'sha1-' + decoded
: undefined
},

// NOTE npm lockfile may handle several hashes in a single field
formatNpmIntegrity (...integrities) {
return Object.keys(integrities.reduce((memo, str) => {
str && str.split(' ').forEach((integrity) => {
memo[integrity] = integrity
})

return memo
}, {})).join(' ') || undefined
},
parseIntegrity (integrity) {
if (!integrity) {
return {}
}

const chunks = integrity.split(' ')

return chunks.reduce((memo, hash) => {
const key = /^sha1-/.test(hash) ? 'sha1' : 'sha512'
const value = hash.slice(key.length + 1)

memo[key] = value

return memo
}, {})
},
formatYarnIntegrity (hash) {
if (!hash) {
return undefined
}

return hash.length === 28
? 'sha1-' + hash
: 'sha512-' + hash
}
}
14 changes: 12 additions & 2 deletions lib/lockfileV2/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ module.exports = {
integrity: entry.integrity,
license: pkgJson.license,
dependencies: deps,
dev: entry.dev
dev: entry.dev,
engines: pkgJson.engines,
bin: pkgJson.bin
}
}
const link = isWorkspacePkg
Expand All @@ -68,7 +70,15 @@ module.exports = {

const packages = sortObject({
// append root package
'': pick(packageJson, 'name', 'version', 'license', 'workspaces', 'dependencies', 'devDependencies', 'optionalDependencies'),
'': pick(packageJson,
'name',
'version',
'license',
'workspaces',
'dependencies',
'devDependencies',
'optionalDependencies'
),
...flattenDeps(dependencies)
})

Expand Down
2 changes: 2 additions & 0 deletions lib/lockfileV2/workspace.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
'use strict'

const glob = require('bash-glob')
const { sep, resolve } = require('path')

Expand Down
42 changes: 21 additions & 21 deletions test/fixtures/integrity-is-absent/.yarn-lock-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ asap@~2.0.3:

bowser@^1.7.3:
version "1.9.3"
resolved "https://registry.npmjs.org/bowser/-/bowser-1.9.3.tgz#fe0a7de9495c170e436d5d8a40f0aa4ea8b431bf60651c83007883b06107fb807f28e4237a813994cd4fc65557f03403bdf11f8ad982d6b5b63b2f1f93f5c10e"
resolved "https://registry.npmjs.org/bowser/-/bowser-1.9.3.tgz"
integrity sha512-/gp96UlcFw5DbV2KQPCqTqi0Mb9gZRyDAHiDsGEH+4B/KOQjeoE5lM1PxlVX8DQDvfEfitmC1rW2Oy8fk/XBDg==

classnames@^2.2.5:
Expand All @@ -24,15 +24,15 @@ core-js@^1.0.0:

css-in-js-utils@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3c91744a9253f9675b555b7400e629f42f069eeaee4652ff5055bbf77da72d69852d04da584cd3050131eff867e01b95f9638def988056249424b894dcf29ba4"
resolved "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz"
integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==
dependencies:
hyphenate-style-name "^1.0.2"
isobject "^3.0.1"

dom-helpers@^3.3.1:
version "3.3.1"
resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz#d929be25a627ef83a24ccdb01efc493a8deba22abf876e588baf45aa4dbaf5c354c085ec0af01307a0914850bd026ff6d06d9bdbc846bfffbb3625b2748acfbe"
resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz"
integrity sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==

encoding@^0.1.11:
Expand All @@ -57,7 +57,7 @@ fbjs@^0.8.16:

glam@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/glam/-/glam-5.0.1.tgz#3429d870fa5e7d724c1f7d0b6947ca28fdc19298a923d8e478ebf331901defa72e0f17ca990441be04352f15d18fd2116550309742b7590bdbc3eb62c8ada973"
resolved "https://registry.npmjs.org/glam/-/glam-5.0.1.tgz"
integrity sha512-NCnYcPpefXJMH30LaUfKKP3BkpipI9jkeOvzMZAd76cuDxfKmQRBvgQ1LxXRj9IRZVAwl0K3WQvbw+tiyK2pcw==
dependencies:
fbjs "^0.8.16"
Expand All @@ -70,7 +70,7 @@ hyphenate-style-name@^1.0.2:

iconv-lite@~0.4.13:
version "0.4.21"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz#127e55f736b9981b76a14034dd6183dd3c03bf430a02bbaab2ec6cb5b31465a8fd5bd93f9b5095ffda72de5d0be64c3d0659fc7dd1d09b31d262dbe9bd32e92b"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz"
integrity sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==
dependencies:
safer-buffer "^2.1.0"
Expand Down Expand Up @@ -108,7 +108,7 @@ js-tokens@^3.0.0:

lodash@^4.17.4:
version "4.17.10"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz#51e8f0783d690e85eef800fcdb9956c29e191ad4b0827a59c5bdc90d5883ed2b63433f8d6ffea5d3dde5c78390d1fa0658d468735f665b2ec1ccbf9400ada256"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz"
integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==

loose-envify@^1.0.0:
Expand All @@ -134,7 +134,7 @@ loose-envify@^1.3.1:

node-fetch@^1.0.1:
version "1.7.3"
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz#3616780ac2b1edc626daf4ab040af63ef14e7bab160dfd1460b46a03ab2f51883bfbf4d27d502ee3d8d80b806f4384a6b3d49981da86060ae8a9f0e125d4f229"
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz"
integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
dependencies:
encoding "^0.1.11"
Expand All @@ -157,14 +157,14 @@ performance-now@^2.1.0:

promise@^7.1.1:
version "7.3.1"
resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz#9e89505d9ff82fe6cffd41a591f688ba35fd04ac46c2643d393e263ade72bf2f222b5877c2a4c42428a3cc600d4c20a5f675a3638d63bb2027d8add0d612cb4e"
resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz"
integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
dependencies:
asap "~2.0.3"

prop-types@^15.5.8:
version "15.6.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz#e1e73b6d8d58eba2f299250e1ffcc045560e6c1db7013da1f1c7fa7bf3ba6402c1fcdd2ca99144c7baeae8460f5f632439d28e46ea2823f1f993d4e5478abb91"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz"
integrity sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==
dependencies:
fbjs "^0.8.16"
Expand All @@ -173,7 +173,7 @@ prop-types@^15.5.8:

prop-types@^15.6.0:
version "15.6.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz#e1e73b6d8d58eba2f299250e1ffcc045560e6c1db7013da1f1c7fa7bf3ba6402c1fcdd2ca99144c7baeae8460f5f632439d28e46ea2823f1f993d4e5478abb91"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz"
integrity sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==
dependencies:
fbjs "^0.8.16"
Expand All @@ -182,7 +182,7 @@ prop-types@^15.6.0:

prop-types@^15.6.1:
version "15.6.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz#e1e73b6d8d58eba2f299250e1ffcc045560e6c1db7013da1f1c7fa7bf3ba6402c1fcdd2ca99144c7baeae8460f5f632439d28e46ea2823f1f993d4e5478abb91"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz"
integrity sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==
dependencies:
fbjs "^0.8.16"
Expand All @@ -191,14 +191,14 @@ prop-types@^15.6.1:

raf@^3.4.0:
version "3.4.0"
resolved "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz#a433ff34c4405e84dfae109fc9f484c0900a2dac4153d780a4c7813c1d53903a2e666bcf7ab202955f254c077eb85f1989369597af5ed450b142b01dfd54e31b"
resolved "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz"
integrity sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==
dependencies:
performance-now "^2.1.0"

react-dom@^16.2.0:
version "16.3.2"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz#30c3e4a37cd89dc36bcffee01b5ef02565111190efb246475cec1bb6dce5d05d0bdf00e64e8cae113ba8febf18e72bc37a3c18711c9623596f5418cb25617028"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz"
integrity sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==
dependencies:
fbjs "^0.8.16"
Expand All @@ -208,7 +208,7 @@ react-dom@^16.2.0:

react-input-autosize@^2.2.1:
version "2.2.1"
resolved "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz#dfe2b8083d77884e25410d96945f0fb95e61b5f99344b1fa3039df9dd1cce8bb8146ccee5e7bb221f13b9e148ab7c033441679d1bbb4b0086434c792e69c5040"
resolved "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz"
integrity sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==
dependencies:
prop-types "^15.5.8"
Expand Down Expand Up @@ -238,7 +238,7 @@ react-scroll-captor@^1.0.1:

react-select@v2.0.0-alpha.8:
version "2.0.0-alpha.8"
resolved "https://registry.npmjs.org/react-select/-/react-select-2.0.0-alpha.8.tgz#4f3fe4db64914b4283b7b770ddb245cc5be131ecfdd1c9d79d90f79f786e93343e526ebcafee08d81c83263ead1ff4401a2515b833d5399760e2a07c275ff83d"
resolved "https://registry.npmjs.org/react-select/-/react-select-2.0.0-alpha.8.tgz"
integrity sha512-Tz/k22SRS0KDt7dw3bJFzFvhMez90cnXnZD3n3hukzQ+Um68r+4I2ByDJj6tH/RAGiUVuDPVOZdg4qB8J1/4PQ==
dependencies:
classnames "^2.2.5"
Expand All @@ -251,7 +251,7 @@ react-select@v2.0.0-alpha.8:

react-transition-group@^2.2.1:
version "2.3.1"
resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.3.1.tgz#86ee3f2c038548a8d6b75fb58609cebf795dc66b7a96f6464d6cf8294905aeacd7acd0c8552bbab7121c3eccf0ecf35db91f1e9fd613379e492d1c9dfcbd5989"
resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.3.1.tgz"
integrity sha512-hu4/LAOFSKjWt1+1hgnOv3ldxmt6lvZGTWz4KUkFrqzXrNDIVSu6txIcPszw7PNduR8en9YTN55JLRyd/L1ZiQ==
dependencies:
dom-helpers "^3.3.1"
Expand All @@ -260,7 +260,7 @@ react-transition-group@^2.2.1:

react@^16.2.0:
version "16.3.2"
resolved "https://registry.npmjs.org/react/-/react-16.3.2.tgz#a3918f76485c890ddc12987aaa0bd807b2d3387c3f181d2a448e9914dba08f8f6a24215f807c15363679bbe6fb9e27f8bce78c20eb988f709e61ed88043ef896"
resolved "https://registry.npmjs.org/react/-/react-16.3.2.tgz"
integrity sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg==
dependencies:
fbjs "^0.8.16"
Expand All @@ -270,7 +270,7 @@ react@^16.2.0:

safer-buffer@^2.1.0:
version "2.1.2"
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#619a372bcd920fb462ca2d04d4440fa232f3ee4a5ea6749023d2323db1c78355d75debdbe5d248eeda72376003c467106c71bbbdcc911e4d1c6f0a9c42b894b6"
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==

setimmediate@^1.0.5:
Expand All @@ -280,15 +280,15 @@ setimmediate@^1.0.5:

ua-parser-js@^0.7.9:
version "0.7.17"
resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz#b9175276ed68035ae770240beec0a3f2f4b266482d2fb7da6b0f5373dad9de61a0ada43bf8f771ef0e669ce485de0c3d64d1baa1cf8a5df9289f76cab913a6d2"
resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz"
integrity sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==

uuid@^3.0.1:
version "3.2.1"
resolved "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz#8d99ccc256fd224bbf3b7b26196bd985ab827fa72fbe92a2e012918a5892ddcc6723e1b3f63e4c1294f3d9416e5e228f26871bee09ec2c7c224b4e6281ee4110"
resolved "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz"
integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==

whatwg-fetch@>=0.10.0:
version "2.0.4"
resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#75c435196a4e0ff78443dee4eba6a2115a4d9daa558fdd3ff91f925d33d8187a58041ca97ca2444232ebbcc67b6176ca9b6d605dde0d72ec544e38afd58b4b9e"
resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz"
integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
13 changes: 13 additions & 0 deletions test/fixtures/integrity-mix/.package-lock-snapshot.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "integrity-mix",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@semantic-release/npm": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.5.tgz",
"integrity": "sha1-YcRWkau4Y/aTnMpqrJWNPCJQhjI= sha512-D+oEmsx9aHE1q806NFQwSC9KdBO8ri/VO99eEz0wWbX2jyLqVyWr7t0IjKC8aSnkkQswg/4KN/ZjfF6iz1XOpw=="
}
}
}
8 changes: 8 additions & 0 deletions test/fixtures/integrity-mix/.yarn-lock-snapshot
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


"@semantic-release/npm@^7.0.0":
version "7.0.5"
resolved "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.5.tgz#61c45691abb863f6939cca6aac958d3c22508632"
integrity sha512-D+oEmsx9aHE1q806NFQwSC9KdBO8ri/VO99eEz0wWbX2jyLqVyWr7t0IjKC8aSnkkQswg/4KN/ZjfF6iz1XOpw==

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions test/fixtures/integrity-mix/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions test/fixtures/integrity-mix/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "integrity-mix",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"@semantic-release/npm": "^7.0.0"
}
}

0 comments on commit 3569a86

Please sign in to comment.